@tacuchi/agent-workflow-cli 21.14.0 → 21.16.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 (37) hide show
  1. package/dist/application/export-service.js +183 -19
  2. package/dist/application/export-service.js.map +1 -1
  3. package/dist/application/parsers/project-block.js +164 -54
  4. package/dist/application/parsers/project-block.js.map +1 -1
  5. package/dist/application/project-md-upsert-service.js +153 -46
  6. package/dist/application/project-md-upsert-service.js.map +1 -1
  7. package/dist/application/render/project-block.js +37 -16
  8. package/dist/application/render/project-block.js.map +1 -1
  9. package/dist/application/retirement/graph.js +12 -2
  10. package/dist/application/retirement/graph.js.map +1 -1
  11. package/dist/application/retirement/prepare.js +21 -2
  12. package/dist/application/retirement/prepare.js.map +1 -1
  13. package/dist/application/retirement/preview.js +32 -0
  14. package/dist/application/retirement/preview.js.map +1 -1
  15. package/dist/application/retirement/resolve.js +4 -4
  16. package/dist/application/retirement/resolve.js.map +1 -1
  17. package/dist/application/semantic-operation/protocol.js +54 -4
  18. package/dist/application/semantic-operation/protocol.js.map +1 -1
  19. package/dist/application/session-create-service.js +94 -4
  20. package/dist/application/session-create-service.js.map +1 -1
  21. package/dist/application/workspace-init-service.js +43 -27
  22. package/dist/application/workspace-init-service.js.map +1 -1
  23. package/dist/cli/commands/export.js +78 -4
  24. package/dist/cli/commands/export.js.map +1 -1
  25. package/dist/cli/commands/retirement.js +10 -1
  26. package/dist/cli/commands/retirement.js.map +1 -1
  27. package/dist/cli/commands/session-create.js +1 -1
  28. package/dist/cli/commands/session-create.js.map +1 -1
  29. package/dist/cli/commands/workspace-init.js +12 -0
  30. package/dist/cli/commands/workspace-init.js.map +1 -1
  31. package/dist/domain/retirement/proposal.js +1 -0
  32. package/dist/domain/retirement/proposal.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skills/w/commands/export-diagrams.md +1 -1
  35. package/skills/w/commands/export-manuals.md +1 -1
  36. package/skills/w/commands/export-reports.md +1 -1
  37. package/skills/w/commands/export-scripts.md +1 -1
@@ -1,9 +1,16 @@
1
1
  import { localDateIso } from "./dates.js";
2
2
  import { runNextNumber } from "./dev-only-services.js";
3
+ import { resolveDocsCanon } from "./docs-canon-service.js";
3
4
  import { withCwdLock } from "./lock-service.js";
4
5
  import { runReleaseData } from "./release-data-service.js";
5
- import { approvalDigest, buildSemanticRequest, parseSemanticResponse, } from "./semantic-operation/protocol.js";
6
+ import { approvalDigest, buildSemanticRequest, parseSemanticResponse, readEnvelopeScope, } from "./semantic-operation/protocol.js";
6
7
  import { publishArtifacts } from "./semantic-operation/publish.js";
