forgeos 0.1.0-alpha.0 → 0.1.0-alpha.2

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 (283) hide show
  1. package/.npmignore +9 -1
  2. package/AGENTS.md +6 -1
  3. package/CHANGELOG.md +30 -0
  4. package/CONTRIBUTING.md +22 -1
  5. package/README.md +30 -3
  6. package/bin/forge.mjs +4 -3
  7. package/package.json +3 -1
  8. package/packages/eslint-plugin-forge/index.ts +15 -15
  9. package/packages/eslint-plugin-forge/package.json +10 -10
  10. package/packages/eslint-plugin-forge/src/check-source.ts +95 -95
  11. package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -24
  12. package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -93
  13. package/src/forge/_generated/actionSubscriptions.json +2 -2
  14. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  15. package/src/forge/_generated/agentAdapterManifest.json +2 -2
  16. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  17. package/src/forge/_generated/agentContract.json +2 -2
  18. package/src/forge/_generated/agentContract.ts +6786 -2
  19. package/src/forge/_generated/agentQuickstart.md +1 -1
  20. package/src/forge/_generated/aiContext.ts +1 -1
  21. package/src/forge/_generated/aiModels.json +1 -1
  22. package/src/forge/_generated/aiModels.ts +1 -1
  23. package/src/forge/_generated/aiProviders.json +1 -1
  24. package/src/forge/_generated/aiProviders.ts +1 -1
  25. package/src/forge/_generated/aiRegistry.json +2 -2
  26. package/src/forge/_generated/aiRegistry.ts +3 -3
  27. package/src/forge/_generated/api.json +2 -2
  28. package/src/forge/_generated/api.ts +1 -1
  29. package/src/forge/_generated/appGraph.json +2 -2
  30. package/src/forge/_generated/appGraph.ts +1297 -1141
  31. package/src/forge/_generated/appMap.md +1 -1
  32. package/src/forge/_generated/artifactManifest.json +2 -2
  33. package/src/forge/_generated/artifactManifest.ts +2 -2
  34. package/src/forge/_generated/authClaims.json +1 -1
  35. package/src/forge/_generated/authClaims.ts +1 -1
  36. package/src/forge/_generated/authConfig.json +1 -1
  37. package/src/forge/_generated/authConfig.ts +1 -1
  38. package/src/forge/_generated/authContext.ts +1 -1
  39. package/src/forge/_generated/authRegistry.json +1 -1
  40. package/src/forge/_generated/authRegistry.ts +1 -1
  41. package/src/forge/_generated/buildInfo.json +2 -2
  42. package/src/forge/_generated/buildInfo.ts +4 -4
  43. package/src/forge/_generated/capabilityMap.json +2 -2
  44. package/src/forge/_generated/capabilityMap.md +1 -1
  45. package/src/forge/_generated/capabilityMap.ts +2 -2
  46. package/src/forge/_generated/client.ts +1 -1
  47. package/src/forge/_generated/clientApi.ts +1 -1
  48. package/src/forge/_generated/clientManifest.json +2 -2
  49. package/src/forge/_generated/clientManifest.ts +3 -3
  50. package/src/forge/_generated/clientTypes.ts +1 -1
  51. package/src/forge/_generated/configRegistry.json +1 -1
  52. package/src/forge/_generated/configRegistry.ts +1 -1
  53. package/src/forge/_generated/dataGraph.json +2 -2
  54. package/src/forge/_generated/dataGraph.ts +3 -3
  55. package/src/forge/_generated/db.json +1 -1
  56. package/src/forge/_generated/db.ts +1 -1
  57. package/src/forge/_generated/dbSecurityManifest.json +1 -1
  58. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  59. package/src/forge/_generated/dbSessionContext.json +1 -1
  60. package/src/forge/_generated/dbSessionContext.ts +1 -1
  61. package/src/forge/_generated/deployManifest.json +2 -2
  62. package/src/forge/_generated/deployManifest.ts +7 -7
  63. package/src/forge/_generated/devManifest.json +2 -2
  64. package/src/forge/_generated/devManifest.ts +3 -3
  65. package/src/forge/_generated/envSchema.json +1 -1
  66. package/src/forge/_generated/envSchema.ts +1 -1
  67. package/src/forge/_generated/frontendGraph.json +1 -1
  68. package/src/forge/_generated/frontendGraph.ts +1 -1
  69. package/src/forge/_generated/importGuards.json +2 -2
  70. package/src/forge/_generated/importGuards.ts +35 -1
  71. package/src/forge/_generated/index.ts +1 -1
  72. package/src/forge/_generated/liveProductionManifest.json +1 -1
  73. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  74. package/src/forge/_generated/liveProtocol.json +1 -1
  75. package/src/forge/_generated/liveProtocol.ts +1 -1
  76. package/src/forge/_generated/liveQueryRegistry.json +2 -2
  77. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  78. package/src/forge/_generated/liveTransportConfig.json +1 -1
  79. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  80. package/src/forge/_generated/makeRegistry.json +2 -2
  81. package/src/forge/_generated/makeRegistry.ts +2 -2
  82. package/src/forge/_generated/makeTemplates.json +1 -1
  83. package/src/forge/_generated/makeTemplates.ts +1 -1
  84. package/src/forge/_generated/mockMap.json +1 -1
  85. package/src/forge/_generated/mockMap.ts +1 -1
  86. package/src/forge/_generated/operationPlaybooks.md +7 -5
  87. package/src/forge/_generated/packageGraph.json +2 -2
  88. package/src/forge/_generated/packageGraph.ts +90964 -14284
  89. package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
  90. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  91. package/src/forge/_generated/permissionMatrix.json +2 -2
  92. package/src/forge/_generated/permissionMatrix.ts +3 -3
  93. package/src/forge/_generated/policyRegistry.json +2 -2
  94. package/src/forge/_generated/policyRegistry.ts +3 -3
  95. package/src/forge/_generated/queryRegistry.json +2 -2
  96. package/src/forge/_generated/queryRegistry.ts +3 -3
  97. package/src/forge/_generated/react.d.ts +1 -1
  98. package/src/forge/_generated/react.ts +1 -1
  99. package/src/forge/_generated/reactManifest.json +2 -2
  100. package/src/forge/_generated/reactManifest.ts +3 -3
  101. package/src/forge/_generated/releaseManifest.json +2 -2
  102. package/src/forge/_generated/releaseManifest.ts +3 -3
  103. package/src/forge/_generated/rlsPolicies.json +1 -1
  104. package/src/forge/_generated/rlsPolicies.sql +1 -1
  105. package/src/forge/_generated/rlsPolicies.ts +1 -1
  106. package/src/forge/_generated/runtimeGraph.json +2 -2
  107. package/src/forge/_generated/runtimeGraph.ts +3 -3
  108. package/src/forge/_generated/runtimeMatrix.json +2 -2
  109. package/src/forge/_generated/runtimeMatrix.ts +106177 -7917
  110. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  111. package/src/forge/_generated/runtimeRules.md +1 -1
  112. package/src/forge/_generated/secretRegistry.json +1 -1
  113. package/src/forge/_generated/secretRegistry.ts +1 -1
  114. package/src/forge/_generated/secretsContext.ts +1 -1
  115. package/src/forge/_generated/serverApi.ts +1 -1
  116. package/src/forge/_generated/sourceMapManifest.json +2 -2
  117. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  118. package/src/forge/_generated/sqlPlan.json +1 -1
  119. package/src/forge/_generated/sqlPlan.ts +1 -1
  120. package/src/forge/_generated/subscriptionManifest.json +2 -2
  121. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  122. package/src/forge/_generated/symbolicationManifest.json +2 -2
  123. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  124. package/src/forge/_generated/telemetryRegistry.json +2 -2
  125. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  126. package/src/forge/_generated/telemetrySinks.json +2 -2
  127. package/src/forge/_generated/telemetrySinks.ts +2 -2
  128. package/src/forge/_generated/tenantScope.json +2 -2
  129. package/src/forge/_generated/tenantScope.ts +3 -3
  130. package/src/forge/_generated/testGraph.json +2 -2
  131. package/src/forge/_generated/testGraph.ts +129 -75
  132. package/src/forge/_generated/testPlanRegistry.json +2 -2
  133. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  134. package/src/forge/_generated/uiRoutes.json +1 -1
  135. package/src/forge/_generated/uiRoutes.ts +1 -1
  136. package/src/forge/_generated/uiScenarios.json +1 -1
  137. package/src/forge/_generated/uiScenarios.ts +1 -1
  138. package/src/forge/_generated/uiTestManifest.json +2 -2
  139. package/src/forge/_generated/uiTestManifest.ts +2 -2
  140. package/src/forge/_generated/workflowRegistry.json +2 -2
  141. package/src/forge/_generated/workflowRegistry.ts +3 -3
  142. package/src/forge/_generated/workflowSubscriptions.json +2 -2
  143. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  144. package/src/forge/cli/commands.ts +861 -861
  145. package/src/forge/cli/deps.ts +178 -11
  146. package/src/forge/cli/dev.ts +32 -5
  147. package/src/forge/cli/index.ts +7 -7
  148. package/src/forge/cli/main.ts +54 -54
  149. package/src/forge/cli/new.ts +29 -1
  150. package/src/forge/cli/output.ts +97 -97
  151. package/src/forge/cli/parse.ts +679 -673
  152. package/src/forge/cli/version.ts +1 -1
  153. package/src/forge/compiler/agent-contract/build.ts +28 -0
  154. package/src/forge/compiler/agent-contract/types.ts +16 -0
  155. package/src/forge/compiler/app-graph/build.ts +112 -112
  156. package/src/forge/compiler/app-graph/classify.ts +10 -10
  157. package/src/forge/compiler/app-graph/dup-symbol.ts +29 -29
  158. package/src/forge/compiler/app-graph/extract.ts +123 -123
  159. package/src/forge/compiler/app-graph/forge-apis.ts +29 -29
  160. package/src/forge/compiler/app-graph/index.ts +11 -11
  161. package/src/forge/compiler/app-graph/module-graph.ts +316 -316
  162. package/src/forge/compiler/app-graph/parser.ts +119 -119
  163. package/src/forge/compiler/app-graph/symbols.ts +48 -48
  164. package/src/forge/compiler/app-graph/tsconfig-hash.ts +62 -62
  165. package/src/forge/compiler/app-graph/types.ts +43 -43
  166. package/src/forge/compiler/app-graph/versions.ts +14 -14
  167. package/src/forge/compiler/cache/index.ts +17 -17
  168. package/src/forge/compiler/cache/key.ts +46 -46
  169. package/src/forge/compiler/cache/scheduler.ts +72 -72
  170. package/src/forge/compiler/cache/store.ts +78 -78
  171. package/src/forge/compiler/classifier/capabilities.ts +78 -78
  172. package/src/forge/compiler/classifier/classify.ts +113 -113
  173. package/src/forge/compiler/classifier/contexts.ts +188 -188
  174. package/src/forge/compiler/classifier/index.ts +18 -18
  175. package/src/forge/compiler/classifier/runtime-matrix.ts +45 -45
  176. package/src/forge/compiler/classifier/secrets.ts +41 -41
  177. package/src/forge/compiler/classifier/signals.ts +129 -129
  178. package/src/forge/compiler/diagnostics/codes.ts +125 -120
  179. package/src/forge/compiler/diagnostics/create.ts +87 -87
  180. package/src/forge/compiler/diagnostics/index.ts +41 -41
  181. package/src/forge/compiler/emitter/artifact-kind.ts +14 -14
  182. package/src/forge/compiler/emitter/barrel.ts +38 -38
  183. package/src/forge/compiler/emitter/constants.ts +7 -7
  184. package/src/forge/compiler/emitter/emit.ts +234 -237
  185. package/src/forge/compiler/emitter/index.ts +24 -24
  186. package/src/forge/compiler/emitter/lock.ts +61 -61
  187. package/src/forge/compiler/emitter/render.ts +73 -73
  188. package/src/forge/compiler/guards/artifacts.ts +96 -96
  189. package/src/forge/compiler/guards/check-import-guards.ts +106 -106
  190. package/src/forge/compiler/guards/index.ts +11 -11
  191. package/src/forge/compiler/guards/propagate-contexts.ts +57 -57
  192. package/src/forge/compiler/index.ts +17 -17
  193. package/src/forge/compiler/integration/add.ts +493 -493
  194. package/src/forge/compiler/integration/index.ts +17 -17
  195. package/src/forge/compiler/integration/plan.ts +279 -279
  196. package/src/forge/compiler/integration/render.ts +189 -189
  197. package/src/forge/compiler/integration/snapshot.ts +52 -52
  198. package/src/forge/compiler/orchestrator/discover.ts +214 -214
  199. package/src/forge/compiler/orchestrator/guards.ts +5 -5
  200. package/src/forge/compiler/orchestrator/index.ts +27 -27
  201. package/src/forge/compiler/orchestrator/manifest.ts +69 -69
  202. package/src/forge/compiler/orchestrator/orphans.ts +51 -51
  203. package/src/forge/compiler/orchestrator/plan.ts +804 -804
  204. package/src/forge/compiler/orchestrator/run.ts +178 -178
  205. package/src/forge/compiler/orchestrator/serialize.ts +859 -859
  206. package/src/forge/compiler/orchestrator/types.ts +23 -23
  207. package/src/forge/compiler/orchestrator/verify.ts +35 -35
  208. package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -33
  209. package/src/forge/compiler/package-graph/checksum.ts +107 -97
  210. package/src/forge/compiler/package-graph/compiler.ts +444 -363
  211. package/src/forge/compiler/package-graph/constants.ts +4 -4
  212. package/src/forge/compiler/package-graph/exports-discovery.ts +91 -84
  213. package/src/forge/compiler/package-graph/extract-dts.ts +32 -32
  214. package/src/forge/compiler/package-graph/index.ts +24 -24
  215. package/src/forge/compiler/package-graph/jsdoc.ts +50 -50
  216. package/src/forge/compiler/package-graph/oracle.ts +326 -0
  217. package/src/forge/compiler/package-graph/read-file.ts +21 -21
  218. package/src/forge/compiler/package-graph/resolve.ts +131 -127
  219. package/src/forge/compiler/package-manager/adapter.ts +232 -232
  220. package/src/forge/compiler/package-manager/commands.ts +47 -47
  221. package/src/forge/compiler/package-manager/detect.ts +65 -65
  222. package/src/forge/compiler/package-manager/executor.ts +29 -29
  223. package/src/forge/compiler/package-manager/index.ts +22 -22
  224. package/src/forge/compiler/package-manager/parse-spec.ts +16 -16
  225. package/src/forge/compiler/package-manager/version.ts +20 -20
  226. package/src/forge/compiler/primitives/compare.ts +26 -26
  227. package/src/forge/compiler/primitives/hash.ts +42 -33
  228. package/src/forge/compiler/primitives/header.ts +43 -43
  229. package/src/forge/compiler/primitives/index.ts +45 -45
  230. package/src/forge/compiler/primitives/paths.ts +24 -24
  231. package/src/forge/compiler/primitives/serialize.ts +66 -66
  232. package/src/forge/compiler/primitives/sort.ts +87 -87
  233. package/src/forge/compiler/recipes/definitions.ts +269 -269
  234. package/src/forge/compiler/recipes/helpers.ts +37 -37
  235. package/src/forge/compiler/recipes/index.ts +21 -21
  236. package/src/forge/compiler/recipes/registry.ts +87 -87
  237. package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -26
  238. package/src/forge/compiler/sandbox/backends/child.ts +123 -123
  239. package/src/forge/compiler/sandbox/backends/docker.ts +173 -173
  240. package/src/forge/compiler/sandbox/index.ts +51 -51
  241. package/src/forge/compiler/sandbox/inspect.ts +143 -143
  242. package/src/forge/compiler/sandbox/inspector-entry.ts +115 -115
  243. package/src/forge/compiler/sandbox/limits.ts +31 -31
  244. package/src/forge/compiler/sandbox/scrub-env.ts +60 -60
  245. package/src/forge/compiler/sandbox/secret-scan.ts +54 -54
  246. package/src/forge/compiler/sandbox/serialize.ts +106 -106
  247. package/src/forge/compiler/sandbox/types.ts +7 -7
  248. package/src/forge/compiler/types/app-graph.ts +71 -71
  249. package/src/forge/compiler/types/capability.ts +29 -29
  250. package/src/forge/compiler/types/classification.ts +9 -9
  251. package/src/forge/compiler/types/cli.ts +85 -85
  252. package/src/forge/compiler/types/diagnostic.ts +2 -2
  253. package/src/forge/compiler/types/emit.ts +25 -25
  254. package/src/forge/compiler/types/import-guards.ts +19 -19
  255. package/src/forge/compiler/types/index.ts +98 -98
  256. package/src/forge/compiler/types/integration.ts +25 -25
  257. package/src/forge/compiler/types/json.ts +3 -3
  258. package/src/forge/compiler/types/lock.ts +37 -37
  259. package/src/forge/compiler/types/package-graph.ts +122 -77
  260. package/src/forge/compiler/types/runtime-matrix.ts +16 -16
  261. package/src/forge/compiler/types/runtime.ts +30 -30
  262. package/src/forge/compiler/types/sandbox.ts +24 -24
  263. package/src/forge/dev/server.ts +16 -2
  264. package/src/forge/refactor/index.ts +10 -2
  265. package/src/forge/refactor/runtime-rename.ts +598 -0
  266. package/src/forge/runtime/executor.ts +3 -2
  267. package/src/forge/runtime/live/live-query-runner.ts +2 -1
  268. package/src/forge/runtime/outbox/process.ts +2 -1
  269. package/src/forge/runtime/query/run-query.ts +2 -1
  270. package/src/forge/runtime/runner/run-entry.ts +2 -1
  271. package/src/forge/runtime/telemetry/sinks/posthog.ts +4 -5
  272. package/src/forge/runtime/telemetry/sinks/sentry.ts +4 -5
  273. package/src/forge/runtime/workflows/resolve-step.ts +2 -1
  274. package/src/forge/version.ts +3 -0
  275. package/templates/b2b-support-web/src/actions/captureTicketCreated.ts +7 -2
  276. package/templates/b2b-support-web/src/commands/closeTicket.ts +6 -1
  277. package/templates/b2b-support-web/src/commands/createTicket.ts +8 -2
  278. package/templates/b2b-support-web/src/queries/getTicket.ts +8 -1
  279. package/templates/b2b-support-web/web/components/CreateTicketForm.tsx +1 -2
  280. package/templates/b2b-support-web/web/components/PolicyDeniedDemo.tsx +1 -2
  281. package/templates/b2b-support-web/web/components/TicketList.tsx +1 -2
  282. package/templates/b2b-support-web/web/components/TraceDetails.tsx +1 -1
  283. package/templates/b2b-support-web/web/lib/forge.ts +1 -0
