@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.
- package/README.md +1 -1
- package/dist/adapters/node-file-system.js +3 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/design/design-gate-service.js +246 -0
- package/dist/application/design/design-gate-service.js.map +1 -0
- package/dist/application/design/design-graph-service.js +85 -0
- package/dist/application/design/design-graph-service.js.map +1 -0
- package/dist/application/design/design-index-service.js +132 -0
- package/dist/application/design/design-index-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +488 -0
- package/dist/application/design/design-publish-service.js.map +1 -0
- package/dist/application/design/design-resolver-service.js +165 -0
- package/dist/application/design/design-resolver-service.js.map +1 -0
- package/dist/application/resume-service.js +23 -4
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +18 -12
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/semantic-operation/publish.js +56 -9
- package/dist/application/semantic-operation/publish.js.map +1 -1
- package/dist/application/skills-resolver-service.js +19 -4
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +1 -0
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +6 -0
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +9 -1
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/designs.js +110 -0
- package/dist/cli/commands/designs.js.map +1 -0
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/resume.js +8 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/status.js +45 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +3 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +1 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/domain/design/artifact-body.js +223 -0
- package/dist/domain/design/artifact-body.js.map +1 -0
- package/dist/domain/design/artifact.js +606 -0
- package/dist/domain/design/artifact.js.map +1 -0
- package/dist/domain/design/baseline.js +359 -0
- package/dist/domain/design/baseline.js.map +1 -0
- package/dist/domain/design/capability.js +51 -0
- package/dist/domain/design/capability.js.map +1 -0
- package/dist/domain/design/closure.js +161 -0
- package/dist/domain/design/closure.js.map +1 -0
- package/dist/domain/design/governance.js +298 -0
- package/dist/domain/design/governance.js.map +1 -0
- package/dist/domain/design/identity.js +145 -0
- package/dist/domain/design/identity.js.map +1 -0
- package/dist/domain/design/manifest.js +552 -0
- package/dist/domain/design/manifest.js.map +1 -0
- package/dist/domain/design/maturity.js +234 -0
- package/dist/domain/design/maturity.js.map +1 -0
- package/dist/domain/design/naming.js +117 -0
- package/dist/domain/design/naming.js.map +1 -0
- package/dist/domain/design/projections.js +165 -0
- package/dist/domain/design/projections.js.map +1 -0
- package/dist/domain/design/reference.js +234 -0
- package/dist/domain/design/reference.js.map +1 -0
- package/dist/domain/design/retired.js +61 -0
- package/dist/domain/design/retired.js.map +1 -0
- package/dist/domain/design/revision.js +219 -0
- package/dist/domain/design/revision.js.map +1 -0
- package/dist/domain/design/secrets.js +86 -0
- package/dist/domain/design/secrets.js.map +1 -0
- package/dist/domain/design/validation.js +75 -0
- package/dist/domain/design/validation.js.map +1 -0
- package/dist/domain/design/yaml-subset.js +390 -0
- package/dist/domain/design/yaml-subset.js.map +1 -0
- package/dist/domain/safe-path.js +23 -0
- package/dist/domain/safe-path.js.map +1 -0
- package/dist/domain/skills.js +27 -3
- package/dist/domain/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +10 -8
- package/skills/w/artifacts/README.md +3 -4
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +2 -2
- package/skills/w/commands/plan-exec.md +11 -5
- package/skills/w/commands/plan-new.md +6 -2
- package/skills/w/commands/plan-refine.md +6 -3
- package/skills/w/commands/quick.md +2 -2
- package/skills/w/commands/spec-new.md +2 -2
- package/skills/w/commands/spec-refine.md +1 -0
- package/skills/w/context/MANIFEST.json +19 -8
- package/skills/w/loops/CHASSIS.md +2 -2
- package/skills/w/loops/CODE-POLICIES.md +22 -7
- package/skills/w/loops/README.md +1 -1
- package/skills/w/loops/plan-exec-loop/LOOP.md +127 -61
- package/skills/w/loops/plan-new-loop/LOOP.md +66 -70
- package/skills/w/loops/plan-refine-loop/LOOP.md +15 -7
- package/skills/w/loops/spec-refine-loop/LOOP.md +14 -12
- package/skills/w/modules/DESIGN-REFERENCES.md +109 -0
- package/skills/w/modules/PERSIST-ROUTING.md +1 -0
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +84 -0
- package/skills/w/roles/README.md +7 -5
- package/skills/w/roles/design/ROLE.md +217 -0
- package/skills/w/schemas/design/design-baseline.v1.schema.json +71 -0
- package/skills/w/schemas/design/design-manifest.v1.schema.json +322 -0
- package/skills/w/schemas/design/design-review.v1.schema.json +72 -0
- package/skills/w/schemas/design/design-revocation.v1.schema.json +54 -0
- package/skills/w/schemas/design/ui-flow.v1.schema.json +211 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +214 -0
- package/skills/w/artifacts/artifacts-design/SPEC.md +0 -42
- package/skills/w/modules/PLAN-DESIGN-SPECS.md +0 -12
- package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +0 -7
- package/skills/w/roles/ui-spec/ROLE.md +0 -147
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { validateDesignArtifact } from "../../domain/design/artifact.js";
|
|
4
|
+
import { DESIGN_BASELINE_SCHEMA_ID, checkBaselineAuthority, computeBaselineDigest, validateDesignBaseline, } from "../../domain/design/baseline.js";
|
|
5
|
+
import { ARTIFACT_PREFIX, parseArtifactId } from "../../domain/design/identity.js";
|
|
6
|
+
import { validateDesignManifest } from "../../domain/design/manifest.js";
|
|
7
|
+
import { gateDesignDocument } from "../../domain/design/maturity.js";
|
|
8
|
+
import { NAMING, baselinePath, checkNaming } from "../../domain/design/naming.js";
|
|
9
|
+
import { currentRevisions, renderDesignMd, renderPackageMd, } from "../../domain/design/projections.js";
|
|
10
|
+
import { KIND_LIST } from "../../domain/design/revision.js";
|
|
11
|
+
import { checkSafeRelativePath } from "../../domain/safe-path.js";
|
|
12
|
+
import { publishArtifacts } from "../semantic-operation/publish.js";
|
|
13
|
+
import { readDesignIndex } from "./design-index-service.js";
|
|
14
|
+
export async function publishDesignRevision(fs, workspace, input) {
|
|
15
|
+
const unsafe = [...input.files, ...(input.documents ?? [])].flatMap((f) => pathFailure(f.path));
|
|
16
|
+
if (unsafe.length > 0)
|
|
17
|
+
return { ok: false, failures: unsafe };
|
|
18
|
+
const index = await readDesignIndex(fs, workspace);
|
|
19
|
+
const located = locate(index, input.packageId);
|
|
20
|
+
if ("failures" in located)
|
|
21
|
+
return { ok: false, failures: located.failures };
|
|
22
|
+
const { manifest, packagePath } = located;
|
|
23
|
+
const current = manifest.current_baseline;
|
|
24
|
+
const actual = current === null ? null : `${manifest.id}@r${current.revision}`;
|
|
25
|
+
if (input.expectedBase !== actual) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
failures: [
|
|
29
|
+
{
|
|
30
|
+
code: "DESIGN_BASE_STALE",
|
|
31
|
+
artifact: `${packagePath}/design-manifest.json`,
|
|
32
|
+
message: `preparaste sobre ${input.expectedBase ?? "ninguna revisión"} y la vigente es ${actual ?? "ninguna"}`,
|
|
33
|
+
action: "alguien publicó mientras preparabas esta: releé el package y rehacé la revisión sobre la base nueva",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const catalog = mergeCatalog(manifest, input.files);
|
|
39
|
+
if ("failures" in catalog)
|
|
40
|
+
return { ok: false, failures: catalog.failures };
|
|
41
|
+
const revision = (manifest.current_baseline?.revision ?? 0) + 1;
|
|
42
|
+
const selection = await buildSelection(fs, workspace, packagePath, catalog.value, input.files);
|
|
43
|
+
if ("failures" in selection)
|
|
44
|
+
return { ok: false, failures: selection.failures };
|
|
45
|
+
const baseline = sealBaseline(manifest, revision, input.published, selection.value);
|
|
46
|
+
const nextManifest = nextManifestOf(manifest, catalog.value, baseline);
|
|
47
|
+
const failures = validateCandidate(nextManifest, baseline, packagePath);
|
|
48
|
+
if (failures.length > 0)
|
|
49
|
+
return { ok: false, failures };
|
|
50
|
+
const artifacts = candidateArtifacts(packagePath, nextManifest, baseline, input.files);
|
|
51
|
+
// The documents go LAST, after the manifest switched the package to the new
|
|
52
|
+
// revision: a reference is only ever visible pointing at a baseline that is
|
|
53
|
+
// already there. `publishArtifacts` rolls the whole batch back either way.
|
|
54
|
+
const published = await publishArtifacts(fs, workspace, [
|
|
55
|
+
...artifacts,
|
|
56
|
+
...(input.documents ?? []).map((d) => ({ ...d, overwrite: true })),
|
|
57
|
+
]);
|
|
58
|
+
if (!published.ok)
|
|
59
|
+
return { ok: false, failures: [publishFailure(published.failure, packagePath)] };
|
|
60
|
+
return { ok: true, value: { revision, baseline, written: published.value.written } };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every published path, checked at the ENTRANCE.
|
|
64
|
+
*
|
|
65
|
+
* Not inside the per-kind branches: an asset whose digest was already
|
|
66
|
+
* catalogued used to skip the catalog — and with it the only path check there
|
|
67
|
+
* was — while still being written, and `join(root, path)` normalizes `..`.
|
|
68
|
+
* A file escaped the workspace through the one branch that had no guard.
|
|
69
|
+
*/
|
|
70
|
+
function pathFailure(path) {
|
|
71
|
+
const check = checkSafeRelativePath(path);
|
|
72
|
+
if (check.ok)
|
|
73
|
+
return [];
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
code: "DESIGN_PATH_UNSAFE",
|
|
77
|
+
artifact: path,
|
|
78
|
+
message: `'${path}' ${check.why}`,
|
|
79
|
+
action: "una publicación escribe DENTRO de su package: usá una ruta relativa sin '..'",
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
/** Last resort: a package with no manifest and no diagnosis of its own. */
|
|
84
|
+
function brokenManifest(packagePath) {
|
|
85
|
+
return {
|
|
86
|
+
code: "DESIGN_MANIFEST_MISSING",
|
|
87
|
+
artifact: `${packagePath}/design-manifest.json`,
|
|
88
|
+
message: "el package no tiene un manifest legible",
|
|
89
|
+
action: "reparalo antes de publicar sobre él",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A publication failure said in this domain's terms.
|
|
94
|
+
*
|
|
95
|
+
* The generic layer offers «confirmá la sobrescritura, o publicá en otro
|
|
96
|
+
* destino»: here both are ILLEGAL — overwriting a published baseline destroys
|
|
97
|
+
* an immutable revision, and a revision has no other destination. And the
|
|
98
|
+
* artifact named must be the file to fix, not the dossier it lives in.
|
|
99
|
+
*/
|
|
100
|
+
function publishFailure(failure, packagePath) {
|
|
101
|
+
// `publishArtifacts` ya nombra la ruta relativa al workspace entre comillas.
|
|
102
|
+
const quoted = /'([^']+)'/.exec(failure.message);
|
|
103
|
+
const artifact = quoted?.[1] ?? packagePath;
|
|
104
|
+
if (failure.code !== "PUBLISH_TARGET_EXISTS") {
|
|
105
|
+
return { ...failure, artifact };
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
code: "DESIGN_BASE_STALE",
|
|
109
|
+
artifact,
|
|
110
|
+
message: `'${artifact}' ya existe: alguien publicó esta revisión mientras preparabas`,
|
|
111
|
+
action: "releé el package y rehacé la revisión sobre la base nueva: una publicada no se reescribe",
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function locate(index, packageId) {
|
|
115
|
+
const found = index.packages.filter((p) => p.id === packageId || p.declared_id === packageId);
|
|
116
|
+
if (found.length > 1) {
|
|
117
|
+
return {
|
|
118
|
+
failures: [
|
|
119
|
+
{
|
|
120
|
+
code: "DESIGN_REFERENCE_AMBIGUOUS",
|
|
121
|
+
artifact: index.root,
|
|
122
|
+
message: `${packageId} está declarado por ${found.length} packages`,
|
|
123
|
+
action: "dos packages no pueden reclamar la misma identidad: renombrá uno",
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const entry = found[0];
|
|
129
|
+
if (entry === undefined) {
|
|
130
|
+
return {
|
|
131
|
+
failures: [
|
|
132
|
+
{
|
|
133
|
+
code: "DESIGN_REFERENCE_MISSING",
|
|
134
|
+
artifact: index.root,
|
|
135
|
+
message: `no hay un package ${packageId} bajo ${index.root}/`,
|
|
136
|
+
action: "revisá 'aw designs': publicar exige un package existente",
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Un package ROTO no es un package inexistente: son problemas muy distintos
|
|
142
|
+
// para quien tiene que arreglar uno, así que se devuelven sus fallos reales.
|
|
143
|
+
if (entry.manifest == null) {
|
|
144
|
+
return { failures: entry.failures.length > 0 ? entry.failures : [brokenManifest(entry.path)] };
|
|
145
|
+
}
|
|
146
|
+
return { manifest: entry.manifest, packagePath: entry.path };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The catalog this revision will have: the current one plus what it introduces.
|
|
150
|
+
*
|
|
151
|
+
* Two rules the first draft got backwards. A published document is VALIDATED
|
|
152
|
+
* before it is sealed — sealing bytes that do not satisfy their own contract
|
|
153
|
+
* makes the seal a lie. And for a flow or a screen the **frontmatter** is the
|
|
154
|
+
* authority for identity, revision and maturity (spec § *Canonical authority*):
|
|
155
|
+
* the file name must AGREE with it, never define it.
|
|
156
|
+
*/
|
|
157
|
+
function mergeCatalog(manifest, files) {
|
|
158
|
+
const catalog = structuredClone(manifest.catalog);
|
|
159
|
+
const failures = [];
|
|
160
|
+
for (const file of files) {
|
|
161
|
+
if (file.path.startsWith("assets/")) {
|
|
162
|
+
failures.push(...addAsset(catalog, file));
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
failures.push(...addArtifact(catalog, manifest.id, file));
|
|
166
|
+
}
|
|
167
|
+
return failures.length > 0 ? { failures } : { value: catalog };
|
|
168
|
+
}
|
|
169
|
+
/** One flow, screen, rule, token or rendition into the catalog it belongs to. */
|
|
170
|
+
function addArtifact(catalog, packageId, file) {
|
|
171
|
+
const described = describeFile(file, packageId);
|
|
172
|
+
if ("failures" in described)
|
|
173
|
+
return described.failures;
|
|
174
|
+
const { kind, id, revision, maturity, states, supersedes } = described.value;
|
|
175
|
+
const list = catalog[KIND_LIST[kind]];
|
|
176
|
+
if (list.some((e) => e.id === id && e.revision === revision)) {
|
|
177
|
+
return [
|
|
178
|
+
{
|
|
179
|
+
code: "DESIGN_ID_DUPLICATE",
|
|
180
|
+
artifact: file.path,
|
|
181
|
+
message: `${id}@r${revision} ya está publicada`,
|
|
182
|
+
action: "una revisión publicada no se reescribe: numerá la siguiente",
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
}
|
|
186
|
+
const previous = list.filter((e) => e.id === id).reduce((max, e) => Math.max(max, e.revision), 0);
|
|
187
|
+
list.push({
|
|
188
|
+
id,
|
|
189
|
+
revision,
|
|
190
|
+
path: file.path,
|
|
191
|
+
// El documento declara a quién supersede y F2 ya lo validó; acuñarlo desde
|
|
192
|
+
// el catálogo publicaría un manifest que contradice lo que sella.
|
|
193
|
+
supersedes: supersedes === undefined
|
|
194
|
+
? previous === 0
|
|
195
|
+
? null
|
|
196
|
+
: `${packageId}/${id}@r${previous}`
|
|
197
|
+
: supersedes,
|
|
198
|
+
...(maturity === undefined ? {} : { maturity }),
|
|
199
|
+
...(states === undefined ? {} : { states }),
|
|
200
|
+
});
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
/** An asset is content-addressed: its name has to be the digest of its bytes. */
|
|
204
|
+
function addAsset(catalog, file) {
|
|
205
|
+
const digest = digestOf(new TextEncoder().encode(file.content));
|
|
206
|
+
const expected = `assets/${digest.slice("sha256:".length)}-`;
|
|
207
|
+
if (!file.path.startsWith(expected)) {
|
|
208
|
+
return [
|
|
209
|
+
{
|
|
210
|
+
code: "DESIGN_FIELD_INVALID",
|
|
211
|
+
artifact: file.path,
|
|
212
|
+
message: "el nombre del asset no es el digest de su contenido",
|
|
213
|
+
action: `renombralo a '${expected}<nombre>.<ext>'`,
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
const twin = catalog.assets.find((a) => a.digest === digest);
|
|
218
|
+
if (twin !== undefined) {
|
|
219
|
+
// Escribirlo sin catalogarlo dejaría bytes dentro del package que ningún
|
|
220
|
+
// baseline sella: un asset es su contenido, y ya tiene un nombre.
|
|
221
|
+
return [
|
|
222
|
+
{
|
|
223
|
+
code: "DESIGN_ID_DUPLICATE",
|
|
224
|
+
artifact: file.path,
|
|
225
|
+
message: `ese contenido ya está publicado como '${twin.path}'`,
|
|
226
|
+
action: "un asset se direcciona por su contenido: referenciá el que ya existe",
|
|
227
|
+
},
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
catalog.assets.push({ digest, path: file.path });
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* What a published file IS. For a flow or a screen the frontmatter decides and
|
|
235
|
+
* the path must match it; for the kinds F2 gave no frontmatter contract, the
|
|
236
|
+
* name is the only declaration there is — and that is stated, not hidden.
|
|
237
|
+
*/
|
|
238
|
+
function describeFile(file, packageId) {
|
|
239
|
+
const kind = kindOfPath(file.path);
|
|
240
|
+
if (kind === null) {
|
|
241
|
+
return {
|
|
242
|
+
failures: [
|
|
243
|
+
{
|
|
244
|
+
code: "DESIGN_FIELD_INVALID",
|
|
245
|
+
artifact: file.path,
|
|
246
|
+
message: `'${file.path}' no está en ninguna carpeta de artefactos normativos`,
|
|
247
|
+
action: `publicá bajo: ${[...Object.values(NAMING).map((r) => r.dir), "assets"].join(", ")}`,
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (kind === "flow" || kind === "screen")
|
|
253
|
+
return describeDocument(file, packageId, kind);
|
|
254
|
+
const name = file.path.slice(NAMING[kind].dir.length + 1);
|
|
255
|
+
const parsed = /^((?:RUL|TOK|VIS)-[0-9]+)-r([0-9]{3,})-/.exec(name);
|
|
256
|
+
if (parsed === null) {
|
|
257
|
+
return {
|
|
258
|
+
failures: [
|
|
259
|
+
{
|
|
260
|
+
code: "DESIGN_FIELD_INVALID",
|
|
261
|
+
artifact: file.path,
|
|
262
|
+
message: `'${file.path}' no lleva su identidad y revisión en el nombre`,
|
|
263
|
+
action: `usá '${NAMING[kind].dir}/${ARTIFACT_PREFIX[kind]}-NNN-rNNN-<slug>${NAMING[kind].suffix}'`,
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
return { value: { kind, id: parsed[1], revision: Number(parsed[2]) } };
|
|
269
|
+
}
|
|
270
|
+
/** A flow or a screen: validated, and its identity read from the frontmatter. */
|
|
271
|
+
function describeDocument(file, packageId, kind) {
|
|
272
|
+
const document = validateDesignArtifact(file.content, kind, file.path);
|
|
273
|
+
if (!document.ok || document.value === null)
|
|
274
|
+
return { failures: document.failures };
|
|
275
|
+
const parsed = parseArtifactId(document.value.id);
|
|
276
|
+
if (parsed === null || parsed.package !== packageId) {
|
|
277
|
+
return {
|
|
278
|
+
failures: [
|
|
279
|
+
{
|
|
280
|
+
code: "DESIGN_AUTHORITY_CONFLICT",
|
|
281
|
+
artifact: file.path,
|
|
282
|
+
message: `el frontmatter declara '${document.value.id}' y el package es ${packageId}`,
|
|
283
|
+
action: "un artefacto se publica dentro del package que declara su id",
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
const naming = checkNaming(kind, file.path, parsed.artifact, document.value.revision);
|
|
289
|
+
if (!naming.ok) {
|
|
290
|
+
return {
|
|
291
|
+
failures: [
|
|
292
|
+
{
|
|
293
|
+
code: "DESIGN_AUTHORITY_CONFLICT",
|
|
294
|
+
artifact: file.path,
|
|
295
|
+
message: `el frontmatter declara ${parsed.artifact}@r${document.value.revision} y ${naming.why}`,
|
|
296
|
+
action: `el frontmatter manda: renombralo a '${naming.expected}'`,
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// La madurez que el documento RECLAMA se comprueba antes de sellarla —después
|
|
302
|
+
// de la identidad, porque un artefacto en el package equivocado se diagnostica
|
|
303
|
+
// por eso y no por su completitud.
|
|
304
|
+
const gate = gateDesignDocument(file.content, kind, file.path);
|
|
305
|
+
if (gate.failures.length > 0)
|
|
306
|
+
return { failures: gate.failures };
|
|
307
|
+
return {
|
|
308
|
+
value: {
|
|
309
|
+
kind,
|
|
310
|
+
id: parsed.artifact,
|
|
311
|
+
revision: document.value.revision,
|
|
312
|
+
maturity: document.value.maturity,
|
|
313
|
+
supersedes: document.value.supersedes,
|
|
314
|
+
...(document.value.kind === "screen"
|
|
315
|
+
? { states: document.value.states.map((s) => s.anchor) }
|
|
316
|
+
: {}),
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/** Which artifact kind lives in the directory a path sits in. */
|
|
321
|
+
function kindOfPath(path) {
|
|
322
|
+
const kinds = Object.entries(NAMING);
|
|
323
|
+
const match = kinds
|
|
324
|
+
.sort(([, a], [, b]) => b.dir.length - a.dir.length)
|
|
325
|
+
.find(([, rule]) => path.startsWith(`${rule.dir}/`));
|
|
326
|
+
return match === undefined ? null : match[0];
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* What the revision seals: the CURRENT revision of every artifact plus every
|
|
330
|
+
* asset. A baseline says what the package IS at this revision, not what changed.
|
|
331
|
+
*/
|
|
332
|
+
async function buildSelection(fs, workspace, packagePath, catalog, files) {
|
|
333
|
+
const incoming = new Map(files.map((f) => [f.path, f.content]));
|
|
334
|
+
const entries = [];
|
|
335
|
+
const failures = [];
|
|
336
|
+
for (const key of ["flows", "screens", "rules", "tokens", "renditions"]) {
|
|
337
|
+
for (const entry of currentRevisions(catalog[key])) {
|
|
338
|
+
const bytes = await bytesOf(fs, workspace, packagePath, entry.path, incoming);
|
|
339
|
+
if (bytes === null) {
|
|
340
|
+
failures.push(missingFile(entry.path, packagePath));
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
entries.push({ path: entry.path, revision: entry.revision, sha256: digestOf(bytes) });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
for (const asset of catalog.assets) {
|
|
347
|
+
const bytes = await bytesOf(fs, workspace, packagePath, asset.path, incoming);
|
|
348
|
+
if (bytes === null) {
|
|
349
|
+
failures.push(missingFile(asset.path, packagePath));
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
entries.push({ path: asset.path, revision: null, sha256: digestOf(bytes) });
|
|
353
|
+
}
|
|
354
|
+
return failures.length > 0 ? { failures } : { value: entries };
|
|
355
|
+
}
|
|
356
|
+
/** Bytes of a file this revision publishes, or of one already on disk. */
|
|
357
|
+
async function bytesOf(fs, workspace, packagePath, path, incoming) {
|
|
358
|
+
const content = incoming.get(path);
|
|
359
|
+
if (content !== undefined)
|
|
360
|
+
return new TextEncoder().encode(content);
|
|
361
|
+
const absolute = join(workspace, packagePath, path);
|
|
362
|
+
if (!(await fs.exists(absolute)))
|
|
363
|
+
return null;
|
|
364
|
+
return fs.readBytes(absolute);
|
|
365
|
+
}
|
|
366
|
+
function missingFile(path, packagePath) {
|
|
367
|
+
return {
|
|
368
|
+
code: "DESIGN_REFERENCE_FILE_MISSING",
|
|
369
|
+
artifact: `${packagePath}/${path}`,
|
|
370
|
+
message: `el catálogo declara '${path}' y el archivo no está`,
|
|
371
|
+
action: "restauralo o quitalo del catálogo: un baseline sella bytes que existen",
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
function digestOf(bytes) {
|
|
375
|
+
return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
376
|
+
}
|
|
377
|
+
function sealBaseline(manifest, revision, published, selection) {
|
|
378
|
+
const current = manifest.current_baseline;
|
|
379
|
+
const sealed = {
|
|
380
|
+
// Del registro, no a mano: este es el ÚNICO sitio del sistema que ESCRIBE
|
|
381
|
+
// un id canónico, y un literal aquí puede discrepar del que valida. Cuando
|
|
382
|
+
// eso pasa el floor emite output que su propio validador rechaza y ninguna
|
|
383
|
+
// revisión se publica — un formato paralelo de un solo carácter.
|
|
384
|
+
schema: DESIGN_BASELINE_SCHEMA_ID,
|
|
385
|
+
package: manifest.id,
|
|
386
|
+
revision,
|
|
387
|
+
parent_baseline: current === null ? null : `${manifest.id}@r${current.revision}`,
|
|
388
|
+
published,
|
|
389
|
+
selection,
|
|
390
|
+
};
|
|
391
|
+
return { ...sealed, digest: computeBaselineDigest(sealed) };
|
|
392
|
+
}
|
|
393
|
+
function nextManifestOf(manifest, catalog, baseline) {
|
|
394
|
+
const path = baselinePath(manifest.id, baseline.revision);
|
|
395
|
+
return {
|
|
396
|
+
...manifest,
|
|
397
|
+
catalog,
|
|
398
|
+
currentness: deriveCurrentness(manifest.id, catalog),
|
|
399
|
+
baselines: [
|
|
400
|
+
...manifest.baselines,
|
|
401
|
+
{
|
|
402
|
+
revision: baseline.revision,
|
|
403
|
+
path,
|
|
404
|
+
digest: baseline.digest,
|
|
405
|
+
parent_baseline: baseline.parent_baseline,
|
|
406
|
+
published: baseline.published,
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
current_baseline: { revision: baseline.revision, path, digest: baseline.digest },
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Currentness is DERIVED, never authored: the highest revision of each artifact
|
|
414
|
+
* is current and the rest are superseded. Minting `supersedes` and leaving the
|
|
415
|
+
* index empty would publish a manifest that contradicts itself.
|
|
416
|
+
*/
|
|
417
|
+
function deriveCurrentness(packageId, catalog) {
|
|
418
|
+
const out = [];
|
|
419
|
+
for (const key of ["flows", "screens", "rules", "tokens", "renditions"]) {
|
|
420
|
+
const highest = new Map();
|
|
421
|
+
for (const entry of catalog[key]) {
|
|
422
|
+
highest.set(entry.id, Math.max(highest.get(entry.id) ?? 0, entry.revision));
|
|
423
|
+
}
|
|
424
|
+
for (const entry of catalog[key]) {
|
|
425
|
+
out.push({
|
|
426
|
+
ref: `${packageId}/${entry.id}@r${entry.revision}`,
|
|
427
|
+
state: entry.revision === highest.get(entry.id) ? "current" : "superseded",
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return out;
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Everything, before anything is written. The compare-and-swap runs against the
|
|
435
|
+
* manifest as it was READ, which is what makes it a swap: if the line moved
|
|
436
|
+
* since, the candidate's parent no longer matches and the publication stops.
|
|
437
|
+
*/
|
|
438
|
+
function validateCandidate(after, baseline, packagePath) {
|
|
439
|
+
// Sin compare-and-swap acá: el candidato DERIVA su parent y su revisión del
|
|
440
|
+
// mismo manifest contra el que se compararía, así que la guarda no podía
|
|
441
|
+
// fallar nunca. El swap real es `expectedBase`, que el que llama declara.
|
|
442
|
+
const manifestPath = `${packagePath}/design-manifest.json`;
|
|
443
|
+
const baselineDoc = `${packagePath}/${baselinePath(after.id, baseline.revision)}`;
|
|
444
|
+
const manifestCheck = validateDesignManifest(JSON.parse(JSON.stringify(after)), manifestPath);
|
|
445
|
+
if (!manifestCheck.ok)
|
|
446
|
+
return manifestCheck.failures;
|
|
447
|
+
const baselineCheck = validateDesignBaseline(JSON.parse(JSON.stringify(baseline)), baselineDoc);
|
|
448
|
+
if (!baselineCheck.ok)
|
|
449
|
+
return baselineCheck.failures;
|
|
450
|
+
return checkBaselineAuthority(manifestCheck.value, baseline, baselineDoc);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* The batch. The new revision's files and its baseline are written EXCLUSIVELY —
|
|
454
|
+
* a concurrent publication must lose the race, not overwrite an immutable
|
|
455
|
+
* revision. The index and the projections are meant to be rewritten.
|
|
456
|
+
*/
|
|
457
|
+
function candidateArtifacts(packagePath, manifest, baseline, files) {
|
|
458
|
+
const at = (path) => `${packagePath}/${path}`;
|
|
459
|
+
return [
|
|
460
|
+
...files.map((f) => ({ path: at(f.path), content: f.content, overwrite: false })),
|
|
461
|
+
{
|
|
462
|
+
path: at(baselinePath(manifest.id, baseline.revision)),
|
|
463
|
+
content: `${JSON.stringify(baseline, null, 2)}\n`,
|
|
464
|
+
overwrite: false,
|
|
465
|
+
},
|
|
466
|
+
{ path: at("PACKAGE.md"), content: renderPackageMd(manifest), overwrite: true },
|
|
467
|
+
// `design-system/` es CONDICIONAL: crear la carpeta en un package sin reglas
|
|
468
|
+
// ni tokens inventaría estructura que la spec no pide.
|
|
469
|
+
...(manifest.catalog.rules.length + manifest.catalog.tokens.length > 0
|
|
470
|
+
? [
|
|
471
|
+
{
|
|
472
|
+
path: at("design-system/DESIGN.md"),
|
|
473
|
+
content: renderDesignMd(manifest),
|
|
474
|
+
overwrite: true,
|
|
475
|
+
},
|
|
476
|
+
]
|
|
477
|
+
: []),
|
|
478
|
+
// ÚLTIMO, a propósito: el manifest es el interruptor que conmuta el package
|
|
479
|
+
// a la revisión nueva. Escribirlo antes que las proyecciones deja una
|
|
480
|
+
// ventana en la que un rollback fallido publica un baseline colgante.
|
|
481
|
+
{
|
|
482
|
+
path: at("design-manifest.json"),
|
|
483
|
+
content: `${JSON.stringify(manifest, null, 2)}\n`,
|
|
484
|
+
overwrite: true,
|
|
485
|
+
},
|
|
486
|
+
];
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=design-publish-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-publish-service.js","sourceRoot":"","sources":["../../../src/application/design/design-publish-service.ts"],"names":[],"mappings":"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"}
|