@tacuchi/agent-workflow-cli 22.4.2 → 23.0.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.
Files changed (246) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/git-cli.js +59 -17
  3. package/dist/adapters/git-cli.js.map +1 -1
  4. package/dist/adapters/node-file-system.js +55 -1
  5. package/dist/adapters/node-file-system.js.map +1 -1
  6. package/dist/application/artifacts-service.js +2 -2
  7. package/dist/application/artifacts-service.js.map +1 -1
  8. package/dist/application/capability/dispatcher.js +2 -2
  9. package/dist/application/capability/dispatcher.js.map +1 -1
  10. package/dist/application/capability/installed-inventory.js +2 -2
  11. package/dist/application/capability/installed-inventory.js.map +1 -1
  12. package/dist/application/capability/readiness.js +1 -1
  13. package/dist/application/capability/readiness.js.map +1 -1
  14. package/dist/application/check-branch-service.js +2 -2
  15. package/dist/application/check-branch-service.js.map +1 -1
  16. package/dist/application/checkpoint/files-touched.js +271 -0
  17. package/dist/application/checkpoint/files-touched.js.map +1 -0
  18. package/dist/application/checkpoint/markdown.js +61 -8
  19. package/dist/application/checkpoint/markdown.js.map +1 -1
  20. package/dist/application/checkpoint/state-reader.js +8 -2
  21. package/dist/application/checkpoint/state-reader.js.map +1 -1
  22. package/dist/application/checkpoint-write-service.js +16 -5
  23. package/dist/application/checkpoint-write-service.js.map +1 -1
  24. package/dist/application/claims-ledger.js +330 -0
  25. package/dist/application/claims-ledger.js.map +1 -0
  26. package/dist/application/claims-recovery.js +338 -0
  27. package/dist/application/claims-recovery.js.map +1 -0
  28. package/dist/application/dev-only-services.js +154 -44
  29. package/dist/application/dev-only-services.js.map +1 -1
  30. package/dist/application/elicitation-server.js +382 -0
  31. package/dist/application/elicitation-server.js.map +1 -0
  32. package/dist/application/elicitation-stdio.js +48 -0
  33. package/dist/application/elicitation-stdio.js.map +1 -0
  34. package/dist/application/flow/advance.js +86 -5
  35. package/dist/application/flow/advance.js.map +1 -1
  36. package/dist/application/flow/checkout-observation.js +152 -0
  37. package/dist/application/flow/checkout-observation.js.map +1 -0
  38. package/dist/application/flow/flow-service.js +72 -13
  39. package/dist/application/flow/flow-service.js.map +1 -1
  40. package/dist/application/flow/internal-actions.js +460 -1
  41. package/dist/application/flow/internal-actions.js.map +1 -1
  42. package/dist/application/flow/internal-drive.js +22 -9
  43. package/dist/application/flow/internal-drive.js.map +1 -1
  44. package/dist/application/flow/prove.js +205 -0
  45. package/dist/application/flow/prove.js.map +1 -0
  46. package/dist/application/flow/run-journey.js +15 -0
  47. package/dist/application/flow/run-journey.js.map +1 -0
  48. package/dist/application/flow/run-projection.js +15 -3
  49. package/dist/application/flow/run-projection.js.map +1 -1
  50. package/dist/application/flow/run-state-service.js +19 -4
  51. package/dist/application/flow/run-state-service.js.map +1 -1
  52. package/dist/application/flow/submit.js +250 -72
  53. package/dist/application/flow/submit.js.map +1 -1
  54. package/dist/application/generate-launch-service.js +4 -4
  55. package/dist/application/generate-launch-service.js.map +1 -1
  56. package/dist/application/git-flow-service.js +9 -0
  57. package/dist/application/git-flow-service.js.map +1 -1
  58. package/dist/application/local-proposal.js +9 -0
  59. package/dist/application/local-proposal.js.map +1 -1
  60. package/dist/application/lock-service.js +6 -3
  61. package/dist/application/lock-service.js.map +1 -1
  62. package/dist/application/mcp-doctor-service.js.map +1 -1
  63. package/dist/application/mcp-host-reader.js +30 -13
  64. package/dist/application/mcp-host-reader.js.map +1 -1
  65. package/dist/application/mcp-host-writer.js +136 -112
  66. package/dist/application/mcp-host-writer.js.map +1 -1
  67. package/dist/application/mcp-remove-service.js +7 -3
  68. package/dist/application/mcp-remove-service.js.map +1 -1
  69. package/dist/application/mcp-scope-common.js +1 -3
  70. package/dist/application/mcp-scope-common.js.map +1 -1
  71. package/dist/application/mcp-setup-service.js +7 -3
  72. package/dist/application/mcp-setup-service.js.map +1 -1
  73. package/dist/application/merge-state-service.js +10 -16
  74. package/dist/application/merge-state-service.js.map +1 -1
  75. package/dist/application/multiroot/claude.js +34 -15
  76. package/dist/application/multiroot/claude.js.map +1 -1
  77. package/dist/application/multiroot/codex.js +9 -5
  78. package/dist/application/multiroot/codex.js.map +1 -1
  79. package/dist/application/multiroot-service.js +20 -11
  80. package/dist/application/multiroot-service.js.map +1 -1
  81. package/dist/application/parsers/project-block.js +25 -2
  82. package/dist/application/parsers/project-block.js.map +1 -1
  83. package/dist/application/paths-service.js +30 -31
  84. package/dist/application/paths-service.js.map +1 -1
  85. package/dist/application/plan-exec-batch-service.js +549 -0
  86. package/dist/application/plan-exec-batch-service.js.map +1 -0
  87. package/dist/application/plan-exec-decision-service.js +273 -0
  88. package/dist/application/plan-exec-decision-service.js.map +1 -0
  89. package/dist/application/project-md-service.js +2 -2
  90. package/dist/application/project-md-service.js.map +1 -1
  91. package/dist/application/project-md-upsert-service.js +4 -4
  92. package/dist/application/project-md-upsert-service.js.map +1 -1
  93. package/dist/application/project-tab-data.js +12 -7
  94. package/dist/application/project-tab-data.js.map +1 -1
  95. package/dist/application/release-data-service.js +2 -2
  96. package/dist/application/release-data-service.js.map +1 -1
  97. package/dist/application/resume-service.js +32 -11
  98. package/dist/application/resume-service.js.map +1 -1
  99. package/dist/application/retirement/apply.js +84 -0
  100. package/dist/application/retirement/apply.js.map +1 -1
  101. package/dist/application/retirement/attribution.js +31 -1
  102. package/dist/application/retirement/attribution.js.map +1 -1
  103. package/dist/application/retirement/graph.js +19 -1
  104. package/dist/application/retirement/graph.js.map +1 -1
  105. package/dist/application/retirement/journal.js +11 -0
  106. package/dist/application/retirement/journal.js.map +1 -1
  107. package/dist/application/retirement/prepare.js +89 -3
  108. package/dist/application/retirement/prepare.js.map +1 -1
  109. package/dist/application/retirement/preview.js +16 -0
  110. package/dist/application/retirement/preview.js.map +1 -1
  111. package/dist/application/retirement/resolve.js +65 -0
  112. package/dist/application/retirement/resolve.js.map +1 -1
  113. package/dist/application/self/host-states.js +2 -0
  114. package/dist/application/self/host-states.js.map +1 -1
  115. package/dist/application/self/install-skill.js +53 -19
  116. package/dist/application/self/install-skill.js.map +1 -1
  117. package/dist/application/self/mcp-config.js +28 -30
  118. package/dist/application/self/mcp-config.js.map +1 -1
  119. package/dist/application/self/mcp-offer.js +96 -0
  120. package/dist/application/self/mcp-offer.js.map +1 -0
  121. package/dist/application/self/mcp-via-state.js +59 -0
  122. package/dist/application/self/mcp-via-state.js.map +1 -0
  123. package/dist/application/self/uninstall-skill.js +18 -3
  124. package/dist/application/self/uninstall-skill.js.map +1 -1
  125. package/dist/application/self/uninstall.js +37 -8
  126. package/dist/application/self/uninstall.js.map +1 -1
  127. package/dist/application/session-close-service.js +24 -1
  128. package/dist/application/session-close-service.js.map +1 -1
  129. package/dist/application/session-create-service.js +7 -0
  130. package/dist/application/session-create-service.js.map +1 -1
  131. package/dist/application/session-resume-service.js +2 -2
  132. package/dist/application/session-resume-service.js.map +1 -1
  133. package/dist/application/sessions-service.js +2 -4
  134. package/dist/application/sessions-service.js.map +1 -1
  135. package/dist/application/skills-resolver-service.js +4 -4
  136. package/dist/application/skills-resolver-service.js.map +1 -1
  137. package/dist/application/source-boundary-policy.js +18 -7
  138. package/dist/application/source-boundary-policy.js.map +1 -1
  139. package/dist/application/source-remove-service.js +12 -1
  140. package/dist/application/source-remove-service.js.map +1 -1
  141. package/dist/application/sources-service.js +2 -2
  142. package/dist/application/sources-service.js.map +1 -1
  143. package/dist/application/status-service.js +4 -0
  144. package/dist/application/status-service.js.map +1 -1
  145. package/dist/application/visibility-doctor-service.js +1 -1
  146. package/dist/application/visibility-doctor-service.js.map +1 -1
  147. package/dist/application/workline-index-service.js +182 -27
  148. package/dist/application/workline-index-service.js.map +1 -1
  149. package/dist/application/workspace-init-service.js +85 -265
  150. package/dist/application/workspace-init-service.js.map +1 -1
  151. package/dist/application/workspace-materialization-service.js +300 -0
  152. package/dist/application/workspace-materialization-service.js.map +1 -0
  153. package/dist/application/worktree-service.js +32 -3
  154. package/dist/application/worktree-service.js.map +1 -1
  155. package/dist/cli/commands/capability.js +4 -7
  156. package/dist/cli/commands/capability.js.map +1 -1
  157. package/dist/cli/commands/claims.js +72 -0
  158. package/dist/cli/commands/claims.js.map +1 -0
  159. package/dist/cli/commands/dev-only.js +73 -25
  160. package/dist/cli/commands/dev-only.js.map +1 -1
  161. package/dist/cli/commands/flow.js +145 -42
  162. package/dist/cli/commands/flow.js.map +1 -1
  163. package/dist/cli/commands/index.js +2 -0
  164. package/dist/cli/commands/index.js.map +1 -1
  165. package/dist/cli/commands/mcp.js +124 -35
  166. package/dist/cli/commands/mcp.js.map +1 -1
  167. package/dist/cli/commands/multiroot.js +40 -7
  168. package/dist/cli/commands/multiroot.js.map +1 -1
  169. package/dist/cli/commands/resume.js +9 -3
  170. package/dist/cli/commands/resume.js.map +1 -1
  171. package/dist/cli/commands/retirement.js +9 -0
  172. package/dist/cli/commands/retirement.js.map +1 -1
  173. package/dist/cli/commands/session-create.js +1 -1
  174. package/dist/cli/commands/session-create.js.map +1 -1
  175. package/dist/cli/commands/skills.js +1 -1
  176. package/dist/cli/commands/skills.js.map +1 -1
  177. package/dist/cli/commands/status.js +72 -24
  178. package/dist/cli/commands/status.js.map +1 -1
  179. package/dist/cli/commands/workspace-init.js +5 -5
  180. package/dist/cli/commands/workspace-init.js.map +1 -1
  181. package/dist/cli/help-groups.js +5 -0
  182. package/dist/cli/help-groups.js.map +1 -1
  183. package/dist/cli/main.js +112 -39
  184. package/dist/cli/main.js.map +1 -1
  185. package/dist/cli/parser.js +3 -0
  186. package/dist/cli/parser.js.map +1 -1
  187. package/dist/cli/tui/app.js +3 -2
  188. package/dist/cli/tui/app.js.map +1 -1
  189. package/dist/cli/tui/components/host-admin-section.js +46 -2
  190. package/dist/cli/tui/components/host-admin-section.js.map +1 -1
  191. package/dist/cli/tui/components/workspace-init-form.js +7 -7
  192. package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
  193. package/dist/cli/tui/data/workflow-content.js +2 -2
  194. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  195. package/dist/cli/tui/tabs/config-tab.js +4 -3
  196. package/dist/cli/tui/tabs/config-tab.js.map +1 -1
  197. package/dist/cli/tui/tabs/mcp-tab-helpers.js +1 -1
  198. package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
  199. package/dist/cli/tui/tabs/project-tab.js +18 -21
  200. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  201. package/dist/cli/tui/workspace-root.js +13 -0
  202. package/dist/cli/tui/workspace-root.js.map +1 -0
  203. package/dist/domain/capability/protocol.js +2 -2
  204. package/dist/domain/capability/protocol.js.map +1 -1
  205. package/dist/domain/degradation-notice.js +60 -0
  206. package/dist/domain/degradation-notice.js.map +1 -0
  207. package/dist/domain/elicitation.js +152 -0
  208. package/dist/domain/elicitation.js.map +1 -0
  209. package/dist/domain/flow/answer.js +173 -42
  210. package/dist/domain/flow/answer.js.map +1 -1
  211. package/dist/domain/flow/authority.js +180 -127
  212. package/dist/domain/flow/authority.js.map +1 -1
  213. package/dist/domain/flow/directive.js +47 -1
  214. package/dist/domain/flow/directive.js.map +1 -1
  215. package/dist/domain/flow/rules.js +7 -4
  216. package/dist/domain/flow/rules.js.map +1 -1
  217. package/dist/domain/flow/run-state.js +636 -31
  218. package/dist/domain/flow/run-state.js.map +1 -1
  219. package/dist/domain/harnesses.js +16 -0
  220. package/dist/domain/harnesses.js.map +1 -1
  221. package/dist/domain/mcp-entry.js +36 -14
  222. package/dist/domain/mcp-entry.js.map +1 -1
  223. package/dist/domain/retirement/proposal.js +1 -0
  224. package/dist/domain/retirement/proposal.js.map +1 -1
  225. package/dist/domain/structured-choice-stamp.js +32 -4
  226. package/dist/domain/structured-choice-stamp.js.map +1 -1
  227. package/dist/domain/workline-mcp-entry.js +37 -0
  228. package/dist/domain/workline-mcp-entry.js.map +1 -0
  229. package/dist/runtime/namespace-resolver.js +104 -18
  230. package/dist/runtime/namespace-resolver.js.map +1 -1
  231. package/package.json +1 -1
  232. package/skills/w/README.md +2 -2
  233. package/skills/w/SKILL.md +9 -10
  234. package/skills/w/artifacts/README.md +1 -1
  235. package/skills/w/commands/README.md +3 -3
  236. package/skills/w/commands/persist.md +3 -1
  237. package/skills/w/commands/resume.md +1 -1
  238. package/skills/w/commands/spec-new.md +2 -2
  239. package/skills/w/commands/status.md +1 -1
  240. package/skills/w/commands/workspace-init.md +9 -10
  241. package/skills/w/context/MANIFEST.json +1 -4
  242. package/skills/w/harness/HARNESS.md +1 -1
  243. package/skills/w/loops/quick-loop/LOOP.md +1 -1
  244. package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
  245. package/skills/w/modules/WORKSPACE-SCAFFOLD.md +17 -20
  246. package/skills/w/schemas/capability-descriptor.schema.json +1 -1