@@ -1,14 +1,14 @@
1
- import type { AddOptions, InspectTarget, VerifyOptions } from "../compiler/types/cli.ts";
2
- import type { SandboxBackend } from "../compiler/types/runtime.ts";
3
- import type { DbAdapterKind } from "../runtime/db/adapter.ts";
4
- import type { DbSubcommand } from "./db.ts";
5
- import type { OutboxSubcommand } from "./outbox.ts";
6
- import type { WorkflowSubcommand } from "./workflow.ts";
7
- import type { TelemetrySubcommand } from "./telemetry.ts";
8
- import type { PolicySubcommand } from "./policy.ts";
9
- import type { SecretsSubcommand } from "./secrets.ts";
10
- import type { EnvSubcommand } from "./secrets.ts";
11
- import type { AiSubcommand } from "./ai.ts";
1
+ import type { AddOptions, InspectTarget, VerifyOptions } from "../compiler/types/cli.ts";
2
+ import type { SandboxBackend } from "../compiler/types/runtime.ts";
3
+ import type { DbAdapterKind } from "../runtime/db/adapter.ts";
4
+ import type { DbSubcommand } from "./db.ts";
5
+ import type { OutboxSubcommand } from "./outbox.ts";
6
+ import type { WorkflowSubcommand } from "./workflow.ts";
7
+ import type { TelemetrySubcommand } from "./telemetry.ts";
8
+ import type { PolicySubcommand } from "./policy.ts";
9
+ import type { SecretsSubcommand } from "./secrets.ts";
10
+ import type { EnvSubcommand } from "./secrets.ts";
11
+ import type { AiSubcommand } from "./ai.ts";
12
12
  import type { QuerySubcommand } from "./query.ts";
