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,9 @@
1
+ /**
2
+ * Data-model detection orchestrator — the "what does it persist?" layer.
3
+ * Runs each source-specific parser (Prisma, Drizzle, SQL DDL) and merges the
4
+ * results into one DataEntity[]. A repo typically uses one of these; on a name
5
+ * clash the first source wins (Prisma → Drizzle → SQL).
6
+ */
7
+ import { type DataEntity } from "../ir/types.js";
8
+ export declare function detectDataModel(root: string): DataEntity[];
9
+ //# sourceMappingURL=datamodel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datamodel.d.ts","sourceRoot":"","sources":["../../src/analyze/datamodel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAU1D"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectDataModel = detectDataModel;
4
+ const prisma_js_1 = require("./prisma.js");
5
+ const drizzle_js_1 = require("./drizzle.js");
6
+ const sql_js_1 = require("./sql.js");
7
+ function detectDataModel(root) {
8
+ const all = [...(0, prisma_js_1.detectPrismaModel)(root), ...(0, drizzle_js_1.detectDrizzleModel)(root), ...(0, sql_js_1.detectSqlModel)(root)];
9
+ const seen = new Set();
10
+ const out = [];
11
+ for (const e of all) {
12
+ if (seen.has(e.id))
13
+ continue;
14
+ seen.add(e.id);
15
+ out.push(e);
16
+ }
17
+ return out;
18
+ }
19
+ //# sourceMappingURL=datamodel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datamodel.js","sourceRoot":"","sources":["../../src/analyze/datamodel.ts"],"names":[],"mappings":";;AAWA,0CAUC;AAdD,2CAAgD;AAChD,6CAAkD;AAClD,qCAA0C;AAE1C,SAAgB,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAA,6BAAiB,EAAC,IAAI,CAAC,EAAE,GAAG,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,GAAG,IAAA,uBAAc,EAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ArchitectureModel, type Capability } from "../ir/types.js";
2
+ /**
3
+ * The export exists deterministically (file:line); only its plain-English
4
+ * reading is heuristic. Medium confidence: real and grounded, prose refined by
5
+ * the Tier-2 LLM pass. (Reserve the low/⚠ band for genuinely uncertain finds.)
6
+ */
7
+ export declare const HEURISTIC_CONFIDENCE = 0.6;
8
+ /** Derive the Capabilities for a single file (reused by the incremental updater). */
9
+ export declare function extractFileCapabilities(root: string, rel: string): Capability[];
10
+ /**
11
+ * (Re)derive the single Process + Flow from the entry-point dependency chain.
12
+ * Replaces any existing processes/flows — safe to call on an already-populated
13
+ * model (the incremental updater does this after patching the import graph).
14
+ */
15
+ export declare function deriveProcessAndFlow(root: string, model: ArchitectureModel): void;
16
+ /**
17
+ * Enrich the model in place with structural Capabilities, one Process and one
18
+ * Flow. Runs after Tier 1 (it needs the import graph). Pure structural — no network.
19
+ */
20
+ export declare function deriveSemantics(root: string, sourceFiles: string[], model: ArchitectureModel): void;
21
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/analyze/derive.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAKhB,MAAM,gBAAgB,CAAC;AAGxB;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAyGxC,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAgB/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CA+CjF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAKnG"}
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HEURISTIC_CONFIDENCE = void 0;
7
+ exports.extractFileCapabilities = extractFileCapabilities;
8
+ exports.deriveProcessAndFlow = deriveProcessAndFlow;
9
+ exports.deriveSemantics = deriveSemantics;
10
+ /**
11
+ * Tier 1.5 — deterministic semantic derivation (no LLM yet; that's Tier 2 / M4).
12
+ *
13
+ * Two structural products, both grounded with `file:line` provenance:
14
+ * - Capabilities: exported functions/classes → "what can this system do?"
15
+ * (USP 1). Naming intent is heuristic, so these carry a *lower* confidence
16
+ * and are flagged for the Tier-2 LLM pass to refine.
17
+ * - One Process + one Flow: the dependency chain orchestrated from the main
18
+ * entry point → a BPMN process (USP 2) and a sequence (one model, many views).
19
+ *
20
+ * Everything here is reproducible from the AST + import graph; the LLM later
21
+ * rewrites the prose and raises confidence, it does not invent structure.
22
+ */
23
+ const node_fs_1 = require("node:fs");
24
+ const node_path_1 = require("node:path");
25
+ const typescript_1 = __importDefault(require("typescript"));
26
+ const naming_js_1 = require("../ir/naming.js");
27
+ /**
28
+ * The export exists deterministically (file:line); only its plain-English
29
+ * reading is heuristic. Medium confidence: real and grounded, prose refined by
30
+ * the Tier-2 LLM pass. (Reserve the low/⚠ band for genuinely uncertain finds.)
31
+ */
32
+ exports.HEURISTIC_CONFIDENCE = 0.6;
33
+ /** Cap process/flow length so a huge graph still yields a readable diagram. */
34
+ const MAX_PROCESS_TASKS = 12;
35
+ function scriptKindFor(rel) {
36
+ if (rel.endsWith(".tsx"))
37
+ return typescript_1.default.ScriptKind.TSX;
38
+ if (rel.endsWith(".ts"))
39
+ return typescript_1.default.ScriptKind.TS;
40
+ if (rel.endsWith(".jsx"))
41
+ return typescript_1.default.ScriptKind.JSX;
42
+ return typescript_1.default.ScriptKind.JS;
43
+ }
44
+ function hasExport(node) {
45
+ return (typescript_1.default.canHaveModifiers(node) ? typescript_1.default.getModifiers(node) : undefined)?.some((m) => m.kind === typescript_1.default.SyntaxKind.ExportKeyword) ?? false;
46
+ }
47
+ /** Collect top-level exported functions/classes (the value-level public surface). */
48
+ function collectExports(sf) {
49
+ const out = [];
50
+ const lineOf = (n) => sf.getLineAndCharacterOfPosition(n.getStart(sf)).line + 1;
51
+ sf.forEachChild((node) => {
52
+ if (!hasExport(node))
53
+ return;
54
+ if (typescript_1.default.isFunctionDeclaration(node) && node.name) {
55
+ out.push({ name: node.name.text, kind: "function", line: lineOf(node) });
56
+ }
57
+ else if (typescript_1.default.isClassDeclaration(node) && node.name) {
58
+ out.push({ name: node.name.text, kind: "class", line: lineOf(node) });
59
+ }
60
+ else if (typescript_1.default.isVariableStatement(node)) {
61
+ for (const decl of node.declarationList.declarations) {
62
+ if (typescript_1.default.isIdentifier(decl.name) &&
63
+ decl.initializer &&
64
+ (typescript_1.default.isArrowFunction(decl.initializer) || typescript_1.default.isFunctionExpression(decl.initializer))) {
65
+ out.push({ name: decl.name.text, kind: "function", line: lineOf(decl) });
66
+ }
67
+ }
68
+ }
69
+ });
70
+ return out;
71
+ }
72
+ /** Map the package.json bin/main entry to a known component path, else a sensible default. */
73
+ function findEntryComponent(root, componentPaths) {
74
+ const set = new Set(componentPaths);
75
+ const fromManifest = () => {
76
+ const pkgPath = (0, node_path_1.join)(root, "package.json");
77
+ if (!(0, node_fs_1.existsSync)(pkgPath))
78
+ return undefined;
79
+ let pkg = {};
80
+ try {
81
+ pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf8"));
82
+ }
83
+ catch {
84
+ return undefined;
85
+ }
86
+ const binVal = typeof pkg.bin === "string" ? pkg.bin : Object.values(pkg.bin ?? {})[0];
87
+ for (const hint of [binVal, pkg.main]) {
88
+ if (!hint)
89
+ continue;
90
+ const base = (0, node_path_1.basename)(hint).replace(/\.(js|mjs|cjs)$/, "");
91
+ const match = componentPaths.find((p) => (0, node_path_1.basename)(p).replace(/\.(ts|tsx|js|jsx)$/, "") === base);
92
+ if (match)
93
+ return match;
94
+ }
95
+ return undefined;
96
+ };
97
+ return (fromManifest() ??
98
+ ["src/cli.ts", "src/index.ts", "src/main.ts", "index.ts"].find((p) => set.has(p)) ??
99
+ componentPaths[0]);
100
+ }
101
+ /** BFS from the entry over internal edges, neighbors ordered by import line.
102
+ * Ordering by the edge's source line (not the relations-array order) makes the
103
+ * chain deterministic — identical whether built by a full pass or incrementally. */
104
+ function orderedChain(entryId, model) {
105
+ const lineOf = (ref) => Number(ref.split(":").pop()) || 0;
106
+ const adjacency = new Map();
107
+ for (const r of model.relations) {
108
+ if (!r.to.startsWith("comp:"))
109
+ continue; // internal edges only
110
+ const list = adjacency.get(r.from) ?? adjacency.set(r.from, []).get(r.from);
111
+ list.push({ to: r.to, line: lineOf(r.provenance[0]?.ref ?? "") });
112
+ }
113
+ for (const list of adjacency.values())
114
+ list.sort((a, b) => a.line - b.line);
115
+ const visited = new Set();
116
+ const order = [];
117
+ const stack = [entryId];
118
+ while (stack.length && order.length < MAX_PROCESS_TASKS) {
119
+ const id = stack.shift(); // BFS, keeping import order readable
120
+ if (visited.has(id))
121
+ continue;
122
+ visited.add(id);
123
+ order.push(id);
124
+ for (const { to } of adjacency.get(id) ?? [])
125
+ if (!visited.has(to))
126
+ stack.push(to);
127
+ }
128
+ return order;
129
+ }
130
+ /** Derive the Capabilities for a single file (reused by the incremental updater). */
131
+ function extractFileCapabilities(root, rel) {
132
+ let text;
133
+ try {
134
+ text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8");
135
+ }
136
+ catch {
137
+ return [];
138
+ }
139
+ const sf = typescript_1.default.createSourceFile(rel, text, typescript_1.default.ScriptTarget.Latest, true, scriptKindFor(rel));
140
+ return collectExports(sf).map((sym) => ({
141
+ id: `cap:${rel}#${sym.name}`,
142
+ name: (0, naming_js_1.humanize)(sym.name),
143
+ description: `Exported ${sym.kind} \`${sym.name}\` in ${rel}`,
144
+ componentIds: [`comp:${rel}`],
145
+ provenance: [{ source: "code", ref: `${rel}:${sym.line}`, confidence: exports.HEURISTIC_CONFIDENCE }],
146
+ confidence: exports.HEURISTIC_CONFIDENCE,
147
+ }));
148
+ }
149
+ /**
150
+ * (Re)derive the single Process + Flow from the entry-point dependency chain.
151
+ * Replaces any existing processes/flows — safe to call on an already-populated
152
+ * model (the incremental updater does this after patching the import graph).
153
+ */
154
+ function deriveProcessAndFlow(root, model) {
155
+ model.processes = [];
156
+ model.flows = [];
157
+ const componentPaths = model.components.map((c) => c.id.slice("comp:".length));
158
+ const entryRel = findEntryComponent(root, componentPaths);
159
+ if (!entryRel)
160
+ return;
161
+ const entryId = `comp:${entryRel}`;
162
+ const chain = orderedChain(entryId, model);
163
+ if (chain.length < 2)
164
+ return; // not enough structure for a meaningful process
165
+ const nameOf = (id) => (0, naming_js_1.componentLabel)(id);
166
+ const provOf = (id) => ({
167
+ source: "code",
168
+ ref: `${id.slice("comp:".length)}:1`,
169
+ confidence: exports.HEURISTIC_CONFIDENCE,
170
+ });
171
+ const process = {
172
+ id: `proc:${entryRel}`,
173
+ name: `${nameOf(entryId)} flow`,
174
+ description: `Modules orchestrated from the ${entryRel} entry point (structural; refined by Tier 2).`,
175
+ tasks: chain.map((id) => ({ id: `task:${id}`, name: nameOf(id), provenance: [provOf(id)] })),
176
+ provenance: [provOf(entryId)],
177
+ confidence: exports.HEURISTIC_CONFIDENCE,
178
+ };
179
+ model.processes.push(process);
180
+ const steps = [];
181
+ for (let i = 0; i < chain.length - 1; i++) {
182
+ steps.push({
183
+ participant: chain[i],
184
+ action: "uses",
185
+ to: chain[i + 1],
186
+ provenance: [provOf(chain[i])],
187
+ });
188
+ }
189
+ const flow = {
190
+ id: `flow:${entryRel}`,
191
+ name: `${nameOf(entryId)} sequence`,
192
+ description: `Call/dependency sequence from ${entryRel} (structural).`,
193
+ participants: chain,
194
+ steps,
195
+ provenance: [provOf(entryId)],
196
+ confidence: exports.HEURISTIC_CONFIDENCE,
197
+ };
198
+ model.flows.push(flow);
199
+ }
200
+ /**
201
+ * Enrich the model in place with structural Capabilities, one Process and one
202
+ * Flow. Runs after Tier 1 (it needs the import graph). Pure structural — no network.
203
+ */
204
+ function deriveSemantics(root, sourceFiles, model) {
205
+ for (const rel of sourceFiles) {
206
+ for (const cap of extractFileCapabilities(root, rel))
207
+ model.capabilities.push(cap);
208
+ }
209
+ deriveProcessAndFlow(root, model);
210
+ }
211
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/analyze/derive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type DataEntity } from "../ir/types.js";
2
+ export declare function detectDrizzleModel(root: string): DataEntity[];
3
+ //# sourceMappingURL=drizzle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/analyze/drizzle.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAmCjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAyC7D"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectDrizzleModel = detectDrizzleModel;
4
+ /**
5
+ * Drizzle ORM data-model detection.
6
+ *
7
+ * Parses `pgTable`/`mysqlTable`/`sqliteTable(...)` definitions in TS source into
8
+ * DataEntity[]. Relations come from `.references(() => other.col)` foreign keys
9
+ * (Drizzle has no inverse "list" field — the FK is the relationship), grounded to
10
+ * `file:line`. Regex-based, dependency-light; the ERD derivation infers
11
+ * cardinality from FK direction. See docs/ROADMAP.md.
12
+ */
13
+ const node_fs_1 = require("node:fs");
14
+ const node_path_1 = require("node:path");
15
+ const tier0_js_1 = require("./tier0.js");
16
+ const fs_util_js_1 = require("./fs-util.js");
17
+ const parse_util_js_1 = require("./parse-util.js");
18
+ /** Drizzle column-builder names that aren't real columns (table-level helpers). */
19
+ const NON_COLUMN = new Set(["primaryKey", "unique", "uniqueIndex", "index", "foreignKey", "check"]);
20
+ function parseFields(body, varToTable) {
21
+ const fields = [];
22
+ for (const part of (0, parse_util_js_1.splitTopLevel)(body)) {
23
+ const m = /^\s*(\w+)\s*:\s*([\s\S]+)$/.exec(part);
24
+ if (!m)
25
+ continue;
26
+ const name = m[1];
27
+ const builder = m[2];
28
+ const fn = /^(\w+)\s*\(/.exec(builder);
29
+ if (!fn || NON_COLUMN.has(fn[1]))
30
+ continue;
31
+ const field = { name, type: fn[1] };
32
+ const isPk = /\.primaryKey\s*\(/.test(builder);
33
+ if (isPk)
34
+ field.isId = true;
35
+ if (/\.unique\s*\(/.test(builder))
36
+ field.isUnique = true;
37
+ if (!/\.notNull\s*\(/.test(builder) && !isPk)
38
+ field.optional = true;
39
+ const ref = /\.references\s*\(\s*\(\s*\)\s*=>\s*(\w+)\s*\./.exec(builder);
40
+ if (ref) {
41
+ const target = varToTable.get(ref[1]);
42
+ if (target) {
43
+ field.isForeignKey = true;
44
+ field.relationTo = `data:${target}`;
45
+ }
46
+ }
47
+ fields.push(field);
48
+ }
49
+ return fields;
50
+ }
51
+ function detectDrizzleModel(root) {
52
+ const sources = (0, fs_util_js_1.findFiles)(root, (n) => /\.(ts|tsx|mts|cts)$/.test(n) && !n.endsWith(".d.ts"))
53
+ .map((f) => ({ rel: (0, node_path_1.relative)(root, f).split("\\").join("/"), text: (0, node_fs_1.readFileSync)(f, "utf8") }))
54
+ .filter((s) => /\b(?:pg|mysql|sqlite)Table\s*\(/.test(s.text));
55
+ if (!sources.length)
56
+ return [];
57
+ const tableRe = /export\s+const\s+(\w+)\s*=\s*(?:pg|mysql|sqlite)Table\s*\(\s*["'`]([^"'`]+)["'`]\s*,\s*\{/g;
58
+ const found = [];
59
+ const varToTable = new Map();
60
+ for (const s of sources) {
61
+ tableRe.lastIndex = 0;
62
+ let m;
63
+ while ((m = tableRe.exec(s.text))) {
64
+ varToTable.set(m[1], m[2]);
65
+ found.push({
66
+ tableName: m[2],
67
+ rel: s.rel,
68
+ bodyOpen: tableRe.lastIndex - 1, // at the '{'
69
+ declLine: s.text.slice(0, m.index).split("\n").length,
70
+ text: s.text,
71
+ });
72
+ }
73
+ }
74
+ // Pass 2: parse each table body.
75
+ return found.map((t) => ({
76
+ id: `data:${t.tableName}`,
77
+ name: t.tableName,
78
+ fields: parseFields((0, parse_util_js_1.balancedBlock)(t.text, t.bodyOpen, "{", "}"), varToTable),
79
+ provenance: [{ source: "code", ref: `${t.rel}:${t.declLine}`, confidence: tier0_js_1.STRUCTURAL_CONFIDENCE }],
80
+ confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
81
+ }));
82
+ }
83
+ //# sourceMappingURL=drizzle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/analyze/drizzle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Endpoint } from "../ir/types.js";
2
+ export declare function detectEndpoints(root: string): Endpoint[];
3
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/analyze/endpoints.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAwE/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAqFxD"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectEndpoints = detectEndpoints;
4
+ /**
5
+ * API surface detection — the contract layer ("what can callers invoke?").
6
+ *
7
+ * Detects REST routes (Next.js App Router `route.ts`, Pages `pages/api`, and
8
+ * Express/Fastify/Koa/Hono `app.get("/…")` calls), tRPC procedures, and GraphQL
9
+ * `Query`/`Mutation`/`Subscription` fields (SDL files + inline `gql\`…\``).
10
+ * Grounded to `file:line`. Regex/structure-based, dependency-light. Pairs with the
11
+ * data-model ERD as the two halves of the contract. See docs/ROADMAP.md.
12
+ */
13
+ const node_fs_1 = require("node:fs");
14
+ const node_path_1 = require("node:path");
15
+ const tier0_js_1 = require("./tier0.js");
16
+ const walk_js_1 = require("./walk.js");
17
+ const fs_util_js_1 = require("./fs-util.js");
18
+ const parse_util_js_1 = require("./parse-util.js");
19
+ const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
20
+ const TRPC_CONFIDENCE = 0.8;
21
+ const lineAt = (text, idx) => text.slice(0, idx).split("\n").length;
22
+ /** `[id]` → `:id`, `[...slug]`/`[[...slug]]` → `*`, route groups/parallel routes dropped. */
23
+ function dynamicSeg(s) {
24
+ if (/^\[\[?\.\.\..+\]\]?$/.test(s))
25
+ return "*";
26
+ const m = /^\[(.+)\]$/.exec(s);
27
+ return m ? ":" + m[1] : s;
28
+ }
29
+ /** Derive the route path of a Next.js App Router `route.*` file. */
30
+ function appRouterPath(rel) {
31
+ const parts = rel.split("/");
32
+ const i = parts.lastIndexOf("app");
33
+ if (i === -1)
34
+ return null;
35
+ const segs = parts
36
+ .slice(i + 1, -1) // between `app/` and the `route.*` filename
37
+ .filter((s) => !(s.startsWith("(") && s.endsWith(")"))) // route groups / interceptors
38
+ .filter((s) => !s.startsWith("@")) // parallel-route slots
39
+ .map(dynamicSeg);
40
+ return "/" + segs.join("/");
41
+ }
42
+ /** Derive the route path of a Next.js Pages API file (`pages/api/...`). */
43
+ function pagesApiPath(rel) {
44
+ const parts = rel.split("/");
45
+ const i = parts.lastIndexOf("pages");
46
+ if (i === -1 || parts[i + 1] !== "api")
47
+ return null;
48
+ const segs = parts.slice(i + 1); // ['api', ...dirs, 'file.ts']
49
+ const file = segs.pop().replace(/\.(tsx?|jsx?|mjs|cjs)$/, "");
50
+ if (file !== "index")
51
+ segs.push(file);
52
+ return "/" + segs.map(dynamicSeg).join("/");
53
+ }
54
+ /** Index of an exported HTTP-method handler (function/const/named re-export), or -1. */
55
+ function methodMatch(text, method) {
56
+ const re = new RegExp(`export\\s+(?:async\\s+)?function\\s+${method}\\b` +
57
+ `|export\\s+(?:const|let|var)\\s+${method}\\s*[:=]` +
58
+ `|export\\s*\\{[^}]*\\b${method}\\b[^}]*\\}`);
59
+ return text.search(re);
60
+ }
61
+ /** Parse GraphQL SDL for Query/Mutation/Subscription fields. Lines are 1-based within `text`. */
62
+ function parseSdl(text) {
63
+ const out = [];
64
+ const typeRe = /\btype\s+(Query|Mutation|Subscription)\b[^{]*\{/g;
65
+ let m;
66
+ while ((m = typeRe.exec(text))) {
67
+ const kind = m[1].toUpperCase();
68
+ const openIdx = text.indexOf("{", m.index);
69
+ if (openIdx === -1)
70
+ continue;
71
+ const body = (0, parse_util_js_1.balancedBlock)(text, openIdx, "{", "}");
72
+ const bodyStartLine = lineAt(text, openIdx);
73
+ body.split("\n").forEach((raw, i) => {
74
+ const line = raw.replace(/#.*$/, "").trim();
75
+ const fm = /^(\w+)\s*[(:]/.exec(line);
76
+ if (fm)
77
+ out.push({ method: kind, path: fm[1], line: bodyStartLine + i });
78
+ });
79
+ }
80
+ return out;
81
+ }
82
+ function detectEndpoints(root) {
83
+ const out = [];
84
+ const seen = new Set();
85
+ const push = (protocol, method, path, ref, conf = tier0_js_1.STRUCTURAL_CONFIDENCE) => {
86
+ const id = `endpoint:${protocol}:${method}:${path}`;
87
+ if (seen.has(id))
88
+ return;
89
+ seen.add(id);
90
+ out.push({
91
+ id,
92
+ name: `${method} ${path}`,
93
+ method,
94
+ path,
95
+ protocol,
96
+ provenance: [{ source: "code", ref, confidence: conf }],
97
+ confidence: conf,
98
+ });
99
+ };
100
+ const restCall = /\b[\w$]+\.(get|post|put|patch|delete|options|head|all)\s*\(\s*[`'"]([^`'"]+)[`'"]/gi;
101
+ const trpcRe = /(\w+)\s*:\s*[\w.]*[Pp]rocedure[\s\S]{0,400}?\.(query|mutation|subscription)\s*\(/g;
102
+ const gqlRe = /(?:gql|graphql)\s*`([\s\S]*?)`/g;
103
+ for (const rel of (0, walk_js_1.walkSourceFiles)(root)) {
104
+ let text;
105
+ try {
106
+ text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8");
107
+ }
108
+ catch {
109
+ continue;
110
+ }
111
+ const base = rel.split("/").pop();
112
+ // Next.js App Router route handlers.
113
+ if (/^route\.(tsx?|jsx?|mjs|cjs)$/.test(base)) {
114
+ const p = appRouterPath(rel);
115
+ if (p)
116
+ for (const method of HTTP_METHODS) {
117
+ const idx = methodMatch(text, method);
118
+ if (idx >= 0)
119
+ push("rest", method, p, `${rel}:${lineAt(text, idx)}`);
120
+ }
121
+ }
122
+ // Next.js Pages API.
123
+ const pa = pagesApiPath(rel);
124
+ if (pa)
125
+ push("rest", "ANY", pa, `${rel}:1`);
126
+ // Express / Fastify / Koa / Hono method calls (require a leading-slash path to
127
+ // avoid Map/Headers/`.get("x")` false positives).
128
+ restCall.lastIndex = 0;
129
+ let rm;
130
+ while ((rm = restCall.exec(text))) {
131
+ const path = rm[2];
132
+ if (!path.startsWith("/"))
133
+ continue;
134
+ const verb = rm[1].toUpperCase();
135
+ push("rest", verb === "ALL" ? "ANY" : verb, path, `${rel}:${lineAt(text, rm.index)}`);
136
+ }
137
+ // tRPC procedures (best-effort).
138
+ trpcRe.lastIndex = 0;
139
+ let tm;
140
+ while ((tm = trpcRe.exec(text))) {
141
+ push("trpc", tm[2].toUpperCase(), tm[1], `${rel}:${lineAt(text, tm.index)}`, TRPC_CONFIDENCE);
142
+ }
143
+ // Inline GraphQL SDL.
144
+ gqlRe.lastIndex = 0;
145
+ let gm;
146
+ while ((gm = gqlRe.exec(text))) {
147
+ const startLine = lineAt(text, gm.index) - 1;
148
+ for (const f of parseSdl(gm[1]))
149
+ push("graphql", f.method, f.path, `${rel}:${startLine + f.line}`);
150
+ }
151
+ }
152
+ // GraphQL SDL files.
153
+ for (const abs of (0, fs_util_js_1.findFiles)(root, (n) => n.endsWith(".graphql") || n.endsWith(".gql"))) {
154
+ let text;
155
+ try {
156
+ text = (0, node_fs_1.readFileSync)(abs, "utf8");
157
+ }
158
+ catch {
159
+ continue;
160
+ }
161
+ const rel = (0, node_path_1.relative)(root, abs).split("\\").join("/");
162
+ for (const f of parseSdl(text))
163
+ push("graphql", f.method, f.path, `${rel}:${f.line}`);
164
+ }
165
+ return out;
166
+ }
167
+ //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/analyze/endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Find every file under root whose basename matches `match`, sorted. */
2
+ export declare function findFiles(root: string, match: (name: string) => boolean): string[];
3
+ //# sourceMappingURL=fs-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-util.d.ts","sourceRoot":"","sources":["../../src/analyze/fs-util.ts"],"names":[],"mappings":"AAeA,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,EAAE,CAsBlF"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findFiles = findFiles;
4
+ /** Shared filesystem walk for the structural detectors (data model, etc.). */
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const IGNORE = new Set([
8
+ "node_modules",
9
+ ".git",
10
+ "dist",
11
+ "build",
12
+ ".next",
13
+ "coverage",
14
+ ".vercel",
15
+ ".archmantic",
16
+ ]);
17
+ /** Find every file under root whose basename matches `match`, sorted. */
18
+ function findFiles(root, match) {
19
+ const out = [];
20
+ const stack = [root];
21
+ while (stack.length) {
22
+ const dir = stack.pop();
23
+ let entries;
24
+ try {
25
+ entries = (0, node_fs_1.readdirSync)(dir, { withFileTypes: true });
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ for (const e of entries) {
31
+ const full = (0, node_path_1.join)(dir, e.name);
32
+ if (e.isDirectory()) {
33
+ if (IGNORE.has(e.name) || e.name.startsWith("."))
34
+ continue;
35
+ stack.push(full);
36
+ }
37
+ else if (e.isFile() && match(e.name)) {
38
+ out.push(full);
39
+ }
40
+ }
41
+ }
42
+ return out.sort();
43
+ }
44
+ //# sourceMappingURL=fs-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-util.js","sourceRoot":"","sources":["../../src/analyze/fs-util.ts"],"names":[],"mappings":";;AAgBA,8BAsBC;AAtCD,8EAA8E;AAC9E,qCAAsC;AACtC,yCAAiC;AAEjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;IACrB,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,UAAU;IACV,SAAS;IACT,aAAa;CACd,CAAC,CAAC;AAEH,yEAAyE;AACzE,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAgC;IACtE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,qBAAW,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}