forgeos 0.1.0-alpha.7 → 0.1.0-alpha.71
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/.agents/skills/forge-agent-fabric/SKILL.md +178 -0
- package/.agents/skills/forge-agent-fabric/references/managed-workflows.md +95 -0
- package/.agents/skills/forge-agent-fabric/references/repository-analysis.md +102 -0
- package/.agents/skills/forge-agent-fabric/scripts/fabric.mjs +46 -0
- package/.agents/skills/forge-agent-fabric/scripts/repository.mjs +44 -0
- package/.npmignore +10 -0
- package/AGENTS.md +142 -90
- package/CHANGELOG.md +870 -9
- package/LICENSE +21 -0
- package/README.md +121 -6
- 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 +47 -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 +49 -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/agent-fabric-programs.md +151 -0
- package/docs/agent-fabric.md +582 -0
- package/docs/architecture/agent-fabric/PORTABLE_PROJECTS_PLAN.md +136 -0
- package/docs/architecture/agent-fabric/README.md +180 -0
- package/docs/architecture/agent-fabric/REPOSITORY_MANIFEST_PLAN.md +284 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_ADR.md +81 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS.md +39 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_CORRECTIONS_EVIDENCE.md +53 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_EVIDENCE.md +49 -0
- package/docs/architecture/agent-fabric/WORKFLOW_PROGRAM_V2_PLAN.md +590 -0
- package/docs/cair-protocol.md +103 -0
- package/docs/changelog.md +1070 -0
- package/docs/forge-protocol.md +189 -0
- package/docs/repository-agent-benchmark.md +179 -0
- package/docs/repository-analysis.md +139 -0
- package/docs/repository-context-quality.md +179 -0
- package/docs/repository-runtime-observation.md +82 -0
- package/examples/agent-fabric-v2/README.md +70 -0
- package/examples/agent-fabric-v2/item-child.workflow.ts +11 -0
- package/examples/agent-fabric-v2/make-request.mjs +4 -0
- package/examples/agent-fabric-v2/map-child.workflow.ts +10 -0
- package/examples/agent-fabric-v2/migrate.workflow.ts +35 -0
- package/examples/agent-fabric-v2/registry.example.json +256 -0
- package/examples/agent-fabric-v2/run-ui-fixture.ts +48 -0
- package/examples/agent-fabric-v2/ui-audit.workflow.ts +28 -0
- package/examples/agent-fabric-v2/ui-fixture-worker.cjs +36 -0
- package/examples/agent-fabric-v2/visual-population.json +13 -0
- package/examples/agent-fabric-v2/workers/check.mjs +2 -0
- package/examples/agent-fabric-v2/workers/common.mjs +7 -0
- package/examples/agent-fabric-v2/workers/discover.mjs +2 -0
- package/examples/agent-fabric-v2/workers/migrate.mjs +4 -0
- package/examples/agent-fabric-v2/workers/review.mjs +3 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +60 -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 +60 -5
- package/schemas/agent-fabric/v0.1/control-event.schema.json +281 -0
- package/schemas/forge-manifest.schema.json +389 -0
- package/scripts/field-test-forgeos.mjs +1021 -0
- package/scripts/install-agent-fabric-skill.mjs +105 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1592 -125
- package/src/forge/agent-adapters/types.ts +225 -1
- package/src/forge/agent-fabric/adapter.ts +131 -0
- package/src/forge/agent-fabric/attached-snapshot.ts +55 -0
- package/src/forge/agent-fabric/attached-task-contract.ts +105 -0
- package/src/forge/agent-fabric/attached-task-service.ts +127 -0
- package/src/forge/agent-fabric/attached-task-store.ts +109 -0
- package/src/forge/agent-fabric/authority.ts +298 -0
- package/src/forge/agent-fabric/canonical.ts +135 -0
- package/src/forge/agent-fabric/codex-adversarial-review.ts +229 -0
- package/src/forge/agent-fabric/codex-sdk-worker.ts +203 -0
- package/src/forge/agent-fabric/conductor.ts +754 -0
- package/src/forge/agent-fabric/dictionary.ts +12 -0
- package/src/forge/agent-fabric/errors.ts +32 -0
- package/src/forge/agent-fabric/hardened-conductor.ts +485 -0
- package/src/forge/agent-fabric/hardened-reducer.ts +211 -0
- package/src/forge/agent-fabric/index.ts +48 -0
- package/src/forge/agent-fabric/journal.ts +116 -0
- package/src/forge/agent-fabric/local-adaptive-digest-worker.mjs +26 -0
- package/src/forge/agent-fabric/local-adaptive-harness.ts +343 -0
- package/src/forge/agent-fabric/local-adaptive-service.ts +398 -0
- package/src/forge/agent-fabric/local-adaptive-worker.ts +146 -0
- package/src/forge/agent-fabric/local-approval-window.ts +211 -0
- package/src/forge/agent-fabric/local-change-review-service.ts +374 -0
- package/src/forge/agent-fabric/local-coding-worker.ts +285 -0
- package/src/forge/agent-fabric/local-control-store.ts +239 -0
- package/src/forge/agent-fabric/local-effect-broker.ts +348 -0
- package/src/forge/agent-fabric/local-evolution-approval.ts +81 -0
- package/src/forge/agent-fabric/local-evolution-profile.ts +87 -0
- package/src/forge/agent-fabric/local-evolution-registry.ts +427 -0
- package/src/forge/agent-fabric/local-evolution-service.ts +200 -0
- package/src/forge/agent-fabric/local-intelligence.ts +281 -0
- package/src/forge/agent-fabric/local-paths.ts +18 -0
- package/src/forge/agent-fabric/local-task-contract.ts +203 -0
- package/src/forge/agent-fabric/local-task-inbox.ts +543 -0
- package/src/forge/agent-fabric/local-task-server.ts +374 -0
- package/src/forge/agent-fabric/local-task-service.ts +982 -0
- package/src/forge/agent-fabric/local-verification.ts +551 -0
- package/src/forge/agent-fabric/managed-environment.ts +205 -0
- package/src/forge/agent-fabric/managed-run-contract.ts +103 -0
- package/src/forge/agent-fabric/managed-run-service.ts +401 -0
- package/src/forge/agent-fabric/managed-run-store.ts +165 -0
- package/src/forge/agent-fabric/managed-workspace.ts +253 -0
- package/src/forge/agent-fabric/p0a.ts +104 -0
- package/src/forge/agent-fabric/p0b-model-adapter.ts +434 -0
- package/src/forge/agent-fabric/planning.ts +155 -0
- package/src/forge/agent-fabric/program-api.ts +37 -0
- package/src/forge/agent-fabric/program-contract.ts +283 -0
- package/src/forge/agent-fabric/program-dsl.ts +126 -0
- package/src/forge/agent-fabric/program-evidence.ts +22 -0
- package/src/forge/agent-fabric/program-image.ts +15 -0
- package/src/forge/agent-fabric/program-lock.ts +50 -0
- package/src/forge/agent-fabric/program-owner.ts +16 -0
- package/src/forge/agent-fabric/program-scheduler.ts +38 -0
- package/src/forge/agent-fabric/program-service.ts +793 -0
- package/src/forge/agent-fabric/program-store.ts +142 -0
- package/src/forge/agent-fabric/program-structure.ts +65 -0
- package/src/forge/agent-fabric/program-types.ts +110 -0
- package/src/forge/agent-fabric/program-view.ts +12 -0
- package/src/forge/agent-fabric/program-worker.ts +108 -0
- package/src/forge/agent-fabric/project-profile.ts +50 -0
- package/src/forge/agent-fabric/project-registry.ts +120 -0
- package/src/forge/agent-fabric/project-runtime.ts +85 -0
- package/src/forge/agent-fabric/readiness.ts +26 -0
- package/src/forge/agent-fabric/reducer.ts +863 -0
- package/src/forge/agent-fabric/repository-context.ts +83 -0
- package/src/forge/agent-fabric/resource-ledger.ts +266 -0
- package/src/forge/agent-fabric/serialized-local-adapter.ts +60 -0
- package/src/forge/agent-fabric/types.ts +424 -0
- package/src/forge/agent-fabric/validation.ts +500 -0
- package/src/forge/agent-fabric/workflow-engine.ts +218 -0
- package/src/forge/agent-fabric/workflow-task-actions.ts +104 -0
- package/src/forge/agent-fabric/workflow-templates.ts +11 -0
- package/src/forge/agent-memory/bridge.ts +1728 -0
- package/src/forge/agent-memory/context-pack.ts +284 -0
- package/src/forge/agent-memory/hook-runner.ts +331 -0
- package/src/forge/agent-memory/mcp.ts +597 -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 +343 -0
- package/src/forge/agent-memory/sources/codex.ts +161 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +215 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +896 -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 +118 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +255 -0
- package/src/forge/cli/adaptive.ts +51 -0
- package/src/forge/cli/ai.ts +16 -1
- package/src/forge/cli/auth.ts +459 -15
- 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 +418 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1859 -20
- package/src/forge/cli/db.ts +209 -2
- package/src/forge/cli/deploy.ts +1339 -0
- package/src/forge/cli/deps.ts +150 -23
- package/src/forge/cli/dev.ts +1137 -53
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/doctor.ts +297 -0
- package/src/forge/cli/env-placeholders.ts +62 -0
- package/src/forge/cli/evolution.ts +40 -0
- package/src/forge/cli/fabric.ts +253 -0
- package/src/forge/cli/field-test.ts +568 -0
- package/src/forge/cli/golden-path.ts +487 -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 +196 -3
- package/src/forge/cli/new.ts +169 -17
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +398 -6
- package/src/forge/cli/parse.ts +1377 -38
- 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/repository.ts +151 -0
- package/src/forge/cli/run.ts +42 -0
- package/src/forge/cli/secrets.ts +137 -1
- package/src/forge/cli/seed.ts +581 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2282 -0
- package/src/forge/cli/verify.ts +1458 -32
- package/src/forge/cli/windows.ts +23 -0
- package/src/forge/cli/workos.ts +3509 -0
- package/src/forge/compiler/agent-contract/build.ts +728 -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/tsconfig-hash.ts +41 -4
- 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/build.ts +29 -1
- 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 +38 -0
- package/src/forge/compiler/diagnostics/create.ts +28 -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 +217 -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 +991 -33
- 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 +1439 -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 +249 -10
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +101 -33
- 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-graph/dts-extractor.ts +14 -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/profiles.ts +81 -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 +76 -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/broker-runner.mjs +5 -0
- package/src/forge/delta/broker.ts +429 -0
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +238 -0
- package/src/forge/delta/git-observer.ts +67 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +25 -0
- package/src/forge/delta/process-identity.ts +37 -0
- package/src/forge/delta/queue-status.ts +190 -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 +1139 -0
- package/src/forge/delta/store.ts +3329 -0
- package/src/forge/delta/timeline.ts +178 -0
- package/src/forge/dev/server.ts +1061 -22
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +285 -33
- package/src/forge/dev-console/types.ts +47 -1
- package/src/forge/impact/index.ts +222 -30
- 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 +42 -6
- package/src/forge/make/templates.ts +211 -4
- 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/repository-analysis/adapters/common.ts +72 -0
- package/src/forge/repository-analysis/adapters/docker.ts +185 -0
- package/src/forge/repository-analysis/adapters/java.ts +133 -0
- package/src/forge/repository-analysis/adapters/typescript.ts +350 -0
- package/src/forge/repository-analysis/adapters/vue.ts +71 -0
- package/src/forge/repository-analysis/analyze.ts +434 -0
- package/src/forge/repository-analysis/benchmark.ts +336 -0
- package/src/forge/repository-analysis/cache-gc.ts +154 -0
- package/src/forge/repository-analysis/check-selection.ts +123 -0
- package/src/forge/repository-analysis/context-node.ts +17 -0
- package/src/forge/repository-analysis/context.ts +456 -0
- package/src/forge/repository-analysis/http-resolution.ts +135 -0
- package/src/forge/repository-analysis/identity.ts +45 -0
- package/src/forge/repository-analysis/index.ts +18 -0
- package/src/forge/repository-analysis/nuxt-resolution.ts +188 -0
- package/src/forge/repository-analysis/quality.ts +60 -0
- package/src/forge/repository-analysis/retrieval.ts +309 -0
- package/src/forge/repository-analysis/runtime-artifacts.ts +195 -0
- package/src/forge/repository-analysis/runtime-observation.ts +325 -0
- package/src/forge/repository-analysis/scanner.ts +174 -0
- package/src/forge/repository-analysis/storage.ts +193 -0
- package/src/forge/repository-analysis/test-associations.ts +59 -0
- package/src/forge/repository-analysis/types.ts +99 -0
- package/src/forge/repository-manifest/index.ts +178 -0
- package/src/forge/repository-manifest/types.ts +63 -0
- package/src/forge/review/index.ts +162 -12
- package/src/forge/review/types.ts +15 -0
- package/src/forge/runtime/ai/providers.ts +19 -4
- 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 +285 -2
- package/src/forge/runtime/executor.ts +129 -16
- package/src/forge/runtime/external/bridge.ts +663 -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 +71 -7
- package/src/forge/ui/index.ts +831 -19
- package/src/forge/ui/types.ts +3 -1
- 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 +292 -0
- package/src/forge/workspace/forge-cli.ts +42 -0
- package/src/forge/workspace/git-summary.ts +393 -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 +34 -0
- package/templates/agent-workroom/pnpm-workspace.yaml +2 -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 +13 -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 +20 -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/agent-workroom/web/vite.config.ts +36 -0
- package/templates/b2b-support-web/package.json +2 -0
- package/templates/b2b-support-web/pnpm-workspace.yaml +2 -0
- package/templates/b2b-support-web/web/app/page.tsx +2 -2
- package/templates/b2b-support-web/web/lib/forge.ts +9 -2
- package/templates/b2b-support-web/web/next.config.ts +24 -0
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/pnpm-workspace.yaml +2 -0
- package/templates/minimal-web/web/index.html +1 -0
- package/templates/minimal-web/web/src/App.tsx +12 -6
- package/templates/minimal-web/web/src/lib/forge.ts +9 -2
- package/templates/minimal-web/web/src/styles.css +34 -0
- package/templates/minimal-web/web/vite.config.ts +36 -0
- package/templates/nuxt-web/.vscode/settings.json +14 -0
- package/templates/nuxt-web/.yarnrc.yml +1 -0
- package/templates/nuxt-web/README.md +30 -0
- package/templates/nuxt-web/forge.config.ts +3 -0
- package/templates/nuxt-web/package.json +37 -0
- package/templates/nuxt-web/pnpm-workspace.yaml +2 -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 +22 -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/templates/vendor-access/.vscode/settings.json +14 -0
- package/templates/vendor-access/README.md +30 -0
- package/templates/vendor-access/forge.config.ts +3 -0
- package/templates/vendor-access/package.json +35 -0
- package/templates/vendor-access/pnpm-workspace.yaml +2 -0
- package/templates/vendor-access/src/commands/addEvidence.ts +42 -0
- package/templates/vendor-access/src/commands/approveAccessRequest.ts +43 -0
- package/templates/vendor-access/src/commands/createAccessRequest.ts +49 -0
- package/templates/vendor-access/src/commands/seedVendorAccessDemo.ts +200 -0
- package/templates/vendor-access/src/forge/schema.ts +74 -0
- package/templates/vendor-access/src/policies.ts +11 -0
- package/templates/vendor-access/src/queries/listVendorAccessDashboard.ts +24 -0
- package/templates/vendor-access/src/queries/liveVendorAccessDashboard.ts +24 -0
- package/templates/vendor-access/tsconfig.json +17 -0
- package/templates/vendor-access/web/index.html +13 -0
- package/templates/vendor-access/web/package.json +21 -0
- package/templates/vendor-access/web/src/App.tsx +573 -0
- package/templates/vendor-access/web/src/lib/forge.ts +20 -0
- package/templates/vendor-access/web/src/main.tsx +205 -0
- package/templates/vendor-access/web/src/styles.css +682 -0
- package/templates/vendor-access/web/tsconfig.json +18 -0
- package/templates/vendor-access/web/vite.config.ts +36 -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 -14937
- 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 -3452
- 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,12 +21,20 @@ 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,
|
|
27
34
|
renderSchemaTable,
|
|
28
35
|
renderUpdateCommand,
|
|
29
36
|
renderViteApp,
|
|
37
|
+
renderViteConfig,
|
|
30
38
|
renderViteIndex,
|
|
31
39
|
renderViteMain,
|
|
32
40
|
renderVitePackage,
|
|
@@ -107,7 +115,7 @@ const EXPLANATIONS: Record<MakeIntent["kind"], string> = {
|
|
|
107
115
|
page:
|
|
108
116
|
"Adds a minimal app page under web/app/<route>/page.tsx.",
|
|
109
117
|
ui:
|
|
110
|
-
"Adds a minimal Vite React web app with
|
|
118
|
+
"Adds a minimal Vite React or Nuxt Vue web app with generated Forge client bindings.",
|
|
111
119
|
"ai-chat":
|
|
112
120
|
"Adds a Forge AI agent definition and a React chat component that calls the Forge /ai/agents/run runtime endpoint.",
|
|
113
121
|
resource:
|
|
@@ -193,6 +201,13 @@ function chooseSchemaFile(workspaceRoot: string): string {
|
|
|
193
201
|
return "src/forge/schema.ts";
|
|
194
202
|
}
|
|
195
203
|
|
|
204
|
+
function schemaHasTenantsTable(workspaceRoot: string): boolean {
|
|
205
|
+
const schema = readIfExists(workspaceRoot, chooseSchemaFile(workspaceRoot)) ?? "";
|
|
206
|
+
return schema.includes('name: "tenants"') ||
|
|
207
|
+
schema.includes("name: 'tenants'") ||
|
|
208
|
+
/\btenants\s*=\s*(?:defineTable|table)\s*\(/.test(schema);
|
|
209
|
+
}
|
|
210
|
+
|
|
196
211
|
function choosePolicyFile(workspaceRoot: string): string {
|
|
197
212
|
if (fileExists(workspaceRoot, "src/policies.ts")) {
|
|
198
213
|
return "src/policies.ts";
|
|
@@ -461,9 +476,14 @@ function parseFieldOptions(options: MakeCommandOptions): {
|
|
|
461
476
|
field?: MakeFieldSpec;
|
|
462
477
|
diagnostics: Diagnostic[];
|
|
463
478
|
} {
|
|
479
|
+
const fieldSpecs = options.fieldSpecs.map((fieldSpec) =>
|
|
480
|
+
options.values && /^[a-zA-Z][a-zA-Z0-9_]*:enum(?::|$)/.test(fieldSpec)
|
|
481
|
+
? fieldSpec.replace(":enum", `:enum(${options.values})`)
|
|
482
|
+
: fieldSpec,
|
|
483
|
+
);
|
|
464
484
|
const rawFields = [
|
|
465
485
|
...(options.fieldsRaw ? [options.fieldsRaw] : []),
|
|
466
|
-
...
|
|
486
|
+
...fieldSpecs,
|
|
467
487
|
];
|
|
468
488
|
const parsed = parseFields(rawFields);
|
|
469
489
|
const diagnostics = [...parsed.diagnostics];
|
|
@@ -513,7 +533,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
513
533
|
const kind = options.primitive as MakeIntent["kind"];
|
|
514
534
|
const fieldOptions = parseFieldOptions(options);
|
|
515
535
|
const diagnostics = [...fieldOptions.diagnostics];
|
|
516
|
-
if (options.framework && !["vite", "next"].includes(options.framework)) {
|
|
536
|
+
if (options.framework && !["vite", "next", "nuxt"].includes(options.framework)) {
|
|
517
537
|
diagnostics.push(
|
|
518
538
|
diagnostic("error", "FORGE_MAKE_PATCH_UNSAFE", `unsupported frontend framework '${options.framework}'`),
|
|
519
539
|
);
|
|
@@ -523,7 +543,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
523
543
|
diagnostic(
|
|
524
544
|
"warning",
|
|
525
545
|
"FORGE_MAKE_UI_FRAMEWORK_EXPERIMENTAL",
|
|
526
|
-
"forge make ui currently generates
|
|
546
|
+
"forge make ui currently generates Vite React and Nuxt Vue bridges; Next support should use the b2b-support-web template",
|
|
527
547
|
),
|
|
528
548
|
);
|
|
529
549
|
}
|
|
@@ -544,6 +564,8 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
544
564
|
kind === "command"
|
|
545
565
|
? actionName?.replace(/^(create|update|delete)/, "") || "create"
|
|
546
566
|
: "read";
|
|
567
|
+
const tenantScoped =
|
|
568
|
+
options.tenantScoped || (kind === "resource" && schemaHasTenantsTable(options.workspaceRoot));
|
|
547
569
|
|
|
548
570
|
return {
|
|
549
571
|
diagnostics,
|
|
@@ -553,7 +575,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
553
575
|
table,
|
|
554
576
|
field: fieldOptions.field,
|
|
555
577
|
fields,
|
|
556
|
-
tenantScoped
|
|
578
|
+
tenantScoped,
|
|
557
579
|
crud: options.withCrud || kind === "resource",
|
|
558
580
|
liveQuery: options.withLiveQuery || kind === "resource" || kind === "livequery",
|
|
559
581
|
react:
|
|
@@ -574,6 +596,7 @@ function buildIntent(options: MakeCommandOptions): {
|
|
|
574
596
|
trigger: options.trigger ?? options.event ?? (table ? `${singular}.created` : undefined),
|
|
575
597
|
component: options.component,
|
|
576
598
|
route: options.name ? kebabCase(options.name) : undefined,
|
|
599
|
+
framework: options.framework,
|
|
577
600
|
withAi: options.withAi || kind === "ai-chat",
|
|
578
601
|
withCreateForm: options.withCreateForm || kind === "resource",
|
|
579
602
|
},
|
|
@@ -794,9 +817,22 @@ function addFrontendFiles(plan: MakePlan, workspaceRoot: string, intent: MakeInt
|
|
|
794
817
|
return;
|
|
795
818
|
}
|
|
796
819
|
if (intent.kind === "ui") {
|
|
820
|
+
if (intent.framework === "nuxt") {
|
|
821
|
+
plan.filesToCreate.push(
|
|
822
|
+
createFile(workspaceRoot, "web/package.json", "Add Nuxt web package", renderNuxtPackage(intent.name)),
|
|
823
|
+
createFile(workspaceRoot, "web/nuxt.config.ts", "Add Nuxt runtime config", renderNuxtConfig()),
|
|
824
|
+
createFile(workspaceRoot, "web/tsconfig.json", "Add Nuxt TypeScript config", renderNuxtTsconfig()),
|
|
825
|
+
createFile(workspaceRoot, "web/composables/forge.ts", "Add Forge Vue composable bridge", renderNuxtForgeComposable()),
|
|
826
|
+
createFile(workspaceRoot, "web/plugins/forge.ts", "Add Forge Nuxt plugin", renderNuxtForgePlugin()),
|
|
827
|
+
createFile(workspaceRoot, "web/app.vue", "Add Nuxt app shell", renderNuxtApp()),
|
|
828
|
+
createFile(workspaceRoot, "web/components/ForgeStatus.vue", "Add Forge status component", renderNuxtStatusComponent()),
|
|
829
|
+
);
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
797
832
|
plan.filesToCreate.push(
|
|
798
833
|
createFile(workspaceRoot, "web/package.json", "Add Vite React web package", renderVitePackage(intent.name)),
|
|
799
834
|
createFile(workspaceRoot, "web/tsconfig.json", "Add web TypeScript config", renderViteTsconfig()),
|
|
835
|
+
createFile(workspaceRoot, "web/vite.config.ts", "Add Vite Forge API proxy", renderViteConfig()),
|
|
800
836
|
createFile(workspaceRoot, "web/index.html", "Add web HTML entry", renderViteIndex("ForgeOS App")),
|
|
801
837
|
createFile(workspaceRoot, "web/src/lib/forge.ts", "Add Forge client bridge", renderWebBridge()),
|
|
802
838
|
createFile(workspaceRoot, "web/src/main.tsx", "Add React entrypoint", renderViteMain()),
|
|
@@ -878,7 +914,7 @@ function buildPlan(options: MakeCommandOptions): MakePlan {
|
|
|
878
914
|
kind: "resource" as const,
|
|
879
915
|
name: options.name ?? "resource",
|
|
880
916
|
fields: [],
|
|
881
|
-
tenantScoped:
|
|
917
|
+
tenantScoped: false,
|
|
882
918
|
crud: true,
|
|
883
919
|
liveQuery: true,
|
|
884
920
|
react: true,
|
|
@@ -512,8 +512,14 @@ export default function ${pascal}AiPage() {
|
|
|
512
512
|
}
|
|
513
513
|
|
|
514
514
|
export function renderWebBridge(): string {
|
|
515
|
-
return `
|
|
516
|
-
|
|
515
|
+
return `const configuredForgeUrl = import.meta.env.VITE_FORGE_URL as string | undefined;
|
|
516
|
+
const useSameOrigin =
|
|
517
|
+
typeof window !== "undefined" &&
|
|
518
|
+
(!configuredForgeUrl ||
|
|
519
|
+
configuredForgeUrl.includes("127.0.0.1") ||
|
|
520
|
+
configuredForgeUrl.includes("localhost"));
|
|
521
|
+
|
|
522
|
+
export const forgeUrl = useSameOrigin ? "" : (configuredForgeUrl ?? "");
|
|
517
523
|
|
|
518
524
|
export { api } from "../../../src/forge/_generated/api";
|
|
519
525
|
export { createForgeClient, ForgeError } from "../../../src/forge/_generated/client";
|
|
@@ -521,6 +527,7 @@ export {
|
|
|
521
527
|
ForgeProvider,
|
|
522
528
|
useAuth,
|
|
523
529
|
useCommand,
|
|
530
|
+
useCommandResult,
|
|
524
531
|
useForgeClient,
|
|
525
532
|
useLiveQuery,
|
|
526
533
|
useQuery,
|
|
@@ -529,8 +536,14 @@ export {
|
|
|
529
536
|
}
|
|
530
537
|
|
|
531
538
|
export function renderWebRootBridge(): string {
|
|
532
|
-
return `
|
|
533
|
-
|
|
539
|
+
return `const configuredForgeUrl = process.env.NEXT_PUBLIC_FORGE_URL;
|
|
540
|
+
const useSameOrigin =
|
|
541
|
+
typeof window !== "undefined" &&
|
|
542
|
+
(!configuredForgeUrl ||
|
|
543
|
+
configuredForgeUrl.includes("127.0.0.1") ||
|
|
544
|
+
configuredForgeUrl.includes("localhost"));
|
|
545
|
+
|
|
546
|
+
export const forgeUrl = useSameOrigin ? "" : (configuredForgeUrl ?? "");
|
|
534
547
|
|
|
535
548
|
export { api } from "../../src/forge/_generated/api";
|
|
536
549
|
export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
|
|
@@ -538,6 +551,7 @@ export {
|
|
|
538
551
|
ForgeProvider,
|
|
539
552
|
useAuth,
|
|
540
553
|
useCommand,
|
|
554
|
+
useCommandResult,
|
|
541
555
|
useForgeClient,
|
|
542
556
|
useLiveQuery,
|
|
543
557
|
useQuery,
|
|
@@ -562,6 +576,46 @@ createRoot(document.getElementById("root")!).render(
|
|
|
562
576
|
`;
|
|
563
577
|
}
|
|
564
578
|
|
|
579
|
+
export function renderViteConfig(): string {
|
|
580
|
+
return `import react from "@vitejs/plugin-react";
|
|
581
|
+
import { defineConfig } from "vite";
|
|
582
|
+
|
|
583
|
+
const forgeApiUrl = process.env.VITE_FORGE_URL ?? "http://127.0.0.1:3765";
|
|
584
|
+
|
|
585
|
+
const forgeProxyPaths = [
|
|
586
|
+
"/.well-known",
|
|
587
|
+
"/ai",
|
|
588
|
+
"/auth.md",
|
|
589
|
+
"/callback",
|
|
590
|
+
"/commands",
|
|
591
|
+
"/entries",
|
|
592
|
+
"/external",
|
|
593
|
+
"/health",
|
|
594
|
+
"/live",
|
|
595
|
+
"/login",
|
|
596
|
+
"/logout",
|
|
597
|
+
"/session",
|
|
598
|
+
"/queries",
|
|
599
|
+
"/webhooks",
|
|
600
|
+
];
|
|
601
|
+
|
|
602
|
+
export default defineConfig({
|
|
603
|
+
plugins: [react()],
|
|
604
|
+
server: {
|
|
605
|
+
proxy: Object.fromEntries(
|
|
606
|
+
forgeProxyPaths.map((path) => [
|
|
607
|
+
path,
|
|
608
|
+
{
|
|
609
|
+
target: forgeApiUrl,
|
|
610
|
+
changeOrigin: true,
|
|
611
|
+
},
|
|
612
|
+
]),
|
|
613
|
+
),
|
|
614
|
+
},
|
|
615
|
+
});
|
|
616
|
+
`;
|
|
617
|
+
}
|
|
618
|
+
|
|
565
619
|
export function renderViteApp(): string {
|
|
566
620
|
return `export function App() {
|
|
567
621
|
return (
|
|
@@ -652,6 +706,159 @@ export function renderVitePackage(appName: string): string {
|
|
|
652
706
|
`;
|
|
653
707
|
}
|
|
654
708
|
|
|
709
|
+
export function renderNuxtPackage(appName: string): string {
|
|
710
|
+
return `{
|
|
711
|
+
"name": "${kebabCase(appName)}-web",
|
|
712
|
+
"private": true,
|
|
713
|
+
"type": "module",
|
|
714
|
+
"scripts": {
|
|
715
|
+
"dev": "nuxt dev --host 127.0.0.1",
|
|
716
|
+
"build": "nuxt build",
|
|
717
|
+
"typecheck": "nuxt typecheck"
|
|
718
|
+
},
|
|
719
|
+
"dependencies": {
|
|
720
|
+
"nuxt": "^4.0.0",
|
|
721
|
+
"vue": "^3.5.38"
|
|
722
|
+
},
|
|
723
|
+
"devDependencies": {
|
|
724
|
+
"typescript": "^5.7.3"
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
`;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
export function renderNuxtConfig(): string {
|
|
731
|
+
return `export default defineNuxtConfig({
|
|
732
|
+
compatibilityDate: "2026-06-18",
|
|
733
|
+
runtimeConfig: {
|
|
734
|
+
public: {
|
|
735
|
+
forgeUrl: process.env.NUXT_PUBLIC_FORGE_URL ?? "http://127.0.0.1:3765",
|
|
736
|
+
},
|
|
737
|
+
},
|
|
738
|
+
typescript: {
|
|
739
|
+
strict: true,
|
|
740
|
+
},
|
|
741
|
+
});
|
|
742
|
+
`;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
export function renderNuxtTsconfig(): string {
|
|
746
|
+
return `{
|
|
747
|
+
"extends": "./.nuxt/tsconfig.json"
|
|
748
|
+
}
|
|
749
|
+
`;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
export function renderNuxtForgeComposable(): string {
|
|
753
|
+
return `export const forgeUrl = "http://127.0.0.1:3765";
|
|
754
|
+
|
|
755
|
+
export { api } from "../../src/forge/_generated/api";
|
|
756
|
+
export { createForgeClient, ForgeError } from "../../src/forge/_generated/client";
|
|
757
|
+
export {
|
|
758
|
+
ForgeVuePlugin,
|
|
759
|
+
provideForge,
|
|
760
|
+
useForgeAuth,
|
|
761
|
+
useForgeClient,
|
|
762
|
+
useForgeCommand,
|
|
763
|
+
useForgeLiveQuery,
|
|
764
|
+
useForgeQuery,
|
|
765
|
+
} from "../../src/forge/_generated/vue";
|
|
766
|
+
`;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
export function renderNuxtForgePlugin(): string {
|
|
770
|
+
return `import { ForgeVuePlugin } from "../composables/forge";
|
|
771
|
+
|
|
772
|
+
export default defineNuxtPlugin((nuxtApp) => {
|
|
773
|
+
const config = useRuntimeConfig();
|
|
774
|
+
|
|
775
|
+
nuxtApp.vueApp.use(ForgeVuePlugin, {
|
|
776
|
+
url: String(config.public.forgeUrl),
|
|
777
|
+
devAuth: true,
|
|
778
|
+
});
|
|
779
|
+
});
|
|
780
|
+
`;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
export function renderNuxtApp(): string {
|
|
784
|
+
return `<script setup lang="ts">
|
|
785
|
+
import ForgeStatus from "./components/ForgeStatus.vue";
|
|
786
|
+
</script>
|
|
787
|
+
|
|
788
|
+
<template>
|
|
789
|
+
<main class="shell">
|
|
790
|
+
<p class="eyebrow">ForgeOS Nuxt app</p>
|
|
791
|
+
<h1>Full-stack loop ready</h1>
|
|
792
|
+
<ForgeStatus />
|
|
793
|
+
</main>
|
|
794
|
+
</template>
|
|
795
|
+
|
|
796
|
+
<style scoped>
|
|
797
|
+
.shell {
|
|
798
|
+
width: min(760px, calc(100vw - 32px));
|
|
799
|
+
margin: 0 auto;
|
|
800
|
+
padding: 48px 0;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
.eyebrow {
|
|
804
|
+
color: #58655f;
|
|
805
|
+
font-size: 0.82rem;
|
|
806
|
+
font-weight: 800;
|
|
807
|
+
text-transform: uppercase;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
h1 {
|
|
811
|
+
margin: 0 0 12px;
|
|
812
|
+
color: #17211d;
|
|
813
|
+
font-size: 2.2rem;
|
|
814
|
+
}
|
|
815
|
+
</style>
|
|
816
|
+
`;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
export function renderNuxtStatusComponent(): string {
|
|
820
|
+
return `<script setup lang="ts">
|
|
821
|
+
import { computed } from "vue";
|
|
822
|
+
import { useForgeAuth } from "../composables/forge";
|
|
823
|
+
|
|
824
|
+
const auth = useForgeAuth();
|
|
825
|
+
const tenantLabel = computed(() => auth?.tenantId ?? "dev-tenant");
|
|
826
|
+
const roleLabel = computed(() => auth?.role ?? "owner");
|
|
827
|
+
</script>
|
|
828
|
+
|
|
829
|
+
<template>
|
|
830
|
+
<section class="status-panel">
|
|
831
|
+
<span class="status-dot" aria-hidden="true" />
|
|
832
|
+
<p>
|
|
833
|
+
Connected as <strong>{{ roleLabel }}</strong> on
|
|
834
|
+
<strong>{{ tenantLabel }}</strong>.
|
|
835
|
+
</p>
|
|
836
|
+
</section>
|
|
837
|
+
</template>
|
|
838
|
+
|
|
839
|
+
<style scoped>
|
|
840
|
+
.status-panel {
|
|
841
|
+
display: flex;
|
|
842
|
+
align-items: center;
|
|
843
|
+
gap: 10px;
|
|
844
|
+
margin-top: 24px;
|
|
845
|
+
color: #26332d;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
.status-dot {
|
|
849
|
+
width: 10px;
|
|
850
|
+
height: 10px;
|
|
851
|
+
border-radius: 999px;
|
|
852
|
+
background: #1f9d55;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
p {
|
|
856
|
+
margin: 0;
|
|
857
|
+
}
|
|
858
|
+
</style>
|
|
859
|
+
`;
|
|
860
|
+
}
|
|
861
|
+
|
|
655
862
|
export function renderNextAiPackage(appName: string): string {
|
|
656
863
|
return `{
|
|
657
864
|
"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.",
|