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,342 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { NullHarness, pidAlive, registerHarness, } from './harness.js';
|
|
4
|
+
import { generateSessionPath } from './session-path.js';
|
|
5
|
+
import { lastAssistantText } from './watch-session.js';
|
|
6
|
+
/**
|
|
7
|
+
* The **pi** harness adapter (ADR §5) — the first real agent harness
|
|
8
|
+
* `dorfl` drives. It fulfils the harness seam introduced by
|
|
9
|
+
* `agent-workspaces` (`./harness.ts`): launch a job's work-agent command in its
|
|
10
|
+
* worktree, and report liveness from **pi-native signals**.
|
|
11
|
+
*
|
|
12
|
+
* Two design commitments from the task + ADR §5, both encoded here:
|
|
13
|
+
*
|
|
14
|
+
* 1. **Invocation** is the standard work-agent prompt (the constant wrapper +
|
|
15
|
+
* the task's `## Prompt`, assembled by `./prompt.ts`) fed to the pi CLI on
|
|
16
|
+
* stdin, running non-interactively (`--print`) inside the job worktree.
|
|
17
|
+
* 2. **Liveness** is reported from the **PID** (process alive?) PLUS a pointer
|
|
18
|
+
* to the pi **session file** (real activity + an audit trail) — explicitly
|
|
19
|
+
* **NOT filesystem mtime**: a live agent can think for minutes without
|
|
20
|
+
* writing any files, so mtime would mistake a thinking agent for a dead one.
|
|
21
|
+
*
|
|
22
|
+
* ## Session location: `--session <full-path>` (task `session-path-pi-default`)
|
|
23
|
+
*
|
|
24
|
+
* The adapter passes a **deterministic FULL session-FILE path** as `--session
|
|
25
|
+
* <path>` (NOT `--session-dir <dir>`). The caller GENERATES that path once
|
|
26
|
+
* (before launch, so `do --watch` can tail the known path) via {@link
|
|
27
|
+
* generateSessionPath} and threads it in as `LaunchInput.session`; when omitted,
|
|
28
|
+
* the adapter generates a default for its own cwd. pi creates+writes the session
|
|
29
|
+
* at exactly that path (it CREATES a non-existent `--session` file) and
|
|
30
|
+
* `--session` takes precedence over `--session-dir` (verified vs pinned pi
|
|
31
|
+
* source). The default lands under pi's per-cwd sessions folder, so the
|
|
32
|
+
* pi-remote dashboard sees the session and the in-place checkout stays clean.
|
|
33
|
+
* The arg is ABSOLUTE and ends `.jsonl` — required, else pi treats it as a
|
|
34
|
+
* session-ID lookup and exits 1 (see {@link generateSessionPath}).
|
|
35
|
+
*
|
|
36
|
+
* pi specifics stay BEHIND this adapter; the core (`run`, `status`, `do`) talks
|
|
37
|
+
* only to the `Harness` interface. Where running real pi in CI is impractical,
|
|
38
|
+
* the pi CLI is stubbed (see `pi-harness.test.ts`) via the injectable `piBin`.
|
|
39
|
+
*
|
|
40
|
+
* ## Seam contract (what an adapter promises the core)
|
|
41
|
+
*
|
|
42
|
+
* - `launch(input)` runs the work-agent command for ONE job in `input.dir`
|
|
43
|
+
* (the worktree), feeding `input.prompt` to the agent. It returns
|
|
44
|
+
* `{ok, record, detail?}`: `ok` iff the agent completed successfully, and a
|
|
45
|
+
* `record` to persist in `.dorfl-job.json` carrying the **liveness
|
|
46
|
+
* anchor** (`pid`) plus the pi `session` FILE path. The core treats the call
|
|
47
|
+
* as blocking (it runs the test gate immediately after).
|
|
48
|
+
* - `isAlive(record)` answers liveness FROM THE RECORD'S ANCHOR (PID/session),
|
|
49
|
+
* never mtime, so a separate `status`/`do` process can re-derive liveness
|
|
50
|
+
* from a fresh process WITHOUT re-launching the agent.
|
|
51
|
+
*/
|
|
52
|
+
/** The default pi CLI binary name (resolved on `PATH`). */
|
|
53
|
+
export const DEFAULT_PI_BIN = 'pi';
|
|
54
|
+
/**
|
|
55
|
+
* The pi adapter. Invocation: `pi [--model <model>] --print --session
|
|
56
|
+
* <full-path>.jsonl [extra]` run in the worktree with the work-agent prompt on
|
|
57
|
+
* stdin. The model is passed NATIVELY as `--model <model>` when set (ADR §13 —
|
|
58
|
+
* the routing intent dorfl controls); auth/keys stay pi's job, never
|
|
59
|
+
* dorfl's. Liveness: the PID is the authoritative "is it running?"
|
|
60
|
+
* signal; the recorded `session` file is the activity + audit pointer surfaced
|
|
61
|
+
* alongside it. NEVER mtime (ADR §5).
|
|
62
|
+
*/
|
|
63
|
+
export class PiHarness {
|
|
64
|
+
adapter = 'pi';
|
|
65
|
+
piBin;
|
|
66
|
+
extraArgs;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
this.piBin = options.piBin ?? DEFAULT_PI_BIN;
|
|
69
|
+
this.extraArgs = options.extraArgs ?? [];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve the full session-FILE path for a launch. The CALLER normally
|
|
73
|
+
* generates this (via {@link generateSessionPath}) and passes it in
|
|
74
|
+
* `input.session` so the watcher knows it BEFORE launch; when omitted (e.g. a
|
|
75
|
+
* direct adapter call), generate a default under pi's per-cwd folder from the
|
|
76
|
+
* launch dir. Either way the result is absolute and ends `.jsonl`.
|
|
77
|
+
*/
|
|
78
|
+
resolveSessionFile(input) {
|
|
79
|
+
return (input.session ?? generateSessionPath({ cwd: input.dir, id: input.slug }));
|
|
80
|
+
}
|
|
81
|
+
/** Build the pi argv: `[--model m] [extra] --print --session <file>`. */
|
|
82
|
+
buildArgs(input, sessionFile) {
|
|
83
|
+
// The model ROUTING intent (ADR §13): when set, pass it NATIVELY as
|
|
84
|
+
// `--model <model>`. dorfl only chooses the model; pi owns auth/keys.
|
|
85
|
+
const modelArgs = input.model !== undefined && input.model !== ''
|
|
86
|
+
? ['--model', input.model]
|
|
87
|
+
: [];
|
|
88
|
+
// Non-interactive (`--print`): pi processes the prompt and exits. We pass
|
|
89
|
+
// the FULL session FILE path (`--session`, never `--session-dir`): pi
|
|
90
|
+
// creates+writes it there, it is visible to the dashboard, and nothing
|
|
91
|
+
// lands in the checkout. The operator's `extraArgs` still layer on.
|
|
92
|
+
return [
|
|
93
|
+
...modelArgs,
|
|
94
|
+
...this.extraArgs,
|
|
95
|
+
'--print',
|
|
96
|
+
'--session',
|
|
97
|
+
sessionFile,
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
launch(input) {
|
|
101
|
+
const sessionFile = this.resolveSessionFile(input);
|
|
102
|
+
const args = this.buildArgs(input, sessionFile);
|
|
103
|
+
const result = spawnSync(this.piBin, args, {
|
|
104
|
+
// Spawn pi with cwd = the repo/worktree dir so the NEW session's header
|
|
105
|
+
// `cwd` groups it correctly in the dashboard (invariant #3) — the folder
|
|
106
|
+
// does NOT imply the repo.
|
|
107
|
+
cwd: input.dir,
|
|
108
|
+
encoding: 'utf8',
|
|
109
|
+
input: input.prompt,
|
|
110
|
+
env: input.env ?? process.env,
|
|
111
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
112
|
+
});
|
|
113
|
+
if (result.error) {
|
|
114
|
+
throw new Error(`failed to spawn pi (${this.piBin}): ${result.error.message}`);
|
|
115
|
+
}
|
|
116
|
+
// Record the pi child's PID (the liveness anchor) + the exact session FILE
|
|
117
|
+
// path pi used (the pi-native activity + audit trail). Liveness later reads
|
|
118
|
+
// these — NOT a filesystem mtime (ADR §5).
|
|
119
|
+
const record = {
|
|
120
|
+
adapter: 'pi',
|
|
121
|
+
pid: result.pid,
|
|
122
|
+
command: [this.piBin, ...args].join(' '),
|
|
123
|
+
session: sessionFile,
|
|
124
|
+
};
|
|
125
|
+
const status = result.status ?? -1;
|
|
126
|
+
return {
|
|
127
|
+
ok: status === 0,
|
|
128
|
+
record,
|
|
129
|
+
detail: status === 0 ? undefined : (result.stderr ?? '').trim(),
|
|
130
|
+
// The agent's ANSWER (task `harness-agent-output`): the LAST assistant
|
|
131
|
+
// turn's text read from the session `.jsonl` pi just wrote — NOT piped
|
|
132
|
+
// stdout (which is drained). Shares `watch-session.ts`'s reader.
|
|
133
|
+
output: readLastAssistantText(sessionFile),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* The ASYNC twin of {@link launch} — IDENTICAL semantics (same `--print
|
|
138
|
+
* --session <file>` invocation, same prompt on stdin, output still CAPTURED,
|
|
139
|
+
* same `LaunchResult` shape: PID anchor + session pointer + ok/detail), but
|
|
140
|
+
* launched NON-BLOCKING with `spawn` instead of the synchronous `spawnSync`.
|
|
141
|
+
* This is the one structural carve-out the `do --watch` observer needs (task
|
|
142
|
+
* `do-watch`): `spawnSync` blocks the event loop until pi exits, so NOTHING
|
|
143
|
+
* could tail the growing session `.jsonl` concurrently. `launchAsync` runs pi
|
|
144
|
+
* alongside the tailer; the WHOLE launch delta is `spawnSync` → `spawn`. The
|
|
145
|
+
* prompt is still fed on stdin and stdout/stderr are still captured; we read
|
|
146
|
+
* the `.jsonl` LOG, never piped stdout.
|
|
147
|
+
*
|
|
148
|
+
* ## Resolve on `exit`, NOT `close` (runner-hang fix)
|
|
149
|
+
*
|
|
150
|
+
* The promise resolves on the child's **`exit`** event (pi itself terminated),
|
|
151
|
+
* NOT `close`. `close` fires only once EVERY stdio pipe of the child is closed
|
|
152
|
+
* — which includes pipes INHERITED by any grandchild pi spawned (an MCP server,
|
|
153
|
+
* a model proxy, a subshell). If such a grandchild OUTLIVES pi holding the
|
|
154
|
+
* inherited stdout/stderr write end, `close` never fires and this promise never
|
|
155
|
+
* resolves — the `advance --watch` surface/triage/apply leg then finishes its
|
|
156
|
+
* work but its awaited launch hangs forever, burning a CI runner (and one of the
|
|
157
|
+
* `max-parallel` slots) until cancelled. `exit` fires the instant pi exits, so
|
|
158
|
+
* we key completion off pi's OWN death, not its descendants'. We still read the
|
|
159
|
+
* agent's answer from the `.jsonl` (final once pi exited, independent of
|
|
160
|
+
* stdout), then DESTROY our end of the stdio pipes so a leaked grandchild's
|
|
161
|
+
* inherited FDs release what they can. A lingering grandchild may still hold an
|
|
162
|
+
* OS pipe end open (keeping the event loop non-empty); the CLI verbs that call
|
|
163
|
+
* this path `process.exit(code)` after the awaited result, which is the
|
|
164
|
+
* belt-and-suspenders backstop bounding any such residual leak.
|
|
165
|
+
*/
|
|
166
|
+
launchAsync(input) {
|
|
167
|
+
const sessionFile = this.resolveSessionFile(input);
|
|
168
|
+
const args = this.buildArgs(input, sessionFile);
|
|
169
|
+
const record = {
|
|
170
|
+
adapter: 'pi',
|
|
171
|
+
command: [this.piBin, ...args].join(' '),
|
|
172
|
+
session: sessionFile,
|
|
173
|
+
};
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
const child = spawn(this.piBin, args, {
|
|
176
|
+
// Same as `launch`: spawn in the repo/worktree dir so the session
|
|
177
|
+
// header `cwd` groups the dashboard correctly (invariant #3).
|
|
178
|
+
cwd: input.dir,
|
|
179
|
+
env: input.env ?? process.env,
|
|
180
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
181
|
+
});
|
|
182
|
+
record.pid = child.pid; // the liveness anchor, recorded like spawnSync.
|
|
183
|
+
let stderr = '';
|
|
184
|
+
child.stderr?.on('data', (chunk) => {
|
|
185
|
+
stderr += chunk.toString('utf8');
|
|
186
|
+
});
|
|
187
|
+
// Output is CAPTURED (not piped through) — `--watch` reads the .jsonl log,
|
|
188
|
+
// not stdout. We drain stdout so the pipe never fills and stalls pi.
|
|
189
|
+
child.stdout?.on('data', () => { });
|
|
190
|
+
// Guard so `exit` and a late `error` never double-settle the promise.
|
|
191
|
+
let settled = false;
|
|
192
|
+
child.on('error', (err) => {
|
|
193
|
+
if (settled) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
settled = true;
|
|
197
|
+
reject(new Error(`failed to spawn pi (${this.piBin}): ${err.message}`));
|
|
198
|
+
});
|
|
199
|
+
// Resolve on `exit` (pi itself terminated), NOT `close`: `close` waits for
|
|
200
|
+
// EVERY child stdio pipe to close, including any INHERITED by a grandchild
|
|
201
|
+
// pi spawned that outlives it — which would hang this promise forever (see
|
|
202
|
+
// the doc-comment above). Then destroy our stdio ends to release the pipes.
|
|
203
|
+
child.on('exit', (code) => {
|
|
204
|
+
if (settled) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
settled = true;
|
|
208
|
+
// Release our end of the stdio pipes so a leaked grandchild's inherited
|
|
209
|
+
// FDs stop keeping our streams referenced; `unref` the child handle too.
|
|
210
|
+
child.stdout?.destroy();
|
|
211
|
+
child.stderr?.destroy();
|
|
212
|
+
child.stdin?.destroy();
|
|
213
|
+
child.unref?.();
|
|
214
|
+
const status = code ?? -1;
|
|
215
|
+
resolve({
|
|
216
|
+
ok: status === 0,
|
|
217
|
+
record,
|
|
218
|
+
detail: status === 0 ? undefined : stderr.trim(),
|
|
219
|
+
// Read the agent's ANSWER from the `.jsonl` at `exit` — the same
|
|
220
|
+
// last-assistant-text read `launch` does at return (task
|
|
221
|
+
// `harness-agent-output`); the process has exited so the log is final.
|
|
222
|
+
output: readLastAssistantText(sessionFile),
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
// Feed the same prepared prompt on stdin, then close it (pi reads to EOF).
|
|
226
|
+
if (input.prompt !== undefined) {
|
|
227
|
+
child.stdin?.write(input.prompt);
|
|
228
|
+
}
|
|
229
|
+
child.stdin?.end();
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Launch pi INTERACTIVELY (task `agent-interactive-launch`, decision #2): a
|
|
234
|
+
* FOREGROUND human session in `input.dir`. The whole delta from {@link launch}
|
|
235
|
+
* is the stdio contract:
|
|
236
|
+
*
|
|
237
|
+
* - **NO `--print`** — a real interactive session the human types into (the
|
|
238
|
+
* autonomous form is `pi --print …`, prompt on stdin, captured).
|
|
239
|
+
* - **`stdio: 'inherit'`** — the human's terminal IS pi's terminal (foreground).
|
|
240
|
+
* - **NO piped prompt** — the human drives; nothing is fed on stdin.
|
|
241
|
+
* - **`--model <model>`** still flows in when set (ADR §13: the resolved
|
|
242
|
+
* routing pins the human's starting model; they may switch inside pi).
|
|
243
|
+
* - **`--session <path>`** is STILL passed so the human session is recorded /
|
|
244
|
+
* dashboard-visible (audit trail), exactly as the autonomous path records it.
|
|
245
|
+
*
|
|
246
|
+
* It BLOCKS in the foreground until the human exits (`spawnSync` + inherited
|
|
247
|
+
* stdio), then returns their exit code. It is NOT a tracked job (decision #3):
|
|
248
|
+
* no `.dorfl-job.json`, no PID/liveness record, no gate — there is
|
|
249
|
+
* nothing to capture, so it returns only the exit code.
|
|
250
|
+
*/
|
|
251
|
+
launchInteractive(input) {
|
|
252
|
+
const sessionFile = this.resolveSessionFile({
|
|
253
|
+
dir: input.dir,
|
|
254
|
+
slug: input.slug,
|
|
255
|
+
command: '',
|
|
256
|
+
session: input.session,
|
|
257
|
+
});
|
|
258
|
+
// The model ROUTING intent (ADR §13): when set, pass it NATIVELY as
|
|
259
|
+
// `--model <model>`. dorfl only chooses the model; pi owns auth/keys.
|
|
260
|
+
const modelArgs = input.model !== undefined && input.model !== ''
|
|
261
|
+
? ['--model', input.model]
|
|
262
|
+
: [];
|
|
263
|
+
// NO `--print` (a real foreground session), but STILL `--session <path>` so
|
|
264
|
+
// the human session is recorded + dashboard-visible. The operator's
|
|
265
|
+
// `extraArgs` still layer on.
|
|
266
|
+
const args = [...modelArgs, ...this.extraArgs, '--session', sessionFile];
|
|
267
|
+
const result = spawnSync(this.piBin, args, {
|
|
268
|
+
// Run in the onboarded working tree so the session header `cwd` groups it
|
|
269
|
+
// correctly in the dashboard (invariant #3) and the human starts there.
|
|
270
|
+
cwd: input.dir,
|
|
271
|
+
// INHERIT the human's stdio: their terminal IS pi's terminal (foreground,
|
|
272
|
+
// interactive) — the opposite of the captured autonomous launch.
|
|
273
|
+
stdio: 'inherit',
|
|
274
|
+
env: input.env ?? process.env,
|
|
275
|
+
});
|
|
276
|
+
if (result.error) {
|
|
277
|
+
throw new Error(`failed to spawn pi (${this.piBin}): ${result.error.message}`);
|
|
278
|
+
}
|
|
279
|
+
return { exitCode: result.status ?? -1 };
|
|
280
|
+
}
|
|
281
|
+
isAlive(record) {
|
|
282
|
+
return pidAlive(record.pid);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The recorded pi session-FILE pointer for a job — the pi-native activity +
|
|
286
|
+
* audit trail surfaced alongside PID liveness. `undefined` when the record has
|
|
287
|
+
* no session pointer (e.g. a non-pi or legacy record). Existence on disk is
|
|
288
|
+
* reported separately so callers can distinguish "recorded but gone" from
|
|
289
|
+
* "never recorded".
|
|
290
|
+
*/
|
|
291
|
+
sessionPointer(record) {
|
|
292
|
+
return record.session;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Does a job record carry a live pi session file on disk? Combines the recorded
|
|
297
|
+
* pointer with an `existsSync` check. This is the pi-native "is there an audit
|
|
298
|
+
* trail to look at?" signal — distinct from PID liveness, and STILL not mtime
|
|
299
|
+
* (we check existence, never modification time).
|
|
300
|
+
*/
|
|
301
|
+
export function piSessionExists(record) {
|
|
302
|
+
return record.session !== undefined && existsSync(record.session);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Read the LAST assistant message's text from the pi session `.jsonl` at
|
|
306
|
+
* `sessionFile` — the agent's final ANSWER, surfaced as `LaunchResult.output`
|
|
307
|
+
* (task `harness-agent-output`). Called by BOTH `launch` (at return) and
|
|
308
|
+
* `launchAsync` (at `close`), AFTER pi has exited so the log is complete.
|
|
309
|
+
*
|
|
310
|
+
* It REUSES `watch-session.ts`'s {@link lastAssistantText} (one `.jsonl` parser,
|
|
311
|
+
* not two). An absent file (pi never wrote it) yields `undefined`, as does a log
|
|
312
|
+
* with no assistant text — a read error is never thrown back into the launch.
|
|
313
|
+
*/
|
|
314
|
+
function readLastAssistantText(sessionFile) {
|
|
315
|
+
let jsonl;
|
|
316
|
+
try {
|
|
317
|
+
jsonl = readFileSync(sessionFile, 'utf8');
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return undefined; // no session log on disk — no answer to surface.
|
|
321
|
+
}
|
|
322
|
+
return lastAssistantText(jsonl);
|
|
323
|
+
}
|
|
324
|
+
// Register the pi adapter so `status`/`do`/`gc` resolve liveness for `pi` jobs
|
|
325
|
+
// to THIS adapter (PID + session pointer) rather than the null fallback. A
|
|
326
|
+
// default-configured instance is sufficient for liveness (the binary/extra args
|
|
327
|
+
// only matter for `launch`, which the core does via an explicit instance).
|
|
328
|
+
registerHarness(new PiHarness());
|
|
329
|
+
/**
|
|
330
|
+
* Build the harness that LAUNCHES jobs for a run, from config (ADR §5): `pi`
|
|
331
|
+
* ⇒ the pi adapter (invoking `config.piBin`); anything else ⇒ the null adapter
|
|
332
|
+
* (shelling out to `agentCmd`). This is the single place the core turns the
|
|
333
|
+
* declared `harness` selector into a concrete adapter, keeping pi specifics
|
|
334
|
+
* behind the seam.
|
|
335
|
+
*/
|
|
336
|
+
export function createHarness(options) {
|
|
337
|
+
if (options.harness === 'pi') {
|
|
338
|
+
return new PiHarness({ piBin: options.piBin });
|
|
339
|
+
}
|
|
340
|
+
return new NullHarness();
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=pi-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-harness.js","sourceRoot":"","sources":["../src/pi-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **The shared STAGING/POOL placement resolver** (prd
|
|
3
|
+
* `staging-pool-position-gate-and-trust-model`, task
|
|
4
|
+
* `runner-deterministic-slice-placement-policy-and-precedence`, governing ADR
|
|
5
|
+
* `placement-is-runner-deterministic-humanonly-is-agent-judgement`).
|
|
6
|
+
*
|
|
7
|
+
* Pure function from UNFORGEABLE inputs to a staging-vs-pool destination:
|
|
8
|
+
*
|
|
9
|
+
* explicit operator flag > untrusted-origin forces STAGING >
|
|
10
|
+
* configured default > built-in
|
|
11
|
+
*
|
|
12
|
+
* It is the POSITIONAL twin of the untrusted-origin BUILD-propose rule in
|
|
13
|
+
* `integration-core.ts` (which decides MODE: `propose` vs `merge`): the same
|
|
14
|
+
* `originTrust:` stamp + the same "explicit operator override beats the trust
|
|
15
|
+
* force" shape, reused here to decide POSITION (which folder the runner lands
|
|
16
|
+
* the emitted ledger files in). The agent cannot influence either — both
|
|
17
|
+
* resolve runner-side from the stamped frontmatter + the resolved policy + the
|
|
18
|
+
* operator's explicit flag.
|
|
19
|
+
*
|
|
20
|
+
* LIFECYCLE-GENERIC. The folder names + the configured-default value are
|
|
21
|
+
* PARAMETERS (`slots`, `configuredDefault`), so the same resolver serves the
|
|
22
|
+
* TASK lifecycle (`tasksLandIn`: `pre-backlog`/`ready` — the POOL value was
|
|
23
|
+
* renamed `'backlog'` → `'todo'` → `'ready'`, ADR
|
|
24
|
+
* `rename-task-pool-folder-todo-to-ready`) AND the SPEC-
|
|
25
|
+
* placement lifecycle (`specsLandIn`: `pre-proposed`/`ready`) without forking. A future
|
|
26
|
+
* lifecycle (e.g. intake's lone-task) plugs its own `slots` in and reuses the
|
|
27
|
+
* exact precedence — no second implementation.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Which side of the staging/pool split the runner chose. The CALLER maps this
|
|
31
|
+
* onto the lifecycle's concrete folder name via {@link PlacementSlots}.
|
|
32
|
+
*
|
|
33
|
+
* - `'staging'` — land in the staging area (tasks: `pre-backlog/`; prds:
|
|
34
|
+
* `prds/proposed/`). Not in the agent pool; a human/runner promotion is needed to make
|
|
35
|
+
* the item eligible. Review-without-PR review surface.
|
|
36
|
+
* - `'pool'` — land directly in the agent-eligible pool (tasks: `tasks/ready/`;
|
|
37
|
+
* prds: `prds/ready/`). The trusted-fast-path landing.
|
|
38
|
+
*/
|
|
39
|
+
export type PlacementSide = 'staging' | 'pool';
|
|
40
|
+
/**
|
|
41
|
+
* The two folder names a lifecycle uses for its staging/pool split. Supplied by
|
|
42
|
+
* the caller so this resolver stays lifecycle-generic (the TASK caller passes
|
|
43
|
+
* `{staging: 'pre-backlog', pool: 'tasks/ready'}`; the PRD-placement caller passes
|
|
44
|
+
* `{staging: 'prds/proposed', pool: 'prds/ready'}`).
|
|
45
|
+
*/
|
|
46
|
+
export interface PlacementSlots {
|
|
47
|
+
staging: string;
|
|
48
|
+
pool: string;
|
|
49
|
+
}
|
|
50
|
+
/** Inputs to {@link resolvePlacement}, in the precedence chain's order. */
|
|
51
|
+
export interface ResolvePlacementInput {
|
|
52
|
+
/**
|
|
53
|
+
* The operator's EXPLICIT override (the TOP of the chain) — when set, it
|
|
54
|
+
* wins over the untrusted-origin force AND the configured default. Mirrors
|
|
55
|
+
* `integration-core.ts`'s `explicitMerge` "operator is present; CLI always
|
|
56
|
+
* wins, no special force-key" shape (the untrusted-origin trust signal
|
|
57
|
+
* gates pool entry, not the mode in this case). Unset (`undefined`) ⇒ this
|
|
58
|
+
* rung is skipped and the next one applies.
|
|
59
|
+
*/
|
|
60
|
+
explicit?: PlacementSide;
|
|
61
|
+
/**
|
|
62
|
+
* The source's stamped `originTrust:` frontmatter (`trusted` | `untrusted` |
|
|
63
|
+
* absent ⇒ trusted by default). When `untrusted`, the resolver FORCES
|
|
64
|
+
* `staging` even on a "land in pool" repo — the positional analogue of the
|
|
65
|
+
* existing `untrusted-origin-forces-build-propose` rule. Unset / `trusted`
|
|
66
|
+
* ⇒ this rung is skipped (zero behaviour change for the normal path).
|
|
67
|
+
*/
|
|
68
|
+
originTrust?: 'trusted' | 'untrusted';
|
|
69
|
+
/**
|
|
70
|
+
* The repo's resolved configured DEFAULT landing (`tasksLandIn` /
|
|
71
|
+
* `specsLandIn`). Caller resolves it like the existing `taskingIntegration`
|
|
72
|
+
* (flag > env > per-repo > global > built-in) and passes the result; this
|
|
73
|
+
* resolver just consumes it.
|
|
74
|
+
*/
|
|
75
|
+
configuredDefault?: PlacementSide;
|
|
76
|
+
}
|
|
77
|
+
/** The resolved choice + which precedence rung won (for honest reporting). */
|
|
78
|
+
export interface PlacementResult {
|
|
79
|
+
choice: PlacementSide;
|
|
80
|
+
reason: 'explicit' | 'untrusted-origin' | 'configured-default' | 'built-in';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve the staging-vs-pool placement from unforgeable inputs, via the fixed
|
|
84
|
+
* precedence chain:
|
|
85
|
+
*
|
|
86
|
+
* explicit > untrusted-origin ⇒ staging > configured default > built-in
|
|
87
|
+
*
|
|
88
|
+
* Pure: no I/O, no env reads — the caller resolves config + reads the
|
|
89
|
+
* frontmatter and passes both in. Reused by every lifecycle (task + prd
|
|
90
|
+
* placement + future intake variants) so a precedence change touches ONE place.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolvePlacement(input: ResolvePlacementInput): PlacementResult;
|
|
93
|
+
/**
|
|
94
|
+
* Map a resolved {@link PlacementSide} onto the lifecycle's concrete folder
|
|
95
|
+
* name. The caller passes its lifecycle slots; this is sugar so the call site
|
|
96
|
+
* does not re-`if`-ladder the side ↔ folder mapping.
|
|
97
|
+
*/
|
|
98
|
+
export declare function placementFolder(slots: PlacementSlots, choice: PlacementSide): string;
|
|
99
|
+
//# sourceMappingURL=placement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACtC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,aAAa,CAAC;CAClC;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,UAAU,CAAC;CAC5E;AAWD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,qBAAqB,GAC1B,eAAe,CAWjB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,GACnB,MAAM,CAER"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **The shared STAGING/POOL placement resolver** (prd
|
|
3
|
+
* `staging-pool-position-gate-and-trust-model`, task
|
|
4
|
+
* `runner-deterministic-slice-placement-policy-and-precedence`, governing ADR
|
|
5
|
+
* `placement-is-runner-deterministic-humanonly-is-agent-judgement`).
|
|
6
|
+
*
|
|
7
|
+
* Pure function from UNFORGEABLE inputs to a staging-vs-pool destination:
|
|
8
|
+
*
|
|
9
|
+
* explicit operator flag > untrusted-origin forces STAGING >
|
|
10
|
+
* configured default > built-in
|
|
11
|
+
*
|
|
12
|
+
* It is the POSITIONAL twin of the untrusted-origin BUILD-propose rule in
|
|
13
|
+
* `integration-core.ts` (which decides MODE: `propose` vs `merge`): the same
|
|
14
|
+
* `originTrust:` stamp + the same "explicit operator override beats the trust
|
|
15
|
+
* force" shape, reused here to decide POSITION (which folder the runner lands
|
|
16
|
+
* the emitted ledger files in). The agent cannot influence either — both
|
|
17
|
+
* resolve runner-side from the stamped frontmatter + the resolved policy + the
|
|
18
|
+
* operator's explicit flag.
|
|
19
|
+
*
|
|
20
|
+
* LIFECYCLE-GENERIC. The folder names + the configured-default value are
|
|
21
|
+
* PARAMETERS (`slots`, `configuredDefault`), so the same resolver serves the
|
|
22
|
+
* TASK lifecycle (`tasksLandIn`: `pre-backlog`/`ready` — the POOL value was
|
|
23
|
+
* renamed `'backlog'` → `'todo'` → `'ready'`, ADR
|
|
24
|
+
* `rename-task-pool-folder-todo-to-ready`) AND the SPEC-
|
|
25
|
+
* placement lifecycle (`specsLandIn`: `pre-proposed`/`ready`) without forking. A future
|
|
26
|
+
* lifecycle (e.g. intake's lone-task) plugs its own `slots` in and reuses the
|
|
27
|
+
* exact precedence — no second implementation.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The BUILT-IN floor (the LOWEST rung): land in STAGING. Conservative — a new
|
|
31
|
+
* lifecycle that has not configured a landing yet stays gated by a human/runner
|
|
32
|
+
* promotion, never silently auto-eligible. The tracer task
|
|
33
|
+
* `pre-backlog-staging-folder-and-promote-step-a` also lands staged, so this
|
|
34
|
+
* preserves zero behaviour change for repos that do not opt into a default.
|
|
35
|
+
*/
|
|
36
|
+
const BUILT_IN_FLOOR = 'staging';
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the staging-vs-pool placement from unforgeable inputs, via the fixed
|
|
39
|
+
* precedence chain:
|
|
40
|
+
*
|
|
41
|
+
* explicit > untrusted-origin ⇒ staging > configured default > built-in
|
|
42
|
+
*
|
|
43
|
+
* Pure: no I/O, no env reads — the caller resolves config + reads the
|
|
44
|
+
* frontmatter and passes both in. Reused by every lifecycle (task + prd
|
|
45
|
+
* placement + future intake variants) so a precedence change touches ONE place.
|
|
46
|
+
*/
|
|
47
|
+
export function resolvePlacement(input) {
|
|
48
|
+
if (input.explicit !== undefined) {
|
|
49
|
+
return { choice: input.explicit, reason: 'explicit' };
|
|
50
|
+
}
|
|
51
|
+
if (input.originTrust === 'untrusted') {
|
|
52
|
+
return { choice: 'staging', reason: 'untrusted-origin' };
|
|
53
|
+
}
|
|
54
|
+
if (input.configuredDefault !== undefined) {
|
|
55
|
+
return { choice: input.configuredDefault, reason: 'configured-default' };
|
|
56
|
+
}
|
|
57
|
+
return { choice: BUILT_IN_FLOOR, reason: 'built-in' };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Map a resolved {@link PlacementSide} onto the lifecycle's concrete folder
|
|
61
|
+
* name. The caller passes its lifecycle slots; this is sugar so the call site
|
|
62
|
+
* does not re-`if`-ladder the side ↔ folder mapping.
|
|
63
|
+
*/
|
|
64
|
+
export function placementFolder(slots, choice) {
|
|
65
|
+
return choice === 'staging' ? slots.staging : slots.pool;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placement.js","sourceRoot":"","sources":["../src/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA2DH;;;;;;GAMG;AACH,MAAM,cAAc,GAAkB,SAAS,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC/B,KAA4B;IAE5B,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC9B,KAAqB,EACrB,MAAqB;IAErB,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;AAC1D,CAAC"}
|