openlore 2.0.3 → 2.0.4

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 (90) hide show
  1. package/README.md +4 -2
  2. package/dist/cli/commands/analyze.js +36 -23
  3. package/dist/cli/commands/analyze.js.map +1 -1
  4. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
  5. package/dist/core/analyzer/artifact-generator.js +37 -3
  6. package/dist/core/analyzer/artifact-generator.js.map +1 -1
  7. package/dist/core/analyzer/call-graph.d.ts +9 -2
  8. package/dist/core/analyzer/call-graph.d.ts.map +1 -1
  9. package/dist/core/analyzer/call-graph.js +534 -1
  10. package/dist/core/analyzer/call-graph.js.map +1 -1
  11. package/dist/core/analyzer/embedding-service.d.ts +2 -0
  12. package/dist/core/analyzer/embedding-service.d.ts.map +1 -1
  13. package/dist/core/analyzer/embedding-service.js +4 -0
  14. package/dist/core/analyzer/embedding-service.js.map +1 -1
  15. package/dist/core/analyzer/fixtures/regression/sample.d.ts +9 -0
  16. package/dist/core/analyzer/fixtures/regression/sample.d.ts.map +1 -0
  17. package/dist/core/analyzer/fixtures/regression/sample.js +26 -0
  18. package/dist/core/analyzer/fixtures/regression/sample.js.map +1 -0
  19. package/dist/core/analyzer/iac/ansible.d.ts +18 -0
  20. package/dist/core/analyzer/iac/ansible.d.ts.map +1 -0
  21. package/dist/core/analyzer/iac/ansible.js +219 -0
  22. package/dist/core/analyzer/iac/ansible.js.map +1 -0
  23. package/dist/core/analyzer/iac/cdk.d.ts +26 -0
  24. package/dist/core/analyzer/iac/cdk.d.ts.map +1 -0
  25. package/dist/core/analyzer/iac/cdk.js +204 -0
  26. package/dist/core/analyzer/iac/cdk.js.map +1 -0
  27. package/dist/core/analyzer/iac/classify-yaml.d.ts +20 -0
  28. package/dist/core/analyzer/iac/classify-yaml.d.ts.map +1 -0
  29. package/dist/core/analyzer/iac/classify-yaml.js +81 -0
  30. package/dist/core/analyzer/iac/classify-yaml.js.map +1 -0
  31. package/dist/core/analyzer/iac/cloudformation.d.ts +15 -0
  32. package/dist/core/analyzer/iac/cloudformation.d.ts.map +1 -0
  33. package/dist/core/analyzer/iac/cloudformation.js +189 -0
  34. package/dist/core/analyzer/iac/cloudformation.js.map +1 -0
  35. package/dist/core/analyzer/iac/helm.d.ts +20 -0
  36. package/dist/core/analyzer/iac/helm.d.ts.map +1 -0
  37. package/dist/core/analyzer/iac/helm.js +229 -0
  38. package/dist/core/analyzer/iac/helm.js.map +1 -0
  39. package/dist/core/analyzer/iac/index.d.ts +23 -0
  40. package/dist/core/analyzer/iac/index.d.ts.map +1 -0
  41. package/dist/core/analyzer/iac/index.js +40 -0
  42. package/dist/core/analyzer/iac/index.js.map +1 -0
  43. package/dist/core/analyzer/iac/kubernetes.d.ts +14 -0
  44. package/dist/core/analyzer/iac/kubernetes.d.ts.map +1 -0
  45. package/dist/core/analyzer/iac/kubernetes.js +226 -0
  46. package/dist/core/analyzer/iac/kubernetes.js.map +1 -0
  47. package/dist/core/analyzer/iac/project.d.ts +16 -0
  48. package/dist/core/analyzer/iac/project.d.ts.map +1 -0
  49. package/dist/core/analyzer/iac/project.js +97 -0
  50. package/dist/core/analyzer/iac/project.js.map +1 -0
  51. package/dist/core/analyzer/iac/pulumi.d.ts +21 -0
  52. package/dist/core/analyzer/iac/pulumi.d.ts.map +1 -0
  53. package/dist/core/analyzer/iac/pulumi.js +190 -0
  54. package/dist/core/analyzer/iac/pulumi.js.map +1 -0
  55. package/dist/core/analyzer/iac/terraform.d.ts +19 -0
  56. package/dist/core/analyzer/iac/terraform.d.ts.map +1 -0
  57. package/dist/core/analyzer/iac/terraform.js +546 -0
  58. package/dist/core/analyzer/iac/terraform.js.map +1 -0
  59. package/dist/core/analyzer/iac/types.d.ts +67 -0
  60. package/dist/core/analyzer/iac/types.d.ts.map +1 -0
  61. package/dist/core/analyzer/iac/types.js +39 -0
  62. package/dist/core/analyzer/iac/types.js.map +1 -0
  63. package/dist/core/analyzer/signature-extractor.d.ts +6 -0
  64. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
  65. package/dist/core/analyzer/signature-extractor.js +112 -2
  66. package/dist/core/analyzer/signature-extractor.js.map +1 -1
  67. package/dist/core/analyzer/spec-vector-index.d.ts +9 -2
  68. package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -1
  69. package/dist/core/analyzer/spec-vector-index.js +111 -10
  70. package/dist/core/analyzer/spec-vector-index.js.map +1 -1
  71. package/dist/core/analyzer/vector-index.d.ts +33 -1
  72. package/dist/core/analyzer/vector-index.d.ts.map +1 -1
  73. package/dist/core/analyzer/vector-index.js +99 -10
  74. package/dist/core/analyzer/vector-index.js.map +1 -1
  75. package/dist/core/services/edge-store.d.ts +6 -0
  76. package/dist/core/services/edge-store.d.ts.map +1 -1
  77. package/dist/core/services/edge-store.js +8 -0
  78. package/dist/core/services/edge-store.js.map +1 -1
  79. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
  80. package/dist/core/services/mcp-handlers/graph.js +12 -0
  81. package/dist/core/services/mcp-handlers/graph.js.map +1 -1
  82. package/dist/core/services/mcp-handlers/orient.js +2 -2
  83. package/dist/core/services/mcp-handlers/orient.js.map +1 -1
  84. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
  85. package/dist/core/services/mcp-handlers/semantic.js +23 -30
  86. package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
  87. package/dist/core/services/mcp-watcher.d.ts.map +1 -1
  88. package/dist/core/services/mcp-watcher.js +14 -10
  89. package/dist/core/services/mcp-watcher.js.map +1 -1
  90. package/package.json +10 -1
