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,151 @@
|
|
|
1
|
+
import type { Diagnostic } from "../compiler/types/diagnostic.ts";
|
|
2
|
+
import type { TestCost, TestGraphEntry } from "../compiler/types/test-graph.ts";
|
|
3
|
+
|
|
4
|
+
export type ImpactSourceMode = "changed" | "staged" | "since" | "feature" | "refactor" | "upgrade";
|
|
5
|
+
export type ImpactRiskLevel = "low" | "medium" | "high";
|
|
6
|
+
|
|
7
|
+
export interface ImpactSource {
|
|
8
|
+
mode: ImpactSourceMode;
|
|
9
|
+
base?: string;
|
|
10
|
+
id?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ImpactedSystems {
|
|
14
|
+
data: {
|
|
15
|
+
tables: string[];
|
|
16
|
+
fields: string[];
|
|
17
|
+
};
|
|
18
|
+
runtime: {
|
|
19
|
+
commands: string[];
|
|
20
|
+
queries: string[];
|
|
21
|
+
liveQueries: string[];
|
|
22
|
+
actions: string[];
|
|
23
|
+
workflows: string[];
|
|
24
|
+
};
|
|
25
|
+
frontend: {
|
|
26
|
+
components: string[];
|
|
27
|
+
pages: string[];
|
|
28
|
+
};
|
|
29
|
+
policies: string[];
|
|
30
|
+
packages: string[];
|
|
31
|
+
generatedArtifacts: string[];
|
|
32
|
+
deploy: string[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ImpactRisk {
|
|
36
|
+
level: ImpactRiskLevel;
|
|
37
|
+
reasons: string[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface ImpactReport {
|
|
41
|
+
ok: boolean;
|
|
42
|
+
source: ImpactSource;
|
|
43
|
+
changedFiles: string[];
|
|
44
|
+
impacted: ImpactedSystems;
|
|
45
|
+
risk: ImpactRisk;
|
|
46
|
+
recommendedChecks: string[];
|
|
47
|
+
finalVerification: string[];
|
|
48
|
+
diagnostics: Diagnostic[];
|
|
49
|
+
exitCode: 0 | 1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface TestPlanCheck {
|
|
53
|
+
kind: "forge" | "script";
|
|
54
|
+
command: string;
|
|
55
|
+
cost: TestCost;
|
|
56
|
+
reason: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface TargetedTest {
|
|
60
|
+
file: string;
|
|
61
|
+
command: string;
|
|
62
|
+
reason: string;
|
|
63
|
+
cost: TestCost;
|
|
64
|
+
confidence: TestGraphEntry["confidence"];
|
|
65
|
+
lastDurationMs?: number;
|
|
66
|
+
lastRunOk?: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ImpactTestPlan {
|
|
70
|
+
schemaVersion: "0.1.0";
|
|
71
|
+
source: ImpactSource;
|
|
72
|
+
changedFiles: string[];
|
|
73
|
+
impacted: ImpactedSystems;
|
|
74
|
+
risk: ImpactRisk;
|
|
75
|
+
requiredChecks: TestPlanCheck[];
|
|
76
|
+
tests: TargetedTest[];
|
|
77
|
+
optionalChecks: TestPlanCheck[];
|
|
78
|
+
finalVerification: string[];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface TestRunStep {
|
|
82
|
+
command: string;
|
|
83
|
+
ok: boolean;
|
|
84
|
+
exitCode: number;
|
|
85
|
+
durationMs: number;
|
|
86
|
+
timedOut?: boolean;
|
|
87
|
+
failureKind?: string;
|
|
88
|
+
stdout?: string;
|
|
89
|
+
stderr?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface TestRunRecord {
|
|
93
|
+
schemaVersion: "0.1.0";
|
|
94
|
+
id: string;
|
|
95
|
+
changedHash: string;
|
|
96
|
+
planHash: string;
|
|
97
|
+
source: ImpactSource;
|
|
98
|
+
commands: string[];
|
|
99
|
+
timeoutMs: number;
|
|
100
|
+
results: TestRunStep[];
|
|
101
|
+
failed: string[];
|
|
102
|
+
durationMs: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface ImpactCommandOptions {
|
|
106
|
+
workspaceRoot: string;
|
|
107
|
+
json: boolean;
|
|
108
|
+
write: boolean;
|
|
109
|
+
changed: boolean;
|
|
110
|
+
staged: boolean;
|
|
111
|
+
since?: string;
|
|
112
|
+
featureId?: string;
|
|
113
|
+
refactorId?: string;
|
|
114
|
+
upgradeId?: string;
|
|
115
|
+
includeGenerated: boolean;
|
|
116
|
+
excludeTests: boolean;
|
|
117
|
+
riskThreshold?: ImpactRiskLevel;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type TestSubcommand = "plan" | "run" | "explain";
|
|
121
|
+
|
|
122
|
+
export interface TestCommandOptions {
|
|
123
|
+
subcommand: TestSubcommand;
|
|
124
|
+
workspaceRoot: string;
|
|
125
|
+
json: boolean;
|
|
126
|
+
write: boolean;
|
|
127
|
+
changed: boolean;
|
|
128
|
+
staged: boolean;
|
|
129
|
+
since?: string;
|
|
130
|
+
featureId?: string;
|
|
131
|
+
refactorId?: string;
|
|
132
|
+
upgradeId?: string;
|
|
133
|
+
planPath?: string;
|
|
134
|
+
testFile?: string;
|
|
135
|
+
maxCost: TestCost;
|
|
136
|
+
includeDocker: boolean;
|
|
137
|
+
includeBrowser: boolean;
|
|
138
|
+
bail: boolean;
|
|
139
|
+
report?: string;
|
|
140
|
+
timeoutMs?: number;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface ImpactResult {
|
|
144
|
+
ok: boolean;
|
|
145
|
+
report?: ImpactReport;
|
|
146
|
+
plan?: ImpactTestPlan;
|
|
147
|
+
test?: TestGraphEntry;
|
|
148
|
+
run?: TestRunRecord;
|
|
149
|
+
diagnostics: Diagnostic[];
|
|
150
|
+
exitCode: 0 | 1;
|
|
151
|
+
}
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import type { AgentContract } from "../compiler/agent-contract/types.ts";
|
|
3
|
+
import { createDiagnostic } from "../compiler/diagnostics/create.ts";
|
|
4
|
+
import { GENERATED_DIR } from "../compiler/emitter/constants.ts";
|
|
5
|
+
import { nodeFileSystem } from "../compiler/fs/index.ts";
|
|
6
|
+
import { stripDeterministicHeader } from "../compiler/primitives/header.ts";
|
|
7
|
+
import type {
|
|
8
|
+
ForgeDoOptions,
|
|
9
|
+
ForgeIntentCommand,
|
|
10
|
+
ForgeIntentConfidence,
|
|
11
|
+
ForgeIntentContextSummary,
|
|
12
|
+
ForgeIntentKind,
|
|
13
|
+
ForgeIntentPlanStep,
|
|
14
|
+
ForgeIntentResult,
|
|
15
|
+
ForgeIntentRisk,
|
|
16
|
+
} from "./types.ts";
|
|
17
|
+
|
|
18
|
+
const STOPWORDS = new Set([
|
|
19
|
+
"a",
|
|
20
|
+
"add",
|
|
21
|
+
"add-resource",
|
|
22
|
+
"adicionar",
|
|
23
|
+
"app",
|
|
24
|
+
"com",
|
|
25
|
+
"create",
|
|
26
|
+
"criar",
|
|
27
|
+
"crie",
|
|
28
|
+
"de",
|
|
29
|
+
"feature",
|
|
30
|
+
"for",
|
|
31
|
+
"make",
|
|
32
|
+
"new",
|
|
33
|
+
"nova",
|
|
34
|
+
"novo",
|
|
35
|
+
"o",
|
|
36
|
+
"resource",
|
|
37
|
+
"the",
|
|
38
|
+
"ui",
|
|
39
|
+
"uma",
|
|
40
|
+
"with",
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
function readGeneratedJson<T>(workspaceRoot: string, relativePath: string): T | null {
|
|
44
|
+
const absolute = join(workspaceRoot, relativePath);
|
|
45
|
+
if (!nodeFileSystem.exists(absolute)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(stripDeterministicHeader(nodeFileSystem.readText(absolute) ?? "")) as T;
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function tokenize(objective: string): string[] {
|
|
56
|
+
return objective
|
|
57
|
+
.toLowerCase()
|
|
58
|
+
.replace(/[^a-z0-9_.-]+/g, " ")
|
|
59
|
+
.split(/\s+/)
|
|
60
|
+
.map((token) => token.trim())
|
|
61
|
+
.filter(Boolean);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function uniqueSorted(items: string[]): string[] {
|
|
65
|
+
return [...new Set(items.filter(Boolean))].sort();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function includesAny(tokens: string[], words: string[]): boolean {
|
|
69
|
+
return words.some((word) => tokens.includes(word));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function classifyIntent(tokens: string[]): { kind: ForgeIntentKind; confidence: ForgeIntentConfidence } {
|
|
73
|
+
if (tokens.length === 0) {
|
|
74
|
+
return { kind: "inspect", confidence: "low" };
|
|
75
|
+
}
|
|
76
|
+
if (includesAny(tokens, ["fix", "repair", "corrigir", "consertar", "erro", "errors", "falha", "failing"])) {
|
|
77
|
+
return { kind: "fix", confidence: "high" };
|
|
78
|
+
}
|
|
79
|
+
if (includesAny(tokens, ["verify", "validar", "test", "teste", "tests", "check", "100"])) {
|
|
80
|
+
return { kind: "verify", confidence: "high" };
|
|
81
|
+
}
|
|
82
|
+
if (includesAny(tokens, ["ship", "handoff", "release", "commit", "pr", "push", "entregar"])) {
|
|
83
|
+
return { kind: "ship", confidence: "medium" };
|
|
84
|
+
}
|
|
85
|
+
if (includesAny(tokens, ["frontend", "ui", "route", "rota", "component", "page", "hook", "connect", "connect-ui", "conectar"])) {
|
|
86
|
+
if (includesAny(tokens, ["add", "add-resource", "create", "criar", "crie", "resource", "feature", "nova", "novo"])) {
|
|
87
|
+
return { kind: "add-feature", confidence: "high" };
|
|
88
|
+
}
|
|
89
|
+
return { kind: "connect-ui", confidence: "high" };
|
|
90
|
+
}
|
|
91
|
+
if (includesAny(tokens, ["add", "add-resource", "create", "criar", "crie", "make", "resource", "feature", "table", "command", "query"])) {
|
|
92
|
+
return { kind: "add-feature", confidence: "medium" };
|
|
93
|
+
}
|
|
94
|
+
if (includesAny(tokens, ["explain", "understand", "explicar", "entender", "describe", "mapa", "architecture", "arquitetura"])) {
|
|
95
|
+
return { kind: "explain", confidence: "high" };
|
|
96
|
+
}
|
|
97
|
+
return { kind: "inspect", confidence: "medium" };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function labelFor(kind: ForgeIntentKind): string {
|
|
101
|
+
switch (kind) {
|
|
102
|
+
case "add-feature":
|
|
103
|
+
return "Add a feature safely";
|
|
104
|
+
case "connect-ui":
|
|
105
|
+
return "Connect or repair frontend wiring";
|
|
106
|
+
case "explain":
|
|
107
|
+
return "Explain the project";
|
|
108
|
+
case "fix":
|
|
109
|
+
return "Diagnose and repair failures";
|
|
110
|
+
case "inspect":
|
|
111
|
+
return "Inspect the project";
|
|
112
|
+
case "ship":
|
|
113
|
+
return "Prepare a handoff or commit";
|
|
114
|
+
case "verify":
|
|
115
|
+
return "Verify changes";
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function extractResourceName(tokens: string[]): string {
|
|
120
|
+
const afterTrigger = tokens.findIndex((token) =>
|
|
121
|
+
["add", "add-resource", "create", "criar", "crie", "make", "resource", "feature", "table"].includes(token),
|
|
122
|
+
);
|
|
123
|
+
const candidates = tokens
|
|
124
|
+
.slice(afterTrigger >= 0 ? afterTrigger + 1 : 0)
|
|
125
|
+
.filter((token) => !STOPWORDS.has(token) && !token.includes("."));
|
|
126
|
+
return candidates[0] ?? "<name>";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function baseFiles(contract: AgentContract | null): string[] {
|
|
130
|
+
return uniqueSorted([
|
|
131
|
+
"AGENTS.md",
|
|
132
|
+
`${GENERATED_DIR}/agentContract.json`,
|
|
133
|
+
`${GENERATED_DIR}/frontendGraph.json`,
|
|
134
|
+
`${GENERATED_DIR}/appMap.md`,
|
|
135
|
+
`${GENERATED_DIR}/runtimeRules.md`,
|
|
136
|
+
`${GENERATED_DIR}/operationPlaybooks.md`,
|
|
137
|
+
...(contract?.frontend.routes.map((route) => route.file) ?? []),
|
|
138
|
+
...(contract?.frontend.bridgeFiles ?? []),
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function contextSummary(contract: AgentContract | null): ForgeIntentContextSummary {
|
|
143
|
+
return {
|
|
144
|
+
...(contract?.project.name ? { projectName: contract.project.name } : {}),
|
|
145
|
+
frontendPresent: contract?.frontend.present ?? false,
|
|
146
|
+
frontendFramework: contract?.frontend.framework ?? "unknown",
|
|
147
|
+
routes: contract?.frontend.routes.map((route) => route.path).sort() ?? [],
|
|
148
|
+
commands: contract?.commands.map((command) => command.name).sort() ?? [],
|
|
149
|
+
queries: contract?.queries.map((query) => query.name).sort() ?? [],
|
|
150
|
+
liveQueries: contract?.liveQueries.map((query) => query.name).sort() ?? [],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function intentCommand(command: string, purpose: string, when: ForgeIntentCommand["when"] = "now"): ForgeIntentCommand {
|
|
155
|
+
return { command, purpose, when };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function step(
|
|
159
|
+
title: string,
|
|
160
|
+
why: string,
|
|
161
|
+
commands: string[],
|
|
162
|
+
filesToInspect: string[],
|
|
163
|
+
successCriteria: string[],
|
|
164
|
+
): ForgeIntentPlanStep {
|
|
165
|
+
return { title, why, commands, filesToInspect, successCriteria };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function risk(level: ForgeIntentRisk["level"], reason: string, mitigation: string): ForgeIntentRisk {
|
|
169
|
+
return { level, reason, mitigation };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function planFor(input: {
|
|
173
|
+
kind: ForgeIntentKind;
|
|
174
|
+
objective: string;
|
|
175
|
+
tokens: string[];
|
|
176
|
+
contract: AgentContract | null;
|
|
177
|
+
}): {
|
|
178
|
+
summary: string;
|
|
179
|
+
plan: ForgeIntentPlanStep[];
|
|
180
|
+
commands: ForgeIntentCommand[];
|
|
181
|
+
filesToInspect: string[];
|
|
182
|
+
filesToChange: string[];
|
|
183
|
+
risks: ForgeIntentRisk[];
|
|
184
|
+
} {
|
|
185
|
+
const files = baseFiles(input.contract);
|
|
186
|
+
const resourceName = extractResourceName(input.tokens);
|
|
187
|
+
switch (input.kind) {
|
|
188
|
+
case "add-feature": {
|
|
189
|
+
const withUi = includesAny(input.tokens, ["ui", "frontend", "page", "component", "route", "with"]);
|
|
190
|
+
const dryRun = `forge make resource ${resourceName} --fields title:text,status:enum(open,closed)${withUi ? " --with-ui" : ""} --dry-run --json`;
|
|
191
|
+
const apply = `forge make resource ${resourceName} --fields title:text,status:enum(open,closed)${withUi ? " --with-ui" : ""} --yes`;
|
|
192
|
+
return {
|
|
193
|
+
summary: `Plan a resource-style feature named '${resourceName}' and keep generated contracts in sync.`,
|
|
194
|
+
plan: [
|
|
195
|
+
step(
|
|
196
|
+
"Inspect current app contract",
|
|
197
|
+
"The agent should understand existing entries, policies, frontend routes, and generated rules before editing.",
|
|
198
|
+
["forge dev --once --json", "forge inspect all --json"],
|
|
199
|
+
files,
|
|
200
|
+
["No stale generated artifacts", "Frontend/runtime diagnostics are visible before editing"],
|
|
201
|
+
),
|
|
202
|
+
step(
|
|
203
|
+
"Preview the scaffold",
|
|
204
|
+
"Resource scaffolding can touch schema, commands, queries, policies, and UI, so preview before applying.",
|
|
205
|
+
[dryRun],
|
|
206
|
+
["src/forge/schema.ts", "src/commands", "src/queries", "web"],
|
|
207
|
+
["Plan lists intended files", "Risk is understood before writes"],
|
|
208
|
+
),
|
|
209
|
+
step(
|
|
210
|
+
"Apply and verify",
|
|
211
|
+
"After applying, regenerate contracts and run the focused dev diagnostic loop.",
|
|
212
|
+
[apply, "forge generate", "forge dev --once --json"],
|
|
213
|
+
[`${GENERATED_DIR}/agentContract.json`, `${GENERATED_DIR}/frontendGraph.json`],
|
|
214
|
+
["agentContract includes the new runtime entries", "frontendGraph reflects any route/component binding"],
|
|
215
|
+
),
|
|
216
|
+
],
|
|
217
|
+
commands: [
|
|
218
|
+
intentCommand("forge dev --once --json", "Get the current generated/check/frontend/doctor state"),
|
|
219
|
+
intentCommand(dryRun, "Preview the feature scaffold"),
|
|
220
|
+
intentCommand(apply, "Apply the reviewed scaffold", "after-review"),
|
|
221
|
+
intentCommand("forge generate", "Refresh generated contracts after edits", "after-editing"),
|
|
222
|
+
intentCommand("forge dev --once --json", "Re-run the central diagnostic loop", "after-editing"),
|
|
223
|
+
],
|
|
224
|
+
filesToInspect: files,
|
|
225
|
+
filesToChange: uniqueSorted(["src/forge/schema.ts", "src/commands", "src/queries", ...(withUi ? ["web"] : [])]),
|
|
226
|
+
risks: [
|
|
227
|
+
risk("medium", "Resource scaffolds can alter schema and policies.", "Use the dry-run plan first and verify generated artifacts afterward."),
|
|
228
|
+
risk(withUi ? "medium" : "low", "Frontend bindings can drift from generated hooks.", "Inspect frontendGraph and use the local web/lib/forge bridge."),
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
case "connect-ui":
|
|
233
|
+
return {
|
|
234
|
+
summary: "Inspect and repair the web app bridge, provider, routes, and generated hook usage.",
|
|
235
|
+
plan: [
|
|
236
|
+
step(
|
|
237
|
+
"Read frontend graph",
|
|
238
|
+
"frontendGraph is the source of truth for routes, components, providers, bridge files, and raw fetch warnings.",
|
|
239
|
+
["forge inspect frontend --json", "forge dev --once --json"],
|
|
240
|
+
files,
|
|
241
|
+
["Routes and bridge files are visible", "Any frontend diagnostics include fix hints"],
|
|
242
|
+
),
|
|
243
|
+
step(
|
|
244
|
+
"Create or repair UI bridge",
|
|
245
|
+
"Forge frontends should use the local bridge and hooks instead of fragile direct runtime fetches.",
|
|
246
|
+
["forge make ui --framework vite --dry-run --json", "forge repair diagnose --diagnostic FORGE_FRONTEND_DIRECT_RUNTIME_FETCH --json"],
|
|
247
|
+
["web/src/lib/forge.ts", "web/src/App.tsx", `${GENERATED_DIR}/frontendGraph.json`],
|
|
248
|
+
["ForgeProvider is mounted when framework needs it", "useQuery/useCommand/useLiveQuery replace raw endpoint fetches"],
|
|
249
|
+
),
|
|
250
|
+
],
|
|
251
|
+
commands: [
|
|
252
|
+
intentCommand("forge inspect frontend --json", "Inspect frontend wiring"),
|
|
253
|
+
intentCommand("forge dev --once --json", "Run the central diagnostic loop"),
|
|
254
|
+
intentCommand("forge make ui --framework vite --dry-run --json", "Preview adding a Forge-ready UI bridge", "after-review"),
|
|
255
|
+
intentCommand("forge generate", "Refresh frontendGraph and agentContract", "after-editing"),
|
|
256
|
+
],
|
|
257
|
+
filesToInspect: files,
|
|
258
|
+
filesToChange: uniqueSorted(["web", "web/src/lib/forge.ts", "web/src/App.tsx"]),
|
|
259
|
+
risks: [
|
|
260
|
+
risk("medium", "UI can appear to work while bypassing generated hooks.", "Treat frontendGraph diagnostics as blocking for agent handoff."),
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
case "fix":
|
|
264
|
+
return {
|
|
265
|
+
summary: "Use the dev console and repair loop instead of guessing at failing checks.",
|
|
266
|
+
plan: [
|
|
267
|
+
step(
|
|
268
|
+
"Collect current diagnostics",
|
|
269
|
+
"The central dev cycle aggregates generated drift, guardrails, frontend wiring, doctor checks, impact, and last reports.",
|
|
270
|
+
["forge dev --once --json"],
|
|
271
|
+
files,
|
|
272
|
+
["Diagnostics include codes, fix hints, and suggested commands"],
|
|
273
|
+
),
|
|
274
|
+
step(
|
|
275
|
+
"Use repair inputs",
|
|
276
|
+
"Repair should be grounded in last test/UI reports or a specific diagnostic code.",
|
|
277
|
+
[
|
|
278
|
+
"forge repair diagnose --from-last-test-run --json",
|
|
279
|
+
"forge repair diagnose --from-last-ui-run --json",
|
|
280
|
+
"forge repair plan --from-last-test-run --write",
|
|
281
|
+
],
|
|
282
|
+
[".forge/test-runs/last.json", ".forge/ui-runs/last.json"],
|
|
283
|
+
["Only high-confidence deterministic repairs are applied automatically"],
|
|
284
|
+
),
|
|
285
|
+
],
|
|
286
|
+
commands: [
|
|
287
|
+
intentCommand("forge dev --once --json", "Collect current diagnostics"),
|
|
288
|
+
intentCommand("forge repair diagnose --from-last-test-run --json", "Diagnose last test failures", "after-review"),
|
|
289
|
+
intentCommand("forge repair diagnose --from-last-ui-run --json", "Diagnose last UI failures", "after-review"),
|
|
290
|
+
intentCommand("forge dev --once --json", "Confirm the repair loop changed the state", "after-editing"),
|
|
291
|
+
],
|
|
292
|
+
filesToInspect: uniqueSorted([...files, ".forge/test-runs/last.json", ".forge/ui-runs/last.json"]),
|
|
293
|
+
filesToChange: [],
|
|
294
|
+
risks: [
|
|
295
|
+
risk("medium", "Blind fixes can make generated/runtime drift worse.", "Start from diagnostic codes and use repair plans before editing."),
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
case "verify":
|
|
299
|
+
return {
|
|
300
|
+
summary: "Run focused checks first, then strict verification before handoff.",
|
|
301
|
+
plan: [
|
|
302
|
+
step(
|
|
303
|
+
"Get changed-file impact",
|
|
304
|
+
"Impact planning keeps verification fast while still choosing relevant checks.",
|
|
305
|
+
["forge dev --once --json", "forge test plan --changed --json"],
|
|
306
|
+
files,
|
|
307
|
+
["Changed files and recommended checks are listed"],
|
|
308
|
+
),
|
|
309
|
+
step(
|
|
310
|
+
"Finish strict when ready",
|
|
311
|
+
"Strict verification is the handoff gate once focused checks pass.",
|
|
312
|
+
["forge verify --changed", "forge verify --strict"],
|
|
313
|
+
["AGENTS.md", `${GENERATED_DIR}/agentContract.json`],
|
|
314
|
+
["Focused verification passes", "Strict verification passes before commit/push"],
|
|
315
|
+
),
|
|
316
|
+
],
|
|
317
|
+
commands: [
|
|
318
|
+
intentCommand("forge dev --once --json", "Run central diagnostics"),
|
|
319
|
+
intentCommand("forge test plan --changed --json", "Plan targeted checks from changed files"),
|
|
320
|
+
intentCommand("forge verify --changed", "Run focused verification", "after-editing"),
|
|
321
|
+
intentCommand("forge verify --strict", "Run final strict verification", "before-handoff"),
|
|
322
|
+
],
|
|
323
|
+
filesToInspect: files,
|
|
324
|
+
filesToChange: [],
|
|
325
|
+
risks: [
|
|
326
|
+
risk("low", "Focused checks may miss broad integration regressions.", "Use forge verify --strict before final handoff."),
|
|
327
|
+
],
|
|
328
|
+
};
|
|
329
|
+
case "ship":
|
|
330
|
+
return {
|
|
331
|
+
summary: "Prepare a clean handoff with diagnostics, review, and strict verification.",
|
|
332
|
+
plan: [
|
|
333
|
+
step(
|
|
334
|
+
"Review current state",
|
|
335
|
+
"Handoffs need current generated artifacts, review findings, and changed-file impact.",
|
|
336
|
+
["forge dev --once --json", "forge review --changed --json", "git status --short"],
|
|
337
|
+
files,
|
|
338
|
+
["No unexpected generated drift", "Review findings are known before commit"],
|
|
339
|
+
),
|
|
340
|
+
step(
|
|
341
|
+
"Run final gate",
|
|
342
|
+
"Strict verification is the last framework-owned gate before a commit or push.",
|
|
343
|
+
["forge verify --strict"],
|
|
344
|
+
["AGENTS.md", `${GENERATED_DIR}/agentContract.json`],
|
|
345
|
+
["Strict verification passes"],
|
|
346
|
+
),
|
|
347
|
+
],
|
|
348
|
+
commands: [
|
|
349
|
+
intentCommand("forge dev --once --json", "Run central diagnostics"),
|
|
350
|
+
intentCommand("forge review --changed --json", "Review changed files structurally"),
|
|
351
|
+
intentCommand("forge verify --strict", "Run final strict verification", "before-handoff"),
|
|
352
|
+
],
|
|
353
|
+
filesToInspect: files,
|
|
354
|
+
filesToChange: [],
|
|
355
|
+
risks: [
|
|
356
|
+
risk("medium", "Committing stale generated artifacts confuses future agents.", "Run generate/check before final verification."),
|
|
357
|
+
],
|
|
358
|
+
};
|
|
359
|
+
case "explain":
|
|
360
|
+
case "inspect":
|
|
361
|
+
return {
|
|
362
|
+
summary: "Read the generated contract and maps before opening individual files.",
|
|
363
|
+
plan: [
|
|
364
|
+
step(
|
|
365
|
+
"Load agent context",
|
|
366
|
+
"The generated contract is the fastest route to understanding runtime, data, frontend, policies, and commands.",
|
|
367
|
+
["forge inspect all --json", "forge agent print-context --json"],
|
|
368
|
+
files,
|
|
369
|
+
["Contract and maps are available", "Frontend routes and runtime endpoints are known"],
|
|
370
|
+
),
|
|
371
|
+
step(
|
|
372
|
+
"Open the relevant source files",
|
|
373
|
+
"Source reads should be driven by the generated map rather than broad repo scanning.",
|
|
374
|
+
["forge inspect frontend --json", "forge inspect map"],
|
|
375
|
+
files,
|
|
376
|
+
["Files to inspect are narrowed to mapped routes, entries, or rules"],
|
|
377
|
+
),
|
|
378
|
+
],
|
|
379
|
+
commands: [
|
|
380
|
+
intentCommand("forge inspect all --json", "Read the aggregate project contract"),
|
|
381
|
+
intentCommand("forge agent print-context --json", "Read the agent-facing context"),
|
|
382
|
+
intentCommand("forge inspect frontend --json", "Read frontend routes and bindings"),
|
|
383
|
+
],
|
|
384
|
+
filesToInspect: files,
|
|
385
|
+
filesToChange: [],
|
|
386
|
+
risks: [
|
|
387
|
+
risk("low", "Reading source before generated maps wastes context.", "Start from AGENTS.md and agentContract.json."),
|
|
388
|
+
],
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export function runForgeDoCommand(options: ForgeDoOptions): ForgeIntentResult {
|
|
394
|
+
const objective = options.objective.trim() || "inspect project";
|
|
395
|
+
const tokens = tokenize(objective);
|
|
396
|
+
const contract = readGeneratedJson<AgentContract>(
|
|
397
|
+
options.workspaceRoot,
|
|
398
|
+
`${GENERATED_DIR}/agentContract.json`,
|
|
399
|
+
);
|
|
400
|
+
const classified = classifyIntent(tokens);
|
|
401
|
+
const planned = planFor({
|
|
402
|
+
kind: classified.kind,
|
|
403
|
+
objective,
|
|
404
|
+
tokens,
|
|
405
|
+
contract,
|
|
406
|
+
});
|
|
407
|
+
const diagnostics = contract
|
|
408
|
+
? []
|
|
409
|
+
: [
|
|
410
|
+
createDiagnostic({
|
|
411
|
+
severity: "warning",
|
|
412
|
+
code: "FORGE_DO_CONTRACT_MISSING",
|
|
413
|
+
message: "agentContract.json is missing or unreadable; plan uses conservative defaults",
|
|
414
|
+
file: `${GENERATED_DIR}/agentContract.json`,
|
|
415
|
+
fixHint: "Run forge generate before applying an intent plan.",
|
|
416
|
+
suggestedCommands: ["forge generate", "forge dev --once --json"],
|
|
417
|
+
docs: ["AGENTS.md"],
|
|
418
|
+
}),
|
|
419
|
+
];
|
|
420
|
+
const commands = planned.commands;
|
|
421
|
+
return {
|
|
422
|
+
schemaVersion: "0.1.0",
|
|
423
|
+
ok: true,
|
|
424
|
+
input: { objective, tokens },
|
|
425
|
+
intent: {
|
|
426
|
+
kind: classified.kind,
|
|
427
|
+
label: labelFor(classified.kind),
|
|
428
|
+
confidence: classified.confidence,
|
|
429
|
+
},
|
|
430
|
+
summary: planned.summary,
|
|
431
|
+
context: contextSummary(contract),
|
|
432
|
+
plan: planned.plan,
|
|
433
|
+
commands,
|
|
434
|
+
filesToInspect: planned.filesToInspect,
|
|
435
|
+
filesToChange: planned.filesToChange,
|
|
436
|
+
risks: planned.risks,
|
|
437
|
+
diagnostics,
|
|
438
|
+
nextAction: commands[0] ?? null,
|
|
439
|
+
exitCode: 0,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
export function formatForgeDoJson(result: ForgeIntentResult): string {
|
|
444
|
+
return `${JSON.stringify(result, null, 2)}\n`;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export function formatForgeDoHuman(result: ForgeIntentResult): string {
|
|
448
|
+
const lines = [
|
|
449
|
+
"Forge Do",
|
|
450
|
+
"",
|
|
451
|
+
`Intent: ${result.intent.kind} (${result.intent.confidence})`,
|
|
452
|
+
`Summary: ${result.summary}`,
|
|
453
|
+
"",
|
|
454
|
+
"Plan:",
|
|
455
|
+
];
|
|
456
|
+
for (let index = 0; index < result.plan.length; index++) {
|
|
457
|
+
const item = result.plan[index];
|
|
458
|
+
lines.push(`${index + 1}. ${item.title}`);
|
|
459
|
+
lines.push(` ${item.why}`);
|
|
460
|
+
for (const commandItem of item.commands) {
|
|
461
|
+
lines.push(` $ ${commandItem}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (result.filesToInspect.length > 0) {
|
|
465
|
+
lines.push("", "Files to inspect:");
|
|
466
|
+
for (const file of result.filesToInspect.slice(0, 12)) {
|
|
467
|
+
lines.push(`- ${file}`);
|
|
468
|
+
}
|
|
469
|
+
if (result.filesToInspect.length > 12) {
|
|
470
|
+
lines.push(`- ... ${result.filesToInspect.length - 12} more`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (result.risks.length > 0) {
|
|
474
|
+
lines.push("", "Risks:");
|
|
475
|
+
for (const item of result.risks) {
|
|
476
|
+
lines.push(`- ${item.level}: ${item.reason}`);
|
|
477
|
+
lines.push(` Mitigation: ${item.mitigation}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (result.nextAction) {
|
|
481
|
+
lines.push("", "Next action:", ` ${result.nextAction.command}`);
|
|
482
|
+
}
|
|
483
|
+
return `${lines.join("\n")}\n`;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export type {
|
|
487
|
+
ForgeDoOptions,
|
|
488
|
+
ForgeIntentCommand,
|
|
489
|
+
ForgeIntentResult,
|
|
490
|
+
} from "./types.ts";
|