Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Ramen

Ramen is the stateful reconciliation engine that turns API-source-backed desired resources into deterministic, reviewable UWS plans. It records local SQLite state and history, then hands only approved action documents to an explicit trusted executor boundary.

The native source of truth is a UWS project plus Ramen metadata for identity, lifecycle, operation roles, hashes, state matching, and redaction. OpenAPI, AWS Smithy JSON, and Google Discovery describe the available operations. Terraform/OpenTofu and Ansible conversion plus AI-assisted authoring are optional on-ramps into that native model, not alternative runtimes.

Why Ramen

Ramen is for teams that have API source documents and need desired-state workflows without centering the system on provider plugins, backend compatibility, module download, or Terraform/OpenTofu plan files. Typical adopters include API platform teams, internal developer platform teams, operators managing APIs without mature providers, teams migrating HCL-shaped declarations, and UWS/OpenUdon users who need stateful reconciliation around workflow documents.

Ramen differs from adjacent tools in a narrow way:

  • Terraform/OpenTofu are provider-backed infrastructure runtimes; Ramen is an API-source reconciliation engine with HCL conversion as an adapter.
  • Generic workflow runners execute steps; Ramen adds identity matching, dependency graphs, deterministic plans, import, refresh evidence, state history, and approval-artifact checks.
  • Generated SDKs and CLIs such as az and gcloud provide imperative API calls; Ramen provides operator workflows and durable desired-state records.

Adoption Readiness

Community users should be able to evaluate Ramen locally through native project examples, mock execution, readable plans, stable diagnostics, clear non-goals, and ramen convert for HCL migration. Enterprise users should look for approval artifacts, redacted SQLite state history, reproducible plans, explicit trusted executor boundaries, no credential value storage, and future policy integration points.

Ready in v0.1: provider-free native validation, graphing and planning; local state history; digest-bound approval artifacts; mock-backed apply and refresh; read-only state inspection; a supported in-process executor contract; and a credential-free native example.

Experimental before v1: broader resource mappings, live executor adapters, policy integrations, authoring and conversion adapters, imperative runbooks, and parameterization ergonomics. See SUPPORT.md and the compatibility contract for the exact boundary.

See docs/evidence-index.md for the current credential-free, recorded replay, and sanitized live evidence that backs these claims.

Installation

Install the CLI with Go:

go install github.com/OpenUdon/ramen/cmd/ramen@v0.1.0
ramen version --json

Native UWS 1.9.1 JSON, YAML, and HCL projects may carry an optional contentTrust registry. ramen validate preserves that registry and runs the UWS advisory data-flow analyzer only when it is present. Findings have stable codes, document paths, and fixed messages; default validation reports them as warnings and remains valid. The existing explicit --strict flag promotes all warnings to errors. Ramen supplies Browsertools' resolver for contained browser-profile sources; other extension-owned flow remains unknown or opaque unless UWS core can recover it directly. Analysis does not plan, approve, apply, run, touch state, authorize an executor, or inspect runtime values.

Linux, macOS, and Windows archives for amd64 and arm64 are attached to the GitHub v0.1.0 release with a SHA256SUMS file. Ramen requires the Go version declared in go.mod when used as a library.

Native Quick Start

The local widget example uses only a checked-in OpenAPI document and the mock executor. It performs no network calls and needs no credentials:

ramen init \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db
ramen validate --project ./examples/widget
ramen graph --project ./examples/widget
ramen plan \
--project ./examples/widget \
--state /tmp/ramen-widget-state.db \
--out /tmp/ramen-widget-plan.json
ramen apply \
--plan /tmp/ramen-widget-plan.json \
--state /tmp/ramen-widget-state.db \
--auto-approve \
--mock \
--out /tmp/ramen-widget-apply
ramen state list --state /tmp/ramen-widget-state.db

See examples/widget for the project, API source, and annotated workflow.

The credential-free browser example demonstrates native UWS 1.9/browser 1.7 desired state, authentication 1.1, popup/frame contracts, scalar outputs, symbolic credentials and sessions, and mock-only handoff. See Browser Desired State for the exact version, approval, and runtime boundary.

Commands

The native desired-state lifecycle is:

ramen init
ramen validate --project DIR --json
ramen graph --project DIR --format json
ramen plan --project DIR --target ADDRESS --exclude ADDRESS --replace ADDRESS
ramen plan --project DIR --out plan.json
ramen apply --plan plan.json --auto-approve --mock
ramen refresh --mock
ramen import
ramen show plan.json
ramen state list
ramen force-unlock LOCK_HOLDER --state PATH
ramen version --json

Experimental on-ramps create or convert native artifacts:

