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
package/src/scan.ts
ADDED
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
import type {Config} from './config.js';
|
|
2
|
+
import type {ConfigOverrideMap} from './config-override.js';
|
|
3
|
+
import {resolveEligibility, type EligibilityResult} from './eligibility.js';
|
|
4
|
+
import {
|
|
5
|
+
ledgerRead,
|
|
6
|
+
type LedgerReadyItem,
|
|
7
|
+
type LedgerSpecPool,
|
|
8
|
+
type LocalLedgerState,
|
|
9
|
+
} from './ledger-read.js';
|
|
10
|
+
import {listMirrors} from './registry.js';
|
|
11
|
+
import {
|
|
12
|
+
fetchMirrorMainOrWarn,
|
|
13
|
+
resolveRepoConfigFromMirror,
|
|
14
|
+
} from './repo-mirror.js';
|
|
15
|
+
import {resolveRepoConfig} from './repo-config.js';
|
|
16
|
+
import {taskableSpecs} from './select-priority.js';
|
|
17
|
+
import {
|
|
18
|
+
lintLocalLedger,
|
|
19
|
+
lintRefLedger,
|
|
20
|
+
type DuplicateSlug,
|
|
21
|
+
} from './ledger-lint.js';
|
|
22
|
+
import {
|
|
23
|
+
gatherLifecycleInPlace,
|
|
24
|
+
gatherLifecycleMirror,
|
|
25
|
+
} from './lifecycle-gather.js';
|
|
26
|
+
import type {LifecyclePoolGates} from './lifecycle-pools.js';
|
|
27
|
+
import {
|
|
28
|
+
heldTaskSlugs,
|
|
29
|
+
listItemLockEntries,
|
|
30
|
+
type LockEntry,
|
|
31
|
+
} from './item-lock.js';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The CREATE-side lifecycle gates for the propose-matrix lifecycle pool, derived
|
|
35
|
+
* from a repo's resolved config. Maps the config's question-surfacing gate family
|
|
36
|
+
* onto the boolean {@link LifecyclePoolGates} `buildLifecyclePools` takes:
|
|
37
|
+
*
|
|
38
|
+
* - `observationTriage !== 'off'` ⇒ `triage` ON (BOTH `ask` and `auto` enumerate
|
|
39
|
+
* triage candidates into the matrix identically; the ask/auto distinction is a
|
|
40
|
+
* DISPOSITION concern enforced LATER by the triage rung itself, not by whether
|
|
41
|
+
* a leg exists — the matrix only decides "is there a leg at all?").
|
|
42
|
+
* - `surfaceBlockers` ⇒ `surface` ON.
|
|
43
|
+
*
|
|
44
|
+
* `apply` is NOT a gate (CONSUME is always-on; `buildLifecyclePools` enumerates
|
|
45
|
+
* answered sidecars regardless), so a committed answer always applies even with
|
|
46
|
+
* both create-gates calm — the same create-vs-consume invariant the autopick
|
|
47
|
+
* drivers honour (ADR `ci-config-policy-and-gate-family` §4). Reused on BOTH the
|
|
48
|
+
* mirror (`scan`) and in-place (`scanRepoPaths`) substrates so the propose matrix
|
|
49
|
+
* agrees with the `advance -n` / `run` selection.
|
|
50
|
+
*/
|
|
51
|
+
export function lifecycleGatesFrom(config: {
|
|
52
|
+
observationTriage: string;
|
|
53
|
+
surfaceBlockers: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Spec `staging-surface-and-apply-promote-safety` F2 — the gate that widens
|
|
56
|
+
* the SURFACE candidate set into STAGING (`tasks/backlog/` + `prds/proposed/`).
|
|
57
|
+
* Threaded here so the `scan --json` `lifecycle.surface[]` reflects the
|
|
58
|
+
* expanded pool and the CI matrix enumerates staging surface legs. BUILD/claim
|
|
59
|
+
* stays pool-only — only this lifecycle path widens.
|
|
60
|
+
*/
|
|
61
|
+
surfaceStaging: boolean;
|
|
62
|
+
}): LifecyclePoolGates {
|
|
63
|
+
return {
|
|
64
|
+
triage: config.observationTriage !== 'off',
|
|
65
|
+
surface: config.surfaceBlockers === true,
|
|
66
|
+
surfaceStaging: config.surfaceStaging === true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A lifecycle item as it appears on a {@link RepoReport.lifecycle} sub-pool: the
|
|
72
|
+
* bare `slug` plus, for surface/apply, the `namespace` discriminator the matrix
|
|
73
|
+
* `jq` projects into a `task:`/`spec:`/`observation:` prefix. Triage items carry
|
|
74
|
+
* only `{slug}` — the `obs:` prefix is fixed in the matrix `jq`.
|
|
75
|
+
*/
|
|
76
|
+
export interface ScannedTriageItem {
|
|
77
|
+
slug: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A surface/apply lifecycle item, with its namespace. SURFACE only ever carries
|
|
81
|
+
* `needsAnswers` task/prd items (an observation with no sidecar goes to `triage`,
|
|
82
|
+
* not `surface`). APPLY, however, ALSO carries an ANSWERED OBSERVATION: since the
|
|
83
|
+
* classifier (`buildLifecyclePools`) routes an observation whose sidecar is
|
|
84
|
+
* all-answered to `apply` (CONSUME, always-on), the projection MUST keep it here
|
|
85
|
+
* so the CI enumerate `jq` (`.namespace + ":" + .slug`) emits an `observation:<slug>`
|
|
86
|
+
* apply leg. Dropping it (the pre-`route-answered-observation-sidecar-to-apply-pool`
|
|
87
|
+
* assumption that apply is task/spec-only) STRANDS every answered observation:
|
|
88
|
+
* gone from `triage` AND absent from `apply`, so CI never schedules it.
|
|
89
|
+
*/
|
|
90
|
+
export interface ScannedBlockedItem {
|
|
91
|
+
namespace: 'task' | 'spec' | 'observation';
|
|
92
|
+
slug: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The per-repo LIFECYCLE pool on `scan --json` (the `triage`/`surface`/`apply`
|
|
97
|
+
* companion of `items[]`/`prds[]`), gated by the per-repo question-surfacing
|
|
98
|
+
* config and computed by REUSING `lifecycle-gather.ts` → {@link buildLifecyclePools}
|
|
99
|
+
* (NOT a forked predicate) so it AGREES with the `advance -n` / `run` selection.
|
|
100
|
+
* This is what makes the propose-mode CI matrix enumerate the WHOLE answer-loop —
|
|
101
|
+
* `obs:<slug>` triage legs, `task:`/`spec:<slug>` surface legs (`needsAnswers`, no
|
|
102
|
+
* answered sidecar) AND `task:`/`spec:<slug>` apply legs (`needsAnswers`, answered
|
|
103
|
+
* sidecar) — not only build/task legs
|
|
104
|
+
* (`ci-propose-matrix-enumerates-lifecycle-items`). Inert by default: with
|
|
105
|
+
* `observationTriage:off` + `surfaceBlockers:false` (the calm defaults) triage +
|
|
106
|
+
* surface are empty; apply is the always-on consume pool.
|
|
107
|
+
*/
|
|
108
|
+
export interface ScannedLifecycle {
|
|
109
|
+
/** Untriaged observations → `obs:<slug>` legs (gated by `observationTriage`). */
|
|
110
|
+
triage: ScannedTriageItem[];
|
|
111
|
+
/** `needsAnswers` task/prd items with no answered sidecar → surface legs (gated by `surfaceBlockers`). */
|
|
112
|
+
surface: ScannedBlockedItem[];
|
|
113
|
+
/**
|
|
114
|
+
* Items WITH an all-answered sidecar → apply legs (CONSUME, always-on). Carries
|
|
115
|
+
* `needsAnswers` tasks/prds AND answered OBSERVATIONS (namespace `'observation'`),
|
|
116
|
+
* so the matrix `jq` emits `task:`/`spec:`/`observation:` apply legs alike.
|
|
117
|
+
*/
|
|
118
|
+
apply: ScannedBlockedItem[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* One agent-POOL task with its parsed gate/deps, before eligibility resolution.
|
|
123
|
+
* This IS the read seam's resolved pool shape ({@link LedgerReadyItem}); the
|
|
124
|
+
* `Ready` noun follows the agent-pool folder `work/tasks/ready/` (staging is
|
|
125
|
+
* `work/tasks/backlog/`), per ADR `rename-task-pool-folder-todo-to-ready`.
|
|
126
|
+
*/
|
|
127
|
+
export type ReadyItem = LedgerReadyItem;
|
|
128
|
+
|
|
129
|
+
/** A pool item plus its resolved eligibility verdict. */
|
|
130
|
+
export interface ScannedItem extends ReadyItem {
|
|
131
|
+
eligibility: EligibilityResult;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A PRD entry in `scan --json`'s taskable-prd pool — the SAME shape an eligible
|
|
136
|
+
* task carries in `items[]` (a `slug` + an `eligibility.eligible` boolean), so
|
|
137
|
+
* the propose-matrix `jq` filter mirrors the task one: `select(.eligibility.eligible)
|
|
138
|
+
* | "spec:" + .slug`. "Eligible" here means TASKABLE — the per-repo `autoTask`
|
|
139
|
+
* gate + the `humanOnly`/`needsAnswers`/`taskedAfter` predicates of `taskableSpecs`
|
|
140
|
+
* (`autoslice-gate`'s pure predicate). Sits under {@link RepoReport.prds} (and
|
|
141
|
+
* the cwd section's `repo.prds`), DISTINCT from the task-only `items[]` because
|
|
142
|
+
* tasks and prds are different verbs and project to different `task:`/`spec:`
|
|
143
|
+
* prefixes — a discriminator on `items[]` would pollute the surface other readers
|
|
144
|
+
* already consume.
|
|
145
|
+
*/
|
|
146
|
+
export interface ScannedSpec {
|
|
147
|
+
slug: string;
|
|
148
|
+
eligibility: {eligible: boolean};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** All scanned pool (`work/tasks/ready/`) items for one participating repo. */
|
|
152
|
+
export interface RepoReport {
|
|
153
|
+
/**
|
|
154
|
+
* The repo identity for this row. In the registry model (`scan`) it is the
|
|
155
|
+
* hub-mirror PATH; for the working-tree scan (`run`, in-place) it is the
|
|
156
|
+
* working checkout path.
|
|
157
|
+
*/
|
|
158
|
+
path: string;
|
|
159
|
+
items: ScannedItem[];
|
|
160
|
+
/**
|
|
161
|
+
* The TASKABLE-SPEC pool for this repo (the `specs[]` companion of `items[]`):
|
|
162
|
+
* every spec in `work/prds/ready/` not already in `work/prds/tasked/`, each tagged with
|
|
163
|
+
* `eligibility.eligible` from {@link taskableSpecs} (the SAME `autoslice-gate`
|
|
164
|
+
* predicate the mirror-side pool scan uses — NOT a forked predicate). This is
|
|
165
|
+
* what makes the propose-mode CI matrix enumerate `spec:<slug>` legs for ready
|
|
166
|
+
* ungated prds alongside `task:<slug>` legs for eligible tasks (the
|
|
167
|
+
* `ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices` task): the
|
|
168
|
+
* propose `enumerate` `jq` unions both pools and emits one matrix leg per item.
|
|
169
|
+
* The `autoTask` gate still BINDS — a repo with `autoTask` off yields an
|
|
170
|
+
* all-`eligible:false` pool (so no `spec:` legs).
|
|
171
|
+
*/
|
|
172
|
+
specs: ScannedSpec[];
|
|
173
|
+
/**
|
|
174
|
+
* The per-repo LIFECYCLE pool (the `triage`/`surface`/`apply` companion of
|
|
175
|
+
* `items[]`/`prds[]`): untriaged observations + `needsAnswers` tasks/prds split
|
|
176
|
+
* by sidecar answered-state, gated by this repo's `observationTriage` /
|
|
177
|
+
* `surfaceBlockers` config and computed by REUSING `lifecycle-gather.ts` (NOT a
|
|
178
|
+
* forked predicate). Surfaced on BOTH `repos[]` (mirror) and `cwd.repo`
|
|
179
|
+
* (in-place), the same dual-surface `items`/`prds` use, so the propose-mode CI
|
|
180
|
+
* matrix can enumerate the WHOLE answer-loop
|
|
181
|
+
* (`ci-propose-matrix-enumerates-lifecycle-items`). Inert with the calm-default
|
|
182
|
+
* gates (empty triage/surface; apply is the always-on consume pool).
|
|
183
|
+
*/
|
|
184
|
+
lifecycle: ScannedLifecycle;
|
|
185
|
+
/**
|
|
186
|
+
* The one-slug-one-folder LINT result (prd `ledger-integrity` story 3): any
|
|
187
|
+
* slug present in MORE THAN ONE `work/` status folder in THIS repo's ledger.
|
|
188
|
+
* Empty ⇒ a clean ledger. Non-empty ⇒ a corrupt ledger the formatter WARNS
|
|
189
|
+
* about loudly and a human must resolve (never auto-fixed). Derived by listing
|
|
190
|
+
* folder residence, not from any index.
|
|
191
|
+
*/
|
|
192
|
+
ledgerDuplicates: DuplicateSlug[];
|
|
193
|
+
/**
|
|
194
|
+
* The PER-ITEM LOCK in-flight view for this repo (prd
|
|
195
|
+
* `ledger-status-per-item-lock-refs` US #8; task
|
|
196
|
+
* `needs-attention-as-stuck-lock-state`): the held lock entries read from the
|
|
197
|
+
* repo's `refs/dorfl/lock/*` refs — `active` holds (in-progress) and
|
|
198
|
+
* `stuck` holds (needs-attention) + reasons. ADDITIVE to the folder-based pool
|
|
199
|
+
* view above (the interim dual-write half; eligibility/selection stay OFFLINE on
|
|
200
|
+
* `main` from the pool `tasks/ready/`, with held slugs SUBTRACTED — this field is the
|
|
201
|
+
* read-only surface, NOT a selection input). Empty on a repo with no held locks
|
|
202
|
+
* or when the lock refs could not be read (best-effort, see
|
|
203
|
+
* {@link listItemLockEntries}). Optional so older literals stay valid.
|
|
204
|
+
*/
|
|
205
|
+
lockHeld?: LockEntry[];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** The full cross-repo scan result. */
|
|
209
|
+
export interface ScanReport {
|
|
210
|
+
repos: RepoReport[];
|
|
211
|
+
totalItems: number;
|
|
212
|
+
totalEligible: number;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Collect the set of slugs present in a repo's `work/done/`. Used to resolve
|
|
217
|
+
* `blockedBy` (per-repo only). Falls back to the filename when an item has no
|
|
218
|
+
* `slug` frontmatter. Resolves THROUGH the read seam's local-tree method
|
|
219
|
+
* ({@link ledgerRead}) — the single insertion point for the `work/` state read.
|
|
220
|
+
*/
|
|
221
|
+
export function readDoneSlugs(repoPath: string): Set<string> {
|
|
222
|
+
return ledgerRead.resolveLocalState({repoPath}).doneSlugs;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Read and parse every `work/tasks/ready/*.md` (the agent POOL) for a repo, sorted
|
|
227
|
+
* by slug. Resolves THROUGH the read seam's local-tree method
|
|
228
|
+
* ({@link ledgerRead}).
|
|
229
|
+
*/
|
|
230
|
+
export function readReadyItems(repoPath: string): ReadyItem[] {
|
|
231
|
+
return ledgerRead.resolveLocalState({repoPath}).ready;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Resolve a per-repo `ScannedItem[]` from an already-resolved `work/` state +
|
|
236
|
+
* the repo's `autoBuild` policy. The shared core of BOTH the registry scan
|
|
237
|
+
* (mirror-ref state) and the working-tree scan (`run`/in-place) — neither learns
|
|
238
|
+
* how the `work/` state was read; they just hand it here. Exported so the
|
|
239
|
+
* MIRROR-SIDE pool scan (`mirror-pool-scan.ts`) scores the bare-mirror task pool
|
|
240
|
+
* through the EXACT same eligibility path as in-place (`do-autopick`), not a fork.
|
|
241
|
+
*/
|
|
242
|
+
/**
|
|
243
|
+
* Score a prd pool down to its TASKABLE subset, then label every prd with
|
|
244
|
+
* `eligibility.eligible` (true ⇔ taskable). REUSES {@link taskableSpecs} —
|
|
245
|
+
* the SAME `autoslice-gate` predicate the mirror-side `scanMirrorPool` + the
|
|
246
|
+
* in-place `do-autopick` pool already run — so what is taskable does not
|
|
247
|
+
* fork between the autopick paths and the propose-matrix `scan --json` pool.
|
|
248
|
+
* The `autoTask` gate BINDS through that predicate; a config-less repo with
|
|
249
|
+
* `autoTask` off yields an all-`eligible:false` pool (no `spec:` legs).
|
|
250
|
+
*/
|
|
251
|
+
export function scoreSpecs(
|
|
252
|
+
repoPath: string,
|
|
253
|
+
pool: LedgerSpecPool,
|
|
254
|
+
autoTask: boolean,
|
|
255
|
+
): ScannedSpec[] {
|
|
256
|
+
const taskable = new Set(
|
|
257
|
+
taskableSpecs({
|
|
258
|
+
candidates: pool.specs.map((p) => ({
|
|
259
|
+
repoPath,
|
|
260
|
+
slug: p.slug,
|
|
261
|
+
humanOnly: p.humanOnly,
|
|
262
|
+
needsAnswers: p.needsAnswers,
|
|
263
|
+
taskedAfter: p.taskedAfter,
|
|
264
|
+
})),
|
|
265
|
+
taskedSlugs: pool.taskedSlugs,
|
|
266
|
+
autoTask,
|
|
267
|
+
}).map((p) => p.slug),
|
|
268
|
+
);
|
|
269
|
+
return pool.specs.map((p) => ({
|
|
270
|
+
slug: p.slug,
|
|
271
|
+
eligibility: {eligible: taskable.has(p.slug)},
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Project the shared {@link buildLifecyclePools} result (via `gatherLifecycle*`)
|
|
277
|
+
* onto the `scan --json` {@link ScannedLifecycle} shape: triage items keep only
|
|
278
|
+
* their `slug` (the `obs:` prefix is fixed in the matrix `jq`), surface/apply keep
|
|
279
|
+
* `{namespace, slug}` so the `jq` projects the right `task:`/`spec:` prefix. NOT a
|
|
280
|
+
* re-enumeration — a pure shape map over the already-gated pools.
|
|
281
|
+
*
|
|
282
|
+
* The pool items' `namespace` is the wider {@link SelectedNamespace}. SURFACE by
|
|
283
|
+
* construction only carries `'task'`/`'prd'` (an observation with no sidecar is a
|
|
284
|
+
* `triage` candidate, never `surface`), so it narrows + drops any non-task/prd
|
|
285
|
+
* defensively. APPLY additionally admits `'observation'` (an answered observation
|
|
286
|
+
* sidecar → apply), and it MUST be kept so the matrix `jq` emits its
|
|
287
|
+
* `observation:<slug>` apply leg — narrowing it away here is exactly what stranded
|
|
288
|
+
* answered observations (present in neither `triage` nor `apply`). Any OTHER
|
|
289
|
+
* namespace is still dropped defensively.
|
|
290
|
+
*/
|
|
291
|
+
export function toScannedLifecycle(pools: {
|
|
292
|
+
triage: {slug: string}[];
|
|
293
|
+
surface: {namespace: string; slug: string}[];
|
|
294
|
+
apply: {namespace: string; slug: string}[];
|
|
295
|
+
}): ScannedLifecycle {
|
|
296
|
+
const BLOCKED_NAMESPACES = new Set(['task', 'spec', 'observation']);
|
|
297
|
+
// SURFACE stays task/spec-only; APPLY additionally keeps an answered observation.
|
|
298
|
+
const asBlocked = (
|
|
299
|
+
items: {namespace: string; slug: string}[],
|
|
300
|
+
allowObservation: boolean,
|
|
301
|
+
): ScannedBlockedItem[] =>
|
|
302
|
+
items
|
|
303
|
+
.filter(
|
|
304
|
+
(i) =>
|
|
305
|
+
i.namespace === 'task' ||
|
|
306
|
+
i.namespace === 'spec' ||
|
|
307
|
+
(allowObservation && i.namespace === 'observation'),
|
|
308
|
+
)
|
|
309
|
+
.filter((i) => BLOCKED_NAMESPACES.has(i.namespace))
|
|
310
|
+
.map((i) => ({
|
|
311
|
+
namespace: i.namespace as 'task' | 'spec' | 'observation',
|
|
312
|
+
slug: i.slug,
|
|
313
|
+
}));
|
|
314
|
+
return {
|
|
315
|
+
triage: pools.triage.map((t) => ({slug: t.slug})),
|
|
316
|
+
surface: asBlocked(pools.surface, false),
|
|
317
|
+
apply: asBlocked(pools.apply, true),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export function scoreItems(
|
|
322
|
+
state: Pick<LocalLedgerState, 'ready' | 'doneSlugs'>,
|
|
323
|
+
autoBuild: boolean,
|
|
324
|
+
counts: {totalItems: number; totalEligible: number},
|
|
325
|
+
heldSlugs: Set<string> = new Set(),
|
|
326
|
+
): ScannedItem[] {
|
|
327
|
+
// HELD-SLUG SUBTRACTION (prd `ledger-status-per-item-lock-refs` US #15; task
|
|
328
|
+
// `claim-acquires-unified-lock-no-body-move`): exclude any pool slug whose
|
|
329
|
+
// per-item lock is currently held — the eligible pool is "in `tasks/ready/` on
|
|
330
|
+
// `main` AND no lock held".
|
|
331
|
+
//
|
|
332
|
+
// LOAD-BEARING since the lock cut-over: the claim NO LONGER moves the body to
|
|
333
|
+
// `in-progress/` (it stays at `tasks/ready/` on `main`, the held lock IS the
|
|
334
|
+
// claim), so this subtraction is the ONLY thing keeping a claimed / in-flight
|
|
335
|
+
// item out of the eligible pool, NOT the redundant belt-and-suspenders it was
|
|
336
|
+
// while the body-move still removed claimed items. An ACTIVE (in-progress) lock
|
|
337
|
+
// is a legitimate, primary claim signal here.
|
|
338
|
+
//
|
|
339
|
+
// FAIL-OPEN CAVEAT (known defect; selection should fail CLOSED): the held set
|
|
340
|
+
// is gathered by the CALLER and is EMPTY when the lock read is
|
|
341
|
+
// unavailable/offline, so a READ FAULT currently degrades to "subtract nothing"
|
|
342
|
+
// and an in-flight item can leak back into the pool (re-claimed → empty diff →
|
|
343
|
+
// spurious `stuck`). Now that the subtraction is load-bearing this is wrong for
|
|
344
|
+
// SELECTION: a failed lock read must not re-make a held item eligible. See the
|
|
345
|
+
// observation/task on fail-closed lock-read for selection.
|
|
346
|
+
return state.ready
|
|
347
|
+
.filter((item) => !heldSlugs.has(item.slug))
|
|
348
|
+
.map((item) => {
|
|
349
|
+
const eligibility = resolveEligibility({
|
|
350
|
+
humanOnly: item.humanOnly,
|
|
351
|
+
needsAnswers: item.needsAnswers,
|
|
352
|
+
blockedBy: item.blockedBy,
|
|
353
|
+
doneSlugs: state.doneSlugs,
|
|
354
|
+
autoBuild,
|
|
355
|
+
});
|
|
356
|
+
counts.totalItems++;
|
|
357
|
+
if (eligibility.eligible) {
|
|
358
|
+
counts.totalEligible++;
|
|
359
|
+
}
|
|
360
|
+
return {...item, eligibility};
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Read-only end-to-end scan over the REGISTRY (ADR §1): enumerate the registered
|
|
366
|
+
* hub mirrors under `<workspacesDir>/repos/`, **fetch each mirror's `main` first**
|
|
367
|
+
* (ADR §5/§6 — the remote is the source of truth in the registry model), then read
|
|
368
|
+
* each one's full `work/` lifecycle from its BARE `main` ref through the read
|
|
369
|
+
* seam's mirror method (mirrors have no working tree — `resolveLocalState`'s
|
|
370
|
+
* `readdirSync` cannot read them), and resolve eligibility per item (autonomy
|
|
371
|
+
* gate + per-repo `blockedBy`). Claims and runs nothing.
|
|
372
|
+
*
|
|
373
|
+
* **Fetch-first, never fatal:** the old "scan is always offline" invariant is
|
|
374
|
+
* RETIRED (it was the roots-local model); `scan` now refreshes each mirror's
|
|
375
|
+
* `main` before reading. A failed fetch (offline, dead arbiter) is NOT an error —
|
|
376
|
+
* it WARNS via `warn` and falls back to that mirror's last-known `main`, so the
|
|
377
|
+
* queue still reports (its freshness = the last successful fetch). This does NOT
|
|
378
|
+
* change the ledger read STRATEGY (`claim-ledger-vs-protected-main.md`): the
|
|
379
|
+
* offline read of `<mirror>/main:work/...` stays the single strategy — `scan`
|
|
380
|
+
* merely ensures that ref is fresh before reading it.
|
|
381
|
+
*
|
|
382
|
+
* Discovery is the registered hub-mirror set, NOT a config `roots` walk (there is
|
|
383
|
+
* no `roots`/`remotes` field). `scan`/`status` share the {@link listMirrors}
|
|
384
|
+
* primitive; the per-repo `work/` read goes through the seam's mirror-ref method.
|
|
385
|
+
*
|
|
386
|
+
* The autonomy gate's `autoBuild` policy is resolved PER REPO. NOTE: a bare
|
|
387
|
+
* mirror has no checked-out `.dorfl.json`, so the per-repo file cannot be
|
|
388
|
+
* read from it — the global/env-resolved policy applies (the per-repo override is
|
|
389
|
+
* a working-checkout concern, served by {@link scanRepoPaths}).
|
|
390
|
+
*/
|
|
391
|
+
export async function scan(
|
|
392
|
+
config: Config,
|
|
393
|
+
options: {
|
|
394
|
+
warn?: (message: string) => void;
|
|
395
|
+
env?: NodeJS.ProcessEnv;
|
|
396
|
+
/**
|
|
397
|
+
* The per-machine {@link ConfigOverrideMap} (from `loadConfigOverride`),
|
|
398
|
+
* threaded into the SAME per-repo resolution `do`/`run` use so the override
|
|
399
|
+
* applies to the registry-scan path too (ADR
|
|
400
|
+
* `per-machine-config-override-layer`). Default: empty (no override) —
|
|
401
|
+
* byte-identical to pre-override behaviour.
|
|
402
|
+
*/
|
|
403
|
+
override?: ConfigOverrideMap;
|
|
404
|
+
} = {},
|
|
405
|
+
): Promise<ScanReport> {
|
|
406
|
+
const mirrors = listMirrors({
|
|
407
|
+
workspacesDir: config.workspacesDir,
|
|
408
|
+
env: options.env,
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
const repos: RepoReport[] = [];
|
|
412
|
+
const counts = {totalItems: 0, totalEligible: 0};
|
|
413
|
+
|
|
414
|
+
for (const mirror of mirrors) {
|
|
415
|
+
// Fetch-first (ADR §5/§6): refresh this mirror's `main` so the read below
|
|
416
|
+
// sees the remote truth. Never fatal — a failed fetch WARNS and falls back to
|
|
417
|
+
// the mirror's last-known `main` (the read strategy is unchanged).
|
|
418
|
+
fetchMirrorMainOrWarn({
|
|
419
|
+
mirrorPath: mirror.path,
|
|
420
|
+
warn: options.warn,
|
|
421
|
+
env: options.env,
|
|
422
|
+
});
|
|
423
|
+
// Read the full `work/` lifecycle from the mirror's bare `main` ref through
|
|
424
|
+
// the read seam (git ls-tree/show; NOT a working-tree read).
|
|
425
|
+
const state = await ledgerRead.resolveMirrorState({
|
|
426
|
+
mirrorPath: mirror.path,
|
|
427
|
+
env: options.env,
|
|
428
|
+
});
|
|
429
|
+
const autoBuild = resolveRepoConfig({
|
|
430
|
+
repoPath: mirror.path,
|
|
431
|
+
global: config,
|
|
432
|
+
override: options.override,
|
|
433
|
+
}).config.autoBuild;
|
|
434
|
+
// Held-slug subtraction: a bare hub mirror's arbiter is its `origin`. Reads
|
|
435
|
+
// the lock refs from the mirror's origin; non-fatal (empty set on any fault),
|
|
436
|
+
// so the read-only scan degrades gracefully exactly as its config reads do.
|
|
437
|
+
const heldSlugs = await heldTaskSlugs(mirror.path, 'origin', options.env);
|
|
438
|
+
// The PER-ITEM LOCK in-flight view (prd US #8; task
|
|
439
|
+
// `needs-attention-as-stuck-lock-state`): ADDITIONALLY read the full held
|
|
440
|
+
// lock entries (action × state + reason) from the mirror's lock refs, so the
|
|
441
|
+
// scan surfaces held (in-progress) + stuck (needs-attention) items. Read from
|
|
442
|
+
// the mirror's `origin` (the SAME handle the held-slug subtraction uses);
|
|
443
|
+
// best-effort (empty list on any fault), so the read-only scan degrades
|
|
444
|
+
// gracefully. This is a SURFACE only — eligibility/selection stay offline on
|
|
445
|
+
// `main` (the subtraction above), not gated on this view.
|
|
446
|
+
const lockHeld = await listItemLockEntries(
|
|
447
|
+
mirror.path,
|
|
448
|
+
'origin',
|
|
449
|
+
options.env,
|
|
450
|
+
);
|
|
451
|
+
// Spec pool — the TASKABLE-PRD companion of the task pool above
|
|
452
|
+
// (`ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices`). Resolve
|
|
453
|
+
// `autoTask` PER REPO from the mirror's COMMITTED `.dorfl.json`
|
|
454
|
+
// (exactly as the mirror-side pool scan does — NOT forked); a read fault is
|
|
455
|
+
// non-fatal (warn + global fall-back), since `scan` is read-only and must
|
|
456
|
+
// degrade gracefully (ADR §5/§6).
|
|
457
|
+
let repoAutoTask = config.autoTask;
|
|
458
|
+
try {
|
|
459
|
+
repoAutoTask = resolveRepoConfigFromMirror({
|
|
460
|
+
mirrorPath: mirror.path,
|
|
461
|
+
global: config,
|
|
462
|
+
env: options.env,
|
|
463
|
+
override: options.override,
|
|
464
|
+
}).autoTask;
|
|
465
|
+
} catch (err) {
|
|
466
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
467
|
+
options.warn?.(
|
|
468
|
+
`could not read the target repo's config from ${mirror.path}/main; ` +
|
|
469
|
+
`resolving autoTask from global + default. ${reason}`,
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
const specPool = await ledgerRead.resolveMirrorSpecPool({
|
|
473
|
+
mirrorPath: mirror.path,
|
|
474
|
+
env: options.env,
|
|
475
|
+
});
|
|
476
|
+
const specs = scoreSpecs(mirror.path, specPool, repoAutoTask);
|
|
477
|
+
// The per-repo LIFECYCLE pool (`ci-propose-matrix-enumerates-lifecycle-items`),
|
|
478
|
+
// gated by this mirror's question-surfacing config (resolved from its committed
|
|
479
|
+
// `.dorfl.json`, with the same non-fatal global fall-back as `autoTask`
|
|
480
|
+
// above) and computed by REUSING `gatherLifecycleMirror` → `buildLifecyclePools`
|
|
481
|
+
// (NOT a forked predicate), so it AGREES with the `run` selection.
|
|
482
|
+
let repoLifecycleConfig = {
|
|
483
|
+
observationTriage: config.observationTriage as string,
|
|
484
|
+
surfaceBlockers: config.surfaceBlockers,
|
|
485
|
+
surfaceStaging: config.surfaceStaging,
|
|
486
|
+
};
|
|
487
|
+
try {
|
|
488
|
+
const resolved = resolveRepoConfigFromMirror({
|
|
489
|
+
mirrorPath: mirror.path,
|
|
490
|
+
global: config,
|
|
491
|
+
env: options.env,
|
|
492
|
+
override: options.override,
|
|
493
|
+
});
|
|
494
|
+
repoLifecycleConfig = {
|
|
495
|
+
observationTriage: resolved.observationTriage,
|
|
496
|
+
surfaceBlockers: resolved.surfaceBlockers,
|
|
497
|
+
surfaceStaging: resolved.surfaceStaging,
|
|
498
|
+
};
|
|
499
|
+
} catch {
|
|
500
|
+
// Non-fatal: a config read fault already WARNED on the `autoTask` read
|
|
501
|
+
// above; fall back to the global-resolved gates (scan is read-only and must
|
|
502
|
+
// degrade gracefully, ADR §5/§6).
|
|
503
|
+
}
|
|
504
|
+
const lifecycle = toScannedLifecycle(
|
|
505
|
+
await gatherLifecycleMirror({
|
|
506
|
+
mirrorPath: mirror.path,
|
|
507
|
+
gates: lifecycleGatesFrom(repoLifecycleConfig),
|
|
508
|
+
env: options.env,
|
|
509
|
+
}),
|
|
510
|
+
);
|
|
511
|
+
// The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
|
|
512
|
+
// status folder from the mirror's committed `main` tree (the SAME `ls-tree`
|
|
513
|
+
// read the seam uses), so a corrupt ledger is surfaced LOUDLY by the formatter.
|
|
514
|
+
const ledgerDuplicates = lintRefLedger('main', mirror.path, options.env);
|
|
515
|
+
repos.push({
|
|
516
|
+
path: mirror.path,
|
|
517
|
+
items: scoreItems(state, autoBuild, counts, heldSlugs),
|
|
518
|
+
specs,
|
|
519
|
+
lifecycle,
|
|
520
|
+
ledgerDuplicates,
|
|
521
|
+
lockHeld,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
return {
|
|
526
|
+
repos,
|
|
527
|
+
totalItems: counts.totalItems,
|
|
528
|
+
totalEligible: counts.totalEligible,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Read-only scan over an EXPLICIT set of working checkouts, used by the in-place
|
|
534
|
+
* worker paths (`run`) that operate on a real checkout rather than the registry's
|
|
535
|
+
* bare mirrors. This is a working-TREE read (it has nothing to fetch — the
|
|
536
|
+
* checkout IS the local state); the fetch-first contract (ADR §5/§6) applies to
|
|
537
|
+
* the REGISTRY `scan` above, which refreshes each bare mirror before reading.
|
|
538
|
+
* Reads each repo's `work/` via the read seam's local-tree method and honours its
|
|
539
|
+
* per-repo `.dorfl.json` `autoBuild`. The registry `scan` above is the
|
|
540
|
+
* mirror-ref counterpart; this is its working-tree sibling.
|
|
541
|
+
*/
|
|
542
|
+
export function scanRepoPaths(
|
|
543
|
+
repoPaths: string[],
|
|
544
|
+
config: Config,
|
|
545
|
+
/**
|
|
546
|
+
* The HELD-SLUG set to SUBTRACT from each repo's pool (`tasks/ready/`) (prd
|
|
547
|
+
* `ledger-status-per-item-lock-refs` US #15). This is a WORKING-TREE, OFFLINE
|
|
548
|
+
* scan (it has no arbiter handle to fetch the lock refs from — that is the
|
|
549
|
+
* registry `scan`'s job), so the held set is supplied by the in-place CALLER
|
|
550
|
+
* (which knows its arbiter) and DEFAULTS to empty: with the body still moving to
|
|
551
|
+
* `in-progress/` on claim the subtraction is redundant-but-harmless, so omitting
|
|
552
|
+
* it preserves the offline read while keeping the seam in place for task #9.
|
|
553
|
+
*/
|
|
554
|
+
heldSlugs: Set<string> = new Set(),
|
|
555
|
+
/**
|
|
556
|
+
* The per-machine {@link ConfigOverrideMap} — threaded into the per-repo
|
|
557
|
+
* resolution so the override applies to the in-place scan path too. Default:
|
|
558
|
+
* empty (no override).
|
|
559
|
+
*/
|
|
560
|
+
override?: ConfigOverrideMap,
|
|
561
|
+
): ScanReport {
|
|
562
|
+
const repos: RepoReport[] = [];
|
|
563
|
+
const counts = {totalItems: 0, totalEligible: 0};
|
|
564
|
+
|
|
565
|
+
for (const path of repoPaths) {
|
|
566
|
+
const state = ledgerRead.resolveLocalState({repoPath: path});
|
|
567
|
+
const resolved = resolveRepoConfig({
|
|
568
|
+
repoPath: path,
|
|
569
|
+
global: config,
|
|
570
|
+
override,
|
|
571
|
+
}).config;
|
|
572
|
+
// Spec pool — the TASKABLE-PRD companion of the task pool. Resolve
|
|
573
|
+
// `autoTask` PER REPO from the working-tree `.dorfl.json` (the same
|
|
574
|
+
// way `autoBuild` is resolved); `taskableSpecs` (the SAME `autoslice-gate`
|
|
575
|
+
// predicate the autopick paths run) decides what is taskable — no forked
|
|
576
|
+
// predicate. This is what makes the propose-mode CI matrix enumerate `spec:`
|
|
577
|
+
// legs (see `ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices`).
|
|
578
|
+
const specPool = ledgerRead.resolveSpecPool({repoPath: path});
|
|
579
|
+
const specs = scoreSpecs(path, specPool, resolved.autoTask);
|
|
580
|
+
// The per-repo LIFECYCLE pool (`ci-propose-matrix-enumerates-lifecycle-items`),
|
|
581
|
+
// gated by this working tree's `observationTriage` / `surfaceBlockers` (resolved
|
|
582
|
+
// the same way as `autoBuild`/`autoTask`) and computed by REUSING
|
|
583
|
+
// `gatherLifecycleInPlace` → `buildLifecyclePools` (NOT a forked predicate). CI
|
|
584
|
+
// runs IN-PLACE, so this is the surface the propose matrix reads.
|
|
585
|
+
const lifecycle = toScannedLifecycle(
|
|
586
|
+
gatherLifecycleInPlace({
|
|
587
|
+
repoPath: path,
|
|
588
|
+
gates: lifecycleGatesFrom({
|
|
589
|
+
observationTriage: resolved.observationTriage,
|
|
590
|
+
surfaceBlockers: resolved.surfaceBlockers,
|
|
591
|
+
surfaceStaging: resolved.surfaceStaging,
|
|
592
|
+
}),
|
|
593
|
+
}),
|
|
594
|
+
);
|
|
595
|
+
// The one-slug-one-folder LINT over THIS working tree's `work/` ledger.
|
|
596
|
+
const ledgerDuplicates = lintLocalLedger(path);
|
|
597
|
+
repos.push({
|
|
598
|
+
path,
|
|
599
|
+
items: scoreItems(state, resolved.autoBuild, counts, heldSlugs),
|
|
600
|
+
specs,
|
|
601
|
+
lifecycle,
|
|
602
|
+
ledgerDuplicates,
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
return {
|
|
607
|
+
repos,
|
|
608
|
+
totalItems: counts.totalItems,
|
|
609
|
+
totalEligible: counts.totalEligible,
|
|
610
|
+
};
|
|
611
|
+
}
|