@tacuchi/agent-workflow-cli 20.26.0 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/node-file-system.js +3 -0
  3. package/dist/adapters/node-file-system.js.map +1 -1
  4. package/dist/application/design/design-gate-service.js +246 -0
  5. package/dist/application/design/design-gate-service.js.map +1 -0
  6. package/dist/application/design/design-graph-service.js +85 -0
  7. package/dist/application/design/design-graph-service.js.map +1 -0
  8. package/dist/application/design/design-index-service.js +132 -0
  9. package/dist/application/design/design-index-service.js.map +1 -0
  10. package/dist/application/design/design-publish-service.js +488 -0
  11. package/dist/application/design/design-publish-service.js.map +1 -0
  12. package/dist/application/design/design-resolver-service.js +165 -0
  13. package/dist/application/design/design-resolver-service.js.map +1 -0
  14. package/dist/application/resume-service.js +23 -4
  15. package/dist/application/resume-service.js.map +1 -1
  16. package/dist/application/semantic-operation/protocol.js +18 -12
  17. package/dist/application/semantic-operation/protocol.js.map +1 -1
  18. package/dist/application/semantic-operation/publish.js +56 -9
  19. package/dist/application/semantic-operation/publish.js.map +1 -1
  20. package/dist/application/skills-resolver-service.js +19 -4
  21. package/dist/application/skills-resolver-service.js.map +1 -1
  22. package/dist/application/status-service.js +1 -0
  23. package/dist/application/status-service.js.map +1 -1
  24. package/dist/application/workline-index-service.js +6 -0
  25. package/dist/application/workline-index-service.js.map +1 -1
  26. package/dist/application/workspace-init-service.js +9 -1
  27. package/dist/application/workspace-init-service.js.map +1 -1
  28. package/dist/cli/commands/designs.js +110 -0
  29. package/dist/cli/commands/designs.js.map +1 -0
  30. package/dist/cli/commands/index.js +2 -0
  31. package/dist/cli/commands/index.js.map +1 -1
  32. package/dist/cli/commands/resume.js +8 -0
  33. package/dist/cli/commands/resume.js.map +1 -1
  34. package/dist/cli/commands/status.js +45 -0
  35. package/dist/cli/commands/status.js.map +1 -1
  36. package/dist/cli/help-groups.js +3 -0
  37. package/dist/cli/help-groups.js.map +1 -1
  38. package/dist/cli/parser.js +1 -0
  39. package/dist/cli/parser.js.map +1 -1
  40. package/dist/domain/design/artifact-body.js +223 -0
  41. package/dist/domain/design/artifact-body.js.map +1 -0
  42. package/dist/domain/design/artifact.js +606 -0
  43. package/dist/domain/design/artifact.js.map +1 -0
  44. package/dist/domain/design/baseline.js +359 -0
  45. package/dist/domain/design/baseline.js.map +1 -0
  46. package/dist/domain/design/capability.js +51 -0
  47. package/dist/domain/design/capability.js.map +1 -0
  48. package/dist/domain/design/closure.js +161 -0
  49. package/dist/domain/design/closure.js.map +1 -0
  50. package/dist/domain/design/governance.js +298 -0
  51. package/dist/domain/design/governance.js.map +1 -0
  52. package/dist/domain/design/identity.js +145 -0
  53. package/dist/domain/design/identity.js.map +1 -0
  54. package/dist/domain/design/manifest.js +552 -0
  55. package/dist/domain/design/manifest.js.map +1 -0
  56. package/dist/domain/design/maturity.js +234 -0
  57. package/dist/domain/design/maturity.js.map +1 -0
  58. package/dist/domain/design/naming.js +117 -0
  59. package/dist/domain/design/naming.js.map +1 -0
  60. package/dist/domain/design/projections.js +165 -0
  61. package/dist/domain/design/projections.js.map +1 -0
  62. package/dist/domain/design/reference.js +234 -0
  63. package/dist/domain/design/reference.js.map +1 -0
  64. package/dist/domain/design/retired.js +61 -0
  65. package/dist/domain/design/retired.js.map +1 -0
  66. package/dist/domain/design/revision.js +219 -0
  67. package/dist/domain/design/revision.js.map +1 -0
  68. package/dist/domain/design/secrets.js +86 -0
  69. package/dist/domain/design/secrets.js.map +1 -0
  70. package/dist/domain/design/validation.js +75 -0
  71. package/dist/domain/design/validation.js.map +1 -0
  72. package/dist/domain/design/yaml-subset.js +390 -0
  73. package/dist/domain/design/yaml-subset.js.map +1 -0
  74. package/dist/domain/safe-path.js +23 -0
  75. package/dist/domain/safe-path.js.map +1 -0
  76. package/dist/domain/skills.js +27 -3
  77. package/dist/domain/skills.js.map +1 -1
  78. package/package.json +1 -1
  79. package/skills/w/SKILL.md +10 -8
  80. package/skills/w/artifacts/README.md +3 -4
  81. package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +2 -2
  82. package/skills/w/commands/plan-exec.md +11 -5
  83. package/skills/w/commands/plan-new.md +6 -2
  84. package/skills/w/commands/plan-refine.md +6 -3
  85. package/skills/w/commands/quick.md +2 -2
  86. package/skills/w/commands/spec-new.md +2 -2
  87. package/skills/w/commands/spec-refine.md +1 -0
  88. package/skills/w/context/MANIFEST.json +19 -8
  89. package/skills/w/loops/CHASSIS.md +2 -2
  90. package/skills/w/loops/CODE-POLICIES.md +22 -7
  91. package/skills/w/loops/README.md +1 -1
  92. package/skills/w/loops/plan-exec-loop/LOOP.md +127 -61
  93. package/skills/w/loops/plan-new-loop/LOOP.md +66 -70
  94. package/skills/w/loops/plan-refine-loop/LOOP.md +15 -7
  95. package/skills/w/loops/spec-refine-loop/LOOP.md +14 -12
  96. package/skills/w/modules/DESIGN-REFERENCES.md +109 -0
  97. package/skills/w/modules/PERSIST-ROUTING.md +1 -0
  98. package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +84 -0
  99. package/skills/w/roles/README.md +7 -5
  100. package/skills/w/roles/design/ROLE.md +217 -0
  101. package/skills/w/schemas/design/design-baseline.v1.schema.json +71 -0
  102. package/skills/w/schemas/design/design-manifest.v1.schema.json +322 -0
  103. package/skills/w/schemas/design/design-review.v1.schema.json +72 -0
  104. package/skills/w/schemas/design/design-revocation.v1.schema.json +54 -0
  105. package/skills/w/schemas/design/ui-flow.v1.schema.json +211 -0
  106. package/skills/w/schemas/design/ui-screen.v1.schema.json +214 -0
  107. package/skills/w/artifacts/artifacts-design/SPEC.md +0 -42
  108. package/skills/w/modules/PLAN-DESIGN-SPECS.md +0 -12
  109. package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +0 -7
  110. package/skills/w/roles/ui-spec/ROLE.md +0 -147
