forgeos 0.1.0-alpha.2 → 0.1.0-alpha.21
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 +4 -0
- package/AGENTS.md +168 -81
- package/CHANGELOG.md +211 -0
- package/README.md +88 -14
- 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/target/classes/dev/forgeos/adapter/Auth.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
- package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java/target/maven-archiver/pom.properties +3 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -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/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
- package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
- package/bin/forge.mjs +18 -0
- package/docs/changelog.md +242 -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/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
- package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
- package/package.json +29 -7
- 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 +1511 -123
- package/src/forge/agent-adapters/types.ts +216 -1
- package/src/forge/agent-memory/bridge.ts +1245 -0
- package/src/forge/agent-memory/context-pack.ts +151 -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 +191 -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 +671 -3
- package/src/forge/cli/auth.ts +36 -1
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +300 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1285 -7
- package/src/forge/cli/db.ts +121 -2
- package/src/forge/cli/deps.ts +79 -12
- package/src/forge/cli/dev.ts +502 -38
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/handoff.ts +250 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/main.ts +49 -3
- package/src/forge/cli/new.ts +3 -1
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +290 -1
- package/src/forge/cli/parse.ts +770 -36
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/rls.ts +568 -17
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/secrets.ts +46 -1
- package/src/forge/cli/security.ts +381 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2163 -0
- package/src/forge/cli/verify.ts +1422 -32
- package/src/forge/compiler/agent-contract/build.ts +725 -41
- package/src/forge/compiler/agent-contract/types.ts +85 -0
- package/src/forge/compiler/ai-registry/build.ts +62 -1
- package/src/forge/compiler/ai-registry/constants.ts +1 -1
- package/src/forge/compiler/ai-registry/parse.ts +168 -5
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +68 -8
- package/src/forge/compiler/app-graph/extract.ts +107 -0
- package/src/forge/compiler/app-graph/forge-apis.ts +1 -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 +188 -13
- package/src/forge/compiler/data-graph/parse.ts +3 -3
- package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
- 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/dev-manifest/build.ts +3 -0
- package/src/forge/compiler/diagnostics/codes.ts +35 -0
- package/src/forge/compiler/diagnostics/create.ts +8 -3
- 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 +5 -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 +85 -13
- package/src/forge/compiler/integration/add.ts +498 -22
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/make-registry/build.ts +19 -7
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +78 -7
- 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 +101 -8
- package/src/forge/compiler/package-graph/compiler.ts +13 -3
- 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/policy-registry/build.ts +44 -1
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/ai-registry.ts +25 -1
- package/src/forge/compiler/types/app-graph.ts +9 -2
- package/src/forge/compiler/types/cli.ts +76 -1
- package/src/forge/compiler/types/dev-manifest.ts +3 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +126 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +13 -0
- package/src/forge/delta/recorder.ts +402 -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 +489 -0
- package/src/forge/delta/store.ts +2975 -0
- package/src/forge/delta/timeline.ts +104 -0
- package/src/forge/dev/server.ts +768 -15
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +233 -21
- package/src/forge/dev-console/types.ts +46 -1
- package/src/forge/impact/index.ts +46 -8
- package/src/forge/impact/types.ts +6 -0
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/index.ts +149 -6
- package/src/forge/make/templates.ts +343 -2
- package/src/forge/make/types.ts +3 -1
- 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/ai/context.ts +210 -5
- package/src/forge/runtime/ai/types.ts +70 -0
- package/src/forge/runtime/auth/claims.ts +32 -0
- package/src/forge/runtime/auth/errors.ts +2 -0
- package/src/forge/runtime/context/create-context.ts +30 -6
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +2 -2
- package/src/forge/runtime/db/pglite-adapter.ts +77 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +112 -2
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/scrubber.ts +91 -10
- package/src/forge/runtime/webhooks/security.ts +184 -0
- package/src/forge/server.ts +100 -2
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +407 -0
- package/src/forge/workspace/change-summary.ts +209 -0
- package/src/forge/workspace/forge-cli.ts +14 -0
- package/src/forge/workspace/git-summary.ts +279 -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 +2 -0
- package/templates/b2b-support-web/tsconfig.json +4 -1
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/tsconfig.json +3 -1
- package/templates/minimal-web/web/package.json +2 -2
- 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 -7696
- package/src/forge/_generated/agentQuickstart.md +0 -32
- package/src/forge/_generated/aiContext.ts +0 -59
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -35
- 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 -29
- 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 -14667
- package/src/forge/_generated/appMap.md +0 -35
- 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 -47
- 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 -67
- 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 -163
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -61
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -147
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -245249
- 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 -327385
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -79
- 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 -3108
- 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,9 +14,11 @@ 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";
|
|
19
20
|
import type { RlsSubcommand } from "./rls.ts";
|
|
21
|
+
import type { SecuritySubcommand } from "./security.ts";
|
|
20
22
|
import type { DepsSubcommand } from "./deps.ts";
|
|
21
23
|
import type { ReleaseAction, ReleaseArea } from "./release.ts";
|
|
22
24
|
import type { MakeCommandOptions, MakePrimitive } from "../make/types.ts";
|
|
@@ -46,8 +48,12 @@ import type {
|
|
|
46
48
|
UiVideoMode,
|
|
47
49
|
} from "../ui/types.ts";
|
|
48
50
|
import type { ForgeDoOptions } from "../intent/types.ts";
|
|
51
|
+
import type { BenchCommandOptions, BenchSubcommand } from "../bench.ts";
|
|
52
|
+
import type { BrownfieldImportCommandOptions } from "../brownfield-import/types.ts";
|
|
53
|
+
import type { CairCommandOptions, CairSubcommand } from "../cair/types.ts";
|
|
49
54
|
|
|
50
55
|
export type ForgeCommand =
|
|
56
|
+
| { kind: "version"; json: boolean }
|
|
51
57
|
| {
|
|
52
58
|
kind: "new";
|
|
53
59
|
name: string;
|
|
@@ -89,6 +95,15 @@ export type ForgeCommand =
|
|
|
89
95
|
postgresVersion: string;
|
|
90
96
|
runtimePort: number;
|
|
91
97
|
webPort: number;
|
|
98
|
+
preparedOnly?: boolean;
|
|
99
|
+
workspaceRoot: string;
|
|
100
|
+
}
|
|
101
|
+
| {
|
|
102
|
+
kind: "docs";
|
|
103
|
+
subcommand: DocsSubcommand;
|
|
104
|
+
json: boolean;
|
|
105
|
+
build: boolean;
|
|
106
|
+
installVenv: boolean;
|
|
92
107
|
workspaceRoot: string;
|
|
93
108
|
}
|
|
94
109
|
| {
|
|
@@ -97,8 +112,17 @@ export type ForgeCommand =
|
|
|
97
112
|
json: boolean;
|
|
98
113
|
workspaceRoot: string;
|
|
99
114
|
}
|
|
100
|
-
| { kind: "doctor"; target?: "project" | "windows"; json: boolean; workspaceRoot: string }
|
|
115
|
+
| { kind: "doctor"; target?: "project" | "windows" | "agent"; agentTarget?: AgentAdapterTarget; json: boolean; workspaceRoot: string }
|
|
101
116
|
| { kind: "setup"; target: "windows"; json: boolean; yes: boolean; workspaceRoot: string }
|
|
117
|
+
| {
|
|
118
|
+
kind: "security";
|
|
119
|
+
subcommand: SecuritySubcommand;
|
|
120
|
+
db: DbAdapterKind;
|
|
121
|
+
databaseUrl?: string;
|
|
122
|
+
json: boolean;
|
|
123
|
+
runTests: boolean;
|
|
124
|
+
workspaceRoot: string;
|
|
125
|
+
}
|
|
102
126
|
| {
|
|
103
127
|
kind: "auth";
|
|
104
128
|
subcommand: AuthSubcommand;
|
|
@@ -141,6 +165,7 @@ export type ForgeCommand =
|
|
|
141
165
|
json: boolean;
|
|
142
166
|
allowDirty: boolean;
|
|
143
167
|
allowPublicSourcemaps: boolean;
|
|
168
|
+
allowMissingLocalRelease?: boolean;
|
|
144
169
|
workspaceRoot: string;
|
|
145
170
|
}
|
|
146
171
|
| { kind: "make"; options: MakeCommandOptions }
|
|
@@ -150,12 +175,59 @@ export type ForgeCommand =
|
|
|
150
175
|
| { kind: "test"; options: TestCommandOptions }
|
|
151
176
|
| { kind: "repair"; options: RepairCommandOptions }
|
|
152
177
|
| { kind: "do"; options: ForgeDoOptions }
|
|
178
|
+
| { kind: "bench"; options: BenchCommandOptions }
|
|
179
|
+
| { kind: "cair"; options: CairCommandOptions }
|
|
153
180
|
| { kind: "agent"; options: AgentCommandOptions }
|
|
181
|
+
| { kind: "mcp"; subcommand: "serve"; workspaceRoot: string }
|
|
154
182
|
| { kind: "review"; options: ReviewCommandOptions }
|
|
155
183
|
| { kind: "ui"; options: UiCommandOptions }
|
|
156
|
-
| { kind: "
|
|
184
|
+
| { kind: "manifest"; subcommand: "validate" | "import"; path: string; json: boolean; workspaceRoot: string }
|
|
185
|
+
| { kind: "import"; options: BrownfieldImportCommandOptions }
|
|
186
|
+
| { kind: "delta"; subcommand: "status" | "repair"; json: boolean; workspaceRoot: string; dryRun: boolean; yes: boolean; verbose: boolean }
|
|
187
|
+
| { kind: "status"; json: boolean; workspaceRoot: string }
|
|
188
|
+
| { kind: "changed"; json: boolean; authoredOnly: boolean; workspaceRoot: string }
|
|
189
|
+
| { kind: "diff"; target: "authored" | "generated" | "full"; json: boolean; workspaceRoot: string }
|
|
190
|
+
| { kind: "handoff"; json: boolean; workspaceRoot: string }
|
|
191
|
+
| {
|
|
192
|
+
kind: "studio";
|
|
193
|
+
subcommand: "attach" | "snapshot" | "watch" | "open" | "doctor" | "bridge" | "codex-server";
|
|
194
|
+
path?: string;
|
|
195
|
+
previewUrl?: string;
|
|
196
|
+
previewPort?: number;
|
|
197
|
+
studioUrl?: string;
|
|
198
|
+
intervalMs?: number;
|
|
199
|
+
once: boolean;
|
|
200
|
+
workspaceId?: string;
|
|
201
|
+
tenantId?: string;
|
|
202
|
+
userId?: string;
|
|
203
|
+
role?: string;
|
|
204
|
+
targets: string[];
|
|
205
|
+
install?: boolean;
|
|
206
|
+
start?: boolean;
|
|
207
|
+
bridge?: boolean;
|
|
208
|
+
writeSchemas?: boolean;
|
|
209
|
+
probeAppServer?: boolean;
|
|
210
|
+
json: boolean;
|
|
211
|
+
dryRun: boolean;
|
|
212
|
+
force: boolean;
|
|
213
|
+
workspaceRoot: string;
|
|
214
|
+
}
|
|
215
|
+
| { kind: "timeline"; target?: string; kindFilter?: string; sessionId?: string; limit?: number; json: boolean; rebuild: boolean; forAgent: boolean; workspaceRoot: string }
|
|
216
|
+
| { kind: "explain"; thing: string; json: boolean; workspaceRoot: string }
|
|
217
|
+
| {
|
|
218
|
+
kind: "session";
|
|
219
|
+
subcommand: "list" | "show" | "rename" | "merge" | "split" | "detach";
|
|
220
|
+
sessionId?: string;
|
|
221
|
+
sourceSessionId?: string;
|
|
222
|
+
operationId?: string;
|
|
223
|
+
title?: string;
|
|
224
|
+
limit?: number;
|
|
225
|
+
json: boolean;
|
|
226
|
+
workspaceRoot: string;
|
|
227
|
+
}
|
|
228
|
+
| { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number; workspaceRoot: string }
|
|
157
229
|
| { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
|
|
158
|
-
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
|
|
230
|
+
| { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean; full: boolean; brief: boolean }
|
|
159
231
|
| { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
|
|
160
232
|
| { kind: "verify"; options: VerifyOptions }
|
|
161
233
|
| { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
|
|
@@ -168,7 +240,7 @@ export type ForgeCommand =
|
|
|
168
240
|
once: boolean;
|
|
169
241
|
watch: boolean;
|
|
170
242
|
json: boolean;
|
|
171
|
-
db: "pglite" | "postgres" | "none";
|
|
243
|
+
db: "memory" | "pglite" | "postgres" | "none";
|
|
172
244
|
databaseUrl?: string;
|
|
173
245
|
worker: boolean;
|
|
174
246
|
withWeb: boolean;
|
|
@@ -178,6 +250,7 @@ export type ForgeCommand =
|
|
|
178
250
|
webPort?: number;
|
|
179
251
|
telemetry: string[];
|
|
180
252
|
envFile?: string;
|
|
253
|
+
skipStartupConsole: boolean;
|
|
181
254
|
workspaceRoot: string;
|
|
182
255
|
}
|
|
183
256
|
| {
|
|
@@ -284,6 +357,11 @@ export type ForgeCommand =
|
|
|
284
357
|
model?: string;
|
|
285
358
|
prompt?: string;
|
|
286
359
|
mock: boolean;
|
|
360
|
+
modelLevel: boolean;
|
|
361
|
+
live: boolean;
|
|
362
|
+
traceId?: string;
|
|
363
|
+
db?: DbAdapterKind;
|
|
364
|
+
databaseUrl?: string;
|
|
287
365
|
workspaceRoot: string;
|
|
288
366
|
};
|
|
289
367
|
|
|
@@ -294,17 +372,21 @@ export interface ParsedCli {
|
|
|
294
372
|
}
|
|
295
373
|
|
|
296
374
|
export const TOP_LEVEL_COMMANDS = [
|
|
375
|
+
"version",
|
|
297
376
|
"new",
|
|
298
377
|
"build",
|
|
299
378
|
"serve",
|
|
300
379
|
"worker",
|
|
301
380
|
"self-host",
|
|
381
|
+
"docs",
|
|
302
382
|
"agent-contract",
|
|
303
383
|
"agent",
|
|
384
|
+
"mcp",
|
|
304
385
|
"review",
|
|
305
386
|
"ui",
|
|
306
387
|
"doctor",
|
|
307
388
|
"setup",
|
|
389
|
+
"security",
|
|
308
390
|
"auth",
|
|
309
391
|
"rls",
|
|
310
392
|
"deps",
|
|
@@ -316,6 +398,19 @@ export const TOP_LEVEL_COMMANDS = [
|
|
|
316
398
|
"test",
|
|
317
399
|
"repair",
|
|
318
400
|
"do",
|
|
401
|
+
"bench",
|
|
402
|
+
"cair",
|
|
403
|
+
"delta",
|
|
404
|
+
"session",
|
|
405
|
+
"timeline",
|
|
406
|
+
"explain",
|
|
407
|
+
"manifest",
|
|
408
|
+
"import",
|
|
409
|
+
"status",
|
|
410
|
+
"changed",
|
|
411
|
+
"diff",
|
|
412
|
+
"handoff",
|
|
413
|
+
"studio",
|
|
319
414
|
"generate",
|
|
320
415
|
"add",
|
|
321
416
|
"inspect",
|
|
@@ -352,6 +447,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
352
447
|
"ai",
|
|
353
448
|
"queries",
|
|
354
449
|
"api",
|
|
450
|
+
"external",
|
|
355
451
|
"client",
|
|
356
452
|
"frontend",
|
|
357
453
|
"auth",
|
|
@@ -367,9 +463,15 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
367
463
|
"test-graph",
|
|
368
464
|
"test-plans",
|
|
369
465
|
"agent-contract",
|
|
466
|
+
"agent-tools",
|
|
370
467
|
"agent-adapters",
|
|
371
468
|
"capability-map",
|
|
469
|
+
"summary",
|
|
470
|
+
"schema",
|
|
471
|
+
"drift",
|
|
472
|
+
"handoff",
|
|
372
473
|
"framework",
|
|
474
|
+
"imported",
|
|
373
475
|
"ui",
|
|
374
476
|
"ui-scenarios",
|
|
375
477
|
"ui-routes",
|
|
@@ -378,7 +480,7 @@ export const INSPECT_TARGETS: InspectTarget[] = [
|
|
|
378
480
|
"map",
|
|
379
481
|
];
|
|
380
482
|
|
|
381
|
-
const NEW_TEMPLATES: NewTemplateName[] = ["b2b-support-web", "minimal-web"];
|
|
483
|
+
const NEW_TEMPLATES: NewTemplateName[] = ["agent-workroom", "b2b-support-web", "minimal-web"];
|
|
382
484
|
const NEW_PACKAGE_MANAGERS: NewPackageManager[] = ["bun", "npm", "pnpm", "yarn"];
|
|
383
485
|
const SELF_HOST_SUBCOMMANDS: SelfHostSubcommand[] = ["compose", "env", "check", "clean"];
|
|
384
486
|
const AGENT_CONTRACT_SUBCOMMANDS: AgentContractSubcommand[] = [
|
|
@@ -392,8 +494,10 @@ const AUTH_SUBCOMMANDS: AuthSubcommand[] = [
|
|
|
392
494
|
"decode",
|
|
393
495
|
"test-token",
|
|
394
496
|
"jwks",
|
|
497
|
+
"prove",
|
|
395
498
|
];
|
|
396
|
-
const
|
|
499
|
+
const SECURITY_SUBCOMMANDS: SecuritySubcommand[] = ["prove"];
|
|
500
|
+
const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test", "mutate-test"];
|
|
397
501
|
const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
|
|
398
502
|
"outdated",
|
|
399
503
|
"inspect",
|
|
@@ -430,6 +534,7 @@ const MAKE_PRIMITIVES: MakePrimitive[] = [
|
|
|
430
534
|
"component",
|
|
431
535
|
"page",
|
|
432
536
|
"ui",
|
|
537
|
+
"ai-chat",
|
|
433
538
|
"resource",
|
|
434
539
|
"apply",
|
|
435
540
|
"rollback",
|
|
@@ -484,10 +589,18 @@ const AGENT_SUBCOMMANDS: AgentSubcommand[] = [
|
|
|
484
589
|
"export",
|
|
485
590
|
"check",
|
|
486
591
|
"doctor",
|
|
592
|
+
"onboard",
|
|
487
593
|
"print-context",
|
|
488
594
|
"clean",
|
|
595
|
+
"prepare",
|
|
596
|
+
"hooks",
|
|
597
|
+
"install",
|
|
598
|
+
"ingest",
|
|
599
|
+
"context",
|
|
600
|
+
"memory",
|
|
601
|
+
"timeline",
|
|
489
602
|
];
|
|
490
|
-
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["inspect", "list", "explain"];
|
|
603
|
+
const REVIEW_SUBCOMMANDS: ReviewSubcommand[] = ["run", "inspect", "list", "explain"];
|
|
491
604
|
const REVIEW_MODES: ReviewMode[] = ["quick", "standard", "strict"];
|
|
492
605
|
const REVIEW_FAIL_ON: ReviewFailOn[] = ["warning", "error", "blocking"];
|
|
493
606
|
const REVIEW_CATEGORIES: ReviewFindingCategory[] = [
|
|
@@ -518,6 +631,18 @@ const UI_BROWSERS: UiBrowserName[] = ["chromium", "firefox", "webkit"];
|
|
|
518
631
|
const UI_TRACE_MODES: UiTraceMode[] = ["on", "off", "retain-on-failure"];
|
|
519
632
|
const UI_SCREENSHOT_MODES: UiScreenshotMode[] = ["on", "off", "only-on-failure"];
|
|
520
633
|
const UI_VIDEO_MODES: UiVideoMode[] = ["on", "off", "retain-on-failure"];
|
|
634
|
+
const AI_SUBCOMMANDS: AiSubcommand[] = [
|
|
635
|
+
"providers",
|
|
636
|
+
"check",
|
|
637
|
+
"test",
|
|
638
|
+
"models",
|
|
639
|
+
"tools",
|
|
640
|
+
"agents",
|
|
641
|
+
"redteam",
|
|
642
|
+
"trace",
|
|
643
|
+
];
|
|
644
|
+
const BENCH_SUBCOMMANDS: BenchSubcommand[] = ["compiler"];
|
|
645
|
+
const CAIR_SUBCOMMANDS: CairSubcommand[] = ["snapshot", "query", "action"];
|
|
521
646
|
|
|
522
647
|
function parseFlag(args: string[], flag: string): boolean {
|
|
523
648
|
return args.includes(flag);
|
|
@@ -542,13 +667,17 @@ function parseOptionValues(args: string[], flag: string): string[] {
|
|
|
542
667
|
return values;
|
|
543
668
|
}
|
|
544
669
|
|
|
545
|
-
function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
|
|
546
|
-
if (value === "postgres" || value === "none") {
|
|
670
|
+
function parseDbKind(value: string | undefined): "memory" | "pglite" | "postgres" | "none" {
|
|
671
|
+
if (value === "memory" || value === "postgres" || value === "none") {
|
|
547
672
|
return value;
|
|
548
673
|
}
|
|
549
674
|
return "pglite";
|
|
550
675
|
}
|
|
551
676
|
|
|
677
|
+
function parsePersistentDbKind(value: string | undefined): DbAdapterKind {
|
|
678
|
+
return parseDbKind(value) === "postgres" ? "postgres" : "pglite";
|
|
679
|
+
}
|
|
680
|
+
|
|
552
681
|
function parseAdapterKind(value: string | undefined): DbAdapterKind {
|
|
553
682
|
if (value === "postgres" || value === "memory") {
|
|
554
683
|
return value;
|
|
@@ -566,7 +695,10 @@ function parseSandboxBackend(value: string | undefined): SandboxBackend {
|
|
|
566
695
|
function parseAddOptions(
|
|
567
696
|
args: string[],
|
|
568
697
|
workspaceRoot: string,
|
|
698
|
+
mode: AddOptions["mode"] = "auto",
|
|
569
699
|
): AddOptions & { workspaceRoot: string } {
|
|
700
|
+
const frontend = parseFlag(args, "--frontend");
|
|
701
|
+
const backend = parseFlag(args, "--backend");
|
|
570
702
|
return {
|
|
571
703
|
workspaceRoot,
|
|
572
704
|
json: parseFlag(args, "--json"),
|
|
@@ -576,6 +708,9 @@ function parseAddOptions(
|
|
|
576
708
|
parseOptionValue(args, "--sandbox-backend"),
|
|
577
709
|
),
|
|
578
710
|
allowScripts: parseFlag(args, "--allow-scripts"),
|
|
711
|
+
mode,
|
|
712
|
+
installWorkspace: parseOptionValue(args, "--workspace"),
|
|
713
|
+
packageTarget: frontend && !backend ? "frontend" : backend ? "backend" : undefined,
|
|
579
714
|
};
|
|
580
715
|
}
|
|
581
716
|
|
|
@@ -655,6 +790,14 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
655
790
|
const positional = argv.filter((arg) => !arg.startsWith("-"));
|
|
656
791
|
const workspaceRoot = process.cwd().replace(/\\/g, "/");
|
|
657
792
|
|
|
793
|
+
if (parseFlag(argv, "--version") || parseFlag(argv, "-v")) {
|
|
794
|
+
return {
|
|
795
|
+
command: { kind: "version", json: parseFlag(argv, "--json") },
|
|
796
|
+
workspaceRoot,
|
|
797
|
+
errors,
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
|
|
658
801
|
if (positional.length === 0) {
|
|
659
802
|
errors.push(
|
|
660
803
|
`missing command; expected ${TOP_LEVEL_COMMANDS.join(", ")}`,
|
|
@@ -794,6 +937,26 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
794
937
|
postgresVersion: parseOptionValue(argv, "--postgres-version") ?? "16",
|
|
795
938
|
runtimePort: Math.floor(runtimePort),
|
|
796
939
|
webPort: Math.floor(webPort),
|
|
940
|
+
preparedOnly: parseFlag(argv, "--prepared-only"),
|
|
941
|
+
workspaceRoot,
|
|
942
|
+
},
|
|
943
|
+
workspaceRoot,
|
|
944
|
+
errors,
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
case "docs": {
|
|
948
|
+
const subcommand = rest[0] as DocsSubcommand | undefined;
|
|
949
|
+
if (subcommand !== "check") {
|
|
950
|
+
errors.push("forge docs requires subcommand: check");
|
|
951
|
+
return { command: null, workspaceRoot, errors };
|
|
952
|
+
}
|
|
953
|
+
return {
|
|
954
|
+
command: {
|
|
955
|
+
kind: "docs",
|
|
956
|
+
subcommand,
|
|
957
|
+
json: parseFlag(argv, "--json"),
|
|
958
|
+
build: parseFlag(argv, "--build"),
|
|
959
|
+
installVenv: parseFlag(argv, "--install-venv"),
|
|
797
960
|
workspaceRoot,
|
|
798
961
|
},
|
|
799
962
|
workspaceRoot,
|
|
@@ -820,12 +983,38 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
820
983
|
case "agent": {
|
|
821
984
|
const subcommand = rest[0] as AgentSubcommand | undefined;
|
|
822
985
|
if (!subcommand || !AGENT_SUBCOMMANDS.includes(subcommand)) {
|
|
823
|
-
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, print-context, or
|
|
986
|
+
errors.push("forge agent requires subcommand: list-targets, export, check, doctor, onboard, print-context, clean, prepare, hooks, install, ingest, context, memory, or timeline");
|
|
824
987
|
return { command: null, workspaceRoot, errors };
|
|
825
988
|
}
|
|
989
|
+
const inputRaw = parseOptionValue(argv, "--input");
|
|
990
|
+
let input: unknown;
|
|
991
|
+
if (inputRaw !== undefined) {
|
|
992
|
+
try {
|
|
993
|
+
input = JSON.parse(inputRaw);
|
|
994
|
+
} catch {
|
|
995
|
+
errors.push("--input must be valid JSON");
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
999
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
1000
|
+
const pollIntervalRaw = parseOptionValue(argv, "--poll-interval");
|
|
1001
|
+
const pollIntervalMs = pollIntervalRaw ? Number(pollIntervalRaw) : undefined;
|
|
1002
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
1003
|
+
errors.push("--limit must be a number >= 1");
|
|
1004
|
+
}
|
|
1005
|
+
if (
|
|
1006
|
+
pollIntervalRaw !== undefined &&
|
|
1007
|
+
(!Number.isFinite(pollIntervalMs) || pollIntervalMs! < 100)
|
|
1008
|
+
) {
|
|
1009
|
+
errors.push("--poll-interval must be a number >= 100");
|
|
1010
|
+
}
|
|
826
1011
|
const target =
|
|
827
1012
|
(parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ??
|
|
828
|
-
(subcommand === "
|
|
1013
|
+
(subcommand === "install" || subcommand === "ingest" ? rest[1] : undefined) ??
|
|
1014
|
+
(subcommand === "hooks" ? rest[2] : undefined) ??
|
|
1015
|
+
(subcommand === "timeline" ? rest[1] : undefined) ??
|
|
1016
|
+
(subcommand === "timeline" ? "all" : undefined) ??
|
|
1017
|
+
(subcommand === "hooks" || subcommand === "onboard" ? "codex" : "generic");
|
|
829
1018
|
return {
|
|
830
1019
|
command: {
|
|
831
1020
|
kind: "agent",
|
|
@@ -839,12 +1028,37 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
839
1028
|
preserveUserSections: !parseFlag(argv, "--no-preserve-user-sections"),
|
|
840
1029
|
skills: !parseFlag(argv, "--no-skills"),
|
|
841
1030
|
rules: !parseFlag(argv, "--no-rules"),
|
|
1031
|
+
eventName: parseOptionValue(argv, "--event"),
|
|
1032
|
+
hookAction: subcommand === "hooks" ? rest[1] : undefined,
|
|
1033
|
+
input,
|
|
1034
|
+
entry: parseOptionValue(argv, "--entry") ?? (subcommand === "context" && rest[1] !== "--current" ? rest[1] : undefined),
|
|
1035
|
+
current: parseFlag(argv, "--current"),
|
|
1036
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
1037
|
+
watch: parseFlag(argv, "--watch"),
|
|
1038
|
+
file: parseOptionValue(argv, "--file"),
|
|
1039
|
+
pollIntervalMs: pollIntervalMs ? Math.floor(pollIntervalMs) : undefined,
|
|
842
1040
|
},
|
|
843
1041
|
},
|
|
844
1042
|
workspaceRoot,
|
|
845
1043
|
errors,
|
|
846
1044
|
};
|
|
847
1045
|
}
|
|
1046
|
+
case "mcp": {
|
|
1047
|
+
const subcommand = rest[0];
|
|
1048
|
+
if (subcommand !== "serve") {
|
|
1049
|
+
errors.push("forge mcp requires subcommand: serve");
|
|
1050
|
+
return { command: null, workspaceRoot, errors };
|
|
1051
|
+
}
|
|
1052
|
+
return {
|
|
1053
|
+
command: {
|
|
1054
|
+
kind: "mcp",
|
|
1055
|
+
subcommand,
|
|
1056
|
+
workspaceRoot,
|
|
1057
|
+
},
|
|
1058
|
+
workspaceRoot,
|
|
1059
|
+
errors,
|
|
1060
|
+
};
|
|
1061
|
+
}
|
|
848
1062
|
case "review": {
|
|
849
1063
|
const requested = rest[0] as ReviewSubcommand | undefined;
|
|
850
1064
|
const subcommand =
|
|
@@ -867,6 +1081,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
867
1081
|
json: parseFlag(argv, "--json"),
|
|
868
1082
|
md: parseFlag(argv, "--md"),
|
|
869
1083
|
sarif: parseFlag(argv, "--sarif"),
|
|
1084
|
+
full: parseFlag(argv, "--full"),
|
|
870
1085
|
write: positionalWrite || parseFlag(argv, "--write"),
|
|
871
1086
|
changed: parseFlag(argv, "--changed") || noSourceFlag,
|
|
872
1087
|
staged: parseFlag(argv, "--staged"),
|
|
@@ -937,14 +1152,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
937
1152
|
};
|
|
938
1153
|
}
|
|
939
1154
|
case "doctor":
|
|
940
|
-
if (rest[0] && rest[0] !== "windows") {
|
|
941
|
-
errors.push("forge doctor supports subcommand: windows");
|
|
1155
|
+
if (rest[0] && rest[0] !== "windows" && rest[0] !== "agent") {
|
|
1156
|
+
errors.push("forge doctor supports subcommand: windows or agent");
|
|
942
1157
|
return { command: null, workspaceRoot, errors };
|
|
943
1158
|
}
|
|
944
1159
|
return {
|
|
945
1160
|
command: {
|
|
946
1161
|
kind: "doctor",
|
|
947
|
-
target: rest[0] === "windows" ? "windows" : "project",
|
|
1162
|
+
target: rest[0] === "windows" ? "windows" : rest[0] === "agent" ? "agent" : "project",
|
|
1163
|
+
agentTarget: rest[0] === "agent"
|
|
1164
|
+
? (parseOptionValue(argv, "--target") as AgentAdapterTarget | undefined) ?? (rest[1] as AgentAdapterTarget | undefined) ?? "codex"
|
|
1165
|
+
: undefined,
|
|
948
1166
|
json: parseFlag(argv, "--json"),
|
|
949
1167
|
workspaceRoot,
|
|
950
1168
|
},
|
|
@@ -969,10 +1187,30 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
969
1187
|
errors,
|
|
970
1188
|
};
|
|
971
1189
|
}
|
|
1190
|
+
case "security": {
|
|
1191
|
+
const subcommand = rest[0] as SecuritySubcommand | undefined;
|
|
1192
|
+
if (!subcommand || !SECURITY_SUBCOMMANDS.includes(subcommand)) {
|
|
1193
|
+
errors.push("forge security requires subcommand: prove");
|
|
1194
|
+
return { command: null, workspaceRoot, errors };
|
|
1195
|
+
}
|
|
1196
|
+
return {
|
|
1197
|
+
command: {
|
|
1198
|
+
kind: "security",
|
|
1199
|
+
subcommand,
|
|
1200
|
+
db: parseAdapterKind(parseOptionValue(argv, "--db")),
|
|
1201
|
+
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
1202
|
+
json: parseFlag(argv, "--json"),
|
|
1203
|
+
runTests: parseFlag(argv, "--full") || parseFlag(argv, "--run-tests"),
|
|
1204
|
+
workspaceRoot,
|
|
1205
|
+
},
|
|
1206
|
+
workspaceRoot,
|
|
1207
|
+
errors,
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
972
1210
|
case "auth": {
|
|
973
1211
|
const subcommand = rest[0] as AuthSubcommand | undefined;
|
|
974
1212
|
if (!subcommand || !AUTH_SUBCOMMANDS.includes(subcommand)) {
|
|
975
|
-
errors.push("forge auth requires subcommand: check, config, decode, test-token, or
|
|
1213
|
+
errors.push("forge auth requires subcommand: check, config, decode, test-token, jwks, or prove");
|
|
976
1214
|
return { command: null, workspaceRoot, errors };
|
|
977
1215
|
}
|
|
978
1216
|
return {
|
|
@@ -990,7 +1228,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
990
1228
|
case "rls": {
|
|
991
1229
|
const subcommand = rest[0] as RlsSubcommand | undefined;
|
|
992
1230
|
if (!subcommand || !RLS_SUBCOMMANDS.includes(subcommand)) {
|
|
993
|
-
errors.push("forge rls requires subcommand: generate, check, apply, or test");
|
|
1231
|
+
errors.push("forge rls requires subcommand: generate, check, apply, test, or mutate-test");
|
|
994
1232
|
return { command: null, workspaceRoot, errors };
|
|
995
1233
|
}
|
|
996
1234
|
return {
|
|
@@ -1063,6 +1301,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1063
1301
|
json: parseFlag(argv, "--json"),
|
|
1064
1302
|
allowDirty: parseFlag(argv, "--allow-dirty"),
|
|
1065
1303
|
allowPublicSourcemaps: parseFlag(argv, "--allow-public-sourcemaps"),
|
|
1304
|
+
allowMissingLocalRelease: parseFlag(argv, "--allow-missing-local-release"),
|
|
1066
1305
|
workspaceRoot,
|
|
1067
1306
|
},
|
|
1068
1307
|
workspaceRoot,
|
|
@@ -1082,6 +1321,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1082
1321
|
? undefined
|
|
1083
1322
|
: primitive === "ui"
|
|
1084
1323
|
? rest[1] ?? "ui"
|
|
1324
|
+
: primitive === "ai-chat"
|
|
1325
|
+
? rest[1] ?? "support"
|
|
1085
1326
|
: rest[1];
|
|
1086
1327
|
const explainPrimitive =
|
|
1087
1328
|
primitive === "explain" ? (rest[1] as MakePrimitive | undefined) : undefined;
|
|
@@ -1092,7 +1333,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1092
1333
|
errors.push("forge make explain requires a known primitive");
|
|
1093
1334
|
}
|
|
1094
1335
|
if (
|
|
1095
|
-
!["list", "explain", "ui"].includes(primitive) &&
|
|
1336
|
+
!["list", "explain", "ui", "ai-chat"].includes(primitive) &&
|
|
1096
1337
|
!name
|
|
1097
1338
|
) {
|
|
1098
1339
|
errors.push(`forge make ${primitive} requires a name or plan id`);
|
|
@@ -1132,7 +1373,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1132
1373
|
event: parseOptionValue(argv, "--event"),
|
|
1133
1374
|
trigger: parseOptionValue(argv, "--trigger"),
|
|
1134
1375
|
component: parseOptionValue(argv, "--component"),
|
|
1135
|
-
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | undefined,
|
|
1376
|
+
framework: parseOptionValue(argv, "--framework") as "vite" | "next" | "nuxt" | undefined,
|
|
1136
1377
|
withAi: parseFlag(argv, "--with-ai"),
|
|
1137
1378
|
withCrud: parseFlag(argv, "--with-crud"),
|
|
1138
1379
|
withLiveQuery: parseFlag(argv, "--with-livequery"),
|
|
@@ -1411,6 +1652,215 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1411
1652
|
errors,
|
|
1412
1653
|
};
|
|
1413
1654
|
}
|
|
1655
|
+
case "bench": {
|
|
1656
|
+
const subcommand = rest[0] as BenchSubcommand | undefined;
|
|
1657
|
+
if (!subcommand || !BENCH_SUBCOMMANDS.includes(subcommand)) {
|
|
1658
|
+
errors.push("forge bench requires subcommand: compiler");
|
|
1659
|
+
return { command: null, workspaceRoot, errors };
|
|
1660
|
+
}
|
|
1661
|
+
const iterationsRaw = parseOptionValue(argv, "--iterations");
|
|
1662
|
+
const warmupsRaw = parseOptionValue(argv, "--warmups");
|
|
1663
|
+
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
1664
|
+
const iterations = iterationsRaw !== undefined ? Number(iterationsRaw) : 5;
|
|
1665
|
+
const warmups = warmupsRaw !== undefined ? Number(warmupsRaw) : 1;
|
|
1666
|
+
const concurrency = concurrencyRaw !== undefined ? Number(concurrencyRaw) : 4;
|
|
1667
|
+
if (!Number.isFinite(iterations) || iterations < 1) {
|
|
1668
|
+
errors.push("--iterations must be a number >= 1");
|
|
1669
|
+
}
|
|
1670
|
+
if (!Number.isFinite(warmups) || warmups < 0) {
|
|
1671
|
+
errors.push("--warmups must be a number >= 0");
|
|
1672
|
+
}
|
|
1673
|
+
if (!Number.isFinite(concurrency) || concurrency < 1) {
|
|
1674
|
+
errors.push("--concurrency must be a number >= 1");
|
|
1675
|
+
}
|
|
1676
|
+
return {
|
|
1677
|
+
command: {
|
|
1678
|
+
kind: "bench",
|
|
1679
|
+
options: {
|
|
1680
|
+
subcommand,
|
|
1681
|
+
workspaceRoot,
|
|
1682
|
+
json: parseFlag(argv, "--json"),
|
|
1683
|
+
iterations: Math.floor(iterations),
|
|
1684
|
+
warmups: Math.floor(warmups),
|
|
1685
|
+
concurrency: Math.floor(concurrency),
|
|
1686
|
+
},
|
|
1687
|
+
},
|
|
1688
|
+
workspaceRoot,
|
|
1689
|
+
errors,
|
|
1690
|
+
};
|
|
1691
|
+
}
|
|
1692
|
+
case "cair": {
|
|
1693
|
+
const subcommand = rest[0] as CairSubcommand | undefined;
|
|
1694
|
+
if (!subcommand || !CAIR_SUBCOMMANDS.includes(subcommand)) {
|
|
1695
|
+
errors.push("forge cair requires subcommand: snapshot, query, or action");
|
|
1696
|
+
return { command: null, workspaceRoot, errors };
|
|
1697
|
+
}
|
|
1698
|
+
const formatRaw = parseOptionValue(argv, "--format");
|
|
1699
|
+
if (formatRaw !== undefined && formatRaw !== "text" && formatRaw !== "json") {
|
|
1700
|
+
errors.push("--format must be text or json");
|
|
1701
|
+
}
|
|
1702
|
+
const query = subcommand === "query" ? rest.slice(1).join(" ").trim() : undefined;
|
|
1703
|
+
if (subcommand === "query" && !query) {
|
|
1704
|
+
errors.push("forge cair query requires a CAIR query, for example: forge cair query \"Q STATUS\"");
|
|
1705
|
+
}
|
|
1706
|
+
const inputPath = parseOptionValue(argv, "--input");
|
|
1707
|
+
const action = subcommand === "action"
|
|
1708
|
+
? rest.slice(1).filter((part, index, parts) => {
|
|
1709
|
+
const previous = parts[index - 1];
|
|
1710
|
+
if (part === "--dry-run" || part === "--plan" || part === "--json" || part === "--include-generated") {
|
|
1711
|
+
return false;
|
|
1712
|
+
}
|
|
1713
|
+
if (part === "--format" || part === "--input") {
|
|
1714
|
+
return false;
|
|
1715
|
+
}
|
|
1716
|
+
if (previous === "--format" || previous === "--input") {
|
|
1717
|
+
return false;
|
|
1718
|
+
}
|
|
1719
|
+
return true;
|
|
1720
|
+
}).join(" ").trim()
|
|
1721
|
+
: undefined;
|
|
1722
|
+
if (subcommand === "action" && !action && !inputPath) {
|
|
1723
|
+
errors.push("forge cair action requires a CAIR action, for example: forge cair action \"A CREATE.FILE path=src/example.ts\"");
|
|
1724
|
+
}
|
|
1725
|
+
return {
|
|
1726
|
+
command: {
|
|
1727
|
+
kind: "cair",
|
|
1728
|
+
options: {
|
|
1729
|
+
subcommand,
|
|
1730
|
+
workspaceRoot,
|
|
1731
|
+
json: parseFlag(argv, "--json"),
|
|
1732
|
+
format: formatRaw === "json" ? "json" : "text",
|
|
1733
|
+
...(query ? { query } : {}),
|
|
1734
|
+
...(action ? { action } : {}),
|
|
1735
|
+
...(inputPath ? { inputPath } : {}),
|
|
1736
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1737
|
+
plan: parseFlag(argv, "--plan"),
|
|
1738
|
+
allowGenerated: parseFlag(argv, "--include-generated"),
|
|
1739
|
+
},
|
|
1740
|
+
},
|
|
1741
|
+
workspaceRoot,
|
|
1742
|
+
errors,
|
|
1743
|
+
};
|
|
1744
|
+
}
|
|
1745
|
+
case "status":
|
|
1746
|
+
return {
|
|
1747
|
+
command: {
|
|
1748
|
+
kind: "status",
|
|
1749
|
+
json: parseFlag(argv, "--json"),
|
|
1750
|
+
workspaceRoot,
|
|
1751
|
+
},
|
|
1752
|
+
workspaceRoot,
|
|
1753
|
+
errors,
|
|
1754
|
+
};
|
|
1755
|
+
case "changed":
|
|
1756
|
+
return {
|
|
1757
|
+
command: {
|
|
1758
|
+
kind: "changed",
|
|
1759
|
+
json: parseFlag(argv, "--json"),
|
|
1760
|
+
authoredOnly: parseFlag(argv, "--authored"),
|
|
1761
|
+
workspaceRoot,
|
|
1762
|
+
},
|
|
1763
|
+
workspaceRoot,
|
|
1764
|
+
errors,
|
|
1765
|
+
};
|
|
1766
|
+
case "diff": {
|
|
1767
|
+
const target = (rest[0] ?? "authored") as "authored" | "generated" | "full";
|
|
1768
|
+
if (!["authored", "generated", "full"].includes(target)) {
|
|
1769
|
+
errors.push("forge diff requires target: authored, generated, or full");
|
|
1770
|
+
return { command: null, workspaceRoot, errors };
|
|
1771
|
+
}
|
|
1772
|
+
return {
|
|
1773
|
+
command: {
|
|
1774
|
+
kind: "diff",
|
|
1775
|
+
target,
|
|
1776
|
+
json: parseFlag(argv, "--json"),
|
|
1777
|
+
workspaceRoot,
|
|
1778
|
+
},
|
|
1779
|
+
workspaceRoot,
|
|
1780
|
+
errors,
|
|
1781
|
+
};
|
|
1782
|
+
}
|
|
1783
|
+
case "handoff":
|
|
1784
|
+
return {
|
|
1785
|
+
command: {
|
|
1786
|
+
kind: "handoff",
|
|
1787
|
+
json: parseFlag(argv, "--json"),
|
|
1788
|
+
workspaceRoot,
|
|
1789
|
+
},
|
|
1790
|
+
workspaceRoot,
|
|
1791
|
+
errors,
|
|
1792
|
+
};
|
|
1793
|
+
case "studio": {
|
|
1794
|
+
const subcommand = rest[0];
|
|
1795
|
+
if (
|
|
1796
|
+
subcommand !== "attach" &&
|
|
1797
|
+
subcommand !== "snapshot" &&
|
|
1798
|
+
subcommand !== "watch" &&
|
|
1799
|
+
subcommand !== "open" &&
|
|
1800
|
+
subcommand !== "doctor" &&
|
|
1801
|
+
subcommand !== "bridge" &&
|
|
1802
|
+
subcommand !== "codex-server"
|
|
1803
|
+
) {
|
|
1804
|
+
errors.push("forge studio requires subcommand: attach, snapshot, watch, open, doctor, bridge, or codex-server");
|
|
1805
|
+
return { command: null, workspaceRoot, errors };
|
|
1806
|
+
}
|
|
1807
|
+
const previewPortRaw = parseOptionValue(argv, "--preview-port");
|
|
1808
|
+
const previewPort = previewPortRaw !== undefined ? Number(previewPortRaw) : undefined;
|
|
1809
|
+
if (
|
|
1810
|
+
previewPortRaw !== undefined &&
|
|
1811
|
+
(!Number.isInteger(previewPort) || previewPort! < 1)
|
|
1812
|
+
) {
|
|
1813
|
+
errors.push("--preview-port must be an integer >= 1");
|
|
1814
|
+
}
|
|
1815
|
+
const intervalRaw = parseOptionValue(argv, "--interval-ms");
|
|
1816
|
+
const intervalMs = intervalRaw !== undefined ? Number(intervalRaw) : undefined;
|
|
1817
|
+
if (intervalRaw !== undefined && (!Number.isFinite(intervalMs) || intervalMs! < 1000)) {
|
|
1818
|
+
errors.push("--interval-ms must be a number >= 1000");
|
|
1819
|
+
}
|
|
1820
|
+
const targets = parseOptionValues(argv, "--target");
|
|
1821
|
+
const ignoredOptionValues = new Set(
|
|
1822
|
+
[
|
|
1823
|
+
...targets,
|
|
1824
|
+
parseOptionValue(argv, "--preview-url"),
|
|
1825
|
+
parseOptionValue(argv, "--studio-url"),
|
|
1826
|
+
parseOptionValue(argv, "--workspace-id"),
|
|
1827
|
+
parseOptionValue(argv, "--tenant-id"),
|
|
1828
|
+
parseOptionValue(argv, "--user-id"),
|
|
1829
|
+
parseOptionValue(argv, "--role"),
|
|
1830
|
+
previewPortRaw,
|
|
1831
|
+
intervalRaw,
|
|
1832
|
+
].filter((value): value is string => typeof value === "string"),
|
|
1833
|
+
);
|
|
1834
|
+
const studioPath = rest.slice(1).find((item) => !ignoredOptionValues.has(item));
|
|
1835
|
+
return {
|
|
1836
|
+
command: {
|
|
1837
|
+
kind: "studio",
|
|
1838
|
+
subcommand,
|
|
1839
|
+
path: studioPath,
|
|
1840
|
+
previewUrl: parseOptionValue(argv, "--preview-url"),
|
|
1841
|
+
previewPort: previewPort ? Math.floor(previewPort) : undefined,
|
|
1842
|
+
studioUrl: parseOptionValue(argv, "--studio-url"),
|
|
1843
|
+
intervalMs: intervalMs ? Math.floor(intervalMs) : undefined,
|
|
1844
|
+
once: parseFlag(argv, "--once"),
|
|
1845
|
+
workspaceId: parseOptionValue(argv, "--workspace-id"),
|
|
1846
|
+
tenantId: parseOptionValue(argv, "--tenant-id"),
|
|
1847
|
+
userId: parseOptionValue(argv, "--user-id"),
|
|
1848
|
+
role: parseOptionValue(argv, "--role"),
|
|
1849
|
+
targets: targets.length > 0 ? targets : ["codex"],
|
|
1850
|
+
install: parseFlag(argv, "--install"),
|
|
1851
|
+
start: !parseFlag(argv, "--no-start"),
|
|
1852
|
+
bridge: !parseFlag(argv, "--no-bridge"),
|
|
1853
|
+
writeSchemas: parseFlag(argv, "--write"),
|
|
1854
|
+
probeAppServer: parseFlag(argv, "--probe") || parseFlag(argv, "--probe-codex-server"),
|
|
1855
|
+
json: parseFlag(argv, "--json"),
|
|
1856
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1857
|
+
force: parseFlag(argv, "--force"),
|
|
1858
|
+
workspaceRoot,
|
|
1859
|
+
},
|
|
1860
|
+
workspaceRoot,
|
|
1861
|
+
errors,
|
|
1862
|
+
};
|
|
1863
|
+
}
|
|
1414
1864
|
case "generate": {
|
|
1415
1865
|
const concurrencyRaw = parseOptionValue(argv, "--concurrency");
|
|
1416
1866
|
const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
|
|
@@ -1424,30 +1874,178 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1424
1874
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
1425
1875
|
json: parseFlag(argv, "--json"),
|
|
1426
1876
|
concurrency: Math.max(1, Math.floor(concurrency || 4)),
|
|
1877
|
+
workspaceRoot,
|
|
1878
|
+
},
|
|
1879
|
+
workspaceRoot,
|
|
1880
|
+
errors,
|
|
1881
|
+
};
|
|
1882
|
+
}
|
|
1883
|
+
case "delta": {
|
|
1884
|
+
const subcommand = rest[0];
|
|
1885
|
+
if (subcommand !== "status" && subcommand !== "repair") {
|
|
1886
|
+
errors.push("forge delta requires subcommand: status or repair");
|
|
1887
|
+
return { command: null, workspaceRoot, errors };
|
|
1888
|
+
}
|
|
1889
|
+
return {
|
|
1890
|
+
command: {
|
|
1891
|
+
kind: "delta",
|
|
1892
|
+
subcommand,
|
|
1893
|
+
json: parseFlag(argv, "--json"),
|
|
1894
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
1895
|
+
yes: parseFlag(argv, "--yes"),
|
|
1896
|
+
verbose: parseFlag(argv, "--verbose"),
|
|
1897
|
+
workspaceRoot,
|
|
1898
|
+
},
|
|
1899
|
+
workspaceRoot,
|
|
1900
|
+
errors,
|
|
1901
|
+
};
|
|
1902
|
+
}
|
|
1903
|
+
case "session": {
|
|
1904
|
+
const subcommand = rest[0];
|
|
1905
|
+
if (subcommand !== "list" && subcommand !== "show" && subcommand !== "rename" && subcommand !== "merge" && subcommand !== "split" && subcommand !== "detach") {
|
|
1906
|
+
errors.push("forge session requires subcommand: list, show, rename, merge, split, or detach");
|
|
1907
|
+
return { command: null, workspaceRoot, errors };
|
|
1908
|
+
}
|
|
1909
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
1910
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
1911
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
1912
|
+
errors.push("--limit must be a number >= 1");
|
|
1913
|
+
}
|
|
1914
|
+
const sessionId = rest[1];
|
|
1915
|
+
return {
|
|
1916
|
+
command: {
|
|
1917
|
+
kind: "session",
|
|
1918
|
+
subcommand,
|
|
1919
|
+
sessionId: subcommand === "detach" ? undefined : sessionId,
|
|
1920
|
+
sourceSessionId: subcommand === "merge" ? rest[2] : undefined,
|
|
1921
|
+
operationId: subcommand === "split" ? rest[2] : subcommand === "detach" ? rest[1] : undefined,
|
|
1922
|
+
title: subcommand === "rename" ? rest.slice(2).join(" ") : undefined,
|
|
1923
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
1924
|
+
json: parseFlag(argv, "--json"),
|
|
1925
|
+
workspaceRoot,
|
|
1926
|
+
},
|
|
1927
|
+
workspaceRoot,
|
|
1928
|
+
errors,
|
|
1929
|
+
};
|
|
1930
|
+
}
|
|
1931
|
+
case "timeline": {
|
|
1932
|
+
const limitRaw = parseOptionValue(argv, "--limit");
|
|
1933
|
+
const kindFilter = parseOptionValue(argv, "--kind");
|
|
1934
|
+
const sessionId = parseOptionValue(argv, "--session");
|
|
1935
|
+
const rebuild = rest[0] === "rebuild";
|
|
1936
|
+
const target = rebuild ? undefined : rest.find((item) => item !== kindFilter && item !== limitRaw && item !== sessionId);
|
|
1937
|
+
const limit = limitRaw ? Number(limitRaw) : undefined;
|
|
1938
|
+
if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
|
|
1939
|
+
errors.push("--limit must be a number >= 1");
|
|
1940
|
+
}
|
|
1941
|
+
return {
|
|
1942
|
+
command: {
|
|
1943
|
+
kind: "timeline",
|
|
1944
|
+
target,
|
|
1945
|
+
kindFilter,
|
|
1946
|
+
sessionId,
|
|
1947
|
+
limit: limit ? Math.floor(limit) : undefined,
|
|
1948
|
+
json: parseFlag(argv, "--json"),
|
|
1949
|
+
rebuild,
|
|
1950
|
+
forAgent: parseFlag(argv, "--for-agent"),
|
|
1951
|
+
workspaceRoot,
|
|
1952
|
+
},
|
|
1953
|
+
workspaceRoot,
|
|
1954
|
+
errors,
|
|
1955
|
+
};
|
|
1956
|
+
}
|
|
1957
|
+
case "explain": {
|
|
1958
|
+
const thing = rest[0] === "session" ? `session:${rest[1] ?? "current"}` : rest[0];
|
|
1959
|
+
if (!thing) {
|
|
1960
|
+
errors.push("forge explain requires a target");
|
|
1961
|
+
return { command: null, workspaceRoot, errors };
|
|
1962
|
+
}
|
|
1963
|
+
return {
|
|
1964
|
+
command: {
|
|
1965
|
+
kind: "explain",
|
|
1966
|
+
thing,
|
|
1967
|
+
json: parseFlag(argv, "--json"),
|
|
1968
|
+
workspaceRoot,
|
|
1969
|
+
},
|
|
1970
|
+
workspaceRoot,
|
|
1971
|
+
errors,
|
|
1972
|
+
};
|
|
1973
|
+
}
|
|
1974
|
+
case "manifest": {
|
|
1975
|
+
const subcommand = rest[0];
|
|
1976
|
+
const path = rest[1];
|
|
1977
|
+
if (subcommand !== "validate" && subcommand !== "import") {
|
|
1978
|
+
errors.push("forge manifest requires subcommand validate or import");
|
|
1979
|
+
return { command: null, workspaceRoot, errors };
|
|
1980
|
+
}
|
|
1981
|
+
if (!path) {
|
|
1982
|
+
errors.push(`forge manifest ${subcommand} requires a manifest file path`);
|
|
1983
|
+
return { command: null, workspaceRoot, errors };
|
|
1984
|
+
}
|
|
1985
|
+
return {
|
|
1986
|
+
command: {
|
|
1987
|
+
kind: "manifest",
|
|
1988
|
+
subcommand,
|
|
1989
|
+
path,
|
|
1990
|
+
json: parseFlag(argv, "--json"),
|
|
1991
|
+
workspaceRoot,
|
|
1992
|
+
},
|
|
1993
|
+
workspaceRoot,
|
|
1994
|
+
errors,
|
|
1995
|
+
};
|
|
1996
|
+
}
|
|
1997
|
+
case "import": {
|
|
1998
|
+
const subcommand = rest[0];
|
|
1999
|
+
if (subcommand !== "analyze" && subcommand !== "inspect") {
|
|
2000
|
+
errors.push("forge import requires subcommand analyze or inspect");
|
|
2001
|
+
return { command: null, workspaceRoot, errors };
|
|
2002
|
+
}
|
|
2003
|
+
return {
|
|
2004
|
+
command: {
|
|
2005
|
+
kind: "import",
|
|
2006
|
+
options: {
|
|
2007
|
+
subcommand,
|
|
2008
|
+
json: parseFlag(argv, "--json"),
|
|
2009
|
+
dryRun: parseFlag(argv, "--dry-run"),
|
|
2010
|
+
workspaceRoot,
|
|
2011
|
+
entry: parseOptionValue(argv, "--entry"),
|
|
2012
|
+
target: parseOptionValue(argv, "--target"),
|
|
2013
|
+
},
|
|
1427
2014
|
},
|
|
1428
2015
|
workspaceRoot,
|
|
1429
2016
|
errors,
|
|
1430
2017
|
};
|
|
1431
2018
|
}
|
|
1432
2019
|
case "add": {
|
|
1433
|
-
const
|
|
2020
|
+
const subcommand = rest[0];
|
|
2021
|
+
const explicitMode =
|
|
2022
|
+
subcommand === "package"
|
|
2023
|
+
? "package"
|
|
2024
|
+
: subcommand === "integration"
|
|
2025
|
+
? "integration"
|
|
2026
|
+
: "auto";
|
|
2027
|
+
const alias = explicitMode === "auto" ? rest[0] : rest[1];
|
|
1434
2028
|
if (!alias) {
|
|
1435
|
-
errors.push(
|
|
2029
|
+
errors.push(
|
|
2030
|
+
explicitMode === "auto"
|
|
2031
|
+
? "forge add requires a package name or integration alias"
|
|
2032
|
+
: `forge add ${subcommand} requires a target`,
|
|
2033
|
+
);
|
|
1436
2034
|
return { command: null, workspaceRoot, errors };
|
|
1437
2035
|
}
|
|
1438
2036
|
return {
|
|
1439
2037
|
command: {
|
|
1440
2038
|
kind: "add",
|
|
1441
2039
|
alias,
|
|
1442
|
-
options: parseAddOptions(argv, workspaceRoot),
|
|
2040
|
+
options: parseAddOptions(argv, workspaceRoot, explicitMode),
|
|
1443
2041
|
},
|
|
1444
2042
|
workspaceRoot,
|
|
1445
2043
|
errors,
|
|
1446
2044
|
};
|
|
1447
2045
|
}
|
|
1448
2046
|
case "inspect": {
|
|
1449
|
-
const target = rest[0] as InspectTarget | undefined;
|
|
1450
|
-
if (!
|
|
2047
|
+
const target = (rest[0] as InspectTarget | undefined) ?? "summary";
|
|
2048
|
+
if (!INSPECT_TARGETS.includes(target)) {
|
|
1451
2049
|
errors.push(
|
|
1452
2050
|
`unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
|
|
1453
2051
|
);
|
|
@@ -1459,6 +2057,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1459
2057
|
target,
|
|
1460
2058
|
json: parseFlag(argv, "--json"),
|
|
1461
2059
|
dryRun: parseFlag(argv, "--dry-run"),
|
|
2060
|
+
full: parseFlag(argv, "--full"),
|
|
2061
|
+
brief: parseFlag(argv, "--brief"),
|
|
1462
2062
|
},
|
|
1463
2063
|
workspaceRoot,
|
|
1464
2064
|
errors,
|
|
@@ -1479,12 +2079,58 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1479
2079
|
{
|
|
1480
2080
|
const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
|
|
1481
2081
|
const scriptTimeoutMs = scriptTimeoutRaw ? Number(scriptTimeoutRaw) : undefined;
|
|
2082
|
+
const testJobsRaw = parseOptionValue(argv, "--test-jobs");
|
|
2083
|
+
const testJobs = testJobsRaw ? Number(testJobsRaw) : undefined;
|
|
2084
|
+
const typechecker = parseOptionValue(argv, "--typechecker");
|
|
2085
|
+
const verifyOptionValues = new Set(
|
|
2086
|
+
[scriptTimeoutRaw, testJobsRaw, typechecker]
|
|
2087
|
+
.filter((value): value is string => typeof value === "string"),
|
|
2088
|
+
);
|
|
2089
|
+
const profileAlias = rest.find((item) => !verifyOptionValues.has(item));
|
|
2090
|
+
const verifyProfiles = new Set([
|
|
2091
|
+
"quick",
|
|
2092
|
+
"smoke",
|
|
2093
|
+
"agent",
|
|
2094
|
+
"standard",
|
|
2095
|
+
"release",
|
|
2096
|
+
"strict",
|
|
2097
|
+
"changed",
|
|
2098
|
+
"framework",
|
|
2099
|
+
"internal",
|
|
2100
|
+
"maintainer",
|
|
2101
|
+
]);
|
|
2102
|
+
if (profileAlias && !verifyProfiles.has(profileAlias)) {
|
|
2103
|
+
errors.push(
|
|
2104
|
+
`unknown forge verify profile '${profileAlias}'; expected quick, smoke, agent, standard, release, strict, changed, framework, internal, or maintainer`,
|
|
2105
|
+
);
|
|
2106
|
+
}
|
|
2107
|
+
const internal =
|
|
2108
|
+
parseFlag(argv, "--internal") ||
|
|
2109
|
+
profileAlias === "framework" ||
|
|
2110
|
+
profileAlias === "internal" ||
|
|
2111
|
+
profileAlias === "maintainer";
|
|
1482
2112
|
if (
|
|
1483
2113
|
scriptTimeoutRaw !== undefined &&
|
|
1484
2114
|
(!Number.isFinite(scriptTimeoutMs) || scriptTimeoutMs! < 1)
|
|
1485
2115
|
) {
|
|
1486
2116
|
errors.push("--script-timeout-ms must be a number >= 1");
|
|
1487
2117
|
}
|
|
2118
|
+
if (
|
|
2119
|
+
testJobsRaw !== undefined &&
|
|
2120
|
+
(!Number.isInteger(testJobs) || testJobs! < 1)
|
|
2121
|
+
) {
|
|
2122
|
+
errors.push("--test-jobs must be an integer >= 1");
|
|
2123
|
+
}
|
|
2124
|
+
if (
|
|
2125
|
+
typechecker !== undefined &&
|
|
2126
|
+
typechecker !== "tsc" &&
|
|
2127
|
+
typechecker !== "native" &&
|
|
2128
|
+
typechecker !== "ts7" &&
|
|
2129
|
+
typechecker !== "tsgo" &&
|
|
2130
|
+
typechecker !== "auto"
|
|
2131
|
+
) {
|
|
2132
|
+
errors.push("--typechecker must be one of: tsc, native, ts7, tsgo, auto");
|
|
2133
|
+
}
|
|
1488
2134
|
return {
|
|
1489
2135
|
command: {
|
|
1490
2136
|
kind: "verify",
|
|
@@ -1494,12 +2140,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1494
2140
|
skipTests: parseFlag(argv, "--skip-tests"),
|
|
1495
2141
|
skipTypecheck: parseFlag(argv, "--skip-typecheck"),
|
|
1496
2142
|
skipEslint: parseFlag(argv, "--skip-eslint"),
|
|
1497
|
-
strict: parseFlag(argv, "--strict"),
|
|
1498
|
-
changed: parseFlag(argv, "--changed"),
|
|
1499
|
-
fast: parseFlag(argv, "--fast"),
|
|
1500
|
-
smoke: parseFlag(argv, "--smoke"),
|
|
1501
|
-
standard: parseFlag(argv, "--standard"),
|
|
2143
|
+
strict: internal || parseFlag(argv, "--strict") || profileAlias === "release" || profileAlias === "strict",
|
|
2144
|
+
changed: parseFlag(argv, "--changed") || profileAlias === "changed",
|
|
2145
|
+
fast: parseFlag(argv, "--fast") || profileAlias === "quick",
|
|
2146
|
+
smoke: parseFlag(argv, "--smoke") || profileAlias === "smoke",
|
|
2147
|
+
standard: parseFlag(argv, "--standard") || profileAlias === "agent" || profileAlias === "standard",
|
|
1502
2148
|
scriptTimeoutMs: scriptTimeoutMs ? Math.floor(scriptTimeoutMs) : undefined,
|
|
2149
|
+
testJobs: testJobs ? Math.floor(testJobs) : undefined,
|
|
2150
|
+
typechecker: typechecker as "tsc" | "native" | "ts7" | "tsgo" | "auto" | undefined,
|
|
2151
|
+
fullTests: parseFlag(argv, "--full"),
|
|
2152
|
+
testPlan: parseFlag(argv, "--test-plan"),
|
|
2153
|
+
internal,
|
|
1503
2154
|
},
|
|
1504
2155
|
},
|
|
1505
2156
|
workspaceRoot,
|
|
@@ -1543,6 +2194,15 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1543
2194
|
|
|
1544
2195
|
const name = rest[0];
|
|
1545
2196
|
const list = parseFlag(argv, "--list") || !name;
|
|
2197
|
+
const argsRaw = parseOptionValue(argv, "--args");
|
|
2198
|
+
let args: unknown = {};
|
|
2199
|
+
if (argsRaw !== undefined) {
|
|
2200
|
+
try {
|
|
2201
|
+
args = JSON.parse(argsRaw);
|
|
2202
|
+
} catch {
|
|
2203
|
+
errors.push("--args must be valid JSON");
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
1546
2206
|
return {
|
|
1547
2207
|
command: {
|
|
1548
2208
|
kind: "run",
|
|
@@ -1555,19 +2215,30 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1555
2215
|
role: parseOptionValue(argv, "--role"),
|
|
1556
2216
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
1557
2217
|
workspaceRoot,
|
|
2218
|
+
args,
|
|
1558
2219
|
},
|
|
1559
2220
|
workspaceRoot,
|
|
1560
2221
|
errors,
|
|
1561
2222
|
};
|
|
1562
2223
|
}
|
|
1563
2224
|
case "query": {
|
|
1564
|
-
const
|
|
2225
|
+
const requested = rest[0] as QuerySubcommand | undefined;
|
|
2226
|
+
const subcommand =
|
|
2227
|
+
!requested
|
|
2228
|
+
? "list"
|
|
2229
|
+
: ["list", "run"].includes(requested)
|
|
2230
|
+
? requested
|
|
2231
|
+
: "run";
|
|
1565
2232
|
if (!["list", "run"].includes(subcommand)) {
|
|
1566
2233
|
errors.push("forge query requires subcommand: list or run");
|
|
1567
2234
|
return { command: null, workspaceRoot, errors };
|
|
1568
2235
|
}
|
|
1569
2236
|
|
|
1570
|
-
const queryName = subcommand === "run"
|
|
2237
|
+
const queryName = subcommand === "run"
|
|
2238
|
+
? requested === "run"
|
|
2239
|
+
? rest[1]
|
|
2240
|
+
: rest[0]
|
|
2241
|
+
: undefined;
|
|
1571
2242
|
if (subcommand === "run" && !queryName) {
|
|
1572
2243
|
errors.push("forge query run requires a query name");
|
|
1573
2244
|
}
|
|
@@ -1676,6 +2347,7 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1676
2347
|
.map((value) => value.trim())
|
|
1677
2348
|
.filter(Boolean),
|
|
1678
2349
|
envFile: parseOptionValue(argv, "--env-file"),
|
|
2350
|
+
skipStartupConsole: parseFlag(argv, "--skip-startup-console"),
|
|
1679
2351
|
workspaceRoot,
|
|
1680
2352
|
},
|
|
1681
2353
|
workspaceRoot,
|
|
@@ -1684,8 +2356,8 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1684
2356
|
}
|
|
1685
2357
|
case "db": {
|
|
1686
2358
|
const subcommand = rest[0] as DbSubcommand | undefined;
|
|
1687
|
-
if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
|
|
1688
|
-
errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
|
|
2359
|
+
if (!subcommand || !["diff", "migrate", "reset", "status", "doctor", "rls-check"].includes(subcommand)) {
|
|
2360
|
+
errors.push("forge db requires subcommand: diff, migrate, reset, status, doctor, or rls-check");
|
|
1689
2361
|
return { command: null, workspaceRoot, errors };
|
|
1690
2362
|
}
|
|
1691
2363
|
return {
|
|
@@ -1882,10 +2554,10 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1882
2554
|
const subcommand = rest[0] as SecretsSubcommand | undefined;
|
|
1883
2555
|
if (
|
|
1884
2556
|
!subcommand ||
|
|
1885
|
-
!["list", "check", "print", "set", "unset"].includes(subcommand)
|
|
2557
|
+
!["list", "check", "print", "set", "unset", "prove"].includes(subcommand)
|
|
1886
2558
|
) {
|
|
1887
2559
|
errors.push(
|
|
1888
|
-
"forge secrets requires subcommand: list, check, print, set, or
|
|
2560
|
+
"forge secrets requires subcommand: list, check, print, set, unset, or prove",
|
|
1889
2561
|
);
|
|
1890
2562
|
return { command: null, workspaceRoot, errors };
|
|
1891
2563
|
}
|
|
@@ -1925,13 +2597,17 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1925
2597
|
}
|
|
1926
2598
|
case "ai": {
|
|
1927
2599
|
const subcommand = rest[0] as AiSubcommand | undefined;
|
|
1928
|
-
if (!subcommand || !
|
|
1929
|
-
errors.push("forge ai requires subcommand: providers, check, test, or
|
|
2600
|
+
if (!subcommand || !AI_SUBCOMMANDS.includes(subcommand)) {
|
|
2601
|
+
errors.push("forge ai requires subcommand: providers, check, test, models, tools, agents, redteam, or trace");
|
|
1930
2602
|
return { command: null, workspaceRoot, errors };
|
|
1931
2603
|
}
|
|
1932
2604
|
|
|
1933
2605
|
const providerRaw = parseOptionValue(argv, "--provider");
|
|
1934
2606
|
const provider = providerRaw as ForgeAiProvider | undefined;
|
|
2607
|
+
const traceId = subcommand === "trace" ? rest[1] ?? parseOptionValue(argv, "--trace") : undefined;
|
|
2608
|
+
if (subcommand === "trace" && !traceId) {
|
|
2609
|
+
errors.push("forge ai trace requires a trace id");
|
|
2610
|
+
}
|
|
1935
2611
|
|
|
1936
2612
|
return {
|
|
1937
2613
|
command: {
|
|
@@ -1942,6 +2618,11 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1942
2618
|
model: parseOptionValue(argv, "--model"),
|
|
1943
2619
|
prompt: parseOptionValue(argv, "--prompt"),
|
|
1944
2620
|
mock: parseFlag(argv, "--mock"),
|
|
2621
|
+
modelLevel: parseFlag(argv, "--model-level"),
|
|
2622
|
+
live: parseFlag(argv, "--live"),
|
|
2623
|
+
traceId,
|
|
2624
|
+
db: parsePersistentDbKind(parseOptionValue(argv, "--db")),
|
|
2625
|
+
databaseUrl: parseOptionValue(argv, "--database-url"),
|
|
1945
2626
|
workspaceRoot,
|
|
1946
2627
|
},
|
|
1947
2628
|
workspaceRoot,
|
|
@@ -1956,8 +2637,11 @@ export function parseCli(argv: string[]): ParsedCli {
|
|
|
1956
2637
|
|
|
1957
2638
|
export function hasUnknownOption(argv: string[]): string | null {
|
|
1958
2639
|
const known = new Set([
|
|
2640
|
+
"--version",
|
|
1959
2641
|
"--check",
|
|
1960
2642
|
"--json",
|
|
2643
|
+
"--human",
|
|
2644
|
+
"--for-agent",
|
|
1961
2645
|
"--dry-run",
|
|
1962
2646
|
"--plan",
|
|
1963
2647
|
"--staged",
|
|
@@ -1988,10 +2672,14 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
1988
2672
|
"--smoke",
|
|
1989
2673
|
"--standard",
|
|
1990
2674
|
"--script-timeout-ms",
|
|
2675
|
+
"--test-plan",
|
|
2676
|
+
"--typechecker",
|
|
1991
2677
|
"--timeout-ms",
|
|
1992
2678
|
"--apply",
|
|
1993
2679
|
"--runtime-inspect",
|
|
1994
2680
|
"--allow-scripts",
|
|
2681
|
+
"--frontend",
|
|
2682
|
+
"--backend",
|
|
1995
2683
|
"--yes",
|
|
1996
2684
|
"--force",
|
|
1997
2685
|
"--no-generate",
|
|
@@ -2009,6 +2697,8 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2009
2697
|
"--policy",
|
|
2010
2698
|
"--emit",
|
|
2011
2699
|
"--event",
|
|
2700
|
+
"--entry",
|
|
2701
|
+
"--current",
|
|
2012
2702
|
"--trigger",
|
|
2013
2703
|
"--component",
|
|
2014
2704
|
"--framework",
|
|
@@ -2036,6 +2726,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2036
2726
|
"--video",
|
|
2037
2727
|
"--base-url",
|
|
2038
2728
|
"--runtime-url",
|
|
2729
|
+
"--workspace",
|
|
2039
2730
|
"--reuse-servers",
|
|
2040
2731
|
"--start-servers",
|
|
2041
2732
|
"--scenario",
|
|
@@ -2048,6 +2739,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2048
2739
|
"--allow-high-risk",
|
|
2049
2740
|
"--to",
|
|
2050
2741
|
"--changed",
|
|
2742
|
+
"--authored",
|
|
2051
2743
|
"--env",
|
|
2052
2744
|
"--input",
|
|
2053
2745
|
"--provider",
|
|
@@ -2055,10 +2747,17 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2055
2747
|
"--release",
|
|
2056
2748
|
"--allow-dirty",
|
|
2057
2749
|
"--allow-public-sourcemaps",
|
|
2750
|
+
"--allow-missing-local-release",
|
|
2751
|
+
"--prepared-only",
|
|
2752
|
+
"--build",
|
|
2753
|
+
"--install-venv",
|
|
2058
2754
|
"--with-release",
|
|
2059
2755
|
"--concurrency",
|
|
2756
|
+
"--iterations",
|
|
2757
|
+
"--warmups",
|
|
2060
2758
|
"--sandbox-backend",
|
|
2061
2759
|
"--skip-tests",
|
|
2760
|
+
"--test-jobs",
|
|
2062
2761
|
"--skip-typecheck",
|
|
2063
2762
|
"--skip-eslint",
|
|
2064
2763
|
"--mock",
|
|
@@ -2071,8 +2770,14 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2071
2770
|
"--database-url",
|
|
2072
2771
|
"--worker",
|
|
2073
2772
|
"--no-worker",
|
|
2773
|
+
"--no-start",
|
|
2774
|
+
"--no-bridge",
|
|
2775
|
+
"--probe",
|
|
2776
|
+
"--probe-codex-server",
|
|
2074
2777
|
"--once",
|
|
2075
2778
|
"--limit",
|
|
2779
|
+
"--kind",
|
|
2780
|
+
"--session",
|
|
2076
2781
|
"--input",
|
|
2077
2782
|
"--args",
|
|
2078
2783
|
"--step",
|
|
@@ -2085,7 +2790,9 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2085
2790
|
"--strict-policies",
|
|
2086
2791
|
"--strict",
|
|
2087
2792
|
"--strict-secrets",
|
|
2793
|
+
"--internal",
|
|
2088
2794
|
"--env-file",
|
|
2795
|
+
"--skip-startup-console",
|
|
2089
2796
|
"--redacted",
|
|
2090
2797
|
"--mock-ai",
|
|
2091
2798
|
"--ai",
|
|
@@ -2108,12 +2815,25 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2108
2815
|
"--postgres-version",
|
|
2109
2816
|
"--runtime-port",
|
|
2110
2817
|
"--web-port",
|
|
2818
|
+
"--preview-port",
|
|
2819
|
+
"--preview-url",
|
|
2820
|
+
"--studio-url",
|
|
2821
|
+
"--interval-ms",
|
|
2822
|
+
"--workspace-id",
|
|
2111
2823
|
"--poll-interval",
|
|
2112
2824
|
"--allow-dev-auth",
|
|
2113
2825
|
"--token",
|
|
2114
2826
|
"--no-preserve-user-sections",
|
|
2115
2827
|
"--no-skills",
|
|
2116
2828
|
"--no-rules",
|
|
2829
|
+
"--full",
|
|
2830
|
+
"--brief",
|
|
2831
|
+
"--verbose",
|
|
2832
|
+
"--run-tests",
|
|
2833
|
+
"--model-level",
|
|
2834
|
+
"--live",
|
|
2835
|
+
"--no-delta",
|
|
2836
|
+
"--format",
|
|
2117
2837
|
]);
|
|
2118
2838
|
|
|
2119
2839
|
for (let index = 0; index < argv.length; index++) {
|
|
@@ -2124,6 +2844,8 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2124
2844
|
if (known.has(arg)) {
|
|
2125
2845
|
if (
|
|
2126
2846
|
arg === "--concurrency" ||
|
|
2847
|
+
arg === "--iterations" ||
|
|
2848
|
+
arg === "--warmups" ||
|
|
2127
2849
|
arg === "--field" ||
|
|
2128
2850
|
arg === "--fields" ||
|
|
2129
2851
|
arg === "--type" ||
|
|
@@ -2134,6 +2856,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2134
2856
|
arg === "--policy" ||
|
|
2135
2857
|
arg === "--emit" ||
|
|
2136
2858
|
arg === "--event" ||
|
|
2859
|
+
arg === "--entry" ||
|
|
2137
2860
|
arg === "--trigger" ||
|
|
2138
2861
|
arg === "--component" ||
|
|
2139
2862
|
arg === "--package" ||
|
|
@@ -2164,9 +2887,12 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2164
2887
|
arg === "--video" ||
|
|
2165
2888
|
arg === "--base-url" ||
|
|
2166
2889
|
arg === "--runtime-url" ||
|
|
2890
|
+
arg === "--workspace" ||
|
|
2167
2891
|
arg === "--scenario" ||
|
|
2168
2892
|
arg === "--timeout" ||
|
|
2169
2893
|
arg === "--timeout-ms" ||
|
|
2894
|
+
arg === "--test-jobs" ||
|
|
2895
|
+
arg === "--typechecker" ||
|
|
2170
2896
|
arg === "--name" ||
|
|
2171
2897
|
arg === "--auth-token" ||
|
|
2172
2898
|
arg === "--sandbox-backend" ||
|
|
@@ -2175,6 +2901,8 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2175
2901
|
arg === "--db" ||
|
|
2176
2902
|
arg === "--database-url" ||
|
|
2177
2903
|
arg === "--limit" ||
|
|
2904
|
+
arg === "--kind" ||
|
|
2905
|
+
arg === "--session" ||
|
|
2178
2906
|
arg === "--input" ||
|
|
2179
2907
|
arg === "--args" ||
|
|
2180
2908
|
arg === "--step" ||
|
|
@@ -2190,6 +2918,7 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2190
2918
|
arg === "--provider" ||
|
|
2191
2919
|
arg === "--model" ||
|
|
2192
2920
|
arg === "--prompt" ||
|
|
2921
|
+
arg === "--format" ||
|
|
2193
2922
|
arg === "--url" ||
|
|
2194
2923
|
arg === "--template" ||
|
|
2195
2924
|
arg === "--package-manager" ||
|
|
@@ -2197,6 +2926,11 @@ export function hasUnknownOption(argv: string[]): string | null {
|
|
|
2197
2926
|
arg === "--postgres-version" ||
|
|
2198
2927
|
arg === "--runtime-port" ||
|
|
2199
2928
|
arg === "--web-port" ||
|
|
2929
|
+
arg === "--preview-port" ||
|
|
2930
|
+
arg === "--preview-url" ||
|
|
2931
|
+
arg === "--studio-url" ||
|
|
2932
|
+
arg === "--interval-ms" ||
|
|
2933
|
+
arg === "--workspace-id" ||
|
|
2200
2934
|
arg === "--poll-interval" ||
|
|
2201
2935
|
arg === "--token"
|
|
2202
2936
|
|| arg === "--to" ||
|