@tacuchi/agent-workflow-cli 20.26.0 → 21.1.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 +2 -1
- package/dist/adapters/node-file-system.js +3 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/capability/compose.js +161 -0
- package/dist/application/capability/compose.js.map +1 -0
- package/dist/application/capability/descriptor-loader.js +109 -0
- package/dist/application/capability/descriptor-loader.js.map +1 -0
- package/dist/application/capability/design-handler.js +299 -0
- package/dist/application/capability/design-handler.js.map +1 -0
- package/dist/application/capability/dispatcher.js +312 -0
- package/dist/application/capability/dispatcher.js.map +1 -0
- package/dist/application/capability/durable-effect.js +220 -0
- package/dist/application/capability/durable-effect.js.map +1 -0
- package/dist/application/capability/installed-inventory.js +168 -0
- package/dist/application/capability/installed-inventory.js.map +1 -0
- package/dist/application/capability/readiness.js +204 -0
- package/dist/application/capability/readiness.js.map +1 -0
- package/dist/application/capability/resolution.js +264 -0
- package/dist/application/capability/resolution.js.map +1 -0
- package/dist/application/capability/wrapper.js +187 -0
- package/dist/application/capability/wrapper.js.map +1 -0
- package/dist/application/context/manifest.js +11 -5
- package/dist/application/context/manifest.js.map +1 -1
- package/dist/application/context/measure.js +5 -2
- package/dist/application/context/measure.js.map +1 -1
- package/dist/application/context/plan-service.js +6 -6
- package/dist/application/context/plan-service.js.map +1 -1
- package/dist/application/design/design-bundle-service.js +148 -0
- package/dist/application/design/design-bundle-service.js.map +1 -0
- 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-proposal-service.js +69 -0
- package/dist/application/design/design-proposal-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +756 -0
- package/dist/application/design/design-publish-service.js.map +1 -0
- package/dist/application/design/design-record-service.js +100 -0
- package/dist/application/design/design-record-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/flow/advance.js +533 -0
- package/dist/application/flow/advance.js.map +1 -0
- package/dist/application/flow/flow-service.js +65 -0
- package/dist/application/flow/flow-service.js.map +1 -0
- package/dist/application/flow/run-projection.js +80 -0
- package/dist/application/flow/run-projection.js.map +1 -0
- package/dist/application/flow/run-state-service.js +107 -0
- package/dist/application/flow/run-state-service.js.map +1 -0
- package/dist/application/flow/submit.js +423 -0
- package/dist/application/flow/submit.js.map +1 -0
- package/dist/application/resume-service.js +46 -14
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/install-skill.js +11 -0
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -0
- package/dist/application/self/uninstall.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 +27 -6
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +5 -1
- 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 +22 -2
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/capability.js +182 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/designs.js +110 -0
- package/dist/cli/commands/designs.js.map +1 -0
- package/dist/cli/commands/flow.js +71 -0
- package/dist/cli/commands/flow.js.map +1 -0
- package/dist/cli/commands/index.js +6 -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/skills.js +55 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +50 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +9 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +7 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +5 -0
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +5 -1
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/domain/capability/descriptor.js +553 -0
- package/dist/domain/capability/descriptor.js.map +1 -0
- package/dist/domain/capability/effects.js +90 -0
- package/dist/domain/capability/effects.js.map +1 -0
- package/dist/domain/capability/protocol.js +494 -0
- package/dist/domain/capability/protocol.js.map +1 -0
- package/dist/domain/contract-reader.js +84 -0
- package/dist/domain/contract-reader.js.map +1 -0
- package/dist/domain/design/adapter.js +161 -0
- package/dist/domain/design/adapter.js.map +1 -0
- 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 +750 -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 +310 -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/direct.js +108 -0
- package/dist/domain/design/direct.js.map +1 -0
- package/dist/domain/design/external-send.js +65 -0
- package/dist/domain/design/external-send.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 +305 -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/offline.js +92 -0
- package/dist/domain/design/offline.js.map +1 -0
- package/dist/domain/design/profiles.js +212 -0
- package/dist/domain/design/profiles.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/proposal.js +234 -0
- package/dist/domain/design/proposal.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/render-bundle.js +0 -0
- package/dist/domain/design/render-bundle.js.map +1 -0
- package/dist/domain/design/rendition.js +472 -0
- package/dist/domain/design/rendition.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/sources.js +180 -0
- package/dist/domain/design/sources.js.map +1 -0
- package/dist/domain/design/validation.js +19 -0
- package/dist/domain/design/validation.js.map +1 -0
- package/dist/domain/design/visual-evidence.js +155 -0
- package/dist/domain/design/visual-evidence.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/flow/answer.js +459 -0
- package/dist/domain/flow/answer.js.map +1 -0
- package/dist/domain/flow/authority.js +2276 -0
- package/dist/domain/flow/authority.js.map +1 -0
- package/dist/domain/flow/authorization.js +62 -0
- package/dist/domain/flow/authorization.js.map +1 -0
- package/dist/domain/flow/directive.js +421 -0
- package/dist/domain/flow/directive.js.map +1 -0
- package/dist/domain/flow/rules.js +140 -0
- package/dist/domain/flow/rules.js.map +1 -0
- package/dist/domain/flow/run-state.js +317 -0
- package/dist/domain/flow/run-state.js.map +1 -0
- package/dist/domain/harnesses.js +21 -0
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/safe-path.js +23 -0
- package/dist/domain/safe-path.js.map +1 -0
- package/dist/domain/skills.js +26 -3
- package/dist/domain/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +15 -13
- 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 +57 -9
- package/skills/w/harness/HARNESS.md +20 -0
- package/skills/w/loops/CHASSIS.md +11 -20
- package/skills/w/loops/CODE-POLICIES.md +18 -9
- package/skills/w/loops/README.md +1 -1
- package/skills/w/loops/plan-exec-loop/LOOP.md +126 -62
- package/skills/w/loops/plan-new-loop/LOOP.md +71 -73
- package/skills/w/loops/plan-refine-loop/LOOP.md +20 -10
- package/skills/w/loops/quick-loop/LOOP.md +18 -26
- package/skills/w/loops/spec-refine-loop/LOOP.md +28 -30
- package/skills/w/modules/COMPACTION.md +2 -6
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +2 -0
- package/skills/w/modules/DESIGN-REFERENCES.md +113 -0
- package/skills/w/modules/IDEATION-GATE.md +3 -3
- package/skills/w/modules/PERSIST-ROUTING.md +1 -0
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +65 -0
- package/skills/w/modules/PLAN-INPUT.md +5 -3
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +3 -1
- package/skills/w/modules/PLAN-SPLIT-GATE.md +7 -5
- package/skills/w/modules/PROMPT-CONTINUITY.md +3 -1
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +4 -4
- package/skills/w/roles/README.md +9 -5
- package/skills/w/roles/design/CONTRACT.md +80 -0
- package/skills/w/roles/design/ROLE.md +224 -0
- package/skills/w/schemas/capability-descriptor.schema.json +260 -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-render-bundle.v1.schema.json +191 -0
- package/skills/w/schemas/design/design-rendition.v1.schema.json +232 -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 +242 -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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The other half of the elevated `handoff` gate: does the evidence a screen
|
|
3
|
+
* CITES actually show what the screen says it shows?
|
|
4
|
+
*
|
|
5
|
+
* `maturity.ts` judges the document alone — every criterion classified, the base
|
|
6
|
+
* state enumerated with a rendition. That is all one file can prove. But a
|
|
7
|
+
* reference to `DES-001/VIS-003@r1` is a claim about another document, and the
|
|
8
|
+
* whole point of requiring visual evidence is defeated if the reference is enough
|
|
9
|
+
* on its own: a screen could cite a rendition of a different screen, of an older
|
|
10
|
+
* revision, or one that covers nothing at all, and pass.
|
|
11
|
+
*
|
|
12
|
+
* So this crosses the two directions of the same matrix. The screen says *this
|
|
13
|
+
* criterion is shown here*; the rendition says *I cover these criteria and these
|
|
14
|
+
* states, and I came out of these revisions*. Both have to agree, and the
|
|
15
|
+
* rendition is the one that has to back the claim up.
|
|
16
|
+
*
|
|
17
|
+
* It lives in the domain and takes a reader, so the caller decides how documents
|
|
18
|
+
* are loaded — and it is called from the publication path, where a revision is
|
|
19
|
+
* about to be sealed and there is still time to refuse.
|
|
20
|
+
*/
|
|
21
|
+
/** Formats a person can open with no provider, no account and no network. */
|
|
22
|
+
const STATIC_PREVIEW_FORMATS = ["svg", "png", "jpeg", "webp", "pdf"];
|
|
23
|
+
/**
|
|
24
|
+
* Cross the screen's classification matrix against the renditions it cites.
|
|
25
|
+
*
|
|
26
|
+
* Only for a screen claiming `handoff`: an `outline` may cite a rendition that is
|
|
27
|
+
* still being drawn, and refusing that would make the early profile unusable.
|
|
28
|
+
*/
|
|
29
|
+
export function crossVisualEvidence(catalog, screen, file, readRendition) {
|
|
30
|
+
if (screen.maturity !== "handoff")
|
|
31
|
+
return [];
|
|
32
|
+
const failures = [];
|
|
33
|
+
const loaded = new Map();
|
|
34
|
+
let cited = 0;
|
|
35
|
+
for (const entry of screen.trace) {
|
|
36
|
+
if (entry.classification === null || entry.classification === "not_visual")
|
|
37
|
+
continue;
|
|
38
|
+
for (const ref of entry.renditions) {
|
|
39
|
+
cited += 1;
|
|
40
|
+
const rendition = resolve(catalog, ref, file, readRendition, loaded, failures);
|
|
41
|
+
if (rendition === null)
|
|
42
|
+
continue;
|
|
43
|
+
failures.push(...checkBacksClaim(screen, entry, ref, rendition, file));
|
|
44
|
+
}
|
|
45
|
+
if (entry.classification === "interaction") {
|
|
46
|
+
failures.push(...checkInteractionEvidence(entry, loaded, file));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Si NINGUNA cita se pudo cargar, la causa ya está dicha: agregar «no hay
|
|
50
|
+
// preview estática» sería un segundo diagnóstico del mismo problema, y el
|
|
51
|
+
// primero es el que se arregla.
|
|
52
|
+
if (cited > 0 && loaded.size === 0)
|
|
53
|
+
return failures;
|
|
54
|
+
failures.push(...checkStaticPreview(screen, loaded, file));
|
|
55
|
+
return failures;
|
|
56
|
+
}
|
|
57
|
+
/** Load a cited rendition once, reporting the two ways a citation can dangle. */
|
|
58
|
+
function resolve(catalog, ref, file, readRendition, loaded, failures) {
|
|
59
|
+
const cached = loaded.get(ref);
|
|
60
|
+
if (cached !== undefined)
|
|
61
|
+
return cached;
|
|
62
|
+
const [, tail] = ref.split("/");
|
|
63
|
+
const [id, revision] = (tail ?? "").split("@r");
|
|
64
|
+
const entry = catalog.find((e) => e.id === id && e.revision === Number(revision));
|
|
65
|
+
if (entry === undefined) {
|
|
66
|
+
failures.push({
|
|
67
|
+
code: "DESIGN_REFERENCE_MISSING",
|
|
68
|
+
artifact: file,
|
|
69
|
+
message: `cita ${ref} como evidencia y el catálogo no la contiene`,
|
|
70
|
+
action: "publicá esa rendition dentro del package, o citá una que exista",
|
|
71
|
+
});
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const rendition = readRendition(entry.path);
|
|
75
|
+
if (rendition === null) {
|
|
76
|
+
failures.push({
|
|
77
|
+
code: "DESIGN_REFERENCE_FILE_MISSING",
|
|
78
|
+
artifact: file,
|
|
79
|
+
message: `cita ${ref} y su '${entry.path}' no se pudo leer como una rendition válida`,
|
|
80
|
+
action: "reparalo: una evidencia que no se puede abrir no evidencia nada",
|
|
81
|
+
});
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
loaded.set(ref, rendition);
|
|
85
|
+
return rendition;
|
|
86
|
+
}
|
|
87
|
+
/** The three ways a cited rendition can fail to back the claim made about it. */
|
|
88
|
+
function checkBacksClaim(screen, entry, ref, rendition, file) {
|
|
89
|
+
const insufficient = (message, action) => ({
|
|
90
|
+
code: "DESIGN_VISUAL_EVIDENCE_REQUIRED",
|
|
91
|
+
artifact: file,
|
|
92
|
+
message: `trace['${entry.criterion}'] cita ${ref}, que ${message}`,
|
|
93
|
+
action,
|
|
94
|
+
});
|
|
95
|
+
const failures = [];
|
|
96
|
+
// Que salió de ESTA revisión, no de otra que se le parece: una preview de r1
|
|
97
|
+
// presentada como evidencia de r2 es precisamente el snapshot confundido con
|
|
98
|
+
// algo más reciente que AC-REN-07 nombra.
|
|
99
|
+
const mine = `${screen.id}@r${screen.revision}`;
|
|
100
|
+
if (!rendition.sources.some((s) => s.ref === mine || s.ref.startsWith(`${mine}#`))) {
|
|
101
|
+
failures.push(insufficient(`no salió de ${mine} (declara ${rendition.sources.map((s) => s.ref).join(", ")})`, "regenerá la rendition sobre esta revisión, o citá la que sí salió de ella"));
|
|
102
|
+
}
|
|
103
|
+
if (!rendition.coverage.criteria.includes(entry.criterion)) {
|
|
104
|
+
failures.push(insufficient(`no declara cubrir '${entry.criterion}'`, "agregá el criterio a 'coverage.criteria' de la rendition, o citá otra que lo muestre"));
|
|
105
|
+
}
|
|
106
|
+
const uncovered = entry.states.filter((s) => !rendition.coverage.states.includes(s));
|
|
107
|
+
if (uncovered.length > 0 && rendition.coverage.states.length > 0) {
|
|
108
|
+
failures.push(insufficient(`no cubre ${uncovered.join(", ")}`, "cubrí esos estados en la rendition, o citá una adicional para ellos"));
|
|
109
|
+
}
|
|
110
|
+
return failures;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* AC-REN-02, last clause: an `interaction` entry evidences trigger, transition
|
|
114
|
+
* and outcome. A picture of the end state is not that, so at least one of the
|
|
115
|
+
* renditions it cites has to be the prototype or storyboard that shows it.
|
|
116
|
+
*/
|
|
117
|
+
function checkInteractionEvidence(entry, loaded, file) {
|
|
118
|
+
const cited = entry.renditions.map((ref) => loaded.get(ref)).filter((r) => r !== undefined);
|
|
119
|
+
if (cited.length === 0)
|
|
120
|
+
return []; // ya reportado como cita colgante
|
|
121
|
+
if (cited.some((r) => r.interaction_evidence !== null))
|
|
122
|
+
return [];
|
|
123
|
+
return [
|
|
124
|
+
{
|
|
125
|
+
code: "DESIGN_VISUAL_EVIDENCE_REQUIRED",
|
|
126
|
+
artifact: file,
|
|
127
|
+
message: `trace['${entry.criterion}'] es 'interaction' y ninguna de sus renditions evidencia trigger, transición y outcome`,
|
|
128
|
+
action: "agregá un prototipo o un storyboard estático con 'interaction_evidence', o reclasificá el criterio como 'visual'",
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* AC-REN-01: the base state survives without the provider.
|
|
134
|
+
*
|
|
135
|
+
* The document-level gate already demanded that some criterion enumerate
|
|
136
|
+
* `default_state` with a rendition. What it could not check is whether that
|
|
137
|
+
* rendition is one a person can OPEN — an `interactive_html` behind a private
|
|
138
|
+
* Figma link is a citation, not a preview.
|
|
139
|
+
*/
|
|
140
|
+
function checkStaticPreview(screen, loaded, file) {
|
|
141
|
+
const covering = [...loaded.values()].filter((r) => r.coverage.states.includes(screen.default_state) &&
|
|
142
|
+
STATIC_PREVIEW_FORMATS.includes(r.format) &&
|
|
143
|
+
r.files.length > 0);
|
|
144
|
+
if (covering.length > 0)
|
|
145
|
+
return [];
|
|
146
|
+
return [
|
|
147
|
+
{
|
|
148
|
+
code: "DESIGN_VISUAL_EVIDENCE_REQUIRED",
|
|
149
|
+
artifact: file,
|
|
150
|
+
message: `ninguna rendition citada conserva una preview estática local de '${screen.default_state}'`,
|
|
151
|
+
action: `el gate 'handoff' pasó a exigir evidencia visual local: publicá una preview en ${STATIC_PREVIEW_FORMATS.join(", ")} que cubra el estado base y citala, o bajá la screen a 'outline'`,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=visual-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visual-evidence.js","sourceRoot":"","sources":["../../../src/domain/design/visual-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The restricted YAML subset the design artifacts are authored in.
|
|
3
|
+
*
|
|
4
|
+
* Flow and Screen Specifications carry structure a flat frontmatter parser
|
|
5
|
+
* cannot express — sequences of mappings (`nodes`, `edges`, `states`, `trace`),
|
|
6
|
+
* nested mappings (`dependencies`, `not_applicable`) and flow style (`[]`,
|
|
7
|
+
* `{}`) — and no YAML engine may be added to the CLI. So this is a parser for a
|
|
8
|
+
* closed, documented subset, not a general one.
|
|
9
|
+
*
|
|
10
|
+
* The subset is deliberately small and everything outside it is REJECTED with a
|
|
11
|
+
* line number, never guessed at:
|
|
12
|
+
*
|
|
13
|
+
* accepted rejected
|
|
14
|
+
* ──────────────────────────── ─────────────────────────────
|
|
15
|
+
* key: value &anchor / *alias
|
|
16
|
+
* key: (nested block below) !tag
|
|
17
|
+
* - item (block sequence) | and > (block scalars)
|
|
18
|
+
* - key: value (seq of mappings) <<: (merge keys)
|
|
19
|
+
* [a, b] / [] (flow sequence) ? (complex keys)
|
|
20
|
+
* {a: b} / {} (flow mapping) --- / ... (multi-document)
|
|
21
|
+
* "…" / '…' / plain scalars tabs in the indentation
|
|
22
|
+
* null / ~ / true / false / 12
|
|
23
|
+
*
|
|
24
|
+
* A rejection is a better outcome than a silent misread: the author gets told
|
|
25
|
+
* which line and which form to use instead.
|
|
26
|
+
*/
|
|
27
|
+
const KEY = /^([A-Za-z0-9_][A-Za-z0-9_-]*):(?:\s+(.*))?$/;
|
|
28
|
+
/** Canonical decimal only. `007`, `+2`, `1_000` and `0x10` stay strings, so a
|
|
29
|
+
* field that wanted a number fails loudly instead of being coerced in silence. */
|
|
30
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: rejecting them is the point
|
|
31
|
+
const CONTROL_CHAR = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/;
|
|
32
|
+
const INTEGER = /^-?(0|[1-9]\d*)$/;
|
|
33
|
+
class Rejected extends Error {
|
|
34
|
+
line;
|
|
35
|
+
why;
|
|
36
|
+
constructor(line, why) {
|
|
37
|
+
super(why);
|
|
38
|
+
this.line = line;
|
|
39
|
+
this.why = why;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Guards against pathological input: a recursive parser must diagnose, not crash. */
|
|
43
|
+
const MAX_BYTES = 64 * 1024;
|
|
44
|
+
const MAX_LINES = 1500;
|
|
45
|
+
const MAX_DEPTH = 8;
|
|
46
|
+
export function parseYamlSubset(source) {
|
|
47
|
+
if (Buffer.byteLength(source, "utf8") > MAX_BYTES) {
|
|
48
|
+
return { ok: false, line: 1, why: `el frontmatter supera ${MAX_BYTES} bytes` };
|
|
49
|
+
}
|
|
50
|
+
let lines;
|
|
51
|
+
try {
|
|
52
|
+
lines = scan(source);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof Rejected)
|
|
56
|
+
return { ok: false, line: err.line, why: err.why };
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
if (lines.length > MAX_LINES) {
|
|
60
|
+
return { ok: false, line: MAX_LINES, why: `el frontmatter supera ${MAX_LINES} líneas` };
|
|
61
|
+
}
|
|
62
|
+
if (lines.length === 0)
|
|
63
|
+
return { ok: true, value: {} };
|
|
64
|
+
try {
|
|
65
|
+
const first = lines[0];
|
|
66
|
+
if (first.indent !== 0) {
|
|
67
|
+
throw new Rejected(first.n, "el documento arranca indentado");
|
|
68
|
+
}
|
|
69
|
+
const [value, next] = parseMapping(lines, 0, 0);
|
|
70
|
+
if (next < lines.length) {
|
|
71
|
+
throw new Rejected(lines[next].n, "indentación inesperada: la clave no cierra su bloque");
|
|
72
|
+
}
|
|
73
|
+
return { ok: true, value };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof Rejected)
|
|
77
|
+
return { ok: false, line: err.line, why: err.why };
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Drop blanks and comments, measure indentation, and reject what the subset excludes. */
|
|
82
|
+
function scan(source) {
|
|
83
|
+
const out = [];
|
|
84
|
+
// Editors add a BOM without asking. It changes no value, so it is stripped
|
|
85
|
+
// rather than rejected — punishing an author for their editor helps nobody.
|
|
86
|
+
const raw = source.replace(/^\uFEFF/, "").split(/\r?\n/);
|
|
87
|
+
for (let i = 0; i < raw.length; i++) {
|
|
88
|
+
const line = raw[i];
|
|
89
|
+
const n = i + 1;
|
|
90
|
+
if (/^\s*$/.test(line))
|
|
91
|
+
continue;
|
|
92
|
+
if (/^\s*#/.test(line))
|
|
93
|
+
continue;
|
|
94
|
+
if (line.includes("\t"))
|
|
95
|
+
throw new Rejected(n, "usa tabulaciones; indentá con espacios");
|
|
96
|
+
// An invisible C0 character inside a normative field is bytes that look like
|
|
97
|
+
// one value and are another. The contract exists to remove that class of
|
|
98
|
+
// ambiguity, so it is a rejection, not a silent pass-through.
|
|
99
|
+
if (CONTROL_CHAR.test(line)) {
|
|
100
|
+
throw new Rejected(n, "contiene un carácter de control invisible");
|
|
101
|
+
}
|
|
102
|
+
const text = stripComment(line).trimEnd();
|
|
103
|
+
if (text.trim().length === 0)
|
|
104
|
+
continue;
|
|
105
|
+
const indent = text.length - text.trimStart().length;
|
|
106
|
+
const body = text.trimStart();
|
|
107
|
+
rejectUnsupported(body, n);
|
|
108
|
+
out.push({ n, indent, text: body });
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A `#` only opens a comment at the start or after whitespace, and never inside
|
|
114
|
+
* quotes. `entry: DES-001/SCR-001@r2#default` has to survive intact — the state
|
|
115
|
+
* anchor is the single most referenced form in the whole contract.
|
|
116
|
+
*/
|
|
117
|
+
function stripComment(raw) {
|
|
118
|
+
let single = false;
|
|
119
|
+
let double = false;
|
|
120
|
+
for (let i = 0; i < raw.length; i++) {
|
|
121
|
+
const c = raw[i];
|
|
122
|
+
// A quote only OPENS a string where a scalar could start. Otherwise `it's a
|
|
123
|
+
// form # nota` would look quoted from the apostrophe on, and the comment
|
|
124
|
+
// would survive into the value.
|
|
125
|
+
const opens = i === 0 || /[\s:,[{-]/.test(raw[i - 1]);
|
|
126
|
+
if (c === "'" && !double && (single || opens))
|
|
127
|
+
single = !single;
|
|
128
|
+
else if (c === '"' && !single && (double || opens))
|
|
129
|
+
double = !double;
|
|
130
|
+
else if (c === "#" && !single && !double && (i === 0 || /\s/.test(raw[i - 1]))) {
|
|
131
|
+
return raw.slice(0, i);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return raw;
|
|
135
|
+
}
|
|
136
|
+
function rejectUnsupported(body, n) {
|
|
137
|
+
if (body === "---" || body === "...") {
|
|
138
|
+
throw new Rejected(n, "el frontmatter es un único documento: no admite '---' ni '...' internos");
|
|
139
|
+
}
|
|
140
|
+
if (body.startsWith("? "))
|
|
141
|
+
throw new Rejected(n, "no admite claves complejas ('? ')");
|
|
142
|
+
if (body.startsWith("<<:"))
|
|
143
|
+
throw new Rejected(n, "no admite merge keys ('<<:')");
|
|
144
|
+
const value = KEY.exec(body)?.[2] ?? (body.startsWith("- ") ? body.slice(2).trim() : null);
|
|
145
|
+
if (value === null || value.length === 0)
|
|
146
|
+
return;
|
|
147
|
+
if (value === "|" || value === ">" || /^[|>][+-]?$/.test(value)) {
|
|
148
|
+
throw new Rejected(n, "no admite block scalars ('|', '>'): escribí el texto en una línea o en el cuerpo");
|
|
149
|
+
}
|
|
150
|
+
if (value.startsWith("&"))
|
|
151
|
+
throw new Rejected(n, "no admite anclas YAML ('&')");
|
|
152
|
+
if (value.startsWith("*"))
|
|
153
|
+
throw new Rejected(n, "no admite alias YAML ('*')");
|
|
154
|
+
if (value.startsWith("!"))
|
|
155
|
+
throw new Rejected(n, "no admite tags YAML ('!')");
|
|
156
|
+
}
|
|
157
|
+
/** Parse consecutive `key: …` lines at `indent`. Returns the mapping and the next index. */
|
|
158
|
+
function parseMapping(lines, start, indent) {
|
|
159
|
+
// Null prototype on purpose: with a plain object a key called `__proto__`
|
|
160
|
+
// would REWRITE the prototype instead of becoming a property, and
|
|
161
|
+
// `constructor`/`toString` would read as duplicates of something nobody wrote.
|
|
162
|
+
const out = Object.create(null);
|
|
163
|
+
let i = start;
|
|
164
|
+
while (i < lines.length) {
|
|
165
|
+
const line = lines[i];
|
|
166
|
+
if (line.indent < indent)
|
|
167
|
+
break;
|
|
168
|
+
if (line.indent > indent) {
|
|
169
|
+
throw new Rejected(line.n, "indentación inesperada dentro de un mapping");
|
|
170
|
+
}
|
|
171
|
+
const match = KEY.exec(line.text);
|
|
172
|
+
if (match === null) {
|
|
173
|
+
throw new Rejected(line.n, `se esperaba 'clave: valor' y llegó '${line.text}'`);
|
|
174
|
+
}
|
|
175
|
+
const key = match[1];
|
|
176
|
+
if (key in out)
|
|
177
|
+
throw new Rejected(line.n, `la clave '${key}' está repetida`);
|
|
178
|
+
const inline = (match[2] ?? "").trim();
|
|
179
|
+
if (inline.length > 0) {
|
|
180
|
+
out[key] = parseScalarOrFlow(inline, line.n);
|
|
181
|
+
i += 1;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (indent > MAX_DEPTH * 2) {
|
|
185
|
+
throw new Rejected(line.n, `anidamiento mayor a ${MAX_DEPTH} niveles`);
|
|
186
|
+
}
|
|
187
|
+
const [value, next] = parseNested(lines, i + 1, indent);
|
|
188
|
+
out[key] = value;
|
|
189
|
+
i = next;
|
|
190
|
+
}
|
|
191
|
+
return [out, i];
|
|
192
|
+
}
|
|
193
|
+
/** The block that belongs to a `key:` with no inline value. */
|
|
194
|
+
function parseNested(lines, start, parentIndent) {
|
|
195
|
+
const next = lines[start];
|
|
196
|
+
// A key with nothing under it is an explicit null, not an error: `unknowns:`
|
|
197
|
+
// and `unknowns: []` have to mean the same thing to an author.
|
|
198
|
+
if (next === undefined || next.indent < parentIndent)
|
|
199
|
+
return [null, start];
|
|
200
|
+
// YAML lets a sequence sit at its parent key's own indentation.
|
|
201
|
+
if (next.text.startsWith("- ") || next.text === "-") {
|
|
202
|
+
return parseSequence(lines, start, next.indent);
|
|
203
|
+
}
|
|
204
|
+
// A sibling key at the same indentation means the value was simply empty.
|
|
205
|
+
if (next.indent === parentIndent)
|
|
206
|
+
return [null, start];
|
|
207
|
+
return parseMapping(lines, start, next.indent);
|
|
208
|
+
}
|
|
209
|
+
function parseSequence(lines, start, indent) {
|
|
210
|
+
const out = [];
|
|
211
|
+
let i = start;
|
|
212
|
+
while (i < lines.length) {
|
|
213
|
+
const line = lines[i];
|
|
214
|
+
if (line.indent < indent)
|
|
215
|
+
break;
|
|
216
|
+
// A sequence may sit at its own key's indentation, so the next sibling key
|
|
217
|
+
// arrives at exactly this column. That ENDS the sequence — it is not an
|
|
218
|
+
// error. Anything else at this column is.
|
|
219
|
+
if (!isSequenceItem(line)) {
|
|
220
|
+
if (line.indent === indent && KEY.test(line.text))
|
|
221
|
+
break;
|
|
222
|
+
throw new Rejected(line.n, "se esperaba un ítem de secuencia ('- …')");
|
|
223
|
+
}
|
|
224
|
+
if (line.indent > indent) {
|
|
225
|
+
throw new Rejected(line.n, "se esperaba un ítem de secuencia ('- …')");
|
|
226
|
+
}
|
|
227
|
+
if (line.text === "-") {
|
|
228
|
+
throw new Rejected(line.n, "ítem de secuencia vacío: escribí el valor en la misma línea");
|
|
229
|
+
}
|
|
230
|
+
const content = line.text.slice(2).trimStart();
|
|
231
|
+
const offset = line.indent + line.text.length - content.length;
|
|
232
|
+
if (KEY.exec(content) === null) {
|
|
233
|
+
out.push(parseScalarOrFlow(content, line.n));
|
|
234
|
+
i += 1;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// `- id: x` starts a mapping whose indentation is where `id` begins. Rewriting
|
|
238
|
+
// the dash as spaces makes it an ordinary mapping block, which is exactly
|
|
239
|
+
// what it is — and keeps one code path for `- k: v` and its continuation lines.
|
|
240
|
+
const rewritten = [...lines];
|
|
241
|
+
rewritten[i] = { n: line.n, indent: offset, text: content };
|
|
242
|
+
const [value, next] = parseMapping(rewritten, i, offset);
|
|
243
|
+
out.push(value);
|
|
244
|
+
i = next;
|
|
245
|
+
}
|
|
246
|
+
return [out, i];
|
|
247
|
+
}
|
|
248
|
+
function isSequenceItem(line) {
|
|
249
|
+
return line.text.startsWith("- ") || line.text === "-";
|
|
250
|
+
}
|
|
251
|
+
function parseScalarOrFlow(raw, n) {
|
|
252
|
+
const text = raw.trim();
|
|
253
|
+
if (text.startsWith("[") || text.startsWith("{")) {
|
|
254
|
+
const [value, rest] = parseFlow(text, n, 0);
|
|
255
|
+
if (rest.trim().length > 0) {
|
|
256
|
+
throw new Rejected(n, `sobra contenido después del valor: '${rest.trim()}'`);
|
|
257
|
+
}
|
|
258
|
+
return value;
|
|
259
|
+
}
|
|
260
|
+
return parseScalar(text, n);
|
|
261
|
+
}
|
|
262
|
+
/** Flow style — returns the value plus whatever is left of the string. */
|
|
263
|
+
function parseFlow(text, n, depth) {
|
|
264
|
+
if (depth > MAX_DEPTH) {
|
|
265
|
+
throw new Rejected(n, `anidamiento mayor a ${MAX_DEPTH} niveles`);
|
|
266
|
+
}
|
|
267
|
+
if (text.startsWith("["))
|
|
268
|
+
return parseFlowSeq(text.slice(1), n, depth + 1);
|
|
269
|
+
if (text.startsWith("{"))
|
|
270
|
+
return parseFlowMap(text.slice(1), n, depth + 1);
|
|
271
|
+
const [token, rest] = takeFlowToken(text, n);
|
|
272
|
+
return [parseScalar(token, n), rest];
|
|
273
|
+
}
|
|
274
|
+
function parseFlowSeq(input, n, depth) {
|
|
275
|
+
const out = [];
|
|
276
|
+
let rest = input.trimStart();
|
|
277
|
+
if (rest.startsWith("]"))
|
|
278
|
+
return [out, rest.slice(1)];
|
|
279
|
+
for (;;) {
|
|
280
|
+
// `[a, ]` and `[,]` used to yield a null nobody wrote. An empty slot is a
|
|
281
|
+
// typo, and the diagnostic belongs here — not three layers up as a type error.
|
|
282
|
+
if (rest.startsWith(",") || rest.startsWith("]")) {
|
|
283
|
+
throw new Rejected(n, "ítem vacío en una secuencia de flow style");
|
|
284
|
+
}
|
|
285
|
+
const [value, after] = parseFlow(rest.trimStart(), n, depth);
|
|
286
|
+
out.push(value);
|
|
287
|
+
rest = after.trimStart();
|
|
288
|
+
if (rest.startsWith(",")) {
|
|
289
|
+
rest = rest.slice(1).trimStart();
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (rest.startsWith("]"))
|
|
293
|
+
return [out, rest.slice(1)];
|
|
294
|
+
throw new Rejected(n, "secuencia en flow style sin cerrar: falta ',' o ']'");
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function parseFlowMap(input, n, depth) {
|
|
298
|
+
const out = Object.create(null);
|
|
299
|
+
let rest = input.trimStart();
|
|
300
|
+
if (rest.startsWith("}"))
|
|
301
|
+
return [out, rest.slice(1)];
|
|
302
|
+
for (;;) {
|
|
303
|
+
const colon = findFlowColon(rest, n);
|
|
304
|
+
const key = parseScalar(rest.slice(0, colon).trim(), n);
|
|
305
|
+
if (typeof key !== "string" || key.length === 0) {
|
|
306
|
+
throw new Rejected(n, "clave de mapping en flow style vacía o no textual");
|
|
307
|
+
}
|
|
308
|
+
if (key in out)
|
|
309
|
+
throw new Rejected(n, `la clave '${key}' está repetida`);
|
|
310
|
+
const [value, after] = parseFlow(rest.slice(colon + 1).trimStart(), n, depth);
|
|
311
|
+
out[key] = value;
|
|
312
|
+
rest = after.trimStart();
|
|
313
|
+
if (rest.startsWith(",")) {
|
|
314
|
+
rest = rest.slice(1).trimStart();
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (rest.startsWith("}"))
|
|
318
|
+
return [out, rest.slice(1)];
|
|
319
|
+
throw new Rejected(n, "mapping en flow style sin cerrar: falta ',' o '}'");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function findFlowColon(text, n) {
|
|
323
|
+
let single = false;
|
|
324
|
+
let double = false;
|
|
325
|
+
for (let i = 0; i < text.length; i++) {
|
|
326
|
+
const c = text[i];
|
|
327
|
+
if (c === "'" && !double)
|
|
328
|
+
single = !single;
|
|
329
|
+
else if (c === '"' && !single)
|
|
330
|
+
double = !double;
|
|
331
|
+
else if (c === ":" && !single && !double)
|
|
332
|
+
return i;
|
|
333
|
+
}
|
|
334
|
+
throw new Rejected(n, "mapping en flow style sin ':' entre clave y valor");
|
|
335
|
+
}
|
|
336
|
+
/** A scalar inside flow style ends at the first unquoted `,`, `]` or `}`. */
|
|
337
|
+
function takeFlowToken(text, n) {
|
|
338
|
+
if (text.startsWith('"') || text.startsWith("'"))
|
|
339
|
+
return takeQuoted(text, n);
|
|
340
|
+
const end = text.search(/[,\]}]/);
|
|
341
|
+
if (end === -1)
|
|
342
|
+
return [text, ""];
|
|
343
|
+
return [text.slice(0, end), text.slice(end)];
|
|
344
|
+
}
|
|
345
|
+
/** A quoted scalar ends at its closing quote — `\"` and `''` do not close it. */
|
|
346
|
+
function takeQuoted(text, n) {
|
|
347
|
+
const quote = text[0];
|
|
348
|
+
for (let i = 1; i < text.length; i++) {
|
|
349
|
+
if (text[i] === "\\" && quote === '"') {
|
|
350
|
+
i += 1;
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (text[i] !== quote)
|
|
354
|
+
continue;
|
|
355
|
+
if (quote === "'" && text[i + 1] === "'") {
|
|
356
|
+
i += 1;
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
return [text.slice(0, i + 1), text.slice(i + 1)];
|
|
360
|
+
}
|
|
361
|
+
throw new Rejected(n, "comilla sin cerrar");
|
|
362
|
+
}
|
|
363
|
+
function parseScalar(text, n) {
|
|
364
|
+
if (text.length === 0 || text === "null" || text === "~")
|
|
365
|
+
return null;
|
|
366
|
+
// The single place every scalar passes through, so the node-level YAML
|
|
367
|
+
// constructs are rejected HERE — a line-level check missed them inside
|
|
368
|
+
// sequence items and flow style, where they read as ordinary text.
|
|
369
|
+
const marker = { "&": "anclas YAML ('&')", "*": "alias YAML ('*')", "!": "tags YAML ('!')" }[text[0]];
|
|
370
|
+
if (marker !== undefined)
|
|
371
|
+
throw new Rejected(n, `no admite ${marker}`);
|
|
372
|
+
if (text.startsWith('"')) {
|
|
373
|
+
if (!text.endsWith('"') || text.length < 2)
|
|
374
|
+
throw new Rejected(n, "comilla doble sin cerrar");
|
|
375
|
+
return text.slice(1, -1).replace(/\\n/g, "\n").replace(/\\"/g, '"').replace(/\\\\/g, "\\");
|
|
376
|
+
}
|
|
377
|
+
if (text.startsWith("'")) {
|
|
378
|
+
if (!text.endsWith("'") || text.length < 2)
|
|
379
|
+
throw new Rejected(n, "comilla simple sin cerrar");
|
|
380
|
+
return text.slice(1, -1).replace(/''/g, "'");
|
|
381
|
+
}
|
|
382
|
+
if (text === "true")
|
|
383
|
+
return true;
|
|
384
|
+
if (text === "false")
|
|
385
|
+
return false;
|
|
386
|
+
if (INTEGER.test(text))
|
|
387
|
+
return Number(text);
|
|
388
|
+
return text;
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=yaml-subset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml-subset.js","sourceRoot":"","sources":["../../../src/domain/design/yaml-subset.ts"],"names":[],"mappings":"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"}
|