@@ -0,0 +1,359 @@
1
+ import { createHash } from "node:crypto";
2
+ import { canonicalJson } from "../../application/semantic-operation/protocol.js";
3
+ import { checkSafeRelativePath } from "../safe-path.js";
4
+ import { CANONICAL_SCHEMAS } from "./capability.js";
5
+ import { ARTIFACT_PREFIX, isArtifactId, isAssetFilename, isDigest, isPackageId, isRevision, parseBaselineRef, } from "./identity.js";
6
+ import { NAMING, PROJECTIONS, checkNaming } from "./naming.js";
7
+ import { secretFailures } from "./secrets.js";
8
+ import { Reader, eachRecord, isRecord, } from "./validation.js";
9
+ /**
10
+ * `baselines/DES-NNN-rNNN.json` — the immutable authority of one published
11
+ * revision of a package.
12
+ *
13
+ * A baseline answers one question: *which exact bytes were published together*.
14
+ * It enumerates a CLOSED selection of normative files with their revision and
15
+ * the SHA-256 of their bytes, and seals that with a digest of its own.
16
+ *
17
+ * Two exclusions make the seal mean something:
18
+ *
19
+ * - the digest is computed over canonical JSON **without its own `digest`
20
+ * field**, so there is no self-reference to chase; and
21
+ * - the selection excludes the mutable manifest, the governance records and the
22
+ * regenerable projections, so re-indexing the catalog or re-rendering
23
+ * `PACKAGE.md` can never alter a revision published months ago.
24
+ *
25
+ * Without the second one, every published digest would drift every time
26
+ * somebody added a package relation — which is exactly the retroactive change
27
+ * the contract exists to forbid.
28
+ */
29
+ export const DESIGN_BASELINE_SCHEMA_ID = CANONICAL_SCHEMAS.baseline;
30
+ export const ALLOWED_KEYS = {
31
+ "": ["schema", "package", "revision", "parent_baseline", "published", "digest", "selection"],
32
+ "selection[]": ["path", "revision", "sha256"],
33
+ };
34
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
35
+ /** A date that EXISTS: `2026-13-45` has the shape and is not a day. */
36
+ export function isCalendarDate(value) {
37
+ if (!ISO_DATE_RE.test(value))
38
+ return false;
39
+ const date = new Date(`${value}T00:00:00Z`);
40
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
41
+ }
42
+ /** Directories whose files a baseline may select. Everything else is excluded. */
43
+ const SELECTABLE_DIRS = [...Object.values(NAMING).map((r) => r.dir), "assets"];
44
+ /**
45
+ * The digest a baseline must carry. Excluding `digest` from its own input is
46
+ * what makes it verifiable: anyone can recompute it from the file and compare.
47
+ */
48
+ export function computeBaselineDigest(baseline) {
49
+ const { schema, package: pkg, revision, parent_baseline, published, selection } = baseline;
50
+ const sealed = {
51
+ schema,
52
+ package: pkg,
53
+ revision,
54
+ parent_baseline,
55
+ published,
56
+ // Sorted by path: a selection is a SET, so reordering the array is a
57
+ // no-change. Digesting it as written would let a reformat reseal a revision
58
+ // published months ago.
59
+ selection: [...selection].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),
60
+ };
61
+ return `sha256:${createHash("sha256").update(canonicalJson(sealed), "utf8").digest("hex")}`;
62
+ }
63
+ export function validateDesignBaseline(raw, artifact) {
64
+ const r = new Reader(ALLOWED_KEYS);
65
+ if (!isRecord(raw)) {
66
+ r.fail("DESIGN_BASELINE_NOT_OBJECT", artifact, "el baseline no es un objeto JSON", `reescribí '${artifact}' como un único objeto JSON conforme a ${DESIGN_BASELINE_SCHEMA_ID}`);
67
+ return done(r, null);
68
+ }
69
+ const schema = r.read(raw, "schema");
70
+ if (schema !== DESIGN_BASELINE_SCHEMA_ID) {
71
+ r.fail("DESIGN_SCHEMA_UNKNOWN", artifact, `versión de formato no soportada: ${JSON.stringify(schema)}`, `este Workline entiende ${DESIGN_BASELINE_SCHEMA_ID}`);
72
+ return done(r, null);
73
+ }
74
+ r.closed(raw, "", artifact);
75
+ const pkg = r.read(raw, "package");
76
+ if (!isPackageId(pkg)) {
77
+ r.invalid(artifact, `'package' no es un identificador DES-NNN: ${JSON.stringify(pkg)}`, "nombrá el package que este baseline sella");
78
+ }
79
+ const revision = r.read(raw, "revision");
80
+ if (!isRevision(revision)) {
81
+ r.invalid(artifact, "'revision' debe ser un entero >= 1", "las revisiones son lógicas y empiezan en 1");
82
+ }
83
+ const parent = r.read(raw, "parent_baseline");
84
+ checkParent(r, artifact, parent, pkg, revision);
85
+ const published = r.read(raw, "published");
86
+ if (typeof published !== "string" || !isCalendarDate(published)) {
87
+ r.invalid(artifact, `'published' no es una fecha YYYY-MM-DD: ${JSON.stringify(published)}`, "escribí la fecha de publicación como YYYY-MM-DD");
88
+ }
89
+ const selection = readSelection(r, raw, artifact);
90
+ if (selection.length === 0 && r.failures.length === 0) {
91
+ r.invalid(artifact, "'selection' está vacía y una revisión publica algo", "enumerá los archivos normativos que esta revisión sella");
92
+ }
93
+ const digest = r.read(raw, "digest");
94
+ if (!isDigest(digest)) {
95
+ r.invalid(artifact, "'digest' debe ser 'sha256:' + 64 hex", "recalculá el digest del baseline");
96
+ }
97
+ for (const failure of secretFailures(raw, artifact))
98
+ r.failures.push(failure);
99
+ if (r.failures.length > 0)
100
+ return done(r, null);
101
+ const value = {
102
+ schema: DESIGN_BASELINE_SCHEMA_ID,
103
+ package: pkg,
104
+ revision: revision,
105
+ parent_baseline: typeof parent === "string" ? parent : null,
106
+ published: published,
107
+ digest: digest,
108
+ selection,
109
+ };
110
+ // The seal is only a seal if it matches. Checked last so a malformed baseline
111
+ // is reported for what it is, not for a digest that could never have matched.
112
+ const expected = computeBaselineDigest(value);
113
+ if (value.digest !== expected) {
114
+ r.fail("DESIGN_DIGEST_MISMATCH", artifact, `el digest declarado no es el de este contenido (declara ${value.digest}, calcula ${expected})`, "recalculá el digest sobre el JSON canónico sin el campo 'digest', o restaurá el contenido sellado");
115
+ return done(r, null);
116
+ }
117
+ return done(r, value);
118
+ }
119
+ function checkParent(r, artifact, parent, pkg, revision) {
120
+ if (parent === null) {
121
+ if (isRevision(revision) && revision !== 1) {
122
+ r.fail("DESIGN_RELATION_BROKEN", artifact, `r${revision} declara 'parent_baseline: null' y solo la primera revisión no tiene padre`, "encadenala con la revisión anterior del mismo package");
123
+ }
124
+ return;
125
+ }
126
+ const ref = parseBaselineRef(parent);
127
+ if (ref === null) {
128
+ r.invalid(artifact, `'parent_baseline' debe ser null o DES-NNN@rN: ${JSON.stringify(parent)}`, "encadená el baseline con su padre");
129
+ return;
130
+ }
131
+ if (isPackageId(pkg) && ref.package !== pkg) {
132
+ r.fail("DESIGN_RELATION_BROKEN", artifact, `'parent_baseline' apunta a ${ref.package} y este baseline es de ${pkg}`, "una línea de baselines pertenece a un solo package; una divergencia crea OTRO package con 'derived_from'");
133
+ return;
134
+ }
135
+ if (isRevision(revision) && ref.revision !== revision - 1) {
136
+ r.fail("DESIGN_RELATION_BROKEN", artifact, `r${revision} declara como padre a r${ref.revision} y su padre es r${revision - 1}`, "la línea es continua: no se saltean revisiones ni se bifurca");
137
+ }
138
+ }
139
+ /**
140
+ * The closed selection. Two things are checked beyond shape: that every entry
141
+ * is a file a baseline is ALLOWED to seal, and that the revision it declares is
142
+ * the one its own name carries.
143
+ */
144
+ function readSelection(r, raw, artifact) {
145
+ const out = [];
146
+ const seen = new Set();
147
+ for (const entry of eachRecord(r, raw, "selection", artifact, " de archivos normativos")) {
148
+ const path = r.read(entry, "selection[].path");
149
+ const revision = r.read(entry, "selection[].revision");
150
+ const sha256 = r.read(entry, "selection[].sha256");
151
+ if (typeof path !== "string" || path.length === 0) {
152
+ r.invalid(artifact, "cada entrada de 'selection' necesita 'path'", "escribí el path relativo al package");
153
+ continue;
154
+ }
155
+ const normalized = checkSelectable(r, artifact, path);
156
+ if (normalized === null)
157
+ continue;
158
+ // Deduplicated on the NORMALIZED path, and Unicode-normalized with it: a
159
+ // trailing space and an NFD spelling are the same file on disk, and sealing
160
+ // it twice with two different SHA-256 leaves nobody able to say which is right.
161
+ if (seen.has(normalized)) {
162
+ r.fail("DESIGN_ID_DUPLICATE", artifact, `'${normalized}' está seleccionado dos veces`, "una selección cerrada nombra cada archivo una vez");
163
+ continue;
164
+ }
165
+ seen.add(normalized);
166
+ if (!isDigest(sha256)) {
167
+ r.invalid(artifact, `selection['${normalized}']: 'sha256' debe ser 'sha256:' + 64 hex`, "hasheá los bytes del archivo");
168
+ continue;
169
+ }
170
+ if (!checkDeclaredRevision(r, artifact, normalized, revision))
171
+ continue;
172
+ out.push({
173
+ path: normalized,
174
+ revision: typeof revision === "number" ? revision : null,
175
+ sha256,
176
+ });
177
+ }
178
+ return out;
179
+ }
180
+ /** Only normative files. The mutable index and the projections are excluded BY CONSTRUCTION. */
181
+ function checkSelectable(r, artifact, path) {
182
+ // FIRST, before any prefix reasoning: `flows/../governance/reviews/REV-001.json`
183
+ // starts with `flows/` and would sail past every exclusion below. A traversal
184
+ // does not just escape the package — it defeats the whole "by construction".
185
+ const safe = checkSafeRelativePath(path);
186
+ if (!safe.ok) {
187
+ r.fail("DESIGN_PATH_UNSAFE", artifact, `selection: '${path}' ${safe.why}`, "los paths de una selección son relativos al package y nunca salen de él");
188
+ return null;
189
+ }
190
+ const normalized = safe.path.normalize("NFC");
191
+ if (PROJECTIONS.includes(normalized)) {
192
+ r.fail("DESIGN_SELECTION_FORBIDDEN", artifact, `'${normalized}' es una proyección regenerable y no puede sellarse`, "quitala de la selección: regenerarla cambiaría el digest de una revisión ya publicada");
193
+ return null;
194
+ }
195
+ if (normalized === "design-manifest.json" || normalized.startsWith("governance/")) {
196
+ r.fail("DESIGN_SELECTION_FORBIDDEN", artifact, `'${normalized}' es un índice mutable o un record de gobierno y no puede sellarse`, "quitalo de la selección: el catálogo y el gobierno cambian sin mintear una revisión");
197
+ return null;
198
+ }
199
+ if (!SELECTABLE_DIRS.some((dir) => normalized.startsWith(`${dir}/`))) {
200
+ r.fail("DESIGN_SELECTION_FORBIDDEN", artifact, `'${normalized}' no está en ninguna carpeta de artefactos normativos`, `una selección solo sella archivos bajo: ${SELECTABLE_DIRS.join(", ")}`);
201
+ return null;
202
+ }
203
+ return normalized;
204
+ }
205
+ /** An asset carries no revision; everything else carries it in its own name. */
206
+ function checkDeclaredRevision(r, artifact, path, revision) {
207
+ if (path.startsWith("assets/")) {
208
+ if (revision !== null) {
209
+ r.invalid(artifact, `selection['${path}']: un asset es content-addressed y no lleva revisión`, "poné 'revision': null");
210
+ return false;
211
+ }
212
+ // Content-addressed means the digest IS the name. Without this the selection
213
+ // could seal `assets/logo.svg` with any sha256 at all.
214
+ if (!isAssetFilename(path.slice("assets/".length))) {
215
+ r.invalid(artifact, `selection['${path}']: un asset se nombra <sha256>-<nombre>.<ext>`, "renombrá el archivo con su propio digest adelante");
216
+ return false;
217
+ }
218
+ return true;
219
+ }
220
+ if (!isRevision(revision)) {
221
+ r.invalid(artifact, `selection['${path}']: 'revision' debe ser un entero >= 1`, "declará la revisión que el archivo sella");
222
+ return false;
223
+ }
224
+ // The SAME naming rule the manifest applies, not a looser `includes`: an
225
+ // `includes("-r001-")` accepts `flows/FLW-001-r002-nota-r001-vieja.md` as r1,
226
+ // and a flow filed under `screens/`. One rule, one place.
227
+ const kind = kindOfDirectory(path);
228
+ if (kind === null)
229
+ return true; // ya reportado por checkSelectable
230
+ const id = path
231
+ .slice(NAMING[kind].dir.length + 1)
232
+ .split("-")
233
+ .slice(0, 2)
234
+ .join("-");
235
+ // The id comes FROM the path, so checking the name against it would be
236
+ // circular. What is not circular — and what actually catches a flow filed
237
+ // under `screens/` — is that the prefix has to match the directory's kind.
238
+ if (!isArtifactId(id, kind)) {
239
+ r.invalid(artifact, `selection['${path}']: un ${kind} vive en '${NAMING[kind].dir}/' y su id empieza con ${ARTIFACT_PREFIX[kind]}-`, "movelo a la carpeta de su tipo, o corregí el id");
240
+ return false;
241
+ }
242
+ const check = checkNaming(kind, path, id, revision);
243
+ if (check.ok)
244
+ return true;
245
+ r.fail("DESIGN_RELATION_BROKEN", artifact, `selection: ${check.why}`, `usá '${check.expected}'`);
246
+ return false;
247
+ }
248
+ /** Which artifact kind lives in the directory a selected path sits in. */
249
+ function kindOfDirectory(path) {
250
+ const kinds = Object.entries(NAMING);
251
+ // Longest directory first, so `design-system/rules` wins over any prefix of it.
252
+ const match = kinds
253
+ .sort(([, a], [, b]) => b.dir.length - a.dir.length)
254
+ .find(([, rule]) => path.startsWith(`${rule.dir}/`));
255
+ return match === undefined ? null : match[0];
256
+ }
257
+ function done(r, value) {
258
+ return { ok: value !== null, value, failures: r.failures, touched: r.touched };
259
+ }
260
+ /**
261
+ * The authority table, applied. Manifest and baseline describe overlapping
262
+ * facts; where they disagree the NORMATIVE owner wins and the disagreement is
263
+ * an error — never a silent reconciliation.
264
+ */
265
+ export function checkBaselineAuthority(manifest, baseline, artifact) {
266
+ const failures = [];
267
+ const broken = (message, action) => {
268
+ failures.push({ code: "DESIGN_AUTHORITY_CONFLICT", artifact, message, action });
269
+ };
270
+ if (baseline.package !== manifest.id) {
271
+ broken(`el baseline dice ser de ${baseline.package} y el manifest declara ${manifest.id}`, "un baseline vive dentro del package que sella");
272
+ return failures;
273
+ }
274
+ const indexed = manifest.baselines.find((b) => b.revision === baseline.revision);
275
+ if (indexed === undefined) {
276
+ broken(`el manifest no cataloga r${baseline.revision}`, "agregá la revisión a 'baselines' del manifest, o borrá el baseline huérfano");
277
+ }
278
+ else {
279
+ compareIndexEntry(broken, baseline, indexed);
280
+ }
281
+ compareSelectionAgainstCatalog(broken, manifest, baseline);
282
+ return failures;
283
+ }
284
+ /** The baseline is the authority; the manifest merely indexes it. */
285
+ function compareIndexEntry(broken, baseline, indexed) {
286
+ const fields = [
287
+ ["digest", indexed.digest, baseline.digest],
288
+ ["parent_baseline", indexed.parent_baseline, baseline.parent_baseline],
289
+ ["published", indexed.published, baseline.published],
290
+ ];
291
+ for (const [field, indexedValue, sealedValue] of fields) {
292
+ if (indexedValue === sealedValue)
293
+ continue;
294
+ broken(`el manifest declara ${field}=${indexedValue ?? "null"} para r${baseline.revision} y el baseline sella ${sealedValue ?? "null"}`, `el baseline es la autoridad: copiá su '${field}' al manifest`);
295
+ }
296
+ // No se compara `indexed.path`: `validateDesignManifest` ya exige el nombre
297
+ // canónico de cada baseline, así que un manifest con otro path no llega hasta
298
+ // acá. Duplicarlo sería una rama que ningún manifest válido puede alcanzar.
299
+ }
300
+ /**
301
+ * Everything a baseline seals, the package must know about — otherwise the
302
+ * revision publishes bytes its own catalog cannot name.
303
+ */
304
+ function compareSelectionAgainstCatalog(broken, manifest, baseline) {
305
+ const catalogued = new Set();
306
+ for (const list of Object.values(manifest.catalog)) {
307
+ for (const entry of list)
308
+ catalogued.add(entry.path);
309
+ }
310
+ for (const entry of baseline.selection) {
311
+ if (catalogued.has(entry.path))
312
+ continue;
313
+ broken(`el baseline sella '${entry.path}' y el catálogo del manifest no lo contiene`, "catalogá ese archivo en el manifest, o quitalo de la selección");
314
+ }
315
+ }
316
+ /**
317
+ * Compare-and-swap. Publishing a revision states which baseline it believed was
318
+ * current; if the line moved since, the publication is refused rather than
319
+ * leaving two revisions claiming the same succession.
320
+ */
321
+ export function checkPublicationBase(manifest, candidate, artifact) {
322
+ if (candidate.package !== manifest.id) {
323
+ return {
324
+ code: "DESIGN_AUTHORITY_CONFLICT",
325
+ artifact,
326
+ message: `la publicación trae un baseline de ${candidate.package} y el package es ${manifest.id}`,
327
+ action: "un baseline se publica dentro del package que sella",
328
+ };
329
+ }
330
+ if (manifest.baselines.some((b) => b.revision === candidate.revision)) {
331
+ return {
332
+ code: "DESIGN_BASE_STALE",
333
+ artifact,
334
+ message: `r${candidate.revision} ya está publicada`,
335
+ action: "una revisión publicada no se republica: numerá la siguiente",
336
+ };
337
+ }
338
+ const current = manifest.current_baseline;
339
+ const expected = current === null ? null : `${manifest.id}@r${current.revision}`;
340
+ if (candidate.parent_baseline !== expected) {
341
+ return {
342
+ code: "DESIGN_BASE_STALE",
343
+ artifact,
344
+ message: `la publicación parte de ${candidate.parent_baseline ?? "ninguna revisión"} y la vigente es ${expected ?? "ninguna"}`,
345
+ action: "alguien publicó mientras preparabas esta: releé el package y rehacé la revisión sobre la base nueva",
346
+ };
347
+ }
348
+ const next = current === null ? 1 : current.revision + 1;
349
+ if (candidate.revision !== next) {
350
+ return {
351
+ code: "DESIGN_BASE_STALE",
352
+ artifact,
353
+ message: `la publicación numera r${candidate.revision} y la siguiente de la línea es r${next}`,
354
+ action: "la línea es continua: numerá la revisión que sigue a la vigente",
355
+ };
356
+ }
357
+ return null;
358
+ }
359
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../../src/domain/design/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * What the `design` capability IS, said once.
3
+ *
4
+ * The public identity is `design` and nothing else. `ui-design` — the role this
5
+ * replaces — and `ui-spec` — the skill that used to fill it — are not aliases,
6
+ * not alternative implementations and not accepted names (S013/AC-CAP-01). A
7
+ * second name for one capability is a second contract wearing a disguise: the
8
+ * day they disagree, there is no way to say which one the package obeys.
9
+ *
10
+ * Typed as `SkillRole` on purpose: if `design` ever left the role catalog this
11
+ * stops compiling, so the identity cannot rot into a string that means nothing.
12
+ */
13
+ export const DESIGN_CAPABILITY = "design";
14
+ /**
15
+ * The five semantic operations, all over the SAME package (S013/AC-CAP-02).
16
+ *
17
+ * - `create` — the first revision of a package.
18
+ * - `update` — the next revision of one that exists.
19
+ * - `validate` — judge without writing: schemas, naming, references, maturity.
20
+ * - `render` — regenerate the projections; never normative, never sealed.
21
+ * - `record` — seal a governance decision about a revision that exists.
22
+ *
23
+ * `create` and `update` are one route with a different compare-and-swap base,
24
+ * not two formats. `render` and `record` write files a baseline never selects.
25
+ * None of them may invent a layout or a schema of its own — that is the whole
26
+ * content of «no parallel format».
27
+ */
28
+ export const DESIGN_OPERATIONS = ["create", "update", "validate", "render", "record"];
29
+ /**
30
+ * Every format this capability produces, and the only ones it accepts.
31
+ *
32
+ * The validators read their id from here rather than repeating a literal, so
33
+ * the registry is load-bearing instead of documentation: a seventh format
34
+ * cannot appear in code without appearing here, and `design-schema-guard`
35
+ * proves this table and the published JSON Schemas under
36
+ * `skills/w/schemas/design/` name the same six things.
37
+ *
38
+ * This is the canonical authority (S013/AC-CAP-03). The built-in floor and any
39
+ * third-party improvement bound to the role write these and are validated by
40
+ * the same code; a contributor extends the domain by adding fields to a schema,
41
+ * never by declaring a format of their own.
42
+ */
43
+ export const CANONICAL_SCHEMAS = {
44
+ manifest: "workline.design-manifest/v1",
45
+ baseline: "workline.design-baseline/v1",
46
+ flow: "workline.ui-flow/v1",
47
+ screen: "workline.ui-screen/v1",
48
+ review: "workline.design-review/v1",
49
+ revocation: "workline.design-revocation/v1",
50
+ };
51
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/domain/design/capability.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAc,QAAQ,CAAC;AAErD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAI/F;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,6BAA6B;IACvC,QAAQ,EAAE,6BAA6B;IACvC,IAAI,EAAE,qBAAqB;IAC3B,MAAM,EAAE,uBAAuB;IAC/B,MAAM,EAAE,2BAA2B;IACnC,UAAU,EAAE,+BAA+B;CACnC,CAAC"}
@@ -0,0 +1,161 @@
1
+ import { parseArtifactRef } from "./identity.js";
2
+ const KIND_OF_PREFIX = {
3
+ FLW: "flow",
4
+ SCR: "screen",
5
+ RUL: "rule",
6
+ TOK: "token",
7
+ VIS: "rendition",
8
+ };
9
+ export function computeClosure(manifest, roots, read) {
10
+ const members = new Map();
11
+ const assets = new Set();
12
+ const failures = [];
13
+ const queue = roots.map((ref) => ({
14
+ ref,
15
+ via: null,
16
+ }));
17
+ while (queue.length > 0) {
18
+ const next = queue.shift();
19
+ if (next === undefined)
20
+ break;
21
+ const reached = visit(manifest, next, members, read);
22
+ if ("failure" in reached) {
23
+ failures.push(reached.failure);
24
+ continue;
25
+ }
26
+ for (const ref of reached.refs)
27
+ queue.push({ ref, via: reached.via });
28
+ for (const digest of reached.assets) {
29
+ // Un asset se alcanza solo si el package lo CUSTODIA: afirmar haber
30
+ // llegado a bytes que no están es la clausura mintiendo sobre su alcance.
31
+ if (manifest.catalog.assets.some((a) => a.digest === digest))
32
+ assets.add(digest);
33
+ else
34
+ failures.push(uncustodied(digest, manifest.id));
35
+ }
36
+ }
37
+ return { members: [...members.values()], assets: [...assets], failures };
38
+ }
39
+ /**
40
+ * Reaching the same revision twice can only WIDEN what is required.
41
+ *
42
+ * `states: []` means the whole revision, not "no states": a root written
43
+ * without an anchor asked for all of it. So an anchor never narrows a member
44
+ * that was already whole, and a whole reference swallows the anchors collected
45
+ * so far — otherwise adding a MORE specific root would shrink the closure.
46
+ */
47
+ function widen(member, anchor) {
48
+ if (member.states.length === 0)
49
+ return;
50
+ if (anchor === null) {
51
+ member.states.length = 0;
52
+ return;
53
+ }
54
+ if (!member.states.includes(anchor))
55
+ member.states.push(anchor);
56
+ }
57
+ /** One step of the walk: admit the reference, or say why it does not resolve. */
58
+ function visit(manifest, next, members, read) {
59
+ const nothing = { refs: [], assets: [], via: null };
60
+ const parsed = parseArtifactRef(next.ref);
61
+ if (parsed === null || parsed.package !== manifest.id) {
62
+ return { failure: foreignRoot(next.ref, manifest.id) };
63
+ }
64
+ const key = `${parsed.package}/${parsed.artifact}@r${parsed.revision}`;
65
+ const anchor = parsed.state ?? null;
66
+ const already = members.get(key);
67
+ if (already !== undefined) {
68
+ widen(already, anchor);
69
+ return nothing;
70
+ }
71
+ const entry = findEntry(manifest, parsed.artifact, parsed.revision);
72
+ const kind = KIND_OF_PREFIX[parsed.artifact.slice(0, 3)];
73
+ if (entry === null || kind === undefined) {
74
+ return { failure: unresolvable(next.ref, manifest.id) };
75
+ }
76
+ members.set(key, { ref: key, kind, states: anchor === null ? [] : [anchor], via: next.via });
77
+ if (kind !== "flow" && kind !== "screen")
78
+ return nothing;
79
+ const document = read(entry.path);
80
+ if (document === null)
81
+ return { failure: unreadable(entry.path, key) };
82
+ return { refs: reachableFrom(document), assets: assetsOf(document), via: key };
83
+ }
84
+ /**
85
+ * Everything a document DEPENDS ON, in the closure's terms.
86
+ *
87
+ * `flow_refs` is deliberately absent. It records which flows visit a screen —
88
+ * the INVERSE of `flow.nodes`, the screen's membership, not its needs. Walking
89
+ * both directions turns the closure into the connected component of the graph:
90
+ * one screen would drag in every flow that mentions it and every screen those
91
+ * flows touch, and a task would be blocked by designs it never consumes.
92
+ */
93
+ function reachableFrom(document) {
94
+ if (document.kind === "flow") {
95
+ return [document.entry, ...document.nodes, ...document.dependencies];
96
+ }
97
+ return [...document.dependencies.rules, ...document.dependencies.tokens];
98
+ }
99
+ function assetsOf(document) {
100
+ return document.kind === "flow" ? [] : document.dependencies.assets;
101
+ }
102
+ function findEntry(manifest, id, revision) {
103
+ for (const key of ["flows", "screens", "rules", "tokens", "renditions"]) {
104
+ const hit = manifest.catalog[key].find((e) => e.id === id && e.revision === revision);
105
+ if (hit !== undefined)
106
+ return hit;
107
+ }
108
+ return null;
109
+ }
110
+ function foreignRoot(ref, packageId) {
111
+ return {
112
+ code: "DESIGN_REFERENCE_MISSING",
113
+ artifact: ref,
114
+ message: `'${ref}' no es una referencia resoluble dentro de ${packageId}`,
115
+ action: "una clausura se calcula dentro de un package: usá DES-NNN/XXX-NNN@rN",
116
+ };
117
+ }
118
+ function unresolvable(ref, packageId) {
119
+ return {
120
+ code: "DESIGN_REFERENCE_MISSING",
121
+ artifact: ref,
122
+ message: `${packageId} no cataloga '${ref}'`,
123
+ action: "revisá la revisión exacta: la clausura no adivina la vigente",
124
+ };
125
+ }
126
+ function uncustodied(digest, packageId) {
127
+ return {
128
+ code: "DESIGN_REFERENCE_MISSING",
129
+ artifact: digest,
130
+ message: `${packageId} no custodia el asset ${digest}`,
131
+ action: "publicá el asset dentro del package: una clausura no alcanza bytes que no están",
132
+ };
133
+ }
134
+ function unreadable(path, ref) {
135
+ return {
136
+ code: "DESIGN_REFERENCE_FILE_MISSING",
137
+ artifact: path,
138
+ message: `'${path}' no se pudo leer para expandir ${ref}`,
139
+ action: "el catálogo promete ese archivo: restauralo o corregí su ruta",
140
+ };
141
+ }
142
+ /**
143
+ * The maturity a set of roots demands.
144
+ *
145
+ * Consuming an `outline` revision is not an error in itself — a task may
146
+ * legitimately reference a design that is still being shaped. What fails closed
147
+ * is IMPLEMENTING against it, which is the question this answers: which members
148
+ * of the closure are not yet `handoff`.
149
+ */
150
+ export function notReadyForHandoff(manifest, closure) {
151
+ return closure.members.filter((member) => {
152
+ if (member.kind !== "flow" && member.kind !== "screen")
153
+ return false;
154
+ const key = member.kind === "flow" ? "flows" : "screens";
155
+ const id = member.ref.split("/")[1]?.split("@")[0];
156
+ const revision = Number(member.ref.split("@r")[1]);
157
+ const entry = manifest.catalog[key].find((e) => e.id === id && e.revision === revision);
158
+ return entry?.maturity !== "handoff";
159
+ });
160
+ }
161
+ //# sourceMappingURL=closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closure.js","sourceRoot":"","sources":["../../../src/domain/design/closure.ts"],"names":[],"mappings":"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"}