forgeos 0.1.0-alpha.0
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 +1 -0
- package/AGENTS.md +277 -0
- package/CHANGELOG.md +8 -0
- package/CONTRIBUTING.md +58 -0
- package/README.md +377 -0
- package/bin/forge-bun.mjs +110 -0
- package/bin/forge.mjs +19 -0
- package/package.json +96 -0
- package/packages/eslint-plugin-forge/index.ts +15 -0
- package/packages/eslint-plugin-forge/package.json +10 -0
- package/packages/eslint-plugin-forge/src/check-source.ts +95 -0
- package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -0
- package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -0
- package/src/forge/_generated/actionSubscriptions.json +2 -0
- package/src/forge/_generated/actionSubscriptions.ts +10 -0
- package/src/forge/_generated/agentAdapterManifest.json +2 -0
- package/src/forge/_generated/agentAdapterManifest.ts +73 -0
- package/src/forge/_generated/agentContract.json +2 -0
- package/src/forge/_generated/agentContract.ts +912 -0
- package/src/forge/_generated/agentQuickstart.md +32 -0
- package/src/forge/_generated/aiContext.ts +59 -0
- package/src/forge/_generated/aiModels.json +2 -0
- package/src/forge/_generated/aiModels.ts +35 -0
- package/src/forge/_generated/aiProviders.json +2 -0
- package/src/forge/_generated/aiProviders.ts +23 -0
- package/src/forge/_generated/aiRegistry.json +2 -0
- package/src/forge/_generated/aiRegistry.ts +29 -0
- package/src/forge/_generated/api.json +2 -0
- package/src/forge/_generated/api.ts +8 -0
- package/src/forge/_generated/appGraph.json +2 -0
- package/src/forge/_generated/appGraph.ts +14511 -0
- package/src/forge/_generated/appMap.md +35 -0
- package/src/forge/_generated/artifactManifest.json +2 -0
- package/src/forge/_generated/artifactManifest.ts +7 -0
- package/src/forge/_generated/authClaims.json +2 -0
- package/src/forge/_generated/authClaims.ts +13 -0
- package/src/forge/_generated/authConfig.json +2 -0
- package/src/forge/_generated/authConfig.ts +17 -0
- package/src/forge/_generated/authContext.ts +23 -0
- package/src/forge/_generated/authRegistry.json +2 -0
- package/src/forge/_generated/authRegistry.ts +25 -0
- package/src/forge/_generated/buildInfo.json +2 -0
- package/src/forge/_generated/buildInfo.ts +9 -0
- package/src/forge/_generated/capabilityMap.json +2 -0
- package/src/forge/_generated/capabilityMap.md +15 -0
- package/src/forge/_generated/capabilityMap.ts +17 -0
- package/src/forge/_generated/client.ts +282 -0
- package/src/forge/_generated/clientApi.ts +9 -0
- package/src/forge/_generated/clientManifest.json +2 -0
- package/src/forge/_generated/clientManifest.ts +39 -0
- package/src/forge/_generated/clientTypes.ts +78 -0
- package/src/forge/_generated/configRegistry.json +2 -0
- package/src/forge/_generated/configRegistry.ts +4 -0
- package/src/forge/_generated/dataGraph.json +2 -0
- package/src/forge/_generated/dataGraph.ts +8 -0
- package/src/forge/_generated/db.json +2 -0
- package/src/forge/_generated/db.ts +2 -0
- package/src/forge/_generated/dbSecurityManifest.json +2 -0
- package/src/forge/_generated/dbSecurityManifest.ts +15 -0
- package/src/forge/_generated/dbSessionContext.json +2 -0
- package/src/forge/_generated/dbSessionContext.ts +39 -0
- package/src/forge/_generated/deployManifest.json +2 -0
- package/src/forge/_generated/deployManifest.ts +14 -0
- package/src/forge/_generated/devManifest.json +2 -0
- package/src/forge/_generated/devManifest.ts +47 -0
- package/src/forge/_generated/envSchema.json +2 -0
- package/src/forge/_generated/envSchema.ts +59 -0
- package/src/forge/_generated/frontendGraph.json +2 -0
- package/src/forge/_generated/frontendGraph.ts +27 -0
- package/src/forge/_generated/importGuards.json +2 -0
- package/src/forge/_generated/importGuards.ts +652 -0
- package/src/forge/_generated/index.ts +67 -0
- package/src/forge/_generated/liveProductionManifest.json +2 -0
- package/src/forge/_generated/liveProductionManifest.ts +23 -0
- package/src/forge/_generated/liveProtocol.json +2 -0
- package/src/forge/_generated/liveProtocol.ts +21 -0
- package/src/forge/_generated/liveQueryRegistry.json +2 -0
- package/src/forge/_generated/liveQueryRegistry.ts +9 -0
- package/src/forge/_generated/liveTransportConfig.json +2 -0
- package/src/forge/_generated/liveTransportConfig.ts +19 -0
- package/src/forge/_generated/makeRegistry.json +2 -0
- package/src/forge/_generated/makeRegistry.ts +163 -0
- package/src/forge/_generated/makeTemplates.json +2 -0
- package/src/forge/_generated/makeTemplates.ts +61 -0
- package/src/forge/_generated/mockMap.json +2 -0
- package/src/forge/_generated/mockMap.ts +7 -0
- package/src/forge/_generated/operationPlaybooks.md +145 -0
- package/src/forge/_generated/packageGraph.json +2 -0
- package/src/forge/_generated/packageGraph.ts +168569 -0
- package/src/forge/_generated/packageUpgradeRegistry.json +2 -0
- package/src/forge/_generated/packageUpgradeRegistry.ts +15 -0
- package/src/forge/_generated/permissionMatrix.json +2 -0
- package/src/forge/_generated/permissionMatrix.ts +7 -0
- package/src/forge/_generated/policyRegistry.json +2 -0
- package/src/forge/_generated/policyRegistry.ts +11 -0
- package/src/forge/_generated/queryRegistry.json +2 -0
- package/src/forge/_generated/queryRegistry.ts +9 -0
- package/src/forge/_generated/react.d.ts +22 -0
- package/src/forge/_generated/react.ts +29 -0
- package/src/forge/_generated/reactManifest.json +2 -0
- package/src/forge/_generated/reactManifest.ts +19 -0
- package/src/forge/_generated/releaseManifest.json +2 -0
- package/src/forge/_generated/releaseManifest.ts +25 -0
- package/src/forge/_generated/rlsPolicies.json +2 -0
- package/src/forge/_generated/rlsPolicies.sql +34 -0
- package/src/forge/_generated/rlsPolicies.ts +6 -0
- package/src/forge/_generated/runtimeGraph.json +2 -0
- package/src/forge/_generated/runtimeGraph.ts +8 -0
- package/src/forge/_generated/runtimeMatrix.json +2 -0
- package/src/forge/_generated/runtimeMatrix.ts +229125 -0
- package/src/forge/_generated/runtimeRegistry.ts +2 -0
- package/src/forge/_generated/runtimeRules.md +79 -0
- package/src/forge/_generated/secretRegistry.json +2 -0
- package/src/forge/_generated/secretRegistry.ts +50 -0
- package/src/forge/_generated/secretsContext.ts +11 -0
- package/src/forge/_generated/serverApi.ts +10 -0
- package/src/forge/_generated/sourceMapManifest.json +2 -0
- package/src/forge/_generated/sourceMapManifest.ts +7 -0
- package/src/forge/_generated/sqlPlan.json +2 -0
- package/src/forge/_generated/sqlPlan.ts +88 -0
- package/src/forge/_generated/subscriptionManifest.json +2 -0
- package/src/forge/_generated/subscriptionManifest.ts +7 -0
- package/src/forge/_generated/symbolicationManifest.json +2 -0
- package/src/forge/_generated/symbolicationManifest.ts +17 -0
- package/src/forge/_generated/telemetryRegistry.json +2 -0
- package/src/forge/_generated/telemetryRegistry.ts +9 -0
- package/src/forge/_generated/telemetrySinks.json +2 -0
- package/src/forge/_generated/telemetrySinks.ts +11 -0
- package/src/forge/_generated/tenantScope.json +2 -0
- package/src/forge/_generated/tenantScope.ts +8 -0
- package/src/forge/_generated/testGraph.json +2 -0
- package/src/forge/_generated/testGraph.ts +3054 -0
- package/src/forge/_generated/testPlanRegistry.json +2 -0
- package/src/forge/_generated/testPlanRegistry.ts +33 -0
- package/src/forge/_generated/uiRoutes.json +2 -0
- package/src/forge/_generated/uiRoutes.ts +16 -0
- package/src/forge/_generated/uiScenarios.json +2 -0
- package/src/forge/_generated/uiScenarios.ts +30 -0
- package/src/forge/_generated/uiTestManifest.json +2 -0
- package/src/forge/_generated/uiTestManifest.ts +27 -0
- package/src/forge/_generated/workflowRegistry.json +2 -0
- package/src/forge/_generated/workflowRegistry.ts +9 -0
- package/src/forge/_generated/workflowSubscriptions.json +2 -0
- package/src/forge/_generated/workflowSubscriptions.ts +10 -0
- package/src/forge/agent-adapters/index.ts +1002 -0
- package/src/forge/agent-adapters/types.ts +135 -0
- package/src/forge/cli/agent-contract.ts +50 -0
- package/src/forge/cli/ai.ts +148 -0
- package/src/forge/cli/auth.ts +198 -0
- package/src/forge/cli/build.ts +105 -0
- package/src/forge/cli/bun-exec.ts +4 -0
- package/src/forge/cli/commands.ts +1130 -0
- package/src/forge/cli/db.ts +316 -0
- package/src/forge/cli/deps.ts +277 -0
- package/src/forge/cli/dev.ts +529 -0
- package/src/forge/cli/doctor.ts +209 -0
- package/src/forge/cli/feature.ts +485 -0
- package/src/forge/cli/index.ts +25 -0
- package/src/forge/cli/lint-forge.ts +119 -0
- package/src/forge/cli/live.ts +179 -0
- package/src/forge/cli/main.ts +92 -0
- package/src/forge/cli/make.ts +133 -0
- package/src/forge/cli/new.ts +505 -0
- package/src/forge/cli/outbox.ts +297 -0
- package/src/forge/cli/output.ts +114 -0
- package/src/forge/cli/parse.ts +2211 -0
- package/src/forge/cli/policy.ts +204 -0
- package/src/forge/cli/query.ts +91 -0
- package/src/forge/cli/refactor.ts +221 -0
- package/src/forge/cli/release.ts +285 -0
- package/src/forge/cli/rls.ts +322 -0
- package/src/forge/cli/run.ts +76 -0
- package/src/forge/cli/secrets.ts +274 -0
- package/src/forge/cli/self-host.ts +468 -0
- package/src/forge/cli/serve.ts +93 -0
- package/src/forge/cli/telemetry.ts +219 -0
- package/src/forge/cli/verify.ts +587 -0
- package/src/forge/cli/version.ts +1 -0
- package/src/forge/cli/windows.ts +413 -0
- package/src/forge/cli/worker.ts +87 -0
- package/src/forge/cli/workflow.ts +424 -0
- package/src/forge/compiler/action-subscriptions/build.ts +116 -0
- package/src/forge/compiler/action-subscriptions/constants.ts +2 -0
- package/src/forge/compiler/action-subscriptions/index.ts +6 -0
- package/src/forge/compiler/action-subscriptions/parse.ts +6 -0
- package/src/forge/compiler/agent-contract/build.ts +1651 -0
- package/src/forge/compiler/agent-contract/types.ts +326 -0
- package/src/forge/compiler/ai-registry/build.ts +165 -0
- package/src/forge/compiler/ai-registry/constants.ts +2 -0
- package/src/forge/compiler/ai-registry/parse.ts +56 -0
- package/src/forge/compiler/api-surface/build.ts +107 -0
- package/src/forge/compiler/app-graph/build.ts +121 -0
- package/src/forge/compiler/app-graph/classify.ts +10 -0
- package/src/forge/compiler/app-graph/dup-symbol.ts +29 -0
- package/src/forge/compiler/app-graph/extract.ts +124 -0
- package/src/forge/compiler/app-graph/forge-apis.ts +29 -0
- package/src/forge/compiler/app-graph/index.ts +15 -0
- package/src/forge/compiler/app-graph/module-graph.ts +320 -0
- package/src/forge/compiler/app-graph/parser.ts +119 -0
- package/src/forge/compiler/app-graph/symbols.ts +48 -0
- package/src/forge/compiler/app-graph/tsconfig-hash.ts +62 -0
- package/src/forge/compiler/app-graph/types.ts +43 -0
- package/src/forge/compiler/app-graph/versions.ts +14 -0
- package/src/forge/compiler/cache/index.ts +17 -0
- package/src/forge/compiler/cache/key.ts +46 -0
- package/src/forge/compiler/cache/scheduler.ts +72 -0
- package/src/forge/compiler/cache/store.ts +78 -0
- package/src/forge/compiler/classifier/capabilities.ts +78 -0
- package/src/forge/compiler/classifier/classify.ts +113 -0
- package/src/forge/compiler/classifier/contexts.ts +188 -0
- package/src/forge/compiler/classifier/index.ts +18 -0
- package/src/forge/compiler/classifier/runtime-matrix.ts +45 -0
- package/src/forge/compiler/classifier/secrets.ts +41 -0
- package/src/forge/compiler/classifier/signals.ts +129 -0
- package/src/forge/compiler/client-sdk/build-manifest.ts +151 -0
- package/src/forge/compiler/client-sdk/render-client.ts +432 -0
- package/src/forge/compiler/data-graph/build.ts +131 -0
- package/src/forge/compiler/data-graph/constants.ts +5 -0
- package/src/forge/compiler/data-graph/index.ts +6 -0
- package/src/forge/compiler/data-graph/parse.ts +176 -0
- package/src/forge/compiler/data-graph/rls/build.ts +222 -0
- package/src/forge/compiler/data-graph/rls/types.ts +62 -0
- package/src/forge/compiler/data-graph/sql/ddl.ts +390 -0
- package/src/forge/compiler/data-graph/sql/naming.ts +10 -0
- package/src/forge/compiler/data-graph/sql/serialize.ts +85 -0
- package/src/forge/compiler/data-graph/sql/types.ts +37 -0
- package/src/forge/compiler/dev-manifest/build.ts +170 -0
- package/src/forge/compiler/dev-manifest/constants.ts +5 -0
- package/src/forge/compiler/diagnostics/codes.ts +611 -0
- package/src/forge/compiler/diagnostics/create.ts +245 -0
- package/src/forge/compiler/diagnostics/index.ts +55 -0
- package/src/forge/compiler/emitter/artifact-kind.ts +14 -0
- package/src/forge/compiler/emitter/barrel.ts +44 -0
- package/src/forge/compiler/emitter/constants.ts +7 -0
- package/src/forge/compiler/emitter/emit.ts +237 -0
- package/src/forge/compiler/emitter/index.ts +24 -0
- package/src/forge/compiler/emitter/lock.ts +62 -0
- package/src/forge/compiler/emitter/render.ts +73 -0
- package/src/forge/compiler/emitter/write.ts +35 -0
- package/src/forge/compiler/frontend-graph/build.ts +495 -0
- package/src/forge/compiler/fs/index.ts +23 -0
- package/src/forge/compiler/fs/memory.ts +233 -0
- package/src/forge/compiler/fs/node.ts +139 -0
- package/src/forge/compiler/fs/profile.ts +108 -0
- package/src/forge/compiler/fs/types.ts +52 -0
- package/src/forge/compiler/guards/artifacts.ts +96 -0
- package/src/forge/compiler/guards/check-ai-usage.ts +98 -0
- package/src/forge/compiler/guards/check-import-guards.ts +106 -0
- package/src/forge/compiler/guards/check-process-env.ts +98 -0
- package/src/forge/compiler/guards/check-query-usage.ts +76 -0
- package/src/forge/compiler/guards/index.ts +11 -0
- package/src/forge/compiler/guards/propagate-contexts.ts +57 -0
- package/src/forge/compiler/index.ts +17 -0
- package/src/forge/compiler/integration/add.ts +496 -0
- package/src/forge/compiler/integration/index.ts +17 -0
- package/src/forge/compiler/integration/plan.ts +283 -0
- package/src/forge/compiler/integration/render.ts +189 -0
- package/src/forge/compiler/integration/snapshot.ts +52 -0
- package/src/forge/compiler/integration/templates/ai.ts +131 -0
- package/src/forge/compiler/integration/templates/index.ts +8 -0
- package/src/forge/compiler/integration/templates/posthog.ts +145 -0
- package/src/forge/compiler/integration/templates/render.ts +113 -0
- package/src/forge/compiler/integration/templates/sentry.ts +151 -0
- package/src/forge/compiler/integration/templates/stripe.ts +109 -0
- package/src/forge/compiler/integration/templates/types.ts +14 -0
- package/src/forge/compiler/integration/templates/zod.ts +55 -0
- package/src/forge/compiler/live-production/types.ts +122 -0
- package/src/forge/compiler/live-query-registry/build.ts +150 -0
- package/src/forge/compiler/live-query-registry/constants.ts +2 -0
- package/src/forge/compiler/make-registry/build.ts +179 -0
- package/src/forge/compiler/orchestrator/discover.ts +214 -0
- package/src/forge/compiler/orchestrator/fast-check.ts +117 -0
- package/src/forge/compiler/orchestrator/generate-lock.ts +138 -0
- package/src/forge/compiler/orchestrator/guards.ts +5 -0
- package/src/forge/compiler/orchestrator/index.ts +27 -0
- package/src/forge/compiler/orchestrator/manifest-hashes.ts +21 -0
- package/src/forge/compiler/orchestrator/manifest.ts +92 -0
- package/src/forge/compiler/orchestrator/orphans.ts +51 -0
- package/src/forge/compiler/orchestrator/plan.ts +876 -0
- package/src/forge/compiler/orchestrator/profile.ts +36 -0
- package/src/forge/compiler/orchestrator/run.ts +277 -0
- package/src/forge/compiler/orchestrator/serialize.ts +886 -0
- package/src/forge/compiler/orchestrator/session.ts +96 -0
- package/src/forge/compiler/orchestrator/types.ts +31 -0
- package/src/forge/compiler/orchestrator/verify.ts +38 -0
- package/src/forge/compiler/orchestrator/workspace-index.ts +154 -0
- package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -0
- package/src/forge/compiler/package-graph/checksum.ts +97 -0
- package/src/forge/compiler/package-graph/compiler.ts +392 -0
- package/src/forge/compiler/package-graph/constants.ts +4 -0
- package/src/forge/compiler/package-graph/dts-extractor.ts +142 -0
- package/src/forge/compiler/package-graph/exports-discovery.ts +84 -0
- package/src/forge/compiler/package-graph/extract-dts.ts +32 -0
- package/src/forge/compiler/package-graph/index.ts +33 -0
- package/src/forge/compiler/package-graph/jsdoc.ts +62 -0
- package/src/forge/compiler/package-graph/read-file.ts +21 -0
- package/src/forge/compiler/package-graph/resolve.ts +127 -0
- package/src/forge/compiler/package-manager/adapter.ts +237 -0
- package/src/forge/compiler/package-manager/bun-executable.ts +92 -0
- package/src/forge/compiler/package-manager/commands.ts +47 -0
- package/src/forge/compiler/package-manager/detect.ts +79 -0
- package/src/forge/compiler/package-manager/executor.ts +117 -0
- package/src/forge/compiler/package-manager/index.ts +22 -0
- package/src/forge/compiler/package-manager/parse-spec.ts +16 -0
- package/src/forge/compiler/package-manager/version.ts +27 -0
- package/src/forge/compiler/package-upgrades/apply.ts +195 -0
- package/src/forge/compiler/package-upgrades/comparator.ts +181 -0
- package/src/forge/compiler/package-upgrades/impact.ts +139 -0
- package/src/forge/compiler/package-upgrades/markdown.ts +97 -0
- package/src/forge/compiler/package-upgrades/planner.ts +532 -0
- package/src/forge/compiler/package-upgrades/risk.ts +208 -0
- package/src/forge/compiler/package-upgrades/types.ts +174 -0
- package/src/forge/compiler/policy-registry/build.ts +266 -0
- package/src/forge/compiler/policy-registry/constants.ts +2 -0
- package/src/forge/compiler/policy-registry/parse.ts +81 -0
- package/src/forge/compiler/primitives/compare.ts +26 -0
- package/src/forge/compiler/primitives/hash.ts +40 -0
- package/src/forge/compiler/primitives/header.ts +45 -0
- package/src/forge/compiler/primitives/index.ts +45 -0
- package/src/forge/compiler/primitives/paths.ts +24 -0
- package/src/forge/compiler/primitives/result.ts +164 -0
- package/src/forge/compiler/primitives/serialize.ts +66 -0
- package/src/forge/compiler/primitives/sort.ts +87 -0
- package/src/forge/compiler/query-registry/build.ts +114 -0
- package/src/forge/compiler/query-registry/constants.ts +2 -0
- package/src/forge/compiler/recipes/definitions.ts +289 -0
- package/src/forge/compiler/recipes/helpers.ts +37 -0
- package/src/forge/compiler/recipes/index.ts +21 -0
- package/src/forge/compiler/recipes/registry.ts +102 -0
- package/src/forge/compiler/release/build.ts +100 -0
- package/src/forge/compiler/release/types.ts +119 -0
- package/src/forge/compiler/runtime-graph/build.ts +137 -0
- package/src/forge/compiler/runtime-graph/constants.ts +5 -0
- package/src/forge/compiler/runtime-graph/index.ts +5 -0
- package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -0
- package/src/forge/compiler/sandbox/backends/child.ts +123 -0
- package/src/forge/compiler/sandbox/backends/docker.ts +173 -0
- package/src/forge/compiler/sandbox/index.ts +51 -0
- package/src/forge/compiler/sandbox/inspect.ts +143 -0
- package/src/forge/compiler/sandbox/inspector-entry.ts +115 -0
- package/src/forge/compiler/sandbox/limits.ts +31 -0
- package/src/forge/compiler/sandbox/scrub-env.ts +60 -0
- package/src/forge/compiler/sandbox/secret-scan.ts +54 -0
- package/src/forge/compiler/sandbox/serialize.ts +106 -0
- package/src/forge/compiler/sandbox/types.ts +7 -0
- package/src/forge/compiler/secret-registry/build.ts +123 -0
- package/src/forge/compiler/telemetry-registry/build.ts +89 -0
- package/src/forge/compiler/telemetry-registry/constants.ts +2 -0
- package/src/forge/compiler/telemetry-registry/parse.ts +13 -0
- package/src/forge/compiler/test-graph/build.ts +277 -0
- package/src/forge/compiler/types/action-subscriptions.ts +19 -0
- package/src/forge/compiler/types/ai-registry.ts +33 -0
- package/src/forge/compiler/types/app-graph.ts +80 -0
- package/src/forge/compiler/types/capability.ts +29 -0
- package/src/forge/compiler/types/classification.ts +9 -0
- package/src/forge/compiler/types/cli.ts +159 -0
- package/src/forge/compiler/types/data-graph.ts +24 -0
- package/src/forge/compiler/types/dev-manifest.ts +41 -0
- package/src/forge/compiler/types/diagnostic.ts +12 -0
- package/src/forge/compiler/types/emit.ts +25 -0
- package/src/forge/compiler/types/frontend-graph.ts +81 -0
- package/src/forge/compiler/types/import-guards.ts +19 -0
- package/src/forge/compiler/types/index.ts +98 -0
- package/src/forge/compiler/types/integration.ts +25 -0
- package/src/forge/compiler/types/json.ts +3 -0
- package/src/forge/compiler/types/live-query-registry.ts +32 -0
- package/src/forge/compiler/types/lock.ts +37 -0
- package/src/forge/compiler/types/package-graph.ts +84 -0
- package/src/forge/compiler/types/policy-registry.ts +69 -0
- package/src/forge/compiler/types/query-registry.ts +18 -0
- package/src/forge/compiler/types/runtime-graph.ts +30 -0
- package/src/forge/compiler/types/runtime-matrix.ts +16 -0
- package/src/forge/compiler/types/runtime.ts +30 -0
- package/src/forge/compiler/types/sandbox.ts +24 -0
- package/src/forge/compiler/types/secret-registry.ts +38 -0
- package/src/forge/compiler/types/telemetry-registry.ts +26 -0
- package/src/forge/compiler/types/test-graph.ts +45 -0
- package/src/forge/compiler/types/workflow-registry.ts +42 -0
- package/src/forge/compiler/workflow-registry/build.ts +180 -0
- package/src/forge/compiler/workflow-registry/constants.ts +2 -0
- package/src/forge/compiler/workflow-registry/index.ts +5 -0
- package/src/forge/compiler/workflow-registry/parse.ts +19 -0
- package/src/forge/dev/server.ts +1379 -0
- package/src/forge/dev/types.ts +49 -0
- package/src/forge/dev/watch.ts +109 -0
- package/src/forge/dev-console/cycle.ts +652 -0
- package/src/forge/dev-console/types.ts +99 -0
- package/src/forge/feature/compiler.ts +656 -0
- package/src/forge/feature/examples.ts +125 -0
- package/src/forge/feature/types.ts +177 -0
- package/src/forge/impact/index.ts +1160 -0
- package/src/forge/impact/types.ts +151 -0
- package/src/forge/intent/index.ts +490 -0
- package/src/forge/intent/types.ts +73 -0
- package/src/forge/make/fields.ts +146 -0
- package/src/forge/make/index.ts +1101 -0
- package/src/forge/make/naming.ts +42 -0
- package/src/forge/make/templates.ts +525 -0
- package/src/forge/make/types.ts +151 -0
- package/src/forge/platform/module.ts +20 -0
- package/src/forge/policy.ts +1 -0
- package/src/forge/react/index.ts +418 -0
- package/src/forge/refactor/index.ts +1936 -0
- package/src/forge/refactor/text-utils.ts +34 -0
- package/src/forge/refactor/types.ts +191 -0
- package/src/forge/refactor/workspace-fs.ts +171 -0
- package/src/forge/repair/index.ts +656 -0
- package/src/forge/repair/rules/index.ts +476 -0
- package/src/forge/repair/types.ts +175 -0
- package/src/forge/review/index.ts +992 -0
- package/src/forge/review/types.ts +196 -0
- package/src/forge/runtime/ai/check.ts +86 -0
- package/src/forge/runtime/ai/context.ts +394 -0
- package/src/forge/runtime/ai/cost-estimator.ts +41 -0
- package/src/forge/runtime/ai/mock.ts +49 -0
- package/src/forge/runtime/ai/providers.ts +78 -0
- package/src/forge/runtime/ai/state.ts +17 -0
- package/src/forge/runtime/ai/types.ts +67 -0
- package/src/forge/runtime/auth/authenticate.ts +58 -0
- package/src/forge/runtime/auth/claims.ts +119 -0
- package/src/forge/runtime/auth/config.ts +148 -0
- package/src/forge/runtime/auth/errors.ts +45 -0
- package/src/forge/runtime/auth/evaluate.ts +126 -0
- package/src/forge/runtime/auth/resolve.ts +74 -0
- package/src/forge/runtime/auth/types.ts +87 -0
- package/src/forge/runtime/auth/verifier.ts +138 -0
- package/src/forge/runtime/context/create-context.ts +204 -0
- package/src/forge/runtime/context/create-query-context.ts +34 -0
- package/src/forge/runtime/db/adapter.ts +31 -0
- package/src/forge/runtime/db/factory.ts +83 -0
- package/src/forge/runtime/db/generated-client.ts +294 -0
- package/src/forge/runtime/db/memory-adapter.ts +706 -0
- package/src/forge/runtime/db/migrate.ts +132 -0
- package/src/forge/runtime/db/outbox.ts +54 -0
- package/src/forge/runtime/db/pglite-adapter.ts +51 -0
- package/src/forge/runtime/db/postgres-adapter.ts +112 -0
- package/src/forge/runtime/db/read-only-client.ts +97 -0
- package/src/forge/runtime/db/session-context.ts +62 -0
- package/src/forge/runtime/executor.ts +446 -0
- package/src/forge/runtime/live/dependency-tracker.ts +57 -0
- package/src/forge/runtime/live/invalidation-log.ts +189 -0
- package/src/forge/runtime/live/live-query-runner.ts +267 -0
- package/src/forge/runtime/live/registry.ts +28 -0
- package/src/forge/runtime/live/sse.ts +75 -0
- package/src/forge/runtime/live/subscription-manager.ts +443 -0
- package/src/forge/runtime/live/types.ts +143 -0
- package/src/forge/runtime/outbox/claim.ts +153 -0
- package/src/forge/runtime/outbox/process.ts +298 -0
- package/src/forge/runtime/outbox/retry.ts +8 -0
- package/src/forge/runtime/outbox/subscriptions.ts +33 -0
- package/src/forge/runtime/outbox/types.ts +69 -0
- package/src/forge/runtime/policy/check.ts +157 -0
- package/src/forge/runtime/policy/load.ts +55 -0
- package/src/forge/runtime/query/registry.ts +19 -0
- package/src/forge/runtime/query/run-query.ts +347 -0
- package/src/forge/runtime/release/runtime.ts +322 -0
- package/src/forge/runtime/release/symbolicate.ts +175 -0
- package/src/forge/runtime/runner/command-transaction.ts +193 -0
- package/src/forge/runtime/runner/run-entry.ts +226 -0
- package/src/forge/runtime/secrets/check.ts +78 -0
- package/src/forge/runtime/secrets/create-context.ts +138 -0
- package/src/forge/runtime/secrets/env-loader.ts +94 -0
- package/src/forge/runtime/secrets/runtime-bundle.ts +47 -0
- package/src/forge/runtime/secrets/types.ts +31 -0
- package/src/forge/runtime/telemetry/buffer.ts +87 -0
- package/src/forge/runtime/telemetry/context.ts +192 -0
- package/src/forge/runtime/telemetry/correlation.ts +13 -0
- package/src/forge/runtime/telemetry/flush.ts +190 -0
- package/src/forge/runtime/telemetry/process.ts +20 -0
- package/src/forge/runtime/telemetry/scrubber.ts +115 -0
- package/src/forge/runtime/telemetry/sinks/local-jsonl.ts +39 -0
- package/src/forge/runtime/telemetry/sinks/posthog.ts +64 -0
- package/src/forge/runtime/telemetry/sinks/sentry.ts +60 -0
- package/src/forge/runtime/telemetry/spans.ts +58 -0
- package/src/forge/runtime/telemetry/types.ts +64 -0
- package/src/forge/runtime/workflows/cancel.ts +26 -0
- package/src/forge/runtime/workflows/create-run.ts +98 -0
- package/src/forge/runtime/workflows/process-run.ts +182 -0
- package/src/forge/runtime/workflows/process-step.ts +190 -0
- package/src/forge/runtime/workflows/process.ts +260 -0
- package/src/forge/runtime/workflows/registry.ts +51 -0
- package/src/forge/runtime/workflows/resolve-step.ts +46 -0
- package/src/forge/runtime/workflows/retry-run.ts +44 -0
- package/src/forge/runtime/workflows/retry.ts +8 -0
- package/src/forge/runtime/workflows/sanitize.ts +19 -0
- package/src/forge/runtime/workflows/start-from-outbox.ts +71 -0
- package/src/forge/runtime/workflows/types.ts +77 -0
- package/src/forge/server.ts +96 -0
- package/src/forge/ui/index.ts +770 -0
- package/src/forge/ui/types.ts +191 -0
- package/templates/b2b-support-web/.env.example +22 -0
- package/templates/b2b-support-web/.vscode/settings.json +14 -0
- package/templates/b2b-support-web/AGENTS.md +108 -0
- package/templates/b2b-support-web/README.md +48 -0
- package/templates/b2b-support-web/forge.config.ts +3 -0
- package/templates/b2b-support-web/package.json +34 -0
- package/templates/b2b-support-web/src/actions/captureTicketCreated.ts +14 -0
- package/templates/b2b-support-web/src/commands/closeTicket.ts +20 -0
- package/templates/b2b-support-web/src/commands/createTicket.ts +47 -0
- package/templates/b2b-support-web/src/commands/manageBilling.ts +9 -0
- package/templates/b2b-support-web/src/forge/schema.ts +35 -0
- package/templates/b2b-support-web/src/policies.ts +9 -0
- package/templates/b2b-support-web/src/queries/getTicket.ts +6 -0
- package/templates/b2b-support-web/src/queries/listTickets.ts +6 -0
- package/templates/b2b-support-web/src/queries/liveTickets.ts +9 -0
- package/templates/b2b-support-web/src/workflows/triageTicketWorkflow.ts +64 -0
- package/templates/b2b-support-web/tsconfig.json +14 -0
- package/templates/b2b-support-web/web/app/globals.css +77 -0
- package/templates/b2b-support-web/web/app/layout.tsx +13 -0
- package/templates/b2b-support-web/web/app/page.tsx +13 -0
- package/templates/b2b-support-web/web/app/providers.tsx +21 -0
- package/templates/b2b-support-web/web/app/tickets/page.tsx +21 -0
- package/templates/b2b-support-web/web/components/CreateTicketForm.tsx +43 -0
- package/templates/b2b-support-web/web/components/PolicyDeniedDemo.tsx +31 -0
- package/templates/b2b-support-web/web/components/TicketList.tsx +52 -0
- package/templates/b2b-support-web/web/components/TraceDetails.tsx +18 -0
- package/templates/b2b-support-web/web/components/TriageStatus.tsx +13 -0
- package/templates/b2b-support-web/web/lib/forge.ts +13 -0
- package/templates/b2b-support-web/web/next-env.d.ts +5 -0
- package/templates/b2b-support-web/web/next.config.ts +8 -0
- package/templates/b2b-support-web/web/package.json +21 -0
- package/templates/b2b-support-web/web/tsconfig.json +30 -0
- package/templates/minimal-web/.vscode/settings.json +14 -0
- package/templates/minimal-web/README.md +21 -0
- package/templates/minimal-web/forge.config.ts +3 -0
- package/templates/minimal-web/package.json +32 -0
- package/templates/minimal-web/src/actions/logNoteCreated.ts +11 -0
- package/templates/minimal-web/src/commands/createNote.ts +26 -0
- package/templates/minimal-web/src/forge/schema.ts +12 -0
- package/templates/minimal-web/src/policies.ts +6 -0
- package/templates/minimal-web/src/queries/listNotes.ts +8 -0
- package/templates/minimal-web/src/queries/liveNotes.ts +8 -0
- package/templates/minimal-web/tsconfig.json +15 -0
- package/templates/minimal-web/web/index.html +12 -0
- package/templates/minimal-web/web/package.json +21 -0
- package/templates/minimal-web/web/src/App.tsx +89 -0
- package/templates/minimal-web/web/src/lib/forge.ts +13 -0
- package/templates/minimal-web/web/src/main.tsx +13 -0
- package/templates/minimal-web/web/src/styles.css +156 -0
- package/templates/minimal-web/web/tsconfig.json +18 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { createDiagnostic } from "../../compiler/diagnostics/create.ts";
|
|
2
|
+
import { hashStable } from "../../compiler/primitives/hash.ts";
|
|
3
|
+
import type {
|
|
4
|
+
FailureInput,
|
|
5
|
+
FailureKind,
|
|
6
|
+
RepairAffected,
|
|
7
|
+
RepairConfidence,
|
|
8
|
+
RepairDiagnosis,
|
|
9
|
+
RepairRule,
|
|
10
|
+
SuggestedRepair,
|
|
11
|
+
} from "../types.ts";
|
|
12
|
+
|
|
13
|
+
const REPAIR_VERSION = "repair-0.1.0";
|
|
14
|
+
|
|
15
|
+
function emptyAffected(): RepairAffected {
|
|
16
|
+
return {
|
|
17
|
+
files: [],
|
|
18
|
+
commands: [],
|
|
19
|
+
queries: [],
|
|
20
|
+
liveQueries: [],
|
|
21
|
+
actions: [],
|
|
22
|
+
workflows: [],
|
|
23
|
+
tables: [],
|
|
24
|
+
policies: [],
|
|
25
|
+
components: [],
|
|
26
|
+
packages: [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function push(values: string[], value: string | undefined): void {
|
|
31
|
+
if (value && !values.includes(value)) {
|
|
32
|
+
values.push(value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function affectedFromDiagnostics(input: FailureInput): RepairAffected {
|
|
37
|
+
const affected = emptyAffected();
|
|
38
|
+
const haystack = `${input.stdout}\n${input.stderr}\n${input.diagnostics.map((d) => `${d.message} ${d.file ?? ""}`).join("\n")}`;
|
|
39
|
+
for (const diagnostic of input.diagnostics) {
|
|
40
|
+
push(affected.files, diagnostic.file);
|
|
41
|
+
const policy = diagnostic.message.match(/\b([a-z][a-z0-9_-]+\.[a-z][a-z0-9_-]+)\b/i)?.[1];
|
|
42
|
+
if (policy) push(affected.policies, policy);
|
|
43
|
+
}
|
|
44
|
+
const command = haystack.match(/\bcommand\s+([a-zA-Z][a-zA-Z0-9_]*)\b/)?.[1] ??
|
|
45
|
+
haystack.match(/src\/commands\/([a-zA-Z][a-zA-Z0-9_]*)\.ts/)?.[1];
|
|
46
|
+
push(affected.commands, command);
|
|
47
|
+
const query = haystack.match(/\bquery\s+([a-zA-Z][a-zA-Z0-9_]*)\b/)?.[1] ??
|
|
48
|
+
haystack.match(/src\/queries\/([a-zA-Z][a-zA-Z0-9_]*)\.ts/)?.[1];
|
|
49
|
+
if (query?.toLowerCase().startsWith("live")) push(affected.liveQueries, query);
|
|
50
|
+
else push(affected.queries, query);
|
|
51
|
+
const pkg = haystack.match(/\b(stripe|posthog|sentry|openai|anthropic|ai|jose)\b/i)?.[1];
|
|
52
|
+
push(affected.packages, pkg);
|
|
53
|
+
affected.files.sort();
|
|
54
|
+
affected.commands.sort();
|
|
55
|
+
affected.queries.sort();
|
|
56
|
+
affected.liveQueries.sort();
|
|
57
|
+
affected.policies.sort();
|
|
58
|
+
affected.packages.sort();
|
|
59
|
+
return affected;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function diagnosis(input: FailureInput, args: {
|
|
63
|
+
failureKind: FailureKind;
|
|
64
|
+
code: string;
|
|
65
|
+
summary: string;
|
|
66
|
+
likelyCause: string;
|
|
67
|
+
suggestedRepairs: SuggestedRepair[];
|
|
68
|
+
recommendedChecks?: string[];
|
|
69
|
+
confidence: RepairConfidence;
|
|
70
|
+
}): RepairDiagnosis {
|
|
71
|
+
const affected = affectedFromDiagnostics(input);
|
|
72
|
+
const id = `repair_${hashStable(`${args.code}:${args.summary}:${input.source.kind}:${input.source.id ?? ""}:${input.source.file ?? ""}`).slice(0, 12)}`;
|
|
73
|
+
const diagnostics =
|
|
74
|
+
input.diagnostics.length > 0
|
|
75
|
+
? input.diagnostics
|
|
76
|
+
: [
|
|
77
|
+
createDiagnostic({
|
|
78
|
+
severity: "error",
|
|
79
|
+
code: args.code,
|
|
80
|
+
message: args.summary,
|
|
81
|
+
file: input.source.file,
|
|
82
|
+
}),
|
|
83
|
+
];
|
|
84
|
+
return {
|
|
85
|
+
schemaVersion: "0.1.0",
|
|
86
|
+
repairVersion: REPAIR_VERSION,
|
|
87
|
+
id,
|
|
88
|
+
failureKind: args.failureKind,
|
|
89
|
+
source: input.source,
|
|
90
|
+
diagnostics,
|
|
91
|
+
summary: args.summary,
|
|
92
|
+
likelyCause: args.likelyCause,
|
|
93
|
+
affected,
|
|
94
|
+
suggestedRepairs: args.suggestedRepairs,
|
|
95
|
+
recommendedChecks: args.recommendedChecks ?? [
|
|
96
|
+
"forge generate",
|
|
97
|
+
"forge check",
|
|
98
|
+
"forge verify --changed",
|
|
99
|
+
"forge verify --strict",
|
|
100
|
+
],
|
|
101
|
+
confidence: args.confidence,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function hasCode(input: FailureInput, ...codes: string[]): boolean {
|
|
106
|
+
const text = `${input.stdout}\n${input.stderr}\n${input.diagnostics.map((d) => `${d.code}\n${d.message}`).join("\n")}`;
|
|
107
|
+
return codes.some((code) => text.includes(code));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function firstPolicy(input: FailureInput): string {
|
|
111
|
+
const text = `${input.stdout}\n${input.stderr}\n${input.diagnostics.map((d) => d.message).join("\n")}`;
|
|
112
|
+
return text.match(/\b([a-z][a-z0-9_-]+\.[a-z][a-z0-9_-]+)\b/i)?.[1] ?? "resource.action";
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function firstSecret(input: FailureInput): string {
|
|
116
|
+
const text = `${input.stdout}\n${input.stderr}\n${input.diagnostics.map((d) => d.message).join("\n")}`;
|
|
117
|
+
return text
|
|
118
|
+
.match(/\b[A-Z][A-Z0-9_]{2,}\b/g)
|
|
119
|
+
?.find((candidate) => !candidate.startsWith("FORGE_")) ?? "SECRET_NAME";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function firstCommand(input: FailureInput): string {
|
|
123
|
+
const affected = affectedFromDiagnostics(input);
|
|
124
|
+
return affected.commands[0] ?? "commandName";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function firstPackage(input: FailureInput): string {
|
|
128
|
+
const affected = affectedFromDiagnostics(input);
|
|
129
|
+
return affected.packages[0] ?? "package-name";
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const repairRules: RepairRule[] = [
|
|
133
|
+
{
|
|
134
|
+
id: "generated-drift",
|
|
135
|
+
matches: (input) => hasCode(input, "FORGE_DRIFT", "FORGE_ORPHANED_GENERATED_FILE"),
|
|
136
|
+
diagnose: (input) =>
|
|
137
|
+
diagnosis(input, {
|
|
138
|
+
failureKind: "generated-drift",
|
|
139
|
+
code: "FORGE_DRIFT",
|
|
140
|
+
summary: "Generated artifacts are stale.",
|
|
141
|
+
likelyCause: "Source files or compiler inputs changed without regenerating Forge artifacts.",
|
|
142
|
+
confidence: "high",
|
|
143
|
+
suggestedRepairs: [
|
|
144
|
+
{
|
|
145
|
+
id: "run-generate",
|
|
146
|
+
kind: "run-command",
|
|
147
|
+
title: "Regenerate Forge artifacts",
|
|
148
|
+
description: "Run the deterministic generator to update generated files and forge.lock.",
|
|
149
|
+
command: "forge generate",
|
|
150
|
+
confidence: "high",
|
|
151
|
+
risk: { level: "low", reasons: ["deterministic generated output"] },
|
|
152
|
+
requiresConfirmation: false,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
}),
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: "runtime-guard",
|
|
159
|
+
matches: (input) => hasCode(input, "FORGE_GUARD_VIOLATION", "FORGE_RUNTIME_GUARD_BLOCKED"),
|
|
160
|
+
diagnose: (input) => {
|
|
161
|
+
const command = firstCommand(input);
|
|
162
|
+
const pkg = firstPackage(input);
|
|
163
|
+
return diagnosis(input, {
|
|
164
|
+
failureKind: "runtime-guard",
|
|
165
|
+
code: "FORGE_GUARD_VIOLATION",
|
|
166
|
+
summary: `A forbidden package or capability is reachable from deterministic runtime code.`,
|
|
167
|
+
likelyCause: "A network, secret, AI, or server-only package was imported from a command/query/liveQuery path.",
|
|
168
|
+
confidence: command !== "commandName" ? "medium" : "low",
|
|
169
|
+
suggestedRepairs: [
|
|
170
|
+
{
|
|
171
|
+
id: "extract-action",
|
|
172
|
+
kind: "refactor",
|
|
173
|
+
title: "Move side effect to an action",
|
|
174
|
+
description: "Make the command emit an event and move the package call to an action.",
|
|
175
|
+
command: `forge refactor extract-action ${command} --package ${pkg} --event ${command}.requested`,
|
|
176
|
+
confidence: command !== "commandName" ? "medium" : "low",
|
|
177
|
+
risk: { level: "medium", reasons: ["changes runtime side-effect boundary"] },
|
|
178
|
+
requiresConfirmation: true,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: "policy-auth",
|
|
186
|
+
matches: (input) =>
|
|
187
|
+
hasCode(input, "FORGE_POLICY_UNKNOWN", "FORGE_POLICY_MISSING", "FORGE_POLICY_DENIED", "FORGE_AUTH_TENANT_MISSING", "FORGE_AUTH_INVALID_TOKEN"),
|
|
188
|
+
diagnose: (input) => {
|
|
189
|
+
const policy = firstPolicy(input);
|
|
190
|
+
return diagnosis(input, {
|
|
191
|
+
failureKind: "policy-auth",
|
|
192
|
+
code: "FORGE_POLICY_UNKNOWN",
|
|
193
|
+
summary: `Policy or auth configuration needs attention for ${policy}.`,
|
|
194
|
+
likelyCause: "A runtime entry references a missing policy, an auth context is incomplete, or the caller role is denied.",
|
|
195
|
+
confidence: "medium",
|
|
196
|
+
suggestedRepairs: [
|
|
197
|
+
{
|
|
198
|
+
id: "make-policy",
|
|
199
|
+
kind: "make",
|
|
200
|
+
title: "Create missing policy",
|
|
201
|
+
description: "Create the policy with conservative owner/admin/member roles, then review access intentionally.",
|
|
202
|
+
command: `forge make policy ${policy} --roles owner,admin,member --apply --yes`,
|
|
203
|
+
confidence: "medium",
|
|
204
|
+
risk: { level: "high", reasons: ["permission changes require human review"] },
|
|
205
|
+
requiresConfirmation: true,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: "simulate-policy",
|
|
209
|
+
kind: "run-command",
|
|
210
|
+
title: "Simulate policy",
|
|
211
|
+
description: "Check whether the expected role is allowed before changing permissions.",
|
|
212
|
+
command: `forge policy simulate ${policy} --role member`,
|
|
213
|
+
confidence: "high",
|
|
214
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
215
|
+
requiresConfirmation: false,
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
});
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
id: "secrets",
|
|
223
|
+
matches: (input) =>
|
|
224
|
+
hasCode(input, "FORGE_SECRET_DIRECT_PROCESS_ENV", "FORGE_SECRET_MISSING", "FORGE_SECRET_FORBIDDEN_CONTEXT"),
|
|
225
|
+
diagnose: (input) => {
|
|
226
|
+
const secret = firstSecret(input);
|
|
227
|
+
return diagnosis(input, {
|
|
228
|
+
failureKind: "secrets",
|
|
229
|
+
code: "FORGE_SECRET_DIRECT_PROCESS_ENV",
|
|
230
|
+
summary: `Secret/config usage is unsafe or missing for ${secret}.`,
|
|
231
|
+
likelyCause: "Code reads process.env directly, accesses secrets in a forbidden runtime, or the environment lacks a required secret.",
|
|
232
|
+
confidence: "high",
|
|
233
|
+
suggestedRepairs: [
|
|
234
|
+
{
|
|
235
|
+
id: "replace-process-env",
|
|
236
|
+
kind: "refactor",
|
|
237
|
+
title: "Replace process.env access",
|
|
238
|
+
description: "Use ctx.secrets where a runtime context is available.",
|
|
239
|
+
command: `forge refactor replace-process-env ${secret} --yes`,
|
|
240
|
+
confidence: "high",
|
|
241
|
+
risk: { level: "low", reasons: ["mechanical secret access replacement"] },
|
|
242
|
+
requiresConfirmation: true,
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: "check-secrets",
|
|
246
|
+
kind: "run-command",
|
|
247
|
+
title: "Check secrets",
|
|
248
|
+
description: "Validate secret registry and missing environment names.",
|
|
249
|
+
command: "forge secrets check",
|
|
250
|
+
confidence: "high",
|
|
251
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
252
|
+
requiresConfirmation: false,
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
});
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: "ai",
|
|
260
|
+
matches: (input) => hasCode(input, "FORGE_AI_FORBIDDEN_CONTEXT", "FORGE_AI_SECRET_MISSING", "FORGE_AI_PROVIDER_UNKNOWN", "FORGE_AI_GENERATION_FAILED"),
|
|
261
|
+
diagnose: (input) =>
|
|
262
|
+
diagnosis(input, {
|
|
263
|
+
failureKind: "ai",
|
|
264
|
+
code: "FORGE_AI_FORBIDDEN_CONTEXT",
|
|
265
|
+
summary: "AI usage failed or appears in a forbidden runtime context.",
|
|
266
|
+
likelyCause: "AI calls belong in actions/workflows/endpoints/server, not deterministic commands/queries/liveQueries.",
|
|
267
|
+
confidence: "medium",
|
|
268
|
+
suggestedRepairs: [
|
|
269
|
+
{
|
|
270
|
+
id: "ai-check",
|
|
271
|
+
kind: "run-command",
|
|
272
|
+
title: "Check AI providers",
|
|
273
|
+
description: "Validate provider configuration and mock mode.",
|
|
274
|
+
command: "forge ai check",
|
|
275
|
+
confidence: "high",
|
|
276
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
277
|
+
requiresConfirmation: false,
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
id: "move-ai",
|
|
281
|
+
kind: "manual",
|
|
282
|
+
title: "Move AI call to action/workflow",
|
|
283
|
+
description: "Store AI output in the database from an action/workflow; queries should read the stored result.",
|
|
284
|
+
confidence: "medium",
|
|
285
|
+
risk: { level: "medium", reasons: ["changes runtime architecture"] },
|
|
286
|
+
requiresConfirmation: true,
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
}),
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
id: "query-readonly",
|
|
293
|
+
matches: (input) =>
|
|
294
|
+
hasCode(input, "FORGE_QUERY_WRITE_FORBIDDEN", "FORGE_QUERY_EMIT_FORBIDDEN", "FORGE_QUERY_SECRET_FORBIDDEN", "FORGE_QUERY_AI_FORBIDDEN"),
|
|
295
|
+
diagnose: (input) =>
|
|
296
|
+
diagnosis(input, {
|
|
297
|
+
failureKind: "query-readonly",
|
|
298
|
+
code: "FORGE_QUERY_WRITE_FORBIDDEN",
|
|
299
|
+
summary: "A query performs work that is forbidden in read-only runtime.",
|
|
300
|
+
likelyCause: "Queries and liveQueries must be deterministic reads without writes, emits, secrets, AI, or integrations.",
|
|
301
|
+
confidence: "medium",
|
|
302
|
+
suggestedRepairs: [
|
|
303
|
+
{
|
|
304
|
+
id: "make-command",
|
|
305
|
+
kind: "make",
|
|
306
|
+
title: "Move mutation to a command",
|
|
307
|
+
description: "Create a command for writes or event emission, then keep the query read-only.",
|
|
308
|
+
command: "forge make command <name> --table <table> --policy <policy>",
|
|
309
|
+
confidence: "medium",
|
|
310
|
+
risk: { level: "medium", reasons: ["requires choosing command/table/policy names"] },
|
|
311
|
+
requiresConfirmation: true,
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
}),
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
id: "livequery",
|
|
318
|
+
matches: (input) =>
|
|
319
|
+
hasCode(input, "FORGE_LIVE_INVALIDATION_MISSING", "FORGE_LIVE_RERUN_FAILED", "FORGE_LIVE_SNAPSHOT_TOO_LARGE", "FORGE_LIVEQUERY_UNKNOWN", "FORGE_UI_LIVE_UPDATE_TIMEOUT"),
|
|
320
|
+
diagnose: (input) =>
|
|
321
|
+
diagnosis(input, {
|
|
322
|
+
failureKind: "livequery-reactivity",
|
|
323
|
+
code: "FORGE_LIVE_INVALIDATION_MISSING",
|
|
324
|
+
summary: "LiveQuery reactivity or subscription delivery failed.",
|
|
325
|
+
likelyCause: "A write was not tracked, the liveQuery dependency is unknown, the tenant scope mismatched, or the snapshot is too large.",
|
|
326
|
+
confidence: "medium",
|
|
327
|
+
suggestedRepairs: [
|
|
328
|
+
{
|
|
329
|
+
id: "live-debug",
|
|
330
|
+
kind: "run-command",
|
|
331
|
+
title: "Inspect live subscriptions",
|
|
332
|
+
description: "Inspect liveQuery state and invalidation history.",
|
|
333
|
+
command: "forge live invalidations --json",
|
|
334
|
+
confidence: "high",
|
|
335
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
336
|
+
requiresConfirmation: false,
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
}),
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
id: "workflow",
|
|
343
|
+
matches: (input) => hasCode(input, "FORGE_WORKFLOW_STEP_FAILED", "FORGE_WORKFLOW_STEP_DEAD", "FORGE_WORKFLOW_RUN_NOT_FOUND"),
|
|
344
|
+
diagnose: (input) =>
|
|
345
|
+
diagnosis(input, {
|
|
346
|
+
failureKind: "workflow",
|
|
347
|
+
code: "FORGE_WORKFLOW_STEP_FAILED",
|
|
348
|
+
summary: "Workflow run or step failed.",
|
|
349
|
+
likelyCause: "A workflow step threw, missed a secret, received invalid input, or exhausted retries.",
|
|
350
|
+
confidence: "medium",
|
|
351
|
+
suggestedRepairs: [
|
|
352
|
+
{
|
|
353
|
+
id: "workflow-inspect",
|
|
354
|
+
kind: "run-command",
|
|
355
|
+
title: "Inspect workflow run",
|
|
356
|
+
description: "Inspect step state, attempts, traceId, and last error.",
|
|
357
|
+
command: "forge workflow inspect <runId> --json",
|
|
358
|
+
confidence: "high",
|
|
359
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
360
|
+
requiresConfirmation: false,
|
|
361
|
+
},
|
|
362
|
+
],
|
|
363
|
+
}),
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
id: "outbox",
|
|
367
|
+
matches: (input) => hasCode(input, "FORGE_OUTBOX_PROCESS_FAILED", "FORGE_OUTBOX_DELIVERY_NOT_FOUND", "dead-letter", "delivery dead"),
|
|
368
|
+
diagnose: (input) =>
|
|
369
|
+
diagnosis(input, {
|
|
370
|
+
failureKind: "outbox",
|
|
371
|
+
code: "FORGE_OUTBOX_PROCESS_FAILED",
|
|
372
|
+
summary: "Outbox delivery failed or is dead-lettered.",
|
|
373
|
+
likelyCause: "The subscribed action failed repeatedly, often due to secret, integration, payload, or network configuration.",
|
|
374
|
+
confidence: "medium",
|
|
375
|
+
suggestedRepairs: [
|
|
376
|
+
{
|
|
377
|
+
id: "outbox-retry",
|
|
378
|
+
kind: "run-command",
|
|
379
|
+
title: "Retry delivery after fixing action",
|
|
380
|
+
description: "Retry the delivery once the underlying action/integration issue is fixed.",
|
|
381
|
+
command: "forge outbox retry <deliveryId>",
|
|
382
|
+
confidence: "medium",
|
|
383
|
+
risk: { level: "medium", reasons: ["replays a side-effect delivery"] },
|
|
384
|
+
requiresConfirmation: true,
|
|
385
|
+
},
|
|
386
|
+
],
|
|
387
|
+
}),
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: "package-upgrade",
|
|
391
|
+
matches: (input) =>
|
|
392
|
+
hasCode(input, "FORGE_DEPS_API_BREAKING_CHANGE", "FORGE_DEPS_REMOVED_EXPORT_USED", "FORGE_DEPS_SIGNATURE_CHANGED_USED", "FORGE_DEPS_APPLY_FAILED"),
|
|
393
|
+
diagnose: (input) =>
|
|
394
|
+
diagnosis(input, {
|
|
395
|
+
failureKind: "package-upgrade",
|
|
396
|
+
code: "FORGE_DEPS_API_BREAKING_CHANGE",
|
|
397
|
+
summary: "Package upgrade introduced an API or runtime compatibility issue.",
|
|
398
|
+
likelyCause: "The upgrade plan contains removed exports, changed signatures, new capabilities, or failing callsites.",
|
|
399
|
+
confidence: "medium",
|
|
400
|
+
suggestedRepairs: [
|
|
401
|
+
{
|
|
402
|
+
id: "deps-check",
|
|
403
|
+
kind: "run-command",
|
|
404
|
+
title: "Inspect package upgrade risk",
|
|
405
|
+
description: "Re-run the upgrade checker and inspect affected callsites.",
|
|
406
|
+
command: "forge deps upgrade-check --json",
|
|
407
|
+
confidence: "high",
|
|
408
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
409
|
+
requiresConfirmation: false,
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
}),
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: "frontend-client",
|
|
416
|
+
matches: (input) => hasCode(input, "server-only", "client", "ForgeError", "React", "FORGE_UI_EXPECTATION_FAILED", "FORGE_UI_SELECTOR_NOT_FOUND", "FORGE_UI_CONSOLE_ERROR", "FORGE_UI_NETWORK_ERROR"),
|
|
417
|
+
diagnose: (input) =>
|
|
418
|
+
diagnosis(input, {
|
|
419
|
+
failureKind: "frontend-client",
|
|
420
|
+
code: "FORGE_REPAIR_FRONTEND_CLIENT",
|
|
421
|
+
summary: "Frontend/client failure needs client-safe API or hook review.",
|
|
422
|
+
likelyCause: "A frontend component may import server-only code or use Forge client hooks without the expected provider/auth context.",
|
|
423
|
+
confidence: "low",
|
|
424
|
+
suggestedRepairs: [
|
|
425
|
+
{
|
|
426
|
+
id: "client-safe-imports",
|
|
427
|
+
kind: "manual",
|
|
428
|
+
title: "Use generated client-safe entrypoints",
|
|
429
|
+
description: "Import from generated client/react surfaces instead of server adapters.",
|
|
430
|
+
confidence: "low",
|
|
431
|
+
risk: { level: "medium", reasons: ["requires component-specific review"] },
|
|
432
|
+
requiresConfirmation: true,
|
|
433
|
+
},
|
|
434
|
+
],
|
|
435
|
+
}),
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
id: "release-deploy",
|
|
439
|
+
matches: (input) => hasCode(input, "FORGE_RELEASE_", "FORGE_SOURCEMAP_", "self-host", "deploy"),
|
|
440
|
+
diagnose: (input) =>
|
|
441
|
+
diagnosis(input, {
|
|
442
|
+
failureKind: "release-deploy",
|
|
443
|
+
code: "FORGE_RELEASE_ARTIFACT_MISSING",
|
|
444
|
+
summary: "Release or deployment verification failed.",
|
|
445
|
+
likelyCause: "Release artifacts, source maps, self-host files, or environment configuration are missing or stale.",
|
|
446
|
+
confidence: "medium",
|
|
447
|
+
suggestedRepairs: [
|
|
448
|
+
{
|
|
449
|
+
id: "release-check",
|
|
450
|
+
kind: "run-command",
|
|
451
|
+
title: "Run release and self-host checks",
|
|
452
|
+
description: "Inspect release/deploy generated artifacts and runtime health assumptions.",
|
|
453
|
+
command: "forge release check",
|
|
454
|
+
confidence: "high",
|
|
455
|
+
risk: { level: "low", reasons: ["read-only diagnostic command"] },
|
|
456
|
+
requiresConfirmation: false,
|
|
457
|
+
},
|
|
458
|
+
],
|
|
459
|
+
}),
|
|
460
|
+
},
|
|
461
|
+
];
|
|
462
|
+
|
|
463
|
+
export function explainDiagnostic(code: string): string {
|
|
464
|
+
const explanations: Record<string, string> = {
|
|
465
|
+
FORGE_DRIFT: "Generated artifacts are stale. Run forge generate, then forge generate --check.",
|
|
466
|
+
FORGE_GUARD_VIOLATION: "A package or capability is used in a runtime context where it is forbidden. Move side effects to actions/workflows.",
|
|
467
|
+
FORGE_POLICY_UNKNOWN: "A runtime entry references a missing policy. Create or correct the policy, then simulate expected roles.",
|
|
468
|
+
FORGE_POLICY_DENIED: "The caller auth context does not satisfy the policy. Fix test auth or intentionally update policy roles.",
|
|
469
|
+
FORGE_SECRET_DIRECT_PROCESS_ENV: "Code reads process.env directly. Use ctx.secrets/ctx.config in allowed runtime contexts.",
|
|
470
|
+
FORGE_AI_FORBIDDEN_CONTEXT: "AI is being used in a deterministic context. Move AI calls to action/workflow/server runtime.",
|
|
471
|
+
FORGE_WORKFLOW_STEP_FAILED: "A workflow step failed. Inspect the workflow run and trace before retrying.",
|
|
472
|
+
FORGE_OUTBOX_PROCESS_FAILED: "An outbox delivery failed. Inspect the subscribed action and retry after fixing the cause.",
|
|
473
|
+
FORGE_DEPS_API_BREAKING_CHANGE: "A package upgrade changed API/runtime compatibility. Inspect the upgrade plan and affected callsites.",
|
|
474
|
+
};
|
|
475
|
+
return explanations[code] ?? `${code}: no specific repair explanation is registered yet. Run forge repair diagnose --diagnostic ${code} --json for generic guidance.`;
|
|
476
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { Diagnostic } from "../compiler/types/diagnostic.ts";
|
|
2
|
+
import type { PlannedFile, PlannedPatch } from "../make/types.ts";
|
|
3
|
+
|
|
4
|
+
export type RepairSubcommand =
|
|
5
|
+
| "diagnose"
|
|
6
|
+
| "explain"
|
|
7
|
+
| "plan"
|
|
8
|
+
| "apply"
|
|
9
|
+
| "run"
|
|
10
|
+
| "list"
|
|
11
|
+
| "inspect"
|
|
12
|
+
| "rollback";
|
|
13
|
+
|
|
14
|
+
export type FailureKind =
|
|
15
|
+
| "generated-drift"
|
|
16
|
+
| "runtime-guard"
|
|
17
|
+
| "policy-auth"
|
|
18
|
+
| "tenant-isolation"
|
|
19
|
+
| "rls"
|
|
20
|
+
| "query-readonly"
|
|
21
|
+
| "livequery-reactivity"
|
|
22
|
+
| "db-migration"
|
|
23
|
+
| "workflow"
|
|
24
|
+
| "outbox"
|
|
25
|
+
| "telemetry"
|
|
26
|
+
| "secrets"
|
|
27
|
+
| "ai"
|
|
28
|
+
| "package-upgrade"
|
|
29
|
+
| "frontend-client"
|
|
30
|
+
| "release-deploy"
|
|
31
|
+
| "typecheck"
|
|
32
|
+
| "test-failure"
|
|
33
|
+
| "unknown";
|
|
34
|
+
|
|
35
|
+
export type RepairConfidence = "low" | "medium" | "high";
|
|
36
|
+
export type RepairRiskLevel = "low" | "medium" | "high";
|
|
37
|
+
|
|
38
|
+
export interface RepairSource {
|
|
39
|
+
kind:
|
|
40
|
+
| "test-run"
|
|
41
|
+
| "ui-run"
|
|
42
|
+
| "trace"
|
|
43
|
+
| "workflow-run"
|
|
44
|
+
| "outbox-delivery"
|
|
45
|
+
| "diagnostic"
|
|
46
|
+
| "manual";
|
|
47
|
+
id?: string;
|
|
48
|
+
file?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface RepairAffected {
|
|
52
|
+
files: string[];
|
|
53
|
+
commands: string[];
|
|
54
|
+
queries: string[];
|
|
55
|
+
liveQueries: string[];
|
|
56
|
+
actions: string[];
|
|
57
|
+
workflows: string[];
|
|
58
|
+
tables: string[];
|
|
59
|
+
policies: string[];
|
|
60
|
+
components: string[];
|
|
61
|
+
packages: string[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SuggestedRepair {
|
|
65
|
+
id: string;
|
|
66
|
+
kind: "run-command" | "refactor" | "make" | "patch" | "manual";
|
|
67
|
+
title: string;
|
|
68
|
+
description: string;
|
|
69
|
+
command?: string;
|
|
70
|
+
patchPreview?: PlannedPatch[];
|
|
71
|
+
confidence: RepairConfidence;
|
|
72
|
+
risk: {
|
|
73
|
+
level: RepairRiskLevel;
|
|
74
|
+
reasons: string[];
|
|
75
|
+
};
|
|
76
|
+
requiresConfirmation: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface RepairDiagnosis {
|
|
80
|
+
schemaVersion: "0.1.0";
|
|
81
|
+
repairVersion: string;
|
|
82
|
+
id: string;
|
|
83
|
+
failureKind: FailureKind;
|
|
84
|
+
source: RepairSource;
|
|
85
|
+
diagnostics: Diagnostic[];
|
|
86
|
+
summary: string;
|
|
87
|
+
likelyCause: string;
|
|
88
|
+
affected: RepairAffected;
|
|
89
|
+
suggestedRepairs: SuggestedRepair[];
|
|
90
|
+
recommendedChecks: string[];
|
|
91
|
+
confidence: RepairConfidence;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface RepairPlan {
|
|
95
|
+
schemaVersion: "0.1.0";
|
|
96
|
+
repairVersion: string;
|
|
97
|
+
id: string;
|
|
98
|
+
diagnosis: RepairDiagnosis;
|
|
99
|
+
selectedRepair?: string;
|
|
100
|
+
filesToModify: PlannedPatch[];
|
|
101
|
+
filesToCreate: PlannedFile[];
|
|
102
|
+
filesToDelete: Array<{ file: string; description: string }>;
|
|
103
|
+
commandsToRun: string[];
|
|
104
|
+
verificationPlan: {
|
|
105
|
+
targeted: string[];
|
|
106
|
+
final: string[];
|
|
107
|
+
};
|
|
108
|
+
rollback: {
|
|
109
|
+
snapshotFile: string;
|
|
110
|
+
files: string[];
|
|
111
|
+
instructions: string[];
|
|
112
|
+
};
|
|
113
|
+
diagnostics: Diagnostic[];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export interface RepairApplyRecord {
|
|
117
|
+
schemaVersion: "0.1.0";
|
|
118
|
+
id: string;
|
|
119
|
+
repairId: string;
|
|
120
|
+
status: "applied" | "rolled-back" | "failed";
|
|
121
|
+
commandsRun: string[];
|
|
122
|
+
results: Array<{
|
|
123
|
+
command: string;
|
|
124
|
+
ok: boolean;
|
|
125
|
+
exitCode: number;
|
|
126
|
+
stdout?: string;
|
|
127
|
+
stderr?: string;
|
|
128
|
+
}>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface FailureInput {
|
|
132
|
+
source: RepairSource;
|
|
133
|
+
diagnostics: Diagnostic[];
|
|
134
|
+
failedCommands: string[];
|
|
135
|
+
stdout: string;
|
|
136
|
+
stderr: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface RepairRule {
|
|
140
|
+
id: string;
|
|
141
|
+
matches(input: FailureInput): boolean;
|
|
142
|
+
diagnose(input: FailureInput): RepairDiagnosis;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface RepairCommandOptions {
|
|
146
|
+
subcommand: RepairSubcommand;
|
|
147
|
+
workspaceRoot: string;
|
|
148
|
+
json: boolean;
|
|
149
|
+
fromLastTestRun: boolean;
|
|
150
|
+
fromLastUiRun?: boolean;
|
|
151
|
+
from?: string;
|
|
152
|
+
traceId?: string;
|
|
153
|
+
workflowRunId?: string;
|
|
154
|
+
outboxDeliveryId?: string;
|
|
155
|
+
diagnosticCode?: string;
|
|
156
|
+
repairId?: string;
|
|
157
|
+
selectedRepair?: string;
|
|
158
|
+
write: boolean;
|
|
159
|
+
yes: boolean;
|
|
160
|
+
keepFailed: boolean;
|
|
161
|
+
allowMediumConfidence: boolean;
|
|
162
|
+
maxAttempts: number;
|
|
163
|
+
commitFriendly: boolean;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export interface RepairResult {
|
|
167
|
+
ok: boolean;
|
|
168
|
+
diagnosis?: RepairDiagnosis;
|
|
169
|
+
plan?: RepairPlan;
|
|
170
|
+
plans?: RepairPlan[];
|
|
171
|
+
record?: RepairApplyRecord;
|
|
172
|
+
explanation?: string;
|
|
173
|
+
diagnostics: Diagnostic[];
|
|
174
|
+
exitCode: 0 | 1;
|
|
175
|
+
}
|