@milehimikey/em 1.17.0 → 1.18.1
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/.claude/agents/em-implementer.md +7 -4
- package/.claude/agents/em-validator.md +2 -2
- package/.claude/skills/event-modeling/SKILL.md +1 -1
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +46 -5
- package/.claude/skills/event-modeling-discover/SKILL.md +43 -8
- package/.claude/skills/event-modeling-discover/reference/extract.md +6 -1
- package/.claude/skills/event-modeling-discover/reference/prd-rubric.md +102 -0
- package/.claude/skills/event-modeling-discover/reference/prd-spec-path.md +171 -0
- package/.claude/skills/event-modeling-engagement/SKILL.md +21 -9
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +18 -0
- package/.claude/skills/event-modeling-review/SKILL.md +4 -2
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +94 -6
- package/.claude/skills/event-modeling-shared/reference/methodology.md +268 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +96 -2
- package/.claude/skills/event-modeling-shared/templates/slice.md +11 -3
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/catalog/docModelConsistencyValidate.js +160 -0
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/invariantsValidate.d.ts +2 -0
- package/dist/catalog/invariantsValidate.js +67 -1
- package/dist/catalog/invariantsValidate.js.map +1 -1
- package/dist/catalog/scenarioQualityValidate.d.ts +4 -0
- package/dist/catalog/scenarioQualityValidate.js +148 -0
- package/dist/catalog/scenarioQualityValidate.js.map +1 -0
- package/dist/catalog/scenarios.d.ts +5 -0
- package/dist/catalog/scenarios.js +80 -0
- package/dist/catalog/scenarios.js.map +1 -1
- package/dist/catalog/sliceDoc.d.ts +4 -0
- package/dist/catalog/sliceDoc.js +16 -7
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +11 -2
- package/dist/catalog/sliceReadyValidate.js +62 -3
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +3 -2
- package/dist/catalog/sliceSections.js +99 -9
- package/dist/catalog/sliceSections.js.map +1 -1
- package/dist/cli/ciInit.d.ts +4 -11
- package/dist/cli/ciInit.js +24 -6
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/coverage.d.ts +9 -0
- package/dist/cli/coverage.js +18 -0
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/defer.d.ts +28 -0
- package/dist/cli/defer.js +87 -4
- package/dist/cli/defer.js.map +1 -1
- package/dist/cli/engagement.d.ts +13 -2
- package/dist/cli/engagement.js +60 -5
- package/dist/cli/engagement.js.map +1 -1
- package/dist/cli/engagementFile.d.ts +2 -0
- package/dist/cli/engagementFile.js +3 -1
- package/dist/cli/engagementFile.js.map +1 -1
- package/dist/cli/markImplemented.d.ts +14 -10
- package/dist/cli/markImplemented.js +49 -1
- package/dist/cli/markImplemented.js.map +1 -1
- package/dist/cli/prdTriage.d.ts +109 -0
- package/dist/cli/prdTriage.js +393 -0
- package/dist/cli/prdTriage.js.map +1 -0
- package/dist/cli/render-inputs.d.ts +2 -0
- package/dist/cli/render-inputs.js +4 -0
- package/dist/cli/render-inputs.js.map +1 -1
- package/dist/cli/review.d.ts +17 -2
- package/dist/cli/review.js +39 -10
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/revise.d.ts +2 -0
- package/dist/cli/revise.js +7 -2
- package/dist/cli/revise.js.map +1 -1
- package/dist/cli/shape.d.ts +27 -0
- package/dist/cli/shape.js +77 -0
- package/dist/cli/shape.js.map +1 -0
- package/dist/cli/sliceIndex.d.ts +6 -1
- package/dist/cli/sliceIndex.js +28 -13
- package/dist/cli/sliceIndex.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +4 -1
- package/dist/cli/sliceNew.js +26 -9
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/status.d.ts +21 -1
- package/dist/cli/status.js +25 -3
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/storylineSuggest.d.ts +26 -0
- package/dist/cli/storylineSuggest.js +252 -0
- package/dist/cli/storylineSuggest.js.map +1 -0
- package/dist/cli/upgrade.d.ts +15 -3
- package/dist/cli/upgrade.js +516 -7
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/upgradeReshape.d.ts +60 -0
- package/dist/cli/upgradeReshape.js +425 -0
- package/dist/cli/upgradeReshape.js.map +1 -0
- package/dist/cli.js +311 -35
- package/dist/cli.js.map +1 -1
- package/dist/emit/dot.d.ts +2 -0
- package/dist/emit/dot.js +44 -8
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/engagementJson.d.ts +4 -3
- package/dist/emit/engagementJson.js +11 -4
- package/dist/emit/engagementJson.js.map +1 -1
- package/dist/emit/json.d.ts +21 -1
- package/dist/emit/json.js +26 -2
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/queryJson.d.ts +1 -1
- package/dist/emit/queryJson.js +3 -1
- package/dist/emit/queryJson.js.map +1 -1
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +6 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/theme.d.ts +1 -0
- package/dist/emit/theme.js +13 -0
- package/dist/emit/theme.js.map +1 -1
- package/dist/emit/validateJson.d.ts +9 -5
- package/dist/emit/validateJson.js +40 -5
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/layout/grid.d.ts +5 -1
- package/dist/layout/grid.js +93 -2
- package/dist/layout/grid.js.map +1 -1
- package/dist/mcp/server.js +46 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/edges.d.ts +7 -0
- package/dist/model/edges.js +33 -16
- package/dist/model/edges.js.map +1 -1
- package/dist/model/model.d.ts +33 -0
- package/dist/model/model.js +87 -3
- package/dist/model/model.js.map +1 -1
- package/dist/model/queryIndex.js +2 -2
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/refs.js +8 -5
- package/dist/model/refs.js.map +1 -1
- package/dist/model/rules.d.ts +149 -0
- package/dist/model/rules.js +144 -0
- package/dist/model/rules.js.map +1 -1
- package/dist/model/shapeLint.d.ts +12 -0
- package/dist/model/shapeLint.js +170 -0
- package/dist/model/shapeLint.js.map +1 -0
- package/dist/model/storylines.d.ts +51 -0
- package/dist/model/storylines.js +188 -0
- package/dist/model/storylines.js.map +1 -0
- package/dist/model/validate.d.ts +6 -1
- package/dist/model/validate.js +317 -14
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/againSugar.d.ts +30 -0
- package/dist/parser/againSugar.js +105 -0
- package/dist/parser/againSugar.js.map +1 -0
- package/dist/parser/ast.d.ts +33 -0
- package/dist/parser/lexer.d.ts +2 -0
- package/dist/parser/lexer.js +4 -0
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +284 -4
- package/dist/parser/parser.js.map +1 -1
- package/dist/query/format.js +1 -0
- package/dist/query/format.js.map +1 -1
- package/dist/query/verbs.d.ts +4 -0
- package/dist/query/verbs.js +30 -3
- package/dist/query/verbs.js.map +1 -1
- package/dist/render/drawEdges.js +100 -4
- package/dist/render/drawEdges.js.map +1 -1
- package/dist/render/render.js +20 -2
- package/dist/render/render.js.map +1 -1
- package/dist/render/sliceDiagram.js +5 -5
- package/dist/render/sliceDiagram.js.map +1 -1
- package/dist/render/storylineBands.d.ts +11 -0
- package/dist/render/storylineBands.js +80 -0
- package/dist/render/storylineBands.js.map +1 -0
- package/dist/render/storylineDiagram.d.ts +14 -0
- package/dist/render/storylineDiagram.js +142 -0
- package/dist/render/storylineDiagram.js.map +1 -0
- package/dist/roster/check.d.ts +32 -0
- package/dist/roster/check.js +92 -0
- package/dist/roster/check.js.map +1 -0
- package/dist/roster/context.d.ts +3 -0
- package/dist/roster/context.js +23 -0
- package/dist/roster/context.js.map +1 -0
- package/dist/roster/init.d.ts +15 -0
- package/dist/roster/init.js +52 -0
- package/dist/roster/init.js.map +1 -0
- package/dist/roster/roster.d.ts +79 -0
- package/dist/roster/roster.js +298 -0
- package/dist/roster/roster.js.map +1 -0
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/agents/em-implementer.md +7 -4
- package/plugin/agents/em-validator.md +2 -2
- package/plugin/shared/reference/em-dsl.md +94 -6
- package/plugin/shared/reference/methodology.md +268 -0
- package/plugin/shared/reference/slice-doc-schema.md +96 -2
- package/plugin/shared/templates/slice.md +11 -3
- package/plugin/skills/conform/SKILL.md +1 -1
- package/plugin/skills/design/SKILL.md +46 -5
- package/plugin/skills/discover/SKILL.md +43 -8
- package/plugin/skills/discover/reference/extract.md +6 -1
- package/plugin/skills/discover/reference/prd-rubric.md +103 -0
- package/plugin/skills/discover/reference/prd-spec-path.md +172 -0
- package/plugin/skills/engagement/SKILL.md +21 -9
- package/plugin/skills/event-modeling/SKILL.md +1 -1
- package/plugin/skills/implement/SKILL.md +1 -1
- package/plugin/skills/implement/reference/implement.md +18 -0
- package/plugin/skills/review/SKILL.md +4 -2
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// GH #290 stage 2: the two `.em`-rewriting `em upgrade` steps.
|
|
3
|
+
// - collapse-alternative-events (GH #278): adjacent slices that repeat ONE command and differ only
|
|
4
|
+
// in the event they record (the column-per-event shape) become one slice recording
|
|
5
|
+
// `event A | B @Ctx` (identical payloads) or `oneof { … }` (per-event payloads/clauses).
|
|
6
|
+
// - fold-continuations (GH #287): hand-named continuation slices (only `view … again` lines plus
|
|
7
|
+
// their `ui`) that directly follow their host command slice become `view X again … [shown on
|
|
8
|
+
// "Screen"]` lines inside the host slice (the synthesized `<host>--again` column).
|
|
9
|
+
// Both are TEXT rewrites: the slice blocks are located from the compiled model's line numbers,
|
|
10
|
+
// everything outside the touched blocks is copied verbatim, and nothing is written unless the
|
|
11
|
+
// rewritten text compiles with no error the original did not have and keeps the facts the rewrite
|
|
12
|
+
// must not change (event names; the union of events each read model is built from).
|
|
13
|
+
import { compile } from "../pipeline.js";
|
|
14
|
+
import { normalizeName } from "../model/model.js";
|
|
15
|
+
import { againInstancesOf, continuationOf } from "../model/continuation.js";
|
|
16
|
+
import { blockEnd } from "./storylineSuggest.js";
|
|
17
|
+
import { encodeQuoted } from "../parser/lexer.js";
|
|
18
|
+
function splitLines(text) {
|
|
19
|
+
const eol = text.includes("\r\n") ? "\r\n" : "\n";
|
|
20
|
+
const lines = text.split("\n").map((l) => l.replace(/\r$/, ""));
|
|
21
|
+
const trailing = lines[lines.length - 1] === "";
|
|
22
|
+
if (trailing)
|
|
23
|
+
lines.pop();
|
|
24
|
+
return { lines, eol, trailing };
|
|
25
|
+
}
|
|
26
|
+
function joinLines(lines, eol, trailing) {
|
|
27
|
+
return lines.join(eol) + (trailing ? eol : "");
|
|
28
|
+
}
|
|
29
|
+
/** The slice's block and its elements' line spans, or null when the layout is not safely readable
|
|
30
|
+
* (two elements on one line, an element outside the block). */
|
|
31
|
+
function blockOf(model, lines, index) {
|
|
32
|
+
const slice = model.slices[index];
|
|
33
|
+
if (slice.synthesized)
|
|
34
|
+
return null;
|
|
35
|
+
const start = slice.line - 1;
|
|
36
|
+
const end = blockEnd(lines, start);
|
|
37
|
+
const els = model.elements.filter((e) => e.sliceIndex === index).sort((a, b) => a.line - b.line);
|
|
38
|
+
const out = [];
|
|
39
|
+
for (let k = 0; k < els.length; k++) {
|
|
40
|
+
const first = els[k].line - 1;
|
|
41
|
+
if (first <= start || first >= end)
|
|
42
|
+
return null;
|
|
43
|
+
if (k > 0 && first === els[k - 1].line - 1)
|
|
44
|
+
return null;
|
|
45
|
+
let last = (k + 1 < els.length ? els[k + 1].line - 1 : end) - 1;
|
|
46
|
+
while (last > first && lines[last].trim() === "")
|
|
47
|
+
last--;
|
|
48
|
+
out.push({ el: els[k], first, last });
|
|
49
|
+
}
|
|
50
|
+
return { index, start, end, elements: out };
|
|
51
|
+
}
|
|
52
|
+
const norm = (ls) => ls.map((l) => l.trim()).filter((l) => l !== "").join("\n");
|
|
53
|
+
// a `note "…"` binding is compared by hasNote(), not by text: only the first slice may carry one
|
|
54
|
+
const spanText = (lines, s) => norm(lines.slice(s.first, s.last + 1)).replace(/\s+note\s+"(?:[^"\\]|\\.)*"/g, "");
|
|
55
|
+
const hasNote = (b) => b.elements.some((s) => s.el.note !== undefined || s.el.issue !== undefined || s.el.divergence !== undefined);
|
|
56
|
+
function errorCounts(src) {
|
|
57
|
+
try {
|
|
58
|
+
const m = new Map();
|
|
59
|
+
for (const d of compile(src).diagnostics)
|
|
60
|
+
if (d.severity === "error")
|
|
61
|
+
m.set(d.code, (m.get(d.code) ?? 0) + 1);
|
|
62
|
+
return m;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** No error code occurs more often in `next` than in `prev`, and `next` parses. */
|
|
69
|
+
function noNewErrors(prev, next) {
|
|
70
|
+
const a = errorCounts(prev);
|
|
71
|
+
const b = errorCounts(next);
|
|
72
|
+
if (a === null || b === null)
|
|
73
|
+
return false;
|
|
74
|
+
for (const [code, n] of b)
|
|
75
|
+
if (n > (a.get(code) ?? 0))
|
|
76
|
+
return false;
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
/** viewName -> the events its originating instance and every `again` instance are built from. */
|
|
80
|
+
function viewSourcesUnion(model) {
|
|
81
|
+
const out = new Map();
|
|
82
|
+
for (const el of model.elements) {
|
|
83
|
+
if (el.kind !== "view" || el.again === true)
|
|
84
|
+
continue;
|
|
85
|
+
const names = new Set();
|
|
86
|
+
for (const inst of [el, ...againInstancesOf(model, el)])
|
|
87
|
+
for (const n of inst.from ?? [])
|
|
88
|
+
names.add(normalizeName(n));
|
|
89
|
+
out.set(normalizeName(el.name), [...names].sort());
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
export function planCollapseAlternativeEvents(model, refs, text) {
|
|
94
|
+
const { lines, eol, trailing } = splitLines(text);
|
|
95
|
+
const blocks = model.slices.map((_, i) => blockOf(model, lines, i));
|
|
96
|
+
const shape = (b) => {
|
|
97
|
+
if (b === null)
|
|
98
|
+
return null;
|
|
99
|
+
const cmds = b.elements.filter((s) => s.el.kind === "command");
|
|
100
|
+
const evs = b.elements.filter((s) => s.el.kind === "event");
|
|
101
|
+
const rest = b.elements.filter((s) => s.el.kind !== "command" && s.el.kind !== "event" && s.el.kind !== "ui");
|
|
102
|
+
if (cmds.length !== 1 || evs.length !== 1 || rest.length > 0)
|
|
103
|
+
return null;
|
|
104
|
+
if (evs[0].el.alternativeGroup !== undefined)
|
|
105
|
+
return null;
|
|
106
|
+
return { cmd: cmds[0], ev: evs[0], uis: b.elements.filter((s) => s.el.kind === "ui") };
|
|
107
|
+
};
|
|
108
|
+
const mergeable = (a, b) => {
|
|
109
|
+
const x = blocks[a], y = blocks[b];
|
|
110
|
+
const sa = shape(x), sb = shape(y);
|
|
111
|
+
if (!x || !y || !sa || !sb)
|
|
112
|
+
return false;
|
|
113
|
+
if (model.slices[b].synthesized || model.slices[a + 1]?.synthesized)
|
|
114
|
+
return false;
|
|
115
|
+
if (model.slices[a].storyline !== model.slices[b].storyline)
|
|
116
|
+
return false;
|
|
117
|
+
if (hasNote(y) || (model.slices[b].source !== undefined && model.slices[b].source !== model.slices[a].source))
|
|
118
|
+
return false;
|
|
119
|
+
if (spanText(lines, sa.cmd) !== spanText(lines, sb.cmd))
|
|
120
|
+
return false;
|
|
121
|
+
if (sa.uis.map((s) => spanText(lines, s)).sort().join("\n") !== sb.uis.map((s) => spanText(lines, s)).sort().join("\n"))
|
|
122
|
+
return false;
|
|
123
|
+
if (sa.ev.el.context !== sb.ev.el.context)
|
|
124
|
+
return false;
|
|
125
|
+
for (let k = y.start - 1; k > x.end; k--)
|
|
126
|
+
if (lines[k].trim() !== "" && !lines[k].trim().startsWith("#"))
|
|
127
|
+
return false; // a declaration between
|
|
128
|
+
return true;
|
|
129
|
+
};
|
|
130
|
+
const runs = [];
|
|
131
|
+
for (let i = 0; i < model.slices.length;) {
|
|
132
|
+
let j = i;
|
|
133
|
+
const names = new Set();
|
|
134
|
+
const si = shape(blocks[i]);
|
|
135
|
+
if (si)
|
|
136
|
+
names.add(normalizeName(si.ev.el.name));
|
|
137
|
+
while (si && j + 1 < model.slices.length && mergeable(i, j + 1)) {
|
|
138
|
+
const nm = normalizeName(shape(blocks[j + 1]).ev.el.name);
|
|
139
|
+
if (names.has(nm))
|
|
140
|
+
break;
|
|
141
|
+
names.add(nm);
|
|
142
|
+
j++;
|
|
143
|
+
}
|
|
144
|
+
if (j > i)
|
|
145
|
+
runs.push({ first: i, last: j });
|
|
146
|
+
i = j + 1;
|
|
147
|
+
}
|
|
148
|
+
if (runs.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
const groups = [];
|
|
151
|
+
let out = lines.slice();
|
|
152
|
+
for (const run of runs.slice().reverse()) {
|
|
153
|
+
const members = Array.from({ length: run.last - run.first + 1 }, (_, k) => run.first + k);
|
|
154
|
+
const first = blocks[run.first];
|
|
155
|
+
const evSpans = members.map((i) => shape(blocks[i]).ev);
|
|
156
|
+
const names = evSpans.map((s) => s.el.name);
|
|
157
|
+
const normalised = evSpans.map((s, k) => {
|
|
158
|
+
const l = lines.slice(s.first, s.last + 1);
|
|
159
|
+
l[0] = l[0].replace(`event ${names[k]}`, "event §");
|
|
160
|
+
return norm(l);
|
|
161
|
+
});
|
|
162
|
+
const inline = normalised.every((n) => n === normalised[0]);
|
|
163
|
+
const e0 = evSpans[0];
|
|
164
|
+
const indent = /^\s*/.exec(lines[e0.first])[0];
|
|
165
|
+
let replacement;
|
|
166
|
+
if (inline) {
|
|
167
|
+
replacement = lines.slice(e0.first, e0.last + 1);
|
|
168
|
+
replacement[0] = replacement[0].replace(`event ${names[0]}`, `event ${names.join(" | ")}`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
replacement = [`${indent}oneof {`];
|
|
172
|
+
for (const s of evSpans)
|
|
173
|
+
for (const l of lines.slice(s.first, s.last + 1))
|
|
174
|
+
replacement.push(l.trim() === "" ? l : ` ${l}`);
|
|
175
|
+
replacement.push(`${indent}}`);
|
|
176
|
+
}
|
|
177
|
+
const keep = [];
|
|
178
|
+
for (const m of members.slice(0, -1)) {
|
|
179
|
+
for (let i = blocks[m].end + 1; i < blocks[m + 1].start; i++)
|
|
180
|
+
if (lines[i].trim().startsWith("#"))
|
|
181
|
+
keep.push(lines[i]); // comments between the merged slices stay
|
|
182
|
+
}
|
|
183
|
+
const head = lines.slice(first.start, e0.first).concat(replacement, lines.slice(e0.last + 1, first.end + 1));
|
|
184
|
+
out = out.slice(0, first.start).concat(head, keep, out.slice(blocks[run.last].end + 1));
|
|
185
|
+
groups.unshift({
|
|
186
|
+
slices: members.map((i) => model.slices[i].name),
|
|
187
|
+
keys: members.map((i) => refs.sliceKeys[i]),
|
|
188
|
+
events: names,
|
|
189
|
+
form: inline ? "inline" : "oneof",
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const next = joinLines(out, eol, trailing);
|
|
193
|
+
if (!noNewErrors(text, next))
|
|
194
|
+
return null;
|
|
195
|
+
// The recorded facts must not change: the same event names, in the same order.
|
|
196
|
+
const before = model.elements.filter((e) => e.kind === "event").map((e) => e.name);
|
|
197
|
+
const after = compile(next).model.elements.filter((e) => e.kind === "event").map((e) => e.name);
|
|
198
|
+
if (before.join("\u0000") !== after.join("\u0000"))
|
|
199
|
+
return null;
|
|
200
|
+
if (!viewSourcesEqual(model, compile(next).model))
|
|
201
|
+
return null;
|
|
202
|
+
return { groups, next };
|
|
203
|
+
}
|
|
204
|
+
function viewSourcesEqual(a, b) {
|
|
205
|
+
const x = viewSourcesUnion(a), y = viewSourcesUnion(b);
|
|
206
|
+
if (x.size !== y.size)
|
|
207
|
+
return false;
|
|
208
|
+
for (const [k, v] of x)
|
|
209
|
+
if ((y.get(k) ?? []).join("\u0000") !== v.join("\u0000"))
|
|
210
|
+
return false;
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
const FROM_LIST = /\bfrom\s+"(?:[^"\\]|\\.)*"(?:\s*,\s*"(?:[^"\\]|\\.)*")*/;
|
|
214
|
+
export function planFoldContinuations(model, refs, text) {
|
|
215
|
+
const { lines, eol, trailing } = splitLines(text);
|
|
216
|
+
const blocks = model.slices.map((_, i) => blockOf(model, lines, i));
|
|
217
|
+
const groups = [];
|
|
218
|
+
const refused = [];
|
|
219
|
+
const removals = [];
|
|
220
|
+
const insertions = new Map(); // host block end line -> lines to insert before it
|
|
221
|
+
const folded = new Set();
|
|
222
|
+
const uiDeclaredElsewhere = (name, persona, excluding) => model.elements.some((e) => e.kind === "ui" && normalizeName(e.name) === normalizeName(name) && e.persona === persona && !excluding.has(e.sliceIndex));
|
|
223
|
+
for (let h = 0; h < model.slices.length; h++) {
|
|
224
|
+
const hb = blocks[h];
|
|
225
|
+
if (!hb || folded.has(h) || continuationOf(model, refs, h) !== null)
|
|
226
|
+
continue;
|
|
227
|
+
if (!hb.elements.some((s) => s.el.kind === "command"))
|
|
228
|
+
continue;
|
|
229
|
+
const hostEvents = new Set(hb.elements.filter((s) => s.el.kind === "event").map((s) => normalizeName(s.el.name)));
|
|
230
|
+
const hostUi = hb.elements.find((s) => s.el.kind === "ui")?.el;
|
|
231
|
+
const members = [];
|
|
232
|
+
const added = [];
|
|
233
|
+
let c = h + 1;
|
|
234
|
+
while (c < model.slices.length) {
|
|
235
|
+
if (model.slices[c].synthesized) {
|
|
236
|
+
if (model.slices[c].synthesized.host === h) {
|
|
237
|
+
c++;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
const cb = blocks[c];
|
|
243
|
+
if (!cb || continuationOf(model, refs, c) === null)
|
|
244
|
+
break;
|
|
245
|
+
if (model.slices[c].storyline !== model.slices[h].storyline || hasNote(cb))
|
|
246
|
+
break;
|
|
247
|
+
const uis = cb.elements.filter((s) => s.el.kind === "ui");
|
|
248
|
+
const views = cb.elements.filter((s) => s.el.kind === "view");
|
|
249
|
+
const trial = new Set([...folded, ...members, c]);
|
|
250
|
+
const out = [];
|
|
251
|
+
let ok = views.length > 0;
|
|
252
|
+
for (const v of views) {
|
|
253
|
+
const first = lines[v.first];
|
|
254
|
+
const from = v.el.from ?? [];
|
|
255
|
+
if (!from.some((n) => hostEvents.has(normalizeName(n))) || !FROM_LIST.test(first)) {
|
|
256
|
+
ok = false;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
const span = lines.slice(v.first, v.last + 1);
|
|
260
|
+
const shownOn = /\bshown\s+on\s+"((?:[^"\\]|\\.)*)"/.exec(span.join("\n"));
|
|
261
|
+
if (shownOn) {
|
|
262
|
+
const u = model.elements.find((e) => e.kind === "ui" && e.sliceIndex === c && normalizeName(e.name) === normalizeName(shownOn[1]));
|
|
263
|
+
if (!u || !uiDeclaredElsewhere(u.name, u.persona, trial))
|
|
264
|
+
ok = false;
|
|
265
|
+
}
|
|
266
|
+
else if (uis.length === 1) {
|
|
267
|
+
const u = uis[0].el;
|
|
268
|
+
const sameAsHost = hostUi !== undefined && normalizeName(hostUi.name) === normalizeName(u.name) && hostUi.persona === u.persona;
|
|
269
|
+
if (!sameAsHost) {
|
|
270
|
+
if (!uiDeclaredElsewhere(u.name, u.persona, trial))
|
|
271
|
+
ok = false;
|
|
272
|
+
else
|
|
273
|
+
span[0] = span[0].replace(FROM_LIST, (m) => `${m} shown on "${encodeQuoted(u.name)}"`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else
|
|
277
|
+
ok = false; // no consumer, or several screens the old wiring cannot be reproduced for
|
|
278
|
+
if (!ok)
|
|
279
|
+
break;
|
|
280
|
+
out.push(...span);
|
|
281
|
+
}
|
|
282
|
+
if (!ok)
|
|
283
|
+
break;
|
|
284
|
+
members.push(c);
|
|
285
|
+
added.push(...out);
|
|
286
|
+
c++;
|
|
287
|
+
}
|
|
288
|
+
if (members.length === 0)
|
|
289
|
+
continue;
|
|
290
|
+
// Continuations of several views would be re-joined to ONE host column, moving another view's
|
|
291
|
+
// instance into the first view's (possibly signed) doc: refuse the host, leave it unfolded.
|
|
292
|
+
const views = new Set(members.flatMap((m) => blocks[m].elements.filter((s) => s.el.kind === "view").map((s) => s.el.logicalId)));
|
|
293
|
+
if (views.size > 1) {
|
|
294
|
+
refused.push({ host: model.slices[h].name, hostKey: refs.sliceKeys[h], reason: "continuations of several views — fold by hand or keep the stacked slice" });
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
for (const m of members)
|
|
298
|
+
folded.add(m);
|
|
299
|
+
insertions.set(hb.end, added);
|
|
300
|
+
for (const m of members) {
|
|
301
|
+
const b = blocks[m];
|
|
302
|
+
removals.push({ from: b.start > 0 && lines[b.start - 1].trim() === "" ? b.start - 1 : b.start, to: b.end });
|
|
303
|
+
}
|
|
304
|
+
groups.push({
|
|
305
|
+
host: model.slices[h].name,
|
|
306
|
+
hostKey: refs.sliceKeys[h],
|
|
307
|
+
folded: members.map((m) => model.slices[m].name),
|
|
308
|
+
foldedKeys: members.map((m) => refs.sliceKeys[m]),
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
if (groups.length === 0)
|
|
312
|
+
return refused.length > 0 ? { groups, refused, next: text } : null; // nothing to fold, but say why
|
|
313
|
+
const drop = new Set();
|
|
314
|
+
for (const r of removals)
|
|
315
|
+
for (let i = r.from; i <= r.to; i++)
|
|
316
|
+
drop.add(i);
|
|
317
|
+
const out = [];
|
|
318
|
+
for (let i = 0; i < lines.length; i++) {
|
|
319
|
+
const ins = insertions.get(i);
|
|
320
|
+
if (ins)
|
|
321
|
+
out.push(...ins);
|
|
322
|
+
if (!drop.has(i))
|
|
323
|
+
out.push(lines[i]);
|
|
324
|
+
}
|
|
325
|
+
const next = joinLines(out, eol, trailing);
|
|
326
|
+
if (!noNewErrors(text, next))
|
|
327
|
+
return null;
|
|
328
|
+
const nm = compile(next).model;
|
|
329
|
+
if (!viewSourcesEqual(model, nm))
|
|
330
|
+
return null;
|
|
331
|
+
return { groups, refused, next };
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Consecutive hand-named continuation slices that continue the SAME read model (the first `view …
|
|
335
|
+
* again` of each names one originating view, and so do all their lines) and show the same `ui`s
|
|
336
|
+
* become ONE continuation slice with stacked `again` lines (GH #287, "several `again` lines in one
|
|
337
|
+
* continuation slice"), keeping the FIRST slice's name and key. Nothing about which view the slice
|
|
338
|
+
* continues changes, so `continuationOf`, the doc join and the kept key's index row are exact;
|
|
339
|
+
* the dropped keys are reported. Continuations of different views are never stacked.
|
|
340
|
+
*/
|
|
341
|
+
export function planStackContinuations(model, refs, text) {
|
|
342
|
+
const { lines, eol, trailing } = splitLines(text);
|
|
343
|
+
const blocks = model.slices.map((_, i) => blockOf(model, lines, i));
|
|
344
|
+
const groups = [];
|
|
345
|
+
const skipped = [];
|
|
346
|
+
const removals = [];
|
|
347
|
+
const insertions = new Map();
|
|
348
|
+
const uiSig = (b) => b.elements.filter((s) => s.el.kind === "ui").map((s) => `${normalizeName(s.el.name)}@${s.el.persona}`).sort().join(",");
|
|
349
|
+
const viewIds = (b) => b.elements.filter((s) => s.el.kind === "view").map((s) => s.el.logicalId);
|
|
350
|
+
const isCont = (i) => !model.slices[i].synthesized && blocks[i] !== null && continuationOf(model, refs, i) !== null && !hasNote(blocks[i]);
|
|
351
|
+
for (let c = 0; c < model.slices.length; c++) {
|
|
352
|
+
if (!isCont(c))
|
|
353
|
+
continue;
|
|
354
|
+
const head = blocks[c];
|
|
355
|
+
const origin = viewIds(head)[0];
|
|
356
|
+
const run = [c];
|
|
357
|
+
for (let n = c + 1; n < model.slices.length && isCont(n); n++) {
|
|
358
|
+
const b = blocks[n];
|
|
359
|
+
if (model.slices[n].storyline !== model.slices[c].storyline)
|
|
360
|
+
break;
|
|
361
|
+
if (viewIds(head).some((v) => v !== origin) || viewIds(b).some((v) => v !== origin)) {
|
|
362
|
+
skipped.push({ key: refs.sliceKeys[n], reason: "continues a different view" });
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
if (uiSig(b) !== uiSig(head))
|
|
366
|
+
break;
|
|
367
|
+
let gapClean = true;
|
|
368
|
+
for (let k = blocks[run[run.length - 1]].end + 1; k < b.start; k++)
|
|
369
|
+
if (lines[k].trim() !== "" && !lines[k].trim().startsWith("#"))
|
|
370
|
+
gapClean = false;
|
|
371
|
+
if (!gapClean)
|
|
372
|
+
break;
|
|
373
|
+
run.push(n);
|
|
374
|
+
}
|
|
375
|
+
if (run.length < 2) {
|
|
376
|
+
// a different-view neighbour is reported once, and is not the start of another run
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
const added = [];
|
|
380
|
+
for (const n of run.slice(1)) {
|
|
381
|
+
for (const v of blocks[n].elements.filter((s) => s.el.kind === "view"))
|
|
382
|
+
added.push(...lines.slice(v.first, v.last + 1));
|
|
383
|
+
removals.push({ from: blocks[n].start > 0 && lines[blocks[n].start - 1].trim() === "" ? blocks[n].start - 1 : blocks[n].start, to: blocks[n].end });
|
|
384
|
+
}
|
|
385
|
+
insertions.set(head.end, added);
|
|
386
|
+
groups.push({
|
|
387
|
+
kept: model.slices[c].name,
|
|
388
|
+
keptKey: refs.sliceKeys[c],
|
|
389
|
+
dropped: run.slice(1).map((n) => model.slices[n].name),
|
|
390
|
+
droppedKeys: run.slice(1).map((n) => refs.sliceKeys[n]),
|
|
391
|
+
});
|
|
392
|
+
c = run[run.length - 1];
|
|
393
|
+
}
|
|
394
|
+
if (groups.length === 0)
|
|
395
|
+
return null;
|
|
396
|
+
const drop = new Set();
|
|
397
|
+
for (const r of removals)
|
|
398
|
+
for (let i = r.from; i <= r.to; i++)
|
|
399
|
+
drop.add(i);
|
|
400
|
+
const out = [];
|
|
401
|
+
for (let i = 0; i < lines.length; i++) {
|
|
402
|
+
const ins = insertions.get(i);
|
|
403
|
+
if (ins)
|
|
404
|
+
out.push(...ins);
|
|
405
|
+
if (!drop.has(i))
|
|
406
|
+
out.push(lines[i]);
|
|
407
|
+
}
|
|
408
|
+
const next = joinLines(out, eol, trailing);
|
|
409
|
+
if (!noNewErrors(text, next))
|
|
410
|
+
return null;
|
|
411
|
+
const after = compile(next);
|
|
412
|
+
if (!viewSourcesEqual(model, after.model))
|
|
413
|
+
return null;
|
|
414
|
+
// The kept slices must still be continuations of the same originating slice.
|
|
415
|
+
for (const g of groups) {
|
|
416
|
+
const before = model.slices.findIndex((_, i) => refs.sliceKeys[i] === g.keptKey);
|
|
417
|
+
const idx = after.refs.sliceKeys.indexOf(g.keptKey);
|
|
418
|
+
const was = continuationOf(model, refs, before);
|
|
419
|
+
const now = idx === -1 ? null : continuationOf(after.model, after.refs, idx);
|
|
420
|
+
if (!was || !now || was.sliceKey !== now.sliceKey)
|
|
421
|
+
return null;
|
|
422
|
+
}
|
|
423
|
+
return { groups, skipped, next };
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=upgradeReshape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgradeReshape.js","sourceRoot":"","sources":["../../src/cli/upgradeReshape.ts"],"names":[],"mappings":"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"}
|