dorfl 0.0.0 → 0.1.1
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 +3100 -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 +208 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +344 -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 +329 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +706 -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 +363 -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 +951 -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 +4379 -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 +477 -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 +1059 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +763 -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 +1437 -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,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pure `advance` TICK classifier (prd `advance-loop`, task
|
|
3
|
+
* `advance-tick-classifier`) — the substrate-agnostic, read-only seam BOTH the
|
|
4
|
+
* one-shot driver and the loop (`run`) driver wrap. Mirrors the existing pure
|
|
5
|
+
* `categorise.ts` / `eligibility.ts` seams: NO model, NO lock, NO file mutation
|
|
6
|
+
* — it returns WHICH rung on WHICH item from EXACTLY two signals plus the item
|
|
7
|
+
* type, and nothing executes here (the rung EXECUTION is later tasks).
|
|
8
|
+
*
|
|
9
|
+
* The two signals (and ONLY these two):
|
|
10
|
+
* 1. the item's `needsAnswers` flag (from `frontmatter.ts`); and
|
|
11
|
+
* 2. the sidecar's ANSWERED-STATE (from the `advance-sidecar-contract`
|
|
12
|
+
* keystone: {@link allAnswered} / {@link pendingEntries} over the entries).
|
|
13
|
+
*
|
|
14
|
+
* The per-item state machine (the deterministic trigger — two signals only):
|
|
15
|
+
*
|
|
16
|
+
* needsAnswers: true?
|
|
17
|
+
* ├─ NO → ANALYSE (state-appropriate rung: build a ready task / task a ready
|
|
18
|
+
* │ prd / triage an untriaged observation). Analysis MAY advance, OR
|
|
19
|
+
* │ SURFACE questions.
|
|
20
|
+
* └─ YES → sidecar exists?
|
|
21
|
+
* ├─ NO → ANALYSE (first pass: generate questions → write the sidecar)
|
|
22
|
+
* │ [transitional — surfacing normally writes the sidecar atomically]
|
|
23
|
+
* └─ YES → all entries answered?
|
|
24
|
+
* ├─ YES → ANALYSE: apply the answers + advance.
|
|
25
|
+
* └─ NO → NO-OP (awaiting human).
|
|
26
|
+
*
|
|
27
|
+
* Two invariants this classifier (and the downstream that executes the rung)
|
|
28
|
+
* MUST preserve:
|
|
29
|
+
* 1. `needsAnswers:false ⟺ NO active sidecar` (clear-flag and delete-sidecar are
|
|
30
|
+
* the SAME atomic step — enforced in `advance-sidecar-contract`'s
|
|
31
|
+
* `applyAtomic`, asserted HERE at the classifier boundary). A
|
|
32
|
+
* contradictory input (one set without the other) is the only state the
|
|
33
|
+
* classifier REFUSES to classify into an ANALYSE/NO-OP rung — it returns the
|
|
34
|
+
* explicit `invariant-violation` kind so a caller can route it rather than
|
|
35
|
+
* silently mis-advance.
|
|
36
|
+
* 2. A PENDING (not-all-answered) sidecar makes the tick a clean NO-OP (so a
|
|
37
|
+
* `run` daemon never spins hot re-surfacing the same question). A SUBSET of
|
|
38
|
+
* answered entries is still pending ⇒ SKIP (NO-OP).
|
|
39
|
+
*
|
|
40
|
+
* "ANALYSE" is NOT "always advance" — surface-and-pause is itself a rung, so the
|
|
41
|
+
* ANALYSE branch resolves to the per-TYPE rung the executor will run (the cells
|
|
42
|
+
* of the prd's "Per-item-type transitions" table): `build-task` (task),
|
|
43
|
+
* `task-spec` (spec), `triage-observation` (observation) when there are no open
|
|
44
|
+
* questions; `surface` (first-pass question generation) when `needsAnswers` but
|
|
45
|
+
* no sidecar yet; `apply` when all entries are answered.
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
import type {SidecarModel, SidecarType} from './sidecar.js';
|
|
49
|
+
import {allAnswered} from './sidecar.js';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* One TICK input: an item's TYPE + its two classification signals. `needsAnswers`
|
|
53
|
+
* is the item-body flag (`undefined`/`false` ⇒ not gated; `true` ⇒ gated). The
|
|
54
|
+
* `sidecar` is the parsed ACTIVE sidecar model when one exists, else `undefined`
|
|
55
|
+
* — the classifier reads its answered-state via the keystone's derived helpers,
|
|
56
|
+
* never a third state store.
|
|
57
|
+
*/
|
|
58
|
+
export interface TickItem {
|
|
59
|
+
/** The item type — the state machine is per-TYPE (task / prd / observation). */
|
|
60
|
+
type: SidecarType;
|
|
61
|
+
/** Autonomy axis 2 (DISCOVERED): `true` ⇒ open questions block autonomous work. */
|
|
62
|
+
needsAnswers: boolean | undefined;
|
|
63
|
+
/** The parsed ACTIVE sidecar, or `undefined` when none exists. */
|
|
64
|
+
sidecar: SidecarModel | undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The CLASSIFIED rung kinds (a discriminated union NAMING the rung WITHOUT
|
|
69
|
+
* executing it). The ANALYSE rungs split per-type; `surface`/`apply` are
|
|
70
|
+
* type-agnostic transitions; `no-op` is the calm-at-rest result; and
|
|
71
|
+
* `invariant-violation` is the explicit refusal an inconsistent input yields.
|
|
72
|
+
*/
|
|
73
|
+
export type TickRungKind =
|
|
74
|
+
// --- ANALYSE rungs (no open questions; advance one lifecycle rung) ---
|
|
75
|
+
/** A ready task → build it (later: invoke the `do <slug>` machinery). */
|
|
76
|
+
| 'build-task'
|
|
77
|
+
/** A ready spec → task it (later: invoke the `do spec:<slug>` machinery). */
|
|
78
|
+
| 'task-spec'
|
|
79
|
+
/** An untriaged observation → triage it (auto-disposition or surface a question). */
|
|
80
|
+
| 'triage-observation'
|
|
81
|
+
// --- Transitional ANALYSE rungs (driven by the two signals) ---
|
|
82
|
+
/** `needsAnswers` but NO sidecar yet → first-pass question generation. */
|
|
83
|
+
| 'surface'
|
|
84
|
+
/** A sidecar with EVERY entry answered → apply the answers + advance. */
|
|
85
|
+
| 'apply'
|
|
86
|
+
// --- Calm-at-rest ---
|
|
87
|
+
/** Nothing to do: a PENDING sidecar (awaiting human) or nothing eligible. */
|
|
88
|
+
| 'no-op'
|
|
89
|
+
// --- The refused state ---
|
|
90
|
+
/** The `needsAnswers:false ⟺ no active sidecar` invariant is broken. */
|
|
91
|
+
| 'invariant-violation';
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The classifier's verdict: the rung kind, the item type it was classified for,
|
|
95
|
+
* and a short machine-stable `reason` tag for the NO-OP / refusal cases (so a
|
|
96
|
+
* caller — or a test — can distinguish "pending sidecar" from "nothing eligible"
|
|
97
|
+
* without re-deriving the signals).
|
|
98
|
+
*/
|
|
99
|
+
export interface TickClassification {
|
|
100
|
+
kind: TickRungKind;
|
|
101
|
+
type: SidecarType;
|
|
102
|
+
/**
|
|
103
|
+
* A machine-stable tag explaining a `no-op` / `invariant-violation`:
|
|
104
|
+
* - `pending-sidecar` — an active sidecar still has unanswered entries.
|
|
105
|
+
* - `needsAnswers-without-sidecar` — `needsAnswers:true` but no sidecar AND
|
|
106
|
+
* this should have surfaced (kept for completeness; `surface` covers the
|
|
107
|
+
* normal first pass, so this only appears on the refusal path below).
|
|
108
|
+
* - `sidecar-without-needsAnswers` — a sidecar exists but `needsAnswers` is
|
|
109
|
+
* not `true` (invariant 1 broken — the flag and the sidecar disagree).
|
|
110
|
+
* `undefined` for the ANALYSE rungs and `apply`/`surface`.
|
|
111
|
+
*/
|
|
112
|
+
reason?:
|
|
113
|
+
| 'pending-sidecar'
|
|
114
|
+
| 'needsAnswers-without-sidecar'
|
|
115
|
+
| 'sidecar-without-needsAnswers';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The per-TYPE ANALYSE rung when there are no open questions (the no-gate path). */
|
|
119
|
+
const ANALYSE_RUNG_FOR_TYPE: Record<SidecarType, TickRungKind> = {
|
|
120
|
+
task: 'build-task',
|
|
121
|
+
// A `spec` analyses through the `task-spec` rung (spec IS the parent-spec
|
|
122
|
+
// artifact tasked into build tasks).
|
|
123
|
+
spec: 'task-spec',
|
|
124
|
+
observation: 'triage-observation',
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Classify ONE tick PURELY from the item's two signals + its type — read-only,
|
|
129
|
+
* no model, no lock, no file mutation. Returns the classified rung the executor
|
|
130
|
+
* will later run (or `no-op` / `invariant-violation`). The decision tree is the
|
|
131
|
+
* prd's per-item state machine, with invariant 1 asserted at the boundary:
|
|
132
|
+
*
|
|
133
|
+
* - `needsAnswers` NOT true:
|
|
134
|
+
* - a sidecar present ⇒ INVARIANT 1 BROKEN (`sidecar-without-needsAnswers`)
|
|
135
|
+
* → `invariant-violation`. (`needsAnswers:false ⟺ no active sidecar`.)
|
|
136
|
+
* - no sidecar ⇒ ANALYSE: the per-type rung (`build-task` / `task-spec` /
|
|
137
|
+
* `triage-observation`).
|
|
138
|
+
* - `needsAnswers` true:
|
|
139
|
+
* - NO sidecar ⇒ `surface` (first-pass question generation — transitional).
|
|
140
|
+
* - a PENDING sidecar (a subset/none answered) ⇒ `no-op` (`pending-sidecar`)
|
|
141
|
+
* — the clean NO-OP that keeps a `run` daemon from spinning hot; a SUBSET
|
|
142
|
+
* of answered entries SKIPS here too.
|
|
143
|
+
* - an ALL-ANSWERED sidecar ⇒ `apply` (apply the answers + advance; the
|
|
144
|
+
* executor may append new Qs and re-pause, or resolve fully).
|
|
145
|
+
*/
|
|
146
|
+
export function classifyTick(item: TickItem): TickClassification {
|
|
147
|
+
const {type, needsAnswers, sidecar} = item;
|
|
148
|
+
const gated = needsAnswers === true;
|
|
149
|
+
|
|
150
|
+
if (!gated) {
|
|
151
|
+
// Invariant 1: `needsAnswers:false ⟺ no active sidecar`. A sidecar present
|
|
152
|
+
// here means the flag and the sidecar DISAGREE — refuse rather than
|
|
153
|
+
// silently advance past an open question the flag forgot to declare.
|
|
154
|
+
if (sidecar !== undefined) {
|
|
155
|
+
return {
|
|
156
|
+
kind: 'invariant-violation',
|
|
157
|
+
type,
|
|
158
|
+
reason: 'sidecar-without-needsAnswers',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// ANALYSE: the per-type lifecycle rung (read-only classification only).
|
|
162
|
+
return {kind: ANALYSE_RUNG_FOR_TYPE[type], type};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// `needsAnswers` is true.
|
|
166
|
+
if (sidecar === undefined) {
|
|
167
|
+
// First pass: no sidecar yet → surface the questions (write it). This is the
|
|
168
|
+
// transitional cell — surfacing normally writes the sidecar atomically, so a
|
|
169
|
+
// gated item without a sidecar is the moment to generate questions.
|
|
170
|
+
return {kind: 'surface', type};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// A sidecar exists: the two signals AGREE (invariant 1 holds). The answered-
|
|
174
|
+
// state — derived from the ENTRIES, never the frontmatter mirror — decides.
|
|
175
|
+
if (allAnswered(sidecar)) {
|
|
176
|
+
// Every entry answered → apply + advance (the executor may re-pause).
|
|
177
|
+
return {kind: 'apply', type};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// A PENDING sidecar (a SUBSET answered, or none) ⇒ clean NO-OP. This is the
|
|
181
|
+
// invariant-2 cell: the loop never thrashes on a half-answered item; it idles
|
|
182
|
+
// until the human answers the rest (equivalent to `pendingEntries.length > 0`).
|
|
183
|
+
return {kind: 'no-op', type, reason: 'pending-sidecar'};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Is this classified rung a CLASSIFIED-NO-OP (the calm-at-rest result)? A small
|
|
188
|
+
* predicate the loop/convergence tests use to assert "the candidate pool is
|
|
189
|
+
* STABLE" — a `no-op` OR an `invariant-violation` is NOT an advanceable rung. The
|
|
190
|
+
* ANALYSE rungs + `surface` + `apply` ARE advanceable.
|
|
191
|
+
*/
|
|
192
|
+
export function isAdvanceable(classification: TickClassification): boolean {
|
|
193
|
+
return (
|
|
194
|
+
classification.kind !== 'no-op' &&
|
|
195
|
+
classification.kind !== 'invariant-violation'
|
|
196
|
+
);
|
|
197
|
+
}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import {
|
|
2
|
+
performAdvance,
|
|
3
|
+
type AdvanceContext,
|
|
4
|
+
type AdvanceResult,
|
|
5
|
+
type AdvanceExitCode,
|
|
6
|
+
type AdvanceOutcome,
|
|
7
|
+
} from './advance.js';
|
|
8
|
+
import {
|
|
9
|
+
pushTreelessResult,
|
|
10
|
+
TREELESS_RUNGS,
|
|
11
|
+
} from './advance-treeless-publish.js';
|
|
12
|
+
import {scanRepoPaths} from './scan.js';
|
|
13
|
+
import {ledgerRead, type LedgerReadStrategy} from './ledger-read.js';
|
|
14
|
+
import {
|
|
15
|
+
selectPrioritised,
|
|
16
|
+
taskableSpecs,
|
|
17
|
+
type SpecCandidate,
|
|
18
|
+
type SelectedItem,
|
|
19
|
+
} from './select-priority.js';
|
|
20
|
+
import {gatherLifecycleInPlace} from './lifecycle-gather.js';
|
|
21
|
+
import type {LifecyclePoolGates} from './lifecycle-pools.js';
|
|
22
|
+
import type {Config} from './config.js';
|
|
23
|
+
import type {ConfigOverrideMap} from './config-override.js';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The **`advance` one-shot DRIVER** (prd `advance-loop`, task
|
|
27
|
+
* `advance-drivers-and-gates`, US #2/7/23/25/26) — the SEQUENTIAL driver that
|
|
28
|
+
* WRAPS the substrate-agnostic advance TICK ({@link performAdvance}) over named
|
|
29
|
+
* item(s) or the bare eligible-SET form. It is the in-place counterpart of
|
|
30
|
+
* `do-autopick`'s {@link performDoAuto}/{@link performDoArgs}: it SELECTS +
|
|
31
|
+
* ORDERS items and runs the EXISTING tick per item, SEQUENTIALLY.
|
|
32
|
+
*
|
|
33
|
+
* **One substrate-agnostic TICK, two drivers (US #7).** The tick (classify →
|
|
34
|
+
* lock → execute, already built in {@link performAdvance}) is the shared
|
|
35
|
+
* contract. The TWO drivers wrap it:
|
|
36
|
+
*
|
|
37
|
+
* - the **one-shot driver** (this module) — human `advance`-style or a CI
|
|
38
|
+
* invocation: runs the tick over named item(s) / the eligible set
|
|
39
|
+
* SEQUENTIALLY (`advance` is sequential, exactly like `do`);
|
|
40
|
+
* - the **loop driver** (`run`, `run.ts`) — loops the tick over the eligible
|
|
41
|
+
* set with genuine parallelism, each item lock-guarded by the `advancing`
|
|
42
|
+
* borrow (already in {@link performAdvance}). `run` ≡ CI (same tick, different
|
|
43
|
+
* substrate); NO new execution model is introduced.
|
|
44
|
+
*
|
|
45
|
+
* **`-n x` is ALWAYS SEQUENTIAL (US #25)** — a dumb "run the tick N times" loop,
|
|
46
|
+
* for BOTH `do -n` ({@link performDoAuto}) and `advance -n` (here). Parallelism is
|
|
47
|
+
* NEVER a property of `-n`; it comes only from `run` (the concurrent loop) or the
|
|
48
|
+
* CI matrix.
|
|
49
|
+
*
|
|
50
|
+
* **The FLAT per-action gate family (US #23)** falls out of the SELECTION layer,
|
|
51
|
+
* exactly as it does for `do`: the eligible-pool scan only SURFACES a build item
|
|
52
|
+
* when `autoBuild` is on and a task-a-prd item when `autoTask` is on (the gate
|
|
53
|
+
* is a policy on the autonomous-SELECTION step, NOT on the explicit verb a human
|
|
54
|
+
* typed — an explicitly-NAMED `advance <slug>` builds regardless, mirroring
|
|
55
|
+
* `do <task>` vs `autoBuild`). SURFACE + APPLY are ALWAYS allowed — they run
|
|
56
|
+
* through the tick on any named item and are never pool-gated, so a repo with
|
|
57
|
+
* EVERY flag off still gets the QUESTION LOOP (surface + apply) but no autonomous
|
|
58
|
+
* build/task in the bare/`-n` selection ("question loop with zero autonomy").
|
|
59
|
+
* The triage rung's ask-vs-auto distinction (`observationTriage`) is read inside
|
|
60
|
+
* the tick; its SELECTION-layer `off` gate drops the observation pool here.
|
|
61
|
+
*
|
|
62
|
+
* **Isolation + chaining FALL OUT (US #26):** this driver builds NO new isolation
|
|
63
|
+
* or chaining machinery — it threads the SAME `AdvanceContext` the tick already
|
|
64
|
+
* consumes (which orchestrates `do`/`do prd:` through the isolation-strategy seam
|
|
65
|
+
* and rebase-before-integrate); a chain conflict routes to needs-attention as
|
|
66
|
+
* today, inside the orchestrated `do`.
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
/** The single-`advance` tick runner this driver drives per selected item. */
|
|
70
|
+
export type AdvanceTickRunner = (
|
|
71
|
+
options: AdvanceTickOptions,
|
|
72
|
+
) => Promise<AdvanceResult>;
|
|
73
|
+
|
|
74
|
+
/** The per-item tick options: the run context + the one resolved arg. */
|
|
75
|
+
export interface AdvanceTickOptions extends AdvanceContext {
|
|
76
|
+
arg: string;
|
|
77
|
+
read?: LedgerReadStrategy;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Options shared with every per-item tick run, threaded verbatim. */
|
|
81
|
+
type SharedAdvanceContext = AdvanceContext;
|
|
82
|
+
|
|
83
|
+
export interface PerformAdvanceMultiOptions extends SharedAdvanceContext {
|
|
84
|
+
/**
|
|
85
|
+
* The resolved repo config — provides `autoBuild` (the build gate for the
|
|
86
|
+
* task pool), `autoTask` (the task-a-prd gate for the prd pool), and
|
|
87
|
+
* `selectionOrder` (the configurable cross-pool order). The per-action gate
|
|
88
|
+
* family is APPLIED HERE, at the selection layer (the policy-on-autonomous-
|
|
89
|
+
* selection point).
|
|
90
|
+
*/
|
|
91
|
+
config: Config;
|
|
92
|
+
/**
|
|
93
|
+
* The per-machine {@link ConfigOverrideMap}. Threaded into the in-place pool
|
|
94
|
+
* scan (`scanRepoPaths`) so the per-machine override applies to advance
|
|
95
|
+
* autopick eligibility — WITHOUT it the committed `.dorfl.json` silently
|
|
96
|
+
* beats the override on this path (the in-place advance autopick mirror of the
|
|
97
|
+
* `do` autopick defect).
|
|
98
|
+
*/
|
|
99
|
+
override?: ConfigOverrideMap;
|
|
100
|
+
/**
|
|
101
|
+
* `advance -n <x>`: how many eligible items to advance, IN SEQUENCE. Bare
|
|
102
|
+
* `advance` (no arg, no count) ⇒ 1. SEQUENTIAL — never a parallelism knob
|
|
103
|
+
* (US #25; parallelism is `run` or the CI matrix).
|
|
104
|
+
*/
|
|
105
|
+
count?: number;
|
|
106
|
+
/** Override the single-tick runner (tests inject a stub). Defaults to {@link performAdvance}. */
|
|
107
|
+
run?: AdvanceTickRunner;
|
|
108
|
+
/** Override the read seam (prd pool); defaults to the active {@link ledgerRead}. */
|
|
109
|
+
read?: LedgerReadStrategy;
|
|
110
|
+
/**
|
|
111
|
+
* The LIFECYCLE-POOL create-gates (task `advance-autopick-lifecycle-pools`),
|
|
112
|
+
* the internal hook the gate tasks (`observation-triage-tri-state-gate` /
|
|
113
|
+
* `surface-blockers-gate`) will wire to the `observationTriage` /
|
|
114
|
+
* `surfaceBlockers` config read. INTERIM, born OFF: omitted ⇒ BOTH create-gates
|
|
115
|
+
* OFF, so the triage + surface sub-pools contribute NOTHING and a bare/`-n`
|
|
116
|
+
* `advance` auto-triages / auto-surfaces nothing (it changes no repo's
|
|
117
|
+
* behaviour). The apply sub-pool is NOT gated (consume is always-on), so an
|
|
118
|
+
* answered sidecar applies regardless. Tests FORCE the create-gates on through
|
|
119
|
+
* this same hook to exercise the triage/surface paths.
|
|
120
|
+
*/
|
|
121
|
+
lifecycleGates?: LifecyclePoolGates;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The aggregate result of a multi-item `advance` invocation. */
|
|
125
|
+
export interface AdvanceMultiResult {
|
|
126
|
+
/** Each per-item {@link AdvanceResult}, in the order they ran. */
|
|
127
|
+
results: AdvanceResult[];
|
|
128
|
+
/**
|
|
129
|
+
* The process exit code for the whole invocation: 0 iff EVERY item that ran
|
|
130
|
+
* succeeded (or there was nothing eligible — an empty bare `advance` is not a
|
|
131
|
+
* failure); otherwise the first non-zero per-item exit code (the worst outcome
|
|
132
|
+
* surfaces). Mirrors `do`'s multi-item exit contract.
|
|
133
|
+
*/
|
|
134
|
+
exitCode: AdvanceExitCode;
|
|
135
|
+
/** Human-readable summary (printed by the CLI). */
|
|
136
|
+
message: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The task-pool caps for an in-place `advance` selection. `advance` (one-shot) is
|
|
141
|
+
* per-repo + SEQUENTIAL, so the REAL bound is the requested `count`. We cap the
|
|
142
|
+
* task pool at "all eligible" and let {@link selectPrioritised}'s `count` trim
|
|
143
|
+
* across both pools — identical to `do-autopick`'s {@link performDoAuto}.
|
|
144
|
+
*/
|
|
145
|
+
const ALL_ELIGIBLE = Number.MAX_SAFE_INTEGER;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Run the BARE / `-n <x>` form: build the two ELIGIBLE pools for `cwd` (eligible
|
|
149
|
+
* TASKS gated by `autoBuild`, taskable prds gated by `autoTask`), order them
|
|
150
|
+
* (plus the lifecycle pools) per the resolved `selectionOrder` with `apply`
|
|
151
|
+
* pinned first, take `count` (default 1), and run the EXISTING advance tick per
|
|
152
|
+
* selected item, SEQUENTIALLY. The pools are the EXACT
|
|
153
|
+
* `do-autopick` pools (the SAME `scoreItems`/`taskableSpecs` predicates), so the
|
|
154
|
+
* per-action gate family is honoured by construction.
|
|
155
|
+
*
|
|
156
|
+
* The bare/`-n` selection draws ONLY from the autonomous pools (eligible tasks +
|
|
157
|
+
* taskable prds); SURFACE + APPLY of a gated item are reached by NAMING the item
|
|
158
|
+
* ({@link performAdvanceArgs}) — they are always-allowed and not pool-gated, so the
|
|
159
|
+
* bare form with every flag off correctly selects NOTHING (zero autonomy) while a
|
|
160
|
+
* named `advance <slug>` still surfaces/applies.
|
|
161
|
+
*/
|
|
162
|
+
export async function performAdvanceAuto(
|
|
163
|
+
options: PerformAdvanceMultiOptions,
|
|
164
|
+
): Promise<AdvanceMultiResult> {
|
|
165
|
+
const run = options.run ?? performAdvance;
|
|
166
|
+
const read = options.read ?? ledgerRead;
|
|
167
|
+
const note = options.note ?? (() => {});
|
|
168
|
+
const cwd = options.cwd;
|
|
169
|
+
const count = options.count ?? 1;
|
|
170
|
+
|
|
171
|
+
// Pool 1 — eligible TASKS via the EXISTING scan/select path. `scoreItems`
|
|
172
|
+
// inside `scanRepoPaths` gates eligibility on `autoBuild` (the build gate), so
|
|
173
|
+
// with `autoBuild` off NO task is selected — the build rung is never reached
|
|
174
|
+
// by the bare/`-n` selection.
|
|
175
|
+
const report = scanRepoPaths(
|
|
176
|
+
[cwd],
|
|
177
|
+
options.config,
|
|
178
|
+
new Set(),
|
|
179
|
+
options.override,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
// Pool 2 — TASKABLE prds filtered by `autoslice-gate`'s predicate (gated on
|
|
183
|
+
// `autoTask`). With `autoTask` off NO prd is selected — the task rung is
|
|
184
|
+
// never reached by the bare/`-n` selection.
|
|
185
|
+
const pool = read.resolveSpecPool({repoPath: cwd});
|
|
186
|
+
const specCandidates: SpecCandidate[] = pool.specs.map((spec) => ({
|
|
187
|
+
repoPath: cwd,
|
|
188
|
+
slug: spec.slug,
|
|
189
|
+
humanOnly: spec.humanOnly,
|
|
190
|
+
needsAnswers: spec.needsAnswers,
|
|
191
|
+
taskedAfter: spec.taskedAfter,
|
|
192
|
+
}));
|
|
193
|
+
const eligibleSpecs = taskableSpecs({
|
|
194
|
+
candidates: specCandidates,
|
|
195
|
+
taskedSlugs: pool.taskedSlugs,
|
|
196
|
+
autoTask: options.config.autoTask,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Pools 3 + 4 — the LIFECYCLE pools (untriaged observations + `needsAnswers`-
|
|
200
|
+
// blocked tasks/prds + answered-sidecar items), built CALLER-SIDE (here, the
|
|
201
|
+
// `advance` caller) through the SHARED enumeration unit and passed in — NOT baked
|
|
202
|
+
// into `selectPrioritised` (so `do` is provably unchanged). The create-gates
|
|
203
|
+
// default OFF (interim hardcoded-off): triage + surface contribute nothing; the
|
|
204
|
+
// apply sub-pool is always-on (consume), so an answered sidecar still applies.
|
|
205
|
+
const lifecycle = gatherLifecycleInPlace({
|
|
206
|
+
repoPath: cwd,
|
|
207
|
+
read,
|
|
208
|
+
gates: options.lifecycleGates,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Order across the (up to) FIVE pools per the resolved `selectionOrder` (apply
|
|
212
|
+
// pinned first) + bound by count — the SAME shared, pure `selectPrioritised` the
|
|
213
|
+
// `do` auto-pick driver uses (which passes NO lifecycle pools, so it is unchanged).
|
|
214
|
+
const selected = selectPrioritised({
|
|
215
|
+
report,
|
|
216
|
+
caps: {maxParallel: ALL_ELIGIBLE, perRepoMax: ALL_ELIGIBLE},
|
|
217
|
+
specs: eligibleSpecs,
|
|
218
|
+
selectionOrder: options.config.selectionOrder,
|
|
219
|
+
lifecycle,
|
|
220
|
+
count,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
if (selected.length === 0) {
|
|
224
|
+
// With every gate off this is the "zero autonomy" case: nothing autonomous to
|
|
225
|
+
// select. The question loop (surface/apply) is reached by NAMING an item, not
|
|
226
|
+
// the bare form — so this is calm-at-rest, NOT a failure.
|
|
227
|
+
const message =
|
|
228
|
+
'Nothing eligible to advance (no eligible tasks and no taskable prds ' +
|
|
229
|
+
'under the per-action gates; name an item to surface/apply its questions).';
|
|
230
|
+
note(message);
|
|
231
|
+
return {results: [], exitCode: 0, message};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return runSelectedInSequence(selected, options, run);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Run the EXPLICIT multi-arg form (`advance <a> <b> …`): the named items in the
|
|
239
|
+
* GIVEN order (no pool/priority — the operator chose them). Each arg is run
|
|
240
|
+
* through the existing advance tick, which itself resolves bare/`task:`/`prd:`/
|
|
241
|
+
* `obs:` (so a named prd drives the task rung, an `obs:` the triage rung, a
|
|
242
|
+
* collision errors), SEQUENTIALLY. A NAMED item is the always-allowed path — its
|
|
243
|
+
* surface/apply rung runs regardless of the per-action gates.
|
|
244
|
+
*/
|
|
245
|
+
export async function performAdvanceArgs(
|
|
246
|
+
args: string[],
|
|
247
|
+
options: PerformAdvanceMultiOptions,
|
|
248
|
+
): Promise<AdvanceMultiResult> {
|
|
249
|
+
const run = options.run ?? performAdvance;
|
|
250
|
+
const selected: SelectedItem[] = args.map((arg) => ({
|
|
251
|
+
repoPath: options.cwd,
|
|
252
|
+
slug: arg,
|
|
253
|
+
// The arg is passed VERBATIM to the tick (it does its own slug resolution
|
|
254
|
+
// across task/prd/observation); the namespace is irrelevant for explicit args.
|
|
255
|
+
namespace: 'task' as const,
|
|
256
|
+
}));
|
|
257
|
+
return runSelectedInSequence(selected, options, run, {verbatimArg: true});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Run a list of selected items through the existing advance tick, SEQUENTIALLY
|
|
262
|
+
* (US #25 — `-n` is always sequential), threading the shared context to each. For
|
|
263
|
+
* the pool path the arg encodes the namespace (`prd:<slug>` for a selected prd,
|
|
264
|
+
* bare slug for a task); for the explicit-arg path the caller's raw arg is passed
|
|
265
|
+
* verbatim. Each tick is INDEPENDENTLY `advancing`-lock-guarded inside
|
|
266
|
+
* {@link performAdvance} — sequential here means one item at a time, never a
|
|
267
|
+
* parallelism knob.
|
|
268
|
+
*/
|
|
269
|
+
async function runSelectedInSequence(
|
|
270
|
+
selected: SelectedItem[],
|
|
271
|
+
options: PerformAdvanceMultiOptions,
|
|
272
|
+
run: AdvanceTickRunner,
|
|
273
|
+
mode: {verbatimArg?: boolean} = {},
|
|
274
|
+
): Promise<AdvanceMultiResult> {
|
|
275
|
+
const shared = sharedAdvanceContext(options);
|
|
276
|
+
const results: AdvanceResult[] = [];
|
|
277
|
+
for (const item of selected) {
|
|
278
|
+
const arg = mode.verbatimArg ? item.slug : argForSelectedItem(item);
|
|
279
|
+
const result = await runAdvanceTickWithTreelessPublish(
|
|
280
|
+
{...shared, arg, read: options.read},
|
|
281
|
+
run,
|
|
282
|
+
);
|
|
283
|
+
results.push(result);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const firstFailure = results.find((r) => r.exitCode !== 0);
|
|
287
|
+
const exitCode: AdvanceExitCode = firstFailure ? firstFailure.exitCode : 0;
|
|
288
|
+
const ok = results.filter((r) => r.exitCode === 0).length;
|
|
289
|
+
const message =
|
|
290
|
+
`advanced ${results.length} item${results.length === 1 ? '' : 's'} ` +
|
|
291
|
+
`(${ok} ok, ${results.length - ok} not).`;
|
|
292
|
+
return {results, exitCode, message};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Run ONE in-place advance tick + ff-push a tree-less rung's result to the
|
|
297
|
+
* arbiter — task `advance-in-place-publishes-treeless-results`. Wraps the
|
|
298
|
+
* substrate-agnostic tick ({@link AdvanceTickRunner}) with the shared
|
|
299
|
+
* {@link pushTreelessResult} so a surfaced sidecar / `triaged:` marker /
|
|
300
|
+
* applied-answer commit committed LOCALLY in the in-place cwd LANDS on the
|
|
301
|
+
* arbiter's `main` (today the in-place tick commits locally and the work is lost
|
|
302
|
+
* on an ephemeral CI runner). Mirrors the `--isolated` one-shot + `run` loop
|
|
303
|
+
* driver call sites byte-for-byte:
|
|
304
|
+
*
|
|
305
|
+
* - gates PURELY on `result.exitCode === 0 && TREELESS_RUNGS.has(result.rung)
|
|
306
|
+
* && context.arbiter !== undefined` — the SAME gate the existing drivers
|
|
307
|
+
* use, no cleverer guard (a build/task rung integrates through the
|
|
308
|
+
* `doDriver` band; a no-arbiter laptop checkout already sits on the real
|
|
309
|
+
* `main`);
|
|
310
|
+
* - reuses `pushTreelessResult` VERBATIM (its bounded re-fetch+rebase retry is
|
|
311
|
+
* LOAD-BEARING for a sequential `-n` batch that integrates a build/task rung
|
|
312
|
+
* mid-batch and then runs a later tree-less rung whose `HEAD:main` push is
|
|
313
|
+
* non-fast-forward by construction);
|
|
314
|
+
* - NEVER `--force`. A push that keeps failing (or a genuine rebase conflict)
|
|
315
|
+
* is REPORTED via the `note` sink and does NOT crash the tick — the work
|
|
316
|
+
* stays committed in the cwd for the next pass / a human.
|
|
317
|
+
*
|
|
318
|
+
* Used by BOTH in-place entry points: {@link runSelectedInSequence} (the
|
|
319
|
+
* multi-item `-n` / auto-pick / multi-arg path) AND the CLI single-named-item
|
|
320
|
+
* path (which calls {@link performAdvance} directly, bypassing the sequence
|
|
321
|
+
* runner — the easy-to-miss site).
|
|
322
|
+
*
|
|
323
|
+
* The promote-apply edge mirrors the existing drivers without a special case: an
|
|
324
|
+
* `apply` rung whose agentic verdict mints an artifact (`mint-task`/`mint-prd`)
|
|
325
|
+
* runs `promoteObservation`'s OWN arbiter CAS and commits NOTHING tree-less, so the
|
|
326
|
+
* ff-push here is a harmless no-op (a `HEAD` with nothing new) — it does NOT
|
|
327
|
+
* double-publish nor clobber the promote CAS.
|
|
328
|
+
*/
|
|
329
|
+
export async function runAdvanceTickWithTreelessPublish(
|
|
330
|
+
options: AdvanceTickOptions,
|
|
331
|
+
run: AdvanceTickRunner,
|
|
332
|
+
): Promise<AdvanceResult> {
|
|
333
|
+
const result = await run(options);
|
|
334
|
+
if (
|
|
335
|
+
result.exitCode === 0 &&
|
|
336
|
+
result.rung !== undefined &&
|
|
337
|
+
TREELESS_RUNGS.has(result.rung) &&
|
|
338
|
+
options.arbiter !== undefined
|
|
339
|
+
) {
|
|
340
|
+
await pushTreelessResult({
|
|
341
|
+
cwd: options.cwd,
|
|
342
|
+
arbiter: options.arbiter,
|
|
343
|
+
// Large liveness ceiling — see `pushTreelessResult`'s C2 docs (task
|
|
344
|
+
// `c2-rebase-until-real-on-durable-main-promotions`). A clean re-rebase
|
|
345
|
+
// no longer counts against a small budget; a genuine conflict (slug gone
|
|
346
|
+
// from its source folder on the new `main`) still stops definitively.
|
|
347
|
+
retries: 1000,
|
|
348
|
+
env: undefined,
|
|
349
|
+
note: options.note ?? (() => {}),
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* The advance TICK arg for a pool-selected item — the SELECTION->ARG dispatch
|
|
357
|
+
* (task `advance-autopick-lifecycle-pools`, F-NAMESPACE). The `namespace`
|
|
358
|
+
* discriminator the selection carried maps to the tick arg the tick then
|
|
359
|
+
* classifies into the right rung:
|
|
360
|
+
* - `observation` → `obs:<slug>` (the triage rung; bare would resolve to a
|
|
361
|
+
* task, so the `obs:` prefix is required);
|
|
362
|
+
* - `spec` → `spec:<slug>` (a taskable spec's task rung, OR a `needsAnswers` spec
|
|
363
|
+
* the tick surfaces/applies);
|
|
364
|
+
* - `task` → bare `<slug>` (an eligible task's build rung, OR a `needsAnswers`
|
|
365
|
+
* task the tick surfaces/applies).
|
|
366
|
+
* The tick re-classifies each arg, so a `needsAnswers`-blocked task/prd reaches
|
|
367
|
+
* surface/apply and an untriaged observation reaches triage — the classifier +
|
|
368
|
+
* rung bodies are unchanged; only this selection->arg mapping is new.
|
|
369
|
+
*/
|
|
370
|
+
function argForSelectedItem(item: SelectedItem): string {
|
|
371
|
+
if (item.namespace === 'observation') {
|
|
372
|
+
return `obs:${item.slug}`;
|
|
373
|
+
}
|
|
374
|
+
if (item.namespace === 'spec') {
|
|
375
|
+
return `spec:${item.slug}`;
|
|
376
|
+
}
|
|
377
|
+
return item.slug;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** Strip the multi-only fields, leaving exactly the per-item {@link AdvanceContext}. */
|
|
381
|
+
function sharedAdvanceContext(
|
|
382
|
+
options: PerformAdvanceMultiOptions,
|
|
383
|
+
): SharedAdvanceContext {
|
|
384
|
+
const {
|
|
385
|
+
config: _config,
|
|
386
|
+
count: _count,
|
|
387
|
+
run: _run,
|
|
388
|
+
read: _read,
|
|
389
|
+
lifecycleGates: _lifecycleGates,
|
|
390
|
+
...rest
|
|
391
|
+
} = options;
|
|
392
|
+
void _config;
|
|
393
|
+
void _count;
|
|
394
|
+
void _run;
|
|
395
|
+
void _read;
|
|
396
|
+
void _lifecycleGates;
|
|
397
|
+
return rest;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Is this aggregate result a CALM-AT-REST (US #31 convergence) one — every item
|
|
402
|
+
* that ran was a NO-OP (a pending sidecar idling) AND nothing failed? The
|
|
403
|
+
* convergence/drain tests use this to assert the loop IDLES when there are no
|
|
404
|
+
* answers (no thrash) and DRAINS monotonically as answers arrive. A pool of
|
|
405
|
+
* pending-sidecar items advances NOTHING (every tick a clean no-op); as the human
|
|
406
|
+
* answers, the answered items flip to `apply` and the no-op count shrinks.
|
|
407
|
+
*/
|
|
408
|
+
export function isCalmAtRest(result: AdvanceMultiResult): boolean {
|
|
409
|
+
return (
|
|
410
|
+
result.exitCode === 0 && result.results.every((r) => r.outcome === 'no-op')
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export type {AdvanceOutcome};
|