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/dist/status.d.ts
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { type Harness } from './harness.js';
|
|
2
|
+
import './pi-harness.js';
|
|
3
|
+
import { type JobState } from './workspace.js';
|
|
4
|
+
import { type ArbiterStatusReport } from './arbiter.js';
|
|
5
|
+
import { type LockEntry } from './item-lock.js';
|
|
6
|
+
import type { CwdSection } from './cwd-section.js';
|
|
7
|
+
import { type DuplicateSlug } from './ledger-lint.js';
|
|
8
|
+
/**
|
|
9
|
+
* `dorfl status` — the **operational dashboard of jobs** (ADR §4/§5/§12
|
|
10
|
+
* in `docs/adr/execution-substrate-decisions.md`). Split out of
|
|
11
|
+
* `agent-workspaces` so the substrate stays thin; this module owns the view.
|
|
12
|
+
*
|
|
13
|
+
* It lists the jobs under `<workspacesDir>/work/*` from their
|
|
14
|
+
* `.dorfl-job.json` records + worktree state, grouped by state:
|
|
15
|
+
*
|
|
16
|
+
* - **active** — `running` AND the harness reports the job still alive.
|
|
17
|
+
* - **failed / retained** — everything that wants a human's eye: a job the
|
|
18
|
+
* `needs-attention` mechanism flagged (with its reason, ADR §12), a `done`
|
|
19
|
+
* job whose worktree was never reaped (awaiting cleanup), or a `running`
|
|
20
|
+
* job whose harness reports it DEAD (crashed — the runner died mid-flight).
|
|
21
|
+
*
|
|
22
|
+
* **Liveness comes from the harness seam (PID / session), NOT filesystem mtime**
|
|
23
|
+
* (ADR §5): a live agent can think for minutes without writing files, so mtime
|
|
24
|
+
* would mistake a thinking agent for a dead one. The harness answers liveness
|
|
25
|
+
* from the real signal.
|
|
26
|
+
*
|
|
27
|
+
* **Fetch-first (ADR §5/§6):** the per-mirror lock-ref + one-slug-one-folder
|
|
28
|
+
* lint surfaces are read AFTER refreshing each registered hub mirror's `main` —
|
|
29
|
+
* the old "scan is always offline" framing is RETIRED (it was the roots-local
|
|
30
|
+
* model). A failed mirror fetch is NOT fatal: it WARNS and falls back to that
|
|
31
|
+
* mirror's last-known `main`. The ledger read STRATEGY is unchanged
|
|
32
|
+
* (`claim-ledger-vs-protected-main.md`); `status` only ensures the ref is fresh.
|
|
33
|
+
*
|
|
34
|
+
* It is strictly **read-only**: it inspects records/worktrees; it never claims,
|
|
35
|
+
* runs, moves, or deletes (deletion is `gc`). It reuses the `gc` `discoverJobs`
|
|
36
|
+
* primitive to enumerate jobs (it does NOT re-implement the work-area layout).
|
|
37
|
+
*
|
|
38
|
+
* Distinct from `scan`: `scan` answers "what work is in the *backlog* and who
|
|
39
|
+
* can take it"; `status` answers "what is *running / stuck / awaiting cleanup*
|
|
40
|
+
* right now". The retained-worktree + stuck-lock items are the "look here" set.
|
|
41
|
+
*/
|
|
42
|
+
/** One job as the operational dashboard sees it (a record + its liveness). */
|
|
43
|
+
export interface JobStatus {
|
|
44
|
+
/** The work slug being processed. */
|
|
45
|
+
slug: string;
|
|
46
|
+
/** The encoded repo key the job's hub mirror was cut from. */
|
|
47
|
+
repo: string;
|
|
48
|
+
/** The work branch checked out in the worktree (`work/<slug>`). */
|
|
49
|
+
branch: string;
|
|
50
|
+
/** ISO timestamp the job worktree was created. */
|
|
51
|
+
startedAt: string;
|
|
52
|
+
/** The persisted lifecycle state. */
|
|
53
|
+
state: JobState;
|
|
54
|
+
/** Liveness FROM THE HARNESS SEAM (PID/session), never mtime (ADR §5). */
|
|
55
|
+
alive: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Why the job is stuck (ADR §12), when known — surfaced for the
|
|
58
|
+
* failed/retained group. Present for `needs-attention` jobs that recorded a
|
|
59
|
+
* reason; absent otherwise.
|
|
60
|
+
*/
|
|
61
|
+
reason?: string;
|
|
62
|
+
/**
|
|
63
|
+
* The review-request URL (e.g. a GitHub PR) opened for this job, when a
|
|
64
|
+
* `propose`-mode provider opened one (ADR §6). Surfaced so the human can jump
|
|
65
|
+
* straight to the PR. Absent otherwise.
|
|
66
|
+
*/
|
|
67
|
+
prUrl?: string;
|
|
68
|
+
/** Absolute path to the job worktree (for the human to look). */
|
|
69
|
+
dir: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* One repo's PER-ITEM LOCK refs, surfaced for the dashboard (prd
|
|
73
|
+
* `ledger-status-per-item-lock-refs` US #8; task
|
|
74
|
+
* `needs-attention-as-stuck-lock-state`). The in-flight view read from the lock
|
|
75
|
+
* refs — held (`active` = in-progress) and stuck (`needs-attention`) entries +
|
|
76
|
+
* their reasons — is the SOLE stuck-state surface (the
|
|
77
|
+
* `work/needs-attention/` folder is retired, task
|
|
78
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`).
|
|
79
|
+
*/
|
|
80
|
+
export interface RepoLockEntries {
|
|
81
|
+
/** The repo path whose lock refs were read (a hub-mirror path). */
|
|
82
|
+
repoPath: string;
|
|
83
|
+
/** The held lock entries (action × state + reason), sorted by entry. */
|
|
84
|
+
entries: LockEntry[];
|
|
85
|
+
}
|
|
86
|
+
/** One repo's one-slug-one-folder LINT result, surfaced for the dashboard. */
|
|
87
|
+
export interface RepoLedgerDuplicates {
|
|
88
|
+
/** The repo path whose `work/` ledger was linted (a hub-mirror path). */
|
|
89
|
+
repoPath: string;
|
|
90
|
+
/** The slugs present in more than one status folder (non-empty here). */
|
|
91
|
+
duplicates: DuplicateSlug[];
|
|
92
|
+
}
|
|
93
|
+
/** The operational groups `status` reports. */
|
|
94
|
+
export interface StatusReport {
|
|
95
|
+
/** Running jobs the harness reports still alive. */
|
|
96
|
+
active: JobStatus[];
|
|
97
|
+
/** Stuck (needs-attention), crashed (running-but-dead), or un-reaped (done) jobs. */
|
|
98
|
+
attention: JobStatus[];
|
|
99
|
+
/**
|
|
100
|
+
* The PER-ITEM LOCK in-flight view (prd `ledger-status-per-item-lock-refs` US
|
|
101
|
+
* #8; task `needs-attention-as-stuck-lock-state`): per registered hub mirror,
|
|
102
|
+
* the held lock entries read from the mirror's `refs/dorfl/lock/*` refs —
|
|
103
|
+
* `active` holds (in-progress) and `stuck` holds (needs-attention) + reasons.
|
|
104
|
+
* This is the SOLE stuck-state surface (the `work/needs-attention/` folder is
|
|
105
|
+
* retired, task
|
|
106
|
+
* `cutover-needs-attention-becomes-lock-stuck-recovery-surface`). Only repos
|
|
107
|
+
* WITH at least one held lock appear. Empty when no `mirrorPaths` were given or
|
|
108
|
+
* no locks are held. Optional so older literals stay valid; `status()` always
|
|
109
|
+
* populates it (possibly empty).
|
|
110
|
+
*/
|
|
111
|
+
lockHeld?: RepoLockEntries[];
|
|
112
|
+
/**
|
|
113
|
+
* The one-slug-one-folder LINT (prd `ledger-integrity` story 3): per registered
|
|
114
|
+
* hub mirror, any slug present in MORE THAN ONE `work/` status folder (a corrupt
|
|
115
|
+
* ledger). Read from the mirror's bare `main` ref (the SAME `ls-tree` source the
|
|
116
|
+
* needs-attention surface uses). Only repos WITH a duplicate appear. `status`
|
|
117
|
+
* WARNS loudly about each (never a silent pass); a human resolves it. Empty when
|
|
118
|
+
* no `mirrorPaths` were given or every ledger is clean.
|
|
119
|
+
*/
|
|
120
|
+
ledgerDuplicates?: RepoLedgerDuplicates[];
|
|
121
|
+
/**
|
|
122
|
+
* The current repo's arbiter state (folded in from the old `arbiter status`,
|
|
123
|
+
* ADR §1/§7): which remote, URL/path, exists/bare, main reachable, and the
|
|
124
|
+
* unsafe non-bare-with-main flag. Present only when the CLI resolved one (it is
|
|
125
|
+
* a current-checkout concern); absent for the pure job-area dashboard.
|
|
126
|
+
*/
|
|
127
|
+
arbiter?: ArbiterStatusReport;
|
|
128
|
+
/**
|
|
129
|
+
* The CWD-LOCAL section (the `scan-status-read-cwd-repo` task): when `status`
|
|
130
|
+
* runs INSIDE a participating repo, this is that CURRENT repo read from its
|
|
131
|
+
* LOCAL WORKING TREE (fetch-its-arbiter-first), reported as a DISTINCT,
|
|
132
|
+
* separately-counted block alongside (never merged into) the registry view.
|
|
133
|
+
* Absent when the cwd does not participate or the caller did not resolve it.
|
|
134
|
+
*/
|
|
135
|
+
cwd?: CwdSection;
|
|
136
|
+
}
|
|
137
|
+
export interface StatusOptions {
|
|
138
|
+
/** The execution working area to inspect (config `workspacesDir`). */
|
|
139
|
+
workspacesDir: string;
|
|
140
|
+
/**
|
|
141
|
+
* The harness used to answer liveness (PID/session — never mtime). When given,
|
|
142
|
+
* it answers liveness for EVERY job (tests inject a stub here). When omitted,
|
|
143
|
+
* each job's liveness is answered by the adapter that OWNS its record
|
|
144
|
+
* (`resolveHarness` keyed off the record's `adapter`) — so a `pi` job reports
|
|
145
|
+
* via the pi adapter (PID + session pointer) and a `null` job via the null
|
|
146
|
+
* adapter, never mtime.
|
|
147
|
+
*/
|
|
148
|
+
harness?: Harness;
|
|
149
|
+
/**
|
|
150
|
+
* Hub-mirror PATHS whose lock refs + one-slug-one-folder lint to surface, read
|
|
151
|
+
* from each mirror's BARE `main` ref (mirrors have no working tree). The CLI
|
|
152
|
+
* wires these from the registry's {@link listMirrors}. `status` FETCHES each
|
|
153
|
+
* mirror's `main` first (ADR §5/§6 — the registry's remote is the source of
|
|
154
|
+
* truth); a failed fetch WARNS and falls back to last-known (never errors).
|
|
155
|
+
* Omitted ⇒ only the job worktrees are reported.
|
|
156
|
+
*/
|
|
157
|
+
mirrorPaths?: string[];
|
|
158
|
+
/**
|
|
159
|
+
* Sink for the fetch-first fall-back warning (ADR §5/§6): when a mirror's `main`
|
|
160
|
+
* cannot be fetched, `status` warns through this and reads that mirror's
|
|
161
|
+
* last-known state. The CLI wires it to the standard `>>` stderr note.
|
|
162
|
+
*/
|
|
163
|
+
warn?: (message: string) => void;
|
|
164
|
+
/**
|
|
165
|
+
* The current repo's arbiter state to fold into the dashboard (the old `arbiter
|
|
166
|
+
* status`, ADR §1). The CLI resolves it via `arbiterStatus` for the current
|
|
167
|
+
* checkout; omitted ⇒ no arbiter section.
|
|
168
|
+
*/
|
|
169
|
+
arbiter?: ArbiterStatusReport;
|
|
170
|
+
/**
|
|
171
|
+
* The pre-resolved CWD-LOCAL section (the `scan-status-read-cwd-repo` task).
|
|
172
|
+
* The CLI resolves it via `resolveCwdSection` (cwd participation + fetch-first
|
|
173
|
+
* divergence + registry de-dup) and hands it here; `status` carries it onto the
|
|
174
|
+
* report and `formatStatus` renders it as a distinct local block. Omitted ⇒ no
|
|
175
|
+
* local section.
|
|
176
|
+
*/
|
|
177
|
+
cwd?: CwdSection;
|
|
178
|
+
env?: NodeJS.ProcessEnv;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Build the operational status of every job under `<workspacesDir>/work/*`
|
|
182
|
+
* (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
|
|
183
|
+
* primitive, asks the harness for liveness (NOT mtime), and groups each job as
|
|
184
|
+
* **active** (running + alive) or **failed/retained** (needs-attention, a
|
|
185
|
+
* crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
|
|
186
|
+
* no claim/run/move/delete.
|
|
187
|
+
*/
|
|
188
|
+
export declare function status(options: StatusOptions): Promise<StatusReport>;
|
|
189
|
+
/**
|
|
190
|
+
* Render the operational status for the terminal: an **Active jobs** section and
|
|
191
|
+
* a **Failed / retained jobs** section, each line carrying slug, repo, branch,
|
|
192
|
+
* and started-at — plus, for stuck jobs, the recorded reason, and for a
|
|
193
|
+
* running-but-dead job a `(crashed — no longer alive)` marker.
|
|
194
|
+
*
|
|
195
|
+
* Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
|
|
196
|
+
* NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
|
|
197
|
+
*/
|
|
198
|
+
export declare function formatStatus(report: StatusReport): string;
|
|
199
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,OAAO,EAAC,MAAM,cAAc,CAAC;AAG1D,OAAO,iBAAiB,CAAC;AACzB,OAAO,EAAC,KAAK,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAsB,KAAK,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAsB,KAAK,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAEnE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAGN,KAAK,aAAa,EAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACzB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,0EAA0E;IAC1E,KAAK,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC/B,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACpC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC5B,oDAAoD;IACpD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAkE1E;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgGzD"}
|
package/dist/status.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { discoverJobs } from './gc.js';
|
|
2
|
+
import { resolveHarness } 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 { fetchMirrorMainOrWarn } from './repo-mirror.js';
|
|
7
|
+
import { formatArbiterStatus } from './arbiter.js';
|
|
8
|
+
import { listItemLockEntries } from './item-lock.js';
|
|
9
|
+
import { formatCwdSection, formatLockEntryLines } from './format.js';
|
|
10
|
+
import { lintRefLedger, formatDuplicateWarnings, } from './ledger-lint.js';
|
|
11
|
+
/**
|
|
12
|
+
* Build the operational status of every job under `<workspacesDir>/work/*`
|
|
13
|
+
* (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
|
|
14
|
+
* primitive, asks the harness for liveness (NOT mtime), and groups each job as
|
|
15
|
+
* **active** (running + alive) or **failed/retained** (needs-attention, a
|
|
16
|
+
* crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
|
|
17
|
+
* no claim/run/move/delete.
|
|
18
|
+
*/
|
|
19
|
+
export async function status(options) {
|
|
20
|
+
const active = [];
|
|
21
|
+
const attention = [];
|
|
22
|
+
for (const job of discoverJobs(options.workspacesDir)) {
|
|
23
|
+
const view = toJobStatus(job, options.harness);
|
|
24
|
+
// Active iff the runner believes the job is in flight (`running`) AND the
|
|
25
|
+
// harness confirms it is still alive. Everything else is "look here":
|
|
26
|
+
// - needs-attention: the runner flagged it (gate red, conflict, …)
|
|
27
|
+
// - done: landed but the worktree wasn't reaped (awaiting cleanup)
|
|
28
|
+
// - running but NOT alive: the process died mid-flight (crashed)
|
|
29
|
+
if (view.state === 'running' && view.alive) {
|
|
30
|
+
active.push(view);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
attention.push(view);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
active.sort(bySlug);
|
|
37
|
+
attention.sort(bySlug);
|
|
38
|
+
// The STUCK-STATE surface is now the PER-ITEM LOCK `state: stuck` (task
|
|
39
|
+
// `cutover-needs-attention-becomes-lock-stuck-recovery-surface`, decision i+:
|
|
40
|
+
// the `needs-attention/` folder is retired — NO code reads
|
|
41
|
+
// `work/needs-attention/`). `status` reads the lock refs per mirror to surface
|
|
42
|
+
// held (`active` = in-progress) AND stuck (`needs-attention`) entries + their
|
|
43
|
+
// reasons/questions.
|
|
44
|
+
const lockHeld = [];
|
|
45
|
+
const ledgerDuplicates = [];
|
|
46
|
+
for (const mirrorPath of options.mirrorPaths ?? []) {
|
|
47
|
+
// Fetch-first (ADR §5/§6): refresh this mirror's `main` so the duplicate lint
|
|
48
|
+
// reflects the remote truth. Never fatal — a failed fetch WARNS and falls back
|
|
49
|
+
// to the mirror's last-known `main`.
|
|
50
|
+
fetchMirrorMainOrWarn({ mirrorPath, warn: options.warn, env: options.env });
|
|
51
|
+
// The PER-ITEM LOCK in-flight view (prd US #8): read the mirror's lock refs to
|
|
52
|
+
// surface held (`active` = in-progress) and stuck (`needs-attention`) entries +
|
|
53
|
+
// reasons/questions. A bare hub mirror's arbiter is its `origin` (the SAME
|
|
54
|
+
// handle the `scan` held-slug subtraction reads). Best-effort: a fetch/read
|
|
55
|
+
// fault yields an EMPTY list (see {@link listItemLockEntries}), so this
|
|
56
|
+
// read-only view degrades to "no in-flight locks" rather than erroring.
|
|
57
|
+
const entries = await listItemLockEntries(mirrorPath, 'origin', options.env);
|
|
58
|
+
if (entries.length > 0) {
|
|
59
|
+
lockHeld.push({ repoPath: mirrorPath, entries });
|
|
60
|
+
}
|
|
61
|
+
// The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
|
|
62
|
+
// status folder from the SAME freshly-fetched `main` ref, surfaced LOUDLY.
|
|
63
|
+
const dups = lintRefLedger('main', mirrorPath, options.env);
|
|
64
|
+
if (dups.length > 0) {
|
|
65
|
+
ledgerDuplicates.push({ repoPath: mirrorPath, duplicates: dups });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
lockHeld.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
|
|
69
|
+
ledgerDuplicates.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
|
|
70
|
+
return {
|
|
71
|
+
active,
|
|
72
|
+
attention,
|
|
73
|
+
lockHeld,
|
|
74
|
+
ledgerDuplicates,
|
|
75
|
+
...(options.arbiter ? { arbiter: options.arbiter } : {}),
|
|
76
|
+
...(options.cwd ? { cwd: options.cwd } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function bySlug(a, b) {
|
|
80
|
+
return a.slug.localeCompare(b.slug);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Project a discovered job + its harness liveness into a `JobStatus`. When no
|
|
84
|
+
* harness is forced (the normal case), each record's liveness is answered by the
|
|
85
|
+
* adapter that OWNS it (`resolveHarness`) — a pi job via the pi adapter (PID +
|
|
86
|
+
* session), never mtime.
|
|
87
|
+
*/
|
|
88
|
+
function toJobStatus(job, forced) {
|
|
89
|
+
const record = job.record;
|
|
90
|
+
const harness = forced ?? (record ? resolveHarness(record.harness) : undefined);
|
|
91
|
+
const alive = record !== undefined && harness !== undefined
|
|
92
|
+
? harness.isAlive(record.harness)
|
|
93
|
+
: false;
|
|
94
|
+
return {
|
|
95
|
+
slug: job.slug,
|
|
96
|
+
repo: record?.repoKey ?? '(unknown)',
|
|
97
|
+
branch: job.branch,
|
|
98
|
+
startedAt: record?.startedAt ?? '(unknown)',
|
|
99
|
+
state: record?.state ?? 'running',
|
|
100
|
+
alive,
|
|
101
|
+
reason: record?.reason,
|
|
102
|
+
prUrl: record?.prUrl,
|
|
103
|
+
dir: job.dir,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Render the operational status for the terminal: an **Active jobs** section and
|
|
108
|
+
* a **Failed / retained jobs** section, each line carrying slug, repo, branch,
|
|
109
|
+
* and started-at — plus, for stuck jobs, the recorded reason, and for a
|
|
110
|
+
* running-but-dead job a `(crashed — no longer alive)` marker.
|
|
111
|
+
*
|
|
112
|
+
* Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
|
|
113
|
+
* NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
|
|
114
|
+
*/
|
|
115
|
+
export function formatStatus(report) {
|
|
116
|
+
const lines = [];
|
|
117
|
+
// The cwd-local section (the `scan-status-read-cwd-repo` task): a DISTINCT,
|
|
118
|
+
// separately-counted block for the CURRENT repo's working tree, ABOVE the
|
|
119
|
+
// job/registry dashboard (never merged into the job counts).
|
|
120
|
+
const cwdLines = report.cwd !== undefined ? formatCwdSection(report.cwd) : [];
|
|
121
|
+
const lockHeld = report.lockHeld ?? [];
|
|
122
|
+
const lockCount = lockHeld.reduce((sum, r) => sum + r.entries.length, 0);
|
|
123
|
+
const ledgerDuplicates = report.ledgerDuplicates ?? [];
|
|
124
|
+
const dupCount = ledgerDuplicates.reduce((sum, r) => sum + r.duplicates.length, 0);
|
|
125
|
+
if (report.active.length === 0 &&
|
|
126
|
+
report.attention.length === 0 &&
|
|
127
|
+
lockCount === 0 &&
|
|
128
|
+
dupCount === 0 &&
|
|
129
|
+
report.arbiter === undefined &&
|
|
130
|
+
cwdLines.length === 0) {
|
|
131
|
+
return 'No jobs running or retained (the work area is empty).';
|
|
132
|
+
}
|
|
133
|
+
if (cwdLines.length > 0) {
|
|
134
|
+
lines.push(...cwdLines);
|
|
135
|
+
lines.push('');
|
|
136
|
+
}
|
|
137
|
+
lines.push('Active jobs (running):');
|
|
138
|
+
if (report.active.length === 0) {
|
|
139
|
+
lines.push(' (none)');
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
for (const job of report.active) {
|
|
143
|
+
lines.push(formatJobLine(job));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push('Failed / retained jobs (look here):');
|
|
148
|
+
if (report.attention.length === 0) {
|
|
149
|
+
lines.push(' (none)');
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
for (const job of report.attention) {
|
|
153
|
+
lines.push(formatJobLine(job));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// The PER-ITEM LOCK in-flight view (prd US #8; task
|
|
157
|
+
// `cutover-needs-attention-becomes-lock-stuck-recovery-surface`): the held lock
|
|
158
|
+
// refs read from each mirror — `active` holds (in-progress) and `stuck` holds
|
|
159
|
+
// (needs-attention) + their reasons/questions. This is the SOLE stuck-state
|
|
160
|
+
// surface now (the `needs-attention/` folder is retired).
|
|
161
|
+
if (lockCount > 0) {
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push('In-flight locks (refs/dorfl/lock/* — held + stuck):');
|
|
164
|
+
for (const repo of lockHeld) {
|
|
165
|
+
lines.push(` ${repo.repoPath}`);
|
|
166
|
+
for (const entry of repo.entries) {
|
|
167
|
+
// SHARED renderer (NOT a forked one) so the cwd section
|
|
168
|
+
// (`formatCwdSection`) presents a held/stuck item identically.
|
|
169
|
+
lines.push(...formatLockEntryLines(entry, ' '));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// The one-slug-one-folder LINT (prd `ledger-integrity` story 3): WARN LOUDLY
|
|
174
|
+
// about every slug residing in >1 status folder of a registered mirror's ledger
|
|
175
|
+
// (a corrupt ledger — never a silent pass). A human must resolve each.
|
|
176
|
+
if (dupCount > 0) {
|
|
177
|
+
lines.push('');
|
|
178
|
+
for (const repo of ledgerDuplicates) {
|
|
179
|
+
lines.push(` ${repo.repoPath}`);
|
|
180
|
+
for (const w of formatDuplicateWarnings(repo.duplicates)) {
|
|
181
|
+
lines.push(` ${w}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
lines.push('');
|
|
186
|
+
lines.push(`Summary: ${report.active.length} active, ${report.attention.length} failed/retained job(s)` +
|
|
187
|
+
(lockCount > 0 ? `, ${lockCount} in-flight lock(s)` : '') +
|
|
188
|
+
(dupCount > 0 ? `, ${dupCount} one-slug-one-folder violation(s)` : '') +
|
|
189
|
+
'.');
|
|
190
|
+
// The folded-in arbiter state (ADR §1/§7, the old `arbiter status`).
|
|
191
|
+
if (report.arbiter !== undefined) {
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push(formatArbiterStatus(report.arbiter));
|
|
194
|
+
}
|
|
195
|
+
return lines.join('\n');
|
|
196
|
+
}
|
|
197
|
+
/** One `slug repo branch started-at [marker]` job line, with reason below. */
|
|
198
|
+
function formatJobLine(job) {
|
|
199
|
+
const marker = jobMarker(job);
|
|
200
|
+
const head = ` ${job.slug} ${job.repo} ${job.branch} started ${job.startedAt}${marker}`;
|
|
201
|
+
const extra = [];
|
|
202
|
+
if (job.reason !== undefined && job.reason !== '') {
|
|
203
|
+
extra.push(` reason: ${job.reason}`);
|
|
204
|
+
}
|
|
205
|
+
if (job.prUrl !== undefined && job.prUrl !== '') {
|
|
206
|
+
extra.push(` PR: ${job.prUrl}`);
|
|
207
|
+
}
|
|
208
|
+
return extra.length > 0 ? [head, ...extra].join('\n') : head;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* A trailing marker that explains WHY a non-active job is in the look-here group:
|
|
212
|
+
* a `running` job the harness reports dead is a **crashed** runner; a `done` job
|
|
213
|
+
* is **awaiting cleanup** (`gc` will reap it); a `needs-attention` job is
|
|
214
|
+
* **stuck** (its reason is rendered separately).
|
|
215
|
+
*/
|
|
216
|
+
function jobMarker(job) {
|
|
217
|
+
if (job.state === 'running' && !job.alive) {
|
|
218
|
+
return ' (crashed — no longer alive)';
|
|
219
|
+
}
|
|
220
|
+
if (job.state === 'done') {
|
|
221
|
+
return ' (done — awaiting cleanup)';
|
|
222
|
+
}
|
|
223
|
+
if (job.state === 'needs-attention') {
|
|
224
|
+
return ' (needs attention)';
|
|
225
|
+
}
|
|
226
|
+
return '';
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { type Harness } from './harness.js';
|
|
2
|
+
import type { NewQuestion } from './sidecar.js';
|
|
3
|
+
/**
|
|
4
|
+
* The **SURFACE gate** (prd `advance-loop`, task `advance-rung-surface`,
|
|
5
|
+
* US #32/33) — the surface-question rung's fresh-context spawn, the DIRECT mirror
|
|
6
|
+
* of the PR/code review gate ({@link import('./review-gate.js')}). On
|
|
7
|
+
* `classify=surface`, the advance engine spawns a FRESH-CONTEXT agent with the
|
|
8
|
+
* `surface-questions` SKILL loaded (`skills/surface-questions/SKILL.md`); the
|
|
9
|
+
* skill GATHERS the item's open-judgement residue and EMITS questions and writes
|
|
10
|
+
* NOTHING (doc-shaped, like `review`). The ENGINE then ITSELF persists them to
|
|
11
|
+
* the sidecar CAS-atomically + sets `needsAnswers:true` (task
|
|
12
|
+
* `advance-rung-surface`'s persist half) — **the skill JUDGES, the engine
|
|
13
|
+
* PERSISTS.**
|
|
14
|
+
*
|
|
15
|
+
* This module is the SEAM (the {@link SurfaceGate} function type) + its
|
|
16
|
+
* production harness-backed implementation ({@link harnessSurfaceGate}), exactly
|
|
17
|
+
* as `review-gate.ts` is the seam + `harnessReviewGate`. The seam is injectable:
|
|
18
|
+
* tests stub a canned emitted-questions list (no real model); production launches
|
|
19
|
+
* the `surface-questions` agent through the EXISTING harness seam
|
|
20
|
+
* ({@link Harness}/`LaunchInput`), routing an optional `surfaceModel` override
|
|
21
|
+
* through `LaunchInput.model` — NOT a new model/launch mechanism (the §13
|
|
22
|
+
* model-routing intent). It mirrors `harnessReviewGate` byte-for-byte in shape;
|
|
23
|
+
* only the PROMPT ({@link buildSurfacePrompt}) and the parsed payload
|
|
24
|
+
* ({@link parseSurfaceEmit}, a `{questions}` list rather than a `{verdict}`)
|
|
25
|
+
* differ.
|
|
26
|
+
*
|
|
27
|
+
* ALWAYS-allowed: there is NO gate check before surfacing — surfacing a question
|
|
28
|
+
* is never gated, even with every autonomy flag off (the "question loop with zero
|
|
29
|
+
* autonomy" case, US #23). The expensive (agent/model) work is POST-lock,
|
|
30
|
+
* winner-only — but that sequencing is the ENGINE's job (`advance.ts`); this
|
|
31
|
+
* module is only the spawn→emit→parse.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* One question the `surface-questions` skill EMITS — the THREE authoring fields of
|
|
35
|
+
* the sidecar entry shape (`skills/surface-questions/SKILL.md` → "The emitted
|
|
36
|
+
* question shape"). It maps 1:1 onto {@link NewQuestion} (what the engine appends
|
|
37
|
+
* to the sidecar), so the engine persists with ZERO translation. The skill does
|
|
38
|
+
* NOT assign `id`/`answered`/`answer`/`allAnswered` — those are the sidecar's
|
|
39
|
+
* machine-owned fields the engine owns. A surfaced question is a PLAIN question:
|
|
40
|
+
* there is NO `disposition` token any more (task
|
|
41
|
+
* `agentic-apply-retire-disposition-vocabulary`) — what to DO with the answered
|
|
42
|
+
* signal is decided by the AGENTIC apply decision, not stamped on the question.
|
|
43
|
+
*/
|
|
44
|
+
export interface SurfaceQuestion {
|
|
45
|
+
/** The question, verbatim. */
|
|
46
|
+
question: string;
|
|
47
|
+
/** Inline context so the human need not open the item. */
|
|
48
|
+
context?: string;
|
|
49
|
+
/** Optional suggested default (the humility aid; NEVER a decision). */
|
|
50
|
+
default?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* What the `surface-questions` SKILL emits (and this gate parses): the item's
|
|
54
|
+
* identity (orientation only) + an ORDERED list of questions. An EMPTY list is a
|
|
55
|
+
* valid, honest result ("no open judgement") — the engine writes no sidecar.
|
|
56
|
+
*/
|
|
57
|
+
export interface SurfaceEmit {
|
|
58
|
+
/** The namespaced identity the skill surfaced for (orientation; advisory). */
|
|
59
|
+
item?: string;
|
|
60
|
+
/** The ordered emitted questions (possibly empty). */
|
|
61
|
+
questions: SurfaceQuestion[];
|
|
62
|
+
}
|
|
63
|
+
/** What the surface gate needs to launch a fresh-context surface of one item. */
|
|
64
|
+
export interface SurfaceGateInput {
|
|
65
|
+
/** The namespaced identity the surface is for (`task:foo` / `prd:bar` / `observation:baz`). */
|
|
66
|
+
item: string;
|
|
67
|
+
/** The working clone/checkout the gate runs in. */
|
|
68
|
+
cwd: string;
|
|
69
|
+
/**
|
|
70
|
+
* The model the SURFACE agent runs on. `undefined` ⇒ no forced model (the
|
|
71
|
+
* harness's own default). Flows to the launch through `LaunchInput.model`.
|
|
72
|
+
*/
|
|
73
|
+
surfaceModel?: string;
|
|
74
|
+
/** Environment for the surface-agent launch. */
|
|
75
|
+
env?: NodeJS.ProcessEnv;
|
|
76
|
+
/** `--watch`: tail the surface agent's pi session live (pure observer). */
|
|
77
|
+
watch?: boolean;
|
|
78
|
+
/** Where the tailed surface lines are written (defaults to stderr). */
|
|
79
|
+
watchSink?: (line: string) => void;
|
|
80
|
+
/** Emit ANSI colour in the tailed surface lines (the caller's TTY decision). */
|
|
81
|
+
color?: boolean;
|
|
82
|
+
/** The HOST-ONLY sessions root the surface session FILE is generated under. */
|
|
83
|
+
sessionsDir?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The surface-gate SEAM: run a fresh-context surface of the item and return the
|
|
87
|
+
* parsed emitted questions. Injected by tests (a canned list, no real model);
|
|
88
|
+
* production uses {@link harnessSurfaceGate}. Mirrors `review-gate.ts`'s
|
|
89
|
+
* `ReviewGate` seam shape so the engine wiring is testable as pure logic.
|
|
90
|
+
*/
|
|
91
|
+
export type SurfaceGate = (input: SurfaceGateInput) => Promise<SurfaceEmit>;
|
|
92
|
+
/** Raised when the surface agent ran but produced no parseable emit. */
|
|
93
|
+
export declare class SurfaceParseError extends Error {
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parse the `surface-questions` SKILL's emitted questions out of the surface
|
|
97
|
+
* agent's textual output. The skill emits a `{item, questions:[…]}` JSON object
|
|
98
|
+
* (the agent may wrap it in prose / a fenced block), so we extract the first JSON
|
|
99
|
+
* object carrying a `questions` field and validate its shape. An EMPTY
|
|
100
|
+
* `questions` list is VALID (the honest "no open judgement" result). Throws
|
|
101
|
+
* {@link SurfaceParseError} when no valid emit is present (the caller treats an
|
|
102
|
+
* unparseable emit as an error — never a silent "surfaced nothing").
|
|
103
|
+
*
|
|
104
|
+
* The emit MAY also carry a free-prose `note` field (the surface counterpart of
|
|
105
|
+
* the verdict's `review`): a HOME inside the object for the agent's reasoning /
|
|
106
|
+
* findings so it never needs to write prose AROUND the JSON (the cause of the
|
|
107
|
+
* "no parseable {questions}" trailing-chatter failure — observation
|
|
108
|
+
* `surface-rung-agent-emits-no-parseable-questions`). The engine does not
|
|
109
|
+
* persist `note`, so it is simply IGNORED here (like every unrecognised field);
|
|
110
|
+
* the prompt's job is to give the prose a place to go, not the parser's to keep
|
|
111
|
+
* it.
|
|
112
|
+
*/
|
|
113
|
+
export declare function parseSurfaceEmit(output: string): SurfaceEmit;
|
|
114
|
+
/**
|
|
115
|
+
* Convert the emitted questions to the {@link NewQuestion} shape the engine
|
|
116
|
+
* appends to the sidecar — a 1:1 field map (the emit shape IS the sidecar
|
|
117
|
+
* authoring shape, by design), so the engine persists with ZERO translation.
|
|
118
|
+
*/
|
|
119
|
+
export declare function toNewQuestions(emit: SurfaceEmit): NewQuestion[];
|
|
120
|
+
/**
|
|
121
|
+
* Render the surface-agent PROMPT: instruct a fresh-context agent to apply the
|
|
122
|
+
* **surface-questions discipline** (`work/protocol/SURFACE-PROTOCOL.md`) to ONE
|
|
123
|
+
* `work/` item and to EMIT a single `{item, questions}` JSON object (so
|
|
124
|
+
* {@link parseSurfaceEmit} can read it). The discipline body (the two laws —
|
|
125
|
+
* GATHER-only / PERSIST-NEVER — the humility rule, the composed sources, the
|
|
126
|
+
* emitted-question shape) lives in `SURFACE-PROTOCOL.md` — NOT inlined here
|
|
127
|
+
* (task `surface-protocol-doc-and-prompt`). The shape's source of truth is
|
|
128
|
+
* {@link parseSurfaceEmit}; the doc DESCRIBES it (D2).
|
|
129
|
+
*
|
|
130
|
+
* This builder owns ONLY the PER-BUILDER framing: who you are (a fresh-context
|
|
131
|
+
* question-surfacer, the engine's surface-question rung), what you are
|
|
132
|
+
* surfacing (ONE namespaced item), and the required JSON output shape. It
|
|
133
|
+
* MIRRORS {@link buildReviewPrompt}: a fresh-context agent that EDITS nothing
|
|
134
|
+
* and EMITS a single structured object the ENGINE routes/persists.
|
|
135
|
+
*/
|
|
136
|
+
export declare function buildSurfacePrompt(item: string): string;
|
|
137
|
+
/** What a harness-backed surface gate needs to launch the surface agent. */
|
|
138
|
+
export interface HarnessSurfaceGateOptions {
|
|
139
|
+
/** The harness seam used to launch the fresh-context surface agent. */
|
|
140
|
+
harness?: Harness;
|
|
141
|
+
/** The agent command the null/shell adapter shells out to (`{model}`-aware). */
|
|
142
|
+
agentCmd?: string;
|
|
143
|
+
/**
|
|
144
|
+
* Read the surface agent's textual output for parsing. Production reads
|
|
145
|
+
* `launched.output` (the ANSWER channel, distinct from `detail`); tests inject
|
|
146
|
+
* `readOutput` to stub a canned emit string.
|
|
147
|
+
*/
|
|
148
|
+
readOutput?: (output: string | undefined) => string;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The PRODUCTION surface gate: launch the `surface-questions` SKILL as a
|
|
152
|
+
* fresh-context agent through the EXISTING harness seam, routing the
|
|
153
|
+
* `surfaceModel` override via `LaunchInput.model` (the §13 model-routing intent —
|
|
154
|
+
* NOT a new mechanism), then parse the emitted `{item, questions}`. It is the
|
|
155
|
+
* DIRECT mirror of `harnessReviewGate`: a SEPARATE harness launch (fresh context
|
|
156
|
+
* = not the engine's session) in the same checkout `cwd`, fed
|
|
157
|
+
* {@link buildSurfacePrompt}; the model flows through `LaunchInput.model`, which
|
|
158
|
+
* each adapter injects natively. The surface uses a DISTINCT session id
|
|
159
|
+
* (`<item>-surface`) so its session never collides with a build/review session.
|
|
160
|
+
*/
|
|
161
|
+
export declare function harnessSurfaceGate(options?: HarnessSurfaceGateOptions): SurfaceGate;
|
|
162
|
+
//# sourceMappingURL=surface-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-gate.d.ts","sourceRoot":"","sources":["../src/surface-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAC,MAAM,cAAc,CAAC;AAKvD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAChC,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE5E,wEAAwE;AACxE,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAgB5D;AAsCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAW/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuDvD;AAED,4EAA4E;AAC5E,MAAM,WAAW,yBAAyB;IACzC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;CACpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,WAAW,CA0Cb"}
|