forgeos 0.1.0-alpha.7 → 0.1.0-alpha.71

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