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
|
@@ -5,6 +5,12 @@ import {
|
|
|
5
5
|
import type { GenerateOptions, GenerateResult } from "../types/cli.ts";
|
|
6
6
|
import type { Diagnostic } from "../types/diagnostic.ts";
|
|
7
7
|
import { classify } from "../classifier/classify.ts";
|
|
8
|
+
import { getAppGraphProfile } from "../app-graph/profile.ts";
|
|
9
|
+
import {
|
|
10
|
+
clearSignalProfile,
|
|
11
|
+
getSignalProfile,
|
|
12
|
+
resetSignalProfile,
|
|
13
|
+
} from "../classifier/signals.ts";
|
|
8
14
|
import type { ClassifiedPackage } from "../classifier/runtime-matrix.ts";
|
|
9
15
|
import { buildRuntimeMatrix } from "../classifier/runtime-matrix.ts";
|
|
10
16
|
import { emit } from "../emitter/emit.ts";
|
|
@@ -25,8 +31,10 @@ import {
|
|
|
25
31
|
formatCompileTimings,
|
|
26
32
|
isCompileProfileEnabled,
|
|
27
33
|
recordCompileTimings,
|
|
34
|
+
shouldPrintCompileProfile,
|
|
28
35
|
} from "./profile.ts";
|
|
29
36
|
import { plan } from "./plan.ts";
|
|
37
|
+
import { getPlanProfile } from "./plan-profile.ts";
|
|
30
38
|
import {
|
|
31
39
|
buildAppGraphForSession,
|
|
32
40
|
discoverForSession,
|
|
@@ -100,6 +108,7 @@ export async function run(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
100
108
|
async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
101
109
|
const profileEnabled = isCompileProfileEnabled();
|
|
102
110
|
const runStarted = profileEnabled ? performance.now() : 0;
|
|
111
|
+
let fastCheckMs = 0;
|
|
103
112
|
let generateCheckCache: GenerateResult["cache"] =
|
|
104
113
|
options.check && !options.dryRun
|
|
105
114
|
? {
|
|
@@ -110,7 +119,9 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
110
119
|
: undefined;
|
|
111
120
|
|
|
112
121
|
if (options.check && !options.dryRun) {
|
|
122
|
+
const fastCheckStarted = profileEnabled ? performance.now() : 0;
|
|
113
123
|
const fastCheck = runFastGenerateCheck(options.workspaceRoot);
|
|
124
|
+
fastCheckMs = profileEnabled ? performance.now() - fastCheckStarted : 0;
|
|
114
125
|
if (fastCheck.kind === "hit") {
|
|
115
126
|
return fastCheck.result;
|
|
116
127
|
}
|
|
@@ -121,7 +132,9 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
121
132
|
};
|
|
122
133
|
}
|
|
123
134
|
|
|
135
|
+
const sessionStarted = profileEnabled ? performance.now() : 0;
|
|
124
136
|
const session = getCompileSession(options.workspaceRoot);
|
|
137
|
+
const sessionMs = profileEnabled ? performance.now() - sessionStarted : 0;
|
|
125
138
|
|
|
126
139
|
const discoverStarted = profileEnabled ? performance.now() : 0;
|
|
127
140
|
const ctx = discoverForSession(session);
|
|
@@ -130,20 +143,40 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
130
143
|
|
|
131
144
|
const pkgCompiler = new PackageGraphCompiler();
|
|
132
145
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
146
|
+
let appGraphMs = 0;
|
|
147
|
+
let packageGraphMs = 0;
|
|
148
|
+
const graphBuildStarted = profileEnabled ? performance.now() : 0;
|
|
149
|
+
const appGraphPromise = (async () => {
|
|
150
|
+
const started = profileEnabled ? performance.now() : 0;
|
|
151
|
+
const graph = await buildAppGraphForSession(session);
|
|
152
|
+
appGraphMs = profileEnabled ? performance.now() - started : 0;
|
|
153
|
+
return graph;
|
|
154
|
+
})();
|
|
155
|
+
const packageGraphPromise = (async () => {
|
|
156
|
+
const started = profileEnabled ? performance.now() : 0;
|
|
157
|
+
const result = await pkgCompiler.build(ctx.dependencies, {
|
|
137
158
|
runtimeInspect: false,
|
|
138
159
|
resolutionMode: "nodenext",
|
|
139
160
|
cacheDir: ctx.cacheDir,
|
|
140
161
|
concurrency: options.concurrency,
|
|
141
162
|
lockfileHash: ctx.lockfileHash,
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
|
|
163
|
+
});
|
|
164
|
+
packageGraphMs = profileEnabled ? performance.now() - started : 0;
|
|
165
|
+
return result;
|
|
166
|
+
})();
|
|
167
|
+
const [appGraph, pkgResult] = await Promise.all([appGraphPromise, packageGraphPromise]);
|
|
168
|
+
const graphBuildMs = profileEnabled ? performance.now() - graphBuildStarted : 0;
|
|
145
169
|
|
|
170
|
+
const classifyStarted = profileEnabled ? performance.now() : 0;
|
|
171
|
+
if (profileEnabled) {
|
|
172
|
+
resetSignalProfile();
|
|
173
|
+
}
|
|
146
174
|
const classified = classifyPackages(pkgResult.graph);
|
|
175
|
+
const classifierSignals = profileEnabled ? getSignalProfile() : undefined;
|
|
176
|
+
if (profileEnabled) {
|
|
177
|
+
clearSignalProfile();
|
|
178
|
+
}
|
|
179
|
+
const classifyMs = profileEnabled ? performance.now() - classifyStarted : 0;
|
|
147
180
|
|
|
148
181
|
const planStarted = profileEnabled ? performance.now() : 0;
|
|
149
182
|
const emitPlan = plan({
|
|
@@ -160,8 +193,13 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
160
193
|
? "dry-run"
|
|
161
194
|
: "write";
|
|
162
195
|
|
|
196
|
+
const runtimeMatrixStarted = profileEnabled ? performance.now() : 0;
|
|
163
197
|
const matrix = buildRuntimeMatrix(classified);
|
|
198
|
+
const runtimeMatrixMs = profileEnabled ? performance.now() - runtimeMatrixStarted : 0;
|
|
199
|
+
const importGuardsStarted = profileEnabled ? performance.now() : 0;
|
|
164
200
|
const guardDiagnostics = checkImportGuards(appGraph.moduleGraph, matrix);
|
|
201
|
+
const importGuardsMs = profileEnabled ? performance.now() - importGuardsStarted : 0;
|
|
202
|
+
const qualityGateStarted = profileEnabled ? performance.now() : 0;
|
|
165
203
|
// Import guards fail `forge check`; generate/drift only surface them as warnings.
|
|
166
204
|
const guardDiagnosticsForGate =
|
|
167
205
|
mode === "check"
|
|
@@ -176,6 +214,7 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
176
214
|
pkgResult.diagnostics,
|
|
177
215
|
[...guardDiagnosticsForGate, ...(emitPlan.diagnostics ?? [])],
|
|
178
216
|
);
|
|
217
|
+
const qualityGateMs = profileEnabled ? performance.now() - qualityGateStarted : 0;
|
|
179
218
|
|
|
180
219
|
const emitStarted = profileEnabled ? performance.now() : 0;
|
|
181
220
|
const emitResult = await emit(emitPlan, {
|
|
@@ -184,6 +223,7 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
184
223
|
});
|
|
185
224
|
const emitMs = profileEnabled ? performance.now() - emitStarted : 0;
|
|
186
225
|
|
|
226
|
+
const postEmitStarted = profileEnabled ? performance.now() : 0;
|
|
187
227
|
const warnings: Diagnostic[] = [
|
|
188
228
|
...qualityDiagnostics.filter((d) => d.severity === "warning"),
|
|
189
229
|
...emitResult.warnings,
|
|
@@ -214,30 +254,6 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
214
254
|
}
|
|
215
255
|
}
|
|
216
256
|
|
|
217
|
-
if (profileEnabled) {
|
|
218
|
-
const totalMs = performance.now() - runStarted;
|
|
219
|
-
recordCompileTimings({
|
|
220
|
-
discoverMs,
|
|
221
|
-
appGraphMs: graphMs,
|
|
222
|
-
packageGraphMs: 0,
|
|
223
|
-
planMs,
|
|
224
|
-
emitMs,
|
|
225
|
-
totalMs,
|
|
226
|
-
});
|
|
227
|
-
const fsProfile = getFileSystemProfile();
|
|
228
|
-
process.stderr.write(`${formatCompileTimings({
|
|
229
|
-
discoverMs,
|
|
230
|
-
appGraphMs: graphMs,
|
|
231
|
-
packageGraphMs: 0,
|
|
232
|
-
planMs,
|
|
233
|
-
emitMs,
|
|
234
|
-
totalMs,
|
|
235
|
-
})}\n`);
|
|
236
|
-
if (fsProfile) {
|
|
237
|
-
process.stderr.write(`${formatFileSystemProfile(fsProfile)}\n`);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
257
|
const driftFailure =
|
|
242
258
|
options.check &&
|
|
243
259
|
(emitResult.changed.length > 0 ||
|
|
@@ -257,6 +273,56 @@ async function runUnlocked(options: GenerateOptions): Promise<GenerateResult> {
|
|
|
257
273
|
const unchanged = emitResult.unchanged.filter((path) =>
|
|
258
274
|
plannedPaths.has(path),
|
|
259
275
|
);
|
|
276
|
+
const postEmitMs = profileEnabled ? performance.now() - postEmitStarted : 0;
|
|
277
|
+
|
|
278
|
+
if (profileEnabled) {
|
|
279
|
+
const totalMs = performance.now() - runStarted;
|
|
280
|
+
const appGraphProfile = getAppGraphProfile(appGraph);
|
|
281
|
+
const planProfile = getPlanProfile(emitPlan);
|
|
282
|
+
const unaccountedMs = Math.max(
|
|
283
|
+
0,
|
|
284
|
+
totalMs -
|
|
285
|
+
fastCheckMs -
|
|
286
|
+
sessionMs -
|
|
287
|
+
discoverMs -
|
|
288
|
+
graphBuildMs -
|
|
289
|
+
classifyMs -
|
|
290
|
+
planMs -
|
|
291
|
+
runtimeMatrixMs -
|
|
292
|
+
importGuardsMs -
|
|
293
|
+
qualityGateMs -
|
|
294
|
+
emitMs -
|
|
295
|
+
postEmitMs,
|
|
296
|
+
);
|
|
297
|
+
const timings = {
|
|
298
|
+
fastCheckMs,
|
|
299
|
+
sessionMs,
|
|
300
|
+
discoverMs,
|
|
301
|
+
graphBuildMs,
|
|
302
|
+
appGraphMs,
|
|
303
|
+
...(appGraphProfile ? { appGraph: appGraphProfile } : {}),
|
|
304
|
+
packageGraphMs,
|
|
305
|
+
classifyMs,
|
|
306
|
+
...(classifierSignals ? { classifierSignals } : {}),
|
|
307
|
+
planMs,
|
|
308
|
+
...(planProfile ? { planDetail: planProfile } : {}),
|
|
309
|
+
runtimeMatrixMs,
|
|
310
|
+
importGuardsMs,
|
|
311
|
+
qualityGateMs,
|
|
312
|
+
emitMs,
|
|
313
|
+
postEmitMs,
|
|
314
|
+
unaccountedMs,
|
|
315
|
+
totalMs,
|
|
316
|
+
};
|
|
317
|
+
recordCompileTimings(timings);
|
|
318
|
+
const fsProfile = getFileSystemProfile();
|
|
319
|
+
if (shouldPrintCompileProfile()) {
|
|
320
|
+
process.stderr.write(`${formatCompileTimings(timings)}\n`);
|
|
321
|
+
if (fsProfile) {
|
|
322
|
+
process.stderr.write(`${formatFileSystemProfile(fsProfile)}\n`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
260
326
|
|
|
261
327
|
return {
|
|
262
328
|
changed,
|
|
@@ -86,6 +86,14 @@ function moduleGraphForAppGraphSnapshot(graph: AppGraph): AppGraph["moduleGraph"
|
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
export function serializeConstFromJson(
|
|
90
|
+
exportName: string,
|
|
91
|
+
serializedJson: string,
|
|
92
|
+
): string {
|
|
93
|
+
const parsed: unknown = JSON.parse(serializedJson.trimEnd());
|
|
94
|
+
return `export const ${exportName} = ${JSON.stringify(parsed, null, 2)} as const;\n`;
|
|
95
|
+
}
|
|
96
|
+
|
|
89
97
|
export function serializeAppGraphJson(graph: AppGraph): string {
|
|
90
98
|
const payload = {
|
|
91
99
|
schemaVersion: graph.schemaVersion,
|
|
@@ -100,26 +108,35 @@ export function serializeAppGraphJson(graph: AppGraph): string {
|
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
export function serializeAppGraphTs(graph: AppGraph): string {
|
|
103
|
-
|
|
104
|
-
return `export const appGraph = ${JSON.stringify(parsed, null, 2)} as const;\n`;
|
|
111
|
+
return serializeConstFromJson("appGraph", serializeAppGraphJson(graph));
|
|
105
112
|
}
|
|
106
113
|
|
|
107
114
|
export function serializePackageGraphJson(graph: PackageGraph): string {
|
|
108
115
|
return serializeCanonical(graph);
|
|
109
116
|
}
|
|
110
117
|
|
|
111
|
-
export function serializePackageGraphTs(
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
export function serializePackageGraphTs(_graph: PackageGraph): string {
|
|
119
|
+
return [
|
|
120
|
+
"import packageGraphJson from \"./packageGraph.json\" with { type: \"json\" };",
|
|
121
|
+
"",
|
|
122
|
+
"export type PackageGraph = typeof packageGraphJson;",
|
|
123
|
+
"export const packageGraph = packageGraphJson;",
|
|
124
|
+
"",
|
|
125
|
+
].join("\n");
|
|
114
126
|
}
|
|
115
127
|
|
|
116
128
|
export function serializeRuntimeMatrixJson(matrix: RuntimeMatrix): string {
|
|
117
129
|
return serializeCanonical(matrix);
|
|
118
130
|
}
|
|
119
131
|
|
|
120
|
-
export function serializeRuntimeMatrixTs(
|
|
121
|
-
|
|
122
|
-
|
|
132
|
+
export function serializeRuntimeMatrixTs(_matrix: RuntimeMatrix): string {
|
|
133
|
+
return [
|
|
134
|
+
"import runtimeMatrixJson from \"./runtimeMatrix.json\" with { type: \"json\" };",
|
|
135
|
+
"",
|
|
136
|
+
"export type RuntimeMatrix = typeof runtimeMatrixJson;",
|
|
137
|
+
"export const runtimeMatrix = runtimeMatrixJson;",
|
|
138
|
+
"",
|
|
139
|
+
].join("\n");
|
|
123
140
|
}
|
|
124
141
|
|
|
125
142
|
export function serializeImportGuardsJson(
|
|
@@ -890,6 +907,7 @@ export function serializeSubscriptionManifestTs(
|
|
|
890
907
|
}
|
|
891
908
|
|
|
892
909
|
export function serializeApiJson(surface: ApiSurface): string {
|
|
910
|
+
const external = surface.external ?? { services: {}, commands: {}, queries: {} };
|
|
893
911
|
return serializeCanonical({
|
|
894
912
|
schemaVersion: surface.schemaVersion,
|
|
895
913
|
generatorVersion: surface.generatorVersion,
|
|
@@ -899,6 +917,7 @@ export function serializeApiJson(surface: ApiSurface): string {
|
|
|
899
917
|
liveQueries: surface.liveQueries,
|
|
900
918
|
actions: surface.actions,
|
|
901
919
|
workflows: surface.workflows,
|
|
920
|
+
external,
|
|
902
921
|
});
|
|
903
922
|
}
|
|
904
923
|
|
|
@@ -933,6 +952,12 @@ export function serializeReactManifestJson(
|
|
|
933
952
|
return serializeCanonical(manifest);
|
|
934
953
|
}
|
|
935
954
|
|
|
955
|
+
export function serializeVueManifestJson(
|
|
956
|
+
manifest: import("../client-sdk/build-manifest.ts").VueManifest,
|
|
957
|
+
): string {
|
|
958
|
+
return serializeCanonical(manifest);
|
|
959
|
+
}
|
|
960
|
+
|
|
936
961
|
export function serializeTestGraphJson(graph: TestGraph): string {
|
|
937
962
|
return serializeCanonical(graph);
|
|
938
963
|
}
|
|
@@ -3,7 +3,7 @@ import type { Dependency } from "../types/package-graph.ts";
|
|
|
3
3
|
import type { PackageManager } from "../types/runtime.ts";
|
|
4
4
|
import type { SourceFileIndex } from "./workspace-index.ts";
|
|
5
5
|
|
|
6
|
-
export const ORCHESTRATOR_MANIFEST_VERSION = "
|
|
6
|
+
export const ORCHESTRATOR_MANIFEST_VERSION = "2";
|
|
7
7
|
|
|
8
8
|
export interface DiscoverContext {
|
|
9
9
|
workspaceRoot: string;
|
|
@@ -271,6 +271,7 @@ export class PackageGraphCompiler {
|
|
|
271
271
|
|
|
272
272
|
const partialApi = {
|
|
273
273
|
name: dep.name,
|
|
274
|
+
...(packageJson.name && packageJson.name !== dep.name ? { packageName: packageJson.name } : {}),
|
|
274
275
|
version: dep.version,
|
|
275
276
|
packageManager: dep.packageManager,
|
|
276
277
|
resolutionMode: opts.resolutionMode,
|
|
@@ -454,10 +455,11 @@ function portableDtsPath(dtsPath: string, dep: Pick<Dependency, "installPath" |
|
|
|
454
455
|
}
|
|
455
456
|
|
|
456
457
|
function readPackageJson(installPath: string): {
|
|
458
|
+
name?: string;
|
|
457
459
|
exports?: unknown;
|
|
458
460
|
} {
|
|
459
461
|
const raw = readTextFile(join(installPath, "package.json"));
|
|
460
|
-
return JSON.parse(raw) as { exports?: unknown };
|
|
462
|
+
return JSON.parse(raw) as { name?: string; exports?: unknown };
|
|
461
463
|
}
|
|
462
464
|
|
|
463
465
|
function resolveSandboxBackend(
|
|
@@ -83,7 +83,10 @@ async function runInstall(
|
|
|
83
83
|
executor: CommandExecutor,
|
|
84
84
|
): Promise<PmAddResult> {
|
|
85
85
|
const ignoreScripts = opts.ignoreScripts ?? true;
|
|
86
|
-
const argv = buildAddCommand(pm, spec, {
|
|
86
|
+
const argv = buildAddCommand(pm, spec, {
|
|
87
|
+
ignoreScripts,
|
|
88
|
+
workspace: opts.workspace,
|
|
89
|
+
});
|
|
87
90
|
const lockBefore = hashLockfiles(opts.cwd, pm);
|
|
88
91
|
|
|
89
92
|
const result = await executor.run(argv, { cwd: opts.cwd });
|
|
@@ -2,6 +2,7 @@ import type { PackageManager } from "../types/runtime.ts";
|
|
|
2
2
|
|
|
3
3
|
export interface BuildAddCommandOptions {
|
|
4
4
|
ignoreScripts: boolean;
|
|
5
|
+
workspace?: string;
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -27,6 +28,9 @@ export function buildAddCommand(
|
|
|
27
28
|
if (ignoreScripts) {
|
|
28
29
|
args.push("--ignore-scripts");
|
|
29
30
|
}
|
|
31
|
+
if (options.workspace) {
|
|
32
|
+
args.push("--workspace", options.workspace);
|
|
33
|
+
}
|
|
30
34
|
return args;
|
|
31
35
|
}
|
|
32
36
|
case "pnpm": {
|
|
@@ -88,11 +88,40 @@ export class PackageManagerCommandError extends Error {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
function quoteWindowsShellArg(arg: string): string {
|
|
92
|
+
if (/^[a-zA-Z0-9@._/:=-]+$/.test(arg)) {
|
|
93
|
+
return arg;
|
|
94
|
+
}
|
|
95
|
+
return `"${arg.replace(/(["^&|<>])/g, "^$1")}"`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function spawnArgvForWindowsScript(originalArgv: string[], resolvedArgv: string[]): string[] {
|
|
99
|
+
const originalCommand = originalArgv[0] ?? resolvedArgv[0]!;
|
|
100
|
+
const command =
|
|
101
|
+
originalCommand.includes("\\") ||
|
|
102
|
+
originalCommand.includes("/") ||
|
|
103
|
+
isAbsolute(originalCommand)
|
|
104
|
+
? resolvedArgv[0]!
|
|
105
|
+
: originalCommand;
|
|
106
|
+
const commandPart = command === originalCommand ? command : quoteWindowsShellArg(command);
|
|
107
|
+
const args = originalArgv.slice(1).map(quoteWindowsShellArg).join(" ");
|
|
108
|
+
return [
|
|
109
|
+
process.env.ComSpec ?? "cmd.exe",
|
|
110
|
+
"/d",
|
|
111
|
+
"/c",
|
|
112
|
+
`${commandPart}${args ? ` ${args}` : ""}`,
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
|
|
91
116
|
export const defaultCommandExecutor: CommandExecutor = {
|
|
92
117
|
async run(argv, options) {
|
|
93
118
|
const resolvedArgv = resolvePackageManagerArgv(argv);
|
|
119
|
+
const spawnArgv =
|
|
120
|
+
process.platform === "win32" && /\.(?:cmd|bat)$/i.test(resolvedArgv[0] ?? "")
|
|
121
|
+
? spawnArgvForWindowsScript(argv, resolvedArgv)
|
|
122
|
+
: resolvedArgv;
|
|
94
123
|
return new Promise<CommandRunResult>((resolve, reject) => {
|
|
95
|
-
const child = spawn(
|
|
124
|
+
const child = spawn(spawnArgv[0]!, spawnArgv.slice(1), {
|
|
96
125
|
cwd: options.cwd,
|
|
97
126
|
env: options.env ?? process.env,
|
|
98
127
|
windowsHide: true,
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
1
|
+
import { dirname, join, parse } from "node:path";
|
|
2
2
|
import { nodeFileSystem } from "../fs/index.ts";
|
|
3
3
|
import { parsePackageName } from "./parse-spec.ts";
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
? name.split("/")
|
|
12
|
-
: [name];
|
|
13
|
-
const pkgJsonPath = join(cwd, "node_modules", ...segments, "package.json");
|
|
5
|
+
function packageJsonPath(cwd: string, packageName: string): string {
|
|
6
|
+
const segments = packageName.startsWith("@")
|
|
7
|
+
? packageName.split("/")
|
|
8
|
+
: [packageName];
|
|
9
|
+
return join(cwd, "node_modules", ...segments, "package.json");
|
|
10
|
+
}
|
|
14
11
|
|
|
15
|
-
|
|
12
|
+
function readVersionAt(path: string): string | null {
|
|
13
|
+
if (!nodeFileSystem.exists(path)) {
|
|
16
14
|
return null;
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
try {
|
|
20
|
-
const pkg = JSON.parse((nodeFileSystem.readText(
|
|
18
|
+
const pkg = JSON.parse((nodeFileSystem.readText(path) ?? "")) as {
|
|
21
19
|
version?: string;
|
|
22
20
|
};
|
|
23
21
|
return typeof pkg.version === "string" ? pkg.version : null;
|
|
@@ -25,3 +23,29 @@ export function readInstalledVersion(
|
|
|
25
23
|
return null;
|
|
26
24
|
}
|
|
27
25
|
}
|
|
26
|
+
|
|
27
|
+
export function readInstalledVersion(
|
|
28
|
+
specOrName: string,
|
|
29
|
+
cwd: string,
|
|
30
|
+
): string | null {
|
|
31
|
+
const name = parsePackageName(specOrName);
|
|
32
|
+
let current = cwd;
|
|
33
|
+
const root = parse(cwd).root;
|
|
34
|
+
|
|
35
|
+
while (true) {
|
|
36
|
+
const version = readVersionAt(packageJsonPath(current, name));
|
|
37
|
+
if (version) {
|
|
38
|
+
return version;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (current === root) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const parent = dirname(current);
|
|
46
|
+
if (parent === current) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
current = parent;
|
|
50
|
+
}
|
|
51
|
+
}
|