@@ -0,0 +1,546 @@
1
+ /**
2
+ * Terraform / HCL extraction (spec-07, reference implementation).
3
+ *
4
+ * Parser choice: a tolerant, hand-rolled HCL block scanner rather than a
5
+ * tree-sitter grammar. Rationale (per spec): `tree-sitter-hcl` is a native
6
+ * addon with an extra build/install surface, and IaC extraction only needs
7
+ * block boundaries + dotted-reference detection — not a full AST. A pure-JS
8
+ * scanner keeps the dependency tree flat and install-clean, and is fully
9
+ * deterministic. We never evaluate HCL; we only read declared blocks + refs.
10
+ *
11
+ * Files: *.tf, *.tf.json, *.tfvars. (The JSON variant is handled tolerantly by
12
+ * the same reference scan; structural JSON parsing is a spec-07 follow-up.)
13
+ */
14
+ import { dirname, posix as posixPath } from 'node:path';
15
+ import { emptyIacGraph } from './types.js';
16
+ /** Built-in reference roots that are never project resources. */
17
+ const TF_BUILTIN_ROOTS = new Set(['each', 'count', 'self', 'terraform', 'path']);
18
+ export function extractTerraform(files) {
19
+ const graph = emptyIacGraph();
20
+ // dir → resource addresses declared there, for local-module source linking.
21
+ const dirResources = new Map();
22
+ const moduleSources = [];
23
+ for (const file of files) {
24
+ if (file.path.toLowerCase().endsWith('.tf.json')) {
25
+ ingestTfJson(file, graph, dirResources, moduleSources);
26
+ continue;
27
+ }
28
+ const blocks = scanHclBlocks(file.content);
29
+ for (const block of blocks) {
30
+ ingestBlock(block, file.path, graph, dirResources, moduleSources);
31
+ }
32
+ }
33
+ // Link local module sources → the resources declared under that directory.
34
+ for (const { mod, sourceDir } of moduleSources) {
35
+ if (!sourceDir)
36
+ continue;
37
+ const targets = dirResources.get(sourceDir) ?? [];
38
+ for (const t of targets) {
39
+ graph.references.push({
40
+ fromAddress: mod.address,
41
+ toAddress: t.address,
42
+ kind: 'depends_on',
43
+ });
44
+ mod.members.push(t.address);
45
+ }
46
+ }
47
+ return graph;
48
+ }
49
+ function ingestBlock(block, filePath, graph, dirResources, moduleSources) {
50
+ const push = (r) => {
51
+ graph.resources.push(r);
52
+ const dir = posixPath.normalize(dirname(filePath));
53
+ if (!dirResources.has(dir))
54
+ dirResources.set(dir, []);
55
+ dirResources.get(dir).push(r);
56
+ };
57
+ switch (block.type) {
58
+ case 'resource': {
59
+ const [type, name] = block.labels;
60
+ if (!type || !name)
61
+ return;
62
+ const address = `${type}.${name}`;
63
+ push(makeResource(address, type, 'resource', filePath, block));
64
+ addRefs(address, block, filePath, graph);
65
+ return;
66
+ }
67
+ case 'data': {
68
+ const [type, name] = block.labels;
69
+ if (!type || !name)
70
+ return;
71
+ const address = `data.${type}.${name}`;
72
+ const isRemoteState = type === 'terraform_remote_state';
73
+ push(makeResource(address, type, 'data', filePath, block, isRemoteState));
74
+ addRefs(address, block, filePath, graph);
75
+ return;
76
+ }
77
+ case 'variable': {
78
+ const [name] = block.labels;
79
+ if (!name)
80
+ return;
81
+ push(makeResource(`var.${name}`, 'variable', 'variable', filePath, block));
82
+ return;
83
+ }
84
+ case 'output': {
85
+ const [name] = block.labels;
86
+ if (!name)
87
+ return;
88
+ const address = `output.${name}`;
89
+ push(makeResource(address, 'output', 'output', filePath, block));
90
+ addRefs(address, block, filePath, graph);
91
+ return;
92
+ }
93
+ case 'provider': {
94
+ const [name] = block.labels;
95
+ if (!name)
96
+ return;
97
+ graph.resources.push(makeResource(`provider.${name}`, 'provider', 'provider', filePath, block, true));
98
+ return;
99
+ }
100
+ case 'locals': {
101
+ // Each top-level `key = …` is a separate local.
102
+ for (const { key, line } of topLevelAssignments(block)) {
103
+ const address = `local.${key}`;
104
+ push({
105
+ address,
106
+ type: 'local',
107
+ kind: 'value',
108
+ filePath,
109
+ startLine: line,
110
+ endLine: line,
111
+ signature: `local.${key}`,
112
+ language: 'Terraform',
113
+ });
114
+ }
115
+ addRefs(block.labels.length ? block.labels[0] : 'locals', block, filePath, graph, true);
116
+ return;
117
+ }
118
+ case 'module': {
119
+ const [name] = block.labels;
120
+ if (!name)
121
+ return;
122
+ const address = `module.${name}`;
123
+ const source = attrValue(block.body, 'source');
124
+ const isLocal = !!source && (source.startsWith('./') || source.startsWith('../'));
125
+ const isExternal = !!source && !isLocal;
126
+ push(makeResource(address, 'module', 'module', filePath, block, isExternal));
127
+ const mod = {
128
+ address,
129
+ type: 'module',
130
+ filePath,
131
+ language: 'Terraform',
132
+ isExternal: isExternal || undefined,
133
+ members: [],
134
+ };
135
+ graph.modules.push(mod);
136
+ const sourceDir = isLocal && source
137
+ ? posixPath.normalize(posixPath.join(dirname(filePath), source))
138
+ : null;
139
+ moduleSources.push({ mod, sourceDir });
140
+ addRefs(address, block, filePath, graph);
141
+ return;
142
+ }
143
+ default:
144
+ return; // terraform {}, moved {}, import {}, etc. — not modeled
145
+ }
146
+ }
147
+ function makeResource(address, type, kind, filePath, block, isExternal = false) {
148
+ const meta = /\b(count|for_each)\b\s*=/.test(block.body) ? ' # (count/for_each: single node)' : '';
149
+ return {
150
+ address,
151
+ type,
152
+ kind,
153
+ filePath,
154
+ startLine: block.startLine,
155
+ endLine: block.endLine,
156
+ isExternal: isExternal || undefined,
157
+ signature: block.headerLine.trim() + meta,
158
+ language: 'Terraform',
159
+ };
160
+ }
161
+ /** Scan dotted references + depends_on in a block body and emit edges. */
162
+ function addRefs(fromAddress, block, _filePath, graph, localsMode = false) {
163
+ const seen = new Set();
164
+ const emit = (to, kind, line) => {
165
+ if (localsMode)
166
+ return; // handled per-local below
167
+ const key = `${to}\0${kind}`;
168
+ if (seen.has(key) || to === fromAddress)
169
+ return;
170
+ seen.add(key);
171
+ graph.references.push({ fromAddress, toAddress: to, kind, line });
172
+ };
173
+ // depends_on = [ a.b, module.c ]
174
+ const dep = block.body.match(/depends_on\s*=\s*\[([\s\S]*?)\]/);
175
+ if (dep) {
176
+ for (const raw of dep[1].split(',')) {
177
+ const ref = classifyRef(raw.trim());
178
+ if (ref)
179
+ emit(ref, 'depends_on');
180
+ }
181
+ }
182
+ for (const token of scanRefTokens(block.body)) {
183
+ const ref = classifyRef(token);
184
+ if (ref)
185
+ emit(ref, 'references');
186
+ }
187
+ }
188
+ /** Map a dotted token to a canonical resource address, or null to drop it. */
189
+ function classifyRef(token) {
190
+ const segs = token.split('.');
191
+ if (segs.length < 2)
192
+ return null;
193
+ const root = segs[0];
194
+ if (TF_BUILTIN_ROOTS.has(root))
195
+ return null;
196
+ if (root === 'var')
197
+ return `var.${segs[1]}`;
198
+ if (root === 'local')
199
+ return `local.${segs[1]}`;
200
+ if (root === 'module')
201
+ return `module.${segs[1]}`;
202
+ if (root === 'data')
203
+ return segs.length >= 3 ? `data.${segs[1]}.${segs[2]}` : null;
204
+ // Resource reference: <type>.<name>.<attr…>. We emit the candidate even when the
205
+ // type has no underscore (e.g. a custom provider type); the projector drops it
206
+ // if no declared resource owns the address, so this never invents a wrong edge.
207
+ return `${root}.${segs[1]}`;
208
+ }
209
+ /** Extract candidate dotted tokens from a body, ignoring quoted-string noise. */
210
+ function scanRefTokens(body) {
211
+ const tokens = [];
212
+ // Interpolations first (legacy ${…} and HCL2 bare refs both land in masked body).
213
+ for (const m of body.matchAll(/\$\{([^}]*)\}/g)) {
214
+ for (const t of m[1].matchAll(/[a-zA-Z_][\w-]*(?:\.[a-zA-Z_][\w-]*)+/g))
215
+ tokens.push(t[0]);
216
+ }
217
+ const masked = maskStrings(body);
218
+ for (const t of masked.matchAll(/[a-zA-Z_][\w-]*(?:\.[a-zA-Z_][\w-]*)+/g)) {
219
+ // Skip method/function calls like foo.bar( … ) where the token precedes '('
220
+ tokens.push(t[0]);
221
+ }
222
+ return tokens;
223
+ }
224
+ /**
225
+ * Structural parse of the Terraform JSON variant (`*.tf.json`). The same
226
+ * top-level blocks appear as JSON objects; references live in `${…}` strings.
227
+ */
228
+ function ingestTfJson(file, graph, dirResources, moduleSources) {
229
+ let root;
230
+ try {
231
+ root = JSON.parse(file.content);
232
+ }
233
+ catch {
234
+ return;
235
+ }
236
+ if (!root || typeof root !== 'object')
237
+ return;
238
+ const dir = posixPath.normalize(dirname(file.path));
239
+ const push = (r) => {
240
+ graph.resources.push(r);
241
+ if (!dirResources.has(dir))
242
+ dirResources.set(dir, []);
243
+ dirResources.get(dir).push(r);
244
+ };
245
+ const lineOf = (needle) => {
246
+ const idx = file.content.indexOf(`"${needle}"`);
247
+ if (idx < 0)
248
+ return 1;
249
+ return file.content.slice(0, idx).split('\n').length;
250
+ };
251
+ // A block value may be a single object or an array of objects (TF JSON allows both).
252
+ const each = (v) => Array.isArray(v) ? v.filter((x) => !!x && typeof x === 'object')
253
+ : v && typeof v === 'object' ? [v] : [];
254
+ const addRefsFrom = (fromAddress, body) => {
255
+ const seen = new Set();
256
+ const json = JSON.stringify(body ?? {});
257
+ for (const m of json.matchAll(/\$\{([^}]*)\}/g)) {
258
+ for (const t of m[1].matchAll(/[a-zA-Z_][\w-]*(?:\.[a-zA-Z_][\w-]*)+/g)) {
259
+ const ref = classifyRef(t[0]);
260
+ if (ref && ref !== fromAddress && !seen.has(`r:${ref}`)) {
261
+ seen.add(`r:${ref}`);
262
+ graph.references.push({ fromAddress, toAddress: ref, kind: 'references' });
263
+ }
264
+ }
265
+ }
266
+ const dep = body?.depends_on;
267
+ if (Array.isArray(dep)) {
268
+ for (const d of dep) {
269
+ const ref = typeof d === 'string' ? classifyRef(d) : null;
270
+ if (ref && ref !== fromAddress && !seen.has(`d:${ref}`)) {
271
+ seen.add(`d:${ref}`);
272
+ graph.references.push({ fromAddress, toAddress: ref, kind: 'depends_on' });
273
+ }
274
+ }
275
+ }
276
+ };
277
+ const resBlock = root.resource;
278
+ for (const [type, named] of Object.entries(resBlock ?? {})) {
279
+ for (const obj of each(named)) {
280
+ for (const [name, body] of Object.entries(obj)) {
281
+ const address = `${type}.${name}`;
282
+ push({ address, type, kind: 'resource', filePath: file.path, startLine: lineOf(name), signature: `resource "${type}" "${name}"`, language: 'Terraform' });
283
+ addRefsFrom(address, body);
284
+ }
285
+ }
286
+ }
287
+ const dataBlock = root.data;
288
+ for (const [type, named] of Object.entries(dataBlock ?? {})) {
289
+ for (const obj of each(named)) {
290
+ for (const [name, body] of Object.entries(obj)) {
291
+ const address = `data.${type}.${name}`;
292
+ push({ address, type, kind: 'data', filePath: file.path, startLine: lineOf(name), signature: `data "${type}" "${name}"`, language: 'Terraform' });
293
+ addRefsFrom(address, body);
294
+ }
295
+ }
296
+ }
297
+ for (const obj of each(root.variable)) {
298
+ for (const name of Object.keys(obj)) {
299
+ push({ address: `var.${name}`, type: 'variable', kind: 'variable', filePath: file.path, startLine: lineOf(name), signature: `variable "${name}"`, language: 'Terraform' });
300
+ }
301
+ }
302
+ for (const obj of each(root.output)) {
303
+ for (const [name, body] of Object.entries(obj)) {
304
+ const address = `output.${name}`;
305
+ push({ address, type: 'output', kind: 'output', filePath: file.path, startLine: lineOf(name), signature: `output "${name}"`, language: 'Terraform' });
306
+ addRefsFrom(address, body);
307
+ }
308
+ }
309
+ for (const obj of each(root.provider)) {
310
+ for (const name of Object.keys(obj)) {
311
+ graph.resources.push({ address: `provider.${name}`, type: 'provider', kind: 'provider', filePath: file.path, startLine: lineOf(name), isExternal: true, signature: `provider "${name}"`, language: 'Terraform' });
312
+ }
313
+ }
314
+ for (const obj of each(root.locals)) {
315
+ for (const key of Object.keys(obj)) {
316
+ push({ address: `local.${key}`, type: 'local', kind: 'value', filePath: file.path, startLine: lineOf(key), signature: `local.${key}`, language: 'Terraform' });
317
+ }
318
+ }
319
+ for (const obj of each(root.module)) {
320
+ for (const [name, body] of Object.entries(obj)) {
321
+ const address = `module.${name}`;
322
+ const source = body?.source;
323
+ const isLocal = typeof source === 'string' && (source.startsWith('./') || source.startsWith('../'));
324
+ const isExternal = typeof source === 'string' && !isLocal;
325
+ push({ address, type: 'module', kind: 'module', filePath: file.path, startLine: lineOf(name), isExternal: isExternal || undefined, signature: `module "${name}"`, language: 'Terraform' });
326
+ const mod = { address, type: 'module', filePath: file.path, language: 'Terraform', isExternal: isExternal || undefined, members: [] };
327
+ graph.modules.push(mod);
328
+ const sourceDir = isLocal && typeof source === 'string' ? posixPath.normalize(posixPath.join(dir, source)) : null;
329
+ moduleSources.push({ mod, sourceDir });
330
+ addRefsFrom(address, body);
331
+ }
332
+ }
333
+ }
334
+ /** Blank out double-quoted string literals (keeping length) to avoid false refs. */
335
+ function maskStrings(body) {
336
+ return body.replace(/"(?:[^"\\]|\\.)*"/g, (s) => ' '.repeat(s.length));
337
+ }
338
+ /** Top-level `key = …` assignments inside a block body (depth-0 only). */
339
+ function topLevelAssignments(block) {
340
+ const out = [];
341
+ const lines = block.body.split('\n');
342
+ let depth = 0;
343
+ for (let i = 0; i < lines.length; i++) {
344
+ const line = lines[i];
345
+ if (depth === 0) {
346
+ const m = line.match(/^\s*([A-Za-z_][\w-]*)\s*=/);
347
+ if (m)
348
+ out.push({ key: m[1], line: block.startLine + 1 + i });
349
+ }
350
+ depth += countUnquoted(line, '{') + countUnquoted(line, '[');
351
+ depth -= countUnquoted(line, '}') + countUnquoted(line, ']');
352
+ if (depth < 0)
353
+ depth = 0;
354
+ }
355
+ return out;
356
+ }
357
+ function countUnquoted(line, ch) {
358
+ const masked = maskStrings(line);
359
+ let n = 0;
360
+ for (const c of masked)
361
+ if (c === ch)
362
+ n++;
363
+ return n;
364
+ }
365
+ /** Value of a simple top-level `key = "value"` attribute. */
366
+ function attrValue(body, key) {
367
+ const re = new RegExp(`(^|\\n)\\s*${key}\\s*=\\s*"((?:[^"\\\\]|\\\\.)*)"`);
368
+ const m = body.match(re);
369
+ return m ? m[2] : null;
370
+ }
371
+ /**
372
+ * Scan top-level HCL blocks, tracking strings/comments/heredocs and brace depth.
373
+ */
374
+ function scanHclBlocks(content) {
375
+ const blocks = [];
376
+ const len = content.length;
377
+ let i = 0;
378
+ let line = 1;
379
+ const lineAt = (idx) => {
380
+ let n = 1;
381
+ for (let k = 0; k < idx && k < len; k++)
382
+ if (content[k] === '\n')
383
+ n++;
384
+ return n;
385
+ };
386
+ while (i < len) {
387
+ const ch = content[i];
388
+ if (ch === '\n') {
389
+ line++;
390
+ i++;
391
+ continue;
392
+ }
393
+ // Skip comments
394
+ if (ch === '#' || (ch === '/' && content[i + 1] === '/')) {
395
+ while (i < len && content[i] !== '\n')
396
+ i++;
397
+ continue;
398
+ }
399
+ if (ch === '/' && content[i + 1] === '*') {
400
+ i += 2;
401
+ while (i < len && !(content[i] === '*' && content[i + 1] === '/')) {
402
+ if (content[i] === '\n')
403
+ line++;
404
+ i++;
405
+ }
406
+ i += 2;
407
+ continue;
408
+ }
409
+ // Only attempt a header at a token boundary (start, or after whitespace/braces).
410
+ const prev = i === 0 ? '\n' : content[i - 1];
411
+ const atBoundary = /[\s{}]/.test(prev);
412
+ const idMatch = atBoundary ? /^([A-Za-z_][\w-]*)/.exec(content.slice(i, i + 64)) : null;
413
+ if (idMatch) {
414
+ const headerStart = i;
415
+ const blockStartLine = line;
416
+ let j = i + idMatch[1].length;
417
+ const labels = [];
418
+ // consume labels (quoted strings or bare identifiers) until '{' or newline-without-brace
419
+ let sawBrace = false;
420
+ while (j < len) {
421
+ const c = content[j];
422
+ if (c === '{') {
423
+ sawBrace = true;
424
+ break;
425
+ }
426
+ if (c === '\n')
427
+ break;
428
+ if (c === '"') {
429
+ let k = j + 1;
430
+ let s = '';
431
+ while (k < len && content[k] !== '"') {
432
+ if (content[k] === '\\')
433
+ k++;
434
+ s += content[k];
435
+ k++;
436
+ }
437
+ labels.push(s);
438
+ j = k + 1;
439
+ continue;
440
+ }
441
+ if (c === '=') {
442
+ sawBrace = false;
443
+ break;
444
+ } // it's an assignment, not a block
445
+ if (/\s/.test(c)) {
446
+ j++;
447
+ continue;
448
+ }
449
+ // bare identifier label (rare)
450
+ const bm = /^[A-Za-z_][\w-]*/.exec(content.slice(j, j + 64));
451
+ if (bm) {
452
+ labels.push(bm[0]);
453
+ j += bm[0].length;
454
+ continue;
455
+ }
456
+ j++;
457
+ }
458
+ if (sawBrace) {
459
+ const headerLine = content.slice(headerStart, j).replace(/\s+/g, ' ');
460
+ // brace-match the body
461
+ const bodyStart = j + 1;
462
+ let depth = 1;
463
+ let k = bodyStart;
464
+ let curLine = blockStartLine + countChar(content.slice(headerStart, bodyStart), '\n');
465
+ while (k < len && depth > 0) {
466
+ const c = content[k];
467
+ if (c === '\n') {
468
+ curLine++;
469
+ k++;
470
+ continue;
471
+ }
472
+ if (c === '#' || (c === '/' && content[k + 1] === '/')) {
473
+ while (k < len && content[k] !== '\n')
474
+ k++;
475
+ continue;
476
+ }
477
+ if (c === '/' && content[k + 1] === '*') {
478
+ k += 2;
479
+ while (k < len && !(content[k] === '*' && content[k + 1] === '/')) {
480
+ if (content[k] === '\n')
481
+ curLine++;
482
+ k++;
483
+ }
484
+ k += 2;
485
+ continue;
486
+ }
487
+ if (c === '"') {
488
+ k++;
489
+ while (k < len && content[k] !== '"') {
490
+ if (content[k] === '\\')
491
+ k++;
492
+ if (content[k] === '\n')
493
+ curLine++;
494
+ k++;
495
+ }
496
+ k++;
497
+ continue;
498
+ }
499
+ // heredoc <<EOT ... EOT
500
+ if (c === '<' && content[k + 1] === '<') {
501
+ const hm = /^<<-?(\w+)\n/.exec(content.slice(k));
502
+ if (hm) {
503
+ const tag = hm[1];
504
+ k += hm[0].length;
505
+ const endRe = new RegExp(`\\n\\s*${tag}\\b`);
506
+ const rest = content.slice(k);
507
+ const em = endRe.exec(rest);
508
+ const consumed = em ? em.index + em[0].length : rest.length;
509
+ curLine += countChar(rest.slice(0, consumed), '\n');
510
+ k += consumed;
511
+ continue;
512
+ }
513
+ }
514
+ if (c === '{')
515
+ depth++;
516
+ else if (c === '}')
517
+ depth--;
518
+ k++;
519
+ }
520
+ const bodyEnd = k - 1;
521
+ const body = content.slice(bodyStart, bodyEnd);
522
+ blocks.push({
523
+ type: idMatch[1],
524
+ labels,
525
+ body,
526
+ startLine: blockStartLine,
527
+ endLine: lineAt(bodyEnd),
528
+ headerLine,
529
+ });
530
+ i = k;
531
+ line = curLine;
532
+ continue;
533
+ }
534
+ }
535
+ i++;
536
+ }
537
+ return blocks;
538
+ }
539
+ function countChar(s, ch) {
540
+ let n = 0;
541
+ for (const c of s)
542
+ if (c === ch)
543
+ n++;
544
+ return n;
545
+ }
546
+ //# sourceMappingURL=terraform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Infrastructure-as-Code — normalized resource graph types (spec-07).
3
+ *
4
+ * Every IaC ecosystem parser produces this normalized intermediate; a single
5
+ * projector (project.ts) maps it onto the existing FunctionNode/CallEdge/ClassNode
6
+ * graph primitives. No graph-schema or MCP-tool changes are required: IaC rides
7
+ * on the existing graph (see record_decision: "IaC projects onto existing graph").
8
+ *
9
+ * Edge direction is dependent → dependency, so depth-1 callers of a node answers
10
+ * "who depends on this?" (blast radius) and fanOut answers "what does this need?".
11
+ */
12
+ /** Ecosystem language tags, used as FunctionNode.language. */
13
+ export type IacLanguage = 'Terraform' | 'Kubernetes' | 'Helm' | 'CloudFormation' | 'Ansible' | 'Pulumi' | 'CDK' | 'CDKTF';
14
+ /** All IaC language tags (single source of truth for dispatch + gating). */
15
+ export declare const IAC_LANGUAGES: readonly IacLanguage[];
16
+ export declare function isIacLanguage(lang: string): lang is IacLanguage;
17
+ export type IacResourceKind = 'resource' | 'data' | 'module' | 'variable' | 'output' | 'provider' | 'manifest' | 'play' | 'task' | 'role' | 'handler' | 'value' | 'stack';
18
+ /** A declared infrastructure object — projects to a FunctionNode. */
19
+ export interface IacResource {
20
+ /** Canonical, ecosystem-specific address (e.g. "aws_s3_bucket.logs", "Deployment/web"). */
21
+ address: string;
22
+ /** Resource type / kind ("aws_s3_bucket", "Deployment", "AWS::S3::Bucket"). */
23
+ type: string;
24
+ kind: IacResourceKind;
25
+ /** Repo-relative, POSIX path. */
26
+ filePath: string;
27
+ /** 1-based; REQUIRED (used for graph/SCIP ranges). */
28
+ startLine: number;
29
+ endLine?: number;
30
+ /** Owning module/chart/role/stack, for grouping → ClassNode. */
31
+ module?: string;
32
+ /** Provider, registry module, remote chart, base image. */
33
+ isExternal?: boolean;
34
+ /** Declaration header, for search/signatures. */
35
+ signature: string;
36
+ language: IacLanguage;
37
+ }
38
+ /** A reference between two resources — projects to a CallEdge (dependent → dependency). */
39
+ export interface IacReference {
40
+ /** The dependent (it references…). */
41
+ fromAddress: string;
42
+ /** …the dependency. */
43
+ toAddress: string;
44
+ kind: 'references' | 'depends_on';
45
+ line?: number;
46
+ }
47
+ /** A module/chart/role/stack grouping — projects to a ClassNode. */
48
+ export interface IacModule {
49
+ /** Canonical module address (e.g. "module.network", chart name, role name). */
50
+ address: string;
51
+ type: string;
52
+ filePath: string;
53
+ language: IacLanguage;
54
+ isExternal?: boolean;
55
+ /** Member resource addresses. */
56
+ members: string[];
57
+ }
58
+ /** The normalized graph produced by an ecosystem parser. */
59
+ export interface IacGraph {
60
+ resources: IacResource[];
61
+ references: IacReference[];
62
+ modules: IacModule[];
63
+ }
64
+ export declare function emptyIacGraph(): IacGraph;
65
+ /** Merge several normalized graphs into one. */
66
+ export declare function mergeIacGraphs(graphs: IacGraph[]): IacGraph;
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GACnB,WAAW,GACX,YAAY,GACZ,MAAM,GACN,gBAAgB,GAChB,SAAS,GACT,QAAQ,GACR,KAAK,GACL,OAAO,CAAC;AAEZ,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAStC,CAAC;AAEX,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAE/D;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,MAAM,GACN,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,GACT,OAAO,GACP,OAAO,CAAC;AAEZ,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,CAAC;IACtB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,WAAW,CAAC;CACvB;AAED,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,wBAAgB,aAAa,IAAI,QAAQ,CAExC;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAQ3D"}