@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,472 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { canonicalJson } from "../../application/semantic-operation/protocol.js";
|
|
3
|
+
import { checkSafeRelativePath } from "../safe-path.js";
|
|
4
|
+
import { CANONICAL_SCHEMAS } from "./capability.js";
|
|
5
|
+
import { GRAMMAR, isDigest, isRevision, parseArtifactId, parseArtifactRef } from "./identity.js";
|
|
6
|
+
import { secretFailures } from "./secrets.js";
|
|
7
|
+
import { Reader, eachRecord, isNonEmptyString, isRecord, } from "./validation.js";
|
|
8
|
+
/**
|
|
9
|
+
* `renditions/VIS-NNN-rNNN-<slug>/rendition.json` — what a picture of a design
|
|
10
|
+
* knows about itself.
|
|
11
|
+
*
|
|
12
|
+
* v21.0.0 already reserved the place and the name; what was missing is the only
|
|
13
|
+
* part that makes a rendition trustworthy: **which revision it came out of**.
|
|
14
|
+
* Without it a package accumulates images that look current forever, and the
|
|
15
|
+
* oldest screenshot in the folder is indistinguishable from the newest.
|
|
16
|
+
*
|
|
17
|
+
* So the contract is built around three separations that must never collapse:
|
|
18
|
+
*
|
|
19
|
+
* - **Fidelity is not maturity.** `high` says the picture is polished; it says
|
|
20
|
+
* nothing about whether the screen is implementable. Raising one must never
|
|
21
|
+
* move the other, and they live in different documents for that reason.
|
|
22
|
+
* - **Staleness against the SOURCE is derived; sync with the PROVIDER is not.**
|
|
23
|
+
* `source_digest` is computed from the bytes of the revisions this rendition
|
|
24
|
+
* was cut from, so anybody can recompute it and see that the screen moved on.
|
|
25
|
+
* Whether Figma's copy still matches cannot be derived from here at all — it is
|
|
26
|
+
* a claim, and it lives inside `provider` where it is obviously one.
|
|
27
|
+
* - **A locator locates; it never identifies.** `file_key`, `node_id`,
|
|
28
|
+
* `artifact` — none of them replace the Workline id, revision or digest, and
|
|
29
|
+
* none of them may carry a credential.
|
|
30
|
+
*/
|
|
31
|
+
export const DESIGN_RENDITION_SCHEMA_ID = CANONICAL_SCHEMAS.rendition;
|
|
32
|
+
const MEDIA = [
|
|
33
|
+
"static_image",
|
|
34
|
+
"document",
|
|
35
|
+
"interactive_html",
|
|
36
|
+
"prototype",
|
|
37
|
+
"storyboard",
|
|
38
|
+
];
|
|
39
|
+
/** The two media that can show a trigger, a transition and an outcome. */
|
|
40
|
+
const INTERACTIVE_MEDIA = ["prototype", "storyboard"];
|
|
41
|
+
const FIDELITIES = ["low", "medium", "high"];
|
|
42
|
+
const FORMATS = ["svg", "png", "jpeg", "webp", "pdf", "html"];
|
|
43
|
+
/** Accepted file extensions per format — `format` must match what is on disk. */
|
|
44
|
+
const EXTENSIONS = {
|
|
45
|
+
svg: [".svg"],
|
|
46
|
+
png: [".png"],
|
|
47
|
+
jpeg: [".jpg", ".jpeg"],
|
|
48
|
+
webp: [".webp"],
|
|
49
|
+
pdf: [".pdf"],
|
|
50
|
+
html: [".html"],
|
|
51
|
+
};
|
|
52
|
+
const ACCESS = [
|
|
53
|
+
"local_only",
|
|
54
|
+
"public",
|
|
55
|
+
"link_shared",
|
|
56
|
+
"team",
|
|
57
|
+
"private",
|
|
58
|
+
];
|
|
59
|
+
const SYNCS = ["in_sync", "diverged", "unknown"];
|
|
60
|
+
export const ALLOWED_KEYS = {
|
|
61
|
+
"": [
|
|
62
|
+
"schema",
|
|
63
|
+
"id",
|
|
64
|
+
"revision",
|
|
65
|
+
"supersedes",
|
|
66
|
+
"purpose",
|
|
67
|
+
"medium",
|
|
68
|
+
"fidelity",
|
|
69
|
+
"tool",
|
|
70
|
+
"format",
|
|
71
|
+
"context",
|
|
72
|
+
"sources",
|
|
73
|
+
"source_digest",
|
|
74
|
+
"coverage",
|
|
75
|
+
"files",
|
|
76
|
+
"provider",
|
|
77
|
+
"access",
|
|
78
|
+
"interaction_evidence",
|
|
79
|
+
"data_classification",
|
|
80
|
+
],
|
|
81
|
+
context: ["platform", "viewport", "theme", "locale", "variants"],
|
|
82
|
+
"sources[]": ["ref", "sha256"],
|
|
83
|
+
coverage: ["criteria", "states"],
|
|
84
|
+
"files[]": ["path", "sha256"],
|
|
85
|
+
provider: ["name", "locator", "version", "sync"],
|
|
86
|
+
interaction_evidence: ["trigger", "transition", "outcome"],
|
|
87
|
+
};
|
|
88
|
+
const ANCHOR_RE = new RegExp(`^${GRAMMAR.anchor}$`);
|
|
89
|
+
const CRITERION_RE = /^S\d{3}\/AC-(?:[A-Z]+-)?\d+$/;
|
|
90
|
+
const DATA_CLASSIFICATIONS = ["synthetic", "redacted", "real"];
|
|
91
|
+
/**
|
|
92
|
+
* The staleness token: one digest over every source this rendition saw.
|
|
93
|
+
*
|
|
94
|
+
* Sorted and canonicalized so the same set of sources always produces the same
|
|
95
|
+
* token, and computed over the pairs rather than over the refs alone — a
|
|
96
|
+
* rendition of `SCR-001@r2` is stale when the BYTES of r2 changed, not only when
|
|
97
|
+
* somebody published r3.
|
|
98
|
+
*/
|
|
99
|
+
export function computeSourceDigest(sources) {
|
|
100
|
+
const sorted = [...sources].sort((a, b) => (a.ref < b.ref ? -1 : a.ref > b.ref ? 1 : 0));
|
|
101
|
+
const input = canonicalJson(sorted.map((s) => ({ ref: s.ref, sha256: s.sha256 })));
|
|
102
|
+
return `sha256:${createHash("sha256").update(input, "utf8").digest("hex")}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Did the content this was cut from move?
|
|
106
|
+
*
|
|
107
|
+
* Generic over the subject because a rendition and an external proposal ask the
|
|
108
|
+
* exact same question: I recorded these revisions with these bytes — are they
|
|
109
|
+
* still those bytes? `current` is the package as it is RIGHT NOW; comparing a
|
|
110
|
+
* record against itself would always pass, which is the failure mode this exists
|
|
111
|
+
* to prevent.
|
|
112
|
+
*/
|
|
113
|
+
export function checkSourcesStale(subject, sources, sourceDigest, current) {
|
|
114
|
+
const rebuilt = sources.map((s) => ({ ref: s.ref, sha256: current.get(s.ref) ?? "" }));
|
|
115
|
+
const actual = computeSourceDigest(rebuilt);
|
|
116
|
+
if (actual === sourceDigest)
|
|
117
|
+
return null;
|
|
118
|
+
return {
|
|
119
|
+
subject,
|
|
120
|
+
expected: sourceDigest,
|
|
121
|
+
actual,
|
|
122
|
+
moved: sources
|
|
123
|
+
.filter((s) => current.get(s.ref) !== s.sha256)
|
|
124
|
+
.map((s) => s.ref)
|
|
125
|
+
.sort(),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Is this rendition still a picture of what it claims to be? */
|
|
129
|
+
export function checkStale(rendition, current) {
|
|
130
|
+
return checkSourcesStale(`${rendition.id}@r${rendition.revision}`, rendition.sources, rendition.source_digest, current);
|
|
131
|
+
}
|
|
132
|
+
/** The stale verdict as a failure, for a caller that must refuse to go on. */
|
|
133
|
+
export function staleFailure(verdict, artifact) {
|
|
134
|
+
return {
|
|
135
|
+
code: "DESIGN_RENDITION_STALE",
|
|
136
|
+
artifact,
|
|
137
|
+
message: `${verdict.subject} se generó desde un contenido que ya cambió (${verdict.moved.join(", ") || "sus fuentes"})`,
|
|
138
|
+
action: "regenerá la rendition sobre la revisión vigente, o registrala contra la revisión de la que realmente salió",
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export function validateDesignRendition(raw, artifact) {
|
|
142
|
+
const r = new Reader(ALLOWED_KEYS);
|
|
143
|
+
if (!isRecord(raw)) {
|
|
144
|
+
r.fail("DESIGN_RENDITION_NOT_OBJECT", artifact, "la rendition no es un objeto JSON", `reescribí '${artifact}' como un único objeto JSON conforme a ${DESIGN_RENDITION_SCHEMA_ID}`);
|
|
145
|
+
return done(r, null);
|
|
146
|
+
}
|
|
147
|
+
const schema = r.read(raw, "schema");
|
|
148
|
+
if (schema !== DESIGN_RENDITION_SCHEMA_ID) {
|
|
149
|
+
r.fail("DESIGN_SCHEMA_UNKNOWN", artifact, `versión de formato no soportada: ${JSON.stringify(schema)}`, `este Workline entiende ${DESIGN_RENDITION_SCHEMA_ID}`);
|
|
150
|
+
return done(r, null);
|
|
151
|
+
}
|
|
152
|
+
r.closed(raw, "", artifact);
|
|
153
|
+
const rawId = r.read(raw, "id");
|
|
154
|
+
const parsedId = parseArtifactId(rawId);
|
|
155
|
+
if (parsedId === null || !parsedId.artifact.startsWith("VIS-")) {
|
|
156
|
+
r.invalid(artifact, `'id' debe ser DES-NNN/VIS-NNN y llegó ${JSON.stringify(rawId)}`, "escribí la identidad completa, por ejemplo DES-001/VIS-001");
|
|
157
|
+
}
|
|
158
|
+
const revision = r.read(raw, "revision");
|
|
159
|
+
if (!isRevision(revision)) {
|
|
160
|
+
r.invalid(artifact, "'revision' debe ser un entero >= 1", "las revisiones son lógicas y empiezan en 1");
|
|
161
|
+
}
|
|
162
|
+
const supersedes = readSupersedes(r, raw, artifact, rawId, revision);
|
|
163
|
+
const purpose = r.read(raw, "purpose");
|
|
164
|
+
if (!isNonEmptyString(purpose)) {
|
|
165
|
+
r.invalid(artifact, "'purpose' es obligatorio y no admite vacío", "escribí para qué existe esta rendition");
|
|
166
|
+
}
|
|
167
|
+
const tool = r.read(raw, "tool");
|
|
168
|
+
if (!isNonEmptyString(tool)) {
|
|
169
|
+
r.invalid(artifact, "'tool' es obligatorio", "nombrá la herramienta que la produjo");
|
|
170
|
+
}
|
|
171
|
+
const medium = readEnum(r, raw, artifact, "medium", MEDIA, "declará qué clase de artefacto es");
|
|
172
|
+
const fidelity = readEnum(r, raw, artifact, "fidelity", FIDELITIES, "la fidelidad es una propiedad de la IMAGEN y no mueve la madurez de la screen");
|
|
173
|
+
const format = readEnum(r, raw, artifact, "format", FORMATS, "declará el formato del archivo de preview");
|
|
174
|
+
const access = readEnum(r, raw, artifact, "access", ACCESS, "registrá la CLASE de acceso, nunca la credencial");
|
|
175
|
+
const classification = readEnum(r, raw, artifact, "data_classification", DATA_CLASSIFICATIONS, "el default es 'synthetic': material real exige declararlo");
|
|
176
|
+
const context = readContext(r, raw, artifact);
|
|
177
|
+
const sources = readSources(r, raw, artifact);
|
|
178
|
+
const coverage = readCoverage(r, raw, artifact);
|
|
179
|
+
const files = readFiles(r, raw, artifact, format);
|
|
180
|
+
const provider = readProvider(r, raw, artifact);
|
|
181
|
+
const evidence = readInteractionEvidence(r, raw, artifact, medium);
|
|
182
|
+
const sourceDigest = r.read(raw, "source_digest");
|
|
183
|
+
if (!isDigest(sourceDigest)) {
|
|
184
|
+
r.invalid(artifact, "'source_digest' debe ser 'sha256:' + 64 hex", "calculalo sobre la lista canónica de 'sources'");
|
|
185
|
+
}
|
|
186
|
+
else if (sources.length > 0 && sourceDigest !== computeSourceDigest(sources)) {
|
|
187
|
+
// Un token que no es el de sus propias fuentes no detecta nada: la detección
|
|
188
|
+
// de obsolescencia entera cuelga de que este digest sea recomputable.
|
|
189
|
+
r.fail("DESIGN_DIGEST_MISMATCH", artifact, `'source_digest' no es el de las fuentes declaradas (declara ${sourceDigest}, calcula ${computeSourceDigest(sources)})`, "recalculalo sobre 'sources', o corregí las fuentes que esta rendition realmente usó");
|
|
190
|
+
}
|
|
191
|
+
// Una rendition apunta a un objeto de un tercero: es el lugar más probable de
|
|
192
|
+
// todo el package para que se cuele un token de acceso.
|
|
193
|
+
for (const failure of secretFailures(raw, artifact))
|
|
194
|
+
r.failures.push(failure);
|
|
195
|
+
if (r.failures.length > 0)
|
|
196
|
+
return done(r, null);
|
|
197
|
+
return done(r, {
|
|
198
|
+
schema: DESIGN_RENDITION_SCHEMA_ID,
|
|
199
|
+
id: rawId,
|
|
200
|
+
revision: revision,
|
|
201
|
+
supersedes,
|
|
202
|
+
purpose: purpose,
|
|
203
|
+
medium: medium,
|
|
204
|
+
fidelity: fidelity,
|
|
205
|
+
tool: tool,
|
|
206
|
+
format: format,
|
|
207
|
+
context,
|
|
208
|
+
sources,
|
|
209
|
+
source_digest: sourceDigest,
|
|
210
|
+
coverage,
|
|
211
|
+
files,
|
|
212
|
+
provider,
|
|
213
|
+
access: access,
|
|
214
|
+
interaction_evidence: evidence,
|
|
215
|
+
data_classification: classification,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/** A closed vocabulary field, read and reported once. */
|
|
219
|
+
function readEnum(r, raw, artifact, field, allowed, action) {
|
|
220
|
+
const value = r.read(raw, field);
|
|
221
|
+
if (allowed.includes(value))
|
|
222
|
+
return value;
|
|
223
|
+
r.invalid(artifact, `'${field}' debe ser uno de ${allowed.join(", ")} y llegó ${JSON.stringify(value)}`, action);
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
function readSupersedes(r, raw, artifact, id, revision) {
|
|
227
|
+
const value = r.read(raw, "supersedes");
|
|
228
|
+
if (value === null || value === undefined) {
|
|
229
|
+
if (value === undefined) {
|
|
230
|
+
r.invalid(artifact, "'supersedes' es obligatorio", "usá null cuando esta es la primera revisión de la rendition");
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
const ref = parseArtifactRef(value);
|
|
235
|
+
if (ref === null || `${ref.package}/${ref.artifact}` !== id) {
|
|
236
|
+
r.invalid(artifact, `'supersedes' debe ser una revisión anterior de ${String(id)} y llegó ${JSON.stringify(value)}`, "una rendition supersede a sí misma o a nada");
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
if (isRevision(revision) && ref.revision >= revision) {
|
|
240
|
+
r.fail("DESIGN_RELATION_BROKEN", artifact, `'supersedes' apunta a r${ref.revision} y esta revisión es r${revision}`, "solo se supersede una revisión anterior");
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
return value;
|
|
244
|
+
}
|
|
245
|
+
function readContext(r, raw, artifact) {
|
|
246
|
+
const empty = {
|
|
247
|
+
platform: "",
|
|
248
|
+
viewport: "",
|
|
249
|
+
theme: "",
|
|
250
|
+
locale: "",
|
|
251
|
+
variants: [],
|
|
252
|
+
};
|
|
253
|
+
const node = r.read(raw, "context");
|
|
254
|
+
if (!isRecord(node)) {
|
|
255
|
+
r.invalid(artifact, "'context' debe ser un objeto con platform, viewport, theme, locale y variants", "el mismo diseño se ve distinto según el contexto: declaralo");
|
|
256
|
+
return empty;
|
|
257
|
+
}
|
|
258
|
+
r.closed(node, "context", artifact);
|
|
259
|
+
const out = { ...empty };
|
|
260
|
+
for (const field of ["platform", "viewport", "theme", "locale"]) {
|
|
261
|
+
const value = r.read(node, `context.${field}`);
|
|
262
|
+
if (!isNonEmptyString(value)) {
|
|
263
|
+
r.invalid(artifact, `'context.${field}' es obligatorio y no admite vacío`, `declará el ${field} en el que se produjo la rendition`);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
out[field] = value;
|
|
267
|
+
}
|
|
268
|
+
const variants = r.read(node, "context.variants");
|
|
269
|
+
if (!Array.isArray(variants)) {
|
|
270
|
+
r.invalid(artifact, "'context.variants' debe ser un array", "usá [] si no hay variantes");
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
273
|
+
for (const variant of variants) {
|
|
274
|
+
if (!isNonEmptyString(variant)) {
|
|
275
|
+
r.invalid(artifact, `'context.variants' trae una variante vacía: ${JSON.stringify(variant)}`, "nombrá cada variante, o dejá el array vacío");
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
out.variants.push(variant);
|
|
279
|
+
}
|
|
280
|
+
return out;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* The revisions this rendition came out of, anchored or whole.
|
|
284
|
+
*
|
|
285
|
+
* An anchor is allowed and meaningful here: a preview of one state IS a preview
|
|
286
|
+
* of one state, and recording the whole screen instead would claim coverage of
|
|
287
|
+
* every state the screen has.
|
|
288
|
+
*/
|
|
289
|
+
function readSources(r, raw, artifact) {
|
|
290
|
+
const out = [];
|
|
291
|
+
const seen = new Set();
|
|
292
|
+
for (const entry of eachRecord(r, raw, "sources", artifact, " de revisiones fuente")) {
|
|
293
|
+
const ref = r.read(entry, "sources[].ref");
|
|
294
|
+
const sha256 = r.read(entry, "sources[].sha256");
|
|
295
|
+
const parsed = parseArtifactRef(ref);
|
|
296
|
+
if (parsed === null || parsed.artifact.startsWith("VIS-")) {
|
|
297
|
+
r.invalid(artifact, `'sources[].ref' debe ser una revisión de flow, screen, rule o token y llegó ${JSON.stringify(ref)}`, "una rendition sale del diseño, no de otra rendition");
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (seen.has(ref)) {
|
|
301
|
+
r.fail("DESIGN_ID_DUPLICATE", artifact, `'sources' repite ${ref}`, "dejá una sola aparición");
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
seen.add(ref);
|
|
305
|
+
if (!isDigest(sha256)) {
|
|
306
|
+
r.invalid(artifact, `sources['${ref}']: 'sha256' debe ser 'sha256:' + 64 hex`, "hasheá los bytes del documento fuente");
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
out.push({ ref: ref, sha256 });
|
|
310
|
+
}
|
|
311
|
+
if (out.length === 0 && r.failures.length === 0) {
|
|
312
|
+
r.invalid(artifact, "'sources' está vacío y una rendition siempre sale de algo", "declará la revisión de la que se generó: sin fuente no hay obsolescencia detectable");
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
function readCoverage(r, raw, artifact) {
|
|
317
|
+
const out = { criteria: [], states: [] };
|
|
318
|
+
const node = r.read(raw, "coverage");
|
|
319
|
+
if (!isRecord(node)) {
|
|
320
|
+
r.invalid(artifact, "'coverage' debe ser un objeto con 'criteria' y 'states'", "declará qué criterios y qué estados demuestra esta rendition");
|
|
321
|
+
return out;
|
|
322
|
+
}
|
|
323
|
+
r.closed(node, "coverage", artifact);
|
|
324
|
+
out.criteria = readClosedList(r, artifact, "coverage.criteria", r.read(node, "coverage.criteria"), CRITERION_RE, "citá el criterio como lo escribe Workline, por ejemplo S013/AC-REN-01");
|
|
325
|
+
out.states = readClosedList(r, artifact, "coverage.states", r.read(node, "coverage.states"), ANCHOR_RE, "nombrá el anchor del estado, sin '#'");
|
|
326
|
+
return out;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* A list whose items all have to match one closed grammar, deduplicated. The two
|
|
330
|
+
* halves of `coverage` differ only in that grammar, so they share this.
|
|
331
|
+
*/
|
|
332
|
+
function readClosedList(r, artifact, path, raw, grammar, action) {
|
|
333
|
+
if (!Array.isArray(raw)) {
|
|
334
|
+
r.invalid(artifact, `'${path}' debe ser un array`, `usá '${path}': [] si no cubre ninguno`);
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
const out = [];
|
|
338
|
+
for (const value of raw) {
|
|
339
|
+
if (typeof value !== "string" || !grammar.test(value)) {
|
|
340
|
+
r.invalid(artifact, `'${path}' trae un valor inválido: ${JSON.stringify(value)}`, action);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (!out.includes(value))
|
|
344
|
+
out.push(value);
|
|
345
|
+
}
|
|
346
|
+
return out;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* The local files. Paths are relative to the rendition's OWN directory, so a
|
|
350
|
+
* rendition can never claim a file that belongs to another one.
|
|
351
|
+
*/
|
|
352
|
+
function readFiles(r, raw, artifact, format) {
|
|
353
|
+
const out = [];
|
|
354
|
+
const seen = new Set();
|
|
355
|
+
for (const entry of eachRecord(r, raw, "files", artifact, " de archivos locales")) {
|
|
356
|
+
const path = r.read(entry, "files[].path");
|
|
357
|
+
const sha256 = r.read(entry, "files[].sha256");
|
|
358
|
+
if (typeof path !== "string" || path.length === 0) {
|
|
359
|
+
r.invalid(artifact, "cada entrada de 'files' necesita 'path'", "escribí el path relativo a la carpeta de la rendition, por ejemplo preview.svg");
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
const safe = checkSafeRelativePath(path);
|
|
363
|
+
if (!safe.ok) {
|
|
364
|
+
r.fail("DESIGN_PATH_UNSAFE", artifact, `files: '${path}' ${safe.why}`, "los archivos de una rendition viven dentro de su propia carpeta");
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (seen.has(safe.path)) {
|
|
368
|
+
r.fail("DESIGN_ID_DUPLICATE", artifact, `'${safe.path}' está declarado dos veces`, "nombrá cada archivo una vez");
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
seen.add(safe.path);
|
|
372
|
+
if (!isDigest(sha256)) {
|
|
373
|
+
r.invalid(artifact, `files['${safe.path}']: 'sha256' debe ser 'sha256:' + 64 hex`, "hasheá los bytes del archivo");
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
out.push({ path: safe.path, sha256 });
|
|
377
|
+
}
|
|
378
|
+
if (out.length === 0) {
|
|
379
|
+
// Una rendition sin archivo local es exactamente la evidencia que desaparece
|
|
380
|
+
// cuando el proveedor no está: es el caso que AC-REN-07 existe para impedir.
|
|
381
|
+
r.fail("DESIGN_EVIDENCE_INSUFFICIENT", artifact, "'files' está vacío: la rendition no conserva ninguna evidencia local", "guardá la preview dentro de la carpeta de la rendition y declarala en 'files'");
|
|
382
|
+
return out;
|
|
383
|
+
}
|
|
384
|
+
if (format !== null && !out.some((f) => EXTENSIONS[format].some((e) => f.path.endsWith(e)))) {
|
|
385
|
+
r.invalid(artifact, `declara 'format': ${format} y ninguno de sus archivos termina en ${EXTENSIONS[format].join(" o ")}`, "corregí el formato declarado, o agregá el archivo que lo respalda");
|
|
386
|
+
}
|
|
387
|
+
return out;
|
|
388
|
+
}
|
|
389
|
+
function readProvider(r, raw, artifact) {
|
|
390
|
+
const node = r.read(raw, "provider");
|
|
391
|
+
if (node === null || node === undefined) {
|
|
392
|
+
if (node === undefined) {
|
|
393
|
+
r.invalid(artifact, "'provider' es obligatorio", "usá null cuando la rendition es puramente local");
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
if (!isRecord(node)) {
|
|
398
|
+
r.invalid(artifact, "'provider' debe ser null o un objeto con name, locator, version y sync", "una rendición local declara provider: null");
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
r.closed(node, "provider", artifact);
|
|
402
|
+
const name = r.read(node, "provider.name");
|
|
403
|
+
if (!isNonEmptyString(name)) {
|
|
404
|
+
r.invalid(artifact, "'provider.name' es obligatorio", "nombrá el proveedor, por ejemplo figma");
|
|
405
|
+
}
|
|
406
|
+
const pairs = readLocator(r, artifact, r.read(node, "provider.locator"));
|
|
407
|
+
const version = r.read(node, "provider.version");
|
|
408
|
+
if (version !== null && version !== undefined && !isNonEmptyString(version)) {
|
|
409
|
+
r.invalid(artifact, `'provider.version' debe ser un texto o null y llegó ${JSON.stringify(version)}`, "usá null cuando el proveedor no expone una versión estable");
|
|
410
|
+
}
|
|
411
|
+
const sync = readEnum(r, node, artifact, "provider.sync", SYNCS, "la sincronía con el proveedor es una AFIRMACIÓN: 'unknown' es la respuesta honesta sin consultarlo");
|
|
412
|
+
return {
|
|
413
|
+
name: isNonEmptyString(name) ? name : "",
|
|
414
|
+
locator: pairs,
|
|
415
|
+
version: typeof version === "string" ? version : null,
|
|
416
|
+
sync: sync ?? "unknown",
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* The provider-shaped keys. Which keys they are is the adapter profile's business,
|
|
421
|
+
* so this only insists that there is at least one and that each one locates
|
|
422
|
+
* something — an empty value is worse than an absent locator, because it reads as
|
|
423
|
+
* a registered fact.
|
|
424
|
+
*/
|
|
425
|
+
function readLocator(r, artifact, locator) {
|
|
426
|
+
const pairs = {};
|
|
427
|
+
if (!isRecord(locator) || Object.keys(locator).length === 0) {
|
|
428
|
+
r.invalid(artifact, "'provider.locator' debe ser un objeto con al menos una clave", "declará el locator mínimo del proveedor, por ejemplo file_key y node_id");
|
|
429
|
+
return pairs;
|
|
430
|
+
}
|
|
431
|
+
for (const [key, value] of Object.entries(locator)) {
|
|
432
|
+
if (!isNonEmptyString(value)) {
|
|
433
|
+
r.invalid(artifact, `'provider.locator.${key}' no admite vacío`, "un locator que no localiza nada es peor que ninguno: quitalo o completalo");
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
pairs[key] = value;
|
|
437
|
+
}
|
|
438
|
+
return pairs;
|
|
439
|
+
}
|
|
440
|
+
function readInteractionEvidence(r, raw, artifact, medium) {
|
|
441
|
+
const node = r.read(raw, "interaction_evidence");
|
|
442
|
+
if (node === null || node === undefined) {
|
|
443
|
+
if (node === undefined) {
|
|
444
|
+
r.invalid(artifact, "'interaction_evidence' es obligatorio", "usá null cuando la rendition no demuestra una interacción");
|
|
445
|
+
}
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
if (!isRecord(node)) {
|
|
449
|
+
r.invalid(artifact, "'interaction_evidence' debe ser null o un objeto con trigger, transition y outcome", "una rendition estática declara interaction_evidence: null");
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
r.closed(node, "interaction_evidence", artifact);
|
|
453
|
+
// Un PNG no muestra una transición. Aceptar la evidencia sobre un medio que no
|
|
454
|
+
// puede sostenerla es dejar que una afirmación pase por una demostración.
|
|
455
|
+
if (medium !== null && !INTERACTIVE_MEDIA.includes(medium)) {
|
|
456
|
+
r.fail("DESIGN_EVIDENCE_INSUFFICIENT", artifact, `declara evidencia de interacción sobre un medio '${medium}'`, `una interacción se evidencia con ${INTERACTIVE_MEDIA.join(" o ")}: cambiá el medio, o poné interaction_evidence en null`);
|
|
457
|
+
}
|
|
458
|
+
const out = { trigger: "", transition: "", outcome: "" };
|
|
459
|
+
for (const field of ["trigger", "transition", "outcome"]) {
|
|
460
|
+
const value = r.read(node, `interaction_evidence.${field}`);
|
|
461
|
+
if (!isNonEmptyString(value)) {
|
|
462
|
+
r.invalid(artifact, `'interaction_evidence.${field}' es obligatorio y no admite vacío`, "una interacción se demuestra con las tres cosas: qué la dispara, qué transición produce y en qué termina");
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
out[field] = value;
|
|
466
|
+
}
|
|
467
|
+
return out;
|
|
468
|
+
}
|
|
469
|
+
function done(r, value) {
|
|
470
|
+
return { ok: value !== null, value, failures: r.failures, touched: r.touched };
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=rendition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendition.js","sourceRoot":"","sources":["../../../src/domain/design/rendition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The retired design path, reported instead of read (AC-COMP-01/02).
|
|
3
|
+
*
|
|
4
|
+
* A document that still carries the legacy render is not an input this contract
|
|
5
|
+
* accepts and not evidence any gate honors. It is REPORTED — never parsed as a
|
|
6
|
+
* contract, never imported, converted, migrated on touch or bulk-migrated. The
|
|
7
|
+
* asymmetry is deliberate: reading it would make the old format a second source
|
|
8
|
+
* of truth, and the day the two disagree nothing could say which one governs.
|
|
9
|
+
*
|
|
10
|
+
* Retirement is not destruction. Nothing here writes, moves or rewrites a file:
|
|
11
|
+
* a `## UI spec` section written last year stays exactly where it is, byte for
|
|
12
|
+
* byte. What changes is that Workline answers `retired/unsupported` and asks for
|
|
13
|
+
* the result to be recreated over the UI Design Package.
|
|
14
|
+
*/
|
|
15
|
+
export const RETIRED_CODE = "DESIGN_RETIRED_UNSUPPORTED";
|
|
16
|
+
const RECREATE = "recreá ese diseño sobre el UI Design Package: no hay importador, conversión ni migración";
|
|
17
|
+
/**
|
|
18
|
+
* Each form is recognized on purpose rather than by one loose pattern: telling
|
|
19
|
+
* an author WHICH retired surface they presented is the difference between a
|
|
20
|
+
* diagnostic and a rejection.
|
|
21
|
+
*/
|
|
22
|
+
const FORMS = [
|
|
23
|
+
{
|
|
24
|
+
// A heading of its own, so prose that merely mentions the old name is not a
|
|
25
|
+
// false positive — a plan explaining the retirement is not carrying one.
|
|
26
|
+
test: /^\s*#{2,}\s+UI spec\s*$/m,
|
|
27
|
+
what: "una sección '## UI spec'",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
// A real filename, so the literal placeholder `NNN-SPEC-<SLUG>.md` that the
|
|
31
|
+
// doctrine uses to NAME the retired shape is not itself an offender.
|
|
32
|
+
test: /\b\d{3}-SPEC-[A-Z0-9-]+\.md\b/,
|
|
33
|
+
what: "un design SPEC de sesión (NNN-SPEC-<SLUG>.md)",
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Legacy surfaces this text presents. Empty for a document that carries none —
|
|
38
|
+
* which is every current document, so the check costs nothing to keep on.
|
|
39
|
+
*/
|
|
40
|
+
export function reportRetiredDesign(text, artifact) {
|
|
41
|
+
return FORMS.filter((form) => form.test.test(text)).map((form) => ({
|
|
42
|
+
code: RETIRED_CODE,
|
|
43
|
+
artifact,
|
|
44
|
+
message: `'${artifact}' presenta ${form.what}: es un camino retirado y no se lee como contrato ni cuenta como evidencia`,
|
|
45
|
+
action: RECREATE,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A binding or invocation naming a retired identity is refused one layer up, by
|
|
50
|
+
* `RETIRED_SKILL_IDENTITIES` in the skills resolver: the line is ignored with a
|
|
51
|
+
* warning and the role keeps its built-in default, so the capability is never
|
|
52
|
+
* left mute. Nothing is duplicated here — one rule, one home.
|
|
53
|
+
*
|
|
54
|
+
* An **output of `ui-spec-generator`** is retired too, and is stated in the
|
|
55
|
+
* doctrine rather than pattern-matched: that repository is outside this topology
|
|
56
|
+
* and its output format is not ours to recognize. A detector keyed on the tool's
|
|
57
|
+
* NAME would fire on every document that explains the retirement, which is the
|
|
58
|
+
* opposite of a useful guard. What a document can actually carry — a `## UI spec`
|
|
59
|
+
* section or a session design SPEC — is what the forms above catch.
|
|
60
|
+
*/
|
|
61
|
+
//# sourceMappingURL=retired.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retired.js","sourceRoot":"","sources":["../../../src/domain/design/retired.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,MAAM,QAAQ,GACZ,0FAA0F,CAAC;AAQ7F;;;;GAIG;AACH,MAAM,KAAK,GAA2B;IACpC;QACE,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,0BAA0B;KACjC;IACD;QACE,4EAA4E;QAC5E,qEAAqE;QACrE,IAAI,EAAE,+BAA+B;QACrC,IAAI,EAAE,+CAA+C;KACtD;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IAChE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,EAAE,YAAY;QAClB,QAAQ;QACR,OAAO,EAAE,IAAI,QAAQ,cAAc,IAAI,CAAC,IAAI,4EAA4E;QACxH,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;GAYG"}
|