@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,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The v1 conformance profiles, and what each provider's locator has to say.
|
|
3
|
+
*
|
|
4
|
+
* Conformance v1 is deliberately small: two USABLE profiles, neither of which
|
|
5
|
+
* needs an account, an API key or a request. `portable-html` produces something a
|
|
6
|
+
* person can open; `figma` prepares the context and records where the result
|
|
7
|
+
* ended up. Everything else in this file is the same shape applied to the other
|
|
8
|
+
* destinations the spec names — Stitch, Claude Design, Claude.ai Artifacts — which
|
|
9
|
+
* receive the SAME bundle and register their own locators.
|
|
10
|
+
*
|
|
11
|
+
* Two rules make this a contract instead of a list.
|
|
12
|
+
*
|
|
13
|
+
* **A locator locates.** `file_key`, `project_id`, `artifact` — each provider has
|
|
14
|
+
* its own minimum, and a rendition claiming that provider has to carry it. What a
|
|
15
|
+
* locator never does is identify: the Workline id, revision and digest are the
|
|
16
|
+
* identity, and a locator that went missing costs a link, never the evidence.
|
|
17
|
+
*
|
|
18
|
+
* **A provider with no stable version says so here.** Whether the tool can name
|
|
19
|
+
* the exact version a snapshot came from is a property OF THE TOOL, not something
|
|
20
|
+
* a rendition can be blamed for. So it is declared per provider: where there is a
|
|
21
|
+
* stable version identity, `provider.version` is required; where there is none,
|
|
22
|
+
* `null` is the honest answer and `source_digest` plus the local snapshot are what
|
|
23
|
+
* keep the evidence verifiable.
|
|
24
|
+
*/
|
|
25
|
+
/** The shared loss of every v1 profile: nothing here automates the tool. */
|
|
26
|
+
const MANUAL_OPERATION = {
|
|
27
|
+
subject: "operation:automation",
|
|
28
|
+
why: "la conformidad v1 prepara el contexto y registra el resultado; operar la herramienta es manual o asistido",
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* HTML portable / Claude Artifact — `handoff + record + snapshot`.
|
|
32
|
+
*
|
|
33
|
+
* The one profile that keeps a consultable copy, which is why it is the one that
|
|
34
|
+
* survives a dead account and a cut network. Its `network: never` is not a
|
|
35
|
+
* courtesy: an export under this profile that reaches for a URL is rejected by
|
|
36
|
+
* `checkOfflineHtml`.
|
|
37
|
+
*/
|
|
38
|
+
export const PORTABLE_HTML = {
|
|
39
|
+
id: "portable-html",
|
|
40
|
+
title: "HTML portable / Claude Artifact",
|
|
41
|
+
version: 1,
|
|
42
|
+
capabilities: {
|
|
43
|
+
handoff: true,
|
|
44
|
+
record: true,
|
|
45
|
+
snapshot: true,
|
|
46
|
+
generate: false,
|
|
47
|
+
push: false,
|
|
48
|
+
pull: false,
|
|
49
|
+
compare: false,
|
|
50
|
+
},
|
|
51
|
+
losses: [
|
|
52
|
+
MANUAL_OPERATION,
|
|
53
|
+
{
|
|
54
|
+
subject: "medium:motion",
|
|
55
|
+
why: "un export estático no representa animación ni temporización; una transición se evidencia con un storyboard",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
subject: "section:design_system_deltas",
|
|
59
|
+
why: "el HTML muestra el resultado, no el delta respecto del design system: eso vive en la screen",
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
network: "never",
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* The four capabilities no v1 profile implements — declared false, not omitted.
|
|
66
|
+
*
|
|
67
|
+
* `handoff + record` is what conformance means for a provider-backed profile: the
|
|
68
|
+
* bundle is prepared and the result is registered, and the tool is operated by a
|
|
69
|
+
* person. Saying so here once is what keeps the four from drifting into "probably
|
|
70
|
+
* works" in one profile and "not supported" in the next.
|
|
71
|
+
*/
|
|
72
|
+
const NOT_IN_V1 = { generate: false, push: false, pull: false, compare: false };
|
|
73
|
+
/** What every provider-backed profile is known to drop. */
|
|
74
|
+
const providerLosses = (name) => [
|
|
75
|
+
MANUAL_OPERATION,
|
|
76
|
+
{
|
|
77
|
+
subject: "authority:semantics",
|
|
78
|
+
why: `lo que se edite en ${name} no es la fuente: la Screen Specification sigue siendo la autoridad y una vuelta externa entra como propuesta`,
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Figma — `handoff + record`, the second half of v1 conformance.
|
|
83
|
+
*
|
|
84
|
+
* No API, no token, no request: it prepares the context and registers `file_key`,
|
|
85
|
+
* `node_id` and the version the result ended up at. That is deliberately the whole
|
|
86
|
+
* profile — automating `generate` or `pull` is explicitly out of scope, and
|
|
87
|
+
* declaring them false is how a caller finds that out without trying.
|
|
88
|
+
*/
|
|
89
|
+
export const FIGMA = {
|
|
90
|
+
id: "figma",
|
|
91
|
+
title: "Figma",
|
|
92
|
+
version: 1,
|
|
93
|
+
capabilities: { handoff: true, record: true, snapshot: false, ...NOT_IN_V1 },
|
|
94
|
+
losses: providerLosses("Figma"),
|
|
95
|
+
network: "opt_in",
|
|
96
|
+
};
|
|
97
|
+
export const STITCH = {
|
|
98
|
+
id: "stitch",
|
|
99
|
+
title: "Stitch",
|
|
100
|
+
version: 1,
|
|
101
|
+
capabilities: { handoff: true, record: true, snapshot: false, ...NOT_IN_V1 },
|
|
102
|
+
losses: providerLosses("Stitch"),
|
|
103
|
+
network: "opt_in",
|
|
104
|
+
};
|
|
105
|
+
export const CLAUDE_DESIGN = {
|
|
106
|
+
id: "claude-design",
|
|
107
|
+
title: "Claude Design",
|
|
108
|
+
version: 1,
|
|
109
|
+
capabilities: { handoff: true, record: true, snapshot: false, ...NOT_IN_V1 },
|
|
110
|
+
losses: [
|
|
111
|
+
...providerLosses("Claude Design"),
|
|
112
|
+
{
|
|
113
|
+
subject: "provider:version",
|
|
114
|
+
why: "no expone una versión estable a la que anclar un snapshot; lo verificable es el export local y su source_digest",
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
network: "opt_in",
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Claude.ai Artifacts — `handoff + record + snapshot`.
|
|
121
|
+
*
|
|
122
|
+
* The one provider-backed profile that also snapshots, because an artifact IS an
|
|
123
|
+
* HTML export: what it registers is where the artifact lives, and what it keeps is
|
|
124
|
+
* the same self-sufficient file `portable-html` produces.
|
|
125
|
+
*/
|
|
126
|
+
export const CLAUDE_ARTIFACT = {
|
|
127
|
+
id: "claude-artifact",
|
|
128
|
+
title: "Claude.ai Artifacts",
|
|
129
|
+
version: 1,
|
|
130
|
+
capabilities: { handoff: true, record: true, snapshot: true, ...NOT_IN_V1 },
|
|
131
|
+
losses: providerLosses("Claude.ai"),
|
|
132
|
+
network: "opt_in",
|
|
133
|
+
};
|
|
134
|
+
/** Every registered profile, by id. */
|
|
135
|
+
export const DESIGN_ADAPTERS = {
|
|
136
|
+
[PORTABLE_HTML.id]: PORTABLE_HTML,
|
|
137
|
+
[FIGMA.id]: FIGMA,
|
|
138
|
+
[STITCH.id]: STITCH,
|
|
139
|
+
[CLAUDE_DESIGN.id]: CLAUDE_DESIGN,
|
|
140
|
+
[CLAUDE_ARTIFACT.id]: CLAUDE_ARTIFACT,
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Locator minimums per provider name, as the spec states them.
|
|
144
|
+
*
|
|
145
|
+
* Keyed by `provider.name` rather than by profile id because a rendition records
|
|
146
|
+
* the tool it came out of, and the same tool may be reached by more than one
|
|
147
|
+
* profile. A name that is not here is not an error: `provider.name` is free text
|
|
148
|
+
* and a package may register a tool this Workline never heard of — what would be
|
|
149
|
+
* wrong is INVENTING a requirement for it.
|
|
150
|
+
*/
|
|
151
|
+
export const LOCATOR_REQUIREMENTS = {
|
|
152
|
+
figma: { required: ["file_key", "node_id"], anyOf: [], stableVersion: true },
|
|
153
|
+
stitch: { required: ["project_id", "screen_id"], anyOf: [], stableVersion: true },
|
|
154
|
+
// Claude Design identifies the project or the URL, and the handoff/export it
|
|
155
|
+
// produced; it exposes no version identity a snapshot can be pinned to.
|
|
156
|
+
"claude-design": {
|
|
157
|
+
required: [],
|
|
158
|
+
anyOf: [["project_id", "url"], ["export"]],
|
|
159
|
+
stableVersion: false,
|
|
160
|
+
},
|
|
161
|
+
"claude-artifact": {
|
|
162
|
+
required: [],
|
|
163
|
+
anyOf: [["artifact_id", "url"], ["export"]],
|
|
164
|
+
stableVersion: true,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Does this rendition's provider locate what it claims to?
|
|
169
|
+
*
|
|
170
|
+
* Returns `[]` for a purely local rendition: `provider: null` is the normal shape
|
|
171
|
+
* of the evidence that does not depend on anybody, and demanding a locator for it
|
|
172
|
+
* would invert the whole point of the local path.
|
|
173
|
+
*/
|
|
174
|
+
export function checkProviderLocator(provider, artifact) {
|
|
175
|
+
if (provider === null)
|
|
176
|
+
return [];
|
|
177
|
+
const rule = LOCATOR_REQUIREMENTS[provider.name];
|
|
178
|
+
if (rule === undefined)
|
|
179
|
+
return [];
|
|
180
|
+
const failures = [];
|
|
181
|
+
const has = (key) => (provider.locator[key] ?? "").length > 0;
|
|
182
|
+
for (const key of rule.required) {
|
|
183
|
+
if (has(key))
|
|
184
|
+
continue;
|
|
185
|
+
failures.push({
|
|
186
|
+
code: "DESIGN_LOCATOR_INCOMPLETE",
|
|
187
|
+
artifact,
|
|
188
|
+
message: `el locator de '${provider.name}' no trae '${key}'`,
|
|
189
|
+
action: `un locator de ${provider.name} necesita ${rule.required.join(" y ")}: completalo, o registrá la rendition como local (provider: null)`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
for (const group of rule.anyOf) {
|
|
193
|
+
if (group.some(has))
|
|
194
|
+
continue;
|
|
195
|
+
failures.push({
|
|
196
|
+
code: "DESIGN_LOCATOR_INCOMPLETE",
|
|
197
|
+
artifact,
|
|
198
|
+
message: `el locator de '${provider.name}' no trae ninguno de ${group.join(", ")}`,
|
|
199
|
+
action: `declará al menos uno de ${group.join(" o ")}: un locator que no localiza nada es peor que ninguno`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if (rule.stableVersion && provider.version === null) {
|
|
203
|
+
failures.push({
|
|
204
|
+
code: "DESIGN_LOCATOR_INCOMPLETE",
|
|
205
|
+
artifact,
|
|
206
|
+
message: `'${provider.name}' expone una versión estable y esta rendition no la registra`,
|
|
207
|
+
action: "copiá la versión del objeto externo (version_id, timestamp o equivalente): sin ella nadie puede decir de qué estado salió el snapshot",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return failures;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../../src/domain/design/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { PROJECTIONS } from "./naming.js";
|
|
2
|
+
/**
|
|
3
|
+
* `PACKAGE.md` and `design-system/DESIGN.md` — the two regenerable projections.
|
|
4
|
+
*
|
|
5
|
+
* Neither is normative and neither is ever sealed: a baseline that selected one
|
|
6
|
+
* would make a published revision depend on something derived, so re-rendering
|
|
7
|
+
* the landing page would rewrite history. They exist because a human opening a
|
|
8
|
+
* dossier needs a way in, and because Stitch-style handoff reads `DESIGN.md`.
|
|
9
|
+
*
|
|
10
|
+
* The rule that keeps them honest: a projection **repeats no normative
|
|
11
|
+
* content**. It points at where things live and says which revision it was
|
|
12
|
+
* rendered from. Anything a projection asserted on its own would be a second
|
|
13
|
+
* source of truth for a fact the manifest or the artifact already owns.
|
|
14
|
+
*/
|
|
15
|
+
/** Marker line that ties a rendered projection to the revision it came from. */
|
|
16
|
+
const SOURCE_MARK = "<!-- workline:projection source=";
|
|
17
|
+
export function sourceMark(packageId, revision) {
|
|
18
|
+
// `@r0` no existe: una proyección de un package sin publicar declara eso y no
|
|
19
|
+
// una revisión que nadie puede resolver.
|
|
20
|
+
return `${SOURCE_MARK}${sourceSuffix(packageId, revision)} -->`;
|
|
21
|
+
}
|
|
22
|
+
/** How a source revision is written inside a projection mark. */
|
|
23
|
+
function sourceSuffix(packageId, revision) {
|
|
24
|
+
return revision === 0 ? `${packageId}@sin-publicar` : `${packageId}@r${revision}`;
|
|
25
|
+
}
|
|
26
|
+
/** The revision a projection declares it was rendered from, or null. */
|
|
27
|
+
export function declaredSource(text) {
|
|
28
|
+
const match = new RegExp(`${SOURCE_MARK}(\\S+) -->`).exec(text);
|
|
29
|
+
return match === null ? null : match[1];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The human landing page. Locations and identities only: a reader finds a flow,
|
|
33
|
+
* a screen, its states and its renditions, and then opens the artifact — which
|
|
34
|
+
* is where the design actually lives.
|
|
35
|
+
*/
|
|
36
|
+
export function renderPackageMd(manifest) {
|
|
37
|
+
const current = manifest.current_baseline;
|
|
38
|
+
const lines = [
|
|
39
|
+
`# ${manifest.title}`,
|
|
40
|
+
"",
|
|
41
|
+
sourceMark(manifest.id, current?.revision ?? 0),
|
|
42
|
+
"",
|
|
43
|
+
"> Página regenerable. No es normativa y no forma parte de ningún digest:",
|
|
44
|
+
"> el manifest y los baselines son la autoridad.",
|
|
45
|
+
"",
|
|
46
|
+
`- **Identidad:** \`${manifest.id}\``,
|
|
47
|
+
`- **Baseline vigente:** ${current === null ? "sin publicar" : `\`${manifest.id}@r${current.revision}\``}`,
|
|
48
|
+
`- **Creado:** ${manifest.created}`,
|
|
49
|
+
];
|
|
50
|
+
if (manifest.derived_from !== null) {
|
|
51
|
+
lines.push(`- **Derivado de:** \`${manifest.derived_from}\``);
|
|
52
|
+
}
|
|
53
|
+
for (const [heading, entries] of [
|
|
54
|
+
["Flows", manifest.catalog.flows],
|
|
55
|
+
["Screens", manifest.catalog.screens],
|
|
56
|
+
["Reglas", manifest.catalog.rules],
|
|
57
|
+
["Tokens", manifest.catalog.tokens],
|
|
58
|
+
["Renditions", manifest.catalog.renditions],
|
|
59
|
+
]) {
|
|
60
|
+
if (entries.length === 0)
|
|
61
|
+
continue;
|
|
62
|
+
lines.push("", `## ${heading}`, "");
|
|
63
|
+
for (const entry of currentRevisions(entries)) {
|
|
64
|
+
const maturity = entry.maturity === undefined ? "" : ` · ${entry.maturity}`;
|
|
65
|
+
lines.push(`- \`${entry.id}@r${entry.revision}\`${maturity} — [\`${entry.path}\`](${entry.path})`);
|
|
66
|
+
// Un estado se localiza por su referencia completa; lo que ese estado DICE
|
|
67
|
+
// sigue viviendo solo en el documento.
|
|
68
|
+
for (const anchor of entry.states ?? []) {
|
|
69
|
+
lines.push(` - \`${manifest.id}/${entry.id}@r${entry.revision}#${anchor}\` — [\`${entry.path}\`](${entry.path})`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (manifest.catalog.assets.length > 0) {
|
|
74
|
+
lines.push("", "## Assets", "", `${manifest.catalog.assets.length} content-addressed bajo \`assets/\`.`);
|
|
75
|
+
}
|
|
76
|
+
const consumers = [...manifest.relations.specs, ...manifest.relations.plans];
|
|
77
|
+
if (consumers.length > 0) {
|
|
78
|
+
lines.push("", "## Consumido por", "");
|
|
79
|
+
// Ruta relativa al workspace, no un enlace: el dossier puede vivir en una
|
|
80
|
+
// subcarpeta de `docs/designs/`, y un `../../../` fijo apuntaría a la nada.
|
|
81
|
+
for (const path of consumers)
|
|
82
|
+
lines.push(`- \`${path}\``);
|
|
83
|
+
}
|
|
84
|
+
return `${lines.join("\n")}\n`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The agent-friendly ruleset. It lists the rules in force and where they live;
|
|
88
|
+
* it never restates what a rule SAYS, because the rule file owns that.
|
|
89
|
+
*/
|
|
90
|
+
export function renderDesignMd(manifest) {
|
|
91
|
+
const current = manifest.current_baseline;
|
|
92
|
+
const rules = currentRevisions(manifest.catalog.rules);
|
|
93
|
+
const lines = [
|
|
94
|
+
`# Design rules — ${manifest.title}`,
|
|
95
|
+
"",
|
|
96
|
+
sourceMark(manifest.id, current?.revision ?? 0),
|
|
97
|
+
"",
|
|
98
|
+
"> Proyección regenerable del ruleset vigente, fuera del digest normativo.",
|
|
99
|
+
"> Cada regla es autoridad de su propio contenido: acá solo se listan.",
|
|
100
|
+
"",
|
|
101
|
+
];
|
|
102
|
+
if (rules.length === 0) {
|
|
103
|
+
lines.push("Este package no declara reglas de design system.");
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
for (const rule of rules) {
|
|
107
|
+
lines.push(`- \`${rule.id}@r${rule.revision}\` — [\`${rule.path}\`](../${rule.path})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const tokens = currentRevisions(manifest.catalog.tokens);
|
|
111
|
+
if (tokens.length > 0) {
|
|
112
|
+
lines.push("", "## Tokens", "");
|
|
113
|
+
for (const token of tokens) {
|
|
114
|
+
lines.push(`- \`${token.id}@r${token.revision}\` — [\`${token.path}\`](../${token.path})`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return `${lines.join("\n")}\n`;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* A projection is checkable against the manifest: regenerate it and compare.
|
|
121
|
+
* A drifted one is reported rather than trusted — it is the only thing a reader
|
|
122
|
+
* sees first, and a stale landing page sends them to a file that moved.
|
|
123
|
+
*/
|
|
124
|
+
export function checkProjection(path, actual, manifest) {
|
|
125
|
+
if (!PROJECTIONS.includes(path)) {
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
code: "DESIGN_FIELD_INVALID",
|
|
129
|
+
artifact: path,
|
|
130
|
+
message: `'${path}' no es una proyección del contrato`,
|
|
131
|
+
action: `las proyecciones son: ${PROJECTIONS.join(", ")}`,
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
const expected = path === "PACKAGE.md" ? renderPackageMd(manifest) : renderDesignMd(manifest);
|
|
136
|
+
// Un checkout con `core.autocrlf` deja CRLF en disco. Comparar fines de línea
|
|
137
|
+
// reportaría stale una proyección correcta, y culpando a la revisión.
|
|
138
|
+
if (actual.replace(/\r\n/g, "\n") === expected)
|
|
139
|
+
return [];
|
|
140
|
+
const declared = declaredSource(actual);
|
|
141
|
+
const current = manifest.current_baseline;
|
|
142
|
+
const now = sourceSuffix(manifest.id, current?.revision ?? 0);
|
|
143
|
+
return [
|
|
144
|
+
{
|
|
145
|
+
code: "DESIGN_PROJECTION_STALE",
|
|
146
|
+
artifact: path,
|
|
147
|
+
message: declared === now
|
|
148
|
+
? `'${path}' dice venir de ${now} y no coincide con lo que el manifest describe`
|
|
149
|
+
: `'${path}' fue renderizada desde ${declared ?? "una revisión que no declara"} y la vigente es ${now}`,
|
|
150
|
+
action: "regeneralá desde el manifest: es una proyección, no una fuente",
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
/** Highest revision per id — what the package IS right now. */
|
|
155
|
+
function currentRevisions(entries) {
|
|
156
|
+
const byId = new Map();
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
const seen = byId.get(entry.id);
|
|
159
|
+
if (seen === undefined || entry.revision > seen.revision)
|
|
160
|
+
byId.set(entry.id, entry);
|
|
161
|
+
}
|
|
162
|
+
return [...byId.values()].sort((a, b) => (a.id < b.id ? -1 : 1));
|
|
163
|
+
}
|
|
164
|
+
export { currentRevisions };
|
|
165
|
+
//# sourceMappingURL=projections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projections.js","sourceRoot":"","sources":["../../../src/domain/design/projections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { parseBody } from "./artifact-body.js";
|
|
2
|
+
import { splitDesignDocument, validateDesignArtifact } from "./artifact.js";
|
|
3
|
+
import { parseArtifactRef } from "./identity.js";
|
|
4
|
+
import { checkSourcesStale, computeSourceDigest, } from "./rendition.js";
|
|
5
|
+
/**
|
|
6
|
+
* Judge a proposal without touching anything.
|
|
7
|
+
*
|
|
8
|
+
* The staleness check runs FIRST and short-circuits the delta: comparing a
|
|
9
|
+
* proposal against a revision it never saw would produce a diff that describes
|
|
10
|
+
* neither what the author changed nor what the package says, which is worse than
|
|
11
|
+
* no diff at all.
|
|
12
|
+
*/
|
|
13
|
+
export function reviewExternalProposal(input) {
|
|
14
|
+
const base = {
|
|
15
|
+
package: input.base.package,
|
|
16
|
+
baseline: input.base.baseline,
|
|
17
|
+
source_digest: baseSourceDigestOf(input.base),
|
|
18
|
+
};
|
|
19
|
+
const stale = checkSourcesStale(`${input.base.package}@r${input.base.baseline}`, sourcesOf(input.base), base.source_digest, input.current);
|
|
20
|
+
if (stale !== null) {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
base,
|
|
24
|
+
stale,
|
|
25
|
+
delta: [],
|
|
26
|
+
failures: [staleBaseFailure(stale, input.base)],
|
|
27
|
+
reconciliation_required: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const delta = input.documents.map((doc) => deltaOf(doc, input.base, input.currentText));
|
|
31
|
+
const failures = delta.flatMap((d) => d.failures);
|
|
32
|
+
return {
|
|
33
|
+
ok: failures.length === 0,
|
|
34
|
+
base,
|
|
35
|
+
stale: null,
|
|
36
|
+
delta,
|
|
37
|
+
failures,
|
|
38
|
+
reconciliation_required: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** The closure of a bundle, as the (ref, sha256) pairs staleness is derived from. */
|
|
42
|
+
function sourcesOf(bundle) {
|
|
43
|
+
return bundle.closure.map((m) => ({ ref: m.ref, sha256: m.sha256 }));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The base token: one digest over everything the bundle handed out.
|
|
47
|
+
*
|
|
48
|
+
* The SAME token a rendition computes over its sources, on purpose: an external
|
|
49
|
+
* return may come from a bundle or from a snapshot, and having two spellings of
|
|
50
|
+
* one fact is how false conflicts get in.
|
|
51
|
+
*/
|
|
52
|
+
export function baseSourceDigestOf(bundle) {
|
|
53
|
+
return computeSourceDigest(sourcesOf(bundle));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The base moved. `DESIGN_BASE_STALE` on purpose — it is the same event the
|
|
57
|
+
* compare-and-swap of a publication reports, and giving it a second code would
|
|
58
|
+
* make the two read as different problems.
|
|
59
|
+
*/
|
|
60
|
+
function staleBaseFailure(stale, bundle) {
|
|
61
|
+
return {
|
|
62
|
+
code: "DESIGN_BASE_STALE",
|
|
63
|
+
artifact: `${bundle.package}/render-bundle.json`,
|
|
64
|
+
message: `la propuesta se generó desde ${stale.subject} y ese contenido ya cambió (${stale.moved.join(", ") || "sus fuentes"})`,
|
|
65
|
+
action: "cortá un bundle nuevo desde la revisión vigente y rehacé la edición sobre él: una base obsoleta no sobrescribe lo publicado",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** What changed in one proposed document, against the revision it was cut from. */
|
|
69
|
+
function deltaOf(doc, base, currentText) {
|
|
70
|
+
const member = base.closure.find((m) => m.path === doc.path);
|
|
71
|
+
const ref = member?.ref ?? doc.path;
|
|
72
|
+
const empty = { ref, path: doc.path, changes: [], prose_changed: [] };
|
|
73
|
+
if (member === undefined) {
|
|
74
|
+
return {
|
|
75
|
+
...empty,
|
|
76
|
+
failures: [
|
|
77
|
+
{
|
|
78
|
+
code: "DESIGN_REFERENCE_MISSING",
|
|
79
|
+
artifact: doc.path,
|
|
80
|
+
message: `'${doc.path}' no estaba en el bundle que se entregó`,
|
|
81
|
+
action: "una propuesta modifica lo que recibió: si es contenido nuevo, autoralo como revisión nueva en vez de devolverlo como propuesta",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const proposed = validateDesignArtifact(doc.content, doc.kind, doc.path);
|
|
87
|
+
if (!proposed.ok || proposed.value === null) {
|
|
88
|
+
return { ...empty, failures: proposed.failures };
|
|
89
|
+
}
|
|
90
|
+
const before = currentText.get(doc.path);
|
|
91
|
+
if (before === undefined) {
|
|
92
|
+
return {
|
|
93
|
+
...empty,
|
|
94
|
+
failures: [
|
|
95
|
+
{
|
|
96
|
+
code: "DESIGN_REFERENCE_FILE_MISSING",
|
|
97
|
+
artifact: doc.path,
|
|
98
|
+
message: `'${doc.path}' no se pudo leer del package para comparar`,
|
|
99
|
+
action: "restauralo: sin la revisión base no hay delta que mostrar, solo una sobrescritura",
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const current = validateDesignArtifact(before, doc.kind, doc.path);
|
|
105
|
+
if (!current.ok || current.value === null) {
|
|
106
|
+
return { ...empty, failures: current.failures };
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
ref,
|
|
110
|
+
path: doc.path,
|
|
111
|
+
changes: fieldChanges(current.value, proposed.value),
|
|
112
|
+
prose_changed: changedSections(before, doc.content),
|
|
113
|
+
failures: [],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** Frontmatter fields, rendered as text so a scalar and a list compare the same way. */
|
|
117
|
+
function fieldsOf(doc) {
|
|
118
|
+
const common = [
|
|
119
|
+
["revision", String(doc.revision)],
|
|
120
|
+
["maturity", doc.maturity],
|
|
121
|
+
["purpose", doc.purpose],
|
|
122
|
+
["platform", doc.platform],
|
|
123
|
+
["trace", doc.trace.map((t) => t.criterion).join(", ")],
|
|
124
|
+
];
|
|
125
|
+
if (doc.kind === "flow") {
|
|
126
|
+
return [
|
|
127
|
+
...common,
|
|
128
|
+
["actors", doc.actors.join(", ")],
|
|
129
|
+
["entry", doc.entry],
|
|
130
|
+
["nodes", doc.nodes.join(", ")],
|
|
131
|
+
["edges", doc.edges.map((e) => `${e.from} -[${e.trigger}]-> ${e.to}`).join(" · ")],
|
|
132
|
+
["dependencies", doc.dependencies.join(", ")],
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
return [
|
|
136
|
+
...common,
|
|
137
|
+
["title", doc.title],
|
|
138
|
+
["default_state", doc.default_state],
|
|
139
|
+
["states", doc.states.map((s) => s.anchor).join(", ")],
|
|
140
|
+
["flow_refs", doc.flow_refs.join(", ")],
|
|
141
|
+
["dependencies.rules", doc.dependencies.rules.join(", ")],
|
|
142
|
+
["dependencies.tokens", doc.dependencies.tokens.join(", ")],
|
|
143
|
+
["dependencies.assets", doc.dependencies.assets.join(", ")],
|
|
144
|
+
[
|
|
145
|
+
"trace.classification",
|
|
146
|
+
doc.trace.map((t) => `${t.criterion}=${t.classification ?? "sin clasificar"}`).join(", "),
|
|
147
|
+
],
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
function fieldChanges(current, proposed) {
|
|
151
|
+
const after = new Map(fieldsOf(proposed));
|
|
152
|
+
const out = [];
|
|
153
|
+
for (const [field, before] of fieldsOf(current)) {
|
|
154
|
+
const value = after.get(field) ?? "";
|
|
155
|
+
if (value === before)
|
|
156
|
+
continue;
|
|
157
|
+
out.push({ field, before, after: value });
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Which `##` sections changed. Only their names: the body is prose, and this
|
|
163
|
+
* refuses to paraphrase it — "«Accessibility» cambió" is a fact a reviewer can act
|
|
164
|
+
* on, while a generated summary of what it now says is a claim nobody authored.
|
|
165
|
+
*/
|
|
166
|
+
function changedSections(before, after) {
|
|
167
|
+
const sectionsOf = (text) => {
|
|
168
|
+
const split = splitDesignDocument(text);
|
|
169
|
+
if (split === null)
|
|
170
|
+
return new Map();
|
|
171
|
+
return new Map(parseBody(split.body, split.bodyLine).sections.map((s) => [s.heading, s.text]));
|
|
172
|
+
};
|
|
173
|
+
const from = sectionsOf(before);
|
|
174
|
+
const to = sectionsOf(after);
|
|
175
|
+
const out = [];
|
|
176
|
+
for (const [heading, text] of to) {
|
|
177
|
+
if (from.get(heading) !== text)
|
|
178
|
+
out.push(heading);
|
|
179
|
+
}
|
|
180
|
+
for (const heading of from.keys()) {
|
|
181
|
+
if (!to.has(heading))
|
|
182
|
+
out.push(`${heading} (quitada)`);
|
|
183
|
+
}
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
export function reconcileProposal(review, decision) {
|
|
187
|
+
const refuse = (message, action) => ({
|
|
188
|
+
ok: false,
|
|
189
|
+
failures: [
|
|
190
|
+
{
|
|
191
|
+
code: "DESIGN_RECONCILIATION_REQUIRED",
|
|
192
|
+
artifact: `${review.base.package}@r${review.base.baseline}`,
|
|
193
|
+
message,
|
|
194
|
+
action,
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
if (!review.ok) {
|
|
199
|
+
return refuse("la propuesta no está en condiciones de reconciliarse", review.stale === null
|
|
200
|
+
? "corregí los documentos propuestos y volvé a revisar: no se reconcilia lo que no valida"
|
|
201
|
+
: "la base quedó obsoleta: cortá un bundle nuevo desde la revisión vigente y rehacé la edición");
|
|
202
|
+
}
|
|
203
|
+
if (decision.accept.length === 0) {
|
|
204
|
+
return refuse("ninguna revisión fue aceptada", "aceptá explícitamente las revisiones que entran: una propuesta no se convierte en @rN+1 por haber sido revisada");
|
|
205
|
+
}
|
|
206
|
+
if (decision.rationale.trim().length === 0) {
|
|
207
|
+
return refuse("la reconciliación no dice por qué se acepta", "escribí el motivo: es el registro de que alguien lo decidió, y lo único que quedará dentro de seis meses");
|
|
208
|
+
}
|
|
209
|
+
const known = new Map(review.delta.map((d) => [d.ref, d]));
|
|
210
|
+
const unresolved = decision.accept.filter((ref) => !known.has(ref) || parseArtifactRef(ref) === null);
|
|
211
|
+
if (unresolved.length > 0) {
|
|
212
|
+
return refuse(`la decisión acepta ${unresolved.join(", ")} y la revisión no lo trae como una referencia resoluble`, "aceptá solo lo que la propuesta trajo: revisá los refs del delta");
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
ok: true,
|
|
216
|
+
value: {
|
|
217
|
+
package: review.base.package,
|
|
218
|
+
expected_base: `${review.base.package}@r${review.base.baseline}`,
|
|
219
|
+
target_baseline: review.base.baseline + 1,
|
|
220
|
+
accepted: decision.accept.map((ref) => {
|
|
221
|
+
const entry = known.get(ref);
|
|
222
|
+
const parsed = parseArtifactRef(ref);
|
|
223
|
+
return {
|
|
224
|
+
ref,
|
|
225
|
+
path: entry.path,
|
|
226
|
+
must_supersede: ref,
|
|
227
|
+
target_revision: parsed.revision + 1,
|
|
228
|
+
};
|
|
229
|
+
}),
|
|
230
|
+
rationale: decision.rationale,
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=proposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../../src/domain/design/proposal.ts"],"names":[],"mappings":"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"}
|