dorfl 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advance-ci-template.d.ts +73 -0
- package/dist/advance-ci-template.d.ts.map +1 -0
- package/dist/advance-ci-template.js +104 -0
- package/dist/advance-ci-template.js.map +1 -0
- package/dist/advance-classify.d.ts +132 -0
- package/dist/advance-classify.d.ts.map +1 -0
- package/dist/advance-classify.js +120 -0
- package/dist/advance-classify.js.map +1 -0
- package/dist/advance-drivers.d.ts +182 -0
- package/dist/advance-drivers.d.ts.map +1 -0
- package/dist/advance-drivers.js +231 -0
- package/dist/advance-drivers.js.map +1 -0
- package/dist/advance-isolated.d.ts +156 -0
- package/dist/advance-isolated.d.ts.map +1 -0
- package/dist/advance-isolated.js +256 -0
- package/dist/advance-isolated.js.map +1 -0
- package/dist/advance-lifecycle-template.d.ts +107 -0
- package/dist/advance-lifecycle-template.d.ts.map +1 -0
- package/dist/advance-lifecycle-template.js +668 -0
- package/dist/advance-lifecycle-template.js.map +1 -0
- package/dist/advance-loop-driver.d.ts +325 -0
- package/dist/advance-loop-driver.d.ts.map +1 -0
- package/dist/advance-loop-driver.js +437 -0
- package/dist/advance-loop-driver.js.map +1 -0
- package/dist/advance-treeless-publish.d.ts +108 -0
- package/dist/advance-treeless-publish.d.ts.map +1 -0
- package/dist/advance-treeless-publish.js +71 -0
- package/dist/advance-treeless-publish.js.map +1 -0
- package/dist/advance.d.ts +340 -0
- package/dist/advance.d.ts.map +1 -0
- package/dist/advance.js +1122 -0
- package/dist/advance.js.map +1 -0
- package/dist/advancing-lock.d.ts +294 -0
- package/dist/advancing-lock.d.ts.map +1 -0
- package/dist/advancing-lock.js +594 -0
- package/dist/advancing-lock.js.map +1 -0
- package/dist/agent-launch.d.ts +79 -0
- package/dist/agent-launch.d.ts.map +1 -0
- package/dist/agent-launch.js +61 -0
- package/dist/agent-launch.js.map +1 -0
- package/dist/agent-stop.d.ts +149 -0
- package/dist/agent-stop.d.ts.map +1 -0
- package/dist/agent-stop.js +307 -0
- package/dist/agent-stop.js.map +1 -0
- package/dist/apply-decide.d.ts +127 -0
- package/dist/apply-decide.d.ts.map +1 -0
- package/dist/apply-decide.js +176 -0
- package/dist/apply-decide.js.map +1 -0
- package/dist/apply-merge-action.d.ts +206 -0
- package/dist/apply-merge-action.d.ts.map +1 -0
- package/dist/apply-merge-action.js +307 -0
- package/dist/apply-merge-action.js.map +1 -0
- package/dist/apply-persist.d.ts +174 -0
- package/dist/apply-persist.d.ts.map +1 -0
- package/dist/apply-persist.js +359 -0
- package/dist/apply-persist.js.map +1 -0
- package/dist/arbiter.d.ts +120 -0
- package/dist/arbiter.d.ts.map +1 -0
- package/dist/arbiter.js +255 -0
- package/dist/arbiter.js.map +1 -0
- package/dist/brand.d.ts +70 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +84 -0
- package/dist/brand.js.map +1 -0
- package/dist/buildable-body.d.ts +132 -0
- package/dist/buildable-body.d.ts.map +1 -0
- package/dist/buildable-body.js +131 -0
- package/dist/buildable-body.js.map +1 -0
- package/dist/categorise.d.ts +66 -0
- package/dist/categorise.d.ts.map +1 -0
- package/dist/categorise.js +106 -0
- package/dist/categorise.js.map +1 -0
- package/dist/claim-cas.d.ts +117 -0
- package/dist/claim-cas.d.ts.map +1 -0
- package/dist/claim-cas.js +312 -0
- package/dist/claim-cas.js.map +1 -0
- package/dist/cli-spinner.d.ts +112 -0
- package/dist/cli-spinner.d.ts.map +1 -0
- package/dist/cli-spinner.js +157 -0
- package/dist/cli-spinner.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3094 -0
- package/dist/cli.js.map +1 -0
- package/dist/close-job-template.d.ts +70 -0
- package/dist/close-job-template.d.ts.map +1 -0
- package/dist/close-job-template.js +180 -0
- package/dist/close-job-template.js.map +1 -0
- package/dist/close-job.d.ts +95 -0
- package/dist/close-job.d.ts.map +1 -0
- package/dist/close-job.js +226 -0
- package/dist/close-job.js.map +1 -0
- package/dist/complete.d.ts +361 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +885 -0
- package/dist/complete.js.map +1 -0
- package/dist/concurrency.d.ts +68 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +112 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config-override.d.ts +76 -0
- package/dist/config-override.d.ts.map +1 -0
- package/dist/config-override.js +50 -0
- package/dist/config-override.js.map +1 -0
- package/dist/config.d.ts +668 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +241 -0
- package/dist/config.js.map +1 -0
- package/dist/continue-branch.d.ts +249 -0
- package/dist/continue-branch.d.ts.map +1 -0
- package/dist/continue-branch.js +389 -0
- package/dist/continue-branch.js.map +1 -0
- package/dist/cwd-section.d.ts +186 -0
- package/dist/cwd-section.d.ts.map +1 -0
- package/dist/cwd-section.js +209 -0
- package/dist/cwd-section.js.map +1 -0
- package/dist/decision-engine.d.ts +170 -0
- package/dist/decision-engine.d.ts.map +1 -0
- package/dist/decision-engine.js +136 -0
- package/dist/decision-engine.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +118 -0
- package/dist/detect.js.map +1 -0
- package/dist/do-autopick.d.ts +85 -0
- package/dist/do-autopick.d.ts.map +1 -0
- package/dist/do-autopick.js +112 -0
- package/dist/do-autopick.js.map +1 -0
- package/dist/do-config.d.ts +312 -0
- package/dist/do-config.d.ts.map +1 -0
- package/dist/do-config.js +358 -0
- package/dist/do-config.js.map +1 -0
- package/dist/do-remote-auto.d.ts +75 -0
- package/dist/do-remote-auto.d.ts.map +1 -0
- package/dist/do-remote-auto.js +111 -0
- package/dist/do-remote-auto.js.map +1 -0
- package/dist/do.d.ts +621 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +1882 -0
- package/dist/do.js.map +1 -0
- package/dist/drop-source.d.ts +96 -0
- package/dist/drop-source.d.ts.map +1 -0
- package/dist/drop-source.js +91 -0
- package/dist/drop-source.js.map +1 -0
- package/dist/eligibility.d.ts +46 -0
- package/dist/eligibility.d.ts.map +1 -0
- package/dist/eligibility.js +34 -0
- package/dist/eligibility.js.map +1 -0
- package/dist/env-config.d.ts +51 -0
- package/dist/env-config.d.ts.map +1 -0
- package/dist/env-config.js +272 -0
- package/dist/env-config.js.map +1 -0
- package/dist/failure-cause.d.ts +70 -0
- package/dist/failure-cause.d.ts.map +1 -0
- package/dist/failure-cause.js +126 -0
- package/dist/failure-cause.js.map +1 -0
- package/dist/format.d.ts +43 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +256 -0
- package/dist/format.js.map +1 -0
- package/dist/frontmatter.d.ts +215 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +345 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gate-readiness.d.ts +84 -0
- package/dist/gate-readiness.d.ts.map +1 -0
- package/dist/gate-readiness.js +103 -0
- package/dist/gate-readiness.js.map +1 -0
- package/dist/gc.d.ts +165 -0
- package/dist/gc.d.ts.map +1 -0
- package/dist/gc.js +313 -0
- package/dist/gc.js.map +1 -0
- package/dist/gh-failure.d.ts +42 -0
- package/dist/gh-failure.d.ts.map +1 -0
- package/dist/gh-failure.js +49 -0
- package/dist/gh-failure.js.map +1 -0
- package/dist/git.d.ts +75 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +130 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +187 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +343 -0
- package/dist/github.js.map +1 -0
- package/dist/harness.d.ts +242 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +157 -0
- package/dist/harness.js.map +1 -0
- package/dist/identity.d.ts +167 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +231 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/install-ci-branch-protection.d.ts +147 -0
- package/dist/install-ci-branch-protection.d.ts.map +1 -0
- package/dist/install-ci-branch-protection.js +166 -0
- package/dist/install-ci-branch-protection.js.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
- package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
- package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
- package/dist/install-ci-capabilities/close-job.d.ts +13 -0
- package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
- package/dist/install-ci-capabilities/close-job.js +26 -0
- package/dist/install-ci-capabilities/close-job.js.map +1 -0
- package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
- package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
- package/dist/install-ci-capabilities/example-noop.js +23 -0
- package/dist/install-ci-capabilities/example-noop.js.map +1 -0
- package/dist/install-ci-capabilities/intake.d.ts +15 -0
- package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
- package/dist/install-ci-capabilities/intake.js +28 -0
- package/dist/install-ci-capabilities/intake.js.map +1 -0
- package/dist/install-ci-capabilities/verify.d.ts +14 -0
- package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
- package/dist/install-ci-capabilities/verify.js +27 -0
- package/dist/install-ci-capabilities/verify.js.map +1 -0
- package/dist/install-ci-core.d.ts +446 -0
- package/dist/install-ci-core.d.ts.map +1 -0
- package/dist/install-ci-core.js +760 -0
- package/dist/install-ci-core.js.map +1 -0
- package/dist/install-ci-github.d.ts +167 -0
- package/dist/install-ci-github.d.ts.map +1 -0
- package/dist/install-ci-github.js +315 -0
- package/dist/install-ci-github.js.map +1 -0
- package/dist/install-ci.d.ts +105 -0
- package/dist/install-ci.d.ts.map +1 -0
- package/dist/install-ci.js +363 -0
- package/dist/install-ci.js.map +1 -0
- package/dist/intake-event.d.ts +88 -0
- package/dist/intake-event.d.ts.map +1 -0
- package/dist/intake-event.js +66 -0
- package/dist/intake-event.js.map +1 -0
- package/dist/intake-marker.d.ts +95 -0
- package/dist/intake-marker.d.ts.map +1 -0
- package/dist/intake-marker.js +127 -0
- package/dist/intake-marker.js.map +1 -0
- package/dist/intake-triage.d.ts +48 -0
- package/dist/intake-triage.d.ts.map +1 -0
- package/dist/intake-triage.js +95 -0
- package/dist/intake-triage.js.map +1 -0
- package/dist/intake-trigger-template.d.ts +185 -0
- package/dist/intake-trigger-template.d.ts.map +1 -0
- package/dist/intake-trigger-template.js +449 -0
- package/dist/intake-trigger-template.js.map +1 -0
- package/dist/intake.d.ts +569 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +1628 -0
- package/dist/intake.js.map +1 -0
- package/dist/integration-core.d.ts +539 -0
- package/dist/integration-core.d.ts.map +1 -0
- package/dist/integration-core.js +2195 -0
- package/dist/integration-core.js.map +1 -0
- package/dist/integrator.d.ts +343 -0
- package/dist/integrator.d.ts.map +1 -0
- package/dist/integrator.js +400 -0
- package/dist/integrator.js.map +1 -0
- package/dist/isolation.d.ts +219 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +261 -0
- package/dist/isolation.js.map +1 -0
- package/dist/issue-provider.d.ts +349 -0
- package/dist/issue-provider.d.ts.map +1 -0
- package/dist/issue-provider.js +360 -0
- package/dist/issue-provider.js.map +1 -0
- package/dist/item-lock.d.ts +626 -0
- package/dist/item-lock.d.ts.map +1 -0
- package/dist/item-lock.js +1381 -0
- package/dist/item-lock.js.map +1 -0
- package/dist/item-path.d.ts +49 -0
- package/dist/item-path.d.ts.map +1 -0
- package/dist/item-path.js +66 -0
- package/dist/item-path.js.map +1 -0
- package/dist/ledger-lint.d.ts +129 -0
- package/dist/ledger-lint.d.ts.map +1 -0
- package/dist/ledger-lint.js +249 -0
- package/dist/ledger-lint.js.map +1 -0
- package/dist/ledger-read.d.ts +357 -0
- package/dist/ledger-read.d.ts.map +1 -0
- package/dist/ledger-read.js +442 -0
- package/dist/ledger-read.js.map +1 -0
- package/dist/ledger-write.d.ts +330 -0
- package/dist/ledger-write.d.ts.map +1 -0
- package/dist/ledger-write.js +411 -0
- package/dist/ledger-write.js.map +1 -0
- package/dist/lifecycle-gather.d.ts +30 -0
- package/dist/lifecycle-gather.d.ts.map +1 -0
- package/dist/lifecycle-gather.js +205 -0
- package/dist/lifecycle-gather.js.map +1 -0
- package/dist/lifecycle-pools.d.ts +180 -0
- package/dist/lifecycle-pools.d.ts.map +1 -0
- package/dist/lifecycle-pools.js +78 -0
- package/dist/lifecycle-pools.js.map +1 -0
- package/dist/merge-question-surfacer.d.ts +166 -0
- package/dist/merge-question-surfacer.d.ts.map +1 -0
- package/dist/merge-question-surfacer.js +297 -0
- package/dist/merge-question-surfacer.js.map +1 -0
- package/dist/mint-adr.d.ts +126 -0
- package/dist/mint-adr.d.ts.map +1 -0
- package/dist/mint-adr.js +257 -0
- package/dist/mint-adr.js.map +1 -0
- package/dist/mirror-pool-scan.d.ts +125 -0
- package/dist/mirror-pool-scan.d.ts.map +1 -0
- package/dist/mirror-pool-scan.js +104 -0
- package/dist/mirror-pool-scan.js.map +1 -0
- package/dist/needs-attention.d.ts +341 -0
- package/dist/needs-attention.d.ts.map +1 -0
- package/dist/needs-attention.js +900 -0
- package/dist/needs-attention.js.map +1 -0
- package/dist/orphan-sidecar.d.ts +79 -0
- package/dist/orphan-sidecar.d.ts.map +1 -0
- package/dist/orphan-sidecar.js +71 -0
- package/dist/orphan-sidecar.js.map +1 -0
- package/dist/output.d.ts +48 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +66 -0
- package/dist/output.js.map +1 -0
- package/dist/pi-harness.d.ts +179 -0
- package/dist/pi-harness.d.ts.map +1 -0
- package/dist/pi-harness.js +342 -0
- package/dist/pi-harness.js.map +1 -0
- package/dist/placement.d.ts +99 -0
- package/dist/placement.d.ts.map +1 -0
- package/dist/placement.js +67 -0
- package/dist/placement.js.map +1 -0
- package/dist/prd-to-spec.d.ts +315 -0
- package/dist/prd-to-spec.d.ts.map +1 -0
- package/dist/prd-to-spec.js +684 -0
- package/dist/prd-to-spec.js.map +1 -0
- package/dist/prepare.d.ts +121 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +140 -0
- package/dist/prepare.js.map +1 -0
- package/dist/prompt.d.ts +360 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +499 -0
- package/dist/prompt.js.map +1 -0
- package/dist/protocol/ADR-FORMAT.md +47 -0
- package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
- package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
- package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
- package/dist/protocol/TASKING-PROTOCOL.md +122 -0
- package/dist/protocol/WORK-CONTRACT.md +276 -0
- package/dist/protocol/spec-template.md +71 -0
- package/dist/protocol/task-template.md +65 -0
- package/dist/readiness.d.ts +66 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +36 -0
- package/dist/readiness.js.map +1 -0
- package/dist/reap-branches.d.ts +102 -0
- package/dist/reap-branches.d.ts.map +1 -0
- package/dist/reap-branches.js +149 -0
- package/dist/reap-branches.js.map +1 -0
- package/dist/recover-isolated.d.ts +72 -0
- package/dist/recover-isolated.d.ts.map +1 -0
- package/dist/recover-isolated.js +188 -0
- package/dist/recover-isolated.js.map +1 -0
- package/dist/registry.d.ts +172 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +296 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-config.d.ts +201 -0
- package/dist/repo-config.d.ts.map +1 -0
- package/dist/repo-config.js +414 -0
- package/dist/repo-config.js.map +1 -0
- package/dist/repo-key.d.ts +20 -0
- package/dist/repo-key.d.ts.map +1 -0
- package/dist/repo-key.js +68 -0
- package/dist/repo-key.js.map +1 -0
- package/dist/repo-mirror.d.ts +177 -0
- package/dist/repo-mirror.d.ts.map +1 -0
- package/dist/repo-mirror.js +271 -0
- package/dist/repo-mirror.js.map +1 -0
- package/dist/retry-backoff.d.ts +90 -0
- package/dist/retry-backoff.d.ts.map +1 -0
- package/dist/retry-backoff.js +98 -0
- package/dist/retry-backoff.js.map +1 -0
- package/dist/review-gate.d.ts +173 -0
- package/dist/review-gate.d.ts.map +1 -0
- package/dist/review-gate.js +261 -0
- package/dist/review-gate.js.map +1 -0
- package/dist/review-verdict.d.ts +149 -0
- package/dist/review-verdict.d.ts.map +1 -0
- package/dist/review-verdict.js +332 -0
- package/dist/review-verdict.js.map +1 -0
- package/dist/run.d.ts +221 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +963 -0
- package/dist/run.js.map +1 -0
- package/dist/scan.d.ts +308 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +374 -0
- package/dist/scan.js.map +1 -0
- package/dist/select-order.d.ts +75 -0
- package/dist/select-order.d.ts.map +1 -0
- package/dist/select-order.js +108 -0
- package/dist/select-order.js.map +1 -0
- package/dist/select-priority.d.ts +188 -0
- package/dist/select-priority.d.ts.map +1 -0
- package/dist/select-priority.js +80 -0
- package/dist/select-priority.js.map +1 -0
- package/dist/select.d.ts +25 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +43 -0
- package/dist/select.js.map +1 -0
- package/dist/session-path.d.ts +36 -0
- package/dist/session-path.d.ts.map +1 -0
- package/dist/session-path.js +129 -0
- package/dist/session-path.js.map +1 -0
- package/dist/sidecar-apply.d.ts +83 -0
- package/dist/sidecar-apply.d.ts.map +1 -0
- package/dist/sidecar-apply.js +111 -0
- package/dist/sidecar-apply.js.map +1 -0
- package/dist/sidecar.d.ts +245 -0
- package/dist/sidecar.d.ts.map +1 -0
- package/dist/sidecar.js +481 -0
- package/dist/sidecar.js.map +1 -0
- package/dist/slug-namespace.d.ts +204 -0
- package/dist/slug-namespace.d.ts.map +1 -0
- package/dist/slug-namespace.js +229 -0
- package/dist/slug-namespace.js.map +1 -0
- package/dist/spec-complete.d.ts +44 -0
- package/dist/spec-complete.d.ts.map +1 -0
- package/dist/spec-complete.js +69 -0
- package/dist/spec-complete.js.map +1 -0
- package/dist/start.d.ts +97 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +633 -0
- package/dist/start.js.map +1 -0
- package/dist/status.d.ts +199 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +228 -0
- package/dist/status.js.map +1 -0
- package/dist/surface-gate.d.ts +162 -0
- package/dist/surface-gate.d.ts.map +1 -0
- package/dist/surface-gate.js +206 -0
- package/dist/surface-gate.js.map +1 -0
- package/dist/surface-persist.d.ts +86 -0
- package/dist/surface-persist.d.ts.map +1 -0
- package/dist/surface-persist.js +129 -0
- package/dist/surface-persist.js.map +1 -0
- package/dist/tasker-review-loop.d.ts +249 -0
- package/dist/tasker-review-loop.d.ts.map +1 -0
- package/dist/tasker-review-loop.js +369 -0
- package/dist/tasker-review-loop.js.map +1 -0
- package/dist/tasking-eligibility.d.ts +74 -0
- package/dist/tasking-eligibility.d.ts.map +1 -0
- package/dist/tasking-eligibility.js +52 -0
- package/dist/tasking-eligibility.js.map +1 -0
- package/dist/tasking-lock.d.ts +111 -0
- package/dist/tasking-lock.d.ts.map +1 -0
- package/dist/tasking-lock.js +256 -0
- package/dist/tasking-lock.js.map +1 -0
- package/dist/tasking.d.ts +275 -0
- package/dist/tasking.d.ts.map +1 -0
- package/dist/tasking.js +952 -0
- package/dist/tasking.js.map +1 -0
- package/dist/triage-gate.d.ts +127 -0
- package/dist/triage-gate.d.ts.map +1 -0
- package/dist/triage-gate.js +139 -0
- package/dist/triage-gate.js.map +1 -0
- package/dist/triage-persist.d.ts +163 -0
- package/dist/triage-persist.d.ts.map +1 -0
- package/dist/triage-persist.js +387 -0
- package/dist/triage-persist.js.map +1 -0
- package/dist/verdict-json.d.ts +32 -0
- package/dist/verdict-json.d.ts.map +1 -0
- package/dist/verdict-json.js +74 -0
- package/dist/verdict-json.js.map +1 -0
- package/dist/verify-workflow-template.d.ts +60 -0
- package/dist/verify-workflow-template.d.ts.map +1 -0
- package/dist/verify-workflow-template.js +126 -0
- package/dist/verify-workflow-template.js.map +1 -0
- package/dist/verify.d.ts +60 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +62 -0
- package/dist/verify.js.map +1 -0
- package/dist/watch-session.d.ts +112 -0
- package/dist/watch-session.d.ts.map +1 -0
- package/dist/watch-session.js +347 -0
- package/dist/watch-session.js.map +1 -0
- package/dist/work-layout.d.ts +198 -0
- package/dist/work-layout.d.ts.map +1 -0
- package/dist/work-layout.js +217 -0
- package/dist/work-layout.js.map +1 -0
- package/dist/work-on.d.ts +154 -0
- package/dist/work-on.d.ts.map +1 -0
- package/dist/work-on.js +387 -0
- package/dist/work-on.js.map +1 -0
- package/dist/workspace.d.ts +224 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +325 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +46 -2
- package/src/advance-ci-template.ts +203 -0
- package/src/advance-classify.ts +197 -0
- package/src/advance-drivers.ts +414 -0
- package/src/advance-isolated.ts +432 -0
- package/src/advance-lifecycle-template.ts +791 -0
- package/src/advance-loop-driver.ts +745 -0
- package/src/advance-treeless-publish.ts +177 -0
- package/src/advance.ts +1564 -0
- package/src/advancing-lock.ts +988 -0
- package/src/agent-launch.ts +137 -0
- package/src/agent-stop.ts +361 -0
- package/src/apply-decide.ts +242 -0
- package/src/apply-merge-action.ts +502 -0
- package/src/apply-persist.ts +518 -0
- package/src/arbiter.ts +372 -0
- package/src/brand.ts +111 -0
- package/src/buildable-body.ts +196 -0
- package/src/categorise.ts +158 -0
- package/src/claim-cas.ts +513 -0
- package/src/cli-spinner.ts +225 -0
- package/src/cli.ts +4369 -0
- package/src/close-job-template.ts +236 -0
- package/src/close-job.ts +319 -0
- package/src/complete.ts +1379 -0
- package/src/concurrency.ts +151 -0
- package/src/config-override.ts +116 -0
- package/src/config.ts +883 -0
- package/src/continue-branch.ts +542 -0
- package/src/cwd-section.ts +392 -0
- package/src/decision-engine.ts +272 -0
- package/src/detect.ts +124 -0
- package/src/do-autopick.ts +223 -0
- package/src/do-config.ts +589 -0
- package/src/do-remote-auto.ts +197 -0
- package/src/do.ts +2623 -0
- package/src/drop-source.ts +194 -0
- package/src/eligibility.ts +79 -0
- package/src/env-config.ts +305 -0
- package/src/failure-cause.ts +142 -0
- package/src/format.ts +313 -0
- package/src/frontmatter.ts +485 -0
- package/src/gate-readiness.ts +147 -0
- package/src/gc.ts +510 -0
- package/src/gh-failure.ts +53 -0
- package/src/git.ts +186 -0
- package/src/github.ts +468 -0
- package/src/harness.ts +355 -0
- package/src/identity.ts +322 -0
- package/src/index.ts +785 -0
- package/src/install-ci-branch-protection.ts +255 -0
- package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
- package/src/install-ci-capabilities/close-job.ts +32 -0
- package/src/install-ci-capabilities/example-noop.ts +24 -0
- package/src/install-ci-capabilities/intake.ts +34 -0
- package/src/install-ci-capabilities/verify.ts +33 -0
- package/src/install-ci-core.ts +1088 -0
- package/src/install-ci-github.ts +376 -0
- package/src/install-ci.ts +552 -0
- package/src/intake-event.ts +102 -0
- package/src/intake-marker.ts +195 -0
- package/src/intake-triage.ts +138 -0
- package/src/intake-trigger-template.ts +591 -0
- package/src/intake.ts +2445 -0
- package/src/integration-core.ts +3065 -0
- package/src/integrator.ts +771 -0
- package/src/isolation.ts +484 -0
- package/src/issue-provider.ts +733 -0
- package/src/item-lock.ts +1858 -0
- package/src/item-path.ts +75 -0
- package/src/ledger-lint.ts +332 -0
- package/src/ledger-read.ts +924 -0
- package/src/ledger-write.ts +865 -0
- package/src/lifecycle-gather.ts +298 -0
- package/src/lifecycle-pools.ts +250 -0
- package/src/merge-question-surfacer.ts +496 -0
- package/src/mint-adr.ts +362 -0
- package/src/mirror-pool-scan.ts +240 -0
- package/src/needs-attention.ts +1506 -0
- package/src/orphan-sidecar.ts +150 -0
- package/src/output.ts +89 -0
- package/src/pi-harness.ts +403 -0
- package/src/placement.ts +131 -0
- package/src/prd-to-spec.ts +1023 -0
- package/src/prepare.ts +230 -0
- package/src/prompt.ts +760 -0
- package/src/readiness.ts +98 -0
- package/src/reap-branches.ts +278 -0
- package/src/recover-isolated.ts +276 -0
- package/src/registry.ts +475 -0
- package/src/repo-config.ts +550 -0
- package/src/repo-key.ts +74 -0
- package/src/repo-mirror.ts +367 -0
- package/src/retry-backoff.ts +130 -0
- package/src/review-gate.ts +389 -0
- package/src/review-verdict.ts +422 -0
- package/src/run.ts +1430 -0
- package/src/scan.ts +611 -0
- package/src/select-order.ts +143 -0
- package/src/select-priority.ts +266 -0
- package/src/select.ts +62 -0
- package/src/session-path.ts +153 -0
- package/src/sidecar-apply.ts +216 -0
- package/src/sidecar.ts +700 -0
- package/src/slug-namespace.ts +367 -0
- package/src/spec-complete.ts +118 -0
- package/src/start.ts +974 -0
- package/src/status.ts +441 -0
- package/src/surface-gate.ts +337 -0
- package/src/surface-persist.ts +241 -0
- package/src/tasker-review-loop.ts +671 -0
- package/src/tasking-eligibility.ts +114 -0
- package/src/tasking-lock.ts +416 -0
- package/src/tasking.ts +1438 -0
- package/src/triage-gate.ts +248 -0
- package/src/triage-persist.ts +570 -0
- package/src/verdict-json.ts +73 -0
- package/src/verify-workflow-template.ts +159 -0
- package/src/verify.ts +123 -0
- package/src/watch-session.ts +397 -0
- package/src/work-layout.ts +262 -0
- package/src/work-on.ts +660 -0
- package/src/workspace.ts +502 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **The failure-CAUSE classifier** (task `failure-cause-classification-model-vs-
|
|
3
|
+
* git-vs-agent`).
|
|
4
|
+
*
|
|
5
|
+
* When a claimed item routes to `work/needs-attention/`, the runner records WHY.
|
|
6
|
+
* Historically several DIFFERENT causes collapsed into one undifferentiated label
|
|
7
|
+
* ("agent failed"), even though the CAUSE drives the RECOVERY:
|
|
8
|
+
*
|
|
9
|
+
* - **transient-infra** → retry the SAME work (the work is fine: a model
|
|
10
|
+
* endpoint outage the harness surfaced AFTER its own retries, or a git/
|
|
11
|
+
* provider outage).
|
|
12
|
+
* - **config-error** → fix the WIRING, not the task (a thrown CORE wiring/
|
|
13
|
+
* config error, e.g. `review` on with no `reviewGate` configured).
|
|
14
|
+
* - **agent-failed** (the conservative generic) → a human/agent must FIX
|
|
15
|
+
* something the agent did (ran but produced bad/empty output), OR the cause is
|
|
16
|
+
* simply UNKNOWN — the safe default that never forces a wrong specific label.
|
|
17
|
+
*
|
|
18
|
+
* This module classifies ONLY the axis that was previously lumped under
|
|
19
|
+
* "agent-failed". The OTHER existing terminal causes already have precise names
|
|
20
|
+
* and are NOT re-classified here — a red acceptance gate stays `gate-failed`, a
|
|
21
|
+
* rebase abort stays `rebase-conflict`, a deliberate STOP stays `agent-stopped`,
|
|
22
|
+
* a Gate-2 block stays `review-blocked`. This is the CAUSE axis ON TOP of those
|
|
23
|
+
* (see CONTEXT.md's *failure cause* glossary entry — the single source of truth).
|
|
24
|
+
*
|
|
25
|
+
* The classification is BEST-EFFORT + CONSERVATIVE: an unrecognised cause stays
|
|
26
|
+
* the generic `agent-failed`. The new precision is ADDED only where the cause is
|
|
27
|
+
* knowable from the surfaced error/detail; it never forces a wrong label.
|
|
28
|
+
*
|
|
29
|
+
* **`do` and `run` classify the SAME error the SAME way** by both routing their
|
|
30
|
+
* thrown-core-error / failed-agent detail through THIS one function — closing the
|
|
31
|
+
* cross-path divergence recorded in
|
|
32
|
+
* `work/notes/observations/run-thrown-core-error-labeled-agent-failed.md` (the SAME
|
|
33
|
+
* thrown core error used to read as `usage-error` in `do` but `agent-failed` in
|
|
34
|
+
* `run`).
|
|
35
|
+
*
|
|
36
|
+
* SCOPE FENCE: model-endpoint RETRIES are the HARNESS's job (pi retries its own
|
|
37
|
+
* API ~3–4×). This module does NOT add retries — it only CLASSIFIES what the
|
|
38
|
+
* harness SURFACES once its retries are exhausted (so a post-retry model outage
|
|
39
|
+
* reads as `transient-infra`, distinct from the agent producing bad output).
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The CAUSE of a stuck item, the axis ON TOP of the existing terminal outcomes.
|
|
44
|
+
* Only the values this module decides between are listed — the genuinely-NEW
|
|
45
|
+
* `transient-infra` / `config-error` plus the conservative generic `agent-failed`
|
|
46
|
+
* (the existing name, reused as the safe default). The other terminal causes
|
|
47
|
+
* (`gate-failed`, `rebase-conflict`, `agent-stopped`, `review-blocked`) are NOT
|
|
48
|
+
* produced here; they keep their own precise outcome names at their own sites.
|
|
49
|
+
*/
|
|
50
|
+
export type FailureCause =
|
|
51
|
+
| 'transient-infra' // a harness-surfaced model/connection outage (post-retry), or a git/provider outage — RETRY the same work
|
|
52
|
+
| 'config-error' // a thrown CORE wiring/config error (e.g. review on, no reviewGate) — fix the WIRING
|
|
53
|
+
| 'agent-failed'; // the conservative generic: the agent ran but produced bad/empty output, OR the cause is UNKNOWN
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The signature of a thrown CORE wiring/config error this module recognises. The
|
|
57
|
+
* core throws a plain `Error` for `review` on with no `reviewGate` wired (the
|
|
58
|
+
* canonical config-error; see `integration-core.ts`), whose message contains
|
|
59
|
+
* "wiring bug". We match on that stable phrase rather than the error CLASS so the
|
|
60
|
+
* classification survives the message crossing the plain-`Error` boundary the
|
|
61
|
+
* catch sites hand us (they only have `err.message`).
|
|
62
|
+
*/
|
|
63
|
+
const CONFIG_ERROR_SIGNATURES = [
|
|
64
|
+
/wiring bug/i,
|
|
65
|
+
/no review gate is configured/i,
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Substrings that mark a TRANSIENT-INFRA failure: a model endpoint / connection
|
|
70
|
+
* outage the harness surfaced AFTER exhausting its own retries, or a git/provider
|
|
71
|
+
* outage. Best-effort lexical signals (the harness/git only hand us a message
|
|
72
|
+
* string) — deliberately conservative: anything not matched stays `agent-failed`.
|
|
73
|
+
*/
|
|
74
|
+
const TRANSIENT_INFRA_SIGNATURES = [
|
|
75
|
+
// A Gate-2 review verdict the runner could not PARSE (malformed JSON from the
|
|
76
|
+
// review agent, common on large diffs + weaker models). This is `transient-infra`,
|
|
77
|
+
// NOT `agent-failed`/`config-error`: the WORK is fine and the wiring is fine; the
|
|
78
|
+
// STOCHASTIC gate output misbehaved, so re-running the SAME work is the natural
|
|
79
|
+
// recovery (and the parser's repair pass + the tightened contract make a re-run far
|
|
80
|
+
// more likely to parse). Matches both `parseReviewVerdict` throw phrasings ("review
|
|
81
|
+
// verdict was not valid JSON" and "produced no parseable {verdict, findings}") and
|
|
82
|
+
// the core's "verdict could not be parsed" wrapper.
|
|
83
|
+
/review verdict was not valid JSON/i,
|
|
84
|
+
/verdict could not be parsed/i,
|
|
85
|
+
/no parseable \{verdict/i,
|
|
86
|
+
/\bECONN(?:REFUSED|RESET|ABORTED)\b/i,
|
|
87
|
+
/\bETIMEDOUT\b/i,
|
|
88
|
+
/\bENOTFOUND\b/i,
|
|
89
|
+
/\bEAI_AGAIN\b/i,
|
|
90
|
+
/connection (?:error|refused|reset|timed out|failed)/i,
|
|
91
|
+
/network (?:error|is unreachable|timeout)/i,
|
|
92
|
+
/\b(?:could not|unable to) (?:connect|reach)\b/i,
|
|
93
|
+
/\btimed? ?out\b/i,
|
|
94
|
+
/\b(?:overloaded|service unavailable|temporarily unavailable)\b/i,
|
|
95
|
+
/\b(?:429|500|502|503|504)\b/,
|
|
96
|
+
/model (?:endpoint )?(?:offline|unavailable|overloaded)/i,
|
|
97
|
+
/(?:after|exhausted) .{0,40}retr(?:y|ies)/i,
|
|
98
|
+
/rate.?limit/i,
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Classify a failure CAUSE from the surfaced error/detail text, best-effort +
|
|
103
|
+
* conservative (an unrecognised cause stays `agent-failed`).
|
|
104
|
+
*
|
|
105
|
+
* Order matters: a thrown CORE config/wiring error is checked FIRST (it is the
|
|
106
|
+
* most specific + the cross-path divergence this task closes), then the
|
|
107
|
+
* transient-infra signals, else the generic default.
|
|
108
|
+
*
|
|
109
|
+
* Used by BOTH `do` and `run` at their failure-routing sites so the SAME error
|
|
110
|
+
* yields the SAME cause regardless of path.
|
|
111
|
+
*/
|
|
112
|
+
export function classifyFailureCause(detail: string | undefined): FailureCause {
|
|
113
|
+
const text = (detail ?? '').trim();
|
|
114
|
+
if (text === '') {
|
|
115
|
+
return 'agent-failed';
|
|
116
|
+
}
|
|
117
|
+
if (CONFIG_ERROR_SIGNATURES.some((re) => re.test(text))) {
|
|
118
|
+
return 'config-error';
|
|
119
|
+
}
|
|
120
|
+
if (TRANSIENT_INFRA_SIGNATURES.some((re) => re.test(text))) {
|
|
121
|
+
return 'transient-infra';
|
|
122
|
+
}
|
|
123
|
+
return 'agent-failed';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* A short, human-readable label for a cause, used to PREFIX the recorded
|
|
128
|
+
* needs-attention reason so an operator (or an autonomous triage loop) reads the
|
|
129
|
+
* cause WITHOUT a second naming scheme. The generic `agent-failed` gets the
|
|
130
|
+
* historical "agent failed:" prefix so existing reason prose / tests are
|
|
131
|
+
* unchanged; only the NEW causes carry a distinct, legible prefix.
|
|
132
|
+
*/
|
|
133
|
+
export function failureCauseLabel(cause: FailureCause): string {
|
|
134
|
+
switch (cause) {
|
|
135
|
+
case 'transient-infra':
|
|
136
|
+
return 'transient infra';
|
|
137
|
+
case 'config-error':
|
|
138
|
+
return 'config error';
|
|
139
|
+
case 'agent-failed':
|
|
140
|
+
return 'agent failed';
|
|
141
|
+
}
|
|
142
|
+
}
|
package/src/format.ts
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import type {ScanReport, ScannedItem} from './scan.js';
|
|
2
|
+
import type {CwdSection} from './cwd-section.js';
|
|
3
|
+
import type {LockEntry} from './item-lock.js';
|
|
4
|
+
import {formatDuplicateWarnings} from './ledger-lint.js';
|
|
5
|
+
import {
|
|
6
|
+
categoriseItems,
|
|
7
|
+
summariseGroups,
|
|
8
|
+
CATEGORY_ORDER,
|
|
9
|
+
CATEGORY_LABELS,
|
|
10
|
+
type CategorisedItem,
|
|
11
|
+
type CategorisedGroups,
|
|
12
|
+
} from './categorise.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Human label for the two autonomy axes. `humanOnly` is reported first when both
|
|
16
|
+
* are set, so the REASON an agent is gated is always visible and distinct from
|
|
17
|
+
* `needsAnswers`.
|
|
18
|
+
*/
|
|
19
|
+
export function gateLabel(
|
|
20
|
+
humanOnly: boolean | undefined,
|
|
21
|
+
needsAnswers?: boolean | undefined,
|
|
22
|
+
): string {
|
|
23
|
+
if (humanOnly === true) {
|
|
24
|
+
return 'human-only';
|
|
25
|
+
}
|
|
26
|
+
if (needsAnswers === true) {
|
|
27
|
+
return 'needs-answers';
|
|
28
|
+
}
|
|
29
|
+
return 'undeclared';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** A short description of the `blockedBy` readiness for one item. */
|
|
33
|
+
function readinessLabel(item: ScannedItem): string {
|
|
34
|
+
if (item.blockedBy.length === 0) {
|
|
35
|
+
return 'deps: satisfied (none)';
|
|
36
|
+
}
|
|
37
|
+
if (item.eligibility.blockedBy.satisfied) {
|
|
38
|
+
return `deps: satisfied (${item.blockedBy.join(', ')})`;
|
|
39
|
+
}
|
|
40
|
+
return `deps: waiting on ${item.eligibility.blockedBy.missing.join(', ')}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Ready items get a filled marker, blocked ones an open one. */
|
|
44
|
+
function readinessMarker(entry: CategorisedItem): string {
|
|
45
|
+
return entry.ready ? '*' : 'o';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function formatItem(entry: CategorisedItem): string {
|
|
49
|
+
return ` ${readinessMarker(entry)} ${entry.item.slug} ${readinessLabel(entry.item)}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Render one repo's three labelled groups; empty groups show `(none)`. */
|
|
53
|
+
function formatRepo(path: string, groups: CategorisedGroups): string[] {
|
|
54
|
+
const lines: string[] = [];
|
|
55
|
+
lines.push(` ${path}`);
|
|
56
|
+
lines.push('');
|
|
57
|
+
for (const category of CATEGORY_ORDER) {
|
|
58
|
+
lines.push(` ${CATEGORY_LABELS[category]}:`);
|
|
59
|
+
const entries = groups[category];
|
|
60
|
+
if (entries.length === 0) {
|
|
61
|
+
lines.push(' (none)');
|
|
62
|
+
} else {
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
lines.push(formatItem(entry));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
lines.push('');
|
|
69
|
+
return lines;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function pluralRepos(n: number): string {
|
|
73
|
+
return n === 1 ? 'repo' : 'repos';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function pluralItems(n: number): string {
|
|
77
|
+
return n === 1 ? 'item' : 'items';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The divergence-vs-arbiter line for the cwd-local section, using the
|
|
82
|
+
* `main-divergence-guard` framing: local `main` AHEAD of `<arbiter>/main` means
|
|
83
|
+
* UNPUSHED commits (the local working tree is more authoritative than the
|
|
84
|
+
* arbiter for those); BEHIND means the arbiter has commits the local tree lacks.
|
|
85
|
+
* When the fetch failed it says so (the divergence reflects last-known).
|
|
86
|
+
*/
|
|
87
|
+
function cwdDivergenceLine(
|
|
88
|
+
arbiter: NonNullable<CwdSection['arbiter']>,
|
|
89
|
+
): string {
|
|
90
|
+
const freshness = arbiter.fetched
|
|
91
|
+
? 'fetched just now'
|
|
92
|
+
: 'FETCH FAILED — last-known (offline)';
|
|
93
|
+
const {ahead, behind, remote} = arbiter;
|
|
94
|
+
if (ahead === 0 && behind === 0) {
|
|
95
|
+
return ` in sync with ${remote}/main (${freshness}).`;
|
|
96
|
+
}
|
|
97
|
+
const parts: string[] = [];
|
|
98
|
+
if (ahead > 0) {
|
|
99
|
+
parts.push(`${ahead} commit${ahead === 1 ? '' : 's'} ahead (unpushed)`);
|
|
100
|
+
}
|
|
101
|
+
if (behind > 0) {
|
|
102
|
+
parts.push(`${behind} commit${behind === 1 ? '' : 's'} behind`);
|
|
103
|
+
}
|
|
104
|
+
return ` local main is ${parts.join(', ')} vs ${remote}/main (${freshness}).`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Render the CWD-LOCAL section of `scan`/`status` (the `scan-status-read-cwd-repo`
|
|
109
|
+
* task): a DISTINCT, separately-counted block for the CURRENT repo, read from
|
|
110
|
+
* the LOCAL WORKING TREE (NOT the registry's bare mirror ref). Returns `[]` when
|
|
111
|
+
* the cwd does NOT participate (no local section). The section LABELS its source
|
|
112
|
+
* + freshness, shows the divergence-vs-arbiter (`main-divergence-guard` framing),
|
|
113
|
+
* and — when the cwd participates but is NOT registered — teaches
|
|
114
|
+
* self-registration instead of the dead-end "No participating repos found".
|
|
115
|
+
*
|
|
116
|
+
* The counts here are the cwd's OWN (never merged into the registry total — the
|
|
117
|
+
* consistency rule): the two reads have different freshness + storage models.
|
|
118
|
+
*/
|
|
119
|
+
/**
|
|
120
|
+
* Render ONE held per-item lock entry (action × state + reason/questions) as
|
|
121
|
+
* indented lines, the SHARED renderer for the in-flight lock surface on BOTH the
|
|
122
|
+
* registry view (`formatStatus`) and the cwd section (`formatCwdSection`), so the
|
|
123
|
+
* two substrates present a held/stuck item identically (NOT a forked renderer). An
|
|
124
|
+
* `active` hold reads as `in-progress`; a `stuck` hold as `needs-attention` and
|
|
125
|
+
* carries its (possibly multi-line) reason + any surfaced questions.
|
|
126
|
+
*/
|
|
127
|
+
export function formatLockEntryLines(
|
|
128
|
+
entry: LockEntry,
|
|
129
|
+
indent: string,
|
|
130
|
+
): string[] {
|
|
131
|
+
const lines: string[] = [];
|
|
132
|
+
const view = entry.state === 'stuck' ? 'needs-attention' : 'in-progress';
|
|
133
|
+
lines.push(
|
|
134
|
+
`${indent}${entry.entry} (${entry.action}/${entry.state} = ${view})`,
|
|
135
|
+
);
|
|
136
|
+
if (entry.state === 'stuck') {
|
|
137
|
+
const reason =
|
|
138
|
+
entry.reason && entry.reason !== ''
|
|
139
|
+
? entry.reason
|
|
140
|
+
: '(no reason recorded)';
|
|
141
|
+
const reasonLines = reason.split('\n');
|
|
142
|
+
lines.push(`${indent} reason: ${reasonLines[0]}`);
|
|
143
|
+
for (const extra of reasonLines.slice(1)) {
|
|
144
|
+
lines.push(`${indent} ${extra}`);
|
|
145
|
+
}
|
|
146
|
+
if (entry.questions && entry.questions.length > 0) {
|
|
147
|
+
lines.push(`${indent} questions:`);
|
|
148
|
+
for (const q of entry.questions) {
|
|
149
|
+
lines.push(`${indent} - ${q}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return lines;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function formatCwdSection(section: CwdSection): string[] {
|
|
157
|
+
if (!section.participating || section.repo === undefined) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
const lines: string[] = [];
|
|
161
|
+
const dedup = section.alsoRegistered === true ? ' (also registered)' : '';
|
|
162
|
+
lines.push('This repo (local working tree):');
|
|
163
|
+
lines.push(` ${section.path}${dedup}`);
|
|
164
|
+
lines.push(
|
|
165
|
+
' source: local working tree (may be ahead of / behind the arbiter) — ' +
|
|
166
|
+
'distinct from the registry view below (arbiter main, fetched).',
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Fetch-first divergence-vs-arbiter (or a no-arbiter note).
|
|
170
|
+
if (section.arbiter !== undefined) {
|
|
171
|
+
lines.push(cwdDivergenceLine(section.arbiter));
|
|
172
|
+
} else {
|
|
173
|
+
lines.push(
|
|
174
|
+
' no arbiter remote configured — divergence vs arbiter unknown.',
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const total = section.totalItems ?? 0;
|
|
179
|
+
// Self-registration hint when the cwd participates but is NOT registered.
|
|
180
|
+
if (section.alsoRegistered !== true) {
|
|
181
|
+
lines.push('');
|
|
182
|
+
lines.push(
|
|
183
|
+
` This repo participates (${total} backlog ${pluralItems(total)}) but is ` +
|
|
184
|
+
'NOT registered — `run`/`scan` across machines won’t see it until ' +
|
|
185
|
+
'`dorfl remote add . --local` (or `remote add <its-url>`).',
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The cwd's grouped backlog — the SAME who-can-take-it grouping the registry
|
|
190
|
+
// view uses, but read from the working tree and counted SEPARATELY.
|
|
191
|
+
const groups = categoriseItems(section.repo.items);
|
|
192
|
+
lines.push('');
|
|
193
|
+
for (const category of CATEGORY_ORDER) {
|
|
194
|
+
lines.push(` ${CATEGORY_LABELS[category]}:`);
|
|
195
|
+
const entries = groups[category];
|
|
196
|
+
if (entries.length === 0) {
|
|
197
|
+
lines.push(' (none)');
|
|
198
|
+
} else {
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
lines.push(formatItem(entry));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// The PER-ITEM LOCK in-flight SURFACE for the cwd (prd
|
|
206
|
+
// `ledger-status-per-item-lock-refs` US #8): held (`active` = in-progress) and
|
|
207
|
+
// `stuck` (= needs-attention) lock entries + their reasons. This is what keeps a
|
|
208
|
+
// held/stuck cwd item from vanishing: the held-slug subtraction removes it from
|
|
209
|
+
// the buckets above, so without THIS block it would be invisible (the regression
|
|
210
|
+
// this fixes). Symmetric with the registry view's `In-flight locks` block (same
|
|
211
|
+
// `refs/dorfl/lock/*` source, same primitive); rendered HERE inside the cwd
|
|
212
|
+
// section so it stays the cwd's OWN, separately-counted surface. Empty ⇒ no
|
|
213
|
+
// block (a calm repo adds no lines).
|
|
214
|
+
const lockHeld = section.repo.lockHeld ?? [];
|
|
215
|
+
if (lockHeld.length > 0) {
|
|
216
|
+
lines.push('');
|
|
217
|
+
lines.push(' In progress / stuck (lock held — refs/dorfl/lock/*):');
|
|
218
|
+
for (const entry of lockHeld) {
|
|
219
|
+
lines.push(...formatLockEntryLines(entry, ' '));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
lines.push('');
|
|
223
|
+
lines.push(
|
|
224
|
+
` Local total: ${total} ${pluralItems(total)} ` +
|
|
225
|
+
`(${section.totalEligible ?? 0} eligible) — this repo only, NOT merged with ` +
|
|
226
|
+
'the registry total below.',
|
|
227
|
+
);
|
|
228
|
+
return lines;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Render the cross-repo queue as a human decision dashboard: under each repo,
|
|
233
|
+
* every backlog item is grouped by who-can-take-it (Agent-claimable now /
|
|
234
|
+
* Human-only / Blocked), with empty groups shown as `(none)`. Within a group,
|
|
235
|
+
* ready (deps-satisfied) items sort above blocked ones.
|
|
236
|
+
*
|
|
237
|
+
* The set of groups shown is INDEPENDENT of `autoBuild`; only the eligibility
|
|
238
|
+
* *verdict* line reflects the policy (`report.totalEligible` counts an
|
|
239
|
+
* agent-claimable item only when `autoBuild` is on).
|
|
240
|
+
*/
|
|
241
|
+
export function formatReport(report: ScanReport, cwd?: CwdSection): string {
|
|
242
|
+
const lines: string[] = [];
|
|
243
|
+
|
|
244
|
+
// The cwd-local section (the `scan-status-read-cwd-repo` task): a DISTINCT,
|
|
245
|
+
// separately-counted block for the CURRENT repo, ABOVE the registry view.
|
|
246
|
+
const cwdLines = cwd !== undefined ? formatCwdSection(cwd) : [];
|
|
247
|
+
if (cwdLines.length > 0) {
|
|
248
|
+
lines.push(...cwdLines);
|
|
249
|
+
lines.push('');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// De-dup: when the cwd is ALSO registered, drop its registry row (shown once,
|
|
253
|
+
// above, marked "(also registered)") so the same repo never appears twice.
|
|
254
|
+
const registryRepos =
|
|
255
|
+
cwd?.alsoRegistered === true && cwd.registeredMirrorPath !== undefined
|
|
256
|
+
? report.repos.filter((r) => r.path !== cwd.registeredMirrorPath)
|
|
257
|
+
: report.repos;
|
|
258
|
+
|
|
259
|
+
if (registryRepos.length === 0) {
|
|
260
|
+
// If the cwd participates we already rendered its local section above (no
|
|
261
|
+
// dead-end). Otherwise keep the existing empty-state.
|
|
262
|
+
if (cwdLines.length === 0) {
|
|
263
|
+
lines.push('No participating repos found.');
|
|
264
|
+
lines.push(
|
|
265
|
+
'(A repo participates iff its work/ tree has lifecycle content in any ' +
|
|
266
|
+
'pool: tasks/ready, tasks/backlog, prds/proposed, prds/ready, ' +
|
|
267
|
+
'notes/observations, or questions.)',
|
|
268
|
+
);
|
|
269
|
+
} else {
|
|
270
|
+
lines.push(
|
|
271
|
+
'Registered repos: (none) — nothing registered in the registry yet.',
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
return lines.join('\n').replace(/\n+$/, '');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
lines.push('Registered repos (registry — arbiter main, fetched):');
|
|
278
|
+
lines.push('');
|
|
279
|
+
const allGroups: CategorisedGroups[] = [];
|
|
280
|
+
for (const repo of registryRepos) {
|
|
281
|
+
const groups = categoriseItems(repo.items);
|
|
282
|
+
allGroups.push(groups);
|
|
283
|
+
lines.push(...formatRepo(repo.path, groups));
|
|
284
|
+
// The one-slug-one-folder LINT (prd `ledger-integrity` story 3): WARN LOUDLY
|
|
285
|
+
// when any slug in this repo's ledger resides in >1 status folder (a corrupt
|
|
286
|
+
// ledger — never a silent pass). Clean ledgers add no lines.
|
|
287
|
+
const warnings = formatDuplicateWarnings(repo.ledgerDuplicates ?? []);
|
|
288
|
+
if (warnings.length > 0) {
|
|
289
|
+
lines.push(...warnings.map((w) => ` ${w}`));
|
|
290
|
+
lines.push('');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const s = summariseGroups(allGroups);
|
|
295
|
+
const repoCount = registryRepos.length;
|
|
296
|
+
const registryItems = registryRepos.reduce((n, r) => n + r.items.length, 0);
|
|
297
|
+
const registryEligible = registryRepos.reduce(
|
|
298
|
+
(n, r) => n + r.items.filter((i) => i.eligibility.eligible).length,
|
|
299
|
+
0,
|
|
300
|
+
);
|
|
301
|
+
lines.push(
|
|
302
|
+
`Registry summary: ${registryItems} item(s) across ${repoCount} ${pluralRepos(repoCount)} — ` +
|
|
303
|
+
`${s.agentClaimable} agent-claimable, ${s.humanOnly} human-only, ` +
|
|
304
|
+
`${s.needsAnswers} needs-answers, ${s.blocked} blocked ` +
|
|
305
|
+
`(${s.ready} ready).`,
|
|
306
|
+
);
|
|
307
|
+
lines.push(
|
|
308
|
+
`Runner verdict: ${registryEligible}/${registryItems} item(s) eligible now ` +
|
|
309
|
+
`(under the current --auto-build policy).`,
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
return lines.join('\n');
|
|
313
|
+
}
|