@tacuchi/agent-workflow-cli 20.22.0 → 20.24.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/adapters/git-cli.js +42 -0
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/application/artifacts-service.js +5 -5
- package/dist/application/artifacts-service.js.map +1 -1
- package/dist/application/checkpoint-service.js +60 -55
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +61 -66
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/context/budget-service.js +128 -0
- package/dist/application/context/budget-service.js.map +1 -0
- package/dist/application/context/bundle-root.js +41 -0
- package/dist/application/context/bundle-root.js.map +1 -0
- package/dist/application/context/manifest.js +150 -0
- package/dist/application/context/manifest.js.map +1 -0
- package/dist/application/context/measure.js +227 -0
- package/dist/application/context/measure.js.map +1 -0
- package/dist/application/context/plan-service.js +177 -0
- package/dist/application/context/plan-service.js.map +1 -0
- package/dist/application/decisiones-service.js +5 -5
- package/dist/application/decisiones-service.js.map +1 -1
- package/dist/application/export-service.js +250 -0
- package/dist/application/export-service.js.map +1 -0
- package/dist/application/fix-git-service.js +244 -0
- package/dist/application/fix-git-service.js.map +1 -0
- package/dist/application/history-update-service.js +35 -24
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/lifecycle-target.js +39 -0
- package/dist/application/lifecycle-target.js.map +1 -0
- package/dist/application/parsers/spec-relation.js +80 -0
- package/dist/application/parsers/spec-relation.js.map +1 -0
- package/dist/application/paths-service.js +8 -0
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +285 -0
- package/dist/application/persist-service.js.map +1 -0
- package/dist/application/release-data/artifacts.js +17 -21
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/resume-service.js +184 -0
- package/dist/application/resume-service.js.map +1 -0
- package/dist/application/semantic-operation/protocol.js +247 -0
- package/dist/application/semantic-operation/protocol.js.map +1 -0
- package/dist/application/semantic-operation/publish.js +80 -0
- package/dist/application/semantic-operation/publish.js.map +1 -0
- package/dist/application/session-binding-service.js +125 -0
- package/dist/application/session-binding-service.js.map +1 -0
- package/dist/application/session-close-service.js +60 -39
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +45 -19
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-resolver.js +180 -44
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +39 -9
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +0 -2
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/status-service.js +24 -388
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/tasks-service.js +5 -5
- package/dist/application/tasks-service.js.map +1 -1
- package/dist/application/workline-index-service.js +510 -0
- package/dist/application/workline-index-service.js.map +1 -0
- package/dist/cli/commands/checkpoint-read.js +10 -6
- package/dist/cli/commands/checkpoint-read.js.map +1 -1
- package/dist/cli/commands/checkpoint-write.js +38 -11
- package/dist/cli/commands/checkpoint-write.js.map +1 -1
- package/dist/cli/commands/context-budget.js +79 -0
- package/dist/cli/commands/context-budget.js.map +1 -0
- package/dist/cli/commands/context-plan.js +75 -0
- package/dist/cli/commands/context-plan.js.map +1 -0
- package/dist/cli/commands/export.js +117 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/fix-git.js +109 -0
- package/dist/cli/commands/fix-git.js.map +1 -0
- package/dist/cli/commands/generate-launch.js +35 -3
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/history-update.js +1 -1
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/index.js +15 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/persist.js +67 -0
- package/dist/cli/commands/persist.js.map +1 -0
- package/dist/cli/commands/resume-summary.js +14 -3
- package/dist/cli/commands/resume-summary.js.map +1 -1
- package/dist/cli/commands/resume.js +73 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/session-artifacts.js +12 -11
- package/dist/cli/commands/session-artifacts.js.map +1 -1
- package/dist/cli/commands/session-close.js +8 -7
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +5 -1
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-resume.js +16 -10
- package/dist/cli/commands/session-resume.js.map +1 -1
- package/dist/cli/commands/status.js +66 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +21 -2
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/context-id.js +133 -0
- package/dist/cli/context-id.js.map +1 -0
- package/dist/cli/help-groups.js +20 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +44 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output-mode.js +41 -0
- package/dist/cli/output-mode.js.map +1 -0
- package/dist/cli/parser.js +10 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/render.js +53 -0
- package/dist/cli/render.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +2 -2
- package/skills/w/commands/export-diagrams.md +13 -21
- package/skills/w/commands/export-manuals.md +15 -21
- package/skills/w/commands/export-reports.md +14 -21
- package/skills/w/commands/export-scripts.md +14 -21
- package/skills/w/commands/fix-git.md +24 -16
- package/skills/w/commands/generate-launch.md +13 -32
- package/skills/w/commands/persist.md +21 -77
- package/skills/w/commands/plan-exec.md +14 -30
- package/skills/w/commands/plan-new.md +11 -38
- package/skills/w/commands/plan-refine.md +13 -41
- package/skills/w/commands/quick.md +13 -20
- package/skills/w/commands/resume.md +19 -56
- package/skills/w/commands/spec-new.md +28 -69
- package/skills/w/commands/spec-refine.md +12 -37
- package/skills/w/commands/status.md +12 -55
- package/skills/w/commands/workspace-init.md +14 -21
- package/skills/w/context/MANIFEST.json +486 -0
- package/skills/w/harness/HARNESS.md +1 -1
- package/skills/w/hooks/README.md +21 -2
- package/skills/w/hooks/hooks.template.json +2 -2
- package/skills/w/loops/CHASSIS.md +53 -104
- package/skills/w/loops/CODE-POLICIES.md +4 -9
- package/skills/w/loops/plan-exec-loop/LOOP.md +5 -12
- package/skills/w/loops/plan-new-loop/LOOP.md +8 -32
- package/skills/w/loops/plan-refine-loop/LOOP.md +8 -36
- package/skills/w/loops/quick-loop/LOOP.md +4 -10
- package/skills/w/loops/spec-refine-loop/LOOP.md +7 -49
- package/skills/w/modules/ADOPTED-CONTEXT.md +10 -0
- package/skills/w/modules/COMPACTION.md +13 -0
- package/skills/w/modules/DB-RESEARCH-RULE.md +11 -0
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +12 -0
- package/skills/w/modules/EXEC-DB-POLICY.md +7 -0
- package/skills/w/modules/EXEC-PROBE-TASKS.md +11 -0
- package/skills/w/modules/IDEATION-GATE.md +16 -0
- package/skills/w/modules/INCREMENTAL-STRATEGY.md +7 -0
- package/skills/w/modules/LAUNCH-DETECTION.md +26 -0
- package/skills/w/modules/PERSIST-ROUTING.md +16 -0
- package/skills/w/modules/PLAN-DESIGN-SPECS.md +12 -0
- package/skills/w/modules/PLAN-INPUT.md +26 -0
- package/skills/w/modules/PLAN-MODE.md +26 -0
- package/skills/w/modules/PLAN-PROBE-TASKS.md +10 -0
- package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +7 -0
- package/skills/w/modules/PLAN-REFINE-KEYS.md +9 -0
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +12 -0
- package/skills/w/modules/PLAN-SPLIT-GATE.md +14 -0
- package/skills/w/modules/PROBE.md +12 -0
- package/skills/w/modules/PROMPT-CONTINUITY.md +13 -0
- package/skills/w/modules/RECONNAISSANCE.md +48 -0
- package/skills/w/modules/REPLANNING.md +12 -0
- package/skills/w/modules/SESSION-NUMBERING.md +19 -0
- package/skills/w/modules/SIMULATION-LIFECYCLE.md +11 -0
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +37 -0
- package/skills/w/modules/SPEC-REFINE-KEYS.md +14 -0
- package/skills/w/modules/SPLIT-GATE.md +42 -0
- package/skills/w/modules/WORKSPACE-SCAFFOLD.md +28 -0
- package/skills/w/roles/git/ROLE.md +7 -8
- package/skills/w/roles/ui-spec/ROLE.md +1 -1
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { runNextNumber } from "./dev-only-services.js";
|
|
3
|
+
import { withCwdLock } from "./lock-service.js";
|
|
4
|
+
import { firstNonEmptyLine, parseMdSectionBilingual } from "./markdown.js";
|
|
5
|
+
import { approvalDigest, buildSemanticRequest, parseSemanticResponse, semanticDigest, } from "./semantic-operation/protocol.js";
|
|
6
|
+
import { publishArtifacts } from "./semantic-operation/publish.js";
|
|
7
|
+
/**
|
|
8
|
+
* `persist` — adopt finished conversation work into `docs/` in one pass.
|
|
9
|
+
*
|
|
10
|
+
* The AI owns exactly one step: deciding the shape (analysis / requirement /
|
|
11
|
+
* plan) and writing the document. Everything that can silently do damage —
|
|
12
|
+
* the inventory, the duplicate check, the number, the destination, whether an
|
|
13
|
+
* existing file may be replaced, and the write itself — stays here.
|
|
14
|
+
*
|
|
15
|
+
* It never creates a session: sessions belong to loops.
|
|
16
|
+
*/
|
|
17
|
+
const CATEGORIES = {
|
|
18
|
+
research: { dir: "docs/research", infix: "research" },
|
|
19
|
+
spec: { dir: "docs/specs", infix: "spec" },
|
|
20
|
+
plan: { dir: "docs/plans", infix: "plan" },
|
|
21
|
+
};
|
|
22
|
+
const OPERATION = "persist";
|
|
23
|
+
const LIMITS = { max_artifacts: 1, max_artifact_bytes: 256 * 1024 };
|
|
24
|
+
const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
25
|
+
const CONTRACT = [
|
|
26
|
+
"Respondé UN objeto JSON con: version, operation, input_digest (los tres copiados del request),",
|
|
27
|
+
"state ('proposed' | 'ambiguous' | 'unsupported'),",
|
|
28
|
+
"decisions { category: 'research'|'spec'|'plan', slug: kebab-case, mode: 'new'|'update',",
|
|
29
|
+
"target?: ruta existente cuando mode='update', target_digest?: su digest del inventario },",
|
|
30
|
+
"y artifacts: exactamente UN { path, content }. El path va dentro del destino de la categoría",
|
|
31
|
+
"y su NNN es consultivo: el CLI reasigna el número dentro del lock.",
|
|
32
|
+
"Si el contenido ya existe como documento, respondé state='ambiguous' con reason.",
|
|
33
|
+
].join(" ");
|
|
34
|
+
// ── prepare ──────────────────────────────────────────────────────────────────
|
|
35
|
+
export async function preparePersist(fs, env, paths) {
|
|
36
|
+
const cwd = paths.workspaceDir();
|
|
37
|
+
const inventory = { categories: emptyCategories() };
|
|
38
|
+
const readSet = [];
|
|
39
|
+
let readSetBytes = 0;
|
|
40
|
+
for (const [name, category] of Object.entries(CATEGORIES)) {
|
|
41
|
+
const next = await runNextNumber(fs, env, { directory: category.dir, dryRun: true });
|
|
42
|
+
const docs = await readCategory(fs, join(cwd, category.dir), category.dir, category.infix);
|
|
43
|
+
for (const doc of docs) {
|
|
44
|
+
readSet.push(doc.file);
|
|
45
|
+
readSetBytes += doc.summary.length;
|
|
46
|
+
}
|
|
47
|
+
inventory.categories[name] = { destination: category.dir, next: next.next, docs };
|
|
48
|
+
}
|
|
49
|
+
return buildSemanticRequest({
|
|
50
|
+
operation: OPERATION,
|
|
51
|
+
// The seal covers the whole inventory: a document appearing anywhere in
|
|
52
|
+
// docs/ between prepare and apply invalidates the duplicate check AND the
|
|
53
|
+
// consultative numbering the answer reasoned over.
|
|
54
|
+
inputs: inventory,
|
|
55
|
+
contract: CONTRACT,
|
|
56
|
+
inventory,
|
|
57
|
+
allowedDestinations: Object.values(CATEGORIES).map((c) => c.dir),
|
|
58
|
+
limits: LIMITS,
|
|
59
|
+
readSet,
|
|
60
|
+
readSetBytes,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async function readCategory(fs, dir, relative, infix) {
|
|
64
|
+
if (!(await safeExists(fs, dir)))
|
|
65
|
+
return [];
|
|
66
|
+
const pattern = new RegExp(`^(\\d{3})-${infix}(?:-(.+))?\\.md$`, "i");
|
|
67
|
+
const out = [];
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = await fs.list(dir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
const match = pattern.exec(entry.name);
|
|
77
|
+
if (entry.type !== "file" || !match?.[1])
|
|
78
|
+
continue;
|
|
79
|
+
try {
|
|
80
|
+
const text = await fs.readText(entry.path);
|
|
81
|
+
out.push({
|
|
82
|
+
file: `${relative}/${entry.name}`,
|
|
83
|
+
number: match[1],
|
|
84
|
+
slug: match[2] ?? "",
|
|
85
|
+
summary: summarize(text),
|
|
86
|
+
digest: semanticDigest(text),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// skip unreadable doc
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return out.sort((a, b) => a.number.localeCompare(b.number));
|
|
94
|
+
}
|
|
95
|
+
function summarize(text) {
|
|
96
|
+
for (const heading of ["Objective", "Origin", "Requirement"]) {
|
|
97
|
+
const section = parseMdSectionBilingual(text, heading);
|
|
98
|
+
const line = section === undefined ? undefined : firstNonEmptyLine(section);
|
|
99
|
+
if (line !== undefined)
|
|
100
|
+
return line.slice(0, 200);
|
|
101
|
+
}
|
|
102
|
+
return (firstNonEmptyLine(text) ?? "").slice(0, 200);
|
|
103
|
+
}
|
|
104
|
+
// ── validate ─────────────────────────────────────────────────────────────────
|
|
105
|
+
export function validatePersist(raw, request) {
|
|
106
|
+
const parsed = parseSemanticResponse(raw, request);
|
|
107
|
+
if (!parsed.ok)
|
|
108
|
+
return parsed;
|
|
109
|
+
const decisions = readDecisions(parsed.value, request);
|
|
110
|
+
if (!decisions.ok)
|
|
111
|
+
return decisions;
|
|
112
|
+
const artifact = parsed.value.artifacts?.[0];
|
|
113
|
+
if (artifact === undefined) {
|
|
114
|
+
return { ok: false, failure: reject("la respuesta no trae ningún artefacto") };
|
|
115
|
+
}
|
|
116
|
+
const category = CATEGORIES[decisions.value.category];
|
|
117
|
+
const shape = checkFilename(artifact.path, category.dir, category.infix, decisions.value.slug);
|
|
118
|
+
if (shape !== null)
|
|
119
|
+
return { ok: false, failure: shape };
|
|
120
|
+
return {
|
|
121
|
+
ok: true,
|
|
122
|
+
value: {
|
|
123
|
+
preview: {
|
|
124
|
+
category: decisions.value.category,
|
|
125
|
+
mode: decisions.value.mode,
|
|
126
|
+
destination: category.dir,
|
|
127
|
+
bytes: Buffer.byteLength(artifact.content, "utf8"),
|
|
128
|
+
target: decisions.value.mode === "update" ? (decisions.value.target ?? null) : null,
|
|
129
|
+
},
|
|
130
|
+
approval_digest: approvalDigest(parsed.value),
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function readDecisions(response, request) {
|
|
135
|
+
const raw = response.decisions;
|
|
136
|
+
if (raw === undefined)
|
|
137
|
+
return { ok: false, failure: reject("faltan las decisions") };
|
|
138
|
+
const category = raw.category;
|
|
139
|
+
if (typeof category !== "string" || !(category in CATEGORIES)) {
|
|
140
|
+
return { ok: false, failure: reject(`categoría desconocida: ${String(category)}`) };
|
|
141
|
+
}
|
|
142
|
+
const slug = raw.slug;
|
|
143
|
+
if (typeof slug !== "string" || !SLUG_RE.test(slug)) {
|
|
144
|
+
return { ok: false, failure: reject(`slug inválido: ${String(slug)} (kebab-case, a-z0-9)`) };
|
|
145
|
+
}
|
|
146
|
+
const mode = raw.mode;
|
|
147
|
+
if (mode !== "new" && mode !== "update") {
|
|
148
|
+
return { ok: false, failure: reject(`modo desconocido: ${String(mode)}`) };
|
|
149
|
+
}
|
|
150
|
+
if (mode === "new") {
|
|
151
|
+
return { ok: true, value: { category: category, slug, mode } };
|
|
152
|
+
}
|
|
153
|
+
// Replacing an existing document needs more than intent: it must name the
|
|
154
|
+
// target AND prove it is the same bytes prepare inventoried.
|
|
155
|
+
const target = raw.target;
|
|
156
|
+
const targetDigest = raw.target_digest;
|
|
157
|
+
if (typeof target !== "string" || typeof targetDigest !== "string") {
|
|
158
|
+
return { ok: false, failure: reject("mode 'update' exige 'target' y 'target_digest'") };
|
|
159
|
+
}
|
|
160
|
+
const inventory = request.inventory;
|
|
161
|
+
const known = inventory.categories[category].docs.find((d) => d.file === target);
|
|
162
|
+
if (known === undefined) {
|
|
163
|
+
return { ok: false, failure: reject(`'${target}' no está en el inventario de la categoría`) };
|
|
164
|
+
}
|
|
165
|
+
if (known.digest !== targetDigest) {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
failure: {
|
|
169
|
+
code: "SEMANTIC_STALE",
|
|
170
|
+
message: `'${target}' cambió desde el prepare`,
|
|
171
|
+
action: "volvé a correr prepare y revisá el documento antes de reemplazarlo",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
ok: true,
|
|
177
|
+
value: {
|
|
178
|
+
category: category,
|
|
179
|
+
slug,
|
|
180
|
+
mode,
|
|
181
|
+
target,
|
|
182
|
+
target_digest: targetDigest,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function checkFilename(path, dir, infix, slug) {
|
|
187
|
+
const expected = new RegExp(`^${dir}/\\d{3}-${infix}-${slug}\\.md$`);
|
|
188
|
+
if (expected.test(path))
|
|
189
|
+
return null;
|
|
190
|
+
return reject(`'${path}' no respeta ${dir}/NNN-${infix}-${slug}.md`);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Publishes, and only publishes, what was validated and approved.
|
|
194
|
+
*
|
|
195
|
+
* Everything that can change between validate and here is rechecked INSIDE the
|
|
196
|
+
* lock: the inventory seal, the approval digest, and the number — which is
|
|
197
|
+
* minted here and overwrites the consultative one the answer carried, so two
|
|
198
|
+
* concurrent runs cannot both claim `007`.
|
|
199
|
+
*/
|
|
200
|
+
export async function applyPersist(fs, env, paths, input) {
|
|
201
|
+
const validated = validatePersist(input.raw, input.request);
|
|
202
|
+
if (!validated.ok)
|
|
203
|
+
return validated;
|
|
204
|
+
if (validated.value.approval_digest !== input.approval) {
|
|
205
|
+
return {
|
|
206
|
+
ok: false,
|
|
207
|
+
failure: {
|
|
208
|
+
code: "APPROVAL_MISMATCH",
|
|
209
|
+
message: "el approval digest no corresponde a esta propuesta",
|
|
210
|
+
action: "volvé a correr validate y aprobá el digest que devuelve",
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const parsed = parseSemanticResponse(input.raw, input.request);
|
|
215
|
+
if (!parsed.ok)
|
|
216
|
+
return parsed;
|
|
217
|
+
const artifact = parsed.value.artifacts?.[0];
|
|
218
|
+
if (artifact === undefined) {
|
|
219
|
+
return { ok: false, failure: reject("la respuesta no trae ningún artefacto") };
|
|
220
|
+
}
|
|
221
|
+
const preview = validated.value.preview;
|
|
222
|
+
const category = CATEGORIES[preview.category];
|
|
223
|
+
const result = await withCwdLock(fs, paths, async () => {
|
|
224
|
+
const fresh = await preparePersist(fs, env, paths);
|
|
225
|
+
if (fresh.input_digest !== input.request.input_digest) {
|
|
226
|
+
return {
|
|
227
|
+
ok: false,
|
|
228
|
+
failure: {
|
|
229
|
+
code: "SEMANTIC_STALE",
|
|
230
|
+
message: "docs/ cambió entre la aprobación y la escritura",
|
|
231
|
+
action: "volvé a correr prepare: el inventario y la numeración ya no son los aprobados",
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const path = preview.mode === "update" && preview.target !== null
|
|
236
|
+
? preview.target
|
|
237
|
+
: `${category.dir}/${(await runNextNumber(fs, env, { directory: category.dir })).next}-${category.infix}-${slugOf(artifact.path, category.infix)}.md`;
|
|
238
|
+
return await publishArtifacts(fs, paths.workspaceDir(), [{ path, content: artifact.content }], {
|
|
239
|
+
overwrite: preview.mode === "update",
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
if ("error" in result) {
|
|
243
|
+
return {
|
|
244
|
+
ok: false,
|
|
245
|
+
failure: {
|
|
246
|
+
code: "LOCK_BUSY",
|
|
247
|
+
message: result.error,
|
|
248
|
+
action: "esperá a que termine la otra operación y volvé a aplicar",
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (!result.ok)
|
|
253
|
+
return result;
|
|
254
|
+
return {
|
|
255
|
+
ok: true,
|
|
256
|
+
value: { written: result.value.written, category: preview.category, mode: preview.mode },
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function slugOf(path, infix) {
|
|
260
|
+
return new RegExp(`\\d{3}-${infix}-(.+)\\.md$`).exec(path)?.[1] ?? "sin-slug";
|
|
261
|
+
}
|
|
262
|
+
// ── helpers ──────────────────────────────────────────────────────────────────
|
|
263
|
+
function emptyCategories() {
|
|
264
|
+
return {
|
|
265
|
+
research: { destination: CATEGORIES.research.dir, next: "001", docs: [] },
|
|
266
|
+
spec: { destination: CATEGORIES.spec.dir, next: "001", docs: [] },
|
|
267
|
+
plan: { destination: CATEGORIES.plan.dir, next: "001", docs: [] },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function reject(message) {
|
|
271
|
+
return {
|
|
272
|
+
code: "SEMANTIC_RESPONSE_INVALID",
|
|
273
|
+
message,
|
|
274
|
+
action: "corregí la respuesta según el 'contract' del request y reenviala",
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
async function safeExists(fs, path) {
|
|
278
|
+
try {
|
|
279
|
+
return await fs.exists(path);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=persist-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist-service.js","sourceRoot":"","sources":["../../src/application/persist-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { findArtifact } from "../session-artifacts.js";
|
|
3
|
-
import {
|
|
4
|
-
import { collectFilesByExt
|
|
3
|
+
import { resolveSessionTarget } from "../session-resolver.js";
|
|
4
|
+
import { collectFilesByExt } from "./common.js";
|
|
5
5
|
// Each request-kind maps to an ordered list of on-disk ArtifactKinds tried in
|
|
6
6
|
// turn (first match wins). The descriptor request-kind `objetivo` reads the new
|
|
7
7
|
// SESSION.md, then the legacy OBJECTIVE.md/OBJETIVO.md. The result key stays
|
|
@@ -16,16 +16,24 @@ const KIND_TO_ARTIFACT = {
|
|
|
16
16
|
backlog: ["backlog"],
|
|
17
17
|
};
|
|
18
18
|
const SCRIPTS_SUBDIR = "scripts";
|
|
19
|
-
export async function readSessionArtifacts(fs,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
export async function readSessionArtifacts(fs, paths, sessionCode, kinds, runtime) {
|
|
20
|
+
// This is a session-scoped READ reached by `aw session-artifacts --dump --code`.
|
|
21
|
+
// It used to carry its own folder matcher (`sessionCodeInt` over a filtered
|
|
22
|
+
// listing) — the last resolver besides the canonical one. `allowClosed` is on
|
|
23
|
+
// (dumping a finished session's artifacts is the normal case) and `bind` is
|
|
24
|
+
// off: a release/inspection dump is not how a conversation picks its line.
|
|
25
|
+
const resolution = await resolveSessionTarget(fs, paths, {
|
|
26
|
+
code: sessionCode,
|
|
27
|
+
allowClosed: true,
|
|
28
|
+
});
|
|
29
|
+
if (resolution.outcome !== "resolved")
|
|
30
|
+
return { sessionError: resolution };
|
|
31
|
+
const sessionPath = resolution.session.path;
|
|
32
|
+
const folderName = resolution.session.folder;
|
|
25
33
|
const legacyCheck = await detectLegacyFormat(fs, sessionPath, folderName, runtime);
|
|
26
34
|
if (legacyCheck)
|
|
27
35
|
return legacyCheck;
|
|
28
|
-
const entry =
|
|
36
|
+
const entry = resolution.session;
|
|
29
37
|
const result = {
|
|
30
38
|
session: entry.folder,
|
|
31
39
|
path: entry.path,
|
|
@@ -43,18 +51,6 @@ export async function readSessionArtifacts(fs, env, paths, sessionCode, kinds, r
|
|
|
43
51
|
}
|
|
44
52
|
return result;
|
|
45
53
|
}
|
|
46
|
-
async function findSessionFolder(fs, sessionsDir, sessionCode) {
|
|
47
|
-
const targetInt = sessionCodeInt(sessionCode);
|
|
48
|
-
if (!(await fs.exists(sessionsDir)) || targetInt === null)
|
|
49
|
-
return null;
|
|
50
|
-
// Accept both the current naming (NNN-<slug>-<flow>) and the legacy one
|
|
51
|
-
// (sessionNNN-…): a legacy-only filter would never find current sessions.
|
|
52
|
-
const folders = (await fs.list(sessionsDir)).filter((e) => e.type === "dir" && /^(session)?\d{3}-/.test(e.name));
|
|
53
|
-
const match = folders.find((f) => sessionCodeInt(parseSessionFolder(f.name).code) === targetInt);
|
|
54
|
-
if (!match)
|
|
55
|
-
return null;
|
|
56
|
-
return { sessionPath: match.path, folderName: match.name };
|
|
57
|
-
}
|
|
58
54
|
async function detectLegacyFormat(fs, sessionPath, folderName, runtime) {
|
|
59
55
|
// REQUIREMENTS.md is a pre-0.9 format marker (no longer a tracked kind):
|
|
60
56
|
// probe the filename directly. SESSION.md / OBJECTIVE.md mark the current format.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/application/release-data/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/application/release-data/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { firstNonEmptyLine, parseMdSectionBilingual } from "./markdown.js";
|
|
2
|
+
import { findArtifact } from "./session-artifacts.js";
|
|
3
|
+
import { resolveSessionTarget } from "./session-resolver.js";
|
|
4
|
+
import { buildWorklineIndex, } from "./workline-index-service.js";
|
|
5
|
+
export async function runResume(fs, env, paths, input = {}) {
|
|
6
|
+
const index = await buildWorklineIndex(fs, env, paths, {
|
|
7
|
+
...(input.now !== undefined ? { now: input.now } : {}),
|
|
8
|
+
});
|
|
9
|
+
if (input.code !== undefined)
|
|
10
|
+
return await resumeSession(fs, paths, index, input);
|
|
11
|
+
if (input.target !== undefined)
|
|
12
|
+
return resumeTarget(index, input.target);
|
|
13
|
+
return await resumePipeline(fs, index);
|
|
14
|
+
}
|
|
15
|
+
// ── explicit target ──────────────────────────────────────────────────────────
|
|
16
|
+
/**
|
|
17
|
+
* An explicit target wins over the pipeline, and matches by exact path or by
|
|
18
|
+
* document number — **never by slug**, which is how the old survey attached a
|
|
19
|
+
* session to the wrong plan. A number that names both a spec and a plan is a
|
|
20
|
+
* genuine tie, so it comes back as candidates, the same answer the pipeline
|
|
21
|
+
* gives for any other tie.
|
|
22
|
+
*/
|
|
23
|
+
function resumeTarget(index, target) {
|
|
24
|
+
const specs = index.specs.filter((s) => s.file === target || s.number === target);
|
|
25
|
+
const plans = index.plans.filter((p) => p.file === target || p.number === target);
|
|
26
|
+
const matches = [
|
|
27
|
+
...specs.map((s) => specProposal(s, index)),
|
|
28
|
+
...plans.map(planProposal),
|
|
29
|
+
];
|
|
30
|
+
const [first] = matches;
|
|
31
|
+
if (first === undefined) {
|
|
32
|
+
return {
|
|
33
|
+
status: "invalid_target",
|
|
34
|
+
target,
|
|
35
|
+
action: `ningún documento coincide con '${target}': pasá una ruta docs/specs|docs/plans o el número, o usá --code para una sesión`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (matches.length > 1) {
|
|
39
|
+
return {
|
|
40
|
+
status: "candidates",
|
|
41
|
+
candidates: matches,
|
|
42
|
+
action: `'${target}' identifica ${matches.length} documentos: repetí con la ruta completa`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { status: "proposal", via: "explicit", proposal: first };
|
|
46
|
+
}
|
|
47
|
+
async function resumeSession(fs, paths, index, input) {
|
|
48
|
+
// `bind: false` on purpose: this is a read. `sessionReadRequest` would record
|
|
49
|
+
// the conversation→session association, and `resume` must not write.
|
|
50
|
+
const resolution = await resolveSessionTarget(fs, paths, {
|
|
51
|
+
...(input.code !== undefined ? { code: input.code } : {}),
|
|
52
|
+
...(input.contextId !== undefined ? { contextId: input.contextId } : {}),
|
|
53
|
+
allowClosed: true,
|
|
54
|
+
bind: false,
|
|
55
|
+
});
|
|
56
|
+
if (resolution.outcome !== "resolved") {
|
|
57
|
+
return {
|
|
58
|
+
status: "invalid_target",
|
|
59
|
+
target: input.code ?? "",
|
|
60
|
+
action: resolution.action,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const folder = resolution.session.folder;
|
|
64
|
+
const session = index.sessions.find((s) => s.folder === folder);
|
|
65
|
+
const path = session?.path ?? resolution.session.path;
|
|
66
|
+
return {
|
|
67
|
+
status: "proposal",
|
|
68
|
+
via: "explicit",
|
|
69
|
+
proposal: await sessionProposal(fs, folder, path, session),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ── no target: the documental pipeline ───────────────────────────────────────
|
|
73
|
+
async function resumePipeline(fs, index) {
|
|
74
|
+
const [head] = index.pipeline;
|
|
75
|
+
if (head === undefined) {
|
|
76
|
+
return { status: "idle", action: "no hay trabajo pendiente: el pipeline está vacío" };
|
|
77
|
+
}
|
|
78
|
+
// A tie is priority + progress, never date. Two items that reach here are
|
|
79
|
+
// equally next, and picking one for the user is what this replaces.
|
|
80
|
+
const tied = index.pipeline.filter((item) => item.priority === head.priority && (item.started ?? false) === (head.started ?? false));
|
|
81
|
+
if (tied.length > 1) {
|
|
82
|
+
const candidates = await Promise.all(tied.map((item) => pipelineProposal(fs, index, item)));
|
|
83
|
+
return {
|
|
84
|
+
status: "candidates",
|
|
85
|
+
candidates,
|
|
86
|
+
action: `${tied.length} candidatos con la misma prioridad: elegí uno y volvé a invocar con su ruta`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { status: "proposal", via: "pipeline", proposal: await pipelineProposal(fs, index, head) };
|
|
90
|
+
}
|
|
91
|
+
async function pipelineProposal(fs, index, item) {
|
|
92
|
+
if (item.kind === "plan-open") {
|
|
93
|
+
const plan = index.plans.find((p) => p.file === item.file);
|
|
94
|
+
if (plan !== undefined)
|
|
95
|
+
return planProposal(plan);
|
|
96
|
+
}
|
|
97
|
+
if (item.kind === "checkpoint-orphan") {
|
|
98
|
+
const session = index.sessions.find((s) => s.folder === item.file);
|
|
99
|
+
if (session !== undefined) {
|
|
100
|
+
return await sessionProposal(fs, session.folder, session.path, session);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const spec = index.specs.find((s) => s.file === item.file);
|
|
104
|
+
if (spec !== undefined)
|
|
105
|
+
return specProposal(spec, index);
|
|
106
|
+
return {
|
|
107
|
+
kind: item.kind,
|
|
108
|
+
file: item.file,
|
|
109
|
+
number: item.number,
|
|
110
|
+
objective: item.summary,
|
|
111
|
+
progress: "—",
|
|
112
|
+
next: item.summary,
|
|
113
|
+
command: item.command,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// ── proposals ────────────────────────────────────────────────────────────────
|
|
117
|
+
function specProposal(spec, index) {
|
|
118
|
+
const planned = index.plans.some((p) => p.spec.status === "resolved" && p.spec.number === spec.number);
|
|
119
|
+
const refine = spec.status !== "ready-for-plan";
|
|
120
|
+
return {
|
|
121
|
+
kind: refine ? "spec-unrefined" : "spec-unplanned",
|
|
122
|
+
file: spec.file,
|
|
123
|
+
number: spec.number,
|
|
124
|
+
objective: `spec ${spec.number}${spec.slug ? ` — ${spec.slug}` : ""}`,
|
|
125
|
+
progress: `status ${spec.status}, ${spec.open_questions} pregunta(s) abierta(s)`,
|
|
126
|
+
next: refine
|
|
127
|
+
? "refinar hasta ready-for-plan"
|
|
128
|
+
: planned
|
|
129
|
+
? "ya tiene plan derivado"
|
|
130
|
+
: "generar su plan",
|
|
131
|
+
command: refine ? `/w:spec-refine ${spec.file}` : `/w:plan-new ${spec.file}`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function planProposal(plan) {
|
|
135
|
+
const [blocked] = plan.blocked_phases;
|
|
136
|
+
const phases = plan.phases_total > 0 ? ` · fases ${plan.phases_validated}/${plan.phases_total}` : "";
|
|
137
|
+
return {
|
|
138
|
+
kind: "plan-open",
|
|
139
|
+
file: plan.file,
|
|
140
|
+
number: plan.number,
|
|
141
|
+
objective: `plan ${plan.number}${plan.slug ? ` — ${plan.slug}` : ""}`,
|
|
142
|
+
progress: `${plan.tasks_done}/${plan.tasks_total} tareas (${plan.progress_pct}%)${phases}`,
|
|
143
|
+
next: describePlanNext(plan, blocked),
|
|
144
|
+
command: `/w:plan-exec ${plan.file}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function describePlanNext(plan, blocked) {
|
|
148
|
+
if (blocked !== undefined) {
|
|
149
|
+
return `BLOQUEADA F${blocked.number} — ${blocked.blocker ?? "sin motivo declarado"}`;
|
|
150
|
+
}
|
|
151
|
+
if (plan.plan_state === "inconsistent") {
|
|
152
|
+
return "el plan se declara done pero sus contadores no lo respaldan: repararlo a mano";
|
|
153
|
+
}
|
|
154
|
+
if (plan.final_validation_pending)
|
|
155
|
+
return "todo ejecutado: falta la validación final y el cierre";
|
|
156
|
+
return "continuar por la primera fase no validada";
|
|
157
|
+
}
|
|
158
|
+
async function sessionProposal(fs, folder, path, session) {
|
|
159
|
+
const objective = (await readSection(fs, path, "session", "Objective")) ?? session?.summary ?? folder;
|
|
160
|
+
const pending = await readSection(fs, path, "checkpoint", "Pending / Next");
|
|
161
|
+
const completed = await readSection(fs, path, "checkpoint", "Completed");
|
|
162
|
+
return {
|
|
163
|
+
kind: "session",
|
|
164
|
+
file: folder,
|
|
165
|
+
number: session?.code ?? null,
|
|
166
|
+
objective,
|
|
167
|
+
progress: completed === undefined ? "sin checkpoint" : `checkpoint presente: ${completed}`,
|
|
168
|
+
next: pending ?? "el checkpoint no declara trabajo pendiente",
|
|
169
|
+
command: `aw session-resume --code ${folder} --reopen`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async function readSection(fs, sessionPath, artifact, heading) {
|
|
173
|
+
try {
|
|
174
|
+
const file = await findArtifact(sessionPath, artifact, fs);
|
|
175
|
+
if (!file)
|
|
176
|
+
return undefined;
|
|
177
|
+
const section = parseMdSectionBilingual(await fs.readText(file), heading);
|
|
178
|
+
return section === undefined ? undefined : firstNonEmptyLine(section);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=resume-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-service.js","sourceRoot":"","sources":["../../src/application/resume-service.ts"],"names":[],"mappings":"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"}
|