forgeos 0.1.0-alpha.2 → 0.1.0-alpha.21
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 +4 -0
- package/AGENTS.md +168 -81
- package/CHANGELOG.md +211 -0
- package/README.md +88 -14
- package/adapters/go/README.md +23 -0
- package/adapters/go/go.mod +3 -0
- package/adapters/go/http.go +149 -0
- package/adapters/go/registry.go +234 -0
- package/adapters/go/types.go +136 -0
- package/adapters/java/README.md +68 -0
- package/adapters/java/pom.xml +34 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
- package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java/target/maven-archiver/pom.properties +3 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
- package/adapters/java-spring-boot-starter/README.md +32 -0
- package/adapters/java-spring-boot-starter/pom.xml +36 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
- package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
- package/bin/forge.mjs +18 -0
- package/docs/changelog.md +242 -0
- package/docs/forge-protocol.md +189 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +52 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
- package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
- package/package.json +29 -7
- package/schemas/forge-manifest.schema.json +57 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1511 -123
- package/src/forge/agent-adapters/types.ts +216 -1
- package/src/forge/agent-memory/bridge.ts +1245 -0
- package/src/forge/agent-memory/context-pack.ts +151 -0
- package/src/forge/agent-memory/hook-runner.ts +312 -0
- package/src/forge/agent-memory/mcp.ts +224 -0
- package/src/forge/agent-memory/normalize.ts +498 -0
- package/src/forge/agent-memory/redaction.ts +103 -0
- package/src/forge/agent-memory/sources/claude-code.ts +51 -0
- package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
- package/src/forge/agent-memory/sources/codex.ts +119 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +191 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +801 -0
- package/src/forge/brownfield-import/types.ts +127 -0
- package/src/forge/cair/action-journal.ts +61 -0
- package/src/forge/cair/action-parser.ts +314 -0
- package/src/forge/cair/action-validator.ts +40 -0
- package/src/forge/cair/actions.ts +1818 -0
- package/src/forge/cair/format.ts +77 -0
- package/src/forge/cair/index.ts +106 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +248 -0
- package/src/forge/cli/ai.ts +671 -3
- package/src/forge/cli/auth.ts +36 -1
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +300 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1285 -7
- package/src/forge/cli/db.ts +121 -2
- package/src/forge/cli/deps.ts +79 -12
- package/src/forge/cli/dev.ts +502 -38
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/handoff.ts +250 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/main.ts +49 -3
- package/src/forge/cli/new.ts +3 -1
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +290 -1
- package/src/forge/cli/parse.ts +770 -36
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/rls.ts +568 -17
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/secrets.ts +46 -1
- package/src/forge/cli/security.ts +381 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2163 -0
- package/src/forge/cli/verify.ts +1422 -32
- package/src/forge/compiler/agent-contract/build.ts +725 -41
- package/src/forge/compiler/agent-contract/types.ts +85 -0
- package/src/forge/compiler/ai-registry/build.ts +62 -1
- package/src/forge/compiler/ai-registry/constants.ts +1 -1
- package/src/forge/compiler/ai-registry/parse.ts +168 -5
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +68 -8
- package/src/forge/compiler/app-graph/extract.ts +107 -0
- package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
- package/src/forge/compiler/app-graph/module-graph.ts +73 -78
- package/src/forge/compiler/app-graph/parser.ts +24 -24
- package/src/forge/compiler/app-graph/profile.ts +26 -0
- package/src/forge/compiler/app-graph/versions.ts +1 -1
- package/src/forge/compiler/classifier/capabilities.ts +3 -2
- package/src/forge/compiler/classifier/classify.ts +32 -8
- package/src/forge/compiler/classifier/secrets.ts +3 -2
- package/src/forge/compiler/classifier/signals.ts +91 -1
- package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
- package/src/forge/compiler/client-sdk/render-client.ts +188 -13
- package/src/forge/compiler/data-graph/parse.ts +3 -3
- package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
- package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
- package/src/forge/compiler/data-graph/sql/types.ts +1 -0
- package/src/forge/compiler/dev-manifest/build.ts +3 -0
- package/src/forge/compiler/diagnostics/codes.ts +35 -0
- package/src/forge/compiler/diagnostics/create.ts +8 -3
- package/src/forge/compiler/diagnostics/index.ts +2 -0
- package/src/forge/compiler/emitter/barrel.ts +3 -0
- package/src/forge/compiler/emitter/render.ts +5 -0
- package/src/forge/compiler/external-manifest/registry.ts +205 -0
- package/src/forge/compiler/external-manifest/types.ts +91 -0
- package/src/forge/compiler/external-manifest/validate.ts +373 -0
- package/src/forge/compiler/frontend-graph/build.ts +85 -13
- package/src/forge/compiler/integration/add.ts +498 -22
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/make-registry/build.ts +19 -7
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +78 -7
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +97 -31
- package/src/forge/compiler/orchestrator/serialize.ts +101 -8
- package/src/forge/compiler/package-graph/compiler.ts +13 -3
- package/src/forge/compiler/package-manager/adapter.ts +4 -1
- package/src/forge/compiler/package-manager/commands.ts +4 -0
- package/src/forge/compiler/package-manager/executor.ts +30 -1
- package/src/forge/compiler/policy-registry/build.ts +44 -1
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/ai-registry.ts +25 -1
- package/src/forge/compiler/types/app-graph.ts +9 -2
- package/src/forge/compiler/types/cli.ts +76 -1
- package/src/forge/compiler/types/dev-manifest.ts +3 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +126 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +13 -0
- package/src/forge/delta/recorder.ts +402 -0
- package/src/forge/delta/redaction.ts +50 -0
- package/src/forge/delta/schema.ts +240 -0
- package/src/forge/delta/session.ts +142 -0
- package/src/forge/delta/status.ts +489 -0
- package/src/forge/delta/store.ts +2975 -0
- package/src/forge/delta/timeline.ts +104 -0
- package/src/forge/dev/server.ts +768 -15
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +233 -21
- package/src/forge/dev-console/types.ts +46 -1
- package/src/forge/impact/index.ts +46 -8
- package/src/forge/impact/types.ts +6 -0
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/index.ts +149 -6
- package/src/forge/make/templates.ts +343 -2
- package/src/forge/make/types.ts +3 -1
- package/src/forge/refactor/index.ts +1 -0
- package/src/forge/repair/rules/index.ts +2 -2
- package/src/forge/review/index.ts +158 -12
- package/src/forge/review/types.ts +15 -0
- package/src/forge/runtime/ai/context.ts +210 -5
- package/src/forge/runtime/ai/types.ts +70 -0
- package/src/forge/runtime/auth/claims.ts +32 -0
- package/src/forge/runtime/auth/errors.ts +2 -0
- package/src/forge/runtime/context/create-context.ts +30 -6
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +2 -2
- package/src/forge/runtime/db/pglite-adapter.ts +77 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +112 -2
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/scrubber.ts +91 -10
- package/src/forge/runtime/webhooks/security.ts +184 -0
- package/src/forge/server.ts +100 -2
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +407 -0
- package/src/forge/workspace/change-summary.ts +209 -0
- package/src/forge/workspace/forge-cli.ts +14 -0
- package/src/forge/workspace/git-summary.ts +279 -0
- package/templates/agent-workroom/AGENTS.md +29 -0
- package/templates/agent-workroom/README.md +34 -0
- package/templates/agent-workroom/forge.config.ts +3 -0
- package/templates/agent-workroom/package.json +33 -0
- package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
- package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
- package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
- package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
- package/templates/agent-workroom/src/forge/schema.ts +54 -0
- package/templates/agent-workroom/src/policies.ts +6 -0
- package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
- package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
- package/templates/agent-workroom/tsconfig.json +16 -0
- package/templates/agent-workroom/web/index.html +12 -0
- package/templates/agent-workroom/web/package.json +21 -0
- package/templates/agent-workroom/web/src/App.tsx +345 -0
- package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
- package/templates/agent-workroom/web/src/main.tsx +13 -0
- package/templates/agent-workroom/web/src/styles.css +545 -0
- package/templates/agent-workroom/web/tsconfig.json +27 -0
- package/templates/b2b-support-web/package.json +2 -0
- package/templates/b2b-support-web/tsconfig.json +4 -1
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/tsconfig.json +3 -1
- package/templates/minimal-web/web/package.json +2 -2
- package/src/forge/_generated/actionSubscriptions.json +0 -2
- package/src/forge/_generated/actionSubscriptions.ts +0 -10
- package/src/forge/_generated/agentAdapterManifest.json +0 -2
- package/src/forge/_generated/agentAdapterManifest.ts +0 -73
- package/src/forge/_generated/agentContract.json +0 -2
- package/src/forge/_generated/agentContract.ts +0 -7696
- package/src/forge/_generated/agentQuickstart.md +0 -32
- package/src/forge/_generated/aiContext.ts +0 -59
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -35
- package/src/forge/_generated/aiProviders.json +0 -2
- package/src/forge/_generated/aiProviders.ts +0 -23
- package/src/forge/_generated/aiRegistry.json +0 -2
- package/src/forge/_generated/aiRegistry.ts +0 -29
- package/src/forge/_generated/api.json +0 -2
- package/src/forge/_generated/api.ts +0 -8
- package/src/forge/_generated/appGraph.json +0 -2
- package/src/forge/_generated/appGraph.ts +0 -14667
- package/src/forge/_generated/appMap.md +0 -35
- package/src/forge/_generated/artifactManifest.json +0 -2
- package/src/forge/_generated/artifactManifest.ts +0 -7
- package/src/forge/_generated/authClaims.json +0 -2
- package/src/forge/_generated/authClaims.ts +0 -13
- package/src/forge/_generated/authConfig.json +0 -2
- package/src/forge/_generated/authConfig.ts +0 -17
- package/src/forge/_generated/authContext.ts +0 -23
- package/src/forge/_generated/authRegistry.json +0 -2
- package/src/forge/_generated/authRegistry.ts +0 -25
- package/src/forge/_generated/buildInfo.json +0 -2
- package/src/forge/_generated/buildInfo.ts +0 -9
- package/src/forge/_generated/capabilityMap.json +0 -2
- package/src/forge/_generated/capabilityMap.md +0 -15
- package/src/forge/_generated/capabilityMap.ts +0 -17
- package/src/forge/_generated/client.ts +0 -282
- package/src/forge/_generated/clientApi.ts +0 -9
- package/src/forge/_generated/clientManifest.json +0 -2
- package/src/forge/_generated/clientManifest.ts +0 -39
- package/src/forge/_generated/clientTypes.ts +0 -78
- package/src/forge/_generated/configRegistry.json +0 -2
- package/src/forge/_generated/configRegistry.ts +0 -4
- package/src/forge/_generated/dataGraph.json +0 -2
- package/src/forge/_generated/dataGraph.ts +0 -8
- package/src/forge/_generated/db.json +0 -2
- package/src/forge/_generated/db.ts +0 -2
- package/src/forge/_generated/dbSecurityManifest.json +0 -2
- package/src/forge/_generated/dbSecurityManifest.ts +0 -15
- package/src/forge/_generated/dbSessionContext.json +0 -2
- package/src/forge/_generated/dbSessionContext.ts +0 -39
- package/src/forge/_generated/deployManifest.json +0 -2
- package/src/forge/_generated/deployManifest.ts +0 -14
- package/src/forge/_generated/devManifest.json +0 -2
- package/src/forge/_generated/devManifest.ts +0 -47
- package/src/forge/_generated/envSchema.json +0 -2
- package/src/forge/_generated/envSchema.ts +0 -59
- package/src/forge/_generated/frontendGraph.json +0 -2
- package/src/forge/_generated/frontendGraph.ts +0 -27
- package/src/forge/_generated/importGuards.json +0 -2
- package/src/forge/_generated/importGuards.ts +0 -686
- package/src/forge/_generated/index.ts +0 -67
- package/src/forge/_generated/liveProductionManifest.json +0 -2
- package/src/forge/_generated/liveProductionManifest.ts +0 -23
- package/src/forge/_generated/liveProtocol.json +0 -2
- package/src/forge/_generated/liveProtocol.ts +0 -21
- package/src/forge/_generated/liveQueryRegistry.json +0 -2
- package/src/forge/_generated/liveQueryRegistry.ts +0 -9
- package/src/forge/_generated/liveTransportConfig.json +0 -2
- package/src/forge/_generated/liveTransportConfig.ts +0 -19
- package/src/forge/_generated/makeRegistry.json +0 -2
- package/src/forge/_generated/makeRegistry.ts +0 -163
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -61
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -147
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -245249
- package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
- package/src/forge/_generated/permissionMatrix.json +0 -2
- package/src/forge/_generated/permissionMatrix.ts +0 -7
- package/src/forge/_generated/policyRegistry.json +0 -2
- package/src/forge/_generated/policyRegistry.ts +0 -11
- package/src/forge/_generated/queryRegistry.json +0 -2
- package/src/forge/_generated/queryRegistry.ts +0 -9
- package/src/forge/_generated/react.d.ts +0 -22
- package/src/forge/_generated/react.ts +0 -29
- package/src/forge/_generated/reactManifest.json +0 -2
- package/src/forge/_generated/reactManifest.ts +0 -19
- package/src/forge/_generated/rlsPolicies.json +0 -2
- package/src/forge/_generated/rlsPolicies.sql +0 -34
- package/src/forge/_generated/rlsPolicies.ts +0 -6
- package/src/forge/_generated/runtimeGraph.json +0 -2
- package/src/forge/_generated/runtimeGraph.ts +0 -8
- package/src/forge/_generated/runtimeMatrix.json +0 -2
- package/src/forge/_generated/runtimeMatrix.ts +0 -327385
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -79
- package/src/forge/_generated/secretRegistry.json +0 -2
- package/src/forge/_generated/secretRegistry.ts +0 -50
- package/src/forge/_generated/secretsContext.ts +0 -11
- package/src/forge/_generated/serverApi.ts +0 -10
- package/src/forge/_generated/sourceMapManifest.json +0 -2
- package/src/forge/_generated/sourceMapManifest.ts +0 -7
- package/src/forge/_generated/sqlPlan.json +0 -2
- package/src/forge/_generated/sqlPlan.ts +0 -88
- package/src/forge/_generated/subscriptionManifest.json +0 -2
- package/src/forge/_generated/subscriptionManifest.ts +0 -7
- package/src/forge/_generated/symbolicationManifest.json +0 -2
- package/src/forge/_generated/symbolicationManifest.ts +0 -17
- package/src/forge/_generated/telemetryRegistry.json +0 -2
- package/src/forge/_generated/telemetryRegistry.ts +0 -9
- package/src/forge/_generated/telemetrySinks.json +0 -2
- package/src/forge/_generated/telemetrySinks.ts +0 -11
- package/src/forge/_generated/tenantScope.json +0 -2
- package/src/forge/_generated/tenantScope.ts +0 -8
- package/src/forge/_generated/testGraph.json +0 -2
- package/src/forge/_generated/testGraph.ts +0 -3108
- package/src/forge/_generated/testPlanRegistry.json +0 -2
- package/src/forge/_generated/testPlanRegistry.ts +0 -33
- package/src/forge/_generated/uiRoutes.json +0 -2
- package/src/forge/_generated/uiRoutes.ts +0 -16
- package/src/forge/_generated/uiScenarios.json +0 -2
- package/src/forge/_generated/uiScenarios.ts +0 -30
- package/src/forge/_generated/uiTestManifest.json +0 -2
- package/src/forge/_generated/uiTestManifest.ts +0 -27
- package/src/forge/_generated/workflowRegistry.json +0 -2
- package/src/forge/_generated/workflowRegistry.ts +0 -9
- package/src/forge/_generated/workflowSubscriptions.json +0 -2
- package/src/forge/_generated/workflowSubscriptions.ts +0 -10
|
@@ -14,6 +14,7 @@ export const FORGE_AUTH_INVALID_AUDIENCE = "FORGE_AUTH_INVALID_AUDIENCE" as cons
|
|
|
14
14
|
export const FORGE_AUTH_TOKEN_EXPIRED = "FORGE_AUTH_TOKEN_EXPIRED" as const;
|
|
15
15
|
export const FORGE_AUTH_JWKS_FAILED = "FORGE_AUTH_JWKS_FAILED" as const;
|
|
16
16
|
export const FORGE_AUTH_CLAIM_MISSING = "FORGE_AUTH_CLAIM_MISSING" as const;
|
|
17
|
+
export const FORGE_AUTH_CLAIM_INVALID = "FORGE_AUTH_CLAIM_INVALID" as const;
|
|
17
18
|
export const FORGE_AUTH_TENANT_MISSING = "FORGE_AUTH_TENANT_MISSING" as const;
|
|
18
19
|
export const FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION =
|
|
19
20
|
"FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION" as const;
|
|
@@ -26,11 +27,20 @@ export const FORGE_DUP_RUNTIME_ENTRY = "FORGE_DUP_RUNTIME_ENTRY" as const;
|
|
|
26
27
|
export const FORGE_RUNTIME_UNRESOLVABLE = "FORGE_RUNTIME_UNRESOLVABLE" as const;
|
|
27
28
|
export const FORGE_RUNTIME_NOT_FOUND = "FORGE_RUNTIME_NOT_FOUND" as const;
|
|
28
29
|
export const FORGE_RUNTIME_GUARD_BLOCKED = "FORGE_RUNTIME_GUARD_BLOCKED" as const;
|
|
30
|
+
export const FORGE_EXTERNAL_RUNTIME_NOT_FOUND =
|
|
31
|
+
"FORGE_EXTERNAL_RUNTIME_NOT_FOUND" as const;
|
|
32
|
+
export const FORGE_EXTERNAL_RUNTIME_UNSUPPORTED =
|
|
33
|
+
"FORGE_EXTERNAL_RUNTIME_UNSUPPORTED" as const;
|
|
34
|
+
export const FORGE_EXTERNAL_RUNTIME_FAILED =
|
|
35
|
+
"FORGE_EXTERNAL_RUNTIME_FAILED" as const;
|
|
36
|
+
export const FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE =
|
|
37
|
+
"FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE" as const;
|
|
29
38
|
export const FORGE_DEV_SERVER_ERROR = "FORGE_DEV_SERVER_ERROR" as const;
|
|
30
39
|
export const FORGE_DEV_WATCH_FAILED = "FORGE_DEV_WATCH_FAILED" as const;
|
|
31
40
|
export const FORGE_DEV_INVOKE_FAILED = "FORGE_DEV_INVOKE_FAILED" as const;
|
|
32
41
|
export const FORGE_DEV_DOCTOR_MISSING_ARTIFACT =
|
|
33
42
|
"FORGE_DEV_DOCTOR_MISSING_ARTIFACT" as const;
|
|
43
|
+
export const FORGE_DEV_DB_RESET = "FORGE_DEV_DB_RESET" as const;
|
|
34
44
|
export const FORGE_DB_CONNECT_FAILED = "FORGE_DB_CONNECT_FAILED" as const;
|
|
35
45
|
export const FORGE_DB_MIGRATION_FAILED = "FORGE_DB_MIGRATION_FAILED" as const;
|
|
36
46
|
export const FORGE_DB_UNSUPPORTED_FIELD_TYPE =
|
|
@@ -47,6 +57,7 @@ export const FORGE_RLS_UNSUPPORTED_TENANT_TYPE =
|
|
|
47
57
|
export const FORGE_RLS_FORCE_DISABLED = "FORGE_RLS_FORCE_DISABLED" as const;
|
|
48
58
|
export const FORGE_RLS_APPLY_FAILED = "FORGE_RLS_APPLY_FAILED" as const;
|
|
49
59
|
export const FORGE_RLS_TEST_FAILED = "FORGE_RLS_TEST_FAILED" as const;
|
|
60
|
+
export const FORGE_RLS_MUTATION_FAILED = "FORGE_RLS_MUTATION_FAILED" as const;
|
|
50
61
|
export const FORGE_RLS_SESSION_CONTEXT_MISSING =
|
|
51
62
|
"FORGE_RLS_SESSION_CONTEXT_MISSING" as const;
|
|
52
63
|
export const FORGE_RLS_SESSION_CONTEXT_UNSAFE =
|
|
@@ -90,6 +101,8 @@ export const FORGE_RELEASE_DIRTY_WORKTREE =
|
|
|
90
101
|
export const FORGE_RELEASE_GENERATED_DRIFT =
|
|
91
102
|
"FORGE_RELEASE_GENERATED_DRIFT" as const;
|
|
92
103
|
export const FORGE_RELEASE_ID_MISSING = "FORGE_RELEASE_ID_MISSING" as const;
|
|
104
|
+
export const FORGE_RELEASE_PACKAGE_PACK_FAILED =
|
|
105
|
+
"FORGE_RELEASE_PACKAGE_PACK_FAILED" as const;
|
|
93
106
|
export const FORGE_SOURCEMAP_PUBLIC_EXPOSURE =
|
|
94
107
|
"FORGE_SOURCEMAP_PUBLIC_EXPOSURE" as const;
|
|
95
108
|
export const FORGE_SOURCEMAP_UPLOAD_MISSING =
|
|
@@ -214,6 +227,8 @@ export const FORGE_TEST_DOCKER_REQUIRED = "FORGE_TEST_DOCKER_REQUIRED" as const;
|
|
|
214
227
|
export const FORGE_TEST_BROWSER_REQUIRED = "FORGE_TEST_BROWSER_REQUIRED" as const;
|
|
215
228
|
export const FORGE_VERIFY_CHANGED_INCOMPLETE =
|
|
216
229
|
"FORGE_VERIFY_CHANGED_INCOMPLETE" as const;
|
|
230
|
+
export const FORGE_VERIFY_NO_TESTS_SELECTED =
|
|
231
|
+
"FORGE_VERIFY_NO_TESTS_SELECTED" as const;
|
|
217
232
|
export const FORGE_VERIFY_SCRIPT_TIMEOUT =
|
|
218
233
|
"FORGE_VERIFY_SCRIPT_TIMEOUT" as const;
|
|
219
234
|
export const FORGE_REPAIR_SOURCE_NOT_FOUND =
|
|
@@ -315,6 +330,12 @@ export const FORGE_TELEMETRY_PAYLOAD_TRUNCATED =
|
|
|
315
330
|
"FORGE_TELEMETRY_PAYLOAD_TRUNCATED" as const;
|
|
316
331
|
export const FORGE_TELEMETRY_SINK_FAILED = "FORGE_TELEMETRY_SINK_FAILED" as const;
|
|
317
332
|
export const FORGE_TELEMETRY_UNKNOWN_SINK = "FORGE_TELEMETRY_UNKNOWN_SINK" as const;
|
|
333
|
+
export const FORGE_WEBHOOK_SIGNATURE_INVALID =
|
|
334
|
+
"FORGE_WEBHOOK_SIGNATURE_INVALID" as const;
|
|
335
|
+
export const FORGE_WEBHOOK_TIMESTAMP_INVALID =
|
|
336
|
+
"FORGE_WEBHOOK_TIMESTAMP_INVALID" as const;
|
|
337
|
+
export const FORGE_WEBHOOK_REPLAY_DETECTED =
|
|
338
|
+
"FORGE_WEBHOOK_REPLAY_DETECTED" as const;
|
|
318
339
|
export const FORGE_POLICY_DENIED = "FORGE_POLICY_DENIED" as const;
|
|
319
340
|
export const FORGE_POLICY_MISSING = "FORGE_POLICY_MISSING" as const;
|
|
320
341
|
export const FORGE_POLICY_UNKNOWN = "FORGE_POLICY_UNKNOWN" as const;
|
|
@@ -338,6 +359,7 @@ export const FORGE_AI_SECRET_MISSING = "FORGE_AI_SECRET_MISSING" as const;
|
|
|
338
359
|
export const FORGE_AI_DYNAMIC_PROVIDER = "FORGE_AI_DYNAMIC_PROVIDER" as const;
|
|
339
360
|
export const FORGE_AI_GENERATION_FAILED = "FORGE_AI_GENERATION_FAILED" as const;
|
|
340
361
|
export const FORGE_AI_USAGE_UNAVAILABLE = "FORGE_AI_USAGE_UNAVAILABLE" as const;
|
|
362
|
+
export const FORGE_AI_REDTEAM_FAILED = "FORGE_AI_REDTEAM_FAILED" as const;
|
|
341
363
|
export const FORGE_QUERY_WRITE_FORBIDDEN = "FORGE_QUERY_WRITE_FORBIDDEN" as const;
|
|
342
364
|
export const FORGE_QUERY_EMIT_FORBIDDEN = "FORGE_QUERY_EMIT_FORBIDDEN" as const;
|
|
343
365
|
export const FORGE_QUERY_SECRET_FORBIDDEN = "FORGE_QUERY_SECRET_FORBIDDEN" as const;
|
|
@@ -379,6 +401,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
379
401
|
FORGE_AUTH_TOKEN_EXPIRED,
|
|
380
402
|
FORGE_AUTH_JWKS_FAILED,
|
|
381
403
|
FORGE_AUTH_CLAIM_MISSING,
|
|
404
|
+
FORGE_AUTH_CLAIM_INVALID,
|
|
382
405
|
FORGE_AUTH_TENANT_MISSING,
|
|
383
406
|
FORGE_AUTH_DEV_HEADERS_IN_PRODUCTION,
|
|
384
407
|
FORGE_AUTH_MODE_INVALID,
|
|
@@ -389,10 +412,15 @@ export const DIAGNOSTIC_CODES = [
|
|
|
389
412
|
FORGE_RUNTIME_UNRESOLVABLE,
|
|
390
413
|
FORGE_RUNTIME_NOT_FOUND,
|
|
391
414
|
FORGE_RUNTIME_GUARD_BLOCKED,
|
|
415
|
+
FORGE_EXTERNAL_RUNTIME_NOT_FOUND,
|
|
416
|
+
FORGE_EXTERNAL_RUNTIME_UNSUPPORTED,
|
|
417
|
+
FORGE_EXTERNAL_RUNTIME_FAILED,
|
|
418
|
+
FORGE_EXTERNAL_RUNTIME_BAD_RESPONSE,
|
|
392
419
|
FORGE_DEV_SERVER_ERROR,
|
|
393
420
|
FORGE_DEV_WATCH_FAILED,
|
|
394
421
|
FORGE_DEV_INVOKE_FAILED,
|
|
395
422
|
FORGE_DEV_DOCTOR_MISSING_ARTIFACT,
|
|
423
|
+
FORGE_DEV_DB_RESET,
|
|
396
424
|
FORGE_DB_CONNECT_FAILED,
|
|
397
425
|
FORGE_DB_MIGRATION_FAILED,
|
|
398
426
|
FORGE_DB_UNSUPPORTED_FIELD_TYPE,
|
|
@@ -406,6 +434,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
406
434
|
FORGE_RLS_FORCE_DISABLED,
|
|
407
435
|
FORGE_RLS_APPLY_FAILED,
|
|
408
436
|
FORGE_RLS_TEST_FAILED,
|
|
437
|
+
FORGE_RLS_MUTATION_FAILED,
|
|
409
438
|
FORGE_RLS_SESSION_CONTEXT_MISSING,
|
|
410
439
|
FORGE_RLS_SESSION_CONTEXT_UNSAFE,
|
|
411
440
|
FORGE_DB_SUPERUSER_RUNTIME,
|
|
@@ -433,6 +462,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
433
462
|
FORGE_RELEASE_DIRTY_WORKTREE,
|
|
434
463
|
FORGE_RELEASE_GENERATED_DRIFT,
|
|
435
464
|
FORGE_RELEASE_ID_MISSING,
|
|
465
|
+
FORGE_RELEASE_PACKAGE_PACK_FAILED,
|
|
436
466
|
FORGE_SOURCEMAP_PUBLIC_EXPOSURE,
|
|
437
467
|
FORGE_SOURCEMAP_UPLOAD_MISSING,
|
|
438
468
|
FORGE_SOURCEMAP_UPLOAD_FAILED,
|
|
@@ -510,6 +540,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
510
540
|
FORGE_TEST_DOCKER_REQUIRED,
|
|
511
541
|
FORGE_TEST_BROWSER_REQUIRED,
|
|
512
542
|
FORGE_VERIFY_CHANGED_INCOMPLETE,
|
|
543
|
+
FORGE_VERIFY_NO_TESTS_SELECTED,
|
|
513
544
|
FORGE_REPAIR_SOURCE_NOT_FOUND,
|
|
514
545
|
FORGE_REPAIR_UNKNOWN_FAILURE,
|
|
515
546
|
FORGE_REPAIR_NO_RULE_MATCHED,
|
|
@@ -575,6 +606,9 @@ export const DIAGNOSTIC_CODES = [
|
|
|
575
606
|
FORGE_TELEMETRY_PAYLOAD_TRUNCATED,
|
|
576
607
|
FORGE_TELEMETRY_SINK_FAILED,
|
|
577
608
|
FORGE_TELEMETRY_UNKNOWN_SINK,
|
|
609
|
+
FORGE_WEBHOOK_SIGNATURE_INVALID,
|
|
610
|
+
FORGE_WEBHOOK_TIMESTAMP_INVALID,
|
|
611
|
+
FORGE_WEBHOOK_REPLAY_DETECTED,
|
|
578
612
|
FORGE_POLICY_DENIED,
|
|
579
613
|
FORGE_POLICY_MISSING,
|
|
580
614
|
FORGE_POLICY_UNKNOWN,
|
|
@@ -595,6 +629,7 @@ export const DIAGNOSTIC_CODES = [
|
|
|
595
629
|
FORGE_AI_DYNAMIC_PROVIDER,
|
|
596
630
|
FORGE_AI_GENERATION_FAILED,
|
|
597
631
|
FORGE_AI_USAGE_UNAVAILABLE,
|
|
632
|
+
FORGE_AI_REDTEAM_FAILED,
|
|
598
633
|
FORGE_QUERY_WRITE_FORBIDDEN,
|
|
599
634
|
FORGE_QUERY_EMIT_FORBIDDEN,
|
|
600
635
|
FORGE_QUERY_SECRET_FORBIDDEN,
|
|
@@ -49,7 +49,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
49
49
|
}
|
|
50
50
|
if (code === "FORGE_SECRET_DIRECT_PROCESS_ENV") {
|
|
51
51
|
return {
|
|
52
|
-
fixHint: "Use ctx.secrets or ctx.config
|
|
52
|
+
fixHint: "Use ctx.secrets or ctx.config for Forge runtime secrets/config; public frontend bridge env may use the framework's public env surface.",
|
|
53
53
|
suggestedCommands: ["forge repair diagnose --diagnostic FORGE_SECRET_DIRECT_PROCESS_ENV --json", "forge refactor replace-process-env <ENV_NAME> --dry-run --json"],
|
|
54
54
|
docs: ["src/forge/_generated/runtimeRules.md"],
|
|
55
55
|
};
|
|
@@ -71,7 +71,7 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
71
71
|
if (code.startsWith("FORGE_RLS_")) {
|
|
72
72
|
return {
|
|
73
73
|
fixHint: "Inspect generated RLS SQL and validate tenant isolation before applying migrations.",
|
|
74
|
-
suggestedCommands: ["forge rls check --json", "forge rls
|
|
74
|
+
suggestedCommands: ["forge rls check --json", "forge rls test --db postgres --json"],
|
|
75
75
|
docs: ["src/forge/_generated/agentContract.json"],
|
|
76
76
|
};
|
|
77
77
|
}
|
|
@@ -106,7 +106,12 @@ function defaultGuidanceForCode(code: string): DiagnosticGuidance | null {
|
|
|
106
106
|
if (code.startsWith("FORGE_FRONTEND_")) {
|
|
107
107
|
return {
|
|
108
108
|
fixHint: "Use the generated frontend bridge and inspect src/forge/_generated/frontendGraph.json before editing UI wiring.",
|
|
109
|
-
suggestedCommands: [
|
|
109
|
+
suggestedCommands: [
|
|
110
|
+
"forge inspect frontend --json",
|
|
111
|
+
"forge make ui --framework vite --dry-run --json",
|
|
112
|
+
"forge make ui --framework nuxt --dry-run --json",
|
|
113
|
+
"forge generate",
|
|
114
|
+
],
|
|
110
115
|
docs: ["src/forge/_generated/frontendGraph.json", "AGENTS.md"],
|
|
111
116
|
};
|
|
112
117
|
}
|
|
@@ -37,6 +37,8 @@ export {
|
|
|
37
37
|
FORGE_LIVEQUERY_UNKNOWN,
|
|
38
38
|
FORGE_LIVEQUERY_SUBSCRIPTION_FAILED,
|
|
39
39
|
FORGE_LIVEQUERY_RERUN_FAILED,
|
|
40
|
+
FORGE_RELEASE_PACKAGE_PACK_FAILED,
|
|
41
|
+
FORGE_VERIFY_NO_TESTS_SELECTED,
|
|
40
42
|
DIAGNOSTIC_CODES,
|
|
41
43
|
} from "./codes.ts";
|
|
42
44
|
export type { DiagnosticCode } from "./codes.ts";
|
|
@@ -33,6 +33,9 @@ export function buildBarrelIndexBody(exportFilePaths: string[]): string {
|
|
|
33
33
|
|
|
34
34
|
const lines = unique.map((path) => {
|
|
35
35
|
const exportPath = toBarrelExportPath(path);
|
|
36
|
+
if (exportPath === "./vue") {
|
|
37
|
+
return `export * as vue from "${exportPath}";`;
|
|
38
|
+
}
|
|
36
39
|
return `export * from "${exportPath}";`;
|
|
37
40
|
});
|
|
38
41
|
|
|
@@ -59,6 +59,7 @@ export function renderBody(file: EmitFile): string {
|
|
|
59
59
|
*/
|
|
60
60
|
export function render(file: EmitFile, context: RenderContext): string {
|
|
61
61
|
const body = renderBody(file);
|
|
62
|
+
const kind = detectArtifactKind(file.path);
|
|
62
63
|
|
|
63
64
|
if (file.contentHash !== hashStable(body)) {
|
|
64
65
|
throw new Error(
|
|
@@ -66,6 +67,10 @@ export function render(file: EmitFile, context: RenderContext): string {
|
|
|
66
67
|
);
|
|
67
68
|
}
|
|
68
69
|
|
|
70
|
+
if (kind === "json") {
|
|
71
|
+
return body;
|
|
72
|
+
}
|
|
73
|
+
|
|
69
74
|
return prependDeterministicHeader(body, {
|
|
70
75
|
generatorVersion: context.generatorVersion,
|
|
71
76
|
inputHash: context.inputHash,
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { createDiagnostic } from "../diagnostics/create.ts";
|
|
4
|
+
import { hashStable } from "../primitives/hash.ts";
|
|
5
|
+
import { serializeCanonical } from "../primitives/serialize.ts";
|
|
6
|
+
import type { Diagnostic } from "../types/diagnostic.ts";
|
|
7
|
+
import {
|
|
8
|
+
FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION,
|
|
9
|
+
FORGE_EXTERNAL_MANIFEST_REGISTRY,
|
|
10
|
+
type ForgeExternalManifest,
|
|
11
|
+
type ForgeExternalManifestRegistryFile,
|
|
12
|
+
type ForgeExternalService,
|
|
13
|
+
type ForgeExternalServiceEntry,
|
|
14
|
+
type ForgeExternalServiceGraph,
|
|
15
|
+
} from "./types.ts";
|
|
16
|
+
import {
|
|
17
|
+
validateExternalManifest,
|
|
18
|
+
validateExternalManifestRegistry,
|
|
19
|
+
} from "./validate.ts";
|
|
20
|
+
|
|
21
|
+
function parseJsonFile(path: string): { value: unknown | null; diagnostics: Diagnostic[] } {
|
|
22
|
+
try {
|
|
23
|
+
return { value: JSON.parse(readFileSync(path, "utf8")), diagnostics: [] };
|
|
24
|
+
} catch (error) {
|
|
25
|
+
return {
|
|
26
|
+
value: null,
|
|
27
|
+
diagnostics: [
|
|
28
|
+
createDiagnostic({
|
|
29
|
+
severity: "error",
|
|
30
|
+
code: "FORGE_EXTERNAL_MANIFEST_PARSE",
|
|
31
|
+
message: `failed to parse external manifest JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
32
|
+
file: path,
|
|
33
|
+
docs: ["docs/forge-protocol.md", "schemas/forge-manifest.schema.json"],
|
|
34
|
+
}),
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function registryPath(workspaceRoot: string): string {
|
|
41
|
+
return join(workspaceRoot, FORGE_EXTERNAL_MANIFEST_REGISTRY);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function rootManifestPath(workspaceRoot: string): string {
|
|
45
|
+
return join(workspaceRoot, "forge.manifest.json");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function normalizeManifests(manifests: ForgeExternalManifest[]): ForgeExternalManifest[] {
|
|
49
|
+
return [...manifests].sort((a, b) => a.service.name.localeCompare(b.service.name));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function serviceFromManifest(manifest: ForgeExternalManifest): ForgeExternalService {
|
|
53
|
+
const entries: ForgeExternalServiceEntry[] = manifest.entries.map((entry) => ({
|
|
54
|
+
...entry,
|
|
55
|
+
service: manifest.service.name,
|
|
56
|
+
language: manifest.language,
|
|
57
|
+
...(manifest.framework ? { framework: manifest.framework } : {}),
|
|
58
|
+
transport: manifest.service.transport,
|
|
59
|
+
source: "external",
|
|
60
|
+
}));
|
|
61
|
+
return {
|
|
62
|
+
name: manifest.service.name,
|
|
63
|
+
language: manifest.language,
|
|
64
|
+
...(manifest.framework ? { framework: manifest.framework } : {}),
|
|
65
|
+
transport: manifest.service.transport,
|
|
66
|
+
...(manifest.service.baseUrl ? { baseUrl: manifest.service.baseUrl } : {}),
|
|
67
|
+
...(manifest.service.command ? { command: manifest.service.command } : {}),
|
|
68
|
+
...(manifest.service.commandArgs ? { commandArgs: manifest.service.commandArgs } : {}),
|
|
69
|
+
...(manifest.service.health ? { health: manifest.service.health } : {}),
|
|
70
|
+
entries,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function duplicateServiceDiagnostics(
|
|
75
|
+
manifests: ForgeExternalManifest[],
|
|
76
|
+
file: string,
|
|
77
|
+
): Diagnostic[] {
|
|
78
|
+
const seen = new Set<string>();
|
|
79
|
+
const diagnostics: Diagnostic[] = [];
|
|
80
|
+
for (const manifest of manifests) {
|
|
81
|
+
if (seen.has(manifest.service.name)) {
|
|
82
|
+
diagnostics.push(createDiagnostic({
|
|
83
|
+
severity: "error",
|
|
84
|
+
code: "FORGE_EXTERNAL_SERVICE_DUPLICATE",
|
|
85
|
+
message: `external service '${manifest.service.name}' is imported more than once`,
|
|
86
|
+
file,
|
|
87
|
+
fixHint: "Keep one manifest per external service name in .forge/external-manifests.json.",
|
|
88
|
+
docs: ["docs/forge-protocol.md"],
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
seen.add(manifest.service.name);
|
|
92
|
+
}
|
|
93
|
+
return diagnostics;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function readExternalManifestFile(path: string): {
|
|
97
|
+
manifest: ForgeExternalManifest | null;
|
|
98
|
+
diagnostics: Diagnostic[];
|
|
99
|
+
} {
|
|
100
|
+
const parsed = parseJsonFile(path);
|
|
101
|
+
if (parsed.value === null) {
|
|
102
|
+
return { manifest: null, diagnostics: parsed.diagnostics };
|
|
103
|
+
}
|
|
104
|
+
const result = validateExternalManifest(parsed.value, { file: path });
|
|
105
|
+
return { manifest: result.manifest, diagnostics: [...parsed.diagnostics, ...result.diagnostics] };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function loadExternalManifestRegistry(
|
|
109
|
+
workspaceRoot: string,
|
|
110
|
+
): { registry: ForgeExternalManifestRegistryFile; diagnostics: Diagnostic[]; path: string } {
|
|
111
|
+
const path = registryPath(workspaceRoot);
|
|
112
|
+
const diagnostics: Diagnostic[] = [];
|
|
113
|
+
const manifests: ForgeExternalManifest[] = [];
|
|
114
|
+
|
|
115
|
+
if (existsSync(path)) {
|
|
116
|
+
const parsed = parseJsonFile(path);
|
|
117
|
+
diagnostics.push(...parsed.diagnostics);
|
|
118
|
+
if (parsed.value !== null) {
|
|
119
|
+
const result = validateExternalManifestRegistry(parsed.value, { file: path });
|
|
120
|
+
diagnostics.push(...result.diagnostics);
|
|
121
|
+
if (result.registry) {
|
|
122
|
+
manifests.push(...result.registry.manifests);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const rootPath = rootManifestPath(workspaceRoot);
|
|
128
|
+
if (existsSync(rootPath)) {
|
|
129
|
+
const result = readExternalManifestFile(rootPath);
|
|
130
|
+
diagnostics.push(...result.diagnostics);
|
|
131
|
+
if (result.manifest) {
|
|
132
|
+
manifests.push(result.manifest);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
diagnostics.push(...duplicateServiceDiagnostics(manifests, path));
|
|
137
|
+
return {
|
|
138
|
+
path,
|
|
139
|
+
registry: {
|
|
140
|
+
schemaVersion: "0.1.0",
|
|
141
|
+
manifests: normalizeManifests(manifests),
|
|
142
|
+
},
|
|
143
|
+
diagnostics,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function buildExternalServiceGraph(workspaceRoot: string): ForgeExternalServiceGraph {
|
|
148
|
+
const loaded = loadExternalManifestRegistry(workspaceRoot);
|
|
149
|
+
const services = loaded.registry.manifests.map(serviceFromManifest);
|
|
150
|
+
return {
|
|
151
|
+
schemaVersion: "0.1.0",
|
|
152
|
+
protocolVersion: FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION,
|
|
153
|
+
registryPath: FORGE_EXTERNAL_MANIFEST_REGISTRY,
|
|
154
|
+
inputHash: hashStable(serializeCanonical({ services, diagnostics: loaded.diagnostics })),
|
|
155
|
+
services,
|
|
156
|
+
diagnostics: loaded.diagnostics,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function importExternalManifest(
|
|
161
|
+
workspaceRoot: string,
|
|
162
|
+
inputPath: string,
|
|
163
|
+
): { graph: ForgeExternalServiceGraph; diagnostics: Diagnostic[]; imported: boolean; path: string } {
|
|
164
|
+
const absoluteInput = resolve(workspaceRoot, inputPath);
|
|
165
|
+
const result = readExternalManifestFile(absoluteInput);
|
|
166
|
+
if (!result.manifest || result.diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
|
|
167
|
+
return {
|
|
168
|
+
graph: buildExternalServiceGraph(workspaceRoot),
|
|
169
|
+
diagnostics: result.diagnostics,
|
|
170
|
+
imported: false,
|
|
171
|
+
path: absoluteInput,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const loaded = loadExternalManifestRegistry(workspaceRoot);
|
|
176
|
+
const remaining = loaded.registry.manifests.filter(
|
|
177
|
+
(manifest) => manifest.service.name !== result.manifest?.service.name,
|
|
178
|
+
);
|
|
179
|
+
const registry: ForgeExternalManifestRegistryFile = {
|
|
180
|
+
schemaVersion: "0.1.0",
|
|
181
|
+
manifests: normalizeManifests([...remaining, result.manifest]),
|
|
182
|
+
};
|
|
183
|
+
const path = registryPath(workspaceRoot);
|
|
184
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
185
|
+
writeFileSync(path, `${serializeCanonical(registry).trimEnd()}\n`, "utf8");
|
|
186
|
+
const graph = buildExternalServiceGraph(workspaceRoot);
|
|
187
|
+
return {
|
|
188
|
+
graph,
|
|
189
|
+
diagnostics: [...loaded.diagnostics, ...result.diagnostics],
|
|
190
|
+
imported: true,
|
|
191
|
+
path,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function serializeExternalServiceGraphJson(graph: ForgeExternalServiceGraph): string {
|
|
196
|
+
return serializeCanonical(graph);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function serializeExternalServiceGraphTs(graph: ForgeExternalServiceGraph): string {
|
|
200
|
+
return `export const externalServices = ${JSON.stringify(
|
|
201
|
+
JSON.parse(serializeExternalServiceGraphJson(graph)),
|
|
202
|
+
null,
|
|
203
|
+
2,
|
|
204
|
+
)} as const;\n`;
|
|
205
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Diagnostic } from "../types/diagnostic.ts";
|
|
2
|
+
|
|
3
|
+
export const FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION = "1.0";
|
|
4
|
+
export const FORGE_EXTERNAL_MANIFEST_REGISTRY = ".forge/external-manifests.json";
|
|
5
|
+
|
|
6
|
+
export type ForgeExternalManifestLanguage =
|
|
7
|
+
| "go"
|
|
8
|
+
| "java"
|
|
9
|
+
| "kotlin"
|
|
10
|
+
| "csharp"
|
|
11
|
+
| "rust"
|
|
12
|
+
| "python"
|
|
13
|
+
| "typescript"
|
|
14
|
+
| string;
|
|
15
|
+
|
|
16
|
+
export type ForgeExternalTransportKind = "http" | "grpc" | "stdio";
|
|
17
|
+
export type ForgeExternalEntryKind = "command" | "query";
|
|
18
|
+
export type ForgeExternalEntryRisk = "read" | "write" | "destructive" | "external";
|
|
19
|
+
export type ForgeExternalTransactionMode =
|
|
20
|
+
| "read-only"
|
|
21
|
+
| "external-managed"
|
|
22
|
+
| "forge-managed"
|
|
23
|
+
| "saga";
|
|
24
|
+
|
|
25
|
+
export interface ForgeExternalManifestService {
|
|
26
|
+
name: string;
|
|
27
|
+
transport: ForgeExternalTransportKind;
|
|
28
|
+
baseUrl?: string;
|
|
29
|
+
command?: string;
|
|
30
|
+
commandArgs?: string[];
|
|
31
|
+
health?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ForgeExternalManifestEntry {
|
|
35
|
+
name: string;
|
|
36
|
+
kind: ForgeExternalEntryKind;
|
|
37
|
+
description?: string;
|
|
38
|
+
path?: string;
|
|
39
|
+
method?: "GET" | "POST";
|
|
40
|
+
inputSchema?: unknown;
|
|
41
|
+
outputSchema?: unknown;
|
|
42
|
+
policy?: string;
|
|
43
|
+
tenantScoped?: boolean;
|
|
44
|
+
transaction?: ForgeExternalTransactionMode;
|
|
45
|
+
risk?: ForgeExternalEntryRisk;
|
|
46
|
+
needsApproval?: boolean;
|
|
47
|
+
effects?: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ForgeExternalManifest {
|
|
51
|
+
forgeProtocol: typeof FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION;
|
|
52
|
+
language: ForgeExternalManifestLanguage;
|
|
53
|
+
framework?: string;
|
|
54
|
+
service: ForgeExternalManifestService;
|
|
55
|
+
entries: ForgeExternalManifestEntry[];
|
|
56
|
+
schemas?: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ForgeExternalManifestRegistryFile {
|
|
60
|
+
schemaVersion: "0.1.0";
|
|
61
|
+
manifests: ForgeExternalManifest[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface ForgeExternalServiceEntry extends ForgeExternalManifestEntry {
|
|
65
|
+
service: string;
|
|
66
|
+
language: ForgeExternalManifestLanguage;
|
|
67
|
+
framework?: string;
|
|
68
|
+
transport: ForgeExternalTransportKind;
|
|
69
|
+
source: "external";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface ForgeExternalService {
|
|
73
|
+
name: string;
|
|
74
|
+
language: ForgeExternalManifestLanguage;
|
|
75
|
+
framework?: string;
|
|
76
|
+
transport: ForgeExternalTransportKind;
|
|
77
|
+
baseUrl?: string;
|
|
78
|
+
command?: string;
|
|
79
|
+
commandArgs?: string[];
|
|
80
|
+
health?: string;
|
|
81
|
+
entries: ForgeExternalServiceEntry[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface ForgeExternalServiceGraph {
|
|
85
|
+
schemaVersion: "0.1.0";
|
|
86
|
+
protocolVersion: typeof FORGE_EXTERNAL_MANIFEST_PROTOCOL_VERSION;
|
|
87
|
+
inputHash: string;
|
|
88
|
+
registryPath: string;
|
|
89
|
+
services: ForgeExternalService[];
|
|
90
|
+
diagnostics: Diagnostic[];
|
|
91
|
+
}
|