spec-gen-cli 1.2.2 → 1.2.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.
- package/README.md +272 -25
- package/dist/api/generate.d.ts.map +1 -1
- package/dist/api/generate.js +11 -7
- package/dist/api/generate.js.map +1 -1
- package/dist/api/run.d.ts.map +1 -1
- package/dist/api/run.js +5 -3
- package/dist/api/run.js.map +1 -1
- package/dist/api/types.d.ts +4 -4
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +101 -41
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +28 -23
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +353 -10
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +241 -48
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/view.d.ts.map +1 -1
- package/dist/cli/commands/view.js +33 -4
- package/dist/cli/commands/view.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
- package/dist/core/analyzer/artifact-generator.js +11 -3
- package/dist/core/analyzer/artifact-generator.js.map +1 -1
- package/dist/core/analyzer/ast-chunker.d.ts +24 -0
- package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
- package/dist/core/analyzer/ast-chunker.js +198 -0
- package/dist/core/analyzer/ast-chunker.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +52 -5
- package/dist/core/analyzer/call-graph.d.ts.map +1 -1
- package/dist/core/analyzer/call-graph.js +769 -48
- package/dist/core/analyzer/call-graph.js.map +1 -1
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -1
- package/dist/core/analyzer/code-shaper.js +5 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -1
- package/dist/core/analyzer/codebase-digest.d.ts +40 -0
- package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
- package/dist/core/analyzer/codebase-digest.js +194 -0
- package/dist/core/analyzer/codebase-digest.js.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.js +71 -0
- package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +19 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -1
- package/dist/core/analyzer/dependency-graph.js +76 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -1
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -1
- package/dist/core/analyzer/duplicate-detector.js +7 -1
- package/dist/core/analyzer/duplicate-detector.js.map +1 -1
- package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
- package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
- package/dist/core/analyzer/function-registry-trie.js +39 -0
- package/dist/core/analyzer/function-registry-trie.js.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.js +99 -0
- package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/signature-extractor.js +131 -3
- package/dist/core/analyzer/signature-extractor.js.map +1 -1
- package/dist/core/analyzer/subgraph-extractor.d.ts +10 -2
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/subgraph-extractor.js +25 -7
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -1
- package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
- package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
- package/dist/core/analyzer/type-inference-engine.js +130 -0
- package/dist/core/analyzer/type-inference-engine.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +35 -6
- package/dist/core/analyzer/vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/vector-index.js +308 -54
- package/dist/core/analyzer/vector-index.js.map +1 -1
- package/dist/core/generator/spec-pipeline.d.ts +31 -11
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -1
- package/dist/core/generator/spec-pipeline.js +170 -39
- package/dist/core/generator/spec-pipeline.js.map +1 -1
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -1
- package/dist/core/generator/stages/stage2-entities.js +2 -1
- package/dist/core/generator/stages/stage2-entities.js.map +1 -1
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -1
- package/dist/core/generator/stages/stage3-services.js +2 -1
- package/dist/core/generator/stages/stage3-services.js.map +1 -1
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -1
- package/dist/core/generator/stages/stage4-api.js +2 -1
- package/dist/core/generator/stages/stage4-api.js.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.d.ts +2 -1
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.js +15 -3
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -1
- package/dist/core/services/chat-agent.d.ts +5 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -1
- package/dist/core/services/chat-agent.js +14 -0
- package/dist/core/services/chat-agent.js.map +1 -1
- package/dist/core/services/chat-tools.d.ts.map +1 -1
- package/dist/core/services/chat-tools.js +172 -50
- package/dist/core/services/chat-tools.js.map +1 -1
- package/dist/core/services/llm-service.d.ts +23 -1
- package/dist/core/services/llm-service.d.ts.map +1 -1
- package/dist/core/services/llm-service.js +94 -2
- package/dist/core/services/llm-service.js.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.d.ts +12 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.js +138 -2
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -1
- package/dist/core/services/mcp-handlers/graph.d.ts +21 -1
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/graph.js +142 -2
- package/dist/core/services/mcp-handlers/graph.js.map +1 -1
- package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
- package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/orient.js +200 -0
- package/dist/core/services/mcp-handlers/orient.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +18 -4
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.js +161 -17
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
- package/dist/core/services/mcp-handlers/utils.d.ts +43 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/utils.js +66 -1
- package/dist/core/services/mcp-handlers/utils.js.map +1 -1
- package/dist/core/services/mcp-watcher.d.ts +41 -0
- package/dist/core/services/mcp-watcher.d.ts.map +1 -0
- package/dist/core/services/mcp-watcher.js +177 -0
- package/dist/core/services/mcp-watcher.js.map +1 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/pipeline.d.ts +7 -0
- package/dist/types/pipeline.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/viewer/InteractiveGraphViewer.jsx +39 -10
- package/src/viewer/components/ChatPanel.jsx +8 -5
- package/src/viewer/components/ClassGraph.jsx +782 -0
- package/src/viewer/components/FlatGraph.jsx +3 -3
- package/src/viewer/utils/graph-helpers.js +9 -1
- package/src/viewer/utils/themes.js +36 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpWatcher — incremental re-indexer for the MCP server's --watch mode.
|
|
3
|
+
*
|
|
4
|
+
* Watches source files for changes and incrementally updates:
|
|
5
|
+
* 1. signatures in llm-context.json (always)
|
|
6
|
+
* 2. vector index (only when embed: true and an embedding server is reachable)
|
|
7
|
+
*
|
|
8
|
+
* The call graph is deliberately excluded — rebuilding it requires full
|
|
9
|
+
* tree-sitter analysis of all call sites and is too expensive for a watch loop.
|
|
10
|
+
* It stays current via the post-commit hook (spec-gen analyze --force --embed).
|
|
11
|
+
*/
|
|
12
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { join, relative } from 'node:path';
|
|
14
|
+
import chokidar from 'chokidar';
|
|
15
|
+
import { extractSignatures, detectLanguage } from '../analyzer/signature-extractor.js';
|
|
16
|
+
import { SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, ARTIFACT_LLM_CONTEXT, } from '../../constants.js';
|
|
17
|
+
const SOURCE_EXTENSIONS = /\.(ts|tsx|js|jsx|py|go|rs|rb|java|kt|php|cs|cpp|cc|cxx|h|hpp|c|swift)$/;
|
|
18
|
+
const DEFAULT_IGNORED = [
|
|
19
|
+
'**/node_modules/**',
|
|
20
|
+
'**/.spec-gen/**',
|
|
21
|
+
'**/dist/**',
|
|
22
|
+
'**/.git/**',
|
|
23
|
+
'**/*.test.ts',
|
|
24
|
+
'**/*.test.js',
|
|
25
|
+
'**/*.spec.ts',
|
|
26
|
+
'**/*.spec.js',
|
|
27
|
+
];
|
|
28
|
+
// ── McpWatcher ────────────────────────────────────────────────────────────────
|
|
29
|
+
export class McpWatcher {
|
|
30
|
+
rootPath;
|
|
31
|
+
outputPath;
|
|
32
|
+
debounceMs;
|
|
33
|
+
ignore;
|
|
34
|
+
fsWatcher;
|
|
35
|
+
timers = new Map();
|
|
36
|
+
running = false;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.rootPath = options.rootPath;
|
|
39
|
+
this.outputPath = options.outputPath
|
|
40
|
+
?? join(options.rootPath, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR);
|
|
41
|
+
this.debounceMs = options.debounceMs ?? 400;
|
|
42
|
+
this.ignore = [...DEFAULT_IGNORED, ...(options.ignore ?? [])];
|
|
43
|
+
}
|
|
44
|
+
// ── Lifecycle ──────────────────────────────────────────────────────────────
|
|
45
|
+
async start() {
|
|
46
|
+
await new Promise((resolve, reject) => {
|
|
47
|
+
this.fsWatcher = chokidar.watch(this.rootPath, {
|
|
48
|
+
ignored: this.ignore,
|
|
49
|
+
persistent: true,
|
|
50
|
+
ignoreInitial: true,
|
|
51
|
+
awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
|
|
52
|
+
});
|
|
53
|
+
this.fsWatcher.on('change', (absPath) => {
|
|
54
|
+
if (SOURCE_EXTENSIONS.test(absPath)) {
|
|
55
|
+
this.scheduleChange(absPath);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.fsWatcher.on('ready', () => resolve());
|
|
59
|
+
this.fsWatcher.on('error', (err) => reject(err));
|
|
60
|
+
});
|
|
61
|
+
process.stderr.write(`[mcp-watcher] watching ${this.rootPath}\n`);
|
|
62
|
+
}
|
|
63
|
+
async stop() {
|
|
64
|
+
for (const t of this.timers.values())
|
|
65
|
+
clearTimeout(t);
|
|
66
|
+
this.timers.clear();
|
|
67
|
+
await this.fsWatcher?.close();
|
|
68
|
+
process.stderr.write('[mcp-watcher] stopped\n');
|
|
69
|
+
}
|
|
70
|
+
// ── Debounce ───────────────────────────────────────────────────────────────
|
|
71
|
+
scheduleChange(absPath) {
|
|
72
|
+
const existing = this.timers.get(absPath);
|
|
73
|
+
if (existing)
|
|
74
|
+
clearTimeout(existing);
|
|
75
|
+
const t = setTimeout(() => {
|
|
76
|
+
this.timers.delete(absPath);
|
|
77
|
+
if (this.running) {
|
|
78
|
+
// Re-schedule instead of dropping — ensures no changes are lost
|
|
79
|
+
this.scheduleChange(absPath);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.running = true;
|
|
83
|
+
this.handleChange(absPath)
|
|
84
|
+
.catch(err => process.stderr.write(`[mcp-watcher] error: ${err.message}\n`))
|
|
85
|
+
.finally(() => { this.running = false; });
|
|
86
|
+
}, this.debounceMs);
|
|
87
|
+
this.timers.set(absPath, t);
|
|
88
|
+
}
|
|
89
|
+
// ── Core re-index ──────────────────────────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* Re-index a single changed file.
|
|
92
|
+
* Exposed for unit testing without needing a real file watcher.
|
|
93
|
+
*/
|
|
94
|
+
async handleChange(absPath) {
|
|
95
|
+
const rel = relative(this.rootPath, absPath);
|
|
96
|
+
// Skip test files and unsupported languages
|
|
97
|
+
if (isTestFile(rel))
|
|
98
|
+
return;
|
|
99
|
+
if (detectLanguage(rel) === 'unknown')
|
|
100
|
+
return;
|
|
101
|
+
// Read llm-context.json — bail silently if analyze has never been run
|
|
102
|
+
const contextPath = join(this.outputPath, ARTIFACT_LLM_CONTEXT);
|
|
103
|
+
let context;
|
|
104
|
+
try {
|
|
105
|
+
const raw = await readFile(contextPath, 'utf-8');
|
|
106
|
+
context = JSON.parse(raw);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
process.stderr.write(`[mcp-watcher] no context at ${contextPath} — run analyze first\n`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Re-extract signatures for the changed file
|
|
113
|
+
let content;
|
|
114
|
+
try {
|
|
115
|
+
content = await readFile(absPath, 'utf-8');
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return; // file may have been deleted between the event and now
|
|
119
|
+
}
|
|
120
|
+
const newMap = extractSignatures(rel, content);
|
|
121
|
+
// Patch signatures array (preserve callGraph and everything else)
|
|
122
|
+
if (!context.signatures)
|
|
123
|
+
context.signatures = [];
|
|
124
|
+
const idx = context.signatures.findIndex(m => m.path === rel);
|
|
125
|
+
if (idx >= 0) {
|
|
126
|
+
context.signatures[idx] = newMap;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
context.signatures.push(newMap);
|
|
130
|
+
}
|
|
131
|
+
await writeFile(contextPath, JSON.stringify(context, null, 2), 'utf-8');
|
|
132
|
+
process.stderr.write(`[mcp-watcher] re-indexed signatures: ${rel}\n`);
|
|
133
|
+
// Incremental vector re-embed — silently skipped if no embedding service available
|
|
134
|
+
if (context.callGraph) {
|
|
135
|
+
await this.reEmbed(context, rel, content);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ── Embed step ─────────────────────────────────────────────────────────────
|
|
139
|
+
async reEmbed(context, rel, content) {
|
|
140
|
+
try {
|
|
141
|
+
const { VectorIndex } = await import('../analyzer/vector-index.js');
|
|
142
|
+
const { EmbeddingService } = await import('../analyzer/embedding-service.js');
|
|
143
|
+
const { readSpecGenConfig } = await import('./config-manager.js');
|
|
144
|
+
if (!VectorIndex.exists(this.outputPath))
|
|
145
|
+
return;
|
|
146
|
+
let embedSvc;
|
|
147
|
+
try {
|
|
148
|
+
embedSvc = EmbeddingService.fromEnv();
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
const cfg = await readSpecGenConfig(this.rootPath);
|
|
152
|
+
embedSvc = cfg ? EmbeddingService.fromConfig(cfg) : null;
|
|
153
|
+
}
|
|
154
|
+
if (!embedSvc) {
|
|
155
|
+
process.stderr.write('[mcp-watcher] no embedding service — skipping re-embed\n');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const cg = context.callGraph;
|
|
159
|
+
const hubIds = new Set((cg.hubFunctions ?? []).map(f => f.id));
|
|
160
|
+
const entryIds = new Set((cg.entryPoints ?? []).map(f => f.id));
|
|
161
|
+
const fileContents = new Map([[rel, content]]);
|
|
162
|
+
const { embedded, reused } = await VectorIndex.build(this.outputPath, cg.nodes, context.signatures ?? [], hubIds, entryIds, embedSvc, fileContents,
|
|
163
|
+
/* incremental */ true);
|
|
164
|
+
process.stderr.write(`[mcp-watcher] re-embedded ${rel}: ${embedded} new, ${reused} reused\n`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
process.stderr.write(`[mcp-watcher] embed error: ${err.message}\n`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
172
|
+
function isTestFile(relPath) {
|
|
173
|
+
return (relPath.includes('.test.') ||
|
|
174
|
+
relPath.includes('.spec.') ||
|
|
175
|
+
relPath.includes('__tests__'));
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=mcp-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-watcher.js","sourceRoot":"","sources":["../../../src/core/services/mcp-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface EmbeddingConfig {
|
|
|
20
20
|
model: string;
|
|
21
21
|
/** API key — optional for local servers */
|
|
22
22
|
apiKey?: string;
|
|
23
|
-
/** Maximum number of texts per
|
|
23
|
+
/** Maximum number of texts per embedding batch (default: 64) */
|
|
24
24
|
batchSize?: number;
|
|
25
25
|
/** Disable SSL certificate verification (e.g. self-signed certs on local servers) */
|
|
26
26
|
skipSslVerify?: boolean;
|
|
@@ -31,7 +31,7 @@ export interface AnalysisConfig {
|
|
|
31
31
|
excludePatterns: string[];
|
|
32
32
|
}
|
|
33
33
|
export interface GenerationConfig {
|
|
34
|
-
provider?: 'anthropic' | 'openai' | 'openai-compat' | 'gemini' | 'claude-code' | 'mistral-vibe';
|
|
34
|
+
provider?: 'anthropic' | 'openai' | 'openai-compat' | 'copilot' | 'gemini' | 'claude-code' | 'mistral-vibe';
|
|
35
35
|
model?: string;
|
|
36
36
|
openaiCompatBaseUrl?: string;
|
|
37
37
|
skipSslVerify?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAGpG,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/pipeline.d.ts
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { ProgressIndicator } from '../utils/progress.js';
|
|
5
5
|
import type { LLMService } from '../core/services/llm-service.js';
|
|
6
|
+
import type { SearchResult } from '../core/analyzer/vector-index.js';
|
|
7
|
+
/** Semantic search function injected into the pipeline to replace name-based heuristics. */
|
|
8
|
+
export type SemanticSearchFn = (query: string, limit: number) => Promise<SearchResult[]>;
|
|
6
9
|
export type ProjectCategory = 'web-frontend' | 'web-backend' | 'api-service' | 'cli-tool' | 'library' | 'mobile-app' | 'desktop-app' | 'data-pipeline' | 'ml-service' | 'monorepo' | 'other';
|
|
7
10
|
export type ArchitecturePattern = 'layered' | 'hexagonal' | 'microservices' | 'monolith' | 'serverless' | 'event-driven' | 'mvc' | 'other';
|
|
8
11
|
export interface ProjectSurveyResult {
|
|
@@ -134,6 +137,10 @@ export interface PipelineOptions {
|
|
|
134
137
|
saveIntermediate?: boolean;
|
|
135
138
|
generateADRs?: boolean;
|
|
136
139
|
progress?: ProgressIndicator;
|
|
140
|
+
/** Optional semantic search function. When provided, replaces name-based heuristics for
|
|
141
|
+
* schema/service/API file selection in stages 2–4. Falls back to heuristics if absent
|
|
142
|
+
* or if the search returns no results for a given domain. */
|
|
143
|
+
semanticSearch?: SemanticSearchFn;
|
|
137
144
|
}
|
|
138
145
|
export interface PipelineContext {
|
|
139
146
|
llm: LLMService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/types/pipeline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/types/pipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-gen-cli",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.4",
|
|
4
4
|
"description": "Reverse-engineer OpenSpec specifications from existing codebases",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/api/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"test:run": "vitest run",
|
|
30
30
|
"test:coverage": "vitest run --coverage",
|
|
31
31
|
"test:openspec-compat": "vitest run --grep 'openspec' || echo 'No OpenSpec compat tests yet'",
|
|
32
|
-
"test:e2e": "vitest run --
|
|
32
|
+
"test:e2e": "vitest run --config vitest.integration.config.ts --reporter=verbose",
|
|
33
33
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
34
34
|
"build:watch": "tsc --watch",
|
|
35
35
|
"clean": "rm -rf dist coverage",
|
|
@@ -82,6 +82,7 @@
|
|
|
82
82
|
"@vitejs/plugin-react": "^5.0.2",
|
|
83
83
|
"apache-arrow": "^21.1.0",
|
|
84
84
|
"chalk": "^5.3.0",
|
|
85
|
+
"chokidar": "^5.0.0",
|
|
85
86
|
"commander": "^12.1.0",
|
|
86
87
|
"glob": "^11.0.0",
|
|
87
88
|
"ignore": "^6.0.2",
|
|
@@ -95,6 +96,7 @@
|
|
|
95
96
|
"tree-sitter-python": "^0.23.6",
|
|
96
97
|
"tree-sitter-ruby": "^0.23.1",
|
|
97
98
|
"tree-sitter-rust": "^0.24.0",
|
|
99
|
+
"tree-sitter-swift": "^0.7.1",
|
|
98
100
|
"tree-sitter-typescript": "^0.23.2",
|
|
99
101
|
"vite": "^7.1.3",
|
|
100
102
|
"yaml": "^2.6.1"
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from './utils/graph-helpers.js';
|
|
11
11
|
import { FlatGraph } from './components/FlatGraph.jsx';
|
|
12
12
|
import { ClusterGraph } from './components/ClusterGraph.jsx';
|
|
13
|
+
import { ClassGraph } from './components/ClassGraph.jsx';
|
|
13
14
|
import { FilterBar } from './components/FilterBar.jsx';
|
|
14
15
|
import { ArchitectureView } from './components/ArchitectureView.jsx';
|
|
15
16
|
import { Hint, SL, Row, Chip, KindBadge } from './components/MicroComponents.jsx';
|
|
@@ -20,6 +21,10 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
20
21
|
const [rawGraph, setRawGraph] = useState(null);
|
|
21
22
|
const [llmCtx, setLlmCtx] = useState(null);
|
|
22
23
|
const [refReport, setRefReport] = useState(null);
|
|
24
|
+
const [classData, setClassData] = useState(null);
|
|
25
|
+
const [selectedClass, setSelectedClass] = useState(null); // full class object
|
|
26
|
+
const selectedClassId = selectedClass?.id ?? null;
|
|
27
|
+
const [focusedPaths, setFocusedPaths] = useState([]);
|
|
23
28
|
const [mapping, setMapping] = useState(null);
|
|
24
29
|
const [specReqs, setSpecReqs] = useState({});
|
|
25
30
|
const [selectedId, setSelectedId] = useState(null);
|
|
@@ -55,6 +60,7 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
55
60
|
const g = parseGraph(rawGraph, clusterPalette);
|
|
56
61
|
return refReport ? enrichGraphWithRefactors(g, refReport) : g;
|
|
57
62
|
}, [rawGraph, clusterPalette, refReport]);
|
|
63
|
+
|
|
58
64
|
const cycleTheme = () => setThemeName((prev) => {
|
|
59
65
|
const idx = THEME_KEYS.indexOf(prev);
|
|
60
66
|
const next = THEME_KEYS[(idx + 1) % THEME_KEYS.length];
|
|
@@ -122,6 +128,11 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
122
128
|
if (ctxRes.ok) setLlmCtx(await ctxRes.json());
|
|
123
129
|
} catch { /* ignore */ }
|
|
124
130
|
|
|
131
|
+
try {
|
|
132
|
+
const cgRes = await fetch('/api/class-graph');
|
|
133
|
+
if (cgRes.ok) setClassData(await cgRes.json());
|
|
134
|
+
} catch { /* ignore */ }
|
|
135
|
+
|
|
125
136
|
try {
|
|
126
137
|
const refRes = await fetch('/api/refactor-priorities');
|
|
127
138
|
if (refRes.ok) {
|
|
@@ -341,7 +352,11 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
341
352
|
// Compute from clusters if not present in the JSON (for backward compatibility).
|
|
342
353
|
const structuralClusters = graph?.structuralClusters ??
|
|
343
354
|
(graph?.clusters?.filter(c => c.internalEdges > 0) ?? []);
|
|
344
|
-
|
|
355
|
+
// Fall back to all directory clusters when no structural ones exist (e.g. Swift/C++ projects
|
|
356
|
+
// where dep edges come from the call graph and may not yet be available).
|
|
357
|
+
const displayClusters = structuralClusters.length > 0
|
|
358
|
+
? structuralClusters
|
|
359
|
+
: (graph?.clusters ?? []);
|
|
345
360
|
const clusterNames = displayClusters.map((c) => c.name);
|
|
346
361
|
|
|
347
362
|
// ── Upload screen ─────────────────────────────────────────────────────────
|
|
@@ -477,7 +492,7 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
477
492
|
{[
|
|
478
493
|
['nodes', stats.nodeCount],
|
|
479
494
|
['edges', stats.edgeCount],
|
|
480
|
-
['clusters',
|
|
495
|
+
['clusters', displayClusters.length],
|
|
481
496
|
].map(([l, v]) => (
|
|
482
497
|
<div
|
|
483
498
|
key={l}
|
|
@@ -498,6 +513,7 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
498
513
|
['clusters', '⬡ clusters'],
|
|
499
514
|
['flat', '⊙ flat'],
|
|
500
515
|
['architecture', '⬛ architecture'],
|
|
516
|
+
['classes', '◈ classes'],
|
|
501
517
|
].map(([v, lbl]) => (
|
|
502
518
|
<button
|
|
503
519
|
key={v}
|
|
@@ -749,12 +765,14 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
749
765
|
</div>
|
|
750
766
|
|
|
751
767
|
{/* Filter bar */}
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
768
|
+
{viewMode !== 'architecture' && viewMode !== 'classes' && (
|
|
769
|
+
<FilterBar
|
|
770
|
+
filters={filters}
|
|
771
|
+
setFilters={setFilters}
|
|
772
|
+
stats={filterStats}
|
|
773
|
+
clusterNames={clusterNames}
|
|
774
|
+
/>
|
|
775
|
+
)}
|
|
758
776
|
|
|
759
777
|
{/* Body */}
|
|
760
778
|
<div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>
|
|
@@ -762,6 +780,14 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
762
780
|
<div style={{ flex: 1, position: 'relative', overflow: 'hidden' }}>
|
|
763
781
|
{viewMode === 'architecture' ? (
|
|
764
782
|
<ArchitectureView graph={graph} llmCtx={llmCtx} focusedIds={focusedIds} />
|
|
783
|
+
) : viewMode === 'classes' ? (
|
|
784
|
+
<ClassGraph
|
|
785
|
+
classData={classData}
|
|
786
|
+
selectedClassId={selectedClassId}
|
|
787
|
+
onSelectClass={setSelectedClass}
|
|
788
|
+
focusedPaths={focusedPaths}
|
|
789
|
+
onClear={() => setFocusedPaths([])}
|
|
790
|
+
/>
|
|
765
791
|
) : viewMode === 'clusters' ? (
|
|
766
792
|
<ClusterGraph
|
|
767
793
|
clusters={displayClusters.filter(
|
|
@@ -812,6 +838,8 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
812
838
|
>
|
|
813
839
|
{viewMode === 'clusters'
|
|
814
840
|
? 'CLICK CLUSTER -> EXPAND · CLICK NODE -> INSPECT'
|
|
841
|
+
: viewMode === 'classes'
|
|
842
|
+
? 'CLICK CLASS -> EXPAND METHODS · DBL-CLICK -> RESET VIEW'
|
|
815
843
|
: 'CLICK NODE -> INSPECT'}
|
|
816
844
|
</div>
|
|
817
845
|
)}
|
|
@@ -821,7 +849,8 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
821
849
|
{chatOpen && (
|
|
822
850
|
<ChatPanel
|
|
823
851
|
onHighlight={(ids) => setFocusedIds(ids)}
|
|
824
|
-
|
|
852
|
+
onHighlightPaths={(paths) => setFocusedPaths(paths)}
|
|
853
|
+
onClose={() => { setChatOpen(false); setFocusedIds([]); setFocusedPaths([]); }}
|
|
825
854
|
/>
|
|
826
855
|
)}
|
|
827
856
|
|
|
@@ -831,7 +860,7 @@ export default function App({ graphUrl, mappingUrl = '/api/mapping', specUrl = '
|
|
|
831
860
|
width: 282,
|
|
832
861
|
borderLeft: '1px solid var(--bd-faint)',
|
|
833
862
|
background: 'var(--bg-deep)',
|
|
834
|
-
display: viewMode === 'architecture' ? 'none' : 'flex',
|
|
863
|
+
display: viewMode === 'architecture' || viewMode === 'classes' ? 'none' : 'flex',
|
|
835
864
|
flexDirection: 'column',
|
|
836
865
|
overflow: 'hidden',
|
|
837
866
|
flexShrink: 0,
|
|
@@ -4,8 +4,8 @@ import { useState, useRef, useEffect } from 'react';
|
|
|
4
4
|
// SIMPLE MARKDOWN RENDERER
|
|
5
5
|
// ============================================================================
|
|
6
6
|
|
|
7
|
-
function escapeHtml(
|
|
8
|
-
return
|
|
7
|
+
function escapeHtml(text) {
|
|
8
|
+
return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
function renderInline(text) {
|
|
@@ -155,10 +155,11 @@ function ToolSpinner() {
|
|
|
155
155
|
* ChatPanel -- agentic chatbot panel for the dependency graph viewer.
|
|
156
156
|
*
|
|
157
157
|
* Props:
|
|
158
|
-
* onHighlight(ids: string[])
|
|
159
|
-
*
|
|
158
|
+
* onHighlight(ids: string[]) -- called with dep-graph node IDs to highlight
|
|
159
|
+
* onHighlightPaths(paths: string[])-- called with raw file paths (for class graph)
|
|
160
|
+
* onClose() -- called when the panel is closed
|
|
160
161
|
*/
|
|
161
|
-
export function ChatPanel({ onHighlight, onClose }) {
|
|
162
|
+
export function ChatPanel({ onHighlight, onHighlightPaths, onClose }) {
|
|
162
163
|
const [messages, setMessages] = useState([
|
|
163
164
|
{
|
|
164
165
|
role: 'assistant',
|
|
@@ -240,6 +241,7 @@ export function ChatPanel({ onHighlight, onClose }) {
|
|
|
240
241
|
} else if (evt.type === 'reply') {
|
|
241
242
|
setMessages((prev) => [...prev, { role: 'assistant', content: evt.reply }]);
|
|
242
243
|
onHighlight(evt.highlightIds ?? []);
|
|
244
|
+
onHighlightPaths?.(evt.filePaths ?? []);
|
|
243
245
|
} else if (evt.type === 'error') {
|
|
244
246
|
throw new Error(evt.error);
|
|
245
247
|
}
|
|
@@ -264,6 +266,7 @@ export function ChatPanel({ onHighlight, onClose }) {
|
|
|
264
266
|
setMessages([{ role: 'assistant', content: 'Conversation cleared. What would you like to know?' }]);
|
|
265
267
|
setError(null);
|
|
266
268
|
onHighlight([]);
|
|
269
|
+
onHighlightPaths?.([]);
|
|
267
270
|
};
|
|
268
271
|
|
|
269
272
|
return (
|