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,188 @@
|
|
|
1
|
+
import { type SelectCaps } from './select.js';
|
|
2
|
+
import type { ScanReport } from './scan.js';
|
|
3
|
+
import { type HumanOnlyGate } from './tasking-eligibility.js';
|
|
4
|
+
import { type SelectionOrderConfig } from './select-order.js';
|
|
5
|
+
/**
|
|
6
|
+
* The SHARED, PURE selection-and-ordering helper for the multi-item `do`/`advance`
|
|
7
|
+
* forms (auto-pick / `-n <x>` / `<a> <b> …`) and the CONFIGURABLE selection ORDER
|
|
8
|
+
* (task `advance-selection-order-config`; ADR `ci-config-policy-and-gate-family`,
|
|
9
|
+
* selection-order section). `apply` is PINNED FIRST (consume-always-wins); the
|
|
10
|
+
* other four pools (`build` / `task` / `surface` / `triage`) are ranked by the
|
|
11
|
+
* per-repo `selectionOrder` field (a PRESET keyword or an explicit pool-name
|
|
12
|
+
* list), whose `drain` default reproduces today's tasks-first "drain ready work
|
|
13
|
+
* before creating more".
|
|
14
|
+
*
|
|
15
|
+
* It is the ONE place the cross-pool ordering lives, so it is not duplicated when
|
|
16
|
+
* `run`'s tick later adopts the SAME priority
|
|
17
|
+
* (ADR §3: "the `run`/`do` auto-task step"). This task (`do-autopick`) OWNS and
|
|
18
|
+
* builds this helper; it does NOT retro-wire `run` to call it (at `do-autopick`
|
|
19
|
+
* time `run`'s tick is task-only — concurrent + looped — and adopting this
|
|
20
|
+
* helper, so `run` also auto-tasks eligible prds, is a noted FOLLOW-UP once both
|
|
21
|
+
* land). Build it standalone; do not assume `run` already calls it.
|
|
22
|
+
*
|
|
23
|
+
* **Up to FIVE pools.** The `scan`/`selectCandidates`/eligibility model is
|
|
24
|
+
* TASK-ONLY (there is no prd candidate). So this helper composes:
|
|
25
|
+
*
|
|
26
|
+
* - the **`build` pool** (eligible TASKS) — the EXISTING {@link selectCandidates}
|
|
27
|
+
* path (round-robin across repos, capped). This is the EXACT task-selection
|
|
28
|
+
* primitive `run` uses, so `run` and this helper SHARE it (they share
|
|
29
|
+
* `selectCandidates`, the task-pool core).
|
|
30
|
+
* - the **`task` pool** (prd-to-task) — a pool the caller builds from the prd reader
|
|
31
|
+
* (`ledgerRead.resolveSpecPool`) filtered by `autoslice-gate`'s pure predicate
|
|
32
|
+
* ({@link resolveTaskingEligibility}); see {@link taskableSpecs}. The helper
|
|
33
|
+
* does NOT reinvent prd eligibility.
|
|
34
|
+
*
|
|
35
|
+
* `do` is STRICTLY SEQUENTIAL (parallelism is `run`'s job, ADR §3) — this helper
|
|
36
|
+
* only ORDERS + COUNTS the items; the caller runs the existing `do` pipeline per
|
|
37
|
+
* item one at a time. `count` bounds how many items are taken (auto-pick = 1,
|
|
38
|
+
* `-n <x>` = x). It is NOT a parallelism knob.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Which namespace a selected item names (mirrors the slug-namespace split). The
|
|
42
|
+
* `do` selection only ever produces `task`/`prd`; the `advance` selection ALSO
|
|
43
|
+
* produces `observation` (the lifecycle triage pool, task
|
|
44
|
+
* `advance-autopick-lifecycle-pools`), so a selected lifecycle item carries which
|
|
45
|
+
* rung the driver dispatches to. The widening is BACKWARD-COMPATIBLE: `do` never
|
|
46
|
+
* emits `observation` (its lifecycle pools default to none, see
|
|
47
|
+
* {@link selectPrioritised}).
|
|
48
|
+
*/
|
|
49
|
+
export type SelectedNamespace = 'task' | 'spec' | 'observation';
|
|
50
|
+
/** One item the selection layer picked, in run order. */
|
|
51
|
+
export interface SelectedItem {
|
|
52
|
+
/** The repo this item lives in (a working checkout for in-place `do`). */
|
|
53
|
+
repoPath: string;
|
|
54
|
+
/** The bare slug to act on. */
|
|
55
|
+
slug: string;
|
|
56
|
+
/**
|
|
57
|
+
* `'task'` ⇒ run the task-build `do` pipeline; `'spec'` ⇒ dispatch to the
|
|
58
|
+
* `do spec:<slug>` tasking path (tasking itself is `autoslice-command`, not
|
|
59
|
+
* here); `'observation'` ⇒ (advance only) the triage rung via `obs:<slug>`. The
|
|
60
|
+
* caller turns this into the right `do`/`advance` arg/dispatch.
|
|
61
|
+
*/
|
|
62
|
+
namespace: SelectedNamespace;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A lifecycle-pool selected item (task `advance-autopick-lifecycle-pools`). It is
|
|
66
|
+
* a {@link SelectedItem} — the same shape — carrying the lifecycle namespace
|
|
67
|
+
* (`observation` for triage; `task`/`prd` for a `needsAnswers`-blocked item the
|
|
68
|
+
* tick will surface/apply). A distinct alias names the lifecycle pools at the
|
|
69
|
+
* call sites WITHOUT a structural difference (the discriminator is `namespace`).
|
|
70
|
+
*/
|
|
71
|
+
export type LifecycleSelectedItem = SelectedItem;
|
|
72
|
+
/** A prd candidate for the tasking pool, before the eligibility gate runs. */
|
|
73
|
+
export interface SpecCandidate {
|
|
74
|
+
repoPath: string;
|
|
75
|
+
slug: string;
|
|
76
|
+
humanOnly: HumanOnlyGate;
|
|
77
|
+
needsAnswers: HumanOnlyGate;
|
|
78
|
+
taskedAfter: string[];
|
|
79
|
+
}
|
|
80
|
+
/** Inputs to {@link taskableSpecs}: the raw prd pool + the gate context. */
|
|
81
|
+
export interface TaskableSpecsInput {
|
|
82
|
+
/** Every prd enumerated from `work/prds/ready/` (the auto-task candidate source). */
|
|
83
|
+
candidates: SpecCandidate[];
|
|
84
|
+
/** Slugs whose prd resides in `work/prds/tasked/` (resolves `taskedAfter`). */
|
|
85
|
+
taskedSlugs: Set<string>;
|
|
86
|
+
/** The repo's resolved `autoTask` policy (`autoslice-gate`'s per-repo key). */
|
|
87
|
+
autoTask: boolean;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Filter a raw prd pool down to the TASKABLE prds, in declaration order, using
|
|
91
|
+
* `autoslice-gate`'s pure predicate ({@link resolveTaskingEligibility}) — NOT a
|
|
92
|
+
* reinvented eligibility model. A prd is taskable iff `needsAnswers !== true &&
|
|
93
|
+
* humanOnly !== true && autoTask` AND every `taskedAfter` prd is already tasked.
|
|
94
|
+
* Pure: no I/O (the caller reads the pool through `ledgerRead.resolveSpecPool`).
|
|
95
|
+
*/
|
|
96
|
+
export declare function taskableSpecs(input: TaskableSpecsInput): SpecCandidate[];
|
|
97
|
+
/** Inputs to {@link selectPrioritised}: the pools + ordering + count. */
|
|
98
|
+
export interface SelectPrioritisedInput {
|
|
99
|
+
/**
|
|
100
|
+
* The task pool source — a `scan` report (task-only, the existing model) +
|
|
101
|
+
* the concurrency/selection caps. The helper runs the EXISTING
|
|
102
|
+
* {@link selectCandidates} over it, so the task ordering is byte-identical to
|
|
103
|
+
* what `run` selects (the shared primitive).
|
|
104
|
+
*/
|
|
105
|
+
report: ScanReport;
|
|
106
|
+
/** Caps for the task-pool selection (round-robin/per-repo/total). */
|
|
107
|
+
caps: SelectCaps;
|
|
108
|
+
/**
|
|
109
|
+
* The ALREADY-FILTERED taskable spec pool (run {@link taskableSpecs} first).
|
|
110
|
+
* In declaration order; this helper does not re-gate them.
|
|
111
|
+
*/
|
|
112
|
+
specs: SpecCandidate[];
|
|
113
|
+
/**
|
|
114
|
+
* The configurable selection ORDER across the four ORDERABLE pools (`build` /
|
|
115
|
+
* `task` / `surface` / `triage`), as a PRESET keyword or an explicit pool-name
|
|
116
|
+
* list (task `advance-selection-order-config`; the `selectionOrder` config
|
|
117
|
+
* field). Resolved through {@link resolveSelectionOrder} (apply is pinned first
|
|
118
|
+
* and NOT nameable here). OMITTED ⇒ the `drain` default (`[build, task,
|
|
119
|
+
* surface, triage]`), which reproduces today's tasks-first "drain before
|
|
120
|
+
* create" two-pool default. `[task, build, ...]` reproduces the old
|
|
121
|
+
* `prdsFirst: true`. An unknown name/keyword FAILS LOUDLY.
|
|
122
|
+
*/
|
|
123
|
+
selectionOrder?: SelectionOrderConfig;
|
|
124
|
+
/**
|
|
125
|
+
* How many items to take across ALL pools, in priority order. Auto-pick = 1;
|
|
126
|
+
* `do -n <x>` = x. Unset ⇒ take ALL eligible items (the priority order is still
|
|
127
|
+
* applied). Sequential — NOT a parallelism knob.
|
|
128
|
+
*/
|
|
129
|
+
count?: number;
|
|
130
|
+
/**
|
|
131
|
+
* The OPTIONAL lifecycle pools (task `advance-autopick-lifecycle-pools`),
|
|
132
|
+
* constructed CALLER-SIDE (the `advance` callers only) and passed in — exactly
|
|
133
|
+
* as {@link prds} is. DEFAULTS to none, so `performDoAuto` (which passes only
|
|
134
|
+
* its two pools) is provably UNCHANGED: `do` auto-pick never selects an
|
|
135
|
+
* observation or a `needsAnswers` item. ONLY the `advance` callers
|
|
136
|
+
* (`performAdvanceAuto` / the mirror-side advance path) supply these.
|
|
137
|
+
*
|
|
138
|
+
* Ordered per the resolved {@link selectionOrder}: `apply` is ALWAYS prepended
|
|
139
|
+
* (pinned first — consume-always-wins), then the four orderable pools (`build` /
|
|
140
|
+
* `task` / `surface` / `triage`) in the configured order, truncated to
|
|
141
|
+
* {@link count}. A pool NAMED in the order but absent here (gated off — empty)
|
|
142
|
+
* is simply a no-op (it contributes no items), so the gates (what is PRESENT)
|
|
143
|
+
* and `selectionOrder` (what runs first) compose ORTHOGONALLY.
|
|
144
|
+
*/
|
|
145
|
+
lifecycle?: SelectedLifecyclePools;
|
|
146
|
+
/**
|
|
147
|
+
* The HELD-SLUG set to SUBTRACT from the `build` pool (eligible TASKS) — prd
|
|
148
|
+
* `ledger-status-per-item-lock-refs` US #15, task
|
|
149
|
+
* `claim-acquires-unified-lock-no-body-move`. A task whose per-item lock is
|
|
150
|
+
* currently held is dropped from selection, so the eligible pool is "in
|
|
151
|
+
* `backlog/` on `main` AND no lock held". Normally the `report` is already
|
|
152
|
+
* subtracted at {@link scoreItems} time (the readers gather held locks), so this
|
|
153
|
+
* is a SECOND, explicit guard for callers that build the report WITHOUT the
|
|
154
|
+
* subtraction; OMITTED ⇒ no extra filtering. Redundant-but-harmless while the
|
|
155
|
+
* body still moves to `in-progress/`; in force for task #9.
|
|
156
|
+
*/
|
|
157
|
+
heldSlugs?: Set<string>;
|
|
158
|
+
}
|
|
159
|
+
/** The (optional) lifecycle pools handed to {@link selectPrioritised}, pre-built. */
|
|
160
|
+
export interface SelectedLifecyclePools {
|
|
161
|
+
/** `apply` items (answered sidecars; CONSUME, always present when supplied). */
|
|
162
|
+
apply: LifecycleSelectedItem[];
|
|
163
|
+
/** `surface` items (blocked, no all-answered sidecar; already gate-filtered). */
|
|
164
|
+
surface: LifecycleSelectedItem[];
|
|
165
|
+
/** `triage` items (untriaged observations; already gate-filtered). */
|
|
166
|
+
triage: LifecycleSelectedItem[];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Build the ordered, counted list of items to do across the (up to) FIVE pools,
|
|
170
|
+
* applying the configurable {@link selectionOrder} with `apply` PINNED FIRST and
|
|
171
|
+
* the count bound. The task pool is selected via the EXISTING
|
|
172
|
+
* {@link selectCandidates} (the shared primitive `run` uses); the prd pool is the
|
|
173
|
+
* pre-filtered {@link taskableSpecs} output; the lifecycle pools (`apply` /
|
|
174
|
+
* `surface` / `triage`) are caller-built (none for `do`).
|
|
175
|
+
*
|
|
176
|
+
* Ordering: `apply` is always prepended (consume-always-wins; not orderable),
|
|
177
|
+
* then the four orderable pools (`build` = eligible tasks, `task` = taskable
|
|
178
|
+
* prds, `surface`, `triage`) interleaved in the resolved {@link selectionOrder}
|
|
179
|
+
* (default `drain` = `[build, task, surface, triage]`, which reproduces today's
|
|
180
|
+
* tasks-first two-pool default). A pool named in the order but EMPTY (gated off)
|
|
181
|
+
* contributes nothing — a no-op, not an error (gates decide what is PRESENT,
|
|
182
|
+
* `selectionOrder` ranks what is present). Then truncated to `count`.
|
|
183
|
+
*
|
|
184
|
+
* Deterministic + pure. The caller runs the existing `do` pipeline per returned
|
|
185
|
+
* item, SEQUENTIALLY.
|
|
186
|
+
*/
|
|
187
|
+
export declare function selectPrioritised(input: SelectPrioritisedInput): SelectedItem[];
|
|
188
|
+
//# sourceMappingURL=select-priority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-priority.d.ts","sourceRoot":"","sources":["../src/select-priority.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,UAAU,EAAC,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAC1C,OAAO,EAEN,KAAK,aAAa,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAIN,KAAK,oBAAoB,EACzB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAEhE,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC5B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,SAAS,EAAE,iBAAiB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAEjD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IAClC,qFAAqF;IACrF,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,+EAA+E;IAC/E,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,EAAE,CAWxE;AAED,yEAAyE;AACzE,MAAM,WAAW,sBAAsB;IACtC;;;;;OAKG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB,qEAAqE;IACrE,IAAI,EAAE,UAAU,CAAC;IACjB;;;OAGG;IACH,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED,qFAAqF;AACrF,MAAM,WAAW,sBAAsB;IACtC,gFAAgF;IAChF,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,iFAAiF;IACjF,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,sEAAsE;IACtE,MAAM,EAAE,qBAAqB,EAAE,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,sBAAsB,GAC3B,YAAY,EAAE,CAgDhB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { selectCandidates } from './select.js';
|
|
2
|
+
import { resolveTaskingEligibility, } from './tasking-eligibility.js';
|
|
3
|
+
import { resolveSelectionOrder, DEFAULT_SELECTION_ORDER, } from './select-order.js';
|
|
4
|
+
/**
|
|
5
|
+
* Filter a raw prd pool down to the TASKABLE prds, in declaration order, using
|
|
6
|
+
* `autoslice-gate`'s pure predicate ({@link resolveTaskingEligibility}) — NOT a
|
|
7
|
+
* reinvented eligibility model. A prd is taskable iff `needsAnswers !== true &&
|
|
8
|
+
* humanOnly !== true && autoTask` AND every `taskedAfter` prd is already tasked.
|
|
9
|
+
* Pure: no I/O (the caller reads the pool through `ledgerRead.resolveSpecPool`).
|
|
10
|
+
*/
|
|
11
|
+
export function taskableSpecs(input) {
|
|
12
|
+
return input.candidates.filter((spec) => resolveTaskingEligibility({
|
|
13
|
+
humanOnly: spec.humanOnly,
|
|
14
|
+
needsAnswers: spec.needsAnswers,
|
|
15
|
+
taskedAfter: spec.taskedAfter,
|
|
16
|
+
taskedSlugs: input.taskedSlugs,
|
|
17
|
+
autoTask: input.autoTask,
|
|
18
|
+
}).taskable);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build the ordered, counted list of items to do across the (up to) FIVE pools,
|
|
22
|
+
* applying the configurable {@link selectionOrder} with `apply` PINNED FIRST and
|
|
23
|
+
* the count bound. The task pool is selected via the EXISTING
|
|
24
|
+
* {@link selectCandidates} (the shared primitive `run` uses); the prd pool is the
|
|
25
|
+
* pre-filtered {@link taskableSpecs} output; the lifecycle pools (`apply` /
|
|
26
|
+
* `surface` / `triage`) are caller-built (none for `do`).
|
|
27
|
+
*
|
|
28
|
+
* Ordering: `apply` is always prepended (consume-always-wins; not orderable),
|
|
29
|
+
* then the four orderable pools (`build` = eligible tasks, `task` = taskable
|
|
30
|
+
* prds, `surface`, `triage`) interleaved in the resolved {@link selectionOrder}
|
|
31
|
+
* (default `drain` = `[build, task, surface, triage]`, which reproduces today's
|
|
32
|
+
* tasks-first two-pool default). A pool named in the order but EMPTY (gated off)
|
|
33
|
+
* contributes nothing — a no-op, not an error (gates decide what is PRESENT,
|
|
34
|
+
* `selectionOrder` ranks what is present). Then truncated to `count`.
|
|
35
|
+
*
|
|
36
|
+
* Deterministic + pure. The caller runs the existing `do` pipeline per returned
|
|
37
|
+
* item, SEQUENTIALLY.
|
|
38
|
+
*/
|
|
39
|
+
export function selectPrioritised(input) {
|
|
40
|
+
const held = input.heldSlugs;
|
|
41
|
+
const buildItems = selectCandidates(input.report, input.caps)
|
|
42
|
+
.filter((candidate) => !held || !held.has(candidate.slug))
|
|
43
|
+
.map((candidate) => ({
|
|
44
|
+
repoPath: candidate.repoPath,
|
|
45
|
+
slug: candidate.slug,
|
|
46
|
+
namespace: 'task',
|
|
47
|
+
}));
|
|
48
|
+
const taskItems = input.specs.map((spec) => ({
|
|
49
|
+
repoPath: spec.repoPath,
|
|
50
|
+
slug: spec.slug,
|
|
51
|
+
namespace: 'spec',
|
|
52
|
+
}));
|
|
53
|
+
const lifecycle = input.lifecycle;
|
|
54
|
+
// The per-pool item lists, keyed by the orderable pool name. NOTE the
|
|
55
|
+
// vocabulary bridge: `build` = the eligible-TASK pool (namespace `task`),
|
|
56
|
+
// `task` = the taskable-prd pool (namespace `prd`) — the action names, not the
|
|
57
|
+
// item namespaces (task `advance-selection-order-config`).
|
|
58
|
+
const byPool = {
|
|
59
|
+
build: buildItems,
|
|
60
|
+
task: taskItems,
|
|
61
|
+
surface: lifecycle?.surface ?? [],
|
|
62
|
+
triage: lifecycle?.triage ?? [],
|
|
63
|
+
};
|
|
64
|
+
// Resolve the configured order (preset or explicit list; unknown name/keyword
|
|
65
|
+
// FAILS LOUDLY here). OMITTED ⇒ the `drain` default.
|
|
66
|
+
const order = resolveSelectionOrder(input.selectionOrder ?? DEFAULT_SELECTION_ORDER);
|
|
67
|
+
// `apply` is ALWAYS first (pinned, not orderable), then the four orderable
|
|
68
|
+
// pools in the resolved order. An absent (gated-off) pool's list is empty, so it
|
|
69
|
+
// drops out cleanly — no special-casing.
|
|
70
|
+
const applyItems = lifecycle?.apply ?? [];
|
|
71
|
+
const ordered = [
|
|
72
|
+
...applyItems,
|
|
73
|
+
...order.flatMap((pool) => byPool[pool]),
|
|
74
|
+
];
|
|
75
|
+
if (input.count === undefined) {
|
|
76
|
+
return ordered;
|
|
77
|
+
}
|
|
78
|
+
return ordered.slice(0, Math.max(0, input.count));
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=select-priority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-priority.js","sourceRoot":"","sources":["../src/select-priority.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAkC,MAAM,aAAa,CAAC;AAE9E,OAAO,EACN,yBAAyB,GAEzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,qBAAqB,EACrB,uBAAuB,GAGvB,MAAM,mBAAmB,CAAC;AA4F3B;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB;IACtD,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAC7B,CAAC,IAAI,EAAE,EAAE,CACR,yBAAyB,CAAC;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACxB,CAAC,CAAC,QAAQ,CACZ,CAAC;AACH,CAAC;AA2ED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAChC,KAA6B;IAE7B,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,MAAM,UAAU,GAAmB,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;SAC3E,MAAM,CAAC,CAAC,SAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,SAAoB,EAAE,EAAE,CAAC,CAAC;QAC/B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,SAAS,EAAE,MAAe;KAC1B,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAmB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,MAAe;KAC1B,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAElC,sEAAsE;IACtE,0EAA0E;IAC1E,+EAA+E;IAC/E,2DAA2D;IAC3D,MAAM,MAAM,GAA0C;QACrD,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE;QACjC,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,EAAE;KAC/B,CAAC;IAEF,8EAA8E;IAC9E,qDAAqD;IACrD,MAAM,KAAK,GAAG,qBAAqB,CAClC,KAAK,CAAC,cAAc,IAAI,uBAAuB,CAC/C,CAAC;IAEF,2EAA2E;IAC3E,iFAAiF;IACjF,yCAAyC;IACzC,MAAM,UAAU,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAmB;QAC/B,GAAG,UAAU;QACb,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACxC,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/select.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ScanReport } from './scan.js';
|
|
2
|
+
/** One item the runner intends to claim+run, identified by repo + slug. */
|
|
3
|
+
export interface Candidate {
|
|
4
|
+
repoPath: string;
|
|
5
|
+
slug: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SelectCaps {
|
|
8
|
+
/** Global cap on items claimed+run in one tick. */
|
|
9
|
+
maxParallel: number;
|
|
10
|
+
/** Per-repo cap on concurrent claims. */
|
|
11
|
+
perRepoMax: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Build the ordered list of candidates to attempt from a `scan` report,
|
|
15
|
+
* respecting the concurrency caps. Only eligible items are considered. Selection
|
|
16
|
+
* is round-robin across repos for fairness (so a single busy repo cannot starve
|
|
17
|
+
* the others under `maxParallel`), capping each repo at `perRepoMax` and the
|
|
18
|
+
* total at `maxParallel`. Deterministic: repos and items are already sorted by
|
|
19
|
+
* the scan core.
|
|
20
|
+
*
|
|
21
|
+
* NOTE: this is optimistic selection only — actual ownership is decided by the
|
|
22
|
+
* arbiter when the claim CAS runs. A candidate that loses the race is dropped then.
|
|
23
|
+
*/
|
|
24
|
+
export declare function selectCandidates(report: ScanReport, caps: SelectCaps): Candidate[];
|
|
25
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,WAAW,CAAC;AAE1C,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IAC1B,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,GACd,SAAS,EAAE,CAgCb"}
|
package/dist/select.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the ordered list of candidates to attempt from a `scan` report,
|
|
3
|
+
* respecting the concurrency caps. Only eligible items are considered. Selection
|
|
4
|
+
* is round-robin across repos for fairness (so a single busy repo cannot starve
|
|
5
|
+
* the others under `maxParallel`), capping each repo at `perRepoMax` and the
|
|
6
|
+
* total at `maxParallel`. Deterministic: repos and items are already sorted by
|
|
7
|
+
* the scan core.
|
|
8
|
+
*
|
|
9
|
+
* NOTE: this is optimistic selection only — actual ownership is decided by the
|
|
10
|
+
* arbiter when the claim CAS runs. A candidate that loses the race is dropped then.
|
|
11
|
+
*/
|
|
12
|
+
export function selectCandidates(report, caps) {
|
|
13
|
+
// Per-repo queues of eligible slugs, preserving scan order.
|
|
14
|
+
const queues = report.repos.map((repo) => ({
|
|
15
|
+
path: repo.path,
|
|
16
|
+
slugs: repo.items
|
|
17
|
+
.filter((item) => item.eligibility.eligible)
|
|
18
|
+
.map((item) => item.slug),
|
|
19
|
+
taken: 0,
|
|
20
|
+
}));
|
|
21
|
+
const picks = [];
|
|
22
|
+
let progress = true;
|
|
23
|
+
while (picks.length < caps.maxParallel && progress) {
|
|
24
|
+
progress = false;
|
|
25
|
+
for (const queue of queues) {
|
|
26
|
+
if (picks.length >= caps.maxParallel) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
if (queue.taken >= caps.perRepoMax) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const next = queue.slugs[queue.taken];
|
|
33
|
+
if (next === undefined) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
picks.push({ repoPath: queue.path, slug: next });
|
|
37
|
+
queue.taken++;
|
|
38
|
+
progress = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return picks;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC/B,MAAkB,EAClB,IAAgB;IAEhB,4DAA4D;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;aACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,KAAK,EAAE,CAAC;KACR,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,CAAC;QACpD,QAAQ,GAAG,KAAK,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM;YACP,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpC,SAAS;YACV,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAS;YACV,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC;QACjB,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi's DEFAULT per-cwd sessions folder for `cwd` — a direct child of
|
|
3
|
+
* `~/.pi/agent/sessions/` (invariant #4), so the dashboard's non-recursive
|
|
4
|
+
* `listAll()` scans it and groups by the session header `cwd`. Replicates pi's
|
|
5
|
+
* `getDefaultSessionDirPath` encoding verbatim (verified vs pinned source). PURE
|
|
6
|
+
* (does not create the folder — the parent is ensured at generation time / by
|
|
7
|
+
* pi's own `SessionManager.open`).
|
|
8
|
+
*/
|
|
9
|
+
export declare function piDefaultSessionDir(cwd: string): string;
|
|
10
|
+
/** Inputs to {@link generateSessionPath}. */
|
|
11
|
+
export interface GenerateSessionPathInput {
|
|
12
|
+
/**
|
|
13
|
+
* The HOST-ONLY sessions root (resolved `config.sessionsDir`). `undefined`
|
|
14
|
+
* (unset) ⇒ pi's default per-cwd folder for {@link cwd} (the DYNAMIC default,
|
|
15
|
+
* kept in this ONE place — never smeared across config defaulting).
|
|
16
|
+
*/
|
|
17
|
+
sessionsDir?: string;
|
|
18
|
+
/** The job cwd pi is spawned in — used for the unset-default folder. */
|
|
19
|
+
cwd: string;
|
|
20
|
+
/**
|
|
21
|
+
* A human-readable id for the filename stem (the slug in-place, the work-id
|
|
22
|
+
* for a job worktree). Made unique per launch internally.
|
|
23
|
+
*/
|
|
24
|
+
id: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate the absolute, `.jsonl`-ending session FILE path to pass as
|
|
28
|
+
* `--session <path>` (invariant #1). `<root>/<id>-<unique>.jsonl`, where `<root>`
|
|
29
|
+
* is the resolved `sessionsDir` or — when unset — pi's default per-cwd folder
|
|
30
|
+
* (the DYNAMIC default). The path is ABSOLUTE (resolved against the process cwd
|
|
31
|
+
* if a relative `sessionsDir` was given) and the stem is unique per launch, so a
|
|
32
|
+
* second launch in the same checkout never appends to / replays the first's
|
|
33
|
+
* session.
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateSessionPath(input: GenerateSessionPathInput): string;
|
|
36
|
+
//# sourceMappingURL=session-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-path.d.ts","sourceRoot":"","sources":["../src/session-path.ts"],"names":[],"mappings":"AA8FA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAcD,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAM3E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* pi's env override for its agent dir. Real pi reads
|
|
5
|
+
* `${APP_NAME.toUpperCase()}_CODING_AGENT_DIR` (i.e. `PI_CODING_AGENT_DIR`) in its
|
|
6
|
+
* `getAgentDir()` (verified vs pinned source `config.ts`); when set, ALL of pi's
|
|
7
|
+
* default session paths move under it. dorfl's replica MUST honour the same
|
|
8
|
+
* var, or a user/CI that points pi at a custom agent dir would have dorfl
|
|
9
|
+
* write sessions to `~/.pi/agent/sessions` while pi reads the custom dir — sessions
|
|
10
|
+
* then invisible to pi AND pi-remote (the very breakage this task fixes). Also the
|
|
11
|
+
* clean lever for test isolation (point it at a scratch dir). NOTE: we honour only
|
|
12
|
+
* the agent-dir var, not pi's separate `PI_CODING_AGENT_SESSION_DIR` — dorfl
|
|
13
|
+
* already has its own `sessionsDir` override for that role.
|
|
14
|
+
*/
|
|
15
|
+
const PI_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';
|
|
16
|
+
/** Expand a leading `~`/`~/` to the home dir (pi's `expandTildePath` behaviour). */
|
|
17
|
+
function expandTilde(p) {
|
|
18
|
+
if (p === '~') {
|
|
19
|
+
return homedir();
|
|
20
|
+
}
|
|
21
|
+
if (p.startsWith('~/') || p.startsWith('~\\')) {
|
|
22
|
+
return join(homedir(), p.slice(2));
|
|
23
|
+
}
|
|
24
|
+
return p;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generate the **full pi session-file path** the harness passes as `--session
|
|
28
|
+
* <path>` (task `session-path-pi-default`). This is the single source of the
|
|
29
|
+
* session path: the caller generates it ONCE (before pi launches, so the
|
|
30
|
+
* `do --watch` tailer can tail the KNOWN path) and threads it into BOTH the
|
|
31
|
+
* adapter (`LaunchInput.session`) and the tailer.
|
|
32
|
+
*
|
|
33
|
+
* ## Why a full FILE path, not `--session-dir`
|
|
34
|
+
*
|
|
35
|
+
* dorfl used to pin `--session-dir <cwd>/.dorfl-pi-session`, which
|
|
36
|
+
* (1) hid sessions from the pi-remote dashboard (`SessionManager.listAll()` only
|
|
37
|
+
* scans `~/.pi/agent/sessions/`), (2) made `do --watch` race onto a stale
|
|
38
|
+
* prior-run log (newest-by-mtime in a shared dir), and (3) polluted the in-place
|
|
39
|
+
* checkout with an untracked dir. Passing `--session <full-path>` fixes all
|
|
40
|
+
* three: pi creates+writes the session at exactly that path, it takes precedence
|
|
41
|
+
* over `--session-dir`, and the watcher tails a path it knew before pi started.
|
|
42
|
+
*
|
|
43
|
+
* ## The four load-bearing pi `--session` invariants (verified vs pinned pi
|
|
44
|
+
* source `core/session-manager.ts` + `main.ts` `resolveSessionPath`)
|
|
45
|
+
*
|
|
46
|
+
* 1. **The arg MUST be PATH-SHAPED — absolute and ending `.jsonl`.** pi's
|
|
47
|
+
* `resolveSessionPath` takes the file-path branch ONLY when the arg contains
|
|
48
|
+
* a slash OR ends `.jsonl`; otherwise it treats the arg as a session-ID to
|
|
49
|
+
* look up, fails `not_found`, and pi EXITS 1. So `<sessionsDir>/<id>.jsonl`
|
|
50
|
+
* is required (a bare id would kill the run).
|
|
51
|
+
* 2. **pi creates+writes a NON-EXISTENT `--session` path** (`SessionManager.open`
|
|
52
|
+
* on a missing file → `newSession()` pinned to the path). So the FILENAME
|
|
53
|
+
* must be UNIQUE PER LAUNCH: a reused name on an existing non-empty file would
|
|
54
|
+
* make pi LOAD + APPEND (resume), silently replaying the prior run.
|
|
55
|
+
* 3. **The header `cwd` falls back to `process.cwd()` for a new file** (no header
|
|
56
|
+
* to read), so dashboard repo-grouping is correct ONLY because the adapter
|
|
57
|
+
* spawns pi with `cwd: input.dir`. The FOLDER does not imply the repo.
|
|
58
|
+
* 4. **`listAll` is NON-RECURSIVE (one level):** a session is dashboard-visible
|
|
59
|
+
* via the default `listAll()` ONLY as a `.jsonl` DIRECTLY inside a first-level
|
|
60
|
+
* subdir of `~/.pi/agent/sessions/` — which the default {@link
|
|
61
|
+
* piDefaultSessionDir} (a direct child) gives.
|
|
62
|
+
*
|
|
63
|
+
* ## Why the slug helper is replicated, not imported
|
|
64
|
+
*
|
|
65
|
+
* dorfl depends ONLY on `commander` (see
|
|
66
|
+
* `work/notes/observations/task-premise-pi-coding-agent-not-a-dep.md`). pi's exported
|
|
67
|
+
* `getDefaultSessionDir(cwd)` lives in `@earendil-works/pi-coding-agent`, whose
|
|
68
|
+
* dependency tree is heavy (`pi-agent-core`, `pi-ai`, `zod`, `ws`). Pulling that
|
|
69
|
+
* in for one tiny slug function is not worth it, so the encoding is REPLICATED
|
|
70
|
+
* here (the same choice the do-watch task made for its session-log type). The
|
|
71
|
+
* encoding is verified verbatim against pinned pi source `getDefaultSessionDirPath`:
|
|
72
|
+
*
|
|
73
|
+
* join(agentDir, 'sessions', `--${resolve(cwd).replace(/^[/\\]/,'').replace(/[/\\:]/g,'-')}--`)
|
|
74
|
+
*
|
|
75
|
+
* where `agentDir` is `~/.pi/agent`. If a runtime dep on pi-coding-agent is ever
|
|
76
|
+
* wanted, swapping this for the import is a one-line change.
|
|
77
|
+
*/
|
|
78
|
+
/**
|
|
79
|
+
* pi's agent dir — the parent of `sessions/`. Honours `PI_CODING_AGENT_DIR`
|
|
80
|
+
* (matching real pi's `getAgentDir()`), else `~/.pi/agent`. Read at call time (not
|
|
81
|
+
* cached) so a test setting `process.env.PI_CODING_AGENT_DIR` is respected.
|
|
82
|
+
*/
|
|
83
|
+
function piAgentDir() {
|
|
84
|
+
const override = process.env[PI_AGENT_DIR_ENV];
|
|
85
|
+
if (override !== undefined && override !== '') {
|
|
86
|
+
return expandTilde(override);
|
|
87
|
+
}
|
|
88
|
+
return join(homedir(), '.pi', 'agent');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* pi's DEFAULT per-cwd sessions folder for `cwd` — a direct child of
|
|
92
|
+
* `~/.pi/agent/sessions/` (invariant #4), so the dashboard's non-recursive
|
|
93
|
+
* `listAll()` scans it and groups by the session header `cwd`. Replicates pi's
|
|
94
|
+
* `getDefaultSessionDirPath` encoding verbatim (verified vs pinned source). PURE
|
|
95
|
+
* (does not create the folder — the parent is ensured at generation time / by
|
|
96
|
+
* pi's own `SessionManager.open`).
|
|
97
|
+
*/
|
|
98
|
+
export function piDefaultSessionDir(cwd) {
|
|
99
|
+
const resolvedCwd = resolve(cwd);
|
|
100
|
+
const safe = `--${resolvedCwd.replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
|
|
101
|
+
return join(piAgentDir(), 'sessions', safe);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build a filename STEM that is UNIQUE PER LAUNCH (invariant #2). The `id`
|
|
105
|
+
* (slug for in-place, work-id for job-worktree) is the human-readable anchor; a
|
|
106
|
+
* timestamp + a short random suffix make it collision-proof even for two
|
|
107
|
+
* launches in the same millisecond / same checkout reusing the same slug.
|
|
108
|
+
*/
|
|
109
|
+
function uniqueStem(id) {
|
|
110
|
+
const ts = Date.now().toString(36);
|
|
111
|
+
const rand = Math.random().toString(36).slice(2, 8);
|
|
112
|
+
return `${id}-${ts}-${rand}`;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate the absolute, `.jsonl`-ending session FILE path to pass as
|
|
116
|
+
* `--session <path>` (invariant #1). `<root>/<id>-<unique>.jsonl`, where `<root>`
|
|
117
|
+
* is the resolved `sessionsDir` or — when unset — pi's default per-cwd folder
|
|
118
|
+
* (the DYNAMIC default). The path is ABSOLUTE (resolved against the process cwd
|
|
119
|
+
* if a relative `sessionsDir` was given) and the stem is unique per launch, so a
|
|
120
|
+
* second launch in the same checkout never appends to / replays the first's
|
|
121
|
+
* session.
|
|
122
|
+
*/
|
|
123
|
+
export function generateSessionPath(input) {
|
|
124
|
+
const root = input.sessionsDir !== undefined && input.sessionsDir !== ''
|
|
125
|
+
? resolve(input.sessionsDir)
|
|
126
|
+
: piDefaultSessionDir(input.cwd);
|
|
127
|
+
return join(root, `${uniqueStem(input.id)}.jsonl`);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=session-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-path.js","sourceRoot":"","sources":["../src/session-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAChC,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAE/C,oFAAoF;AACpF,SAAS,WAAW,CAAC,CAAS;IAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,OAAO,EAAE,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH;;;;GAIG;AACH,SAAS,UAAU;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QAC/C,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC;IAChF,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,EAAU;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAmBD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IAClE,MAAM,IAAI,GACT,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE;QAC1D,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC;QAC5B,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type SidecarModel } from './sidecar.js';
|
|
2
|
+
/**
|
|
3
|
+
* The ATOMIC APPLY — the keystone the advance state-machine invariant
|
|
4
|
+
* `needsAnswers:false ⟺ no active sidecar` rests on. It mutates the item BODY
|
|
5
|
+
* and the SIDECAR in ONE commit, so the human never sees a torn "answer applied
|
|
6
|
+
* but sidecar still open" (a re-ask) or its reverse.
|
|
7
|
+
*
|
|
8
|
+
* Two shapes, both ONE commit:
|
|
9
|
+
*
|
|
10
|
+
* - **append / re-pause** (the sidecar is NOT fully answered after this apply):
|
|
11
|
+
* write the updated item body (if any) and the updated sidecar, leaving
|
|
12
|
+
* `needsAnswers: true`. The sidecar stays present (still carries pending
|
|
13
|
+
* questions).
|
|
14
|
+
* - **full resolution** (every entry answered): write the updated item body,
|
|
15
|
+
* CLEAR `needsAnswers` (→ `false`) on the item, and DELETE the sidecar — all
|
|
16
|
+
* in the SAME commit. After this the invariant holds: `needsAnswers:false`
|
|
17
|
+
* and no sidecar file.
|
|
18
|
+
*
|
|
19
|
+
* This task delivers the single-commit primitive over a working tree (the
|
|
20
|
+
* throwaway-git-repo pattern the tasking-lock / claim-cas tests use). It does
|
|
21
|
+
* NOT take the `advancing` CAS lock or race the arbiter — that is the lock
|
|
22
|
+
* task's job; this is the contract the lock later wraps. The caller supplies
|
|
23
|
+
* the item's CURRENT body and its on-disk PATH (relative to the repo root); the
|
|
24
|
+
* apply rewrites that file + the sidecar and commits them together.
|
|
25
|
+
*/
|
|
26
|
+
/** Whether to leave the sidecar present (re-pause) or delete it (resolved). */
|
|
27
|
+
export type ApplyMode = 'repause' | 'resolve';
|
|
28
|
+
export interface ApplyAtomicOptions {
|
|
29
|
+
/** Working clone/worktree the apply commits in. */
|
|
30
|
+
cwd: string;
|
|
31
|
+
/**
|
|
32
|
+
* Item path RELATIVE to `cwd` (e.g. `work/backlog/foo.md`). The sidecar path
|
|
33
|
+
* is derived from the model's identity — NOT from this path — so it survives
|
|
34
|
+
* the item's `git mv`s (identity-keyed, never folder-keyed).
|
|
35
|
+
*/
|
|
36
|
+
itemPath: string;
|
|
37
|
+
/**
|
|
38
|
+
* The NEW item body to write (the apply rung's mutation of the item). When
|
|
39
|
+
* omitted the item body is left as-is on disk (only `needsAnswers` is touched,
|
|
40
|
+
* and only on full resolution).
|
|
41
|
+
*/
|
|
42
|
+
itemBody?: string;
|
|
43
|
+
/** The sidecar model after this apply (entries updated/appended). */
|
|
44
|
+
sidecar: SidecarModel;
|
|
45
|
+
/**
|
|
46
|
+
* Override the resolution decision. By default it is DERIVED from the model
|
|
47
|
+
* (`allAnswered(sidecar)` ⇒ resolve, else re-pause) — the source of truth. An
|
|
48
|
+
* explicit `mode` is for the caller that already classified; it must agree
|
|
49
|
+
* with the derived state or the apply throws (no torn invariant).
|
|
50
|
+
*/
|
|
51
|
+
mode?: ApplyMode;
|
|
52
|
+
/** Advisory committer id for the commit subject. Defaults to git user.name. */
|
|
53
|
+
by?: string;
|
|
54
|
+
/** Environment for child git processes. */
|
|
55
|
+
env?: NodeJS.ProcessEnv;
|
|
56
|
+
/** Sink for human-readable progress notes. */
|
|
57
|
+
note?: (message: string) => void;
|
|
58
|
+
}
|
|
59
|
+
export interface ApplyAtomicResult {
|
|
60
|
+
/** `resolved` (sidecar deleted, needsAnswers cleared) or `repaused` (still open). */
|
|
61
|
+
outcome: 'resolved' | 'repaused';
|
|
62
|
+
/** The commit sha the apply produced. */
|
|
63
|
+
commit: string;
|
|
64
|
+
/** The sidecar path (relative to `cwd`) the apply touched. */
|
|
65
|
+
sidecarPath: string;
|
|
66
|
+
}
|
|
67
|
+
/** Raised for usage errors (a torn mode, a missing repo). */
|
|
68
|
+
export declare class ApplyAtomicError extends Error {
|
|
69
|
+
constructor(message: string);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Apply an answer batch ATOMICALLY: rewrite the item body + the sidecar in ONE
|
|
73
|
+
* commit, and on full resolution clear `needsAnswers` AND delete the sidecar in
|
|
74
|
+
* that SAME commit. Returns the produced commit + the outcome.
|
|
75
|
+
*
|
|
76
|
+
* The resolution decision is DERIVED from the model (`allAnswered` ⇒ resolve) —
|
|
77
|
+
* the entries are the source of truth, never the frontmatter mirror. A supplied
|
|
78
|
+
* {@link ApplyAtomicOptions.mode} must AGREE with that derived state, else the
|
|
79
|
+
* apply throws (it refuses to publish a torn invariant: a `resolve` that leaves
|
|
80
|
+
* pending entries, or a `repause` that leaves none).
|
|
81
|
+
*/
|
|
82
|
+
export declare function applyAtomic(options: ApplyAtomicOptions): ApplyAtomicResult;
|
|
83
|
+
//# sourceMappingURL=sidecar-apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecar-apply.d.ts","sourceRoot":"","sources":["../src/sidecar-apply.ts"],"names":[],"mappings":"AAIA,OAAO,EAIN,KAAK,YAAY,EACjB,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IAClC,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,EAAE,YAAY,CAAC;IACtB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,qFAAqF;IACrF,OAAO,EAAE,UAAU,GAAG,UAAU,CAAC;IACjC,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,6DAA6D;AAC7D,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI3B;AAiCD;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CAgE1E"}
|