archmantic 1.0.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 (175) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +172 -0
  3. package/dist/agent.d.ts +20 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +239 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/analyze/datamodel.d.ts +9 -0
  8. package/dist/analyze/datamodel.d.ts.map +1 -0
  9. package/dist/analyze/datamodel.js +19 -0
  10. package/dist/analyze/datamodel.js.map +1 -0
  11. package/dist/analyze/derive.d.ts +21 -0
  12. package/dist/analyze/derive.d.ts.map +1 -0
  13. package/dist/analyze/derive.js +211 -0
  14. package/dist/analyze/derive.js.map +1 -0
  15. package/dist/analyze/drizzle.d.ts +3 -0
  16. package/dist/analyze/drizzle.d.ts.map +1 -0
  17. package/dist/analyze/drizzle.js +83 -0
  18. package/dist/analyze/drizzle.js.map +1 -0
  19. package/dist/analyze/endpoints.d.ts +3 -0
  20. package/dist/analyze/endpoints.d.ts.map +1 -0
  21. package/dist/analyze/endpoints.js +167 -0
  22. package/dist/analyze/endpoints.js.map +1 -0
  23. package/dist/analyze/fs-util.d.ts +3 -0
  24. package/dist/analyze/fs-util.d.ts.map +1 -0
  25. package/dist/analyze/fs-util.js +44 -0
  26. package/dist/analyze/fs-util.js.map +1 -0
  27. package/dist/analyze/incremental.d.ts +12 -0
  28. package/dist/analyze/incremental.d.ts.map +1 -0
  29. package/dist/analyze/incremental.js +102 -0
  30. package/dist/analyze/incremental.js.map +1 -0
  31. package/dist/analyze/index.d.ts +5 -0
  32. package/dist/analyze/index.d.ts.map +1 -0
  33. package/dist/analyze/index.js +49 -0
  34. package/dist/analyze/index.js.map +1 -0
  35. package/dist/analyze/parse-util.d.ts +10 -0
  36. package/dist/analyze/parse-util.d.ts.map +1 -0
  37. package/dist/analyze/parse-util.js +47 -0
  38. package/dist/analyze/parse-util.js.map +1 -0
  39. package/dist/analyze/prisma.d.ts +4 -0
  40. package/dist/analyze/prisma.d.ts.map +1 -0
  41. package/dist/analyze/prisma.js +97 -0
  42. package/dist/analyze/prisma.js.map +1 -0
  43. package/dist/analyze/sql.d.ts +3 -0
  44. package/dist/analyze/sql.d.ts.map +1 -0
  45. package/dist/analyze/sql.js +110 -0
  46. package/dist/analyze/sql.js.map +1 -0
  47. package/dist/analyze/stack.d.ts +4 -0
  48. package/dist/analyze/stack.d.ts.map +1 -0
  49. package/dist/analyze/stack.js +94 -0
  50. package/dist/analyze/stack.js.map +1 -0
  51. package/dist/analyze/tier0.d.ts +7 -0
  52. package/dist/analyze/tier0.d.ts.map +1 -0
  53. package/dist/analyze/tier0.js +57 -0
  54. package/dist/analyze/tier0.js.map +1 -0
  55. package/dist/analyze/tier1.d.ts +13 -0
  56. package/dist/analyze/tier1.d.ts.map +1 -0
  57. package/dist/analyze/tier1.js +144 -0
  58. package/dist/analyze/tier1.js.map +1 -0
  59. package/dist/analyze/tier2.d.ts +14 -0
  60. package/dist/analyze/tier2.d.ts.map +1 -0
  61. package/dist/analyze/tier2.js +231 -0
  62. package/dist/analyze/tier2.js.map +1 -0
  63. package/dist/analyze/walk.d.ts +3 -0
  64. package/dist/analyze/walk.d.ts.map +1 -0
  65. package/dist/analyze/walk.js +50 -0
  66. package/dist/analyze/walk.js.map +1 -0
  67. package/dist/auth.d.ts +12 -0
  68. package/dist/auth.d.ts.map +1 -0
  69. package/dist/auth.js +61 -0
  70. package/dist/auth.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +787 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/cloud/api.d.ts +20 -0
  76. package/dist/cloud/api.d.ts.map +1 -0
  77. package/dist/cloud/api.js +81 -0
  78. package/dist/cloud/api.js.map +1 -0
  79. package/dist/cloud/index.d.ts +4 -0
  80. package/dist/cloud/index.d.ts.map +1 -0
  81. package/dist/cloud/index.js +20 -0
  82. package/dist/cloud/index.js.map +1 -0
  83. package/dist/cloud/store.d.ts +34 -0
  84. package/dist/cloud/store.d.ts.map +1 -0
  85. package/dist/cloud/store.js +137 -0
  86. package/dist/cloud/store.js.map +1 -0
  87. package/dist/diff/history.d.ts +9 -0
  88. package/dist/diff/history.d.ts.map +1 -0
  89. package/dist/diff/history.js +44 -0
  90. package/dist/diff/history.js.map +1 -0
  91. package/dist/diff/index.d.ts +5 -0
  92. package/dist/diff/index.d.ts.map +1 -0
  93. package/dist/diff/index.js +26 -0
  94. package/dist/diff/index.js.map +1 -0
  95. package/dist/diff/model-diff.d.ts +44 -0
  96. package/dist/diff/model-diff.d.ts.map +1 -0
  97. package/dist/diff/model-diff.js +153 -0
  98. package/dist/diff/model-diff.js.map +1 -0
  99. package/dist/diff/snapshot.d.ts +8 -0
  100. package/dist/diff/snapshot.d.ts.map +1 -0
  101. package/dist/diff/snapshot.js +50 -0
  102. package/dist/diff/snapshot.js.map +1 -0
  103. package/dist/env.d.ts +2 -0
  104. package/dist/env.d.ts.map +1 -0
  105. package/dist/env.js +44 -0
  106. package/dist/env.js.map +1 -0
  107. package/dist/index.d.ts +7 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +23 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/ir/naming.d.ts +12 -0
  112. package/dist/ir/naming.d.ts.map +1 -0
  113. package/dist/ir/naming.js +31 -0
  114. package/dist/ir/naming.js.map +1 -0
  115. package/dist/ir/types.d.ts +149 -0
  116. package/dist/ir/types.d.ts.map +1 -0
  117. package/dist/ir/types.js +72 -0
  118. package/dist/ir/types.js.map +1 -0
  119. package/dist/mcp/bench.d.ts +25 -0
  120. package/dist/mcp/bench.d.ts.map +1 -0
  121. package/dist/mcp/bench.js +115 -0
  122. package/dist/mcp/bench.js.map +1 -0
  123. package/dist/mcp/queries.d.ts +22 -0
  124. package/dist/mcp/queries.d.ts.map +1 -0
  125. package/dist/mcp/queries.js +147 -0
  126. package/dist/mcp/queries.js.map +1 -0
  127. package/dist/mcp/server.d.ts +2 -0
  128. package/dist/mcp/server.d.ts.map +1 -0
  129. package/dist/mcp/server.js +147 -0
  130. package/dist/mcp/server.js.map +1 -0
  131. package/dist/mcp/usage.d.ts +23 -0
  132. package/dist/mcp/usage.d.ts.map +1 -0
  133. package/dist/mcp/usage.js +125 -0
  134. package/dist/mcp/usage.js.map +1 -0
  135. package/dist/project/bpmn-parse.d.ts +17 -0
  136. package/dist/project/bpmn-parse.d.ts.map +1 -0
  137. package/dist/project/bpmn-parse.js +60 -0
  138. package/dist/project/bpmn-parse.js.map +1 -0
  139. package/dist/project/bpmn.d.ts +11 -0
  140. package/dist/project/bpmn.d.ts.map +1 -0
  141. package/dist/project/bpmn.js +89 -0
  142. package/dist/project/bpmn.js.map +1 -0
  143. package/dist/project/capability.d.ts +16 -0
  144. package/dist/project/capability.d.ts.map +1 -0
  145. package/dist/project/capability.js +38 -0
  146. package/dist/project/capability.js.map +1 -0
  147. package/dist/project/erd.d.ts +17 -0
  148. package/dist/project/erd.d.ts.map +1 -0
  149. package/dist/project/erd.js +0 -0
  150. package/dist/project/erd.js.map +1 -0
  151. package/dist/project/html.d.ts +12 -0
  152. package/dist/project/html.d.ts.map +1 -0
  153. package/dist/project/html.js +166 -0
  154. package/dist/project/html.js.map +1 -0
  155. package/dist/project/index.d.ts +19 -0
  156. package/dist/project/index.d.ts.map +1 -0
  157. package/dist/project/index.js +113 -0
  158. package/dist/project/index.js.map +1 -0
  159. package/dist/project/mermaid.d.ts +20 -0
  160. package/dist/project/mermaid.d.ts.map +1 -0
  161. package/dist/project/mermaid.js +89 -0
  162. package/dist/project/mermaid.js.map +1 -0
  163. package/dist/project/spec.d.ts +69 -0
  164. package/dist/project/spec.d.ts.map +1 -0
  165. package/dist/project/spec.js +164 -0
  166. package/dist/project/spec.js.map +1 -0
  167. package/dist/project/trust.d.ts +35 -0
  168. package/dist/project/trust.d.ts.map +1 -0
  169. package/dist/project/trust.js +48 -0
  170. package/dist/project/trust.js.map +1 -0
  171. package/dist/system.d.ts +61 -0
  172. package/dist/system.d.ts.map +1 -0
  173. package/dist/system.js +161 -0
  174. package/dist/system.js.map +1 -0
  175. package/package.json +58 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UsageRecorder = exports.USAGE_LOG = void 0;
