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,298 @@
|
|
|
1
|
+
import {existsSync, readFileSync} from 'node:fs';
|
|
2
|
+
import {join} from 'node:path';
|
|
3
|
+
import {ledgerRead, type LedgerReadStrategy} from './ledger-read.js';
|
|
4
|
+
import {
|
|
5
|
+
parseSidecar,
|
|
6
|
+
sidecarPathCandidates,
|
|
7
|
+
type SidecarModel,
|
|
8
|
+
} from './sidecar.js';
|
|
9
|
+
import {runAsync} from './git.js';
|
|
10
|
+
import {
|
|
11
|
+
buildLifecyclePools,
|
|
12
|
+
type LifecyclePoolGates,
|
|
13
|
+
type NeedsAnswersCandidate,
|
|
14
|
+
type ObservationCandidate,
|
|
15
|
+
} from './lifecycle-pools.js';
|
|
16
|
+
import type {SelectedLifecyclePools} from './select-priority.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The per-substrate I/O that FEEDS the shared, pure {@link buildLifecyclePools}
|
|
20
|
+
* enumeration (task `advance-autopick-lifecycle-pools`). The ENUMERATION LOGIC
|
|
21
|
+
* (which item becomes triage / surface / apply, the gates, the four-pool order)
|
|
22
|
+
* lives in ONE place ({@link buildLifecyclePools} + {@link selectPrioritised}); this
|
|
23
|
+
* module only reads the inputs that logic needs from each substrate:
|
|
24
|
+
*
|
|
25
|
+
* - IN-PLACE (sync, a working checkout) \u2014 {@link gatherLifecycleInPlace}: reads
|
|
26
|
+
* `work/notes/observations/` + the per-item `work/questions/<type>-<slug>.md` sidecar
|
|
27
|
+
* through the read seam + the filesystem, exactly as the in-place build-pool
|
|
28
|
+
* scan + `readItemSignals` already read in-place.
|
|
29
|
+
* - MIRROR-SIDE (async, a bare hub mirror's committed `main`) \u2014
|
|
30
|
+
* {@link gatherLifecycleMirror}: reads the SAME logical inputs from the mirror's
|
|
31
|
+
* committed tree via `git show` (the sidecar) + the read seam's
|
|
32
|
+
* `resolveMirrorState` (observations + the `needsAnswers` pool), so the
|
|
33
|
+
* two substrates AGREE.
|
|
34
|
+
*
|
|
35
|
+
* Both then call the SAME {@link buildLifecyclePools} \u2014 so the in-place and
|
|
36
|
+
* mirror-side enumerations are ONE unit, not two divergent ones. The gates default
|
|
37
|
+
* BOTH OFF (the interim hardcoded-off; the gate tasks flip them on).
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/** A `needsAnswers:true` task/spec pulled from the live `work/` state (pre-sidecar). */
|
|
41
|
+
interface BlockedItem {
|
|
42
|
+
namespace: 'task' | 'spec';
|
|
43
|
+
slug: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Read the ACTIVE sidecar for `<namespace>:<slug>` from a WORKING checkout (sync),
|
|
48
|
+
* or `undefined` when none exists. Identity-keyed at `work/questions/<type>-<slug>.md`
|
|
49
|
+
* \u2014 the SAME path `readItemSignals` reads in-place.
|
|
50
|
+
*/
|
|
51
|
+
function readSidecarInPlace(
|
|
52
|
+
repoPath: string,
|
|
53
|
+
namespace: 'task' | 'spec' | 'observation',
|
|
54
|
+
slug: string,
|
|
55
|
+
): SidecarModel | undefined {
|
|
56
|
+
// Probe every candidate path (spec-<slug>.md, then the legacy prd-<slug>.md the
|
|
57
|
+
// migration command has not converted yet) and read the FIRST that exists.
|
|
58
|
+
for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
|
|
59
|
+
const abs = join(repoPath, rel);
|
|
60
|
+
if (existsSync(abs)) {
|
|
61
|
+
return parseSidecar(readFileSync(abs, 'utf8'));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Collect every `needsAnswers:true` task (from `work/backlog`) + prd (from
|
|
69
|
+
* `work/prds`) for the in-place repo, through the read seam (the SAME readers the
|
|
70
|
+
* build-pool scan uses). These are the SURFACE/APPLY candidates this task draws
|
|
71
|
+
* into the selection (today they are build/task-INELIGIBLE, so nothing else
|
|
72
|
+
* surfaces them).
|
|
73
|
+
*/
|
|
74
|
+
function blockedItemsInPlace(
|
|
75
|
+
read: LedgerReadStrategy,
|
|
76
|
+
repoPath: string,
|
|
77
|
+
surfaceStaging: boolean,
|
|
78
|
+
): BlockedItem[] {
|
|
79
|
+
const out: BlockedItem[] = [];
|
|
80
|
+
const state = read.resolveLocalState({repoPath});
|
|
81
|
+
for (const item of state.ready) {
|
|
82
|
+
if (item.needsAnswers === true) {
|
|
83
|
+
out.push({namespace: 'task', slug: item.slug});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const pool = read.resolveSpecPool({repoPath});
|
|
87
|
+
for (const spec of pool.specs) {
|
|
88
|
+
if (spec.needsAnswers === true) {
|
|
89
|
+
out.push({namespace: 'spec', slug: spec.slug});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// TASKED resting prds (`prds/tasked/`) — enumerated UNCONDITIONALLY (NOT behind
|
|
93
|
+
// `surfaceStaging`), because a prd may legitimately carry `needsAnswers:true`
|
|
94
|
+
// while resting in `prds/tasked/` (WORK-CONTRACT "A PRD that has drifted AFTER
|
|
95
|
+
// it was TASKED"). This is NOT a staging widening: a tasked prd is a durable
|
|
96
|
+
// resting state, like the pool, so it is enumerated like the pool. Routing
|
|
97
|
+
// still respects the gates in `buildLifecyclePools` (an ANSWERED sidecar -> the
|
|
98
|
+
// always-on APPLY pool so the human's answer is never STRANDED; a NO-sidecar
|
|
99
|
+
// tasked prd -> SURFACE, still gated by `surfaceBlockers`). Without this, a
|
|
100
|
+
// tasked prd's answered sidecar is enumerated by no pool and apply never runs
|
|
101
|
+
// on it (observation `tasked-prd-needsanswers-sidecar-stranded-no-apply-pool`).
|
|
102
|
+
for (const spec of read.resolveLocalSpecTasked({repoPath})) {
|
|
103
|
+
if (spec.needsAnswers === true) {
|
|
104
|
+
out.push({namespace: 'spec', slug: spec.slug});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// SURFACE-on-STAGING widening (prd
|
|
108
|
+
// `staging-surface-and-apply-promote-safety` F2): when `surfaceStaging` is
|
|
109
|
+
// ON, the candidate set ADDITIONALLY enumerates `needsAnswers` items resting
|
|
110
|
+
// in STAGING (`tasks/backlog/` + `prds/proposed/`), so a tasked item
|
|
111
|
+
// surfaces its questions BEFORE the human promotes it. BUILD/claim still
|
|
112
|
+
// reads POOL-only (`scoreItems` over `state.ready`); only the surface polarity
|
|
113
|
+
// widens here.
|
|
114
|
+
if (surfaceStaging) {
|
|
115
|
+
for (const item of read.resolveLocalTaskStaging({repoPath})) {
|
|
116
|
+
if (item.needsAnswers === true) {
|
|
117
|
+
out.push({namespace: 'task', slug: item.slug});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const spec of read.resolveLocalSpecStaging({repoPath})) {
|
|
121
|
+
if (spec.needsAnswers === true) {
|
|
122
|
+
out.push({namespace: 'spec', slug: spec.slug});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Gather + build the lifecycle pools for an IN-PLACE working checkout (sync).
|
|
131
|
+
* Reads `work/notes/observations/` + the per-item sidecar state through the read seam +
|
|
132
|
+
* the filesystem, then hands them to the shared {@link buildLifecyclePools}. The
|
|
133
|
+
* gates default BOTH OFF (the interim hardcoded-off, calm by default).
|
|
134
|
+
*/
|
|
135
|
+
export function gatherLifecycleInPlace(input: {
|
|
136
|
+
repoPath: string;
|
|
137
|
+
read?: LedgerReadStrategy;
|
|
138
|
+
gates?: LifecyclePoolGates;
|
|
139
|
+
}): SelectedLifecyclePools {
|
|
140
|
+
const read = input.read ?? ledgerRead;
|
|
141
|
+
const repoPath = input.repoPath;
|
|
142
|
+
|
|
143
|
+
const rawObservations = read.resolveLocalState({repoPath}).observations;
|
|
144
|
+
const observations: ObservationCandidate[] = rawObservations.map((obs) => ({
|
|
145
|
+
slug: obs.slug,
|
|
146
|
+
triaged: obs.triaged,
|
|
147
|
+
sidecar: readSidecarInPlace(repoPath, 'observation', obs.slug),
|
|
148
|
+
}));
|
|
149
|
+
const surfaceStaging = input.gates?.surfaceStaging === true;
|
|
150
|
+
const needsAnswers: NeedsAnswersCandidate[] = blockedItemsInPlace(
|
|
151
|
+
read,
|
|
152
|
+
repoPath,
|
|
153
|
+
surfaceStaging,
|
|
154
|
+
).map((item) => ({
|
|
155
|
+
repoPath,
|
|
156
|
+
namespace: item.namespace,
|
|
157
|
+
slug: item.slug,
|
|
158
|
+
sidecar: readSidecarInPlace(repoPath, item.namespace, item.slug),
|
|
159
|
+
}));
|
|
160
|
+
|
|
161
|
+
return buildLifecyclePools({
|
|
162
|
+
repoPath,
|
|
163
|
+
observations,
|
|
164
|
+
needsAnswers,
|
|
165
|
+
gates: input.gates,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Read the ACTIVE sidecar for `<namespace>:<slug>` from a BARE hub mirror's
|
|
171
|
+
* committed `<ref>:work/questions/<type>-<slug>.md` via `git show` (the SAME
|
|
172
|
+
* mechanism the mirror-ref ledger reads use), or `undefined` when none exists.
|
|
173
|
+
*/
|
|
174
|
+
async function readSidecarMirror(
|
|
175
|
+
mirrorPath: string,
|
|
176
|
+
ref: string,
|
|
177
|
+
namespace: 'task' | 'spec' | 'observation',
|
|
178
|
+
slug: string,
|
|
179
|
+
env: NodeJS.ProcessEnv | undefined,
|
|
180
|
+
): Promise<SidecarModel | undefined> {
|
|
181
|
+
// Probe every candidate committed path (spec-<slug>.md, then the legacy
|
|
182
|
+
// prd-<slug>.md the migration command has not converted yet) via `git show`,
|
|
183
|
+
// returning the FIRST that resolves.
|
|
184
|
+
for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
|
|
185
|
+
const object = `${ref}:${rel}`;
|
|
186
|
+
const show = await runAsync('git', ['show', object], mirrorPath, {env});
|
|
187
|
+
if (show.status === 0) {
|
|
188
|
+
return parseSidecar(show.stdout);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Gather + build the lifecycle pools for a MIRROR-SIDE bare hub mirror (async).
|
|
196
|
+
* Reads the SAME logical inputs as {@link gatherLifecycleInPlace} \u2014 observations +
|
|
197
|
+
* the `needsAnswers` pool from the mirror's committed `main` (via
|
|
198
|
+
* `resolveMirrorState`), the prd pool via `resolveMirrorSpecPool`, and each item's
|
|
199
|
+
* sidecar via `git show` \u2014 then hands them to the SAME shared
|
|
200
|
+
* {@link buildLifecyclePools}, so the in-place + mirror enumerations AGREE.
|
|
201
|
+
*/
|
|
202
|
+
export async function gatherLifecycleMirror(input: {
|
|
203
|
+
mirrorPath: string;
|
|
204
|
+
ref?: string;
|
|
205
|
+
read?: LedgerReadStrategy;
|
|
206
|
+
gates?: LifecyclePoolGates;
|
|
207
|
+
env?: NodeJS.ProcessEnv;
|
|
208
|
+
}): Promise<SelectedLifecyclePools> {
|
|
209
|
+
const read = input.read ?? ledgerRead;
|
|
210
|
+
const mirrorPath = input.mirrorPath;
|
|
211
|
+
const ref = input.ref ?? 'main';
|
|
212
|
+
const env = input.env;
|
|
213
|
+
|
|
214
|
+
const state = await read.resolveMirrorState({mirrorPath, ref, env});
|
|
215
|
+
const specPool = await read.resolveMirrorSpecPool({mirrorPath, ref, env});
|
|
216
|
+
const surfaceStaging = input.gates?.surfaceStaging === true;
|
|
217
|
+
const [taskStaging, specStaging] = surfaceStaging
|
|
218
|
+
? await Promise.all([
|
|
219
|
+
read.resolveMirrorTaskStaging({mirrorPath, ref, env}),
|
|
220
|
+
read.resolveMirrorSpecStaging({mirrorPath, ref, env}),
|
|
221
|
+
])
|
|
222
|
+
: [[], []];
|
|
223
|
+
|
|
224
|
+
const blocked: BlockedItem[] = [];
|
|
225
|
+
for (const item of state.ready) {
|
|
226
|
+
if (item.needsAnswers === true) {
|
|
227
|
+
blocked.push({namespace: 'task', slug: item.slug});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
for (const spec of specPool.specs) {
|
|
231
|
+
if (spec.needsAnswers === true) {
|
|
232
|
+
blocked.push({namespace: 'spec', slug: spec.slug});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// TASKED resting prds (`<ref>:work/prds/tasked/`) — enumerated UNCONDITIONALLY,
|
|
236
|
+
// the mirror-side counterpart of the in-place tasked-prd enumeration above
|
|
237
|
+
// (so a `needsAnswers` tasked prd's answered sidecar is never stranded on the
|
|
238
|
+
// mirror/CI advance path either). Routing still respects the gates.
|
|
239
|
+
const specTasked = await read.resolveMirrorSpecTasked({mirrorPath, ref, env});
|
|
240
|
+
for (const spec of specTasked) {
|
|
241
|
+
if (spec.needsAnswers === true) {
|
|
242
|
+
blocked.push({namespace: 'spec', slug: spec.slug});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// SURFACE-on-STAGING widening (prd
|
|
246
|
+
// `staging-surface-and-apply-promote-safety` F2): mirror-side counterpart of
|
|
247
|
+
// the in-place widening above — enumerate `needsAnswers` items in
|
|
248
|
+
// STAGING (`tasks/backlog/` + `prds/proposed/`) from the bare mirror's
|
|
249
|
+
// committed `<ref>` tree, so the in-place + mirror surfaces AGREE. The
|
|
250
|
+
// staging reads are skipped entirely when the gate is OFF (no extra git
|
|
251
|
+
// ls-tree work in the legacy mode).
|
|
252
|
+
for (const item of taskStaging) {
|
|
253
|
+
if (item.needsAnswers === true) {
|
|
254
|
+
blocked.push({namespace: 'task', slug: item.slug});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
for (const spec of specStaging) {
|
|
258
|
+
if (spec.needsAnswers === true) {
|
|
259
|
+
blocked.push({namespace: 'spec', slug: spec.slug});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const needsAnswers: NeedsAnswersCandidate[] = await Promise.all(
|
|
264
|
+
blocked.map(async (item) => ({
|
|
265
|
+
repoPath: mirrorPath,
|
|
266
|
+
namespace: item.namespace,
|
|
267
|
+
slug: item.slug,
|
|
268
|
+
sidecar: await readSidecarMirror(
|
|
269
|
+
mirrorPath,
|
|
270
|
+
ref,
|
|
271
|
+
item.namespace,
|
|
272
|
+
item.slug,
|
|
273
|
+
env,
|
|
274
|
+
),
|
|
275
|
+
})),
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
const observations: ObservationCandidate[] = await Promise.all(
|
|
279
|
+
state.observations.map(async (obs) => ({
|
|
280
|
+
slug: obs.slug,
|
|
281
|
+
triaged: obs.triaged,
|
|
282
|
+
sidecar: await readSidecarMirror(
|
|
283
|
+
mirrorPath,
|
|
284
|
+
ref,
|
|
285
|
+
'observation',
|
|
286
|
+
obs.slug,
|
|
287
|
+
env,
|
|
288
|
+
),
|
|
289
|
+
})),
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
return buildLifecyclePools({
|
|
293
|
+
repoPath: mirrorPath,
|
|
294
|
+
observations,
|
|
295
|
+
needsAnswers,
|
|
296
|
+
gates: input.gates,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import type {SidecarModel} from './sidecar.js';
|
|
2
|
+
import {allAnswered} from './sidecar.js';
|
|
3
|
+
import type {LifecycleSelectedItem} from './select-priority.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The SHARED, PURE enumeration of the advance auto-pick's LIFECYCLE POOLS (task
|
|
7
|
+
* `advance-autopick-lifecycle-pools`) \u2014 the MISSING FOUNDATION a 2026-06-12 review
|
|
8
|
+
* found. Before this, `performAdvanceAuto` (in-place) and `scanMirrorPool`
|
|
9
|
+
* (mirror-side) enumerated ONLY the two BUILD pools (eligible tasks + taskable
|
|
10
|
+
* prds), so a bare / `-n` / loop / CI `advance` could ONLY build tasks + task
|
|
11
|
+
* prds. The lifecycle rungs (triage / surface / apply) were EXPLICIT-INVOCATION-
|
|
12
|
+
* ONLY because NOTHING enumerated observations or `needsAnswers`-blocked items
|
|
13
|
+
* into the selection. This unit closes that gap, at the SELECTION layer ONLY (it
|
|
14
|
+
* does NOT touch the classifier `advance-classify.ts` or the rung bodies \u2014 the
|
|
15
|
+
* tick still re-classifies each selected item and runs the right rung).
|
|
16
|
+
*
|
|
17
|
+
* It is ONE shared unit reused by BOTH the in-place caller (`performAdvanceAuto`)
|
|
18
|
+
* and the mirror-side caller (`scanMirrorPool` \u2192 the loop/CI drivers), NOT two
|
|
19
|
+
* divergent enumerations. The per-substrate I/O (reading `work/notes/observations/` +
|
|
20
|
+
* the per-item sidecar state) is done CALLER-SIDE through the read seam (sync
|
|
21
|
+
* in-place, async mirror-ref) and the already-resolved inputs are handed here \u2014
|
|
22
|
+
* exactly as `taskableSpecs` is fed by each caller. This unit is then pure: no I/O.
|
|
23
|
+
*
|
|
24
|
+
* **Three lifecycle sub-pools, gated by PURPOSE (ADR `ci-config-policy-and-gate-
|
|
25
|
+
* family.md` \u00a74 \u2014 gates govern CREATE only; CONSUME is always-on):**
|
|
26
|
+
*
|
|
27
|
+
* - **triage** \u2014 UNTRIAGED observations (no `triaged:` settled marker). A CREATE
|
|
28
|
+
* act (the bot mints a promote/keep/delete question), so gated by
|
|
29
|
+
* {@link LifecyclePoolGates.triage} (the future `observationTriage` gate).
|
|
30
|
+
* - **surface** \u2014 `needsAnswers`-blocked tasks/prds with NO all-answered sidecar
|
|
31
|
+
* (no sidecar yet, or a still-pending one). A CREATE act (the bot mints the
|
|
32
|
+
* blocker question), so gated by {@link LifecyclePoolGates.surface} (the future
|
|
33
|
+
* `surfaceBlockers` gate). A PENDING sidecar is NOT enumerated (it would only
|
|
34
|
+
* no-op \u2014 leaving it out keeps the pool calm + thrash-free).
|
|
35
|
+
* - **apply** \u2014 `needsAnswers`-blocked items WITH an all-answered sidecar. A
|
|
36
|
+
* CONSUME act (the bot applies the human's committed answer), ALWAYS allowed,
|
|
37
|
+
* never gated \u2014 gating it would STRAND a human's answer (\u00a74's create-vs-consume
|
|
38
|
+
* invariant). So an answered sidecar is selected even with BOTH create-gates
|
|
39
|
+
* off.
|
|
40
|
+
*
|
|
41
|
+
* **INTERIM SAFETY (task `## Decisions`, DECIDED): the create-gates are born
|
|
42
|
+
* OFF.** The gate tasks (`observation-triage-tri-state-gate` /
|
|
43
|
+
* `surface-blockers-gate`) land AFTER this one, so this task must be SAFE
|
|
44
|
+
* STANDALONE: {@link LifecyclePoolGates} default `triage:false` + `surface:false`,
|
|
45
|
+
* so the triage + surface sub-pools contribute NOTHING by default and landing this
|
|
46
|
+
* task alone auto-triages / auto-surfaces NOTHING (it changes no repo's
|
|
47
|
+
* behaviour). The gate tasks REPLACE the hardcoded-off the callers pass with the
|
|
48
|
+
* real `observationTriage` / `surfaceBlockers` config read. The apply sub-pool is
|
|
49
|
+
* NOT gated (consume is always-on), so an answered sidecar always applies.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The create-side gates for the lifecycle pools (ADR \u00a72/\u00a74). Both default OFF
|
|
54
|
+
* (the calm interim state) \u2014 the gate tasks flip them on by reading
|
|
55
|
+
* `observationTriage` / `surfaceBlockers` from config. `apply` is NOT here: it is
|
|
56
|
+
* the CONSUME phase, ALWAYS allowed (never gated).
|
|
57
|
+
*/
|
|
58
|
+
export interface LifecyclePoolGates {
|
|
59
|
+
/**
|
|
60
|
+
* May the TRIAGE sub-pool (untriaged observations) contribute to the selection?
|
|
61
|
+
* Default `false` (the interim hardcoded-off; the `observationTriage` gate
|
|
62
|
+
* replaces this). OFF \u21d2 observations are never auto-selected.
|
|
63
|
+
*/
|
|
64
|
+
triage?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* May the SURFACE sub-pool (`needsAnswers`-blocked, no all-answered sidecar)
|
|
67
|
+
* contribute? Default `false` (the interim hardcoded-off; the `surfaceBlockers`
|
|
68
|
+
* gate replaces this). OFF \u21d2 blocked items are never auto-surfaced.
|
|
69
|
+
*/
|
|
70
|
+
surface?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Does the SURFACE candidate set widen to include STAGING (`tasks/backlog/` +
|
|
73
|
+
* `prds/proposed/`), or stay POOL-ONLY? This field is CONSUMED BY THE
|
|
74
|
+
* GATHER (`lifecycle-gather.ts`), NOT by {@link buildLifecyclePools} — the
|
|
75
|
+
* builder is pure and only routes already-resolved candidates between surface
|
|
76
|
+
* / apply by sidecar-answered-state. The gather decides WHICH items become
|
|
77
|
+
* candidates in the first place; this gate widens that input set when `true`.
|
|
78
|
+
* Default `false` at THIS library boundary (calm; the CLI threads
|
|
79
|
+
* `config.surfaceStaging` which itself defaults to `true`, so the user-visible
|
|
80
|
+
* default is `true`). Spec `staging-surface-and-apply-promote-safety` F2.
|
|
81
|
+
* BUILD/claim eligibility is UNCHANGED in either mode — staging items stay
|
|
82
|
+
* non-claimable, the trust model is untouched.
|
|
83
|
+
*/
|
|
84
|
+
surfaceStaging?: boolean;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* One `needsAnswers`-blocked task/spec candidate for the SURFACE/APPLY sub-pools,
|
|
89
|
+
* before this unit routes it. The caller resolves the item's namespace + slug
|
|
90
|
+
* (from `work/backlog` tasks + `work/specs` specs carrying `needsAnswers:true`) and
|
|
91
|
+
* its ACTIVE sidecar (parsed from `work/questions/<type>-<slug>.md`, or
|
|
92
|
+
* `undefined` when none exists) \u2014 through the read seam (sync in-place / async
|
|
93
|
+
* mirror-ref). This unit then routes it to APPLY (sidecar all-answered, consume,
|
|
94
|
+
* always-on) or SURFACE (no all-answered sidecar, create, gated). PURE: no I/O.
|
|
95
|
+
*/
|
|
96
|
+
export interface NeedsAnswersCandidate {
|
|
97
|
+
/** The repo this item lives in (a working checkout in-place, the mirror path remote). */
|
|
98
|
+
repoPath: string;
|
|
99
|
+
/** `'task'` (a `work/backlog/` task) or `'spec'` (a `work/specs/` spec). */
|
|
100
|
+
namespace: 'task' | 'spec';
|
|
101
|
+
/** The bare slug. */
|
|
102
|
+
slug: string;
|
|
103
|
+
/** The parsed ACTIVE sidecar, or `undefined` when none exists yet. */
|
|
104
|
+
sidecar: SidecarModel | undefined;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* One OBSERVATION candidate for the TRIAGE/APPLY sub-pools, resolved through
|
|
109
|
+
* the same read seam as its `needsAnswers` task/spec siblings (task
|
|
110
|
+
* `route-answered-observation-sidecar-to-apply-pool`). The classifier receives
|
|
111
|
+
* a sidecar-aware observation shape so an ANSWERED observation sidecar routes
|
|
112
|
+
* to the always-on APPLY pool (a CONSUME act — the human's answer is never
|
|
113
|
+
* stranded), while a NO/PENDING sidecar UNTRIAGED observation stays a TRIAGE
|
|
114
|
+
* candidate (gated) as today. PURE: the caller resolves the active sidecar (via
|
|
115
|
+
* {@link sidecarPathFor} — the SAME resolver the task/prd `needsAnswers`
|
|
116
|
+
* candidates use); this unit only routes.
|
|
117
|
+
*/
|
|
118
|
+
export interface ObservationCandidate {
|
|
119
|
+
/** The observation's identity — its FILENAME slug (never a foreign frontmatter `slug:`). */
|
|
120
|
+
slug: string;
|
|
121
|
+
/**
|
|
122
|
+
* The SETTLED marker (`triaged:` frontmatter): a non-empty value drops the
|
|
123
|
+
* observation out of the TRIAGE pool; `undefined` ⇒ UNTRIAGED. IGNORED for
|
|
124
|
+
* the APPLY routing (an ANSWERED sidecar wins regardless of the marker: a
|
|
125
|
+
* human's answer must never be stranded — task `## Decisions`).
|
|
126
|
+
*/
|
|
127
|
+
triaged: string | undefined;
|
|
128
|
+
/** The parsed ACTIVE sidecar (`work/questions/observation-<slug>.md`), or `undefined`. */
|
|
129
|
+
sidecar: SidecarModel | undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Inputs to {@link buildLifecyclePools}: the raw lifecycle candidates + the gates. */
|
|
133
|
+
export interface LifecyclePoolsInput {
|
|
134
|
+
/** The repo whose lifecycle items these are (carried onto each selected item). */
|
|
135
|
+
repoPath: string;
|
|
136
|
+
/**
|
|
137
|
+
* Every observation in `work/notes/observations/` (the read seam's observation
|
|
138
|
+
* read), each with its resolved active sidecar (task
|
|
139
|
+
* `route-answered-observation-sidecar-to-apply-pool`). This unit routes each
|
|
140
|
+
* to APPLY (sidecar all-answered, consume, always-on) or TRIAGE (untriaged, no
|
|
141
|
+
* all-answered sidecar; create, gated).
|
|
142
|
+
*/
|
|
143
|
+
observations: ObservationCandidate[];
|
|
144
|
+
/**
|
|
145
|
+
* Every `needsAnswers:true` task/prd (the create-side blocked items), each
|
|
146
|
+
* with its resolved active sidecar. This unit routes each to SURFACE or APPLY.
|
|
147
|
+
*/
|
|
148
|
+
needsAnswers: NeedsAnswersCandidate[];
|
|
149
|
+
/**
|
|
150
|
+
* The create-side gates (default BOTH OFF \u2014 the interim hardcoded-off). The
|
|
151
|
+
* apply sub-pool is never gated.
|
|
152
|
+
*/
|
|
153
|
+
gates?: LifecyclePoolGates;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The three lifecycle sub-pools, each an ordered {@link LifecycleSelectedItem[]}.
|
|
158
|
+
* The caller concatenates them into the overall selection in the four-pool order
|
|
159
|
+
* (see {@link selectPrioritised}); `apply` is consume (always present), `triage` /
|
|
160
|
+
* `surface` are present only when their gate is on.
|
|
161
|
+
*/
|
|
162
|
+
export interface LifecyclePools {
|
|
163
|
+
/** `apply` items (answered sidecars; CONSUME, always present). */
|
|
164
|
+
apply: LifecycleSelectedItem[];
|
|
165
|
+
/** `surface` items (blocked, no all-answered sidecar; gated by `gates.surface`). */
|
|
166
|
+
surface: LifecycleSelectedItem[];
|
|
167
|
+
/** `triage` items (untriaged observations; gated by `gates.triage`). */
|
|
168
|
+
triage: LifecycleSelectedItem[];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Build the three lifecycle sub-pools from the raw candidates + the gates, PURE.
|
|
173
|
+
* Each selected item carries the lifecycle `namespace` discriminator so the
|
|
174
|
+
* driver's per-item dispatch can map it to the right TICK arg (observation \u2192
|
|
175
|
+
* `obs:<slug>`; a blocked task/prd \u2192 `task:`/`prd:<slug>`, which the tick then
|
|
176
|
+
* classifies into surface/apply/no-op). This unit decides WHICH sub-pool each item
|
|
177
|
+
* belongs to (and whether its gate lets it through); the TICK re-classifies and
|
|
178
|
+
* runs the actual rung (the classifier + rung bodies are unchanged).
|
|
179
|
+
*
|
|
180
|
+
* Routing:
|
|
181
|
+
* - an UNTRIAGED observation \u2192 `triage` (gated by `gates.triage`);
|
|
182
|
+
* - a `needsAnswers` item with an ALL-ANSWERED sidecar \u2192 `apply` (always);
|
|
183
|
+
* - a `needsAnswers` item with NO all-answered sidecar \u2192 `surface` (gated by
|
|
184
|
+
* `gates.surface`); a PENDING sidecar is NOT enumerated into either pool (it
|
|
185
|
+
* would only no-op \u2014 leaving it out keeps the pool calm).
|
|
186
|
+
*/
|
|
187
|
+
export function buildLifecyclePools(
|
|
188
|
+
input: LifecyclePoolsInput,
|
|
189
|
+
): LifecyclePools {
|
|
190
|
+
const gates = input.gates ?? {};
|
|
191
|
+
const triageOn = gates.triage === true;
|
|
192
|
+
const surfaceOn = gates.surface === true;
|
|
193
|
+
|
|
194
|
+
// --- observation routing: apply (all-answered sidecar) vs triage (untriaged) ---
|
|
195
|
+
const triage: LifecycleSelectedItem[] = [];
|
|
196
|
+
const apply: LifecycleSelectedItem[] = [];
|
|
197
|
+
for (const obs of input.observations) {
|
|
198
|
+
const answered = obs.sidecar !== undefined && allAnswered(obs.sidecar);
|
|
199
|
+
if (answered) {
|
|
200
|
+
// CONSUME (apply the human's committed answer) — ALWAYS allowed, even
|
|
201
|
+
// with the triage create-gate off (the create-vs-consume invariant, ADR
|
|
202
|
+
// `ci-config-policy-and-gate-family` §4). An answered sidecar wins even
|
|
203
|
+
// when the observation body also carries a `triaged:` marker: a human's
|
|
204
|
+
// answer must never be stranded (task `## Decisions`).
|
|
205
|
+
apply.push({
|
|
206
|
+
repoPath: input.repoPath,
|
|
207
|
+
slug: obs.slug,
|
|
208
|
+
namespace: 'observation',
|
|
209
|
+
});
|
|
210
|
+
} else if (obs.triaged === undefined && triageOn) {
|
|
211
|
+
// CREATE (mint the promote/keep/delete question) — gated by
|
|
212
|
+
// `observationTriage`. An untriaged observation with NO sidecar or a
|
|
213
|
+
// PENDING sidecar is a triage candidate as today.
|
|
214
|
+
triage.push({
|
|
215
|
+
repoPath: input.repoPath,
|
|
216
|
+
slug: obs.slug,
|
|
217
|
+
namespace: 'observation',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// else: SETTLED (triaged:) with no answered sidecar — NOT enumerated.
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// --- surface / apply: split `needsAnswers` items by sidecar answered-state ---
|
|
224
|
+
const surface: LifecycleSelectedItem[] = [];
|
|
225
|
+
for (const candidate of input.needsAnswers) {
|
|
226
|
+
const answered =
|
|
227
|
+
candidate.sidecar !== undefined && allAnswered(candidate.sidecar);
|
|
228
|
+
if (answered) {
|
|
229
|
+
// CONSUME (apply the human's committed answer) \u2014 ALWAYS allowed, even with
|
|
230
|
+
// both create-gates off (the create-vs-consume invariant, ADR \u00a74).
|
|
231
|
+
apply.push({
|
|
232
|
+
repoPath: candidate.repoPath,
|
|
233
|
+
slug: candidate.slug,
|
|
234
|
+
namespace: candidate.namespace,
|
|
235
|
+
});
|
|
236
|
+
} else if (candidate.sidecar === undefined && surfaceOn) {
|
|
237
|
+
// CREATE (mint the blocker question) \u2014 gated by `surfaceBlockers`. Only an
|
|
238
|
+
// item with NO sidecar yet is a surface candidate; a PENDING sidecar would
|
|
239
|
+
// only no-op, so it is left OUT of the pool (keeps the selection calm).
|
|
240
|
+
surface.push({
|
|
241
|
+
repoPath: candidate.repoPath,
|
|
242
|
+
slug: candidate.slug,
|
|
243
|
+
namespace: candidate.namespace,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// else: a PENDING sidecar (exists, not all-answered) \u2014 NOT enumerated.
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return {apply, surface, triage};
|
|
250
|
+
}
|