13
13
  import type { LiveSubcommand } from "./live.ts";
14
14
  import type { ForgeAiProvider } from "../runtime/ai/types.ts";
@@ -118,6 +118,7 @@ export type ForgeCommand =
118
118
  kind: "deps";
119
119
  subcommand: DepsSubcommand;
120
120
  packageName?: string;
121
+ symbolName?: string;
121
122
  planPath?: string;
122
123
  target?: string;
123
124
  json: boolean;
@@ -153,21 +154,21 @@ export type ForgeCommand =
153
154
  | { kind: "review"; options: ReviewCommandOptions }
154
155
  | { kind: "ui"; options: UiCommandOptions }
155
156
  | { kind: "generate"; check: boolean; dryRun: boolean; json: boolean; concurrency: number }
156
- | { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
157
- | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
158
- | { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
159
- | { kind: "verify"; options: VerifyOptions }
160
- | { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
161
- | {
162
- kind: "dev";
163
- host?: string;
164
- port?: number;
157
+ | { kind: "add"; alias: string; options: AddOptions & { workspaceRoot: string } }
158
+ | { kind: "inspect"; target: InspectTarget; json: boolean; dryRun: boolean }
159
+ | { kind: "check"; json: boolean; dryRun: boolean; strictSecrets: boolean }
160
+ | { kind: "verify"; options: VerifyOptions }
161
+ | { kind: "run"; name?: string; list: boolean; json: boolean; mock: boolean; userId?: string; tenantId?: string; role?: string; envFile?: string; workspaceRoot: string; queryMode?: boolean; args?: unknown }
162
+ | {
163
+ kind: "dev";
164
+ host?: string;
165
+ port?: number;
165
166
  mock: boolean;
166
167
  mockAi: boolean;
167
168
  once: boolean;
168
169
  watch: boolean;
169
170
  json: boolean;
170
- db: "pglite" | "postgres" | "none";
171
+ db: "pglite" | "postgres" | "none";
171
172
  databaseUrl?: string;
172
173
  worker: boolean;
173
174
  withWeb: boolean;
@@ -176,91 +177,91 @@ export type ForgeCommand =
176
177
  open: boolean;
177
178
  webPort?: number;
178
179
  telemetry: string[];
179
- envFile?: string;
180
- workspaceRoot: string;
181
- }
182
- | {
183
- kind: "db";
184
- subcommand: DbSubcommand;
185
- db: DbAdapterKind;
186
- databaseUrl?: string;
187
- json: boolean;
188
- workspaceRoot: string;
189
- }
190
- | {
191
- kind: "outbox";
192
- subcommand: OutboxSubcommand;
193
- db: DbAdapterKind;
194
- databaseUrl?: string;
195
- json: boolean;
196
- once: boolean;
197
- watch: boolean;
198
- limit?: number;
199
- deliveryId?: number;
200
- mock: boolean;
201
- workspaceRoot: string;
202
- }
203
- | {
204
- kind: "workflow";
205
- subcommand: WorkflowSubcommand;
206
- db: DbAdapterKind;
207
- databaseUrl?: string;
208
- json: boolean;
209
- once: boolean;
210
- watch: boolean;
211
- limit?: number;
212
- workflowName?: string;
213
- runId?: number;
214
- stepName?: string;
215
- input?: unknown;
216
- mock: boolean;
217
- workspaceRoot: string;
218
- }
219
- | {
220
- kind: "telemetry";
221
- subcommand: TelemetrySubcommand;
222
- db: DbAdapterKind;
223
- databaseUrl?: string;
224
- json: boolean;
225
- traceId?: string;
226
- sink?: string;
227
- file?: "events" | "exceptions" | "spans";
228
- workspaceRoot: string;
229
- }
230
- | {
231
- kind: "policy";
232
- subcommand: PolicySubcommand;
233
- json: boolean;
234
- policy?: string;
235
- role?: string;
236
- strictPolicies: boolean;
237
- workspaceRoot: string;
238
- }
239
- | {
240
- kind: "secrets";
241
- subcommand: SecretsSubcommand;
242
- json: boolean;
243
- redacted: boolean;
244
- name?: string;
245
- value?: string;
246
- workspaceRoot: string;
247
- }
248
- | {
249
- kind: "env";
250
- subcommand: EnvSubcommand;
251
- json: boolean;
252
- redacted: boolean;
253
- workspaceRoot: string;
254
- }
180
+ envFile?: string;
181
+ workspaceRoot: string;
182
+ }
183
+ | {
184
+ kind: "db";
185
+ subcommand: DbSubcommand;
186
+ db: DbAdapterKind;
187
+ databaseUrl?: string;
188
+ json: boolean;
189
+ workspaceRoot: string;
190
+ }
191
+ | {
192
+ kind: "outbox";
193
+ subcommand: OutboxSubcommand;
194
+ db: DbAdapterKind;
195
+ databaseUrl?: string;
196
+ json: boolean;
197
+ once: boolean;
198
+ watch: boolean;
199
+ limit?: number;
200
+ deliveryId?: number;
201
+ mock: boolean;
202
+ workspaceRoot: string;
203
+ }
204
+ | {
205
+ kind: "workflow";
206
+ subcommand: WorkflowSubcommand;
207
+ db: DbAdapterKind;
208
+ databaseUrl?: string;
209
+ json: boolean;
210
+ once: boolean;
211
+ watch: boolean;
212
+ limit?: number;
213
+ workflowName?: string;
214
+ runId?: number;
215
+ stepName?: string;
216
+ input?: unknown;
217
+ mock: boolean;
218
+ workspaceRoot: string;
219
+ }
220
+ | {
221
+ kind: "telemetry";
222
+ subcommand: TelemetrySubcommand;
223
+ db: DbAdapterKind;
224
+ databaseUrl?: string;
225
+ json: boolean;
226
+ traceId?: string;
227
+ sink?: string;
228
+ file?: "events" | "exceptions" | "spans";
229
+ workspaceRoot: string;
230
+ }
231
+ | {
232
+ kind: "policy";
233
+ subcommand: PolicySubcommand;
234
+ json: boolean;
235
+ policy?: string;
236
+ role?: string;
237
+ strictPolicies: boolean;
238
+ workspaceRoot: string;
239
+ }
240
+ | {
241
+ kind: "secrets";
242
+ subcommand: SecretsSubcommand;
243
+ json: boolean;
244
+ redacted: boolean;
245
+ name?: string;
246
+ value?: string;
247
+ workspaceRoot: string;
248
+ }
249
+ | {
250
+ kind: "env";
251
+ subcommand: EnvSubcommand;
252
+ json: boolean;
253
+ redacted: boolean;
254
+ workspaceRoot: string;
255
+ }
255
256
  | {
256
257
  kind: "query";
257
- subcommand: QuerySubcommand;
258
- name?: string;
259
- args?: unknown;
260
- json: boolean;
261
- userId?: string;
262
- tenantId?: string;
263
- role?: string;
258
+ subcommand: QuerySubcommand;
259
+ name?: string;
260
+ args?: unknown;
261
+ json: boolean;
262
+ userId?: string;
263
+ tenantId?: string;
264
+ role?: string;
264
265
  workspaceRoot: string;
265
266
  }
266
267
  | {
@@ -275,23 +276,23 @@ export type ForgeCommand =
275
276
  url?: string;
276
277
  workspaceRoot: string;
277
278
  }
278
- | {
279
- kind: "ai";
280
- subcommand: AiSubcommand;
281
- json: boolean;
282
- provider?: ForgeAiProvider;
283
- model?: string;
284
- prompt?: string;
285
- mock: boolean;
286
- workspaceRoot: string;
287
- };
288
-
289
- export interface ParsedCli {
290
- command: ForgeCommand | null;
291
- workspaceRoot: string;
292
- errors: string[];
293
- }
294
-
279
+ | {
280
+ kind: "ai";
281
+ subcommand: AiSubcommand;
282
+ json: boolean;
283
+ provider?: ForgeAiProvider;
284
+ model?: string;
285
+ prompt?: string;
286
+ mock: boolean;
287
+ workspaceRoot: string;
288
+ };
289
+
290
+ export interface ParsedCli {
291
+ command: ForgeCommand | null;
292
+ workspaceRoot: string;
293
+ errors: string[];
294
+ }
295
+
295
296
  export const TOP_LEVEL_COMMANDS = [
296
297
  "new",
297
298
  "build",
@@ -338,19 +339,19 @@ export const INSPECT_TARGETS: InspectTarget[] = [
338
339
  "app",
339
340
  "packages",
340
341
  "capabilities",
341
- "runtime-matrix",
342
- "data",
343
- "runtime",
344
- "dev",
345
- "subscriptions",
346
- "workflows",
347
- "telemetry",
348
- "policies",
349
- "secrets",
350
- "env",
351
- "ai",
352
- "queries",
353
- "api",
342
+ "runtime-matrix",
343
+ "data",
344
+ "runtime",
345
+ "dev",
346
+ "subscriptions",
347
+ "workflows",
348
+ "telemetry",
349
+ "policies",
350
+ "secrets",
351
+ "env",
352
+ "ai",
353
+ "queries",
354
+ "api",
354
355
  "client",
355
356
  "frontend",
356
357
  "auth",
@@ -396,6 +397,9 @@ const RLS_SUBCOMMANDS: RlsSubcommand[] = ["generate", "check", "apply", "test"];
396
397
  const DEPS_SUBCOMMANDS: DepsSubcommand[] = [
397
398
  "outdated",
398
399
  "inspect",
400
+ "api",
401
+ "trace",
402
+ "runtime-compat",
399
403
  "diff",
400
404
  "upgrade-plan",
401
405
  "upgrade-apply",
@@ -514,11 +518,11 @@ const UI_BROWSERS: UiBrowserName[] = ["chromium", "firefox", "webkit"];
514
518
  const UI_TRACE_MODES: UiTraceMode[] = ["on", "off", "retain-on-failure"];
515
519
  const UI_SCREENSHOT_MODES: UiScreenshotMode[] = ["on", "off", "only-on-failure"];
516
520
  const UI_VIDEO_MODES: UiVideoMode[] = ["on", "off", "retain-on-failure"];
517
-
518
- function parseFlag(args: string[], flag: string): boolean {
519
- return args.includes(flag);
520
- }
521
-
521
+
522
+ function parseFlag(args: string[], flag: string): boolean {
523
+ return args.includes(flag);
524
+ }
525
+
522
526
  function parseOptionValue(args: string[], flag: string): string | undefined {
523
527
  const index = args.indexOf(flag);
524
528
  if (index === -1 || index + 1 >= args.length) {
@@ -537,42 +541,42 @@ function parseOptionValues(args: string[], flag: string): string[] {
537
541
  }
538
542
  return values;
539
543
  }
540
-
541
- function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
542
- if (value === "postgres" || value === "none") {
543
- return value;
544
- }
545
- return "pglite";
546
- }
547
-
544
+
545
+ function parseDbKind(value: string | undefined): "pglite" | "postgres" | "none" {
546
+ if (value === "postgres" || value === "none") {
547
+ return value;
548
+ }
549
+ return "pglite";
550
+ }
551
+
548
552
  function parseAdapterKind(value: string | undefined): DbAdapterKind {
549
- if (value === "postgres" || value === "memory") {
550
- return value;
551
- }
552
- return "pglite";
553
- }
554
-
555
- function parseSandboxBackend(value: string | undefined): SandboxBackend {
556
- if (value === "child" || value === "docker" || value === "none") {
557
- return value;
558
- }
559
- return "none";
560
- }
561
-
553
+ if (value === "postgres" || value === "memory") {
554
+ return value;
555
+ }
556
+ return "pglite";
557
+ }
558
+
559
+ function parseSandboxBackend(value: string | undefined): SandboxBackend {
560
+ if (value === "child" || value === "docker" || value === "none") {
561
+ return value;
562
+ }
563
+ return "none";
564
+ }
565
+
562
566
  function parseAddOptions(
563
- args: string[],
564
- workspaceRoot: string,
565
- ): AddOptions & { workspaceRoot: string } {
566
- return {
567
- workspaceRoot,
568
- json: parseFlag(args, "--json"),
569
- dryRun: parseFlag(args, "--dry-run"),
570
- runtimeInspect: parseFlag(args, "--runtime-inspect"),
571
- sandboxBackend: parseSandboxBackend(
572
- parseOptionValue(args, "--sandbox-backend"),
573
- ),
574
- allowScripts: parseFlag(args, "--allow-scripts"),
575
- };
567
+ args: string[],
568
+ workspaceRoot: string,
569
+ ): AddOptions & { workspaceRoot: string } {
570
+ return {
571
+ workspaceRoot,
572
+ json: parseFlag(args, "--json"),
573
+ dryRun: parseFlag(args, "--dry-run"),
574
+ runtimeInspect: parseFlag(args, "--runtime-inspect"),
575
+ sandboxBackend: parseSandboxBackend(
576
+ parseOptionValue(args, "--sandbox-backend"),
577
+ ),
578
+ allowScripts: parseFlag(args, "--allow-scripts"),
579
+ };
576
580
  }
577
581
 
578
582
  function parseTestCost(value: string | undefined): TestCost {
@@ -645,21 +649,21 @@ function parseDoObjective(rest: string[], argv: string[]): string {
645
649
  }
646
650
  return rest.join(" ").trim() || "inspect project";
647
651
  }
648
-
649
- export function parseCli(argv: string[]): ParsedCli {
650
- const errors: string[] = [];
651
- const positional = argv.filter((arg) => !arg.startsWith("-"));
652
- const workspaceRoot = process.cwd().replace(/\\/g, "/");
653
-
652
+
653
+ export function parseCli(argv: string[]): ParsedCli {
654
+ const errors: string[] = [];
655
+ const positional = argv.filter((arg) => !arg.startsWith("-"));
656
+ const workspaceRoot = process.cwd().replace(/\\/g, "/");
657
+
654
658
  if (positional.length === 0) {
655
659
  errors.push(
656
660
  `missing command; expected ${TOP_LEVEL_COMMANDS.join(", ")}`,
657
661
  );
658
662
  return { command: null, workspaceRoot, errors };
659
663
  }
660
-
661
- const [commandName, ...rest] = positional;
662
-
664
+
665
+ const [commandName, ...rest] = positional;
666
+
663
667
  switch (commandName) {
664
668
  case "new": {
665
669
  const name = rest[0];
@@ -1005,11 +1009,12 @@ export function parseCli(argv: string[]): ParsedCli {
1005
1009
  case "deps": {
1006
1010
  const subcommand = rest[0] as DepsSubcommand | undefined;
1007
1011
  if (!subcommand || !DEPS_SUBCOMMANDS.includes(subcommand)) {
1008
- errors.push("forge deps requires subcommand: outdated, inspect, diff, upgrade-plan, upgrade-apply, upgrade-check, upgrade-rollback, or risk");
1012
+ errors.push("forge deps requires subcommand: outdated, inspect, api, trace, runtime-compat, diff, upgrade-plan, upgrade-apply, upgrade-check, upgrade-rollback, or risk");
1009
1013
  return { command: null, workspaceRoot, errors };
1010
1014
  }
1011
1015
  const packageName =
1012
1016
  subcommand === "outdated" || subcommand === "upgrade-check" ? undefined : rest[1];
1017
+ const symbolName = subcommand === "api" ? rest[2] : undefined;
1013
1018
  const planPath =
1014
1019
  subcommand === "upgrade-apply" || subcommand === "upgrade-rollback"
1015
1020
  ? rest[1]
@@ -1019,6 +1024,7 @@ export function parseCli(argv: string[]): ParsedCli {
1019
1024
  kind: "deps",
1020
1025
  subcommand,
1021
1026
  packageName,
1027
+ symbolName,
1022
1028
  planPath,
1023
1029
  target: parseOptionValue(argv, "--to"),
1024
1030
  json: parseFlag(argv, "--json"),
@@ -1407,68 +1413,68 @@ export function parseCli(argv: string[]): ParsedCli {
1407
1413
  }
1408
1414
  case "generate": {
1409
1415
  const concurrencyRaw = parseOptionValue(argv, "--concurrency");
1410
- const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
1411
- if (!Number.isFinite(concurrency) || concurrency < 1) {
1412
- errors.push("--concurrency must be an integer >= 1");
1413
- }
1414
- return {
1415
- command: {
1416
- kind: "generate",
1417
- check: parseFlag(argv, "--check"),
1418
- dryRun: parseFlag(argv, "--dry-run"),
1419
- json: parseFlag(argv, "--json"),
1420
- concurrency: Math.max(1, Math.floor(concurrency || 4)),
1421
- },
1422
- workspaceRoot,
1423
- errors,
1424
- };
1425
- }
1426
- case "add": {
1427
- const alias = rest[0];
1428
- if (!alias) {
1429
- errors.push("forge add requires an integration alias");
1430
- return { command: null, workspaceRoot, errors };
1431
- }
1432
- return {
1433
- command: {
1434
- kind: "add",
1435
- alias,
1436
- options: parseAddOptions(argv, workspaceRoot),
1437
- },
1438
- workspaceRoot,
1439
- errors,
1440
- };
1441
- }
1442
- case "inspect": {
1443
- const target = rest[0] as InspectTarget | undefined;
1444
- if (!target || !INSPECT_TARGETS.includes(target)) {
1445
- errors.push(
1446
- `unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
1447
- );
1448
- return { command: null, workspaceRoot, errors };
1449
- }
1450
- return {
1451
- command: {
1452
- kind: "inspect",
1453
- target,
1454
- json: parseFlag(argv, "--json"),
1455
- dryRun: parseFlag(argv, "--dry-run"),
1456
- },
1457
- workspaceRoot,
1458
- errors,
1459
- };
1460
- }
1461
- case "check":
1462
- return {
1463
- command: {
1464
- kind: "check",
1465
- json: parseFlag(argv, "--json"),
1466
- dryRun: parseFlag(argv, "--dry-run"),
1467
- strictSecrets: parseFlag(argv, "--strict-secrets"),
1468
- },
1469
- workspaceRoot,
1470
- errors,
1471
- };
1416
+ const concurrency = concurrencyRaw ? Number(concurrencyRaw) : 4;
1417
+ if (!Number.isFinite(concurrency) || concurrency < 1) {
1418
+ errors.push("--concurrency must be an integer >= 1");
1419
+ }
1420
+ return {
1421
+ command: {
1422
+ kind: "generate",
1423
+ check: parseFlag(argv, "--check"),
1424
+ dryRun: parseFlag(argv, "--dry-run"),
1425
+ json: parseFlag(argv, "--json"),
1426
+ concurrency: Math.max(1, Math.floor(concurrency || 4)),
1427
+ },
1428
+ workspaceRoot,
1429
+ errors,
1430
+ };
1431
+ }
1432
+ case "add": {
1433
+ const alias = rest[0];
1434
+ if (!alias) {
1435
+ errors.push("forge add requires an integration alias");
1436
+ return { command: null, workspaceRoot, errors };
1437
+ }
1438
+ return {
1439
+ command: {
1440
+ kind: "add",
1441
+ alias,
1442
+ options: parseAddOptions(argv, workspaceRoot),
1443
+ },
1444
+ workspaceRoot,
1445
+ errors,
1446
+ };
1447
+ }
1448
+ case "inspect": {
1449
+ const target = rest[0] as InspectTarget | undefined;
1450
+ if (!target || !INSPECT_TARGETS.includes(target)) {
1451
+ errors.push(
1452
+ `unsupported inspect target; supported: ${INSPECT_TARGETS.join(", ")}`,
1453
+ );
1454
+ return { command: null, workspaceRoot, errors };
1455
+ }
1456
+ return {
1457
+ command: {
1458
+ kind: "inspect",
1459
+ target,
1460
+ json: parseFlag(argv, "--json"),
1461
+ dryRun: parseFlag(argv, "--dry-run"),
1462
+ },
1463
+ workspaceRoot,
1464
+ errors,
1465
+ };
1466
+ }
1467
+ case "check":
1468
+ return {
1469
+ command: {
1470
+ kind: "check",
1471
+ json: parseFlag(argv, "--json"),
1472
+ dryRun: parseFlag(argv, "--dry-run"),
1473
+ strictSecrets: parseFlag(argv, "--strict-secrets"),
1474
+ },
1475
+ workspaceRoot,
1476
+ errors,
1477
+ };
1472
1478
  case "verify":
1473
1479
  {
1474
1480
  const scriptTimeoutRaw = parseOptionValue(argv, "--script-timeout-ms");
@@ -1483,10 +1489,10 @@ export function parseCli(argv: string[]): ParsedCli {
1483
1489
  command: {
1484
1490
  kind: "verify",
1485
1491
  options: {
1486
- workspaceRoot,
1487
- json: parseFlag(argv, "--json"),
1488
- skipTests: parseFlag(argv, "--skip-tests"),
1489
- skipTypecheck: parseFlag(argv, "--skip-typecheck"),
1492
+ workspaceRoot,
1493
+ json: parseFlag(argv, "--json"),
1494
+ skipTests: parseFlag(argv, "--skip-tests"),
1495
+ skipTypecheck: parseFlag(argv, "--skip-typecheck"),
1490
1496
  skipEslint: parseFlag(argv, "--skip-eslint"),
1491
1497
  strict: parseFlag(argv, "--strict"),
1492
1498
  changed: parseFlag(argv, "--changed"),
@@ -1500,96 +1506,96 @@ export function parseCli(argv: string[]): ParsedCli {
1500
1506
  errors,
1501
1507
  };
1502
1508
  }
1503
- case "run": {
1504
- if (rest[0] === "query") {
1505
- const queryName = rest[1];
1506
- if (!queryName) {
1507
- errors.push("forge run query requires a query name");
1508
- }
1509
- const argsRaw = parseOptionValue(argv, "--args");
1510
- let args: unknown = {};
1511
- if (argsRaw !== undefined) {
1512
- try {
1513
- args = JSON.parse(argsRaw);
1514
- } catch {
1515
- errors.push("--args must be valid JSON");
1516
- }
1517
- }
1518
- return {
1519
- command: {
1520
- kind: "run",
1521
- name: queryName,
1522
- list: false,
1523
- json: parseFlag(argv, "--json"),
1524
- mock: parseFlag(argv, "--mock"),
1525
- userId: parseOptionValue(argv, "--user-id"),
1526
- tenantId: parseOptionValue(argv, "--tenant-id"),
1527
- role: parseOptionValue(argv, "--role"),
1528
- envFile: parseOptionValue(argv, "--env-file"),
1529
- workspaceRoot,
1530
- queryMode: true,
1531
- args,
1532
- },
1533
- workspaceRoot,
1534
- errors,
1535
- };
1536
- }
1537
-
1538
- const name = rest[0];
1539
- const list = parseFlag(argv, "--list") || !name;
1540
- return {
1541
- command: {
1542
- kind: "run",
1543
- name,
1544
- list,
1545
- json: parseFlag(argv, "--json"),
1546
- mock: parseFlag(argv, "--mock"),
1547
- userId: parseOptionValue(argv, "--user-id"),
1548
- tenantId: parseOptionValue(argv, "--tenant-id"),
1549
- role: parseOptionValue(argv, "--role"),
1550
- envFile: parseOptionValue(argv, "--env-file"),
1551
- workspaceRoot,
1552
- },
1553
- workspaceRoot,
1554
- errors,
1555
- };
1556
- }
1509
+ case "run": {
1510
+ if (rest[0] === "query") {
1511
+ const queryName = rest[1];
1512
+ if (!queryName) {
1513
+ errors.push("forge run query requires a query name");
1514
+ }
1515
+ const argsRaw = parseOptionValue(argv, "--args");
1516
+ let args: unknown = {};
1517
+ if (argsRaw !== undefined) {
1518
+ try {
1519
+ args = JSON.parse(argsRaw);
1520
+ } catch {
1521
+ errors.push("--args must be valid JSON");
1522
+ }
1523
+ }
1524
+ return {
1525
+ command: {
1526
+ kind: "run",
1527
+ name: queryName,
1528
+ list: false,
1529
+ json: parseFlag(argv, "--json"),
1530
+ mock: parseFlag(argv, "--mock"),
1531
+ userId: parseOptionValue(argv, "--user-id"),
1532
+ tenantId: parseOptionValue(argv, "--tenant-id"),
1533
+ role: parseOptionValue(argv, "--role"),
1534
+ envFile: parseOptionValue(argv, "--env-file"),
1535
+ workspaceRoot,
1536
+ queryMode: true,
1537
+ args,
1538
+ },
1539
+ workspaceRoot,
1540
+ errors,
1541
+ };
1542
+ }
1543
+
1544
+ const name = rest[0];
1545
+ const list = parseFlag(argv, "--list") || !name;
1546
+ return {
1547
+ command: {
1548
+ kind: "run",
1549
+ name,
1550
+ list,
1551
+ json: parseFlag(argv, "--json"),
1552
+ mock: parseFlag(argv, "--mock"),
1553
+ userId: parseOptionValue(argv, "--user-id"),
1554
+ tenantId: parseOptionValue(argv, "--tenant-id"),
1555
+ role: parseOptionValue(argv, "--role"),
1556
+ envFile: parseOptionValue(argv, "--env-file"),
1557
+ workspaceRoot,
1558
+ },
1559
+ workspaceRoot,
1560
+ errors,
1561
+ };
1562
+ }
1557
1563
  case "query": {
1558
- const subcommand = (rest[0] ?? "list") as QuerySubcommand;
1559
- if (!["list", "run"].includes(subcommand)) {
1560
- errors.push("forge query requires subcommand: list or run");
1561
- return { command: null, workspaceRoot, errors };
1562
- }
1563
-
1564
- const queryName = subcommand === "run" ? rest[1] : undefined;
1565
- if (subcommand === "run" && !queryName) {
1566
- errors.push("forge query run requires a query name");
1567
- }
1568
-
1569
- const argsRaw = parseOptionValue(argv, "--args");
1570
- let args: unknown = {};
1571
- if (argsRaw !== undefined) {
1572
- try {
1573
- args = JSON.parse(argsRaw);
1574
- } catch {
1575
- errors.push("--args must be valid JSON");
1576
- }
1577
- }
1578
-
1579
- return {
1580
- command: {
1581
- kind: "query",
1582
- subcommand,
1583
- name: queryName,
1584
- args,
1585
- json: parseFlag(argv, "--json"),
1586
- userId: parseOptionValue(argv, "--user-id"),
1587
- tenantId: parseOptionValue(argv, "--tenant-id"),
1588
- role: parseOptionValue(argv, "--role"),
1589
- workspaceRoot,
1590
- },
1591
- workspaceRoot,
1592
- errors,
1564
+ const subcommand = (rest[0] ?? "list") as QuerySubcommand;
1565
+ if (!["list", "run"].includes(subcommand)) {
1566
+ errors.push("forge query requires subcommand: list or run");
1567
+ return { command: null, workspaceRoot, errors };
1568
+ }
1569
+
1570
+ const queryName = subcommand === "run" ? rest[1] : undefined;
1571
+ if (subcommand === "run" && !queryName) {
1572
+ errors.push("forge query run requires a query name");
1573
+ }
1574
+
1575
+ const argsRaw = parseOptionValue(argv, "--args");
1576
+ let args: unknown = {};
1577
+ if (argsRaw !== undefined) {
1578
+ try {
1579
+ args = JSON.parse(argsRaw);
1580
+ } catch {
1581
+ errors.push("--args must be valid JSON");
1582
+ }
1583
+ }
1584
+
1585
+ return {
1586
+ command: {
1587
+ kind: "query",
1588
+ subcommand,
1589
+ name: queryName,
1590
+ args,
1591
+ json: parseFlag(argv, "--json"),
1592
+ userId: parseOptionValue(argv, "--user-id"),
1593
+ tenantId: parseOptionValue(argv, "--tenant-id"),
1594
+ role: parseOptionValue(argv, "--role"),
1595
+ workspaceRoot,
1596
+ },
1597
+ workspaceRoot,
1598
+ errors,
1593
1599
  };
1594
1600
  }
1595
1601
  case "live": {
@@ -1633,7 +1639,7 @@ export function parseCli(argv: string[]): ParsedCli {
1633
1639
  errors,
1634
1640
  };
1635
1641
  }
1636
- case "dev": {
1642
+ case "dev": {
1637
1643
  const portRaw = parseOptionValue(argv, "--port");
1638
1644
  const port = portRaw !== undefined ? Number(portRaw) : undefined;
1639
1645
  if (portRaw !== undefined && (!Number.isFinite(port) || port! < 0)) {
@@ -1650,8 +1656,8 @@ export function parseCli(argv: string[]): ParsedCli {
1650
1656
  return {
1651
1657
  command: {
1652
1658
  kind: "dev",
1653
- host: parseOptionValue(argv, "--host"),
1654
- port,
1659
+ host: parseOptionValue(argv, "--host"),
1660
+ port,
1655
1661
  mock: parseFlag(argv, "--mock"),
1656
1662
  mockAi,
1657
1663
  once: parseFlag(argv, "--once"),
@@ -1666,149 +1672,149 @@ export function parseCli(argv: string[]): ParsedCli {
1666
1672
  open: parseFlag(argv, "--open"),
1667
1673
  webPort,
1668
1674
  telemetry: (parseOptionValue(argv, "--telemetry") ?? "local")
1669
- .split(",")
1670
- .map((value) => value.trim())
1671
- .filter(Boolean),
1672
- envFile: parseOptionValue(argv, "--env-file"),
1673
- workspaceRoot,
1674
- },
1675
- workspaceRoot,
1676
- errors,
1677
- };
1678
- }
1675
+ .split(",")
1676
+ .map((value) => value.trim())
1677
+ .filter(Boolean),
1678
+ envFile: parseOptionValue(argv, "--env-file"),
1679
+ workspaceRoot,
1680
+ },
1681
+ workspaceRoot,
1682
+ errors,
1683
+ };
1684
+ }
1679
1685
  case "db": {
1680
1686
  const subcommand = rest[0] as DbSubcommand | undefined;
1681
1687
  if (!subcommand || !["diff", "migrate", "reset", "status", "rls-check"].includes(subcommand)) {
1682
1688
  errors.push("forge db requires subcommand: diff, migrate, reset, status, or rls-check");
1683
- return { command: null, workspaceRoot, errors };
1684
- }
1685
- return {
1686
- command: {
1687
- kind: "db",
1688
- subcommand,
1689
- db: parseAdapterKind(parseOptionValue(argv, "--db")),
1690
- databaseUrl: parseOptionValue(argv, "--database-url"),
1691
- json: parseFlag(argv, "--json"),
1692
- workspaceRoot,
1693
- },
1694
- workspaceRoot,
1695
- errors,
1696
- };
1697
- }
1698
- case "workflow": {
1699
- const subcommand = rest[0] as WorkflowSubcommand | undefined;
1700
- if (
1701
- !subcommand ||
1702
- !["list", "run", "inspect", "process", "retry", "cancel"].includes(subcommand)
1703
- ) {
1704
- errors.push(
1705
- "forge workflow requires subcommand: list, run, inspect, process, retry, or cancel",
1706
- );
1707
- return { command: null, workspaceRoot, errors };
1708
- }
1709
-
1710
- const limitRaw = parseOptionValue(argv, "--limit");
1711
- const limit = limitRaw !== undefined ? Number(limitRaw) : undefined;
1712
- if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1713
- errors.push("--limit must be an integer >= 1");
1714
- }
1715
-
1716
- const inputRaw = parseOptionValue(argv, "--input");
1717
- let input: unknown;
1718
- if (inputRaw !== undefined) {
1719
- try {
1720
- input = JSON.parse(inputRaw);
1721
- } catch {
1722
- errors.push("--input must be valid JSON");
1723
- }
1724
- }
1725
-
1726
- const stepName = parseOptionValue(argv, "--step");
1727
- let runId: number | undefined;
1728
- let workflowName: string | undefined;
1729
-
1730
- if (subcommand === "run") {
1731
- workflowName = rest[1];
1732
- if (!workflowName) {
1733
- errors.push("forge workflow run requires a workflow name");
1734
- }
1735
- } else if (["inspect", "retry", "cancel"].includes(subcommand)) {
1736
- const runIdRaw = rest[1];
1737
- runId = runIdRaw !== undefined ? Number(runIdRaw) : undefined;
1738
- if (runIdRaw !== undefined && !Number.isFinite(runId)) {
1739
- errors.push("run id must be a number");
1740
- }
1741
- if (!runIdRaw) {
1742
- errors.push(`forge workflow ${subcommand} requires a run id`);
1743
- }
1744
- }
1745
-
1746
- return {
1747
- command: {
1748
- kind: "workflow",
1749
- subcommand,
1750
- db: parseAdapterKind(parseOptionValue(argv, "--db")),
1751
- databaseUrl: parseOptionValue(argv, "--database-url"),
1752
- json: parseFlag(argv, "--json"),
1753
- once: parseFlag(argv, "--once"),
1754
- watch: parseFlag(argv, "--watch"),
1755
- limit,
1756
- workflowName,
1757
- runId,
1758
- stepName,
1759
- input,
1760
- mock: parseFlag(argv, "--mock"),
1761
- workspaceRoot,
1762
- },
1763
- workspaceRoot,
1764
- errors,
1765
- };
1766
- }
1767
- case "outbox": {
1768
- const subcommand = rest[0] as OutboxSubcommand | undefined;
1769
- if (
1770
- !subcommand ||
1771
- !["list", "process", "retry", "dead", "clear"].includes(subcommand)
1772
- ) {
1773
- errors.push(
1774
- "forge outbox requires subcommand: list, process, retry, dead, or clear",
1775
- );
1776
- return { command: null, workspaceRoot, errors };
1777
- }
1778
-
1779
- const limitRaw = parseOptionValue(argv, "--limit");
1780
- const limit = limitRaw !== undefined ? Number(limitRaw) : undefined;
1781
- if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1782
- errors.push("--limit must be an integer >= 1");
1783
- }
1784
-
1785
- const deliveryIdRaw = subcommand === "retry" ? rest[1] : undefined;
1786
- const deliveryId =
1787
- deliveryIdRaw !== undefined ? Number(deliveryIdRaw) : undefined;
1788
- if (deliveryIdRaw !== undefined && !Number.isFinite(deliveryId)) {
1789
- errors.push("delivery id must be a number");
1790
- }
1791
-
1792
- return {
1793
- command: {
1794
- kind: "outbox",
1795
- subcommand,
1796
- db: parseAdapterKind(parseOptionValue(argv, "--db")),
1797
- databaseUrl: parseOptionValue(argv, "--database-url"),
1798
- json: parseFlag(argv, "--json"),
1799
- once: parseFlag(argv, "--once"),
1800
- watch: parseFlag(argv, "--watch"),
1801
- limit,
1802
- deliveryId,
1803
- mock: parseFlag(argv, "--mock"),
1804
- workspaceRoot,
1805
- },
1806
- workspaceRoot,
1807
- errors,
1808
- };
1809
- }
1810
- case "telemetry": {
1811
- const subcommand = rest[0] as TelemetrySubcommand | undefined;
1689
+ return { command: null, workspaceRoot, errors };
1690
+ }
1691
+ return {
1692
+ command: {
1693
+ kind: "db",
1694
+ subcommand,
1695
+ db: parseAdapterKind(parseOptionValue(argv, "--db")),
1696
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1697
+ json: parseFlag(argv, "--json"),
1698
+ workspaceRoot,
1699
+ },
1700
+ workspaceRoot,
1701
+ errors,
1702
+ };
1703
+ }
1704
+ case "workflow": {
1705
+ const subcommand = rest[0] as WorkflowSubcommand | undefined;
1706
+ if (
1707
+ !subcommand ||
1708
+ !["list", "run", "inspect", "process", "retry", "cancel"].includes(subcommand)
1709
+ ) {
1710
+ errors.push(
1711
+ "forge workflow requires subcommand: list, run, inspect, process, retry, or cancel",
1712
+ );
1713
+ return { command: null, workspaceRoot, errors };
1714
+ }
1715
+
1716
+ const limitRaw = parseOptionValue(argv, "--limit");
1717
+ const limit = limitRaw !== undefined ? Number(limitRaw) : undefined;
1718
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1719
+ errors.push("--limit must be an integer >= 1");
1720
+ }
1721
+
1722
+ const inputRaw = parseOptionValue(argv, "--input");
1723
+ let input: unknown;
1724
+ if (inputRaw !== undefined) {
1725
+ try {
1726
+ input = JSON.parse(inputRaw);
1727
+ } catch {
1728
+ errors.push("--input must be valid JSON");
1729
+ }
1730
+ }
1731
+
1732
+ const stepName = parseOptionValue(argv, "--step");
1733
+ let runId: number | undefined;
1734
+ let workflowName: string | undefined;
1735
+
1736
+ if (subcommand === "run") {
1737
+ workflowName = rest[1];
1738
+ if (!workflowName) {
1739
+ errors.push("forge workflow run requires a workflow name");
1740
+ }
1741
+ } else if (["inspect", "retry", "cancel"].includes(subcommand)) {
1742
+ const runIdRaw = rest[1];
1743
+ runId = runIdRaw !== undefined ? Number(runIdRaw) : undefined;
1744
+ if (runIdRaw !== undefined && !Number.isFinite(runId)) {
1745
+ errors.push("run id must be a number");
1746
+ }
1747
+ if (!runIdRaw) {
1748
+ errors.push(`forge workflow ${subcommand} requires a run id`);
1749
+ }
1750
+ }
1751
+
1752
+ return {
1753
+ command: {
1754
+ kind: "workflow",
1755
+ subcommand,
1756
+ db: parseAdapterKind(parseOptionValue(argv, "--db")),
1757
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1758
+ json: parseFlag(argv, "--json"),
1759
+ once: parseFlag(argv, "--once"),
1760
+ watch: parseFlag(argv, "--watch"),
1761
+ limit,
1762
+ workflowName,
1763
+ runId,
1764
+ stepName,
1765
+ input,
1766
+ mock: parseFlag(argv, "--mock"),
1767
+ workspaceRoot,
1768
+ },
1769
+ workspaceRoot,
1770
+ errors,
1771
+ };
1772
+ }
1773
+ case "outbox": {
1774
+ const subcommand = rest[0] as OutboxSubcommand | undefined;
1775
+ if (
1776
+ !subcommand ||
1777
+ !["list", "process", "retry", "dead", "clear"].includes(subcommand)
1778
+ ) {
1779
+ errors.push(
1780
+ "forge outbox requires subcommand: list, process, retry, dead, or clear",
1781
+ );
1782
+ return { command: null, workspaceRoot, errors };
1783
+ }
1784
+
1785
+ const limitRaw = parseOptionValue(argv, "--limit");
1786
+ const limit = limitRaw !== undefined ? Number(limitRaw) : undefined;
1787
+ if (limitRaw !== undefined && (!Number.isFinite(limit) || limit! < 1)) {
1788
+ errors.push("--limit must be an integer >= 1");
1789
+ }
1790
+
1791
+ const deliveryIdRaw = subcommand === "retry" ? rest[1] : undefined;
1792
+ const deliveryId =
1793
+ deliveryIdRaw !== undefined ? Number(deliveryIdRaw) : undefined;
1794
+ if (deliveryIdRaw !== undefined && !Number.isFinite(deliveryId)) {
1795
+ errors.push("delivery id must be a number");
1796
+ }
1797
+
1798
+ return {
1799
+ command: {
1800
+ kind: "outbox",
1801
+ subcommand,
1802
+ db: parseAdapterKind(parseOptionValue(argv, "--db")),
1803
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1804
+ json: parseFlag(argv, "--json"),
1805
+ once: parseFlag(argv, "--once"),
1806
+ watch: parseFlag(argv, "--watch"),
1807
+ limit,
1808
+ deliveryId,
1809
+ mock: parseFlag(argv, "--mock"),
1810
+ workspaceRoot,
1811
+ },
1812
+ workspaceRoot,
1813
+ errors,
1814
+ };
1815
+ }
1816
+ case "telemetry": {
1817
+ const subcommand = rest[0] as TelemetrySubcommand | undefined;
1812
1818
  if (
1813
1819
  !subcommand ||
1814
1820
  !["list", "inspect", "symbolicate", "flush", "tail", "clear"].includes(subcommand)
@@ -1816,142 +1822,142 @@ export function parseCli(argv: string[]): ParsedCli {
1816
1822
  errors.push(
1817
1823
  "forge telemetry requires subcommand: list, inspect, symbolicate, flush, tail, or clear",
1818
1824
  );
1819
- return { command: null, workspaceRoot, errors };
1820
- }
1821
-
1822
- let traceId: string | undefined;
1825
+ return { command: null, workspaceRoot, errors };
1826
+ }
1827
+
1828
+ let traceId: string | undefined;
1823
1829
  if (subcommand === "inspect" || subcommand === "symbolicate") {
1824
- traceId = rest[1];
1825
- if (!traceId) {
1826
- errors.push("forge telemetry inspect requires a trace id");
1827
- }
1828
- }
1829
-
1830
- return {
1831
- command: {
1832
- kind: "telemetry",
1833
- subcommand,
1834
- db: parseAdapterKind(parseOptionValue(argv, "--db")),
1835
- databaseUrl: parseOptionValue(argv, "--database-url"),
1836
- json: parseFlag(argv, "--json"),
1837
- traceId,
1838
- sink: parseOptionValue(argv, "--sink"),
1839
- file: parseOptionValue(argv, "--file") as "events" | "exceptions" | "spans" | undefined,
1840
- workspaceRoot,
1841
- },
1842
- workspaceRoot,
1843
- errors,
1844
- };
1845
- }
1846
- case "policy": {
1847
- const subcommand = rest[0] as PolicySubcommand | undefined;
1848
- if (!subcommand || !["list", "matrix", "simulate", "check"].includes(subcommand)) {
1849
- errors.push("forge policy requires subcommand: list, matrix, simulate, or check");
1850
- return { command: null, workspaceRoot, errors };
1851
- }
1852
-
1853
- let policyName: string | undefined;
1854
- if (subcommand === "simulate") {
1855
- policyName = rest[1];
1856
- if (!policyName) {
1857
- errors.push("forge policy simulate requires a policy name");
1858
- }
1859
- }
1860
-
1861
- return {
1862
- command: {
1863
- kind: "policy",
1864
- subcommand,
1865
- json: parseFlag(argv, "--json"),
1866
- policy: policyName,
1867
- role: parseOptionValue(argv, "--role"),
1868
- strictPolicies: parseFlag(argv, "--strict-policies"),
1869
- workspaceRoot,
1870
- },
1871
- workspaceRoot,
1872
- errors,
1873
- };
1874
- }
1875
- case "secrets": {
1876
- const subcommand = rest[0] as SecretsSubcommand | undefined;
1877
- if (
1878
- !subcommand ||
1879
- !["list", "check", "print", "set", "unset"].includes(subcommand)
1880
- ) {
1881
- errors.push(
1882
- "forge secrets requires subcommand: list, check, print, set, or unset",
1883
- );
1884
- return { command: null, workspaceRoot, errors };
1885
- }
1886
-
1887
- return {
1888
- command: {
1889
- kind: "secrets",
1890
- subcommand,
1891
- json: parseFlag(argv, "--json"),
1892
- redacted: parseFlag(argv, "--redacted"),
1893
- name: subcommand === "set" || subcommand === "unset" ? rest[1] : undefined,
1894
- value: subcommand === "set" ? rest[2] : undefined,
1895
- workspaceRoot,
1896
- },
1897
- workspaceRoot,
1898
- errors,
1899
- };
1900
- }
1901
- case "env": {
1902
- const subcommand = rest[0] as EnvSubcommand | undefined;
1903
- if (!subcommand || !["list", "check", "print"].includes(subcommand)) {
1904
- errors.push("forge env requires subcommand: list, check, or print");
1905
- return { command: null, workspaceRoot, errors };
1906
- }
1907
-
1908
- return {
1909
- command: {
1910
- kind: "env",
1911
- subcommand,
1912
- json: parseFlag(argv, "--json"),
1913
- redacted: parseFlag(argv, "--redacted"),
1914
- workspaceRoot,
1915
- },
1916
- workspaceRoot,
1917
- errors,
1918
- };
1919
- }
1920
- case "ai": {
1921
- const subcommand = rest[0] as AiSubcommand | undefined;
1922
- if (!subcommand || !["providers", "check", "test", "models"].includes(subcommand)) {
1923
- errors.push("forge ai requires subcommand: providers, check, test, or models");
1924
- return { command: null, workspaceRoot, errors };
1925
- }
1926
-
1927
- const providerRaw = parseOptionValue(argv, "--provider");
1928
- const provider = providerRaw as ForgeAiProvider | undefined;
1929
-
1930
- return {
1931
- command: {
1932
- kind: "ai",
1933
- subcommand,
1934
- json: parseFlag(argv, "--json"),
1935
- provider,
1936
- model: parseOptionValue(argv, "--model"),
1937
- prompt: parseOptionValue(argv, "--prompt"),
1938
- mock: parseFlag(argv, "--mock"),
1939
- workspaceRoot,
1940
- },
1941
- workspaceRoot,
1942
- errors,
1943
- };
1944
- }
1945
- default:
1946
- errors.push(`unrecognized command '${commandName}'`);
1947
- return { command: null, workspaceRoot, errors };
1948
- }
1949
- }
1950
-
1951
- export function hasUnknownOption(argv: string[]): string | null {
1952
- const known = new Set([
1953
- "--check",
1954
- "--json",
1830
+ traceId = rest[1];
1831
+ if (!traceId) {
1832
+ errors.push("forge telemetry inspect requires a trace id");
1833
+ }
1834
+ }
1835
+
1836
+ return {
1837
+ command: {
1838
+ kind: "telemetry",
1839
+ subcommand,
1840
+ db: parseAdapterKind(parseOptionValue(argv, "--db")),
1841
+ databaseUrl: parseOptionValue(argv, "--database-url"),
1842
+ json: parseFlag(argv, "--json"),
1843
+ traceId,
1844
+ sink: parseOptionValue(argv, "--sink"),
1845
+ file: parseOptionValue(argv, "--file") as "events" | "exceptions" | "spans" | undefined,
1846
+ workspaceRoot,
1847
+ },
1848
+ workspaceRoot,
1849
+ errors,
1850
+ };
1851
+ }
1852
+ case "policy": {
1853
+ const subcommand = rest[0] as PolicySubcommand | undefined;
1854
+ if (!subcommand || !["list", "matrix", "simulate", "check"].includes(subcommand)) {
1855
+ errors.push("forge policy requires subcommand: list, matrix, simulate, or check");
1856
+ return { command: null, workspaceRoot, errors };
1857
+ }
1858
+
1859
+ let policyName: string | undefined;
1860
+ if (subcommand === "simulate") {
1861
+ policyName = rest[1];
1862
+ if (!policyName) {
1863
+ errors.push("forge policy simulate requires a policy name");
1864
+ }
1865
+ }
1866
+
1867
+ return {
1868
+ command: {
1869
+ kind: "policy",
1870
+ subcommand,
1871
+ json: parseFlag(argv, "--json"),
1872
+ policy: policyName,
1873
+ role: parseOptionValue(argv, "--role"),
1874
+ strictPolicies: parseFlag(argv, "--strict-policies"),
1875
+ workspaceRoot,
1876
+ },
1877
+ workspaceRoot,
1878
+ errors,
1879
+ };
1880
+ }
1881
+ case "secrets": {
1882
+ const subcommand = rest[0] as SecretsSubcommand | undefined;
1883
+ if (
1884
+ !subcommand ||
1885
+ !["list", "check", "print", "set", "unset"].includes(subcommand)
1886
+ ) {
1887
+ errors.push(
1888
+ "forge secrets requires subcommand: list, check, print, set, or unset",
1889
+ );
1890
+ return { command: null, workspaceRoot, errors };
1891
+ }
1892
+
1893
+ return {
1894
+ command: {
1895
+ kind: "secrets",
1896
+ subcommand,
1897
+ json: parseFlag(argv, "--json"),
1898
+ redacted: parseFlag(argv, "--redacted"),
1899
+ name: subcommand === "set" || subcommand === "unset" ? rest[1] : undefined,
1900
+ value: subcommand === "set" ? rest[2] : undefined,
1901
+ workspaceRoot,
1902
+ },
1903
+ workspaceRoot,
1904
+ errors,
1905
+ };
1906
+ }
1907
+ case "env": {
1908
+ const subcommand = rest[0] as EnvSubcommand | undefined;
1909
+ if (!subcommand || !["list", "check", "print"].includes(subcommand)) {
1910
+ errors.push("forge env requires subcommand: list, check, or print");
1911
+ return { command: null, workspaceRoot, errors };
1912
+ }
1913
+
1914
+ return {
1915
+ command: {
1916
+ kind: "env",
1917
+ subcommand,
1918
+ json: parseFlag(argv, "--json"),
1919
+ redacted: parseFlag(argv, "--redacted"),
1920
+ workspaceRoot,
1921
+ },
1922
+ workspaceRoot,
1923
+ errors,
1924
+ };
1925
+ }
1926
+ case "ai": {
1927
+ const subcommand = rest[0] as AiSubcommand | undefined;
1928
+ if (!subcommand || !["providers", "check", "test", "models"].includes(subcommand)) {
1929
+ errors.push("forge ai requires subcommand: providers, check, test, or models");
1930
+ return { command: null, workspaceRoot, errors };
1931
+ }
1932
+
1933
+ const providerRaw = parseOptionValue(argv, "--provider");
1934
+ const provider = providerRaw as ForgeAiProvider | undefined;
1935
+
1936
+ return {
1937
+ command: {
1938
+ kind: "ai",
1939
+ subcommand,
1940
+ json: parseFlag(argv, "--json"),
1941
+ provider,
1942
+ model: parseOptionValue(argv, "--model"),
1943
+ prompt: parseOptionValue(argv, "--prompt"),
1944
+ mock: parseFlag(argv, "--mock"),
1945
+ workspaceRoot,
1946
+ },
1947
+ workspaceRoot,
1948
+ errors,
1949
+ };
1950
+ }
1951
+ default:
1952
+ errors.push(`unrecognized command '${commandName}'`);
1953
+ return { command: null, workspaceRoot, errors };
1954
+ }
1955
+ }
1956
+
1957
+ export function hasUnknownOption(argv: string[]): string | null {
1958
+ const known = new Set([
1959
+ "--check",
1960
+ "--json",
1955
1961
  "--dry-run",
1956
1962
  "--plan",
1957
1963
  "--staged",
@@ -2050,41 +2056,41 @@ export function hasUnknownOption(argv: string[]): string | null {
2050
2056
  "--allow-dirty",
2051
2057
  "--allow-public-sourcemaps",
2052
2058
  "--with-release",
2053
- "--concurrency",
2054
- "--sandbox-backend",
2055
- "--skip-tests",
2056
- "--skip-typecheck",
2057
- "--skip-eslint",
2058
- "--mock",
2059
- "--list",
2060
- "--port",
2061
- "--host",
2059
+ "--concurrency",
2060
+ "--sandbox-backend",
2061
+ "--skip-tests",
2062
+ "--skip-typecheck",
2063
+ "--skip-eslint",
2064
+ "--mock",
2065
+ "--list",
2066
+ "--port",
2067
+ "--host",
2062
2068
  "--watch",
2063
2069
  "--no-watch",
2064
- "--db",
2065
- "--database-url",
2070
+ "--db",
2071
+ "--database-url",
2066
2072
  "--worker",
2067
2073
  "--no-worker",
2068
- "--once",
2069
- "--limit",
2074
+ "--once",
2075
+ "--limit",
2070
2076
  "--input",
2071
2077
  "--args",
2072
- "--step",
2073
- "--sink",
2074
- "--file",
2075
- "--telemetry",
2076
- "--user-id",
2077
- "--tenant-id",
2078
- "--role",
2079
- "--strict-policies",
2080
- "--strict",
2081
- "--strict-secrets",
2082
- "--env-file",
2083
- "--redacted",
2084
- "--mock-ai",
2085
- "--ai",
2086
- "--provider",
2087
- "--model",
2078
+ "--step",
2079
+ "--sink",
2080
+ "--file",
2081
+ "--telemetry",
2082
+ "--user-id",
2083
+ "--tenant-id",
2084
+ "--role",
2085
+ "--strict-policies",
2086
+ "--strict",
2087
+ "--strict-secrets",
2088
+ "--env-file",
2089
+ "--redacted",
2090
+ "--mock-ai",
2091
+ "--ai",
2092
+ "--provider",
2093
+ "--model",
2088
2094
  "--prompt",
2089
2095
  "--url",
2090
2096
  "--template",
@@ -2109,14 +2115,14 @@ export function hasUnknownOption(argv: string[]): string | null {
2109
2115
  "--no-skills",
2110
2116
  "--no-rules",
2111
2117
  ]);
2112
-
2113
- for (let index = 0; index < argv.length; index++) {
2114
- const arg = argv[index];
2118
+
2119
+ for (let index = 0; index < argv.length; index++) {
2120
+ const arg = argv[index];
2115
2121
  if (!arg.startsWith("--")) {
2116
2122
  continue;
2117
2123
  }
2118
2124
  if (known.has(arg)) {
2119
- if (
2125
+ if (
2120
2126
  arg === "--concurrency" ||
2121
2127
  arg === "--field" ||
2122
2128
  arg === "--fields" ||
@@ -2164,24 +2170,24 @@ export function hasUnknownOption(argv: string[]): string | null {
2164
2170
  arg === "--name" ||
2165
2171
  arg === "--auth-token" ||
2166
2172
  arg === "--sandbox-backend" ||
2167
- arg === "--port" ||
2168
- arg === "--host" ||
2169
- arg === "--db" ||
2170
- arg === "--database-url" ||
2171
- arg === "--limit" ||
2173
+ arg === "--port" ||
2174
+ arg === "--host" ||
2175
+ arg === "--db" ||
2176
+ arg === "--database-url" ||
2177
+ arg === "--limit" ||
2172
2178
  arg === "--input" ||
2173
2179
  arg === "--args" ||
2174
- arg === "--step" ||
2175
- arg === "--sink" ||
2176
- arg === "--file" ||
2177
- arg === "--telemetry" ||
2178
- arg === "--user-id" ||
2179
- arg === "--tenant-id" ||
2180
- arg === "--role" ||
2181
- arg === "--strict-policies" ||
2182
- arg === "--env-file" ||
2183
- arg === "--ai" ||
2184
- arg === "--provider" ||
2180
+ arg === "--step" ||
2181
+ arg === "--sink" ||
2182
+ arg === "--file" ||
2183
+ arg === "--telemetry" ||
2184
+ arg === "--user-id" ||
2185
+ arg === "--tenant-id" ||
2186
+ arg === "--role" ||
2187
+ arg === "--strict-policies" ||
2188
+ arg === "--env-file" ||
2189
+ arg === "--ai" ||
2190
+ arg === "--provider" ||
2185
2191
  arg === "--model" ||
2186
2192
  arg === "--prompt" ||
2187
2193
  arg === "--url" ||
@@ -2200,12 +2206,12 @@ export function hasUnknownOption(argv: string[]): string | null {
2200
2206
  arg === "--target" ||
2201
2207
  arg === "--release"
2202
2208
  ) {
2203
- index += 1;
2204
- }
2205
- continue;
2206
- }
2207
- return arg;
2208
- }
2209
-
2210
- return null;
2211
- }
2209
+ index += 1;
2210
+ }
2211
+ continue;
2212
+ }
2213
+ return arg;
2214
+ }
2215
+
2216
+ return null;
2217
+ }