forgeos 0.1.0-alpha.4 → 0.1.0-alpha.41
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 +10 -0
- package/AGENTS.md +142 -90
- package/CHANGELOG.md +433 -0
- package/LICENSE +21 -0
- package/README.md +67 -8
- 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-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/bin/forge.mjs +18 -0
- package/docs/cair-protocol.md +103 -0
- package/docs/changelog.md +548 -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/package.json +31 -3
- 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 +1584 -125
- package/src/forge/agent-adapters/types.ts +224 -1
- package/src/forge/agent-memory/bridge.ts +1333 -0
- package/src/forge/agent-memory/context-pack.ts +277 -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 +204 -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 +339 -21
- package/src/forge/cli/auth.ts +348 -10
- package/src/forge/cli/authmd.ts +441 -0
- package/src/forge/cli/baseline.ts +112 -0
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +437 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1620 -20
- package/src/forge/cli/db.ts +209 -2
- package/src/forge/cli/deploy.ts +887 -0
- package/src/forge/cli/deps.ts +82 -13
- package/src/forge/cli/dev.ts +961 -46
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/doctor.ts +297 -0
- package/src/forge/cli/field-test.ts +329 -0
- package/src/forge/cli/handoff.ts +336 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/last-run.ts +84 -0
- package/src/forge/cli/main.ts +107 -3
- package/src/forge/cli/new.ts +152 -13
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +389 -6
- package/src/forge/cli/parse.ts +1050 -34
- package/src/forge/cli/progress.ts +51 -0
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/rls.ts +43 -4
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/security.ts +112 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2218 -0
- package/src/forge/cli/verify.ts +1455 -32
- package/src/forge/cli/windows.ts +23 -0
- package/src/forge/cli/workos.ts +1020 -0
- package/src/forge/compiler/agent-contract/build.ts +670 -64
- package/src/forge/compiler/agent-contract/types.ts +45 -2
- package/src/forge/compiler/ai-registry/parse.ts +71 -2
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +112 -9
- package/src/forge/compiler/app-graph/extract.ts +107 -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 +295 -13
- package/src/forge/compiler/data-graph/parse.ts +20 -4
- package/src/forge/compiler/data-graph/sql/ddl.ts +144 -31
- 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/diagnostics/codes.ts +30 -0
- package/src/forge/compiler/diagnostics/create.ts +21 -2
- 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 +9 -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 +142 -14
- package/src/forge/compiler/integration/add.ts +618 -24
- package/src/forge/compiler/integration/plan.ts +43 -12
- package/src/forge/compiler/integration/render.ts +29 -0
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/integration/templates/convex.ts +70 -0
- package/src/forge/compiler/integration/templates/index.ts +1 -0
- package/src/forge/compiler/integration/templates/render.ts +38 -0
- package/src/forge/compiler/integration/templates/types.ts +3 -0
- package/src/forge/compiler/integration/templates/workos.ts +1219 -0
- package/src/forge/compiler/make-registry/build.ts +8 -9
- package/src/forge/compiler/orchestrator/fast-check.ts +4 -0
- package/src/forge/compiler/orchestrator/generate-lock.ts +14 -3
- package/src/forge/compiler/orchestrator/manifest.ts +1 -1
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +247 -10
- 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 +33 -8
- package/src/forge/compiler/orchestrator/types.ts +1 -1
- package/src/forge/compiler/package-graph/compiler.ts +3 -1
- package/src/forge/compiler/package-graph/constants.ts +1 -1
- 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/package-manager/version.ts +36 -12
- package/src/forge/compiler/package-upgrades/planner.ts +155 -18
- package/src/forge/compiler/package-upgrades/types.ts +2 -0
- package/src/forge/compiler/policy-registry/build.ts +47 -2
- package/src/forge/compiler/policy-registry/parse.ts +32 -2
- package/src/forge/compiler/recipes/definitions.ts +63 -0
- package/src/forge/compiler/recipes/index.ts +2 -0
- package/src/forge/compiler/recipes/registry.ts +6 -0
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/app-graph.ts +8 -2
- package/src/forge/compiler/types/cli.ts +75 -1
- package/src/forge/compiler/types/dev-manifest.ts +4 -0
- package/src/forge/compiler/types/emit.ts +2 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/compiler/types/integration.ts +1 -0
- package/src/forge/compiler/types/package-graph.ts +6 -0
- package/src/forge/compiler/types/policy-registry.ts +3 -1
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +238 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +25 -0
- package/src/forge/delta/recorder.ts +540 -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 +1202 -0
- package/src/forge/delta/store.ts +3284 -0
- package/src/forge/delta/timeline.ts +178 -0
- package/src/forge/dev/server.ts +808 -17
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +280 -33
- package/src/forge/dev-console/types.ts +47 -1
- package/src/forge/impact/index.ts +204 -9
- package/src/forge/impact/types.ts +33 -1
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/fields.ts +26 -0
- package/src/forge/make/index.ts +40 -6
- package/src/forge/make/templates.ts +155 -2
- package/src/forge/make/types.ts +2 -1
- package/src/forge/policy.ts +1 -1
- package/src/forge/react/index.ts +160 -2
- 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/auth/config.ts +17 -0
- package/src/forge/runtime/auth/evaluate.ts +15 -2
- package/src/forge/runtime/auth/resolve.ts +61 -6
- package/src/forge/runtime/auth/types.ts +1 -0
- package/src/forge/runtime/db/factory.ts +1 -3
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +139 -32
- package/src/forge/runtime/db/pglite-adapter.ts +263 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +129 -16
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/buffer.ts +4 -1
- package/src/forge/runtime/telemetry/scrubber.ts +35 -5
- package/src/forge/runtime/webhooks/security.ts +12 -7
- package/src/forge/server.ts +17 -3
- package/src/forge/ui/index.ts +209 -0
- package/src/forge/ui/types.ts +1 -0
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +422 -0
- package/src/forge/workspace/baseline.ts +112 -0
- package/src/forge/workspace/change-summary.ts +250 -0
- package/src/forge/workspace/forge-cli.ts +42 -0
- package/src/forge/workspace/git-summary.ts +391 -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 +1 -0
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +1 -1
- package/templates/minimal-web/web/package.json +2 -2
- package/templates/nuxt-web/.vscode/settings.json +14 -0
- package/templates/nuxt-web/README.md +30 -0
- package/templates/nuxt-web/forge.config.ts +3 -0
- package/templates/nuxt-web/package.json +33 -0
- package/templates/nuxt-web/src/actions/logNoteCreated.ts +11 -0
- package/templates/nuxt-web/src/commands/createNote.ts +26 -0
- package/templates/nuxt-web/src/forge/schema.ts +12 -0
- package/templates/nuxt-web/src/policies.ts +6 -0
- package/templates/nuxt-web/src/queries/listNotes.ts +8 -0
- package/templates/nuxt-web/src/queries/liveNotes.ts +8 -0
- package/templates/nuxt-web/tsconfig.json +17 -0
- package/templates/nuxt-web/web/app.vue +67 -0
- package/templates/nuxt-web/web/components/LiveNotes.vue +89 -0
- package/templates/nuxt-web/web/components/NoteComposer.vue +100 -0
- package/templates/nuxt-web/web/composables/forge.ts +13 -0
- package/templates/nuxt-web/web/composables/useNotes.ts +24 -0
- package/templates/nuxt-web/web/nuxt.config.ts +11 -0
- package/templates/nuxt-web/web/package.json +18 -0
- package/templates/nuxt-web/web/plugins/forge.client.ts +10 -0
- package/templates/nuxt-web/web/plugins/forge.server.ts +10 -0
- package/templates/nuxt-web/web/server/api/forge-health.get.ts +7 -0
- package/templates/nuxt-web/web/tsconfig.json +6 -0
- 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 -7829
- package/src/forge/_generated/agentQuickstart.md +0 -34
- package/src/forge/_generated/agentTools.json +0 -2
- package/src/forge/_generated/agentTools.md +0 -16
- package/src/forge/_generated/agentTools.ts +0 -12
- package/src/forge/_generated/aiContext.ts +0 -125
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -51
- 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 -31
- 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 -14919
- package/src/forge/_generated/appMap.md +0 -55
- 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 -62
- 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 -68
- 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 -177
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -66
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -167
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -249334
- 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 -334130
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -91
- 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 -3430
- 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
package/src/forge/make/index.ts
CHANGED
|
@@ -21,6 +21,13 @@ import {
|
|
|
21
21
|
renderListQuery,
|
|
22
22
|
renderLiveQuery,
|
|
23
23
|
renderNextAiPackage,
|
|
24
|
+
renderNuxtApp,
|
|
25
|
+
renderNuxtConfig,
|
|
26
|
+
renderNuxtForgeComposable,
|
|
27
|
+
renderNuxtForgePlugin,
|
|
28
|
+
renderNuxtPackage,
|
|
29
|
+
renderNuxtStatusComponent,
|
|
30
|
+
renderNuxtTsconfig,
|
|
24
31
|
renderPage,
|
|
25
32
|
renderPlaceholderTest,
|
|
26
33
|
renderPolicyFile,
|
|
@@ -107,7 +114,7 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
|
|
|
107
114
|
page:
|
|
108
115
|
"Adds a minimal app page under web/app/<route>/page.tsx.",
|
|
109
116
|
ui:
|
|
110
|
-
"Adds a minimal Vite React web app with
|
|
117
|
+
"Adds a minimal Vite React or Nuxt Vue web app with generated Forge client bindings.",
|
|
111
118
|
"ai-chat":
|
|
112
119
|
"Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
|
|
113
120
|
resource:
|
|
@@ -193,6 +200,13 @@ function chooseSchemaFile(workspaceRoot: string): string {
|
|
|
193
200
|
return "src/forge/schema.ts";
|
|
194
201
|
}
|
|
195
202
|
|
|
203
|
+
function schemaHasTenantsTable(workspaceRoot: string): boolean {
|
|
204
|
+
const schema = readIfExists(workspaceRoot, chooseSchemaFile(workspaceRoot)) ?? "";
|
|
205
|
+
return schema.includes('name: "tenants"') ||
|
|
206
|
+
schema.includes("name: 'tenants'") ||
|
|
207
|
+
/\btenants\s*=\s*(?:defineTable|table)\s*\(/.test(schema);
|
|
208
|
+
}
|
|
209
|
+
|
|
196
210
|
function choosePolicyFile(workspaceRoot: string): string {
|
|
197
211
|
if (fileExists(workspaceRoot, "src/policies.ts")) {
|
|
198
212
|
return "src/policies.ts";
|
|
@@ -461,9 +475,14 @@ function parseFieldOptions(options: MakeCommandOptions): {
|
|
|
461
475
|
field?: MakeFieldSpec;
|
|
462
476
|
diagnostics: Diagnostic[];
|
|
463
477
|
} {
|
|
478
|
+
const fieldSpecs = options.fieldSpecs.map((fieldSpec) =>
|
|
479
|
+
options.values && /^[a-zA-Z][a-zA-Z0-9_]*:enum(?::|$)/.test(fieldSpec)
|
|
480
|
+
? fieldSpec.replace(":enum", `:enum(${options.values})`)
|
|
481
|
+
: fieldSpec,
|
|
482
|
+
);
|
|
464
483
|
const rawFields = [
|
|
465
484
|
...(options.fieldsRaw ? [options.fieldsRaw] : []),
|
|
466
|
-
...
|
|
485
|
+
...fieldSpecs,
|
|
467
486
|
];
|
|
468
487
|
const parsed = parseFields(rawFields);
|
|
469
488
|
const diagnostics = [...parsed.diagnostics];
|
|
@@ -513,7 +532,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
513
532
|
const kind = options.primitive as MakeIntent["kind"];
|
|
514
533
|
const fieldOptions = parseFieldOptions(options);
|
|
515
534
|
const diagnostics = [...fieldOptions.diagnostics];
|
|
516
|
-
if (options.framework && !["vite", "next"].includes(options.framework)) {
|
|
535
|
+
if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
|
|
517
536
|
diagnostics.push(
|
|
518
537
|
diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
|
|
519
538
|
);
|
|
@@ -523,7 +542,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
523
542
|
diagnostic(
|
|
524
543
|
"warning",
|
|
525
544
|
"FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
|
|
526
|
-
"forge make ui currently generates
|
|
545
|
+
"forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
|
|
527
546
|
),
|
|
528
547
|
);
|
|
529
548
|
}
|
|
@@ -544,6 +563,8 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
544
563
|
kind === "command"
|
|
545
564
|
? actionName?.replace(/^(create|update|delete)/, "") || "create"
|
|
546
565
|
: "read";
|
|
566
|
+
const tenantScoped =
|
|
567
|
+
options.tenantScoped || (kind === "resource" && schemaHasTenantsTable(options.workspaceRoot));
|
|
547
568
|
|
|
548
569
|
return {
|
|
549
570
|
diagnostics,
|
|
@@ -553,7 +574,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
553
574
|
table,
|
|
554
575
|
field: fieldOptions.field,
|
|
555
576
|
fields,
|
|
556
|
-
tenantScoped
|
|
577
|
+
tenantScoped,
|
|
557
578
|
crud: options.withCrud || kind === "resource",
|
|
558
579
|
liveQuery: options.withLiveQuery || kind === "resource" || kind === "livequery",
|
|
559
580
|
react:
|
|
@@ -574,6 +595,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
574
595
|
trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
|
|
575
596
|
component: options.component,
|
|
576
597
|
route: options.name ? kebabCase(options.name) : undefined,
|
|
598
|
+
framework: options.framework,
|
|
577
599
|
withAi: options.withAi || kind === "ai-chat",
|
|
578
600
|
withCreateForm: options.withCreateForm || kind === "resource",
|
|
579
601
|
},
|
|
@@ -794,6 +816,18 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
|
|
|
794
816
|
return;
|
|
795
817
|
}
|
|
796
818
|
if (intent.kind === "ui") {
|
|
819
|
+
if (intent.framework === "nuxt") {
|
|
820
|
+
plan.filesToCreate.push(
|
|
821
|
+
createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
|
|
822
|
+
createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
|
|
823
|
+
createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
|
|
824
|
+
createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
|
|
825
|
+
createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
|
|
826
|
+
createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
|
|
827
|
+
createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
|
|
828
|
+
);
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
797
831
|
plan.filesToCreate.push(
|
|
798
832
|
createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
|
|
799
833
|
createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),
|
|
@@ -878,7 +912,7 @@ function buildPlan(options: MakeCommandOptions): MakePlan {
|
|
|
878
912
|
kind: "resource" as const,
|
|
879
913
|
name: options.name ?? "resource",
|
|
880
914
|
fields: [],
|
|
881
|
-
tenantScoped:
|
|
915
|
+
tenantScoped: false,
|
|
882
916
|
crud: true,
|
|
883
917
|
liveQuery: true,
|
|
884
918
|
react: true,
|
|
@@ -637,9 +637,9 @@ export function renderVitePackage(appName: string): string {
|
|
|
637
637
|
},
|
|
638
638
|
"dependencies": {
|
|
639
639
|
"@ai-sdk/react": "^3.0.0",
|
|
640
|
-
"@vitejs/plugin-react": "^
|
|
640
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
641
641
|
"ai": "^6.0.0",
|
|
642
|
-
"vite": "^
|
|
642
|
+
"vite": "^8.0.16",
|
|
643
643
|
"react": "^19.0.0",
|
|
644
644
|
"react-dom": "^19.0.0"
|
|
645
645
|
},
|
|
@@ -652,6 +652,159 @@ export function renderVitePackage(appName: string): string {
|
|
|
652
652
|
`;
|
|
653
653
|
}
|
|
654
654
|
|
|
655
|
+
export function renderNuxtPackage(appName: string): string {
|
|
656
|
+
return `{
|
|
657
|
+
"name": "${kebabCase(appName)}-web",
|
|
658
|
+
"private": true,
|
|
659
|
+
"type": "module",
|
|
660
|
+
"scripts": {
|
|
661
|
+
"dev": "nuxt dev --host 127.0.0.1",
|
|
662
|
+
"build": "nuxt build",
|
|
663
|
+
"typecheck": "nuxt typecheck"
|
|
664
|
+
},
|
|
665
|
+
"dependencies": {
|
|
666
|
+
"nuxt": "^4.0.0",
|
|
667
|
+
"vue": "^3.5.38"
|
|
668
|
+
},
|
|
669
|
+
"devDependencies": {
|
|
670
|
+
"typescript": "^5.7.3"
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
`;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
export function renderNuxtConfig(): string {
|
|
677
|
+
return `export default defineNuxtConfig({
|
|
678
|
+
compatibilityDate: "2026-06-18",
|
|
679
|
+
runtimeConfig: {
|
|
680
|
+
public: {
|
|
681
|
+
forgeUrl: process.env.NUXT_PUBLIC_FORGE_URL ?? "http://127.0.0.1:3765",
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
typescript: {
|
|
685
|
+
strict: true,
|
|
686
|
+
},
|
|
687
|
+
});
|
|
688
|
+
`;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
export function renderNuxtTsconfig(): string {
|
|
692
|
+
return `{
|
|
693
|
+
"extends": "./.nuxt/tsconfig.json"
|
|
694
|
+
}
|
|
695
|
+
`;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
export function renderNuxtForgeComposable(): string {
|
|
699
|
+
return `export const forgeUrl = "http://127.0.0.1:3765";
|
|
700
|
+
|
|
701
|
+
export { api } from "../../src/forge/_generated/api";
|
|
702
|
+
export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
|
|
703
|
+
export {
|
|
704
|
+
ForgeVuePlugin,
|
|
705
|
+
provideForge,
|
|
706
|
+
useForgeAuth,
|
|
707
|
+
useForgeClient,
|
|
708
|
+
useForgeCommand,
|
|
709
|
+
useForgeLiveQuery,
|
|
710
|
+
useForgeQuery,
|
|
711
|
+
} from "../../src/forge/_generated/vue";
|
|
712
|
+
`;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
export function renderNuxtForgePlugin(): string {
|
|
716
|
+
return `import { ForgeVuePlugin } from "../composables/forge";
|
|
717
|
+
|
|
718
|
+
export default defineNuxtPlugin((nuxtApp) => {
|
|
719
|
+
const config = useRuntimeConfig();
|
|
720
|
+
|
|
721
|
+
nuxtApp.vueApp.use(ForgeVuePlugin, {
|
|
722
|
+
url: String(config.public.forgeUrl),
|
|
723
|
+
devAuth: true,
|
|
724
|
+
});
|
|
725
|
+
});
|
|
726
|
+
`;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
export function renderNuxtApp(): string {
|
|
730
|
+
return `<script setup lang="ts">
|
|
731
|
+
import ForgeStatus from "./components/ForgeStatus.vue";
|
|
732
|
+
</script>
|
|
733
|
+
|
|
734
|
+
<template>
|
|
735
|
+
<main class="shell">
|
|
736
|
+
<p class="eyebrow">ForgeOS Nuxt app</p>
|
|
737
|
+
<h1>Full-stack loop ready</h1>
|
|
738
|
+
<ForgeStatus />
|
|
739
|
+
</main>
|
|
740
|
+
</template>
|
|
741
|
+
|
|
742
|
+
<style scoped>
|
|
743
|
+
.shell {
|
|
744
|
+
width: min(760px, calc(100vw - 32px));
|
|
745
|
+
margin: 0 auto;
|
|
746
|
+
padding: 48px 0;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
.eyebrow {
|
|
750
|
+
color: #58655f;
|
|
751
|
+
font-size: 0.82rem;
|
|
752
|
+
font-weight: 800;
|
|
753
|
+
text-transform: uppercase;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
h1 {
|
|
757
|
+
margin: 0 0 12px;
|
|
758
|
+
color: #17211d;
|
|
759
|
+
font-size: 2.2rem;
|
|
760
|
+
}
|
|
761
|
+
</style>
|
|
762
|
+
`;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export function renderNuxtStatusComponent(): string {
|
|
766
|
+
return `<script setup lang="ts">
|
|
767
|
+
import { computed } from "vue";
|
|
768
|
+
import { useForgeAuth } from "../composables/forge";
|
|
769
|
+
|
|
770
|
+
const auth = useForgeAuth();
|
|
771
|
+
const tenantLabel = computed(() => auth?.tenantId ?? "dev-tenant");
|
|
772
|
+
const roleLabel = computed(() => auth?.role ?? "owner");
|
|
773
|
+
</script>
|
|
774
|
+
|
|
775
|
+
<template>
|
|
776
|
+
<section class="status-panel">
|
|
777
|
+
<span class="status-dot" aria-hidden="true" />
|
|
778
|
+
<p>
|
|
779
|
+
Connected as <strong>{{ roleLabel }}</strong> on
|
|
780
|
+
<strong>{{ tenantLabel }}</strong>.
|
|
781
|
+
</p>
|
|
782
|
+
</section>
|
|
783
|
+
</template>
|
|
784
|
+
|
|
785
|
+
<style scoped>
|
|
786
|
+
.status-panel {
|
|
787
|
+
display: flex;
|
|
788
|
+
align-items: center;
|
|
789
|
+
gap: 10px;
|
|
790
|
+
margin-top: 24px;
|
|
791
|
+
color: #26332d;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
.status-dot {
|
|
795
|
+
width: 10px;
|
|
796
|
+
height: 10px;
|
|
797
|
+
border-radius: 999px;
|
|
798
|
+
background: #1f9d55;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
p {
|
|
802
|
+
margin: 0;
|
|
803
|
+
}
|
|
804
|
+
</style>
|
|
805
|
+
`;
|
|
806
|
+
}
|
|
807
|
+
|
|
655
808
|
export function renderNextAiPackage(appName: string): string {
|
|
656
809
|
return `{
|
|
657
810
|
"name": "${kebabCase(appName)}-web",
|
package/src/forge/make/types.ts
CHANGED
|
@@ -61,6 +61,7 @@ export interface MakeIntent {
|
|
|
61
61
|
trigger?: string;
|
|
62
62
|
component?: string;
|
|
63
63
|
route?: string;
|
|
64
|
+
framework?: "vite" | "next" | "nuxt";
|
|
64
65
|
withAi: boolean;
|
|
65
66
|
withCreateForm: boolean;
|
|
66
67
|
}
|
|
@@ -130,7 +131,7 @@ export interface MakeCommandOptions {
|
|
|
130
131
|
event?: string;
|
|
131
132
|
trigger?: string;
|
|
132
133
|
component?: string;
|
|
133
|
-
framework?: "vite" | "next";
|
|
134
|
+
framework?: "vite" | "next" | "nuxt";
|
|
134
135
|
withAi: boolean;
|
|
135
136
|
withCrud: boolean;
|
|
136
137
|
withLiveQuery: boolean;
|
package/src/forge/policy.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { can, canRole, definePolicies, public_ } from "./server.ts";
|
|
1
|
+
export { can, canPermission, canRole, definePolicies, public_ } from "./server.ts";
|
package/src/forge/react/index.ts
CHANGED
|
@@ -3,7 +3,12 @@ import * as React from "react";
|
|
|
3
3
|
export type ForgeReactAuth = {
|
|
4
4
|
userId?: string;
|
|
5
5
|
tenantId?: string;
|
|
6
|
+
organizationId?: string;
|
|
7
|
+
organizationMembershipId?: string;
|
|
6
8
|
role?: string;
|
|
9
|
+
roles?: string[];
|
|
10
|
+
permissions?: string[];
|
|
11
|
+
claims?: Record<string, unknown>;
|
|
7
12
|
token?: string;
|
|
8
13
|
getToken?: () => string | Promise<string>;
|
|
9
14
|
headers?: Record<string, string>;
|
|
@@ -24,7 +29,12 @@ export type ForgeDevAuthConfig =
|
|
|
24
29
|
| {
|
|
25
30
|
userId?: string;
|
|
26
31
|
tenantId?: string;
|
|
32
|
+
organizationId?: string;
|
|
33
|
+
organizationMembershipId?: string;
|
|
27
34
|
role?: string;
|
|
35
|
+
roles?: string[];
|
|
36
|
+
permissions?: string[];
|
|
37
|
+
claims?: Record<string, unknown>;
|
|
28
38
|
headers?: Record<string, string>;
|
|
29
39
|
};
|
|
30
40
|
|
|
@@ -35,6 +45,22 @@ export type ForgeReactError = Error & {
|
|
|
35
45
|
details?: unknown;
|
|
36
46
|
};
|
|
37
47
|
|
|
48
|
+
export type ForgeCommandCallResult<T = unknown> =
|
|
49
|
+
| {
|
|
50
|
+
ok: true;
|
|
51
|
+
result: T;
|
|
52
|
+
status: number;
|
|
53
|
+
traceId?: string;
|
|
54
|
+
diagnostics?: { code: string; message: string }[];
|
|
55
|
+
}
|
|
56
|
+
| {
|
|
57
|
+
ok: false;
|
|
58
|
+
error: { code: string; message: string; details?: unknown };
|
|
59
|
+
status: number;
|
|
60
|
+
traceId?: string;
|
|
61
|
+
diagnostics?: { code: string; message: string }[];
|
|
62
|
+
};
|
|
63
|
+
|
|
38
64
|
export type LiveSnapshot<T> = {
|
|
39
65
|
subscriptionId: string;
|
|
40
66
|
revision: number;
|
|
@@ -46,6 +72,7 @@ export type ForgeReactClient = {
|
|
|
46
72
|
lastTraceId?: string;
|
|
47
73
|
query(name: string, args: unknown): Promise<unknown>;
|
|
48
74
|
command(name: string, args: unknown): Promise<unknown>;
|
|
75
|
+
commandResult?(name: string, args: unknown): Promise<ForgeCommandCallResult<unknown>>;
|
|
49
76
|
liveQuery(
|
|
50
77
|
name: string,
|
|
51
78
|
args: unknown,
|
|
@@ -86,6 +113,22 @@ export type UseCommandResult<TArgs, TResult> = {
|
|
|
86
113
|
reset: () => void;
|
|
87
114
|
};
|
|
88
115
|
|
|
116
|
+
export type UseCommandResultOptions<TResult> = {
|
|
117
|
+
onSuccess?: (result: TResult) => void;
|
|
118
|
+
onError?: (error: ForgeReactError) => void;
|
|
119
|
+
onSettled?: (result: ForgeCommandCallResult<TResult>) => void;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export type UseCommandResultHook<TArgs, TResult> = {
|
|
123
|
+
run: (args: TArgs) => Promise<ForgeCommandCallResult<TResult>>;
|
|
124
|
+
loading: boolean;
|
|
125
|
+
error: ForgeReactError | null;
|
|
126
|
+
result: ForgeCommandCallResult<TResult> | undefined;
|
|
127
|
+
data: TResult | undefined;
|
|
128
|
+
traceId?: string;
|
|
129
|
+
reset: () => void;
|
|
130
|
+
};
|
|
131
|
+
|
|
89
132
|
export type UseLiveQueryOptions = {
|
|
90
133
|
enabled?: boolean;
|
|
91
134
|
};
|
|
@@ -113,6 +156,10 @@ export type ForgeReactBindings<TClient extends ForgeReactClient = ForgeReactClie
|
|
|
113
156
|
name: string,
|
|
114
157
|
options?: UseCommandOptions<TResult>,
|
|
115
158
|
) => UseCommandResult<TArgs, TResult>;
|
|
159
|
+
useCommandResult: <TArgs = unknown, TResult = unknown>(
|
|
160
|
+
name: string,
|
|
161
|
+
options?: UseCommandResultOptions<TResult>,
|
|
162
|
+
) => UseCommandResultHook<TArgs, TResult>;
|
|
116
163
|
useLiveQuery: <TResult = unknown>(
|
|
117
164
|
name: string,
|
|
118
165
|
args: unknown,
|
|
@@ -155,6 +202,29 @@ function toForgeError(error: unknown): ForgeReactError {
|
|
|
155
202
|
return wrapped;
|
|
156
203
|
}
|
|
157
204
|
|
|
205
|
+
function commandErrorToForgeError(result: Extract<ForgeCommandCallResult, { ok: false }>): ForgeReactError {
|
|
206
|
+
const error = new Error(result.error.message) as ForgeReactError;
|
|
207
|
+
error.code = result.error.code;
|
|
208
|
+
error.status = result.status;
|
|
209
|
+
error.traceId = result.traceId;
|
|
210
|
+
error.details = result.error.details ?? result.diagnostics;
|
|
211
|
+
return error;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function caughtErrorToCommandResult(error: unknown): ForgeCommandCallResult<never> {
|
|
215
|
+
const forgeError = toForgeError(error);
|
|
216
|
+
return {
|
|
217
|
+
ok: false,
|
|
218
|
+
status: forgeError.status ?? 0,
|
|
219
|
+
traceId: forgeError.traceId,
|
|
220
|
+
error: {
|
|
221
|
+
code: forgeError.code ?? "FORGE_REACT_COMMAND_FAILED",
|
|
222
|
+
message: forgeError.message,
|
|
223
|
+
details: forgeError.details,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
158
228
|
function resolveDevAuth(devAuth: ForgeDevAuthConfig | undefined): ForgeReactAuthProvider | undefined {
|
|
159
229
|
if (!devAuth) {
|
|
160
230
|
return undefined;
|
|
@@ -162,9 +232,16 @@ function resolveDevAuth(devAuth: ForgeDevAuthConfig | undefined): ForgeReactAuth
|
|
|
162
232
|
const config = typeof devAuth === "object" ? devAuth : {};
|
|
163
233
|
return {
|
|
164
234
|
userId: config.userId ?? "dev-user",
|
|
165
|
-
tenantId: config.tenantId ?? "dev-tenant",
|
|
235
|
+
tenantId: config.tenantId ?? config.organizationId ?? "dev-tenant",
|
|
166
236
|
role: config.role ?? "owner",
|
|
167
|
-
|
|
237
|
+
...(config.organizationId ? { organizationId: config.organizationId } : {}),
|
|
238
|
+
...(config.organizationMembershipId
|
|
239
|
+
? { organizationMembershipId: config.organizationMembershipId }
|
|
240
|
+
: {}),
|
|
241
|
+
...(config.roles ? { roles: config.roles } : {}),
|
|
242
|
+
...(config.permissions ? { permissions: config.permissions } : {}),
|
|
243
|
+
...(config.claims ? { claims: config.claims } : {}),
|
|
244
|
+
...(config.headers ? { headers: config.headers } : {}),
|
|
168
245
|
};
|
|
169
246
|
}
|
|
170
247
|
|
|
@@ -327,6 +404,86 @@ export function createForgeReactBindings<TClient extends ForgeReactClient>(
|
|
|
327
404
|
};
|
|
328
405
|
}
|
|
329
406
|
|
|
407
|
+
function useCommandResult<TArgs = unknown, TResult = unknown>(
|
|
408
|
+
name: string,
|
|
409
|
+
options?: UseCommandResultOptions<TResult>,
|
|
410
|
+
): UseCommandResultHook<TArgs, TResult> {
|
|
411
|
+
const client = useForgeClient();
|
|
412
|
+
const [state, setState] = React.useState<{
|
|
413
|
+
loading: boolean;
|
|
414
|
+
error: ForgeReactError | null;
|
|
415
|
+
result: ForgeCommandCallResult<TResult> | undefined;
|
|
416
|
+
data: TResult | undefined;
|
|
417
|
+
traceId?: string;
|
|
418
|
+
}>({
|
|
419
|
+
loading: false,
|
|
420
|
+
error: null,
|
|
421
|
+
result: undefined,
|
|
422
|
+
data: undefined,
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
const run = React.useCallback(
|
|
426
|
+
async (args: TArgs): Promise<ForgeCommandCallResult<TResult>> => {
|
|
427
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
428
|
+
let result: ForgeCommandCallResult<TResult>;
|
|
429
|
+
if (typeof client.commandResult === "function") {
|
|
430
|
+
result = (await client.commandResult(name, args)) as ForgeCommandCallResult<TResult>;
|
|
431
|
+
} else {
|
|
432
|
+
try {
|
|
433
|
+
const data = (await client.command(name, args)) as TResult;
|
|
434
|
+
result = {
|
|
435
|
+
ok: true,
|
|
436
|
+
result: data,
|
|
437
|
+
status: 200,
|
|
438
|
+
traceId: client.lastTraceId,
|
|
439
|
+
};
|
|
440
|
+
} catch (error) {
|
|
441
|
+
result = caughtErrorToCommandResult(error);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (result.ok) {
|
|
446
|
+
setState({
|
|
447
|
+
loading: false,
|
|
448
|
+
error: null,
|
|
449
|
+
result,
|
|
450
|
+
data: result.result,
|
|
451
|
+
traceId: result.traceId ?? client.lastTraceId,
|
|
452
|
+
});
|
|
453
|
+
options?.onSuccess?.(result.result);
|
|
454
|
+
} else {
|
|
455
|
+
const forgeError = commandErrorToForgeError(result);
|
|
456
|
+
setState({
|
|
457
|
+
loading: false,
|
|
458
|
+
error: forgeError,
|
|
459
|
+
result,
|
|
460
|
+
data: undefined,
|
|
461
|
+
traceId: result.traceId,
|
|
462
|
+
});
|
|
463
|
+
options?.onError?.(forgeError);
|
|
464
|
+
}
|
|
465
|
+
options?.onSettled?.(result);
|
|
466
|
+
return result;
|
|
467
|
+
},
|
|
468
|
+
[client, name, options?.onError, options?.onSettled, options?.onSuccess],
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
const reset = React.useCallback(() => {
|
|
472
|
+
setState({
|
|
473
|
+
loading: false,
|
|
474
|
+
error: null,
|
|
475
|
+
result: undefined,
|
|
476
|
+
data: undefined,
|
|
477
|
+
});
|
|
478
|
+
}, []);
|
|
479
|
+
|
|
480
|
+
return {
|
|
481
|
+
...state,
|
|
482
|
+
run,
|
|
483
|
+
reset,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
330
487
|
function useLiveQuery<TResult = unknown>(
|
|
331
488
|
name: string,
|
|
332
489
|
args: unknown,
|
|
@@ -413,6 +570,7 @@ export function createForgeReactBindings<TClient extends ForgeReactClient>(
|
|
|
413
570
|
useAuth,
|
|
414
571
|
useQuery,
|
|
415
572
|
useCommand,
|
|
573
|
+
useCommandResult,
|
|
416
574
|
useLiveQuery,
|
|
417
575
|
};
|
|
418
576
|
}
|
|
@@ -228,7 +228,7 @@ export const repairRules: RepairRule[] = [
|
|
|
228
228
|
failureKind: "secrets",
|
|
229
229
|
code: "FORGE_SECRET_DIRECT_PROCESS_ENV",
|
|
230
230
|
summary: `Secret/config usage is unsafe or missing for ${secret}.`,
|
|
231
|
-
likelyCause: "Code reads process.env
|
|
231
|
+
likelyCause: "Code reads secret/config values through process.env in Forge runtime code, accesses secrets in a forbidden runtime, or the environment lacks a required secret.",
|
|
232
232
|
confidence: "high",
|
|
233
233
|
suggestedRepairs: [
|
|
234
234
|
{
|
|
@@ -466,7 +466,7 @@ export function explainDiagnostic(code: string): string {
|
|
|
466
466
|
FORGE_GUARD_VIOLATION: "A package or capability is used in a runtime context where it is forbidden. Move side effects to actions/workflows.",
|
|
467
467
|
FORGE_POLICY_UNKNOWN: "A runtime entry references a missing policy. Create or correct the policy, then simulate expected roles.",
|
|
468
468
|
FORGE_POLICY_DENIED: "The caller auth context does not satisfy the policy. Fix test auth or intentionally update policy roles.",
|
|
469
|
-
FORGE_SECRET_DIRECT_PROCESS_ENV: "Code reads process.env
|
|
469
|
+
FORGE_SECRET_DIRECT_PROCESS_ENV: "Code reads secret/config values through process.env in Forge runtime code. Use ctx.secrets/ctx.config in allowed runtime contexts.",
|
|
470
470
|
FORGE_AI_FORBIDDEN_CONTEXT: "AI is being used in a deterministic context. Move AI calls to action/workflow/server runtime.",
|
|
471
471
|
FORGE_WORKFLOW_STEP_FAILED: "A workflow step failed. Inspect the workflow run and trace before retrying.",
|
|
472
472
|
FORGE_OUTBOX_PROCESS_FAILED: "An outbox delivery failed. Inspect the subscribed action and retry after fixing the cause.",
|