forgeos 0.1.0-alpha.7 → 0.1.0-alpha.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/forge-agent-fabric/SKILL.md +178 -0
- package/.agents/skills/forge-agent-fabric/references/managed-workflows.md +95 -0
- package/.agents/skills/forge-agent-fabric/references/repository-analysis.md +102 -0
- package/.agents/skills/forge-agent-fabric/scripts/fabric.mjs +46 -0
- package/.agents/skills/forge-agent-fabric/scripts/repository.mjs +44 -0
- package/.npmignore +10 -0
- package/AGENTS.md +142 -90
- package/CHANGELOG.md +870 -9
- package/LICENSE +21 -0
- package/README.md +121 -6
- package/adapters/go/README.md +23 -0
- package/adapters/go/go.mod +3 -0
- package/adapters/go/http.go +149 -0
- package/adapters/go/registry.go +234 -0
- package/adapters/go/types.go +136 -0
- package/adapters/java/README.md +68 -0
- package/adapters/java/pom.xml +47 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
- package/adapters/java-spring-boot-starter/README.md +32 -0
- package/adapters/java-spring-boot-starter/pom.xml +49 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/bin/forge.mjs +18 -0
- package/docs/agent-fabric-programs.md +151 -0
- package/docs/agent-fabric.md +582 -0
- package/docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md +136 -0
- package/docs/architecture/agent-fabric/README.md +180 -0
- package/docs/architecture/agent-fabric/REPOSITORY_MANIFEST_PLAN.md +284 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +590 -0
- package/docs/cair-protocol.md +103 -0
- package/docs/changelog.md +1070 -0
- package/docs/forge-protocol.md +189 -0
- package/docs/repository-agent-benchmark.md +179 -0
- package/docs/repository-analysis.md +139 -0
- package/docs/repository-context-quality.md +179 -0
- package/docs/repository-runtime-observation.md +82 -0
- package/examples/agent-fabric-v2/README.md +70 -0
- package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
- package/examples/agent-fabric-v2/make-request.mjs +4 -0
- package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
- package/examples/agent-fabric-v2/migrate.workflow.ts +35 -0
- package/examples/agent-fabric-v2/registry.example.json +256 -0
- package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
- package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
- package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
- package/examples/agent-fabric-v2/visual-population.json +13 -0
- package/examples/agent-fabric-v2/workers/check.mjs +2 -0
- package/examples/agent-fabric-v2/workers/common.mjs +7 -0
- package/examples/agent-fabric-v2/workers/discover.mjs +2 -0
- package/examples/agent-fabric-v2/workers/migrate.mjs +4 -0
- package/examples/agent-fabric-v2/workers/review.mjs +3 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +60 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
- package/package.json +60 -5
- package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -0
- package/schemas/forge-manifest.schema.json +389 -0
- package/scripts/field-test-forgeos.mjs +1021 -0
- package/scripts/install-agent-fabric-skill.mjs +105 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1592 -125
- package/src/forge/agent-adapters/types.ts +225 -1
- package/src/forge/agent-fabric/adapter.ts +131 -0
- package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
- package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
- package/src/forge/agent-fabric/attached-task-service.ts +127 -0
- package/src/forge/agent-fabric/attached-task-store.ts +109 -0
- package/src/forge/agent-fabric/authority.ts +298 -0
- package/src/forge/agent-fabric/canonical.ts +135 -0
- package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
- package/src/forge/agent-fabric/codex-sdk-worker.ts +203 -0
- package/src/forge/agent-fabric/conductor.ts +754 -0
- package/src/forge/agent-fabric/dictionary.ts +12 -0
- package/src/forge/agent-fabric/errors.ts +32 -0
- package/src/forge/agent-fabric/hardened-conductor.ts +485 -0
- package/src/forge/agent-fabric/hardened-reducer.ts +211 -0
- package/src/forge/agent-fabric/index.ts +48 -0
- package/src/forge/agent-fabric/journal.ts +116 -0
- package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -0
- package/src/forge/agent-fabric/local-adaptive-harness.ts +343 -0
- package/src/forge/agent-fabric/local-adaptive-service.ts +398 -0
- package/src/forge/agent-fabric/local-adaptive-worker.ts +146 -0
- package/src/forge/agent-fabric/local-approval-window.ts +211 -0
- package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
- package/src/forge/agent-fabric/local-coding-worker.ts +285 -0
- package/src/forge/agent-fabric/local-control-store.ts +239 -0
- package/src/forge/agent-fabric/local-effect-broker.ts +348 -0
- package/src/forge/agent-fabric/local-evolution-approval.ts +81 -0
- package/src/forge/agent-fabric/local-evolution-profile.ts +87 -0
- package/src/forge/agent-fabric/local-evolution-registry.ts +427 -0
- package/src/forge/agent-fabric/local-evolution-service.ts +200 -0
- package/src/forge/agent-fabric/local-intelligence.ts +281 -0
- package/src/forge/agent-fabric/local-paths.ts +18 -0
- package/src/forge/agent-fabric/local-task-contract.ts +203 -0
- package/src/forge/agent-fabric/local-task-inbox.ts +543 -0
- package/src/forge/agent-fabric/local-task-server.ts +374 -0
- package/src/forge/agent-fabric/local-task-service.ts +982 -0
- package/src/forge/agent-fabric/local-verification.ts +551 -0
- package/src/forge/agent-fabric/managed-environment.ts +205 -0
- package/src/forge/agent-fabric/managed-run-contract.ts +103 -0
- package/src/forge/agent-fabric/managed-run-service.ts +401 -0
- package/src/forge/agent-fabric/managed-run-store.ts +165 -0
- package/src/forge/agent-fabric/managed-workspace.ts +253 -0
- package/src/forge/agent-fabric/p0a.ts +104 -0
- package/src/forge/agent-fabric/p0b-model-adapter.ts +434 -0
- package/src/forge/agent-fabric/planning.ts +155 -0
- package/src/forge/agent-fabric/program-api.ts +37 -0
- package/src/forge/agent-fabric/program-contract.ts +283 -0
- package/src/forge/agent-fabric/program-dsl.ts +126 -0
- package/src/forge/agent-fabric/program-evidence.ts +22 -0
- package/src/forge/agent-fabric/program-image.ts +15 -0
- package/src/forge/agent-fabric/program-lock.ts +50 -0
- package/src/forge/agent-fabric/program-owner.ts +16 -0
- package/src/forge/agent-fabric/program-scheduler.ts +38 -0
- package/src/forge/agent-fabric/program-service.ts +793 -0
- package/src/forge/agent-fabric/program-store.ts +142 -0
- package/src/forge/agent-fabric/program-structure.ts +65 -0
- package/src/forge/agent-fabric/program-types.ts +110 -0
- package/src/forge/agent-fabric/program-view.ts +12 -0
- package/src/forge/agent-fabric/program-worker.ts +108 -0
- package/src/forge/agent-fabric/project-profile.ts +50 -0
- package/src/forge/agent-fabric/project-registry.ts +120 -0
- package/src/forge/agent-fabric/project-runtime.ts +85 -0
- package/src/forge/agent-fabric/readiness.ts +26 -0
- package/src/forge/agent-fabric/reducer.ts +863 -0
- package/src/forge/agent-fabric/repository-context.ts +83 -0
- package/src/forge/agent-fabric/resource-ledger.ts +266 -0
- package/src/forge/agent-fabric/serialized-local-adapter.ts +60 -0
- package/src/forge/agent-fabric/types.ts +424 -0
- package/src/forge/agent-fabric/validation.ts +500 -0
- package/src/forge/agent-fabric/workflow-engine.ts +218 -0
- package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
- package/src/forge/agent-fabric/workflow-templates.ts +11 -0
- package/src/forge/agent-memory/bridge.ts +1728 -0
- package/src/forge/agent-memory/context-pack.ts +284 -0
- package/src/forge/agent-memory/hook-runner.ts +331 -0
- package/src/forge/agent-memory/mcp.ts +597 -0
- package/src/forge/agent-memory/normalize.ts +498 -0
- package/src/forge/agent-memory/redaction.ts +103 -0
- package/src/forge/agent-memory/sources/claude-code.ts +51 -0
- package/src/forge/agent-memory/sources/codex-hook-runner.mjs +343 -0
- package/src/forge/agent-memory/sources/codex.ts +161 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +215 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +896 -0
- package/src/forge/brownfield-import/types.ts +127 -0
- package/src/forge/cair/action-journal.ts +61 -0
- package/src/forge/cair/action-parser.ts +314 -0
- package/src/forge/cair/action-validator.ts +40 -0
- package/src/forge/cair/actions.ts +1818 -0
- package/src/forge/cair/format.ts +77 -0
- package/src/forge/cair/index.ts +118 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +255 -0
- package/src/forge/cli/adaptive.ts +51 -0
- package/src/forge/cli/ai.ts +16 -1
- package/src/forge/cli/auth.ts +459 -15
- package/src/forge/cli/authmd.ts +441 -0
- package/src/forge/cli/baseline.ts +112 -0
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +418 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1859 -20
- package/src/forge/cli/db.ts +209 -2
- package/src/forge/cli/deploy.ts +1339 -0
- package/src/forge/cli/deps.ts +150 -23
- package/src/forge/cli/dev.ts +1137 -53
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/doctor.ts +297 -0
- package/src/forge/cli/env-placeholders.ts +62 -0
- package/src/forge/cli/evolution.ts +40 -0
- package/src/forge/cli/fabric.ts +253 -0
- package/src/forge/cli/field-test.ts +568 -0
- package/src/forge/cli/golden-path.ts +487 -0
- package/src/forge/cli/handoff.ts +336 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/last-run.ts +84 -0
- package/src/forge/cli/main.ts +196 -3
- package/src/forge/cli/new.ts +169 -17
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +398 -6
- package/src/forge/cli/parse.ts +1377 -38
- package/src/forge/cli/progress.ts +51 -0
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/repository.ts +151 -0
- package/src/forge/cli/run.ts +42 -0
- package/src/forge/cli/secrets.ts +137 -1
- package/src/forge/cli/seed.ts +581 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2282 -0
- package/src/forge/cli/verify.ts +1458 -32
- package/src/forge/cli/windows.ts +23 -0
- package/src/forge/cli/workos.ts +3509 -0
- package/src/forge/compiler/agent-contract/build.ts +728 -64
- package/src/forge/compiler/agent-contract/types.ts +45 -2
- package/src/forge/compiler/ai-registry/parse.ts +71 -2
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +112 -9
- package/src/forge/compiler/app-graph/extract.ts +107 -0
- package/src/forge/compiler/app-graph/module-graph.ts +73 -78
- package/src/forge/compiler/app-graph/parser.ts +24 -24
- package/src/forge/compiler/app-graph/profile.ts +26 -0
- package/src/forge/compiler/app-graph/tsconfig-hash.ts +41 -4
- package/src/forge/compiler/app-graph/versions.ts +1 -1
- package/src/forge/compiler/classifier/capabilities.ts +3 -2
- package/src/forge/compiler/classifier/classify.ts +32 -8
- package/src/forge/compiler/classifier/secrets.ts +3 -2
- package/src/forge/compiler/classifier/signals.ts +91 -1
- package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
- package/src/forge/compiler/client-sdk/render-client.ts +295 -13
- package/src/forge/compiler/data-graph/build.ts +29 -1
- package/src/forge/compiler/data-graph/parse.ts +20 -4
- package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
- package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
- package/src/forge/compiler/data-graph/sql/types.ts +1 -0
- package/src/forge/compiler/diagnostics/codes.ts +38 -0
- package/src/forge/compiler/diagnostics/create.ts +28 -2
- package/src/forge/compiler/diagnostics/index.ts +2 -0
- package/src/forge/compiler/emitter/barrel.ts +3 -0
- package/src/forge/compiler/emitter/render.ts +9 -0
- package/src/forge/compiler/external-manifest/registry.ts +217 -0
- package/src/forge/compiler/external-manifest/types.ts +91 -0
- package/src/forge/compiler/external-manifest/validate.ts +373 -0
- package/src/forge/compiler/frontend-graph/build.ts +142 -14
- package/src/forge/compiler/integration/add.ts +991 -33
- package/src/forge/compiler/integration/plan.ts +43 -12
- package/src/forge/compiler/integration/render.ts +29 -0
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/integration/templates/convex.ts +70 -0
- package/src/forge/compiler/integration/templates/index.ts +1 -0
- package/src/forge/compiler/integration/templates/render.ts +38 -0
- package/src/forge/compiler/integration/templates/types.ts +3 -0
- package/src/forge/compiler/integration/templates/workos.ts +1439 -0
- package/src/forge/compiler/make-registry/build.ts +8 -9
- package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
- package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
- package/src/forge/compiler/orchestrator/manifest.ts +1 -1
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +249 -10
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +101 -33
- package/src/forge/compiler/orchestrator/serialize.ts +33 -8
- package/src/forge/compiler/orchestrator/types.ts +1 -1
- package/src/forge/compiler/package-graph/compiler.ts +3 -1
- package/src/forge/compiler/package-graph/constants.ts +1 -1
- package/src/forge/compiler/package-graph/dts-extractor.ts +14 -1
- package/src/forge/compiler/package-manager/adapter.ts +4 -1
- package/src/forge/compiler/package-manager/commands.ts +4 -0
- package/src/forge/compiler/package-manager/executor.ts +30 -1
- package/src/forge/compiler/package-manager/version.ts +36 -12
- package/src/forge/compiler/package-upgrades/planner.ts +155 -18
- package/src/forge/compiler/package-upgrades/types.ts +2 -0
- package/src/forge/compiler/policy-registry/build.ts +47 -2
- package/src/forge/compiler/policy-registry/parse.ts +32 -2
- package/src/forge/compiler/recipes/definitions.ts +63 -0
- package/src/forge/compiler/recipes/index.ts +2 -0
- package/src/forge/compiler/recipes/profiles.ts +81 -0
- package/src/forge/compiler/recipes/registry.ts +6 -0
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/app-graph.ts +8 -2
- package/src/forge/compiler/types/cli.ts +76 -1
- package/src/forge/compiler/types/dev-manifest.ts +4 -0
- package/src/forge/compiler/types/emit.ts +2 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/compiler/types/integration.ts +1 -0
- package/src/forge/compiler/types/package-graph.ts +6 -0
- package/src/forge/compiler/types/policy-registry.ts +3 -1
- package/src/forge/delta/broker-runner.mjs +5 -0
- package/src/forge/delta/broker.ts +429 -0
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +238 -0
- package/src/forge/delta/git-observer.ts +67 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +25 -0
- package/src/forge/delta/process-identity.ts +37 -0
- package/src/forge/delta/queue-status.ts +190 -0
- package/src/forge/delta/recorder.ts +540 -0
- package/src/forge/delta/redaction.ts +50 -0
- package/src/forge/delta/schema.ts +240 -0
- package/src/forge/delta/session.ts +142 -0
- package/src/forge/delta/status.ts +1139 -0
- package/src/forge/delta/store.ts +3329 -0
- package/src/forge/delta/timeline.ts +178 -0
- package/src/forge/dev/server.ts +1061 -22
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +285 -33
- package/src/forge/dev-console/types.ts +47 -1
- package/src/forge/impact/index.ts +222 -30
- package/src/forge/impact/types.ts +33 -1
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/fields.ts +26 -0
- package/src/forge/make/index.ts +42 -6
- package/src/forge/make/templates.ts +211 -4
- package/src/forge/make/types.ts +2 -1
- package/src/forge/policy.ts +1 -1
- package/src/forge/react/index.ts +160 -2
- package/src/forge/refactor/index.ts +1 -0
- package/src/forge/repair/rules/index.ts +2 -2
- package/src/forge/repository-analysis/adapters/common.ts +72 -0
- package/src/forge/repository-analysis/adapters/docker.ts +185 -0
- package/src/forge/repository-analysis/adapters/java.ts +133 -0
- package/src/forge/repository-analysis/adapters/typescript.ts +350 -0
- package/src/forge/repository-analysis/adapters/vue.ts +71 -0
- package/src/forge/repository-analysis/analyze.ts +434 -0
- package/src/forge/repository-analysis/benchmark.ts +336 -0
- package/src/forge/repository-analysis/cache-gc.ts +154 -0
- package/src/forge/repository-analysis/check-selection.ts +123 -0
- package/src/forge/repository-analysis/context-node.ts +17 -0
- package/src/forge/repository-analysis/context.ts +456 -0
- package/src/forge/repository-analysis/http-resolution.ts +135 -0
- package/src/forge/repository-analysis/identity.ts +45 -0
- package/src/forge/repository-analysis/index.ts +18 -0
- package/src/forge/repository-analysis/nuxt-resolution.ts +188 -0
- package/src/forge/repository-analysis/quality.ts +60 -0
- package/src/forge/repository-analysis/retrieval.ts +309 -0
- package/src/forge/repository-analysis/runtime-artifacts.ts +195 -0
- package/src/forge/repository-analysis/runtime-observation.ts +325 -0
- package/src/forge/repository-analysis/scanner.ts +174 -0
- package/src/forge/repository-analysis/storage.ts +193 -0
- package/src/forge/repository-analysis/test-associations.ts +59 -0
- package/src/forge/repository-analysis/types.ts +99 -0
- package/src/forge/repository-manifest/index.ts +178 -0
- package/src/forge/repository-manifest/types.ts +63 -0
- package/src/forge/review/index.ts +162 -12
- package/src/forge/review/types.ts +15 -0
- package/src/forge/runtime/ai/providers.ts +19 -4
- package/src/forge/runtime/auth/config.ts +17 -0
- package/src/forge/runtime/auth/evaluate.ts +15 -2
- package/src/forge/runtime/auth/resolve.ts +61 -6
- package/src/forge/runtime/auth/types.ts +1 -0
- package/src/forge/runtime/db/factory.ts +1 -3
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +139 -32
- package/src/forge/runtime/db/pglite-adapter.ts +285 -2
- package/src/forge/runtime/executor.ts +129 -16
- package/src/forge/runtime/external/bridge.ts +663 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/buffer.ts +4 -1
- package/src/forge/runtime/telemetry/scrubber.ts +35 -5
- package/src/forge/runtime/webhooks/security.ts +12 -7
- package/src/forge/server.ts +71 -7
- package/src/forge/ui/index.ts +831 -19
- package/src/forge/ui/types.ts +3 -1
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +422 -0
- package/src/forge/workspace/baseline.ts +112 -0
- package/src/forge/workspace/change-summary.ts +292 -0
- package/src/forge/workspace/forge-cli.ts +42 -0
- package/src/forge/workspace/git-summary.ts +393 -0
- package/templates/agent-workroom/AGENTS.md +29 -0
- package/templates/agent-workroom/README.md +34 -0
- package/templates/agent-workroom/forge.config.ts +3 -0
- package/templates/agent-workroom/package.json +34 -0
- package/templates/agent-workroom/pnpm-workspace.yaml +2 -0
- package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
- package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
- package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
- package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
- package/templates/agent-workroom/src/forge/schema.ts +54 -0
- package/templates/agent-workroom/src/policies.ts +6 -0
- package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
- package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
- package/templates/agent-workroom/tsconfig.json +16 -0
- package/templates/agent-workroom/web/index.html +13 -0
- package/templates/agent-workroom/web/package.json +21 -0
- package/templates/agent-workroom/web/src/App.tsx +345 -0
- package/templates/agent-workroom/web/src/lib/forge.ts +20 -0
- package/templates/agent-workroom/web/src/main.tsx +13 -0
- package/templates/agent-workroom/web/src/styles.css +545 -0
- package/templates/agent-workroom/web/tsconfig.json +27 -0
- package/templates/agent-workroom/web/vite.config.ts +36 -0
- package/templates/b2b-support-web/package.json +2 -0
- package/templates/b2b-support-web/pnpm-workspace.yaml +2 -0
- package/templates/b2b-support-web/web/app/page.tsx +2 -2
- package/templates/b2b-support-web/web/lib/forge.ts +9 -2
- package/templates/b2b-support-web/web/next.config.ts +24 -0
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/pnpm-workspace.yaml +2 -0
- package/templates/minimal-web/web/index.html +1 -0
- package/templates/minimal-web/web/src/App.tsx +12 -6
- package/templates/minimal-web/web/src/lib/forge.ts +9 -2
- package/templates/minimal-web/web/src/styles.css +34 -0
- package/templates/minimal-web/web/vite.config.ts +36 -0
- package/templates/nuxt-web/.vscode/settings.json +14 -0
- package/templates/nuxt-web/.yarnrc.yml +1 -0
- package/templates/nuxt-web/README.md +30 -0
- package/templates/nuxt-web/forge.config.ts +3 -0
- package/templates/nuxt-web/package.json +37 -0
- package/templates/nuxt-web/pnpm-workspace.yaml +2 -0
- package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
- package/templates/nuxt-web/src/commands/createNote.ts +26 -0
- package/templates/nuxt-web/src/forge/schema.ts +12 -0
- package/templates/nuxt-web/src/policies.ts +6 -0
- package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
- package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
- package/templates/nuxt-web/tsconfig.json +17 -0
- package/templates/nuxt-web/web/app.vue +67 -0
- package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
- package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
- package/templates/nuxt-web/web/composables/forge.ts +13 -0
- package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
- package/templates/nuxt-web/web/nuxt.config.ts +11 -0
- package/templates/nuxt-web/web/package.json +22 -0
- package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
- package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
- package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
- package/templates/nuxt-web/web/tsconfig.json +6 -0
- package/templates/vendor-access/.vscode/settings.json +14 -0
- package/templates/vendor-access/README.md +30 -0
- package/templates/vendor-access/forge.config.ts +3 -0
- package/templates/vendor-access/package.json +35 -0
- package/templates/vendor-access/pnpm-workspace.yaml +2 -0
- package/templates/vendor-access/src/commands/addEvidence.ts +42 -0
- package/templates/vendor-access/src/commands/approveAccessRequest.ts +43 -0
- package/templates/vendor-access/src/commands/createAccessRequest.ts +49 -0
- package/templates/vendor-access/src/commands/seedVendorAccessDemo.ts +200 -0
- package/templates/vendor-access/src/forge/schema.ts +74 -0
- package/templates/vendor-access/src/policies.ts +11 -0
- package/templates/vendor-access/src/queries/listVendorAccessDashboard.ts +24 -0
- package/templates/vendor-access/src/queries/liveVendorAccessDashboard.ts +24 -0
- package/templates/vendor-access/tsconfig.json +17 -0
- package/templates/vendor-access/web/index.html +13 -0
- package/templates/vendor-access/web/package.json +21 -0
- package/templates/vendor-access/web/src/App.tsx +573 -0
- package/templates/vendor-access/web/src/lib/forge.ts +20 -0
- package/templates/vendor-access/web/src/main.tsx +205 -0
- package/templates/vendor-access/web/src/styles.css +682 -0
- package/templates/vendor-access/web/tsconfig.json +18 -0
- package/templates/vendor-access/web/vite.config.ts +36 -0
- package/src/forge/_generated/actionSubscriptions.json +0 -2
- package/src/forge/_generated/actionSubscriptions.ts +0 -10
- package/src/forge/_generated/agentAdapterManifest.json +0 -2
- package/src/forge/_generated/agentAdapterManifest.ts +0 -73
- package/src/forge/_generated/agentContract.json +0 -2
- package/src/forge/_generated/agentContract.ts +0 -7829
- package/src/forge/_generated/agentQuickstart.md +0 -34
- package/src/forge/_generated/agentTools.json +0 -2
- package/src/forge/_generated/agentTools.md +0 -16
- package/src/forge/_generated/agentTools.ts +0 -12
- package/src/forge/_generated/aiContext.ts +0 -125
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -51
- package/src/forge/_generated/aiProviders.json +0 -2
- package/src/forge/_generated/aiProviders.ts +0 -23
- package/src/forge/_generated/aiRegistry.json +0 -2
- package/src/forge/_generated/aiRegistry.ts +0 -31
- package/src/forge/_generated/api.json +0 -2
- package/src/forge/_generated/api.ts +0 -8
- package/src/forge/_generated/appGraph.json +0 -2
- package/src/forge/_generated/appGraph.ts +0 -14937
- package/src/forge/_generated/appMap.md +0 -55
- package/src/forge/_generated/artifactManifest.json +0 -2
- package/src/forge/_generated/artifactManifest.ts +0 -7
- package/src/forge/_generated/authClaims.json +0 -2
- package/src/forge/_generated/authClaims.ts +0 -13
- package/src/forge/_generated/authConfig.json +0 -2
- package/src/forge/_generated/authConfig.ts +0 -17
- package/src/forge/_generated/authContext.ts +0 -23
- package/src/forge/_generated/authRegistry.json +0 -2
- package/src/forge/_generated/authRegistry.ts +0 -25
- package/src/forge/_generated/buildInfo.json +0 -2
- package/src/forge/_generated/buildInfo.ts +0 -9
- package/src/forge/_generated/capabilityMap.json +0 -2
- package/src/forge/_generated/capabilityMap.md +0 -15
- package/src/forge/_generated/capabilityMap.ts +0 -17
- package/src/forge/_generated/client.ts +0 -282
- package/src/forge/_generated/clientApi.ts +0 -9
- package/src/forge/_generated/clientManifest.json +0 -2
- package/src/forge/_generated/clientManifest.ts +0 -39
- package/src/forge/_generated/clientTypes.ts +0 -78
- package/src/forge/_generated/configRegistry.json +0 -2
- package/src/forge/_generated/configRegistry.ts +0 -4
- package/src/forge/_generated/dataGraph.json +0 -2
- package/src/forge/_generated/dataGraph.ts +0 -8
- package/src/forge/_generated/db.json +0 -2
- package/src/forge/_generated/db.ts +0 -2
- package/src/forge/_generated/dbSecurityManifest.json +0 -2
- package/src/forge/_generated/dbSecurityManifest.ts +0 -15
- package/src/forge/_generated/dbSessionContext.json +0 -2
- package/src/forge/_generated/dbSessionContext.ts +0 -39
- package/src/forge/_generated/deployManifest.json +0 -2
- package/src/forge/_generated/deployManifest.ts +0 -14
- package/src/forge/_generated/devManifest.json +0 -2
- package/src/forge/_generated/devManifest.ts +0 -62
- package/src/forge/_generated/envSchema.json +0 -2
- package/src/forge/_generated/envSchema.ts +0 -59
- package/src/forge/_generated/frontendGraph.json +0 -2
- package/src/forge/_generated/frontendGraph.ts +0 -27
- package/src/forge/_generated/importGuards.json +0 -2
- package/src/forge/_generated/importGuards.ts +0 -686
- package/src/forge/_generated/index.ts +0 -68
- package/src/forge/_generated/liveProductionManifest.json +0 -2
- package/src/forge/_generated/liveProductionManifest.ts +0 -23
- package/src/forge/_generated/liveProtocol.json +0 -2
- package/src/forge/_generated/liveProtocol.ts +0 -21
- package/src/forge/_generated/liveQueryRegistry.json +0 -2
- package/src/forge/_generated/liveQueryRegistry.ts +0 -9
- package/src/forge/_generated/liveTransportConfig.json +0 -2
- package/src/forge/_generated/liveTransportConfig.ts +0 -19
- package/src/forge/_generated/makeRegistry.json +0 -2
- package/src/forge/_generated/makeRegistry.ts +0 -177
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -66
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -167
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -249334
- package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
- package/src/forge/_generated/permissionMatrix.json +0 -2
- package/src/forge/_generated/permissionMatrix.ts +0 -7
- package/src/forge/_generated/policyRegistry.json +0 -2
- package/src/forge/_generated/policyRegistry.ts +0 -11
- package/src/forge/_generated/queryRegistry.json +0 -2
- package/src/forge/_generated/queryRegistry.ts +0 -9
- package/src/forge/_generated/react.d.ts +0 -22
- package/src/forge/_generated/react.ts +0 -29
- package/src/forge/_generated/reactManifest.json +0 -2
- package/src/forge/_generated/reactManifest.ts +0 -19
- package/src/forge/_generated/rlsPolicies.json +0 -2
- package/src/forge/_generated/rlsPolicies.sql +0 -34
- package/src/forge/_generated/rlsPolicies.ts +0 -6
- package/src/forge/_generated/runtimeGraph.json +0 -2
- package/src/forge/_generated/runtimeGraph.ts +0 -8
- package/src/forge/_generated/runtimeMatrix.json +0 -2
- package/src/forge/_generated/runtimeMatrix.ts +0 -334130
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -91
- package/src/forge/_generated/secretRegistry.json +0 -2
- package/src/forge/_generated/secretRegistry.ts +0 -50
- package/src/forge/_generated/secretsContext.ts +0 -11
- package/src/forge/_generated/serverApi.ts +0 -10
- package/src/forge/_generated/sourceMapManifest.json +0 -2
- package/src/forge/_generated/sourceMapManifest.ts +0 -7
- package/src/forge/_generated/sqlPlan.json +0 -2
- package/src/forge/_generated/sqlPlan.ts +0 -88
- package/src/forge/_generated/subscriptionManifest.json +0 -2
- package/src/forge/_generated/subscriptionManifest.ts +0 -7
- package/src/forge/_generated/symbolicationManifest.json +0 -2
- package/src/forge/_generated/symbolicationManifest.ts +0 -17
- package/src/forge/_generated/telemetryRegistry.json +0 -2
- package/src/forge/_generated/telemetryRegistry.ts +0 -9
- package/src/forge/_generated/telemetrySinks.json +0 -2
- package/src/forge/_generated/telemetrySinks.ts +0 -11
- package/src/forge/_generated/tenantScope.json +0 -2
- package/src/forge/_generated/tenantScope.ts +0 -8
- package/src/forge/_generated/testGraph.json +0 -2
- package/src/forge/_generated/testGraph.ts +0 -3452
- package/src/forge/_generated/testPlanRegistry.json +0 -2
- package/src/forge/_generated/testPlanRegistry.ts +0 -33
- package/src/forge/_generated/uiRoutes.json +0 -2
- package/src/forge/_generated/uiRoutes.ts +0 -16
- package/src/forge/_generated/uiScenarios.json +0 -2
- package/src/forge/_generated/uiScenarios.ts +0 -30
- package/src/forge/_generated/uiTestManifest.json +0 -2
- package/src/forge/_generated/uiTestManifest.ts +0 -27
- package/src/forge/_generated/workflowRegistry.json +0 -2
- package/src/forge/_generated/workflowRegistry.ts +0 -9
- package/src/forge/_generated/workflowSubscriptions.json +0 -2
- package/src/forge/_generated/workflowSubscriptions.ts +0 -10
package/src/forge/cli/parse.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { FabricCliOptions } from "./fabric.ts";
|
|
2
|
+
import type { RepositoryCliOptions } from "./repository.ts";
|
|
3
|
+
import { isProgramRunAction, isManagedRunAction, isAttachedTaskAction, isAttachedTaskRead } from "../agent-fabric/local-task-server.ts";
|
|
1
4
|
import type { AddOptions, InspectTarget, VerifyOptions } from "../compiler/types/cli.ts";
|
|
2
5
|
import type { SandboxBackend } from "../compiler/types/runtime.ts";
|
|
3
6
|
import type { DbAdapterKind } from "../runtime/db/adapter.ts";
|
|
@@ -14,8 +17,16 @@ import type { LiveSubcommand } from "./live.ts";
|
|
|
14
17
|
import type { ForgeAiProvider } from "../runtime/ai/types.ts";
|
|
15
18
|
import type { NewPackageManager, NewTemplateName } from "./new.ts";
|
|
16
19
|
import type { SelfHostSubcommand } from "./self-host.ts";
|
|
20
|
+
import type { DocsSubcommand } from "./docs.ts";
|
|
17
21
|
import type { AgentContractSubcommand } from "./agent-contract.ts";
|
|
18
22
|
import type { AuthSubcommand } from "./auth.ts";
|
|
23
|
+
import type { BaselineSubcommand } from "./baseline.ts";
|
|
24
|
+
import type { AuthMdSubcommand } from "./authmd.ts";
|
|
25
|
+
import type { WorkOSFgaAction, WorkOSSubcommand } from "./workos.ts";
|
|
26
|
+
import type { DeploySubcommand, DeployTarget } from "./deploy.ts";
|
|
27
|
+
import type { FieldTestSubcommand } from "./field-test.ts";
|
|
28
|
+
import type { GoldenPathSubcommand } from "./golden-path.ts";
|
|
29
|
+
import type { SeedSubcommand } from "./seed.ts";
|
|
19
30
|
import type { RlsSubcommand } from "./rls.ts";
|
|
20
31
|
import type { SecuritySubcommand } from "./security.ts";
|
|
21
32
|
import type { DepsSubcommand } from "./deps.ts";
|
|
@@ -47,9 +58,15 @@ import type {
|
|
|
47
58
|
UiVideoMode,
|
|
48
59
|
} from "../ui/types.ts";
|
|
49
60
|
import type { ForgeDoOptions } from "../intent/types.ts";
|
|
61
|
+
import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
|
|
62
|
+
import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
|
|
63
|
+
import type { CairCommandOptions, CairSubcommand } from "../cair/types.ts";
|
|
64
|
+
import type { EvolutionCliOptions } from "./evolution.ts";
|
|
50
65
|
|
|
51
66
|
export type ForgeCommand =
|
|
52
67
|
| { kind: "version"; json: boolean }
|
|
68
|
+
| { kind: "last"; json: boolean; workspaceRoot: string }
|
|
69
|
+
| { kind: "baseline"; subcommand: BaselineSubcommand; json: boolean; reason?: string; workspaceRoot: string }
|
|
53
70
|
| {
|
|
54
71
|
kind: "new";
|
|
55
72
|
name: string;
|
|
@@ -59,6 +76,8 @@ export type ForgeCommand =
|
|
|
59
76
|
git: boolean;
|
|
60
77
|
forgePackageSpec?: string;
|
|
61
78
|
localForge: boolean;
|
|
79
|
+
json: boolean;
|
|
80
|
+
fieldTest: boolean;
|
|
62
81
|
workspaceRoot: string;
|
|
63
82
|
}
|
|
64
83
|
| { kind: "build"; json: boolean; workspaceRoot: string }
|
|
@@ -91,6 +110,15 @@ export type ForgeCommand =
|
|
|
91
110
|
postgresVersion: string;
|
|
92
111
|
runtimePort: number;
|
|
93
112
|
webPort: number;
|
|
113
|
+
preparedOnly?: boolean;
|
|
114
|
+
workspaceRoot: string;
|
|
115
|
+
}
|
|
116
|
+
| {
|
|
117
|
+
kind: "docs";
|
|
118
|
+
subcommand: DocsSubcommand;
|
|
119
|
+
json: boolean;
|
|
120
|
+
build: boolean;
|
|
121
|
+
installVenv: boolean;
|
|
94
122
|
workspaceRoot: string;
|
|
95
123
|
}
|
|
96
124
|
| {
|
|
@@ -99,7 +127,7 @@ export type ForgeCommand =
|
|
|
99
127
|
json: boolean;
|
|
100
128
|
workspaceRoot: string;
|
|
101
129
|
}
|
|
102
|
-
| { kind: "doctor"; target?: "project" | "windows"; json: boolean; workspaceRoot: string }
|
|
130
|
+
| { kind: "doctor"; target?: "project" | "windows" | "agent" | "delta" | "pglite" | "runtime"; agentTarget?: AgentAdapterTarget; json: boolean; workspaceRoot: string }
|
|
103
131
|
| { kind: "setup"; target: "windows"; json: boolean; yes: boolean; workspaceRoot: string }
|
|
104
132
|
| {
|
|
105
133
|
kind: "security";
|
|
@@ -115,6 +143,93 @@ export type ForgeCommand =
|
|
|
115
143
|
subcommand: AuthSubcommand;
|
|
116
144
|
json: boolean;
|
|
117
145
|
token?: string;
|
|
146
|
+
prod?: boolean;
|
|
147
|
+
scenario?: string;
|
|
148
|
+
provider?: "workos";
|
|
149
|
+
real?: boolean;
|
|
150
|
+
file?: string;
|
|
151
|
+
clientId?: string;
|
|
152
|
+
workspaceRoot: string;
|
|
153
|
+
}
|
|
154
|
+
| {
|
|
155
|
+
kind: "authmd";
|
|
156
|
+
subcommand: AuthMdSubcommand;
|
|
157
|
+
json: boolean;
|
|
158
|
+
output?: string;
|
|
159
|
+
workspaceRoot: string;
|
|
160
|
+
}
|
|
161
|
+
| {
|
|
162
|
+
kind: "workos";
|
|
163
|
+
subcommand: WorkOSSubcommand;
|
|
164
|
+
fgaAction?: WorkOSFgaAction;
|
|
165
|
+
json: boolean;
|
|
166
|
+
file?: string;
|
|
167
|
+
yes: boolean;
|
|
168
|
+
dryRun: boolean;
|
|
169
|
+
real?: boolean;
|
|
170
|
+
write?: boolean;
|
|
171
|
+
writePath?: string;
|
|
172
|
+
clientId?: string;
|
|
173
|
+
workspaceRoot: string;
|
|
174
|
+
}
|
|
175
|
+
| {
|
|
176
|
+
kind: "deploy";
|
|
177
|
+
subcommand: DeploySubcommand;
|
|
178
|
+
target: DeployTarget;
|
|
179
|
+
production: boolean;
|
|
180
|
+
url?: string;
|
|
181
|
+
json: boolean;
|
|
182
|
+
workspaceRoot: string;
|
|
183
|
+
}
|
|
184
|
+
| {
|
|
185
|
+
kind: "golden-path";
|
|
186
|
+
subcommand: GoldenPathSubcommand;
|
|
187
|
+
name: string;
|
|
188
|
+
template: NewTemplateName;
|
|
189
|
+
packageManager: NewPackageManager;
|
|
190
|
+
forgeSpec?: string;
|
|
191
|
+
auth: "none" | "workos";
|
|
192
|
+
target: DeployTarget;
|
|
193
|
+
production: boolean;
|
|
194
|
+
real: boolean;
|
|
195
|
+
clientId?: string;
|
|
196
|
+
url?: string;
|
|
197
|
+
json: boolean;
|
|
198
|
+
workspaceRoot: string;
|
|
199
|
+
}
|
|
200
|
+
| {
|
|
201
|
+
kind: "field-test";
|
|
202
|
+
subcommand: FieldTestSubcommand;
|
|
203
|
+
name?: string;
|
|
204
|
+
template: NewTemplateName;
|
|
205
|
+
templates?: NewTemplateName[];
|
|
206
|
+
packageManager: NewPackageManager;
|
|
207
|
+
packageManagers?: NewPackageManager[];
|
|
208
|
+
forgeSpec?: string;
|
|
209
|
+
auth?: "none" | "workos";
|
|
210
|
+
dryRun: boolean;
|
|
211
|
+
keep: boolean;
|
|
212
|
+
runtimeProbes: boolean;
|
|
213
|
+
authProbes: boolean;
|
|
214
|
+
uiProbes: boolean;
|
|
215
|
+
realistic: boolean;
|
|
216
|
+
timeoutMs: number;
|
|
217
|
+
writeReport?: string;
|
|
218
|
+
json: boolean;
|
|
219
|
+
workspaceRoot: string;
|
|
220
|
+
}
|
|
221
|
+
| {
|
|
222
|
+
kind: "seed";
|
|
223
|
+
subcommand: SeedSubcommand;
|
|
224
|
+
command?: string;
|
|
225
|
+
args: unknown;
|
|
226
|
+
url?: string;
|
|
227
|
+
userId?: string;
|
|
228
|
+
tenantId?: string;
|
|
229
|
+
role?: string;
|
|
230
|
+
permissions?: string[];
|
|
231
|
+
allTenants?: boolean;
|
|
232
|
+
json: boolean;
|
|
118
233
|
workspaceRoot: string;
|
|
119
234
|
}
|
|
120
235
|
| {
|
|
@@ -152,6 +267,7 @@ export type ForgeCommand =
|
|
|
152
267
|
json: boolean;
|
|
153
268
|
allowDirty: boolean;
|
|
154
269
|
allowPublicSourcemaps: boolean;
|
|
270
|
+
allowMissingLocalRelease?: boolean;
|
|
155
271
|
workspaceRoot: string;
|
|
156
272
|
}
|
|
157
273
|
| { kind: "make"; options: MakeCommandOptions }
|
|
@@ -161,12 +277,74 @@ export type ForgeCommand =
|
|
|
161
277
|
| { kind: "test"; options: TestCommandOptions }
|
|
162
278
|
| { kind: "repair"; options: RepairCommandOptions }
|
|
163
279
|
| { kind: "do"; options: ForgeDoOptions }
|
|
280
|
+
| { kind: "bench"; options: BenchCommandOptions }
|
|
281
|
+
| { kind: "cair"; options: CairCommandOptions }
|
|
164
282
|
| { kind: "agent"; options: AgentCommandOptions }
|
|
283
|
+
| ({ kind: "fabric" } & FabricCliOptions)
|
|
284
|
+
| ({ kind: "evolution" } & EvolutionCliOptions)
|
|
285
|
+
| { kind: "mcp"; subcommand: "serve"; workspaceRoot: string }
|
|
165
286
|
| { kind: "review"; options: ReviewCommandOptions }
|
|
166
287
|
| { kind: "ui"; options: UiCommandOptions }
|
|
167
|
-
| { kind: "
|
|
288
|
+
| { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
|
|
289
|
+
| { kind: "repository"; options: RepositoryCliOptions }
|
|
290
|
+
| { kind: "import"; options: BrownfieldImportCommandOptions }
|
|
291
|
+
| {
|
|
292
|
+
kind: "delta";
|
|
293
|
+
subcommand: "status" | "repair" | "compact" | "prune" | "export";
|
|
294
|
+
json: boolean;
|
|
295
|
+
workspaceRoot: string;
|
|
296
|
+
dryRun: boolean;
|
|
297
|
+
yes: boolean;
|
|
298
|
+
verbose: boolean;
|
|
299
|
+
olderThan?: string;
|
|
300
|
+
output?: string;
|
|
301
|
+
limit?: number;
|
|
302
|
+
redacted: boolean;
|
|
303
|
+
}
|
|
304
|
+
| { kind: "status"; json: boolean; workspaceRoot: string }
|
|
305
|
+
| { kind: "changed"; json: boolean; authoredOnly: boolean; reviewOnly: boolean; commitReady: boolean; workspaceRoot: string }
|
|
306
|
+
| { kind: "diff"; target: "authored" | "generated" | "full"; json: boolean; workspaceRoot: string }
|
|
307
|
+
| { kind: "handoff"; json: boolean; commitReady: boolean; workspaceRoot: string }
|
|
308
|
+
| {
|
|
309
|
+
kind: "studio";
|
|
310
|
+
subcommand: "attach" | "snapshot" | "watch" | "open" | "doctor" | "bridge" | "codex-server";
|
|
311
|
+
path?: string;
|
|
312
|
+
previewUrl?: string;
|
|
313
|
+
previewPort?: number;
|
|
314
|
+
studioUrl?: string;
|
|
315
|
+
intervalMs?: number;
|
|
316
|
+
once: boolean;
|
|
317
|
+
workspaceId?: string;
|
|
318
|
+
tenantId?: string;
|
|
319
|
+
userId?: string;
|
|
320
|
+
role?: string;
|
|
321
|
+
targets: string[];
|
|
322
|
+
install?: boolean;
|
|
323
|
+
start?: boolean;
|
|
324
|
+
bridge?: boolean;
|
|
325
|
+
writeSchemas?: boolean;
|
|
326
|
+
probeAppServer?: boolean;
|
|
327
|
+
json: boolean;
|
|
328
|
+
dryRun: boolean;
|
|
329
|
+
force: boolean;
|
|
330
|
+
workspaceRoot: string;
|
|
331
|
+
}
|
|
332
|
+
| { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; causal: boolean; staleProofs: boolean; workspaceRoot: string }
|
|
333
|
+
| { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
|
|
334
|
+
| {
|
|
335
|
+
kind: "session";
|
|
336
|
+
subcommand: "list" | "show" | "rename" | "merge" | "split" | "detach";
|
|
337
|
+
sessionId?: string;
|
|
338
|
+
sourceSessionId?: string;
|
|
339
|
+
operationId?: string;
|
|
340
|
+
title?: string;
|
|
341
|
+
limit?: number;
|
|
342
|
+
json: boolean;
|
|
343
|
+
workspaceRoot: string;
|
|
344
|
+
}
|
|
345
|
+
| { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number; workspaceRoot: string }
|
|
168
346
|
| { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
|
|
169
|
-
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
|
|
347
|
+
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean; full: boolean; brief: boolean; ergonomics: boolean; workspaceRoot: string }
|
|
170
348
|
| { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
|
|
171
349
|
| { kind: "verify"; options: VerifyOptions }
|
|
172
350
|
| { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
|
|
@@ -179,7 +357,7 @@ export type ForgeCommand =
|
|
|
179
357
|
once: boolean;
|
|
180
358
|
watch: boolean;
|
|
181
359
|
json: boolean;
|
|
182
|
-
db: "pglite" | "postgres" | "none";
|
|
360
|
+
db: "memory" | "pglite" | "postgres" | "none";
|
|
183
361
|
databaseUrl?: string;
|
|
184
362
|
worker: boolean;
|
|
185
363
|
withWeb: boolean;
|
|
@@ -187,8 +365,15 @@ export type ForgeCommand =
|
|
|
187
365
|
webOnly: boolean;
|
|
188
366
|
open: boolean;
|
|
189
367
|
webPort?: number;
|
|
368
|
+
publicApiUrl?: string;
|
|
190
369
|
telemetry: string[];
|
|
191
370
|
envFile?: string;
|
|
371
|
+
skipStartupConsole: boolean;
|
|
372
|
+
detach: boolean;
|
|
373
|
+
seed: boolean;
|
|
374
|
+
seedCommand?: string;
|
|
375
|
+
seedAllTenants?: boolean;
|
|
376
|
+
lifecycle?: "status" | "stop";
|
|
192
377
|
workspaceRoot: string;
|
|
193
378
|
}
|
|
194
379
|
| {
|
|
@@ -196,6 +381,7 @@ export type ForgeCommand =
|
|
|
196
381
|
subcommand: DbSubcommand;
|
|
197
382
|
db: DbAdapterKind;
|
|
198
383
|
databaseUrl?: string;
|
|
384
|
+
local?: boolean;
|
|
199
385
|
json: boolean;
|
|
200
386
|
workspaceRoot: string;
|
|
201
387
|
}
|
|
@@ -262,6 +448,7 @@ export type ForgeCommand =
|
|
|
262
448
|
subcommand: EnvSubcommand;
|
|
263
449
|
json: boolean;
|
|
264
450
|
redacted: boolean;
|
|
451
|
+
target?: "local" | "staging" | "production";
|
|
265
452
|
workspaceRoot: string;
|
|
266
453
|
}
|
|
267
454
|
| {
|
|
@@ -311,19 +498,31 @@ export interface ParsedCli {
|
|
|
311
498
|
|
|
312
499
|
export const TOP_LEVEL_COMMANDS = [
|
|
313
500
|
"version",
|
|
501
|
+
"last",
|
|
502
|
+
"baseline",
|
|
314
503
|
"new",
|
|
315
504
|
"build",
|
|
316
505
|
"serve",
|
|
317
506
|
"worker",
|
|
318
507
|
"self-host",
|
|
508
|
+
"docs",
|
|
319
509
|
"agent-contract",
|
|
320
510
|
"agent",
|
|
511
|
+
"fabric",
|
|
512
|
+
"evolution",
|
|
513
|
+
"mcp",
|
|
321
514
|
"review",
|
|
322
515
|
"ui",
|
|
323
516
|
"doctor",
|
|
324
517
|
"setup",
|
|
325
518
|
"security",
|
|
326
519
|
"auth",
|
|
520
|
+
"authmd",
|
|
521
|
+
"workos",
|
|
522
|
+
"deploy",
|
|
523
|
+
"golden-path",
|
|
524
|
+
"field-test",
|
|
525
|
+
"seed",
|
|
327
526
|
"rls",
|
|
328
527
|
"deps",
|
|
329
528
|
"release",
|
|
@@ -334,6 +533,20 @@ export const TOP_LEVEL_COMMANDS = [
|
|
|
334
533
|
"test",
|
|
335
534
|
"repair",
|
|
336
535
|
"do",
|
|
536
|
+
"bench",
|
|
537
|
+
"cair",
|
|
538
|
+
"delta",
|
|
539
|
+
"session",
|
|
540
|
+
"timeline",
|
|
541
|
+
"explain",
|
|
542
|
+
"manifest",
|
|
543
|
+
"repository",
|
|
544
|
+
"import",
|
|
545
|
+
"status",
|
|
546
|
+
"changed",
|
|
547
|
+
"diff",
|
|
548
|
+
"handoff",
|
|
549
|
+
"studio",
|
|
337
550
|
"generate",
|
|
338
551
|
"add",
|
|
339
552
|
"inspect",
|
|
@@ -370,6 +583,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
370
583
|
"ai",
|
|
371
584
|
"queries",
|
|
372
585
|
"api",
|
|
586
|
+
"external",
|
|
373
587
|
"client",
|
|
374
588
|
"frontend",
|
|
375
589
|
"auth",
|
|
@@ -388,7 +602,12 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
388
602
|
"agent-tools",
|
|
389
603
|
"agent-adapters",
|
|
390
604
|
"capability-map",
|
|
605
|
+
"summary",
|
|
606
|
+
"schema",
|
|
607
|
+
"drift",
|
|
608
|
+
"handoff",
|
|
391
609
|
"framework",
|
|
610
|
+
"imported",
|
|
392
611
|
"ui",
|
|
393
612
|
"ui-scenarios",
|
|
394
613
|
"ui-routes",
|
|
@@ -397,7 +616,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
397
616
|
"map",
|
|
398
617
|
];
|
|
399
618
|
|
|
400
|
-
const NEW_TEMPLATES: NewTemplateName[] = ["b2b-support-web", "minimal-web"];
|
|
619
|
+
const NEW_TEMPLATES: NewTemplateName[] = ["agent-workroom", "b2b-support-web", "minimal-web", "nuxt-web", "vendor-access"];
|
|
401
620
|
const NEW_PACKAGE_MANAGERS: NewPackageManager[] = ["bun", "npm", "pnpm", "yarn"];
|
|
402
621
|
const SELF_HOST_SUBCOMMANDS: SelfHostSubcommand[] = ["compose", "env", "check", "clean"];
|
|
403
622
|
const AGENT_CONTRACT_SUBCOMMANDS: AgentContractSubcommand[] = [
|
|
@@ -412,7 +631,15 @@ const AUTH_SUBCOMMANDS: AuthSubcommand[] = [
|
|
|
412
631
|
"test-token",
|
|
413
632
|
"jwks",
|
|
414
633
|
"prove",
|
|
634
|
+
"status",
|
|
415
635
|
];
|
|
636
|
+
const BASELINE_SUBCOMMANDS: BaselineSubcommand[] = ["create", "status"];
|
|
637
|
+
const AUTHMD_SUBCOMMANDS: AuthMdSubcommand[] = ["generate", "check"];
|
|
638
|
+
const WORKOS_SUBCOMMANDS: WorkOSSubcommand[] = ["install", "doctor", "seed", "setup", "prove", "env", "fga"];
|
|
639
|
+
const WORKOS_FGA_ACTIONS: WorkOSFgaAction[] = ["plan", "sync", "prove", "doctor"];
|
|
640
|
+
const DEPLOY_SUBCOMMANDS: DeploySubcommand[] = ["plan", "init", "check", "readiness", "render", "package", "verify"];
|
|
641
|
+
const GOLDEN_PATH_SUBCOMMANDS: GoldenPathSubcommand[] = ["plan", "status"];
|
|
642
|
+
const FIELD_TEST_SUBCOMMANDS: FieldTestSubcommand[] = ["create", "run", "report"];
|
|
416
643
|
const SECURITY_SUBCOMMANDS: SecuritySubcommand[] = ["prove"];
|
|
417
644
|
const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test", "mutate-test"];
|
|
418
645
|
const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
|
|
@@ -489,7 +716,7 @@ const RENAME_TARGETS: RenameTarget[] = [
|
|
|
489
716
|
"workflow",
|
|
490
717
|
"event",
|
|
491
718
|
];
|
|
492
|
-
const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain"];
|
|
719
|
+
const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain", "authz"];
|
|
493
720
|
const TEST_COSTS: TestCost[] = ["instant", "fast", "standard", "slow", "docker", "browser"];
|
|
494
721
|
const REPAIR_SUBCOMMANDS: RepairSubcommand[] = [
|
|
495
722
|
"diagnose",
|
|
@@ -506,10 +733,18 @@ const AGENT_SUBCOMMANDS: AgentSubcommand[] = [
|
|
|
506
733
|
"export",
|
|
507
734
|
"check",
|
|
508
735
|
"doctor",
|
|
736
|
+
"onboard",
|
|
509
737
|
"print-context",
|
|
510
738
|
"clean",
|
|
739
|
+
"prepare",
|
|
740
|
+
"hooks",
|
|
741
|
+
"install",
|
|
742
|
+
"ingest",
|
|
743
|
+
"context",
|
|
744
|
+
"memory",
|
|
745
|
+
"timeline",
|
|
511
746
|
];
|
|
512
|
-
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["inspect", "list", "explain"];
|
|
747
|
+
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["run", "inspect", "list", "explain"];
|
|
513
748
|
const REVIEW_MODES: ReviewMode[] = ["quick", "standard", "strict"];
|
|
514
749
|
const REVIEW_FAIL_ON: ReviewFailOn[] = ["warning", "error", "blocking"];
|
|
515
750
|
const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
|
|
@@ -527,6 +762,7 @@ const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
|
|
|
527
762
|
"agent",
|
|
528
763
|
];
|
|
529
764
|
const UI_SUBCOMMANDS: UiSubcommand[] = [
|
|
765
|
+
"audit",
|
|
530
766
|
"smoke",
|
|
531
767
|
"test",
|
|
532
768
|
"scenario",
|
|
@@ -550,6 +786,8 @@ const AI_SUBCOMMANDS: AiSubcommand[] = [
|
|
|
550
786
|
"redteam",
|
|
551
787
|
"trace",
|
|
552
788
|
];
|
|
789
|
+
const BENCH_SUBCOMMANDS: BenchSubcommand[] = ["compiler"];
|
|
790
|
+
const CAIR_SUBCOMMANDS: CairSubcommand[] = ["snapshot", "query", "action"];
|
|
553
791
|
|
|
554
792
|
function parseFlag(args: string[], flag: string): boolean {
|
|
555
793
|
return args.includes(flag);
|
|
@@ -563,6 +801,11 @@ function parseOptionValue(args: string[], flag: string): string | undefined {
|
|
|
563
801
|
return args[index + 1];
|
|
564
802
|
}
|
|
565
803
|
|
|
804
|
+
function parseOptionalOptionValue(args: string[], flag: string): string | undefined {
|
|
805
|
+
const value = parseOptionValue(args, flag);
|
|
806
|
+
return value && !value.startsWith("--") ? value : undefined;
|
|
807
|
+
}
|
|
808
|
+
|
|
566
809
|
function parseOptionValues(args: string[], flag: string): string[] {
|
|
567
810
|
const values: string[] = [];
|
|
568
811
|
for (let index = 0; index < args.length; index++) {
|
|
@@ -574,8 +817,8 @@ function parseOptionValues(args: string[], flag: string): string[] {
|
|
|
574
817
|
return values;
|
|
575
818
|
}
|
|
576
819
|
|
|
577
|
-
function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
|
|
578
|
-
if (value === "postgres" || value === "none") {
|
|
820
|
+
function parseDbKind(value: string | undefined): "memory" | "pglite" | "postgres" | "none" {
|
|
821
|
+
if (value === "memory" || value === "postgres" || value === "none") {
|
|
579
822
|
return value;
|
|
580
823
|
}
|
|
581
824
|
return "pglite";
|
|
@@ -602,7 +845,10 @@ function parseSandboxBackend(value: string | undefined): SandboxBackend {
|
|
|
602
845
|
function parseAddOptions(
|
|
603
846
|
args: string[],
|
|
604
847
|
workspaceRoot: string,
|
|
848
|
+
mode: AddOptions["mode"] = "auto",
|
|
605
849
|
): AddOptions & { workspaceRoot: string } {
|
|
850
|
+
const frontend = parseFlag(args, "--frontend");
|
|
851
|
+
const backend = parseFlag(args, "--backend");
|
|
606
852
|
return {
|
|
607
853
|
workspaceRoot,
|
|
608
854
|
json: parseFlag(args, "--json"),
|
|
@@ -612,6 +858,10 @@ function parseAddOptions(
|
|
|
612
858
|
parseOptionValue(args, "--sandbox-backend"),
|
|
613
859
|
),
|
|
614
860
|
allowScripts: parseFlag(args, "--allow-scripts"),
|
|
861
|
+
withFga: parseFlag(args, "--with-fga"),
|
|
862
|
+
mode,
|
|
863
|
+
installWorkspace: parseOptionValue(args, "--workspace"),
|
|
864
|
+
packageTarget: frontend && !backend ? "frontend" : backend ? "backend" : undefined,
|
|
615
865
|
};
|
|
616
866
|
}
|
|
617
867
|
|
|
@@ -663,6 +913,33 @@ function parseNewPackageManager(value: string | undefined): NewPackageManager {
|
|
|
663
913
|
: "bun";
|
|
664
914
|
}
|
|
665
915
|
|
|
916
|
+
function parseCommaList(value: string | undefined): string[] {
|
|
917
|
+
return String(value ?? "")
|
|
918
|
+
.split(",")
|
|
919
|
+
.map((item) => item.trim())
|
|
920
|
+
.filter(Boolean);
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
function parseTemplateList(value: string | undefined, errors: string[], optionName: string): NewTemplateName[] | undefined {
|
|
924
|
+
if (!value) return undefined;
|
|
925
|
+
const values = parseCommaList(value);
|
|
926
|
+
const unsupported = values.filter((item) => !NEW_TEMPLATES.includes(item as NewTemplateName));
|
|
927
|
+
if (unsupported.length > 0) {
|
|
928
|
+
errors.push(`${optionName} contains unsupported template(s): ${unsupported.join(", ")}; supported: ${NEW_TEMPLATES.join(", ")}`);
|
|
929
|
+
}
|
|
930
|
+
return values.filter((item) => NEW_TEMPLATES.includes(item as NewTemplateName)) as NewTemplateName[];
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
function parsePackageManagerList(value: string | undefined, errors: string[], optionName: string): NewPackageManager[] | undefined {
|
|
934
|
+
if (!value) return undefined;
|
|
935
|
+
const values = parseCommaList(value);
|
|
936
|
+
const unsupported = values.filter((item) => !NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager));
|
|
937
|
+
if (unsupported.length > 0) {
|
|
938
|
+
errors.push(`${optionName} contains unsupported package manager(s): ${unsupported.join(", ")}; supported: ${NEW_PACKAGE_MANAGERS.join(", ")}`);
|
|
939
|
+
}
|
|
940
|
+
return values.filter((item) => NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager)) as NewPackageManager[];
|
|
941
|
+
}
|
|
942
|
+
|
|
666
943
|
function parseDoObjective(rest: string[], argv: string[]): string {
|
|
667
944
|
const [action, name, ...tail] = rest;
|
|
668
945
|
if (action === "add-resource") {
|
|
@@ -691,6 +968,55 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
691
968
|
const positional = argv.filter((arg) => !arg.startsWith("-"));
|
|
692
969
|
const workspaceRoot = process.cwd().replace(/\\/g, "/");
|
|
693
970
|
|
|
971
|
+
if (argv[0] === "repository" || (argv[0] === "manifest" && argv[1] === "discover")) {
|
|
972
|
+
const action = argv[0] === "manifest" ? "discover" : argv[1];
|
|
973
|
+
if (!["discover", "analyze", "context", "quality", "cache-gc", "benchmark-plan", "benchmark-report", "runtime-plan", "runtime-observe", "runtime-context"].includes(action ?? "")) errors.push("Unsupported repository action");
|
|
974
|
+
const values = ["--root", "--project-id", "--manifest", "--cache-root", "--query", "--snapshot-id", "--limit", "--max-chars", "--cursor", "--output", "--cases", "--model-config", "--repetitions", "--plan", "--observations", "--grace-hours", "--environment-id", "--observation-id"];
|
|
975
|
+
const flags = ["--json", "--write", "--no-delta", "--execute"];
|
|
976
|
+
for (let i = 2; i < argv.length; i++) {
|
|
977
|
+
if (values.includes(argv[i]!)) {
|
|
978
|
+
if (!argv[i + 1] || argv[i + 1]!.startsWith("--")) errors.push(`${argv[i]} requires a value`); else i++;
|
|
979
|
+
} else if (!flags.includes(argv[i]!)) errors.push(`Unexpected repository argument ${argv[i]}`);
|
|
980
|
+
}
|
|
981
|
+
const numeric = (flag: string, min: number, max: number) => { const raw = parseOptionValue(argv, flag); if (raw === undefined) return undefined; const number = Number(raw); if (!Number.isSafeInteger(number) || number < min || number > max) errors.push(`${flag} must be an integer ${min}..${max}`); return number; };
|
|
982
|
+
const limit = numeric("--limit", 1, 100), maxChars = numeric("--max-chars", 2048, 50000);
|
|
983
|
+
const repetitions = numeric("--repetitions", 1, 10), graceHours = numeric("--grace-hours", 1, 720);
|
|
984
|
+
for (const [flag, max] of [["--query", 2000], ["--snapshot-id", 2000], ["--cursor", 1000]] as const) {
|
|
985
|
+
if ((parseOptionValue(argv, flag)?.length ?? 0) > max) errors.push(`${flag} exceeds ${max} characters`);
|
|
986
|
+
}
|
|
987
|
+
const write = parseFlag(argv, "--write");
|
|
988
|
+
const runtime = action?.startsWith("runtime-");
|
|
989
|
+
const execute = parseFlag(argv, "--execute"), environmentId = parseOptionValue(argv, "--environment-id"), observationId = parseOptionValue(argv, "--observation-id");
|
|
990
|
+
if (!runtime && (execute || environmentId !== undefined || observationId !== undefined)) errors.push("Runtime options require a runtime action");
|
|
991
|
+
if (execute && action !== "runtime-observe") errors.push("--execute requires runtime-observe");
|
|
992
|
+
if (["runtime-plan", "runtime-observe"].includes(action ?? "") && !environmentId) errors.push("Runtime plan/observe requires --environment-id");
|
|
993
|
+
if (action === "runtime-observe" && !execute) errors.push("runtime-observe requires explicit --execute after reviewing runtime-plan");
|
|
994
|
+
if (["runtime-plan", "runtime-context"].includes(action ?? "") && write) errors.push("Runtime plan/context is read-only");
|
|
995
|
+
if (runtime && (parseOptionValue(argv, "--cache-root") || parseOptionValue(argv, "--cursor"))) errors.push("Runtime actions do not support --cache-root/--cursor");
|
|
996
|
+
if (runtime && maxChars !== undefined && maxChars > 16000) errors.push("Runtime context is bounded to 16000 characters");
|
|
997
|
+
if (runtime && limit !== undefined) errors.push("Runtime actions do not support --limit");
|
|
998
|
+
if (runtime && action !== "runtime-context" && parseOptionValue(argv, "--query") !== undefined) errors.push("Runtime --query requires runtime-context");
|
|
999
|
+
if (action === "runtime-context" && observationId) errors.push("--observation-id requires runtime-plan/observe");
|
|
1000
|
+
for (const label of [environmentId, observationId]) if (label !== undefined && !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,79}$/.test(label)) errors.push("Invalid runtime label");
|
|
1001
|
+
if (["context", "quality", "benchmark-plan", "benchmark-report"].includes(action ?? "") && write) errors.push("context/quality/benchmark is read-only");
|
|
1002
|
+
if (["quality", "benchmark-plan"].includes(action ?? "") && !parseOptionValue(argv, "--cases")) errors.push("quality/benchmark-plan requires --cases <file>");
|
|
1003
|
+
if (!["quality", "benchmark-plan"].includes(action ?? "") && parseOptionValue(argv, "--cases")) errors.push("--cases only supported for quality/benchmark-plan");
|
|
1004
|
+
if (action === "benchmark-plan" && !parseOptionValue(argv, "--model-config")) errors.push("benchmark-plan requires --model-config <file>");
|
|
1005
|
+
if (action !== "benchmark-plan" && (parseOptionValue(argv, "--model-config") || repetitions !== undefined)) errors.push("Model options require benchmark-plan");
|
|
1006
|
+
if (action === "benchmark-report" && (!parseOptionValue(argv, "--plan") || !parseOptionValue(argv, "--observations"))) errors.push("benchmark-report requires --plan and --observations");
|
|
1007
|
+
if (action !== "benchmark-report" && (parseOptionValue(argv, "--plan") || parseOptionValue(argv, "--observations"))) errors.push("--plan/--observations require benchmark-report");
|
|
1008
|
+
if (action !== "cache-gc" && graceHours !== undefined) errors.push("--grace-hours requires cache-gc");
|
|
1009
|
+
if (action === "cache-gc" && ["--query", "--snapshot-id", "--limit", "--max-chars", "--cursor"].some(flag => argv.includes(flag))) errors.push("cache-gc does not support context or snapshot guard options");
|
|
1010
|
+
if (action !== "discover" && parseOptionValue(argv, "--output")) errors.push("--output only supported for discovery");
|
|
1011
|
+
return { workspaceRoot, errors, command: errors.length ? null : { kind: "repository", options: {
|
|
1012
|
+
action: action as RepositoryCliOptions["action"], cwd: workspaceRoot, write, json: parseFlag(argv, "--json"),
|
|
1013
|
+
root: parseOptionValue(argv, "--root"), projectId: parseOptionValue(argv, "--project-id"), manifestPath: parseOptionValue(argv, "--manifest"),
|
|
1014
|
+
cacheRoot: parseOptionValue(argv, "--cache-root"), query: parseOptionValue(argv, "--query"), snapshotId: parseOptionValue(argv, "--snapshot-id"),
|
|
1015
|
+
limit, maxChars, cursor: parseOptionValue(argv, "--cursor"), output: parseOptionValue(argv, "--output"), cases: parseOptionValue(argv, "--cases"),
|
|
1016
|
+
modelConfig: parseOptionValue(argv, "--model-config"), repetitions, plan: parseOptionValue(argv, "--plan"), observations: parseOptionValue(argv, "--observations"), graceHours, execute, environmentId, observationId,
|
|
1017
|
+
} } };
|
|
1018
|
+
}
|
|
1019
|
+
|
|
694
1020
|
if (parseFlag(argv, "--version") || parseFlag(argv, "-v")) {
|
|
695
1021
|
return {
|
|
696
1022
|
command: { kind: "version", json: parseFlag(argv, "--json") },
|
|
@@ -709,6 +1035,36 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
709
1035
|
const [commandName, ...rest] = positional;
|
|
710
1036
|
|
|
711
1037
|
switch (commandName) {
|
|
1038
|
+
case "version":
|
|
1039
|
+
return {
|
|
1040
|
+
command: { kind: "version", json: parseFlag(argv, "--json") },
|
|
1041
|
+
workspaceRoot,
|
|
1042
|
+
errors,
|
|
1043
|
+
};
|
|
1044
|
+
case "last":
|
|
1045
|
+
return {
|
|
1046
|
+
command: { kind: "last", json: parseFlag(argv, "--json"), workspaceRoot },
|
|
1047
|
+
workspaceRoot,
|
|
1048
|
+
errors,
|
|
1049
|
+
};
|
|
1050
|
+
case "baseline": {
|
|
1051
|
+
const subcommand = (rest[0] ?? "status") as BaselineSubcommand;
|
|
1052
|
+
if (!BASELINE_SUBCOMMANDS.includes(subcommand)) {
|
|
1053
|
+
errors.push("forge baseline requires subcommand: create or status");
|
|
1054
|
+
return { command: null, workspaceRoot, errors };
|
|
1055
|
+
}
|
|
1056
|
+
return {
|
|
1057
|
+
command: {
|
|
1058
|
+
kind: "baseline",
|
|
1059
|
+
subcommand,
|
|
1060
|
+
reason: parseOptionValue(argv, "--reason"),
|
|
1061
|
+
json: parseFlag(argv, "--json"),
|
|
1062
|
+
workspaceRoot,
|
|
1063
|
+
},
|
|
1064
|
+
workspaceRoot,
|
|
1065
|
+
errors,
|
|
1066
|
+
};
|
|
1067
|
+
}
|
|
712
1068
|
case "new": {
|
|
713
1069
|
const name = rest[0];
|
|
714
1070
|
if (!name) {
|
|
@@ -738,6 +1094,9 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
738
1094
|
if (install && noInstall) {
|
|
739
1095
|
errors.push("use either --install or --no-install, not both");
|
|
740
1096
|
}
|
|
1097
|
+
if (parseFlag(argv, "--field-test") && noInstall) {
|
|
1098
|
+
errors.push("forge new --field-test requires installation; remove --no-install");
|
|
1099
|
+
}
|
|
741
1100
|
|
|
742
1101
|
return {
|
|
743
1102
|
command: {
|
|
@@ -749,6 +1108,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
749
1108
|
git: !parseFlag(argv, "--no-git"),
|
|
750
1109
|
forgePackageSpec,
|
|
751
1110
|
localForge,
|
|
1111
|
+
json: parseFlag(argv, "--json"),
|
|
1112
|
+
fieldTest: parseFlag(argv, "--field-test"),
|
|
752
1113
|
workspaceRoot,
|
|
753
1114
|
},
|
|
754
1115
|
workspaceRoot,
|
|
@@ -838,6 +1199,26 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
838
1199
|
postgresVersion: parseOptionValue(argv, "--postgres-version") ?? "16",
|
|
839
1200
|
runtimePort: Math.floor(runtimePort),
|
|
840
1201
|
webPort: Math.floor(webPort),
|
|
1202
|
+
preparedOnly: parseFlag(argv, "--prepared-only"),
|
|
1203
|
+
workspaceRoot,
|
|
1204
|
+
},
|
|
1205
|
+
workspaceRoot,
|
|
1206
|
+
errors,
|
|
1207
|
+
};
|
|
1208
|
+
}
|
|
1209
|
+
case "docs": {
|
|
1210
|
+
const subcommand = rest[0] as DocsSubcommand | undefined;
|
|
1211
|
+
if (subcommand !== "check") {
|
|
1212
|
+
errors.push("forge docs requires subcommand: check");
|
|
1213
|
+
return { command: null, workspaceRoot, errors };
|
|
1214
|
+
}
|
|
1215
|
+
return {
|
|
1216
|
+
command: {
|
|
1217
|
+
kind: "docs",
|
|
1218
|
+
subcommand,
|
|
1219
|
+
json: parseFlag(argv, "--json"),
|
|
1220
|
+
build: parseFlag(argv, "--build"),
|
|
1221
|
+
installVenv: parseFlag(argv, "--install-venv"),
|
|
841
1222
|
workspaceRoot,
|
|
842
1223
|
},
|
|
843
1224
|
workspaceRoot,
|
|
@@ -864,12 +1245,54 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
864
1245
|
case "agent": {
|
|
865
1246
|
const subcommand = rest[0] as AgentSubcommand | undefined;
|
|
866
1247
|
if (!subcommand || !AGENT_SUBCOMMANDS.includes(subcommand)) {
|
|
867
|
-
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, print-context, or
|
|
1248
|
+
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, onboard, print-context, clean, prepare, hooks, install, ingest, context, memory, or timeline");
|
|
868
1249
|
return { command: null, workspaceRoot, errors };
|
|
869
1250
|
}
|
|
1251
|
+
const inputRaw = parseOptionValue(argv, "--input");
|
|
1252
|
+
let input: unknown;
|
|
1253
|
+
if (inputRaw !== undefined) {
|
|
1254
|
+
try {
|
|
1255
|
+
input = JSON.parse(inputRaw);
|
|
1256
|
+
} catch {
|
|
1257
|
+
errors.push("--input must be valid JSON");
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
1261
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
1262
|
+
const pollIntervalRaw = parseOptionValue(argv, "--poll-interval");
|
|
1263
|
+
const pollIntervalMs = pollIntervalRaw ? Number(pollIntervalRaw) : undefined;
|
|
1264
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
1265
|
+
errors.push("--limit must be a number >= 1");
|
|
1266
|
+
}
|
|
1267
|
+
if (
|
|
1268
|
+
pollIntervalRaw !== undefined &&
|
|
1269
|
+
(!Number.isFinite(pollIntervalMs) || pollIntervalMs! < 100)
|
|
1270
|
+
) {
|
|
1271
|
+
errors.push("--poll-interval must be a number >= 100");
|
|
1272
|
+
}
|
|
870
1273
|
const target =
|
|
871
1274
|
(parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ??
|
|
872
|
-
(subcommand === "
|
|
1275
|
+
(subcommand === "install" || subcommand === "ingest" ? rest[1] : undefined) ??
|
|
1276
|
+
(subcommand === "hooks" ? rest[2] : undefined) ??
|
|
1277
|
+
(subcommand === "timeline" ? rest[1] : undefined) ??
|
|
1278
|
+
(subcommand === "timeline" ? "all" : undefined) ??
|
|
1279
|
+
(subcommand === "hooks" || subcommand === "onboard" ? "codex" : "generic");
|
|
1280
|
+
const contextOptionValues = new Set(
|
|
1281
|
+
[
|
|
1282
|
+
parseOptionValue(argv, "--entry"),
|
|
1283
|
+
parseOptionValue(argv, "--change"),
|
|
1284
|
+
parseOptionValue(argv, "--proof"),
|
|
1285
|
+
parseOptionValue(argv, "--event"),
|
|
1286
|
+
parseOptionValue(argv, "--input"),
|
|
1287
|
+
parseOptionValue(argv, "--target"),
|
|
1288
|
+
parseOptionValue(argv, "--file"),
|
|
1289
|
+
limitRaw,
|
|
1290
|
+
pollIntervalRaw,
|
|
1291
|
+
].filter((value): value is string => typeof value === "string"),
|
|
1292
|
+
);
|
|
1293
|
+
const contextEntry = subcommand === "context"
|
|
1294
|
+
? rest.slice(1).find((part) => !part.startsWith("--") && !contextOptionValues.has(part))
|
|
1295
|
+
: undefined;
|
|
873
1296
|
return {
|
|
874
1297
|
command: {
|
|
875
1298
|
kind: "agent",
|
|
@@ -880,15 +1303,125 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
880
1303
|
target,
|
|
881
1304
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
882
1305
|
force: parseFlag(argv, "--force"),
|
|
1306
|
+
mcpServer: parseOptionValue(argv, "--mcp-server"),
|
|
883
1307
|
preserveUserSections: !parseFlag(argv, "--no-preserve-user-sections"),
|
|
884
1308
|
skills: !parseFlag(argv, "--no-skills"),
|
|
885
1309
|
rules: !parseFlag(argv, "--no-rules"),
|
|
1310
|
+
eventName: parseOptionValue(argv, "--event"),
|
|
1311
|
+
hookAction: subcommand === "hooks" ? rest[1] : undefined,
|
|
1312
|
+
input,
|
|
1313
|
+
entry: parseOptionValue(argv, "--entry") ?? contextEntry,
|
|
1314
|
+
change: parseOptionValue(argv, "--change"),
|
|
1315
|
+
proof: parseOptionValue(argv, "--proof"),
|
|
1316
|
+
handoff: parseFlag(argv, "--handoff"),
|
|
1317
|
+
current: parseFlag(argv, "--current"),
|
|
1318
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
1319
|
+
watch: parseFlag(argv, "--watch"),
|
|
1320
|
+
file: parseOptionValue(argv, "--file"),
|
|
1321
|
+
pollIntervalMs: pollIntervalMs ? Math.floor(pollIntervalMs) : undefined,
|
|
886
1322
|
},
|
|
887
1323
|
},
|
|
888
1324
|
workspaceRoot,
|
|
889
1325
|
errors,
|
|
890
1326
|
};
|
|
891
1327
|
}
|
|
1328
|
+
case "fabric": {
|
|
1329
|
+
const subcommand = rest[0];
|
|
1330
|
+
if (!isProgramRunAction(subcommand) && !isManagedRunAction(subcommand) && !isAttachedTaskAction(subcommand) && subcommand !== "install-skill" && subcommand !== "doctor" && subcommand !== "ensure-owner" && subcommand !== "project-register" && subcommand !== "project-list" && subcommand !== "capabilities" && subcommand !== "propose" && subcommand !== "status" && subcommand !== "evidence" && subcommand !== "review" && subcommand !== "run" && subcommand !== "cancel" && subcommand !== "reconcile" && subcommand !== "verify" && subcommand !== "recover-verification" && subcommand !== "review-result" && subcommand !== "serve" && subcommand !== "memory-add" && subcommand !== "memory-list" && subcommand !== "memory-delete" && subcommand !== "adaptive-propose" && subcommand !== "adaptive-review" && subcommand !== "adaptive-run" && subcommand !== "adaptive-status" && subcommand !== "change-propose" && subcommand !== "change-status" && subcommand !== "change-review" && subcommand !== "change-evidence") {
|
|
1331
|
+
errors.push("forge fabric requires a supported task or memory subcommand");
|
|
1332
|
+
return { command: null, workspaceRoot, errors };
|
|
1333
|
+
}
|
|
1334
|
+
const file = parseOptionValue(argv, "--file");
|
|
1335
|
+
const runId = parseOptionValue(argv, "--run-id");
|
|
1336
|
+
const projectId = parseOptionValue(argv, "--project-id");
|
|
1337
|
+
if (projectId && subcommand !== "project-register") errors.push("--project-id is only supported by fabric project-register; MCP routes by registered projectId");
|
|
1338
|
+
if (["install-skill", "doctor", "ensure-owner", "project-register", "project-list"].includes(subcommand) && (file || parseOptionValue(argv, "--task-id"))) errors.push("Project lifecycle commands do not accept task request files or task ids");
|
|
1339
|
+
if (parseFlag(argv, "--dry-run") && subcommand !== "install-skill") errors.push("fabric --dry-run is only supported by install-skill");
|
|
1340
|
+
const adaptiveChannel = parseOptionValue(argv, "--channel");
|
|
1341
|
+
if (adaptiveChannel && (subcommand !== "adaptive-propose" || (adaptiveChannel !== "canary" && adaptiveChannel !== "stable"))) errors.push("--channel requires adaptive-propose and canary or stable");
|
|
1342
|
+
const isChangeReadOrReview = subcommand === "change-status" || subcommand === "change-review" || subcommand === "change-evidence";
|
|
1343
|
+
const taskId = (isAttachedTaskAction(subcommand) && isAttachedTaskRead(subcommand)) || isChangeReadOrReview ? parseOptionValue(argv, "--task-id")
|
|
1344
|
+
: subcommand === "status" || subcommand === "evidence" || subcommand === "review" || subcommand === "run" || subcommand === "cancel" || subcommand === "reconcile" || subcommand === "verify" || subcommand === "recover-verification" || subcommand === "review-result" || subcommand === "memory-delete" || subcommand === "adaptive-review" || subcommand === "adaptive-run" || subcommand === "adaptive-status" ? rest[1] : undefined;
|
|
1345
|
+
if (isManagedRunAction(subcommand) || isProgramRunAction(subcommand)) {
|
|
1346
|
+
if (["run-status", "program-status", "program-history", "program-explain"].includes(subcommand ?? "")) {
|
|
1347
|
+
if (!runId || runId.startsWith("--")) errors.push("forge fabric run-status requires --run-id <run-id>");
|
|
1348
|
+
if (file) errors.push("forge fabric run-status does not accept --file");
|
|
1349
|
+
} else {
|
|
1350
|
+
if (!file || file.startsWith("--")) errors.push(`forge fabric ${subcommand} requires --file <request.json>`);
|
|
1351
|
+
if (runId) errors.push(`forge fabric ${subcommand} requires runId in the request file`);
|
|
1352
|
+
}
|
|
1353
|
+
if (parseOptionValue(argv, "--task-id")) errors.push("Managed execution uses runId, not taskId");
|
|
1354
|
+
} else if (runId) errors.push("--run-id is only supported by fabric run-status/program-status");
|
|
1355
|
+
if (isAttachedTaskAction(subcommand)) {
|
|
1356
|
+
if (isAttachedTaskRead(subcommand)) {
|
|
1357
|
+
if (!taskId || taskId.startsWith("--")) errors.push(`forge fabric ${subcommand} requires --task-id <task-id>`);
|
|
1358
|
+
if (file) errors.push(`forge fabric ${subcommand} does not accept --file`);
|
|
1359
|
+
} else {
|
|
1360
|
+
if (!file || file.startsWith("--")) errors.push(`forge fabric ${subcommand} requires --file <request.json>`);
|
|
1361
|
+
if (parseOptionValue(argv, "--task-id")) errors.push(`forge fabric ${subcommand} requires taskId in the request file`);
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
if (subcommand === "propose" && (!file || file.startsWith("--"))) errors.push("forge fabric propose requires --file <proposal.json>");
|
|
1365
|
+
if (subcommand === "change-propose" && (!file || file.startsWith("--"))) errors.push("forge fabric change-propose requires --file <request.json>");
|
|
1366
|
+
if (isChangeReadOrReview && (!taskId || taskId.startsWith("--"))) errors.push(`forge fabric ${subcommand} requires --task-id <change-id>`);
|
|
1367
|
+
if (subcommand === "adaptive-propose" && (!file || file.startsWith("--"))) errors.push("forge fabric adaptive-propose requires --file <input.json>");
|
|
1368
|
+
if ((subcommand === "memory-add" || subcommand === "memory-list") && (!file || file.startsWith("--"))) errors.push(`forge fabric ${subcommand} requires --file <request.json>`);
|
|
1369
|
+
if ((subcommand === "status" || subcommand === "evidence" || subcommand === "review" || subcommand === "run" || subcommand === "cancel" || subcommand === "reconcile" || subcommand === "verify" || subcommand === "recover-verification" || subcommand === "review-result" || subcommand === "memory-delete") && !taskId) errors.push(`forge fabric ${subcommand} requires an id`);
|
|
1370
|
+
if ((subcommand === "adaptive-review" || subcommand === "adaptive-run" || subcommand === "adaptive-status") && !taskId) errors.push(`forge fabric ${subcommand} requires an id`);
|
|
1371
|
+
return {
|
|
1372
|
+
command: errors.length === 0 ? {
|
|
1373
|
+
kind: "fabric", subcommand, workspaceRoot, json: parseFlag(argv, "--json"),
|
|
1374
|
+
...(file ? { file } : {}), ...(taskId ? { taskId } : {}), ...(runId ? { runId } : {}), ...(projectId ? { projectId } : {}),
|
|
1375
|
+
...(subcommand === "install-skill" ? { dryRun: parseFlag(argv, "--dry-run") } : {}),
|
|
1376
|
+
...(adaptiveChannel === "canary" || adaptiveChannel === "stable" ? { channel: adaptiveChannel } : {}),
|
|
1377
|
+
} : null,
|
|
1378
|
+
workspaceRoot,
|
|
1379
|
+
errors,
|
|
1380
|
+
};
|
|
1381
|
+
}
|
|
1382
|
+
case "evolution": {
|
|
1383
|
+
const subcommand = rest[0];
|
|
1384
|
+
if (subcommand !== "register" && subcommand !== "evaluate" && subcommand !== "status" &&
|
|
1385
|
+
subcommand !== "review" && subcommand !== "load") {
|
|
1386
|
+
errors.push("forge evolution requires register, evaluate, status, review, or load");
|
|
1387
|
+
return { command: null, workspaceRoot, errors };
|
|
1388
|
+
}
|
|
1389
|
+
const manifest = parseOptionValue(argv, "--manifest");
|
|
1390
|
+
const channel = parseOptionValue(argv, "--channel");
|
|
1391
|
+
const action = rest[1];
|
|
1392
|
+
const versionId = subcommand === "review" ? rest[2] : rest[1];
|
|
1393
|
+
const extensionKey = rest[1];
|
|
1394
|
+
if (subcommand === "register" && !manifest) errors.push("forge evolution register requires --manifest <file>");
|
|
1395
|
+
if ((subcommand === "evaluate" || subcommand === "status" || subcommand === "review") &&
|
|
1396
|
+
!versionId) errors.push(`forge evolution ${subcommand} requires a version id`);
|
|
1397
|
+
if (subcommand === "review" && !["canary", "promote", "rollback", "revoke"].includes(action ?? ""))
|
|
1398
|
+
errors.push("forge evolution review requires canary, promote, rollback, or revoke");
|
|
1399
|
+
if (subcommand === "load" && (!extensionKey || (channel !== "canary" && channel !== "stable")))
|
|
1400
|
+
errors.push("forge evolution load requires <extension-key> --channel canary|stable");
|
|
1401
|
+
return { command: errors.length === 0 ? {
|
|
1402
|
+
kind: "evolution", subcommand, workspaceRoot, json: parseFlag(argv, "--json"),
|
|
1403
|
+
...(manifest ? { manifest } : {}),
|
|
1404
|
+
...(subcommand === "review" || subcommand === "evaluate" || subcommand === "status" ? { versionId } : {}),
|
|
1405
|
+
...(subcommand === "review" ? { action: action as "canary" | "promote" | "rollback" | "revoke" } : {}),
|
|
1406
|
+
...(subcommand === "load" ? { extensionKey, channel: channel as "canary" | "stable" } : {}),
|
|
1407
|
+
} : null, workspaceRoot, errors };
|
|
1408
|
+
}
|
|
1409
|
+
case "mcp": {
|
|
1410
|
+
const subcommand = rest[0];
|
|
1411
|
+
if (subcommand !== "serve") {
|
|
1412
|
+
errors.push("forge mcp requires subcommand: serve");
|
|
1413
|
+
return { command: null, workspaceRoot, errors };
|
|
1414
|
+
}
|
|
1415
|
+
return {
|
|
1416
|
+
command: {
|
|
1417
|
+
kind: "mcp",
|
|
1418
|
+
subcommand,
|
|
1419
|
+
workspaceRoot,
|
|
1420
|
+
},
|
|
1421
|
+
workspaceRoot,
|
|
1422
|
+
errors,
|
|
1423
|
+
};
|
|
1424
|
+
}
|
|
892
1425
|
case "review": {
|
|
893
1426
|
const requested = rest[0] as ReviewSubcommand | undefined;
|
|
894
1427
|
const subcommand =
|
|
@@ -911,6 +1444,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
911
1444
|
json: parseFlag(argv, "--json"),
|
|
912
1445
|
md: parseFlag(argv, "--md"),
|
|
913
1446
|
sarif: parseFlag(argv, "--sarif"),
|
|
1447
|
+
full: parseFlag(argv, "--full"),
|
|
914
1448
|
write: positionalWrite || parseFlag(argv, "--write"),
|
|
915
1449
|
changed: parseFlag(argv, "--changed") || noSourceFlag,
|
|
916
1450
|
staged: parseFlag(argv, "--staged"),
|
|
@@ -934,7 +1468,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
934
1468
|
case "ui": {
|
|
935
1469
|
const subcommand = (rest[0] ?? "smoke") as UiSubcommand;
|
|
936
1470
|
if (!UI_SUBCOMMANDS.includes(subcommand)) {
|
|
937
|
-
errors.push("forge ui requires subcommand: smoke, test, scenario, route, snapshot, report, doctor, or list");
|
|
1471
|
+
errors.push("forge ui requires subcommand: audit, smoke, test, scenario, route, snapshot, report, doctor, or list");
|
|
938
1472
|
return { command: null, workspaceRoot, errors };
|
|
939
1473
|
}
|
|
940
1474
|
const timeoutRaw = parseOptionValue(argv, "--timeout");
|
|
@@ -981,14 +1515,27 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
981
1515
|
};
|
|
982
1516
|
}
|
|
983
1517
|
case "doctor":
|
|
984
|
-
if (rest[0] && rest[0] !== "windows") {
|
|
985
|
-
errors.push("forge doctor supports subcommand: windows");
|
|
1518
|
+
if (rest[0] && rest[0] !== "windows" && rest[0] !== "agent" && rest[0] !== "delta" && rest[0] !== "pglite" && rest[0] !== "runtime") {
|
|
1519
|
+
errors.push("forge doctor supports subcommand: windows, agent, delta, pglite, or runtime");
|
|
986
1520
|
return { command: null, workspaceRoot, errors };
|
|
987
1521
|
}
|
|
988
1522
|
return {
|
|
989
1523
|
command: {
|
|
990
1524
|
kind: "doctor",
|
|
991
|
-
target: rest[0] === "windows"
|
|
1525
|
+
target: rest[0] === "windows"
|
|
1526
|
+
? "windows"
|
|
1527
|
+
: rest[0] === "agent"
|
|
1528
|
+
? "agent"
|
|
1529
|
+
: rest[0] === "delta"
|
|
1530
|
+
? "delta"
|
|
1531
|
+
: rest[0] === "pglite"
|
|
1532
|
+
? "pglite"
|
|
1533
|
+
: rest[0] === "runtime"
|
|
1534
|
+
? "runtime"
|
|
1535
|
+
: "project",
|
|
1536
|
+
agentTarget: rest[0] === "agent"
|
|
1537
|
+
? (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ?? (rest[1] as AgentAdapterTarget | undefined) ?? "codex"
|
|
1538
|
+
: undefined,
|
|
992
1539
|
json: parseFlag(argv, "--json"),
|
|
993
1540
|
workspaceRoot,
|
|
994
1541
|
},
|
|
@@ -1036,15 +1583,219 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1036
1583
|
case "auth": {
|
|
1037
1584
|
const subcommand = rest[0] as AuthSubcommand | undefined;
|
|
1038
1585
|
if (!subcommand || !AUTH_SUBCOMMANDS.includes(subcommand)) {
|
|
1039
|
-
errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, or
|
|
1586
|
+
errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, prove, or status");
|
|
1587
|
+
return { command: null, workspaceRoot, errors };
|
|
1588
|
+
}
|
|
1589
|
+
const providerValue = parseOptionValue(argv, "--provider");
|
|
1590
|
+
if (providerValue && providerValue !== "workos") {
|
|
1591
|
+
errors.push("forge auth --provider supports: workos");
|
|
1040
1592
|
return { command: null, workspaceRoot, errors };
|
|
1041
1593
|
}
|
|
1594
|
+
const provider = providerValue === "workos" ? "workos" : undefined;
|
|
1042
1595
|
return {
|
|
1043
1596
|
command: {
|
|
1044
1597
|
kind: "auth",
|
|
1045
1598
|
subcommand,
|
|
1046
1599
|
json: parseFlag(argv, "--json"),
|
|
1047
1600
|
token: parseOptionValue(argv, "--token"),
|
|
1601
|
+
prod: parseFlag(argv, "--prod") || parseFlag(argv, "--production"),
|
|
1602
|
+
scenario: parseOptionValue(argv, "--scenario"),
|
|
1603
|
+
provider,
|
|
1604
|
+
real: parseFlag(argv, "--real"),
|
|
1605
|
+
file: parseOptionValue(argv, "--file"),
|
|
1606
|
+
clientId: parseOptionValue(argv, "--client-id") ?? parseOptionValue(argv, "--workos-client-id"),
|
|
1607
|
+
workspaceRoot,
|
|
1608
|
+
},
|
|
1609
|
+
workspaceRoot,
|
|
1610
|
+
errors,
|
|
1611
|
+
};
|
|
1612
|
+
}
|
|
1613
|
+
case "authmd": {
|
|
1614
|
+
const subcommand = rest[0] as AuthMdSubcommand | undefined;
|
|
1615
|
+
if (!subcommand || !AUTHMD_SUBCOMMANDS.includes(subcommand)) {
|
|
1616
|
+
errors.push("forge authmd requires subcommand: generate or check");
|
|
1617
|
+
return { command: null, workspaceRoot, errors };
|
|
1618
|
+
}
|
|
1619
|
+
return {
|
|
1620
|
+
command: {
|
|
1621
|
+
kind: "authmd",
|
|
1622
|
+
subcommand,
|
|
1623
|
+
json: parseFlag(argv, "--json"),
|
|
1624
|
+
output: parseOptionValue(argv, "--output"),
|
|
1625
|
+
workspaceRoot,
|
|
1626
|
+
},
|
|
1627
|
+
workspaceRoot,
|
|
1628
|
+
errors,
|
|
1629
|
+
};
|
|
1630
|
+
}
|
|
1631
|
+
case "workos": {
|
|
1632
|
+
const subcommand = rest[0] as WorkOSSubcommand | undefined;
|
|
1633
|
+
if (!subcommand || !WORKOS_SUBCOMMANDS.includes(subcommand)) {
|
|
1634
|
+
errors.push("forge workos requires subcommand: install, doctor, seed, setup, prove, env, or fga");
|
|
1635
|
+
return { command: null, workspaceRoot, errors };
|
|
1636
|
+
}
|
|
1637
|
+
const fgaAction = subcommand === "fga" ? rest[1] as WorkOSFgaAction | undefined : undefined;
|
|
1638
|
+
if (subcommand === "fga" && (!fgaAction || !WORKOS_FGA_ACTIONS.includes(fgaAction))) {
|
|
1639
|
+
errors.push("forge workos fga requires action: plan, sync, prove, or doctor");
|
|
1640
|
+
return { command: null, workspaceRoot, errors };
|
|
1641
|
+
}
|
|
1642
|
+
const workOSWritePath = parseOptionalOptionValue(argv, "--write");
|
|
1643
|
+
return {
|
|
1644
|
+
command: {
|
|
1645
|
+
kind: "workos",
|
|
1646
|
+
subcommand,
|
|
1647
|
+
...(fgaAction ? { fgaAction } : {}),
|
|
1648
|
+
json: parseFlag(argv, "--json"),
|
|
1649
|
+
file: parseOptionValue(argv, "--file"),
|
|
1650
|
+
yes: parseFlag(argv, "--yes"),
|
|
1651
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1652
|
+
real: parseFlag(argv, "--real"),
|
|
1653
|
+
write: parseFlag(argv, "--write"),
|
|
1654
|
+
...(workOSWritePath ? { writePath: workOSWritePath } : {}),
|
|
1655
|
+
clientId: parseOptionValue(argv, "--client-id") ?? parseOptionValue(argv, "--workos-client-id"),
|
|
1656
|
+
workspaceRoot,
|
|
1657
|
+
},
|
|
1658
|
+
workspaceRoot,
|
|
1659
|
+
errors,
|
|
1660
|
+
};
|
|
1661
|
+
}
|
|
1662
|
+
case "deploy": {
|
|
1663
|
+
const subcommand = rest[0] as DeploySubcommand | undefined;
|
|
1664
|
+
if (!subcommand || !DEPLOY_SUBCOMMANDS.includes(subcommand)) {
|
|
1665
|
+
errors.push("forge deploy requires subcommand: plan, init, check, readiness, render, package, or verify");
|
|
1666
|
+
return { command: null, workspaceRoot, errors };
|
|
1667
|
+
}
|
|
1668
|
+
const targetRaw = parseOptionValue(argv, "--target") ?? (subcommand === "init" || subcommand === "render" || subcommand === "package" ? rest[1] : undefined) ?? "docker";
|
|
1669
|
+
if (targetRaw !== "docker" && targetRaw !== "forge-cloud") {
|
|
1670
|
+
errors.push("forge deploy --target must be docker or forge-cloud");
|
|
1671
|
+
}
|
|
1672
|
+
return {
|
|
1673
|
+
command: {
|
|
1674
|
+
kind: "deploy",
|
|
1675
|
+
subcommand,
|
|
1676
|
+
target: targetRaw as DeployTarget,
|
|
1677
|
+
production: parseFlag(argv, "--production") || parseFlag(argv, "--prod"),
|
|
1678
|
+
url: parseOptionValue(argv, "--url"),
|
|
1679
|
+
json: parseFlag(argv, "--json"),
|
|
1680
|
+
workspaceRoot,
|
|
1681
|
+
},
|
|
1682
|
+
workspaceRoot,
|
|
1683
|
+
errors,
|
|
1684
|
+
};
|
|
1685
|
+
}
|
|
1686
|
+
case "golden-path": {
|
|
1687
|
+
const maybeSubcommand = rest[0];
|
|
1688
|
+
if (maybeSubcommand && !maybeSubcommand.startsWith("--") && !GOLDEN_PATH_SUBCOMMANDS.includes(maybeSubcommand as GoldenPathSubcommand)) {
|
|
1689
|
+
errors.push("forge golden-path requires subcommand: plan or status");
|
|
1690
|
+
return { command: null, workspaceRoot, errors };
|
|
1691
|
+
}
|
|
1692
|
+
const subcommand = (maybeSubcommand && GOLDEN_PATH_SUBCOMMANDS.includes(maybeSubcommand as GoldenPathSubcommand)
|
|
1693
|
+
? maybeSubcommand
|
|
1694
|
+
: "plan") as GoldenPathSubcommand;
|
|
1695
|
+
const authRaw = parseOptionValue(argv, "--auth") ?? "workos";
|
|
1696
|
+
if (authRaw !== "none" && authRaw !== "workos") {
|
|
1697
|
+
errors.push("forge golden-path --auth must be none or workos");
|
|
1698
|
+
}
|
|
1699
|
+
const targetRaw = parseOptionValue(argv, "--target") ?? "docker";
|
|
1700
|
+
if (targetRaw !== "docker" && targetRaw !== "forge-cloud") {
|
|
1701
|
+
errors.push("forge golden-path --target must be docker or forge-cloud");
|
|
1702
|
+
}
|
|
1703
|
+
return {
|
|
1704
|
+
command: {
|
|
1705
|
+
kind: "golden-path",
|
|
1706
|
+
subcommand,
|
|
1707
|
+
name: parseOptionValue(argv, "--name") ?? "vendor-access",
|
|
1708
|
+
template: parseNewTemplate(parseOptionValue(argv, "--template") ?? "vendor-access"),
|
|
1709
|
+
packageManager: parseNewPackageManager(parseOptionValue(argv, "--package-manager") ?? "npm"),
|
|
1710
|
+
forgeSpec: parseOptionValue(argv, "--forge-spec"),
|
|
1711
|
+
auth: authRaw as "none" | "workos",
|
|
1712
|
+
target: targetRaw as DeployTarget,
|
|
1713
|
+
production: parseFlag(argv, "--production") || parseFlag(argv, "--prod") || subcommand === "status",
|
|
1714
|
+
real: parseFlag(argv, "--real"),
|
|
1715
|
+
clientId: parseOptionValue(argv, "--client-id") ?? parseOptionValue(argv, "--workos-client-id"),
|
|
1716
|
+
url: parseOptionValue(argv, "--url"),
|
|
1717
|
+
json: parseFlag(argv, "--json"),
|
|
1718
|
+
workspaceRoot,
|
|
1719
|
+
},
|
|
1720
|
+
workspaceRoot,
|
|
1721
|
+
errors,
|
|
1722
|
+
};
|
|
1723
|
+
}
|
|
1724
|
+
case "field-test": {
|
|
1725
|
+
const subcommand = rest[0] as FieldTestSubcommand | undefined;
|
|
1726
|
+
if (!subcommand || !FIELD_TEST_SUBCOMMANDS.includes(subcommand)) {
|
|
1727
|
+
errors.push("forge field-test requires subcommand: create, run, or report");
|
|
1728
|
+
return { command: null, workspaceRoot, errors };
|
|
1729
|
+
}
|
|
1730
|
+
const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
|
|
1731
|
+
const timeoutMs = timeoutRaw ? Number(timeoutRaw) : 180_000;
|
|
1732
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
1733
|
+
errors.push("--timeout-ms must be a positive integer");
|
|
1734
|
+
}
|
|
1735
|
+
const realistic = parseFlag(argv, "--realistic");
|
|
1736
|
+
const authRaw = parseOptionValue(argv, "--auth") ?? (realistic ? "workos" : "none");
|
|
1737
|
+
if (authRaw !== "none" && authRaw !== "workos") {
|
|
1738
|
+
errors.push("forge field-test --auth must be none or workos");
|
|
1739
|
+
}
|
|
1740
|
+
const templates = parseTemplateList(parseOptionValue(argv, "--templates"), errors, "--templates");
|
|
1741
|
+
const packageManagers = parsePackageManagerList(parseOptionValue(argv, "--package-managers"), errors, "--package-managers");
|
|
1742
|
+
return {
|
|
1743
|
+
command: {
|
|
1744
|
+
kind: "field-test",
|
|
1745
|
+
subcommand,
|
|
1746
|
+
name: subcommand === "create" ? rest[1] : undefined,
|
|
1747
|
+
template: parseNewTemplate(parseOptionValue(argv, "--template") ?? (realistic || authRaw === "workos" ? "vendor-access" : "minimal-web")),
|
|
1748
|
+
templates,
|
|
1749
|
+
packageManager: parseNewPackageManager(parseOptionValue(argv, "--package-manager") ?? "npm"),
|
|
1750
|
+
packageManagers,
|
|
1751
|
+
forgeSpec: parseOptionValue(argv, "--forge-spec"),
|
|
1752
|
+
auth: authRaw as "none" | "workos",
|
|
1753
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1754
|
+
keep: parseFlag(argv, "--keep"),
|
|
1755
|
+
runtimeProbes: parseFlag(argv, "--runtime-probes") || realistic,
|
|
1756
|
+
authProbes: parseFlag(argv, "--auth-probes") || realistic,
|
|
1757
|
+
uiProbes: parseFlag(argv, "--ui-probes") || realistic,
|
|
1758
|
+
realistic,
|
|
1759
|
+
timeoutMs: Math.floor(timeoutMs),
|
|
1760
|
+
writeReport: parseOptionValue(argv, "--write-report") ?? parseOptionValue(argv, "--file"),
|
|
1761
|
+
json: parseFlag(argv, "--json"),
|
|
1762
|
+
workspaceRoot,
|
|
1763
|
+
},
|
|
1764
|
+
workspaceRoot,
|
|
1765
|
+
errors,
|
|
1766
|
+
};
|
|
1767
|
+
}
|
|
1768
|
+
case "seed": {
|
|
1769
|
+
const subcommandRaw = (rest[0] ?? "status") as SeedSubcommand;
|
|
1770
|
+
if (!["status", "dev", "reset"].includes(subcommandRaw)) {
|
|
1771
|
+
errors.push("forge seed requires subcommand: status, dev, or reset");
|
|
1772
|
+
}
|
|
1773
|
+
const argsRaw = parseOptionValue(argv, "--args");
|
|
1774
|
+
let args: unknown = {};
|
|
1775
|
+
if (argsRaw !== undefined) {
|
|
1776
|
+
try {
|
|
1777
|
+
args = JSON.parse(argsRaw);
|
|
1778
|
+
} catch {
|
|
1779
|
+
errors.push("--args must be valid JSON");
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
const permissionsRaw = parseOptionValue(argv, "--permissions");
|
|
1783
|
+
return {
|
|
1784
|
+
command: {
|
|
1785
|
+
kind: "seed",
|
|
1786
|
+
subcommand: subcommandRaw,
|
|
1787
|
+
command: parseOptionValue(argv, "--command"),
|
|
1788
|
+
args,
|
|
1789
|
+
url: parseOptionValue(argv, "--url"),
|
|
1790
|
+
userId: parseOptionValue(argv, "--user-id"),
|
|
1791
|
+
tenantId: parseOptionValue(argv, "--tenant-id") ?? parseOptionValue(argv, "--tenant"),
|
|
1792
|
+
role: parseOptionValue(argv, "--role"),
|
|
1793
|
+
permissions: permissionsRaw
|
|
1794
|
+
?.split(",")
|
|
1795
|
+
.map((permission) => permission.trim())
|
|
1796
|
+
.filter(Boolean),
|
|
1797
|
+
allTenants: parseFlag(argv, "--all-tenants"),
|
|
1798
|
+
json: parseFlag(argv, "--json"),
|
|
1048
1799
|
workspaceRoot,
|
|
1049
1800
|
},
|
|
1050
1801
|
workspaceRoot,
|
|
@@ -1127,6 +1878,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1127
1878
|
json: parseFlag(argv, "--json"),
|
|
1128
1879
|
allowDirty: parseFlag(argv, "--allow-dirty"),
|
|
1129
1880
|
allowPublicSourcemaps: parseFlag(argv, "--allow-public-sourcemaps"),
|
|
1881
|
+
allowMissingLocalRelease: parseFlag(argv, "--allow-missing-local-release"),
|
|
1130
1882
|
workspaceRoot,
|
|
1131
1883
|
},
|
|
1132
1884
|
workspaceRoot,
|
|
@@ -1198,7 +1950,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1198
1950
|
event: parseOptionValue(argv, "--event"),
|
|
1199
1951
|
trigger: parseOptionValue(argv, "--trigger"),
|
|
1200
1952
|
component: parseOptionValue(argv, "--component"),
|
|
1201
|
-
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
|
|
1953
|
+
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
|
|
1202
1954
|
withAi: parseFlag(argv, "--with-ai"),
|
|
1203
1955
|
withCrud: parseFlag(argv, "--with-crud"),
|
|
1204
1956
|
withLiveQuery: parseFlag(argv, "--with-livequery"),
|
|
@@ -1372,7 +2124,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1372
2124
|
case "test": {
|
|
1373
2125
|
const subcommand = rest[0] as TestSubcommand | undefined;
|
|
1374
2126
|
if (!subcommand || !TEST_SUBCOMMANDS.includes(subcommand)) {
|
|
1375
|
-
errors.push("forge test requires subcommand: plan, run, or
|
|
2127
|
+
errors.push("forge test requires subcommand: plan, run, explain, or authz");
|
|
1376
2128
|
return { command: null, workspaceRoot, errors };
|
|
1377
2129
|
}
|
|
1378
2130
|
const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
|
|
@@ -1391,7 +2143,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1391
2143
|
workspaceRoot,
|
|
1392
2144
|
json: parseFlag(argv, "--json"),
|
|
1393
2145
|
write: parseFlag(argv, "--write"),
|
|
1394
|
-
changed: parseFlag(argv, "--changed") || (!parseFlag(argv, "--staged") && !parseOptionValue(argv, "--since") && !parseOptionValue(argv, "--feature") && !parseOptionValue(argv, "--refactor") && !parseOptionValue(argv, "--upgrade") && !parseOptionValue(argv, "--plan") && subcommand !== "explain"),
|
|
2146
|
+
changed: parseFlag(argv, "--changed") || (!parseFlag(argv, "--staged") && !parseOptionValue(argv, "--since") && !parseOptionValue(argv, "--feature") && !parseOptionValue(argv, "--refactor") && !parseOptionValue(argv, "--upgrade") && !parseOptionValue(argv, "--plan") && subcommand !== "explain" && subcommand !== "authz"),
|
|
1395
2147
|
staged: parseFlag(argv, "--staged"),
|
|
1396
2148
|
since: parseOptionValue(argv, "--since"),
|
|
1397
2149
|
featureId: parseOptionValue(argv, "--feature"),
|
|
@@ -1405,6 +2157,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1405
2157
|
bail: parseFlag(argv, "--bail"),
|
|
1406
2158
|
report: parseOptionValue(argv, "--report"),
|
|
1407
2159
|
timeoutMs: timeoutMs ? Math.floor(timeoutMs) : undefined,
|
|
2160
|
+
tenant: parseOptionValue(argv, "--tenant") ?? "acme",
|
|
2161
|
+
otherTenant: parseOptionValue(argv, "--other-tenant") ?? "globex",
|
|
1408
2162
|
},
|
|
1409
2163
|
},
|
|
1410
2164
|
workspaceRoot,
|
|
@@ -1477,6 +2231,212 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1477
2231
|
errors,
|
|
1478
2232
|
};
|
|
1479
2233
|
}
|
|
2234
|
+
case "bench": {
|
|
2235
|
+
const subcommand = rest[0] as BenchSubcommand | undefined;
|
|
2236
|
+
if (!subcommand || !BENCH_SUBCOMMANDS.includes(subcommand)) {
|
|
2237
|
+
errors.push("forge bench requires subcommand: compiler");
|
|
2238
|
+
return { command: null, workspaceRoot, errors };
|
|
2239
|
+
}
|
|
2240
|
+
const iterationsRaw = parseOptionValue(argv, "--iterations");
|
|
2241
|
+
const warmupsRaw = parseOptionValue(argv, "--warmups");
|
|
2242
|
+
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
2243
|
+
const iterations = iterationsRaw !== undefined ? Number(iterationsRaw) : 5;
|
|
2244
|
+
const warmups = warmupsRaw !== undefined ? Number(warmupsRaw) : 1;
|
|
2245
|
+
const concurrency = concurrencyRaw !== undefined ? Number(concurrencyRaw) : 4;
|
|
2246
|
+
if (!Number.isFinite(iterations) || iterations < 1) {
|
|
2247
|
+
errors.push("--iterations must be a number >= 1");
|
|
2248
|
+
}
|
|
2249
|
+
if (!Number.isFinite(warmups) || warmups < 0) {
|
|
2250
|
+
errors.push("--warmups must be a number >= 0");
|
|
2251
|
+
}
|
|
2252
|
+
if (!Number.isFinite(concurrency) || concurrency < 1) {
|
|
2253
|
+
errors.push("--concurrency must be a number >= 1");
|
|
2254
|
+
}
|
|
2255
|
+
return {
|
|
2256
|
+
command: {
|
|
2257
|
+
kind: "bench",
|
|
2258
|
+
options: {
|
|
2259
|
+
subcommand,
|
|
2260
|
+
workspaceRoot,
|
|
2261
|
+
json: parseFlag(argv, "--json"),
|
|
2262
|
+
iterations: Math.floor(iterations),
|
|
2263
|
+
warmups: Math.floor(warmups),
|
|
2264
|
+
concurrency: Math.floor(concurrency),
|
|
2265
|
+
},
|
|
2266
|
+
},
|
|
2267
|
+
workspaceRoot,
|
|
2268
|
+
errors,
|
|
2269
|
+
};
|
|
2270
|
+
}
|
|
2271
|
+
case "cair": {
|
|
2272
|
+
const subcommand = rest[0] as CairSubcommand | undefined;
|
|
2273
|
+
if (!subcommand || !CAIR_SUBCOMMANDS.includes(subcommand)) {
|
|
2274
|
+
errors.push("forge cair requires subcommand: snapshot, query, or action");
|
|
2275
|
+
return { command: null, workspaceRoot, errors };
|
|
2276
|
+
}
|
|
2277
|
+
const formatRaw = parseOptionValue(argv, "--format");
|
|
2278
|
+
if (formatRaw !== undefined && formatRaw !== "text" && formatRaw !== "json") {
|
|
2279
|
+
errors.push("--format must be text or json");
|
|
2280
|
+
}
|
|
2281
|
+
const cairValues = ["--root", "--project-id", "--manifest", "--cache-root", "--snapshot-id", "--format", "--input"];
|
|
2282
|
+
for (let i = 2; i < argv.length; i++) if (cairValues.includes(argv[i]!) && (!argv[i + 1] || argv[i + 1]!.startsWith("--"))) errors.push(`${argv[i]} requires a value`);
|
|
2283
|
+
const cairText = argv.slice(2).filter((part, index, parts) => !part.startsWith("--") && !cairValues.includes(parts[index - 1] ?? ""));
|
|
2284
|
+
const query = subcommand === "query" ? cairText.join(" ").trim() : undefined;
|
|
2285
|
+
if (subcommand === "query" && !query) {
|
|
2286
|
+
errors.push("forge cair query requires a CAIR query, for example: forge cair query \"Q STATUS\"");
|
|
2287
|
+
}
|
|
2288
|
+
const inputPath = parseOptionValue(argv, "--input");
|
|
2289
|
+
const action = subcommand === "action" ? cairText.join(" ").trim() : undefined;
|
|
2290
|
+
if (subcommand === "action" && !action && !inputPath) {
|
|
2291
|
+
errors.push("forge cair action requires a CAIR action, for example: forge cair action \"A CREATE.FILE path=src/example.ts\"");
|
|
2292
|
+
}
|
|
2293
|
+
return {
|
|
2294
|
+
command: {
|
|
2295
|
+
kind: "cair",
|
|
2296
|
+
options: {
|
|
2297
|
+
subcommand,
|
|
2298
|
+
workspaceRoot,
|
|
2299
|
+
json: parseFlag(argv, "--json"),
|
|
2300
|
+
format: formatRaw === "json" ? "json" : "text",
|
|
2301
|
+
...(query ? { query } : {}),
|
|
2302
|
+
...(action ? { action } : {}),
|
|
2303
|
+
...(inputPath ? { inputPath } : {}),
|
|
2304
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2305
|
+
plan: parseFlag(argv, "--plan"),
|
|
2306
|
+
allowGenerated: parseFlag(argv, "--include-generated"),
|
|
2307
|
+
snapshotId: parseOptionValue(argv, "--snapshot-id"),
|
|
2308
|
+
manifestPath: parseOptionValue(argv, "--manifest"),
|
|
2309
|
+
cacheRoot: parseOptionValue(argv, "--cache-root"),
|
|
2310
|
+
root: parseOptionValue(argv, "--root"),
|
|
2311
|
+
projectId: parseOptionValue(argv, "--project-id"),
|
|
2312
|
+
},
|
|
2313
|
+
},
|
|
2314
|
+
workspaceRoot,
|
|
2315
|
+
errors,
|
|
2316
|
+
};
|
|
2317
|
+
}
|
|
2318
|
+
case "status":
|
|
2319
|
+
return {
|
|
2320
|
+
command: {
|
|
2321
|
+
kind: "status",
|
|
2322
|
+
json: parseFlag(argv, "--json"),
|
|
2323
|
+
workspaceRoot,
|
|
2324
|
+
},
|
|
2325
|
+
workspaceRoot,
|
|
2326
|
+
errors,
|
|
2327
|
+
};
|
|
2328
|
+
case "changed":
|
|
2329
|
+
return {
|
|
2330
|
+
command: {
|
|
2331
|
+
kind: "changed",
|
|
2332
|
+
json: parseFlag(argv, "--json"),
|
|
2333
|
+
authoredOnly: parseFlag(argv, "--authored"),
|
|
2334
|
+
reviewOnly: parseFlag(argv, "--review"),
|
|
2335
|
+
commitReady: parseFlag(argv, "--commit-ready"),
|
|
2336
|
+
workspaceRoot,
|
|
2337
|
+
},
|
|
2338
|
+
workspaceRoot,
|
|
2339
|
+
errors,
|
|
2340
|
+
};
|
|
2341
|
+
case "diff": {
|
|
2342
|
+
const target = (rest[0] ?? "authored") as "authored" | "generated" | "full";
|
|
2343
|
+
if (!["authored", "generated", "full"].includes(target)) {
|
|
2344
|
+
errors.push("forge diff requires target: authored, generated, or full");
|
|
2345
|
+
return { command: null, workspaceRoot, errors };
|
|
2346
|
+
}
|
|
2347
|
+
return {
|
|
2348
|
+
command: {
|
|
2349
|
+
kind: "diff",
|
|
2350
|
+
target,
|
|
2351
|
+
json: parseFlag(argv, "--json"),
|
|
2352
|
+
workspaceRoot,
|
|
2353
|
+
},
|
|
2354
|
+
workspaceRoot,
|
|
2355
|
+
errors,
|
|
2356
|
+
};
|
|
2357
|
+
}
|
|
2358
|
+
case "handoff":
|
|
2359
|
+
return {
|
|
2360
|
+
command: {
|
|
2361
|
+
kind: "handoff",
|
|
2362
|
+
json: parseFlag(argv, "--json"),
|
|
2363
|
+
commitReady: parseFlag(argv, "--commit-ready"),
|
|
2364
|
+
workspaceRoot,
|
|
2365
|
+
},
|
|
2366
|
+
workspaceRoot,
|
|
2367
|
+
errors,
|
|
2368
|
+
};
|
|
2369
|
+
case "studio": {
|
|
2370
|
+
const subcommand = rest[0];
|
|
2371
|
+
if (
|
|
2372
|
+
subcommand !== "attach" &&
|
|
2373
|
+
subcommand !== "snapshot" &&
|
|
2374
|
+
subcommand !== "watch" &&
|
|
2375
|
+
subcommand !== "open" &&
|
|
2376
|
+
subcommand !== "doctor" &&
|
|
2377
|
+
subcommand !== "bridge" &&
|
|
2378
|
+
subcommand !== "codex-server"
|
|
2379
|
+
) {
|
|
2380
|
+
errors.push("forge studio requires subcommand: attach, snapshot, watch, open, doctor, bridge, or codex-server");
|
|
2381
|
+
return { command: null, workspaceRoot, errors };
|
|
2382
|
+
}
|
|
2383
|
+
const previewPortRaw = parseOptionValue(argv, "--preview-port");
|
|
2384
|
+
const previewPort = previewPortRaw !== undefined ? Number(previewPortRaw) : undefined;
|
|
2385
|
+
if (
|
|
2386
|
+
previewPortRaw !== undefined &&
|
|
2387
|
+
(!Number.isInteger(previewPort) || previewPort! < 1)
|
|
2388
|
+
) {
|
|
2389
|
+
errors.push("--preview-port must be an integer >= 1");
|
|
2390
|
+
}
|
|
2391
|
+
const intervalRaw = parseOptionValue(argv, "--interval-ms");
|
|
2392
|
+
const intervalMs = intervalRaw !== undefined ? Number(intervalRaw) : undefined;
|
|
2393
|
+
if (intervalRaw !== undefined && (!Number.isFinite(intervalMs) || intervalMs! < 1000)) {
|
|
2394
|
+
errors.push("--interval-ms must be a number >= 1000");
|
|
2395
|
+
}
|
|
2396
|
+
const targets = parseOptionValues(argv, "--target");
|
|
2397
|
+
const ignoredOptionValues = new Set(
|
|
2398
|
+
[
|
|
2399
|
+
...targets,
|
|
2400
|
+
parseOptionValue(argv, "--preview-url"),
|
|
2401
|
+
parseOptionValue(argv, "--studio-url"),
|
|
2402
|
+
parseOptionValue(argv, "--workspace-id"),
|
|
2403
|
+
parseOptionValue(argv, "--tenant-id"),
|
|
2404
|
+
parseOptionValue(argv, "--user-id"),
|
|
2405
|
+
parseOptionValue(argv, "--role"),
|
|
2406
|
+
previewPortRaw,
|
|
2407
|
+
intervalRaw,
|
|
2408
|
+
].filter((value): value is string => typeof value === "string"),
|
|
2409
|
+
);
|
|
2410
|
+
const studioPath = rest.slice(1).find((item) => !ignoredOptionValues.has(item));
|
|
2411
|
+
return {
|
|
2412
|
+
command: {
|
|
2413
|
+
kind: "studio",
|
|
2414
|
+
subcommand,
|
|
2415
|
+
path: studioPath,
|
|
2416
|
+
previewUrl: parseOptionValue(argv, "--preview-url"),
|
|
2417
|
+
previewPort: previewPort ? Math.floor(previewPort) : undefined,
|
|
2418
|
+
studioUrl: parseOptionValue(argv, "--studio-url"),
|
|
2419
|
+
intervalMs: intervalMs ? Math.floor(intervalMs) : undefined,
|
|
2420
|
+
once: parseFlag(argv, "--once"),
|
|
2421
|
+
workspaceId: parseOptionValue(argv, "--workspace-id"),
|
|
2422
|
+
tenantId: parseOptionValue(argv, "--tenant-id"),
|
|
2423
|
+
userId: parseOptionValue(argv, "--user-id"),
|
|
2424
|
+
role: parseOptionValue(argv, "--role"),
|
|
2425
|
+
targets: targets.length > 0 ? targets : ["codex"],
|
|
2426
|
+
install: parseFlag(argv, "--install"),
|
|
2427
|
+
start: !parseFlag(argv, "--no-start"),
|
|
2428
|
+
bridge: !parseFlag(argv, "--no-bridge"),
|
|
2429
|
+
writeSchemas: parseFlag(argv, "--write"),
|
|
2430
|
+
probeAppServer: parseFlag(argv, "--probe") || parseFlag(argv, "--probe-codex-server"),
|
|
2431
|
+
json: parseFlag(argv, "--json"),
|
|
2432
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2433
|
+
force: parseFlag(argv, "--force"),
|
|
2434
|
+
workspaceRoot,
|
|
2435
|
+
},
|
|
2436
|
+
workspaceRoot,
|
|
2437
|
+
errors,
|
|
2438
|
+
};
|
|
2439
|
+
}
|
|
1480
2440
|
case "generate": {
|
|
1481
2441
|
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
1482
2442
|
const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
|
|
@@ -1490,30 +2450,189 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1490
2450
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
1491
2451
|
json: parseFlag(argv, "--json"),
|
|
1492
2452
|
concurrency: Math.max(1, Math.floor(concurrency || 4)),
|
|
2453
|
+
workspaceRoot,
|
|
2454
|
+
},
|
|
2455
|
+
workspaceRoot,
|
|
2456
|
+
errors,
|
|
2457
|
+
};
|
|
2458
|
+
}
|
|
2459
|
+
case "delta": {
|
|
2460
|
+
const subcommand = rest[0];
|
|
2461
|
+
if (subcommand !== "status" && subcommand !== "repair" && subcommand !== "compact" && subcommand !== "prune" && subcommand !== "export") {
|
|
2462
|
+
errors.push("forge delta requires subcommand: status, repair, compact, prune, or export");
|
|
2463
|
+
return { command: null, workspaceRoot, errors };
|
|
2464
|
+
}
|
|
2465
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2466
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2467
|
+
return {
|
|
2468
|
+
command: {
|
|
2469
|
+
kind: "delta",
|
|
2470
|
+
subcommand,
|
|
2471
|
+
json: parseFlag(argv, "--json"),
|
|
2472
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2473
|
+
yes: parseFlag(argv, "--yes"),
|
|
2474
|
+
verbose: parseFlag(argv, "--verbose"),
|
|
2475
|
+
olderThan: parseOptionValue(argv, "--older-than"),
|
|
2476
|
+
output: parseOptionValue(argv, "--output"),
|
|
2477
|
+
limit: Number.isFinite(limit) ? limit : undefined,
|
|
2478
|
+
redacted: parseFlag(argv, "--redacted"),
|
|
2479
|
+
workspaceRoot,
|
|
2480
|
+
},
|
|
2481
|
+
workspaceRoot,
|
|
2482
|
+
errors,
|
|
2483
|
+
};
|
|
2484
|
+
}
|
|
2485
|
+
case "session": {
|
|
2486
|
+
const subcommand = rest[0];
|
|
2487
|
+
if (subcommand !== "list" && subcommand !== "show" && subcommand !== "rename" && subcommand !== "merge" && subcommand !== "split" && subcommand !== "detach") {
|
|
2488
|
+
errors.push("forge session requires subcommand: list, show, rename, merge, split, or detach");
|
|
2489
|
+
return { command: null, workspaceRoot, errors };
|
|
2490
|
+
}
|
|
2491
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2492
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2493
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
2494
|
+
errors.push("--limit must be a number >= 1");
|
|
2495
|
+
}
|
|
2496
|
+
const sessionId = rest[1];
|
|
2497
|
+
return {
|
|
2498
|
+
command: {
|
|
2499
|
+
kind: "session",
|
|
2500
|
+
subcommand,
|
|
2501
|
+
sessionId: subcommand === "detach" ? undefined : sessionId,
|
|
2502
|
+
sourceSessionId: subcommand === "merge" ? rest[2] : undefined,
|
|
2503
|
+
operationId: subcommand === "split" ? rest[2] : subcommand === "detach" ? rest[1] : undefined,
|
|
2504
|
+
title: subcommand === "rename" ? rest.slice(2).join(" ") : undefined,
|
|
2505
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
2506
|
+
json: parseFlag(argv, "--json"),
|
|
2507
|
+
workspaceRoot,
|
|
2508
|
+
},
|
|
2509
|
+
workspaceRoot,
|
|
2510
|
+
errors,
|
|
2511
|
+
};
|
|
2512
|
+
}
|
|
2513
|
+
case "timeline": {
|
|
2514
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2515
|
+
const kindFilter = parseOptionValue(argv, "--kind");
|
|
2516
|
+
const sessionId = parseOptionValue(argv, "--session");
|
|
2517
|
+
const rebuild = rest[0] === "rebuild";
|
|
2518
|
+
const optionValues = new Set([limitRaw, kindFilter, sessionId].filter((value): value is string => typeof value === "string"));
|
|
2519
|
+
const target = rebuild
|
|
2520
|
+
? undefined
|
|
2521
|
+
: rest.find((item) => !item.startsWith("--") && !optionValues.has(item));
|
|
2522
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2523
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
2524
|
+
errors.push("--limit must be a number >= 1");
|
|
2525
|
+
}
|
|
2526
|
+
return {
|
|
2527
|
+
command: {
|
|
2528
|
+
kind: "timeline",
|
|
2529
|
+
target,
|
|
2530
|
+
kindFilter,
|
|
2531
|
+
sessionId,
|
|
2532
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
2533
|
+
json: parseFlag(argv, "--json"),
|
|
2534
|
+
rebuild,
|
|
2535
|
+
forAgent: parseFlag(argv, "--for-agent"),
|
|
2536
|
+
causal: parseFlag(argv, "--causal"),
|
|
2537
|
+
staleProofs: parseFlag(argv, "--stale-proofs"),
|
|
2538
|
+
workspaceRoot,
|
|
2539
|
+
},
|
|
2540
|
+
workspaceRoot,
|
|
2541
|
+
errors,
|
|
2542
|
+
};
|
|
2543
|
+
}
|
|
2544
|
+
case "explain": {
|
|
2545
|
+
const thing = rest[0] === "session" ? `session:${rest[1] ?? "current"}` : rest[0];
|
|
2546
|
+
if (!thing) {
|
|
2547
|
+
errors.push("forge explain requires a target");
|
|
2548
|
+
return { command: null, workspaceRoot, errors };
|
|
2549
|
+
}
|
|
2550
|
+
return {
|
|
2551
|
+
command: {
|
|
2552
|
+
kind: "explain",
|
|
2553
|
+
thing,
|
|
2554
|
+
json: parseFlag(argv, "--json"),
|
|
2555
|
+
workspaceRoot,
|
|
2556
|
+
},
|
|
2557
|
+
workspaceRoot,
|
|
2558
|
+
errors,
|
|
2559
|
+
};
|
|
2560
|
+
}
|
|
2561
|
+
case "manifest": {
|
|
2562
|
+
const subcommand = rest[0];
|
|
2563
|
+
const path = rest[1];
|
|
2564
|
+
if (subcommand !== "validate" && subcommand !== "import") {
|
|
2565
|
+
errors.push("forge manifest requires subcommand validate or import");
|
|
2566
|
+
return { command: null, workspaceRoot, errors };
|
|
2567
|
+
}
|
|
2568
|
+
if (!path) {
|
|
2569
|
+
errors.push(`forge manifest ${subcommand} requires a manifest file path`);
|
|
2570
|
+
return { command: null, workspaceRoot, errors };
|
|
2571
|
+
}
|
|
2572
|
+
return {
|
|
2573
|
+
command: {
|
|
2574
|
+
kind: "manifest",
|
|
2575
|
+
subcommand,
|
|
2576
|
+
path,
|
|
2577
|
+
json: parseFlag(argv, "--json"),
|
|
2578
|
+
workspaceRoot,
|
|
2579
|
+
},
|
|
2580
|
+
workspaceRoot,
|
|
2581
|
+
errors,
|
|
2582
|
+
};
|
|
2583
|
+
}
|
|
2584
|
+
case "import": {
|
|
2585
|
+
const subcommand = rest[0];
|
|
2586
|
+
if (subcommand !== "analyze" && subcommand !== "inspect") {
|
|
2587
|
+
errors.push("forge import requires subcommand analyze or inspect");
|
|
2588
|
+
return { command: null, workspaceRoot, errors };
|
|
2589
|
+
}
|
|
2590
|
+
return {
|
|
2591
|
+
command: {
|
|
2592
|
+
kind: "import",
|
|
2593
|
+
options: {
|
|
2594
|
+
subcommand,
|
|
2595
|
+
json: parseFlag(argv, "--json"),
|
|
2596
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2597
|
+
workspaceRoot,
|
|
2598
|
+
entry: parseOptionValue(argv, "--entry"),
|
|
2599
|
+
target: parseOptionValue(argv, "--target"),
|
|
2600
|
+
},
|
|
1493
2601
|
},
|
|
1494
2602
|
workspaceRoot,
|
|
1495
2603
|
errors,
|
|
1496
2604
|
};
|
|
1497
2605
|
}
|
|
1498
2606
|
case "add": {
|
|
1499
|
-
const
|
|
2607
|
+
const subcommand = rest[0];
|
|
2608
|
+
const explicitMode =
|
|
2609
|
+
subcommand === "package"
|
|
2610
|
+
? "package"
|
|
2611
|
+
: subcommand === "integration" || subcommand === "auth"
|
|
2612
|
+
? "integration"
|
|
2613
|
+
: "auto";
|
|
2614
|
+
const alias = explicitMode === "auto" ? rest[0] : rest[1];
|
|
1500
2615
|
if (!alias) {
|
|
1501
|
-
errors.push(
|
|
2616
|
+
errors.push(
|
|
2617
|
+
explicitMode === "auto"
|
|
2618
|
+
? "forge add requires a package name or integration alias"
|
|
2619
|
+
: `forge add ${subcommand} requires a target`,
|
|
2620
|
+
);
|
|
1502
2621
|
return { command: null, workspaceRoot, errors };
|
|
1503
2622
|
}
|
|
1504
2623
|
return {
|
|
1505
2624
|
command: {
|
|
1506
2625
|
kind: "add",
|
|
1507
2626
|
alias,
|
|
1508
|
-
options: parseAddOptions(argv, workspaceRoot),
|
|
2627
|
+
options: parseAddOptions(argv, workspaceRoot, explicitMode),
|
|
1509
2628
|
},
|
|
1510
2629
|
workspaceRoot,
|
|
1511
2630
|
errors,
|
|
1512
2631
|
};
|
|
1513
2632
|
}
|
|
1514
2633
|
case "inspect": {
|
|
1515
|
-
const target = rest[0] as InspectTarget | undefined;
|
|
1516
|
-
if (!
|
|
2634
|
+
const target = (rest[0] as InspectTarget | undefined) ?? "summary";
|
|
2635
|
+
if (!INSPECT_TARGETS.includes(target)) {
|
|
1517
2636
|
errors.push(
|
|
1518
2637
|
`unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
|
|
1519
2638
|
);
|
|
@@ -1525,6 +2644,10 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1525
2644
|
target,
|
|
1526
2645
|
json: parseFlag(argv, "--json"),
|
|
1527
2646
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
2647
|
+
full: parseFlag(argv, "--full"),
|
|
2648
|
+
brief: parseFlag(argv, "--brief"),
|
|
2649
|
+
ergonomics: parseFlag(argv, "--ergonomics"),
|
|
2650
|
+
workspaceRoot,
|
|
1528
2651
|
},
|
|
1529
2652
|
workspaceRoot,
|
|
1530
2653
|
errors,
|
|
@@ -1545,12 +2668,58 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1545
2668
|
{
|
|
1546
2669
|
const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
|
|
1547
2670
|
const scriptTimeoutMs = scriptTimeoutRaw ? Number(scriptTimeoutRaw) : undefined;
|
|
2671
|
+
const testJobsRaw = parseOptionValue(argv, "--test-jobs");
|
|
2672
|
+
const testJobs = testJobsRaw ? Number(testJobsRaw) : undefined;
|
|
2673
|
+
const typechecker = parseOptionValue(argv, "--typechecker");
|
|
2674
|
+
const verifyOptionValues = new Set(
|
|
2675
|
+
[scriptTimeoutRaw, testJobsRaw, typechecker]
|
|
2676
|
+
.filter((value): value is string => typeof value === "string"),
|
|
2677
|
+
);
|
|
2678
|
+
const profileAlias = rest.find((item) => !verifyOptionValues.has(item));
|
|
2679
|
+
const verifyProfiles = new Set([
|
|
2680
|
+
"quick",
|
|
2681
|
+
"smoke",
|
|
2682
|
+
"agent",
|
|
2683
|
+
"standard",
|
|
2684
|
+
"release",
|
|
2685
|
+
"strict",
|
|
2686
|
+
"changed",
|
|
2687
|
+
"framework",
|
|
2688
|
+
"internal",
|
|
2689
|
+
"maintainer",
|
|
2690
|
+
]);
|
|
2691
|
+
if (profileAlias && !verifyProfiles.has(profileAlias)) {
|
|
2692
|
+
errors.push(
|
|
2693
|
+
`unknown forge verify profile '${profileAlias}'; expected quick, smoke, agent, standard, release, strict, changed, framework, internal, or maintainer`,
|
|
2694
|
+
);
|
|
2695
|
+
}
|
|
2696
|
+
const internal =
|
|
2697
|
+
parseFlag(argv, "--internal") ||
|
|
2698
|
+
profileAlias === "framework" ||
|
|
2699
|
+
profileAlias === "internal" ||
|
|
2700
|
+
profileAlias === "maintainer";
|
|
1548
2701
|
if (
|
|
1549
2702
|
scriptTimeoutRaw !== undefined &&
|
|
1550
2703
|
(!Number.isFinite(scriptTimeoutMs) || scriptTimeoutMs! < 1)
|
|
1551
2704
|
) {
|
|
1552
2705
|
errors.push("--script-timeout-ms must be a number >= 1");
|
|
1553
2706
|
}
|
|
2707
|
+
if (
|
|
2708
|
+
testJobsRaw !== undefined &&
|
|
2709
|
+
(!Number.isInteger(testJobs) || testJobs! < 1)
|
|
2710
|
+
) {
|
|
2711
|
+
errors.push("--test-jobs must be an integer >= 1");
|
|
2712
|
+
}
|
|
2713
|
+
if (
|
|
2714
|
+
typechecker !== undefined &&
|
|
2715
|
+
typechecker !== "tsc" &&
|
|
2716
|
+
typechecker !== "native" &&
|
|
2717
|
+
typechecker !== "ts7" &&
|
|
2718
|
+
typechecker !== "tsgo" &&
|
|
2719
|
+
typechecker !== "auto"
|
|
2720
|
+
) {
|
|
2721
|
+
errors.push("--typechecker must be one of: tsc, native, ts7, tsgo, auto");
|
|
2722
|
+
}
|
|
1554
2723
|
return {
|
|
1555
2724
|
command: {
|
|
1556
2725
|
kind: "verify",
|
|
@@ -1560,12 +2729,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1560
2729
|
skipTests: parseFlag(argv, "--skip-tests"),
|
|
1561
2730
|
skipTypecheck: parseFlag(argv, "--skip-typecheck"),
|
|
1562
2731
|
skipEslint: parseFlag(argv, "--skip-eslint"),
|
|
1563
|
-
strict: parseFlag(argv, "--strict"),
|
|
1564
|
-
changed: parseFlag(argv, "--changed"),
|
|
1565
|
-
fast: parseFlag(argv, "--fast"),
|
|
1566
|
-
smoke: parseFlag(argv, "--smoke"),
|
|
1567
|
-
standard: parseFlag(argv, "--standard"),
|
|
2732
|
+
strict: internal || parseFlag(argv, "--strict") || profileAlias === "release" || profileAlias === "strict",
|
|
2733
|
+
changed: parseFlag(argv, "--changed") || profileAlias === "changed",
|
|
2734
|
+
fast: parseFlag(argv, "--fast") || profileAlias === "quick",
|
|
2735
|
+
smoke: parseFlag(argv, "--smoke") || profileAlias === "smoke",
|
|
2736
|
+
standard: parseFlag(argv, "--standard") || profileAlias === "agent" || profileAlias === "standard",
|
|
1568
2737
|
scriptTimeoutMs: scriptTimeoutMs ? Math.floor(scriptTimeoutMs) : undefined,
|
|
2738
|
+
testJobs: testJobs ? Math.floor(testJobs) : undefined,
|
|
2739
|
+
typechecker: typechecker as "tsc" | "native" | "ts7" | "tsgo" | "auto" | undefined,
|
|
2740
|
+
fullTests: parseFlag(argv, "--full"),
|
|
2741
|
+
testPlan: parseFlag(argv, "--test-plan"),
|
|
2742
|
+
internal,
|
|
1569
2743
|
},
|
|
1570
2744
|
},
|
|
1571
2745
|
workspaceRoot,
|
|
@@ -1609,6 +2783,15 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1609
2783
|
|
|
1610
2784
|
const name = rest[0];
|
|
1611
2785
|
const list = parseFlag(argv, "--list") || !name;
|
|
2786
|
+
const argsRaw = parseOptionValue(argv, "--args");
|
|
2787
|
+
let args: unknown = {};
|
|
2788
|
+
if (argsRaw !== undefined) {
|
|
2789
|
+
try {
|
|
2790
|
+
args = JSON.parse(argsRaw);
|
|
2791
|
+
} catch {
|
|
2792
|
+
errors.push("--args must be valid JSON");
|
|
2793
|
+
}
|
|
2794
|
+
}
|
|
1612
2795
|
return {
|
|
1613
2796
|
command: {
|
|
1614
2797
|
kind: "run",
|
|
@@ -1621,19 +2804,30 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1621
2804
|
role: parseOptionValue(argv, "--role"),
|
|
1622
2805
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
1623
2806
|
workspaceRoot,
|
|
2807
|
+
args,
|
|
1624
2808
|
},
|
|
1625
2809
|
workspaceRoot,
|
|
1626
2810
|
errors,
|
|
1627
2811
|
};
|
|
1628
2812
|
}
|
|
1629
2813
|
case "query": {
|
|
1630
|
-
const
|
|
2814
|
+
const requested = rest[0] as QuerySubcommand | undefined;
|
|
2815
|
+
const subcommand =
|
|
2816
|
+
!requested
|
|
2817
|
+
? "list"
|
|
2818
|
+
: ["list", "run"].includes(requested)
|
|
2819
|
+
? requested
|
|
2820
|
+
: "run";
|
|
1631
2821
|
if (!["list", "run"].includes(subcommand)) {
|
|
1632
2822
|
errors.push("forge query requires subcommand: list or run");
|
|
1633
2823
|
return { command: null, workspaceRoot, errors };
|
|
1634
2824
|
}
|
|
1635
2825
|
|
|
1636
|
-
const queryName = subcommand === "run"
|
|
2826
|
+
const queryName = subcommand === "run"
|
|
2827
|
+
? requested === "run"
|
|
2828
|
+
? rest[1]
|
|
2829
|
+
: rest[0]
|
|
2830
|
+
: undefined;
|
|
1637
2831
|
if (subcommand === "run" && !queryName) {
|
|
1638
2832
|
errors.push("forge query run requires a query name");
|
|
1639
2833
|
}
|
|
@@ -1706,6 +2900,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1706
2900
|
};
|
|
1707
2901
|
}
|
|
1708
2902
|
case "dev": {
|
|
2903
|
+
const lifecycle = rest[0] === "status" || rest[0] === "stop" ? rest[0] : undefined;
|
|
1709
2904
|
const portRaw = parseOptionValue(argv, "--port");
|
|
1710
2905
|
const port = portRaw !== undefined ? Number(portRaw) : undefined;
|
|
1711
2906
|
if (portRaw !== undefined && (!Number.isFinite(port) || port! < 0)) {
|
|
@@ -1713,12 +2908,22 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1713
2908
|
}
|
|
1714
2909
|
const webPortRaw = parseOptionValue(argv, "--web-port");
|
|
1715
2910
|
const webPort = webPortRaw !== undefined ? Number(webPortRaw) : undefined;
|
|
1716
|
-
if (webPortRaw !== undefined && (!Number.isFinite(webPort) || webPort! <
|
|
1717
|
-
errors.push("--web-port must be a
|
|
2911
|
+
if (webPortRaw !== undefined && (!Number.isFinite(webPort) || webPort! < 0)) {
|
|
2912
|
+
errors.push("--web-port must be a non-negative integer");
|
|
1718
2913
|
}
|
|
1719
2914
|
const aiMode = parseOptionValue(argv, "--ai");
|
|
1720
2915
|
const mockAi =
|
|
1721
2916
|
parseFlag(argv, "--mock-ai") || aiMode === "mock" || process.env.FORGE_MOCK_AI === "1";
|
|
2917
|
+
const seed = parseFlag(argv, "--seed");
|
|
2918
|
+
if (seed && parseFlag(argv, "--once")) {
|
|
2919
|
+
errors.push("forge dev --seed cannot be combined with --once; use forge dev --seed or forge seed dev");
|
|
2920
|
+
}
|
|
2921
|
+
if (seed && parseFlag(argv, "--web-only")) {
|
|
2922
|
+
errors.push("forge dev --seed cannot be combined with --web-only because seeding requires the API runtime");
|
|
2923
|
+
}
|
|
2924
|
+
if (parseFlag(argv, "--all-tenants") && !seed) {
|
|
2925
|
+
errors.push("forge dev --all-tenants requires --seed; use forge dev --seed --all-tenants");
|
|
2926
|
+
}
|
|
1722
2927
|
return {
|
|
1723
2928
|
command: {
|
|
1724
2929
|
kind: "dev",
|
|
@@ -1737,11 +2942,18 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1737
2942
|
webOnly: parseFlag(argv, "--web-only"),
|
|
1738
2943
|
open: parseFlag(argv, "--open"),
|
|
1739
2944
|
webPort,
|
|
2945
|
+
publicApiUrl: parseOptionValue(argv, "--public-api-url"),
|
|
1740
2946
|
telemetry: (parseOptionValue(argv, "--telemetry") ?? "local")
|
|
1741
2947
|
.split(",")
|
|
1742
2948
|
.map((value) => value.trim())
|
|
1743
2949
|
.filter(Boolean),
|
|
1744
2950
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
2951
|
+
skipStartupConsole: parseFlag(argv, "--skip-startup-console"),
|
|
2952
|
+
detach: parseFlag(argv, "--detach"),
|
|
2953
|
+
seed,
|
|
2954
|
+
seedCommand: parseOptionValue(argv, "--seed-command"),
|
|
2955
|
+
seedAllTenants: parseFlag(argv, "--all-tenants"),
|
|
2956
|
+
lifecycle,
|
|
1745
2957
|
workspaceRoot,
|
|
1746
2958
|
},
|
|
1747
2959
|
workspaceRoot,
|
|
@@ -1750,16 +2962,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1750
2962
|
}
|
|
1751
2963
|
case "db": {
|
|
1752
2964
|
const subcommand = rest[0] as DbSubcommand | undefined;
|
|
1753
|
-
if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
|
|
1754
|
-
errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
|
|
2965
|
+
if (!subcommand || !["diff", "migrate", "reset", "status", "doctor", "repair", "rls-check"].includes(subcommand)) {
|
|
2966
|
+
errors.push("forge db requires subcommand: diff, migrate, reset, status, doctor, repair, or rls-check");
|
|
1755
2967
|
return { command: null, workspaceRoot, errors };
|
|
1756
2968
|
}
|
|
1757
2969
|
return {
|
|
1758
2970
|
command: {
|
|
1759
2971
|
kind: "db",
|
|
1760
2972
|
subcommand,
|
|
1761
|
-
db: parseAdapterKind(parseOptionValue(argv, "--db")),
|
|
2973
|
+
db: parseAdapterKind(parseOptionValue(argv, "--adapter") ?? parseOptionValue(argv, "--db")),
|
|
1762
2974
|
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
2975
|
+
local: parseFlag(argv, "--local"),
|
|
1763
2976
|
json: parseFlag(argv, "--json"),
|
|
1764
2977
|
workspaceRoot,
|
|
1765
2978
|
},
|
|
@@ -1972,10 +3185,14 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1972
3185
|
}
|
|
1973
3186
|
case "env": {
|
|
1974
3187
|
const subcommand = rest[0] as EnvSubcommand | undefined;
|
|
1975
|
-
if (!subcommand || !["list", "check", "print"].includes(subcommand)) {
|
|
1976
|
-
errors.push("forge env requires subcommand: list, check, or
|
|
3188
|
+
if (!subcommand || !["list", "check", "print", "doctor"].includes(subcommand)) {
|
|
3189
|
+
errors.push("forge env requires subcommand: list, check, print, or doctor");
|
|
1977
3190
|
return { command: null, workspaceRoot, errors };
|
|
1978
3191
|
}
|
|
3192
|
+
const targetRaw = parseOptionValue(argv, "--target") ?? "local";
|
|
3193
|
+
if (!["local", "staging", "production"].includes(targetRaw)) {
|
|
3194
|
+
errors.push("forge env --target must be local, staging, or production");
|
|
3195
|
+
}
|
|
1979
3196
|
|
|
1980
3197
|
return {
|
|
1981
3198
|
command: {
|
|
@@ -1983,6 +3200,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1983
3200
|
subcommand,
|
|
1984
3201
|
json: parseFlag(argv, "--json"),
|
|
1985
3202
|
redacted: parseFlag(argv, "--redacted"),
|
|
3203
|
+
target: targetRaw as "local" | "staging" | "production",
|
|
1986
3204
|
workspaceRoot,
|
|
1987
3205
|
},
|
|
1988
3206
|
workspaceRoot,
|
|
@@ -2031,9 +3249,21 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
2031
3249
|
|
|
2032
3250
|
export function hasUnknownOption(argv: string[]): string | null {
|
|
2033
3251
|
const known = new Set([
|
|
3252
|
+
"--cases",
|
|
3253
|
+
"--model-config", "--repetitions", "--observations", "--grace-hours", "--environment-id", "--observation-id", "--execute",
|
|
3254
|
+
"--root",
|
|
3255
|
+
"--cache-root",
|
|
3256
|
+
"--snapshot-id",
|
|
3257
|
+
"--max-chars",
|
|
3258
|
+
"--cursor",
|
|
3259
|
+
"--query",
|
|
2034
3260
|
"--version",
|
|
2035
3261
|
"--check",
|
|
2036
3262
|
"--json",
|
|
3263
|
+
"--human",
|
|
3264
|
+
"--for-agent",
|
|
3265
|
+
"--causal",
|
|
3266
|
+
"--stale-proofs",
|
|
2037
3267
|
"--dry-run",
|
|
2038
3268
|
"--plan",
|
|
2039
3269
|
"--staged",
|
|
@@ -2064,15 +3294,26 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2064
3294
|
"--smoke",
|
|
2065
3295
|
"--standard",
|
|
2066
3296
|
"--script-timeout-ms",
|
|
3297
|
+
"--test-plan",
|
|
3298
|
+
"--typechecker",
|
|
2067
3299
|
"--timeout-ms",
|
|
2068
3300
|
"--apply",
|
|
2069
3301
|
"--runtime-inspect",
|
|
2070
3302
|
"--allow-scripts",
|
|
3303
|
+
"--frontend",
|
|
3304
|
+
"--backend",
|
|
2071
3305
|
"--yes",
|
|
2072
3306
|
"--force",
|
|
2073
3307
|
"--no-generate",
|
|
2074
3308
|
"--no-verify",
|
|
2075
3309
|
"--keep-failed",
|
|
3310
|
+
"--keep",
|
|
3311
|
+
"--runtime-probes",
|
|
3312
|
+
"--auth-probes",
|
|
3313
|
+
"--ui-probes",
|
|
3314
|
+
"--realistic",
|
|
3315
|
+
"--real",
|
|
3316
|
+
"--write-report",
|
|
2076
3317
|
"--tenant-scoped",
|
|
2077
3318
|
"--field",
|
|
2078
3319
|
"--fields",
|
|
@@ -2085,8 +3326,14 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2085
3326
|
"--policy",
|
|
2086
3327
|
"--emit",
|
|
2087
3328
|
"--event",
|
|
3329
|
+
"--entry",
|
|
3330
|
+
"--change",
|
|
3331
|
+
"--proof",
|
|
3332
|
+
"--handoff",
|
|
3333
|
+
"--current",
|
|
2088
3334
|
"--trigger",
|
|
2089
3335
|
"--component",
|
|
3336
|
+
"--command",
|
|
2090
3337
|
"--framework",
|
|
2091
3338
|
"--package",
|
|
2092
3339
|
"--action",
|
|
@@ -2095,6 +3342,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2095
3342
|
"--with-livequery",
|
|
2096
3343
|
"--with-react",
|
|
2097
3344
|
"--with-ui",
|
|
3345
|
+
"--with-fga",
|
|
2098
3346
|
"--with-tests",
|
|
2099
3347
|
"--with-create-form",
|
|
2100
3348
|
"--write",
|
|
@@ -2112,6 +3360,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2112
3360
|
"--video",
|
|
2113
3361
|
"--base-url",
|
|
2114
3362
|
"--runtime-url",
|
|
3363
|
+
"--workspace",
|
|
2115
3364
|
"--reuse-servers",
|
|
2116
3365
|
"--start-servers",
|
|
2117
3366
|
"--scenario",
|
|
@@ -2120,10 +3369,13 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2120
3369
|
"--timeout",
|
|
2121
3370
|
"--name",
|
|
2122
3371
|
"--auth-token",
|
|
3372
|
+
"--auth",
|
|
2123
3373
|
"--update",
|
|
2124
3374
|
"--allow-high-risk",
|
|
2125
3375
|
"--to",
|
|
2126
3376
|
"--changed",
|
|
3377
|
+
"--authored",
|
|
3378
|
+
"--review",
|
|
2127
3379
|
"--env",
|
|
2128
3380
|
"--input",
|
|
2129
3381
|
"--provider",
|
|
@@ -2131,10 +3383,17 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2131
3383
|
"--release",
|
|
2132
3384
|
"--allow-dirty",
|
|
2133
3385
|
"--allow-public-sourcemaps",
|
|
3386
|
+
"--allow-missing-local-release",
|
|
3387
|
+
"--prepared-only",
|
|
3388
|
+
"--build",
|
|
3389
|
+
"--install-venv",
|
|
2134
3390
|
"--with-release",
|
|
2135
3391
|
"--concurrency",
|
|
3392
|
+
"--iterations",
|
|
3393
|
+
"--warmups",
|
|
2136
3394
|
"--sandbox-backend",
|
|
2137
3395
|
"--skip-tests",
|
|
3396
|
+
"--test-jobs",
|
|
2138
3397
|
"--skip-typecheck",
|
|
2139
3398
|
"--skip-eslint",
|
|
2140
3399
|
"--mock",
|
|
@@ -2144,25 +3403,47 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2144
3403
|
"--watch",
|
|
2145
3404
|
"--no-watch",
|
|
2146
3405
|
"--db",
|
|
3406
|
+
"--adapter",
|
|
3407
|
+
"--local",
|
|
2147
3408
|
"--database-url",
|
|
2148
3409
|
"--worker",
|
|
2149
3410
|
"--no-worker",
|
|
3411
|
+
"--no-start",
|
|
3412
|
+
"--no-bridge",
|
|
3413
|
+
"--probe",
|
|
3414
|
+
"--probe-codex-server",
|
|
2150
3415
|
"--once",
|
|
2151
3416
|
"--limit",
|
|
3417
|
+
"--kind",
|
|
3418
|
+
"--session",
|
|
2152
3419
|
"--input",
|
|
2153
3420
|
"--args",
|
|
2154
3421
|
"--step",
|
|
2155
3422
|
"--sink",
|
|
2156
3423
|
"--file",
|
|
3424
|
+
"--task-id",
|
|
3425
|
+
"--run-id",
|
|
3426
|
+
"--project-id",
|
|
3427
|
+
"--manifest",
|
|
3428
|
+
"--channel",
|
|
2157
3429
|
"--telemetry",
|
|
2158
3430
|
"--user-id",
|
|
2159
3431
|
"--tenant-id",
|
|
3432
|
+
"--tenant",
|
|
3433
|
+
"--client-id",
|
|
3434
|
+
"--workos-client-id",
|
|
3435
|
+
"--other-tenant",
|
|
2160
3436
|
"--role",
|
|
3437
|
+
"--permissions",
|
|
2161
3438
|
"--strict-policies",
|
|
2162
3439
|
"--strict",
|
|
2163
3440
|
"--strict-secrets",
|
|
3441
|
+
"--internal",
|
|
2164
3442
|
"--env-file",
|
|
3443
|
+
"--skip-startup-console",
|
|
2165
3444
|
"--redacted",
|
|
3445
|
+
"--older-than",
|
|
3446
|
+
"--output",
|
|
2166
3447
|
"--mock-ai",
|
|
2167
3448
|
"--ai",
|
|
2168
3449
|
"--provider",
|
|
@@ -2170,12 +3451,22 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2170
3451
|
"--prompt",
|
|
2171
3452
|
"--url",
|
|
2172
3453
|
"--template",
|
|
3454
|
+
"--templates",
|
|
2173
3455
|
"--package-manager",
|
|
3456
|
+
"--package-managers",
|
|
2174
3457
|
"--forge-spec",
|
|
2175
3458
|
"--local-forge",
|
|
2176
3459
|
"--install",
|
|
2177
3460
|
"--no-install",
|
|
3461
|
+
"--git",
|
|
2178
3462
|
"--no-git",
|
|
3463
|
+
"--field-test",
|
|
3464
|
+
"--commit-ready",
|
|
3465
|
+
"--detach",
|
|
3466
|
+
"--seed",
|
|
3467
|
+
"--seed-command",
|
|
3468
|
+
"--all-tenants",
|
|
3469
|
+
"--ergonomics",
|
|
2179
3470
|
"--with-web",
|
|
2180
3471
|
"--no-web",
|
|
2181
3472
|
"--api-only",
|
|
@@ -2184,16 +3475,31 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2184
3475
|
"--postgres-version",
|
|
2185
3476
|
"--runtime-port",
|
|
2186
3477
|
"--web-port",
|
|
3478
|
+
"--public-api-url",
|
|
3479
|
+
"--preview-port",
|
|
3480
|
+
"--preview-url",
|
|
3481
|
+
"--studio-url",
|
|
3482
|
+
"--interval-ms",
|
|
3483
|
+
"--workspace-id",
|
|
2187
3484
|
"--poll-interval",
|
|
3485
|
+
"--mcp-server",
|
|
2188
3486
|
"--allow-dev-auth",
|
|
2189
3487
|
"--token",
|
|
3488
|
+
"--prod",
|
|
3489
|
+
"--production",
|
|
3490
|
+
"--scenario",
|
|
3491
|
+
"--reason",
|
|
2190
3492
|
"--no-preserve-user-sections",
|
|
2191
3493
|
"--no-skills",
|
|
2192
3494
|
"--no-rules",
|
|
2193
3495
|
"--full",
|
|
3496
|
+
"--brief",
|
|
3497
|
+
"--verbose",
|
|
2194
3498
|
"--run-tests",
|
|
2195
3499
|
"--model-level",
|
|
2196
3500
|
"--live",
|
|
3501
|
+
"--no-delta",
|
|
3502
|
+
"--format",
|
|
2197
3503
|
]);
|
|
2198
3504
|
|
|
2199
3505
|
for (let index = 0; index < argv.length; index++) {
|
|
@@ -2204,6 +3510,8 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2204
3510
|
if (known.has(arg)) {
|
|
2205
3511
|
if (
|
|
2206
3512
|
arg === "--concurrency" ||
|
|
3513
|
+
arg === "--iterations" ||
|
|
3514
|
+
arg === "--warmups" ||
|
|
2207
3515
|
arg === "--field" ||
|
|
2208
3516
|
arg === "--fields" ||
|
|
2209
3517
|
arg === "--type" ||
|
|
@@ -2214,8 +3522,12 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2214
3522
|
arg === "--policy" ||
|
|
2215
3523
|
arg === "--emit" ||
|
|
2216
3524
|
arg === "--event" ||
|
|
3525
|
+
arg === "--entry" ||
|
|
3526
|
+
arg === "--change" ||
|
|
3527
|
+
arg === "--proof" ||
|
|
2217
3528
|
arg === "--trigger" ||
|
|
2218
3529
|
arg === "--component" ||
|
|
3530
|
+
arg === "--command" ||
|
|
2219
3531
|
arg === "--package" ||
|
|
2220
3532
|
arg === "--action" ||
|
|
2221
3533
|
arg === "--since" ||
|
|
@@ -2244,32 +3556,52 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2244
3556
|
arg === "--video" ||
|
|
2245
3557
|
arg === "--base-url" ||
|
|
2246
3558
|
arg === "--runtime-url" ||
|
|
3559
|
+
arg === "--workspace" ||
|
|
2247
3560
|
arg === "--scenario" ||
|
|
2248
3561
|
arg === "--timeout" ||
|
|
2249
3562
|
arg === "--timeout-ms" ||
|
|
3563
|
+
arg === "--test-jobs" ||
|
|
3564
|
+
arg === "--typechecker" ||
|
|
2250
3565
|
arg === "--name" ||
|
|
3566
|
+
arg === "--reason" ||
|
|
2251
3567
|
arg === "--auth-token" ||
|
|
3568
|
+
arg === "--auth" ||
|
|
2252
3569
|
arg === "--sandbox-backend" ||
|
|
2253
3570
|
arg === "--port" ||
|
|
2254
3571
|
arg === "--host" ||
|
|
2255
3572
|
arg === "--db" ||
|
|
3573
|
+
arg === "--adapter" ||
|
|
2256
3574
|
arg === "--database-url" ||
|
|
2257
3575
|
arg === "--limit" ||
|
|
3576
|
+
arg === "--older-than" ||
|
|
3577
|
+
arg === "--output" ||
|
|
3578
|
+
arg === "--kind" ||
|
|
3579
|
+
arg === "--session" ||
|
|
2258
3580
|
arg === "--input" ||
|
|
2259
3581
|
arg === "--args" ||
|
|
2260
3582
|
arg === "--step" ||
|
|
2261
3583
|
arg === "--sink" ||
|
|
2262
3584
|
arg === "--file" ||
|
|
3585
|
+
arg === "--task-id" ||
|
|
3586
|
+
arg === "--run-id" ||
|
|
3587
|
+
arg === "--project-id" ||
|
|
3588
|
+
arg === "--manifest" ||
|
|
3589
|
+
arg === "--channel" ||
|
|
3590
|
+
arg === "--write-report" ||
|
|
2263
3591
|
arg === "--telemetry" ||
|
|
2264
3592
|
arg === "--user-id" ||
|
|
3593
|
+
arg === "--tenant" ||
|
|
3594
|
+
arg === "--other-tenant" ||
|
|
2265
3595
|
arg === "--tenant-id" ||
|
|
2266
3596
|
arg === "--role" ||
|
|
3597
|
+
arg === "--permissions" ||
|
|
2267
3598
|
arg === "--strict-policies" ||
|
|
2268
3599
|
arg === "--env-file" ||
|
|
2269
3600
|
arg === "--ai" ||
|
|
2270
3601
|
arg === "--provider" ||
|
|
2271
3602
|
arg === "--model" ||
|
|
2272
3603
|
arg === "--prompt" ||
|
|
3604
|
+
arg === "--format" ||
|
|
2273
3605
|
arg === "--url" ||
|
|
2274
3606
|
arg === "--template" ||
|
|
2275
3607
|
arg === "--package-manager" ||
|
|
@@ -2277,7 +3609,14 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2277
3609
|
arg === "--postgres-version" ||
|
|
2278
3610
|
arg === "--runtime-port" ||
|
|
2279
3611
|
arg === "--web-port" ||
|
|
3612
|
+
arg === "--public-api-url" ||
|
|
3613
|
+
arg === "--preview-port" ||
|
|
3614
|
+
arg === "--preview-url" ||
|
|
3615
|
+
arg === "--studio-url" ||
|
|
3616
|
+
arg === "--interval-ms" ||
|
|
3617
|
+
arg === "--workspace-id" ||
|
|
2280
3618
|
arg === "--poll-interval" ||
|
|
3619
|
+
arg === "--mcp-server" ||
|
|
2281
3620
|
arg === "--token"
|
|
2282
3621
|
|| arg === "--to" ||
|
|
2283
3622
|
arg === "--env" ||
|