forgeos 0.1.0-alpha.2 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +4 -0
- package/AGENTS.md +168 -81
- package/CHANGELOG.md +211 -0
- package/README.md +88 -14
- package/adapters/go/README.md +23 -0
- package/adapters/go/go.mod +3 -0
- package/adapters/go/http.go +149 -0
- package/adapters/go/registry.go +234 -0
- package/adapters/go/types.go +136 -0
- package/adapters/java/README.md +68 -0
- package/adapters/java/pom.xml +34 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
- package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
- package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
- package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java/target/maven-archiver/pom.properties +3 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
- package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
- package/adapters/java-spring-boot-starter/README.md +32 -0
- package/adapters/java-spring-boot-starter/pom.xml +36 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
- package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
- package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
- package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
- package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
- package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
- package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
- package/bin/forge.mjs +18 -0
- package/docs/changelog.md +242 -0
- package/docs/forge-protocol.md +189 -0
- package/examples/go-billing/go.mod +7 -0
- package/examples/go-billing/main.go +120 -0
- package/examples/java-billing/pom.xml +52 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
- package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
- package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
- package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
- package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
- package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
- package/package.json +29 -7
- package/schemas/forge-manifest.schema.json +57 -0
- package/src/forge/_generated/releaseManifest.json +1 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/agent-adapters/index.ts +1511 -123
- package/src/forge/agent-adapters/types.ts +216 -1
- package/src/forge/agent-memory/bridge.ts +1245 -0
- package/src/forge/agent-memory/context-pack.ts +151 -0
- package/src/forge/agent-memory/hook-runner.ts +312 -0
- package/src/forge/agent-memory/mcp.ts +224 -0
- package/src/forge/agent-memory/normalize.ts +498 -0
- package/src/forge/agent-memory/redaction.ts +103 -0
- package/src/forge/agent-memory/sources/claude-code.ts +51 -0
- package/src/forge/agent-memory/sources/codex-hook-runner.mjs +273 -0
- package/src/forge/agent-memory/sources/codex.ts +119 -0
- package/src/forge/agent-memory/sources/cursor.ts +35 -0
- package/src/forge/agent-memory/types.ts +191 -0
- package/src/forge/bench.ts +248 -0
- package/src/forge/brownfield-import/index.ts +801 -0
- package/src/forge/brownfield-import/types.ts +127 -0
- package/src/forge/cair/action-journal.ts +61 -0
- package/src/forge/cair/action-parser.ts +314 -0
- package/src/forge/cair/action-validator.ts +40 -0
- package/src/forge/cair/actions.ts +1818 -0
- package/src/forge/cair/format.ts +77 -0
- package/src/forge/cair/index.ts +106 -0
- package/src/forge/cair/query.ts +478 -0
- package/src/forge/cair/snapshot.ts +315 -0
- package/src/forge/cair/types.ts +248 -0
- package/src/forge/cli/ai.ts +671 -3
- package/src/forge/cli/auth.ts +36 -1
- package/src/forge/cli/build.ts +20 -4
- package/src/forge/cli/changed.ts +300 -0
- package/src/forge/cli/codex-app-server.ts +877 -0
- package/src/forge/cli/commands.ts +1285 -7
- package/src/forge/cli/db.ts +121 -2
- package/src/forge/cli/deps.ts +79 -12
- package/src/forge/cli/dev.ts +502 -38
- package/src/forge/cli/docs.ts +265 -0
- package/src/forge/cli/handoff.ts +250 -0
- package/src/forge/cli/index.ts +1 -0
- package/src/forge/cli/main.ts +49 -3
- package/src/forge/cli/new.ts +3 -1
- package/src/forge/cli/next-actions.ts +23 -0
- package/src/forge/cli/output.ts +290 -1
- package/src/forge/cli/parse.ts +770 -36
- package/src/forge/cli/query.ts +32 -0
- package/src/forge/cli/release.ts +35 -11
- package/src/forge/cli/rls.ts +568 -17
- package/src/forge/cli/run.ts +41 -0
- package/src/forge/cli/secrets.ts +46 -1
- package/src/forge/cli/security.ts +381 -0
- package/src/forge/cli/self-host.ts +56 -14
- package/src/forge/cli/studio.ts +2163 -0
- package/src/forge/cli/verify.ts +1422 -32
- package/src/forge/compiler/agent-contract/build.ts +725 -41
- package/src/forge/compiler/agent-contract/types.ts +85 -0
- package/src/forge/compiler/ai-registry/build.ts +62 -1
- package/src/forge/compiler/ai-registry/constants.ts +1 -1
- package/src/forge/compiler/ai-registry/parse.ts +168 -5
- package/src/forge/compiler/api-surface/build.ts +47 -0
- package/src/forge/compiler/app-graph/build.ts +68 -8
- package/src/forge/compiler/app-graph/extract.ts +107 -0
- package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
- package/src/forge/compiler/app-graph/module-graph.ts +73 -78
- package/src/forge/compiler/app-graph/parser.ts +24 -24
- package/src/forge/compiler/app-graph/profile.ts +26 -0
- package/src/forge/compiler/app-graph/versions.ts +1 -1
- package/src/forge/compiler/classifier/capabilities.ts +3 -2
- package/src/forge/compiler/classifier/classify.ts +32 -8
- package/src/forge/compiler/classifier/secrets.ts +3 -2
- package/src/forge/compiler/classifier/signals.ts +91 -1
- package/src/forge/compiler/client-sdk/build-manifest.ts +59 -0
- package/src/forge/compiler/client-sdk/render-client.ts +188 -13
- package/src/forge/compiler/data-graph/parse.ts +3 -3
- package/src/forge/compiler/data-graph/sql/ddl.ts +60 -2
- package/src/forge/compiler/data-graph/sql/serialize.ts +4 -0
- package/src/forge/compiler/data-graph/sql/types.ts +1 -0
- package/src/forge/compiler/dev-manifest/build.ts +3 -0
- package/src/forge/compiler/diagnostics/codes.ts +35 -0
- package/src/forge/compiler/diagnostics/create.ts +8 -3
- package/src/forge/compiler/diagnostics/index.ts +2 -0
- package/src/forge/compiler/emitter/barrel.ts +3 -0
- package/src/forge/compiler/emitter/render.ts +5 -0
- package/src/forge/compiler/external-manifest/registry.ts +205 -0
- package/src/forge/compiler/external-manifest/types.ts +91 -0
- package/src/forge/compiler/external-manifest/validate.ts +373 -0
- package/src/forge/compiler/frontend-graph/build.ts +85 -13
- package/src/forge/compiler/integration/add.ts +498 -22
- package/src/forge/compiler/integration/snapshot.ts +2 -0
- package/src/forge/compiler/make-registry/build.ts +19 -7
- package/src/forge/compiler/orchestrator/plan-profile.ts +23 -0
- package/src/forge/compiler/orchestrator/plan.ts +78 -7
- package/src/forge/compiler/orchestrator/profile.ts +65 -0
- package/src/forge/compiler/orchestrator/run.ts +97 -31
- package/src/forge/compiler/orchestrator/serialize.ts +101 -8
- package/src/forge/compiler/package-graph/compiler.ts +13 -3
- package/src/forge/compiler/package-manager/adapter.ts +4 -1
- package/src/forge/compiler/package-manager/commands.ts +4 -0
- package/src/forge/compiler/package-manager/executor.ts +30 -1
- package/src/forge/compiler/policy-registry/build.ts +44 -1
- package/src/forge/compiler/test-graph/build.ts +11 -3
- package/src/forge/compiler/types/ai-registry.ts +25 -1
- package/src/forge/compiler/types/app-graph.ts +9 -2
- package/src/forge/compiler/types/cli.ts +76 -1
- package/src/forge/compiler/types/dev-manifest.ts +3 -0
- package/src/forge/compiler/types/frontend-graph.ts +2 -2
- package/src/forge/delta/classifier.ts +52 -0
- package/src/forge/delta/explain.ts +126 -0
- package/src/forge/delta/git-observer.ts +43 -0
- package/src/forge/delta/ids.ts +44 -0
- package/src/forge/delta/index.ts +13 -0
- package/src/forge/delta/recorder.ts +402 -0
- package/src/forge/delta/redaction.ts +50 -0
- package/src/forge/delta/schema.ts +240 -0
- package/src/forge/delta/session.ts +142 -0
- package/src/forge/delta/status.ts +489 -0
- package/src/forge/delta/store.ts +2975 -0
- package/src/forge/delta/timeline.ts +104 -0
- package/src/forge/dev/server.ts +768 -15
- package/src/forge/dev/types.ts +15 -1
- package/src/forge/dev/watch.ts +17 -7
- package/src/forge/dev-console/cycle.ts +233 -21
- package/src/forge/dev-console/types.ts +46 -1
- package/src/forge/impact/index.ts +46 -8
- package/src/forge/impact/types.ts +6 -0
- package/src/forge/intent/index.ts +35 -16
- package/src/forge/make/index.ts +149 -6
- package/src/forge/make/templates.ts +343 -2
- package/src/forge/make/types.ts +3 -1
- package/src/forge/refactor/index.ts +1 -0
- package/src/forge/repair/rules/index.ts +2 -2
- package/src/forge/review/index.ts +158 -12
- package/src/forge/review/types.ts +15 -0
- package/src/forge/runtime/ai/context.ts +210 -5
- package/src/forge/runtime/ai/types.ts +70 -0
- package/src/forge/runtime/auth/claims.ts +32 -0
- package/src/forge/runtime/auth/errors.ts +2 -0
- package/src/forge/runtime/context/create-context.ts +30 -6
- package/src/forge/runtime/db/generated-client.ts +13 -2
- package/src/forge/runtime/db/memory-adapter.ts +2 -2
- package/src/forge/runtime/db/pglite-adapter.ts +77 -2
- package/src/forge/runtime/db/postgres-adapter.ts +6 -3
- package/src/forge/runtime/executor.ts +112 -2
- package/src/forge/runtime/external/bridge.ts +649 -0
- package/src/forge/runtime/runner/run-entry.ts +16 -7
- package/src/forge/runtime/telemetry/scrubber.ts +91 -10
- package/src/forge/runtime/webhooks/security.ts +184 -0
- package/src/forge/server.ts +100 -2
- package/src/forge/version.ts +1 -1
- package/src/forge/vue/index.ts +407 -0
- package/src/forge/workspace/change-summary.ts +209 -0
- package/src/forge/workspace/forge-cli.ts +14 -0
- package/src/forge/workspace/git-summary.ts +279 -0
- package/templates/agent-workroom/AGENTS.md +29 -0
- package/templates/agent-workroom/README.md +34 -0
- package/templates/agent-workroom/forge.config.ts +3 -0
- package/templates/agent-workroom/package.json +33 -0
- package/templates/agent-workroom/src/actions/indexAgentSignal.ts +10 -0
- package/templates/agent-workroom/src/commands/openWorkroom.ts +61 -0
- package/templates/agent-workroom/src/commands/recordAgentSignal.ts +119 -0
- package/templates/agent-workroom/src/commands/recordCheckRun.ts +52 -0
- package/templates/agent-workroom/src/forge/schema.ts +54 -0
- package/templates/agent-workroom/src/policies.ts +6 -0
- package/templates/agent-workroom/src/queries/listWorkrooms.ts +11 -0
- package/templates/agent-workroom/src/queries/liveWorkroom.ts +63 -0
- package/templates/agent-workroom/tsconfig.json +16 -0
- package/templates/agent-workroom/web/index.html +12 -0
- package/templates/agent-workroom/web/package.json +21 -0
- package/templates/agent-workroom/web/src/App.tsx +345 -0
- package/templates/agent-workroom/web/src/lib/forge.ts +13 -0
- package/templates/agent-workroom/web/src/main.tsx +13 -0
- package/templates/agent-workroom/web/src/styles.css +545 -0
- package/templates/agent-workroom/web/tsconfig.json +27 -0
- package/templates/b2b-support-web/package.json +2 -0
- package/templates/b2b-support-web/tsconfig.json +4 -1
- package/templates/b2b-support-web/web/package.json +1 -1
- package/templates/minimal-web/package.json +2 -1
- package/templates/minimal-web/tsconfig.json +3 -1
- package/templates/minimal-web/web/package.json +2 -2
- package/src/forge/_generated/actionSubscriptions.json +0 -2
- package/src/forge/_generated/actionSubscriptions.ts +0 -10
- package/src/forge/_generated/agentAdapterManifest.json +0 -2
- package/src/forge/_generated/agentAdapterManifest.ts +0 -73
- package/src/forge/_generated/agentContract.json +0 -2
- package/src/forge/_generated/agentContract.ts +0 -7696
- package/src/forge/_generated/agentQuickstart.md +0 -32
- package/src/forge/_generated/aiContext.ts +0 -59
- package/src/forge/_generated/aiModels.json +0 -2
- package/src/forge/_generated/aiModels.ts +0 -35
- package/src/forge/_generated/aiProviders.json +0 -2
- package/src/forge/_generated/aiProviders.ts +0 -23
- package/src/forge/_generated/aiRegistry.json +0 -2
- package/src/forge/_generated/aiRegistry.ts +0 -29
- package/src/forge/_generated/api.json +0 -2
- package/src/forge/_generated/api.ts +0 -8
- package/src/forge/_generated/appGraph.json +0 -2
- package/src/forge/_generated/appGraph.ts +0 -14667
- package/src/forge/_generated/appMap.md +0 -35
- package/src/forge/_generated/artifactManifest.json +0 -2
- package/src/forge/_generated/artifactManifest.ts +0 -7
- package/src/forge/_generated/authClaims.json +0 -2
- package/src/forge/_generated/authClaims.ts +0 -13
- package/src/forge/_generated/authConfig.json +0 -2
- package/src/forge/_generated/authConfig.ts +0 -17
- package/src/forge/_generated/authContext.ts +0 -23
- package/src/forge/_generated/authRegistry.json +0 -2
- package/src/forge/_generated/authRegistry.ts +0 -25
- package/src/forge/_generated/buildInfo.json +0 -2
- package/src/forge/_generated/buildInfo.ts +0 -9
- package/src/forge/_generated/capabilityMap.json +0 -2
- package/src/forge/_generated/capabilityMap.md +0 -15
- package/src/forge/_generated/capabilityMap.ts +0 -17
- package/src/forge/_generated/client.ts +0 -282
- package/src/forge/_generated/clientApi.ts +0 -9
- package/src/forge/_generated/clientManifest.json +0 -2
- package/src/forge/_generated/clientManifest.ts +0 -39
- package/src/forge/_generated/clientTypes.ts +0 -78
- package/src/forge/_generated/configRegistry.json +0 -2
- package/src/forge/_generated/configRegistry.ts +0 -4
- package/src/forge/_generated/dataGraph.json +0 -2
- package/src/forge/_generated/dataGraph.ts +0 -8
- package/src/forge/_generated/db.json +0 -2
- package/src/forge/_generated/db.ts +0 -2
- package/src/forge/_generated/dbSecurityManifest.json +0 -2
- package/src/forge/_generated/dbSecurityManifest.ts +0 -15
- package/src/forge/_generated/dbSessionContext.json +0 -2
- package/src/forge/_generated/dbSessionContext.ts +0 -39
- package/src/forge/_generated/deployManifest.json +0 -2
- package/src/forge/_generated/deployManifest.ts +0 -14
- package/src/forge/_generated/devManifest.json +0 -2
- package/src/forge/_generated/devManifest.ts +0 -47
- package/src/forge/_generated/envSchema.json +0 -2
- package/src/forge/_generated/envSchema.ts +0 -59
- package/src/forge/_generated/frontendGraph.json +0 -2
- package/src/forge/_generated/frontendGraph.ts +0 -27
- package/src/forge/_generated/importGuards.json +0 -2
- package/src/forge/_generated/importGuards.ts +0 -686
- package/src/forge/_generated/index.ts +0 -67
- package/src/forge/_generated/liveProductionManifest.json +0 -2
- package/src/forge/_generated/liveProductionManifest.ts +0 -23
- package/src/forge/_generated/liveProtocol.json +0 -2
- package/src/forge/_generated/liveProtocol.ts +0 -21
- package/src/forge/_generated/liveQueryRegistry.json +0 -2
- package/src/forge/_generated/liveQueryRegistry.ts +0 -9
- package/src/forge/_generated/liveTransportConfig.json +0 -2
- package/src/forge/_generated/liveTransportConfig.ts +0 -19
- package/src/forge/_generated/makeRegistry.json +0 -2
- package/src/forge/_generated/makeRegistry.ts +0 -163
- package/src/forge/_generated/makeTemplates.json +0 -2
- package/src/forge/_generated/makeTemplates.ts +0 -61
- package/src/forge/_generated/mockMap.json +0 -2
- package/src/forge/_generated/mockMap.ts +0 -7
- package/src/forge/_generated/operationPlaybooks.md +0 -147
- package/src/forge/_generated/packageGraph.json +0 -2
- package/src/forge/_generated/packageGraph.ts +0 -245249
- package/src/forge/_generated/packageUpgradeRegistry.json +0 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +0 -15
- package/src/forge/_generated/permissionMatrix.json +0 -2
- package/src/forge/_generated/permissionMatrix.ts +0 -7
- package/src/forge/_generated/policyRegistry.json +0 -2
- package/src/forge/_generated/policyRegistry.ts +0 -11
- package/src/forge/_generated/queryRegistry.json +0 -2
- package/src/forge/_generated/queryRegistry.ts +0 -9
- package/src/forge/_generated/react.d.ts +0 -22
- package/src/forge/_generated/react.ts +0 -29
- package/src/forge/_generated/reactManifest.json +0 -2
- package/src/forge/_generated/reactManifest.ts +0 -19
- package/src/forge/_generated/rlsPolicies.json +0 -2
- package/src/forge/_generated/rlsPolicies.sql +0 -34
- package/src/forge/_generated/rlsPolicies.ts +0 -6
- package/src/forge/_generated/runtimeGraph.json +0 -2
- package/src/forge/_generated/runtimeGraph.ts +0 -8
- package/src/forge/_generated/runtimeMatrix.json +0 -2
- package/src/forge/_generated/runtimeMatrix.ts +0 -327385
- package/src/forge/_generated/runtimeRegistry.ts +0 -2
- package/src/forge/_generated/runtimeRules.md +0 -79
- package/src/forge/_generated/secretRegistry.json +0 -2
- package/src/forge/_generated/secretRegistry.ts +0 -50
- package/src/forge/_generated/secretsContext.ts +0 -11
- package/src/forge/_generated/serverApi.ts +0 -10
- package/src/forge/_generated/sourceMapManifest.json +0 -2
- package/src/forge/_generated/sourceMapManifest.ts +0 -7
- package/src/forge/_generated/sqlPlan.json +0 -2
- package/src/forge/_generated/sqlPlan.ts +0 -88
- package/src/forge/_generated/subscriptionManifest.json +0 -2
- package/src/forge/_generated/subscriptionManifest.ts +0 -7
- package/src/forge/_generated/symbolicationManifest.json +0 -2
- package/src/forge/_generated/symbolicationManifest.ts +0 -17
- package/src/forge/_generated/telemetryRegistry.json +0 -2
- package/src/forge/_generated/telemetryRegistry.ts +0 -9
- package/src/forge/_generated/telemetrySinks.json +0 -2
- package/src/forge/_generated/telemetrySinks.ts +0 -11
- package/src/forge/_generated/tenantScope.json +0 -2
- package/src/forge/_generated/tenantScope.ts +0 -8
- package/src/forge/_generated/testGraph.json +0 -2
- package/src/forge/_generated/testGraph.ts +0 -3108
- package/src/forge/_generated/testPlanRegistry.json +0 -2
- package/src/forge/_generated/testPlanRegistry.ts +0 -33
- package/src/forge/_generated/uiRoutes.json +0 -2
- package/src/forge/_generated/uiRoutes.ts +0 -16
- package/src/forge/_generated/uiScenarios.json +0 -2
- package/src/forge/_generated/uiScenarios.ts +0 -30
- package/src/forge/_generated/uiTestManifest.json +0 -2
- package/src/forge/_generated/uiTestManifest.ts +0 -27
- package/src/forge/_generated/workflowRegistry.json +0 -2
- package/src/forge/_generated/workflowRegistry.ts +0 -9
- package/src/forge/_generated/workflowSubscriptions.json +0 -2
- package/src/forge/_generated/workflowSubscriptions.ts +0 -10
|
@@ -34,6 +34,8 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
|
|
|
34
34
|
"forge make list --json",
|
|
35
35
|
"forge make explain <primitive> --json",
|
|
36
36
|
"forge make ui --framework vite --dry-run --json",
|
|
37
|
+
"forge make ui --framework nuxt --dry-run --json",
|
|
38
|
+
"forge make ai-chat support --dry-run --json",
|
|
37
39
|
"forge make resource <name> --fields title:text,status:enum(open,closed) --dry-run --json",
|
|
38
40
|
"forge make resource <name> --fields title:text --with-ui --yes",
|
|
39
41
|
"forge make apply <planId>",
|
|
@@ -112,16 +114,25 @@ export function buildMakeRegistry(generatorVersion: string): MakeRegistryArtifac
|
|
|
112
114
|
},
|
|
113
115
|
{
|
|
114
116
|
name: "ui",
|
|
115
|
-
summary: "Add a Vite React frontend shell with
|
|
117
|
+
summary: "Add a Vite React or Nuxt Vue frontend shell with generated Forge client bindings.",
|
|
116
118
|
creates: [
|
|
117
119
|
"web/package.json",
|
|
118
|
-
"web/
|
|
119
|
-
"web/src/
|
|
120
|
-
"web/src/main.tsx",
|
|
121
|
-
"web/src/App.tsx",
|
|
120
|
+
"web/src/lib/forge.ts or web/composables/forge.ts",
|
|
121
|
+
"web/src/main.tsx or web/app.vue",
|
|
122
122
|
],
|
|
123
123
|
modifies: [],
|
|
124
|
-
examples: ["forge make ui --framework vite --yes"],
|
|
124
|
+
examples: ["forge make ui --framework vite --yes", "forge make ui --framework nuxt --yes"],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: "ai-chat",
|
|
128
|
+
summary: "Add a Forge AI agent and React chat component backed by /ai/agents/run.",
|
|
129
|
+
creates: [
|
|
130
|
+
"src/ai/<name>Agent.ts",
|
|
131
|
+
"web/components/<Name>AiChat.tsx",
|
|
132
|
+
"web/app/<name>-ai/page.tsx when web/app exists",
|
|
133
|
+
],
|
|
134
|
+
modifies: [],
|
|
135
|
+
examples: ["forge make ai-chat support --yes"],
|
|
125
136
|
},
|
|
126
137
|
{
|
|
127
138
|
name: "resource",
|
|
@@ -154,7 +165,8 @@ export function buildMakeTemplates(): MakeTemplateArtifact {
|
|
|
154
165
|
{ name: "workflow", sourceKind: "runtime", outputPattern: "src/workflows/<name>.ts" },
|
|
155
166
|
{ name: "component", sourceKind: "frontend", outputPattern: "web/components/<name>.tsx" },
|
|
156
167
|
{ name: "page", sourceKind: "frontend", outputPattern: "web/app/<route>/page.tsx" },
|
|
157
|
-
{ name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx" },
|
|
168
|
+
{ name: "ui", sourceKind: "frontend", outputPattern: "web/src/App.tsx or web/app.vue" },
|
|
169
|
+
{ name: "ai-chat", sourceKind: "frontend", outputPattern: "web/components/<name>AiChat.tsx" },
|
|
158
170
|
{ name: "placeholder-test", sourceKind: "test", outputPattern: "tests/make-generated/<name>.test.ts" },
|
|
159
171
|
],
|
|
160
172
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EmitPlan } from "../types/emit.ts";
|
|
2
|
+
|
|
3
|
+
export interface PlanPhaseTimings {
|
|
4
|
+
coreArtifactsMs: number;
|
|
5
|
+
agentArtifactsMs: number;
|
|
6
|
+
supportArtifactsMs: number;
|
|
7
|
+
fileRenderMs: number;
|
|
8
|
+
finalizeMs: number;
|
|
9
|
+
totalMs: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const planProfiles = new WeakMap<EmitPlan, PlanPhaseTimings>();
|
|
13
|
+
|
|
14
|
+
export function recordPlanProfile(
|
|
15
|
+
plan: EmitPlan,
|
|
16
|
+
timings: PlanPhaseTimings,
|
|
17
|
+
): void {
|
|
18
|
+
planProfiles.set(plan, timings);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getPlanProfile(plan: EmitPlan): PlanPhaseTimings | undefined {
|
|
22
|
+
return planProfiles.get(plan);
|
|
23
|
+
}
|
|
@@ -27,9 +27,15 @@ import {
|
|
|
27
27
|
buildSubscriptionManifest,
|
|
28
28
|
} from "../live-query-registry/build.ts";
|
|
29
29
|
import { buildApiSurface } from "../api-surface/build.ts";
|
|
30
|
+
import {
|
|
31
|
+
buildExternalServiceGraph,
|
|
32
|
+
serializeExternalServiceGraphJson,
|
|
33
|
+
serializeExternalServiceGraphTs,
|
|
34
|
+
} from "../external-manifest/registry.ts";
|
|
30
35
|
import {
|
|
31
36
|
buildClientManifest,
|
|
32
37
|
buildReactManifest,
|
|
38
|
+
buildVueManifest,
|
|
33
39
|
} from "../client-sdk/build-manifest.ts";
|
|
34
40
|
import {
|
|
35
41
|
buildFrontendGraph,
|
|
@@ -43,6 +49,9 @@ import {
|
|
|
43
49
|
renderReactDts,
|
|
44
50
|
renderReactManifestTs,
|
|
45
51
|
renderReactTs,
|
|
52
|
+
renderVueDts,
|
|
53
|
+
renderVueManifestTs,
|
|
54
|
+
renderVueTs,
|
|
46
55
|
} from "../client-sdk/render-client.ts";
|
|
47
56
|
import { buildSqlPlan } from "../data-graph/sql/ddl.ts";
|
|
48
57
|
import { buildRlsArtifacts } from "../data-graph/rls/build.ts";
|
|
@@ -54,6 +63,8 @@ import { buildDevManifest } from "../dev-manifest/build.ts";
|
|
|
54
63
|
import { buildRuntimeGraph } from "../runtime-graph/build.ts";
|
|
55
64
|
import {
|
|
56
65
|
buildAgentContractArtifacts,
|
|
66
|
+
serializeAgentToolRegistryJson,
|
|
67
|
+
serializeAgentToolRegistryTs,
|
|
57
68
|
serializeCapabilityMapJson,
|
|
58
69
|
serializeCapabilityMapTs,
|
|
59
70
|
serializeAgentContractJson,
|
|
@@ -95,7 +106,6 @@ import { detectOrphanedGeneratedFiles } from "./orphans.ts";
|
|
|
95
106
|
import type { DiscoverContext } from "./types.ts";
|
|
96
107
|
import {
|
|
97
108
|
serializeAppGraphJson,
|
|
98
|
-
serializeAppGraphTs,
|
|
99
109
|
serializeDataGraphJson,
|
|
100
110
|
serializeDataGraphTs,
|
|
101
111
|
serializeImportGuardsJson,
|
|
@@ -108,6 +118,7 @@ import {
|
|
|
108
118
|
serializeRuntimeGraphTs,
|
|
109
119
|
serializeRuntimeMatrixJson,
|
|
110
120
|
serializeRuntimeMatrixTs,
|
|
121
|
+
serializeConstFromJson,
|
|
111
122
|
serializeRuntimeRegistryTs,
|
|
112
123
|
serializeDevManifestJson,
|
|
113
124
|
serializeDevManifestTs,
|
|
@@ -199,10 +210,12 @@ import {
|
|
|
199
210
|
serializeClientApiTsExport,
|
|
200
211
|
serializeClientManifestJson,
|
|
201
212
|
serializeReactManifestJson,
|
|
213
|
+
serializeVueManifestJson,
|
|
202
214
|
buildMockMapEntries,
|
|
203
215
|
} from "./serialize.ts";
|
|
204
216
|
import { buildDefaultAuthRegistry, AUTH_ENV } from "../../runtime/auth/config.ts";
|
|
205
217
|
import type { EnvSchema } from "../types/secret-registry.ts";
|
|
218
|
+
import { recordPlanProfile } from "./plan-profile.ts";
|
|
206
219
|
|
|
207
220
|
export interface PlanInput {
|
|
208
221
|
appGraph: AppGraph;
|
|
@@ -290,6 +303,8 @@ function augmentEnvSchemaWithAuthVars(schema: EnvSchema): EnvSchema {
|
|
|
290
303
|
}
|
|
291
304
|
|
|
292
305
|
export function plan(input: PlanInput): EmitPlan {
|
|
306
|
+
const started = performance.now();
|
|
307
|
+
let checkpoint = started;
|
|
293
308
|
const matrix = buildRuntimeMatrix(input.classified);
|
|
294
309
|
const dataGraph = buildDataGraph(input.appGraph);
|
|
295
310
|
const sqlPlan = buildSqlPlan(dataGraph);
|
|
@@ -298,7 +313,8 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
298
313
|
const workflowSubscriptions = buildWorkflowSubscriptions(workflowRegistry);
|
|
299
314
|
const telemetryRegistry = buildTelemetryRegistry(input.appGraph);
|
|
300
315
|
const telemetrySinks = buildTelemetrySinks(input.classified);
|
|
301
|
-
const
|
|
316
|
+
const externalServices = buildExternalServiceGraph(input.ctx.workspaceRoot);
|
|
317
|
+
const policyRegistry = buildPolicyRegistry(input.appGraph, externalServices);
|
|
302
318
|
const permissionMatrix = buildPermissionMatrixFromRegistry(policyRegistry);
|
|
303
319
|
const tenantScope = buildTenantScope(dataGraph);
|
|
304
320
|
const secretRegistry = buildSecretRegistry(input.classified);
|
|
@@ -321,15 +337,20 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
321
337
|
queryRegistry,
|
|
322
338
|
liveQueryRegistry,
|
|
323
339
|
workflowRegistry,
|
|
340
|
+
externalServices,
|
|
324
341
|
);
|
|
325
342
|
const clientManifest = buildClientManifest(apiSurface, input.classified);
|
|
326
343
|
const reactManifest = buildReactManifest(clientManifest);
|
|
344
|
+
const vueManifest = buildVueManifest(clientManifest);
|
|
327
345
|
const frontendGraph = buildFrontendGraph({
|
|
328
346
|
workspaceRoot: input.ctx.workspaceRoot,
|
|
329
347
|
clientManifest,
|
|
330
348
|
});
|
|
331
349
|
const devManifest = buildDevManifest(runtimeGraph, queryRegistry, input.appGraph);
|
|
332
350
|
const mockMapEntries = buildMockMapEntries(input.classified);
|
|
351
|
+
const coreArtifactsMs = performance.now() - checkpoint;
|
|
352
|
+
checkpoint = performance.now();
|
|
353
|
+
|
|
333
354
|
const agentArtifacts = buildAgentContractArtifacts({
|
|
334
355
|
workspaceRoot: input.ctx.workspaceRoot,
|
|
335
356
|
appGraph: input.appGraph,
|
|
@@ -350,8 +371,12 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
350
371
|
apiSurface,
|
|
351
372
|
clientManifest,
|
|
352
373
|
frontendGraph,
|
|
374
|
+
externalServices,
|
|
353
375
|
});
|
|
354
376
|
const agentAdapterManifest = buildAgentAdapterManifest(agentArtifacts.contract);
|
|
377
|
+
const agentArtifactsMs = performance.now() - checkpoint;
|
|
378
|
+
checkpoint = performance.now();
|
|
379
|
+
|
|
355
380
|
const rlsArtifacts = buildRlsArtifacts(sqlPlan, tenantScope);
|
|
356
381
|
const packageUpgradeRegistry = {
|
|
357
382
|
schemaVersion: "0.1.0" as const,
|
|
@@ -387,6 +412,12 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
387
412
|
apiSurface,
|
|
388
413
|
sources: input.ctx.sources,
|
|
389
414
|
});
|
|
415
|
+
const supportArtifactsMs = performance.now() - checkpoint;
|
|
416
|
+
checkpoint = performance.now();
|
|
417
|
+
|
|
418
|
+
const appGraphJson = serializeAppGraphJson(input.appGraph);
|
|
419
|
+
const packageGraphJson = serializePackageGraphJson(input.packageGraph);
|
|
420
|
+
const runtimeMatrixJson = serializeRuntimeMatrixJson(matrix);
|
|
390
421
|
|
|
391
422
|
const files: EmitFile[] = [
|
|
392
423
|
makeEmitFile("AGENTS.md", agentArtifacts.agentsMd),
|
|
@@ -398,7 +429,24 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
398
429
|
`${GENERATED_DIR}/agentContract.json`,
|
|
399
430
|
serializeAgentContractJson(agentArtifacts.contract),
|
|
400
431
|
),
|
|
432
|
+
makeEmitFile(
|
|
433
|
+
`${GENERATED_DIR}/externalServices.ts`,
|
|
434
|
+
serializeExternalServiceGraphTs(externalServices),
|
|
435
|
+
),
|
|
436
|
+
makeEmitFile(
|
|
437
|
+
`${GENERATED_DIR}/externalServices.json`,
|
|
438
|
+
serializeExternalServiceGraphJson(externalServices),
|
|
439
|
+
),
|
|
401
440
|
makeEmitFile(`${GENERATED_DIR}/appMap.md`, agentArtifacts.appMapMd),
|
|
441
|
+
makeEmitFile(
|
|
442
|
+
`${GENERATED_DIR}/agentTools.ts`,
|
|
443
|
+
serializeAgentToolRegistryTs(agentArtifacts.toolRegistry),
|
|
444
|
+
),
|
|
445
|
+
makeEmitFile(
|
|
446
|
+
`${GENERATED_DIR}/agentTools.json`,
|
|
447
|
+
serializeAgentToolRegistryJson(agentArtifacts.toolRegistry),
|
|
448
|
+
),
|
|
449
|
+
makeEmitFile(`${GENERATED_DIR}/agentTools.md`, agentArtifacts.agentToolsMd),
|
|
402
450
|
makeEmitFile(
|
|
403
451
|
`${GENERATED_DIR}/capabilityMap.ts`,
|
|
404
452
|
serializeCapabilityMapTs(agentArtifacts.capabilityMap),
|
|
@@ -417,6 +465,10 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
417
465
|
`${GENERATED_DIR}/agentQuickstart.md`,
|
|
418
466
|
agentArtifacts.agentQuickstartMd,
|
|
419
467
|
),
|
|
468
|
+
makeEmitFile(
|
|
469
|
+
`${GENERATED_DIR}/agentCairGuide.md`,
|
|
470
|
+
agentArtifacts.agentCairGuideMd,
|
|
471
|
+
),
|
|
420
472
|
makeEmitFile(
|
|
421
473
|
`${GENERATED_DIR}/agentAdapterManifest.ts`,
|
|
422
474
|
serializeAgentAdapterManifestTs(agentAdapterManifest),
|
|
@@ -435,11 +487,11 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
435
487
|
),
|
|
436
488
|
makeEmitFile(
|
|
437
489
|
`${GENERATED_DIR}/appGraph.ts`,
|
|
438
|
-
|
|
490
|
+
serializeConstFromJson("appGraph", appGraphJson),
|
|
439
491
|
),
|
|
440
492
|
makeEmitFile(
|
|
441
493
|
`${GENERATED_DIR}/appGraph.json`,
|
|
442
|
-
|
|
494
|
+
appGraphJson,
|
|
443
495
|
),
|
|
444
496
|
makeEmitFile(
|
|
445
497
|
`${GENERATED_DIR}/packageGraph.ts`,
|
|
@@ -447,7 +499,7 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
447
499
|
),
|
|
448
500
|
makeEmitFile(
|
|
449
501
|
`${GENERATED_DIR}/packageGraph.json`,
|
|
450
|
-
|
|
502
|
+
packageGraphJson,
|
|
451
503
|
),
|
|
452
504
|
makeEmitFile(
|
|
453
505
|
`${GENERATED_DIR}/runtimeMatrix.ts`,
|
|
@@ -455,7 +507,7 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
455
507
|
),
|
|
456
508
|
makeEmitFile(
|
|
457
509
|
`${GENERATED_DIR}/runtimeMatrix.json`,
|
|
458
|
-
|
|
510
|
+
runtimeMatrixJson,
|
|
459
511
|
),
|
|
460
512
|
makeEmitFile(
|
|
461
513
|
`${GENERATED_DIR}/importGuards.ts`,
|
|
@@ -844,7 +896,16 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
844
896
|
`${GENERATED_DIR}/reactManifest.json`,
|
|
845
897
|
serializeReactManifestJson(reactManifest),
|
|
846
898
|
),
|
|
899
|
+
makeEmitFile(`${GENERATED_DIR}/vue.ts`, renderVueTs()),
|
|
900
|
+
makeEmitFile(`${GENERATED_DIR}/vue.d.ts`, renderVueDts()),
|
|
901
|
+
makeEmitFile(`${GENERATED_DIR}/vueManifest.ts`, renderVueManifestTs(vueManifest)),
|
|
902
|
+
makeEmitFile(
|
|
903
|
+
`${GENERATED_DIR}/vueManifest.json`,
|
|
904
|
+
serializeVueManifestJson(vueManifest),
|
|
905
|
+
),
|
|
847
906
|
];
|
|
907
|
+
const fileRenderMs = performance.now() - checkpoint;
|
|
908
|
+
checkpoint = performance.now();
|
|
848
909
|
|
|
849
910
|
const sortedFiles = stableSortEmitFiles(files);
|
|
850
911
|
const plannedPathSet = new Set(sortedFiles.map((file) => file.path));
|
|
@@ -855,8 +916,9 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
855
916
|
);
|
|
856
917
|
|
|
857
918
|
const lock = buildForgeLock(input);
|
|
919
|
+
const finalizeMs = performance.now() - checkpoint;
|
|
858
920
|
|
|
859
|
-
|
|
921
|
+
const result = {
|
|
860
922
|
files: sortedFiles,
|
|
861
923
|
orphanedFiles,
|
|
862
924
|
lock,
|
|
@@ -873,4 +935,13 @@ export function plan(input: PlanInput): EmitPlan {
|
|
|
873
935
|
),
|
|
874
936
|
],
|
|
875
937
|
};
|
|
938
|
+
recordPlanProfile(result, {
|
|
939
|
+
coreArtifactsMs,
|
|
940
|
+
agentArtifactsMs,
|
|
941
|
+
supportArtifactsMs,
|
|
942
|
+
fileRenderMs,
|
|
943
|
+
finalizeMs,
|
|
944
|
+
totalMs: performance.now() - started,
|
|
945
|
+
});
|
|
946
|
+
return result;
|
|
876
947
|
}
|
|
@@ -1,15 +1,37 @@
|
|
|
1
|
+
import type { AppGraphPhaseTimings } from "../app-graph/profile.ts";
|
|
2
|
+
import type { SignalProfile } from "../classifier/signals.ts";
|
|
3
|
+
import type { PlanPhaseTimings } from "./plan-profile.ts";
|
|
4
|
+
|
|
1
5
|
export interface CompilePhaseTimings {
|
|
6
|
+
fastCheckMs: number;
|
|
7
|
+
sessionMs: number;
|
|
2
8
|
discoverMs: number;
|
|
9
|
+
graphBuildMs: number;
|
|
3
10
|
appGraphMs: number;
|
|
11
|
+
appGraph?: AppGraphPhaseTimings;
|
|
4
12
|
packageGraphMs: number;
|
|
13
|
+
classifyMs: number;
|
|
14
|
+
classifierSignals?: SignalProfile;
|
|
5
15
|
planMs: number;
|
|
16
|
+
planDetail?: PlanPhaseTimings;
|
|
17
|
+
runtimeMatrixMs: number;
|
|
18
|
+
importGuardsMs: number;
|
|
19
|
+
qualityGateMs: number;
|
|
6
20
|
emitMs: number;
|
|
21
|
+
postEmitMs: number;
|
|
22
|
+
unaccountedMs: number;
|
|
7
23
|
totalMs: number;
|
|
8
24
|
}
|
|
9
25
|
|
|
10
26
|
let lastTimings: CompilePhaseTimings | null = null;
|
|
11
27
|
|
|
12
28
|
export function isCompileProfileEnabled(): boolean {
|
|
29
|
+
return process.env.FORGE_PROFILE === "1" ||
|
|
30
|
+
process.env.FORGE_PROFILE === "true" ||
|
|
31
|
+
process.env.FORGE_PROFILE === "silent";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function shouldPrintCompileProfile(): boolean {
|
|
13
35
|
return process.env.FORGE_PROFILE === "1" || process.env.FORGE_PROFILE === "true";
|
|
14
36
|
}
|
|
15
37
|
|
|
@@ -26,11 +48,54 @@ export function getCompileTimings(): CompilePhaseTimings | null {
|
|
|
26
48
|
export function formatCompileTimings(timings: CompilePhaseTimings): string {
|
|
27
49
|
return [
|
|
28
50
|
"forge compile profile:",
|
|
51
|
+
` fast-check: ${timings.fastCheckMs}ms`,
|
|
52
|
+
` session: ${timings.sessionMs}ms`,
|
|
29
53
|
` discover: ${timings.discoverMs}ms`,
|
|
54
|
+
` graph-build: ${timings.graphBuildMs}ms`,
|
|
30
55
|
` app-graph: ${timings.appGraphMs}ms`,
|
|
56
|
+
...(timings.appGraph
|
|
57
|
+
? [
|
|
58
|
+
` normalize: ${timings.appGraph.normalizeMs}ms`,
|
|
59
|
+
` parse: ${timings.appGraph.parseMs}ms`,
|
|
60
|
+
` symbols: ${timings.appGraph.symbolsMs}ms`,
|
|
61
|
+
` duplicates: ${timings.appGraph.duplicatesMs}ms`,
|
|
62
|
+
` module-graph: ${timings.appGraph.moduleGraphMs}ms`,
|
|
63
|
+
` input-hash: ${timings.appGraph.inputHashMs}ms`,
|
|
64
|
+
]
|
|
65
|
+
: []),
|
|
31
66
|
` package-graph: ${timings.packageGraphMs}ms`,
|
|
67
|
+
` classify: ${timings.classifyMs}ms`,
|
|
68
|
+
...(timings.classifierSignals
|
|
69
|
+
? [
|
|
70
|
+
` gatherSignals: ${timings.classifierSignals.totalMs}ms`,
|
|
71
|
+
` gatherSignals calls: ${timings.classifierSignals.calls}`,
|
|
72
|
+
` gatherSignals exports scanned: ${timings.classifierSignals.exports}`,
|
|
73
|
+
` gatherSignals corpus bytes: ${timings.classifierSignals.corpusBytes}`,
|
|
74
|
+
` gatherSignals packages: ${timings.classifierSignals.packageCount}`,
|
|
75
|
+
...timings.classifierSignals.topPackages
|
|
76
|
+
.slice(0, 5)
|
|
77
|
+
.map(
|
|
78
|
+
(pkg) =>
|
|
79
|
+
` ${pkg.packageName}: ${pkg.totalMs}ms, ${pkg.calls} calls, ${pkg.exports} exports`,
|
|
80
|
+
),
|
|
81
|
+
]
|
|
82
|
+
: []),
|
|
32
83
|
` plan: ${timings.planMs}ms`,
|
|
84
|
+
...(timings.planDetail
|
|
85
|
+
? [
|
|
86
|
+
` core-artifacts: ${timings.planDetail.coreArtifactsMs}ms`,
|
|
87
|
+
` agent-artifacts: ${timings.planDetail.agentArtifactsMs}ms`,
|
|
88
|
+
` support-artifacts: ${timings.planDetail.supportArtifactsMs}ms`,
|
|
89
|
+
` file-render: ${timings.planDetail.fileRenderMs}ms`,
|
|
90
|
+
` finalize: ${timings.planDetail.finalizeMs}ms`,
|
|
91
|
+
]
|
|
92
|
+
: []),
|
|
93
|
+
` runtime-matrix: ${timings.runtimeMatrixMs}ms`,
|
|
94
|
+
` import-guards: ${timings.importGuardsMs}ms`,
|
|
95
|
+
` quality-gate: ${timings.qualityGateMs}ms`,
|
|
33
96
|
` emit: ${timings.emitMs}ms`,
|
|
97
|
+
` post-emit: ${timings.postEmitMs}ms`,
|
|
98
|
+
` unaccounted: ${timings.unaccountedMs}ms`,
|
|
34
99
|
` total: ${timings.totalMs}ms`,
|
|
35
100
|
].join("\n");
|
|
36
101
|
}
|
|
@@ -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,
|