@tacuchi/agent-workflow-cli 20.21.0 → 20.23.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/README.md +17 -6
- 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/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/markdown.js +61 -16
- package/dist/application/markdown.js.map +1 -1
- package/dist/application/parsers/phases.js +38 -45
- package/dist/application/parsers/phases.js.map +1 -1
- package/dist/application/parsers/plan-status.js +75 -0
- package/dist/application/parsers/plan-status.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 -352
- 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/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 +11 -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 +16 -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 +6 -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 +3 -1
- package/skills/w/commands/export-diagrams.md +19 -10
- package/skills/w/commands/export-manuals.md +20 -10
- package/skills/w/commands/export-reports.md +20 -11
- package/skills/w/commands/export-scripts.md +20 -10
- package/skills/w/commands/fix-git.md +31 -12
- package/skills/w/commands/generate-launch.md +1 -1
- package/skills/w/commands/persist.md +33 -68
- package/skills/w/commands/plan-new.md +1 -1
- package/skills/w/commands/resume.md +25 -41
- package/skills/w/commands/spec-refine.md +12 -0
- package/skills/w/commands/status.md +12 -40
- package/skills/w/commands/workspace-init.md +3 -3
- package/skills/w/hooks/README.md +21 -2
- package/skills/w/hooks/hooks.template.json +2 -2
- package/skills/w/loops/README.md +5 -3
- package/skills/w/loops/plan-exec-loop/LOOP.md +10 -5
- package/skills/w/loops/plan-new-loop/LOOP.md +17 -8
- package/skills/w/loops/plan-refine-loop/LOOP.md +3 -1
- package/skills/w/loops/spec-refine-loop/LOOP.md +20 -7
- package/skills/w/roles/git/ROLE.md +7 -8
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { resolveSessionTarget, } from "./session-resolver.js";
|
|
2
|
+
export async function resolveLifecycleTarget(fs, paths, options) {
|
|
3
|
+
// `allowClosed` stays off: a lifecycle surface writes or restores state, and
|
|
4
|
+
// a closed line is not a valid destination for either.
|
|
5
|
+
const resolution = await resolveSessionTarget(fs, paths, {
|
|
6
|
+
...(options.code !== undefined ? { code: options.code } : {}),
|
|
7
|
+
...(options.contextId !== undefined ? { contextId: options.contextId } : {}),
|
|
8
|
+
bind: true,
|
|
9
|
+
});
|
|
10
|
+
if (resolution.outcome === "resolved") {
|
|
11
|
+
return { outcome: "resolved", session: resolution.session };
|
|
12
|
+
}
|
|
13
|
+
// Holding the host's compaction is only worth it when a SELECTION actually
|
|
14
|
+
// resolves the situation — that is ambiguity, and the spec scopes pausable
|
|
15
|
+
// blocking to exactly that ("Si una compactación AMBIGUA puede pausarse").
|
|
16
|
+
// Every other outcome has nothing to pick from: a workspace with no active
|
|
17
|
+
// session is the normal state between runs, and blocking there would fail
|
|
18
|
+
// every single compaction with an empty candidate list.
|
|
19
|
+
if (options.canPauseCompaction === true && resolution.code === "SESSION_AMBIGUOUS") {
|
|
20
|
+
return { outcome: "blocked", error: resolution };
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
outcome: "degraded",
|
|
24
|
+
reason: resolution.message,
|
|
25
|
+
candidates: resolution.candidates,
|
|
26
|
+
action: resolution.action,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Why the target could not be resolved, in whichever form the outcome took. */
|
|
30
|
+
export function unresolvedDetail(target) {
|
|
31
|
+
return target.outcome === "blocked"
|
|
32
|
+
? {
|
|
33
|
+
reason: target.error.message,
|
|
34
|
+
candidates: target.error.candidates,
|
|
35
|
+
action: target.error.action,
|
|
36
|
+
}
|
|
37
|
+
: { reason: target.reason, candidates: target.candidates, action: target.action };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=lifecycle-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-target.js","sourceRoot":"","sources":["../../src/application/lifecycle-target.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAiC/B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAkB,EAClB,KAAmB,EACnB,OAAyB;IAEzB,6EAA6E;IAC7E,uDAAuD;IACvD,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE;QACvD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC;IACD,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,wDAAwD;IACxD,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACnD,CAAC;IACD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,UAAU,CAAC,OAAO;QAC1B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAC9B,MAAqE;IAErE,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;QACjC,CAAC,CAAC;YACE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;YAC5B,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;YACnC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;SAC5B;QACH,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,CAAC"}
|
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
const HEADING_LINE_RE = /^(#{1,6})\s+(\S.*)$/;
|
|
2
|
+
const FENCE_OPEN_RE = /^(`{3,}|~{3,})/;
|
|
3
|
+
/**
|
|
4
|
+
* Single-pass semantic scan of a Markdown document: which lines are quoted
|
|
5
|
+
* inside a fenced code block, and which headings are real structure.
|
|
6
|
+
*
|
|
7
|
+
* One implementation governs what is semantically visible, because the project
|
|
8
|
+
* writes its own contracts as Markdown examples: a `## Refinement decisions`,
|
|
9
|
+
* a `### F9` or a `> Estado: validada` shown inside a fence is documentation
|
|
10
|
+
* ABOUT the contract, never an instance of it. A parser that misses the
|
|
11
|
+
* distinction promotes specs nobody refined and counts phases nobody planned.
|
|
12
|
+
*
|
|
13
|
+
* Fences follow CommonMark's closing rule (see {@link closesFence}) — the
|
|
14
|
+
* alternating-marker shortcut leaked a nested example back into visibility.
|
|
15
|
+
* Beyond that, this is deliberately NOT a CommonMark implementation: indented
|
|
16
|
+
* code blocks, HTML blocks and setext headings are out of the contracts'
|
|
17
|
+
* vocabulary and stay unhandled.
|
|
18
|
+
*/
|
|
19
|
+
export function scanMarkdown(text) {
|
|
20
|
+
const lines = text.split("\n");
|
|
21
|
+
const fenced = new Array(lines.length).fill(false);
|
|
22
|
+
const headings = [];
|
|
23
|
+
let fence = null;
|
|
24
|
+
for (let i = 0; i < lines.length; i++) {
|
|
25
|
+
const line = (lines[i] ?? "").trim();
|
|
26
|
+
const marker = FENCE_OPEN_RE.exec(line)?.[1] ?? null;
|
|
27
|
+
if (fence === null) {
|
|
28
|
+
if (marker) {
|
|
29
|
+
fence = marker;
|
|
30
|
+
fenced[i] = true;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const match = HEADING_LINE_RE.exec(line);
|
|
34
|
+
if (match?.[1] && match[2]) {
|
|
35
|
+
headings.push({ level: match[1].length, title: match[2].trim(), line: i });
|
|
36
|
+
}
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
fenced[i] = true;
|
|
40
|
+
if (marker && closesFence(fence, marker, line))
|
|
41
|
+
fence = null;
|
|
42
|
+
}
|
|
43
|
+
return { lines, fenced, headings };
|
|
44
|
+
}
|
|
45
|
+
/** CommonMark closing fence: same character, at least as long, the bare marker alone. */
|
|
46
|
+
function closesFence(open, marker, line) {
|
|
47
|
+
return marker[0] === open[0] && marker.length >= open.length && line === marker;
|
|
48
|
+
}
|
|
1
49
|
export function parseMdValue(text, key) {
|
|
2
50
|
const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3
51
|
const re = new RegExp(`^\\s*[-*]?\\s*\\*{0,2}${escaped}\\*{0,2}\\s*[:=]\\s*(.+)$`, "im");
|
|
@@ -8,29 +56,26 @@ export function parseMdValue(text, key) {
|
|
|
8
56
|
const value = match[1].trim();
|
|
9
57
|
return value.length > 0 ? value : undefined;
|
|
10
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Body of the section opened by `heading`, up to the next heading of the same
|
|
61
|
+
* or a higher level. Section boundaries come from {@link scanMarkdown}, so a
|
|
62
|
+
* heading quoted inside a fence neither opens nor closes a section; the body
|
|
63
|
+
* returned is the raw slice, fenced examples included.
|
|
64
|
+
*/
|
|
11
65
|
export function parseMdSection(text, heading, normalizeName = (s) => s.trim().toLowerCase()) {
|
|
12
66
|
const target = normalizeName(heading);
|
|
13
|
-
const lines = text
|
|
14
|
-
const headingRe = /^(#{1,6})\s+(.+?)\s*$/;
|
|
67
|
+
const { lines, headings } = scanMarkdown(text);
|
|
15
68
|
let captureFrom = null;
|
|
16
69
|
let captureLevel = 0;
|
|
17
|
-
for (
|
|
18
|
-
const line = lines[i];
|
|
19
|
-
if (line === undefined)
|
|
20
|
-
continue;
|
|
21
|
-
const match = line.match(headingRe);
|
|
22
|
-
if (!match || !match[1] || !match[2])
|
|
23
|
-
continue;
|
|
24
|
-
const level = match[1].length;
|
|
25
|
-
const name = normalizeName(match[2]);
|
|
70
|
+
for (const h of headings) {
|
|
26
71
|
if (captureFrom === null) {
|
|
27
|
-
if (
|
|
28
|
-
captureFrom =
|
|
29
|
-
captureLevel = level;
|
|
72
|
+
if (normalizeName(h.title) === target) {
|
|
73
|
+
captureFrom = h.line + 1;
|
|
74
|
+
captureLevel = h.level;
|
|
30
75
|
}
|
|
31
76
|
}
|
|
32
|
-
else if (level <= captureLevel) {
|
|
33
|
-
return joinTrim(lines.slice(captureFrom,
|
|
77
|
+
else if (h.level <= captureLevel) {
|
|
78
|
+
return joinTrim(lines.slice(captureFrom, h.line));
|
|
34
79
|
}
|
|
35
80
|
}
|
|
36
81
|
if (captureFrom !== null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/application/markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/application/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { scanMarkdown } from "../markdown.js";
|
|
1
2
|
export const PHASE_STATES = ["pendiente", "en ejecución", "bloqueada", "validada"];
|
|
2
|
-
const HEADING_RE = /^(#{1,6})\s+(\S.*)$/;
|
|
3
3
|
const PHASE_NAME_RE = /^F(\d+)\s*(?:[—–-]\s*)?(.*)$/;
|
|
4
4
|
const STATE_RE = /^>\s*Estado\s*:\s*(.+)$/i;
|
|
5
|
-
const
|
|
5
|
+
const BLOCKER_RE = /^>\s*Bloqueo\s*:\s*(.+)$/i;
|
|
6
6
|
const TASKS_SECTION = "tasks";
|
|
7
7
|
/**
|
|
8
8
|
* Phase progress of a plan-doc: the `### Fn` blocks of its `## Tasks` section
|
|
@@ -24,55 +24,33 @@ const TASKS_SECTION = "tasks";
|
|
|
24
24
|
* spacing are folded. An absent, annotated (`validada — SQL pendiente de
|
|
25
25
|
* aplicar`) or unknown value degrades to `pendiente`: a phase is never counted
|
|
26
26
|
* as validated by deference. The reason for a stop lives in its own
|
|
27
|
-
* `> Bloqueo:` line,
|
|
27
|
+
* `> Bloqueo:` line, read here as opaque text so a blocked phase can say what
|
|
28
|
+
* it waits on without that reason ever qualifying the machine state.
|
|
28
29
|
*/
|
|
29
30
|
export function parsePhases(text) {
|
|
30
31
|
const scan = { items: [], current: null, stated: false, inTasks: false, anyStated: false };
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const { lines, fenced, headings } = scanMarkdown(text);
|
|
33
|
+
const headingByLine = new Map(headings.map((h) => [h.line, h]));
|
|
34
|
+
for (let i = 0; i < lines.length; i++) {
|
|
35
|
+
if (fenced[i])
|
|
36
|
+
continue;
|
|
37
|
+
const heading = headingByLine.get(i);
|
|
33
38
|
if (heading) {
|
|
34
39
|
applyHeading(scan, heading);
|
|
35
40
|
continue;
|
|
36
41
|
}
|
|
37
42
|
if (scan.inTasks)
|
|
38
|
-
|
|
43
|
+
applyBlockLine(scan, (lines[i] ?? "").trim());
|
|
39
44
|
}
|
|
40
45
|
if (!scan.anyStated)
|
|
41
|
-
return { total: 0, validated: 0, items: [] };
|
|
46
|
+
return { total: 0, validated: 0, blocked: 0, items: [] };
|
|
42
47
|
return {
|
|
43
48
|
total: scan.items.length,
|
|
44
49
|
validated: scan.items.filter((p) => p.state === "validada").length,
|
|
50
|
+
blocked: scan.items.filter((p) => p.state === "bloqueada").length,
|
|
45
51
|
items: scan.items,
|
|
46
52
|
};
|
|
47
53
|
}
|
|
48
|
-
/** Trimmed lines outside fenced blocks — a quoted example is never document content. */
|
|
49
|
-
function* visibleLines(text) {
|
|
50
|
-
let fence = null;
|
|
51
|
-
for (const raw of text.split("\n")) {
|
|
52
|
-
const line = raw.trim();
|
|
53
|
-
const marker = FENCE_RE.exec(line)?.[1] ?? null;
|
|
54
|
-
if (fence === null) {
|
|
55
|
-
if (marker) {
|
|
56
|
-
fence = marker;
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
yield line;
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
if (marker && closesFence(fence, marker, line))
|
|
63
|
-
fence = null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** CommonMark closing fence: same character, at least as long, the bare marker alone. */
|
|
67
|
-
function closesFence(open, marker, line) {
|
|
68
|
-
return marker[0] === open[0] && marker.length >= open.length && line === marker;
|
|
69
|
-
}
|
|
70
|
-
function readHeading(line) {
|
|
71
|
-
const match = HEADING_RE.exec(line);
|
|
72
|
-
if (!match?.[1] || !match[2])
|
|
73
|
-
return null;
|
|
74
|
-
return { level: match[1].length, name: match[2].trim() };
|
|
75
|
-
}
|
|
76
54
|
/**
|
|
77
55
|
* Section and block boundaries. A level-2 heading enters or leaves `## Tasks`;
|
|
78
56
|
* a level-3 one opens a phase or closes the previous block; a deeper one is a
|
|
@@ -83,12 +61,12 @@ function applyHeading(scan, heading) {
|
|
|
83
61
|
return;
|
|
84
62
|
scan.current = null;
|
|
85
63
|
if (heading.level <= 2) {
|
|
86
|
-
scan.inTasks = heading.level === 2 && isTasksHeading(heading.
|
|
64
|
+
scan.inTasks = heading.level === 2 && isTasksHeading(heading.title);
|
|
87
65
|
return;
|
|
88
66
|
}
|
|
89
67
|
if (!scan.inTasks)
|
|
90
68
|
return;
|
|
91
|
-
const phase = readPhaseHeading(heading.
|
|
69
|
+
const phase = readPhaseHeading(heading.title);
|
|
92
70
|
if (!phase)
|
|
93
71
|
return;
|
|
94
72
|
scan.items.push(phase);
|
|
@@ -104,19 +82,34 @@ function readPhaseHeading(name) {
|
|
|
104
82
|
const match = PHASE_NAME_RE.exec(name);
|
|
105
83
|
if (!match?.[1])
|
|
106
84
|
return null;
|
|
107
|
-
return { n: Number(match[1]), name: (match[2] ?? "").trim(), state: "pendiente" };
|
|
85
|
+
return { n: Number(match[1]), name: (match[2] ?? "").trim(), state: "pendiente", blocker: null };
|
|
108
86
|
}
|
|
109
|
-
|
|
87
|
+
/**
|
|
88
|
+
* The two machine lines of a phase block: its state (first one wins, the rest
|
|
89
|
+
* is prose) and its blocker reason (likewise). A block with no `> Bloqueo:`
|
|
90
|
+
* keeps `blocker: null` — legacy plans stopped before the line existed, and a
|
|
91
|
+
* missing reason is never invented.
|
|
92
|
+
*/
|
|
93
|
+
function applyBlockLine(scan, line) {
|
|
110
94
|
const current = scan.current;
|
|
111
|
-
if (!current
|
|
95
|
+
if (!current)
|
|
112
96
|
return;
|
|
113
97
|
// `**` tolerated: authors bold the label (`> **Estado:** validada`).
|
|
114
|
-
const
|
|
115
|
-
if (!
|
|
98
|
+
const bare = line.replace(/\*/g, "");
|
|
99
|
+
if (!scan.stated) {
|
|
100
|
+
const state = STATE_RE.exec(bare);
|
|
101
|
+
if (state?.[1]) {
|
|
102
|
+
current.state = normalizeState(state[1]);
|
|
103
|
+
scan.stated = true;
|
|
104
|
+
scan.anyStated = true;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (current.blocker !== null)
|
|
116
109
|
return;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
110
|
+
const blocker = BLOCKER_RE.exec(bare)?.[1]?.trim();
|
|
111
|
+
if (blocker)
|
|
112
|
+
current.blocker = blocker;
|
|
120
113
|
}
|
|
121
114
|
/** Case- and accent-insensitive: `en ejecucion` is the same mark as `en ejecución`. */
|
|
122
115
|
function fold(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../src/application/parsers/phases.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../src/application/parsers/phases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { scanMarkdown } from "../markdown.js";
|
|
2
|
+
export const PLAN_DECLARED_STATES = ["open", "done"];
|
|
3
|
+
const STATE_RE = /^>\s*Estado\s*:\s*(.+)$/i;
|
|
4
|
+
const CLOSURE_RE = /^>\s*Cierre\s*:\s*(.+)$/i;
|
|
5
|
+
/** `done — 2026-07-27 · sesion 123` → value `done`, tail the rest. */
|
|
6
|
+
const ANNOTATED_RE = /^(.*?)\s+[—–-]\s+(.+)$/;
|
|
7
|
+
/**
|
|
8
|
+
* The plan-level status line: the first `> Estado:` of the document PREAMBLE —
|
|
9
|
+
* everything before the first level-2 heading, i.e. the blockquote under the
|
|
10
|
+
* `# Plan PPP — <slug>` title.
|
|
11
|
+
*
|
|
12
|
+
* Position is what tells the two marks apart: this one governs the whole plan,
|
|
13
|
+
* while the `> Estado:` lines inside the `### Fn` blocks of `## Tasks` govern
|
|
14
|
+
* one phase each ({@link import("./phases.js").parsePhases}). Reading them with
|
|
15
|
+
* one rule would let a validated first phase close the plan.
|
|
16
|
+
*
|
|
17
|
+
* The machine value stands alone (`open` | `done`); the date and session live
|
|
18
|
+
* on the `> Cierre:` line. The legacy `done — YYYY-MM-DD · sesion NNN` shape is
|
|
19
|
+
* still read — those plans exist — and reports `legacy: true` so the loop that
|
|
20
|
+
* next edits the document migrates it instead of copying the old form forward.
|
|
21
|
+
* Anything else reads `unknown`: an unreadable declaration is a contradiction
|
|
22
|
+
* to surface, never a silent `open`.
|
|
23
|
+
*/
|
|
24
|
+
export function parsePlanStatus(text) {
|
|
25
|
+
const { lines, fenced, headings } = scanMarkdown(text);
|
|
26
|
+
// The preamble is the blockquote under the `# Plan PPP — <slug>` title: skip
|
|
27
|
+
// the title itself, stop at the first section heading that follows it.
|
|
28
|
+
const [title, ...rest] = headings;
|
|
29
|
+
const boundary = title?.level === 1 ? rest[0] : title;
|
|
30
|
+
const end = boundary ? boundary.line : lines.length;
|
|
31
|
+
let declared = "absent";
|
|
32
|
+
let closure = null;
|
|
33
|
+
let legacy = false;
|
|
34
|
+
for (let i = 0; i < end; i++) {
|
|
35
|
+
if (fenced[i])
|
|
36
|
+
continue;
|
|
37
|
+
// `**` tolerated: authors bold the label (`> **Estado:** done`).
|
|
38
|
+
const line = (lines[i] ?? "").trim().replace(/\*/g, "");
|
|
39
|
+
if (declared === "absent") {
|
|
40
|
+
const raw = STATE_RE.exec(line)?.[1];
|
|
41
|
+
if (raw) {
|
|
42
|
+
const read = readDeclaration(raw);
|
|
43
|
+
declared = read.declared;
|
|
44
|
+
legacy = read.legacy;
|
|
45
|
+
if (read.closure)
|
|
46
|
+
closure = read.closure;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (closure === null) {
|
|
51
|
+
const cierre = CLOSURE_RE.exec(line)?.[1]?.trim();
|
|
52
|
+
if (cierre)
|
|
53
|
+
closure = cierre;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { declared, closure, legacy };
|
|
57
|
+
}
|
|
58
|
+
function readDeclaration(raw) {
|
|
59
|
+
const exact = normalizeDeclared(raw);
|
|
60
|
+
if (exact)
|
|
61
|
+
return { declared: exact, closure: null, legacy: false };
|
|
62
|
+
const annotated = ANNOTATED_RE.exec(raw.trim());
|
|
63
|
+
const head = annotated?.[1] ? normalizeDeclared(annotated[1]) : null;
|
|
64
|
+
if (head && annotated?.[2]) {
|
|
65
|
+
return { declared: head, closure: annotated[2].trim(), legacy: true };
|
|
66
|
+
}
|
|
67
|
+
return { declared: "unknown", closure: null, legacy: false };
|
|
68
|
+
}
|
|
69
|
+
function normalizeDeclared(raw) {
|
|
70
|
+
const folded = raw.trim().toLowerCase();
|
|
71
|
+
return PLAN_DECLARED_STATES.includes(folded)
|
|
72
|
+
? folded
|
|
73
|
+
: null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=plan-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-status.js","sourceRoot":"","sources":["../../../src/application/parsers/plan-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAmB9D,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAC5C,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,sEAAsE;AACtE,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACvD,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAEpD,IAAI,QAAQ,GAAiC,QAAQ,CAAC;IACtD,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,CAAC,CAAC;YAAE,SAAS;QACxB,iEAAiE;QACjE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;gBAClC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACzB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACrB,IAAI,IAAI,CAAC,OAAO;oBAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBACzC,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAClD,IAAI,MAAM;gBAAE,OAAO,GAAG,MAAM,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAKlC,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEpE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjE,CAAC,CAAE,MAA4B;QAC/B,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { parseMdSectionBilingual, scanMarkdown } from "../markdown.js";
|
|
2
|
+
// Spec documents are `docs/specs/NNN-spec-<slug>.md`; the trailing character
|
|
3
|
+
// class stops at the punctuation that surrounds a path in prose (backticks,
|
|
4
|
+
// parens, quotes) so a Markdown link or an inline-code path still matches.
|
|
5
|
+
const SPEC_PATH_RE = /docs\/specs\/(\d{3})-spec[^\s`)"']*\.md/g;
|
|
6
|
+
// `Spec 011` / `spec 011` — a bare number is NOT evidence: `sesión 047` and
|
|
7
|
+
// `baseline 044` would match it, and the whole point is to never guess.
|
|
8
|
+
const SPEC_REFERENCE_RE = /\bspec\s+(\d{3})\b/gi;
|
|
9
|
+
const DERIVED_FROM_RE = /derived from/i;
|
|
10
|
+
/**
|
|
11
|
+
* The spec a plan declares as its source, by NUMBER — resolving the number
|
|
12
|
+
* against the real spec inventory belongs to the caller.
|
|
13
|
+
*
|
|
14
|
+
* Evidence is read in a fixed order and the FIRST level that says anything is
|
|
15
|
+
* final; levels never merge. Slug similarity, file dates and document age are
|
|
16
|
+
* deliberately absent: they are what made the old association guess wrong.
|
|
17
|
+
*
|
|
18
|
+
* 1. `Derived from docs/specs/NNN-…` in the header blockquote — what
|
|
19
|
+
* `plan-new` writes today.
|
|
20
|
+
* 2. An explicit spec path inside `## Origin` — what plans written before that
|
|
21
|
+
* header carried.
|
|
22
|
+
* 3. An unambiguous `Spec NNN` reference inside `## Origin` — the weakest
|
|
23
|
+
* accepted form, scoped to that section so a mention in `## Dependencies`
|
|
24
|
+
* ("la spec 009 consumirá…") is never mistaken for provenance.
|
|
25
|
+
*
|
|
26
|
+
* Two different specs at the same level is `ambiguous`, not a coin flip:
|
|
27
|
+
* a human wrote something contradictory and only a human should settle it.
|
|
28
|
+
*/
|
|
29
|
+
export function parseSpecRelation(text) {
|
|
30
|
+
const origin = parseMdSectionBilingual(text, "Origin") ?? "";
|
|
31
|
+
const levels = [
|
|
32
|
+
{ evidence: "derived-from", numbers: derivedFromNumbers(text) },
|
|
33
|
+
{ evidence: "origin-path", numbers: matchNumbers(origin, SPEC_PATH_RE) },
|
|
34
|
+
{ evidence: "spec-reference", numbers: matchNumbers(origin, SPEC_REFERENCE_RE) },
|
|
35
|
+
];
|
|
36
|
+
for (const { evidence, numbers } of levels) {
|
|
37
|
+
const [first] = numbers;
|
|
38
|
+
if (first === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
if (numbers.length === 1)
|
|
41
|
+
return { status: "declared", number: first, evidence };
|
|
42
|
+
return { status: "ambiguous", numbers, evidence };
|
|
43
|
+
}
|
|
44
|
+
return { status: "absent" };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Spec paths on the `Derived from` lines of the header blockquote — the block
|
|
48
|
+
* between the title and the first `##` section. Bounded there so a plan that
|
|
49
|
+
* quotes the marker inside its own prose does not re-declare its origin.
|
|
50
|
+
*/
|
|
51
|
+
function derivedFromNumbers(text) {
|
|
52
|
+
const { lines, fenced, headings } = scanMarkdown(text);
|
|
53
|
+
const firstSection = headings.find((h) => h.level >= 2);
|
|
54
|
+
const end = firstSection?.line ?? lines.length;
|
|
55
|
+
const found = [];
|
|
56
|
+
for (let i = 0; i < end; i++) {
|
|
57
|
+
const line = lines[i];
|
|
58
|
+
if (line === undefined || fenced[i] === true)
|
|
59
|
+
continue;
|
|
60
|
+
if (!DERIVED_FROM_RE.test(line))
|
|
61
|
+
continue;
|
|
62
|
+
found.push(...matchNumbers(line, SPEC_PATH_RE));
|
|
63
|
+
}
|
|
64
|
+
return dedupe(found);
|
|
65
|
+
}
|
|
66
|
+
function matchNumbers(text, pattern) {
|
|
67
|
+
const found = [];
|
|
68
|
+
// Fresh instance per call: the module-level literals carry /g, whose lastIndex
|
|
69
|
+
// would otherwise leak between documents.
|
|
70
|
+
for (const match of text.matchAll(new RegExp(pattern.source, pattern.flags))) {
|
|
71
|
+
const number = match[1];
|
|
72
|
+
if (number !== undefined)
|
|
73
|
+
found.push(number);
|
|
74
|
+
}
|
|
75
|
+
return dedupe(found);
|
|
76
|
+
}
|
|
77
|
+
function dedupe(numbers) {
|
|
78
|
+
return [...new Set(numbers)].sort();
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=spec-relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-relation.js","sourceRoot":"","sources":["../../../src/application/parsers/spec-relation.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,6 +63,14 @@ export class PathsService {
|
|
|
63
63
|
cwdSessionsDir() {
|
|
64
64
|
return join(this.cwdRoot(), "sessions");
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Durable conversation→session association registry. Lives inside the
|
|
68
|
+
* sessions dir (machine-local, gitignored) and is skipped by
|
|
69
|
+
* `listSessionFolders`, which ignores dot-prefixed entries.
|
|
70
|
+
*/
|
|
71
|
+
cwdSessionBindingsFile() {
|
|
72
|
+
return join(this.cwdSessionsDir(), ".bindings.json");
|
|
73
|
+
}
|
|
66
74
|
cwdHistoryFile() {
|
|
67
75
|
return join(this.cwdRoot(), "HISTORY.md");
|
|
68
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths-service.js","sourceRoot":"","sources":["../../src/application/paths-service.ts"],"names":[],"mappings":"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"}
|