4
+ exports.readUsageLog = readUsageLog;
5
+ /**
6
+ * MCP usage recorder — the proof-of-value loop (and the metering substrate).
7
+ *
8
+ * Each read tool call is recorded with an estimate of the tokens it returned and
9
+ * the tokens it *saved* vs the agent reading raw files to answer the same thing
10
+ * (the baseline reuses the `bench` heuristic). Events are appended to a durable
11
+ * local log (`.archmantic/usage.jsonl`) and best-effort batch-flushed to the
12
+ * cloud, where the web `/usage` dashboard aggregates them. Cloud failures never
13
+ * surface to the agent; the local log is the source of truth (`usage --sync`
14
+ * re-pushes it, idempotently by event id).
15
+ */
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = require("node:path");
18
+ const node_crypto_1 = require("node:crypto");
19
+ const walk_js_1 = require("../analyze/walk.js");
20
+ /** Tools whose file-reading alternative is "scan a lot of the repo". */
21
+ const BROAD_TOOLS = new Set([
22
+ "get_context",
23
+ "list_components",
24
+ "search_capabilities",
25
+ "get_data_model",
26
+ "get_api_surface",
27
+ "get_process",
28
+ "get_sequence",
29
+ "whats_related",
30
+ ]);
31
+ const estTokens = (s) => Math.ceil(s.length / 4);
32
+ exports.USAGE_LOG = (0, node_path_1.join)(".archmantic", "usage.jsonl");
33
+ const FLUSH_EVERY = 5;
34
+ const FLUSH_MS = 60_000;
35
+ class UsageRecorder {
36
+ root;
37
+ getProject;
38
+ flush;
39
+ buffer = [];
40
+ srcTokensCache = -1;
41
+ timer;
42
+ constructor(root, getProject, flush) {
43
+ this.root = root;
44
+ this.getProject = getProject;
45
+ this.flush = flush;
46
+ }
47
+ /** Approx tokens an agent would read to answer broad questions (cached). */
48
+ srcTokens() {
49
+ if (this.srcTokensCache >= 0)
50
+ return this.srcTokensCache;
51
+ let chars = 0;
52
+ for (const rel of (0, walk_js_1.walkSourceFiles)(this.root)) {
53
+ try {
54
+ chars += (0, node_fs_1.readFileSync)((0, node_path_1.join)(this.root, rel), "utf8").length;
55
+ }
56
+ catch {
57
+ /* skip unreadable */
58
+ }
59
+ }
60
+ this.srcTokensCache = Math.ceil(chars / 4);
61
+ return this.srcTokensCache;
62
+ }
63
+ /** Record one tool call. `answer` is the text returned to the agent. */
64
+ record(tool, answer, now) {
65
+ const tokensOut = estTokens(answer);
66
+ const baseline = BROAD_TOOLS.has(tool) ? this.srcTokens() : Math.round(this.srcTokens() * 0.12);
67
+ const event = {
68
+ id: (0, node_crypto_1.randomUUID)(),
69
+ project: this.getProject(),
70
+ tool,
71
+ tokensOut,
72
+ tokensSaved: Math.max(0, baseline - tokensOut),
73
+ at: now,
74
+ };
75
+ this.appendLocal(event);
76
+ this.buffer.push(event);
77
+ if (this.buffer.length >= FLUSH_EVERY)
78
+ void this.drain();
79
+ }
80
+ appendLocal(event) {
81
+ try {
82
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(this.root, ".archmantic"), { recursive: true });
83
+ (0, node_fs_1.appendFileSync)((0, node_path_1.join)(this.root, exports.USAGE_LOG), JSON.stringify(event) + "\n", "utf8");
84
+ }
85
+ catch {
86
+ /* a read-only FS shouldn't break the server */
87
+ }
88
+ }
89
+ /** Flush the buffer to the cloud; on failure, retry next time (id makes it idempotent). */
90
+ async drain() {
91
+ if (!this.buffer.length)
92
+ return;
93
+ const batch = this.buffer;
94
+ this.buffer = [];
95
+ try {
96
+ await this.flush(batch);
97
+ }
98
+ catch {
99
+ this.buffer.unshift(...batch); // keep for the next attempt
100
+ }
101
+ }
102
+ start() {
103
+ this.timer = setInterval(() => void this.drain(), FLUSH_MS);
104
+ this.timer.unref?.(); // don't keep the process alive on our account
105
+ }
106
+ async stop() {
107
+ if (this.timer)
108
+ clearInterval(this.timer);
109
+ await this.drain();
110
+ }
111
+ }
112
+ exports.UsageRecorder = UsageRecorder;
113
+ /** Parse the local usage log into events (for `archmantic usage`). */
114
+ function readUsageLog(root) {
115
+ try {
116
+ return (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, exports.USAGE_LOG), "utf8")
117
+ .split("\n")
118
+ .filter(Boolean)
119
+ .map((line) => JSON.parse(line));
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ }
125
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/mcp/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * BPMN 2.0 parser — the inverse of `bpmn.ts`. Turns a (human-edited) BPMN
3
+ * diagram back into an ordered process so canvas edits can flow into the IR
4
+ * (the "edit" half of edit-then-build).
5
+ *
6
+ * Dependency-free: BPMN here comes from bpmn-js (consistent structure). We read
7
+ * the flow elements and order tasks by following sequenceFlows from the start
8
+ * event, falling back to document order.
9
+ */
10
+ export interface ParsedProcess {
11
+ name: string;
12
+ tasks: {
13
+ name: string;
14
+ }[];
15
+ }
16
+ export declare function parseBpmnProcess(xml: string): ParsedProcess | null;
17
+ //# sourceMappingURL=bpmn-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bpmn-parse.d.ts","sourceRoot":"","sources":["../../src/project/bpmn-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3B;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA0ClE"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ /**
3
+ * BPMN 2.0 parser — the inverse of `bpmn.ts`. Turns a (human-edited) BPMN
4
+ * diagram back into an ordered process so canvas edits can flow into the IR
5
+ * (the "edit" half of edit-then-build).
6
+ *
7
+ * Dependency-free: BPMN here comes from bpmn-js (consistent structure). We read
8
+ * the flow elements and order tasks by following sequenceFlows from the start
9
+ * event, falling back to document order.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.parseBpmnProcess = parseBpmnProcess;
13
+ const attr = (tag, name) => new RegExp(`\\b${name}="([^"]*)"`).exec(tag)?.[1];
14
+ function parseBpmnProcess(xml) {
15
+ if (!xml || !/<\w*:?process\b/.test(xml))
16
+ return null;
17
+ const procName = (() => {
18
+ const t = /<\w*:?process\b[^>]*>/.exec(xml)?.[0];
19
+ return (t && attr(t, "name")) || "Process";
20
+ })();
21
+ const tasks = new Map(); // id → name
22
+ const flowNext = new Map(); // sourceRef → targetRef (first wins)
23
+ let startId;
24
+ const re = /<(\w*:?)(task|userTask|serviceTask|scriptTask|startEvent|endEvent|sequenceFlow)\b([^>]*?)\/?>/g;
25
+ let m;
26
+ while ((m = re.exec(xml))) {
27
+ const kind = m[2];
28
+ const body = `<x ${m[3]} >`;
29
+ const id = attr(body, "id");
30
+ if (kind === "startEvent") {
31
+ startId = id;
32
+ }
33
+ else if (kind === "sequenceFlow") {
34
+ const from = attr(body, "sourceRef");
35
+ const to = attr(body, "targetRef");
36
+ if (from && to && !flowNext.has(from))
37
+ flowNext.set(from, to);
38
+ }
39
+ else if (kind.toLowerCase().includes("task")) {
40
+ if (id)
41
+ tasks.set(id, attr(body, "name") ?? id);
42
+ }
43
+ }
44
+ // Order by walking the flow chain from the start event.
45
+ const ordered = [];
46
+ const seen = new Set();
47
+ let cur = startId;
48
+ while (cur && !seen.has(cur)) {
49
+ seen.add(cur);
50
+ if (tasks.has(cur))
51
+ ordered.push({ name: tasks.get(cur) });
52
+ cur = flowNext.get(cur);
53
+ }
54
+ // Fallback: document order if the chain didn't yield tasks.
55
+ if (!ordered.length)
56
+ for (const name of tasks.values())
57
+ ordered.push({ name });
58
+ return { name: procName, tasks: ordered };
59
+ }
60
+ //# sourceMappingURL=bpmn-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bpmn-parse.js","sourceRoot":"","sources":["../../src/project/bpmn-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * BPMN 2.0 projection (USP 2: auto business-process view — white space nobody
3
+ * in the code-graph crowd occupies).
4
+ *
5
+ * Emits standards-compliant BPMN 2.0 XML *with* DI (diagram interchange)
6
+ * coordinates, so it renders directly in `bpmn-js` and any BPMN tool. v1 lays a
7
+ * Process out as a linear lane: startEvent → task* → endEvent.
8
+ */
9
+ import { type Process } from "../ir/types.js";
10
+ export declare function bpmnXml(process: Process): string;
11
+ //# sourceMappingURL=bpmn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bpmn.d.ts","sourceRoot":"","sources":["../../src/project/bpmn.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAiB9C,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmFhD"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bpmnXml = bpmnXml;
4
+ function esc(s) {
5
+ return s
6
+ .replace(/&/g, "&amp;")
7
+ .replace(/</g, "&lt;")
8
+ .replace(/>/g, "&gt;")
9
+ .replace(/"/g, "&quot;");
10
+ }
11
+ // Layout constants (left-to-right).
12
+ const EVENT = 36;
13
+ const TASK_W = 110;
14
+ const TASK_H = 80;
15
+ const GAP = 50;
16
+ const Y = 120;
17
+ function bpmnXml(process) {
18
+ const tasks = process.tasks;
19
+ const startId = "StartEvent_1";
20
+ const endId = "EndEvent_1";
21
+ const taskIds = tasks.map((_, i) => `Activity_${i + 1}`);
22
+ const nodeOrder = [startId, ...taskIds, endId];
23
+ // Flow elements.
24
+ const flowEls = [];
25
+ const flows = [];
26
+ for (let i = 0; i < nodeOrder.length - 1; i++) {
27
+ flows.push({ id: `Flow_${i + 1}`, from: nodeOrder[i], to: nodeOrder[i + 1] });
28
+ }
29
+ const outgoing = (id) => flows.filter((f) => f.from === id).map((f) => ` <bpmn:outgoing>${f.id}</bpmn:outgoing>`).join("\n");
30
+ const incoming = (id) => flows.filter((f) => f.to === id).map((f) => ` <bpmn:incoming>${f.id}</bpmn:incoming>`).join("\n");
31
+ flowEls.push(` <bpmn:startEvent id="${startId}" name="Start">\n${outgoing(startId)}\n </bpmn:startEvent>`);
32
+ tasks.forEach((t, i) => {
33
+ const id = taskIds[i];
34
+ flowEls.push(` <bpmn:task id="${id}" name="${esc(t.name)}">\n${incoming(id)}\n${outgoing(id)}\n </bpmn:task>`);
35
+ });
36
+ flowEls.push(` <bpmn:endEvent id="${endId}" name="End">\n${incoming(endId)}\n </bpmn:endEvent>`);
37
+ for (const f of flows) {
38
+ flowEls.push(` <bpmn:sequenceFlow id="${f.id}" sourceRef="${f.from}" targetRef="${f.to}" />`);
39
+ }
40
+ // DI: compute x positions left→right; events are small circles, tasks are boxes.
41
+ const bounds = new Map();
42
+ let x = 160;
43
+ for (const id of nodeOrder) {
44
+ const isEvent = id === startId || id === endId;
45
+ const w = isEvent ? EVENT : TASK_W;
46
+ const h = isEvent ? EVENT : TASK_H;
47
+ const y = isEvent ? Y + (TASK_H - EVENT) / 2 : Y;
48
+ bounds.set(id, { x, y, w, h, cx: x + w / 2, cy: y + h / 2 });
49
+ x += w + GAP;
50
+ }
51
+ const shapes = nodeOrder
52
+ .map((id) => {
53
+ const b = bounds.get(id);
54
+ return (` <bpmndi:BPMNShape id="${id}_di" bpmnElement="${id}">\n` +
55
+ ` <dc:Bounds x="${b.x}" y="${b.y}" width="${b.w}" height="${b.h}" />\n` +
56
+ ` </bpmndi:BPMNShape>`);
57
+ })
58
+ .join("\n");
59
+ const edges = flows
60
+ .map((f) => {
61
+ const a = bounds.get(f.from);
62
+ const b = bounds.get(f.to);
63
+ return (` <bpmndi:BPMNEdge id="${f.id}_di" bpmnElement="${f.id}">\n` +
64
+ ` <di:waypoint x="${a.x + a.w}" y="${a.cy}" />\n` +
65
+ ` <di:waypoint x="${b.x}" y="${b.cy}" />\n` +
66
+ ` </bpmndi:BPMNEdge>`);
67
+ })
68
+ .join("\n");
69
+ const procId = `Process_${process.id.replace(/[^A-Za-z0-9]/g, "_")}`;
70
+ return `<?xml version="1.0" encoding="UTF-8"?>
71
+ <bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
72
+ xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
73
+ xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
74
+ xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
75
+ id="Definitions_archmantic"
76
+ targetNamespace="http://archmantic/bpmn">
77
+ <bpmn:process id="${procId}" name="${esc(process.name)}" isExecutable="false">
78
+ ${flowEls.join("\n")}
79
+ </bpmn:process>
80
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
81
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="${procId}">
82
+ ${shapes}
83
+ ${edges}
84
+ </bpmndi:BPMNPlane>
85
+ </bpmndi:BPMNDiagram>
86
+ </bpmn:definitions>
87
+ `;
88
+ }
89
+ //# sourceMappingURL=bpmn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bpmn.js","sourceRoot":"","sources":["../../src/project/bpmn.ts"],"names":[],"mappings":";;AAyBA,0BAmFC;AAlGD,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,oCAAoC;AACpC,MAAM,KAAK,GAAG,EAAE,CAAC;AACjB,MAAM,MAAM,GAAG,GAAG,CAAC;AACnB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,GAAG,GAAG,EAAE,CAAC;AACf,MAAM,CAAC,GAAG,GAAG,CAAC;AAEd,SAAgB,OAAO,CAAC,OAAgB;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,cAAc,CAAC;IAC/B,MAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;IAE/C,iBAAiB;IACjB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAA+C,EAAE,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1I,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExI,OAAO,CAAC,IAAI,CAAC,4BAA4B,OAAO,oBAAoB,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACjH,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CACV,sBAAsB,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC,oBAAoB,CACvG,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,0BAA0B,KAAK,kBAAkB,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACvG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;IAED,iFAAiF;IACjF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkF,CAAC;IACzG,IAAI,CAAC,GAAG,GAAG,CAAC;IACZ,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,KAAK,CAAC;QAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACnC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACnC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,SAAS;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC1B,OAAO,CACL,+BAA+B,EAAE,qBAAqB,EAAE,MAAM;YAC9D,yBAAyB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;YAC9E,2BAA2B,CAC5B,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC;QAC5B,OAAO,CACL,8BAA8B,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,EAAE,MAAM;YACjE,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ;YACxD,2BAA2B,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ;YAClD,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,WAAW,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;IACrE,OAAO;;;;;;;sBAOa,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;EACtD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;sDAGkC,MAAM;EAC1D,MAAM;EACN,KAAK;;;;CAIN,CAAC;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Capability map (USP 1: plain-English "what can this system do?").
3
+ *
4
+ * Groups the derived Capabilities by the folder of their implementing component,
5
+ * so a PM/architect/new-hire reads areas of the system, not a symbol dump. Each
6
+ * capability keeps its trust badge (USP 3).
7
+ */
8
+ import { type ArchitectureModel, type Capability } from "../ir/types.js";
9
+ export interface CapabilityGroup {
10
+ area: string;
11
+ capabilities: Capability[];
12
+ }
13
+ export declare function groupCapabilities(model: ArchitectureModel): CapabilityGroup[];
14
+ /** Plain-text capability map for the terminal. */
15
+ export declare function capabilityMapText(model: ArchitectureModel): string;
16
+ //# sourceMappingURL=capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/project/capability.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGzE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B;AAUD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,EAAE,CAS7E;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAYlE"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groupCapabilities = groupCapabilities;
4
+ exports.capabilityMapText = capabilityMapText;
5
+ const trust_js_1 = require("./trust.js");
6
+ function areaOf(cap) {
7
+ const compId = cap.componentIds[0] ?? "";
8
+ const rel = compId.slice("comp:".length);
9
+ const parts = rel.split("/");
10
+ // Folder of the file (drop the filename); fall back to repo root.
11
+ return parts.length > 1 ? parts.slice(0, -1).join("/") : "(root)";
12
+ }
13
+ function groupCapabilities(model) {
14
+ const byArea = new Map();
15
+ for (const cap of model.capabilities) {
16
+ const area = areaOf(cap);
17
+ (byArea.get(area) ?? byArea.set(area, []).get(area)).push(cap);
18
+ }
19
+ return [...byArea.entries()]
20
+ .sort((a, b) => a[0].localeCompare(b[0]))
21
+ .map(([area, capabilities]) => ({ area, capabilities }));
22
+ }
23
+ /** Plain-text capability map for the terminal. */
24
+ function capabilityMapText(model) {
25
+ const groups = groupCapabilities(model);
26
+ if (!groups.length)
27
+ return " (no capabilities derived yet)";
28
+ const out = [];
29
+ for (const g of groups) {
30
+ out.push(` ${g.area}/`);
31
+ for (const cap of g.capabilities) {
32
+ const flag = (0, trust_js_1.isLowConfidence)(cap) ? " ⚠" : "";
33
+ out.push(` • ${cap.name}${flag} — ${(0, trust_js_1.badge)(cap)}`);
34
+ }
35
+ }
36
+ return out.join("\n");
37
+ }
38
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/project/capability.ts"],"names":[],"mappings":";;AAuBA,8CASC;AAGD,8CAYC;AAvCD,yCAAoD;AAOpD,SAAS,MAAM,CAAC,GAAe;IAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,kEAAkE;IAClE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAwB;IACxD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,kDAAkD;AAClD,SAAgB,iBAAiB,CAAC,KAAwB;IACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,iCAAiC,CAAC;IAC7D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,IAAA,0BAAe,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,QAAQ,IAAA,gBAAK,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ERD projection — the data model rendered as a Mermaid `erDiagram`.
3
+ * Entities become attribute blocks; relation fields become cardinality edges.
4
+ * Pure function over the IR (see docs/ARCHITECTURE.md §1).
5
+ */
6
+ import { type ArchitectureModel, type DataEntity } from "../ir/types.js";
7
+ /**
8
+ * Derive cardinality edges from relation fields, deduped by unordered pair.
9
+ * Per pair we track, for each side, whether it points at the other with a
10
+ * to-many (list) field or a to-one (single/FK) field. A list field means that
11
+ * side is the parent ("one"); a single field means that side is the child
12
+ * ("many"). This reads both Prisma (which has an inverse list field) and
13
+ * Drizzle/SQL (FK-only, no inverse) correctly.
14
+ */
15
+ export declare function relationshipEdges(entities: DataEntity[], byId: Map<string, DataEntity>): string[];
16
+ export declare function erDiagram(model: ArchitectureModel): string;
17
+ //# sourceMappingURL=erd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd.d.ts","sourceRoot":"","sources":["../../src/project/erd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAOzE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAkCjG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAqB1D"}
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd.js","sourceRoot":"","sources":["../../src/project/erd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Static HTML viewer — a single self-contained file that renders every
3
+ * projection (context + component + sequence via Mermaid, the process via
4
+ * bpmn-js, the capability map, and the trust layer). Dependency-light: pulls
5
+ * Mermaid + bpmn-js from a CDN at view time, so the CLI ships no renderer.
6
+ *
7
+ * Per docs/ARCHITECTURE.md the CLI degrades to "open in browser"; this is that
8
+ * artifact, written to .archmantic/view.html.
9
+ */
10
+ import { type ArchitectureModel } from "../ir/types.js";
11
+ export declare function renderHtml(model: ArchitectureModel): string;
12
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/project/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA8ExD,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAgG3D"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderHtml = renderHtml;
4
+ const mermaid_js_1 = require("./mermaid.js");
5
+ const erd_js_1 = require("./erd.js");
6
+ const bpmn_js_1 = require("./bpmn.js");
7
+ const capability_js_1 = require("./capability.js");
8
+ const trust_js_1 = require("./trust.js");
9
+ function esc(s) {
10
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
11
+ }
12
+ function allGrounded(model) {
13
+ return [
14
+ ...model.systems,
15
+ ...model.components,
16
+ ...model.relations,
17
+ ...model.capabilities,
18
+ ...model.flows,
19
+ ...model.processes,
20
+ ...(model.dataEntities ?? []),
21
+ ...(model.endpoints ?? []),
22
+ ];
23
+ }
24
+ function apiSection(model) {
25
+ const eps = model.endpoints ?? [];
26
+ if (!eps.length)
27
+ return "";
28
+ const rows = eps
29
+ .map((e) => `<tr><td class="method m-${esc(e.method.toLowerCase())}">${esc(e.method)}</td>` +
30
+ `<td class="path">${esc(e.path)}</td><td class="proto">${esc(e.protocol)}</td></tr>`)
31
+ .join("\n");
32
+ return `
33
+ <h2>API surface — ${eps.length} endpoints</h2>
34
+ <div class="card"><table class="api">
35
+ <thead><tr><th>Method</th><th>Path / operation</th><th>Protocol</th></tr></thead>
36
+ <tbody>${rows}</tbody>
37
+ </table></div>`;
38
+ }
39
+ function trustBanner(model) {
40
+ const s = (0, trust_js_1.summarize)(allGrounded(model));
41
+ const pct = Math.round(s.meanConfidence * 100);
42
+ return `
43
+ <section class="trust">
44
+ <div class="stat"><span class="num">${s.total}</span> grounded elements</div>
45
+ <div class="stat"><span class="num">${s.totalRefs}</span> code references</div>
46
+ <div class="stat"><span class="num">${pct}%</span> mean confidence</div>
47
+ <div class="bands">
48
+ <span class="b high">${s.high} high</span>
49
+ <span class="b medium">${s.medium} medium</span>
50
+ <span class="b low">${s.low} low ⚠</span>
51
+ </div>
52
+ </section>`;
53
+ }
54
+ function capabilitySection(model) {
55
+ const groups = (0, capability_js_1.groupCapabilities)(model);
56
+ if (!groups.length)
57
+ return "<p class='empty'>No capabilities derived yet.</p>";
58
+ const blocks = groups.map((g) => {
59
+ const items = g.capabilities
60
+ .map((c) => `<li class="${(0, trust_js_1.isLowConfidence)(c) ? "lowconf" : ""}"><span class="cap">${esc(c.name)}</span>` +
61
+ `<span class="badge ${(0, trust_js_1.band)(c.confidence)}">${esc((0, trust_js_1.badge)(c))}</span></li>`)
62
+ .join("\n");
63
+ return `<div class="area"><h3>${esc(g.area)}/</h3><ul>${items}</ul></div>`;
64
+ });
65
+ return blocks.join("\n");
66
+ }
67
+ function mermaidBlock(src) {
68
+ return `<pre class="mermaid">${esc(src)}</pre>`;
69
+ }
70
+ function renderHtml(model) {
71
+ const ctx = mermaidBlock((0, mermaid_js_1.contextDiagram)(model));
72
+ const comp = mermaidBlock((0, mermaid_js_1.componentDiagram)(model));
73
+ const flow = model.flows[0];
74
+ const seq = flow ? mermaidBlock((0, mermaid_js_1.sequenceDiagram)(flow, model)) : "<p class='empty'>No flow derived.</p>";
75
+ const proc = model.processes[0];
76
+ const bpmn = proc ? (0, bpmn_js_1.bpmnXml)(proc) : "";
77
+ const erd = model.dataEntities?.length ? mermaidBlock((0, erd_js_1.erDiagram)(model)) : "";
78
+ return `<!DOCTYPE html>
79
+ <html lang="en">
80
+ <head>
81
+ <meta charset="utf-8" />
82
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
83
+ <title>Archmantic — ${esc(model.project)}</title>
84
+ <style>
85
+ :root { color-scheme: light dark; }
86
+ * { box-sizing: border-box; }
87
+ body { font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; margin: 0; background: #0f1115; color: #e6e9ef; }
88
+ header { padding: 28px 32px 8px; }
89
+ header h1 { margin: 0; font-size: 22px; }
90
+ header .sub { color: #8b93a7; font-size: 13px; margin-top: 4px; }
91
+ main { padding: 8px 32px 64px; max-width: 1100px; }
92
+ section.trust { display: flex; gap: 24px; align-items: center; flex-wrap: wrap; background: #171a21; border: 1px solid #232734; border-radius: 12px; padding: 16px 20px; margin: 16px 0 8px; }
93
+ .stat { font-size: 13px; color: #8b93a7; } .stat .num { font-size: 20px; color: #e6e9ef; font-weight: 600; margin-right: 6px; }
94
+ .bands { margin-left: auto; display: flex; gap: 8px; }
95
+ .b { font-size: 12px; padding: 3px 9px; border-radius: 999px; }
96
+ .b.high { background: #14331f; color: #4ade80; } .b.medium { background: #33300f; color: #facc15; } .b.low { background: #331616; color: #f87171; }
97
+ h2 { font-size: 16px; margin: 32px 0 12px; padding-bottom: 8px; border-bottom: 1px solid #232734; }
98
+ .card { background: #171a21; border: 1px solid #232734; border-radius: 12px; padding: 18px; overflow: auto; }
99
+ .capgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 16px; }
100
+ .area h3 { margin: 0 0 8px; font-size: 13px; color: #8b93a7; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
101
+ .area ul { list-style: none; margin: 0; padding: 0; }
102
+ .area li { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 6px 0; border-bottom: 1px solid #1f232e; }
103
+ .area li.lowconf .cap::after { content: " ⚠"; }
104
+ .cap { font-weight: 500; }
105
+ .badge { font-size: 11px; color: #8b93a7; white-space: nowrap; }
106
+ .badge.low { color: #f87171; } .badge.medium { color: #facc15; } .badge.high { color: #4ade80; }
107
+ .empty { color: #8b93a7; font-style: italic; }
108
+ table.api { width: 100%; border-collapse: collapse; font-size: 13px; }
109
+ table.api th { text-align: left; color: #8b93a7; font-weight: 600; padding: 6px 10px; border-bottom: 1px solid #232734; }
110
+ table.api td { padding: 6px 10px; border-bottom: 1px solid #1f232e; }
111
+ table.api td.path { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
112
+ table.api td.proto { color: #8b93a7; }
113
+ td.method { font-family: ui-monospace, monospace; font-weight: 600; white-space: nowrap; }
114
+ td.method.m-get { color: #4ade80; } td.method.m-post { color: #facc15; }
115
+ td.method.m-put, td.method.m-patch { color: #60a5fa; } td.method.m-delete { color: #f87171; }
116
+ td.method.m-query { color: #4ade80; } td.method.m-mutation { color: #facc15; }
117
+ #bpmn { height: 420px; background: #fff; border-radius: 12px; }
118
+ footer { color: #5a6172; font-size: 12px; padding: 0 32px 40px; }
119
+ </style>
120
+ </head>
121
+ <body>
122
+ <header>
123
+ <h1>${esc(model.project)}</h1>
124
+ <div class="sub">Living architecture model · generated ${esc(model.generatedAt ?? "")} · every element grounded in code</div>
125
+ </header>
126
+ <main>
127
+ ${trustBanner(model)}
128
+
129
+ <h2>Capability map — what can this system do?</h2>
130
+ <div class="capgrid">${capabilitySection(model)}</div>
131
+
132
+ <h2>Context</h2>
133
+ <div class="card">${ctx}</div>
134
+
135
+ <h2>Components &amp; dependencies</h2>
136
+ <div class="card">${comp}</div>
137
+
138
+ ${erd ? `<h2>Data model — ${model.dataEntities.length} entities</h2>\n <div class="card">${erd}</div>` : ""}
139
+
140
+ ${apiSection(model)}
141
+
142
+ <h2>Sequence — ${esc(flow?.name ?? "")}</h2>
143
+ <div class="card">${seq}</div>
144
+
145
+ <h2>Process (BPMN) — ${esc(proc?.name ?? "")}</h2>
146
+ <div class="card"><div id="bpmn"></div></div>
147
+ </main>
148
+ <footer>Archmantic · diagrams are projections of one grounded model · ⚠ = low confidence, flagged for review</footer>
149
+
150
+ <script type="module">
151
+ import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
152
+ mermaid.initialize({ startOnLoad: true, theme: "dark", securityLevel: "loose" });
153
+ </script>
154
+ <script src="https://unpkg.com/bpmn-js@17/dist/bpmn-navigated-viewer.development.js"></script>
155
+ <script>
156
+ const BPMN_XML = ${JSON.stringify(bpmn)};
157
+ if (BPMN_XML && window.BpmnJS) {
158
+ const viewer = new BpmnJS({ container: "#bpmn" });
159
+ viewer.importXML(BPMN_XML).then(() => viewer.get("canvas").zoom("fit-viewport")).catch(console.error);
160
+ }
161
+ </script>
162
+ </body>
163
+ </html>
164
+ `;
165
+ }
166
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/project/html.ts"],"names":[],"mappings":"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"}