openlore 2.0.2 → 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 (145) hide show
  1. package/README.md +32 -2
  2. package/dist/cli/commands/analyze.js +36 -23
  3. package/dist/cli/commands/analyze.js.map +1 -1
  4. package/dist/cli/commands/mcp.d.ts.map +1 -1
  5. package/dist/cli/commands/mcp.js +18 -1
  6. package/dist/cli/commands/mcp.js.map +1 -1
  7. package/dist/cli/export/index.d.ts +10 -0
  8. package/dist/cli/export/index.d.ts.map +1 -0
  9. package/dist/cli/export/index.js +27 -0
  10. package/dist/cli/export/index.js.map +1 -0
  11. package/dist/cli/export/scip.d.ts +22 -0
  12. package/dist/cli/export/scip.d.ts.map +1 -0
  13. package/dist/cli/export/scip.js +95 -0
  14. package/dist/cli/export/scip.js.map +1 -0
  15. package/dist/cli/index.js +4 -0
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/manifest/detect/events.d.ts +31 -0
  18. package/dist/cli/manifest/detect/events.d.ts.map +1 -0
  19. package/dist/cli/manifest/detect/events.js +22 -0
  20. package/dist/cli/manifest/detect/events.js.map +1 -0
  21. package/dist/cli/manifest/detect/http-routes.d.ts +22 -0
  22. package/dist/cli/manifest/detect/http-routes.d.ts.map +1 -0
  23. package/dist/cli/manifest/detect/http-routes.js +18 -0
  24. package/dist/cli/manifest/detect/http-routes.js.map +1 -0
  25. package/dist/cli/manifest/detect/public-symbols.d.ts +46 -0
  26. package/dist/cli/manifest/detect/public-symbols.d.ts.map +1 -0
  27. package/dist/cli/manifest/detect/public-symbols.js +144 -0
  28. package/dist/cli/manifest/detect/public-symbols.js.map +1 -0
  29. package/dist/cli/manifest/emit.d.ts +103 -0
  30. package/dist/cli/manifest/emit.d.ts.map +1 -0
  31. package/dist/cli/manifest/emit.js +272 -0
  32. package/dist/cli/manifest/emit.js.map +1 -0
  33. package/dist/cli/manifest/index.d.ts +11 -0
  34. package/dist/cli/manifest/index.d.ts.map +1 -0
  35. package/dist/cli/manifest/index.js +31 -0
  36. package/dist/cli/manifest/index.js.map +1 -0
  37. package/dist/cli/manifest/schema-validator.d.ts +18 -0
  38. package/dist/cli/manifest/schema-validator.d.ts.map +1 -0
  39. package/dist/cli/manifest/schema-validator.js +77 -0
  40. package/dist/cli/manifest/schema-validator.js.map +1 -0
  41. package/dist/cli/manifest/validate.d.ts +15 -0
  42. package/dist/cli/manifest/validate.d.ts.map +1 -0
  43. package/dist/cli/manifest/validate.js +51 -0
  44. package/dist/cli/manifest/validate.js.map +1 -0
  45. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
  46. package/dist/core/analyzer/artifact-generator.js +37 -3
  47. package/dist/core/analyzer/artifact-generator.js.map +1 -1
  48. package/dist/core/analyzer/call-graph.d.ts +9 -2
  49. package/dist/core/analyzer/call-graph.d.ts.map +1 -1
  50. package/dist/core/analyzer/call-graph.js +534 -1
  51. package/dist/core/analyzer/call-graph.js.map +1 -1
  52. package/dist/core/analyzer/embedding-service.d.ts +2 -0
  53. package/dist/core/analyzer/embedding-service.d.ts.map +1 -1
  54. package/dist/core/analyzer/embedding-service.js +4 -0
  55. package/dist/core/analyzer/embedding-service.js.map +1 -1
  56. package/dist/core/analyzer/fixtures/regression/sample.d.ts +9 -0
  57. package/dist/core/analyzer/fixtures/regression/sample.d.ts.map +1 -0
  58. package/dist/core/analyzer/fixtures/regression/sample.js +26 -0
  59. package/dist/core/analyzer/fixtures/regression/sample.js.map +1 -0
  60. package/dist/core/analyzer/iac/ansible.d.ts +18 -0
  61. package/dist/core/analyzer/iac/ansible.d.ts.map +1 -0
  62. package/dist/core/analyzer/iac/ansible.js +219 -0
  63. package/dist/core/analyzer/iac/ansible.js.map +1 -0
  64. package/dist/core/analyzer/iac/cdk.d.ts +26 -0
  65. package/dist/core/analyzer/iac/cdk.d.ts.map +1 -0
  66. package/dist/core/analyzer/iac/cdk.js +204 -0
  67. package/dist/core/analyzer/iac/cdk.js.map +1 -0
  68. package/dist/core/analyzer/iac/classify-yaml.d.ts +20 -0
  69. package/dist/core/analyzer/iac/classify-yaml.d.ts.map +1 -0
  70. package/dist/core/analyzer/iac/classify-yaml.js +81 -0
  71. package/dist/core/analyzer/iac/classify-yaml.js.map +1 -0
  72. package/dist/core/analyzer/iac/cloudformation.d.ts +15 -0
  73. package/dist/core/analyzer/iac/cloudformation.d.ts.map +1 -0
  74. package/dist/core/analyzer/iac/cloudformation.js +189 -0
  75. package/dist/core/analyzer/iac/cloudformation.js.map +1 -0
  76. package/dist/core/analyzer/iac/helm.d.ts +20 -0
  77. package/dist/core/analyzer/iac/helm.d.ts.map +1 -0
  78. package/dist/core/analyzer/iac/helm.js +229 -0
  79. package/dist/core/analyzer/iac/helm.js.map +1 -0
  80. package/dist/core/analyzer/iac/index.d.ts +23 -0
  81. package/dist/core/analyzer/iac/index.d.ts.map +1 -0
  82. package/dist/core/analyzer/iac/index.js +40 -0
  83. package/dist/core/analyzer/iac/index.js.map +1 -0
  84. package/dist/core/analyzer/iac/kubernetes.d.ts +14 -0
  85. package/dist/core/analyzer/iac/kubernetes.d.ts.map +1 -0
  86. package/dist/core/analyzer/iac/kubernetes.js +226 -0
  87. package/dist/core/analyzer/iac/kubernetes.js.map +1 -0
  88. package/dist/core/analyzer/iac/project.d.ts +16 -0
  89. package/dist/core/analyzer/iac/project.d.ts.map +1 -0
  90. package/dist/core/analyzer/iac/project.js +97 -0
  91. package/dist/core/analyzer/iac/project.js.map +1 -0
  92. package/dist/core/analyzer/iac/pulumi.d.ts +21 -0
  93. package/dist/core/analyzer/iac/pulumi.d.ts.map +1 -0
  94. package/dist/core/analyzer/iac/pulumi.js +190 -0
  95. package/dist/core/analyzer/iac/pulumi.js.map +1 -0
  96. package/dist/core/analyzer/iac/terraform.d.ts +19 -0
  97. package/dist/core/analyzer/iac/terraform.d.ts.map +1 -0
  98. package/dist/core/analyzer/iac/terraform.js +546 -0
  99. package/dist/core/analyzer/iac/terraform.js.map +1 -0
  100. package/dist/core/analyzer/iac/types.d.ts +67 -0
  101. package/dist/core/analyzer/iac/types.d.ts.map +1 -0
  102. package/dist/core/analyzer/iac/types.js +39 -0
  103. package/dist/core/analyzer/iac/types.js.map +1 -0
  104. package/dist/core/analyzer/signature-extractor.d.ts +6 -0
  105. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
  106. package/dist/core/analyzer/signature-extractor.js +112 -2
  107. package/dist/core/analyzer/signature-extractor.js.map +1 -1
  108. package/dist/core/analyzer/spec-vector-index.d.ts +9 -2
  109. package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -1
  110. package/dist/core/analyzer/spec-vector-index.js +111 -10
  111. package/dist/core/analyzer/spec-vector-index.js.map +1 -1
  112. package/dist/core/analyzer/vector-index.d.ts +33 -1
  113. package/dist/core/analyzer/vector-index.d.ts.map +1 -1
  114. package/dist/core/analyzer/vector-index.js +99 -10
  115. package/dist/core/analyzer/vector-index.js.map +1 -1
  116. package/dist/core/scip/index.d.ts +51 -0
  117. package/dist/core/scip/index.d.ts.map +1 -0
  118. package/dist/core/scip/index.js +210 -0
  119. package/dist/core/scip/index.js.map +1 -0
  120. package/dist/core/scip/moniker.d.ts +48 -0
  121. package/dist/core/scip/moniker.d.ts.map +1 -0
  122. package/dist/core/scip/moniker.js +109 -0
  123. package/dist/core/scip/moniker.js.map +1 -0
  124. package/dist/core/scip/schema.d.ts +34 -0
  125. package/dist/core/scip/schema.d.ts.map +1 -0
  126. package/dist/core/scip/schema.js +48 -0
  127. package/dist/core/scip/schema.js.map +1 -0
  128. package/dist/core/scip/vendor/scip.proto +910 -0
  129. package/dist/core/services/edge-store.d.ts +6 -0
  130. package/dist/core/services/edge-store.d.ts.map +1 -1
  131. package/dist/core/services/edge-store.js +8 -0
  132. package/dist/core/services/edge-store.js.map +1 -1
  133. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
  134. package/dist/core/services/mcp-handlers/graph.js +12 -0
  135. package/dist/core/services/mcp-handlers/graph.js.map +1 -1
  136. package/dist/core/services/mcp-handlers/orient.js +2 -2
  137. package/dist/core/services/mcp-handlers/orient.js.map +1 -1
  138. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
  139. package/dist/core/services/mcp-handlers/semantic.js +23 -30
  140. package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
  141. package/dist/core/services/mcp-watcher.d.ts.map +1 -1
  142. package/dist/core/services/mcp-watcher.js +14 -10
  143. package/dist/core/services/mcp-watcher.js.map +1 -1
  144. package/package.json +12 -1
  145. package/schemas/openlore-manifest-v1.json +191 -0
