dorfl 0.0.0 → 0.1.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/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UNIFIED review-verdict type + parser + the shared JSON-verdict-contract
|
|
3
|
+
* prompt helper for the runner-invoked **review discipline**
|
|
4
|
+
* (`work/protocol/REVIEW-PROTOCOL.md`, source-of-truth
|
|
5
|
+
* `skills/setup/protocol/REVIEW-PROTOCOL.md`).
|
|
6
|
+
*
|
|
7
|
+
* This is the keystone of the `runner-invoked-disciplines-into-protocol` prd
|
|
8
|
+
* (task 1, D4): every runner-invoked review prompt builder
|
|
9
|
+
* ({@link buildReviewPrompt}, {@link buildTaskAcceptancePrompt} in
|
|
10
|
+
* `review-gate.ts`; {@link buildLoneTaskReviewPrompt} in `intake.ts`;
|
|
11
|
+
* {@link buildTaskReviewPrompt} in `tasker-review-loop.ts`) POINTS at
|
|
12
|
+
* `REVIEW-PROTOCOL.md` for the discipline + calls {@link verdictContractPrompt}
|
|
13
|
+
* for the JSON-emitted-shape prose. None of them re-inlines the lenses or the
|
|
14
|
+
* verdict contract; this module is the single home.
|
|
15
|
+
*
|
|
16
|
+
* The PARSER is the source of truth for the EMITTED SHAPE (D2):
|
|
17
|
+
* `REVIEW-PROTOCOL.md` mirrors what `parseReviewVerdict` enforces (a
|
|
18
|
+
* fixture-matches-doc test pins the two together). Discipline content is owned
|
|
19
|
+
* by the doc; enforced shape is owned by the parser.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {extractJsonObjectSpan} from './verdict-json.js';
|
|
23
|
+
import {resolveProtocolDoc} from './prompt.js';
|
|
24
|
+
|
|
25
|
+
/** A single review finding — the `severity`/`question`/`context` triple. */
|
|
26
|
+
export interface ReviewFinding {
|
|
27
|
+
/** Whether this finding blocks (keeps the work out of "ready") or is a nit. */
|
|
28
|
+
severity: 'blocking' | 'non-blocking';
|
|
29
|
+
/** The question / defect, with enough context to act. */
|
|
30
|
+
question: string;
|
|
31
|
+
/** The relevant excerpt, `file:line`, or reasoning. */
|
|
32
|
+
context?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A full-content edit the review agent wants applied (the improver loop's
|
|
37
|
+
* between-passes step). `path` is repo-relative; `content` is the FULL
|
|
38
|
+
* replacement file body. The runner writes it; the agent does no disk/git.
|
|
39
|
+
*/
|
|
40
|
+
export interface TaskEdit {
|
|
41
|
+
/** Repo-relative path of the candidate task file to write. */
|
|
42
|
+
path: string;
|
|
43
|
+
/** The full replacement content for that file. */
|
|
44
|
+
content: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* A task the review judged UNCERTAIN — emit it `needsAnswers: true` with the
|
|
49
|
+
* questions in its body. Used by the tasker improver loop's non-converge sink.
|
|
50
|
+
*/
|
|
51
|
+
export interface UncertainTask {
|
|
52
|
+
/** Repo-relative path of the uncertain candidate task. */
|
|
53
|
+
path: string;
|
|
54
|
+
/** The open questions to record in the task body. */
|
|
55
|
+
questions: string[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The UNIFIED review verdict — one type across all four runner-invoked review
|
|
60
|
+
* call sites. The required fields (`verdict`, `findings`) are common; the
|
|
61
|
+
* optional channels are caller-specific (each builder's prompt names which
|
|
62
|
+
* channels to fill). The parser tolerates any subset; routing code reads only
|
|
63
|
+
* the channels its caller asked for.
|
|
64
|
+
*/
|
|
65
|
+
export interface ReviewVerdict {
|
|
66
|
+
/** `approve` lets the artifact proceed; `block` routes to needs-attention. */
|
|
67
|
+
verdict: 'approve' | 'block';
|
|
68
|
+
/** The findings the agent surfaced (may be empty on an approve). */
|
|
69
|
+
findings: ReviewFinding[];
|
|
70
|
+
/**
|
|
71
|
+
* For the PR/code review gate: the deliberately-authored, human-readable
|
|
72
|
+
* REVIEW prose the in-core PR-comment poster posts. Advisory only — never
|
|
73
|
+
* gates the verdict (routing uses ONLY `verdict`/`findings`).
|
|
74
|
+
*/
|
|
75
|
+
review?: string;
|
|
76
|
+
/** For the tasker improver loop: full-content edits to apply between passes. */
|
|
77
|
+
edits?: TaskEdit[];
|
|
78
|
+
/**
|
|
79
|
+
* For the lone-task review: a single in-memory full-replacement task BODY
|
|
80
|
+
* (the markdown AFTER the frontmatter), applied before the next round.
|
|
81
|
+
*/
|
|
82
|
+
edit?: string;
|
|
83
|
+
/** For the lone-task review: open question(s) carried into the ASK comment. */
|
|
84
|
+
questions?: string[];
|
|
85
|
+
/** For the tasker improver loop: specific tasks to emit `needsAnswers: true`. */
|
|
86
|
+
uncertainTasks?: UncertainTask[];
|
|
87
|
+
/** For the tasker improver loop: route the WHOLE prd to needs-attention. */
|
|
88
|
+
decompositionUnclear?: {questions: string[]};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Raised when the review agent ran but produced no parseable verdict. */
|
|
92
|
+
export class ReviewParseError extends Error {}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Parse the unified review verdict out of the review agent's textual output.
|
|
96
|
+
* The agent may wrap the JSON object in prose / a fenced block, so the first
|
|
97
|
+
* JSON object carrying a `verdict` field is extracted via the shared
|
|
98
|
+
* {@link extractJsonObjectSpan}, JSON-parsed, and validated. The verdict shape
|
|
99
|
+
* is the source of truth for what `REVIEW-PROTOCOL.md` describes (D2).
|
|
100
|
+
*
|
|
101
|
+
* Throws {@link ReviewParseError} on: no JSON object, invalid JSON, or a
|
|
102
|
+
* `verdict` not in `{approve, block}`. The caller treats any throw as
|
|
103
|
+
* needs-attention — NEVER a silent approve.
|
|
104
|
+
*/
|
|
105
|
+
export function parseReviewVerdict(output: string): ReviewVerdict {
|
|
106
|
+
const span = extractJsonObjectSpan(output);
|
|
107
|
+
if (span === undefined) {
|
|
108
|
+
throw new ReviewParseError(
|
|
109
|
+
'review agent produced no parseable {verdict, findings} result',
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const slice = output.slice(span.start, span.end);
|
|
113
|
+
let parsed: unknown;
|
|
114
|
+
try {
|
|
115
|
+
// STRICT FIRST: already-valid JSON parses here and is returned UNTOUCHED —
|
|
116
|
+
// the repair pass never runs for it (no chance to alter a correct payload).
|
|
117
|
+
parsed = JSON.parse(slice);
|
|
118
|
+
} catch (strictErr) {
|
|
119
|
+
// ONE lenient repair pass for the CONTROL-CHAR class (raw newline / tab / CR /
|
|
120
|
+
// other C0 char left unescaped inside a string field, common on large diffs +
|
|
121
|
+
// weaker models). The repair is NARROW: it only escapes control chars INSIDE
|
|
122
|
+
// strings; it NEVER touches JSON structure or token values (no trailing-comma
|
|
123
|
+
// stripping, no quoting bare tokens, no coercion), so it can never launder a
|
|
124
|
+
// genuinely-malformed or meaningfully-WRONG verdict into a false approve/block.
|
|
125
|
+
// A still-failing parse re-throws the ORIGINAL strict error (so direction-1's
|
|
126
|
+
// `runGate2Review` catch routes it to needs-attention, never a silent approve).
|
|
127
|
+
// NOTE the boundary: this does NOT fix an unescaped inner double-quote (which
|
|
128
|
+
// mis-bounds the extracted span before repair even runs); that class is handled
|
|
129
|
+
// by routing (direction 1) + the tightened contract (direction 3).
|
|
130
|
+
try {
|
|
131
|
+
parsed = JSON.parse(repairJsonControlChars(slice));
|
|
132
|
+
} catch {
|
|
133
|
+
throw new ReviewParseError(
|
|
134
|
+
`review verdict was not valid JSON: ${(strictErr as Error).message}`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// A repaired parse STILL flows through validation, so a repaired
|
|
139
|
+
// `{"verdict":"maybe"}` (valid JSON, invalid VALUE) still throws here — the
|
|
140
|
+
// repair recovers SYNTAX, never bypasses the verdict-VALUE contract.
|
|
141
|
+
return validateVerdict(parsed);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The NARROW lenient repair (direction 2): walk the extracted JSON slice and
|
|
146
|
+
* escape any raw control char (a C0 char `< 0x20`, which JSON forbids inside a
|
|
147
|
+
* string literal) that appears INSIDE a string. OUTSIDE a string the structure
|
|
148
|
+
* is left byte-for-byte untouched. Escape-tracking is load-bearing: an escaped
|
|
149
|
+
* `\"` must NOT be read as the string's closing quote (or a following raw
|
|
150
|
+
* newline would be mis-handled). This recovers ONLY the control-char class; it
|
|
151
|
+
* performs NO structural change and NO token coercion, so it cannot turn a real
|
|
152
|
+
* reject into a false approve.
|
|
153
|
+
*/
|
|
154
|
+
function repairJsonControlChars(text: string): string {
|
|
155
|
+
let out = '';
|
|
156
|
+
let inString = false;
|
|
157
|
+
let escaped = false;
|
|
158
|
+
for (let i = 0; i < text.length; i++) {
|
|
159
|
+
const ch = text[i];
|
|
160
|
+
const code = ch.charCodeAt(0);
|
|
161
|
+
if (inString) {
|
|
162
|
+
if (escaped) {
|
|
163
|
+
out += ch;
|
|
164
|
+
escaped = false;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (ch === '\\') {
|
|
168
|
+
out += ch;
|
|
169
|
+
escaped = true;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (ch === '"') {
|
|
173
|
+
out += ch;
|
|
174
|
+
inString = false;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (code < 0x20) {
|
|
178
|
+
if (ch === '\n') out += '\\n';
|
|
179
|
+
else if (ch === '\t') out += '\\t';
|
|
180
|
+
else if (ch === '\r') out += '\\r';
|
|
181
|
+
else out += '\\u' + code.toString(16).padStart(4, '0');
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
out += ch;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (ch === '"') {
|
|
188
|
+
inString = true;
|
|
189
|
+
}
|
|
190
|
+
out += ch;
|
|
191
|
+
}
|
|
192
|
+
return out;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function validateVerdict(parsed: unknown): ReviewVerdict {
|
|
196
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
197
|
+
throw new ReviewParseError('review verdict was not an object');
|
|
198
|
+
}
|
|
199
|
+
const obj = parsed as Record<string, unknown>;
|
|
200
|
+
const verdict = obj.verdict;
|
|
201
|
+
if (verdict !== 'approve' && verdict !== 'block') {
|
|
202
|
+
throw new ReviewParseError(
|
|
203
|
+
`review verdict was not 'approve' or 'block' (got ${JSON.stringify(verdict)})`,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
const rawFindings = Array.isArray(obj.findings) ? obj.findings : [];
|
|
207
|
+
const findings: ReviewFinding[] = rawFindings.map((f) => {
|
|
208
|
+
const item = (typeof f === 'object' && f !== null ? f : {}) as Record<
|
|
209
|
+
string,
|
|
210
|
+
unknown
|
|
211
|
+
>;
|
|
212
|
+
const severity = item.severity === 'blocking' ? 'blocking' : 'non-blocking';
|
|
213
|
+
return {
|
|
214
|
+
severity,
|
|
215
|
+
question: typeof item.question === 'string' ? item.question : '',
|
|
216
|
+
...(typeof item.context === 'string' ? {context: item.context} : {}),
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const edits = parseEdits(obj.edits);
|
|
220
|
+
const uncertainTasks = parseUncertainTasks(obj.uncertainTasks);
|
|
221
|
+
const decompositionUnclear = parseDecompositionUnclear(
|
|
222
|
+
obj.decompositionUnclear,
|
|
223
|
+
);
|
|
224
|
+
const questions = Array.isArray(obj.questions)
|
|
225
|
+
? obj.questions.filter((q): q is string => typeof q === 'string')
|
|
226
|
+
: [];
|
|
227
|
+
return {
|
|
228
|
+
verdict,
|
|
229
|
+
findings,
|
|
230
|
+
...(typeof obj.review === 'string' ? {review: obj.review} : {}),
|
|
231
|
+
...(typeof obj.edit === 'string' ? {edit: obj.edit} : {}),
|
|
232
|
+
...(edits.length > 0 ? {edits} : {}),
|
|
233
|
+
...(questions.length > 0 ? {questions} : {}),
|
|
234
|
+
...(uncertainTasks.length > 0 ? {uncertainTasks} : {}),
|
|
235
|
+
...(decompositionUnclear ? {decompositionUnclear} : {}),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function parseEdits(raw: unknown): TaskEdit[] {
|
|
240
|
+
if (!Array.isArray(raw)) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
const out: TaskEdit[] = [];
|
|
244
|
+
for (const e of raw) {
|
|
245
|
+
if (typeof e !== 'object' || e === null) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
const item = e as Record<string, unknown>;
|
|
249
|
+
if (typeof item.path === 'string' && typeof item.content === 'string') {
|
|
250
|
+
out.push({path: item.path, content: item.content});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function parseUncertainTasks(raw: unknown): UncertainTask[] {
|
|
257
|
+
if (!Array.isArray(raw)) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
const out: UncertainTask[] = [];
|
|
261
|
+
for (const u of raw) {
|
|
262
|
+
if (typeof u !== 'object' || u === null) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
const item = u as Record<string, unknown>;
|
|
266
|
+
if (typeof item.path !== 'string') {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const questions = Array.isArray(item.questions)
|
|
270
|
+
? item.questions.filter((q): q is string => typeof q === 'string')
|
|
271
|
+
: [];
|
|
272
|
+
out.push({path: item.path, questions});
|
|
273
|
+
}
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function parseDecompositionUnclear(
|
|
278
|
+
raw: unknown,
|
|
279
|
+
): {questions: string[]} | undefined {
|
|
280
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
const item = raw as Record<string, unknown>;
|
|
284
|
+
const questions = Array.isArray(item.questions)
|
|
285
|
+
? item.questions.filter((q): q is string => typeof q === 'string')
|
|
286
|
+
: [];
|
|
287
|
+
return {questions};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* The shared JSON-verdict-contract prompt block — ONE function, called by all
|
|
292
|
+
* four review-prompt builders. Returns the prose describing the unified
|
|
293
|
+
* {@link ReviewVerdict} emitted shape (the prose mirrors what
|
|
294
|
+
* {@link parseReviewVerdict} enforces; D2). Per-builder framing (who you are,
|
|
295
|
+
* what you are reviewing, which optional channels to fill) stays in each
|
|
296
|
+
* builder; this block is the single source of truth for the shape.
|
|
297
|
+
*
|
|
298
|
+
* The block is intentionally generous about optional channels — each caller's
|
|
299
|
+
* prompt names which ones it wants. Unused channels are ignored by the parser.
|
|
300
|
+
*/
|
|
301
|
+
export function verdictContractPrompt(): string {
|
|
302
|
+
return [
|
|
303
|
+
'## Your output \u2014 ONE single JSON object (no prose OUTSIDE it)',
|
|
304
|
+
'',
|
|
305
|
+
'Emit a single JSON object of this exact shape (see',
|
|
306
|
+
'`work/protocol/REVIEW-PROTOCOL.md` \u2192 "Your output" for the prose-described',
|
|
307
|
+
'contract this mirrors). The example below is EXPANDED over several lines for',
|
|
308
|
+
'READABILITY, but you MUST emit it MINIFIED \u2014 ONE single line, no newlines',
|
|
309
|
+
'between the keys:',
|
|
310
|
+
'',
|
|
311
|
+
'```json',
|
|
312
|
+
'{"verdict": "approve" | "block",',
|
|
313
|
+
' "findings": [',
|
|
314
|
+
' {"severity": "blocking" | "non-blocking", "question": "\u2026", "context": "\u2026"}',
|
|
315
|
+
' ],',
|
|
316
|
+
' "review": "<the human-readable PR-comment prose, when the caller asks for it>",',
|
|
317
|
+
' "edits": [ {"path": "work/tasks/backlog/<slug>.md", "content": "<full replacement>"} ],',
|
|
318
|
+
' "edit": "<single in-memory replacement body, for the lone-task review>",',
|
|
319
|
+
' "questions": ["<open question for the human>"],',
|
|
320
|
+
' "uncertainTasks": [ {"path": "work/tasks/backlog/<slug>.md", "questions": ["\u2026"]} ],',
|
|
321
|
+
' "decompositionUnclear": {"questions": ["\u2026"]}}',
|
|
322
|
+
'```',
|
|
323
|
+
'',
|
|
324
|
+
'- `verdict` MUST be exactly `approve` or `block`. Use `block` with at least',
|
|
325
|
+
' one blocking finding when the artifact does not deliver / drifts / hides',
|
|
326
|
+
' a defect a human reviewer would flag; otherwise `approve`.',
|
|
327
|
+
"- `findings` is required (may be empty). Each finding's `severity` is",
|
|
328
|
+
' `blocking` (keeps the item out of "ready") or `non-blocking` (a nit /',
|
|
329
|
+
' future improvement). Give each `question` enough context to act WITHOUT',
|
|
330
|
+
' re-deriving it. `context` is the relevant excerpt, `file:line`, or',
|
|
331
|
+
' reasoning.',
|
|
332
|
+
'- The optional channels (`review`, `edits`, `edit`, `questions`,',
|
|
333
|
+
' `uncertainTasks`, `decompositionUnclear`) are OPT-IN: only fill the ones',
|
|
334
|
+
" the caller's framing names. Unused channels are ignored.",
|
|
335
|
+
'',
|
|
336
|
+
parseableJsonContractPrompt('verdict', 'review'),
|
|
337
|
+
].join('\n');
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* The shared "emit DEFENSIVE, parseable, minified JSON" contract block — the
|
|
342
|
+
* hard-won discipline that stops a weak model from stranding the run with an
|
|
343
|
+
* unparseable emit (a dropped escape on an inner `"`, a raw newline in a string,
|
|
344
|
+
* an over-long field). It was learned on the Gate-2 verdict seam
|
|
345
|
+
* (observation `gate2-review-verdict-json-parse-crash-on-large-diffs`) and is
|
|
346
|
+
* now SHARED so EVERY agent→JSON→dispatch seam carries it, not just the verdict
|
|
347
|
+
* gate: {@link verdictContractPrompt} appends it, and so does the SURFACE gate's
|
|
348
|
+
* `buildSurfacePrompt` (observation
|
|
349
|
+
* `surface-rung-agent-emits-no-parseable-questions` — the same class of failure
|
|
350
|
+
* on the surface rung, where the prompt previously lacked this hardening AND
|
|
351
|
+
* showed a multi-line example that invited pretty-printing).
|
|
352
|
+
*
|
|
353
|
+
* @param emitNoun what the emitted object is called in prose (`verdict` /
|
|
354
|
+
* `result`) — only the wording differs; the discipline is identical.
|
|
355
|
+
* @param longestField the name of the field most likely to be long (the one to
|
|
356
|
+
* length-cap), or undefined to omit the length-cap bullet.
|
|
357
|
+
*/
|
|
358
|
+
export function parseableJsonContractPrompt(
|
|
359
|
+
emitNoun = 'verdict',
|
|
360
|
+
longestField?: string,
|
|
361
|
+
): string {
|
|
362
|
+
const lengthCap =
|
|
363
|
+
longestField === undefined
|
|
364
|
+
? []
|
|
365
|
+
: [
|
|
366
|
+
`- Keep the LONGEST field (\`${longestField}\`) under ~1500 characters; say`,
|
|
367
|
+
' less, not more. A long, multi-paragraph field is exactly what corrupts',
|
|
368
|
+
' the JSON.',
|
|
369
|
+
];
|
|
370
|
+
return [
|
|
371
|
+
'### Keep the JSON PARSEABLE (this is where weak models fail)',
|
|
372
|
+
'',
|
|
373
|
+
`A malformed ${emitNoun} strands the work, so emit DEFENSIVELY:`,
|
|
374
|
+
'- Emit it MINIFIED: ONE single line, no pretty-printing, no blank lines.',
|
|
375
|
+
'- INSIDE every string value, do NOT use a literal double-quote `"`. If you',
|
|
376
|
+
' must quote something in prose, PARAPHRASE it or use SINGLE quotes \u2014 a',
|
|
377
|
+
` dropped escape on an inner \`"\` is the #1 cause of an unparseable ${emitNoun}.`,
|
|
378
|
+
'- Keep every string field SHORT and SINGLE-LINE. Do NOT embed a raw newline,',
|
|
379
|
+
' tab, or other control char in a string; if you genuinely need a break, write',
|
|
380
|
+
' the two characters `\\n` (a backslash then n), never a real newline.',
|
|
381
|
+
...lengthCap,
|
|
382
|
+
].join('\n');
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* The shared prompt block that POINTS the spawned agent at the in-band review
|
|
387
|
+
* discipline doc (`work/protocol/REVIEW-PROTOCOL.md` in the set-up target repo,
|
|
388
|
+
* or the vendored fallback) instead of re-inlining the lenses. The four review
|
|
389
|
+
* builders call this so the discipline content lives in ONE place
|
|
390
|
+
* (`REVIEW-PROTOCOL.md`), never duplicated in the prompt builders.
|
|
391
|
+
*/
|
|
392
|
+
export function reviewDisciplinePrompt(): string {
|
|
393
|
+
return [
|
|
394
|
+
'## The review discipline',
|
|
395
|
+
'',
|
|
396
|
+
'Run the review discipline defined in `work/protocol/REVIEW-PROTOCOL.md`',
|
|
397
|
+
'(the in-band, protocol-native review protocol every set-up repo carries;',
|
|
398
|
+
'the human-facing pointer is `skills/review/SKILL.md`). Apply its lenses',
|
|
399
|
+
'IN ORDER, ENDING in the destination check ("if this is built/merged',
|
|
400
|
+
'exactly as written, do we end up with the system the prd/task',
|
|
401
|
+
'goal describes?"). Be ADVERSARIAL; verify against what ACTUALLY LANDED',
|
|
402
|
+
'(the bytes on disk), not intent. Weight findings by REAL impact \u2014 the',
|
|
403
|
+
'lenses find candidates, impact decides severity (a technically-true nit',
|
|
404
|
+
'no one would hit is not a block). Flag, do not guess.',
|
|
405
|
+
].join('\n');
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Resolve `REVIEW-PROTOCOL.md` in the target repo / vendored fallback / dev
|
|
410
|
+
* walk \u2014 a thin alias around {@link resolveProtocolDoc} for callers (and
|
|
411
|
+
* tests) that want to assert the doc is reachable. The four builders themselves
|
|
412
|
+
* do NOT call this (they reference the path BY NAME in the prompt prose, so the
|
|
413
|
+
* spawned agent reads its repo's own `work/protocol/REVIEW-PROTOCOL.md`), but
|
|
414
|
+
* keeping the helper here lets the resolver test cover the protocol-doc set in
|
|
415
|
+
* one place.
|
|
416
|
+
*/
|
|
417
|
+
export function resolveReviewProtocolPath(
|
|
418
|
+
cwd?: string,
|
|
419
|
+
override?: string,
|
|
420
|
+
): string {
|
|
421
|
+
return resolveProtocolDoc('REVIEW-PROTOCOL.md', cwd, override);
|
|
422
|
+
}
|