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
|
@@ -102,17 +102,138 @@ function readPackageJson(workspaceRoot: string): {
|
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
type DependencyType = "dependency" | "devDependency";
|
|
106
|
+
|
|
107
|
+
interface NpmAliasSpec {
|
|
108
|
+
packageName: string;
|
|
109
|
+
versionOrRange?: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface PackageResolution {
|
|
113
|
+
requestedName: string;
|
|
114
|
+
packageName: string;
|
|
115
|
+
dependencyName: string;
|
|
116
|
+
dependencySpec?: string;
|
|
117
|
+
dependencyType: DependencyType;
|
|
118
|
+
isNpmAlias: boolean;
|
|
119
|
+
current: PackageApi;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function matchesPackageName(candidate: PackageApi, packageName: string): boolean {
|
|
123
|
+
return candidate.name === packageName || candidate.packageName === packageName;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function parseNpmAliasSpec(spec: string): NpmAliasSpec | null {
|
|
127
|
+
if (!spec.startsWith("npm:")) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const target = spec.slice("npm:".length);
|
|
131
|
+
if (!target) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const separator =
|
|
135
|
+
target.startsWith("@")
|
|
136
|
+
? target.indexOf("@", target.indexOf("/") + 1)
|
|
137
|
+
: target.indexOf("@");
|
|
138
|
+
if (separator === -1) {
|
|
139
|
+
return { packageName: target };
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
packageName: target.slice(0, separator),
|
|
143
|
+
versionOrRange: target.slice(separator + 1),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function dependencyEntries(
|
|
148
|
+
pkg: ReturnType<typeof readPackageJson>,
|
|
149
|
+
): Array<{ type: DependencyType; name: string; spec: string }> {
|
|
150
|
+
return [
|
|
151
|
+
...Object.entries(pkg.dependencies ?? {}).map(([name, spec]) => ({
|
|
152
|
+
type: "dependency" as const,
|
|
153
|
+
name,
|
|
154
|
+
spec,
|
|
155
|
+
})),
|
|
156
|
+
...Object.entries(pkg.devDependencies ?? {}).map(([name, spec]) => ({
|
|
157
|
+
type: "devDependency" as const,
|
|
158
|
+
name,
|
|
159
|
+
spec,
|
|
160
|
+
})),
|
|
161
|
+
];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function dependencyType(workspaceRoot: string, packageName: string): DependencyType {
|
|
106
165
|
const pkg = readPackageJson(workspaceRoot);
|
|
107
166
|
if (packageName in (pkg.devDependencies ?? {})) {
|
|
108
167
|
return "devDependency";
|
|
109
168
|
}
|
|
169
|
+
for (const entry of dependencyEntries(pkg)) {
|
|
170
|
+
const alias = parseNpmAliasSpec(entry.spec);
|
|
171
|
+
if (alias?.packageName === packageName) {
|
|
172
|
+
return entry.type;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
110
175
|
return "dependency";
|
|
111
176
|
}
|
|
112
177
|
|
|
113
|
-
function
|
|
178
|
+
function resolvePackageForUpgrade(workspaceRoot: string, requestedName: string): PackageResolution | null {
|
|
114
179
|
const graph = readGeneratedJson<PackageGraph>(workspaceRoot, `${GENERATED_DIR}/packageGraph.json`);
|
|
115
|
-
|
|
180
|
+
if (!graph) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
const pkg = readPackageJson(workspaceRoot);
|
|
184
|
+
const entries = dependencyEntries(pkg);
|
|
185
|
+
|
|
186
|
+
const aliasEntry = entries.find((entry) => {
|
|
187
|
+
const alias = parseNpmAliasSpec(entry.spec);
|
|
188
|
+
return entry.name === requestedName || alias?.packageName === requestedName;
|
|
189
|
+
});
|
|
190
|
+
if (aliasEntry) {
|
|
191
|
+
const alias = parseNpmAliasSpec(aliasEntry.spec);
|
|
192
|
+
const packageName = alias?.packageName ?? aliasEntry.name;
|
|
193
|
+
const current = graph.packages.find((candidate) => matchesPackageName(candidate, packageName)) ??
|
|
194
|
+
graph.packages.find((candidate) => candidate.name === aliasEntry.name);
|
|
195
|
+
if (current) {
|
|
196
|
+
return {
|
|
197
|
+
requestedName,
|
|
198
|
+
packageName,
|
|
199
|
+
dependencyName: aliasEntry.name,
|
|
200
|
+
dependencySpec: aliasEntry.spec,
|
|
201
|
+
dependencyType: aliasEntry.type,
|
|
202
|
+
isNpmAlias: Boolean(alias),
|
|
203
|
+
current,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const current = graph.packages.find((candidate) => matchesPackageName(candidate, requestedName));
|
|
209
|
+
if (!current) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const directEntry = entries.find((entry) => {
|
|
213
|
+
const alias = parseNpmAliasSpec(entry.spec);
|
|
214
|
+
return entry.name === requestedName || alias?.packageName === requestedName;
|
|
215
|
+
});
|
|
216
|
+
const alias = directEntry ? parseNpmAliasSpec(directEntry.spec) : null;
|
|
217
|
+
const packageName = alias?.packageName ?? current.packageName ?? requestedName;
|
|
218
|
+
return {
|
|
219
|
+
requestedName,
|
|
220
|
+
packageName,
|
|
221
|
+
dependencyName: directEntry?.name ?? requestedName,
|
|
222
|
+
dependencySpec: directEntry?.spec,
|
|
223
|
+
dependencyType: directEntry?.type ?? dependencyType(workspaceRoot, requestedName),
|
|
224
|
+
isNpmAlias: Boolean(alias),
|
|
225
|
+
current,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function packageSpecForDependency(
|
|
230
|
+
resolution: Pick<PackageResolution, "packageName" | "dependencyName" | "isNpmAlias">,
|
|
231
|
+
version: string,
|
|
232
|
+
): string {
|
|
233
|
+
if (resolution.isNpmAlias) {
|
|
234
|
+
return `${resolution.dependencyName}@npm:${resolution.packageName}@${version}`;
|
|
235
|
+
}
|
|
236
|
+
return `${resolution.packageName}@${version}`;
|
|
116
237
|
}
|
|
117
238
|
|
|
118
239
|
function fixtureMetadata(registryDir: string | undefined, packageName: string): {
|
|
@@ -348,9 +469,9 @@ export async function createUpgradePlan(
|
|
|
348
469
|
): Promise<UpgradePlannerResult> {
|
|
349
470
|
const diagnostics: Diagnostic[] = [];
|
|
350
471
|
const packageManager = detectPackageManager(options.workspaceRoot);
|
|
351
|
-
const
|
|
472
|
+
const resolution = resolvePackageForUpgrade(options.workspaceRoot, options.packageName);
|
|
352
473
|
|
|
353
|
-
if (!
|
|
474
|
+
if (!resolution) {
|
|
354
475
|
return {
|
|
355
476
|
ok: false,
|
|
356
477
|
diagnostics: [
|
|
@@ -363,10 +484,11 @@ export async function createUpgradePlan(
|
|
|
363
484
|
exitCode: 1,
|
|
364
485
|
};
|
|
365
486
|
}
|
|
487
|
+
const current = resolution.current;
|
|
366
488
|
|
|
367
489
|
const targetInfo = await resolveTargetVersion({
|
|
368
490
|
workspaceRoot: options.workspaceRoot,
|
|
369
|
-
packageName:
|
|
491
|
+
packageName: resolution.packageName,
|
|
370
492
|
currentVersion: current.version,
|
|
371
493
|
target: options.target,
|
|
372
494
|
registryDir: options.registryDir ?? process.env.FORGE_DEPS_REGISTRY_DIR,
|
|
@@ -388,7 +510,7 @@ export async function createUpgradePlan(
|
|
|
388
510
|
|
|
389
511
|
const analyzed = await analyzeTargetPackage({
|
|
390
512
|
workspaceRoot: options.workspaceRoot,
|
|
391
|
-
packageName:
|
|
513
|
+
packageName: resolution.packageName,
|
|
392
514
|
versionInfo: targetInfo,
|
|
393
515
|
packageManager,
|
|
394
516
|
registryDir: options.registryDir ?? process.env.FORGE_DEPS_REGISTRY_DIR,
|
|
@@ -398,7 +520,7 @@ export async function createUpgradePlan(
|
|
|
398
520
|
return { ok: false, diagnostics, exitCode: 1 };
|
|
399
521
|
}
|
|
400
522
|
|
|
401
|
-
const recipe = resolveByPackageName(
|
|
523
|
+
const recipe = resolveByPackageName(resolution.packageName) ?? undefined;
|
|
402
524
|
const currentClassified = { api: current, classification: classify(current, recipe), recipe };
|
|
403
525
|
const targetClassified = {
|
|
404
526
|
api: analyzed.api,
|
|
@@ -425,7 +547,7 @@ export async function createUpgradePlan(
|
|
|
425
547
|
}
|
|
426
548
|
|
|
427
549
|
const affected = analyzeUpgradeImpact({
|
|
428
|
-
packageName:
|
|
550
|
+
packageName: resolution.packageName,
|
|
429
551
|
appGraph,
|
|
430
552
|
runtimeGraph,
|
|
431
553
|
queryRegistry,
|
|
@@ -436,21 +558,35 @@ export async function createUpgradePlan(
|
|
|
436
558
|
const bump = semverBump(current.version, analyzed.api.version);
|
|
437
559
|
const risk = buildRiskReport({ bump, apiDiff, runtimeDiff, affected });
|
|
438
560
|
const commands = recommendedCommands(affected);
|
|
561
|
+
const toInfo = {
|
|
562
|
+
...targetInfo,
|
|
563
|
+
version: analyzed.api.version,
|
|
564
|
+
spec: packageSpecForDependency(resolution, analyzed.api.version),
|
|
565
|
+
};
|
|
439
566
|
const planDir = packagePlanDir(
|
|
440
567
|
options.workspaceRoot,
|
|
441
|
-
|
|
568
|
+
resolution.dependencyName,
|
|
442
569
|
current.version,
|
|
443
570
|
analyzed.api.version,
|
|
444
571
|
);
|
|
445
|
-
const id = `${packageKey(
|
|
572
|
+
const id = `${packageKey(resolution.dependencyName)}-${current.version}-to-${analyzed.api.version}`;
|
|
446
573
|
const plan: PackageUpgradePlan = {
|
|
447
574
|
schemaVersion: "0.1.0",
|
|
448
575
|
plannerVersion: GENERATOR_VERSION,
|
|
449
576
|
id,
|
|
450
|
-
packageName:
|
|
577
|
+
packageName: resolution.packageName,
|
|
578
|
+
...(resolution.requestedName !== resolution.packageName
|
|
579
|
+
? { requestedPackageName: resolution.requestedName }
|
|
580
|
+
: {}),
|
|
581
|
+
...(resolution.isNpmAlias ? { dependencyAlias: resolution.dependencyName } : {}),
|
|
451
582
|
...(recipe?.alias ? { integrationAlias: recipe.alias } : {}),
|
|
452
|
-
from: {
|
|
453
|
-
|
|
583
|
+
from: {
|
|
584
|
+
version: current.version,
|
|
585
|
+
spec: resolution.isNpmAlias
|
|
586
|
+
? packageSpecForDependency(resolution, current.version)
|
|
587
|
+
: `${resolution.packageName}@${current.version}`,
|
|
588
|
+
},
|
|
589
|
+
to: toInfo,
|
|
454
590
|
packageManager,
|
|
455
591
|
semver: {
|
|
456
592
|
bump,
|
|
@@ -512,18 +648,19 @@ export function listOutdatedFromFixture(options: {
|
|
|
512
648
|
|
|
513
649
|
return graph.packages
|
|
514
650
|
.flatMap((pkg) => {
|
|
515
|
-
const
|
|
651
|
+
const packageName = pkg.packageName ?? pkg.name;
|
|
652
|
+
const metadata = fixtureMetadata(registryDir, packageName);
|
|
516
653
|
const latest = metadata?.["dist-tags"]?.latest;
|
|
517
654
|
if (!latest || latest === pkg.version) {
|
|
518
655
|
return [];
|
|
519
656
|
}
|
|
520
|
-
const recipe = resolveByPackageName(
|
|
657
|
+
const recipe = resolveByPackageName(packageName);
|
|
521
658
|
return [{
|
|
522
|
-
name:
|
|
659
|
+
name: packageName,
|
|
523
660
|
current: pkg.version,
|
|
524
661
|
wanted: latest,
|
|
525
662
|
latest,
|
|
526
|
-
type: dependencyType(options.workspaceRoot,
|
|
663
|
+
type: dependencyType(options.workspaceRoot, packageName),
|
|
527
664
|
managedByRecipe: Boolean(recipe),
|
|
528
665
|
...(recipe?.alias ? { recipe: recipe.alias } : {}),
|
|
529
666
|
}];
|
|
@@ -146,6 +146,8 @@ export interface PackageUpgradePlan {
|
|
|
146
146
|
plannerVersion: string;
|
|
147
147
|
id: string;
|
|
148
148
|
packageName: string;
|
|
149
|
+
requestedPackageName?: string;
|
|
150
|
+
dependencyAlias?: string;
|
|
149
151
|
integrationAlias?: string;
|
|
150
152
|
from: PackageVersionInfo;
|
|
151
153
|
to: PackageVersionInfo;
|
|
@@ -11,6 +11,7 @@ import { hashStable } from "../primitives/hash.ts";
|
|
|
11
11
|
import { canonicalJson } from "../primitives/serialize.ts";
|
|
12
12
|
import type { AppGraph } from "../types/app-graph.ts";
|
|
13
13
|
import type { DataGraph } from "../types/data-graph.ts";
|
|
14
|
+
import type { ForgeExternalServiceGraph } from "../external-manifest/types.ts";
|
|
14
15
|
import type {
|
|
15
16
|
CommandAuthBinding,
|
|
16
17
|
PermissionMatrix,
|
|
@@ -56,15 +57,29 @@ function stableSortQueryAuth(bindings: QueryAuthBinding[]): QueryAuthBinding[] {
|
|
|
56
57
|
|
|
57
58
|
function buildPermissionMatrix(policies: PolicyRule[]): PermissionMatrixEntry[] {
|
|
58
59
|
return policies
|
|
59
|
-
.filter((policy) => policy.kind === "roles")
|
|
60
|
+
.filter((policy) => policy.kind === "roles" || policy.kind === "permissions")
|
|
60
61
|
.map((policy) => ({
|
|
61
62
|
policy: policy.name,
|
|
62
63
|
roles: [...policy.roles].sort(),
|
|
64
|
+
permissions: [...policy.permissions].sort(),
|
|
63
65
|
}))
|
|
64
66
|
.sort((a, b) => (a.policy < b.policy ? -1 : a.policy > b.policy ? 1 : 0));
|
|
65
67
|
}
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
function authFromExternalPolicy(policy: string | undefined): CommandAuthBinding["auth"] {
|
|
70
|
+
if (!policy) {
|
|
71
|
+
return { kind: "public" };
|
|
72
|
+
}
|
|
73
|
+
if (policy === "public" || policy === "system" || policy === "user") {
|
|
74
|
+
return { kind: policy };
|
|
75
|
+
}
|
|
76
|
+
return { kind: "policy", policy };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function buildPolicyRegistry(
|
|
80
|
+
appGraph: AppGraph,
|
|
81
|
+
externalServices?: ForgeExternalServiceGraph,
|
|
82
|
+
): PolicyRegistry {
|
|
68
83
|
const policies: PolicyRule[] = [];
|
|
69
84
|
const commandAuth: CommandAuthBinding[] = [];
|
|
70
85
|
const queryAuth: QueryAuthBinding[] = [];
|
|
@@ -84,6 +99,7 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
|
|
|
84
99
|
name: parsed.name,
|
|
85
100
|
kind: parsed.kind,
|
|
86
101
|
roles: parsed.roles,
|
|
102
|
+
permissions: parsed.permissions,
|
|
87
103
|
file: symbol.file,
|
|
88
104
|
symbolId: symbol.id,
|
|
89
105
|
};
|
|
@@ -152,6 +168,28 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
|
|
|
152
168
|
}
|
|
153
169
|
}
|
|
154
170
|
|
|
171
|
+
for (const service of externalServices?.services ?? []) {
|
|
172
|
+
for (const entry of service.entries) {
|
|
173
|
+
const qualifiedName = `${service.name}.${entry.name}`;
|
|
174
|
+
const binding = {
|
|
175
|
+
file: `external:${service.name}`,
|
|
176
|
+
symbolId: `external:${service.name}:${entry.kind}:${entry.name}`,
|
|
177
|
+
auth: authFromExternalPolicy(entry.policy),
|
|
178
|
+
};
|
|
179
|
+
if (entry.kind === "command") {
|
|
180
|
+
commandAuth.push({
|
|
181
|
+
commandName: qualifiedName,
|
|
182
|
+
...binding,
|
|
183
|
+
});
|
|
184
|
+
} else {
|
|
185
|
+
queryAuth.push({
|
|
186
|
+
queryName: qualifiedName,
|
|
187
|
+
...binding,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
155
193
|
const sortedPolicies = stableSortPolicies(policies);
|
|
156
194
|
const sortedCommandAuth = stableSortCommandAuth(commandAuth);
|
|
157
195
|
const sortedQueryAuth = stableSortQueryAuth(queryAuth);
|
|
@@ -167,6 +205,9 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
|
|
|
167
205
|
code: FORGE_POLICY_UNKNOWN,
|
|
168
206
|
message: `command '${binding.commandName}' references unknown policy '${binding.auth.policy}'`,
|
|
169
207
|
file: binding.file,
|
|
208
|
+
fixHint: binding.file.startsWith("external:")
|
|
209
|
+
? "Define this policy in the Forge app or change the external manifest policy to public, user, or system."
|
|
210
|
+
: undefined,
|
|
170
211
|
}),
|
|
171
212
|
);
|
|
172
213
|
}
|
|
@@ -183,6 +224,9 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
|
|
|
183
224
|
code: FORGE_POLICY_UNKNOWN,
|
|
184
225
|
message: `query '${binding.queryName}' references unknown policy '${binding.auth.policy}'`,
|
|
185
226
|
file: binding.file,
|
|
227
|
+
fixHint: binding.file.startsWith("external:")
|
|
228
|
+
? "Define this policy in the Forge app or change the external manifest policy to public, user, or system."
|
|
229
|
+
: undefined,
|
|
186
230
|
}),
|
|
187
231
|
);
|
|
188
232
|
}
|
|
@@ -195,6 +239,7 @@ export function buildPolicyRegistry(appGraph: AppGraph): PolicyRegistry {
|
|
|
195
239
|
inputHash: hashStable(
|
|
196
240
|
canonicalJson({
|
|
197
241
|
appInputHash: appGraph.inputHash,
|
|
242
|
+
externalInputHash: externalServices?.inputHash ?? "",
|
|
198
243
|
analyzerVersion: POLICY_REGISTRY_ANALYZER_VERSION,
|
|
199
244
|
}),
|
|
200
245
|
),
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const POLICY_ROLE_PATTERN =
|
|
2
2
|
/["']([^"']+)["']\s*:\s*canRole\s*\(\s*([^)]*)\)/g;
|
|
3
|
+
const POLICY_PERMISSION_PATTERN =
|
|
4
|
+
/["']([^"']+)["']\s*:\s*canPermission\s*\(\s*([^)]*)\)/g;
|
|
3
5
|
|
|
4
6
|
const COMMAND_AUTH_CAN_PATTERN = /auth\s*:\s*can\s*\(\s*["']([^"']+)["']\s*\)/;
|
|
5
7
|
const COMMAND_AUTH_PUBLIC_PATTERN = /auth\s*:\s*public_\s*\(\s*\)/;
|
|
@@ -16,15 +18,28 @@ function parseRolesFromCanRoleArg(arg: string): string[] {
|
|
|
16
18
|
return roles;
|
|
17
19
|
}
|
|
18
20
|
|
|
21
|
+
function parseStringsFromArg(arg: string): string[] {
|
|
22
|
+
const values: string[] = [];
|
|
23
|
+
for (const match of arg.matchAll(/["']([^"']+)["']/g)) {
|
|
24
|
+
const value = match[1];
|
|
25
|
+
if (value && !values.includes(value)) {
|
|
26
|
+
values.push(value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return values;
|
|
30
|
+
}
|
|
31
|
+
|
|
19
32
|
export function parsePoliciesFromSlice(sourceSlice: string): Array<{
|
|
20
33
|
name: string;
|
|
21
|
-
kind: "roles" | "public" | "system";
|
|
34
|
+
kind: "roles" | "permissions" | "public" | "system";
|
|
22
35
|
roles: string[];
|
|
36
|
+
permissions: string[];
|
|
23
37
|
}> {
|
|
24
38
|
const policies: Array<{
|
|
25
39
|
name: string;
|
|
26
|
-
kind: "roles" | "public" | "system";
|
|
40
|
+
kind: "roles" | "permissions" | "public" | "system";
|
|
27
41
|
roles: string[];
|
|
42
|
+
permissions: string[];
|
|
28
43
|
}> = [];
|
|
29
44
|
|
|
30
45
|
for (const match of sourceSlice.matchAll(POLICY_ROLE_PATTERN)) {
|
|
@@ -37,6 +52,21 @@ export function parsePoliciesFromSlice(sourceSlice: string): Array<{
|
|
|
37
52
|
name,
|
|
38
53
|
kind: "roles",
|
|
39
54
|
roles: parseRolesFromCanRoleArg(rolesArg),
|
|
55
|
+
permissions: [],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (const match of sourceSlice.matchAll(POLICY_PERMISSION_PATTERN)) {
|
|
60
|
+
const name = match[1];
|
|
61
|
+
const permissionsArg = match[2] ?? "";
|
|
62
|
+
if (!name) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
policies.push({
|
|
66
|
+
name,
|
|
67
|
+
kind: "permissions",
|
|
68
|
+
roles: [],
|
|
69
|
+
permissions: parseStringsFromArg(permissionsArg),
|
|
40
70
|
});
|
|
41
71
|
}
|
|
42
72
|
|
|
@@ -190,6 +190,67 @@ export const ZOD_RECIPE: IntegrationRecipe = {
|
|
|
190
190
|
docs: ["zod.md"],
|
|
191
191
|
};
|
|
192
192
|
|
|
193
|
+
export const CONVEX_RECIPE: IntegrationRecipe = {
|
|
194
|
+
alias: "convex",
|
|
195
|
+
packages: [{ packageName: "convex" }],
|
|
196
|
+
supportedVersionRange: ">=1.0.0",
|
|
197
|
+
recipeVersion: "1.0.0",
|
|
198
|
+
contexts: {
|
|
199
|
+
allowed: ["client", "server", "action", "workflow", "endpoint", "test", "build"],
|
|
200
|
+
denied: ["shared", "query", "liveQuery", "command", "edge"],
|
|
201
|
+
},
|
|
202
|
+
capabilities: networkCapability(
|
|
203
|
+
["*.convex.cloud", "*.convex.site"],
|
|
204
|
+
["recipe:convex", "Convex client/server package connects to Convex deployments"],
|
|
205
|
+
),
|
|
206
|
+
secrets: [
|
|
207
|
+
secret("NEXT_PUBLIC_CONVEX_URL", false),
|
|
208
|
+
secret("CONVEX_URL", false),
|
|
209
|
+
secret("CONVEX_DEPLOYMENT", false),
|
|
210
|
+
secret("CONVEX_DEPLOY_KEY", false),
|
|
211
|
+
],
|
|
212
|
+
adapters: [],
|
|
213
|
+
testkits: ["convex.mock.ts"],
|
|
214
|
+
docs: ["convex.md"],
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
export const WORKOS_RECIPE: IntegrationRecipe = {
|
|
218
|
+
alias: "workos",
|
|
219
|
+
packages: [{ packageName: "@workos-inc/node" }],
|
|
220
|
+
supportedVersionRange: ">=10.0.0",
|
|
221
|
+
recipeVersion: "1.0.0",
|
|
222
|
+
contexts: {
|
|
223
|
+
allowed: ["server", "action", "workflow", "endpoint", "test", "build"],
|
|
224
|
+
denied: ["shared", "client", "query", "liveQuery", "command", "edge"],
|
|
225
|
+
},
|
|
226
|
+
capabilities: networkCapability(
|
|
227
|
+
["api.workos.com"],
|
|
228
|
+
["recipe:workos", "WorkOS SDK calls AuthKit, Organizations, Admin Portal, and FGA APIs"],
|
|
229
|
+
),
|
|
230
|
+
secrets: [
|
|
231
|
+
secret("WORKOS_API_KEY"),
|
|
232
|
+
secret("WORKOS_CLIENT_ID"),
|
|
233
|
+
secret("WORKOS_COOKIE_PASSWORD"),
|
|
234
|
+
secret("WORKOS_REDIRECT_URI", false),
|
|
235
|
+
secret("WORKOS_WEBHOOK_SECRET", false),
|
|
236
|
+
],
|
|
237
|
+
adapters: ["workos.server.ts"],
|
|
238
|
+
integrations: [
|
|
239
|
+
"workos/authkit.ts",
|
|
240
|
+
"workos/auth-routes.ts",
|
|
241
|
+
"workos/fga.ts",
|
|
242
|
+
"workos/http-handler.ts",
|
|
243
|
+
"workos/resource-map.ts",
|
|
244
|
+
"workos/seed.ts",
|
|
245
|
+
"workos/session.ts",
|
|
246
|
+
"workos/webhook.ts",
|
|
247
|
+
"workos/workos-seed.yml",
|
|
248
|
+
],
|
|
249
|
+
rootFiles: [".env.example", "src/policies.workos.ts", "web/src/lib/workos-auth.tsx", "workos-seed.yml"],
|
|
250
|
+
testkits: ["workos.mock.ts"],
|
|
251
|
+
docs: ["workos.md"],
|
|
252
|
+
};
|
|
253
|
+
|
|
193
254
|
export const FORGE_RECIPE: IntegrationRecipe = {
|
|
194
255
|
alias: "forge",
|
|
195
256
|
packages: [{ packageName: "forge" }],
|
|
@@ -283,6 +344,8 @@ export const REFERENCE_ALIASES = [
|
|
|
283
344
|
"posthog",
|
|
284
345
|
"sentry",
|
|
285
346
|
"zod",
|
|
347
|
+
"convex",
|
|
348
|
+
"workos",
|
|
286
349
|
"ai",
|
|
287
350
|
] as const;
|
|
288
351
|
|
|
@@ -3,11 +3,13 @@ import type { PackageRecipe } from "../types/integration.ts";
|
|
|
3
3
|
import {
|
|
4
4
|
AI_PROVIDER_RECIPES,
|
|
5
5
|
AI_RECIPE,
|
|
6
|
+
CONVEX_RECIPE,
|
|
6
7
|
FORGE_RECIPE,
|
|
7
8
|
POSTHOG_RECIPE,
|
|
8
9
|
REFERENCE_ALIASES,
|
|
9
10
|
SENTRY_RECIPE,
|
|
10
11
|
STRIPE_RECIPE,
|
|
12
|
+
WORKOS_RECIPE,
|
|
11
13
|
ZOD_RECIPE,
|
|
12
14
|
} from "./definitions.ts";
|
|
13
15
|
|
|
@@ -23,6 +25,8 @@ const REFERENCE_RECIPES: Record<string, IntegrationRecipe> = {
|
|
|
23
25
|
posthog: POSTHOG_RECIPE,
|
|
24
26
|
sentry: SENTRY_RECIPE,
|
|
25
27
|
zod: ZOD_RECIPE,
|
|
28
|
+
convex: CONVEX_RECIPE,
|
|
29
|
+
workos: WORKOS_RECIPE,
|
|
26
30
|
forge: FORGE_RECIPE,
|
|
27
31
|
ai: AI_RECIPE,
|
|
28
32
|
};
|
|
@@ -32,6 +36,8 @@ const ALL_RECIPES: IntegrationRecipe[] = [
|
|
|
32
36
|
POSTHOG_RECIPE,
|
|
33
37
|
SENTRY_RECIPE,
|
|
34
38
|
ZOD_RECIPE,
|
|
39
|
+
CONVEX_RECIPE,
|
|
40
|
+
WORKOS_RECIPE,
|
|
35
41
|
FORGE_RECIPE,
|
|
36
42
|
AI_RECIPE,
|
|
37
43
|
...AI_PROVIDER_RECIPES,
|
|
@@ -16,6 +16,14 @@ import type {
|
|
|
16
16
|
|
|
17
17
|
const TEST_RE = /\.(test|spec)\.(ts|tsx)$/;
|
|
18
18
|
|
|
19
|
+
function isTemporaryTestPath(path: string): boolean {
|
|
20
|
+
return path.split("/").some((segment) => segment === ".tmp" || segment === "__tmp__");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isTestGraphCandidate(path: string): boolean {
|
|
24
|
+
return TEST_RE.test(path) && !isTemporaryTestPath(path);
|
|
25
|
+
}
|
|
26
|
+
|
|
19
27
|
function emptyCoverage(): TestCoverage {
|
|
20
28
|
return {
|
|
21
29
|
commands: [],
|
|
@@ -40,7 +48,7 @@ function collectTestsFromDisk(workspaceRoot: string): SourceFile[] {
|
|
|
40
48
|
const { sources } = walkWorkspaceSources({
|
|
41
49
|
workspaceRoot,
|
|
42
50
|
roots: ["tests", "web"],
|
|
43
|
-
excludeRelativePath: (path) => !
|
|
51
|
+
excludeRelativePath: (path) => !isTestGraphCandidate(path),
|
|
44
52
|
});
|
|
45
53
|
return sources.sort((a, b) => a.path.localeCompare(b.path));
|
|
46
54
|
}
|
|
@@ -208,7 +216,7 @@ export function buildTestGraph(input: {
|
|
|
208
216
|
const diskTests = collectTestsFromDisk(input.workspaceRoot);
|
|
209
217
|
const byPath = new Map<string, SourceFile>();
|
|
210
218
|
for (const source of input.sources) {
|
|
211
|
-
if (
|
|
219
|
+
if (isTestGraphCandidate(source.path)) {
|
|
212
220
|
byPath.set(source.path, source);
|
|
213
221
|
}
|
|
214
222
|
}
|
|
@@ -216,7 +224,7 @@ export function buildTestGraph(input: {
|
|
|
216
224
|
byPath.set(source.path, source);
|
|
217
225
|
}
|
|
218
226
|
|
|
219
|
-
const allSources = [...input.sources.filter((s) =>
|
|
227
|
+
const allSources = [...input.sources.filter((s) => isTestGraphCandidate(s.path)), ...diskTests];
|
|
220
228
|
const tests: TestGraphEntry[] = [...byPath.values()]
|
|
221
229
|
.sort((a, b) => a.path.localeCompare(b.path))
|
|
222
230
|
.map((source) => {
|
|
@@ -13,7 +13,13 @@ export type ForgeKind =
|
|
|
13
13
|
| "workflow"
|
|
14
14
|
| "agent"
|
|
15
15
|
| "aiTool"
|
|
16
|
-
| "telemetryEvent"
|
|
16
|
+
| "telemetryEvent"
|
|
17
|
+
| "code.function"
|
|
18
|
+
| "code.class"
|
|
19
|
+
| "code.interface"
|
|
20
|
+
| "code.type"
|
|
21
|
+
| "code.const"
|
|
22
|
+
| "code.enum";
|
|
17
23
|
|
|
18
24
|
export interface ForgeSymbol {
|
|
19
25
|
id: string;
|
|
@@ -26,7 +32,7 @@ export interface ForgeSymbol {
|
|
|
26
32
|
meta: Record<string, JsonValue>;
|
|
27
33
|
}
|
|
28
34
|
|
|
29
|
-
export type ForgeEdgeKind = "references" | "registers" | "guards" | "emits";
|
|
35
|
+
export type ForgeEdgeKind = "references" | "registers" | "guards" | "emits" | "imports";
|
|
30
36
|
|
|
31
37
|
export interface ForgeEdge {
|
|
32
38
|
from: string;
|