adr-kit 0.9.0 → 0.10.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.
Files changed (61) hide show
  1. package/README.md +18 -5
  2. package/README.zh.md +14 -4
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +14 -5
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/completion.js +2 -2
  7. package/dist/commands/completion.js.map +1 -1
  8. package/dist/commands/graph.d.ts +1 -0
  9. package/dist/commands/graph.d.ts.map +1 -1
  10. package/dist/commands/graph.js +4 -1
  11. package/dist/commands/graph.js.map +1 -1
  12. package/dist/commands/tree.d.ts +1 -1
  13. package/dist/commands/tree.d.ts.map +1 -1
  14. package/dist/commands/tree.js +4 -1
  15. package/dist/commands/tree.js.map +1 -1
  16. package/dist/core/canvas-view.d.ts +5 -0
  17. package/dist/core/canvas-view.d.ts.map +1 -0
  18. package/dist/core/canvas-view.js +121 -0
  19. package/dist/core/canvas-view.js.map +1 -0
  20. package/dist/core/deliberation-html.d.ts +4 -0
  21. package/dist/core/deliberation-html.d.ts.map +1 -0
  22. package/dist/core/deliberation-html.js +81 -0
  23. package/dist/core/deliberation-html.js.map +1 -0
  24. package/dist/core/deliberation-view.d.ts +4 -0
  25. package/dist/core/deliberation-view.d.ts.map +1 -0
  26. package/dist/core/deliberation-view.js +508 -0
  27. package/dist/core/deliberation-view.js.map +1 -0
  28. package/dist/core/deliberation.d.ts +26 -7
  29. package/dist/core/deliberation.d.ts.map +1 -1
  30. package/dist/core/deliberation.js +165 -35
  31. package/dist/core/deliberation.js.map +1 -1
  32. package/dist/core/graph-html.d.ts +8 -0
  33. package/dist/core/graph-html.d.ts.map +1 -0
  34. package/dist/core/graph-html.js +180 -0
  35. package/dist/core/graph-html.js.map +1 -0
  36. package/dist/core/graph-view.d.ts +3 -0
  37. package/dist/core/graph-view.d.ts.map +1 -0
  38. package/dist/core/graph-view.js +258 -0
  39. package/dist/core/graph-view.js.map +1 -0
  40. package/dist/core/graph.d.ts +4 -1
  41. package/dist/core/graph.d.ts.map +1 -1
  42. package/dist/core/graph.js +11 -2
  43. package/dist/core/graph.js.map +1 -1
  44. package/dist/core/repository.d.ts.map +1 -1
  45. package/dist/core/repository.js +6 -2
  46. package/dist/core/repository.js.map +1 -1
  47. package/dist/core/templates.d.ts +8 -3
  48. package/dist/core/templates.d.ts.map +1 -1
  49. package/dist/core/templates.js +10 -2
  50. package/dist/core/templates.js.map +1 -1
  51. package/dist/core/tool-integrations.d.ts.map +1 -1
  52. package/dist/core/tool-integrations.js +37 -5
  53. package/dist/core/tool-integrations.js.map +1 -1
  54. package/dist/core/validate.d.ts.map +1 -1
  55. package/dist/core/validate.js +31 -1
  56. package/dist/core/validate.js.map +1 -1
  57. package/dist/core/view-text.d.ts +14 -0
  58. package/dist/core/view-text.d.ts.map +1 -0
  59. package/dist/core/view-text.js +77 -0
  60. package/dist/core/view-text.js.map +1 -0
  61. package/package.json +1 -1
@@ -1,16 +1,58 @@
1
- /**
2
- * The optional `## Deliberation` appendix: a grilling session's design tree,
3
- * stored as a nested Markdown list so it stays diffable and readable, and
4
- * rendered to mermaid or text on demand. Mermaid is never the source of truth.
5
- */
1
+ import { renderCardTree } from './deliberation-html.js';
2
+ import { wrapText } from './view-text.js';
6
3
  const BULLET = /^(\s*)-\s+(.*?)\s*$/;