@@ -0,0 +1,549 @@
1
+ /**
2
+ * CLI-owned publication of one plan-execution batch.
3
+ *
4
+ * The plan document is the progress board. This service derives the exact
5
+ * checkbox and phase edits from a sealed batch snapshot, then publishes those
6
+ * bytes and the run-state trace under the run lock. It deliberately accepts no
7
+ * a pre-batch boolean asserted by an agent: the document and the batch are
8
+ * the only authorities on what can be credited.
9
+ */
10
+ import { join } from "node:path";
11
+ import { withPlanExecBatchLoop, withPlanExecBatchPublication, withPlanExecBatchPublicationPrepared, withPlanExecBatchStage, } from "../domain/flow/run-state.js";
12
+ import { baseDigest, sealProposal } from "../domain/proposal.js";
13
+ import { applyUnderLock } from "./flow/run-state-service.js";
14
+ import { applyLocalProposal } from "./local-proposal.js";
15
+ import { scanMarkdown } from "./markdown.js";
16
+ import { parsePhases } from "./parsers/phases.js";
17
+ import { parsePlanStatus } from "./parsers/plan-status.js";
18
+ import { parseTasks } from "./parsers/tasks.js";
19
+ const TASK_ID = /\b(T\d+\.\d+)\b/;
20
+ const PHASE_HEADING = /^\s*###\s+F(\d+)\b/i;
21
+ const PHASE_BOUNDARY = /^\s*#{1,3}\s+/;
22
+ const PHASE_STATE = /^\s*>\s*(?:\*\*)?Estado(?:\*\*)?\s*:\s*.*$/i;
23
+ const PHASE_BLOCKER = /^\s*>\s*(?:\*\*)?Bloqueo(?:\*\*)?\s*:\s*.*$/i;
24
+ const PLAN_STATUS = /^\s*>\s*Estado\s*:\s*.*$/i;
25
+ const PLAN_CLOSURE = /^\s*>\s*Cierre\s*:\s*.*$/i;
26
+ /**
27
+ * Build the state snapshot from the actual plan text. A caller declares only a
28
+ * phase range; task ids and the plan digest are derived here.
29
+ */
30
+ export function inferPlanExecBatch(text, input) {
31
+ const phases = uniquePositive(input.phases);
32
+ if (input.id.trim().length === 0 || !Number.isInteger(input.iteration) || input.iteration < 1) {
33
+ return fail("PLAN_EXEC_BATCH_INVALID", "el batch no tiene id o iteración válidos");
34
+ }
35
+ if (phases.length === 0)
36
+ return fail("PLAN_EXEC_BATCH_INVALID", "el batch no declara ninguna fase");
37
+ const parsedPhases = parsePhases(text);
38
+ const known = new Set(parsedPhases.items.map((phase) => phase.n));
39
+ const absent = phases.filter((phase) => !known.has(phase));
40
+ if (absent.length > 0) {
41
+ return fail("PLAN_EXEC_BATCH_INVALID", `el batch nombra fases que el plan no declara: ${absent.map((phase) => `F${phase}`).join(", ")}`);
42
+ }
43
+ const tasks = parseTasks(text)
44
+ .items // A batch only owns work still open when its snapshot is sealed. Already
45
+ // checked tasks stay evidence of an earlier iteration; including them here
46
+ // would let a retry appear to re-accredit somebody else's completed work.
47
+ .filter((task) => task.status === "open" && task.phase !== undefined && phases.includes(task.phase))
48
+ .map((task) => taskIdOf(task.text))
49
+ .filter((id) => id !== null);
50
+ if (tasks.length === 0 || new Set(tasks).size !== tasks.length) {
51
+ return fail("PLAN_EXEC_BATCH_INVALID", "las fases del batch no exponen tareas Tn.m únicas que el CLI pueda acreditar");
52
+ }
53
+ return {
54
+ ok: true,
55
+ batch: {
56
+ id: input.id,
57
+ iteration: input.iteration,
58
+ mode: input.mode,
59
+ phases,
60
+ tasks,
61
+ plan_digest: baseDigest(text),
62
+ stage: "inferred",
63
+ },
64
+ };
65
+ }
66
+ /** Validate the batch against the plan and build the one exact plan-document edit. */
67
+ export function preparePlanExecBatchPublication(text, input) {
68
+ const before = baseDigest(text);
69
+ if (before !== input.batch.plan_digest) {
70
+ return fail("PLAN_EXEC_BATCH_STALE", "el plan cambió desde que se infirió el batch", "re-inferí el batch sobre los bytes vigentes; no se acreditan tareas contra un plan movido");
71
+ }
72
+ const completed = uniqueStrings(input.completed_tasks);
73
+ if (!sameSet(completed, input.batch.tasks)) {
74
+ return fail("PLAN_EXEC_BATCH_TASK_SET_INVALID", "la publicación no acredita exactamente las tareas del batch", `este batch sólo puede acreditar: ${input.batch.tasks.join(", ")}`);
75
+ }
76
+ const parsedTasks = parseTasks(text).items;
77
+ const byId = new Map(parsedTasks
78
+ .map((task) => [taskIdOf(task.text), task])
79
+ .filter((entry) => entry[0] !== null));
80
+ const missing = completed.filter((id) => !byId.has(id));
81
+ if (missing.length > 0) {
82
+ return fail("PLAN_EXEC_BATCH_TASK_UNKNOWN", `el plan no declara ${missing.join(", ")}`, "re-inferí el batch: sólo se marcan tareas que el plan vigente contiene");
83
+ }
84
+ const outside = completed.filter((id) => {
85
+ const task = byId.get(id);
86
+ return task?.phase === undefined || !input.batch.phases.includes(task.phase);
87
+ });
88
+ if (outside.length > 0) {
89
+ return fail("PLAN_EXEC_BATCH_TASK_OUTSIDE_PHASE", `${outside.join(", ")} no pertenece a una fase del batch`, "corregí el rango del batch: una publicación no puede acreditar tareas de otra fase");
90
+ }
91
+ const invalidPhase = input.phase_updates.find((update) => !Number.isInteger(update.phase) || update.phase < 1);
92
+ if (invalidPhase !== undefined) {
93
+ return fail("PLAN_EXEC_BATCH_PHASE_INVALID", "la publicación declara una fase inválida", "cada transición de fase debe nombrar un número F positivo del batch");
94
+ }
95
+ const seenUpdatePhases = new Set();
96
+ const duplicatePhase = input.phase_updates.find((update) => {
97
+ if (seenUpdatePhases.has(update.phase))
98
+ return true;
99
+ seenUpdatePhases.add(update.phase);
100
+ return false;
101
+ });
102
+ if (duplicatePhase !== undefined) {
103
+ return fail("PLAN_EXEC_BATCH_PHASE_DUPLICATE", `la publicación declara F${duplicatePhase.phase} más de una vez`, "dejá una sola transición final por fase: dos estados competirían por los mismos bytes");
104
+ }
105
+ const updates = normalizePhaseUpdates(input.phase_updates);
106
+ const updateOutside = updates.filter((update) => !input.batch.phases.includes(update.phase));
107
+ if (updateOutside.length > 0) {
108
+ return fail("PLAN_EXEC_BATCH_PHASE_OUTSIDE", `la publicación intenta cambiar ${updateOutside.map((update) => `F${update.phase}`).join(", ")} fuera del batch`, "una transición sólo puede cambiar los estados de fase que su batch aisló");
109
+ }
110
+ const knownPhases = new Set(parsePhases(text).items.map((phase) => phase.n));
111
+ const unknownPhase = updates.find((update) => !knownPhases.has(update.phase));
112
+ if (unknownPhase !== undefined) {
113
+ return fail("PLAN_EXEC_BATCH_PHASE_UNKNOWN", `el plan no declara F${unknownPhase.phase}`, "re-inferí el batch sobre el plan vigente");
114
+ }
115
+ const marked = markTasks(text, new Set(completed));
116
+ if (!marked.ok)
117
+ return marked;
118
+ const phased = rewritePhases(marked.content, updates);
119
+ if (!phased.ok)
120
+ return phased;
121
+ return {
122
+ ok: true,
123
+ prepared: {
124
+ batch: input.batch,
125
+ plan: input.plan,
126
+ before_digest: before,
127
+ after_digest: baseDigest(phased.content),
128
+ content: phased.content,
129
+ transition: input.transition,
130
+ phase_updates: updates,
131
+ },
132
+ };
133
+ }
134
+ /**
135
+ * Re-check the document facts that make a plan closable and build its final
136
+ * header rewrite. This is deliberately separate from the flow-state checks:
137
+ * the document parser owns checkboxes/phases/status, while the caller owns
138
+ * validation, integration and reconciliation evidence.
139
+ */
140
+ export function preparePlanExecDoneSeal(text, input) {
141
+ const tasks = parseTasks(text);
142
+ if (tasks.open > 0) {
143
+ return fail("PLAN_EXEC_DONE_TASKS_OPEN", `${input.plan} todavía tiene ${tasks.open} tarea(s) abierta(s)`, "cerrá únicamente los batches que el CLI ya infirió y publicó antes de sellar el plan");
144
+ }
145
+ const phases = parsePhases(text);
146
+ const unvalidated = phases.items.filter((phase) => phase.state !== "validada");
147
+ if (unvalidated.length > 0) {
148
+ return fail("PLAN_EXEC_DONE_PHASES_OPEN", `${input.plan} todavía tiene fases sin validar: ${unvalidated.map((phase) => `F${phase.n}`).join(", ")}`, "resolvé el batch o el bloqueo de cada fase antes de la validación final");
149
+ }
150
+ const status = parsePlanStatus(text);
151
+ if (status.declared === "unknown") {
152
+ return fail("PLAN_EXEC_DONE_STATUS_INVALID", `${input.plan} declara un estado de plan ilegible`, "normalizá el preámbulo del plan antes de sellar su cierre");
153
+ }
154
+ const closure = input.closure.trim();
155
+ if (closure.length === 0) {
156
+ return fail("PLAN_EXEC_DONE_CLOSURE_INVALID", "el cierre del plan no tiene evidencia textual", "volvé a la frontera final con una corrida que conserve su evidencia de validación e integración");
157
+ }
158
+ const next = rewritePlanDonePreamble(text, closure);
159
+ return {
160
+ ok: true,
161
+ prepared: {
162
+ before_digest: baseDigest(text),
163
+ after_digest: baseDigest(next),
164
+ content: next,
165
+ already_sealed: next === text && status.declared === "done" && status.closure === closure,
166
+ },
167
+ };
168
+ }
169
+ /**
170
+ * Publish plan progress and its v10 trace as one recoverable transition.
171
+ *
172
+ * The run lock keeps its cursor/CAS stable. `applyLocalProposal` then performs
173
+ * the plan-document CAS under the workspace lock. If a process dies after the
174
+ * document write but before the run-state write, the identical retry observes
175
+ * `already_applied` and seals the trace; if either base moved it refuses stale.
176
+ */
177
+ export async function publishPlanExecBatch(fs, paths, input) {
178
+ // Persist the sealed before/after pair first. The plan write deliberately
179
+ // happens OUTSIDE this lock: `applyLocalProposal` has its own workspace lock,
180
+ // and a long nested lock would turn recovery into a deadlock. More importantly,
181
+ // the staged state survives a crash between these two operations.
182
+ const staged = await applyUnderLock(fs, input.location,
183
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: recovery branches are the one sealed state machine for the pre-write intent.
184
+ async (current) => {
185
+ if (current === null)
186
+ return { ok: false, failure: missingRun() };
187
+ const text = await readPlan(fs, input.root, input.plan);
188
+ if (!text.ok)
189
+ return text;
190
+ const digest = baseDigest(text.content);
191
+ const existing = (current.batches ?? []).find((batch) => batch.id === input.batch.id);
192
+ if (existing !== undefined && !sameBatchDefinition(existing, input.batch)) {
193
+ return {
194
+ ok: false,
195
+ failure: failure("PLAN_EXEC_BATCH_CONFLICT", `el batch '${input.batch.id}' ya fue sellado con otro rango o digest de plan`, "no reutilices un id de batch: re-inferí una nueva iteración sobre el plan vigente"),
196
+ };
197
+ }
198
+ const publication = existing?.publication;
199
+ if (publication !== undefined) {
200
+ // `publication` can only be reached through an existing batch; spell the
201
+ // guard out for the state-recovery branch instead of casting a corrupt
202
+ // partial object into an authority.
203
+ if (existing === undefined)
204
+ return { ok: false, failure: missingBatch() };
205
+ if (publication.plan !== input.plan || publication.transition !== input.transition) {
206
+ return {
207
+ ok: false,
208
+ failure: failure("PLAN_EXEC_BATCH_CONFLICT", `el batch '${input.batch.id}' ya tiene otra publicación pendiente`, "reanudá la publicación sellada; no cambies su plan ni su transición a mitad de recuperación"),
209
+ };
210
+ }
211
+ if (publication.status === "applied") {
212
+ if (digest !== publication.after_plan_digest) {
213
+ return {
214
+ ok: false,
215
+ failure: recoveryStale(input.plan),
216
+ };
217
+ }
218
+ const next = withPlanExecBatchLoop(current, loopAfterPublication(text.content, existing.iteration));
219
+ if (next === current) {
220
+ return {
221
+ ok: true,
222
+ state: next,
223
+ value: { batch: existing, prepared: null, already_applied: true },
224
+ persist: false,
225
+ };
226
+ }
227
+ return {
228
+ ok: true,
229
+ state: next,
230
+ value: { batch: existing, prepared: null, already_applied: true },
231
+ };
232
+ }
233
+ // The document landed before the process could seal the final state.
234
+ // Finish from the pre-written digest; do not derive a new batch or mark
235
+ // anything a second time.
236
+ if (digest === publication.after_plan_digest) {
237
+ let next = withPlanExecBatchPublication(current, existing.id, digest);
238
+ next = withPlanExecBatchStage(next, existing.id, "closed", publication.transition, "completed");
239
+ next = withPlanExecBatchLoop(next, loopAfterPublication(text.content, existing.iteration));
240
+ const closed = batchOf(next, existing.id);
241
+ if (closed === null)
242
+ return { ok: false, failure: missingBatch() };
243
+ return {
244
+ ok: true,
245
+ state: next,
246
+ value: { batch: closed, prepared: null, already_applied: true },
247
+ };
248
+ }
249
+ if (digest !== publication.before_plan_digest) {
250
+ return { ok: false, failure: recoveryStale(input.plan) };
251
+ }
252
+ const prepared = preparePlanExecBatchPublication(text.content, input);
253
+ if (!prepared.ok)
254
+ return { ok: false, failure: prepared.failure };
255
+ if (prepared.prepared.after_digest !== publication.after_plan_digest) {
256
+ return {
257
+ ok: false,
258
+ failure: failure("PLAN_EXEC_BATCH_CONFLICT", "el reintento no reconstruye los mismos bytes sellados para el batch", "conservá las tareas, estados y transición de la publicación pendiente; si cambió el plan, re-inferí otro batch"),
259
+ };
260
+ }
261
+ return {
262
+ ok: true,
263
+ state: current,
264
+ value: { batch: existing, prepared: prepared.prepared, already_applied: false },
265
+ persist: false,
266
+ };
267
+ }
268
+ if (existing === undefined) {
269
+ return { ok: false, failure: batchNotInferred(input.batch.id) };
270
+ }
271
+ const prepared = preparePlanExecBatchPublication(text.content, input);
272
+ if (!prepared.ok)
273
+ return { ok: false, failure: prepared.failure };
274
+ let next = current;
275
+ next = withPlanExecBatchPublicationPrepared(next, input.batch.id, {
276
+ plan: input.plan,
277
+ before_plan_digest: prepared.prepared.before_digest,
278
+ after_plan_digest: prepared.prepared.after_digest,
279
+ transition: input.transition,
280
+ });
281
+ const stagedBatch = batchOf(next, input.batch.id);
282
+ if (stagedBatch === null)
283
+ return { ok: false, failure: missingBatch() };
284
+ return {
285
+ ok: true,
286
+ state: next,
287
+ value: { batch: stagedBatch, prepared: prepared.prepared, already_applied: false },
288
+ };
289
+ }, { expectDigest: input.state_digest });
290
+ if (!staged.ok)
291
+ return staged;
292
+ if (staged.value.already_applied) {
293
+ return {
294
+ ok: true,
295
+ batch: staged.value.batch,
296
+ written: [],
297
+ already_applied: true,
298
+ state: staged.state,
299
+ };
300
+ }
301
+ const prepared = staged.value.prepared;
302
+ if (prepared === null) {
303
+ return { ok: false, failure: missingBatch() };
304
+ }
305
+ const proposal = sealProposal({
306
+ operation: "plan-exec.batch-publication",
307
+ artifacts: [{ path: input.plan, content: prepared.content, overwrite: true }],
308
+ bases: [{ path: input.plan, digest: prepared.before_digest }],
309
+ effects: ["mutate_overwrite"],
310
+ requiresApproval: [],
311
+ });
312
+ const applied = await applyLocalProposal(fs, paths, {
313
+ root: input.root,
314
+ proposal,
315
+ approval: { digest: proposal.digest, granted: [] },
316
+ selfAuthorized: ["mutate_overwrite"],
317
+ });
318
+ if (!applied.ok)
319
+ return { ok: false, failure: applied.failure };
320
+ const finalized = await applyUnderLock(fs, input.location,
321
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: every branch verifies the same sealed intent before the final CAS.
322
+ async (current) => {
323
+ if (current === null)
324
+ return { ok: false, failure: missingRun() };
325
+ const existing = batchOf(current, input.batch.id);
326
+ const publication = existing?.publication;
327
+ if (existing === null || publication === undefined) {
328
+ return { ok: false, failure: missingBatch() };
329
+ }
330
+ const text = await readPlan(fs, input.root, input.plan);
331
+ if (!text.ok)
332
+ return text;
333
+ const digest = baseDigest(text.content);
334
+ if (publication.status === "applied") {
335
+ if (digest !== publication.after_plan_digest)
336
+ return { ok: false, failure: recoveryStale(input.plan) };
337
+ return { ok: true, state: current, value: existing, persist: false };
338
+ }
339
+ if (digest !== publication.after_plan_digest) {
340
+ return { ok: false, failure: recoveryStale(input.plan) };
341
+ }
342
+ let next = withPlanExecBatchPublication(current, existing.id, digest);
343
+ next = withPlanExecBatchStage(next, existing.id, "closed", publication.transition, "completed");
344
+ next = withPlanExecBatchLoop(next, loopAfterPublication(text.content, existing.iteration));
345
+ const closed = batchOf(next, existing.id);
346
+ if (closed === null)
347
+ return { ok: false, failure: missingBatch() };
348
+ return { ok: true, state: next, value: closed };
349
+ }, { expectDigest: staged.state.digest });
350
+ if (!finalized.ok)
351
+ return finalized;
352
+ return {
353
+ ok: true,
354
+ batch: finalized.value,
355
+ written: applied.result.written,
356
+ already_applied: applied.result.already_applied,
357
+ state: finalized.state,
358
+ };
359
+ }
360
+ function markTasks(text, wanted) {
361
+ const seen = new Set();
362
+ const lines = text.split("\n").map((line) => {
363
+ const match = /^(\s*[-*]\s*)\[([ xX])\](\s+.*)$/.exec(line);
364
+ if (match === null)
365
+ return line;
366
+ const id = taskIdOf(match[3] ?? "");
367
+ if (id === null || !wanted.has(id))
368
+ return line;
369
+ seen.add(id);
370
+ return `${match[1]}[x]${match[3]}`;
371
+ });
372
+ const missing = [...wanted].filter((id) => !seen.has(id));
373
+ if (missing.length > 0) {
374
+ return fail("PLAN_EXEC_BATCH_TASK_UNKNOWN", `no se pudo ubicar la casilla de ${missing.join(", ")}`, "el plan cambió de forma: re-inferí el batch antes de publicar");
375
+ }
376
+ return { ok: true, content: lines.join("\n") };
377
+ }
378
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: this is one bounded Markdown block rewrite whose alternatives preserve exact bytes.
379
+ function rewritePhases(text, updates) {
380
+ if (updates.length === 0)
381
+ return { ok: true, content: text };
382
+ const byPhase = new Map(updates.map((update) => [update.phase, update]));
383
+ const lines = text.split("\n");
384
+ const seen = new Set();
385
+ for (let start = 0; start < lines.length; start += 1) {
386
+ const heading = PHASE_HEADING.exec(lines[start] ?? "");
387
+ if (heading?.[1] === undefined)
388
+ continue;
389
+ const phase = Number(heading[1]);
390
+ const update = byPhase.get(phase);
391
+ if (update === undefined)
392
+ continue;
393
+ let end = start + 1;
394
+ while (end < lines.length && !PHASE_BOUNDARY.test(lines[end] ?? ""))
395
+ end += 1;
396
+ let stateLine = -1;
397
+ let blockerLine = -1;
398
+ for (let i = start + 1; i < end; i += 1) {
399
+ if (stateLine < 0 && PHASE_STATE.test(lines[i] ?? ""))
400
+ stateLine = i;
401
+ if (blockerLine < 0 && PHASE_BLOCKER.test(lines[i] ?? ""))
402
+ blockerLine = i;
403
+ }
404
+ if (stateLine < 0) {
405
+ return fail("PLAN_EXEC_BATCH_PHASE_STATE_MISSING", `F${phase} no declara una línea '> Estado:' que el CLI pueda transicionar`, "normalizá el plan con plan-refine antes de acreditar la fase");
406
+ }
407
+ lines[stateLine] = `> Estado: ${update.state}`;
408
+ if (update.blocker === undefined) {
409
+ seen.add(phase);
410
+ continue;
411
+ }
412
+ if (update.blocker === null) {
413
+ if (blockerLine >= 0)
414
+ lines.splice(blockerLine, 1);
415
+ }
416
+ else if (blockerLine >= 0) {
417
+ lines[blockerLine] = `> Bloqueo: ${update.blocker}`;
418
+ }
419
+ else {
420
+ lines.splice(stateLine + 1, 0, `> Bloqueo: ${update.blocker}`);
421
+ }
422
+ seen.add(phase);
423
+ }
424
+ const missing = updates.filter((update) => !seen.has(update.phase));
425
+ if (missing.length > 0) {
426
+ return fail("PLAN_EXEC_BATCH_PHASE_UNKNOWN", `no se pudo ubicar ${missing.map((update) => `F${update.phase}`).join(", ")}`, "re-inferí el batch sobre el plan vigente");
427
+ }
428
+ return { ok: true, content: lines.join("\n") };
429
+ }
430
+ /** Rewrite only the plan preamble — never a `> Estado:` owned by a phase. */
431
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: bounded Markdown scan/rewrite keeps plan and phase status surfaces separate.
432
+ function rewritePlanDonePreamble(text, closure) {
433
+ const scanned = scanMarkdown(text);
434
+ const [title, ...rest] = scanned.headings;
435
+ const firstSection = title?.level === 1 ? rest[0] : title;
436
+ const end = firstSection?.line ?? scanned.lines.length;
437
+ const lines = [...scanned.lines];
438
+ let stateAt = -1;
439
+ let closureAt = -1;
440
+ let lastQuote = -1;
441
+ for (let index = 0; index < end; index += 1) {
442
+ if (scanned.fenced[index])
443
+ continue;
444
+ const line = lines[index] ?? "";
445
+ if (/^\s*>/.test(line))
446
+ lastQuote = index;
447
+ const bare = line.replace(/\*/g, "");
448
+ if (stateAt < 0 && PLAN_STATUS.test(bare))
449
+ stateAt = index;
450
+ if (closureAt < 0 && PLAN_CLOSURE.test(bare))
451
+ closureAt = index;
452
+ }
453
+ if (stateAt < 0) {
454
+ const titleLine = title?.level === 1 ? title.line + 1 : 0;
455
+ stateAt = Math.max(titleLine, lastQuote + 1);
456
+ lines.splice(stateAt, 0, "> Estado: done");
457
+ if (closureAt >= stateAt)
458
+ closureAt += 1;
459
+ }
460
+ else {
461
+ lines[stateAt] = "> Estado: done";
462
+ }
463
+ if (closureAt < 0) {
464
+ lines.splice(stateAt + 1, 0, `> Cierre: ${closure}`);
465
+ }
466
+ else {
467
+ lines[closureAt] = `> Cierre: ${closure}`;
468
+ }
469
+ return lines.join("\n");
470
+ }
471
+ function taskIdOf(text) {
472
+ return TASK_ID.exec(text)?.[1] ?? null;
473
+ }
474
+ /**
475
+ * Derive the next cursor segment from the exact bytes just published.
476
+ *
477
+ * Only an unchecked task under a declared phase keeps PLAN-exec in the batch
478
+ * loop. A stray checkbox outside the phase grammar is not silently credited as
479
+ * a new batch; the document parser/final gate remains responsible for rejecting
480
+ * that malformed plan rather than this publisher guessing a phase for it.
481
+ */
482
+ function loopAfterPublication(text, closedIteration) {
483
+ const pendingTasks = parseTasks(text).items.some((task) => task.status === "open" && task.phase !== undefined);
484
+ // A phase without a task is not silently declared complete. It keeps the
485
+ // loop visible, where the next inference returns the typed plan-refine
486
+ // refusal instead of letting final validation/Git run over an unvalidated
487
+ // phase.
488
+ const pendingPhases = parsePhases(text).items.some((phase) => phase.state !== "validada");
489
+ const pending = pendingTasks || pendingPhases;
490
+ return { pending, iteration: pending ? closedIteration + 1 : null };
491
+ }
492
+ function uniquePositive(values) {
493
+ return [...new Set(values)]
494
+ .filter((value) => Number.isInteger(value) && value > 0)
495
+ .sort((a, b) => a - b);
496
+ }
497
+ function uniqueStrings(values) {
498
+ return [
499
+ ...new Set(values.map((value) => value.trim()).filter((value) => value.length > 0)),
500
+ ].sort();
501
+ }
502
+ /** Input validation already established one valid update per phase. */
503
+ function normalizePhaseUpdates(values) {
504
+ return values.map((update) => ({ ...update })).sort((left, right) => left.phase - right.phase);
505
+ }
506
+ function sameSet(left, right) {
507
+ return left.length === right.length && left.every((value) => right.includes(value));
508
+ }
509
+ function sameBatchDefinition(left, right) {
510
+ return (left.id === right.id &&
511
+ left.iteration === right.iteration &&
512
+ left.mode === right.mode &&
513
+ left.plan_digest === right.plan_digest &&
514
+ sameSet(left.phases, right.phases) &&
515
+ sameSet(left.tasks, right.tasks));
516
+ }
517
+ function batchOf(state, id) {
518
+ return (state.batches ?? []).find((batch) => batch.id === id) ?? null;
519
+ }
520
+ async function readPlan(fs, root, plan) {
521
+ try {
522
+ return { ok: true, content: await fs.readText(join(root, plan)) };
523
+ }
524
+ catch {
525
+ return {
526
+ ok: false,
527
+ failure: failure("PLAN_EXEC_BATCH_PLAN_UNREADABLE", `no se pudo leer '${plan}' para publicar el batch`, "restaurá el plan y reintentá; no se acredita progreso sin el documento fuente"),
528
+ };
529
+ }
530
+ }
531
+ function recoveryStale(plan) {
532
+ return failure("PLAN_EXEC_BATCH_RECOVERY_STALE", `el plan '${plan}' no coincide con los bytes sellados de la publicación pendiente`, "no se reinterpreta ni acredita sobre bytes movidos: restaurá el before/after sellado o re-inferí otro batch");
533
+ }
534
+ function missingBatch() {
535
+ return failure("PLAN_EXEC_BATCH_INVALID", "el batch no pudo quedar en el estado de corrida", "reintentá la publicación desde la corrida que lo infirió");
536
+ }
537
+ function batchNotInferred(id) {
538
+ return failure("PLAN_EXEC_BATCH_NOT_INFERRED", `el batch '${id}' no fue sellado en batch-inference antes de la publicación`, "volvé a la frontera plan-exec.batch-inference; el cierre no fabrica snapshots retrospectivos");
539
+ }
540
+ function missingRun() {
541
+ return failure("FLOW_RUN_ABSENT", "no hay corrida a la que publicar el batch", "adoptá o iniciá plan-exec antes de acreditar trabajo");
542
+ }
543
+ function fail(code, message, action) {
544
+ return { ok: false, failure: failure(code, message, action) };
545
+ }
546
+ function failure(code, message, action = "revisá el batch y reintentá") {
547
+ return { code, message, action };
548
+ }
549
+ //# sourceMappingURL=plan-exec-batch-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-exec-batch-service.js","sourceRoot":"","sources":["../../src/application/plan-exec-batch-service.ts"],"names":[],"mappings":"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"}