ramen author --context context.json --goal "Manage widgets"
ramen icot --goal "List resources" --openapi api=api.json --network ask --no-llm --validate --graph
ramen convert
ramen convert ansible --playbook playbook.yml --argspec-dir argspecs --inventory inventory.yml --extra-var env=prod

See the shared static conversion contract, the Terraform/OpenTofu conversion contract, and the Ansible conversion contract for their modes, reports, static inputs, Ramen-owned metadata, validation, artifacts, and compatibility boundaries. The client-language conversion model provides the unified ownership/evidence matrix and syntax-promotion rule.

Terraform conversion can also accept repeatable --provider-schema ID=PATH snapshots for offline client-configuration validation. This never runs a provider and does not replace the required API source that defines server operations.

Ansible conversion can resolve bounded regular INI/YAML/JSON inventory files for all, one exact host, or one exact group and apply literal extra vars at the highest static precedence. This chooses client-requested host facts only; Ramen still never opens an inventory connection, SSH session, or module runtime, and inline extra-var values are redacted from conversion reports. Empty host selections and credential-shaped non-runtime inventory or nested extra-variable keys fail closed. Simple default-private include_role remains lowerable only when its role has no non-empty defaults or vars.

ramen run is an adjacent imperative UWS runbook command; it does not create desired-state resources. Default release builds include mock execution only. Platform teams integrate a trusted runtime through the supported executor.Executor interface. ramen version --json reports local build metadata without network checks or telemetry.

ramen icot uses a dependency-aware v2 interview. It inspects repeatable --api-source KIND:ID=PATH, --openapi ID=PATH, and --source-root PATH inputs before asking questions; supports OpenAPI/Swagger, Google Discovery, AWS Smithy, AsyncAPI, GraphQL, OpenRPC, gRPC/protobuf, and OData; and shows all currently ready decisions as one round. --prompt-mode full|normal|fast controls safe defaults, while forced or uncertain decisions are always shown. Broad goals must select one active workflow; later workflows remain non-executable candidates in the generated project.

ramen author and ramen icot consume authoring.prompt-context.v2. API authentication remains an outer OR of inner AND symbolic binding sets, including explicit anonymous alternatives. When an operation offers more than one set, iCoT forces one numbered, resume-safe selection before request mappings; direct authoring and static conversion fail closed instead of unioning credentials. Prompt-context v1 is rejected.

Remote source lookup is separate and bounded by --network never|ask|allow. Interactive mode defaults to ask; agent mode is effectively never unless allow is explicit. No project or selected source is written until the full proposal is approved. Structured technical deferrals can save a non-runnable draft and resumable v2 session; default interview state stays under OUT/.icot/, and --resume SESSION reopens deferred leaves for promotion. --agent and --print never write deliverables.

Azure API-First Example

Start from a local Azure Resource Manager OpenAPI file and draft a read-only project:

go run ./cmd/ramen icot \
--goal "List Azure resources in the selected subscription" \
--api-source openapi:azure-resources=../<azure-resources>/resources.json \
--out ./.ramen/azure-read \
--no-transcript \
--validate \
--graph

Choose Resources_List if prompted for an operation ID. Then plan the read without embedding credentials in the project:

go run ./cmd/ramen plan \
--project ./.ramen/azure-read \
--action read \
--var azure_subscription_id="<subscription-id>" \
--out ./.ramen/azure-read/read-plan.json

Mock execution path:

go run ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--mock \
--out ./.ramen/azure-read/mock-apply

Live Azure reads require a short-lived access token supplied through the operator environment:

UDON_CREDENTIAL_AZURE_AUTH="$(az account get-access-token \ --resource https://management.azure.com/ \ --query accessToken \ -o tsv)" \
go run -tags udon ./cmd/ramen apply \
--plan ./.ramen/azure-read/read-plan.json \
--var azure_subscription_id="<subscription-id>" \
--auto-approve \
--executor udon \
--udon-output ./.ramen/azure-read/udon \
--out ./.ramen/azure-read/apply

Example placeholders only: <subscription-id>, <resource-group>, <server>, <database>.

Do not copy real IDs/tokens into tracked artifacts.

Do not commit .ramen/ state, live response payloads, subscription IDs, tenant IDs, client IDs, secrets, or access tokens. Mutating Azure examples should use disposable resources, explicit scoped permissions, tags, cost guardrails, and a verified cleanup command.

Development Checks

GOWORK=off go mod download
GOWORK=off go test ./... -count=1 -timeout=10m
GOWORK=off go vet ./...
git diff --check

The canonical memory bank is tracked under ../tofu/ramen in a sibling development checkout, but public builds and tests do not require that checkout.

Optional udon adapter check when the private sibling checkout is available:

go test -tags udon ./...

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages