forgeos 0.1.0-alpha.4 → 0.1.0-alpha.40
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/.npmignore +10 -0
- package/AGENTS.md +142 -90
- package/CHANGELOG.md +418 -0
- package/LICENSE +21 -0
- package/README.md +67 -8
- 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 +34 -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 +36 -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/cair-protocol.md +103 -0
- package/docs/changelog.md +534 -0
- package/docs/forge-protocol.md +189 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +52 -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 +31 -3
- package/schemas/forge-manifest.schema.json +57 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1584 -125
- package/src/forge/agent-adapters/types.ts +224 -1
- package/src/forge/agent-memory/bridge.ts +1333 -0
- package/src/forge/agent-memory/context-pack.ts +277 -0
- package/src/forge/agent-memory/hook-runner.ts +312 -0
- package/src/forge/agent-memory/mcp.ts +224 -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 +273 -0
- package/src/forge/agent-memory/sources/codex.ts +119 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +204 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +801 -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 +106 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +248 -0
- package/src/forge/cli/ai.ts +339 -21
- package/src/forge/cli/auth.ts +348 -10
- 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 +437 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1620 -20
- package/src/forge/cli/db.ts +209 -2
- package/src/forge/cli/deploy.ts +887 -0
- package/src/forge/cli/deps.ts +82 -13
- package/src/forge/cli/dev.ts +961 -46
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/doctor.ts +297 -0
- package/src/forge/cli/field-test.ts +329 -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 +107 -3
- package/src/forge/cli/new.ts +152 -13
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +389 -6
- package/src/forge/cli/parse.ts +1050 -34
- 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/rls.ts +43 -4
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/security.ts +112 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2218 -0
- package/src/forge/cli/verify.ts +1455 -32
- package/src/forge/cli/windows.ts +23 -0
- package/src/forge/cli/workos.ts +1020 -0
- package/src/forge/compiler/agent-contract/build.ts +670 -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/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/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 +30 -0
- package/src/forge/compiler/diagnostics/create.ts +21 -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 +205 -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 +618 -24
- 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 +1219 -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 +247 -10
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +97 -31
- 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-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-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/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 +75 -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/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +238 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +25 -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 +1202 -0
- package/src/forge/delta/store.ts +3284 -0
- package/src/forge/delta/timeline.ts +178 -0
- package/src/forge/dev/server.ts +808 -17
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +280 -33
- package/src/forge/dev-console/types.ts +47 -1
- package/src/forge/impact/index.ts +204 -9
- 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 +40 -6
- package/src/forge/make/templates.ts +155 -2
- 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/review/index.ts +158 -12
- package/src/forge/review/types.ts +15 -0
- 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 +263 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +129 -16
- package/src/forge/runtime/external/bridge.ts +649 -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 +17 -3
- package/src/forge/ui/index.ts +209 -0
- package/src/forge/ui/types.ts +1 -0
- 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 +250 -0
- package/src/forge/workspace/forge-cli.ts +42 -0
- package/src/forge/workspace/git-summary.ts +391 -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 +33 -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 +12 -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 +13 -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/b2b-support-web/package.json +1 -0
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +1 -1
- package/templates/minimal-web/web/package.json +2 -2
- package/templates/nuxt-web/.vscode/settings.json +14 -0
- package/templates/nuxt-web/README.md +30 -0
- package/templates/nuxt-web/forge.config.ts +3 -0
- package/templates/nuxt-web/package.json +33 -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 +18 -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/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 -14919
- 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 -3430
- 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
|
@@ -14,8 +14,14 @@ import type { LiveSubcommand } from "./live.ts";
|
|
|
14
14
|
import type { ForgeAiProvider } from "../runtime/ai/types.ts";
|
|
15
15
|
import type { NewPackageManager, NewTemplateName } from "./new.ts";
|
|
16
16
|
import type { SelfHostSubcommand } from "./self-host.ts";
|
|
17
|
+
import type { DocsSubcommand } from "./docs.ts";
|
|
17
18
|
import type { AgentContractSubcommand } from "./agent-contract.ts";
|
|
18
19
|
import type { AuthSubcommand } from "./auth.ts";
|
|
20
|
+
import type { BaselineSubcommand } from "./baseline.ts";
|
|
21
|
+
import type { AuthMdSubcommand } from "./authmd.ts";
|
|
22
|
+
import type { WorkOSSubcommand } from "./workos.ts";
|
|
23
|
+
import type { DeploySubcommand, DeployTarget } from "./deploy.ts";
|
|
24
|
+
import type { FieldTestSubcommand } from "./field-test.ts";
|
|
19
25
|
import type { RlsSubcommand } from "./rls.ts";
|
|
20
26
|
import type { SecuritySubcommand } from "./security.ts";
|
|
21
27
|
import type { DepsSubcommand } from "./deps.ts";
|
|
@@ -47,8 +53,14 @@ import type {
|
|
|
47
53
|
UiVideoMode,
|
|
48
54
|
} from "../ui/types.ts";
|
|
49
55
|
import type { ForgeDoOptions } from "../intent/types.ts";
|
|
56
|
+
import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
|
|
57
|
+
import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
|
|
58
|
+
import type { CairCommandOptions, CairSubcommand } from "../cair/types.ts";
|
|
50
59
|
|
|
51
60
|
export type ForgeCommand =
|
|
61
|
+
| { kind: "version"; json: boolean }
|
|
62
|
+
| { kind: "last"; json: boolean; workspaceRoot: string }
|
|
63
|
+
| { kind: "baseline"; subcommand: BaselineSubcommand; json: boolean; reason?: string; workspaceRoot: string }
|
|
52
64
|
| {
|
|
53
65
|
kind: "new";
|
|
54
66
|
name: string;
|
|
@@ -58,6 +70,8 @@ export type ForgeCommand =
|
|
|
58
70
|
git: boolean;
|
|
59
71
|
forgePackageSpec?: string;
|
|
60
72
|
localForge: boolean;
|
|
73
|
+
json: boolean;
|
|
74
|
+
fieldTest: boolean;
|
|
61
75
|
workspaceRoot: string;
|
|
62
76
|
}
|
|
63
77
|
| { kind: "build"; json: boolean; workspaceRoot: string }
|
|
@@ -90,6 +104,15 @@ export type ForgeCommand =
|
|
|
90
104
|
postgresVersion: string;
|
|
91
105
|
runtimePort: number;
|
|
92
106
|
webPort: number;
|
|
107
|
+
preparedOnly?: boolean;
|
|
108
|
+
workspaceRoot: string;
|
|
109
|
+
}
|
|
110
|
+
| {
|
|
111
|
+
kind: "docs";
|
|
112
|
+
subcommand: DocsSubcommand;
|
|
113
|
+
json: boolean;
|
|
114
|
+
build: boolean;
|
|
115
|
+
installVenv: boolean;
|
|
93
116
|
workspaceRoot: string;
|
|
94
117
|
}
|
|
95
118
|
| {
|
|
@@ -98,7 +121,7 @@ export type ForgeCommand =
|
|
|
98
121
|
json: boolean;
|
|
99
122
|
workspaceRoot: string;
|
|
100
123
|
}
|
|
101
|
-
| { kind: "doctor"; target?: "project" | "windows"; json: boolean; workspaceRoot: string }
|
|
124
|
+
| { kind: "doctor"; target?: "project" | "windows" | "agent" | "delta" | "pglite" | "runtime"; agentTarget?: AgentAdapterTarget; json: boolean; workspaceRoot: string }
|
|
102
125
|
| { kind: "setup"; target: "windows"; json: boolean; yes: boolean; workspaceRoot: string }
|
|
103
126
|
| {
|
|
104
127
|
kind: "security";
|
|
@@ -106,6 +129,7 @@ export type ForgeCommand =
|
|
|
106
129
|
db: DbAdapterKind;
|
|
107
130
|
databaseUrl?: string;
|
|
108
131
|
json: boolean;
|
|
132
|
+
runTests: boolean;
|
|
109
133
|
workspaceRoot: string;
|
|
110
134
|
}
|
|
111
135
|
| {
|
|
@@ -113,6 +137,53 @@ export type ForgeCommand =
|
|
|
113
137
|
subcommand: AuthSubcommand;
|
|
114
138
|
json: boolean;
|
|
115
139
|
token?: string;
|
|
140
|
+
prod?: boolean;
|
|
141
|
+
scenario?: string;
|
|
142
|
+
workspaceRoot: string;
|
|
143
|
+
}
|
|
144
|
+
| {
|
|
145
|
+
kind: "authmd";
|
|
146
|
+
subcommand: AuthMdSubcommand;
|
|
147
|
+
json: boolean;
|
|
148
|
+
output?: string;
|
|
149
|
+
workspaceRoot: string;
|
|
150
|
+
}
|
|
151
|
+
| {
|
|
152
|
+
kind: "workos";
|
|
153
|
+
subcommand: WorkOSSubcommand;
|
|
154
|
+
json: boolean;
|
|
155
|
+
file?: string;
|
|
156
|
+
yes: boolean;
|
|
157
|
+
dryRun: boolean;
|
|
158
|
+
real?: boolean;
|
|
159
|
+
workspaceRoot: string;
|
|
160
|
+
}
|
|
161
|
+
| {
|
|
162
|
+
kind: "deploy";
|
|
163
|
+
subcommand: DeploySubcommand;
|
|
164
|
+
target: DeployTarget;
|
|
165
|
+
production: boolean;
|
|
166
|
+
url?: string;
|
|
167
|
+
json: boolean;
|
|
168
|
+
workspaceRoot: string;
|
|
169
|
+
}
|
|
170
|
+
| {
|
|
171
|
+
kind: "field-test";
|
|
172
|
+
subcommand: FieldTestSubcommand;
|
|
173
|
+
name?: string;
|
|
174
|
+
template: NewTemplateName;
|
|
175
|
+
templates?: NewTemplateName[];
|
|
176
|
+
packageManager: NewPackageManager;
|
|
177
|
+
packageManagers?: NewPackageManager[];
|
|
178
|
+
forgeSpec?: string;
|
|
179
|
+
auth?: "none" | "workos";
|
|
180
|
+
dryRun: boolean;
|
|
181
|
+
keep: boolean;
|
|
182
|
+
runtimeProbes: boolean;
|
|
183
|
+
authProbes: boolean;
|
|
184
|
+
timeoutMs: number;
|
|
185
|
+
writeReport?: string;
|
|
186
|
+
json: boolean;
|
|
116
187
|
workspaceRoot: string;
|
|
117
188
|
}
|
|
118
189
|
| {
|
|
@@ -150,6 +221,7 @@ export type ForgeCommand =
|
|
|
150
221
|
json: boolean;
|
|
151
222
|
allowDirty: boolean;
|
|
152
223
|
allowPublicSourcemaps: boolean;
|
|
224
|
+
allowMissingLocalRelease?: boolean;
|
|
153
225
|
workspaceRoot: string;
|
|
154
226
|
}
|
|
155
227
|
| { kind: "make"; options: MakeCommandOptions }
|
|
@@ -159,12 +231,71 @@ export type ForgeCommand =
|
|
|
159
231
|
| { kind: "test"; options: TestCommandOptions }
|
|
160
232
|
| { kind: "repair"; options: RepairCommandOptions }
|
|
161
233
|
| { kind: "do"; options: ForgeDoOptions }
|
|
234
|
+
| { kind: "bench"; options: BenchCommandOptions }
|
|
235
|
+
| { kind: "cair"; options: CairCommandOptions }
|
|
162
236
|
| { kind: "agent"; options: AgentCommandOptions }
|
|
237
|
+
| { kind: "mcp"; subcommand: "serve"; workspaceRoot: string }
|
|
163
238
|
| { kind: "review"; options: ReviewCommandOptions }
|
|
164
239
|
| { kind: "ui"; options: UiCommandOptions }
|
|
165
|
-
| { kind: "
|
|
240
|
+
| { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
|
|
241
|
+
| { kind: "import"; options: BrownfieldImportCommandOptions }
|
|
242
|
+
| {
|
|
243
|
+
kind: "delta";
|
|
244
|
+
subcommand: "status" | "repair" | "compact" | "prune" | "export";
|
|
245
|
+
json: boolean;
|
|
246
|
+
workspaceRoot: string;
|
|
247
|
+
dryRun: boolean;
|
|
248
|
+
yes: boolean;
|
|
249
|
+
verbose: boolean;
|
|
250
|
+
olderThan?: string;
|
|
251
|
+
output?: string;
|
|
252
|
+
limit?: number;
|
|
253
|
+
redacted: boolean;
|
|
254
|
+
}
|
|
255
|
+
| { kind: "status"; json: boolean; workspaceRoot: string }
|
|
256
|
+
| { kind: "changed"; json: boolean; authoredOnly: boolean; reviewOnly: boolean; commitReady: boolean; workspaceRoot: string }
|
|
257
|
+
| { kind: "diff"; target: "authored" | "generated" | "full"; json: boolean; workspaceRoot: string }
|
|
258
|
+
| { kind: "handoff"; json: boolean; commitReady: boolean; workspaceRoot: string }
|
|
259
|
+
| {
|
|
260
|
+
kind: "studio";
|
|
261
|
+
subcommand: "attach" | "snapshot" | "watch" | "open" | "doctor" | "bridge" | "codex-server";
|
|
262
|
+
path?: string;
|
|
263
|
+
previewUrl?: string;
|
|
264
|
+
previewPort?: number;
|
|
265
|
+
studioUrl?: string;
|
|
266
|
+
intervalMs?: number;
|
|
267
|
+
once: boolean;
|
|
268
|
+
workspaceId?: string;
|
|
269
|
+
tenantId?: string;
|
|
270
|
+
userId?: string;
|
|
271
|
+
role?: string;
|
|
272
|
+
targets: string[];
|
|
273
|
+
install?: boolean;
|
|
274
|
+
start?: boolean;
|
|
275
|
+
bridge?: boolean;
|
|
276
|
+
writeSchemas?: boolean;
|
|
277
|
+
probeAppServer?: boolean;
|
|
278
|
+
json: boolean;
|
|
279
|
+
dryRun: boolean;
|
|
280
|
+
force: boolean;
|
|
281
|
+
workspaceRoot: string;
|
|
282
|
+
}
|
|
283
|
+
| { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; causal: boolean; staleProofs: boolean; workspaceRoot: string }
|
|
284
|
+
| { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
|
|
285
|
+
| {
|
|
286
|
+
kind: "session";
|
|
287
|
+
subcommand: "list" | "show" | "rename" | "merge" | "split" | "detach";
|
|
288
|
+
sessionId?: string;
|
|
289
|
+
sourceSessionId?: string;
|
|
290
|
+
operationId?: string;
|
|
291
|
+
title?: string;
|
|
292
|
+
limit?: number;
|
|
293
|
+
json: boolean;
|
|
294
|
+
workspaceRoot: string;
|
|
295
|
+
}
|
|
296
|
+
| { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number; workspaceRoot: string }
|
|
166
297
|
| { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
|
|
167
|
-
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
|
|
298
|
+
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean; full: boolean; brief: boolean; ergonomics: boolean; workspaceRoot: string }
|
|
168
299
|
| { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
|
|
169
300
|
| { kind: "verify"; options: VerifyOptions }
|
|
170
301
|
| { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
|
|
@@ -177,7 +308,7 @@ export type ForgeCommand =
|
|
|
177
308
|
once: boolean;
|
|
178
309
|
watch: boolean;
|
|
179
310
|
json: boolean;
|
|
180
|
-
db: "pglite" | "postgres" | "none";
|
|
311
|
+
db: "memory" | "pglite" | "postgres" | "none";
|
|
181
312
|
databaseUrl?: string;
|
|
182
313
|
worker: boolean;
|
|
183
314
|
withWeb: boolean;
|
|
@@ -187,6 +318,9 @@ export type ForgeCommand =
|
|
|
187
318
|
webPort?: number;
|
|
188
319
|
telemetry: string[];
|
|
189
320
|
envFile?: string;
|
|
321
|
+
skipStartupConsole: boolean;
|
|
322
|
+
detach: boolean;
|
|
323
|
+
lifecycle?: "status" | "stop";
|
|
190
324
|
workspaceRoot: string;
|
|
191
325
|
}
|
|
192
326
|
| {
|
|
@@ -194,6 +328,7 @@ export type ForgeCommand =
|
|
|
194
328
|
subcommand: DbSubcommand;
|
|
195
329
|
db: DbAdapterKind;
|
|
196
330
|
databaseUrl?: string;
|
|
331
|
+
local?: boolean;
|
|
197
332
|
json: boolean;
|
|
198
333
|
workspaceRoot: string;
|
|
199
334
|
}
|
|
@@ -293,6 +428,8 @@ export type ForgeCommand =
|
|
|
293
428
|
model?: string;
|
|
294
429
|
prompt?: string;
|
|
295
430
|
mock: boolean;
|
|
431
|
+
modelLevel: boolean;
|
|
432
|
+
live: boolean;
|
|
296
433
|
traceId?: string;
|
|
297
434
|
db?: DbAdapterKind;
|
|
298
435
|
databaseUrl?: string;
|
|
@@ -306,19 +443,28 @@ export interface ParsedCli {
|
|
|
306
443
|
}
|
|
307
444
|
|
|
308
445
|
export const TOP_LEVEL_COMMANDS = [
|
|
446
|
+
"version",
|
|
447
|
+
"last",
|
|
448
|
+
"baseline",
|
|
309
449
|
"new",
|
|
310
450
|
"build",
|
|
311
451
|
"serve",
|
|
312
452
|
"worker",
|
|
313
453
|
"self-host",
|
|
454
|
+
"docs",
|
|
314
455
|
"agent-contract",
|
|
315
456
|
"agent",
|
|
457
|
+
"mcp",
|
|
316
458
|
"review",
|
|
317
459
|
"ui",
|
|
318
460
|
"doctor",
|
|
319
461
|
"setup",
|
|
320
462
|
"security",
|
|
321
463
|
"auth",
|
|
464
|
+
"authmd",
|
|
465
|
+
"workos",
|
|
466
|
+
"deploy",
|
|
467
|
+
"field-test",
|
|
322
468
|
"rls",
|
|
323
469
|
"deps",
|
|
324
470
|
"release",
|
|
@@ -329,6 +475,19 @@ export const TOP_LEVEL_COMMANDS = [
|
|
|
329
475
|
"test",
|
|
330
476
|
"repair",
|
|
331
477
|
"do",
|
|
478
|
+
"bench",
|
|
479
|
+
"cair",
|
|
480
|
+
"delta",
|
|
481
|
+
"session",
|
|
482
|
+
"timeline",
|
|
483
|
+
"explain",
|
|
484
|
+
"manifest",
|
|
485
|
+
"import",
|
|
486
|
+
"status",
|
|
487
|
+
"changed",
|
|
488
|
+
"diff",
|
|
489
|
+
"handoff",
|
|
490
|
+
"studio",
|
|
332
491
|
"generate",
|
|
333
492
|
"add",
|
|
334
493
|
"inspect",
|
|
@@ -365,6 +524,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
365
524
|
"ai",
|
|
366
525
|
"queries",
|
|
367
526
|
"api",
|
|
527
|
+
"external",
|
|
368
528
|
"client",
|
|
369
529
|
"frontend",
|
|
370
530
|
"auth",
|
|
@@ -383,7 +543,12 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
383
543
|
"agent-tools",
|
|
384
544
|
"agent-adapters",
|
|
385
545
|
"capability-map",
|
|
546
|
+
"summary",
|
|
547
|
+
"schema",
|
|
548
|
+
"drift",
|
|
549
|
+
"handoff",
|
|
386
550
|
"framework",
|
|
551
|
+
"imported",
|
|
387
552
|
"ui",
|
|
388
553
|
"ui-scenarios",
|
|
389
554
|
"ui-routes",
|
|
@@ -392,7 +557,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
392
557
|
"map",
|
|
393
558
|
];
|
|
394
559
|
|
|
395
|
-
const NEW_TEMPLATES: NewTemplateName[] = ["b2b-support-web", "minimal-web"];
|
|
560
|
+
const NEW_TEMPLATES: NewTemplateName[] = ["agent-workroom", "b2b-support-web", "minimal-web", "nuxt-web"];
|
|
396
561
|
const NEW_PACKAGE_MANAGERS: NewPackageManager[] = ["bun", "npm", "pnpm", "yarn"];
|
|
397
562
|
const SELF_HOST_SUBCOMMANDS: SelfHostSubcommand[] = ["compose", "env", "check", "clean"];
|
|
398
563
|
const AGENT_CONTRACT_SUBCOMMANDS: AgentContractSubcommand[] = [
|
|
@@ -407,7 +572,13 @@ const AUTH_SUBCOMMANDS: AuthSubcommand[] = [
|
|
|
407
572
|
"test-token",
|
|
408
573
|
"jwks",
|
|
409
574
|
"prove",
|
|
575
|
+
"status",
|
|
410
576
|
];
|
|
577
|
+
const BASELINE_SUBCOMMANDS: BaselineSubcommand[] = ["create", "status"];
|
|
578
|
+
const AUTHMD_SUBCOMMANDS: AuthMdSubcommand[] = ["generate", "check"];
|
|
579
|
+
const WORKOS_SUBCOMMANDS: WorkOSSubcommand[] = ["install", "doctor", "seed", "setup"];
|
|
580
|
+
const DEPLOY_SUBCOMMANDS: DeploySubcommand[] = ["plan", "check", "render", "verify"];
|
|
581
|
+
const FIELD_TEST_SUBCOMMANDS: FieldTestSubcommand[] = ["create", "run", "report"];
|
|
411
582
|
const SECURITY_SUBCOMMANDS: SecuritySubcommand[] = ["prove"];
|
|
412
583
|
const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test", "mutate-test"];
|
|
413
584
|
const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
|
|
@@ -484,7 +655,7 @@ const RENAME_TARGETS: RenameTarget[] = [
|
|
|
484
655
|
"workflow",
|
|
485
656
|
"event",
|
|
486
657
|
];
|
|
487
|
-
const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain"];
|
|
658
|
+
const TEST_SUBCOMMANDS: TestSubcommand[] = ["plan", "run", "explain", "authz"];
|
|
488
659
|
const TEST_COSTS: TestCost[] = ["instant", "fast", "standard", "slow", "docker", "browser"];
|
|
489
660
|
const REPAIR_SUBCOMMANDS: RepairSubcommand[] = [
|
|
490
661
|
"diagnose",
|
|
@@ -501,10 +672,18 @@ const AGENT_SUBCOMMANDS: AgentSubcommand[] = [
|
|
|
501
672
|
"export",
|
|
502
673
|
"check",
|
|
503
674
|
"doctor",
|
|
675
|
+
"onboard",
|
|
504
676
|
"print-context",
|
|
505
677
|
"clean",
|
|
678
|
+
"prepare",
|
|
679
|
+
"hooks",
|
|
680
|
+
"install",
|
|
681
|
+
"ingest",
|
|
682
|
+
"context",
|
|
683
|
+
"memory",
|
|
684
|
+
"timeline",
|
|
506
685
|
];
|
|
507
|
-
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["inspect", "list", "explain"];
|
|
686
|
+
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["run", "inspect", "list", "explain"];
|
|
508
687
|
const REVIEW_MODES: ReviewMode[] = ["quick", "standard", "strict"];
|
|
509
688
|
const REVIEW_FAIL_ON: ReviewFailOn[] = ["warning", "error", "blocking"];
|
|
510
689
|
const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
|
|
@@ -522,6 +701,7 @@ const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
|
|
|
522
701
|
"agent",
|
|
523
702
|
];
|
|
524
703
|
const UI_SUBCOMMANDS: UiSubcommand[] = [
|
|
704
|
+
"audit",
|
|
525
705
|
"smoke",
|
|
526
706
|
"test",
|
|
527
707
|
"scenario",
|
|
@@ -545,6 +725,8 @@ const AI_SUBCOMMANDS: AiSubcommand[] = [
|
|
|
545
725
|
"redteam",
|
|
546
726
|
"trace",
|
|
547
727
|
];
|
|
728
|
+
const BENCH_SUBCOMMANDS: BenchSubcommand[] = ["compiler"];
|
|
729
|
+
const CAIR_SUBCOMMANDS: CairSubcommand[] = ["snapshot", "query", "action"];
|
|
548
730
|
|
|
549
731
|
function parseFlag(args: string[], flag: string): boolean {
|
|
550
732
|
return args.includes(flag);
|
|
@@ -569,8 +751,8 @@ function parseOptionValues(args: string[], flag: string): string[] {
|
|
|
569
751
|
return values;
|
|
570
752
|
}
|
|
571
753
|
|
|
572
|
-
function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
|
|
573
|
-
if (value === "postgres" || value === "none") {
|
|
754
|
+
function parseDbKind(value: string | undefined): "memory" | "pglite" | "postgres" | "none" {
|
|
755
|
+
if (value === "memory" || value === "postgres" || value === "none") {
|
|
574
756
|
return value;
|
|
575
757
|
}
|
|
576
758
|
return "pglite";
|
|
@@ -597,7 +779,10 @@ function parseSandboxBackend(value: string | undefined): SandboxBackend {
|
|
|
597
779
|
function parseAddOptions(
|
|
598
780
|
args: string[],
|
|
599
781
|
workspaceRoot: string,
|
|
782
|
+
mode: AddOptions["mode"] = "auto",
|
|
600
783
|
): AddOptions & { workspaceRoot: string } {
|
|
784
|
+
const frontend = parseFlag(args, "--frontend");
|
|
785
|
+
const backend = parseFlag(args, "--backend");
|
|
601
786
|
return {
|
|
602
787
|
workspaceRoot,
|
|
603
788
|
json: parseFlag(args, "--json"),
|
|
@@ -607,6 +792,9 @@ function parseAddOptions(
|
|
|
607
792
|
parseOptionValue(args, "--sandbox-backend"),
|
|
608
793
|
),
|
|
609
794
|
allowScripts: parseFlag(args, "--allow-scripts"),
|
|
795
|
+
mode,
|
|
796
|
+
installWorkspace: parseOptionValue(args, "--workspace"),
|
|
797
|
+
packageTarget: frontend && !backend ? "frontend" : backend ? "backend" : undefined,
|
|
610
798
|
};
|
|
611
799
|
}
|
|
612
800
|
|
|
@@ -658,6 +846,33 @@ function parseNewPackageManager(value: string | undefined): NewPackageManager {
|
|
|
658
846
|
: "bun";
|
|
659
847
|
}
|
|
660
848
|
|
|
849
|
+
function parseCommaList(value: string | undefined): string[] {
|
|
850
|
+
return String(value ?? "")
|
|
851
|
+
.split(",")
|
|
852
|
+
.map((item) => item.trim())
|
|
853
|
+
.filter(Boolean);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
function parseTemplateList(value: string | undefined, errors: string[], optionName: string): NewTemplateName[] | undefined {
|
|
857
|
+
if (!value) return undefined;
|
|
858
|
+
const values = parseCommaList(value);
|
|
859
|
+
const unsupported = values.filter((item) => !NEW_TEMPLATES.includes(item as NewTemplateName));
|
|
860
|
+
if (unsupported.length > 0) {
|
|
861
|
+
errors.push(`${optionName} contains unsupported template(s): ${unsupported.join(", ")}; supported: ${NEW_TEMPLATES.join(", ")}`);
|
|
862
|
+
}
|
|
863
|
+
return values.filter((item) => NEW_TEMPLATES.includes(item as NewTemplateName)) as NewTemplateName[];
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
function parsePackageManagerList(value: string | undefined, errors: string[], optionName: string): NewPackageManager[] | undefined {
|
|
867
|
+
if (!value) return undefined;
|
|
868
|
+
const values = parseCommaList(value);
|
|
869
|
+
const unsupported = values.filter((item) => !NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager));
|
|
870
|
+
if (unsupported.length > 0) {
|
|
871
|
+
errors.push(`${optionName} contains unsupported package manager(s): ${unsupported.join(", ")}; supported: ${NEW_PACKAGE_MANAGERS.join(", ")}`);
|
|
872
|
+
}
|
|
873
|
+
return values.filter((item) => NEW_PACKAGE_MANAGERS.includes(item as NewPackageManager)) as NewPackageManager[];
|
|
874
|
+
}
|
|
875
|
+
|
|
661
876
|
function parseDoObjective(rest: string[], argv: string[]): string {
|
|
662
877
|
const [action, name, ...tail] = rest;
|
|
663
878
|
if (action === "add-resource") {
|
|
@@ -686,6 +901,14 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
686
901
|
const positional = argv.filter((arg) => !arg.startsWith("-"));
|
|
687
902
|
const workspaceRoot = process.cwd().replace(/\\/g, "/");
|
|
688
903
|
|
|
904
|
+
if (parseFlag(argv, "--version") || parseFlag(argv, "-v")) {
|
|
905
|
+
return {
|
|
906
|
+
command: { kind: "version", json: parseFlag(argv, "--json") },
|
|
907
|
+
workspaceRoot,
|
|
908
|
+
errors,
|
|
909
|
+
};
|
|
910
|
+
}
|
|
911
|
+
|
|
689
912
|
if (positional.length === 0) {
|
|
690
913
|
errors.push(
|
|
691
914
|
`missing command; expected ${TOP_LEVEL_COMMANDS.join(", ")}`,
|
|
@@ -696,6 +919,36 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
696
919
|
const [commandName, ...rest] = positional;
|
|
697
920
|
|
|
698
921
|
switch (commandName) {
|
|
922
|
+
case "version":
|
|
923
|
+
return {
|
|
924
|
+
command: { kind: "version", json: parseFlag(argv, "--json") },
|
|
925
|
+
workspaceRoot,
|
|
926
|
+
errors,
|
|
927
|
+
};
|
|
928
|
+
case "last":
|
|
929
|
+
return {
|
|
930
|
+
command: { kind: "last", json: parseFlag(argv, "--json"), workspaceRoot },
|
|
931
|
+
workspaceRoot,
|
|
932
|
+
errors,
|
|
933
|
+
};
|
|
934
|
+
case "baseline": {
|
|
935
|
+
const subcommand = (rest[0] ?? "status") as BaselineSubcommand;
|
|
936
|
+
if (!BASELINE_SUBCOMMANDS.includes(subcommand)) {
|
|
937
|
+
errors.push("forge baseline requires subcommand: create or status");
|
|
938
|
+
return { command: null, workspaceRoot, errors };
|
|
939
|
+
}
|
|
940
|
+
return {
|
|
941
|
+
command: {
|
|
942
|
+
kind: "baseline",
|
|
943
|
+
subcommand,
|
|
944
|
+
reason: parseOptionValue(argv, "--reason"),
|
|
945
|
+
json: parseFlag(argv, "--json"),
|
|
946
|
+
workspaceRoot,
|
|
947
|
+
},
|
|
948
|
+
workspaceRoot,
|
|
949
|
+
errors,
|
|
950
|
+
};
|
|
951
|
+
}
|
|
699
952
|
case "new": {
|
|
700
953
|
const name = rest[0];
|
|
701
954
|
if (!name) {
|
|
@@ -725,6 +978,9 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
725
978
|
if (install && noInstall) {
|
|
726
979
|
errors.push("use either --install or --no-install, not both");
|
|
727
980
|
}
|
|
981
|
+
if (parseFlag(argv, "--field-test") && noInstall) {
|
|
982
|
+
errors.push("forge new --field-test requires installation; remove --no-install");
|
|
983
|
+
}
|
|
728
984
|
|
|
729
985
|
return {
|
|
730
986
|
command: {
|
|
@@ -736,6 +992,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
736
992
|
git: !parseFlag(argv, "--no-git"),
|
|
737
993
|
forgePackageSpec,
|
|
738
994
|
localForge,
|
|
995
|
+
json: parseFlag(argv, "--json"),
|
|
996
|
+
fieldTest: parseFlag(argv, "--field-test"),
|
|
739
997
|
workspaceRoot,
|
|
740
998
|
},
|
|
741
999
|
workspaceRoot,
|
|
@@ -825,6 +1083,26 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
825
1083
|
postgresVersion: parseOptionValue(argv, "--postgres-version") ?? "16",
|
|
826
1084
|
runtimePort: Math.floor(runtimePort),
|
|
827
1085
|
webPort: Math.floor(webPort),
|
|
1086
|
+
preparedOnly: parseFlag(argv, "--prepared-only"),
|
|
1087
|
+
workspaceRoot,
|
|
1088
|
+
},
|
|
1089
|
+
workspaceRoot,
|
|
1090
|
+
errors,
|
|
1091
|
+
};
|
|
1092
|
+
}
|
|
1093
|
+
case "docs": {
|
|
1094
|
+
const subcommand = rest[0] as DocsSubcommand | undefined;
|
|
1095
|
+
if (subcommand !== "check") {
|
|
1096
|
+
errors.push("forge docs requires subcommand: check");
|
|
1097
|
+
return { command: null, workspaceRoot, errors };
|
|
1098
|
+
}
|
|
1099
|
+
return {
|
|
1100
|
+
command: {
|
|
1101
|
+
kind: "docs",
|
|
1102
|
+
subcommand,
|
|
1103
|
+
json: parseFlag(argv, "--json"),
|
|
1104
|
+
build: parseFlag(argv, "--build"),
|
|
1105
|
+
installVenv: parseFlag(argv, "--install-venv"),
|
|
828
1106
|
workspaceRoot,
|
|
829
1107
|
},
|
|
830
1108
|
workspaceRoot,
|
|
@@ -851,12 +1129,54 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
851
1129
|
case "agent": {
|
|
852
1130
|
const subcommand = rest[0] as AgentSubcommand | undefined;
|
|
853
1131
|
if (!subcommand || !AGENT_SUBCOMMANDS.includes(subcommand)) {
|
|
854
|
-
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, print-context, or
|
|
1132
|
+
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, onboard, print-context, clean, prepare, hooks, install, ingest, context, memory, or timeline");
|
|
855
1133
|
return { command: null, workspaceRoot, errors };
|
|
856
1134
|
}
|
|
1135
|
+
const inputRaw = parseOptionValue(argv, "--input");
|
|
1136
|
+
let input: unknown;
|
|
1137
|
+
if (inputRaw !== undefined) {
|
|
1138
|
+
try {
|
|
1139
|
+
input = JSON.parse(inputRaw);
|
|
1140
|
+
} catch {
|
|
1141
|
+
errors.push("--input must be valid JSON");
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
1145
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
1146
|
+
const pollIntervalRaw = parseOptionValue(argv, "--poll-interval");
|
|
1147
|
+
const pollIntervalMs = pollIntervalRaw ? Number(pollIntervalRaw) : undefined;
|
|
1148
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
1149
|
+
errors.push("--limit must be a number >= 1");
|
|
1150
|
+
}
|
|
1151
|
+
if (
|
|
1152
|
+
pollIntervalRaw !== undefined &&
|
|
1153
|
+
(!Number.isFinite(pollIntervalMs) || pollIntervalMs! < 100)
|
|
1154
|
+
) {
|
|
1155
|
+
errors.push("--poll-interval must be a number >= 100");
|
|
1156
|
+
}
|
|
857
1157
|
const target =
|
|
858
1158
|
(parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ??
|
|
859
|
-
(subcommand === "
|
|
1159
|
+
(subcommand === "install" || subcommand === "ingest" ? rest[1] : undefined) ??
|
|
1160
|
+
(subcommand === "hooks" ? rest[2] : undefined) ??
|
|
1161
|
+
(subcommand === "timeline" ? rest[1] : undefined) ??
|
|
1162
|
+
(subcommand === "timeline" ? "all" : undefined) ??
|
|
1163
|
+
(subcommand === "hooks" || subcommand === "onboard" ? "codex" : "generic");
|
|
1164
|
+
const contextOptionValues = new Set(
|
|
1165
|
+
[
|
|
1166
|
+
parseOptionValue(argv, "--entry"),
|
|
1167
|
+
parseOptionValue(argv, "--change"),
|
|
1168
|
+
parseOptionValue(argv, "--proof"),
|
|
1169
|
+
parseOptionValue(argv, "--event"),
|
|
1170
|
+
parseOptionValue(argv, "--input"),
|
|
1171
|
+
parseOptionValue(argv, "--target"),
|
|
1172
|
+
parseOptionValue(argv, "--file"),
|
|
1173
|
+
limitRaw,
|
|
1174
|
+
pollIntervalRaw,
|
|
1175
|
+
].filter((value): value is string => typeof value === "string"),
|
|
1176
|
+
);
|
|
1177
|
+
const contextEntry = subcommand === "context"
|
|
1178
|
+
? rest.slice(1).find((part) => !part.startsWith("--") && !contextOptionValues.has(part))
|
|
1179
|
+
: undefined;
|
|
860
1180
|
return {
|
|
861
1181
|
command: {
|
|
862
1182
|
kind: "agent",
|
|
@@ -870,12 +1190,40 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
870
1190
|
preserveUserSections: !parseFlag(argv, "--no-preserve-user-sections"),
|
|
871
1191
|
skills: !parseFlag(argv, "--no-skills"),
|
|
872
1192
|
rules: !parseFlag(argv, "--no-rules"),
|
|
1193
|
+
eventName: parseOptionValue(argv, "--event"),
|
|
1194
|
+
hookAction: subcommand === "hooks" ? rest[1] : undefined,
|
|
1195
|
+
input,
|
|
1196
|
+
entry: parseOptionValue(argv, "--entry") ?? contextEntry,
|
|
1197
|
+
change: parseOptionValue(argv, "--change"),
|
|
1198
|
+
proof: parseOptionValue(argv, "--proof"),
|
|
1199
|
+
handoff: parseFlag(argv, "--handoff"),
|
|
1200
|
+
current: parseFlag(argv, "--current"),
|
|
1201
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
1202
|
+
watch: parseFlag(argv, "--watch"),
|
|
1203
|
+
file: parseOptionValue(argv, "--file"),
|
|
1204
|
+
pollIntervalMs: pollIntervalMs ? Math.floor(pollIntervalMs) : undefined,
|
|
873
1205
|
},
|
|
874
1206
|
},
|
|
875
1207
|
workspaceRoot,
|
|
876
1208
|
errors,
|
|
877
1209
|
};
|
|
878
1210
|
}
|
|
1211
|
+
case "mcp": {
|
|
1212
|
+
const subcommand = rest[0];
|
|
1213
|
+
if (subcommand !== "serve") {
|
|
1214
|
+
errors.push("forge mcp requires subcommand: serve");
|
|
1215
|
+
return { command: null, workspaceRoot, errors };
|
|
1216
|
+
}
|
|
1217
|
+
return {
|
|
1218
|
+
command: {
|
|
1219
|
+
kind: "mcp",
|
|
1220
|
+
subcommand,
|
|
1221
|
+
workspaceRoot,
|
|
1222
|
+
},
|
|
1223
|
+
workspaceRoot,
|
|
1224
|
+
errors,
|
|
1225
|
+
};
|
|
1226
|
+
}
|
|
879
1227
|
case "review": {
|
|
880
1228
|
const requested = rest[0] as ReviewSubcommand | undefined;
|
|
881
1229
|
const subcommand =
|
|
@@ -898,6 +1246,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
898
1246
|
json: parseFlag(argv, "--json"),
|
|
899
1247
|
md: parseFlag(argv, "--md"),
|
|
900
1248
|
sarif: parseFlag(argv, "--sarif"),
|
|
1249
|
+
full: parseFlag(argv, "--full"),
|
|
901
1250
|
write: positionalWrite || parseFlag(argv, "--write"),
|
|
902
1251
|
changed: parseFlag(argv, "--changed") || noSourceFlag,
|
|
903
1252
|
staged: parseFlag(argv, "--staged"),
|
|
@@ -921,7 +1270,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
921
1270
|
case "ui": {
|
|
922
1271
|
const subcommand = (rest[0] ?? "smoke") as UiSubcommand;
|
|
923
1272
|
if (!UI_SUBCOMMANDS.includes(subcommand)) {
|
|
924
|
-
errors.push("forge ui requires subcommand: smoke, test, scenario, route, snapshot, report, doctor, or list");
|
|
1273
|
+
errors.push("forge ui requires subcommand: audit, smoke, test, scenario, route, snapshot, report, doctor, or list");
|
|
925
1274
|
return { command: null, workspaceRoot, errors };
|
|
926
1275
|
}
|
|
927
1276
|
const timeoutRaw = parseOptionValue(argv, "--timeout");
|
|
@@ -968,14 +1317,27 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
968
1317
|
};
|
|
969
1318
|
}
|
|
970
1319
|
case "doctor":
|
|
971
|
-
if (rest[0] && rest[0] !== "windows") {
|
|
972
|
-
errors.push("forge doctor supports subcommand: windows");
|
|
1320
|
+
if (rest[0] && rest[0] !== "windows" && rest[0] !== "agent" && rest[0] !== "delta" && rest[0] !== "pglite" && rest[0] !== "runtime") {
|
|
1321
|
+
errors.push("forge doctor supports subcommand: windows, agent, delta, pglite, or runtime");
|
|
973
1322
|
return { command: null, workspaceRoot, errors };
|
|
974
1323
|
}
|
|
975
1324
|
return {
|
|
976
1325
|
command: {
|
|
977
1326
|
kind: "doctor",
|
|
978
|
-
target: rest[0] === "windows"
|
|
1327
|
+
target: rest[0] === "windows"
|
|
1328
|
+
? "windows"
|
|
1329
|
+
: rest[0] === "agent"
|
|
1330
|
+
? "agent"
|
|
1331
|
+
: rest[0] === "delta"
|
|
1332
|
+
? "delta"
|
|
1333
|
+
: rest[0] === "pglite"
|
|
1334
|
+
? "pglite"
|
|
1335
|
+
: rest[0] === "runtime"
|
|
1336
|
+
? "runtime"
|
|
1337
|
+
: "project",
|
|
1338
|
+
agentTarget: rest[0] === "agent"
|
|
1339
|
+
? (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ?? (rest[1] as AgentAdapterTarget | undefined) ?? "codex"
|
|
1340
|
+
: undefined,
|
|
979
1341
|
json: parseFlag(argv, "--json"),
|
|
980
1342
|
workspaceRoot,
|
|
981
1343
|
},
|
|
@@ -1013,6 +1375,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1013
1375
|
db: parseAdapterKind(parseOptionValue(argv, "--db")),
|
|
1014
1376
|
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
1015
1377
|
json: parseFlag(argv, "--json"),
|
|
1378
|
+
runTests: parseFlag(argv, "--full") || parseFlag(argv, "--run-tests"),
|
|
1016
1379
|
workspaceRoot,
|
|
1017
1380
|
},
|
|
1018
1381
|
workspaceRoot,
|
|
@@ -1022,7 +1385,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1022
1385
|
case "auth": {
|
|
1023
1386
|
const subcommand = rest[0] as AuthSubcommand | undefined;
|
|
1024
1387
|
if (!subcommand || !AUTH_SUBCOMMANDS.includes(subcommand)) {
|
|
1025
|
-
errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, or
|
|
1388
|
+
errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, prove, or status");
|
|
1026
1389
|
return { command: null, workspaceRoot, errors };
|
|
1027
1390
|
}
|
|
1028
1391
|
return {
|
|
@@ -1031,6 +1394,112 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1031
1394
|
subcommand,
|
|
1032
1395
|
json: parseFlag(argv, "--json"),
|
|
1033
1396
|
token: parseOptionValue(argv, "--token"),
|
|
1397
|
+
prod: parseFlag(argv, "--prod") || parseFlag(argv, "--production"),
|
|
1398
|
+
scenario: parseOptionValue(argv, "--scenario"),
|
|
1399
|
+
workspaceRoot,
|
|
1400
|
+
},
|
|
1401
|
+
workspaceRoot,
|
|
1402
|
+
errors,
|
|
1403
|
+
};
|
|
1404
|
+
}
|
|
1405
|
+
case "authmd": {
|
|
1406
|
+
const subcommand = rest[0] as AuthMdSubcommand | undefined;
|
|
1407
|
+
if (!subcommand || !AUTHMD_SUBCOMMANDS.includes(subcommand)) {
|
|
1408
|
+
errors.push("forge authmd requires subcommand: generate or check");
|
|
1409
|
+
return { command: null, workspaceRoot, errors };
|
|
1410
|
+
}
|
|
1411
|
+
return {
|
|
1412
|
+
command: {
|
|
1413
|
+
kind: "authmd",
|
|
1414
|
+
subcommand,
|
|
1415
|
+
json: parseFlag(argv, "--json"),
|
|
1416
|
+
output: parseOptionValue(argv, "--output"),
|
|
1417
|
+
workspaceRoot,
|
|
1418
|
+
},
|
|
1419
|
+
workspaceRoot,
|
|
1420
|
+
errors,
|
|
1421
|
+
};
|
|
1422
|
+
}
|
|
1423
|
+
case "workos": {
|
|
1424
|
+
const subcommand = rest[0] as WorkOSSubcommand | undefined;
|
|
1425
|
+
if (!subcommand || !WORKOS_SUBCOMMANDS.includes(subcommand)) {
|
|
1426
|
+
errors.push("forge workos requires subcommand: install, doctor, seed, or setup");
|
|
1427
|
+
return { command: null, workspaceRoot, errors };
|
|
1428
|
+
}
|
|
1429
|
+
return {
|
|
1430
|
+
command: {
|
|
1431
|
+
kind: "workos",
|
|
1432
|
+
subcommand,
|
|
1433
|
+
json: parseFlag(argv, "--json"),
|
|
1434
|
+
file: parseOptionValue(argv, "--file"),
|
|
1435
|
+
yes: parseFlag(argv, "--yes"),
|
|
1436
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1437
|
+
real: parseFlag(argv, "--real"),
|
|
1438
|
+
workspaceRoot,
|
|
1439
|
+
},
|
|
1440
|
+
workspaceRoot,
|
|
1441
|
+
errors,
|
|
1442
|
+
};
|
|
1443
|
+
}
|
|
1444
|
+
case "deploy": {
|
|
1445
|
+
const subcommand = rest[0] as DeploySubcommand | undefined;
|
|
1446
|
+
if (!subcommand || !DEPLOY_SUBCOMMANDS.includes(subcommand)) {
|
|
1447
|
+
errors.push("forge deploy requires subcommand: plan, check, render, or verify");
|
|
1448
|
+
return { command: null, workspaceRoot, errors };
|
|
1449
|
+
}
|
|
1450
|
+
const targetRaw = parseOptionValue(argv, "--target") ?? (subcommand === "render" ? rest[1] : undefined) ?? "docker";
|
|
1451
|
+
if (targetRaw !== "docker" && targetRaw !== "forge-cloud") {
|
|
1452
|
+
errors.push("forge deploy --target must be docker or forge-cloud");
|
|
1453
|
+
}
|
|
1454
|
+
return {
|
|
1455
|
+
command: {
|
|
1456
|
+
kind: "deploy",
|
|
1457
|
+
subcommand,
|
|
1458
|
+
target: targetRaw as DeployTarget,
|
|
1459
|
+
production: parseFlag(argv, "--production") || parseFlag(argv, "--prod"),
|
|
1460
|
+
url: parseOptionValue(argv, "--url"),
|
|
1461
|
+
json: parseFlag(argv, "--json"),
|
|
1462
|
+
workspaceRoot,
|
|
1463
|
+
},
|
|
1464
|
+
workspaceRoot,
|
|
1465
|
+
errors,
|
|
1466
|
+
};
|
|
1467
|
+
}
|
|
1468
|
+
case "field-test": {
|
|
1469
|
+
const subcommand = rest[0] as FieldTestSubcommand | undefined;
|
|
1470
|
+
if (!subcommand || !FIELD_TEST_SUBCOMMANDS.includes(subcommand)) {
|
|
1471
|
+
errors.push("forge field-test requires subcommand: create, run, or report");
|
|
1472
|
+
return { command: null, workspaceRoot, errors };
|
|
1473
|
+
}
|
|
1474
|
+
const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
|
|
1475
|
+
const timeoutMs = timeoutRaw ? Number(timeoutRaw) : 180_000;
|
|
1476
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs < 1) {
|
|
1477
|
+
errors.push("--timeout-ms must be a positive integer");
|
|
1478
|
+
}
|
|
1479
|
+
const authRaw = parseOptionValue(argv, "--auth") ?? "none";
|
|
1480
|
+
if (authRaw !== "none" && authRaw !== "workos") {
|
|
1481
|
+
errors.push("forge field-test --auth must be none or workos");
|
|
1482
|
+
}
|
|
1483
|
+
const templates = parseTemplateList(parseOptionValue(argv, "--templates"), errors, "--templates");
|
|
1484
|
+
const packageManagers = parsePackageManagerList(parseOptionValue(argv, "--package-managers"), errors, "--package-managers");
|
|
1485
|
+
return {
|
|
1486
|
+
command: {
|
|
1487
|
+
kind: "field-test",
|
|
1488
|
+
subcommand,
|
|
1489
|
+
name: subcommand === "create" ? rest[1] : undefined,
|
|
1490
|
+
template: parseNewTemplate(parseOptionValue(argv, "--template") ?? "minimal-web"),
|
|
1491
|
+
templates,
|
|
1492
|
+
packageManager: parseNewPackageManager(parseOptionValue(argv, "--package-manager") ?? "npm"),
|
|
1493
|
+
packageManagers,
|
|
1494
|
+
forgeSpec: parseOptionValue(argv, "--forge-spec"),
|
|
1495
|
+
auth: authRaw as "none" | "workos",
|
|
1496
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1497
|
+
keep: parseFlag(argv, "--keep"),
|
|
1498
|
+
runtimeProbes: parseFlag(argv, "--runtime-probes"),
|
|
1499
|
+
authProbes: parseFlag(argv, "--auth-probes"),
|
|
1500
|
+
timeoutMs: Math.floor(timeoutMs),
|
|
1501
|
+
writeReport: parseOptionValue(argv, "--write-report") ?? parseOptionValue(argv, "--file"),
|
|
1502
|
+
json: parseFlag(argv, "--json"),
|
|
1034
1503
|
workspaceRoot,
|
|
1035
1504
|
},
|
|
1036
1505
|
workspaceRoot,
|
|
@@ -1113,6 +1582,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1113
1582
|
json: parseFlag(argv, "--json"),
|
|
1114
1583
|
allowDirty: parseFlag(argv, "--allow-dirty"),
|
|
1115
1584
|
allowPublicSourcemaps: parseFlag(argv, "--allow-public-sourcemaps"),
|
|
1585
|
+
allowMissingLocalRelease: parseFlag(argv, "--allow-missing-local-release"),
|
|
1116
1586
|
workspaceRoot,
|
|
1117
1587
|
},
|
|
1118
1588
|
workspaceRoot,
|
|
@@ -1184,7 +1654,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1184
1654
|
event: parseOptionValue(argv, "--event"),
|
|
1185
1655
|
trigger: parseOptionValue(argv, "--trigger"),
|
|
1186
1656
|
component: parseOptionValue(argv, "--component"),
|
|
1187
|
-
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
|
|
1657
|
+
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
|
|
1188
1658
|
withAi: parseFlag(argv, "--with-ai"),
|
|
1189
1659
|
withCrud: parseFlag(argv, "--with-crud"),
|
|
1190
1660
|
withLiveQuery: parseFlag(argv, "--with-livequery"),
|
|
@@ -1358,7 +1828,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1358
1828
|
case "test": {
|
|
1359
1829
|
const subcommand = rest[0] as TestSubcommand | undefined;
|
|
1360
1830
|
if (!subcommand || !TEST_SUBCOMMANDS.includes(subcommand)) {
|
|
1361
|
-
errors.push("forge test requires subcommand: plan, run, or
|
|
1831
|
+
errors.push("forge test requires subcommand: plan, run, explain, or authz");
|
|
1362
1832
|
return { command: null, workspaceRoot, errors };
|
|
1363
1833
|
}
|
|
1364
1834
|
const timeoutRaw = parseOptionValue(argv, "--timeout-ms");
|
|
@@ -1377,7 +1847,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1377
1847
|
workspaceRoot,
|
|
1378
1848
|
json: parseFlag(argv, "--json"),
|
|
1379
1849
|
write: parseFlag(argv, "--write"),
|
|
1380
|
-
changed: parseFlag(argv, "--changed") || (!parseFlag(argv, "--staged") && !parseOptionValue(argv, "--since") && !parseOptionValue(argv, "--feature") && !parseOptionValue(argv, "--refactor") && !parseOptionValue(argv, "--upgrade") && !parseOptionValue(argv, "--plan") && subcommand !== "explain"),
|
|
1850
|
+
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"),
|
|
1381
1851
|
staged: parseFlag(argv, "--staged"),
|
|
1382
1852
|
since: parseOptionValue(argv, "--since"),
|
|
1383
1853
|
featureId: parseOptionValue(argv, "--feature"),
|
|
@@ -1391,6 +1861,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1391
1861
|
bail: parseFlag(argv, "--bail"),
|
|
1392
1862
|
report: parseOptionValue(argv, "--report"),
|
|
1393
1863
|
timeoutMs: timeoutMs ? Math.floor(timeoutMs) : undefined,
|
|
1864
|
+
tenant: parseOptionValue(argv, "--tenant") ?? "acme",
|
|
1865
|
+
otherTenant: parseOptionValue(argv, "--other-tenant") ?? "globex",
|
|
1394
1866
|
},
|
|
1395
1867
|
},
|
|
1396
1868
|
workspaceRoot,
|
|
@@ -1463,6 +1935,218 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1463
1935
|
errors,
|
|
1464
1936
|
};
|
|
1465
1937
|
}
|
|
1938
|
+
case "bench": {
|
|
1939
|
+
const subcommand = rest[0] as BenchSubcommand | undefined;
|
|
1940
|
+
if (!subcommand || !BENCH_SUBCOMMANDS.includes(subcommand)) {
|
|
1941
|
+
errors.push("forge bench requires subcommand: compiler");
|
|
1942
|
+
return { command: null, workspaceRoot, errors };
|
|
1943
|
+
}
|
|
1944
|
+
const iterationsRaw = parseOptionValue(argv, "--iterations");
|
|
1945
|
+
const warmupsRaw = parseOptionValue(argv, "--warmups");
|
|
1946
|
+
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
1947
|
+
const iterations = iterationsRaw !== undefined ? Number(iterationsRaw) : 5;
|
|
1948
|
+
const warmups = warmupsRaw !== undefined ? Number(warmupsRaw) : 1;
|
|
1949
|
+
const concurrency = concurrencyRaw !== undefined ? Number(concurrencyRaw) : 4;
|
|
1950
|
+
if (!Number.isFinite(iterations) || iterations < 1) {
|
|
1951
|
+
errors.push("--iterations must be a number >= 1");
|
|
1952
|
+
}
|
|
1953
|
+
if (!Number.isFinite(warmups) || warmups < 0) {
|
|
1954
|
+
errors.push("--warmups must be a number >= 0");
|
|
1955
|
+
}
|
|
1956
|
+
if (!Number.isFinite(concurrency) || concurrency < 1) {
|
|
1957
|
+
errors.push("--concurrency must be a number >= 1");
|
|
1958
|
+
}
|
|
1959
|
+
return {
|
|
1960
|
+
command: {
|
|
1961
|
+
kind: "bench",
|
|
1962
|
+
options: {
|
|
1963
|
+
subcommand,
|
|
1964
|
+
workspaceRoot,
|
|
1965
|
+
json: parseFlag(argv, "--json"),
|
|
1966
|
+
iterations: Math.floor(iterations),
|
|
1967
|
+
warmups: Math.floor(warmups),
|
|
1968
|
+
concurrency: Math.floor(concurrency),
|
|
1969
|
+
},
|
|
1970
|
+
},
|
|
1971
|
+
workspaceRoot,
|
|
1972
|
+
errors,
|
|
1973
|
+
};
|
|
1974
|
+
}
|
|
1975
|
+
case "cair": {
|
|
1976
|
+
const subcommand = rest[0] as CairSubcommand | undefined;
|
|
1977
|
+
if (!subcommand || !CAIR_SUBCOMMANDS.includes(subcommand)) {
|
|
1978
|
+
errors.push("forge cair requires subcommand: snapshot, query, or action");
|
|
1979
|
+
return { command: null, workspaceRoot, errors };
|
|
1980
|
+
}
|
|
1981
|
+
const formatRaw = parseOptionValue(argv, "--format");
|
|
1982
|
+
if (formatRaw !== undefined && formatRaw !== "text" && formatRaw !== "json") {
|
|
1983
|
+
errors.push("--format must be text or json");
|
|
1984
|
+
}
|
|
1985
|
+
const query = subcommand === "query" ? rest.slice(1).join(" ").trim() : undefined;
|
|
1986
|
+
if (subcommand === "query" && !query) {
|
|
1987
|
+
errors.push("forge cair query requires a CAIR query, for example: forge cair query \"Q STATUS\"");
|
|
1988
|
+
}
|
|
1989
|
+
const inputPath = parseOptionValue(argv, "--input");
|
|
1990
|
+
const action = subcommand === "action"
|
|
1991
|
+
? rest.slice(1).filter((part, index, parts) => {
|
|
1992
|
+
const previous = parts[index - 1];
|
|
1993
|
+
if (part === "--dry-run" || part === "--plan" || part === "--json" || part === "--include-generated") {
|
|
1994
|
+
return false;
|
|
1995
|
+
}
|
|
1996
|
+
if (part === "--format" || part === "--input") {
|
|
1997
|
+
return false;
|
|
1998
|
+
}
|
|
1999
|
+
if (previous === "--format" || previous === "--input") {
|
|
2000
|
+
return false;
|
|
2001
|
+
}
|
|
2002
|
+
return true;
|
|
2003
|
+
}).join(" ").trim()
|
|
2004
|
+
: undefined;
|
|
2005
|
+
if (subcommand === "action" && !action && !inputPath) {
|
|
2006
|
+
errors.push("forge cair action requires a CAIR action, for example: forge cair action \"A CREATE.FILE path=src/example.ts\"");
|
|
2007
|
+
}
|
|
2008
|
+
return {
|
|
2009
|
+
command: {
|
|
2010
|
+
kind: "cair",
|
|
2011
|
+
options: {
|
|
2012
|
+
subcommand,
|
|
2013
|
+
workspaceRoot,
|
|
2014
|
+
json: parseFlag(argv, "--json"),
|
|
2015
|
+
format: formatRaw === "json" ? "json" : "text",
|
|
2016
|
+
...(query ? { query } : {}),
|
|
2017
|
+
...(action ? { action } : {}),
|
|
2018
|
+
...(inputPath ? { inputPath } : {}),
|
|
2019
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2020
|
+
plan: parseFlag(argv, "--plan"),
|
|
2021
|
+
allowGenerated: parseFlag(argv, "--include-generated"),
|
|
2022
|
+
},
|
|
2023
|
+
},
|
|
2024
|
+
workspaceRoot,
|
|
2025
|
+
errors,
|
|
2026
|
+
};
|
|
2027
|
+
}
|
|
2028
|
+
case "status":
|
|
2029
|
+
return {
|
|
2030
|
+
command: {
|
|
2031
|
+
kind: "status",
|
|
2032
|
+
json: parseFlag(argv, "--json"),
|
|
2033
|
+
workspaceRoot,
|
|
2034
|
+
},
|
|
2035
|
+
workspaceRoot,
|
|
2036
|
+
errors,
|
|
2037
|
+
};
|
|
2038
|
+
case "changed":
|
|
2039
|
+
return {
|
|
2040
|
+
command: {
|
|
2041
|
+
kind: "changed",
|
|
2042
|
+
json: parseFlag(argv, "--json"),
|
|
2043
|
+
authoredOnly: parseFlag(argv, "--authored"),
|
|
2044
|
+
reviewOnly: parseFlag(argv, "--review"),
|
|
2045
|
+
commitReady: parseFlag(argv, "--commit-ready"),
|
|
2046
|
+
workspaceRoot,
|
|
2047
|
+
},
|
|
2048
|
+
workspaceRoot,
|
|
2049
|
+
errors,
|
|
2050
|
+
};
|
|
2051
|
+
case "diff": {
|
|
2052
|
+
const target = (rest[0] ?? "authored") as "authored" | "generated" | "full";
|
|
2053
|
+
if (!["authored", "generated", "full"].includes(target)) {
|
|
2054
|
+
errors.push("forge diff requires target: authored, generated, or full");
|
|
2055
|
+
return { command: null, workspaceRoot, errors };
|
|
2056
|
+
}
|
|
2057
|
+
return {
|
|
2058
|
+
command: {
|
|
2059
|
+
kind: "diff",
|
|
2060
|
+
target,
|
|
2061
|
+
json: parseFlag(argv, "--json"),
|
|
2062
|
+
workspaceRoot,
|
|
2063
|
+
},
|
|
2064
|
+
workspaceRoot,
|
|
2065
|
+
errors,
|
|
2066
|
+
};
|
|
2067
|
+
}
|
|
2068
|
+
case "handoff":
|
|
2069
|
+
return {
|
|
2070
|
+
command: {
|
|
2071
|
+
kind: "handoff",
|
|
2072
|
+
json: parseFlag(argv, "--json"),
|
|
2073
|
+
commitReady: parseFlag(argv, "--commit-ready"),
|
|
2074
|
+
workspaceRoot,
|
|
2075
|
+
},
|
|
2076
|
+
workspaceRoot,
|
|
2077
|
+
errors,
|
|
2078
|
+
};
|
|
2079
|
+
case "studio": {
|
|
2080
|
+
const subcommand = rest[0];
|
|
2081
|
+
if (
|
|
2082
|
+
subcommand !== "attach" &&
|
|
2083
|
+
subcommand !== "snapshot" &&
|
|
2084
|
+
subcommand !== "watch" &&
|
|
2085
|
+
subcommand !== "open" &&
|
|
2086
|
+
subcommand !== "doctor" &&
|
|
2087
|
+
subcommand !== "bridge" &&
|
|
2088
|
+
subcommand !== "codex-server"
|
|
2089
|
+
) {
|
|
2090
|
+
errors.push("forge studio requires subcommand: attach, snapshot, watch, open, doctor, bridge, or codex-server");
|
|
2091
|
+
return { command: null, workspaceRoot, errors };
|
|
2092
|
+
}
|
|
2093
|
+
const previewPortRaw = parseOptionValue(argv, "--preview-port");
|
|
2094
|
+
const previewPort = previewPortRaw !== undefined ? Number(previewPortRaw) : undefined;
|
|
2095
|
+
if (
|
|
2096
|
+
previewPortRaw !== undefined &&
|
|
2097
|
+
(!Number.isInteger(previewPort) || previewPort! < 1)
|
|
2098
|
+
) {
|
|
2099
|
+
errors.push("--preview-port must be an integer >= 1");
|
|
2100
|
+
}
|
|
2101
|
+
const intervalRaw = parseOptionValue(argv, "--interval-ms");
|
|
2102
|
+
const intervalMs = intervalRaw !== undefined ? Number(intervalRaw) : undefined;
|
|
2103
|
+
if (intervalRaw !== undefined && (!Number.isFinite(intervalMs) || intervalMs! < 1000)) {
|
|
2104
|
+
errors.push("--interval-ms must be a number >= 1000");
|
|
2105
|
+
}
|
|
2106
|
+
const targets = parseOptionValues(argv, "--target");
|
|
2107
|
+
const ignoredOptionValues = new Set(
|
|
2108
|
+
[
|
|
2109
|
+
...targets,
|
|
2110
|
+
parseOptionValue(argv, "--preview-url"),
|
|
2111
|
+
parseOptionValue(argv, "--studio-url"),
|
|
2112
|
+
parseOptionValue(argv, "--workspace-id"),
|
|
2113
|
+
parseOptionValue(argv, "--tenant-id"),
|
|
2114
|
+
parseOptionValue(argv, "--user-id"),
|
|
2115
|
+
parseOptionValue(argv, "--role"),
|
|
2116
|
+
previewPortRaw,
|
|
2117
|
+
intervalRaw,
|
|
2118
|
+
].filter((value): value is string => typeof value === "string"),
|
|
2119
|
+
);
|
|
2120
|
+
const studioPath = rest.slice(1).find((item) => !ignoredOptionValues.has(item));
|
|
2121
|
+
return {
|
|
2122
|
+
command: {
|
|
2123
|
+
kind: "studio",
|
|
2124
|
+
subcommand,
|
|
2125
|
+
path: studioPath,
|
|
2126
|
+
previewUrl: parseOptionValue(argv, "--preview-url"),
|
|
2127
|
+
previewPort: previewPort ? Math.floor(previewPort) : undefined,
|
|
2128
|
+
studioUrl: parseOptionValue(argv, "--studio-url"),
|
|
2129
|
+
intervalMs: intervalMs ? Math.floor(intervalMs) : undefined,
|
|
2130
|
+
once: parseFlag(argv, "--once"),
|
|
2131
|
+
workspaceId: parseOptionValue(argv, "--workspace-id"),
|
|
2132
|
+
tenantId: parseOptionValue(argv, "--tenant-id"),
|
|
2133
|
+
userId: parseOptionValue(argv, "--user-id"),
|
|
2134
|
+
role: parseOptionValue(argv, "--role"),
|
|
2135
|
+
targets: targets.length > 0 ? targets : ["codex"],
|
|
2136
|
+
install: parseFlag(argv, "--install"),
|
|
2137
|
+
start: !parseFlag(argv, "--no-start"),
|
|
2138
|
+
bridge: !parseFlag(argv, "--no-bridge"),
|
|
2139
|
+
writeSchemas: parseFlag(argv, "--write"),
|
|
2140
|
+
probeAppServer: parseFlag(argv, "--probe") || parseFlag(argv, "--probe-codex-server"),
|
|
2141
|
+
json: parseFlag(argv, "--json"),
|
|
2142
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2143
|
+
force: parseFlag(argv, "--force"),
|
|
2144
|
+
workspaceRoot,
|
|
2145
|
+
},
|
|
2146
|
+
workspaceRoot,
|
|
2147
|
+
errors,
|
|
2148
|
+
};
|
|
2149
|
+
}
|
|
1466
2150
|
case "generate": {
|
|
1467
2151
|
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
1468
2152
|
const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
|
|
@@ -1476,30 +2160,189 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1476
2160
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
1477
2161
|
json: parseFlag(argv, "--json"),
|
|
1478
2162
|
concurrency: Math.max(1, Math.floor(concurrency || 4)),
|
|
2163
|
+
workspaceRoot,
|
|
2164
|
+
},
|
|
2165
|
+
workspaceRoot,
|
|
2166
|
+
errors,
|
|
2167
|
+
};
|
|
2168
|
+
}
|
|
2169
|
+
case "delta": {
|
|
2170
|
+
const subcommand = rest[0];
|
|
2171
|
+
if (subcommand !== "status" && subcommand !== "repair" && subcommand !== "compact" && subcommand !== "prune" && subcommand !== "export") {
|
|
2172
|
+
errors.push("forge delta requires subcommand: status, repair, compact, prune, or export");
|
|
2173
|
+
return { command: null, workspaceRoot, errors };
|
|
2174
|
+
}
|
|
2175
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2176
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2177
|
+
return {
|
|
2178
|
+
command: {
|
|
2179
|
+
kind: "delta",
|
|
2180
|
+
subcommand,
|
|
2181
|
+
json: parseFlag(argv, "--json"),
|
|
2182
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2183
|
+
yes: parseFlag(argv, "--yes"),
|
|
2184
|
+
verbose: parseFlag(argv, "--verbose"),
|
|
2185
|
+
olderThan: parseOptionValue(argv, "--older-than"),
|
|
2186
|
+
output: parseOptionValue(argv, "--output"),
|
|
2187
|
+
limit: Number.isFinite(limit) ? limit : undefined,
|
|
2188
|
+
redacted: parseFlag(argv, "--redacted"),
|
|
2189
|
+
workspaceRoot,
|
|
2190
|
+
},
|
|
2191
|
+
workspaceRoot,
|
|
2192
|
+
errors,
|
|
2193
|
+
};
|
|
2194
|
+
}
|
|
2195
|
+
case "session": {
|
|
2196
|
+
const subcommand = rest[0];
|
|
2197
|
+
if (subcommand !== "list" && subcommand !== "show" && subcommand !== "rename" && subcommand !== "merge" && subcommand !== "split" && subcommand !== "detach") {
|
|
2198
|
+
errors.push("forge session requires subcommand: list, show, rename, merge, split, or detach");
|
|
2199
|
+
return { command: null, workspaceRoot, errors };
|
|
2200
|
+
}
|
|
2201
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2202
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2203
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
2204
|
+
errors.push("--limit must be a number >= 1");
|
|
2205
|
+
}
|
|
2206
|
+
const sessionId = rest[1];
|
|
2207
|
+
return {
|
|
2208
|
+
command: {
|
|
2209
|
+
kind: "session",
|
|
2210
|
+
subcommand,
|
|
2211
|
+
sessionId: subcommand === "detach" ? undefined : sessionId,
|
|
2212
|
+
sourceSessionId: subcommand === "merge" ? rest[2] : undefined,
|
|
2213
|
+
operationId: subcommand === "split" ? rest[2] : subcommand === "detach" ? rest[1] : undefined,
|
|
2214
|
+
title: subcommand === "rename" ? rest.slice(2).join(" ") : undefined,
|
|
2215
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
2216
|
+
json: parseFlag(argv, "--json"),
|
|
2217
|
+
workspaceRoot,
|
|
2218
|
+
},
|
|
2219
|
+
workspaceRoot,
|
|
2220
|
+
errors,
|
|
2221
|
+
};
|
|
2222
|
+
}
|
|
2223
|
+
case "timeline": {
|
|
2224
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
2225
|
+
const kindFilter = parseOptionValue(argv, "--kind");
|
|
2226
|
+
const sessionId = parseOptionValue(argv, "--session");
|
|
2227
|
+
const rebuild = rest[0] === "rebuild";
|
|
2228
|
+
const optionValues = new Set([limitRaw, kindFilter, sessionId].filter((value): value is string => typeof value === "string"));
|
|
2229
|
+
const target = rebuild
|
|
2230
|
+
? undefined
|
|
2231
|
+
: rest.find((item) => !item.startsWith("--") && !optionValues.has(item));
|
|
2232
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
2233
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
2234
|
+
errors.push("--limit must be a number >= 1");
|
|
2235
|
+
}
|
|
2236
|
+
return {
|
|
2237
|
+
command: {
|
|
2238
|
+
kind: "timeline",
|
|
2239
|
+
target,
|
|
2240
|
+
kindFilter,
|
|
2241
|
+
sessionId,
|
|
2242
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
2243
|
+
json: parseFlag(argv, "--json"),
|
|
2244
|
+
rebuild,
|
|
2245
|
+
forAgent: parseFlag(argv, "--for-agent"),
|
|
2246
|
+
causal: parseFlag(argv, "--causal"),
|
|
2247
|
+
staleProofs: parseFlag(argv, "--stale-proofs"),
|
|
2248
|
+
workspaceRoot,
|
|
2249
|
+
},
|
|
2250
|
+
workspaceRoot,
|
|
2251
|
+
errors,
|
|
2252
|
+
};
|
|
2253
|
+
}
|
|
2254
|
+
case "explain": {
|
|
2255
|
+
const thing = rest[0] === "session" ? `session:${rest[1] ?? "current"}` : rest[0];
|
|
2256
|
+
if (!thing) {
|
|
2257
|
+
errors.push("forge explain requires a target");
|
|
2258
|
+
return { command: null, workspaceRoot, errors };
|
|
2259
|
+
}
|
|
2260
|
+
return {
|
|
2261
|
+
command: {
|
|
2262
|
+
kind: "explain",
|
|
2263
|
+
thing,
|
|
2264
|
+
json: parseFlag(argv, "--json"),
|
|
2265
|
+
workspaceRoot,
|
|
2266
|
+
},
|
|
2267
|
+
workspaceRoot,
|
|
2268
|
+
errors,
|
|
2269
|
+
};
|
|
2270
|
+
}
|
|
2271
|
+
case "manifest": {
|
|
2272
|
+
const subcommand = rest[0];
|
|
2273
|
+
const path = rest[1];
|
|
2274
|
+
if (subcommand !== "validate" && subcommand !== "import") {
|
|
2275
|
+
errors.push("forge manifest requires subcommand validate or import");
|
|
2276
|
+
return { command: null, workspaceRoot, errors };
|
|
2277
|
+
}
|
|
2278
|
+
if (!path) {
|
|
2279
|
+
errors.push(`forge manifest ${subcommand} requires a manifest file path`);
|
|
2280
|
+
return { command: null, workspaceRoot, errors };
|
|
2281
|
+
}
|
|
2282
|
+
return {
|
|
2283
|
+
command: {
|
|
2284
|
+
kind: "manifest",
|
|
2285
|
+
subcommand,
|
|
2286
|
+
path,
|
|
2287
|
+
json: parseFlag(argv, "--json"),
|
|
2288
|
+
workspaceRoot,
|
|
2289
|
+
},
|
|
2290
|
+
workspaceRoot,
|
|
2291
|
+
errors,
|
|
2292
|
+
};
|
|
2293
|
+
}
|
|
2294
|
+
case "import": {
|
|
2295
|
+
const subcommand = rest[0];
|
|
2296
|
+
if (subcommand !== "analyze" && subcommand !== "inspect") {
|
|
2297
|
+
errors.push("forge import requires subcommand analyze or inspect");
|
|
2298
|
+
return { command: null, workspaceRoot, errors };
|
|
2299
|
+
}
|
|
2300
|
+
return {
|
|
2301
|
+
command: {
|
|
2302
|
+
kind: "import",
|
|
2303
|
+
options: {
|
|
2304
|
+
subcommand,
|
|
2305
|
+
json: parseFlag(argv, "--json"),
|
|
2306
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2307
|
+
workspaceRoot,
|
|
2308
|
+
entry: parseOptionValue(argv, "--entry"),
|
|
2309
|
+
target: parseOptionValue(argv, "--target"),
|
|
2310
|
+
},
|
|
1479
2311
|
},
|
|
1480
2312
|
workspaceRoot,
|
|
1481
2313
|
errors,
|
|
1482
2314
|
};
|
|
1483
2315
|
}
|
|
1484
2316
|
case "add": {
|
|
1485
|
-
const
|
|
2317
|
+
const subcommand = rest[0];
|
|
2318
|
+
const explicitMode =
|
|
2319
|
+
subcommand === "package"
|
|
2320
|
+
? "package"
|
|
2321
|
+
: subcommand === "integration" || subcommand === "auth"
|
|
2322
|
+
? "integration"
|
|
2323
|
+
: "auto";
|
|
2324
|
+
const alias = explicitMode === "auto" ? rest[0] : rest[1];
|
|
1486
2325
|
if (!alias) {
|
|
1487
|
-
errors.push(
|
|
2326
|
+
errors.push(
|
|
2327
|
+
explicitMode === "auto"
|
|
2328
|
+
? "forge add requires a package name or integration alias"
|
|
2329
|
+
: `forge add ${subcommand} requires a target`,
|
|
2330
|
+
);
|
|
1488
2331
|
return { command: null, workspaceRoot, errors };
|
|
1489
2332
|
}
|
|
1490
2333
|
return {
|
|
1491
2334
|
command: {
|
|
1492
2335
|
kind: "add",
|
|
1493
2336
|
alias,
|
|
1494
|
-
options: parseAddOptions(argv, workspaceRoot),
|
|
2337
|
+
options: parseAddOptions(argv, workspaceRoot, explicitMode),
|
|
1495
2338
|
},
|
|
1496
2339
|
workspaceRoot,
|
|
1497
2340
|
errors,
|
|
1498
2341
|
};
|
|
1499
2342
|
}
|
|
1500
2343
|
case "inspect": {
|
|
1501
|
-
const target = rest[0] as InspectTarget | undefined;
|
|
1502
|
-
if (!
|
|
2344
|
+
const target = (rest[0] as InspectTarget | undefined) ?? "summary";
|
|
2345
|
+
if (!INSPECT_TARGETS.includes(target)) {
|
|
1503
2346
|
errors.push(
|
|
1504
2347
|
`unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
|
|
1505
2348
|
);
|
|
@@ -1511,6 +2354,10 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1511
2354
|
target,
|
|
1512
2355
|
json: parseFlag(argv, "--json"),
|
|
1513
2356
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
2357
|
+
full: parseFlag(argv, "--full"),
|
|
2358
|
+
brief: parseFlag(argv, "--brief"),
|
|
2359
|
+
ergonomics: parseFlag(argv, "--ergonomics"),
|
|
2360
|
+
workspaceRoot,
|
|
1514
2361
|
},
|
|
1515
2362
|
workspaceRoot,
|
|
1516
2363
|
errors,
|
|
@@ -1531,12 +2378,58 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1531
2378
|
{
|
|
1532
2379
|
const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
|
|
1533
2380
|
const scriptTimeoutMs = scriptTimeoutRaw ? Number(scriptTimeoutRaw) : undefined;
|
|
2381
|
+
const testJobsRaw = parseOptionValue(argv, "--test-jobs");
|
|
2382
|
+
const testJobs = testJobsRaw ? Number(testJobsRaw) : undefined;
|
|
2383
|
+
const typechecker = parseOptionValue(argv, "--typechecker");
|
|
2384
|
+
const verifyOptionValues = new Set(
|
|
2385
|
+
[scriptTimeoutRaw, testJobsRaw, typechecker]
|
|
2386
|
+
.filter((value): value is string => typeof value === "string"),
|
|
2387
|
+
);
|
|
2388
|
+
const profileAlias = rest.find((item) => !verifyOptionValues.has(item));
|
|
2389
|
+
const verifyProfiles = new Set([
|
|
2390
|
+
"quick",
|
|
2391
|
+
"smoke",
|
|
2392
|
+
"agent",
|
|
2393
|
+
"standard",
|
|
2394
|
+
"release",
|
|
2395
|
+
"strict",
|
|
2396
|
+
"changed",
|
|
2397
|
+
"framework",
|
|
2398
|
+
"internal",
|
|
2399
|
+
"maintainer",
|
|
2400
|
+
]);
|
|
2401
|
+
if (profileAlias && !verifyProfiles.has(profileAlias)) {
|
|
2402
|
+
errors.push(
|
|
2403
|
+
`unknown forge verify profile '${profileAlias}'; expected quick, smoke, agent, standard, release, strict, changed, framework, internal, or maintainer`,
|
|
2404
|
+
);
|
|
2405
|
+
}
|
|
2406
|
+
const internal =
|
|
2407
|
+
parseFlag(argv, "--internal") ||
|
|
2408
|
+
profileAlias === "framework" ||
|
|
2409
|
+
profileAlias === "internal" ||
|
|
2410
|
+
profileAlias === "maintainer";
|
|
1534
2411
|
if (
|
|
1535
2412
|
scriptTimeoutRaw !== undefined &&
|
|
1536
2413
|
(!Number.isFinite(scriptTimeoutMs) || scriptTimeoutMs! < 1)
|
|
1537
2414
|
) {
|
|
1538
2415
|
errors.push("--script-timeout-ms must be a number >= 1");
|
|
1539
2416
|
}
|
|
2417
|
+
if (
|
|
2418
|
+
testJobsRaw !== undefined &&
|
|
2419
|
+
(!Number.isInteger(testJobs) || testJobs! < 1)
|
|
2420
|
+
) {
|
|
2421
|
+
errors.push("--test-jobs must be an integer >= 1");
|
|
2422
|
+
}
|
|
2423
|
+
if (
|
|
2424
|
+
typechecker !== undefined &&
|
|
2425
|
+
typechecker !== "tsc" &&
|
|
2426
|
+
typechecker !== "native" &&
|
|
2427
|
+
typechecker !== "ts7" &&
|
|
2428
|
+
typechecker !== "tsgo" &&
|
|
2429
|
+
typechecker !== "auto"
|
|
2430
|
+
) {
|
|
2431
|
+
errors.push("--typechecker must be one of: tsc, native, ts7, tsgo, auto");
|
|
2432
|
+
}
|
|
1540
2433
|
return {
|
|
1541
2434
|
command: {
|
|
1542
2435
|
kind: "verify",
|
|
@@ -1546,12 +2439,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1546
2439
|
skipTests: parseFlag(argv, "--skip-tests"),
|
|
1547
2440
|
skipTypecheck: parseFlag(argv, "--skip-typecheck"),
|
|
1548
2441
|
skipEslint: parseFlag(argv, "--skip-eslint"),
|
|
1549
|
-
strict: parseFlag(argv, "--strict"),
|
|
1550
|
-
changed: parseFlag(argv, "--changed"),
|
|
1551
|
-
fast: parseFlag(argv, "--fast"),
|
|
1552
|
-
smoke: parseFlag(argv, "--smoke"),
|
|
1553
|
-
standard: parseFlag(argv, "--standard"),
|
|
2442
|
+
strict: internal || parseFlag(argv, "--strict") || profileAlias === "release" || profileAlias === "strict",
|
|
2443
|
+
changed: parseFlag(argv, "--changed") || profileAlias === "changed",
|
|
2444
|
+
fast: parseFlag(argv, "--fast") || profileAlias === "quick",
|
|
2445
|
+
smoke: parseFlag(argv, "--smoke") || profileAlias === "smoke",
|
|
2446
|
+
standard: parseFlag(argv, "--standard") || profileAlias === "agent" || profileAlias === "standard",
|
|
1554
2447
|
scriptTimeoutMs: scriptTimeoutMs ? Math.floor(scriptTimeoutMs) : undefined,
|
|
2448
|
+
testJobs: testJobs ? Math.floor(testJobs) : undefined,
|
|
2449
|
+
typechecker: typechecker as "tsc" | "native" | "ts7" | "tsgo" | "auto" | undefined,
|
|
2450
|
+
fullTests: parseFlag(argv, "--full"),
|
|
2451
|
+
testPlan: parseFlag(argv, "--test-plan"),
|
|
2452
|
+
internal,
|
|
1555
2453
|
},
|
|
1556
2454
|
},
|
|
1557
2455
|
workspaceRoot,
|
|
@@ -1595,6 +2493,15 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1595
2493
|
|
|
1596
2494
|
const name = rest[0];
|
|
1597
2495
|
const list = parseFlag(argv, "--list") || !name;
|
|
2496
|
+
const argsRaw = parseOptionValue(argv, "--args");
|
|
2497
|
+
let args: unknown = {};
|
|
2498
|
+
if (argsRaw !== undefined) {
|
|
2499
|
+
try {
|
|
2500
|
+
args = JSON.parse(argsRaw);
|
|
2501
|
+
} catch {
|
|
2502
|
+
errors.push("--args must be valid JSON");
|
|
2503
|
+
}
|
|
2504
|
+
}
|
|
1598
2505
|
return {
|
|
1599
2506
|
command: {
|
|
1600
2507
|
kind: "run",
|
|
@@ -1607,19 +2514,30 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1607
2514
|
role: parseOptionValue(argv, "--role"),
|
|
1608
2515
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
1609
2516
|
workspaceRoot,
|
|
2517
|
+
args,
|
|
1610
2518
|
},
|
|
1611
2519
|
workspaceRoot,
|
|
1612
2520
|
errors,
|
|
1613
2521
|
};
|
|
1614
2522
|
}
|
|
1615
2523
|
case "query": {
|
|
1616
|
-
const
|
|
2524
|
+
const requested = rest[0] as QuerySubcommand | undefined;
|
|
2525
|
+
const subcommand =
|
|
2526
|
+
!requested
|
|
2527
|
+
? "list"
|
|
2528
|
+
: ["list", "run"].includes(requested)
|
|
2529
|
+
? requested
|
|
2530
|
+
: "run";
|
|
1617
2531
|
if (!["list", "run"].includes(subcommand)) {
|
|
1618
2532
|
errors.push("forge query requires subcommand: list or run");
|
|
1619
2533
|
return { command: null, workspaceRoot, errors };
|
|
1620
2534
|
}
|
|
1621
2535
|
|
|
1622
|
-
const queryName = subcommand === "run"
|
|
2536
|
+
const queryName = subcommand === "run"
|
|
2537
|
+
? requested === "run"
|
|
2538
|
+
? rest[1]
|
|
2539
|
+
: rest[0]
|
|
2540
|
+
: undefined;
|
|
1623
2541
|
if (subcommand === "run" && !queryName) {
|
|
1624
2542
|
errors.push("forge query run requires a query name");
|
|
1625
2543
|
}
|
|
@@ -1692,6 +2610,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1692
2610
|
};
|
|
1693
2611
|
}
|
|
1694
2612
|
case "dev": {
|
|
2613
|
+
const lifecycle = rest[0] === "status" || rest[0] === "stop" ? rest[0] : undefined;
|
|
1695
2614
|
const portRaw = parseOptionValue(argv, "--port");
|
|
1696
2615
|
const port = portRaw !== undefined ? Number(portRaw) : undefined;
|
|
1697
2616
|
if (portRaw !== undefined && (!Number.isFinite(port) || port! < 0)) {
|
|
@@ -1728,6 +2647,9 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1728
2647
|
.map((value) => value.trim())
|
|
1729
2648
|
.filter(Boolean),
|
|
1730
2649
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
2650
|
+
skipStartupConsole: parseFlag(argv, "--skip-startup-console"),
|
|
2651
|
+
detach: parseFlag(argv, "--detach"),
|
|
2652
|
+
lifecycle,
|
|
1731
2653
|
workspaceRoot,
|
|
1732
2654
|
},
|
|
1733
2655
|
workspaceRoot,
|
|
@@ -1736,16 +2658,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1736
2658
|
}
|
|
1737
2659
|
case "db": {
|
|
1738
2660
|
const subcommand = rest[0] as DbSubcommand | undefined;
|
|
1739
|
-
if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
|
|
1740
|
-
errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
|
|
2661
|
+
if (!subcommand || !["diff", "migrate", "reset", "status", "doctor", "repair", "rls-check"].includes(subcommand)) {
|
|
2662
|
+
errors.push("forge db requires subcommand: diff, migrate, reset, status, doctor, repair, or rls-check");
|
|
1741
2663
|
return { command: null, workspaceRoot, errors };
|
|
1742
2664
|
}
|
|
1743
2665
|
return {
|
|
1744
2666
|
command: {
|
|
1745
2667
|
kind: "db",
|
|
1746
2668
|
subcommand,
|
|
1747
|
-
db: parseAdapterKind(parseOptionValue(argv, "--db")),
|
|
2669
|
+
db: parseAdapterKind(parseOptionValue(argv, "--adapter") ?? parseOptionValue(argv, "--db")),
|
|
1748
2670
|
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
2671
|
+
local: parseFlag(argv, "--local"),
|
|
1749
2672
|
json: parseFlag(argv, "--json"),
|
|
1750
2673
|
workspaceRoot,
|
|
1751
2674
|
},
|
|
@@ -1998,6 +2921,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1998
2921
|
model: parseOptionValue(argv, "--model"),
|
|
1999
2922
|
prompt: parseOptionValue(argv, "--prompt"),
|
|
2000
2923
|
mock: parseFlag(argv, "--mock"),
|
|
2924
|
+
modelLevel: parseFlag(argv, "--model-level"),
|
|
2925
|
+
live: parseFlag(argv, "--live"),
|
|
2001
2926
|
traceId,
|
|
2002
2927
|
db: parsePersistentDbKind(parseOptionValue(argv, "--db")),
|
|
2003
2928
|
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
@@ -2015,8 +2940,13 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
2015
2940
|
|
|
2016
2941
|
export function hasUnknownOption(argv: string[]): string | null {
|
|
2017
2942
|
const known = new Set([
|
|
2943
|
+
"--version",
|
|
2018
2944
|
"--check",
|
|
2019
2945
|
"--json",
|
|
2946
|
+
"--human",
|
|
2947
|
+
"--for-agent",
|
|
2948
|
+
"--causal",
|
|
2949
|
+
"--stale-proofs",
|
|
2020
2950
|
"--dry-run",
|
|
2021
2951
|
"--plan",
|
|
2022
2952
|
"--staged",
|
|
@@ -2047,15 +2977,23 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2047
2977
|
"--smoke",
|
|
2048
2978
|
"--standard",
|
|
2049
2979
|
"--script-timeout-ms",
|
|
2980
|
+
"--test-plan",
|
|
2981
|
+
"--typechecker",
|
|
2050
2982
|
"--timeout-ms",
|
|
2051
2983
|
"--apply",
|
|
2052
2984
|
"--runtime-inspect",
|
|
2053
2985
|
"--allow-scripts",
|
|
2986
|
+
"--frontend",
|
|
2987
|
+
"--backend",
|
|
2054
2988
|
"--yes",
|
|
2055
2989
|
"--force",
|
|
2056
2990
|
"--no-generate",
|
|
2057
2991
|
"--no-verify",
|
|
2058
2992
|
"--keep-failed",
|
|
2993
|
+
"--keep",
|
|
2994
|
+
"--runtime-probes",
|
|
2995
|
+
"--auth-probes",
|
|
2996
|
+
"--write-report",
|
|
2059
2997
|
"--tenant-scoped",
|
|
2060
2998
|
"--field",
|
|
2061
2999
|
"--fields",
|
|
@@ -2068,6 +3006,11 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2068
3006
|
"--policy",
|
|
2069
3007
|
"--emit",
|
|
2070
3008
|
"--event",
|
|
3009
|
+
"--entry",
|
|
3010
|
+
"--change",
|
|
3011
|
+
"--proof",
|
|
3012
|
+
"--handoff",
|
|
3013
|
+
"--current",
|
|
2071
3014
|
"--trigger",
|
|
2072
3015
|
"--component",
|
|
2073
3016
|
"--framework",
|
|
@@ -2095,6 +3038,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2095
3038
|
"--video",
|
|
2096
3039
|
"--base-url",
|
|
2097
3040
|
"--runtime-url",
|
|
3041
|
+
"--workspace",
|
|
2098
3042
|
"--reuse-servers",
|
|
2099
3043
|
"--start-servers",
|
|
2100
3044
|
"--scenario",
|
|
@@ -2103,10 +3047,13 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2103
3047
|
"--timeout",
|
|
2104
3048
|
"--name",
|
|
2105
3049
|
"--auth-token",
|
|
3050
|
+
"--auth",
|
|
2106
3051
|
"--update",
|
|
2107
3052
|
"--allow-high-risk",
|
|
2108
3053
|
"--to",
|
|
2109
3054
|
"--changed",
|
|
3055
|
+
"--authored",
|
|
3056
|
+
"--review",
|
|
2110
3057
|
"--env",
|
|
2111
3058
|
"--input",
|
|
2112
3059
|
"--provider",
|
|
@@ -2114,10 +3061,17 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2114
3061
|
"--release",
|
|
2115
3062
|
"--allow-dirty",
|
|
2116
3063
|
"--allow-public-sourcemaps",
|
|
3064
|
+
"--allow-missing-local-release",
|
|
3065
|
+
"--prepared-only",
|
|
3066
|
+
"--build",
|
|
3067
|
+
"--install-venv",
|
|
2117
3068
|
"--with-release",
|
|
2118
3069
|
"--concurrency",
|
|
3070
|
+
"--iterations",
|
|
3071
|
+
"--warmups",
|
|
2119
3072
|
"--sandbox-backend",
|
|
2120
3073
|
"--skip-tests",
|
|
3074
|
+
"--test-jobs",
|
|
2121
3075
|
"--skip-typecheck",
|
|
2122
3076
|
"--skip-eslint",
|
|
2123
3077
|
"--mock",
|
|
@@ -2127,11 +3081,19 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2127
3081
|
"--watch",
|
|
2128
3082
|
"--no-watch",
|
|
2129
3083
|
"--db",
|
|
3084
|
+
"--adapter",
|
|
3085
|
+
"--local",
|
|
2130
3086
|
"--database-url",
|
|
2131
3087
|
"--worker",
|
|
2132
3088
|
"--no-worker",
|
|
3089
|
+
"--no-start",
|
|
3090
|
+
"--no-bridge",
|
|
3091
|
+
"--probe",
|
|
3092
|
+
"--probe-codex-server",
|
|
2133
3093
|
"--once",
|
|
2134
3094
|
"--limit",
|
|
3095
|
+
"--kind",
|
|
3096
|
+
"--session",
|
|
2135
3097
|
"--input",
|
|
2136
3098
|
"--args",
|
|
2137
3099
|
"--step",
|
|
@@ -2140,12 +3102,18 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2140
3102
|
"--telemetry",
|
|
2141
3103
|
"--user-id",
|
|
2142
3104
|
"--tenant-id",
|
|
3105
|
+
"--tenant",
|
|
3106
|
+
"--other-tenant",
|
|
2143
3107
|
"--role",
|
|
2144
3108
|
"--strict-policies",
|
|
2145
3109
|
"--strict",
|
|
2146
3110
|
"--strict-secrets",
|
|
3111
|
+
"--internal",
|
|
2147
3112
|
"--env-file",
|
|
3113
|
+
"--skip-startup-console",
|
|
2148
3114
|
"--redacted",
|
|
3115
|
+
"--older-than",
|
|
3116
|
+
"--output",
|
|
2149
3117
|
"--mock-ai",
|
|
2150
3118
|
"--ai",
|
|
2151
3119
|
"--provider",
|
|
@@ -2153,12 +3121,19 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2153
3121
|
"--prompt",
|
|
2154
3122
|
"--url",
|
|
2155
3123
|
"--template",
|
|
3124
|
+
"--templates",
|
|
2156
3125
|
"--package-manager",
|
|
3126
|
+
"--package-managers",
|
|
2157
3127
|
"--forge-spec",
|
|
2158
3128
|
"--local-forge",
|
|
2159
3129
|
"--install",
|
|
2160
3130
|
"--no-install",
|
|
3131
|
+
"--git",
|
|
2161
3132
|
"--no-git",
|
|
3133
|
+
"--field-test",
|
|
3134
|
+
"--commit-ready",
|
|
3135
|
+
"--detach",
|
|
3136
|
+
"--ergonomics",
|
|
2162
3137
|
"--with-web",
|
|
2163
3138
|
"--no-web",
|
|
2164
3139
|
"--api-only",
|
|
@@ -2167,12 +3142,29 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2167
3142
|
"--postgres-version",
|
|
2168
3143
|
"--runtime-port",
|
|
2169
3144
|
"--web-port",
|
|
3145
|
+
"--preview-port",
|
|
3146
|
+
"--preview-url",
|
|
3147
|
+
"--studio-url",
|
|
3148
|
+
"--interval-ms",
|
|
3149
|
+
"--workspace-id",
|
|
2170
3150
|
"--poll-interval",
|
|
2171
3151
|
"--allow-dev-auth",
|
|
2172
3152
|
"--token",
|
|
3153
|
+
"--prod",
|
|
3154
|
+
"--production",
|
|
3155
|
+
"--scenario",
|
|
3156
|
+
"--reason",
|
|
2173
3157
|
"--no-preserve-user-sections",
|
|
2174
3158
|
"--no-skills",
|
|
2175
3159
|
"--no-rules",
|
|
3160
|
+
"--full",
|
|
3161
|
+
"--brief",
|
|
3162
|
+
"--verbose",
|
|
3163
|
+
"--run-tests",
|
|
3164
|
+
"--model-level",
|
|
3165
|
+
"--live",
|
|
3166
|
+
"--no-delta",
|
|
3167
|
+
"--format",
|
|
2176
3168
|
]);
|
|
2177
3169
|
|
|
2178
3170
|
for (let index = 0; index < argv.length; index++) {
|
|
@@ -2183,6 +3175,8 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2183
3175
|
if (known.has(arg)) {
|
|
2184
3176
|
if (
|
|
2185
3177
|
arg === "--concurrency" ||
|
|
3178
|
+
arg === "--iterations" ||
|
|
3179
|
+
arg === "--warmups" ||
|
|
2186
3180
|
arg === "--field" ||
|
|
2187
3181
|
arg === "--fields" ||
|
|
2188
3182
|
arg === "--type" ||
|
|
@@ -2193,6 +3187,9 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2193
3187
|
arg === "--policy" ||
|
|
2194
3188
|
arg === "--emit" ||
|
|
2195
3189
|
arg === "--event" ||
|
|
3190
|
+
arg === "--entry" ||
|
|
3191
|
+
arg === "--change" ||
|
|
3192
|
+
arg === "--proof" ||
|
|
2196
3193
|
arg === "--trigger" ||
|
|
2197
3194
|
arg === "--component" ||
|
|
2198
3195
|
arg === "--package" ||
|
|
@@ -2223,24 +3220,37 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2223
3220
|
arg === "--video" ||
|
|
2224
3221
|
arg === "--base-url" ||
|
|
2225
3222
|
arg === "--runtime-url" ||
|
|
3223
|
+
arg === "--workspace" ||
|
|
2226
3224
|
arg === "--scenario" ||
|
|
2227
3225
|
arg === "--timeout" ||
|
|
2228
3226
|
arg === "--timeout-ms" ||
|
|
3227
|
+
arg === "--test-jobs" ||
|
|
3228
|
+
arg === "--typechecker" ||
|
|
2229
3229
|
arg === "--name" ||
|
|
3230
|
+
arg === "--reason" ||
|
|
2230
3231
|
arg === "--auth-token" ||
|
|
3232
|
+
arg === "--auth" ||
|
|
2231
3233
|
arg === "--sandbox-backend" ||
|
|
2232
3234
|
arg === "--port" ||
|
|
2233
3235
|
arg === "--host" ||
|
|
2234
3236
|
arg === "--db" ||
|
|
3237
|
+
arg === "--adapter" ||
|
|
2235
3238
|
arg === "--database-url" ||
|
|
2236
3239
|
arg === "--limit" ||
|
|
3240
|
+
arg === "--older-than" ||
|
|
3241
|
+
arg === "--output" ||
|
|
3242
|
+
arg === "--kind" ||
|
|
3243
|
+
arg === "--session" ||
|
|
2237
3244
|
arg === "--input" ||
|
|
2238
3245
|
arg === "--args" ||
|
|
2239
3246
|
arg === "--step" ||
|
|
2240
3247
|
arg === "--sink" ||
|
|
2241
3248
|
arg === "--file" ||
|
|
3249
|
+
arg === "--write-report" ||
|
|
2242
3250
|
arg === "--telemetry" ||
|
|
2243
3251
|
arg === "--user-id" ||
|
|
3252
|
+
arg === "--tenant" ||
|
|
3253
|
+
arg === "--other-tenant" ||
|
|
2244
3254
|
arg === "--tenant-id" ||
|
|
2245
3255
|
arg === "--role" ||
|
|
2246
3256
|
arg === "--strict-policies" ||
|
|
@@ -2249,6 +3259,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2249
3259
|
arg === "--provider" ||
|
|
2250
3260
|
arg === "--model" ||
|
|
2251
3261
|
arg === "--prompt" ||
|
|
3262
|
+
arg === "--format" ||
|
|
2252
3263
|
arg === "--url" ||
|
|
2253
3264
|
arg === "--template" ||
|
|
2254
3265
|
arg === "--package-manager" ||
|
|
@@ -2256,6 +3267,11 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2256
3267
|
arg === "--postgres-version" ||
|
|
2257
3268
|
arg === "--runtime-port" ||
|
|
2258
3269
|
arg === "--web-port" ||
|
|
3270
|
+
arg === "--preview-port" ||
|
|
3271
|
+
arg === "--preview-url" ||
|
|
3272
|
+
arg === "--studio-url" ||
|
|
3273
|
+
arg === "--interval-ms" ||
|
|
3274
|
+
arg === "--workspace-id" ||
|
|
2259
3275
|
arg === "--poll-interval" ||
|
|
2260
3276
|
arg === "--token"
|
|
2261
3277
|
|| arg === "--to" ||
|