@mjasnikovs/pi-task 0.38.29 → 0.38.31
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/config/config.d.ts +70 -70
- package/dist/config/config.js +26 -35
- package/dist/config/extension-list.d.ts +6 -5
- package/dist/config/extension-list.js +3 -2
- package/dist/config/reasoning-args.d.ts +9 -7
- package/dist/config/reasoning-args.js +12 -10
- package/dist/config/reasoning.d.ts +44 -105
- package/dist/config/reasoning.js +27 -704
- package/dist/config/register.d.ts +34 -48
- package/dist/config/register.js +41 -51
- package/dist/config/tool-list.d.ts +16 -16
- package/dist/config/tool-list.js +1 -1
- package/dist/index.js +2 -0
- package/dist/remote/bridge.d.ts +19 -10
- package/dist/remote/bridge.js +3 -2
- package/dist/remote/broadcast.js +3 -1
- package/dist/remote/events.js +12 -11
- package/dist/remote/history.d.ts +1 -1
- package/dist/remote/protocol.d.ts +6 -3
- package/dist/remote/protocol.js +2 -1
- package/dist/remote/push.d.ts +16 -16
- package/dist/remote/push.js +27 -27
- package/dist/remote/register.d.ts +3 -3
- package/dist/remote/register.js +17 -19
- package/dist/remote/server.d.ts +9 -8
- package/dist/remote/server.js +15 -14
- package/dist/remote/session-state.d.ts +5 -4
- package/dist/remote/session-state.js +8 -5
- package/dist/remote/sw.d.ts +7 -6
- package/dist/remote/sw.js +7 -6
- package/dist/remote/tailscale.d.ts +4 -2
- package/dist/remote/tailscale.js +4 -2
- package/dist/remote/ui-highlight.js +6 -5
- package/dist/remote/ui-render.js +4 -4
- package/dist/remote/ui-script.js +24 -24
- package/dist/remote/ui-styles.d.ts +1 -1
- package/dist/remote/ui-styles.js +10 -13
- package/dist/remote/ui-tools.js +9 -6
- package/dist/shared/child-extensions.d.ts +29 -17
- package/dist/shared/child-extensions.js +29 -17
- package/dist/shared/child-output.d.ts +30 -24
- package/dist/shared/child-output.js +25 -17
- package/dist/shared/child-process.d.ts +47 -40
- package/dist/shared/child-process.js +50 -59
- package/dist/shared/command-watchdog.d.ts +85 -16
- package/dist/shared/command-watchdog.js +115 -21
- package/dist/shared/fs-text.d.ts +16 -10
- package/dist/shared/fs-text.js +16 -10
- package/dist/shared/git-runner.d.ts +25 -25
- package/dist/shared/git-runner.js +25 -25
- package/dist/shared/leaked-tool-call.d.ts +17 -11
- package/dist/shared/leaked-tool-call.js +23 -15
- package/dist/shared/model-endpoint.d.ts +29 -16
- package/dist/shared/model-endpoint.js +33 -21
- package/dist/shared/pi-invocation.d.ts +7 -4
- package/dist/shared/pi-invocation.js +12 -7
- package/dist/shared/pkg-version.d.ts +13 -5
- package/dist/shared/pkg-version.js +13 -5
- package/dist/shared/reasoning-capability.d.ts +35 -24
- package/dist/shared/reasoning-capability.js +35 -24
- package/dist/shared/stream-watchdog.d.ts +60 -44
- package/dist/shared/stream-watchdog.js +62 -45
- package/dist/task/accept-debt.d.ts +41 -43
- package/dist/task/accept-debt.js +73 -65
- package/dist/task/api-synthesis.d.ts +24 -21
- package/dist/task/api-synthesis.js +32 -26
- package/dist/task/apis-contract.d.ts +32 -64
- package/dist/task/apis-contract.js +32 -64
- package/dist/task/artifact-closure.d.ts +27 -13
- package/dist/task/artifact-closure.js +95 -67
- package/dist/task/auto-commit.d.ts +46 -35
- package/dist/task/auto-commit.js +51 -38
- package/dist/task/auto-io.d.ts +45 -25
- package/dist/task/auto-io.js +57 -29
- package/dist/task/auto-orchestrator.d.ts +26 -24
- package/dist/task/auto-orchestrator.js +192 -165
- package/dist/task/auto-prompts.d.ts +36 -24
- package/dist/task/auto-prompts.js +40 -26
- package/dist/task/autofix-ledger.d.ts +27 -25
- package/dist/task/autofix-ledger.js +29 -26
- package/dist/task/batch-test-task.d.ts +20 -12
- package/dist/task/batch-test-task.js +67 -60
- package/dist/task/boot-probe.d.ts +60 -44
- package/dist/task/boot-probe.js +91 -72
- package/dist/task/cancel-input.d.ts +30 -16
- package/dist/task/cancel-input.js +20 -11
- package/dist/task/cancel-points.d.ts +27 -20
- package/dist/task/cancel-points.js +30 -22
- package/dist/task/child-runner.d.ts +124 -55
- package/dist/task/child-runner.js +298 -90
- package/dist/task/child-status.d.ts +23 -16
- package/dist/task/child-status.js +23 -16
- package/dist/task/clamp-output.js +12 -5
- package/dist/task/command-run.d.ts +31 -28
- package/dist/task/command-run.js +44 -35
- package/dist/task/command-shrink.d.ts +25 -18
- package/dist/task/command-shrink.js +37 -31
- package/dist/task/command-watchdog.d.ts +9 -6
- package/dist/task/command-watchdog.js +21 -15
- package/dist/task/context-attribution.d.ts +34 -26
- package/dist/task/context-attribution.js +34 -26
- package/dist/task/context-silence.d.ts +39 -29
- package/dist/task/context-silence.js +35 -25
- package/dist/task/context-usage.d.ts +16 -9
- package/dist/task/context-usage.js +16 -9
- package/dist/task/contracts.d.ts +8 -4
- package/dist/task/contracts.js +25 -17
- package/dist/task/coverage-loop.d.ts +22 -18
- package/dist/task/coverage-loop.js +35 -30
- package/dist/task/critique-probes.d.ts +13 -14
- package/dist/task/critique-probes.js +50 -39
- package/dist/task/debug-log.d.ts +13 -5
- package/dist/task/debug-log.js +32 -20
- package/dist/task/decompose-fidelity.d.ts +11 -9
- package/dist/task/decompose-fidelity.js +38 -33
- package/dist/task/decompose-granularity.d.ts +41 -38
- package/dist/task/decompose-granularity.js +41 -38
- package/dist/task/deep-render-check.d.ts +22 -14
- package/dist/task/deep-render-check.js +40 -31
- package/dist/task/dropped-input.d.ts +12 -7
- package/dist/task/dropped-input.js +5 -2
- package/dist/task/enforce-attribution.d.ts +38 -47
- package/dist/task/enforce-attribution.js +46 -52
- package/dist/task/enforce-guidelines.d.ts +31 -20
- package/dist/task/enforce-guidelines.js +32 -21
- package/dist/task/enrichment.d.ts +7 -2
- package/dist/task/enrichment.js +26 -14
- package/dist/task/env-notes.d.ts +16 -7
- package/dist/task/env-notes.js +48 -31
- package/dist/task/env-template-closure.d.ts +4 -4
- package/dist/task/env-template-closure.js +42 -34
- package/dist/task/external-context.d.ts +28 -21
- package/dist/task/external-context.js +17 -12
- package/dist/task/failure-classifier.d.ts +4 -5
- package/dist/task/failure-classifier.js +30 -8
- package/dist/task/file-inventory.d.ts +15 -11
- package/dist/task/file-inventory.js +25 -22
- package/dist/task/final-gate-fix.d.ts +74 -86
- package/dist/task/final-gate-fix.js +97 -116
- package/dist/task/final-gate-progress.d.ts +29 -46
- package/dist/task/final-gate-progress.js +40 -51
- package/dist/task/final-gate.d.ts +64 -97
- package/dist/task/final-gate.js +192 -199
- package/dist/task/fix-child.d.ts +21 -27
- package/dist/task/fix-child.js +21 -27
- package/dist/task/foreign-path.d.ts +6 -5
- package/dist/task/foreign-path.js +0 -0
- package/dist/task/frozen-conflict.d.ts +9 -10
- package/dist/task/frozen-conflict.js +61 -64
- package/dist/task/frozen-path-guard.d.ts +35 -14
- package/dist/task/frozen-path-guard.js +56 -39
- package/dist/task/gate-child.d.ts +27 -28
- package/dist/task/gate-child.js +36 -35
- package/dist/task/gate-deps.d.ts +34 -27
- package/dist/task/gate-deps.js +169 -159
- package/dist/task/gate-tally.d.ts +77 -80
- package/dist/task/gate-tally.js +65 -68
- package/dist/task/git-state-guard.d.ts +15 -11
- package/dist/task/git-state-guard.js +76 -66
- package/dist/task/impl-widget.d.ts +25 -16
- package/dist/task/impl-widget.js +27 -17
- package/dist/task/implementation-guards.d.ts +26 -0
- package/dist/task/implementation-guards.js +177 -0
- package/dist/task/implementation-thinking.d.ts +33 -31
- package/dist/task/implementation-thinking.js +5 -6
- package/dist/task/implementation-turn.d.ts +39 -31
- package/dist/task/implementation-turn.js +41 -28
- package/dist/task/inline-markdown.d.ts +20 -7
- package/dist/task/inline-markdown.js +15 -6
- package/dist/task/launch-config-gap.js +25 -39
- package/dist/task/launch-contract.d.ts +18 -21
- package/dist/task/launch-contract.js +28 -30
- package/dist/task/launch-manifest.d.ts +6 -2
- package/dist/task/launch-manifest.js +35 -34
- package/dist/task/ledger.js +16 -14
- package/dist/task/lint-fix.d.ts +6 -8
- package/dist/task/lint-fix.js +67 -69
- package/dist/task/loop-detector.d.ts +27 -8
- package/dist/task/loop-detector.js +38 -14
- package/dist/task/mid-run-input.d.ts +17 -15
- package/dist/task/mid-run-input.js +17 -15
- package/dist/task/orchestrator.d.ts +24 -28
- package/dist/task/orchestrator.js +89 -66
- package/dist/task/orientation.d.ts +18 -23
- package/dist/task/orientation.js +24 -31
- package/dist/task/owned-freeze-conflict.d.ts +21 -20
- package/dist/task/owned-freeze-conflict.js +52 -85
- package/dist/task/owned-freeze-reassign.d.ts +40 -60
- package/dist/task/owned-freeze-reassign.js +41 -61
- package/dist/task/parsers.d.ts +4 -2
- package/dist/task/parsers.js +4 -4
- package/dist/task/phases.d.ts +41 -48
- package/dist/task/phases.js +196 -252
- package/dist/task/plan-io.d.ts +6 -7
- package/dist/task/plan-io.js +6 -7
- package/dist/task/plan-orchestrator.d.ts +10 -8
- package/dist/task/plan-orchestrator.js +14 -10
- package/dist/task/plan-prompts.d.ts +6 -5
- package/dist/task/plan-prompts.js +6 -5
- package/dist/task/plan-readonly.d.ts +4 -5
- package/dist/task/plan-readonly.js +4 -5
- package/dist/task/plan-rounds.d.ts +17 -29
- package/dist/task/plan-rounds.js +21 -34
- package/dist/task/plan-session.d.ts +58 -72
- package/dist/task/plan-session.js +61 -83
- package/dist/task/probe-gaming.d.ts +28 -27
- package/dist/task/probe-gaming.js +0 -0
- package/dist/task/prohibition-probe.d.ts +14 -16
- package/dist/task/prompts.d.ts +3 -4
- package/dist/task/prompts.js +17 -26
- package/dist/task/qa-transcript.d.ts +15 -22
- package/dist/task/qa-transcript.js +15 -21
- package/dist/task/question-box.d.ts +17 -13
- package/dist/task/question-box.js +19 -15
- package/dist/task/question-dedup.d.ts +6 -7
- package/dist/task/question-dedup.js +13 -14
- package/dist/task/question-dialog.d.ts +22 -32
- package/dist/task/question-dialog.js +22 -32
- package/dist/task/question-source.d.ts +18 -44
- package/dist/task/question-source.js +22 -51
- package/dist/task/refuted-constraint.d.ts +11 -31
- package/dist/task/refuted-constraint.js +27 -51
- package/dist/task/regenerable-artifacts.d.ts +12 -31
- package/dist/task/regenerable-artifacts.js +12 -31
- package/dist/task/render-check.d.ts +11 -22
- package/dist/task/render-check.js +33 -46
- package/dist/task/repo-health-check.d.ts +10 -14
- package/dist/task/repo-health-check.js +17 -23
- package/dist/task/requirements.d.ts +38 -71
- package/dist/task/requirements.js +78 -126
- package/dist/task/research-fanout-budget.d.ts +51 -88
- package/dist/task/research-fanout-budget.js +51 -88
- package/dist/task/research-worker.d.ts +29 -39
- package/dist/task/research-worker.js +37 -61
- package/dist/task/resume-gap.d.ts +14 -15
- package/dist/task/root-cause-repair.d.ts +9 -9
- package/dist/task/root-cause-repair.js +28 -40
- package/dist/task/run-bracket.d.ts +10 -13
- package/dist/task/run-end.d.ts +12 -22
- package/dist/task/run-end.js +8 -16
- package/dist/task/run-final-gate.d.ts +19 -21
- package/dist/task/run-final-gate.js +62 -80
- package/dist/task/runner-globs.d.ts +12 -13
- package/dist/task/runner-globs.js +12 -13
- package/dist/task/runner-resolve.d.ts +9 -9
- package/dist/task/runner-resolve.js +22 -23
- package/dist/task/script-escape.d.ts +10 -12
- package/dist/task/script-escape.js +13 -14
- package/dist/task/serve-entry.d.ts +1 -1
- package/dist/task/serve-entry.js +22 -25
- package/dist/task/service-blocks.js +4 -2
- package/dist/task/shipped-source.d.ts +11 -29
- package/dist/task/shipped-source.js +11 -29
- package/dist/task/skip-escape.js +10 -14
- package/dist/task/spec-urls.d.ts +26 -65
- package/dist/task/spec-urls.js +26 -65
- package/dist/task/spec-validation.d.ts +17 -20
- package/dist/task/spec-validation.js +17 -20
- package/dist/task/stall-detector.d.ts +23 -30
- package/dist/task/stall-detector.js +23 -30
- package/dist/task/stream-watchdog.d.ts +14 -12
- package/dist/task/stream-watchdog.js +14 -12
- package/dist/task/substitution-probe.d.ts +17 -20
- package/dist/task/substitution-probe.js +17 -20
- package/dist/task/task-gates.d.ts +36 -41
- package/dist/task/task-gates.js +95 -106
- package/dist/task/task-io.d.ts +4 -4
- package/dist/task/task-io.js +4 -4
- package/dist/task/task-parsers.js +4 -3
- package/dist/task/task-provenance.d.ts +2 -2
- package/dist/task/task-provenance.js +11 -13
- package/dist/task/task-types.d.ts +4 -3
- package/dist/task/terminal-outcome.d.ts +14 -16
- package/dist/task/terminal-outcome.js +12 -14
- package/dist/task/test-assembly.d.ts +13 -20
- package/dist/task/test-assembly.js +13 -20
- package/dist/task/timings.d.ts +5 -3
- package/dist/task/timings.js +5 -3
- package/dist/task/title-label.d.ts +9 -4
- package/dist/task/title-label.js +9 -4
- package/dist/task/type-only-answer.d.ts +44 -52
- package/dist/task/type-only-answer.js +44 -52
- package/dist/task/unfailable-command.d.ts +18 -24
- package/dist/task/unfailable-command.js +21 -27
- package/dist/task/unknown-routing.d.ts +10 -4
- package/dist/task/unknown-routing.js +10 -4
- package/dist/task/user-directives.d.ts +5 -8
- package/dist/task/user-directives.js +5 -8
- package/dist/task/verify-quality.d.ts +18 -22
- package/dist/task/verify-quality.js +45 -46
- package/dist/task/verify-reconcile.d.ts +15 -10
- package/dist/task/verify-reconcile.js +45 -43
- package/dist/task/verify-resolution.d.ts +24 -20
- package/dist/task/verify-resolution.js +51 -50
- package/dist/task/verify-work.d.ts +59 -66
- package/dist/task/verify-work.js +101 -138
- package/dist/task/widget.d.ts +15 -14
- package/dist/task/widget.js +22 -17
- package/dist/task/wiring-claims.d.ts +25 -32
- package/dist/task/wiring-claims.js +30 -35
- package/dist/task/write-guard.d.ts +39 -39
- package/dist/task/write-guard.js +48 -51
- package/dist/task/yolo.d.ts +34 -30
- package/dist/task/yolo.js +42 -37
- package/dist/workers/abstention.d.ts +21 -41
- package/dist/workers/abstention.js +27 -48
- package/dist/workers/brave-search.d.ts +4 -3
- package/dist/workers/brave-search.js +5 -2
- package/dist/workers/brave-warning.d.ts +7 -4
- package/dist/workers/brave-warning.js +19 -7
- package/dist/workers/ddg-search.d.ts +6 -6
- package/dist/workers/ddg-search.js +18 -12
- package/dist/workers/docs-cache.js +5 -2
- package/dist/workers/docs-chunk.d.ts +30 -37
- package/dist/workers/docs-chunk.js +37 -41
- package/dist/workers/docs-core.d.ts +28 -44
- package/dist/workers/docs-core.js +25 -44
- package/dist/workers/docs-index.js +4 -3
- package/dist/workers/docs-lookup.d.ts +15 -22
- package/dist/workers/docs-lookup.js +12 -21
- package/dist/workers/docs-project.d.ts +15 -9
- package/dist/workers/docs-project.js +17 -10
- package/dist/workers/docs-resolve.d.ts +19 -20
- package/dist/workers/docs-resolve.js +35 -32
- package/dist/workers/docs-retrieve.d.ts +5 -6
- package/dist/workers/docs-retrieve.js +18 -15
- package/dist/workers/exa-search.d.ts +9 -6
- package/dist/workers/exa-search.js +23 -12
- package/dist/workers/fetch-core.d.ts +13 -16
- package/dist/workers/fetch-core.js +23 -23
- package/dist/workers/focused-extractor.d.ts +13 -12
- package/dist/workers/focused-extractor.js +27 -19
- package/dist/workers/html-clean.js +24 -14
- package/dist/workers/http-request.d.ts +28 -20
- package/dist/workers/http-request.js +22 -17
- package/dist/workers/npm-version.d.ts +28 -11
- package/dist/workers/npm-version.js +24 -15
- package/dist/workers/phantom-imports.d.ts +15 -12
- package/dist/workers/phantom-imports.js +30 -24
- package/dist/workers/pi-worker-core.d.ts +65 -96
- package/dist/workers/pi-worker-core.js +93 -181
- package/dist/workers/pi-worker-docs.d.ts +24 -19
- package/dist/workers/pi-worker-docs.js +67 -76
- package/dist/workers/pi-worker-fetch.d.ts +7 -3
- package/dist/workers/pi-worker-fetch.js +27 -19
- package/dist/workers/pi-worker-search.js +12 -8
- package/dist/workers/pi-worker.d.ts +9 -4
- package/dist/workers/pi-worker.js +21 -14
- package/dist/workers/reasoning-warning.d.ts +18 -17
- package/dist/workers/reasoning-warning.js +22 -20
- package/dist/workers/research-cache.js +50 -78
- package/dist/workers/search-core.js +7 -5
- package/dist/workers/search-types.d.ts +10 -9
- package/dist/workers/search-types.js +9 -8
- package/dist/workers/session-hint.d.ts +13 -14
- package/dist/workers/session-hint.js +8 -9
- package/dist/workers/shared.d.ts +21 -25
- package/dist/workers/shared.js +0 -0
- package/dist/workers/single-read-extension.d.ts +14 -7
- package/dist/workers/single-read-extension.js +14 -7
- package/dist/workers/single-read-guard.d.ts +27 -30
- package/dist/workers/single-read-guard.js +36 -36
- package/dist/workers/typeonly-log.d.ts +12 -9
- package/dist/workers/typeonly-log.js +29 -33
- package/dist/workers/worker-channels.d.ts +15 -23
- package/dist/workers/worker-channels.js +15 -23
- package/dist/workers/worker-failure.d.ts +38 -46
- package/dist/workers/worker-failure.js +31 -39
- package/dist/workers/worker-kill.d.ts +25 -26
- package/dist/workers/worker-kill.js +16 -19
- package/dist/workers/worker-profiles.d.ts +54 -56
- package/dist/workers/worker-profiles.js +63 -39
- package/package.json +10 -8
package/dist/task/auto-commit.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Per-task git commit for /task-auto.
|
|
3
3
|
*
|
|
4
|
-
* After each decomposed task passes,
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* reason
|
|
4
|
+
* After each decomposed task passes, the loop snapshots the working tree into a
|
|
5
|
+
* single commit, so a run produces one commit per task. Best-effort throughout,
|
|
6
|
+
* and confirmed by calling it: outside a git repo it answers
|
|
7
|
+
* `{committed: false, reason: 'not a git repository'}`, on a clean tree
|
|
8
|
+
* `{committed: false, reason: 'nothing to commit'}`. Nothing throws — the task
|
|
9
|
+
* already succeeded, and a failed snapshot must not undo that.
|
|
8
10
|
*/
|
|
9
11
|
import * as fsp from 'node:fs/promises';
|
|
10
12
|
import * as path from 'node:path';
|
|
@@ -14,15 +16,21 @@ import { isDeletionExemptArtifact } from './regenerable-artifacts.js';
|
|
|
14
16
|
* ledgers. Preserved verbatim across a revert (see gitDropLastCommit). */
|
|
15
17
|
const TRAIL_DIR = '.pi-tasks';
|
|
16
18
|
/**
|
|
17
|
-
* Does this git stderr describe a missing author identity?
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* Does this git stderr describe a missing author identity?
|
|
20
|
+
*
|
|
21
|
+
* The failure it catches is total rather than partial: with no usable gitconfig
|
|
22
|
+
* every per-task commit fails, which silently disables enforce and every
|
|
23
|
+
* commit-based differential guard for the rest of the run. Reproduced with real
|
|
24
|
+
* git — committing with `HOME` unset and both config files pointed at
|
|
25
|
+
* `/dev/null` prints "Author identity unknown" plus the `user.email` /
|
|
26
|
+
* `user.name` advice, and this predicate matches that text while rejecting an
|
|
27
|
+
* unrelated `fatal: not a git repository`.
|
|
21
28
|
*/
|
|
22
29
|
export function isIdentityFailure(stderr) {
|
|
23
30
|
return /identity unknown|unable to auto-detect email|user\.(name|email)/i.test(stderr);
|
|
24
31
|
}
|
|
25
|
-
/** Fallback identity for environments with no git config
|
|
32
|
+
/** Fallback identity for environments with no git config. Confirmed against real
|
|
33
|
+
* git: the same commit that fails with no identity succeeds with these args. */
|
|
26
34
|
export const FALLBACK_IDENTITY_ARGS = [
|
|
27
35
|
'-c',
|
|
28
36
|
'user.name=pi-task',
|
|
@@ -42,21 +50,22 @@ export async function git(cwd, args, signal, spawnFn) {
|
|
|
42
50
|
* `test-results/`, `playwright-report/`, `coverage/`, `.nyc_output/`,
|
|
43
51
|
* `.last-run.json`, `*.tsbuildinfo`.
|
|
44
52
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* final-gate fix attempts were then rejected for deleting them. The deletion guard
|
|
50
|
-
* fix (write-guard.ts) stops the rejection; this stops the tracking.
|
|
53
|
+
* The failure this closes: a bare `git add -A` sweeps up whatever the test run
|
|
54
|
+
* just littered the tree with — a failure screenshot, a coverage dir — and commits
|
|
55
|
+
* it, making regenerable output a TRACKED deliverable. A later task that cleans it
|
|
56
|
+
* up then reads as deleting someone's work.
|
|
51
57
|
*
|
|
52
58
|
* ONLY UNTRACKED PATHS ARE EXCLUDED, and that is load-bearing rather than tidy.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
59
|
+
* Both halves measured with real git in a repo with a gitignored `coverage/` and
|
|
60
|
+
* an untracked `test-results/`:
|
|
61
|
+
* • `ls-files --others --exclude-standard` returned the untracked file alone;
|
|
62
|
+
* dropping the flag brought the gitignored one back too.
|
|
63
|
+
* • a TRACKED file never appears, even while modified.
|
|
64
|
+
* So a project that deliberately commits, say, a `coverage/` badge keeps having
|
|
65
|
+
* its edits to it committed. Excluding by directory pathspec instead
|
|
66
|
+
* (`:(exclude)coverage/`) would silently stop committing those.
|
|
58
67
|
*
|
|
59
|
-
* Best-effort: any git failure yields an empty list, i.e.
|
|
68
|
+
* Best-effort: any git failure yields an empty list, i.e. a plain `git add -A`.
|
|
60
69
|
*/
|
|
61
70
|
export async function untrackedArtifacts(cwd, signal, spawnFn) {
|
|
62
71
|
const r = await git(cwd, ['ls-files', '--others', '--exclude-standard', '-z'], signal, spawnFn);
|
|
@@ -69,7 +78,7 @@ export async function untrackedArtifacts(cwd, signal, spawnFn) {
|
|
|
69
78
|
.sort();
|
|
70
79
|
}
|
|
71
80
|
/** `:(exclude)` pathspecs for `git add -A`; empty when nothing is excluded, so the
|
|
72
|
-
* common case
|
|
81
|
+
* common case adds no arguments at all and stays a bare `git add -A`. */
|
|
73
82
|
export function stagePathspec(excluded) {
|
|
74
83
|
if (excluded.length === 0)
|
|
75
84
|
return [];
|
|
@@ -80,10 +89,12 @@ export function stagePathspec(excluded) {
|
|
|
80
89
|
* Empty outside a git repo or on any git error — this is a GUARD input, and a
|
|
81
90
|
* guard that cannot conclude must not block.
|
|
82
91
|
*
|
|
83
|
-
* Why it exists
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
92
|
+
* Why it exists: with an unmerged index every later commit is doomed, verify runs
|
|
93
|
+
* against a conflicted tree, and — worst — a blind `git add -A` SILENTLY resolves
|
|
94
|
+
* the conflict with whatever is on disk. Reproduced on a real conflict: `git
|
|
95
|
+
* status` showed `UU c.txt`, then a bare `git add -A` turned it into `M c.txt`
|
|
96
|
+
* and left `ls-files -u` empty. The conflict markers become staged content and
|
|
97
|
+
* nothing says so.
|
|
87
98
|
*/
|
|
88
99
|
export async function gitUnmergedPaths(cwd, signal, spawnFn) {
|
|
89
100
|
const r = await git(cwd, ['ls-files', '-u'], signal, spawnFn);
|
|
@@ -103,7 +114,7 @@ export async function gitUnmergedPaths(cwd, signal, spawnFn) {
|
|
|
103
114
|
}
|
|
104
115
|
/** Sha of `refs/stash`, or null when there is no stash (or not a git repo). Used
|
|
105
116
|
* to detect a stash created (or consumed) during a task and left behind — the
|
|
106
|
-
* exact landmine that
|
|
117
|
+
* exact landmine that detonates days after it is pushed. */
|
|
107
118
|
export async function gitStashRef(cwd, signal, spawnFn) {
|
|
108
119
|
const r = await git(cwd, ['rev-parse', '-q', '--verify', 'refs/stash'], signal, spawnFn);
|
|
109
120
|
return r.exitCode === 0 ? r.stdout.trim() : null;
|
|
@@ -187,18 +198,20 @@ export async function gitCommitAll(cwd, message, signal, spawnFn) {
|
|
|
187
198
|
* verified task commit underneath it.
|
|
188
199
|
*
|
|
189
200
|
* `reset --hard` targets the enforce pass's in-place SOURCE edits. But it must NOT
|
|
190
|
-
* rewind the forensic gate trail
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* the
|
|
201
|
+
* rewind the forensic gate trail. `.pi-tasks/` is frequently TRACKED here — unlike
|
|
202
|
+
* the accept-debt ledger's writers, the per-task snapshot stages it with a plain
|
|
203
|
+
* `git add -A` and no exclusion — so a bare reset rewinds the task file along with
|
|
204
|
+
* the source and ERASES every trail line written after the snapshot.
|
|
205
|
+
*
|
|
206
|
+
* Both halves were run on a real repo. A bare `reset --hard HEAD~1` restored the
|
|
207
|
+
* source AND dropped the trail line added after the snapshot; calling this
|
|
208
|
+
* function on the identical setup restored the source and kept that line. The
|
|
209
|
+
* revert undoes code, the audit log survives.
|
|
198
210
|
*
|
|
199
|
-
* Best-effort and never throws: a git failure is swallowed
|
|
200
|
-
* already decided to keep the verified work
|
|
201
|
-
* enforce commit in place, which is surfaced as a warning
|
|
211
|
+
* Best-effort and never throws: a git failure is swallowed, since the caller has
|
|
212
|
+
* already decided to keep the verified work and a failed reset only leaves the
|
|
213
|
+
* enforce commit in place, which is surfaced as a warning. Called on a directory
|
|
214
|
+
* that is not a repo at all, it returns without throwing.
|
|
202
215
|
*/
|
|
203
216
|
export async function gitDropLastCommit(cwd, signal, spawnFn) {
|
|
204
217
|
const trail = await snapshotTrail(cwd);
|
package/dist/task/auto-io.d.ts
CHANGED
|
@@ -10,12 +10,16 @@ export declare function allocateAutoId(cwd: string): Promise<string>;
|
|
|
10
10
|
/**
|
|
11
11
|
* Parse a decompose-phase model output into a clean list of titles.
|
|
12
12
|
*
|
|
13
|
-
* No cap: every title the model emits is kept
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
13
|
+
* No cap: every title the model emits is kept — 100 lines in, 100 titles out.
|
|
14
|
+
* A ceiling here would be invisible and self-defeating, because it would clip the
|
|
15
|
+
* tail of a large plan AND re-clip every coverage retry, so a design that
|
|
16
|
+
* genuinely needs more tasks than the ceiling could never grow past it — it would
|
|
17
|
+
* burn its coverage rounds and ship a knowingly-gapped plan. The real bound is
|
|
18
|
+
* the design's own grounded-requirement scope, enforced downstream by the
|
|
19
|
+
* coverage loop; this parser must not pre-empt it.
|
|
20
|
+
*
|
|
21
|
+
* Accepts checkbox, bare-dash and numbered forms (`1.` and `2)`), indented or
|
|
22
|
+
* not, and skips prose lines and empty bullets.
|
|
19
23
|
*/
|
|
20
24
|
export declare function parseDecomposeList(raw: string): string[];
|
|
21
25
|
/** Parsed DECOMPOSE_COVERAGE_PROMPT verdict. */
|
|
@@ -24,16 +28,21 @@ export interface CoverageVerdict {
|
|
|
24
28
|
missing: string[];
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
27
|
-
* Parse the coverage-triage child's verdict. Returns null when no COVERAGE tag
|
|
28
|
-
*
|
|
29
|
-
*
|
|
31
|
+
* Parse the coverage-triage child's verdict. Returns null when no COVERAGE tag is
|
|
32
|
+
* present (the model wrote prose), and the caller reads a null verdict as an
|
|
33
|
+
* empty missing-list, so a malformed judgment can never block planning.
|
|
34
|
+
*
|
|
35
|
+
* `COVERAGE: INCOMPLETE` with no MISSING lines also returns null, deliberately:
|
|
36
|
+
* it names nothing to reprompt with, so treating it as a verdict would loop
|
|
37
|
+
* blind. Confirmed by running both shapes.
|
|
30
38
|
*/
|
|
31
39
|
export declare function parseCoverageVerdict(raw: string): CoverageVerdict | null;
|
|
32
40
|
/** Parse the "## tasks" checkbox list. */
|
|
33
41
|
export declare function parseTaskList(body: string): TaskEntry[];
|
|
34
42
|
/** Build the initial AUTO-file body. `coverage` is the requirement-level
|
|
35
|
-
* accounting summary
|
|
36
|
-
*
|
|
43
|
+
* accounting summary — a durable, user-visible record of what was carried
|
|
44
|
+
* cross-cutting and what stayed unowned. An empty string omits the section
|
|
45
|
+
* entirely rather than emitting a blank heading. */
|
|
37
46
|
export declare function buildAutoBody(feature: string, clarifications: string, titles: string[], coverage?: string): string;
|
|
38
47
|
/** Check off the Nth checkbox line, stamping the produced TASK_NNNN id. */
|
|
39
48
|
export declare function checkOffTask(cwd: string, id: string, index: number, producedId: string, title: string): Promise<void>;
|
|
@@ -46,18 +55,24 @@ export declare function checkOffTask(cwd: string, id: string, index: number, pro
|
|
|
46
55
|
export declare function stampTaskInProgress(cwd: string, id: string, index: number, producedId: string, title: string): Promise<void>;
|
|
47
56
|
/**
|
|
48
57
|
* Insert a NEW unchecked entry directly after the `afterIndex`th checkbox — the
|
|
49
|
-
* mid-run plan mutation the root-cause repair channel needs
|
|
50
|
-
*
|
|
51
|
-
*
|
|
58
|
+
* mid-run plan mutation the root-cause repair channel needs: a repair task must
|
|
59
|
+
* land BEFORE the next dependent task, not at the end of the plan, or the defect
|
|
60
|
+
* keeps failing everything in between.
|
|
52
61
|
*
|
|
53
|
-
* MONOTONIC by construction
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
62
|
+
* MONOTONIC by construction: this only ever SPLICES a line in. No existing entry
|
|
63
|
+
* is rewritten, reordered or dropped, and an already-present title is a no-op —
|
|
64
|
+
* so a plan can grow mid-run but never shrink, and a retried insert cannot
|
|
65
|
+
* duplicate. Returns whether a line was added.
|
|
66
|
+
*
|
|
67
|
+
* Run against a real plan: inserting a new title after entry 0 returns true and
|
|
68
|
+
* lands it directly after that entry; the same title again returns false; a title
|
|
69
|
+
* that is already present AND CHECKED also returns false; an empty title returns
|
|
70
|
+
* false. Everything else keeps its order.
|
|
57
71
|
*
|
|
58
72
|
* Later entries shift down by one, which is safe because the /task-auto loop
|
|
59
73
|
* re-reads and re-parses the plan at the top of every iteration and locates its
|
|
60
|
-
* next step
|
|
74
|
+
* next step with `entries.find(e => !e.done)` — first unchecked — rather than a
|
|
75
|
+
* cached index.
|
|
61
76
|
*/
|
|
62
77
|
export declare function insertTaskAfter(cwd: string, id: string, afterIndex: number, title: string): Promise<boolean>;
|
|
63
78
|
/**
|
|
@@ -65,12 +80,17 @@ export declare function insertTaskAfter(cwd: string, id: string, afterIndex: num
|
|
|
65
80
|
* last-write time the resume banner reports (see resume-gap.ts). Null when there
|
|
66
81
|
* is nothing resumable.
|
|
67
82
|
*
|
|
68
|
-
* `states` narrows which states count as resumable
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
83
|
+
* `states` narrows which states count as resumable BEFORE the newest-wins sort,
|
|
84
|
+
* and that ordering is the whole point. The UNATTENDED path passes
|
|
85
|
+
* UNATTENDED_STATES so the search answers the question it actually asks — "is
|
|
86
|
+
* there an IN-FLIGHT run to pick up?"
|
|
87
|
+
*
|
|
88
|
+
* Filtering after the sort instead would let one failed run shadow an in-flight
|
|
89
|
+
* one behind it. Demonstrated on two files, the newer `failed` and the older
|
|
90
|
+
* `in_progress`: the default states pick the newer failed one, while
|
|
91
|
+
* UNATTENDED_STATES picks the older in-progress one. Had the newest been chosen
|
|
92
|
+
* first and only then refused on state, the restart would find nothing and the
|
|
93
|
+
* in-flight run would sit in exactly the dead air this exists to end.
|
|
74
94
|
*/
|
|
75
95
|
export declare function findResumableAutoDetailed(cwd: string, states?: readonly TaskState[]): Promise<AutoResumeCandidate | null>;
|
|
76
96
|
/** Id-only form of {@link findResumableAutoDetailed}. */
|
package/dist/task/auto-io.js
CHANGED
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
* AUTO-file I/O & parsing for /task-auto.
|
|
3
3
|
*
|
|
4
4
|
* Thin layer over task-io/task-parsers: a TASK_AUTO_NNNN.md is a normal task
|
|
5
|
-
* file
|
|
6
|
-
*
|
|
5
|
+
* file — the same front matter, parsed by the same `parseFrontMatter` — whose
|
|
6
|
+
* body holds `## feature prompt`, `## clarifications`, `## tasks` and optionally
|
|
7
|
+
* `## coverage`. The checkbox list under `## tasks` is the resume cursor, and the
|
|
8
|
+
* loop finds its next step with `entries.find(e => !e.done)` rather than a
|
|
9
|
+
* remembered position.
|
|
7
10
|
*/
|
|
8
11
|
import * as fsp from 'node:fs/promises';
|
|
9
12
|
import * as path from 'node:path';
|
|
@@ -29,12 +32,16 @@ export async function allocateAutoId(cwd) {
|
|
|
29
32
|
/**
|
|
30
33
|
* Parse a decompose-phase model output into a clean list of titles.
|
|
31
34
|
*
|
|
32
|
-
* No cap: every title the model emits is kept
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* No cap: every title the model emits is kept — 100 lines in, 100 titles out.
|
|
36
|
+
* A ceiling here would be invisible and self-defeating, because it would clip the
|
|
37
|
+
* tail of a large plan AND re-clip every coverage retry, so a design that
|
|
38
|
+
* genuinely needs more tasks than the ceiling could never grow past it — it would
|
|
39
|
+
* burn its coverage rounds and ship a knowingly-gapped plan. The real bound is
|
|
40
|
+
* the design's own grounded-requirement scope, enforced downstream by the
|
|
41
|
+
* coverage loop; this parser must not pre-empt it.
|
|
42
|
+
*
|
|
43
|
+
* Accepts checkbox, bare-dash and numbered forms (`1.` and `2)`), indented or
|
|
44
|
+
* not, and skips prose lines and empty bullets.
|
|
38
45
|
*/
|
|
39
46
|
export function parseDecomposeList(raw) {
|
|
40
47
|
const out = [];
|
|
@@ -46,9 +53,13 @@ export function parseDecomposeList(raw) {
|
|
|
46
53
|
return out;
|
|
47
54
|
}
|
|
48
55
|
/**
|
|
49
|
-
* Parse the coverage-triage child's verdict. Returns null when no COVERAGE tag
|
|
50
|
-
*
|
|
51
|
-
*
|
|
56
|
+
* Parse the coverage-triage child's verdict. Returns null when no COVERAGE tag is
|
|
57
|
+
* present (the model wrote prose), and the caller reads a null verdict as an
|
|
58
|
+
* empty missing-list, so a malformed judgment can never block planning.
|
|
59
|
+
*
|
|
60
|
+
* `COVERAGE: INCOMPLETE` with no MISSING lines also returns null, deliberately:
|
|
61
|
+
* it names nothing to reprompt with, so treating it as a verdict would loop
|
|
62
|
+
* blind. Confirmed by running both shapes.
|
|
52
63
|
*/
|
|
53
64
|
export function parseCoverageVerdict(raw) {
|
|
54
65
|
const tag = /^\s*COVERAGE:\s*(COMPLETE|INCOMPLETE)\s*$/im.exec(raw);
|
|
@@ -98,8 +109,9 @@ export function parseTaskList(body) {
|
|
|
98
109
|
return entries;
|
|
99
110
|
}
|
|
100
111
|
/** Build the initial AUTO-file body. `coverage` is the requirement-level
|
|
101
|
-
* accounting summary
|
|
102
|
-
*
|
|
112
|
+
* accounting summary — a durable, user-visible record of what was carried
|
|
113
|
+
* cross-cutting and what stayed unowned. An empty string omits the section
|
|
114
|
+
* entirely rather than emitting a blank heading. */
|
|
103
115
|
export function buildAutoBody(feature, clarifications, titles, coverage = '') {
|
|
104
116
|
const tasks = titles.map(t => `- [ ] ${t}`).join('\n');
|
|
105
117
|
return (`\n## feature prompt\n\n${feature.trim() || '(none)'}\n\n`
|
|
@@ -151,18 +163,24 @@ function entryTitle(line) {
|
|
|
151
163
|
}
|
|
152
164
|
/**
|
|
153
165
|
* Insert a NEW unchecked entry directly after the `afterIndex`th checkbox — the
|
|
154
|
-
* mid-run plan mutation the root-cause repair channel needs
|
|
155
|
-
*
|
|
156
|
-
*
|
|
166
|
+
* mid-run plan mutation the root-cause repair channel needs: a repair task must
|
|
167
|
+
* land BEFORE the next dependent task, not at the end of the plan, or the defect
|
|
168
|
+
* keeps failing everything in between.
|
|
157
169
|
*
|
|
158
|
-
* MONOTONIC by construction
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
170
|
+
* MONOTONIC by construction: this only ever SPLICES a line in. No existing entry
|
|
171
|
+
* is rewritten, reordered or dropped, and an already-present title is a no-op —
|
|
172
|
+
* so a plan can grow mid-run but never shrink, and a retried insert cannot
|
|
173
|
+
* duplicate. Returns whether a line was added.
|
|
174
|
+
*
|
|
175
|
+
* Run against a real plan: inserting a new title after entry 0 returns true and
|
|
176
|
+
* lands it directly after that entry; the same title again returns false; a title
|
|
177
|
+
* that is already present AND CHECKED also returns false; an empty title returns
|
|
178
|
+
* false. Everything else keeps its order.
|
|
162
179
|
*
|
|
163
180
|
* Later entries shift down by one, which is safe because the /task-auto loop
|
|
164
181
|
* re-reads and re-parses the plan at the top of every iteration and locates its
|
|
165
|
-
* next step
|
|
182
|
+
* next step with `entries.find(e => !e.done)` — first unchecked — rather than a
|
|
183
|
+
* cached index.
|
|
166
184
|
*/
|
|
167
185
|
export async function insertTaskAfter(cwd, id, afterIndex, title) {
|
|
168
186
|
const clean = title.trim();
|
|
@@ -186,8 +204,13 @@ export async function insertTaskAfter(cwd, id, afterIndex, title) {
|
|
|
186
204
|
if (seen === afterIndex)
|
|
187
205
|
break;
|
|
188
206
|
}
|
|
189
|
-
// An out-of-range
|
|
190
|
-
//
|
|
207
|
+
// An out-of-range afterIndex is not an error: the loop above leaves `insertAt`
|
|
208
|
+
// just past the LAST checkbox, so the entry is appended rather than lost — a
|
|
209
|
+
// plan that grew underneath the caller must still receive it. Confirmed with
|
|
210
|
+
// afterIndex 99 on a five-entry plan.
|
|
211
|
+
//
|
|
212
|
+
// The guard below is the different case: a `## tasks` section with NO checkbox
|
|
213
|
+
// lines at all, where there is no position to splice into.
|
|
191
214
|
if (insertAt === -1)
|
|
192
215
|
return false;
|
|
193
216
|
lines.splice(insertAt, 0, `- [ ] ${clean}`);
|
|
@@ -199,12 +222,17 @@ export async function insertTaskAfter(cwd, id, afterIndex, title) {
|
|
|
199
222
|
* last-write time the resume banner reports (see resume-gap.ts). Null when there
|
|
200
223
|
* is nothing resumable.
|
|
201
224
|
*
|
|
202
|
-
* `states` narrows which states count as resumable
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
225
|
+
* `states` narrows which states count as resumable BEFORE the newest-wins sort,
|
|
226
|
+
* and that ordering is the whole point. The UNATTENDED path passes
|
|
227
|
+
* UNATTENDED_STATES so the search answers the question it actually asks — "is
|
|
228
|
+
* there an IN-FLIGHT run to pick up?"
|
|
229
|
+
*
|
|
230
|
+
* Filtering after the sort instead would let one failed run shadow an in-flight
|
|
231
|
+
* one behind it. Demonstrated on two files, the newer `failed` and the older
|
|
232
|
+
* `in_progress`: the default states pick the newer failed one, while
|
|
233
|
+
* UNATTENDED_STATES picks the older in-progress one. Had the newest been chosen
|
|
234
|
+
* first and only then refused on state, the restart would find nothing and the
|
|
235
|
+
* in-flight run would sit in exactly the dead air this exists to end.
|
|
208
236
|
*/
|
|
209
237
|
export async function findResumableAutoDetailed(cwd, states = RESUMABLE_STATES) {
|
|
210
238
|
await ensureTasksDir(cwd);
|
|
@@ -16,15 +16,15 @@ export interface AutoDeps extends GateDeps, FinalGateStageDeps {
|
|
|
16
16
|
runChild: (name: string, tools: string, prompt: string) => Promise<string>;
|
|
17
17
|
/**
|
|
18
18
|
* Paths with unmerged index entries (an in-progress merge conflict). The loop
|
|
19
|
-
* refuses to START a task on a conflicted tree
|
|
20
|
-
*
|
|
19
|
+
* refuses to START a task on a conflicted tree: a full implementation turn
|
|
20
|
+
* and its verifies run against one with every commit doomed from the outset.
|
|
21
21
|
* Absent (tests) → treated as clean.
|
|
22
22
|
*/
|
|
23
23
|
unmergedPaths?: (cwd: string) => Promise<string[]>;
|
|
24
24
|
/**
|
|
25
25
|
* Sha of refs/stash or null. Compared around each task so a stash pushed (or
|
|
26
26
|
* consumed) during the task and left behind is called out — an orphan stash is
|
|
27
|
-
* exactly the landmine that
|
|
27
|
+
* exactly the landmine that detonates as an unresolvable conflict later.
|
|
28
28
|
* Absent (tests) → the check is skipped.
|
|
29
29
|
*/
|
|
30
30
|
stashRef?: (cwd: string) => Promise<string | null>;
|
|
@@ -50,34 +50,35 @@ export declare function expandFeatureMentions(cwd: string, feature: string): Pro
|
|
|
50
50
|
export declare function readableMentions(cwd: string, feature: string): Promise<string[]>;
|
|
51
51
|
/**
|
|
52
52
|
* Thread the feature's spec references AND any per-task decisions into every
|
|
53
|
-
* decomposed task title. A title is ALL a per-task pipeline ever sees, so both
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* vite.config.ts.
|
|
53
|
+
* decomposed task title. A title is ALL a per-task pipeline ever sees, so both the
|
|
54
|
+
* design doc the feature pointed at and the user's clarification choices have to
|
|
55
|
+
* ride along or they are invisible downstream — a task that cannot see the doc
|
|
56
|
+
* invents its own schema, and one that cannot see "do not use vite" is overridden
|
|
57
|
+
* by whatever the doc's own config says.
|
|
59
58
|
*
|
|
60
|
-
* Precedence is the crux: a clarification is a CORRECTION to a
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
59
|
+
* Precedence is the crux: a clarification is a CORRECTION to a possibly stale spec
|
|
60
|
+
* doc, so the decisions clause is marked as overriding the doc while the doc stays
|
|
61
|
+
* authoritative for everything the decisions do not touch. The emitted order puts
|
|
62
|
+
* decisions first, then the spec ref. Decompose scopes each decision to the tasks
|
|
63
|
+
* it governs, so most titles carry none.
|
|
64
|
+
*
|
|
65
|
+
* Run: with no refs and no decisions the title comes back unchanged, and
|
|
66
|
+
* re-threading an already-threaded list is a no-op.
|
|
66
67
|
*/
|
|
67
68
|
export declare function attachSpecRefs(titles: string[], refs: string[]): string[];
|
|
68
69
|
/**
|
|
69
70
|
* Build the refine scope fence for step `currentIndex` of an N-step /task-auto
|
|
70
71
|
* plan. Every per-step pipeline only ever sees its own title, so without this the
|
|
71
72
|
* refine phase — told "the task title is only a pointer into that spec; follow the
|
|
72
|
-
* spec" — re-expands the whole referenced design into
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* slice. Validated on the local model: with the fence, refine's CONSTRAINTS gained
|
|
76
|
-
* an explicit per-step deferral list and tool calls dropped 27→11.
|
|
73
|
+
* spec" — re-expands the whole referenced design into a single task, implementing
|
|
74
|
+
* the entire plan under step one. The fence lists the sibling steps by number and
|
|
75
|
+
* forbids touching anything they own, so refine bounds this step's slice.
|
|
77
76
|
*
|
|
78
77
|
* The plan listing strips the threaded "| decisions … | spec …" tail from each
|
|
79
|
-
* title
|
|
80
|
-
*
|
|
78
|
+
* title and keeps the human-readable head, so the model reads clean step names,
|
|
79
|
+
* and it marks the current one "(THIS STEP)" — both confirmed by building a fence
|
|
80
|
+
* over threaded titles. The authoritative spec ref still rides on THIS step's own
|
|
81
|
+
* title via attachSpecRefs.
|
|
81
82
|
*/
|
|
82
83
|
export declare function buildScopeFence(titles: string[], currentIndex: number): string;
|
|
83
84
|
/**
|
|
@@ -117,8 +118,9 @@ export declare function orientFeature(cwd: string, feature: string, deps: AutoDe
|
|
|
117
118
|
* settles is auto-resolved and never shown — only genuine open forks reach the user.
|
|
118
119
|
* The model emits NONE when nothing remains.
|
|
119
120
|
*
|
|
120
|
-
* The ONLY stage that
|
|
121
|
-
*
|
|
121
|
+
* The ONLY stage that ASKS the user anything, and so the only one that can be
|
|
122
|
+
* dismissed — the others only notify, which cannot be. `null` means the user
|
|
123
|
+
* cancelled and the cancellation has already been announced.
|
|
122
124
|
* Every other outcome is a transcript, possibly empty.
|
|
123
125
|
*/
|
|
124
126
|
export declare function elicitClarifications(ctx: ExtensionCommandContext, cwd: string, deps: AutoDeps, oriented: OrientedFeature): Promise<string | null>;
|