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
|
@@ -18,6 +18,8 @@ import type { WorkflowRegistry, WorkflowSubscriptions } from "../compiler/types/
|
|
|
18
18
|
import type { ActionSubscriptions } from "../compiler/types/action-subscriptions.ts";
|
|
19
19
|
import type { TestCost, TestGraph } from "../compiler/types/test-graph.ts";
|
|
20
20
|
import { resolveCommandArgv } from "../compiler/package-manager/executor.ts";
|
|
21
|
+
import { categorizeFiles, isVolatileForgeState, type CategorizedFileSummary } from "../workspace/change-summary.ts";
|
|
22
|
+
import { buildWorkspaceGitSummary } from "../workspace/git-summary.ts";
|
|
21
23
|
import type {
|
|
22
24
|
ImpactCommandOptions,
|
|
23
25
|
ImpactReport,
|
|
@@ -167,12 +169,6 @@ function untrackedFiles(workspaceRoot: string): string[] {
|
|
|
167
169
|
return result.ok ? result.files : [];
|
|
168
170
|
}
|
|
169
171
|
|
|
170
|
-
function isVolatileForgeState(file: string): boolean {
|
|
171
|
-
const normalized = normalize(file);
|
|
172
|
-
return normalized.startsWith(".forge/locks/") ||
|
|
173
|
-
normalized.startsWith(".forge/test-runs/");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
172
|
function sourceFromOptions(options: ImpactCommandOptions | TestCommandOptions): ImpactSource {
|
|
177
173
|
if (options.staged) return { mode: "staged", base: "index" };
|
|
178
174
|
if (options.since) return { mode: "since", base: options.since };
|
|
@@ -506,6 +502,27 @@ function riskFor(impact: ImpactedSystems, files: string[]): ImpactRisk {
|
|
|
506
502
|
return { level, reasons: reasons.sort() };
|
|
507
503
|
}
|
|
508
504
|
|
|
505
|
+
function changeSummaryForImpact(
|
|
506
|
+
workspaceRoot: string,
|
|
507
|
+
source: ImpactSource,
|
|
508
|
+
changedFiles: string[],
|
|
509
|
+
): CategorizedFileSummary {
|
|
510
|
+
if (source.mode === "changed" || source.mode === "staged") {
|
|
511
|
+
const git = buildWorkspaceGitSummary(workspaceRoot);
|
|
512
|
+
if (git.available) {
|
|
513
|
+
return source.mode === "staged" ? git.changeSummary.staged : git.changeSummary.changed;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return categorizeFiles(changedFiles);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function derivedOnlyRisk(): ImpactRisk {
|
|
520
|
+
return {
|
|
521
|
+
level: "low",
|
|
522
|
+
reasons: ["Only derived generated artifacts changed"],
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
509
526
|
function loadArtifacts(workspaceRoot: string) {
|
|
510
527
|
return {
|
|
511
528
|
appGraph: readJson<AppGraph>(workspaceRoot, `${GENERATED}/appGraph.json`, { schemaVersion: "", generatorVersion: "", analyzerVersion: "", inputHash: "", symbols: [], edges: [], moduleGraph: { nodes: [] }, diagnostics: [] }),
|
|
@@ -671,6 +688,10 @@ export function analyzeImpact(options: ImpactCommandOptions): ImpactReport {
|
|
|
671
688
|
const detected = detectChangedFiles(options.workspaceRoot, source);
|
|
672
689
|
const artifacts = loadArtifacts(options.workspaceRoot);
|
|
673
690
|
const changedFiles = detected.files;
|
|
691
|
+
const changeSummary = changeSummaryForImpact(options.workspaceRoot, source, changedFiles);
|
|
692
|
+
const generatedChangedFiles = changeSummary.byType.generated.count;
|
|
693
|
+
const authoredChangedFiles = Math.max(0, changeSummary.total.count - generatedChangedFiles);
|
|
694
|
+
const derivedOnly = changeSummary.total.count > 0 && authoredChangedFiles === 0 && generatedChangedFiles > 0;
|
|
674
695
|
const impacted = analyzeFiles({
|
|
675
696
|
workspaceRoot: options.workspaceRoot,
|
|
676
697
|
files: changedFiles,
|
|
@@ -678,12 +699,15 @@ export function analyzeImpact(options: ImpactCommandOptions): ImpactReport {
|
|
|
678
699
|
excludeTests: options.excludeTests,
|
|
679
700
|
...artifacts,
|
|
680
701
|
});
|
|
681
|
-
const risk = riskFor(impacted, changedFiles);
|
|
702
|
+
const risk = derivedOnly ? derivedOnlyRisk() : riskFor(impacted, changedFiles);
|
|
682
703
|
const checks = requiredChecks(impacted).map((check) => check.command);
|
|
683
704
|
return {
|
|
684
705
|
ok: detected.diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
|
|
685
706
|
source,
|
|
686
707
|
changedFiles,
|
|
708
|
+
authoredChangedFiles,
|
|
709
|
+
generatedChangedFiles,
|
|
710
|
+
derivedOnly,
|
|
687
711
|
impacted,
|
|
688
712
|
risk,
|
|
689
713
|
recommendedChecks: checks,
|
|
@@ -716,10 +740,24 @@ export function buildImpactTestPlan(options: TestCommandOptions): ImpactTestPlan
|
|
|
716
740
|
includeBrowser: options.includeBrowser,
|
|
717
741
|
lastRunByCommand,
|
|
718
742
|
});
|
|
743
|
+
const generatedTypeScriptOnly =
|
|
744
|
+
report.changedFiles.length > 0 &&
|
|
745
|
+
report.changedFiles.every((file) =>
|
|
746
|
+
file === "forge.lock" ||
|
|
747
|
+
file.startsWith("src/forge/_generated/") ||
|
|
748
|
+
(file.toLowerCase().endsWith(".md") && report.impacted.generatedArtifacts.length > 0)
|
|
749
|
+
) &&
|
|
750
|
+
report.impacted.generatedArtifacts.some((file) => file.endsWith(".ts") || file.endsWith(".d.ts"));
|
|
751
|
+
const standardReason = generatedTypeScriptOnly
|
|
752
|
+
? "generated TypeScript artifacts changed"
|
|
753
|
+
: "TypeScript surface changed";
|
|
719
754
|
return {
|
|
720
755
|
schemaVersion: "0.1.0",
|
|
721
756
|
source: report.source,
|
|
722
757
|
changedFiles: report.changedFiles,
|
|
758
|
+
authoredChangedFiles: report.authoredChangedFiles,
|
|
759
|
+
generatedChangedFiles: report.generatedChangedFiles,
|
|
760
|
+
derivedOnly: report.derivedOnly,
|
|
723
761
|
impacted: report.impacted,
|
|
724
762
|
risk: report.risk,
|
|
725
763
|
requiredChecks: [
|
|
@@ -730,7 +768,7 @@ export function buildImpactTestPlan(options: TestCommandOptions): ImpactTestPlan
|
|
|
730
768
|
),
|
|
731
769
|
tests,
|
|
732
770
|
optionalChecks: ([
|
|
733
|
-
{ kind: "forge", command: "forge verify --standard", cost: "standard", reason:
|
|
771
|
+
{ kind: "forge", command: "forge verify --standard", cost: "standard", reason: standardReason },
|
|
734
772
|
] satisfies TestPlanCheck[]).filter((check) =>
|
|
735
773
|
costAllowed(check.cost, options.maxCost, options.includeDocker, options.includeBrowser),
|
|
736
774
|
),
|
|
@@ -41,6 +41,9 @@ export interface ImpactReport {
|
|
|
41
41
|
ok: boolean;
|
|
42
42
|
source: ImpactSource;
|
|
43
43
|
changedFiles: string[];
|
|
44
|
+
authoredChangedFiles?: number;
|
|
45
|
+
generatedChangedFiles?: number;
|
|
46
|
+
derivedOnly?: boolean;
|
|
44
47
|
impacted: ImpactedSystems;
|
|
45
48
|
risk: ImpactRisk;
|
|
46
49
|
recommendedChecks: string[];
|
|
@@ -70,6 +73,9 @@ export interface ImpactTestPlan {
|
|
|
70
73
|
schemaVersion: "0.1.0";
|
|
71
74
|
source: ImpactSource;
|
|
72
75
|
changedFiles: string[];
|
|
76
|
+
authoredChangedFiles?: number;
|
|
77
|
+
generatedChangedFiles?: number;
|
|
78
|
+
derivedOnly?: boolean;
|
|
73
79
|
impacted: ImpactedSystems;
|
|
74
80
|
risk: ImpactRisk;
|
|
75
81
|
requiredChecks: TestPlanCheck[];
|
|
@@ -195,7 +195,7 @@ function planFor(input: {
|
|
|
195
195
|
step(
|
|
196
196
|
"Inspect current app contract",
|
|
197
197
|
"The agent should understand existing entries, policies, frontend routes, and generated rules before editing.",
|
|
198
|
-
["forge dev --once --json", "forge
|
|
198
|
+
["forge status --json", "forge changed --json", "forge handoff --json", "forge dev --once --json", "forge agent print-context --json"],
|
|
199
199
|
files,
|
|
200
200
|
["No stale generated artifacts", "Frontend/runtime diagnostics are visible before editing"],
|
|
201
201
|
),
|
|
@@ -215,7 +215,11 @@ function planFor(input: {
|
|
|
215
215
|
),
|
|
216
216
|
],
|
|
217
217
|
commands: [
|
|
218
|
+
intentCommand("forge status --json", "Read compact project health and handoff state"),
|
|
219
|
+
intentCommand("forge changed --json", "Inspect grouped human and generated changes before opening diffs"),
|
|
220
|
+
intentCommand("forge handoff --json", "Build the compact work handoff for external agents"),
|
|
218
221
|
intentCommand("forge dev --once --json", "Get the current generated/check/frontend/doctor state"),
|
|
222
|
+
intentCommand("forge agent print-context --json", "Read the agent-facing context"),
|
|
219
223
|
intentCommand(dryRun, "Preview the feature scaffold"),
|
|
220
224
|
intentCommand(apply, "Apply the reviewed scaffold", "after-review"),
|
|
221
225
|
intentCommand("forge generate", "Refresh generated contracts after edits", "after-editing"),
|
|
@@ -231,7 +235,7 @@ function planFor(input: {
|
|
|
231
235
|
}
|
|
232
236
|
case "connect-ui":
|
|
233
237
|
return {
|
|
234
|
-
summary: "Inspect and repair the web app bridge, provider, routes, and generated
|
|
238
|
+
summary: "Inspect and repair the web app bridge, provider/plugin, routes, and generated binding usage.",
|
|
235
239
|
plan: [
|
|
236
240
|
step(
|
|
237
241
|
"Read frontend graph",
|
|
@@ -242,20 +246,25 @@ function planFor(input: {
|
|
|
242
246
|
),
|
|
243
247
|
step(
|
|
244
248
|
"Create or repair UI bridge",
|
|
245
|
-
"Forge frontends should use the local bridge and hooks instead of fragile direct runtime fetches.",
|
|
246
|
-
[
|
|
247
|
-
|
|
248
|
-
|
|
249
|
+
"Forge frontends should use the local bridge and generated hooks/composables instead of fragile direct runtime fetches.",
|
|
250
|
+
[
|
|
251
|
+
"forge make ui --framework vite --dry-run --json",
|
|
252
|
+
"forge make ui --framework nuxt --dry-run --json",
|
|
253
|
+
"forge repair diagnose --diagnostic FORGE_FRONTEND_DIRECT_RUNTIME_FETCH --json",
|
|
254
|
+
],
|
|
255
|
+
["web/src/lib/forge.ts", "web/composables/forge.ts", "web/src/App.tsx", "web/app.vue", `${GENERATED_DIR}/frontendGraph.json`],
|
|
256
|
+
["ForgeProvider or Nuxt plugin is mounted when framework needs it", "generated hooks/composables replace raw endpoint fetches"],
|
|
249
257
|
),
|
|
250
258
|
],
|
|
251
259
|
commands: [
|
|
252
260
|
intentCommand("forge inspect frontend --json", "Inspect frontend wiring"),
|
|
253
261
|
intentCommand("forge dev --once --json", "Run the central diagnostic loop"),
|
|
254
262
|
intentCommand("forge make ui --framework vite --dry-run --json", "Preview adding a Forge-ready UI bridge", "after-review"),
|
|
263
|
+
intentCommand("forge make ui --framework nuxt --dry-run --json", "Preview adding a Forge-ready Nuxt UI bridge", "after-review"),
|
|
255
264
|
intentCommand("forge generate", "Refresh frontendGraph and agentContract", "after-editing"),
|
|
256
265
|
],
|
|
257
266
|
filesToInspect: files,
|
|
258
|
-
filesToChange: uniqueSorted(["web", "web/src/lib/forge.ts", "web/src/App.tsx"]),
|
|
267
|
+
filesToChange: uniqueSorted(["web", "web/src/lib/forge.ts", "web/composables/forge.ts", "web/src/App.tsx", "web/app.vue"]),
|
|
259
268
|
risks: [
|
|
260
269
|
risk("medium", "UI can appear to work while bypassing generated hooks.", "Treat frontendGraph diagnostics as blocking for agent handoff."),
|
|
261
270
|
],
|
|
@@ -267,7 +276,7 @@ function planFor(input: {
|
|
|
267
276
|
step(
|
|
268
277
|
"Collect current diagnostics",
|
|
269
278
|
"The central dev cycle aggregates generated drift, guardrails, frontend wiring, doctor checks, impact, and last reports.",
|
|
270
|
-
["forge dev --once --json"],
|
|
279
|
+
["forge status --json", "forge changed --json", "forge handoff --json", "forge dev --once --json"],
|
|
271
280
|
files,
|
|
272
281
|
["Diagnostics include codes, fix hints, and suggested commands"],
|
|
273
282
|
),
|
|
@@ -284,6 +293,9 @@ function planFor(input: {
|
|
|
284
293
|
),
|
|
285
294
|
],
|
|
286
295
|
commands: [
|
|
296
|
+
intentCommand("forge status --json", "Read compact project health before repair"),
|
|
297
|
+
intentCommand("forge changed --json", "Inspect grouped changes and risk buckets before repair"),
|
|
298
|
+
intentCommand("forge handoff --json", "Capture current work state and risks before repair"),
|
|
287
299
|
intentCommand("forge dev --once --json", "Collect current diagnostics"),
|
|
288
300
|
intentCommand("forge repair diagnose --from-last-test-run --json", "Diagnose last test failures", "after-review"),
|
|
289
301
|
intentCommand("forge repair diagnose --from-last-ui-run --json", "Diagnose last UI failures", "after-review"),
|
|
@@ -302,7 +314,7 @@ function planFor(input: {
|
|
|
302
314
|
step(
|
|
303
315
|
"Get changed-file impact",
|
|
304
316
|
"Impact planning keeps verification fast while still choosing relevant checks.",
|
|
305
|
-
["forge dev --once --json", "forge test plan --changed --json"],
|
|
317
|
+
["forge changed --json", "forge handoff --json", "forge dev --once --json", "forge test plan --changed --json"],
|
|
306
318
|
files,
|
|
307
319
|
["Changed files and recommended checks are listed"],
|
|
308
320
|
),
|
|
@@ -315,6 +327,8 @@ function planFor(input: {
|
|
|
315
327
|
),
|
|
316
328
|
],
|
|
317
329
|
commands: [
|
|
330
|
+
intentCommand("forge changed --json", "Inspect grouped changes before planning verification"),
|
|
331
|
+
intentCommand("forge handoff --json", "Summarize current work state before verification"),
|
|
318
332
|
intentCommand("forge dev --once --json", "Run central diagnostics"),
|
|
319
333
|
intentCommand("forge test plan --changed --json", "Plan targeted checks from changed files"),
|
|
320
334
|
intentCommand("forge verify --changed", "Run focused verification", "after-editing"),
|
|
@@ -333,7 +347,7 @@ function planFor(input: {
|
|
|
333
347
|
step(
|
|
334
348
|
"Review current state",
|
|
335
349
|
"Handoffs need current generated artifacts, review findings, and changed-file impact.",
|
|
336
|
-
["forge dev --once --json", "forge review --changed --json", "git status --short"],
|
|
350
|
+
["forge changed --json", "forge handoff --json", "forge dev --once --json", "forge review --changed --json", "git status --short"],
|
|
337
351
|
files,
|
|
338
352
|
["No unexpected generated drift", "Review findings are known before commit"],
|
|
339
353
|
),
|
|
@@ -346,6 +360,8 @@ function planFor(input: {
|
|
|
346
360
|
),
|
|
347
361
|
],
|
|
348
362
|
commands: [
|
|
363
|
+
intentCommand("forge changed --json", "Inspect grouped changes before review and handoff"),
|
|
364
|
+
intentCommand("forge handoff --json", "Build the work handoff and risk summary"),
|
|
349
365
|
intentCommand("forge dev --once --json", "Run central diagnostics"),
|
|
350
366
|
intentCommand("forge review --changed --json", "Review changed files structurally"),
|
|
351
367
|
intentCommand("forge verify --strict", "Run final strict verification", "before-handoff"),
|
|
@@ -359,14 +375,14 @@ function planFor(input: {
|
|
|
359
375
|
case "explain":
|
|
360
376
|
case "inspect":
|
|
361
377
|
return {
|
|
362
|
-
summary: "Read
|
|
378
|
+
summary: "Read compact project health and generated agent context before opening individual files.",
|
|
363
379
|
plan: [
|
|
364
380
|
step(
|
|
365
381
|
"Load agent context",
|
|
366
|
-
"The generated
|
|
367
|
-
["forge
|
|
382
|
+
"The compact status, grouped diff, and generated context are the fastest route to understanding runtime, data, frontend, policies, and commands.",
|
|
383
|
+
["forge status --json", "forge changed --json", "forge handoff --json", "forge agent print-context --json", "forge inspect all --brief --json"],
|
|
368
384
|
files,
|
|
369
|
-
["Contract and maps are available", "Frontend routes and runtime endpoints are known"],
|
|
385
|
+
["Grouped human and generated changes are visible", "Contract and maps are available", "Frontend routes and runtime endpoints are known"],
|
|
370
386
|
),
|
|
371
387
|
step(
|
|
372
388
|
"Open the relevant source files",
|
|
@@ -377,14 +393,17 @@ function planFor(input: {
|
|
|
377
393
|
),
|
|
378
394
|
],
|
|
379
395
|
commands: [
|
|
380
|
-
intentCommand("forge
|
|
396
|
+
intentCommand("forge status --json", "Read the compact project health and next actions"),
|
|
397
|
+
intentCommand("forge changed --json", "Inspect grouped human and generated changes before source reads"),
|
|
398
|
+
intentCommand("forge handoff --json", "Read the compact work handoff and resume brief"),
|
|
381
399
|
intentCommand("forge agent print-context --json", "Read the agent-facing context"),
|
|
400
|
+
intentCommand("forge inspect all --brief --json", "Read the brief aggregate project contract without large nested payloads"),
|
|
382
401
|
intentCommand("forge inspect frontend --json", "Read frontend routes and bindings"),
|
|
383
402
|
],
|
|
384
403
|
filesToInspect: files,
|
|
385
404
|
filesToChange: [],
|
|
386
405
|
risks: [
|
|
387
|
-
risk("low", "Reading source before generated maps wastes context.", "Start from AGENTS.md and agentContract.json."),
|
|
406
|
+
risk("low", "Reading source before grouped changes and generated maps wastes context.", "Start from status, changed, AGENTS.md, and agentContract.json."),
|
|
388
407
|
],
|
|
389
408
|
};
|
|
390
409
|
}
|
package/src/forge/make/index.ts
CHANGED
|
@@ -10,6 +10,9 @@ import { parseFieldSpec, parseFields, splitTopLevel } from "./fields.ts";
|
|
|
10
10
|
import { camelCase, kebabCase, pascalCase, singularize, titleCase } from "./naming.ts";
|
|
11
11
|
import {
|
|
12
12
|
renderAction,
|
|
13
|
+
renderAiAgentFile,
|
|
14
|
+
renderAiChatComponent,
|
|
15
|
+
renderAiChatPage,
|
|
13
16
|
renderCreateCommand,
|
|
14
17
|
renderCreateForm,
|
|
15
18
|
renderDeleteCommand,
|
|
@@ -17,6 +20,14 @@ import {
|
|
|
17
20
|
renderListComponent,
|
|
18
21
|
renderListQuery,
|
|
19
22
|
renderLiveQuery,
|
|
23
|
+
renderNextAiPackage,
|
|
24
|
+
renderNuxtApp,
|
|
25
|
+
renderNuxtConfig,
|
|
26
|
+
renderNuxtForgeComposable,
|
|
27
|
+
renderNuxtForgePlugin,
|
|
28
|
+
renderNuxtPackage,
|
|
29
|
+
renderNuxtStatusComponent,
|
|
30
|
+
renderNuxtTsconfig,
|
|
20
31
|
renderPage,
|
|
21
32
|
renderPlaceholderTest,
|
|
22
33
|
renderPolicyFile,
|
|
@@ -57,6 +68,7 @@ export const MAKE_PRIMITIVES: MakePrimitive[] = [
|
|
|
57
68
|
"component",
|
|
58
69
|
"page",
|
|
59
70
|
"ui",
|
|
71
|
+
"ai-chat",
|
|
60
72
|
"resource",
|
|
61
73
|
"apply",
|
|
62
74
|
"rollback",
|
|
@@ -102,7 +114,9 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
|
|
|
102
114
|
page:
|
|
103
115
|
"Adds a minimal app page under web/app/<route>/page.tsx.",
|
|
104
116
|
ui:
|
|
105
|
-
"Adds a minimal Vite React web app with
|
|
117
|
+
"Adds a minimal Vite React or Nuxt Vue web app with generated Forge client bindings.",
|
|
118
|
+
"ai-chat":
|
|
119
|
+
"Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
|
|
106
120
|
resource:
|
|
107
121
|
"Creates a full resource slice: table, policies, CRUD commands, queries, liveQuery, action, optional React, and tests.",
|
|
108
122
|
};
|
|
@@ -506,7 +520,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
506
520
|
const kind = options.primitive as MakeIntent["kind"];
|
|
507
521
|
const fieldOptions = parseFieldOptions(options);
|
|
508
522
|
const diagnostics = [...fieldOptions.diagnostics];
|
|
509
|
-
if (options.framework && !["vite", "next"].includes(options.framework)) {
|
|
523
|
+
if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
|
|
510
524
|
diagnostics.push(
|
|
511
525
|
diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
|
|
512
526
|
);
|
|
@@ -516,12 +530,12 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
516
530
|
diagnostic(
|
|
517
531
|
"warning",
|
|
518
532
|
"FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
|
|
519
|
-
"forge make ui currently generates
|
|
533
|
+
"forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
|
|
520
534
|
),
|
|
521
535
|
);
|
|
522
536
|
}
|
|
523
537
|
const name = options.name ?? (kind === "field" ? "" : undefined);
|
|
524
|
-
if (!name && !["component", "page", "ui"].includes(kind)) {
|
|
538
|
+
if (!name && !["component", "page", "ui", "ai-chat"].includes(kind)) {
|
|
525
539
|
diagnostics.push(
|
|
526
540
|
diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `forge make ${kind} requires a name`),
|
|
527
541
|
);
|
|
@@ -555,7 +569,8 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
555
569
|
kind === "resource" ||
|
|
556
570
|
kind === "component" ||
|
|
557
571
|
kind === "page" ||
|
|
558
|
-
kind === "ui"
|
|
572
|
+
kind === "ui" ||
|
|
573
|
+
kind === "ai-chat",
|
|
559
574
|
tests: options.withTests || kind === "resource",
|
|
560
575
|
policy:
|
|
561
576
|
options.policy ??
|
|
@@ -566,7 +581,8 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
566
581
|
trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
|
|
567
582
|
component: options.component,
|
|
568
583
|
route: options.name ? kebabCase(options.name) : undefined,
|
|
569
|
-
|
|
584
|
+
framework: options.framework,
|
|
585
|
+
withAi: options.withAi || kind === "ai-chat",
|
|
570
586
|
withCreateForm: options.withCreateForm || kind === "resource",
|
|
571
587
|
},
|
|
572
588
|
};
|
|
@@ -600,6 +616,77 @@ function addPolicies(plan: MakePlan, workspaceRoot: string, entries: Record<stri
|
|
|
600
616
|
plan.diagnostics.push(...next.diagnostics);
|
|
601
617
|
}
|
|
602
618
|
|
|
619
|
+
function addWebAiDependencies(plan: MakePlan, workspaceRoot: string, appName: string): void {
|
|
620
|
+
const desired: Record<string, string> = {
|
|
621
|
+
"@ai-sdk/react": "^3.0.0",
|
|
622
|
+
ai: "^6.0.0",
|
|
623
|
+
};
|
|
624
|
+
const plannedPackage = plan.filesToCreate.find((file) => file.file === "web/package.json");
|
|
625
|
+
if (plannedPackage) {
|
|
626
|
+
try {
|
|
627
|
+
const parsed = JSON.parse(plannedPackage.content) as { dependencies?: Record<string, string> };
|
|
628
|
+
parsed.dependencies = { ...(parsed.dependencies ?? {}), ...desired };
|
|
629
|
+
plannedPackage.content = `${JSON.stringify(parsed, null, 2)}\n`;
|
|
630
|
+
return;
|
|
631
|
+
} catch {
|
|
632
|
+
plan.diagnostics.push(
|
|
633
|
+
diagnostic(
|
|
634
|
+
"warning",
|
|
635
|
+
"FORGE_MAKE_PACKAGE_JSON_UNSUPPORTED_SHAPE",
|
|
636
|
+
"could not update planned web/package.json with AI SDK dependencies",
|
|
637
|
+
"web/package.json",
|
|
638
|
+
),
|
|
639
|
+
);
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
const existing = readIfExists(workspaceRoot, "web/package.json");
|
|
645
|
+
if (!existing) {
|
|
646
|
+
plan.filesToCreate.push(
|
|
647
|
+
createFile(
|
|
648
|
+
workspaceRoot,
|
|
649
|
+
"web/package.json",
|
|
650
|
+
"Add web package with AI SDK dependencies",
|
|
651
|
+
renderNextAiPackage(appName),
|
|
652
|
+
),
|
|
653
|
+
);
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
try {
|
|
658
|
+
const parsed = JSON.parse(existing) as { dependencies?: Record<string, string> };
|
|
659
|
+
const dependencies = { ...(parsed.dependencies ?? {}) };
|
|
660
|
+
let changed = false;
|
|
661
|
+
for (const [name, version] of Object.entries(desired)) {
|
|
662
|
+
if (dependencies[name] !== version) {
|
|
663
|
+
dependencies[name] = version;
|
|
664
|
+
changed = true;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
if (!changed) {
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
parsed.dependencies = dependencies;
|
|
671
|
+
plan.filesToModify.push({
|
|
672
|
+
file: "web/package.json",
|
|
673
|
+
kind: "replace-section",
|
|
674
|
+
description: "Add AI SDK dependencies to web package",
|
|
675
|
+
beforeHash: hashStable(existing),
|
|
676
|
+
afterPreview: `${JSON.stringify(parsed, null, 2)}\n`,
|
|
677
|
+
});
|
|
678
|
+
} catch {
|
|
679
|
+
plan.diagnostics.push(
|
|
680
|
+
diagnostic(
|
|
681
|
+
"warning",
|
|
682
|
+
"FORGE_MAKE_PACKAGE_JSON_UNSUPPORTED_SHAPE",
|
|
683
|
+
"could not update web/package.json with AI SDK dependencies",
|
|
684
|
+
"web/package.json",
|
|
685
|
+
),
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
603
690
|
function addRuntimeFiles(plan: MakePlan, workspaceRoot: string, intent: MakeIntent): void {
|
|
604
691
|
const table = intent.table ?? intent.name;
|
|
605
692
|
const singular = singularize(table);
|
|
@@ -670,7 +757,63 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
|
|
|
670
757
|
const table = intent.table ?? intent.name;
|
|
671
758
|
const singular = singularize(table);
|
|
672
759
|
const pascal = pascalCase(singular);
|
|
760
|
+
if (intent.kind === "ai-chat") {
|
|
761
|
+
const name = intent.name || "support";
|
|
762
|
+
const hasViteSource = fileExists(workspaceRoot, "web/src") || fileExists(workspaceRoot, "web/src/main.tsx");
|
|
763
|
+
const bridgeFile = hasViteSource ? "web/src/lib/forge.ts" : "web/lib/forge.ts";
|
|
764
|
+
const componentFile = hasViteSource
|
|
765
|
+
? `web/src/components/${pascalCase(name)}AiChat.tsx`
|
|
766
|
+
: `web/components/${pascalCase(name)}AiChat.tsx`;
|
|
767
|
+
addWebAiDependencies(plan, workspaceRoot, name);
|
|
768
|
+
if (!fileExists(workspaceRoot, bridgeFile)) {
|
|
769
|
+
plan.filesToCreate.push(
|
|
770
|
+
createFile(
|
|
771
|
+
workspaceRoot,
|
|
772
|
+
bridgeFile,
|
|
773
|
+
"Add Forge client bridge",
|
|
774
|
+
hasViteSource ? renderWebBridge() : renderWebRootBridge(),
|
|
775
|
+
),
|
|
776
|
+
);
|
|
777
|
+
}
|
|
778
|
+
plan.filesToCreate.push(
|
|
779
|
+
createFile(
|
|
780
|
+
workspaceRoot,
|
|
781
|
+
`src/ai/${camelCase(name)}Agent.ts`,
|
|
782
|
+
`Add AI agent '${name}'`,
|
|
783
|
+
renderAiAgentFile(name),
|
|
784
|
+
),
|
|
785
|
+
createFile(
|
|
786
|
+
workspaceRoot,
|
|
787
|
+
componentFile,
|
|
788
|
+
`Add AI chat component '${name}'`,
|
|
789
|
+
renderAiChatComponent(name),
|
|
790
|
+
),
|
|
791
|
+
);
|
|
792
|
+
if (fileExists(workspaceRoot, "web/app") || fileExists(workspaceRoot, "web/app/layout.tsx")) {
|
|
793
|
+
plan.filesToCreate.push(
|
|
794
|
+
createFile(
|
|
795
|
+
workspaceRoot,
|
|
796
|
+
`web/app/${kebabCase(name)}-ai/page.tsx`,
|
|
797
|
+
`Add AI chat page '${name}'`,
|
|
798
|
+
renderAiChatPage(name),
|
|
799
|
+
),
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
return;
|
|
803
|
+
}
|
|
673
804
|
if (intent.kind === "ui") {
|
|
805
|
+
if (intent.framework === "nuxt") {
|
|
806
|
+
plan.filesToCreate.push(
|
|
807
|
+
createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
|
|
808
|
+
createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
|
|
809
|
+
createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
|
|
810
|
+
createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
|
|
811
|
+
createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
|
|
812
|
+
createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
|
|
813
|
+
createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
|
|
814
|
+
);
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
674
817
|
plan.filesToCreate.push(
|
|
675
818
|
createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
|
|
676
819
|
createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),
|