@@ -0,0 +1,272 @@
1
+ /**
2
+ * `openlore manifest emit` — write `.well-known/openlore.json`.
3
+ *
4
+ * A pure file-emission feature: it reads the analysis artifacts OpenLore has
5
+ * already produced plus local git state, and writes a small, public,
6
+ * deterministic self-description. No network, no graph-schema changes.
7
+ *
8
+ * Determinism: `generated_at` is the HEAD commit date (not wall-clock), and all
9
+ * arrays are sorted, so re-emitting on the same graph + commit is byte-stable.
10
+ */
11
+ import { execFileSync } from 'node:child_process';
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import { mkdir, writeFile } from 'node:fs/promises';
14
+ import { basename, dirname, join, resolve } from 'node:path';
15
+ import { createRequire } from 'node:module';
16
+ import { logger } from '../../utils/logger.js';
17
+ import { readCachedContext } from '../../core/services/mcp-handlers/utils.js';
18
+ import { OPENLORE_DIR, OPENLORE_ANALYSIS_SUBDIR, ARTIFACT_DEPENDENCY_GRAPH, ARTIFACT_ROUTE_INVENTORY, } from '../../constants.js';
19
+ import { derivePublicSymbols } from './detect/public-symbols.js';
20
+ import { deriveHttpRoutes } from './detect/http-routes.js';
21
+ import { deriveEventsEmitted, deriveEventsConsumed, deriveRpcEndpoints, } from './detect/events.js';
22
+ export const MANIFEST_VERSION = 1;
23
+ const SCHEMA_URL = 'https://raw.githubusercontent.com/clay-good/OpenLore/main/schemas/openlore-manifest-v1.json';
24
+ const require = createRequire(import.meta.url);
25
+ // ── git helpers (all best-effort; never throw) ─────────────────────────────
26
+ function git(cwd, args) {
27
+ try {
28
+ return execFileSync('git', args, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || null;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /** Convert a git remote (ssh or https) to a browseable https URL, sans `.git`. */
35
+ function normalizeRemoteToWebUrl(remote) {
36
+ if (!remote)
37
+ return null;
38
+ let url = remote.trim().replace(/\.git$/, '');
39
+ const ssh = url.match(/^git@([^:]+):(.+)$/);
40
+ if (ssh)
41
+ url = `https://${ssh[1]}/${ssh[2]}`;
42
+ url = url.replace(/^ssh:\/\/git@/, 'https://');
43
+ return url;
44
+ }
45
+ function detectDefaultBranch(cwd) {
46
+ const originHead = git(cwd, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);
47
+ if (originHead)
48
+ return originHead.replace(/^origin\//, '');
49
+ for (const candidate of ['main', 'master']) {
50
+ if (git(cwd, ['rev-parse', '--verify', '--quiet', candidate]) !== null)
51
+ return candidate;
52
+ }
53
+ return git(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']);
54
+ }
55
+ /** repo-relative file path → its top-level exports (from dependency-graph.json). */
56
+ function loadExportsByFile(analysisDir) {
57
+ const map = new Map();
58
+ const file = join(analysisDir, ARTIFACT_DEPENDENCY_GRAPH);
59
+ if (!existsSync(file))
60
+ return map;
61
+ try {
62
+ const data = JSON.parse(readFileSync(file, 'utf-8'));
63
+ for (const node of data.nodes ?? []) {
64
+ const path = node.file?.path;
65
+ if (path && Array.isArray(node.exports))
66
+ map.set(path, node.exports);
67
+ }
68
+ }
69
+ catch {
70
+ // tolerate a malformed/partial artifact — emit what we can
71
+ }
72
+ return map;
73
+ }
74
+ function loadRoutes(analysisDir) {
75
+ const file = join(analysisDir, ARTIFACT_ROUTE_INVENTORY);
76
+ if (!existsSync(file))
77
+ return [];
78
+ try {
79
+ const data = JSON.parse(readFileSync(file, 'utf-8'));
80
+ return data.routes ?? [];
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ }
86
+ function countSpecs(projectRoot) {
87
+ try {
88
+ // glob is already a dependency; use sync matching against openspec/specs.
89
+ const specsDir = join(projectRoot, 'openspec', 'specs');
90
+ if (!existsSync(specsDir))
91
+ return 0;
92
+ const { globSync } = require('glob');
93
+ return globSync('*/spec.md', { cwd: specsDir }).length;
94
+ }
95
+ catch {
96
+ return 0;
97
+ }
98
+ }
99
+ /**
100
+ * Map package entry points (dist build outputs) back to their TS/JS source
101
+ * files, restricted to those the dependency graph actually knows about. These
102
+ * define the default "public" surface.
103
+ */
104
+ function entrySourceFiles(pkg, exportsByFile) {
105
+ if (!pkg)
106
+ return [];
107
+ const dist = [];
108
+ if (typeof pkg.main === 'string')
109
+ dist.push(pkg.main);
110
+ if (typeof pkg.module === 'string')
111
+ dist.push(pkg.module);
112
+ const collect = (node) => {
113
+ if (typeof node === 'string')
114
+ dist.push(node);
115
+ else if (node && typeof node === 'object')
116
+ for (const v of Object.values(node))
117
+ collect(v);
118
+ };
119
+ collect(pkg.exports);
120
+ const toSrc = (p) => p.replace(/^\.\//, '').replace(/^dist\//, 'src/').replace(/\.(js|d\.ts)$/, '.ts');
121
+ const candidates = new Set(dist.map(toSrc));
122
+ return [...candidates].filter(f => exportsByFile.has(f)).sort();
123
+ }
124
+ function readPackageJson(projectRoot) {
125
+ const path = join(projectRoot, 'package.json');
126
+ if (!existsSync(path))
127
+ return null;
128
+ try {
129
+ return JSON.parse(readFileSync(path, 'utf-8'));
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ function toolVersion() {
136
+ return require('../../../package.json').version;
137
+ }
138
+ // ── stats / languages ────────────────────────────────────────────────────────
139
+ function computeStats(graph) {
140
+ const real = graph.nodes.filter(n => !n.isExternal);
141
+ const files = new Set(real.map(n => n.filePath));
142
+ const clusters = new Set(real.map(n => n.communityId).filter((c) => !!c));
143
+ const mccabe = real.map(n => n.cyclomaticComplexity).filter((c) => typeof c === 'number');
144
+ const avg = mccabe.length ? mccabe.reduce((a, b) => a + b, 0) / mccabe.length : 0;
145
+ return {
146
+ functions: real.length,
147
+ files: files.size,
148
+ modules: graph.classes.length,
149
+ avg_mccabe: Math.round(avg * 10) / 10,
150
+ clusters: clusters.size,
151
+ };
152
+ }
153
+ function computeLanguages(nodes) {
154
+ const byLang = new Map();
155
+ for (const n of nodes) {
156
+ if (n.isExternal)
157
+ continue;
158
+ const lang = n.language.toLowerCase();
159
+ let entry = byLang.get(lang);
160
+ if (!entry) {
161
+ entry = { files: new Set(), functions: 0 };
162
+ byLang.set(lang, entry);
163
+ }
164
+ entry.files.add(n.filePath);
165
+ entry.functions++;
166
+ }
167
+ return [...byLang.entries()]
168
+ .map(([name, v]) => ({ name, files: v.files.size, functions: v.functions }))
169
+ .sort((a, b) => a.name.localeCompare(b.name));
170
+ }
171
+ // ── external packages ─────────────────────────────────────────────────────────
172
+ // TODO(spec-05-followup): first_use requires persisted per-file import sources
173
+ // from the analyzer (not currently surfaced), so it is omitted here.
174
+ function deriveExternalPackages(pkg) {
175
+ if (!pkg)
176
+ return [];
177
+ const deps = { ...(pkg.dependencies ?? {}), ...(pkg.peerDependencies ?? {}) };
178
+ return Object.entries(deps)
179
+ .map(([name, version_range]) => ({ name, version_range: version_range ?? null }))
180
+ .sort((a, b) => a.name.localeCompare(b.name));
181
+ }
182
+ /** Build the manifest object (pure — all I/O is done by the caller). */
183
+ export function buildManifest(inputs, opts) {
184
+ const repoWebUrl = normalizeRemoteToWebUrl(inputs.git.remote);
185
+ const repoName = inputs.pkg?.name ??
186
+ (repoWebUrl ? basename(repoWebUrl) : basename(inputs.projectRoot));
187
+ let publicSymbols = derivePublicSymbols({
188
+ nodes: inputs.graph.nodes,
189
+ classes: inputs.graph.classes,
190
+ exportsByFile: inputs.exportsByFile,
191
+ entryFiles: entrySourceFiles(inputs.pkg, inputs.exportsByFile),
192
+ includePrivate: opts.includePrivate ?? false,
193
+ });
194
+ let truncated = false;
195
+ if (typeof opts.maxSymbols === 'number' && publicSymbols.length > opts.maxSymbols) {
196
+ publicSymbols = publicSymbols.slice(0, opts.maxSymbols);
197
+ truncated = true;
198
+ }
199
+ return {
200
+ $schema: SCHEMA_URL,
201
+ openlore_manifest_version: MANIFEST_VERSION,
202
+ // Commit date keeps the manifest byte-stable per commit; fall back to epoch
203
+ // when git is unavailable (still deterministic, never wall-clock).
204
+ generated_at: inputs.git.committedAt ?? '1970-01-01T00:00:00Z',
205
+ generator: { name: 'openlore', version: inputs.toolVersion },
206
+ repo: {
207
+ name: repoName,
208
+ git_remote: inputs.git.remote,
209
+ git_commit: inputs.git.commit,
210
+ default_branch: inputs.git.defaultBranch,
211
+ },
212
+ languages: computeLanguages(inputs.graph.nodes),
213
+ stats: computeStats(inputs.graph),
214
+ exports: {
215
+ ...(truncated ? { truncated: true } : {}),
216
+ public_symbols: publicSymbols,
217
+ http_routes: deriveHttpRoutes(inputs.routes),
218
+ rpc_endpoints: deriveRpcEndpoints(),
219
+ events_emitted: deriveEventsEmitted(),
220
+ events_consumed: deriveEventsConsumed(),
221
+ },
222
+ imports: { external_packages: deriveExternalPackages(inputs.pkg) },
223
+ specs: { count: inputs.specCount, drift_state: 'unverified' },
224
+ links: {
225
+ repo: repoWebUrl,
226
+ docs: inputs.hasDocs && repoWebUrl ? `${repoWebUrl}/tree/${inputs.git.defaultBranch ?? 'main'}/docs` : null,
227
+ },
228
+ };
229
+ }
230
+ /** Serialize a manifest to the exact bytes written to disk. */
231
+ export function serializeManifest(manifest) {
232
+ return JSON.stringify(manifest, null, 2) + '\n';
233
+ }
234
+ export async function runManifestEmit(opts) {
235
+ const projectRoot = resolve(opts.projectRoot ?? process.cwd());
236
+ const analysisDir = join(projectRoot, OPENLORE_DIR, OPENLORE_ANALYSIS_SUBDIR);
237
+ const ctx = await readCachedContext(projectRoot);
238
+ const graph = ctx?.callGraph;
239
+ if (!graph || graph.nodes.length === 0) {
240
+ logger.error('No analysis graph found. Run `openlore analyze` first.');
241
+ return 2;
242
+ }
243
+ const manifest = buildManifest({
244
+ projectRoot,
245
+ graph,
246
+ exportsByFile: loadExportsByFile(analysisDir),
247
+ routes: loadRoutes(analysisDir),
248
+ pkg: readPackageJson(projectRoot),
249
+ specCount: countSpecs(projectRoot),
250
+ git: {
251
+ remote: git(projectRoot, ['config', '--get', 'remote.origin.url']),
252
+ commit: git(projectRoot, ['rev-parse', '--short', 'HEAD']),
253
+ defaultBranch: detectDefaultBranch(projectRoot),
254
+ committedAt: git(projectRoot, ['show', '-s', '--format=%cI', 'HEAD']),
255
+ },
256
+ toolVersion: toolVersion(),
257
+ hasDocs: existsSync(join(projectRoot, 'docs')),
258
+ }, opts);
259
+ const outPath = resolve(opts.out ?? join(projectRoot, '.well-known', 'openlore.json'));
260
+ await mkdir(dirname(outPath), { recursive: true });
261
+ const bytes = serializeManifest(manifest);
262
+ await writeFile(outPath, bytes);
263
+ logger.success(`Wrote ${outPath} (${Buffer.byteLength(bytes)} bytes)`);
264
+ logger.info('public symbols', manifest.exports.public_symbols.length + (manifest.exports.truncated ? ' (truncated)' : ''));
265
+ logger.info('http routes', manifest.exports.http_routes.length);
266
+ logger.info('external packages', manifest.imports.external_packages.length);
267
+ if (manifest.exports.events_emitted.length === 0 && manifest.exports.rpc_endpoints.length === 0) {
268
+ logger.info('events / rpc', 'none detected (analyzer does not surface these yet)');
269
+ }
270
+ return 0;
271
+ }
272
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/cli/manifest/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `openlore manifest <emit|validate>` — federation manifest emitter.
3
+ *
4
+ * Each OpenLore-instrumented repo can publish a small, public, deterministic
5
+ * `.well-known/openlore.json` describing what it exposes. A future federation
6
+ * index (separate spec) reads these manifests to answer cross-repo questions.
7
+ * This command only emits and validates; it never makes network calls.
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare const manifestCommand: Command;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/manifest/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,eAAe,SAGK,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `openlore manifest <emit|validate>` — federation manifest emitter.
3
+ *
4
+ * Each OpenLore-instrumented repo can publish a small, public, deterministic
5
+ * `.well-known/openlore.json` describing what it exposes. A future federation
6
+ * index (separate spec) reads these manifests to answer cross-repo questions.
7
+ * This command only emits and validates; it never makes network calls.
8
+ */
9
+ import { Command } from 'commander';
10
+ import { runManifestEmit } from './emit.js';
11
+ import { runManifestValidate } from './validate.js';
12
+ const emitSubcommand = new Command('emit')
13
+ .description('Write .well-known/openlore.json describing this repo (public symbols, routes, stats, …).')
14
+ .option('--out <path>', 'Output path (default: <project-root>/.well-known/openlore.json)')
15
+ .option('--project-root <path>', 'Project root to describe (default: current directory)')
16
+ .option('--include-private', 'Include non-public symbols (produces a larger manifest)', false)
17
+ .option('--max-symbols <int>', 'Truncate public_symbols to this many (sets "truncated": true)', (v) => parseInt(v, 10))
18
+ .action(async (opts) => {
19
+ process.exit(await runManifestEmit(opts));
20
+ });
21
+ const validateSubcommand = new Command('validate')
22
+ .description('Schema-check an existing manifest against openlore-manifest-v1.json.')
23
+ .argument('<path>', 'Path to the manifest JSON to validate')
24
+ .action((path) => {
25
+ process.exit(runManifestValidate(path));
26
+ });
27
+ export const manifestCommand = new Command('manifest')
28
+ .description('Emit or validate a federation manifest (.well-known/openlore.json).')
29
+ .addCommand(emitSubcommand)
30
+ .addCommand(validateSubcommand);
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/manifest/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAA4B,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KACvC,WAAW,CAAC,0FAA0F,CAAC;KACvG,MAAM,CAAC,cAAc,EAAE,iEAAiE,CAAC;KACzF,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;KACxF,MAAM,CAAC,mBAAmB,EAAE,yDAAyD,EAAE,KAAK,CAAC;KAC7F,MAAM,CAAC,qBAAqB,EAAE,+DAA+D,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KACtH,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEL,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KAC/C,WAAW,CAAC,sEAAsE,CAAC;KACnF,QAAQ,CAAC,QAAQ,EAAE,uCAAuC,CAAC;KAC3D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;IACvB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,qEAAqE,CAAC;KAClF,UAAU,CAAC,cAAc,CAAC;KAC1B,UAAU,CAAC,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * A deliberately tiny JSON Schema validator — just the subset used by
3
+ * schemas/openlore-manifest-v1.json. Avoids pulling in Ajv (a large dep) for a
4
+ * single internal schema, per spec-05's acceptance criteria.
5
+ *
6
+ * Supported keywords: type (string or array incl. "null"), const, enum,
7
+ * required, properties, additionalProperties (false only), items. The
8
+ * `integer` type is distinguished from `number`.
9
+ */
10
+ export interface ValidationError {
11
+ path: string;
12
+ message: string;
13
+ }
14
+ type JsonSchema = Record<string, unknown>;
15
+ /** Validate a parsed JSON value against a parsed JSON Schema. */
16
+ export declare function validateAgainstSchema(value: unknown, schema: JsonSchema): ValidationError[];
17
+ export {};
18
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/cli/manifest/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAoE1C,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,eAAe,EAAE,CAI3F"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * A deliberately tiny JSON Schema validator — just the subset used by
3
+ * schemas/openlore-manifest-v1.json. Avoids pulling in Ajv (a large dep) for a
4
+ * single internal schema, per spec-05's acceptance criteria.
5
+ *
6
+ * Supported keywords: type (string or array incl. "null"), const, enum,
7
+ * required, properties, additionalProperties (false only), items. The
8
+ * `integer` type is distinguished from `number`.
9
+ */
10
+ function typeOf(value) {
11
+ if (value === null)
12
+ return 'null';
13
+ if (Array.isArray(value))
14
+ return 'array';
15
+ if (Number.isInteger(value))
16
+ return 'integer';
17
+ return typeof value; // 'number' | 'string' | 'boolean' | 'object'
18
+ }
19
+ /** Returns true if `value` satisfies a single JSON Schema `type` token. */
20
+ function matchesType(value, type) {
21
+ const actual = typeOf(value);
22
+ if (type === 'number')
23
+ return actual === 'number' || actual === 'integer';
24
+ return actual === type;
25
+ }
26
+ function validateNode(value, schema, path, errors) {
27
+ // const
28
+ if ('const' in schema && value !== schema.const) {
29
+ errors.push({ path, message: `expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}` });
30
+ return;
31
+ }
32
+ // type
33
+ if ('type' in schema) {
34
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
35
+ if (!types.some(t => matchesType(value, t))) {
36
+ errors.push({ path, message: `expected type ${types.join('|')}, got ${typeOf(value)}` });
37
+ return;
38
+ }
39
+ }
40
+ // null short-circuits remaining checks
41
+ if (value === null)
42
+ return;
43
+ // enum
44
+ if (Array.isArray(schema.enum) && !schema.enum.includes(value)) {
45
+ errors.push({ path, message: `value ${JSON.stringify(value)} not in enum ${JSON.stringify(schema.enum)}` });
46
+ }
47
+ // object
48
+ if (typeOf(value) === 'object') {
49
+ const obj = value;
50
+ const props = schema.properties ?? {};
51
+ for (const req of schema.required ?? []) {
52
+ if (!(req in obj))
53
+ errors.push({ path: `${path}/${req}`, message: 'missing required property' });
54
+ }
55
+ if (schema.additionalProperties === false) {
56
+ for (const key of Object.keys(obj)) {
57
+ if (!(key in props))
58
+ errors.push({ path: `${path}/${key}`, message: 'additional property not allowed' });
59
+ }
60
+ }
61
+ for (const [key, subSchema] of Object.entries(props)) {
62
+ if (key in obj)
63
+ validateNode(obj[key], subSchema, `${path}/${key}`, errors);
64
+ }
65
+ }
66
+ // array
67
+ if (typeOf(value) === 'array' && schema.items) {
68
+ value.forEach((item, i) => validateNode(item, schema.items, `${path}/${i}`, errors));
69
+ }
70
+ }
71
+ /** Validate a parsed JSON value against a parsed JSON Schema. */
72
+ export function validateAgainstSchema(value, schema) {
73
+ const errors = [];
74
+ validateNode(value, schema, '', errors);
75
+ return errors;
76
+ }
77
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/cli/manifest/schema-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `openlore manifest validate <path>` — schema-check an existing manifest.
3
+ *
4
+ * Validates against the canonical JSON Schema shipped with OpenLore
5
+ * (schemas/openlore-manifest-v1.json), using the small in-repo validator
6
+ * rather than a heavyweight dependency.
7
+ */
8
+ import { type ValidationError } from './schema-validator.js';
9
+ /** Absolute path to the vendored manifest JSON Schema (ships in the package). */
10
+ export declare function manifestSchemaPath(): string;
11
+ export declare function loadManifestSchema(): Record<string, unknown>;
12
+ /** Validate a parsed manifest object; returns the (possibly empty) error list. */
13
+ export declare function validateManifest(manifest: unknown): ValidationError[];
14
+ export declare function runManifestValidate(path: string): number;
15
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/manifest/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpF,iFAAiF;AACjF,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,CAErE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BxD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `openlore manifest validate <path>` — schema-check an existing manifest.
3
+ *
4
+ * Validates against the canonical JSON Schema shipped with OpenLore
5
+ * (schemas/openlore-manifest-v1.json), using the small in-repo validator
6
+ * rather than a heavyweight dependency.
7
+ */
8
+ import { readFileSync } from 'node:fs';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { logger } from '../../utils/logger.js';
11
+ import { validateAgainstSchema } from './schema-validator.js';
12
+ /** Absolute path to the vendored manifest JSON Schema (ships in the package). */
13
+ export function manifestSchemaPath() {
14
+ // src/cli/manifest/validate.ts → repo root → schemas/ (same depth in dist/).
15
+ return fileURLToPath(new URL('../../../schemas/openlore-manifest-v1.json', import.meta.url));
16
+ }
17
+ export function loadManifestSchema() {
18
+ return JSON.parse(readFileSync(manifestSchemaPath(), 'utf-8'));
19
+ }
20
+ /** Validate a parsed manifest object; returns the (possibly empty) error list. */
21
+ export function validateManifest(manifest) {
22
+ return validateAgainstSchema(manifest, loadManifestSchema());
23
+ }
24
+ export function runManifestValidate(path) {
25
+ let raw;
26
+ try {
27
+ raw = readFileSync(path, 'utf-8');
28
+ }
29
+ catch {
30
+ logger.error(`Cannot read manifest: ${path}`);
31
+ return 2;
32
+ }
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(raw);
36
+ }
37
+ catch (err) {
38
+ logger.error(`Invalid JSON in ${path}: ${err instanceof Error ? err.message : String(err)}`);
39
+ return 1;
40
+ }
41
+ const errors = validateManifest(parsed);
42
+ if (errors.length === 0) {
43
+ logger.success(`${path} is a valid OpenLore manifest (v1).`);
44
+ return 0;
45
+ }
46
+ logger.error(`${path} failed schema validation (${errors.length} error(s)):`);
47
+ for (const e of errors)
48
+ logger.error(` ${e.path || '/'}: ${e.message}`);
49
+ return 1;
50
+ }
51
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/manifest/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AAEpF,iFAAiF;AACjF,MAAM,UAAU,kBAAkB;IAChC,6EAA6E;IAC7E,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,4CAA4C,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAA4B,CAAC;AAC5F,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,8BAA8B,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-generator.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/artifact-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact-generator.d.ts","sourceRoot":"","sources":["../../../src/core/analyzer/artifact-generator.ts"],"names":[],"mappings":"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"}
@@ -774,11 +774,45 @@ export class AnalysisArtifactGenerator {
774
774
  // Signature extraction + call graph for ALL analyzed files
775
775
  // Read each file once and reuse the content for both operations.
776
776
  // All dynamic imports grouped here; CALL_GRAPH_LANGS hoisted out of the loop.
777
- const { extractSignatures, detectLanguage } = await import('./signature-extractor.js');
777
+ const { extractSignatures, detectLanguage, resolveHeaderLanguage } = await import('./signature-extractor.js');
778
778
  const { CallGraphBuilder, serializeCallGraph } = await import('./call-graph.js');
779
779
  const { detectDuplicates } = await import('./duplicate-detector.js');
780
780
  const { analyzeForRefactoring } = await import('./refactor-analyzer.js');
781
- const CALL_GRAPH_LANGS = new Set(['Python', 'TypeScript', 'JavaScript', 'Go', 'Rust', 'Ruby', 'Java', 'C++', 'Swift']);
781
+ const { classifyYaml } = await import('./iac/index.js');
782
+ const CALL_GRAPH_LANGS = new Set([
783
+ 'Python', 'TypeScript', 'JavaScript', 'Go', 'Rust', 'Ruby', 'Java', 'C++', 'Swift',
784
+ // Additional general-purpose languages (spec-08).
785
+ 'C#', 'Kotlin', 'PHP', 'C', 'Scala', 'Dart', 'Lua', 'Elixir', 'Bash',
786
+ // Infrastructure-as-Code (spec-07) — projected onto the same graph primitives.
787
+ 'Terraform', 'Kubernetes', 'Helm', 'CloudFormation', 'Ansible',
788
+ ]);
789
+ // Helm charts: every file under a directory containing Chart.yaml is Helm.
790
+ const chartDirs = repoMap.allFiles
791
+ .filter(f => /(^|\/)Chart\.ya?ml$/.test(f.path.replace(/\\/g, '/')))
792
+ .map(f => f.path.replace(/\\/g, '/').replace(/\/Chart\.ya?ml$/, ''));
793
+ const isUnderChart = (p) => {
794
+ const posix = p.replace(/\\/g, '/');
795
+ return chartDirs.some(d => posix === d || posix.startsWith(d + '/'));
796
+ };
797
+ // .h disambiguation (spec-08): default is C++, but a project with .c files and
798
+ // no C++ sources means its headers are C. Bias toward C++ (superset) otherwise.
799
+ const exts = new Set(repoMap.allFiles.map(f => (f.path.split('.').pop() ?? '').toLowerCase()));
800
+ const hasCppSources = exts.has('cpp') || exts.has('cc') || exts.has('cxx') || exts.has('hpp');
801
+ const hasCSources = exts.has('c');
802
+ const headerLang = resolveHeaderLanguage(hasCSources, hasCppSources);
803
+ /** Resolve a language: extension first, then IaC YAML disambiguation, then .h heuristic. */
804
+ const resolveLang = (path, content) => {
805
+ const lang = detectLanguage(path);
806
+ if (lang === 'C++' && /\.h$/i.test(path))
807
+ return headerLang;
808
+ if (lang !== 'unknown')
809
+ return lang;
810
+ if (isUnderChart(path))
811
+ return 'Helm';
812
+ if (/\.(ya?ml|json)$/i.test(path))
813
+ return classifyYaml(path, content) ?? 'unknown';
814
+ return 'unknown';
815
+ };
782
816
  const signatures = [];
783
817
  const callGraphFiles = [];
784
818
  for (const file of repoMap.allFiles) {
@@ -793,7 +827,7 @@ export class AnalysisArtifactGenerator {
793
827
  }
794
828
  }
795
829
  // Call graph — all supported languages, include test files so tested_by edges are derived
796
- const lang = detectLanguage(file.path);
830
+ const lang = resolveLang(file.path, content);
797
831
  if (!isTest && CALL_GRAPH_LANGS.has(lang)) {
798
832
  callGraphFiles.push({ path: file.path, content, language: lang });
799
833
  }