dorfl 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
package/src/status.ts
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import {discoverJobs, type GcJob} from './gc.js';
|
|
2
|
+
import {resolveHarness, type Harness} from './harness.js';
|
|
3
|
+
// Import for the registration side-effect: ensures the `pi` adapter is in the
|
|
4
|
+
// harness registry so `resolveHarness` dispatches pi jobs' liveness to it.
|
|
5
|
+
import './pi-harness.js';
|
|
6
|
+
import {type JobState} from './workspace.js';
|
|
7
|
+
import {fetchMirrorMainOrWarn} from './repo-mirror.js';
|
|
8
|
+
import {formatArbiterStatus, type ArbiterStatusReport} from './arbiter.js';
|
|
9
|
+
import {listItemLockEntries, type LockEntry} from './item-lock.js';
|
|
10
|
+
import {formatCwdSection, formatLockEntryLines} from './format.js';
|
|
11
|
+
import type {CwdSection} from './cwd-section.js';
|
|
12
|
+
import {
|
|
13
|
+
lintRefLedger,
|
|
14
|
+
formatDuplicateWarnings,
|
|
15
|
+
type DuplicateSlug,
|
|
16
|
+
} from './ledger-lint.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* `dorfl status` — the **operational dashboard of jobs** (ADR §4/§5/§12
|
|
20
|
+
* in `docs/adr/execution-substrate-decisions.md`). Split out of
|
|
21
|
+
* `agent-workspaces` so the substrate stays thin; this module owns the view.
|
|
22
|
+
*
|
|
23
|
+
* It lists the jobs under `<workspacesDir>/work/*` from their
|
|
24
|
+
* `.dorfl-job.json` records + worktree state, grouped by state:
|
|
25
|
+
*
|
|
26
|
+
* - **active** — `running` AND the harness reports the job still alive.
|
|
27
|
+
* - **failed / retained** — everything that wants a human's eye: a job the
|
|
28
|
+
* `needs-attention` mechanism flagged (with its reason, ADR §12), a `done`
|
|
29
|
+
* job whose worktree was never reaped (awaiting cleanup), or a `running`
|
|
30
|
+
* job whose harness reports it DEAD (crashed — the runner died mid-flight).
|
|
31
|
+
*
|
|
32
|
+
* **Liveness comes from the harness seam (PID / session), NOT filesystem mtime**
|
|
33
|
+
* (ADR §5): a live agent can think for minutes without writing files, so mtime
|
|
34
|
+
* would mistake a thinking agent for a dead one. The harness answers liveness
|
|
35
|
+
* from the real signal.
|
|
36
|
+
*
|
|
37
|
+
* **Fetch-first (ADR §5/§6):** the per-mirror lock-ref + one-slug-one-folder
|
|
38
|
+
* lint surfaces are read AFTER refreshing each registered hub mirror's `main` —
|
|
39
|
+
* the old "scan is always offline" framing is RETIRED (it was the roots-local
|
|
40
|
+
* model). A failed mirror fetch is NOT fatal: it WARNS and falls back to that
|
|
41
|
+
* mirror's last-known `main`. The ledger read STRATEGY is unchanged
|
|
42
|
+
* (`claim-ledger-vs-protected-main.md`); `status` only ensures the ref is fresh.
|
|
43
|
+
*
|
|
44
|
+
* It is strictly **read-only**: it inspects records/worktrees; it never claims,
|
|
45
|
+
* runs, moves, or deletes (deletion is `gc`). It reuses the `gc` `discoverJobs`
|
|
46
|
+
* primitive to enumerate jobs (it does NOT re-implement the work-area layout).
|
|
47
|
+
*
|
|
48
|
+
* Distinct from `scan`: `scan` answers "what work is in the *backlog* and who
|
|
49
|
+
* can take it"; `status` answers "what is *running / stuck / awaiting cleanup*
|
|
50
|
+
* right now". The retained-worktree + stuck-lock items are the "look here" set.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/** One job as the operational dashboard sees it (a record + its liveness). */
|
|
54
|
+
export interface JobStatus {
|
|
55
|
+
/** The work slug being processed. */
|
|
56
|
+
slug: string;
|
|
57
|
+
/** The encoded repo key the job's hub mirror was cut from. */
|
|
58
|
+
repo: string;
|
|
59
|
+
/** The work branch checked out in the worktree (`work/<slug>`). */
|
|
60
|
+
branch: string;
|
|
61
|
+
/** ISO timestamp the job worktree was created. */
|
|
62
|
+
startedAt: string;
|
|
63
|
+
/** The persisted lifecycle state. */
|
|
64
|
+
state: JobState;
|
|
65
|
+
/** Liveness FROM THE HARNESS SEAM (PID/session), never mtime (ADR §5). */
|
|
66
|
+
alive: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Why the job is stuck (ADR §12), when known — surfaced for the
|
|
69
|
+
* failed/retained group. Present for `needs-attention` jobs that recorded a
|
|
70
|
+
* reason; absent otherwise.
|
|
71
|
+
*/
|
|
72
|
+
reason?: string;
|
|
73
|
+
/**
|
|
74
|
+
* The review-request URL (e.g. a GitHub PR) opened for this job, when a
|
|
75
|
+
* `propose`-mode provider opened one (ADR §6). Surfaced so the human can jump
|
|
76
|
+
* straight to the PR. Absent otherwise.
|
|
77
|
+
*/
|
|
78
|
+
prUrl?: string;
|
|
79
|
+
/** Absolute path to the job worktree (for the human to look). */
|
|
80
|
+
dir: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* One repo's PER-ITEM LOCK refs, surfaced for the dashboard (prd
|
|
85
|
+
* `ledger-status-per-item-lock-refs` US #8; task
|
|
86
|
+
* `needs-attention-as-stuck-lock-state`). The in-flight view read from the lock
|
|
87
|
+
* refs — held (`active` = in-progress) and stuck (`needs-attention`) entries +
|
|
88
|
+
* their reasons — is the SOLE stuck-state surface (the
|
|
89
|
+
* `work/needs-attention/` folder is retired, task
|
|
90
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`).
|
|
91
|
+
*/
|
|
92
|
+
export interface RepoLockEntries {
|
|
93
|
+
/** The repo path whose lock refs were read (a hub-mirror path). */
|
|
94
|
+
repoPath: string;
|
|
95
|
+
/** The held lock entries (action × state + reason), sorted by entry. */
|
|
96
|
+
entries: LockEntry[];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** One repo's one-slug-one-folder LINT result, surfaced for the dashboard. */
|
|
100
|
+
export interface RepoLedgerDuplicates {
|
|
101
|
+
/** The repo path whose `work/` ledger was linted (a hub-mirror path). */
|
|
102
|
+
repoPath: string;
|
|
103
|
+
/** The slugs present in more than one status folder (non-empty here). */
|
|
104
|
+
duplicates: DuplicateSlug[];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** The operational groups `status` reports. */
|
|
108
|
+
export interface StatusReport {
|
|
109
|
+
/** Running jobs the harness reports still alive. */
|
|
110
|
+
active: JobStatus[];
|
|
111
|
+
/** Stuck (needs-attention), crashed (running-but-dead), or un-reaped (done) jobs. */
|
|
112
|
+
attention: JobStatus[];
|
|
113
|
+
/**
|
|
114
|
+
* The PER-ITEM LOCK in-flight view (prd `ledger-status-per-item-lock-refs` US
|
|
115
|
+
* #8; task `needs-attention-as-stuck-lock-state`): per registered hub mirror,
|
|
116
|
+
* the held lock entries read from the mirror's `refs/dorfl/lock/*` refs —
|
|
117
|
+
* `active` holds (in-progress) and `stuck` holds (needs-attention) + reasons.
|
|
118
|
+
* This is the SOLE stuck-state surface (the `work/needs-attention/` folder is
|
|
119
|
+
* retired, task
|
|
120
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`). Only repos
|
|
121
|
+
* WITH at least one held lock appear. Empty when no `mirrorPaths` were given or
|
|
122
|
+
* no locks are held. Optional so older literals stay valid; `status()` always
|
|
123
|
+
* populates it (possibly empty).
|
|
124
|
+
*/
|
|
125
|
+
lockHeld?: RepoLockEntries[];
|
|
126
|
+
/**
|
|
127
|
+
* The one-slug-one-folder LINT (prd `ledger-integrity` story 3): per registered
|
|
128
|
+
* hub mirror, any slug present in MORE THAN ONE `work/` status folder (a corrupt
|
|
129
|
+
* ledger). Read from the mirror's bare `main` ref (the SAME `ls-tree` source the
|
|
130
|
+
* needs-attention surface uses). Only repos WITH a duplicate appear. `status`
|
|
131
|
+
* WARNS loudly about each (never a silent pass); a human resolves it. Empty when
|
|
132
|
+
* no `mirrorPaths` were given or every ledger is clean.
|
|
133
|
+
*/
|
|
134
|
+
ledgerDuplicates?: RepoLedgerDuplicates[];
|
|
135
|
+
/**
|
|
136
|
+
* The current repo's arbiter state (folded in from the old `arbiter status`,
|
|
137
|
+
* ADR §1/§7): which remote, URL/path, exists/bare, main reachable, and the
|
|
138
|
+
* unsafe non-bare-with-main flag. Present only when the CLI resolved one (it is
|
|
139
|
+
* a current-checkout concern); absent for the pure job-area dashboard.
|
|
140
|
+
*/
|
|
141
|
+
arbiter?: ArbiterStatusReport;
|
|
142
|
+
/**
|
|
143
|
+
* The CWD-LOCAL section (the `scan-status-read-cwd-repo` task): when `status`
|
|
144
|
+
* runs INSIDE a participating repo, this is that CURRENT repo read from its
|
|
145
|
+
* LOCAL WORKING TREE (fetch-its-arbiter-first), reported as a DISTINCT,
|
|
146
|
+
* separately-counted block alongside (never merged into) the registry view.
|
|
147
|
+
* Absent when the cwd does not participate or the caller did not resolve it.
|
|
148
|
+
*/
|
|
149
|
+
cwd?: CwdSection;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface StatusOptions {
|
|
153
|
+
/** The execution working area to inspect (config `workspacesDir`). */
|
|
154
|
+
workspacesDir: string;
|
|
155
|
+
/**
|
|
156
|
+
* The harness used to answer liveness (PID/session — never mtime). When given,
|
|
157
|
+
* it answers liveness for EVERY job (tests inject a stub here). When omitted,
|
|
158
|
+
* each job's liveness is answered by the adapter that OWNS its record
|
|
159
|
+
* (`resolveHarness` keyed off the record's `adapter`) — so a `pi` job reports
|
|
160
|
+
* via the pi adapter (PID + session pointer) and a `null` job via the null
|
|
161
|
+
* adapter, never mtime.
|
|
162
|
+
*/
|
|
163
|
+
harness?: Harness;
|
|
164
|
+
/**
|
|
165
|
+
* Hub-mirror PATHS whose lock refs + one-slug-one-folder lint to surface, read
|
|
166
|
+
* from each mirror's BARE `main` ref (mirrors have no working tree). The CLI
|
|
167
|
+
* wires these from the registry's {@link listMirrors}. `status` FETCHES each
|
|
168
|
+
* mirror's `main` first (ADR §5/§6 — the registry's remote is the source of
|
|
169
|
+
* truth); a failed fetch WARNS and falls back to last-known (never errors).
|
|
170
|
+
* Omitted ⇒ only the job worktrees are reported.
|
|
171
|
+
*/
|
|
172
|
+
mirrorPaths?: string[];
|
|
173
|
+
/**
|
|
174
|
+
* Sink for the fetch-first fall-back warning (ADR §5/§6): when a mirror's `main`
|
|
175
|
+
* cannot be fetched, `status` warns through this and reads that mirror's
|
|
176
|
+
* last-known state. The CLI wires it to the standard `>>` stderr note.
|
|
177
|
+
*/
|
|
178
|
+
warn?: (message: string) => void;
|
|
179
|
+
/**
|
|
180
|
+
* The current repo's arbiter state to fold into the dashboard (the old `arbiter
|
|
181
|
+
* status`, ADR §1). The CLI resolves it via `arbiterStatus` for the current
|
|
182
|
+
* checkout; omitted ⇒ no arbiter section.
|
|
183
|
+
*/
|
|
184
|
+
arbiter?: ArbiterStatusReport;
|
|
185
|
+
/**
|
|
186
|
+
* The pre-resolved CWD-LOCAL section (the `scan-status-read-cwd-repo` task).
|
|
187
|
+
* The CLI resolves it via `resolveCwdSection` (cwd participation + fetch-first
|
|
188
|
+
* divergence + registry de-dup) and hands it here; `status` carries it onto the
|
|
189
|
+
* report and `formatStatus` renders it as a distinct local block. Omitted ⇒ no
|
|
190
|
+
* local section.
|
|
191
|
+
*/
|
|
192
|
+
cwd?: CwdSection;
|
|
193
|
+
env?: NodeJS.ProcessEnv;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Build the operational status of every job under `<workspacesDir>/work/*`
|
|
198
|
+
* (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
|
|
199
|
+
* primitive, asks the harness for liveness (NOT mtime), and groups each job as
|
|
200
|
+
* **active** (running + alive) or **failed/retained** (needs-attention, a
|
|
201
|
+
* crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
|
|
202
|
+
* no claim/run/move/delete.
|
|
203
|
+
*/
|
|
204
|
+
export async function status(options: StatusOptions): Promise<StatusReport> {
|
|
205
|
+
const active: JobStatus[] = [];
|
|
206
|
+
const attention: JobStatus[] = [];
|
|
207
|
+
|
|
208
|
+
for (const job of discoverJobs(options.workspacesDir)) {
|
|
209
|
+
const view = toJobStatus(job, options.harness);
|
|
210
|
+
// Active iff the runner believes the job is in flight (`running`) AND the
|
|
211
|
+
// harness confirms it is still alive. Everything else is "look here":
|
|
212
|
+
// - needs-attention: the runner flagged it (gate red, conflict, …)
|
|
213
|
+
// - done: landed but the worktree wasn't reaped (awaiting cleanup)
|
|
214
|
+
// - running but NOT alive: the process died mid-flight (crashed)
|
|
215
|
+
if (view.state === 'running' && view.alive) {
|
|
216
|
+
active.push(view);
|
|
217
|
+
} else {
|
|
218
|
+
attention.push(view);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
active.sort(bySlug);
|
|
223
|
+
attention.sort(bySlug);
|
|
224
|
+
|
|
225
|
+
// The STUCK-STATE surface is now the PER-ITEM LOCK `state: stuck` (task
|
|
226
|
+
// `cutover-needs-attention-becomes-lock-stuck-recovery-surface`, decision i+:
|
|
227
|
+
// the `needs-attention/` folder is retired — NO code reads
|
|
228
|
+
// `work/needs-attention/`). `status` reads the lock refs per mirror to surface
|
|
229
|
+
// held (`active` = in-progress) AND stuck (`needs-attention`) entries + their
|
|
230
|
+
// reasons/questions.
|
|
231
|
+
const lockHeld: RepoLockEntries[] = [];
|
|
232
|
+
const ledgerDuplicates: RepoLedgerDuplicates[] = [];
|
|
233
|
+
for (const mirrorPath of options.mirrorPaths ?? []) {
|
|
234
|
+
// Fetch-first (ADR §5/§6): refresh this mirror's `main` so the duplicate lint
|
|
235
|
+
// reflects the remote truth. Never fatal — a failed fetch WARNS and falls back
|
|
236
|
+
// to the mirror's last-known `main`.
|
|
237
|
+
fetchMirrorMainOrWarn({mirrorPath, warn: options.warn, env: options.env});
|
|
238
|
+
// The PER-ITEM LOCK in-flight view (prd US #8): read the mirror's lock refs to
|
|
239
|
+
// surface held (`active` = in-progress) and stuck (`needs-attention`) entries +
|
|
240
|
+
// reasons/questions. A bare hub mirror's arbiter is its `origin` (the SAME
|
|
241
|
+
// handle the `scan` held-slug subtraction reads). Best-effort: a fetch/read
|
|
242
|
+
// fault yields an EMPTY list (see {@link listItemLockEntries}), so this
|
|
243
|
+
// read-only view degrades to "no in-flight locks" rather than erroring.
|
|
244
|
+
const entries = await listItemLockEntries(
|
|
245
|
+
mirrorPath,
|
|
246
|
+
'origin',
|
|
247
|
+
options.env,
|
|
248
|
+
);
|
|
249
|
+
if (entries.length > 0) {
|
|
250
|
+
lockHeld.push({repoPath: mirrorPath, entries});
|
|
251
|
+
}
|
|
252
|
+
// The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
|
|
253
|
+
// status folder from the SAME freshly-fetched `main` ref, surfaced LOUDLY.
|
|
254
|
+
const dups = lintRefLedger('main', mirrorPath, options.env);
|
|
255
|
+
if (dups.length > 0) {
|
|
256
|
+
ledgerDuplicates.push({repoPath: mirrorPath, duplicates: dups});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
lockHeld.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
|
|
260
|
+
ledgerDuplicates.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
active,
|
|
264
|
+
attention,
|
|
265
|
+
lockHeld,
|
|
266
|
+
ledgerDuplicates,
|
|
267
|
+
...(options.arbiter ? {arbiter: options.arbiter} : {}),
|
|
268
|
+
...(options.cwd ? {cwd: options.cwd} : {}),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function bySlug(a: JobStatus, b: JobStatus): number {
|
|
273
|
+
return a.slug.localeCompare(b.slug);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Project a discovered job + its harness liveness into a `JobStatus`. When no
|
|
278
|
+
* harness is forced (the normal case), each record's liveness is answered by the
|
|
279
|
+
* adapter that OWNS it (`resolveHarness`) — a pi job via the pi adapter (PID +
|
|
280
|
+
* session), never mtime.
|
|
281
|
+
*/
|
|
282
|
+
function toJobStatus(job: GcJob, forced: Harness | undefined): JobStatus {
|
|
283
|
+
const record = job.record;
|
|
284
|
+
const harness =
|
|
285
|
+
forced ?? (record ? resolveHarness(record.harness) : undefined);
|
|
286
|
+
const alive =
|
|
287
|
+
record !== undefined && harness !== undefined
|
|
288
|
+
? harness.isAlive(record.harness)
|
|
289
|
+
: false;
|
|
290
|
+
return {
|
|
291
|
+
slug: job.slug,
|
|
292
|
+
repo: record?.repoKey ?? '(unknown)',
|
|
293
|
+
branch: job.branch,
|
|
294
|
+
startedAt: record?.startedAt ?? '(unknown)',
|
|
295
|
+
state: record?.state ?? 'running',
|
|
296
|
+
alive,
|
|
297
|
+
reason: record?.reason,
|
|
298
|
+
prUrl: record?.prUrl,
|
|
299
|
+
dir: job.dir,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Render the operational status for the terminal: an **Active jobs** section and
|
|
305
|
+
* a **Failed / retained jobs** section, each line carrying slug, repo, branch,
|
|
306
|
+
* and started-at — plus, for stuck jobs, the recorded reason, and for a
|
|
307
|
+
* running-but-dead job a `(crashed — no longer alive)` marker.
|
|
308
|
+
*
|
|
309
|
+
* Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
|
|
310
|
+
* NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
|
|
311
|
+
*/
|
|
312
|
+
export function formatStatus(report: StatusReport): string {
|
|
313
|
+
const lines: string[] = [];
|
|
314
|
+
|
|
315
|
+
// The cwd-local section (the `scan-status-read-cwd-repo` task): a DISTINCT,
|
|
316
|
+
// separately-counted block for the CURRENT repo's working tree, ABOVE the
|
|
317
|
+
// job/registry dashboard (never merged into the job counts).
|
|
318
|
+
const cwdLines = report.cwd !== undefined ? formatCwdSection(report.cwd) : [];
|
|
319
|
+
|
|
320
|
+
const lockHeld = report.lockHeld ?? [];
|
|
321
|
+
const lockCount = lockHeld.reduce((sum, r) => sum + r.entries.length, 0);
|
|
322
|
+
const ledgerDuplicates = report.ledgerDuplicates ?? [];
|
|
323
|
+
const dupCount = ledgerDuplicates.reduce(
|
|
324
|
+
(sum, r) => sum + r.duplicates.length,
|
|
325
|
+
0,
|
|
326
|
+
);
|
|
327
|
+
if (
|
|
328
|
+
report.active.length === 0 &&
|
|
329
|
+
report.attention.length === 0 &&
|
|
330
|
+
lockCount === 0 &&
|
|
331
|
+
dupCount === 0 &&
|
|
332
|
+
report.arbiter === undefined &&
|
|
333
|
+
cwdLines.length === 0
|
|
334
|
+
) {
|
|
335
|
+
return 'No jobs running or retained (the work area is empty).';
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (cwdLines.length > 0) {
|
|
339
|
+
lines.push(...cwdLines);
|
|
340
|
+
lines.push('');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
lines.push('Active jobs (running):');
|
|
344
|
+
if (report.active.length === 0) {
|
|
345
|
+
lines.push(' (none)');
|
|
346
|
+
} else {
|
|
347
|
+
for (const job of report.active) {
|
|
348
|
+
lines.push(formatJobLine(job));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
lines.push('');
|
|
352
|
+
|
|
353
|
+
lines.push('Failed / retained jobs (look here):');
|
|
354
|
+
if (report.attention.length === 0) {
|
|
355
|
+
lines.push(' (none)');
|
|
356
|
+
} else {
|
|
357
|
+
for (const job of report.attention) {
|
|
358
|
+
lines.push(formatJobLine(job));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// The PER-ITEM LOCK in-flight view (prd US #8; task
|
|
363
|
+
// `cutover-needs-attention-becomes-lock-stuck-recovery-surface`): the held lock
|
|
364
|
+
// refs read from each mirror — `active` holds (in-progress) and `stuck` holds
|
|
365
|
+
// (needs-attention) + their reasons/questions. This is the SOLE stuck-state
|
|
366
|
+
// surface now (the `needs-attention/` folder is retired).
|
|
367
|
+
if (lockCount > 0) {
|
|
368
|
+
lines.push('');
|
|
369
|
+
lines.push('In-flight locks (refs/dorfl/lock/* — held + stuck):');
|
|
370
|
+
for (const repo of lockHeld) {
|
|
371
|
+
lines.push(` ${repo.repoPath}`);
|
|
372
|
+
for (const entry of repo.entries) {
|
|
373
|
+
// SHARED renderer (NOT a forked one) so the cwd section
|
|
374
|
+
// (`formatCwdSection`) presents a held/stuck item identically.
|
|
375
|
+
lines.push(...formatLockEntryLines(entry, ' '));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// The one-slug-one-folder LINT (prd `ledger-integrity` story 3): WARN LOUDLY
|
|
381
|
+
// about every slug residing in >1 status folder of a registered mirror's ledger
|
|
382
|
+
// (a corrupt ledger — never a silent pass). A human must resolve each.
|
|
383
|
+
if (dupCount > 0) {
|
|
384
|
+
lines.push('');
|
|
385
|
+
for (const repo of ledgerDuplicates) {
|
|
386
|
+
lines.push(` ${repo.repoPath}`);
|
|
387
|
+
for (const w of formatDuplicateWarnings(repo.duplicates)) {
|
|
388
|
+
lines.push(` ${w}`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
lines.push('');
|
|
394
|
+
lines.push(
|
|
395
|
+
`Summary: ${report.active.length} active, ${report.attention.length} failed/retained job(s)` +
|
|
396
|
+
(lockCount > 0 ? `, ${lockCount} in-flight lock(s)` : '') +
|
|
397
|
+
(dupCount > 0 ? `, ${dupCount} one-slug-one-folder violation(s)` : '') +
|
|
398
|
+
'.',
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
// The folded-in arbiter state (ADR §1/§7, the old `arbiter status`).
|
|
402
|
+
if (report.arbiter !== undefined) {
|
|
403
|
+
lines.push('');
|
|
404
|
+
lines.push(formatArbiterStatus(report.arbiter));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return lines.join('\n');
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** One `slug repo branch started-at [marker]` job line, with reason below. */
|
|
411
|
+
function formatJobLine(job: JobStatus): string {
|
|
412
|
+
const marker = jobMarker(job);
|
|
413
|
+
const head = ` ${job.slug} ${job.repo} ${job.branch} started ${job.startedAt}${marker}`;
|
|
414
|
+
const extra: string[] = [];
|
|
415
|
+
if (job.reason !== undefined && job.reason !== '') {
|
|
416
|
+
extra.push(` reason: ${job.reason}`);
|
|
417
|
+
}
|
|
418
|
+
if (job.prUrl !== undefined && job.prUrl !== '') {
|
|
419
|
+
extra.push(` PR: ${job.prUrl}`);
|
|
420
|
+
}
|
|
421
|
+
return extra.length > 0 ? [head, ...extra].join('\n') : head;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* A trailing marker that explains WHY a non-active job is in the look-here group:
|
|
426
|
+
* a `running` job the harness reports dead is a **crashed** runner; a `done` job
|
|
427
|
+
* is **awaiting cleanup** (`gc` will reap it); a `needs-attention` job is
|
|
428
|
+
* **stuck** (its reason is rendered separately).
|
|
429
|
+
*/
|
|
430
|
+
function jobMarker(job: JobStatus): string {
|
|
431
|
+
if (job.state === 'running' && !job.alive) {
|
|
432
|
+
return ' (crashed — no longer alive)';
|
|
433
|
+
}
|
|
434
|
+
if (job.state === 'done') {
|
|
435
|
+
return ' (done — awaiting cleanup)';
|
|
436
|
+
}
|
|
437
|
+
if (job.state === 'needs-attention') {
|
|
438
|
+
return ' (needs attention)';
|
|
439
|
+
}
|
|
440
|
+
return '';
|
|
441
|
+
}
|