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.
- package/.npmignore +9 -1
- package/AGENTS.md +6 -1
- package/CHANGELOG.md +30 -0
- package/CONTRIBUTING.md +22 -1
- package/README.md +30 -3
- package/bin/forge.mjs +4 -3
- package/package.json +3 -1
- package/packages/eslint-plugin-forge/index.ts +15 -15
- package/packages/eslint-plugin-forge/package.json +10 -10
- package/packages/eslint-plugin-forge/src/check-source.ts +95 -95
- package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -24
- package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -93
- package/src/forge/_generated/actionSubscriptions.json +2 -2
- package/src/forge/_generated/actionSubscriptions.ts +3 -3
- package/src/forge/_generated/agentAdapterManifest.json +2 -2
- package/src/forge/_generated/agentAdapterManifest.ts +3 -3
- package/src/forge/_generated/agentContract.json +2 -2
- package/src/forge/_generated/agentContract.ts +6786 -2
- package/src/forge/_generated/agentQuickstart.md +1 -1
- package/src/forge/_generated/aiContext.ts +1 -1
- package/src/forge/_generated/aiModels.json +1 -1
- package/src/forge/_generated/aiModels.ts +1 -1
- package/src/forge/_generated/aiProviders.json +1 -1
- package/src/forge/_generated/aiProviders.ts +1 -1
- package/src/forge/_generated/aiRegistry.json +2 -2
- package/src/forge/_generated/aiRegistry.ts +3 -3
- package/src/forge/_generated/api.json +2 -2
- package/src/forge/_generated/api.ts +1 -1
- package/src/forge/_generated/appGraph.json +2 -2
- package/src/forge/_generated/appGraph.ts +1297 -1141
- package/src/forge/_generated/appMap.md +1 -1
- package/src/forge/_generated/artifactManifest.json +2 -2
- package/src/forge/_generated/artifactManifest.ts +2 -2
- package/src/forge/_generated/authClaims.json +1 -1
- package/src/forge/_generated/authClaims.ts +1 -1
- package/src/forge/_generated/authConfig.json +1 -1
- package/src/forge/_generated/authConfig.ts +1 -1
- package/src/forge/_generated/authContext.ts +1 -1
- package/src/forge/_generated/authRegistry.json +1 -1
- package/src/forge/_generated/authRegistry.ts +1 -1
- package/src/forge/_generated/buildInfo.json +2 -2
- package/src/forge/_generated/buildInfo.ts +4 -4
- package/src/forge/_generated/capabilityMap.json +2 -2
- package/src/forge/_generated/capabilityMap.md +1 -1
- package/src/forge/_generated/capabilityMap.ts +2 -2
- package/src/forge/_generated/client.ts +1 -1
- package/src/forge/_generated/clientApi.ts +1 -1
- package/src/forge/_generated/clientManifest.json +2 -2
- package/src/forge/_generated/clientManifest.ts +3 -3
- package/src/forge/_generated/clientTypes.ts +1 -1
- package/src/forge/_generated/configRegistry.json +1 -1
- package/src/forge/_generated/configRegistry.ts +1 -1
- package/src/forge/_generated/dataGraph.json +2 -2
- package/src/forge/_generated/dataGraph.ts +3 -3
- package/src/forge/_generated/db.json +1 -1
- package/src/forge/_generated/db.ts +1 -1
- package/src/forge/_generated/dbSecurityManifest.json +1 -1
- package/src/forge/_generated/dbSecurityManifest.ts +1 -1
- package/src/forge/_generated/dbSessionContext.json +1 -1
- package/src/forge/_generated/dbSessionContext.ts +1 -1
- package/src/forge/_generated/deployManifest.json +2 -2
- package/src/forge/_generated/deployManifest.ts +7 -7
- package/src/forge/_generated/devManifest.json +2 -2
- package/src/forge/_generated/devManifest.ts +3 -3
- package/src/forge/_generated/envSchema.json +1 -1
- package/src/forge/_generated/envSchema.ts +1 -1
- package/src/forge/_generated/frontendGraph.json +1 -1
- package/src/forge/_generated/frontendGraph.ts +1 -1
- package/src/forge/_generated/importGuards.json +2 -2
- package/src/forge/_generated/importGuards.ts +35 -1
- package/src/forge/_generated/index.ts +1 -1
- package/src/forge/_generated/liveProductionManifest.json +1 -1
- package/src/forge/_generated/liveProductionManifest.ts +1 -1
- package/src/forge/_generated/liveProtocol.json +1 -1
- package/src/forge/_generated/liveProtocol.ts +1 -1
- package/src/forge/_generated/liveQueryRegistry.json +2 -2
- package/src/forge/_generated/liveQueryRegistry.ts +3 -3
- package/src/forge/_generated/liveTransportConfig.json +1 -1
- package/src/forge/_generated/liveTransportConfig.ts +1 -1
- package/src/forge/_generated/makeRegistry.json +2 -2
- package/src/forge/_generated/makeRegistry.ts +2 -2
- package/src/forge/_generated/makeTemplates.json +1 -1
- package/src/forge/_generated/makeTemplates.ts +1 -1
- package/src/forge/_generated/mockMap.json +1 -1
- package/src/forge/_generated/mockMap.ts +1 -1
- package/src/forge/_generated/operationPlaybooks.md +7 -5
- package/src/forge/_generated/packageGraph.json +2 -2
- package/src/forge/_generated/packageGraph.ts +90964 -14284
- package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
- package/src/forge/_generated/permissionMatrix.json +2 -2
- package/src/forge/_generated/permissionMatrix.ts +3 -3
- package/src/forge/_generated/policyRegistry.json +2 -2
- package/src/forge/_generated/policyRegistry.ts +3 -3
- package/src/forge/_generated/queryRegistry.json +2 -2
- package/src/forge/_generated/queryRegistry.ts +3 -3
- package/src/forge/_generated/react.d.ts +1 -1
- package/src/forge/_generated/react.ts +1 -1
- package/src/forge/_generated/reactManifest.json +2 -2
- package/src/forge/_generated/reactManifest.ts +3 -3
- package/src/forge/_generated/releaseManifest.json +2 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/_generated/rlsPolicies.json +1 -1
- package/src/forge/_generated/rlsPolicies.sql +1 -1
- package/src/forge/_generated/rlsPolicies.ts +1 -1
- package/src/forge/_generated/runtimeGraph.json +2 -2
- package/src/forge/_generated/runtimeGraph.ts +3 -3
- package/src/forge/_generated/runtimeMatrix.json +2 -2
- package/src/forge/_generated/runtimeMatrix.ts +106177 -7917
- package/src/forge/_generated/runtimeRegistry.ts +1 -1
- package/src/forge/_generated/runtimeRules.md +1 -1
- package/src/forge/_generated/secretRegistry.json +1 -1
- package/src/forge/_generated/secretRegistry.ts +1 -1
- package/src/forge/_generated/secretsContext.ts +1 -1
- package/src/forge/_generated/serverApi.ts +1 -1
- package/src/forge/_generated/sourceMapManifest.json +2 -2
- package/src/forge/_generated/sourceMapManifest.ts +2 -2
- package/src/forge/_generated/sqlPlan.json +1 -1
- package/src/forge/_generated/sqlPlan.ts +1 -1
- package/src/forge/_generated/subscriptionManifest.json +2 -2
- package/src/forge/_generated/subscriptionManifest.ts +3 -3
- package/src/forge/_generated/symbolicationManifest.json +2 -2
- package/src/forge/_generated/symbolicationManifest.ts +2 -2
- package/src/forge/_generated/telemetryRegistry.json +2 -2
- package/src/forge/_generated/telemetryRegistry.ts +3 -3
- package/src/forge/_generated/telemetrySinks.json +2 -2
- package/src/forge/_generated/telemetrySinks.ts +2 -2
- package/src/forge/_generated/tenantScope.json +2 -2
- package/src/forge/_generated/tenantScope.ts +3 -3
- package/src/forge/_generated/testGraph.json +2 -2
- package/src/forge/_generated/testGraph.ts +129 -75
- package/src/forge/_generated/testPlanRegistry.json +2 -2
- package/src/forge/_generated/testPlanRegistry.ts +2 -2
- package/src/forge/_generated/uiRoutes.json +1 -1
- package/src/forge/_generated/uiRoutes.ts +1 -1
- package/src/forge/_generated/uiScenarios.json +1 -1
- package/src/forge/_generated/uiScenarios.ts +1 -1
- package/src/forge/_generated/uiTestManifest.json +2 -2
- package/src/forge/_generated/uiTestManifest.ts +2 -2
- package/src/forge/_generated/workflowRegistry.json +2 -2
- package/src/forge/_generated/workflowRegistry.ts +3 -3
- package/src/forge/_generated/workflowSubscriptions.json +2 -2
- package/src/forge/_generated/workflowSubscriptions.ts +3 -3
- package/src/forge/cli/commands.ts +861 -861
- package/src/forge/cli/deps.ts +178 -11
- package/src/forge/cli/dev.ts +32 -5
- package/src/forge/cli/index.ts +7 -7
- package/src/forge/cli/main.ts +54 -54
- package/src/forge/cli/new.ts +29 -1
- package/src/forge/cli/output.ts +97 -97
- package/src/forge/cli/parse.ts +679 -673
- package/src/forge/cli/version.ts +1 -1
- package/src/forge/compiler/agent-contract/build.ts +28 -0
- package/src/forge/compiler/agent-contract/types.ts +16 -0
- package/src/forge/compiler/app-graph/build.ts +112 -112
- package/src/forge/compiler/app-graph/classify.ts +10 -10
- package/src/forge/compiler/app-graph/dup-symbol.ts +29 -29
- package/src/forge/compiler/app-graph/extract.ts +123 -123
- package/src/forge/compiler/app-graph/forge-apis.ts +29 -29
- package/src/forge/compiler/app-graph/index.ts +11 -11
- package/src/forge/compiler/app-graph/module-graph.ts +316 -316
- package/src/forge/compiler/app-graph/parser.ts +119 -119
- package/src/forge/compiler/app-graph/symbols.ts +48 -48
- package/src/forge/compiler/app-graph/tsconfig-hash.ts +62 -62
- package/src/forge/compiler/app-graph/types.ts +43 -43
- package/src/forge/compiler/app-graph/versions.ts +14 -14
- package/src/forge/compiler/cache/index.ts +17 -17
- package/src/forge/compiler/cache/key.ts +46 -46
- package/src/forge/compiler/cache/scheduler.ts +72 -72
- package/src/forge/compiler/cache/store.ts +78 -78
- package/src/forge/compiler/classifier/capabilities.ts +78 -78
- package/src/forge/compiler/classifier/classify.ts +113 -113
- package/src/forge/compiler/classifier/contexts.ts +188 -188
- package/src/forge/compiler/classifier/index.ts +18 -18
- package/src/forge/compiler/classifier/runtime-matrix.ts +45 -45
- package/src/forge/compiler/classifier/secrets.ts +41 -41
- package/src/forge/compiler/classifier/signals.ts +129 -129
- package/src/forge/compiler/diagnostics/codes.ts +125 -120
- package/src/forge/compiler/diagnostics/create.ts +87 -87
- package/src/forge/compiler/diagnostics/index.ts +41 -41
- package/src/forge/compiler/emitter/artifact-kind.ts +14 -14
- package/src/forge/compiler/emitter/barrel.ts +38 -38
- package/src/forge/compiler/emitter/constants.ts +7 -7
- package/src/forge/compiler/emitter/emit.ts +234 -237
- package/src/forge/compiler/emitter/index.ts +24 -24
- package/src/forge/compiler/emitter/lock.ts +61 -61
- package/src/forge/compiler/emitter/render.ts +73 -73
- package/src/forge/compiler/guards/artifacts.ts +96 -96
- package/src/forge/compiler/guards/check-import-guards.ts +106 -106
- package/src/forge/compiler/guards/index.ts +11 -11
- package/src/forge/compiler/guards/propagate-contexts.ts +57 -57
- package/src/forge/compiler/index.ts +17 -17
- package/src/forge/compiler/integration/add.ts +493 -493
- package/src/forge/compiler/integration/index.ts +17 -17
- package/src/forge/compiler/integration/plan.ts +279 -279
- package/src/forge/compiler/integration/render.ts +189 -189
- package/src/forge/compiler/integration/snapshot.ts +52 -52
- package/src/forge/compiler/orchestrator/discover.ts +214 -214
- package/src/forge/compiler/orchestrator/guards.ts +5 -5
- package/src/forge/compiler/orchestrator/index.ts +27 -27
- package/src/forge/compiler/orchestrator/manifest.ts +69 -69
- package/src/forge/compiler/orchestrator/orphans.ts +51 -51
- package/src/forge/compiler/orchestrator/plan.ts +804 -804
- package/src/forge/compiler/orchestrator/run.ts +178 -178
- package/src/forge/compiler/orchestrator/serialize.ts +859 -859
- package/src/forge/compiler/orchestrator/types.ts +23 -23
- package/src/forge/compiler/orchestrator/verify.ts +35 -35
- package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -33
- package/src/forge/compiler/package-graph/checksum.ts +107 -97
- package/src/forge/compiler/package-graph/compiler.ts +444 -363
- package/src/forge/compiler/package-graph/constants.ts +4 -4
- package/src/forge/compiler/package-graph/exports-discovery.ts +91 -84
- package/src/forge/compiler/package-graph/extract-dts.ts +32 -32
- package/src/forge/compiler/package-graph/index.ts +24 -24
- package/src/forge/compiler/package-graph/jsdoc.ts +50 -50
- package/src/forge/compiler/package-graph/oracle.ts +326 -0
- package/src/forge/compiler/package-graph/read-file.ts +21 -21
- package/src/forge/compiler/package-graph/resolve.ts +131 -127
- package/src/forge/compiler/package-manager/adapter.ts +232 -232
- package/src/forge/compiler/package-manager/commands.ts +47 -47
- package/src/forge/compiler/package-manager/detect.ts +65 -65
- package/src/forge/compiler/package-manager/executor.ts +29 -29
- package/src/forge/compiler/package-manager/index.ts +22 -22
- package/src/forge/compiler/package-manager/parse-spec.ts +16 -16
- package/src/forge/compiler/package-manager/version.ts +20 -20
- package/src/forge/compiler/primitives/compare.ts +26 -26
- package/src/forge/compiler/primitives/hash.ts +42 -33
- package/src/forge/compiler/primitives/header.ts +43 -43
- package/src/forge/compiler/primitives/index.ts +45 -45
- package/src/forge/compiler/primitives/paths.ts +24 -24
- package/src/forge/compiler/primitives/serialize.ts +66 -66
- package/src/forge/compiler/primitives/sort.ts +87 -87
- package/src/forge/compiler/recipes/definitions.ts +269 -269
- package/src/forge/compiler/recipes/helpers.ts +37 -37
- package/src/forge/compiler/recipes/index.ts +21 -21
- package/src/forge/compiler/recipes/registry.ts +87 -87
- package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -26
- package/src/forge/compiler/sandbox/backends/child.ts +123 -123
- package/src/forge/compiler/sandbox/backends/docker.ts +173 -173
- package/src/forge/compiler/sandbox/index.ts +51 -51
- package/src/forge/compiler/sandbox/inspect.ts +143 -143
- package/src/forge/compiler/sandbox/inspector-entry.ts +115 -115
- package/src/forge/compiler/sandbox/limits.ts +31 -31
- package/src/forge/compiler/sandbox/scrub-env.ts +60 -60
- package/src/forge/compiler/sandbox/secret-scan.ts +54 -54
- package/src/forge/compiler/sandbox/serialize.ts +106 -106
- package/src/forge/compiler/sandbox/types.ts +7 -7
- package/src/forge/compiler/types/app-graph.ts +71 -71
- package/src/forge/compiler/types/capability.ts +29 -29
- package/src/forge/compiler/types/classification.ts +9 -9
- package/src/forge/compiler/types/cli.ts +85 -85
- package/src/forge/compiler/types/diagnostic.ts +2 -2
- package/src/forge/compiler/types/emit.ts +25 -25
- package/src/forge/compiler/types/import-guards.ts +19 -19
- package/src/forge/compiler/types/index.ts +98 -98
- package/src/forge/compiler/types/integration.ts +25 -25
- package/src/forge/compiler/types/json.ts +3 -3
- package/src/forge/compiler/types/lock.ts +37 -37
- package/src/forge/compiler/types/package-graph.ts +122 -77
- package/src/forge/compiler/types/runtime-matrix.ts +16 -16
- package/src/forge/compiler/types/runtime.ts +30 -30
- package/src/forge/compiler/types/sandbox.ts +24 -24
- package/src/forge/dev/server.ts +16 -2
- package/src/forge/refactor/index.ts +10 -2
- package/src/forge/refactor/runtime-rename.ts +598 -0
- package/src/forge/runtime/executor.ts +3 -2
- package/src/forge/runtime/live/live-query-runner.ts +2 -1
- package/src/forge/runtime/outbox/process.ts +2 -1
- package/src/forge/runtime/query/run-query.ts +2 -1
- package/src/forge/runtime/runner/run-entry.ts +2 -1
- package/src/forge/runtime/telemetry/sinks/posthog.ts +4 -5
- package/src/forge/runtime/telemetry/sinks/sentry.ts +4 -5
- package/src/forge/runtime/workflows/resolve-step.ts +2 -1
- package/src/forge/version.ts +3 -0
- package/templates/b2b-support-web/src/actions/captureTicketCreated.ts +7 -2
- package/templates/b2b-support-web/src/commands/closeTicket.ts +6 -1
- package/templates/b2b-support-web/src/commands/createTicket.ts +8 -2
- package/templates/b2b-support-web/src/queries/getTicket.ts +8 -1
- package/templates/b2b-support-web/web/components/CreateTicketForm.tsx +1 -2
- package/templates/b2b-support-web/web/components/PolicyDeniedDemo.tsx +1 -2
- package/templates/b2b-support-web/web/components/TicketList.tsx +1 -2
- package/templates/b2b-support-web/web/components/TraceDetails.tsx +1 -1
- package/templates/b2b-support-web/web/lib/forge.ts +1 -0
package/src/forge/cli/parse.ts
CHANGED
|
@@ -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
|
+
}
|