8
+ export const EXPORT_CATEGORIES = [
9
+ "diagrams",
10
+ "manuals",
11
+ "reports",
12
+ "scripts",
13
+ ];
7
14
  const POLICIES = {
8
15
  diagrams: {
9
16
  dir: "docs/diagrams",
@@ -18,8 +25,8 @@ const POLICIES = {
18
25
  required: ["README.md"],
19
26
  extensions: [".md"],
20
27
  // The only file an export may replace, and only with an explicit approval.
21
- overwritable: "docs/manuals/INDEX.md",
22
- contract: "Un dossier con README.md obligatorio y los manuales en Markdown. Podés incluir docs/manuals/INDEX.md para actualizar el índice: es el ÚNICO archivo sobrescribible y exige aprobación explícita.",
28
+ overwritable: "INDEX.md",
29
+ contract: "Un dossier con README.md obligatorio y los manuales en Markdown. Podés incluir el INDEX.md de la categoría para actualizar el índice: es el ÚNICO archivo sobrescribible y exige aprobación explícita.",
23
30
  },
24
31
  reports: {
25
32
  dir: "docs/reports",
@@ -33,14 +40,34 @@ const POLICIES = {
33
40
  shape: "dossier",
34
41
  required: ["00-ROLLBACK.sql", "README.md"],
35
42
  extensions: [".sql", ".md"],
36
- contract: "Un dossier con 00-ROLLBACK.sql y README.md obligatorios, más los forwards NN-<nombre>.sql numerados de forma continua desde 01. El CLI NUNCA ejecuta SQL.",
43
+ // The net-final-state doctrine travels HERE, in the contract the composer
44
+ // must obey, and not in the `skills/w` bundle: the bundle's context budget
45
+ // is a frozen gate with 121 B of headroom and this is ~700 B, so shipping it
46
+ // there would mean cutting live doctrine to pay for it. The contract reaches
47
+ // the same reader at the exact moment the bundle is being written, and its
48
+ // bytes are request bytes, which no frozen gate prices.
49
+ contract: "Un dossier con 00-ROLLBACK.sql y README.md obligatorios, más los forwards NN-<nombre>.sql numerados de forma continua desde 01. El CLI NUNCA ejecuta SQL. El bundle publica el ESTADO FINAL NETO de la secuencia, no una réplica por sesión: lo que nace y muere dentro de la secuencia se omite; lo migrado va directo a su forma final; lo que el contexto declara retirado se omite aunque ningún script lo elimine. 00-ROLLBACK.sql invierte ese ESTADO FINAL en orden seguro para las dependencias, no el reverso literal de los forwards. Reconciliá contra el código además de las sesiones y la base. Excluí identidades concretas y semillas de prueba; conservá funciones reutilizables, tablas maestras y el registro de menú/rol.",
37
50
  },
38
51
  };
39
52
  const LIMITS = { max_artifacts: 64, max_artifact_bytes: 512 * 1024 };
40
53
  const FORWARD_RE = /^(\d{2})-[^/]+\.sql$/;
41
54
  // ── prepare ──────────────────────────────────────────────────────────────────
42
- export async function prepareExport(fs, env, paths, category, selection = {}) {
43
- const policy = POLICIES[category];
55
+ export async function prepareExport(fs, env, paths, category, selection = {},
56
+ // Injected so the midnight boundary is testable: a preparation that outlives
57
+ // the day used to rename its own destination on the next stage.
58
+ now = () => new Date()) {
59
+ const canon = await resolveDocsCanon(fs, paths, EXPORT_CATEGORIES);
60
+ if (!canon.ok) {
61
+ return {
62
+ ok: false,
63
+ failure: {
64
+ code: "EXPORT_DESTINATION_INVALID",
65
+ message: canon.error,
66
+ action: "corregí la tabla [docs] de skills.toml, o quitala para usar el destino por defecto",
67
+ },
68
+ };
69
+ }
70
+ const policy = resolvePolicy(category, canon.canon[category]);
44
71
  const corpus = await readCorpus(fs, env, paths, selection);
45
72
  if ("error" in corpus) {
46
73
  return {
@@ -62,33 +89,72 @@ export async function prepareExport(fs, env, paths, category, selection = {}) {
62
89
  },
63
90
  };
64
91
  }
65
- const next = (await runNextNumber(fs, env, paths, { directory: policy.dir, dryRun: true })).next;
66
- const date = selection.date ?? localDateIso(new Date());
92
+ // Pinned when the answer echoed them, derived only on a first preparation:
93
+ // re-deriving either at `validate` renames the very unit the answer wrote to,
94
+ // and neither is workspace state that a stale check should be defending.
95
+ const next = selection.next ??
96
+ (await runNextNumber(fs, env, paths, { directory: policy.dir, dryRun: true })).next;
97
+ const date = selection.date ?? localDateIso(now());
98
+ // Rejected HERE and not only when the envelope comes back: `prepare` used to
99
+ // accept any string, mint `…-export-manuals-lunes` and let the composer be
100
+ // blamed at `validate` for a scope it had copied verbatim, exactly as asked.
101
+ // The invocation that supplied it is the one that can fix it.
102
+ if (!DATE_RE.test(date)) {
103
+ return {
104
+ ok: false,
105
+ failure: {
106
+ code: "EXPORT_SCOPE_INVALID",
107
+ message: `--date '${date}' no tiene la forma YYYY-MM-DD`,
108
+ action: "repetí la invocación con una fecha YYYY-MM-DD, o sin --date para usar la de hoy",
109
+ },
110
+ };
111
+ }
67
112
  const unit = policy.shape === "dossier" ? `${policy.dir}/${next}-export-${category}-${date}` : policy.dir;
113
+ const scope = {
114
+ ...(selection.sessions !== undefined ? { sessions: selection.sessions } : {}),
115
+ ...(selection.since !== undefined ? { since: selection.since } : {}),
116
+ ...(selection.source !== undefined ? { source: selection.source } : {}),
117
+ date,
118
+ next,
119
+ };
68
120
  const inventory = {
69
121
  category,
70
122
  destination: unit,
71
123
  shape: policy.shape,
72
124
  required: policy.required,
73
125
  extensions: policy.extensions,
74
- overwritable: policy.overwritable ?? null,
126
+ overwritable: policy.overwritable,
75
127
  sessions: corpus.sessions,
76
128
  date,
77
129
  };
78
130
  const readSet = corpus.sessions.map((s) => s.path ?? s.folder);
79
131
  const request = buildSemanticRequest({
80
132
  operation: `export-${category}`,
81
- // The corpus seals the request: a session appearing or closing between
82
- // prepare and apply changes what the dossier should have contained.
83
- inputs: { corpus: corpus.sessions, next, date },
84
- contract: `${policy.contract} Respondé artifacts con paths dentro de ${unit}${policy.overwritable ? ` (o exactamente ${policy.overwritable})` : ""}. El NNN es consultivo: el CLI reasigna el número dentro del lock.`,
133
+ // What the seal defends is workspace state: the corpus the scope covers (a
134
+ // session appearing or closing changes what the dossier should have
135
+ // contained) and the folder this workspace publishes to. The scope rides
136
+ // along so an altered echo cannot pass as the original one.
137
+ inputs: { corpus: corpus.sessions, dir: policy.dir, scope },
138
+ sealed: "el corpus de sesiones del alcance o el destino declarado de la categoría",
139
+ scope,
140
+ contract: `${policy.contract} Respondé artifacts con paths dentro de ${unit}${policy.overwritable === null ? "" : ` (o exactamente ${policy.overwritable})`}. El NNN es consultivo: el CLI reasigna el número dentro del lock. Copiá 'scope' TAL CUAL en tu respuesta: validate y apply lo leen en vez de re-derivarlo.`,
85
141
  inventory,
86
- allowedDestinations: [unit, ...(policy.overwritable ? [policy.overwritable] : [])],
142
+ allowedDestinations: [unit, ...(policy.overwritable === null ? [] : [policy.overwritable])],
87
143
  limits: LIMITS,
88
144
  readSet,
89
145
  readSetBytes: readSet.length,
90
146
  });
91
- return { ok: true, value: { category, request, next, unit } };
147
+ return { ok: true, value: { category, request, dir: policy.dir, scope, next, unit } };
148
+ }
149
+ /** The category's policy with the folder this workspace actually publishes to. */
150
+ function resolvePolicy(category, dir) {
151
+ const { overwritable, ...base } = POLICIES[category];
152
+ const resolved = dir ?? base.dir;
153
+ return {
154
+ ...base,
155
+ dir: resolved,
156
+ overwritable: overwritable === undefined ? null : `${resolved}/${overwritable}`,
157
+ };
92
158
  }
93
159
  async function readCorpus(fs, env, paths, selection) {
94
160
  const input = {
@@ -105,16 +171,107 @@ async function readCorpus(fs, env, paths, selection) {
105
171
  return { error: data.error };
106
172
  return { sessions: data.sessions };
107
173
  }
174
+ // ── the scope, travelling between stages ─────────────────────────────────────
175
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
176
+ const NEXT_RE = /^\d{3,}$/;
177
+ /**
178
+ * The scope an answer echoes back, so `validate` and `apply` rebuild the
179
+ * preparation the answer was written against.
180
+ *
181
+ * Three outcomes and no fourth: a scope that is there and well formed, no scope
182
+ * at all (an answer written before this field existed — the invocation's own
183
+ * flags still decide, exactly as they did), and a scope that is there but
184
+ * malformed, which is a rejection. Reading a broken echo as "no echo" would
185
+ * quietly export a different corpus than the one that was approved.
186
+ */
187
+ export function readExportScope(raw) {
188
+ const echoed = readEnvelopeScope(raw);
189
+ if (echoed === undefined || echoed === null)
190
+ return { ok: true, value: null };
191
+ if (typeof echoed !== "object" || Array.isArray(echoed))
192
+ return malformedScope("no es un objeto");
193
+ const scope = echoed;
194
+ const why = scopeShapeError(scope);
195
+ if (why !== null)
196
+ return malformedScope(why);
197
+ return {
198
+ ok: true,
199
+ value: {
200
+ ...(scope.sessions !== undefined ? { sessions: scope.sessions } : {}),
201
+ ...(scope.since !== undefined ? { since: scope.since } : {}),
202
+ ...(scope.source !== undefined ? { source: scope.source } : {}),
203
+ date: scope.date,
204
+ next: scope.next,
205
+ },
206
+ };
207
+ }
208
+ /** Why this echo is not the scope `prepare` emitted, or `null` when it is. */
209
+ function scopeShapeError(scope) {
210
+ if (typeof scope.date !== "string" || !DATE_RE.test(scope.date)) {
211
+ return "'date' tiene que ser YYYY-MM-DD";
212
+ }
213
+ if (typeof scope.next !== "string" || !NEXT_RE.test(scope.next)) {
214
+ return "'next' tiene que ser el correlativo de 3 dígitos";
215
+ }
216
+ if (scope.sessions !== undefined && !isStringArray(scope.sessions)) {
217
+ return "'sessions' tiene que ser una lista de códigos de texto";
218
+ }
219
+ for (const key of ["since", "source"]) {
220
+ if (scope[key] !== undefined && typeof scope[key] !== "string") {
221
+ return `'${key}' tiene que ser texto`;
222
+ }
223
+ }
224
+ return null;
225
+ }
226
+ function isStringArray(value) {
227
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
228
+ }
229
+ function malformedScope(why) {
230
+ return {
231
+ ok: false,
232
+ failure: {
233
+ code: "SEMANTIC_RESPONSE_INVALID",
234
+ message: `el 'scope' del sobre no tiene la forma que prepare emitió: ${why}`,
235
+ action: "copiá el 'scope' del request TAL CUAL, sin reescribirlo",
236
+ },
237
+ };
238
+ }
239
+ /**
240
+ * Scope flags the invocation repeated that CONTRADICT the echoed scope.
241
+ *
242
+ * Repeating them is still supported and still works — that is what every
243
+ * existing invocation does. Repeating them with a different value is not the
244
+ * same thing: one of the two answers is not the one the proposal was written
245
+ * against, and picking either in silence hides which.
246
+ */
247
+ export function conflictingScopeFlags(echoed, flags) {
248
+ const same = (a, b) => (a ?? []).join(",") === (b ?? []).join(",");
249
+ const conflicts = [];
250
+ if (flags.sessions !== undefined && !same(flags.sessions, echoed.sessions)) {
251
+ conflicts.push("--sessions");
252
+ }
253
+ for (const [flag, key] of [
254
+ ["--since", "since"],
255
+ ["--source", "source"],
256
+ ["--date", "date"],
257
+ ]) {
258
+ if (flags[key] !== undefined && flags[key] !== echoed[key])
259
+ conflicts.push(flag);
260
+ }
261
+ return conflicts;
262
+ }
108
263
  // ── validate ─────────────────────────────────────────────────────────────────
109
264
  export function validateExport(raw, prepared) {
110
265
  const parsed = parseSemanticResponse(raw, prepared.request);
111
266
  if (!parsed.ok)
112
267
  return parsed;
113
- const policy = POLICIES[prepared.category];
268
+ // From what was prepared, never from the policy table: the folder is the
269
+ // workspace's, and re-reading it here would let the two stages disagree.
270
+ const policy = resolvePolicy(prepared.category, prepared.dir);
114
271
  const artifacts = parsed.value.artifacts ?? [];
115
272
  const inUnit = artifacts.filter((a) => a.path !== policy.overwritable);
116
273
  const overwrites = artifacts.some((a) => a.path === policy.overwritable)
117
- ? (policy.overwritable ?? null)
274
+ ? policy.overwritable
118
275
  : null;
119
276
  const shape = checkShape(inUnit, policy, prepared.unit);
120
277
  if (shape !== null)
@@ -199,7 +356,7 @@ export async function applyExport(fs, env, paths, input) {
199
356
  const parsed = parseSemanticResponse(input.raw, input.prepared.request);
200
357
  if (!parsed.ok)
201
358
  return parsed;
202
- const policy = POLICIES[input.prepared.category];
359
+ const policy = resolvePolicy(input.prepared.category, input.prepared.dir);
203
360
  const result = await withCwdLock(fs, paths, async () => {
204
361
  const minted = (await runNextNumber(fs, env, paths, { directory: policy.dir })).next;
205
362
  const artifacts = (parsed.value.artifacts ?? []).map((artifact) => renumber(artifact, input.prepared, minted, policy));
@@ -234,7 +391,14 @@ function renumber(artifact, prepared, minted, policy) {
234
391
  const name = artifact.path.slice(policy.dir.length + 1).replace(/^\d{3}-/, "");
235
392
  return { path: `${policy.dir}/${minted}-${name}`, content: artifact.content };
236
393
  }
237
- const unit = prepared.unit.replace(/\/\d{3}-/, `/${minted}-`);
394
+ // The number to move is the UNIT's own, which is its LAST segment — never the
395
+ // first `/NNN-` of the path. Since the category's folder became configurable,
396
+ // a canon that is itself numbered (`docs/003-manuales`) would eat the
397
+ // replacement: the export would be approved into `docs/003-manuales/…` and
398
+ // written into `docs/001-manuales/…`, a folder outside `allowed_destinations`
399
+ // that nothing downstream re-checks.
400
+ const unitName = prepared.unit.slice(policy.dir.length + 1).replace(/^\d{3}-/, `${minted}-`);
401
+ const unit = `${policy.dir}/${unitName}`;
238
402
  return {
239
403
  path: `${unit}/${artifact.path.slice(prepared.unit.length + 1)}`,
240
404
  content: artifact.content,
@@ -1 +1 @@
1
- {"version":3,"file":"export-service.js","sourceRoot":"","sources":["../../src/application/export-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export-service.js","sourceRoot":"","sources":["../../src/application/export-service.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { parseMdSection } from "../markdown.js";
6
6
  * the read loop previously pasted per service.
7
7
  */
8
8
  export async function readWorkspaceBlock(fs, dir, markers, accept = () => true) {
9
- for (const name of ["CLAUDE.md", "AGENTS.md"]) {
9
+ for (const name of BLOCK_MIRROR_FILES) {
10
10
  const path = join(dir, name);
11
11
  if (!(await fs.exists(path)))
12
12
  continue;
@@ -16,10 +16,22 @@ export async function readWorkspaceBlock(fs, dir, markers, accept = () => true)
16
16
  }
17
17
  return null;
18
18
  }
19
+ /** The block is written to both files at once; a reader takes the first that has it. */
20
+ export const BLOCK_MIRROR_FILES = ["CLAUDE.md", "AGENTS.md"];
19
21
  export const LEGACY_QTC_MARKERS = {
20
22
  start: "<!-- QTC-PROJECT-START -->",
21
23
  end: "<!-- QTC-PROJECT-END -->",
22
24
  };
25
+ /**
26
+ * Lines the render emits by itself when a section has no data. They belong to
27
+ * the CLI, never to a person: preserving one would duplicate it on the next
28
+ * write (the render re-emits it AND the carried copy would come back too).
29
+ */
30
+ export const BLOCK_PLACEHOLDER_PROYECTO = "_Describe el proyecto aquí: qué es y por qué existe._";
31
+ export const BLOCK_PLACEHOLDER_FUENTES = "_Sin fuentes declaradas. Edita manualmente o usa `project-md-upsert --init`._";
32
+ export const BLOCK_PLACEHOLDER_STACK = "_Stack sin detectar._";
33
+ /** Emitted by the pre-TypeScript generator for an undetectable stack. */
34
+ const LEGACY_STACK_PLACEHOLDER = "Edita manualmente si aplica.";
23
35
  const STACK_KEY_MAP = {
24
36
  lenguaje: "language",
25
37
  framework: "framework",
@@ -50,24 +62,77 @@ function parseWithMarkers(text, markers) {
50
62
  const statusText = parseMdSection(inner, "Status") ?? "";
51
63
  const fuentes = parseFuentesTable(fuentesText);
52
64
  const stack = parseStackList(stackText);
53
- const status = parseStatusBlock(statusText);
54
- return {
65
+ // Aliases first: a Status entry is a branch because it names a DECLARED
66
+ // source, not because of where it sits (see `readNestedRecord`).
67
+ const status = parseStatusBlock(statusText, new Set(fuentes.fuentes.map((f) => f.alias)));
68
+ const block = {
55
69
  proyecto: stripLegacyModeLine(proyectoText),
56
- fuentes,
57
- stack,
70
+ fuentes: fuentes.fuentes,
71
+ stack: stack.stack,
58
72
  default_branches: status.defaultBranches,
59
73
  working_branches: status.workingBranches,
60
74
  qa_branches: status.qaBranches,
61
75
  last_activity: status.lastActivity,
62
76
  };
77
+ const preserved = [
78
+ ...fuentes.preserved,
79
+ ...stack.preserved,
80
+ ...status.preserved,
81
+ ...foreignSections(inner),
82
+ ];
83
+ if (preserved.length > 0)
84
+ block.preserved_lines = preserved;
85
+ if (status.dropped.length > 0)
86
+ block.dropped_lines = status.dropped;
87
+ return block;
88
+ }
89
+ /** The four `##` sections this block owns; anything else under a heading is somebody else's. */
90
+ const OWNED_SECTIONS = new Set(["proyecto", "fuentes", "stack", "status"]);
91
+ /**
92
+ * Whole sections the block does not own, heading included.
93
+ *
94
+ * The four owned ones are read BY NAME, so a `## Notas` a person adds was never
95
+ * seen by the parser and never came back — the silent loss this parser exists to
96
+ * stop, arriving through the one shape Markdown makes most natural. They are
97
+ * re-emitted last, after everything the CLI owns, because their original order
98
+ * relative to generated sections is not something a rewrite can honour.
99
+ */
100
+ function foreignSections(inner) {
101
+ const kept = [];
102
+ let foreign = false;
103
+ for (const raw of inner.split("\n")) {
104
+ const heading = /^##\s+(.+)$/.exec(raw.trim());
105
+ if (heading !== null) {
106
+ foreign = !OWNED_SECTIONS.has((heading[1] ?? "").trim().toLowerCase());
107
+ }
108
+ if (!foreign)
109
+ continue;
110
+ if (raw.trim().length === 0 && kept.length === 0)
111
+ continue;
112
+ kept.push({ slot: "trailing", text: trimTrailing(raw) });
113
+ }
114
+ while (kept.length > 0 && (kept[kept.length - 1]?.text ?? "").length === 0)
115
+ kept.pop();
116
+ return kept;
117
+ }
118
+ /** Trailing blanks carry nothing and would churn the rewrite; indentation is content. */
119
+ function trimTrailing(raw) {
120
+ return raw.replace(/\s+$/, "");
63
121
  }
64
122
  function parseFuentesTable(text) {
65
123
  const fuentes = [];
124
+ const preserved = [];
66
125
  let header = null;
67
126
  for (const raw of text.split("\n")) {
68
127
  const line = raw.trim();
69
- if (!line.startsWith("|"))
128
+ if (line.length === 0)
70
129
  continue;
130
+ if (!line.startsWith("|")) {
131
+ if (line !== BLOCK_PLACEHOLDER_FUENTES) {
132
+ preserved.push({ slot: "fuentes", text: trimTrailing(raw) });
133
+ }
134
+ continue;
135
+ }
71
136
  const cells = line
72
137
  .replace(/^\|/, "")
73
138
  .replace(/\|$/, "")
@@ -80,13 +145,14 @@ function parseFuentesTable(text) {
80
145
  header = cells.map((c) => c.toLowerCase());
81
146
  continue;
82
147
  }
83
- if (cells.length < 3)
84
- continue;
85
148
  const alias = cells[0];
86
149
  const path = cells[1];
87
150
  const mainBranch = cells[2];
88
- if (alias === undefined || path === undefined)
151
+ if (cells.length < 3 || alias === undefined || path === undefined) {
152
+ // A row the table shape cannot read: keep it rather than swallow it.
153
+ preserved.push({ slot: "fuentes", text: trimTrailing(raw) });
89
154
  continue;
155
+ }
90
156
  fuentes.push({
91
157
  alias,
92
158
  path,
@@ -94,94 +160,138 @@ function parseFuentesTable(text) {
94
160
  main_branch: mainBranch !== undefined && mainBranch.length > 0 ? mainBranch : null,
95
161
  });
96
162
  }
97
- return fuentes;
163
+ return { fuentes, preserved };
98
164
  }
99
165
  function parseStackList(text) {
100
166
  const stack = {};
167
+ const preserved = [];
101
168
  for (const raw of text.split("\n")) {
102
169
  const line = raw.trim();
170
+ if (line.length === 0)
171
+ continue;
172
+ if (line === BLOCK_PLACEHOLDER_STACK || line === LEGACY_STACK_PLACEHOLDER)
173
+ continue;
103
174
  const m = line.match(/^[-*]\s+(Lenguaje|Framework|BD|Build):\s*(.+)$/i);
104
- if (m?.[1] && m[2]) {
105
- const key = STACK_KEY_MAP[m[1].toLowerCase()];
106
- if (key) {
107
- stack[key] = m[2].trim();
108
- }
175
+ const key = m?.[1] ? STACK_KEY_MAP[m[1].toLowerCase()] : undefined;
176
+ if (key && m?.[2]) {
177
+ stack[key] = m[2].trim();
178
+ continue;
109
179
  }
180
+ preserved.push({ slot: "stack", text: trimTrailing(raw) });
110
181
  }
111
- return stack;
182
+ return { stack, preserved };
112
183
  }
113
184
  const DEFAULT_BRANCH_KEYS = new Set(["principal", "desarrollo", "qa"]);
114
- function parseStatusBlock(text) {
185
+ /**
186
+ * Read `## Status`. Every line falls in exactly one of three buckets and none of
187
+ * them vanishes: a recognized entry (parsed), a CLI record the block can no
188
+ * longer honour (dropped, and declared by the caller), or anything else — kept
189
+ * verbatim at the slot it was found in.
190
+ */
191
+ function parseStatusBlock(text, knownAliases) {
115
192
  const defaultBranches = {};
116
193
  const workingBranches = {};
117
194
  const qaBranches = {};
195
+ const preserved = [];
196
+ const dropped = [];
118
197
  let lastActivity = null;
119
198
  let section = "none";
199
+ let slot = "status:start";
120
200
  for (const raw of text.split("\n")) {
121
201
  const stripped = raw.trim();
202
+ if (stripped.length === 0)
203
+ continue;
122
204
  const transition = transitionSection(stripped);
123
205
  if (transition.handled) {
124
206
  section = transition.next;
207
+ slot = transition.slot;
125
208
  if (transition.lastActivity !== undefined) {
126
209
  lastActivity = transition.lastActivity;
127
210
  }
128
211
  continue;
129
212
  }
130
- if (!stripped.startsWith("- "))
213
+ const record = readNestedRecord(raw, stripped);
214
+ if (record === null || section === "none") {
215
+ preserved.push({ slot, text: trimTrailing(raw) });
131
216
  continue;
132
- const entry = stripped.slice(2).trim();
133
- if (section === "defaults") {
134
- addDefaultBranch(defaultBranches, entry);
135
- }
136
- else if (section === "working") {
137
- addWorkingBranch(workingBranches, entry);
138
- }
139
- else if (section === "qa") {
140
- addWorkingBranch(qaBranches, entry);
141
217
  }
218
+ const out = { defaultBranches, workingBranches, qaBranches };
219
+ if (acceptRecord(section, record, out, knownAliases))
220
+ continue;
221
+ // Shape matched but the block cannot honour the key. Indentation decides
222
+ // WHERE it goes, and only here: an indented entry is one this CLI wrote, so
223
+ // a key nobody declares anymore is its own residue — pruned, and declared.
224
+ // A flush-left one is somebody's note that happens to read like `- k: v`,
225
+ // and deleting it is the very loss this parser exists to stop.
226
+ if (/^\s/.test(raw))
227
+ dropped.push(trimTrailing(raw));
228
+ else
229
+ preserved.push({ slot, text: trimTrailing(raw) });
142
230
  }
143
- return { defaultBranches, workingBranches, qaBranches, lastActivity };
231
+ return { defaultBranches, workingBranches, qaBranches, lastActivity, preserved, dropped };
232
+ }
233
+ /**
234
+ * A `- key: value` entry — the shape the render emits for its own records.
235
+ *
236
+ * Position is NOT the signature: that is how a note written after the branch
237
+ * header used to be adopted as a working branch and re-emitted nested under it,
238
+ * perpetuating itself from the first re-run. What identifies a record is its
239
+ * SHAPE plus a key the block already declares (`acceptRecord`).
240
+ *
241
+ * Indentation is deliberately NOT required. The render indents its own entries,
242
+ * but a block hand-edited or written by an older CLI carries them flush left,
243
+ * and demanding the indent would be the positional rule coming back in through
244
+ * another door: those branches would stop being branches, and four consumers
245
+ * read them.
246
+ */
247
+ function readNestedRecord(_raw, stripped) {
248
+ if (!stripped.startsWith("- "))
249
+ return null;
250
+ const entry = stripped.slice(2).trim();
251
+ const colon = entry.indexOf(":");
252
+ if (colon <= 0)
253
+ return null;
254
+ const key = entry.slice(0, colon).trim();
255
+ const value = entry.slice(colon + 1).trim();
256
+ if (!key || !value)
257
+ return null;
258
+ return { key, value };
259
+ }
260
+ /** True when the record was stored; false when the block cannot honour it. */
261
+ function acceptRecord(section, record, out, knownAliases) {
262
+ if (section === "defaults") {
263
+ const role = record.key.toLowerCase();
264
+ if (!DEFAULT_BRANCH_KEYS.has(role))
265
+ return false;
266
+ out.defaultBranches[role] = record.value;
267
+ return true;
268
+ }
269
+ if (!knownAliases.has(record.key))
270
+ return false;
271
+ const target = section === "working" ? out.workingBranches : out.qaBranches;
272
+ target[record.key] = record.value;
273
+ return true;
144
274
  }
145
275
  function transitionSection(stripped) {
146
276
  if (stripped.startsWith("- Ramas por defecto:"))
147
- return { handled: true, next: "defaults" };
277
+ return { handled: true, next: "defaults", slot: "status:defaults" };
148
278
  if (stripped.startsWith("- Ramas de trabajo actuales:"))
149
- return { handled: true, next: "working" };
279
+ return { handled: true, next: "working", slot: "status:working" };
150
280
  if (stripped.startsWith("- Ramas QA actuales:"))
151
- return { handled: true, next: "qa" };
281
+ return { handled: true, next: "qa", slot: "status:qa" };
152
282
  if (stripped.startsWith("- Última actividad:")) {
153
283
  const idx = stripped.indexOf(":");
154
284
  return {
155
285
  handled: true,
156
286
  next: "none",
287
+ slot: "status:activity",
157
288
  lastActivity: idx >= 0 ? stripped.slice(idx + 1).trim() : null,
158
289
  };
159
290
  }
160
291
  if (stripped.startsWith("- Histórico") || stripped.startsWith("- Historico")) {
161
- return { handled: true, next: "none" };
162
- }
163
- return { handled: false, next: "none" };
164
- }
165
- /** `principal: main` → `{ principal: "main" }`. Unknown roles are ignored. */
166
- function addDefaultBranch(out, entry) {
167
- const colon = entry.indexOf(":");
168
- if (colon <= 0)
169
- return;
170
- const role = entry.slice(0, colon).trim().toLowerCase();
171
- const branch = entry.slice(colon + 1).trim();
172
- if (!branch || !DEFAULT_BRANCH_KEYS.has(role))
173
- return;
174
- out[role] = branch;
175
- }
176
- function addWorkingBranch(out, entry) {
177
- const colon = entry.indexOf(":");
178
- if (colon <= 0)
179
- return;
180
- const alias = entry.slice(0, colon).trim();
181
- const branch = entry.slice(colon + 1).trim();
182
- if (alias && branch) {
183
- out[alias] = branch;
292
+ return { handled: true, next: "none", slot: "status:historico" };
184
293
  }
294
+ return { handled: false, next: "none", slot: "status:start" };
185
295
  }
186
296
  /**
187
297
  * Drop any legacy `Mode:` line from the Proyecto text. The project/hub mode