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,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `install-ci` orchestrator (prd `runner-in-ci`, task
|
|
3
|
+
* `install-ci-core-and-github-adapter`): ties the provider-agnostic core
|
|
4
|
+
* (`install-ci-core.ts`) to a CI-provider adapter (the first being GitHub,
|
|
5
|
+
* `install-ci-github.ts`) through the {@link CIProviderContext} seam. It drives
|
|
6
|
+
* three paths from ONE config shape so they cannot diverge:
|
|
7
|
+
*
|
|
8
|
+
* - the interactive WIZARD (prompts via the injectable {@link WizardPrompts}
|
|
9
|
+
* seam — production wires readline; tests inject a deterministic stub);
|
|
10
|
+
* - the non-interactive `--config <file>` path (loads the same shape, no prompts);
|
|
11
|
+
* - `--export-config` (+ `--include-secrets`) which round-trips the gathered
|
|
12
|
+
* config back to JSON.
|
|
13
|
+
*
|
|
14
|
+
* The artifacts (composite setup action + auth) are assembled by the core and
|
|
15
|
+
* written under `.fake/` in `--fake` snapshot mode (NEVER `.github/`, NO real
|
|
16
|
+
* secret), so the SAME inputs produce byte-identical output whether gathered
|
|
17
|
+
* interactively or from a config file (the equivalence the task pins).
|
|
18
|
+
*/
|
|
19
|
+
import { writeFileSync, readFileSync, existsSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { DEFAULT_HARNESS, loadCIConfigFile, resolveCIConfig, exportCIConfig, orchestrateSecrets, buildSetupArtifacts, writeArtifacts, } from './install-ci-core.js';
|
|
22
|
+
import { installCIBranchProtectionStep, } from './install-ci-branch-protection.js';
|
|
23
|
+
/**
|
|
24
|
+
* Run `install-ci`. Resolves the config (config-file path or the wizard), then
|
|
25
|
+
* either exports it (`--export-config`) or generates the artifacts. In `--fake`
|
|
26
|
+
* mode it writes to `.fake/` and sets NO real secret; otherwise it orchestrates
|
|
27
|
+
* the required secrets through the provider seam. Returns a structured result.
|
|
28
|
+
*/
|
|
29
|
+
export async function installCI(options) {
|
|
30
|
+
const log = options.log ?? ((line) => console.log(line));
|
|
31
|
+
const fake = options.fake ?? false;
|
|
32
|
+
// 1. Resolve the config: the config-file path (no prompts) or the wizard.
|
|
33
|
+
let file;
|
|
34
|
+
let knownSecrets;
|
|
35
|
+
if (options.configFile) {
|
|
36
|
+
file = loadCIConfigFile(options.configFile);
|
|
37
|
+
knownSecrets = file.secrets;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
if (!options.prompts) {
|
|
41
|
+
throw new Error('install-ci: an interactive run needs a prompt seam (or pass --config)');
|
|
42
|
+
}
|
|
43
|
+
file = await runWizard(options.prompts);
|
|
44
|
+
}
|
|
45
|
+
const config = resolveCIConfig(file);
|
|
46
|
+
// An EXPLICIT --install-source flag wins over the config file's value and is
|
|
47
|
+
// folded in BEFORE the export so it round-trips through --export-config. The
|
|
48
|
+
// package.json AUTO-DETECTION (below) is applied AFTER the export early-return
|
|
49
|
+
// instead, so it is NOT baked into an exported config (a consumer re-running
|
|
50
|
+
// from that export must not silently inherit the monorepo's workspace mode).
|
|
51
|
+
const explicitInstallSource = options.installSource ?? file.installSource ?? undefined;
|
|
52
|
+
if (options.installSource) {
|
|
53
|
+
config.installSource = options.installSource;
|
|
54
|
+
}
|
|
55
|
+
// An EXPLICIT --max-parallel flag wins over the config file's value and is
|
|
56
|
+
// folded in BEFORE the export so it round-trips through --export-config.
|
|
57
|
+
if (options.maxParallel !== undefined) {
|
|
58
|
+
config.maxParallel = options.maxParallel;
|
|
59
|
+
}
|
|
60
|
+
// 2. --export-config: round-trip the gathered config back to JSON and exit.
|
|
61
|
+
if (options.exportConfig) {
|
|
62
|
+
let secrets;
|
|
63
|
+
if (options.includeSecrets) {
|
|
64
|
+
secrets = await gatherSecretsForExport(file, options.prompts);
|
|
65
|
+
}
|
|
66
|
+
writeFileSync(options.exportConfig, exportCIConfig(config, secrets), 'utf8');
|
|
67
|
+
log(`Config written to ${options.exportConfig}`);
|
|
68
|
+
return { outcome: 'exported', config, written: [], secrets: [] };
|
|
69
|
+
}
|
|
70
|
+
// 2b. Auto-detect the WORKSPACE install source: when no explicit flag/config
|
|
71
|
+
// value was given AND <workDir>/package.json is the dorfl monorepo,
|
|
72
|
+
// build the CLI from source instead of pulling the (unpublished) registry
|
|
73
|
+
// package. A single exact-name check (NOT a fuzzy "dorfl" match, or
|
|
74
|
+
// it would wrongly trip in a consumer repo named similarly). A missing or
|
|
75
|
+
// unparseable package.json stays `registry` (the error is swallowed). This
|
|
76
|
+
// runs AFTER the export early-return so it is never baked into an export.
|
|
77
|
+
if (!explicitInstallSource) {
|
|
78
|
+
try {
|
|
79
|
+
const pkgPath = join(options.ctx.workDir, 'package.json');
|
|
80
|
+
if (existsSync(pkgPath)) {
|
|
81
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
82
|
+
if (pkg.name === 'dorfl-monorepo') {
|
|
83
|
+
config.installSource = 'workspace';
|
|
84
|
+
log('📦 Detected dorfl monorepo — using workspace install mode (build from source)');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore — not the dorfl monorepo (missing/unparseable pkg).
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// 3. Orchestrate secrets — SKIPPED in --fake mode (no real secret touched).
|
|
93
|
+
let secrets = [];
|
|
94
|
+
if (fake) {
|
|
95
|
+
log('--fake: skipping secret setup (no real secret is set)');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
secrets = await orchestrateSecrets({
|
|
99
|
+
ctx: options.ctx,
|
|
100
|
+
config,
|
|
101
|
+
knownSecrets,
|
|
102
|
+
prompt: options.prompts
|
|
103
|
+
? (name) => options.prompts.password(`Enter the value for secret ${name}:`)
|
|
104
|
+
: undefined,
|
|
105
|
+
// The PR-identity token is OPTIONAL: phrase it as such, and Enter-to-skip
|
|
106
|
+
// leaves the legs on the built-in GITHUB_TOKEN fallback (zero-config).
|
|
107
|
+
optionalPrompt: options.prompts
|
|
108
|
+
? (name) => options.prompts.password(`Optional: GitHub token for the CI legs to open PRs under your ` +
|
|
109
|
+
`identity (stored as secret ${name}; a PAT or App token). ` +
|
|
110
|
+
`Leave blank to use the built-in GITHUB_TOKEN:`)
|
|
111
|
+
: undefined,
|
|
112
|
+
});
|
|
113
|
+
for (const r of secrets) {
|
|
114
|
+
if (r.status === 'set')
|
|
115
|
+
log(` secret ${r.name}: set`);
|
|
116
|
+
else if (r.status === 'skipped')
|
|
117
|
+
log(` secret ${r.name}: skipped (empty)`);
|
|
118
|
+
else
|
|
119
|
+
log(` secret ${r.name}: FAILED (${r.error})`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 4. Optionally offer the GitHub delete_branch_on_merge repo-setting (the
|
|
123
|
+
// capability-F residue): ONLY when offered + confirmed, NEVER silent.
|
|
124
|
+
if (!fake &&
|
|
125
|
+
options.prompts &&
|
|
126
|
+
options.ctx.setRepoSetting &&
|
|
127
|
+
options.ctx.repo) {
|
|
128
|
+
const wanted = await options.prompts.confirm("Enable GitHub's 'Automatically delete head branches' (delete_branch_on_merge)?", { default: false });
|
|
129
|
+
if (wanted) {
|
|
130
|
+
try {
|
|
131
|
+
await options.ctx.setRepoSetting('delete_branch_on_merge', true);
|
|
132
|
+
log(' repo setting delete_branch_on_merge: enabled');
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
log(` repo setting delete_branch_on_merge: FAILED (${err instanceof Error ? err.message : String(err)})`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// 5. Assemble + write the artifacts (composite setup action + auth). The
|
|
140
|
+
// project-setup escape hatch (prd `install-ci-project-provisioning`) lives
|
|
141
|
+
// on `config.projectSetup` as a PROVIDER-NAMESPACED, OPAQUE map; we look up
|
|
142
|
+
// THIS provider's payload via the seam (`ctx.providerId`) and ask the
|
|
143
|
+
// adapter to render it to the FIRST-steps fragment (`ctx.renderProjectSetup`).
|
|
144
|
+
// Absent payload / missing seam method ⇒ no fragment ⇒ byte-identical to the
|
|
145
|
+
// no-hook baseline (the load-bearing contract this hook preserves).
|
|
146
|
+
let projectSetupSteps;
|
|
147
|
+
const providerId = options.ctx.providerId;
|
|
148
|
+
const payload = providerId && config.projectSetup
|
|
149
|
+
? config.projectSetup[providerId]
|
|
150
|
+
: undefined;
|
|
151
|
+
if (payload !== undefined && options.ctx.renderProjectSetup) {
|
|
152
|
+
projectSetupSteps = options.ctx.renderProjectSetup(payload);
|
|
153
|
+
}
|
|
154
|
+
const files = buildSetupArtifacts(config, options.capabilities ?? [], {
|
|
155
|
+
projectSetupSteps,
|
|
156
|
+
});
|
|
157
|
+
const written = writeArtifacts({ workDir: options.ctx.workDir, fake, files });
|
|
158
|
+
for (const path of written) {
|
|
159
|
+
log(` wrote ${path}`);
|
|
160
|
+
}
|
|
161
|
+
// 5b. Tier-1 GitHub branch protection (prd land-time-reverify-and-parallel-
|
|
162
|
+
// merge-ceiling, Story 11). Auto-configures when the credential is admin-
|
|
163
|
+
// scoped (one `gh api` PUT on the protection endpoint, required check
|
|
164
|
+
// `verify` + strict: true); prints the exact ready-to-run `gh api` command
|
|
165
|
+
// + manual UI fallback when not. Skipped in --fake (no real API touched);
|
|
166
|
+
// skipped on a non-GitHub provider (the seam method is absent there).
|
|
167
|
+
const branchProtection = await installCIBranchProtectionStep({
|
|
168
|
+
ctx: options.ctx,
|
|
169
|
+
fake,
|
|
170
|
+
log,
|
|
171
|
+
});
|
|
172
|
+
// CI-autonomy posture (task `install-ci-emits-no-gate-env-let-config-decide`):
|
|
173
|
+
// the emitted advance workflow carries NO DORFL_AUTO_BUILD /
|
|
174
|
+
// DORFL_AUTO_TASK / DORFL_OBSERVATION_TRIAGE /
|
|
175
|
+
// DORFL_SURFACE_BLOCKERS env line. Gate policy is resolved through the
|
|
176
|
+
// same `flag > env > per-repo > global > default` chain the engine uses
|
|
177
|
+
// everywhere, so CI is treated like any other config consumer. A config-less
|
|
178
|
+
// repo therefore lands on the strict built-in defaults (autoBuild: false,
|
|
179
|
+
// autoTask: false, observationTriage: 'off', surfaceBlockers: false) and CI
|
|
180
|
+
// claims nothing until you opt in. Tell the user that loudly so a now-quiet CI
|
|
181
|
+
// is not a surprise, and how to enable it.
|
|
182
|
+
log('');
|
|
183
|
+
log("CI autonomy is OFF by default (the engine's strict default).");
|
|
184
|
+
log('The emitted advance workflow sets NO DORFL_* gate env, so your\n' +
|
|
185
|
+
' committed .dorfl.json wins (precedence: flag > env > per-repo > global > default).');
|
|
186
|
+
log('To enable CI autonomy, EITHER:');
|
|
187
|
+
log(' - set the gate(s) in `.dorfl.json` (applies everywhere), e.g.\n' +
|
|
188
|
+
' { "autoBuild": true, "autoTask": true }');
|
|
189
|
+
log(" - OR add the env var(s) to the workflow's `env:` block yourself (CI-only override), e.g.\n" +
|
|
190
|
+
" DORFL_AUTO_BUILD: 'true'\n" +
|
|
191
|
+
" DORFL_AUTO_TASK: 'true'");
|
|
192
|
+
// Project-toolchain boundary (task install-ci-document-toolchain-boundary,
|
|
193
|
+
// PRD install-ci-project-provisioning axis (A)). dorfl declares
|
|
194
|
+
// engines.node '>=18' and the generated composite action pins Node 22 only
|
|
195
|
+
// for dorfl's own runtime — it does NOT provision the project's toolchain.
|
|
196
|
+
// State that boundary explicitly so a maintainer whose project pins a
|
|
197
|
+
// different Node/pnpm version (or uses rust / system packages) is never
|
|
198
|
+
// silently broken: the project-setup hook (sibling task
|
|
199
|
+
// install-ci-project-setup-hook) is the SUPPORTED escape hatch; without
|
|
200
|
+
// it the conflicting case is unsupported. install-ci does NOT sniff
|
|
201
|
+
// .nvmrc / packageManager / rust-toolchain.toml — the boundary is
|
|
202
|
+
// documentation, not detection.
|
|
203
|
+
log('');
|
|
204
|
+
log("Project toolchain: the generated composite action provisions ONLY dorfl's own runtime (Node 22 for engines.node '>=18').");
|
|
205
|
+
log('It does NOT provision your project toolchain (a project-pinned pnpm/Node, rust, system packages, `pnpm install` of your deps).');
|
|
206
|
+
log('A custom or conflicting project toolchain is supported ONLY via the project-setup hook (task install-ci-project-setup-hook);');
|
|
207
|
+
log('without that hook the conflicting case is unsupported. install-ci does NOT detect likely conflicts — this is a documented boundary.');
|
|
208
|
+
return { outcome: 'generated', config, written, secrets, branchProtection };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Gather the secret values for `--include-secrets` (the export path): take known
|
|
212
|
+
* values from the loaded file, else prompt. Returns the deduped name→value map.
|
|
213
|
+
*/
|
|
214
|
+
async function gatherSecretsForExport(file, prompts) {
|
|
215
|
+
const config = resolveCIConfig(file);
|
|
216
|
+
const secrets = { ...(file.secrets ?? {}) };
|
|
217
|
+
if (!prompts) {
|
|
218
|
+
return secrets;
|
|
219
|
+
}
|
|
220
|
+
const { requiredSecretNames, optionalSecretNames } = await import('./install-ci-core.js');
|
|
221
|
+
for (const name of requiredSecretNames(config)) {
|
|
222
|
+
if (secrets[name] !== undefined)
|
|
223
|
+
continue;
|
|
224
|
+
const value = await prompts.password(`Enter the value for secret ${name}:`);
|
|
225
|
+
if (value)
|
|
226
|
+
secrets[name] = value;
|
|
227
|
+
}
|
|
228
|
+
// The OPTIONAL PR-identity token: offered (blank ⇒ omitted, never an empty
|
|
229
|
+
// value), so an exported config can carry it without it ever being required.
|
|
230
|
+
for (const name of optionalSecretNames(config)) {
|
|
231
|
+
if (secrets[name] !== undefined)
|
|
232
|
+
continue;
|
|
233
|
+
const value = await prompts.password(`Optional: GitHub token for CI to open PRs under your identity ` +
|
|
234
|
+
`(secret ${name}; a PAT or App token). Leave blank to use GITHUB_TOKEN:`);
|
|
235
|
+
if (value)
|
|
236
|
+
secrets[name] = value;
|
|
237
|
+
}
|
|
238
|
+
return secrets;
|
|
239
|
+
}
|
|
240
|
+
// ─── The interactive wizard ──────────────────────────────────────────────────
|
|
241
|
+
/**
|
|
242
|
+
* The interactive wizard: gather the auth mode, providers/models (models-json) or
|
|
243
|
+
* the default provider/model (auth-json), and the harness, into a
|
|
244
|
+
* {@link CIConfigFile}. Drives the {@link WizardPrompts} seam, so it runs
|
|
245
|
+
* deterministically in tests and the gathered shape exactly equals a config-file
|
|
246
|
+
* input — the equivalence the snapshot test pins. Mirrors whitesmith's prompt
|
|
247
|
+
* flow (provider type → key env var → models → defaults).
|
|
248
|
+
*/
|
|
249
|
+
export async function runWizard(prompts) {
|
|
250
|
+
const authMode = await prompts.select('Auth mode:', [
|
|
251
|
+
{
|
|
252
|
+
name: 'models.json (default — one GitHub secret per provider key)',
|
|
253
|
+
value: 'models-json',
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
name: 'auth.json (single PI_AUTH_JSON + GH_PAT + OAuth refresh — the sharp edge)',
|
|
257
|
+
value: 'auth-json',
|
|
258
|
+
},
|
|
259
|
+
]);
|
|
260
|
+
const harness = await prompts.select('Agent harness:', [
|
|
261
|
+
{ name: 'pi (the pi coding agent)', value: 'pi' },
|
|
262
|
+
{ name: 'null (shell out to a configured agentCmd)', value: 'null' },
|
|
263
|
+
]);
|
|
264
|
+
if (authMode === 'auth-json') {
|
|
265
|
+
// auth.json mode: no per-provider keys, but the harness still needs a
|
|
266
|
+
// default provider/model for its invocations.
|
|
267
|
+
const defaultProvider = await prompts.input('Default AI provider:', {
|
|
268
|
+
default: 'anthropic',
|
|
269
|
+
});
|
|
270
|
+
const defaultModel = await prompts.input('Default AI model:', {
|
|
271
|
+
default: 'claude-sonnet-4-20250514',
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
authMode,
|
|
275
|
+
providers: [],
|
|
276
|
+
defaultProvider,
|
|
277
|
+
defaultModel,
|
|
278
|
+
harness,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const providers = await promptProviders(prompts);
|
|
282
|
+
const { defaultProvider, defaultModel } = await promptDefaults(prompts, providers);
|
|
283
|
+
return { authMode, providers, defaultProvider, defaultModel, harness };
|
|
284
|
+
}
|
|
285
|
+
/** Prompt for one or more providers (the models-json path). */
|
|
286
|
+
async function promptProviders(prompts) {
|
|
287
|
+
const providers = [];
|
|
288
|
+
let addMore = true;
|
|
289
|
+
while (addMore) {
|
|
290
|
+
const type = await prompts.select(providers.length === 0 ? 'Add a provider:' : 'Add another provider:', [
|
|
291
|
+
{ name: 'Anthropic (built-in, needs API key)', value: 'anthropic' },
|
|
292
|
+
{ name: 'OpenAI (built-in, needs API key)', value: 'openai' },
|
|
293
|
+
{ name: 'Custom provider', value: 'custom' },
|
|
294
|
+
]);
|
|
295
|
+
providers.push(type === 'custom'
|
|
296
|
+
? await promptCustomProvider(prompts)
|
|
297
|
+
: await promptBuiltinProvider(prompts, type));
|
|
298
|
+
addMore = await prompts.confirm('Add another provider?', { default: false });
|
|
299
|
+
}
|
|
300
|
+
return providers;
|
|
301
|
+
}
|
|
302
|
+
/** Prompt for a built-in provider (`anthropic` / `openai`). */
|
|
303
|
+
async function promptBuiltinProvider(prompts, type) {
|
|
304
|
+
const defaultEnvVar = type === 'anthropic' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';
|
|
305
|
+
const defaultModel = type === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o';
|
|
306
|
+
const apiKeyEnvVar = await prompts.input('GitHub secret name for the API key:', {
|
|
307
|
+
default: defaultEnvVar,
|
|
308
|
+
});
|
|
309
|
+
const baseUrl = await prompts.input('Custom base URL (blank for default):');
|
|
310
|
+
const models = await promptModels(prompts, defaultModel);
|
|
311
|
+
return {
|
|
312
|
+
name: type,
|
|
313
|
+
baseUrl: baseUrl || undefined,
|
|
314
|
+
apiKeyEnvVar,
|
|
315
|
+
models,
|
|
316
|
+
builtin: true,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
/** Prompt for a custom provider. */
|
|
320
|
+
async function promptCustomProvider(prompts) {
|
|
321
|
+
const name = await prompts.input('Provider name:');
|
|
322
|
+
const baseUrl = await prompts.input('Base URL:');
|
|
323
|
+
const api = await prompts.select('API type:', [
|
|
324
|
+
{ name: 'Anthropic Messages API', value: 'anthropic-messages' },
|
|
325
|
+
{ name: 'OpenAI Completions API', value: 'openai-completions' },
|
|
326
|
+
]);
|
|
327
|
+
const apiKeyEnvVar = await prompts.input('GitHub secret name for the API key:');
|
|
328
|
+
let compat;
|
|
329
|
+
if (api === 'openai-completions') {
|
|
330
|
+
const supportsDeveloperRole = await prompts.confirm('Does this provider support the developer role?', { default: true });
|
|
331
|
+
const supportsReasoningEffort = await prompts.confirm('Does this provider support reasoning effort?', { default: true });
|
|
332
|
+
if (!supportsDeveloperRole || !supportsReasoningEffort) {
|
|
333
|
+
compat = { supportsDeveloperRole, supportsReasoningEffort };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const models = await promptModels(prompts);
|
|
337
|
+
return { name, baseUrl, api, apiKeyEnvVar, models, builtin: false, compat };
|
|
338
|
+
}
|
|
339
|
+
/** Prompt for one or more model ids. */
|
|
340
|
+
async function promptModels(prompts, firstDefault) {
|
|
341
|
+
const models = [];
|
|
342
|
+
let addModel = true;
|
|
343
|
+
while (addModel) {
|
|
344
|
+
const id = await prompts.input(models.length === 0 ? 'Model ID:' : 'Another model ID:', models.length === 0 && firstDefault ? { default: firstDefault } : undefined);
|
|
345
|
+
models.push({ id });
|
|
346
|
+
addModel = await prompts.confirm('Add another model?', { default: false });
|
|
347
|
+
}
|
|
348
|
+
return models;
|
|
349
|
+
}
|
|
350
|
+
/** Prompt for the default provider + model (skips the prompt when only one). */
|
|
351
|
+
async function promptDefaults(prompts, providers) {
|
|
352
|
+
const defaultProvider = providers.length === 1
|
|
353
|
+
? providers[0].name
|
|
354
|
+
: await prompts.select('Default provider:', providers.map((p) => ({ name: p.name, value: p.name })));
|
|
355
|
+
const selected = providers.find((p) => p.name === defaultProvider);
|
|
356
|
+
const defaultModel = selected.models.length === 1
|
|
357
|
+
? selected.models[0].id
|
|
358
|
+
: await prompts.select('Default model:', selected.models.map((m) => ({ name: m.id, value: m.id })));
|
|
359
|
+
return { defaultProvider, defaultModel };
|
|
360
|
+
}
|
|
361
|
+
/** Re-export the default harness for callers building a config programmatically. */
|
|
362
|
+
export { DEFAULT_HARNESS };
|
|
363
|
+
//# sourceMappingURL=install-ci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-ci.js","sourceRoot":"","sources":["../src/install-ci.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **`intake`'s PURE event-classification** (task `intake-event-classification`, prd
|
|
3
|
+
* `issue-intake` US #2 — the resume-on-thread-change behaviour).
|
|
4
|
+
*
|
|
5
|
+
* `intake` is a CONVERSATION on an issue thread: a run may ASK a clarifying question
|
|
6
|
+
* and STOP, expecting a LATER run to resume from the updated thread (prd "Loop
|
|
7
|
+
* closure" / the decision table's ASK row). This module is the PURE CONTROL-PATH
|
|
8
|
+
* classifier the re-run depends on: given an issue EVENT, it decides whether `intake`
|
|
9
|
+
* should RE-EVALUATE the whole thread or IGNORE the event.
|
|
10
|
+
*
|
|
11
|
+
* THE CANONICAL RULE (from prd `issue-intake`, "The engine shape"): *"The loop
|
|
12
|
+
* re-runs on a new comment OR an issue-body edit (re-evaluate the whole thread); a
|
|
13
|
+
* buried prior-comment edit is IGNORED."*
|
|
14
|
+
*
|
|
15
|
+
* - a **new comment** → RE-EVALUATE (a genuine new turn on the thread);
|
|
16
|
+
* - an **issue-body edit** → RE-EVALUATE (the spec the prompt reads changed; re-read
|
|
17
|
+
* body + full thread);
|
|
18
|
+
* - editing a **buried PRIOR comment** → IGNORE (it is NOT a new turn —
|
|
19
|
+
* re-triggering on old-comment edits invites loops).
|
|
20
|
+
*
|
|
21
|
+
* Edit-vs-reply changes only the comment's FRAMING, not the control path: a NEW
|
|
22
|
+
* comment re-evaluates whether it is phrased as an edit-of-the-ask or a reply. The
|
|
23
|
+
* distinction the rule turns on is "a NEW turn vs an edit of a BURIED prior turn",
|
|
24
|
+
* NOT "edit vs reply".
|
|
25
|
+
*
|
|
26
|
+
* SCOPE FENCE (prd "Scope: the engine only"): this is ONLY the pure classifier. It is
|
|
27
|
+
* NOT CI's TRIGGER POLICY (command/every-issue, maintainer/anyone) — that is
|
|
28
|
+
* `runner-in-ci`'s. CI's trigger LATER CONSULTS this classifier, but the policy of
|
|
29
|
+
* WHO/WHAT may trigger lives in CI, not here. This module touches no seam, no git, no
|
|
30
|
+
* `gh` — it is pure logic over a stubbed event shape (the same discipline
|
|
31
|
+
* `failure-cause.ts` keeps).
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* The KIND of issue event the classifier decides over. The shapes are STUBBED in
|
|
35
|
+
* tests (no webhook, no `gh`); a real CI trigger maps its provider event onto one of
|
|
36
|
+
* these kinds before consulting {@link classifyIntakeEvent}.
|
|
37
|
+
*
|
|
38
|
+
* - `issue-comment-created` — a NEW comment was added to the thread (a new turn).
|
|
39
|
+
* - `issue-body-edited` — the ISSUE BODY itself was edited (the spec changed).
|
|
40
|
+
* - `issue-comment-edited` — an EXISTING comment was edited (see {@link IntakeEvent}
|
|
41
|
+
* for the buried-vs-latest distinction the rule turns on).
|
|
42
|
+
*/
|
|
43
|
+
export type IntakeEventKind = 'issue-comment-created' | 'issue-body-edited' | 'issue-comment-edited';
|
|
44
|
+
/**
|
|
45
|
+
* The CONTROL-PATH decision the classifier returns:
|
|
46
|
+
*
|
|
47
|
+
* - `re-evaluate` — `intake` should RE-READ the issue body + full thread and re-run
|
|
48
|
+
* its decision (a new comment or a body edit changed the material the prompt
|
|
49
|
+
* judges).
|
|
50
|
+
* - `ignore` — the event is NOT a new turn; `intake` does nothing (re-triggering on a
|
|
51
|
+
* buried old-comment edit would invite loops).
|
|
52
|
+
*/
|
|
53
|
+
export type IntakeEventDecision = 're-evaluate' | 'ignore';
|
|
54
|
+
/**
|
|
55
|
+
* A STUBBED issue event the classifier decides over. Deliberately MINIMAL — it
|
|
56
|
+
* carries only what the CONTROL-PATH rule turns on, nothing else (no author, no CI
|
|
57
|
+
* trigger policy — that is `runner-in-ci`'s).
|
|
58
|
+
*/
|
|
59
|
+
export interface IntakeEvent {
|
|
60
|
+
/** Which kind of thread change occurred. */
|
|
61
|
+
kind: IntakeEventKind;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Classify an issue EVENT into the CONTROL-PATH decision: RE-EVALUATE the whole
|
|
65
|
+
* thread, or IGNORE the event. The PURE realisation of the prd's canonical rule
|
|
66
|
+
* (no seam, no git, no `gh`).
|
|
67
|
+
*
|
|
68
|
+
* The table (prd `issue-intake` US #2):
|
|
69
|
+
*
|
|
70
|
+
* | event kind | decision | why |
|
|
71
|
+
* | ----------------------- | ------------- | -------------------------------------------- |
|
|
72
|
+
* | `issue-comment-created` | `re-evaluate` | a new comment is a new turn on the thread |
|
|
73
|
+
* | `issue-body-edited` | `re-evaluate` | the issue body (the spec) changed |
|
|
74
|
+
* | `issue-comment-edited` | `ignore` | editing a buried prior comment is NOT a turn |
|
|
75
|
+
*
|
|
76
|
+
* `issue-comment-edited` is IGNORED unconditionally: editing a prior comment is not a
|
|
77
|
+
* new turn (and re-triggering on old-comment edits invites loops). The "buried" in
|
|
78
|
+
* the rule is descriptive — the rule does not single out which prior comment was
|
|
79
|
+
* edited; ANY comment edit is an edit of an already-seen turn, not a new one. (Adding
|
|
80
|
+
* NEW content is `issue-comment-created`, which DOES re-evaluate.)
|
|
81
|
+
*
|
|
82
|
+
* Edit-vs-reply does NOT change this: a new comment is `issue-comment-created`
|
|
83
|
+
* REGARDLESS of whether it is phrased as an edit-of-the-ask or a reply — both
|
|
84
|
+
* re-evaluate, because editing-vs-replying changes only the comment's FRAMING, not
|
|
85
|
+
* whether it is a new turn.
|
|
86
|
+
*/
|
|
87
|
+
export declare function classifyIntakeEvent(event: IntakeEvent): IntakeEventDecision;
|
|
88
|
+
//# sourceMappingURL=intake-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intake-event.d.ts","sourceRoot":"","sources":["../src/intake-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GACxB,uBAAuB,GACvB,mBAAmB,GACnB,sBAAsB,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,4CAA4C;IAC5C,IAAI,EAAE,eAAe,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAQ3E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **`intake`'s PURE event-classification** (task `intake-event-classification`, prd
|
|
3
|
+
* `issue-intake` US #2 — the resume-on-thread-change behaviour).
|
|
4
|
+
*
|
|
5
|
+
* `intake` is a CONVERSATION on an issue thread: a run may ASK a clarifying question
|
|
6
|
+
* and STOP, expecting a LATER run to resume from the updated thread (prd "Loop
|
|
7
|
+
* closure" / the decision table's ASK row). This module is the PURE CONTROL-PATH
|
|
8
|
+
* classifier the re-run depends on: given an issue EVENT, it decides whether `intake`
|
|
9
|
+
* should RE-EVALUATE the whole thread or IGNORE the event.
|
|
10
|
+
*
|
|
11
|
+
* THE CANONICAL RULE (from prd `issue-intake`, "The engine shape"): *"The loop
|
|
12
|
+
* re-runs on a new comment OR an issue-body edit (re-evaluate the whole thread); a
|
|
13
|
+
* buried prior-comment edit is IGNORED."*
|
|
14
|
+
*
|
|
15
|
+
* - a **new comment** → RE-EVALUATE (a genuine new turn on the thread);
|
|
16
|
+
* - an **issue-body edit** → RE-EVALUATE (the spec the prompt reads changed; re-read
|
|
17
|
+
* body + full thread);
|
|
18
|
+
* - editing a **buried PRIOR comment** → IGNORE (it is NOT a new turn —
|
|
19
|
+
* re-triggering on old-comment edits invites loops).
|
|
20
|
+
*
|
|
21
|
+
* Edit-vs-reply changes only the comment's FRAMING, not the control path: a NEW
|
|
22
|
+
* comment re-evaluates whether it is phrased as an edit-of-the-ask or a reply. The
|
|
23
|
+
* distinction the rule turns on is "a NEW turn vs an edit of a BURIED prior turn",
|
|
24
|
+
* NOT "edit vs reply".
|
|
25
|
+
*
|
|
26
|
+
* SCOPE FENCE (prd "Scope: the engine only"): this is ONLY the pure classifier. It is
|
|
27
|
+
* NOT CI's TRIGGER POLICY (command/every-issue, maintainer/anyone) — that is
|
|
28
|
+
* `runner-in-ci`'s. CI's trigger LATER CONSULTS this classifier, but the policy of
|
|
29
|
+
* WHO/WHAT may trigger lives in CI, not here. This module touches no seam, no git, no
|
|
30
|
+
* `gh` — it is pure logic over a stubbed event shape (the same discipline
|
|
31
|
+
* `failure-cause.ts` keeps).
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Classify an issue EVENT into the CONTROL-PATH decision: RE-EVALUATE the whole
|
|
35
|
+
* thread, or IGNORE the event. The PURE realisation of the prd's canonical rule
|
|
36
|
+
* (no seam, no git, no `gh`).
|
|
37
|
+
*
|
|
38
|
+
* The table (prd `issue-intake` US #2):
|
|
39
|
+
*
|
|
40
|
+
* | event kind | decision | why |
|
|
41
|
+
* | ----------------------- | ------------- | -------------------------------------------- |
|
|
42
|
+
* | `issue-comment-created` | `re-evaluate` | a new comment is a new turn on the thread |
|
|
43
|
+
* | `issue-body-edited` | `re-evaluate` | the issue body (the spec) changed |
|
|
44
|
+
* | `issue-comment-edited` | `ignore` | editing a buried prior comment is NOT a turn |
|
|
45
|
+
*
|
|
46
|
+
* `issue-comment-edited` is IGNORED unconditionally: editing a prior comment is not a
|
|
47
|
+
* new turn (and re-triggering on old-comment edits invites loops). The "buried" in
|
|
48
|
+
* the rule is descriptive — the rule does not single out which prior comment was
|
|
49
|
+
* edited; ANY comment edit is an edit of an already-seen turn, not a new one. (Adding
|
|
50
|
+
* NEW content is `issue-comment-created`, which DOES re-evaluate.)
|
|
51
|
+
*
|
|
52
|
+
* Edit-vs-reply does NOT change this: a new comment is `issue-comment-created`
|
|
53
|
+
* REGARDLESS of whether it is phrased as an edit-of-the-ask or a reply — both
|
|
54
|
+
* re-evaluate, because editing-vs-replying changes only the comment's FRAMING, not
|
|
55
|
+
* whether it is a new turn.
|
|
56
|
+
*/
|
|
57
|
+
export function classifyIntakeEvent(event) {
|
|
58
|
+
switch (event.kind) {
|
|
59
|
+
case 'issue-comment-created':
|
|
60
|
+
case 'issue-body-edited':
|
|
61
|
+
return 're-evaluate';
|
|
62
|
+
case 'issue-comment-edited':
|
|
63
|
+
return 'ignore';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=intake-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intake-event.js","sourceRoot":"","sources":["../src/intake-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAsCH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACrD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,uBAAuB,CAAC;QAC7B,KAAK,mBAAmB;YACvB,OAAO,aAAa,CAAC;QACtB,KAAK,sBAAsB;YAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { IssueComment } from './issue-provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* **The intake MARKER** (task `intake-self-awareness-resumption-tracking`, prd
|
|
4
|
+
* `issue-intake` US #2/#10): the ONE primitive the deterministic pre-decision
|
|
5
|
+
* TRIAGE GATE is built on. A machine-readable HIDDEN HTML comment intake stamps on
|
|
6
|
+
* EVERY comment it posts, recording a neutral FACT about what intake did:
|
|
7
|
+
*
|
|
8
|
+
* - `<!-- dorfl:intake kind=ask seen=412,418 -->`
|
|
9
|
+
* - `<!-- dorfl:intake kind=bounced seen=503 -->`
|
|
10
|
+
* - `<!-- dorfl:intake kind=created slug=<slug> seen=601,602 -->`
|
|
11
|
+
*
|
|
12
|
+
* (Namespace `${brand.base}:intake` is built from {@link brand} exactly like
|
|
13
|
+
* `PROCESSING_LOCK_LABEL`, so a rebrand updates it automatically.)
|
|
14
|
+
*
|
|
15
|
+
* It is the SOLE recovery signal — no sidecar, no cursor, no bot-identity. Intake
|
|
16
|
+
* recognises ITS OWN comments by the marker alone (provider-portable, survives
|
|
17
|
+
* posting under a human's token). Hidden HTML comments render as NOTHING on GitHub
|
|
18
|
+
* but are present in the raw markdown each comment's `body` carries — so the triage
|
|
19
|
+
* parses the marker straight out of {@link IssueComment.body}.
|
|
20
|
+
*
|
|
21
|
+
* What the marker records (DECIDED 2026-06-10):
|
|
22
|
+
*
|
|
23
|
+
* - **`kind`** \u2014 a NEUTRAL fact (`ask` / `bounced` / `created`). Whether a kind is
|
|
24
|
+
* TERMINAL is the TRIAGE's interpretation, NEVER data in the marker (no `terminal`
|
|
25
|
+
* field): if a kind's terminal-ness ever changes that is a triage change and old
|
|
26
|
+
* markers stay valid.
|
|
27
|
+
* - **`slug`** \u2014 present only on `kind=created` (which task/prd intake produced).
|
|
28
|
+
* - **`seen=<id>,\u2026`** \u2014 the per-run DELTA of HUMAN comment ids intake READ this run
|
|
29
|
+
* (EXCLUDING intake's own marker-comments AND any human id already in a prior
|
|
30
|
+
* marker's `seen=`). Ids, not a count, because a count cannot distinguish "a new
|
|
31
|
+
* comment appeared" from "an old one was deleted"; ids do both via set arithmetic.
|
|
32
|
+
* The full `seenSet` is the UNION of every marker's `seen=` (the CHAIN model).
|
|
33
|
+
*
|
|
34
|
+
* The grammar is SHARED so the dependent completion-comment task just stamps a
|
|
35
|
+
* `created` marker via {@link stampIntakeMarker}, which the triage's
|
|
36
|
+
* `already-terminal` branch then consumes.
|
|
37
|
+
*/
|
|
38
|
+
/** The neutral KIND a marker records \u2014 a fact about what intake did (NOT terminal-ness). */
|
|
39
|
+
export type IntakeMarkerKind = 'ask' | 'bounced' | 'created';
|
|
40
|
+
/** A parsed intake marker \u2014 `kind` + the human ids it `seen=` + an optional `slug`. */
|
|
41
|
+
export interface IntakeMarker {
|
|
42
|
+
/** What intake did (a neutral fact; the TRIAGE owns terminal-ness, not this). */
|
|
43
|
+
kind: IntakeMarkerKind;
|
|
44
|
+
/** The HUMAN comment ids intake READ this run (the per-run delta; may be empty). */
|
|
45
|
+
seen: string[];
|
|
46
|
+
/** The created task/prd slug \u2014 present only on `kind=created`. */
|
|
47
|
+
slug?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* STAMP the intake marker onto a comment body intake is about to post (the SHARED
|
|
51
|
+
* producer for ALL of ask / bounced / created). Appends the hidden HTML comment
|
|
52
|
+
* AFTER the human-readable text, separated by a blank line, so the rendered comment
|
|
53
|
+
* is just the text (the marker is invisible) yet the raw markdown carries the
|
|
54
|
+
* marker for the triage to recover.
|
|
55
|
+
*
|
|
56
|
+
* `seen` is the per-run DELTA of human comment ids (computed by
|
|
57
|
+
* {@link computeSeenDelta}); it is emitted even when empty (`seen=`) so the grammar
|
|
58
|
+
* is uniform and the parser never has to special-case its absence. `slug` is
|
|
59
|
+
* emitted only for `kind=created`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function stampIntakeMarker(body: string, marker: {
|
|
62
|
+
kind: IntakeMarkerKind;
|
|
63
|
+
seen: string[];
|
|
64
|
+
slug?: string;
|
|
65
|
+
}): string;
|
|
66
|
+
/**
|
|
67
|
+
* Parse the FIRST intake marker out of a comment body (the SHARED consumer). Returns
|
|
68
|
+
* `undefined` when the body carries no intake marker \u2014 i.e. it is a HUMAN comment
|
|
69
|
+
* (the triage ranges its unseen-check over exactly these). A malformed marker (no
|
|
70
|
+
* `kind`, or an unknown `kind`) is treated as ABSENT rather than throwing: an
|
|
71
|
+
* unparseable hidden comment must never make the triage crash or misclassify a
|
|
72
|
+
* human comment as intake's.
|
|
73
|
+
*/
|
|
74
|
+
export declare function parseIntakeMarker(body: string): IntakeMarker | undefined;
|
|
75
|
+
/** True iff the comment carries an intake marker \u2014 i.e. it is INTAKE's OWN comment. */
|
|
76
|
+
export declare function isIntakeComment(comment: IssueComment): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Compute the per-run `seen=` DELTA for a marker intake is about to stamp: the ids
|
|
79
|
+
* of the HUMAN comments in the thread as intake READ it, EXCLUDING (a) intake's own
|
|
80
|
+
* marker-comments (identified by carrying a marker) and (b) any human id ALREADY
|
|
81
|
+
* recorded in a prior intake marker's `seen=` (the chain model keeps each marker's
|
|
82
|
+
* `seen=` a bounded per-run delta; the union reconstructs the whole). Order follows
|
|
83
|
+
* `listComments`' oldest-first; ids with no value (a provider that omitted one) are
|
|
84
|
+
* dropped \u2014 the triage only reasons over ids it actually has.
|
|
85
|
+
*/
|
|
86
|
+
export declare function computeSeenDelta(comments: IssueComment[]): string[];
|
|
87
|
+
/**
|
|
88
|
+
* Build the full `seenSet` for the TRIAGE: the UNION of every intake marker's
|
|
89
|
+
* `seen=` id-list in the thread (the chain model \u2014 each marker stores a per-run
|
|
90
|
+
* delta, the union reconstructs the complete set of human comments intake has EVER
|
|
91
|
+
* read). Ranges over intake's OWN comments (the ones carrying a marker); a human
|
|
92
|
+
* comment never carries a `seen=`.
|
|
93
|
+
*/
|
|
94
|
+
export declare function seenSetFrom(comments: IssueComment[]): Set<string>;
|
|
95
|
+
//# sourceMappingURL=intake-marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intake-marker.d.ts","sourceRoot":"","sources":["../src/intake-marker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,iGAAiG;AACjG,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7D,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC5B,iFAAiF;IACjF,IAAI,EAAE,gBAAgB,CAAC;IACvB,oFAAoF;IACpF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GAC7D,MAAM,CAaR;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAsBxE;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAiBnE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAYjE"}
|