@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,165 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { validateDesignArtifact } from "../../domain/design/artifact.js";
|
|
3
|
+
function fail(code, artifact, message, action) {
|
|
4
|
+
return { ok: false, failure: { code, artifact, message, action } };
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve `package: DES-001@r4` + its hint + its digest against the workspace.
|
|
8
|
+
* `artifact` names the DOCUMENT that carries the reference, so a diagnostic
|
|
9
|
+
* points at the spec or plan to fix, not at the package.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveBaselineReference(index, reference, artifact) {
|
|
12
|
+
const id = reference.baseline.package;
|
|
13
|
+
const revision = reference.baseline.revision;
|
|
14
|
+
// The lookup key is the TRIPLE — package, revision and digest — not the id.
|
|
15
|
+
// The spec is explicit about it, and it matters: a workspace where two folders
|
|
16
|
+
// claim one identity but only one of them published this exact revision still
|
|
17
|
+
// has a single answer, and a reference written a year ago deserves it.
|
|
18
|
+
const claiming = index.packages.filter((p) => p.id === id);
|
|
19
|
+
const matching = claiming.filter((p) => findBaseline(p, revision)?.digest === reference.digest);
|
|
20
|
+
if (matching.length > 1) {
|
|
21
|
+
return fail("DESIGN_REFERENCE_AMBIGUOUS", artifact, `${id}@r${revision} con ese digest aparece en ${matching.length} packages (${matching.map((p) => p.path).join(", ")})`, "una identidad pertenece a un solo package: corregí el id de los demás");
|
|
22
|
+
}
|
|
23
|
+
if (matching.length === 1) {
|
|
24
|
+
const pkg = matching[0];
|
|
25
|
+
const found = findBaseline(pkg, revision);
|
|
26
|
+
const path = `${pkg.path}/${found.path}`;
|
|
27
|
+
const stale = path !== reference.baseline_hint;
|
|
28
|
+
return {
|
|
29
|
+
ok: true,
|
|
30
|
+
value: {
|
|
31
|
+
hint: stale ? "stale" : "valid",
|
|
32
|
+
package_id: id,
|
|
33
|
+
package_path: pkg.path,
|
|
34
|
+
revision,
|
|
35
|
+
digest: found.digest,
|
|
36
|
+
path,
|
|
37
|
+
...(stale ? { declared_hint: reference.baseline_hint } : {}),
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return explainNoMatch(index, claiming, reference, artifact);
|
|
42
|
+
}
|
|
43
|
+
/** Nothing matched the triple. Say WHICH of the four reasons it was. */
|
|
44
|
+
function explainNoMatch(index, claiming, reference, artifact) {
|
|
45
|
+
const id = reference.baseline.package;
|
|
46
|
+
const revision = reference.baseline.revision;
|
|
47
|
+
if (claiming.length > 1) {
|
|
48
|
+
return fail("DESIGN_REFERENCE_AMBIGUOUS", artifact, `${id} está declarado por ${claiming.length} packages (${claiming.map((p) => p.path).join(", ")}) y ninguno publicó r${revision} con ese digest`, "una identidad pertenece a un solo package: corregí el id de los demás");
|
|
49
|
+
}
|
|
50
|
+
if (claiming.length === 0) {
|
|
51
|
+
// A folder that CLAIMS the identity but does not validate is a broken
|
|
52
|
+
// package, not an absent one — and the fix is completely different.
|
|
53
|
+
const broken = index.packages.find((p) => p.declared_id === id);
|
|
54
|
+
if (broken !== undefined) {
|
|
55
|
+
return fail("DESIGN_REFERENCE_PACKAGE_INVALID", artifact, `'${broken.path}' declara ${id} y su manifest no valida: ${broken.failures[0]?.message ?? "sin detalle"}`, broken.failures[0]?.action ?? "reparalo y volvé a resolver");
|
|
56
|
+
}
|
|
57
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `no existe ningún package ${id} bajo ${index.root}/`, "revisá 'aw designs': el package pudo no haberse publicado todavía, o su manifest no valida");
|
|
58
|
+
}
|
|
59
|
+
const pkg = claiming[0];
|
|
60
|
+
const found = findBaseline(pkg, revision);
|
|
61
|
+
if (found === null) {
|
|
62
|
+
const published = (pkg.manifest?.baselines ?? []).map((b) => `r${b.revision}`);
|
|
63
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `${id} no publicó la revisión r${revision}`, `las publicadas son: ${published.join(", ") || "(ninguna)"}`);
|
|
64
|
+
}
|
|
65
|
+
return fail("DESIGN_REFERENCE_DIGEST_MISMATCH", artifact, `${id}@r${revision} tiene digest ${found.digest} y la referencia fija ${reference.digest}`, "no edites una revisión publicada: creá la siguiente y reapuntá esta referencia a ella");
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolve `DES-001@r4 / SCR-002@r2#empty`. The baseline resolves first: an
|
|
69
|
+
* artifact is only meaningful inside the revision of the package that selects
|
|
70
|
+
* it.
|
|
71
|
+
*/
|
|
72
|
+
export function resolveTaskReference(index, reference, hints, artifact) {
|
|
73
|
+
// A plan may pin more than one package, so the hint is chosen by identity AND
|
|
74
|
+
// revision: the task's own `DES-001@r4` is what it fixed, and resolving
|
|
75
|
+
// against a different revision of the same package would answer a question
|
|
76
|
+
// nobody asked.
|
|
77
|
+
const hint = hints.find((h) => h.baseline.package === reference.baseline.package &&
|
|
78
|
+
h.baseline.revision === reference.baseline.revision);
|
|
79
|
+
if (hint === undefined) {
|
|
80
|
+
const declared = hints.map((h) => `${h.baseline.package}@r${h.baseline.revision}`);
|
|
81
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `la tarea fija ${reference.baseline.package}@r${reference.baseline.revision} y las referencias declaradas son: ${declared.join(", ") || "(ninguna)"}`, "declará ese baseline en '## Design references', o corregí la referencia de la tarea");
|
|
82
|
+
}
|
|
83
|
+
const baseline = resolveBaselineReference(index, hint, artifact);
|
|
84
|
+
if (!baseline.ok)
|
|
85
|
+
return baseline;
|
|
86
|
+
const pkg = index.packages.find((p) => p.id === reference.baseline.package);
|
|
87
|
+
const entry = findCatalogEntry(pkg, reference.artifact);
|
|
88
|
+
if (entry === null) {
|
|
89
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `${reference.raw}: el catálogo de ${pkg.id} no contiene ${reference.artifact.artifact}@r${reference.artifact.revision}`, "referenciá una revisión catalogada, o publicá la que falta");
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
ok: true,
|
|
93
|
+
value: {
|
|
94
|
+
...baseline.value,
|
|
95
|
+
artifact_id: entry.id,
|
|
96
|
+
artifact_revision: entry.revision,
|
|
97
|
+
artifact_path: `${pkg.path}/${entry.path}`,
|
|
98
|
+
...(reference.artifact.state !== undefined ? { state: reference.artifact.state } : {}),
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The resolution above is pure: it answers from the index and never touches the
|
|
104
|
+
* disk. That is the right default — but a reference that resolves "valid" to a
|
|
105
|
+
* file nobody can open is a fail-open, so whoever is about to USE the baseline
|
|
106
|
+
* confirms it is there.
|
|
107
|
+
*/
|
|
108
|
+
export async function resolveBaselineOnDisk(fs, workspace, resolved, artifact) {
|
|
109
|
+
if (await fs.exists(join(workspace, resolved.path)))
|
|
110
|
+
return { ok: true, value: resolved };
|
|
111
|
+
return fail("DESIGN_REFERENCE_FILE_MISSING", artifact, `el manifest de ${resolved.package_id} dice que r${resolved.revision} vive en '${resolved.path}' y ese archivo no está`, "restaurá el baseline o corregí su path en el manifest del package");
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* A state resolves only if the screen revision that owns it declares the
|
|
115
|
+
* anchor. This is the one resolution step that has to read a file: the anchors
|
|
116
|
+
* live in the screen's frontmatter, which is exactly where F2 put them.
|
|
117
|
+
*/
|
|
118
|
+
export async function resolveStateAnchor(fs, workspace, resolved, artifact) {
|
|
119
|
+
if (resolved.state === undefined)
|
|
120
|
+
return { ok: true, value: resolved };
|
|
121
|
+
const absolute = join(workspace, resolved.artifact_path);
|
|
122
|
+
if (!(await fs.exists(absolute))) {
|
|
123
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `'${resolved.artifact_path}' no existe, y el catálogo dice que ahí vive ${resolved.artifact_id}@r${resolved.artifact_revision}`, "restaurá el archivo o corregí el path en el manifest del package");
|
|
124
|
+
}
|
|
125
|
+
const document = validateDesignArtifact(await fs.readText(absolute), "screen", resolved.artifact_path);
|
|
126
|
+
if (!document.ok || document.value === null || document.value.kind !== "screen") {
|
|
127
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `no se puede resolver el estado '#${resolved.state}': '${resolved.artifact_path}' no valida como screen`, `corré la validación del package y reparalo: ${document.failures[0]?.message ?? "sin detalle"}`);
|
|
128
|
+
}
|
|
129
|
+
const anchors = document.value.states.map((s) => s.anchor);
|
|
130
|
+
if (!anchors.includes(resolved.state)) {
|
|
131
|
+
return fail("DESIGN_REFERENCE_MISSING", artifact, `${resolved.artifact_id}@r${resolved.artifact_revision} no declara el estado '#${resolved.state}'`, `los estados de esa revisión son: ${anchors.join(", ") || "(ninguno)"}`);
|
|
132
|
+
}
|
|
133
|
+
return { ok: true, value: resolved };
|
|
134
|
+
}
|
|
135
|
+
function findBaseline(pkg, revision) {
|
|
136
|
+
return pkg.manifest?.baselines.find((b) => b.revision === revision) ?? null;
|
|
137
|
+
}
|
|
138
|
+
function findCatalogEntry(pkg, ref) {
|
|
139
|
+
if (pkg.manifest === null)
|
|
140
|
+
return null;
|
|
141
|
+
for (const list of Object.values(pkg.manifest.catalog)) {
|
|
142
|
+
for (const entry of list) {
|
|
143
|
+
if ("id" in entry && entry.id === ref.artifact && entry.revision === ref.revision) {
|
|
144
|
+
return entry;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The stale hint as a REPORT. AC-REF-07 asks for the reference to keep its
|
|
152
|
+
* validity *and* for the stale hint to be reported — this is the second half,
|
|
153
|
+
* kept out of the failure list on purpose: a repaired hint is not a rejection.
|
|
154
|
+
*/
|
|
155
|
+
export function staleHintNotice(resolved, artifact) {
|
|
156
|
+
if (resolved.hint !== "stale" || resolved.declared_hint === undefined)
|
|
157
|
+
return null;
|
|
158
|
+
return {
|
|
159
|
+
code: "DESIGN_HINT_STALE",
|
|
160
|
+
artifact,
|
|
161
|
+
message: `baseline_hint apunta a '${resolved.declared_hint}' y ${resolved.package_id}@r${resolved.revision} vive en '${resolved.path}'`,
|
|
162
|
+
action: `actualizá el hint a '${resolved.path}': la referencia sigue siendo válida, el path quedó viejo`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=design-resolver-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-resolver-service.js","sourceRoot":"","sources":["../../../src/application/design/design-resolver-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ function resumeTarget(index, target) {
|
|
|
25
25
|
const plans = index.plans.filter((p) => p.file === target || p.number === target);
|
|
26
26
|
const matches = [
|
|
27
27
|
...specs.map((s) => specProposal(s, index)),
|
|
28
|
-
...plans.map(planProposal),
|
|
28
|
+
...plans.map((plan) => planProposal(plan, index)),
|
|
29
29
|
];
|
|
30
30
|
const [first] = matches;
|
|
31
31
|
if (first === undefined) {
|
|
@@ -92,7 +92,7 @@ async function pipelineProposal(fs, index, item) {
|
|
|
92
92
|
if (item.kind === "plan-open") {
|
|
93
93
|
const plan = index.plans.find((p) => p.file === item.file);
|
|
94
94
|
if (plan !== undefined)
|
|
95
|
-
return planProposal(plan);
|
|
95
|
+
return planProposal(plan, index);
|
|
96
96
|
}
|
|
97
97
|
if (item.kind === "checkpoint-orphan") {
|
|
98
98
|
const session = index.sessions.find((s) => s.folder === item.file);
|
|
@@ -129,21 +129,40 @@ function specProposal(spec, index) {
|
|
|
129
129
|
? "ya tiene plan derivado"
|
|
130
130
|
: "generar su plan",
|
|
131
131
|
command: refine ? `/w:spec-refine ${spec.file}` : `/w:plan-new ${spec.file}`,
|
|
132
|
+
...designOf(index, spec.file),
|
|
132
133
|
};
|
|
133
134
|
}
|
|
134
|
-
function planProposal(plan) {
|
|
135
|
+
function planProposal(plan, index) {
|
|
135
136
|
const [blocked] = plan.blocked_phases;
|
|
136
137
|
const phases = plan.phases_total > 0 ? ` · fases ${plan.phases_validated}/${plan.phases_total}` : "";
|
|
138
|
+
const design = designOf(index, plan.file);
|
|
137
139
|
return {
|
|
138
140
|
kind: "plan-open",
|
|
139
141
|
file: plan.file,
|
|
140
142
|
number: plan.number,
|
|
141
143
|
objective: `plan ${plan.number}${plan.slug ? ` — ${plan.slug}` : ""}`,
|
|
142
144
|
progress: `${plan.tasks_done}/${plan.tasks_total} tareas (${plan.progress_pct}%)${phases}`,
|
|
143
|
-
next:
|
|
145
|
+
// A missing reference outranks the plan's own next step: plan-exec fails
|
|
146
|
+
// closed on it, so proposing "implementá F3" would send someone into a wall.
|
|
147
|
+
next: describeMissingDesign(design) ?? describePlanNext(plan, blocked),
|
|
144
148
|
command: `/w:plan-exec ${plan.file}`,
|
|
149
|
+
...design,
|
|
145
150
|
};
|
|
146
151
|
}
|
|
152
|
+
/** The document's non-valid references, or nothing at all to say. */
|
|
153
|
+
function designOf(index, file) {
|
|
154
|
+
const design = index.designs.references
|
|
155
|
+
.filter((r) => r.from === file && r.state !== "valid")
|
|
156
|
+
.map((r) => ({ state: r.state, baseline: r.baseline, detail: r.detail }));
|
|
157
|
+
return design.length === 0 ? {} : { design };
|
|
158
|
+
}
|
|
159
|
+
function describeMissingDesign(design) {
|
|
160
|
+
const missing = (design.design ?? []).filter((d) => d.state === "missing");
|
|
161
|
+
const [first] = missing;
|
|
162
|
+
if (first === undefined)
|
|
163
|
+
return null;
|
|
164
|
+
return `DISEÑO IRRESOLUBLE ${first.baseline} — ${first.detail ?? "no resuelve"}`;
|
|
165
|
+
}
|
|
147
166
|
function describePlanNext(plan, blocked) {
|
|
148
167
|
if (blocked !== undefined) {
|
|
149
168
|
return `BLOQUEADA F${blocked.number} — ${blocked.blocker ?? "sin motivo declarado"}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-service.js","sourceRoot":"","sources":["../../src/application/resume-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resume-service.js","sourceRoot":"","sources":["../../src/application/resume-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { checkSafeRelativePath } from "../../domain/safe-path.js";
|
|
2
3
|
/**
|
|
3
4
|
* The bounded CLI↔AI handshake shared by every hybrid command.
|
|
4
5
|
*
|
|
@@ -25,14 +26,25 @@ export const SEMANTIC_PROTOCOL_VERSION = 1;
|
|
|
25
26
|
export function semanticDigest(value) {
|
|
26
27
|
return createHash("sha256").update(canonicalJson(value), "utf8").digest("hex");
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Canonical JSON: object keys sorted BY CODE UNIT, `undefined` dropped.
|
|
31
|
+
*
|
|
32
|
+
* Exported because a design baseline seals its revision with a digest over
|
|
33
|
+
* exactly this form — one canonicalization for the whole system, or two digests
|
|
34
|
+
* of the same bytes.
|
|
35
|
+
*/
|
|
36
|
+
export function canonicalJson(value) {
|
|
29
37
|
if (value === null || typeof value !== "object")
|
|
30
38
|
return JSON.stringify(value) ?? "null";
|
|
31
39
|
if (Array.isArray(value))
|
|
32
40
|
return `[${value.map(canonicalJson).join(",")}]`;
|
|
33
41
|
const entries = Object.entries(value)
|
|
34
42
|
.filter(([, v]) => v !== undefined)
|
|
35
|
-
|
|
43
|
+
// Code units, NOT `localeCompare`: collation is locale- and ICU-dependent
|
|
44
|
+
// (sv-SE orders `a,o,z,ä,ö`; de-DE orders `a,ä,o,ö,z`), so the same document
|
|
45
|
+
// would digest differently on two machines and a published baseline would
|
|
46
|
+
// read as tampered. RFC 8785 sorts by code units for exactly this reason.
|
|
47
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
36
48
|
.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
|
|
37
49
|
return `{${entries.join(",")}}`;
|
|
38
50
|
}
|
|
@@ -194,16 +206,10 @@ function checkPath(raw, allowed) {
|
|
|
194
206
|
action: `escribí solo dentro de: ${allowed.join(", ")}`,
|
|
195
207
|
},
|
|
196
208
|
});
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (path.startsWith("/") || /^[A-Za-z]:/.test(path))
|
|
202
|
-
return reject("es absoluto");
|
|
203
|
-
const segments = path.split("/");
|
|
204
|
-
if (segments.some((s) => s === ".." || s === "." || s.length === 0)) {
|
|
205
|
-
return reject("contiene segmentos relativos o vacíos");
|
|
206
|
-
}
|
|
209
|
+
const safe = checkSafeRelativePath(path);
|
|
210
|
+
if (!safe.ok)
|
|
211
|
+
return reject(safe.why);
|
|
212
|
+
const segments = safe.segments;
|
|
207
213
|
// A destination is either a directory to write INSIDE (persist, exports) or an
|
|
208
214
|
// exact file already identified as writable (fix-git's conflict set). Both are
|
|
209
215
|
// compared on segments, so `docs/research-evil` never passes as `docs/research`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/application/semantic-operation/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/application/semantic-operation/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +1,63 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
2
|
export async function publishArtifacts(fs, root, artifacts, options = {}) {
|
|
3
3
|
const done = [];
|
|
4
|
+
const created = [];
|
|
4
5
|
for (const artifact of artifacts) {
|
|
5
6
|
const absolute = join(root, artifact.path);
|
|
6
|
-
const failure = await writeOne(fs, absolute, artifact, options, done);
|
|
7
|
+
const failure = await writeOne(fs, absolute, artifact, options, done, created);
|
|
7
8
|
if (failure !== null) {
|
|
8
|
-
await rollback(fs, done);
|
|
9
|
+
await rollback(fs, done, created);
|
|
9
10
|
return { ok: false, failure };
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
return { ok: true, value: { written: artifacts.map((a) => a.path) } };
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
/** The chain of ancestors that do not exist yet, outermost first. */
|
|
16
|
+
async function missingAncestors(fs, dir) {
|
|
17
|
+
const missing = [];
|
|
18
|
+
let current = dir;
|
|
19
|
+
while (!(await fs.exists(current))) {
|
|
20
|
+
missing.unshift(current);
|
|
21
|
+
const parent = dirname(current);
|
|
22
|
+
if (parent === current)
|
|
23
|
+
break;
|
|
24
|
+
current = parent;
|
|
25
|
+
}
|
|
26
|
+
return missing;
|
|
27
|
+
}
|
|
28
|
+
async function writeOne(fs, absolute, artifact, options, done, created) {
|
|
29
|
+
const overwrite = artifact.overwrite ?? options.overwrite === true;
|
|
15
30
|
try {
|
|
31
|
+
created.push(...(await missingAncestors(fs, dirname(absolute))));
|
|
16
32
|
await fs.mkdirp(dirname(absolute));
|
|
17
33
|
const previous = await readPrevious(fs, absolute);
|
|
18
|
-
if (previous
|
|
34
|
+
if (previous === UNREADABLE) {
|
|
35
|
+
// Fail-closed: sin poder leerlo no hay cómo devolverlo a como estaba.
|
|
36
|
+
return {
|
|
37
|
+
code: "PUBLISH_FAILED",
|
|
38
|
+
message: `'${artifact.path}' existe y no se pudo leer`,
|
|
39
|
+
action: "no se sobrescribe lo que no se puede restaurar: revisá permisos",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (previous !== null && !overwrite) {
|
|
19
43
|
return {
|
|
20
44
|
code: "PUBLISH_TARGET_EXISTS",
|
|
21
45
|
message: `'${artifact.path}' ya existe y no se autorizó sobrescribir`,
|
|
22
46
|
action: "confirmá la sobrescritura explícitamente, o publicá en otro destino",
|
|
23
47
|
};
|
|
24
48
|
}
|
|
49
|
+
// Registered BEFORE the write, not after. A write can fail HALFWAY — the
|
|
50
|
+
// exclusive path opens the file and then writes it — and a destination that
|
|
51
|
+
// only enters `done` on success is a destination the rollback cannot undo:
|
|
52
|
+
// the half-written file stays, and every retry loses to it forever.
|
|
53
|
+
done.push({ absolute, previous });
|
|
25
54
|
if (previous === null) {
|
|
26
55
|
// Exclusive create closes the check-then-write window: a concurrent run
|
|
27
56
|
// that got there first loses here, not silently.
|
|
28
57
|
const { created } = await fs.writeTextExclusive(absolute, artifact.content);
|
|
29
58
|
if (!created) {
|
|
59
|
+
// Someone else's file: it is not ours to roll back.
|
|
60
|
+
done.pop();
|
|
30
61
|
return {
|
|
31
62
|
code: "PUBLISH_TARGET_EXISTS",
|
|
32
63
|
message: `'${artifact.path}' fue creado por otro proceso durante la publicación`,
|
|
@@ -37,7 +68,6 @@ async function writeOne(fs, absolute, artifact, options, done) {
|
|
|
37
68
|
else {
|
|
38
69
|
await fs.writeText(absolute, artifact.content);
|
|
39
70
|
}
|
|
40
|
-
done.push({ absolute, previous });
|
|
41
71
|
return null;
|
|
42
72
|
}
|
|
43
73
|
catch (err) {
|
|
@@ -48,6 +78,14 @@ async function writeOne(fs, absolute, artifact, options, done) {
|
|
|
48
78
|
};
|
|
49
79
|
}
|
|
50
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* What is there now, or UNREADABLE.
|
|
83
|
+
*
|
|
84
|
+
* The distinction matters: returning `""` for a file we could not read made the
|
|
85
|
+
* rollback TRUNCATE it — a publication that reported failure destroyed content
|
|
86
|
+
* it never managed to read. Unreadable means untouchable.
|
|
87
|
+
*/
|
|
88
|
+
const UNREADABLE = Symbol("unreadable");
|
|
51
89
|
async function readPrevious(fs, absolute) {
|
|
52
90
|
if (!(await fs.exists(absolute)))
|
|
53
91
|
return null;
|
|
@@ -55,13 +93,11 @@ async function readPrevious(fs, absolute) {
|
|
|
55
93
|
return await fs.readText(absolute);
|
|
56
94
|
}
|
|
57
95
|
catch {
|
|
58
|
-
|
|
59
|
-
// and as unrestorable so a rollback leaves it exactly as it was found.
|
|
60
|
-
return "";
|
|
96
|
+
return UNREADABLE;
|
|
61
97
|
}
|
|
62
98
|
}
|
|
63
99
|
/** Undo in reverse order, best effort — a failed undo must not mask the cause. */
|
|
64
|
-
async function rollback(fs, done) {
|
|
100
|
+
async function rollback(fs, done, created) {
|
|
65
101
|
for (const entry of [...done].reverse()) {
|
|
66
102
|
try {
|
|
67
103
|
if (entry.previous === null)
|
|
@@ -73,6 +109,17 @@ async function rollback(fs, done) {
|
|
|
73
109
|
// ignore; the original failure is what the caller reports
|
|
74
110
|
}
|
|
75
111
|
}
|
|
112
|
+
// Deepest first, and only while still empty: a directory that gained content
|
|
113
|
+
// from somewhere else is not ours to remove.
|
|
114
|
+
for (const dir of [...created].sort((a, b) => b.length - a.length)) {
|
|
115
|
+
try {
|
|
116
|
+
if ((await fs.list(dir)).length === 0)
|
|
117
|
+
await fs.remove(dir);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// ignore; same reason
|
|
121
|
+
}
|
|
122
|
+
}
|
|
76
123
|
}
|
|
77
124
|
function errorText(err) {
|
|
78
125
|
return err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/application/semantic-operation/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/application/semantic-operation/publish.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { parse as parseToml } from "smol-toml";
|
|
3
3
|
import { HARNESSES } from "../domain/harnesses.js";
|
|
4
4
|
import { parseSkillFrontmatter } from "../domain/skill-frontmatter.js";
|
|
5
|
-
import { BUILTIN_DEFAULT_SKILLS, SKILL_ROLES, isSkillRole, } from "../domain/skills.js";
|
|
5
|
+
import { BUILTIN_DEFAULT_SKILLS, RETIRED_SKILL_IDENTITIES, SKILL_ROLES, isSkillRole, } from "../domain/skills.js";
|
|
6
6
|
const OFF = "off";
|
|
7
7
|
/**
|
|
8
8
|
* Resolve capability role → skill bindings via the cascade:
|
|
@@ -140,16 +140,31 @@ async function addFrontmatterName(fs, skillMd, names) {
|
|
|
140
140
|
function applyLevel(skills, table, source, path, warnings) {
|
|
141
141
|
for (const [key, value] of Object.entries(table)) {
|
|
142
142
|
if (!isSkillRole(key)) {
|
|
143
|
-
|
|
143
|
+
const retired = RETIRED_SKILL_IDENTITIES.get(key);
|
|
144
|
+
warnings.push(retired === undefined
|
|
145
|
+
? `${path}: unknown role '${key}' ignored`
|
|
146
|
+
: `${path}: role '${key}' está retirado y se ignora — ${retired}`);
|
|
144
147
|
continue;
|
|
145
148
|
}
|
|
146
149
|
const val = String(value).trim();
|
|
147
150
|
if (val.toLowerCase() === OFF) {
|
|
148
151
|
skills[key] = { role: key, skill: null, source, enabled: false };
|
|
152
|
+
continue;
|
|
149
153
|
}
|
|
150
|
-
|
|
151
|
-
|
|
154
|
+
if (val.length === 0)
|
|
155
|
+
continue;
|
|
156
|
+
// Un nombre retirado se RECHAZA, no se resuelve: honrarlo lo convertiría en
|
|
157
|
+
// un nombre aceptado. Se compara en minúsculas igual que `off`, tres líneas
|
|
158
|
+
// arriba: dos reglas distintas en la misma función es una costura.
|
|
159
|
+
const retired = RETIRED_SKILL_IDENTITIES.get(val.toLowerCase());
|
|
160
|
+
if (retired !== undefined) {
|
|
161
|
+
// La línea se IGNORA. No se nombra un destino: si otro nivel de la
|
|
162
|
+
// cascada ya bindeó el role, el role NO queda en su built-in default y
|
|
163
|
+
// decirlo sería mentir. Lo que resolvió de verdad va al lado, en `skills`.
|
|
164
|
+
warnings.push(`${path}: role '${key}' apunta a '${val}', que está retirado y no se acepta — ${retired}. Se ignora la línea`);
|
|
165
|
+
continue;
|
|
152
166
|
}
|
|
167
|
+
skills[key] = { role: key, skill: val, source, enabled: true };
|
|
153
168
|
}
|
|
154
169
|
}
|
|
155
170
|
//# sourceMappingURL=skills-resolver-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-resolver-service.js","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACL,sBAAsB,
|
|
1
|
+
{"version":3,"file":"skills-resolver-service.js","sourceRoot":"","sources":["../../src/application/skills-resolver-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ export async function runStatusCommand(fs, env, paths, input = {}) {
|
|
|
25
25
|
sessions: { active, closed },
|
|
26
26
|
discarded: index.discarded,
|
|
27
27
|
pipeline: index.pipeline,
|
|
28
|
+
designs: index.designs,
|
|
28
29
|
counts: {
|
|
29
30
|
specs: index.specs.length,
|
|
30
31
|
specs_refined: index.specs.filter((s) => s.refined).length,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-service.js","sourceRoot":"","sources":["../../src/application/status-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status-service.js","sourceRoot":"","sources":["../../src/application/status-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAkDrC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,QAAqB,EAAE;IAEvB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAClD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE;YACN,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACzB,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;YAC1D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACzB,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;YACjC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC"}
|