7
- const STATUS = /\s*\[(settled|rejected|open)\]\s*$/i;
4
+ const STATUS = /\[(settled|rejected|open)\]/i;
5
+ const RECOMMENDED = /\(recommended\)\s*$/i;
6
+ const TYPE = /^([QA]):\s+/i;
7
+ const EM_DASH = ' \u2014 ';
8
8
  /**
9
- * Parse the nested list under `## Deliberation`. Indentation defines the
10
- * tree; a trailing `[settled]`, `[rejected]`, or `[open]` marks a node.
11
- * Non-bullet lines are commentary and ignored, so a session can interleave
12
- * prose without breaking the tree.
9
+ * Split a trailing ` — reason` off the node text. The em dash with spaces is
10
+ * the only separator the grammar reserves, which leaves a hyphen free for
11
+ * prose: a ` - ` inside the text can never cut the state or the recommendation
12
+ * into the reason.
13
13
  */
14
+ function splitReason(raw) {
15
+ const emDash = raw.lastIndexOf(EM_DASH);
16
+ if (emDash === -1)
17
+ return { content: raw };
18
+ return { content: raw.slice(0, emDash).trimEnd(), reason: raw.slice(emDash + EM_DASH.length).trim() };
19
+ }
20
+ /** Parse one bullet from the end inward, so a reason never hides the status. */
21
+ function parseNodeText(raw) {
22
+ const split = splitReason(raw);
23
+ let content = split.content;
24
+ const reason = split.reason;
25
+ let recommended;
26
+ if (RECOMMENDED.test(content)) {
27
+ recommended = true;
28
+ content = content.replace(RECOMMENDED, '').trimEnd();
29
+ }
30
+ let status;
31
+ const statusMatch = content.match(STATUS);
32
+ if (statusMatch !== null && statusMatch.index !== undefined) {
33
+ status = statusMatch[1].toLowerCase();
34
+ content = (content.slice(0, statusMatch.index) + content.slice(statusMatch.index + statusMatch[0].length)).trim();
35
+ }
36
+ let type;
37
+ const typeMatch = content.match(TYPE);
38
+ if (typeMatch !== null) {
39
+ type = typeMatch[1].toUpperCase() === 'Q' ? 'question' : 'option';
40
+ content = content.slice(typeMatch[0].length).trim();
41
+ }
42
+ const text = content.trim();
43
+ if (text.length === 0)
44
+ return undefined;
45
+ const node = { text };
46
+ if (type !== undefined)
47
+ node.type = type;
48
+ if (status !== undefined)
49
+ node.status = status;
50
+ if (recommended !== undefined)
51
+ node.recommended = recommended;
52
+ if (reason !== undefined && reason.length > 0)
53
+ node.reason = reason;
54
+ return node;
55
+ }
14
56
  export function parseDeliberation(body) {
15
57
  if (body === undefined)
16
58
  return [];
@@ -21,18 +63,18 @@ export function parseDeliberation(body) {
21
63
  if (match === null)
22
64
  continue;
23
65
  const indent = match[1].replace(/\t/g, ' ').length;
24
- let text = match[2];
25
- let status;
26
- const statusMatch = text.match(STATUS);
27
- if (statusMatch !== null && statusMatch.index !== undefined) {
28
- status = statusMatch[1].toLowerCase();
29
- text = text.slice(0, statusMatch.index).trim();
30
- }
31
- if (text.length === 0)
66
+ const parsed = parseNodeText(match[2]);
67
+ if (parsed === undefined)
32
68
  continue;
33
- const node = { text, children: [] };
34
- if (status !== undefined)
35
- node.status = status;
69
+ const node = { text: parsed.text, children: [] };
70
+ if (parsed.type !== undefined)
71
+ node.type = parsed.type;
72
+ if (parsed.status !== undefined)
73
+ node.status = parsed.status;
74
+ if (parsed.recommended !== undefined)
75
+ node.recommended = parsed.recommended;
76
+ if (parsed.reason !== undefined)
77
+ node.reason = parsed.reason;
36
78
  while (stack.length > 0 && stack[stack.length - 1].indent >= indent)
37
79
  stack.pop();
38
80
  const parent = stack[stack.length - 1];
@@ -44,39 +86,127 @@ export function parseDeliberation(body) {
44
86
  }
45
87
  return roots;
46
88
  }
89
+ /**
90
+ * True when the body parses to at least one node: the same predicate `tree`
91
+ * renders by, so a marker can never promise a tree the command refuses.
92
+ */
93
+ export function hasDeliberationTree(body) {
94
+ return parseDeliberation(body).length > 0;
95
+ }
96
+ /** Explicit Q:/A:, else children decide. */
97
+ function typeOf(node) {
98
+ if (node.type !== undefined)
99
+ return node.type;
100
+ return node.children.length > 0 ? 'question' : 'option';
101
+ }
102
+ /**
103
+ * A question whose answer (its settled child) is not the option the agent
104
+ * recommended. Unknown unless both a settled child and a recommended child
105
+ * exist.
106
+ */
107
+ function isOverride(node) {
108
+ const settled = node.children.filter((child) => child.status === 'settled');
109
+ const recommended = node.children.filter((child) => child.recommended === true);
110
+ if (settled.length === 0 || recommended.length === 0)
111
+ return false;
112
+ return !settled.some((child) => child.recommended === true);
113
+ }
114
+ function markers(node) {
115
+ const parts = [];
116
+ if (node.status !== undefined)
117
+ parts.push('[' + node.status + ']');
118
+ if (node.recommended === true)
119
+ parts.push('(recommended)');
120
+ if (isOverride(node))
121
+ parts.push('(override)');
122
+ if (node.reason !== undefined)
123
+ parts.push('\u2014 ' + node.reason);
124
+ return parts.join(' ');
125
+ }
47
126
  export function renderDeliberationText(nodes) {
48
127
  const lines = [];
49
128
  const walk = (list, depth) => {
50
129
  for (const node of list) {
51
- const suffix = node.status === undefined ? '' : ` [${node.status}]`;
52
- lines.push(`${' '.repeat(depth)}- ${node.text}${suffix}`);
130
+ const prefix = depth === 0 && node.type === undefined ? '' : (typeOf(node) === 'question' ? 'Q: ' : 'A: ');
131
+ const suffix = markers(node);
132
+ lines.push(' '.repeat(depth) + '- ' + prefix + node.text + (suffix.length > 0 ? ' ' + suffix : ''));
53
133
  walk(node.children, depth + 1);
54
134
  }
55
135
  };
56
136
  walk(nodes, 0);
57
137
  return lines.join('\n');
58
138
  }
139
+ function escapeLabel(text) {
140
+ return text.replace(/"/g, "'");
141
+ }
142
+ /** Wrap a long label for mermaid's HTML labels. */
143
+ function wrapLabel(text, width = 48) {
144
+ return wrapText(text, width).join('<br/>');
145
+ }
59
146
  export function renderDeliberationMermaid(nodes) {
60
- const lines = ['graph TD'];
61
- const byStatus = { settled: [], rejected: [], open: [] };
147
+ const entries = [];
62
148
  let counter = 0;
63
- const walk = (list, parentId) => {
149
+ const collect = (list, parentId, depth) => {
64
150
  for (const node of list) {
65
- const id = `n${++counter}`;
66
- lines.push(` ${id}["${node.text.replace(/"/g, "'")}"]`);
151
+ const id = 'n' + (++counter);
152
+ const entry = { id, node, isRoot: depth === 0 && node.type === undefined };
67
153
  if (parentId !== undefined)
68
- lines.push(` ${parentId} --> ${id}`);
69
- if (node.status !== undefined)
70
- byStatus[node.status].push(id);
71
- walk(node.children, id);
154
+ entry.parentId = parentId;
155
+ entries.push(entry);
156
+ collect(node.children, id, depth + 1);
72
157
  }
73
158
  };
74
- walk(nodes, undefined);
75
- lines.push(' classDef settled fill:#dcfce7,stroke:#16a34a;', ' classDef rejected fill:#fee2e2,stroke:#dc2626;', ' classDef open fill:#fef9c3,stroke:#ca8a04;');
159
+ collect(nodes, undefined, 0);
160
+ const lines = ['graph TD'];
161
+ const labelOf = (node) => wrapLabel(escapeLabel(node.reason === undefined ? node.text : node.text + ' \u2014 ' + node.reason));
162
+ for (const entry of entries) {
163
+ const label = labelOf(entry.node);
164
+ const shape = entry.isRoot
165
+ ? '(["' + label + '"])'
166
+ : (typeOf(entry.node) === 'question' ? '{{"' + label + '"}}' : '["' + label + '"]');
167
+ lines.push(' ' + entry.id + shape);
168
+ }
169
+ // A settled non-root node unlocks its follow-up questions. Unsettled
170
+ // branches retain ordinary edges rather than claiming frontier progress.
171
+ const byId = new Map(entries.map((entry) => [entry.id, entry]));
172
+ const unlockEdges = [];
173
+ let edgeIndex = 0;
174
+ for (const entry of entries) {
175
+ if (entry.parentId === undefined)
176
+ continue;
177
+ const parent = byId.get(entry.parentId);
178
+ lines.push(' ' + entry.parentId + ' --> ' + entry.id);
179
+ if (typeOf(entry.node) === 'question' && !parent.isRoot && parent.node.status === 'settled') {
180
+ unlockEdges.push(edgeIndex);
181
+ }
182
+ edgeIndex++;
183
+ }
184
+ const byStatus = { settled: [], rejected: [], open: [] };
185
+ const recommended = [];
186
+ const overridden = [];
187
+ for (const entry of entries) {
188
+ if (entry.node.status !== undefined)
189
+ byStatus[entry.node.status].push(entry.id);
190
+ if (entry.node.recommended === true)
191
+ recommended.push(entry.id);
192
+ if (isOverride(entry.node))
193
+ overridden.push(entry.id);
194
+ }
195
+ lines.push(' classDef settled fill:#dcfce7,stroke:#16a34a;', ' classDef rejected fill:#fee2e2,stroke:#dc2626;', ' classDef open fill:#fef9c3,stroke:#ca8a04;', ' classDef recommended stroke-width:3px;', ' classDef override stroke:#7c3aed,stroke-width:2px,stroke-dasharray:4 2;');
76
196
  for (const status of ['settled', 'rejected', 'open']) {
77
197
  if (byStatus[status].length > 0)
78
- lines.push(` class ${byStatus[status].join(',')} ${status};`);
198
+ lines.push(' class ' + byStatus[status].join(',') + ' ' + status + ';');
79
199
  }
200
+ if (recommended.length > 0)
201
+ lines.push(' class ' + recommended.join(',') + ' recommended;');
202
+ if (overridden.length > 0)
203
+ lines.push(' class ' + overridden.join(',') + ' override;');
204
+ if (unlockEdges.length > 0)
205
+ lines.push(' linkStyle ' + unlockEdges.join(',') + ' stroke:#7c3aed,stroke-width:3px;');
80
206
  return lines.join('\n');
81
207
  }
208
+ /** An offline HTML view; the annotated outline remains the source. */
209
+ export function renderDeliberationHtml(nodes, title) {
210
+ return renderCardTree(nodes, title);
211
+ }
82
212
  //# sourceMappingURL=deliberation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deliberation.js","sourceRoot":"","sources":["../../src/core/deliberation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deliberation.js","sourceRoot":"","sources":["../../src/core/deliberation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DecisionGraph } from './graph.js';
2
+ /**
3
+ * Render a decision graph as one self-contained, offline HTML map. The layout
4
+ * is computed here, at generation time, so the page needs no network, no CDN,
5
+ * and no runtime; every node links to its record file.
6
+ */
7
+ export declare function renderDecisionMapHtml(graph: DecisionGraph, title?: string): string;
8
+ //# sourceMappingURL=graph-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-html.d.ts","sourceRoot":"","sources":["../../src/core/graph-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,YAAY,CAAC;AAoItE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,SAAiB,GAAG,MAAM,CAwD1F"}
@@ -0,0 +1,180 @@
1
+ import { TAG_COLORS } from './graph.js';
2
+ import { MAP_STYLE } from './graph-view.js';
3
+ import { CANVAS_HINT, CANVAS_SCRIPT, canvasControlsHTML } from './canvas-view.js';
4
+ import { escapeHtml, wrapText } from './view-text.js';
5
+ const CARD_W = 248;
6
+ const PAD_X = 16;
7
+ const PAD_Y = 14;
8
+ const META_H = 16;
9
+ const TITLE_H = 18;
10
+ const FOOTER_H = 14;
11
+ const GAP = 6;
12
+ const LINE_CHARS = 30;
13
+ const COL_GAP = 96;
14
+ const NODE_GAP = 22;
15
+ const TOP = 72;
16
+ const LEFT = 28;
17
+ const BOTTOM = 30;
18
+ /** The graph title keeps its "N " prefix; the card shows the number separately. */
19
+ function displayTitle(node) {
20
+ return node.title.replace(/^\d+\s+/, '');
21
+ }
22
+ /** Chronological `created` groups; each becomes one column. */
23
+ function groupByDate(nodes) {
24
+ const groups = new Map();
25
+ for (const node of nodes) {
26
+ const group = groups.get(node.created);
27
+ if (group === undefined)
28
+ groups.set(node.created, [node]);
29
+ else
30
+ group.push(node);
31
+ }
32
+ return [...groups.entries()].sort(([a], [b]) => a.localeCompare(b));
33
+ }
34
+ function layout(graph) {
35
+ const columns = [];
36
+ const placed = [];
37
+ let x = LEFT;
38
+ let bottom = TOP;
39
+ for (const [date, nodes] of groupByDate(graph.nodes)) {
40
+ columns.push({ date, x, count: nodes.length });
41
+ let y = TOP;
42
+ for (const node of nodes) {
43
+ const lines = wrapText(displayTitle(node), LINE_CHARS);
44
+ const footer = node.tags.length > 0 || node.hasDeliberation ? GAP + FOOTER_H : 0;
45
+ const height = PAD_Y * 2 + META_H + GAP + lines.length * TITLE_H + footer;
46
+ placed.push({ node, x, y, height, lines });
47
+ y += height + NODE_GAP;
48
+ }
49
+ bottom = Math.max(bottom, y - NODE_GAP);
50
+ x += CARD_W + COL_GAP;
51
+ }
52
+ const width = columns.length === 0 ? 320 : x - COL_GAP + LEFT;
53
+ return { placed, columns, width, height: bottom + BOTTOM };
54
+ }
55
+ /** Assign each first tag a stable color, in order of first appearance. */
56
+ function tagColors(nodes) {
57
+ const colors = new Map();
58
+ for (const node of nodes) {
59
+ if (node.status === 'superseded')
60
+ continue;
61
+ const tag = node.tags[0];
62
+ if (tag === undefined || colors.has(tag))
63
+ continue;
64
+ colors.set(tag, TAG_COLORS[colors.size % TAG_COLORS.length]);
65
+ }
66
+ return colors;
67
+ }
68
+ /** A left-to-right cubic curve between a source card's right and a target's left edge. */
69
+ function edgePath(from, to) {
70
+ const sx = from.x + CARD_W;
71
+ const sy = from.y + from.height / 2;
72
+ const tx = to.x;
73
+ const ty = to.y + to.height / 2;
74
+ const bend = Math.max(40, Math.abs(tx - sx) * 0.4);
75
+ return 'M' + sx + ',' + sy + ' C' + (sx + bend) + ',' + sy + ' ' + (tx - bend) + ',' + ty + ' ' + tx + ',' + ty;
76
+ }
77
+ function nodeMarkup(placed, colors) {
78
+ const { node, x, y, height, lines } = placed;
79
+ const classes = ['node'];
80
+ if (node.status === 'superseded')
81
+ classes.push('superseded');
82
+ if (node.hasDeliberation)
83
+ classes.push('has-deliberation');
84
+ const firstTag = node.tags[0];
85
+ const stroke = node.status === 'superseded'
86
+ ? '#c2cabf'
87
+ : (firstTag === undefined ? '#dce4dc' : (colors.get(firstTag) ?? '#dce4dc'));
88
+ const metaY = y + PAD_Y + META_H - 5;
89
+ const titleY = y + PAD_Y + META_H + GAP + TITLE_H - 6;
90
+ const parts = [];
91
+ parts.push('<a href="' + escapeHtml(node.path) + '">');
92
+ parts.push('<g class="' + classes.join(' ') + '" data-adr="' + node.number + '" data-has-deliberation="' + String(node.hasDeliberation) + '">');
93
+ parts.push('<rect x="' + x + '" y="' + y + '" width="' + CARD_W + '" height="' + height + '" rx="12" stroke="' + stroke + '"/>');
94
+ parts.push('<text class="num" x="' + (x + PAD_X) + '" y="' + metaY + '">#' + node.number + '</text>');
95
+ const meta = node.status === 'superseded'
96
+ ? (node.supersededBy === undefined ? 'superseded' : 'superseded by ' + node.supersededBy)
97
+ : node.created;
98
+ parts.push('<text class="meta" x="' + (x + CARD_W - PAD_X) + '" y="' + metaY + '" text-anchor="end">' + escapeHtml(meta) + '</text>');
99
+ lines.forEach((line, index) => {
100
+ parts.push('<text class="title" x="' + (x + PAD_X) + '" y="' + (titleY + index * TITLE_H) + '">' + escapeHtml(line) + '</text>');
101
+ });
102
+ if (node.tags.length > 0 || node.hasDeliberation) {
103
+ const footerY = titleY + (lines.length - 1) * TITLE_H + GAP + FOOTER_H - 2;
104
+ if (node.tags.length > 0) {
105
+ const tags = node.tags.slice(0, 3).map((tag) => '#' + tag).join(' ');
106
+ parts.push('<text class="tag" x="' + (x + PAD_X) + '" y="' + footerY + '">' + escapeHtml(tags) + '</text>');
107
+ }
108
+ if (node.hasDeliberation) {
109
+ parts.push('<text class="badge" x="' + (x + CARD_W - PAD_X) + '" y="' + footerY + '" text-anchor="end">deliberation</text>');
110
+ }
111
+ }
112
+ parts.push('</g>');
113
+ parts.push('</a>');
114
+ return parts.join('');
115
+ }
116
+ /**
117
+ * Render a decision graph as one self-contained, offline HTML map. The layout
118
+ * is computed here, at generation time, so the page needs no network, no CDN,
119
+ * and no runtime; every node links to its record file.
120
+ */
121
+ export function renderDecisionMapHtml(graph, title = 'Decision map') {
122
+ const { placed, columns, width, height } = layout(graph);
123
+ const colors = tagColors(placed.map((entry) => entry.node));
124
+ const byNumber = new Map(placed.map((entry) => [entry.node.number, entry]));
125
+ const edges = [];
126
+ const drawEdge = (edge, kind) => {
127
+ const from = byNumber.get(edge.from);
128
+ const to = byNumber.get(edge.to);
129
+ if (from === undefined || to === undefined)
130
+ return;
131
+ edges.push('<path class="edge ' + kind + '" d="' + edgePath(from, to) + '" marker-end="url(#arrow-' + kind + ')"/>');
132
+ };
133
+ for (const edge of graph.referenceEdges)
134
+ drawEdge(edge, 'reference');
135
+ for (const edge of graph.supersedeEdges)
136
+ drawEdge(edge, 'supersede');
137
+ const deliberated = graph.nodes.filter((node) => node.hasDeliberation).length;
138
+ const stats = [
139
+ ['decisions', graph.nodes.length],
140
+ ['supersessions', graph.supersedeEdges.length],
141
+ ['references', graph.referenceEdges.length],
142
+ ['deliberated', deliberated],
143
+ ];
144
+ const svg = [
145
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ' + width + ' ' + height + '" width="' + width + '" height="' + height + '" role="img" aria-label="Decision map">',
146
+ '<defs>',
147
+ '<marker id="arrow-supersede" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#294d3e"/></marker>',
148
+ '<marker id="arrow-reference" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#b6c7ba"/></marker>',
149
+ '</defs>',
150
+ ];
151
+ for (const column of columns) {
152
+ svg.push('<text class="date-label" x="' + column.x + '" y="' + (TOP - 30) + '">' + escapeHtml(column.date) + ' (' + column.count + ')</text>');
153
+ }
154
+ svg.push(...edges);
155
+ for (const entry of placed)
156
+ svg.push(nodeMarkup(entry, colors));
157
+ svg.push('</svg>');
158
+ const body = graph.nodes.length === 0 ? '<p class="empty">No decisions yet.</p>' : svg.join('');
159
+ const html = [
160
+ '<!doctype html>',
161
+ '<html lang="en">',
162
+ '<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">',
163
+ '<title>' + escapeHtml(title) + ' — decision map</title><style>' + MAP_STYLE + '</style></head>',
164
+ '<body>',
165
+ '<header><div class="brand"><span class="logo" aria-hidden="true">↳</span> ADR Kit <small>DECISION MAP</small></div></header>',
166
+ '<section class="intro"><div class="eyebrow">DECISIONS / RELATIONSHIP MAP</div><h1>' + escapeHtml(title) + '</h1>',
167
+ '<p>Solid edges supersede; dashed edges are record references. Grouped by the date each decision was created.</p>',
168
+ '<div class="stats">' + stats.map(([label, value]) => '<div class="stat"><strong>' + value + '</strong>' + label + '</div>').join('') + '</div></section>',
169
+ '<main id="viewport" tabindex="0" aria-label="Decision map" aria-describedby="instructions"><div id="world">' + body + '</div>',
170
+ '<div id="instructions" class="hint">' + CANVAS_HINT + '</div>',
171
+ canvasControlsHTML('Fit map'),
172
+ '</main>',
173
+ '<footer><div class="legend"><span><i class="swatch"></i> superseded by</span><span><i class="swatch ref"></i> references</span><span><i class="swatch delib"></i> has deliberation tree</span></div></footer>',
174
+ '<script>' + CANVAS_SCRIPT + '</script>',
175
+ '</body></html>',
176
+ '',
177
+ ];
178
+ return html.join('\n');
179
+ }
180
+ //# sourceMappingURL=graph-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-html.js","sourceRoot":"","sources":["../../src/core/graph-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Inline assets for the offline decision map. No network or runtime dependency. */
2
+ export declare const MAP_STYLE: string;
3
+ //# sourceMappingURL=graph-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-view.d.ts","sourceRoot":"","sources":["../../src/core/graph-view.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,SAAS,QA+PrB,CAAC"}