@interf/compiler 0.22.2 → 0.50.0
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/README.md +119 -282
- package/dist/bin-mcp.d.ts +2 -0
- package/dist/bin-mcp.js +63 -0
- package/dist/bin-runtime.d.ts +2 -0
- package/dist/bin-runtime.js +111 -0
- package/dist/cli/commands/agents.js +4 -35
- package/dist/cli/commands/auth.d.ts +20 -0
- package/dist/cli/commands/auth.js +161 -0
- package/dist/cli/commands/benchmark.d.ts +9 -0
- package/dist/cli/commands/benchmark.js +58 -0
- package/dist/cli/commands/build-plan.js +107 -139
- package/dist/cli/commands/build.d.ts +3 -4
- package/dist/cli/commands/build.js +16 -45
- package/dist/cli/commands/doctor.js +3 -3
- package/dist/cli/commands/graphs.d.ts +2 -0
- package/dist/cli/commands/graphs.js +344 -0
- package/dist/cli/commands/login.js +4 -6
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/mcp.d.ts +4 -2
- package/dist/cli/commands/mcp.js +846 -232
- package/dist/cli/commands/project.d.ts +2 -0
- package/dist/cli/commands/project.js +176 -0
- package/dist/cli/commands/reset.d.ts +3 -4
- package/dist/cli/commands/reset.js +10 -31
- package/dist/cli/commands/runs.js +136 -57
- package/dist/cli/commands/runtime.d.ts +24 -0
- package/dist/cli/commands/runtime.js +373 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +35 -45
- package/dist/cli/commands/traces.d.ts +2 -0
- package/dist/cli/commands/traces.js +97 -0
- package/dist/cli/commands/wizard.js +171 -178
- package/dist/cli/index.d.ts +7 -4
- package/dist/cli/index.js +13 -7
- package/dist/cli/lib/http-client.d.ts +39 -0
- package/dist/cli/lib/http-client.js +73 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/packages/build-plans/authoring/brief.d.ts +538 -0
- package/dist/packages/build-plans/authoring/brief.js +89 -0
- package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +52 -11
- package/dist/packages/build-plans/authoring/build-plan-authoring.js +493 -46
- package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +10 -1
- package/dist/packages/build-plans/authoring/build-plan-edit-session.js +27 -4
- package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
- package/dist/packages/build-plans/authoring/build-plan-improvement.js +97 -46
- package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.d.ts +1 -0
- package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
- package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
- package/dist/packages/build-plans/build-plan-resolution.js +3 -3
- package/dist/packages/build-plans/index.d.ts +1 -1
- package/dist/packages/build-plans/index.js +1 -1
- package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -13
- package/dist/packages/build-plans/package/build-plan-definitions.js +45 -42
- package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
- package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
- package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
- package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
- package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +5 -4
- package/dist/packages/build-plans/package/build-plan-stage-runner.js +23 -11
- package/dist/packages/build-plans/package/builtin-build-plan.d.ts +7 -8
- package/dist/packages/build-plans/package/builtin-build-plan.js +10 -11
- package/dist/packages/build-plans/package/context-interface.d.ts +14 -9
- package/dist/packages/build-plans/package/context-interface.js +14 -33
- package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
- package/dist/packages/build-plans/package/interf-build-plan-package.js +68 -64
- package/dist/packages/build-plans/package/local-build-plans.d.ts +21 -14
- package/dist/packages/build-plans/package/local-build-plans.js +105 -55
- package/dist/packages/build-plans/package/user-build-plans.js +1 -1
- package/dist/packages/contracts/index.d.ts +5 -2
- package/dist/packages/contracts/index.js +3 -1
- package/dist/packages/contracts/lib/context-graph-layer.d.ts +161 -0
- package/dist/packages/contracts/lib/context-graph-layer.js +216 -0
- package/dist/packages/contracts/lib/project-paths.d.ts +144 -0
- package/dist/packages/contracts/lib/project-paths.js +220 -0
- package/dist/packages/contracts/lib/project-schema.d.ts +423 -0
- package/dist/packages/contracts/lib/project-schema.js +138 -0
- package/dist/packages/contracts/lib/schema.d.ts +1273 -81
- package/dist/packages/contracts/lib/schema.js +675 -79
- package/dist/packages/contracts/utils/filesystem.d.ts +1 -0
- package/dist/packages/contracts/utils/filesystem.js +29 -1
- package/dist/packages/contracts/utils/parse.js +67 -0
- package/dist/packages/projects/index.d.ts +6 -0
- package/dist/packages/{project → projects}/index.js +0 -3
- package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
- package/dist/packages/{project → projects}/interf-detect.js +56 -50
- package/dist/packages/projects/interf.d.ts +2 -0
- package/dist/packages/projects/interf.js +1 -0
- package/dist/packages/projects/lib/schema.d.ts +77 -0
- package/dist/packages/projects/lib/schema.js +91 -0
- package/dist/packages/projects/source-config.d.ts +53 -0
- package/dist/packages/projects/source-config.js +339 -0
- package/dist/packages/projects/source-folders.d.ts +11 -0
- package/dist/packages/{project → projects}/source-folders.js +26 -26
- package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
- package/dist/packages/{engine → runtime}/action-planner.js +20 -22
- package/dist/packages/runtime/action-values.d.ts +1 -0
- package/dist/packages/runtime/action-values.js +1 -0
- package/dist/packages/runtime/actions/errors.d.ts +2 -0
- package/dist/packages/runtime/actions/errors.js +12 -0
- package/dist/packages/runtime/actions/fields.d.ts +86 -0
- package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
- package/dist/packages/runtime/actions/form-builders.js +667 -0
- package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
- package/dist/packages/runtime/actions/form-validators.js +134 -0
- package/dist/packages/runtime/actions/helpers.d.ts +11 -0
- package/dist/packages/runtime/actions/helpers.js +80 -0
- package/dist/packages/runtime/actions/index.d.ts +8 -0
- package/dist/packages/runtime/actions/index.js +11 -0
- package/dist/packages/runtime/actions/registry.d.ts +64 -0
- package/dist/packages/runtime/actions/registry.js +62 -0
- package/dist/packages/runtime/actions/requests.d.ts +45 -0
- package/dist/packages/runtime/actions/requests.js +164 -0
- package/dist/packages/runtime/actions/schemas.d.ts +161 -0
- package/dist/packages/runtime/actions/schemas.js +37 -0
- package/dist/packages/runtime/agent-handoff.d.ts +11 -0
- package/dist/packages/runtime/agent-handoff.js +102 -0
- package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
- package/dist/packages/{engine → runtime}/agents/index.js +1 -2
- package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
- package/dist/packages/runtime/agents/lib/args.js +24 -0
- package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
- package/dist/packages/runtime/agents/lib/constants.js +13 -0
- package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
- package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
- package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
- package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
- package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +14 -0
- package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +31 -14
- package/dist/packages/{engine → runtime}/agents/lib/execution.js +22 -6
- package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +1 -0
- package/dist/packages/{engine → runtime}/agents/lib/executors.js +11 -2
- package/dist/packages/runtime/agents/lib/logs.d.ts +12 -0
- package/dist/packages/runtime/agents/lib/logs.js +41 -0
- package/dist/packages/{engine → runtime}/agents/lib/preflight.js +19 -14
- package/dist/packages/runtime/agents/lib/render.d.ts +26 -0
- package/dist/packages/{engine → runtime}/agents/lib/render.js +48 -22
- package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
- package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
- package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
- package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
- package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
- package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
- package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
- package/dist/packages/runtime/agents/lib/shell-templates.js +494 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
- package/dist/packages/runtime/agents/lib/shells.d.ts +92 -0
- package/dist/packages/runtime/agents/lib/shells.js +509 -0
- package/dist/packages/runtime/agents/lib/source-context-scan.d.ts +10 -0
- package/dist/packages/runtime/agents/lib/source-context-scan.js +388 -0
- package/dist/packages/{engine → runtime}/agents/lib/status.js +1 -14
- package/dist/packages/runtime/agents/lib/string-utils.d.ts +16 -0
- package/dist/packages/runtime/agents/lib/string-utils.js +36 -0
- package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +1 -0
- package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
- package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
- package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
- package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
- package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
- package/dist/packages/runtime/agents/providers/codex.js +66 -0
- package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/cursor.js +24 -0
- package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/index.js +31 -0
- package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
- package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
- package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
- package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
- package/dist/packages/{engine → runtime}/agents/role-executors.js +9 -7
- package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
- package/dist/packages/runtime/auth/account-context.d.ts +52 -0
- package/dist/packages/runtime/auth/account-context.js +68 -0
- package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
- package/dist/packages/runtime/auth/auth-flow.js +189 -0
- package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
- package/dist/packages/runtime/auth/jwt-validator.js +86 -0
- package/dist/packages/runtime/auth/keychain.d.ts +35 -0
- package/dist/packages/runtime/auth/keychain.js +85 -0
- package/dist/packages/runtime/auth/session-store.d.ts +38 -0
- package/dist/packages/runtime/auth/session-store.js +96 -0
- package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
- package/dist/packages/runtime/auth/workos-client.js +87 -0
- package/dist/packages/runtime/benchmark-question-draft.d.ts +23 -0
- package/dist/packages/runtime/benchmark-question-draft.js +153 -0
- package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
- package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
- package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +6 -6
- package/dist/packages/{engine → runtime}/build/artifact-status.js +26 -24
- package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
- package/dist/packages/runtime/build/atomic-fs.js +95 -0
- package/dist/packages/runtime/build/billing-events.d.ts +78 -0
- package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
- package/dist/packages/runtime/build/build-evidence.d.ts +16 -0
- package/dist/packages/runtime/build/build-evidence.js +179 -0
- package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
- package/dist/packages/runtime/build/build-pipeline.js +388 -0
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
- package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
- package/dist/packages/runtime/build/build-plan-runs.js +31 -0
- package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
- package/dist/packages/runtime/build/build-stage-plan.js +101 -0
- package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
- package/dist/packages/runtime/build/build-stage-runner.js +302 -0
- package/dist/packages/{engine → runtime}/build/build-target.d.ts +7 -4
- package/dist/packages/runtime/build/build-target.js +40 -0
- package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
- package/dist/packages/runtime/build/check-evaluator.js +1226 -0
- package/dist/packages/runtime/build/context-graph-paths.d.ts +64 -0
- package/dist/packages/runtime/build/context-graph-paths.js +160 -0
- package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
- package/dist/packages/runtime/build/context-graph-schema.js +39 -0
- package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
- package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
- package/dist/packages/{engine → runtime}/build/index.d.ts +7 -5
- package/dist/packages/{engine → runtime}/build/index.js +7 -5
- package/dist/packages/runtime/build/inspect-map.d.ts +10 -0
- package/dist/packages/runtime/build/inspect-map.js +270 -0
- package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +449 -123
- package/dist/packages/runtime/build/lib/schema.js +494 -0
- package/dist/packages/runtime/build/native-entrypoint.d.ts +2 -0
- package/dist/packages/runtime/build/native-entrypoint.js +286 -0
- package/dist/packages/runtime/build/reset.d.ts +2 -0
- package/dist/packages/runtime/build/reset.js +62 -0
- package/dist/packages/{engine → runtime}/build/runtime-contracts.js +13 -7
- package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
- package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
- package/dist/packages/runtime/build/runtime-log-paths.d.ts +3 -0
- package/dist/packages/runtime/build/runtime-log-paths.js +16 -0
- package/dist/packages/{engine → runtime}/build/runtime-prompt.js +12 -9
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
- package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
- package/dist/packages/runtime/build/runtime-runs.js +318 -0
- package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +9 -6
- package/dist/packages/runtime/build/runtime-types.js +1 -0
- package/dist/packages/runtime/build/runtime.d.ts +8 -0
- package/dist/packages/runtime/build/runtime.js +7 -0
- package/dist/packages/runtime/build/source-files.d.ts +58 -0
- package/dist/packages/runtime/build/source-files.js +193 -0
- package/dist/packages/runtime/build/source-inventory.d.ts +28 -0
- package/dist/packages/runtime/build/source-inventory.js +512 -0
- package/dist/packages/runtime/build/source-manifest.d.ts +63 -0
- package/dist/packages/runtime/build/source-manifest.js +220 -0
- package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
- package/dist/packages/runtime/build/stage-evidence.js +386 -0
- package/dist/packages/runtime/build/stage-manifest.d.ts +45 -0
- package/dist/packages/runtime/build/stage-manifest.js +1125 -0
- package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
- package/dist/packages/runtime/build/stage-reuse.js +154 -0
- package/dist/packages/runtime/build/stage-session.d.ts +81 -0
- package/dist/packages/runtime/build/stage-session.js +308 -0
- package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
- package/dist/packages/runtime/build/state-artifacts.js +14 -0
- package/dist/packages/runtime/build/state-health.d.ts +4 -0
- package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
- package/dist/packages/runtime/build/state-io.d.ts +12 -0
- package/dist/packages/runtime/build/state-io.js +118 -0
- package/dist/packages/runtime/build/state-view.d.ts +5 -0
- package/dist/packages/runtime/build/state-view.js +121 -0
- package/dist/packages/runtime/build/state.d.ts +7 -0
- package/dist/packages/runtime/build/state.js +12 -0
- package/dist/packages/runtime/build/summary-coverage-index.d.ts +21 -0
- package/dist/packages/runtime/build/summary-coverage-index.js +189 -0
- package/dist/packages/runtime/build/traces.d.ts +30 -0
- package/dist/packages/runtime/build/traces.js +133 -0
- package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
- package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +49 -36
- package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
- package/dist/packages/{engine → runtime}/build/validate.js +26 -26
- package/dist/packages/{engine → runtime}/client.d.ts +18 -18
- package/dist/packages/{engine → runtime}/client.js +48 -36
- package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
- package/dist/packages/{engine → runtime}/connection-config.js +9 -8
- package/dist/packages/runtime/context-checks.d.ts +10 -0
- package/dist/packages/runtime/context-checks.js +127 -0
- package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
- package/dist/packages/runtime/context-graph-scaffold.js +135 -0
- package/dist/packages/runtime/context-graph-semantic-graph.d.ts +9 -0
- package/dist/packages/runtime/context-graph-semantic-graph.js +416 -0
- package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
- package/dist/packages/runtime/entitlement-guard.js +70 -0
- package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/execution/index.js +1 -1
- package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +272 -191
- package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
- package/dist/packages/runtime/index.d.ts +29 -0
- package/dist/packages/runtime/index.js +21 -0
- package/dist/packages/runtime/instance-paths.d.ts +30 -0
- package/dist/packages/runtime/instance-paths.js +29 -0
- package/dist/packages/runtime/native-run-handlers.d.ts +63 -0
- package/dist/packages/{engine → runtime}/native-run-handlers.js +217 -166
- package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
- package/dist/packages/runtime/plan-artifact-contract.js +42 -0
- package/dist/packages/runtime/project-entries.d.ts +11 -0
- package/dist/packages/runtime/project-entries.js +49 -0
- package/dist/packages/runtime/project-source-state.d.ts +26 -0
- package/dist/packages/runtime/project-source-state.js +56 -0
- package/dist/packages/runtime/project-store.d.ts +90 -0
- package/dist/packages/runtime/project-store.js +195 -0
- package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
- package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
- package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
- package/dist/packages/{engine → runtime}/run-observability.js +174 -87
- package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
- package/dist/packages/runtime/runtime-action-proposals.js +542 -0
- package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
- package/dist/packages/runtime/runtime-build-plans.js +175 -0
- package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
- package/dist/packages/runtime/runtime-build-runs.js +555 -0
- package/dist/packages/runtime/runtime-caches.d.ts +117 -0
- package/dist/packages/runtime/runtime-caches.js +266 -0
- package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
- package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
- package/dist/packages/runtime/runtime-executor.d.ts +22 -0
- package/dist/packages/runtime/runtime-executor.js +131 -0
- package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
- package/dist/packages/runtime/runtime-jobs.js +463 -0
- package/dist/packages/runtime/runtime-observability.d.ts +11 -0
- package/dist/packages/runtime/runtime-observability.js +39 -0
- package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
- package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
- package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
- package/dist/packages/runtime/runtime-project-mutations.js +65 -0
- package/dist/packages/runtime/runtime-project-reads.d.ts +18 -0
- package/dist/packages/runtime/runtime-project-reads.js +574 -0
- package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
- package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
- package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +23 -16
- package/dist/packages/{engine → runtime}/runtime-resource-builders.js +58 -46
- package/dist/packages/runtime/runtime-status.d.ts +14 -0
- package/dist/packages/runtime/runtime-status.js +15 -0
- package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
- package/dist/packages/runtime/runtime-verify-runs.js +296 -0
- package/dist/packages/runtime/runtime.d.ts +1582 -0
- package/dist/packages/runtime/runtime.js +431 -0
- package/dist/packages/runtime/schemas/actions.d.ts +1206 -0
- package/dist/packages/runtime/schemas/actions.js +117 -0
- package/dist/packages/runtime/schemas/agents.d.ts +104 -0
- package/dist/packages/runtime/schemas/agents.js +74 -0
- package/dist/packages/runtime/schemas/build-plans.d.ts +1132 -0
- package/dist/packages/runtime/schemas/build-plans.js +141 -0
- package/dist/packages/runtime/schemas/context-graphs.d.ts +1522 -0
- package/dist/packages/runtime/schemas/context-graphs.js +110 -0
- package/dist/packages/runtime/schemas/files.d.ts +227 -0
- package/dist/packages/runtime/schemas/files.js +28 -0
- package/dist/packages/runtime/schemas/index.d.ts +9 -0
- package/dist/packages/runtime/schemas/index.js +13 -0
- package/dist/packages/runtime/schemas/instance.d.ts +141 -0
- package/dist/packages/runtime/schemas/instance.js +143 -0
- package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
- package/dist/packages/runtime/schemas/jobs.js +107 -0
- package/dist/packages/runtime/schemas/projects.d.ts +366 -0
- package/dist/packages/runtime/schemas/projects.js +160 -0
- package/dist/packages/runtime/schemas/runs.d.ts +3445 -0
- package/dist/packages/runtime/schemas/runs.js +115 -0
- package/dist/packages/runtime/service/index.d.ts +3 -0
- package/dist/packages/runtime/service/index.js +3 -0
- package/dist/packages/runtime/service/openapi.d.ts +7 -0
- package/dist/packages/runtime/service/openapi.js +118 -0
- package/dist/packages/runtime/service/operations.d.ts +3011 -0
- package/dist/packages/runtime/service/operations.js +375 -0
- package/dist/packages/runtime/service/routes.d.ts +114 -0
- package/dist/packages/runtime/service/routes.js +128 -0
- package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
- package/dist/packages/runtime/service/server-api-files.js +85 -0
- package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
- package/dist/packages/runtime/service/server-app-boot.js +46 -0
- package/dist/packages/runtime/service/server-guards.d.ts +63 -0
- package/dist/packages/runtime/service/server-guards.js +181 -0
- package/dist/packages/runtime/service/server-helpers.d.ts +38 -0
- package/dist/packages/runtime/service/server-helpers.js +108 -0
- package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
- package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.js +45 -0
- package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-agents.js +132 -0
- package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
- package/dist/packages/runtime/service/server-routes-auth.js +138 -0
- package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-build-plans.js +86 -0
- package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
- package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
- package/dist/packages/runtime/service/server-routes-events.js +99 -0
- package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-context.js +287 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.js +137 -0
- package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
- package/dist/packages/runtime/service/server-routes-project-runs.js +88 -0
- package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-projects.js +96 -0
- package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-runs.js +119 -0
- package/dist/packages/runtime/service/server.d.ts +37 -0
- package/dist/packages/runtime/service/server.js +300 -0
- package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
- package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
- package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
- package/dist/packages/runtime/verify/benchmark-run.js +303 -0
- package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/verify/index.js +1 -1
- package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
- package/dist/packages/{engine → runtime}/verify/lib/schema.js +38 -18
- package/dist/packages/runtime/verify/test-file-guard.d.ts +2 -0
- package/dist/packages/runtime/verify/test-file-guard.js +29 -0
- package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +7 -0
- package/dist/packages/{engine → runtime}/verify/verify-execution.js +119 -45
- package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +5 -4
- package/dist/packages/runtime/verify/verify-paths.js +65 -0
- package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
- package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
- package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
- package/dist/packages/runtime/verify/verify-specs.js +126 -0
- package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
- package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
- package/dist/packages/runtime/verify/verify-types.js +1 -0
- package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
- package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
- package/dist/packages/runtime/wire-schemas.d.ts +18 -0
- package/dist/packages/runtime/wire-schemas.js +27 -0
- package/package.json +32 -30
- package/public-repo/CONTRIBUTING.md +16 -18
- package/public-repo/README.md +119 -282
- package/public-repo/SECURITY.md +3 -4
- package/public-repo/build-plans/interf-default/README.md +24 -16
- package/public-repo/build-plans/interf-default/build/stages/entrypoint/SKILL.md +74 -0
- package/public-repo/build-plans/interf-default/build/stages/knowledge/SKILL.md +95 -0
- package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +49 -4
- package/public-repo/build-plans/interf-default/build-plan.json +49 -39
- package/public-repo/build-plans/interf-default/build-plan.schema.json +59 -33
- package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
- package/public-repo/build-plans/interf-default/use/query/SKILL.md +18 -11
- package/public-repo/openapi/local-service.openapi.json +14227 -0
- package/public-repo/skills/interf/SKILL.md +508 -187
- package/dist/cli/commands/prep.d.ts +0 -2
- package/dist/cli/commands/prep.js +0 -240
- package/dist/cli/commands/test.d.ts +0 -10
- package/dist/cli/commands/test.js +0 -85
- package/dist/cli/commands/web.d.ts +0 -2
- package/dist/cli/commands/web.js +0 -286
- package/dist/interf-ui/404.html +0 -1
- package/dist/interf-ui/__next.__PAGE__.txt +0 -10
- package/dist/interf-ui/__next._full.txt +0 -20
- package/dist/interf-ui/__next._head.txt +0 -5
- package/dist/interf-ui/__next._index.txt +0 -5
- package/dist/interf-ui/__next._tree.txt +0 -5
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
- package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
- package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
- package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
- package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
- package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
- package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
- package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
- package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
- package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
- package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
- package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
- package/dist/interf-ui/_not-found/__next._full.txt +0 -15
- package/dist/interf-ui/_not-found/__next._head.txt +0 -5
- package/dist/interf-ui/_not-found/__next._index.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
- package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
- package/dist/interf-ui/_not-found.html +0 -1
- package/dist/interf-ui/_not-found.txt +0 -15
- package/dist/interf-ui/index.html +0 -1
- package/dist/interf-ui/index.txt +0 -20
- package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
- package/dist/packages/contracts/lib/preparation-paths.js +0 -177
- package/dist/packages/engine/action-definitions.d.ts +0 -407
- package/dist/packages/engine/action-definitions.js +0 -1158
- package/dist/packages/engine/action-values.d.ts +0 -1
- package/dist/packages/engine/action-values.js +0 -1
- package/dist/packages/engine/agents/lib/args.d.ts +0 -4
- package/dist/packages/engine/agents/lib/args.js +0 -52
- package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
- package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
- package/dist/packages/engine/agents/lib/constants.js +0 -28
- package/dist/packages/engine/agents/lib/logs.d.ts +0 -2
- package/dist/packages/engine/agents/lib/logs.js +0 -17
- package/dist/packages/engine/agents/lib/render.d.ts +0 -8
- package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
- package/dist/packages/engine/agents/lib/schema.js +0 -7
- package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
- package/dist/packages/engine/agents/lib/shells.js +0 -1052
- package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
- package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
- package/dist/packages/engine/build/billing-events.d.ts +0 -89
- package/dist/packages/engine/build/build-pipeline.js +0 -175
- package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
- package/dist/packages/engine/build/build-plan-runs.js +0 -31
- package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
- package/dist/packages/engine/build/build-stage-plan.js +0 -100
- package/dist/packages/engine/build/build-stage-runner.js +0 -94
- package/dist/packages/engine/build/build-target.js +0 -16
- package/dist/packages/engine/build/check-evaluator.js +0 -298
- package/dist/packages/engine/build/lib/schema.js +0 -316
- package/dist/packages/engine/build/reset.d.ts +0 -2
- package/dist/packages/engine/build/reset.js +0 -74
- package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
- package/dist/packages/engine/build/runtime-paths.d.ts +0 -8
- package/dist/packages/engine/build/runtime-paths.js +0 -26
- package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
- package/dist/packages/engine/build/runtime-runs.js +0 -224
- package/dist/packages/engine/build/runtime.d.ts +0 -5
- package/dist/packages/engine/build/runtime.js +0 -4
- package/dist/packages/engine/build/source-files.d.ts +0 -46
- package/dist/packages/engine/build/source-files.js +0 -149
- package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
- package/dist/packages/engine/build/state-artifacts.js +0 -14
- package/dist/packages/engine/build/state-health.d.ts +0 -4
- package/dist/packages/engine/build/state-io.d.ts +0 -11
- package/dist/packages/engine/build/state-io.js +0 -82
- package/dist/packages/engine/build/state-paths.d.ts +0 -5
- package/dist/packages/engine/build/state-paths.js +0 -16
- package/dist/packages/engine/build/state-view.d.ts +0 -5
- package/dist/packages/engine/build/state-view.js +0 -94
- package/dist/packages/engine/build/state.d.ts +0 -7
- package/dist/packages/engine/build/state.js +0 -12
- package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
- package/dist/packages/engine/build/validate-helpers.js +0 -41
- package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
- package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
- package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
- package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
- package/dist/packages/engine/cloud-seams.d.ts +0 -115
- package/dist/packages/engine/cloud-seams.js +0 -84
- package/dist/packages/engine/index.d.ts +0 -22
- package/dist/packages/engine/index.js +0 -15
- package/dist/packages/engine/instance-paths.d.ts +0 -106
- package/dist/packages/engine/instance-paths.js +0 -171
- package/dist/packages/engine/lib/schema.d.ts +0 -6304
- package/dist/packages/engine/lib/schema.js +0 -730
- package/dist/packages/engine/native-run-handlers.d.ts +0 -25
- package/dist/packages/engine/preparation-store.d.ts +0 -105
- package/dist/packages/engine/preparation-store.js +0 -213
- package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
- package/dist/packages/engine/readiness-check-draft.js +0 -111
- package/dist/packages/engine/requested-artifacts.d.ts +0 -5
- package/dist/packages/engine/routes.d.ts +0 -85
- package/dist/packages/engine/routes.js +0 -99
- package/dist/packages/engine/runtime-caches.d.ts +0 -76
- package/dist/packages/engine/runtime-caches.js +0 -191
- package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
- package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
- package/dist/packages/engine/runtime.d.ts +0 -371
- package/dist/packages/engine/runtime.js +0 -2463
- package/dist/packages/engine/server.d.ts +0 -58
- package/dist/packages/engine/server.js +0 -1399
- package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
- package/dist/packages/engine/verify/readiness-check-run.js +0 -265
- package/dist/packages/engine/verify/verify-paths.js +0 -61
- package/dist/packages/engine/verify/verify-sandbox.js +0 -88
- package/dist/packages/engine/verify/verify-specs.js +0 -114
- package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
- package/dist/packages/engine/wire-schemas.d.ts +0 -547
- package/dist/packages/engine/wire-schemas.js +0 -59
- package/dist/packages/project/index.d.ts +0 -9
- package/dist/packages/project/interf-bootstrap.d.ts +0 -1
- package/dist/packages/project/interf-bootstrap.js +0 -1
- package/dist/packages/project/interf-scaffold.d.ts +0 -3
- package/dist/packages/project/interf-scaffold.js +0 -136
- package/dist/packages/project/interf.d.ts +0 -4
- package/dist/packages/project/interf.js +0 -3
- package/dist/packages/project/lib/schema.d.ts +0 -328
- package/dist/packages/project/lib/schema.js +0 -136
- package/dist/packages/project/preparation-entries.d.ts +0 -11
- package/dist/packages/project/preparation-entries.js +0 -49
- package/dist/packages/project/source-config.d.ts +0 -46
- package/dist/packages/project/source-config.js +0 -394
- package/dist/packages/project/source-folders.d.ts +0 -11
- package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +0 -27
- package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +0 -21
- package/public-repo/plugins/README.md +0 -9
- package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
- package/public-repo/plugins/interf/.mcp.json +0 -12
- package/public-repo/plugins/interf/README.md +0 -32
- package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
- /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
- /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
- /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-types.d.ts +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { CANONICAL_LAYER_DIRS, isCanonicalDeclarationPath, layerForPath, normalizeLayerPath, } from "../../contracts/lib/context-graph-layer.js";
|
|
4
|
+
import { createBuildPlanAuthoringShell, freezeBuildPlanAuthoringShell, } from "../../runtime/agents/lib/shells.js";
|
|
5
|
+
import { asProjectDataDir, projectServiceJobShellsRoot, } from "../../contracts/lib/project-paths.js";
|
|
6
|
+
import { scanSourceContext } from "../../runtime/agents/lib/source-context-scan.js";
|
|
4
7
|
import { createScratchLocalBuildPlanPackage } from "../package/interf-build-plan-package.js";
|
|
5
8
|
import { CONTEXT_INTERFACE_FILE, listContextInterfaceArtifacts } from "../package/context-interface.js";
|
|
6
|
-
import { loadBuildPlanDefinitionFromDir, validateBuildPlanPackage,
|
|
7
|
-
import { runBuildPlanEditSession } from "./build-plan-edit-session.js";
|
|
9
|
+
import { loadBuildPlanDefinitionFromDir, validateBuildPlanPackage, } from "../package/local-build-plans.js";
|
|
10
|
+
import { runBuildPlanEditSession, SHARED_BUILD_PLAN_EDIT_RULES, } from "./build-plan-edit-session.js";
|
|
8
11
|
/**
|
|
9
12
|
* Walk build-plan.json after a successful authoring run and fill in
|
|
10
13
|
* `role: "general"` for any stage missing a role field. Custom role
|
|
@@ -61,32 +64,60 @@ function buildBuildPlanAuthoringPrompt() {
|
|
|
61
64
|
return [
|
|
62
65
|
"This is an automated Interf Build Plan authoring run, not an open-ended chat session.",
|
|
63
66
|
"Execute it now.",
|
|
64
|
-
"Create one standalone Build Plan package for the
|
|
67
|
+
"Create one standalone Build Plan package for the Source data, Project intent, requested outputs, coverage metrics, and evidence requirements behind the Source locator.",
|
|
65
68
|
"Read `runtime/authoring-context.json` first.",
|
|
66
|
-
"Treat `
|
|
69
|
+
"Treat `intent`, `requested_artifacts` (legacy field for requested outputs and graph entrypoints), `checks` (diagnostic context only), `user_prep_instructions`, and `source_context` as the user's agent task and coverage brief.",
|
|
67
70
|
`Then read \`build-plan/README.md\`, \`build-plan/build-plan.json\`, and \`build-plan/${CONTEXT_INTERFACE_FILE}\`.`,
|
|
68
71
|
"The `build-plan/` directory starts as a neutral Build Plan scaffold, not as a suggested final plan.",
|
|
69
|
-
"Replace the scaffold purpose, inputs,
|
|
70
|
-
"Read `runtime/source-
|
|
72
|
+
"Replace the scaffold purpose, inputs, outputs, stages, stage docs, coverage expectations, and query guidance with the Build Plan this agent task actually needs.",
|
|
73
|
+
"Read `runtime/source-locator.json`, then use the `source_context` inventory in `runtime/authoring-context.json` as your primary picture of what is actually in this Source: its `summary`, the `items[]` (each with `name`, `path`, `kind`, optional `page_count`, and `note`), and the listed `observations` and `limitations`. Open specific Source files through your own available tools only to confirm or fill gaps the inventory leaves open before editing the package.",
|
|
74
|
+
"Derive the stage shape from that inventory. Choose stage ids and stage labels that NAME what is genuinely present in this Source — its folder structure, the dominant file kinds, the natural groupings, and any date or period ranges the inventory reveals. Do NOT emit a generic cover/build/verify/assemble (or extract/summarize/structure/verify) skeleton unless the inventory shows the Source is genuinely unstructured and offers no better organizing principle. There is no fixed stage taxonomy: reason from this Source's inventory, not from a template.",
|
|
71
75
|
"Prefer direct file-reading and search tools over shell commands for routine file inspection.",
|
|
72
76
|
"Do not use shell helpers like `cat`, `sed`, `ls`, or `find` when a native read/search tool can inspect the same files.",
|
|
73
77
|
"Edit only files under `build-plan/`.",
|
|
74
78
|
"Keep the Build Plan valid for the current local-engine API and `build-plan.schema.json`.",
|
|
75
|
-
"
|
|
76
|
-
"
|
|
79
|
+
"Do not edit the root `brief`; the service restores it from Project intent, requested outputs, diagnostic checks, and Source context after every edit attempt.",
|
|
80
|
+
"Do not add ad-hoc top-level keys to `build-plan/build-plan.json`; only use keys already present in the scaffold or documented by the local Build Plan schema.",
|
|
81
|
+
"If you want to express user-facing promises, use the Build Plan's existing root `brief` field, `purpose.label`, `purpose.task_hint`, and requested output contract. Never add `purpose.brief` or any other ad-hoc nested promise field.",
|
|
82
|
+
"Choose stage ids, stage order, requested output reads/writes, StageManifest coverage expectations, and stage docs from the `source_context` inventory, the agent task, and the coverage brief. The stage shape must reflect this Source's real structure and content, not a reused skeleton.",
|
|
83
|
+
"Stage `reads` may only contain requested output ids that are declared in `build-plan.schema.json` and produced by an earlier stage. Source files are implicit input through runtime stage assignment; never put `source`, source file paths, or source-folder ids in stage `reads`.",
|
|
84
|
+
// Stable kebab-case-id rule (shared verbatim with the repair prompt).
|
|
85
|
+
SHARED_BUILD_PLAN_EDIT_RULES[0],
|
|
77
86
|
"Each stage MAY declare a `role`: one of `extractor`, `summarizer`, `structurer`, `verifier`, or `general`. Pick the role that best matches what the stage's prompt asks the agent to do. Omit `role` (or use `general`) when the stage doesn't fit any specialized role. Custom role names are allowed; the engine treats unknown roles as `general`.",
|
|
78
87
|
"Do not preserve the placeholder `prepare` stage unless the final Build Plan genuinely needs a stage with that exact role.",
|
|
79
|
-
"
|
|
88
|
+
"Treat `checks` as optional context, not the primary product surface.",
|
|
89
|
+
"Design coverage first: expected inputs, reviewed inputs, produced outputs, entrypoints, and missing/blocked/not-relevant coverage decisions that can roll into a GraphManifest.",
|
|
90
|
+
"For file-based Projects, every final Build Plan must preserve the Context Graph shape: `summaries/` for source coverage, `knowledge/` for task-aware claims/entities/topics/indexes, `home.md` as primary entrypoint, and `artifacts/` for supplemental task handoffs.",
|
|
91
|
+
"`summaries/` is the coverage layer. It should prove what source files were inspected. For PDFs, decks, or paginated reports, prefer page-level notes or explicit page coverage records when practical; each summary must link back to the original Source path, page, section, figure, table, or other source reference instead of copying the Source file.",
|
|
92
|
+
"`knowledge/` is the graph layer. The current default contract is flat `knowledge/*.md` notes, and may contain claims, entities, topics, and indexes. Treat knowledge notes as navigation and assurance, not as the authority for exact wording, table values, chart reads, or provenance-sensitive claims.",
|
|
93
|
+
"Knowledge notes MUST connect to the coverage layer, not orphan it. This is a hard requirement: for every summary whose evidence a knowledge/entity note draws on, that note MUST include at least one `[[summaries/<source-name>/summary]]` wikilink to that summary, IN ADDITION to its source_refs. The wikilink to the summary and the source_ref to the original are both required; one does not substitute for the other. A knowledge note that cites a source through source_refs without also linking that source's summary is INCOMPLETE and must not be treated as done. Encode this mandate in the knowledge stage's SKILL.md and in the StageManifest coverage so it is enforced, not optional — never describe it as preferred, optional, or a choice between summary links and plain source refs.",
|
|
94
|
+
"Make this mandate machine-enforced, not just prose: on the requested output for the knowledge/graph layer (the directory output that holds the `knowledge/*.md` notes), declare a required `summary_backlinks_present` deterministic check in `build-plan.schema.json`. Use the default params (summaries directory, `summary.md`, `manifest.md`) unless this Build Plan renames those, in which case pass `summaries_dir`, `summary_file`, and `manifest_file` to match. This is the only deterministic check that proves no cited summary is orphaned; every file-based Build Plan that produces a `knowledge/` layer must include it.",
|
|
95
|
+
"Enforce the WHOLE-GRAPH connectivity floor, not only the knowledge layer: `summary_backlinks_present` and `knowledge_web_connectivity` only police summaries a knowledge note CITES and the knowledge web itself — a summary no note cites or links would still ship as a free-floating island and pass readiness. To close that, declare a required `graph_notes_connected` deterministic check on the graph spine output (the `home.md` requested output, or another always-present output) in `build-plan.schema.json`. It scans the WHOLE Context Graph root by default and fails readiness if any note — including any uncited summary — is link-disconnected from every other note. Every file-based Build Plan that produces a Context Graph must include it. Its job is reachability, not a quota: an inbound OR outbound link satisfies a note. Make sure the entrypoint/coverage routing actually links every summary (directly or through a coverage index) so this floor can pass honestly.",
|
|
96
|
+
"`home.md` is the primary agent entrypoint. Supplemental graph entrypoints may live under `artifacts/` when they help the downstream agent and should tell it which original Source files, pages, figures, tables, sections, units, periods, series, and caveats matter for the task.",
|
|
97
|
+
"Requested outputs should normally route the downstream agent to the right original Source evidence. They should not present generated summaries or knowledge notes as the dataset or source of truth.",
|
|
98
|
+
"For tasks that depend on charts, tables, images, or other visual evidence, requested outputs must capture the source semantics needed to answer: target period, unit, series/legend, axis or table interpretation, exact printed values when available, bounded ranges when not, evidence tier, and source page.",
|
|
99
|
+
"For unlabeled charts, screenshots, diagrams, or visual marks, do not write a final numeric answer unless the requested output also captures a source-grounded measurement method, visual reference, axis/table calibration, and uncertainty. Otherwise the output must route the downstream agent to inspect the original Source before answering.",
|
|
100
|
+
"Do not let structural diagnostics such as file_exists, frontmatter_required_keys, or must_contain stand in for coverage or evidence fidelity. Use stage docs, StageManifest coverage, and requested output descriptions to require the semantic fields the agent task needs.",
|
|
101
|
+
"If a visual source has no printed data labels, the requested output should preserve a bounded read at source granularity and should mark unresolved semantics instead of inventing pseudo-exact precision.",
|
|
102
|
+
"Verification stages must not pass by comparing generated notes only to other generated notes. If a verifier did not inspect the relevant original Source reference, page-level summary with source refs, table extraction, visual trace, or measurement output required by the claim, it must report the claim as not verified.",
|
|
103
|
+
"Preserve `backed_by_artifact_ids` in the root Build Plan `brief` when present and use matching requested output ids in `build-plan.schema.json`.",
|
|
104
|
+
"When `runtime/authoring-context.json.artifact_requirements[]` is non-empty, it is binding: copy each requirement's `id`, `shape`, and `checks[]` exactly into `build-plan.schema.json`.",
|
|
105
|
+
"Do not rename, move, merge, split, or reinterpret required requested outputs. `stage_hint` can guide which stage writes the output, but it never changes the required `shape.path`, `shape.artifact_kind`, or diagnostic contract.",
|
|
106
|
+
"Keep deterministic validation on requested output `checks[]` minimal; do not use diagnostics as the primary proof surface.",
|
|
80
107
|
"Use only the CheckKind values listed in `runtime/authoring-context.json`; do not invent aliases.",
|
|
81
|
-
|
|
108
|
+
// Stable check-param-contract + diagnostic-description rules (shared verbatim
|
|
109
|
+
// with the repair prompt).
|
|
110
|
+
SHARED_BUILD_PLAN_EDIT_RULES[1],
|
|
111
|
+
SHARED_BUILD_PLAN_EDIT_RULES[2],
|
|
112
|
+
"Keep diagnostics aligned with produced requested outputs. Use stage docs and StageManifest coverage to describe the output contract, but do not turn source-specific user wording into brittle stage-doc wording requirements.",
|
|
82
113
|
"For every stage in `build-plan.json`, create `build-plan/build/stages/<skill_dir>/SKILL.md` and make the folder name exactly match that stage's kebab-case `skill_dir`.",
|
|
83
|
-
"Every
|
|
84
|
-
"Make the package materially specific to this
|
|
85
|
-
"Treat the Build Plan as four aligned layers: purpose, inputs,
|
|
86
|
-
"If the Build Plan writes
|
|
87
|
-
"Prefer explicit stage-doc, stage-policy, purpose, input-contract, and
|
|
114
|
+
"Every requested output path in `build-plan.schema.json` must be unique. Child outputs may live under the required layer directories `summaries/`, `knowledge/`, and `artifacts/`; unrelated output paths must not overlap.",
|
|
115
|
+
"Make the package materially specific to this Project's agent task, output shape, coverage, and evidence requirement. A no-op scaffold is not acceptable.",
|
|
116
|
+
"Treat the Build Plan as four aligned layers: purpose, inputs, requested output contract, and stages.",
|
|
117
|
+
"If the Build Plan writes `home.md`, declare it as a requested output and make the entrypoint stage own it.",
|
|
118
|
+
"Prefer explicit stage-doc, stage-policy, purpose, input-contract, and requested-output-contract edits over vague rewrites.",
|
|
88
119
|
"Do not introduce wikilinks unless the Build Plan also creates the target note by exact basename or explicit relative path.",
|
|
89
|
-
"Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read
|
|
120
|
+
"Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read outputs.",
|
|
90
121
|
"Do not make one stage point at files or notes that are only created later by another stage.",
|
|
91
122
|
"Prefer conservative retrieval routing over speculative note sprawl.",
|
|
92
123
|
"Do not narrate plans or ask follow-up questions.",
|
|
@@ -107,12 +138,45 @@ function stableJson(value) {
|
|
|
107
138
|
.map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`)
|
|
108
139
|
.join(",")}}`;
|
|
109
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Persist the authoring brief (intent, requested outputs, `source_context`,
|
|
143
|
+
* `artifact_requirements`) into the package's `build-plan.json` so the saved
|
|
144
|
+
* plan and every validation pass carry the SAME brief the shell was built
|
|
145
|
+
* from.
|
|
146
|
+
*
|
|
147
|
+
* Returns `true` when the brief was written, `false` when it could not be
|
|
148
|
+
* (missing or unparseable `build-plan.json`). The caller MUST observe the
|
|
149
|
+
* `false` case: previously this no-op was silent, so a brief carrying the
|
|
150
|
+
* Source inventory and the binding artifact requirements could be dropped
|
|
151
|
+
* with no signal — validation would then run against a plan that has no
|
|
152
|
+
* brief, and an untailored draft could persist. The drop is now reportable,
|
|
153
|
+
* never silent.
|
|
154
|
+
*/
|
|
155
|
+
function writeBuildPlanAuthoringBrief(buildPlanPath, brief) {
|
|
156
|
+
const buildPlanJsonPath = join(buildPlanPath, "build-plan.json");
|
|
157
|
+
if (!existsSync(buildPlanJsonPath))
|
|
158
|
+
return false;
|
|
159
|
+
let parsed;
|
|
160
|
+
try {
|
|
161
|
+
parsed = JSON.parse(readFileSync(buildPlanJsonPath, "utf8"));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
167
|
+
return false;
|
|
168
|
+
writeFileSync(buildPlanJsonPath, `${JSON.stringify({ ...parsed, brief }, null, 2)}\n`);
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
110
171
|
function checkMatchesRequirement(actual, required) {
|
|
111
172
|
return actual.id === required.id &&
|
|
112
173
|
actual.kind === required.kind &&
|
|
113
174
|
(actual.required ?? true) === (required.required ?? true) &&
|
|
114
175
|
stableJson(actual.params) === stableJson(required.params);
|
|
115
176
|
}
|
|
177
|
+
function compactJson(value) {
|
|
178
|
+
return JSON.stringify(value);
|
|
179
|
+
}
|
|
116
180
|
function producingStagesForArtifact(definition, artifactId) {
|
|
117
181
|
return (definition.stages ?? []).filter((stage) => Array.isArray(stage.writes) && stage.writes.includes(artifactId));
|
|
118
182
|
}
|
|
@@ -122,34 +186,372 @@ function validateArtifactRequirements(definition, requirements) {
|
|
|
122
186
|
for (const requirement of requirements) {
|
|
123
187
|
const artifact = artifacts.find((candidate) => candidate.id === requirement.id);
|
|
124
188
|
if (!artifact) {
|
|
125
|
-
errors.push(`Missing required
|
|
189
|
+
errors.push(`Missing required requested output \`${requirement.id}\`.`);
|
|
126
190
|
continue;
|
|
127
191
|
}
|
|
128
192
|
if (artifact.shape.kind !== requirement.shape.kind ||
|
|
129
193
|
artifact.shape.path !== requirement.shape.path ||
|
|
130
194
|
artifact.shape.artifact_kind !== requirement.shape.artifact_kind) {
|
|
131
|
-
errors.push(`
|
|
195
|
+
errors.push(`Requested output \`${requirement.id}\` must declare required shape ${compactJson(requirement.shape)}; found ${compactJson(artifact.shape)}.`);
|
|
132
196
|
}
|
|
133
197
|
for (const check of requirement.checks) {
|
|
134
198
|
if (!artifact.checks.some((candidate) => checkMatchesRequirement(candidate, check))) {
|
|
135
|
-
errors.push(`
|
|
199
|
+
errors.push(`Requested output \`${requirement.id}\` must include required diagnostic ${compactJson(check)}.`);
|
|
136
200
|
}
|
|
137
201
|
}
|
|
138
202
|
const producingStages = producingStagesForArtifact(definition, requirement.id);
|
|
139
203
|
if (producingStages.length === 0) {
|
|
140
|
-
errors.push(`
|
|
204
|
+
errors.push(`Requested output \`${requirement.id}\` is not written by any stage.`);
|
|
141
205
|
}
|
|
142
206
|
}
|
|
143
207
|
return errors;
|
|
144
208
|
}
|
|
145
|
-
|
|
209
|
+
/**
|
|
210
|
+
* A requested output materializes the `knowledge/` graph layer when it is a
|
|
211
|
+
* directory output whose path is `knowledge` or lives under `knowledge/`.
|
|
212
|
+
* Path-only and layer-agnostic — no Build-Plan-specific naming.
|
|
213
|
+
*/
|
|
214
|
+
function isKnowledgeLayerArtifact(artifact) {
|
|
215
|
+
if (artifact.shape.kind !== "path" || artifact.shape.artifact_kind !== "directory") {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
// Central tolerant classifier: a directory output at `knowledge` or anything
|
|
219
|
+
// under `knowledge/` (any casing) is the knowledge graph layer.
|
|
220
|
+
return layerForPath(artifact.shape.path) === "knowledge";
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Backlink guard. The product mandate is that no cited summary is left
|
|
224
|
+
* orphaned: every file-based Build Plan that produces a `knowledge/` graph
|
|
225
|
+
* layer must declare a required `summary_backlinks_present` deterministic
|
|
226
|
+
* check on the directory output holding the `knowledge/*.md` notes. That
|
|
227
|
+
* check is the only deterministic proof the graph layer connects back to the
|
|
228
|
+
* coverage layer.
|
|
229
|
+
*
|
|
230
|
+
* The authoring prompt already asks for this in prose, but prose is advisory.
|
|
231
|
+
* This guard makes it machine-enforced: if any `knowledge/` directory output
|
|
232
|
+
* exists, at least one such knowledge-layer output must carry a REQUIRED
|
|
233
|
+
* `summary_backlinks_present` check, or the package fails validation. Generic
|
|
234
|
+
* — it keys only off the layer path and the central CheckKind, never off
|
|
235
|
+
* intent or per-Build-Plan naming.
|
|
236
|
+
*/
|
|
237
|
+
function validateSummaryBacklinkGuard(definition) {
|
|
238
|
+
const artifacts = definition.build_plan_schema.artifacts ?? [];
|
|
239
|
+
const knowledgeArtifacts = artifacts.filter(isKnowledgeLayerArtifact);
|
|
240
|
+
if (knowledgeArtifacts.length === 0)
|
|
241
|
+
return [];
|
|
242
|
+
const hasRequiredBacklinkCheck = knowledgeArtifacts.some((artifact) => artifact.checks.some((check) => check.kind === "summary_backlinks_present" && (check.required ?? true)));
|
|
243
|
+
if (hasRequiredBacklinkCheck)
|
|
244
|
+
return [];
|
|
245
|
+
const layerPaths = knowledgeArtifacts
|
|
246
|
+
.map((artifact) => artifact.shape.kind === "path" ? artifact.shape.path : artifact.id)
|
|
247
|
+
.join(", ");
|
|
248
|
+
return [
|
|
249
|
+
`Build Plan produces a \`knowledge/\` graph layer (${layerPaths}) but no knowledge-layer ` +
|
|
250
|
+
"requested output declares a required `summary_backlinks_present` check. Add that check so no " +
|
|
251
|
+
"summary cited by a knowledge note is left orphaned (the graph layer must connect to the coverage layer).",
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Whole-graph connectivity floor guard. The product promise is a "deeply
|
|
256
|
+
* connected web": EVERY note across the Context Graph — including every summary,
|
|
257
|
+
* not only the ones a knowledge note happened to cite — must be reachable
|
|
258
|
+
* through the link web. The `summary_backlinks_present` guard above only covers
|
|
259
|
+
* CITED summaries, and `knowledge_web_connectivity` only the `knowledge/` layer;
|
|
260
|
+
* an uncited summary would still ship as a free-floating island and pass
|
|
261
|
+
* readiness silently. The `graph_notes_connected` check closes that floor by
|
|
262
|
+
* scanning the whole graph root.
|
|
263
|
+
*
|
|
264
|
+
* This makes the floor machine-enforced rather than advisory: a Build Plan that
|
|
265
|
+
* produces a `knowledge/` graph layer (the same trigger condition the backlink
|
|
266
|
+
* guard uses — a file-based Context Graph) must declare at least one REQUIRED
|
|
267
|
+
* `graph_notes_connected` check somewhere in its requested outputs, or the
|
|
268
|
+
* package fails validation. Generic — keys only off the layer path and the
|
|
269
|
+
* central CheckKind, never off intent or per-Build-Plan naming.
|
|
270
|
+
*/
|
|
271
|
+
function validateGraphConnectivityFloorGuard(definition) {
|
|
272
|
+
const artifacts = definition.build_plan_schema.artifacts ?? [];
|
|
273
|
+
// Same trigger as the backlink guard: a file-based Context Graph that
|
|
274
|
+
// materializes a `knowledge/` layer. A plan with no knowledge graph layer is
|
|
275
|
+
// not the connected-web product and is exempt.
|
|
276
|
+
const knowledgeArtifacts = artifacts.filter(isKnowledgeLayerArtifact);
|
|
277
|
+
if (knowledgeArtifacts.length === 0)
|
|
278
|
+
return [];
|
|
279
|
+
const hasRequiredFloorCheck = artifacts.some((artifact) => artifact.checks.some((check) => check.kind === "graph_notes_connected" && (check.required ?? true)));
|
|
280
|
+
if (hasRequiredFloorCheck)
|
|
281
|
+
return [];
|
|
282
|
+
return [
|
|
283
|
+
"Build Plan produces a Context Graph but no requested output declares a required " +
|
|
284
|
+
"`graph_notes_connected` check. Add that check (typically on the `home.md` spine output) so the " +
|
|
285
|
+
"WHOLE graph — every summary included, not only cited ones — is link-connected and no note ships " +
|
|
286
|
+
"as a free-floating island that passes readiness silently.",
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Canonical top-level-layer guard (FIXED SKELETON / FLEXIBLE INTERIOR). A Build
|
|
291
|
+
* Plan's core derived content must live under the three canonical top-level layers
|
|
292
|
+
* — `summaries/`, `knowledge/`, `artifacts/` — or the `home.md` spine. A plan may
|
|
293
|
+
* NOT invent a new top-level folder (e.g. `graph/`, `insights/`) for core content;
|
|
294
|
+
* graph-shaped content goes under `knowledge/<your-interior>/`, whose interior is
|
|
295
|
+
* free (`entities/`, `claims/`, `timelines/`, `tables/`, `atlas/`, anything).
|
|
296
|
+
*
|
|
297
|
+
* Authoring is STRICT on case: a layer must be DECLARED in exact lowercase. A
|
|
298
|
+
* mixed-case declaration like `Knowledge/` is REJECTED here, because package
|
|
299
|
+
* validation and the runtime scanners are lowercase-path based — a mixed-case
|
|
300
|
+
* declaration would pass a tolerant authoring check and then silently break
|
|
301
|
+
* downstream (`collectMarkdownFiles(graph, "knowledge")` finds nothing under
|
|
302
|
+
* `Knowledge/`). The tolerant, case-insensitive classifier (`layerForPath`)
|
|
303
|
+
* exists only to POLICE already-built outputs, never to bless a bad
|
|
304
|
+
* declaration. Both faces come from the one central layer model:
|
|
305
|
+
* `isCanonicalDeclarationPath` is the strict authoring face;
|
|
306
|
+
* `layerForPath`/`roleForPath` is the tolerant policing face.
|
|
307
|
+
*
|
|
308
|
+
* Keys ONLY off each path artifact's FIRST path segment and the central
|
|
309
|
+
* canonical set — no task taxonomy, no per-plan naming, no hardcoded interior.
|
|
310
|
+
* Only the first segment is checked, so the entire interior of `knowledge/` is
|
|
311
|
+
* allowed. Non-path artifacts declare no folder and are skipped.
|
|
312
|
+
*/
|
|
313
|
+
function validateCanonicalTopLevelLayers(definition) {
|
|
314
|
+
const errors = [];
|
|
315
|
+
for (const artifact of definition.build_plan_schema.artifacts ?? []) {
|
|
316
|
+
if (artifact.shape.kind !== "path")
|
|
317
|
+
continue;
|
|
318
|
+
const normalized = normalizeLayerPath(artifact.shape.path);
|
|
319
|
+
if (normalized.length === 0)
|
|
320
|
+
continue;
|
|
321
|
+
// Strict: exact-lowercase canonical declaration (`knowledge/…` or the exact
|
|
322
|
+
// `home.md` spine). `Knowledge/` deliberately does NOT pass.
|
|
323
|
+
if (isCanonicalDeclarationPath(normalized))
|
|
324
|
+
continue;
|
|
325
|
+
const segment = normalized.split("/")[0] ?? "";
|
|
326
|
+
// A path that the tolerant classifier WOULD route into a canonical layer but
|
|
327
|
+
// that is not an exact lowercase declaration is a case-drift declaration
|
|
328
|
+
// (e.g. `Knowledge/`). Name the canonical lowercase form it must use.
|
|
329
|
+
const classified = layerForPath(normalized);
|
|
330
|
+
const detail = classified !== "other"
|
|
331
|
+
? `Declare it in exact lowercase as \`${classified === "home" ? "home.md" : `${classified}/`}\`; ` +
|
|
332
|
+
"canonical layers must be declared lowercase so package validation and the runtime scanners find it."
|
|
333
|
+
: "Core Context Graph content must live under the canonical layers `summaries/`, `knowledge/`, " +
|
|
334
|
+
`\`artifacts/\`, or \`home.md\` (interior free, e.g. \`knowledge/<your-interior>/\`). Canonical layers: ${CANONICAL_LAYER_DIRS.join(", ")}.`;
|
|
335
|
+
errors.push(`Build Plan declares a core requested output at top-level folder \`${segment}/\` (${artifact.id}). ${detail}`);
|
|
336
|
+
}
|
|
337
|
+
return errors;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Lowercase alphanumeric tokens of length >= 3 drawn from free text. Used to
|
|
341
|
+
* compare the plan's own wording against the actual Source inventory.
|
|
342
|
+
*/
|
|
343
|
+
function tailoringTokens(text) {
|
|
344
|
+
const tokens = new Set();
|
|
345
|
+
for (const raw of text.toLowerCase().split(/[^a-z0-9]+/)) {
|
|
346
|
+
if (raw.length >= 3)
|
|
347
|
+
tokens.add(raw);
|
|
348
|
+
}
|
|
349
|
+
return tokens;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Generic structural words the contents-free scan emits for EVERY Source
|
|
353
|
+
* (boilerplate about files/folders/groups and the scan's own caveats). They
|
|
354
|
+
* carry no Source-specific signal, so they are excluded from the tailoring
|
|
355
|
+
* vocabulary — otherwise a generic skeleton could "pass" by echoing scan
|
|
356
|
+
* boilerplate. These are not intent or task words; they are the scan's own
|
|
357
|
+
* structural vocabulary.
|
|
358
|
+
*/
|
|
359
|
+
const TAILORING_STOP_TOKENS = new Set([
|
|
360
|
+
"file", "files", "folder", "folders", "root", "group", "groups", "extension",
|
|
361
|
+
"kind", "kinds", "the", "and", "across", "top", "level", "free", "source",
|
|
362
|
+
"scan", "inventory", "interf", "did", "not", "open", "read", "any", "before",
|
|
363
|
+
"locking", "stages", "treat", "counts", "lower", "bound", "some", "deep",
|
|
364
|
+
"were", "enumerated", "capped", "cost", "names", "contents", "parsed",
|
|
365
|
+
"period", "span", "reference", "filenames", "structure",
|
|
366
|
+
]);
|
|
367
|
+
/**
|
|
368
|
+
* Distinctive vocabulary the contents-free Source scan surfaced about THIS
|
|
369
|
+
* Source: folder/group names, the file-kind labels actually present, and any
|
|
370
|
+
* date/period tokens parsed from filenames. Derived entirely from the
|
|
371
|
+
* inventory — no intent keywords, no task taxonomy. Generic structural words
|
|
372
|
+
* are stripped so the vocabulary is Source-specific, not scan-specific.
|
|
373
|
+
*/
|
|
374
|
+
function sourceInventoryVocabulary(sourceContext) {
|
|
375
|
+
const vocabulary = new Set();
|
|
376
|
+
const add = (text) => {
|
|
377
|
+
if (!text)
|
|
378
|
+
return;
|
|
379
|
+
for (const token of tailoringTokens(text)) {
|
|
380
|
+
if (!TAILORING_STOP_TOKENS.has(token))
|
|
381
|
+
vocabulary.add(token);
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
// The items and observations carry the Source-specific signal (folder
|
|
385
|
+
// names, present file kinds, period tokens). The summary and limitations
|
|
386
|
+
// are mostly scan boilerplate, so they are intentionally not mined here.
|
|
387
|
+
// Callers may hand in a partial SourceContext (the type defaults `items`
|
|
388
|
+
// and `observations` to [], but raw caller objects are not re-parsed), so
|
|
389
|
+
// coalesce missing arrays defensively.
|
|
390
|
+
for (const item of sourceContext.items ?? []) {
|
|
391
|
+
add(item.name);
|
|
392
|
+
add(item.path);
|
|
393
|
+
add(item.kind);
|
|
394
|
+
add(item.note);
|
|
395
|
+
}
|
|
396
|
+
for (const observation of sourceContext.observations ?? [])
|
|
397
|
+
add(observation);
|
|
398
|
+
return vocabulary;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Tailoring guard. The original failure was a drafted Build Plan that was
|
|
402
|
+
* generic boilerplate — a cover/build/verify-style skeleton that ignored what
|
|
403
|
+
* was actually in the Source. The authoring prompt asks the agent to NAME
|
|
404
|
+
* what is present in the Source, but prose is advisory.
|
|
405
|
+
*
|
|
406
|
+
* This makes "provably tailored" machine-checked WITHOUT a task taxonomy: it
|
|
407
|
+
* derives a vocabulary from the contents-free Source inventory (folder/group
|
|
408
|
+
* names, present file kinds, period tokens) and requires the authored plan's
|
|
409
|
+
* own wording — stage ids/labels/descriptions and the purpose — to reference
|
|
410
|
+
* at least one of those Source-specific tokens. A plan that names nothing from
|
|
411
|
+
* the actual Source is, by construction, not tailored to it.
|
|
412
|
+
*
|
|
413
|
+
* It only runs when a real inventory is available; with no inventory there is
|
|
414
|
+
* nothing to tailor against, so the guard is a no-op (it never blocks on
|
|
415
|
+
* fabricated signal when the caller supplied no Source context).
|
|
416
|
+
*/
|
|
417
|
+
function validateTailoringGuard(definition, sourceContext) {
|
|
418
|
+
if (!sourceContext)
|
|
419
|
+
return [];
|
|
420
|
+
const vocabulary = sourceInventoryVocabulary(sourceContext);
|
|
421
|
+
// No distinctive Source vocabulary to tailor against (e.g. an inventory of
|
|
422
|
+
// only generic structural words). Tailoring cannot be proven either way, so
|
|
423
|
+
// do not block.
|
|
424
|
+
if (vocabulary.size === 0)
|
|
425
|
+
return [];
|
|
426
|
+
const planText = [
|
|
427
|
+
definition.purpose?.label ?? "",
|
|
428
|
+
definition.purpose?.task_hint ?? "",
|
|
429
|
+
...(definition.stages ?? []).flatMap((stage) => [
|
|
430
|
+
stage.id,
|
|
431
|
+
stage.label,
|
|
432
|
+
stage.description ?? "",
|
|
433
|
+
]),
|
|
434
|
+
].join(" ");
|
|
435
|
+
for (const token of tailoringTokens(planText)) {
|
|
436
|
+
if (vocabulary.has(token))
|
|
437
|
+
return [];
|
|
438
|
+
}
|
|
439
|
+
return [
|
|
440
|
+
"Authored Build Plan is not tailored to this Source: its stage ids, stage labels, descriptions, " +
|
|
441
|
+
"and purpose reference nothing from the Source inventory (folder names, present file kinds, or " +
|
|
442
|
+
"period tokens). Reshape the stages to name what is actually in this Source instead of a generic skeleton.",
|
|
443
|
+
];
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Does the Build Plan package at `buildPlanPath` name at least one
|
|
447
|
+
* Source-specific token from `sourceContext`? True when it is tailored to the
|
|
448
|
+
* Source (or when there is nothing to tailor against — see below), false only
|
|
449
|
+
* when a real Source vocabulary exists and the plan references none of it.
|
|
450
|
+
*
|
|
451
|
+
* Re-uses the exact draft-time tailoring guard so the two faces of "tailored"
|
|
452
|
+
* cannot drift: a plan is tailored iff `validateTailoringGuard` raises no
|
|
453
|
+
* error. A null inventory, an empty Source vocabulary, or an unloadable
|
|
454
|
+
* package all return `true` (nothing to tailor against / nothing to compare),
|
|
455
|
+
* which keeps the non-regression guard below a no-op in exactly those cases.
|
|
456
|
+
*/
|
|
457
|
+
function buildPlanIsTailoredToSource(buildPlanPath, sourceContext) {
|
|
458
|
+
const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
|
|
459
|
+
if (!definition)
|
|
460
|
+
return true;
|
|
461
|
+
return validateTailoringGuard(definition, sourceContext).length === 0;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* IMPROVE-loop tailoring NON-REGRESSION guard (the improve-path analogue of the
|
|
465
|
+
* draft-time tailoring guard).
|
|
466
|
+
*
|
|
467
|
+
* The draft guard (`validateTailoringGuard`) is an absolute "this plan must
|
|
468
|
+
* name something from the Source" check, correct for a from-scratch draft. It
|
|
469
|
+
* is the WRONG shape for the improvement loop: a user may select and improve a
|
|
470
|
+
* plan that is generic by design (the shipped `interf-default` carries no
|
|
471
|
+
* draft-time tailoring at all), and the absolute guard would reject every
|
|
472
|
+
* legitimate improvement to it the moment the Source vocabulary happened not to
|
|
473
|
+
* collide with the plan's generic wording. Running the absolute guard on
|
|
474
|
+
* improve would therefore false-reject faithful improvements, not just
|
|
475
|
+
* de-tailoring ones.
|
|
476
|
+
*
|
|
477
|
+
* The real C1 threat is narrower and is what this guards: an improvement edit
|
|
478
|
+
* must not take a plan that WAS tailored to the Source and strip that tailoring
|
|
479
|
+
* back to a generic skeleton. So this is a before/after DELTA check against the
|
|
480
|
+
* SAME scanned Source inventory: if the pre-edit plan was tailored and the
|
|
481
|
+
* post-edit plan is not, the edit de-tailored the plan and is rejected. A plan
|
|
482
|
+
* that was already generic before the edit (e.g. `interf-default`) has no
|
|
483
|
+
* tailoring to lose, so the guard is a no-op for it — improve is free to refine
|
|
484
|
+
* it without being forced to invent Source-specific vocabulary. With no
|
|
485
|
+
* Source inventory available (no Source binding, unreadable Source), there is
|
|
486
|
+
* nothing to compare and the guard is likewise a no-op.
|
|
487
|
+
*/
|
|
488
|
+
export function validateImproveTailoringNonRegression(beforeBuildPlanPath, afterBuildPlanPath, sourceContext) {
|
|
489
|
+
if (!sourceContext)
|
|
490
|
+
return [];
|
|
491
|
+
// Only a plan that was tailored BEFORE the edit can be de-tailored by it.
|
|
492
|
+
if (!buildPlanIsTailoredToSource(beforeBuildPlanPath, sourceContext))
|
|
493
|
+
return [];
|
|
494
|
+
if (buildPlanIsTailoredToSource(afterBuildPlanPath, sourceContext))
|
|
495
|
+
return [];
|
|
496
|
+
return [
|
|
497
|
+
"Improvement edit de-tailored the Build Plan: the pre-edit plan referenced this Source " +
|
|
498
|
+
"(folder names, present file kinds, or period tokens) in its stage ids, labels, descriptions, " +
|
|
499
|
+
"or purpose, but the edited plan references none of it. An improvement may refine the plan but " +
|
|
500
|
+
"must not strip its Source-specific tailoring back to a generic skeleton.",
|
|
501
|
+
];
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Re-shape a base-validation result plus extra guard errors into one result.
|
|
505
|
+
* Shared so authoring and the improvement loop fold their guard errors in the
|
|
506
|
+
* exact same way (no per-call-site re-implementation of the ok/summary logic).
|
|
507
|
+
*/
|
|
508
|
+
function withExtraGuardErrors(validation, extraErrors) {
|
|
509
|
+
if (extraErrors.length === 0)
|
|
510
|
+
return validation;
|
|
511
|
+
const errors = [...validation.errors, ...extraErrors];
|
|
512
|
+
return {
|
|
513
|
+
ok: validation.ok && errors.length === 0,
|
|
514
|
+
summary: errors.length === 0
|
|
515
|
+
? validation.summary
|
|
516
|
+
: `Build Plan package has ${errors.length} issue(s).`,
|
|
517
|
+
errors,
|
|
518
|
+
counts: validation.counts,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Lifecycle guards that apply to EVERY lifecycle stage that mutates a Build
|
|
523
|
+
* Plan package (authoring draft AND self-improvement loop): the base package
|
|
524
|
+
* validation plus the product-critical structural invariants a self-improvement
|
|
525
|
+
* run must not be allowed to silently strip —
|
|
526
|
+
* `summary_backlinks_present` (no orphaned CITED summary),
|
|
527
|
+
* `graph_notes_connected` (the WHOLE-graph connectivity floor: no uncited-summary
|
|
528
|
+
* or any-note island), and the canonical-top-level-layer rule (core content stays
|
|
529
|
+
* under `summaries/`, `knowledge/`, `artifacts/`, or `home.md`).
|
|
530
|
+
*
|
|
531
|
+
* The authoring-only guards (scaffold-removal, artifact-requirements, tailoring)
|
|
532
|
+
* live in `validateAuthoredBuildPlanPackage` because they are draft-time
|
|
533
|
+
* concerns, not improvement concerns.
|
|
534
|
+
*/
|
|
535
|
+
export function validateLifecycleBuildPlanPackage(buildPlanPath) {
|
|
146
536
|
const validation = validateBuildPlanPackage(buildPlanPath);
|
|
147
|
-
|
|
537
|
+
const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
|
|
538
|
+
if (!definition)
|
|
148
539
|
return validation;
|
|
540
|
+
return withExtraGuardErrors(validation, [
|
|
541
|
+
...validateSummaryBacklinkGuard(definition),
|
|
542
|
+
...validateGraphConnectivityFloorGuard(definition),
|
|
543
|
+
...validateCanonicalTopLevelLayers(definition),
|
|
544
|
+
]);
|
|
545
|
+
}
|
|
546
|
+
function validateAuthoredBuildPlanPackage(buildPlanPath, artifactRequirements = [], sourceContext = null) {
|
|
547
|
+
// Start from the shared lifecycle guards (base + backlink + canonical layers),
|
|
548
|
+
// then layer the authoring-only guards on top. The lifecycle guards are
|
|
549
|
+
// defined once and shared with the improvement loop.
|
|
550
|
+
const validation = validateLifecycleBuildPlanPackage(buildPlanPath);
|
|
149
551
|
const definition = loadBuildPlanDefinitionFromDir(buildPlanPath);
|
|
150
552
|
if (!definition)
|
|
151
553
|
return validation;
|
|
152
|
-
const
|
|
554
|
+
const authoringErrors = [];
|
|
153
555
|
const placeholderStage = definition.stages?.find((stage) => stage.id === "prepare" &&
|
|
154
556
|
stage.contract_type === "build-plan-draft-stage" &&
|
|
155
557
|
stage.writes.includes("draft-context"));
|
|
@@ -157,64 +559,112 @@ function validateAuthoredBuildPlanPackage(buildPlanPath, artifactRequirements =
|
|
|
157
559
|
const placeholderPurpose = definition.purpose?.label === "From-scratch Build Plan draft" ||
|
|
158
560
|
definition.purpose?.task_hint?.includes("Replace this neutral scaffold");
|
|
159
561
|
if (placeholderStage) {
|
|
160
|
-
|
|
562
|
+
authoringErrors.push("Authored Build Plan still contains the neutral scaffold stage `prepare`.");
|
|
161
563
|
}
|
|
162
564
|
if (placeholderArtifact) {
|
|
163
|
-
|
|
565
|
+
authoringErrors.push("Authored Build Plan still contains the neutral scaffold artifact `draft-context`.");
|
|
164
566
|
}
|
|
165
567
|
if (placeholderPurpose) {
|
|
166
|
-
|
|
568
|
+
authoringErrors.push("Authored Build Plan still contains the neutral scaffold purpose.");
|
|
167
569
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
summary: errors.length === 0
|
|
172
|
-
? validation.summary
|
|
173
|
-
: `Build Plan package has ${errors.length} issue(s).`,
|
|
174
|
-
errors,
|
|
175
|
-
counts: validation.counts,
|
|
176
|
-
};
|
|
570
|
+
authoringErrors.push(...validateArtifactRequirements(definition, artifactRequirements));
|
|
571
|
+
authoringErrors.push(...validateTailoringGuard(definition, sourceContext));
|
|
572
|
+
return withExtraGuardErrors(validation, authoringErrors);
|
|
177
573
|
}
|
|
178
574
|
export async function runBuildPlanAuthoringDraft(options) {
|
|
179
575
|
const buildPlanPath = createScratchLocalBuildPlanPackage({
|
|
180
|
-
|
|
576
|
+
projectDataDir: options.projectDataDir,
|
|
181
577
|
buildPlanId: options.buildPlanId,
|
|
182
578
|
label: options.label,
|
|
183
|
-
hint: options.hint,
|
|
579
|
+
hint: options.hint ?? options.intent,
|
|
184
580
|
});
|
|
581
|
+
// Resolve the Source context ONCE here so the shell's authoring-context.json
|
|
582
|
+
// and the persisted authoring brief carry the SAME value. Caller-supplied
|
|
583
|
+
// context wins (e.g. an MCP brief); otherwise run the cheap, contents-free
|
|
584
|
+
// Source scan so the auto path never feeds the draft a null inventory while
|
|
585
|
+
// the shell quietly held the real scan. This is the single source of truth
|
|
586
|
+
// for source_context across both surfaces.
|
|
587
|
+
const sourceContext = options.sourceContext ?? scanSourceContext(options.sourceFolderPath) ?? null;
|
|
588
|
+
// Create the authoring shell under the Project's durable service job storage
|
|
589
|
+
// (not /tmp) so it is preserved and inspectable like a stage shell: the
|
|
590
|
+
// rendered SKILL the agent received, its reasoning transcript, the build-plan
|
|
591
|
+
// before/after, and the validation verdict all survive for debugging.
|
|
592
|
+
const shellRoot = join(projectServiceJobShellsRoot(asProjectDataDir(options.projectDataDir)), `build-plan-author-${options.buildPlanId}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`);
|
|
185
593
|
const shell = createBuildPlanAuthoringShell({
|
|
186
594
|
buildPlanPath,
|
|
187
595
|
buildPlanId: options.buildPlanId,
|
|
188
596
|
label: options.label,
|
|
189
597
|
referenceBuildPlanId: options.baseBuildPlanId ?? null,
|
|
190
598
|
sourceFolderPath: options.sourceFolderPath,
|
|
191
|
-
|
|
599
|
+
intent: options.intent,
|
|
192
600
|
checks: options.checks ?? [],
|
|
601
|
+
userPrepInstructions: options.userPrepInstructions,
|
|
193
602
|
requestedArtifacts: options.requestedArtifacts ?? [],
|
|
194
|
-
|
|
603
|
+
sourceContext,
|
|
195
604
|
artifactRequirements: options.artifactRequirements ?? [],
|
|
605
|
+
shellRoot,
|
|
196
606
|
});
|
|
607
|
+
const authoringBrief = {
|
|
608
|
+
intent: options.intent,
|
|
609
|
+
requested_artifacts: options.requestedArtifacts ?? [],
|
|
610
|
+
checks: options.checks ?? [],
|
|
611
|
+
...(options.userPrepInstructions ? { user_prep_instructions: options.userPrepInstructions } : {}),
|
|
612
|
+
source_context: sourceContext,
|
|
613
|
+
artifact_requirements: options.artifactRequirements ?? [],
|
|
614
|
+
};
|
|
197
615
|
const session = await runBuildPlanEditSession({
|
|
198
616
|
executor: options.executor,
|
|
199
617
|
buildPlanPath,
|
|
200
618
|
shell,
|
|
201
619
|
prompt: buildBuildPlanAuthoringPrompt(),
|
|
202
|
-
validate: (buildPlanPath) =>
|
|
203
|
-
|
|
620
|
+
validate: (buildPlanPath) => {
|
|
621
|
+
// Restore the brief BEFORE validating so coverage runs against the same
|
|
622
|
+
// source_context + artifact_requirements the shell was built from. If
|
|
623
|
+
// the restore can't land (missing/unparseable build-plan.json), do NOT
|
|
624
|
+
// silently validate a brief-less plan — fail loudly so the drop is
|
|
625
|
+
// visible instead of producing a plan that lost its tailoring inputs.
|
|
626
|
+
const briefWritten = writeBuildPlanAuthoringBrief(buildPlanPath, authoringBrief);
|
|
627
|
+
const result = validateAuthoredBuildPlanPackage(buildPlanPath, options.artifactRequirements ?? [], sourceContext);
|
|
628
|
+
if (briefWritten)
|
|
629
|
+
return result;
|
|
630
|
+
const errors = [
|
|
631
|
+
"Could not restore the authoring brief into build-plan.json (file missing or unparseable); " +
|
|
632
|
+
"refusing to accept a draft that dropped its source_context and artifact_requirements.",
|
|
633
|
+
...result.errors,
|
|
634
|
+
];
|
|
635
|
+
return {
|
|
636
|
+
ok: false,
|
|
637
|
+
summary: `Build Plan package has ${errors.length} issue(s).`,
|
|
638
|
+
errors,
|
|
639
|
+
counts: result.counts,
|
|
640
|
+
};
|
|
641
|
+
},
|
|
642
|
+
maxValidationRepairAttempts: 2,
|
|
204
643
|
onStatus: options.onStatus,
|
|
205
644
|
});
|
|
206
645
|
if (session.status !== "updated") {
|
|
207
646
|
rmSync(buildPlanPath, { recursive: true, force: true });
|
|
208
647
|
}
|
|
209
648
|
else {
|
|
210
|
-
//
|
|
649
|
+
// auto-fill `role: "general"` for any stage the agent
|
|
211
650
|
// didn't explicitly tag. Idempotent and silent when every stage
|
|
212
651
|
// already declares a role.
|
|
213
652
|
const touched = ensureStageRoles(buildPlanPath);
|
|
214
653
|
if (touched.length > 0 && options.onStatus) {
|
|
215
654
|
options.onStatus(`STATUS: filled role=general on ${touched.length} stage(s) the author didn't tag (${touched.join(", ")}).`);
|
|
216
655
|
}
|
|
656
|
+
// Final brief restore on the persisted package. `ensureStageRoles` may
|
|
657
|
+
// have rewritten build-plan.json, so re-stamp the brief and surface the
|
|
658
|
+
// rare case where it can't land rather than shipping a brief-less plan.
|
|
659
|
+
if (!writeBuildPlanAuthoringBrief(buildPlanPath, authoringBrief) && options.onStatus) {
|
|
660
|
+
options.onStatus("ERROR: could not restore the authoring brief into the saved Build Plan (source_context/artifact_requirements dropped).");
|
|
661
|
+
}
|
|
217
662
|
}
|
|
663
|
+
// Freeze the shell so the draft execution is preserved and inspectable: the
|
|
664
|
+
// path is unchanged (so result.shellPath stays valid), symlinks are
|
|
665
|
+
// materialized into real files, and a preserved-shell manifest is written.
|
|
666
|
+
// Best-effort — a preservation hiccup must never fail the draft itself.
|
|
667
|
+
freezeBuildPlanAuthoringShell(shell.rootPath);
|
|
218
668
|
return {
|
|
219
669
|
status: session.status,
|
|
220
670
|
changed: session.changed,
|
|
@@ -224,6 +674,3 @@ export async function runBuildPlanAuthoringDraft(options) {
|
|
|
224
674
|
shellPath: shell.rootPath,
|
|
225
675
|
};
|
|
226
676
|
}
|
|
227
|
-
export function resolveBuildPlanDraftPath(sourcePath, buildPlanId) {
|
|
228
|
-
return buildPlanDefinitionPath(sourcePath, buildPlanId);
|
|
229
|
-
}
|