@tyroneross/navgator 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/agents/architecture-advisor.md +109 -0
- package/commands/nav-check.md +64 -0
- package/commands/nav-connections.md +58 -0
- package/commands/nav-diagram.md +106 -0
- package/commands/nav-export.md +71 -0
- package/commands/nav-impact.md +58 -0
- package/commands/nav-scan.md +46 -0
- package/commands/nav-status.md +44 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +627 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +95 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +262 -0
- package/dist/config.js.map +1 -0
- package/dist/diagram.d.ts +36 -0
- package/dist/diagram.d.ts.map +1 -0
- package/dist/diagram.js +333 -0
- package/dist/diagram.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner.d.ts +57 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +282 -0
- package/dist/scanner.js.map +1 -0
- package/dist/scanners/connections/ast-scanner.d.ts +26 -0
- package/dist/scanners/connections/ast-scanner.d.ts.map +1 -0
- package/dist/scanners/connections/ast-scanner.js +430 -0
- package/dist/scanners/connections/ast-scanner.js.map +1 -0
- package/dist/scanners/connections/service-calls.d.ts +14 -0
- package/dist/scanners/connections/service-calls.d.ts.map +1 -0
- package/dist/scanners/connections/service-calls.js +719 -0
- package/dist/scanners/connections/service-calls.js.map +1 -0
- package/dist/scanners/infrastructure/index.d.ts +27 -0
- package/dist/scanners/infrastructure/index.d.ts.map +1 -0
- package/dist/scanners/infrastructure/index.js +233 -0
- package/dist/scanners/infrastructure/index.js.map +1 -0
- package/dist/scanners/packages/npm.d.ts +18 -0
- package/dist/scanners/packages/npm.d.ts.map +1 -0
- package/dist/scanners/packages/npm.js +256 -0
- package/dist/scanners/packages/npm.js.map +1 -0
- package/dist/scanners/packages/pip.d.ts +14 -0
- package/dist/scanners/packages/pip.d.ts.map +1 -0
- package/dist/scanners/packages/pip.js +228 -0
- package/dist/scanners/packages/pip.js.map +1 -0
- package/dist/scanners/prompts/detector.d.ts +119 -0
- package/dist/scanners/prompts/detector.d.ts.map +1 -0
- package/dist/scanners/prompts/detector.js +617 -0
- package/dist/scanners/prompts/detector.js.map +1 -0
- package/dist/scanners/prompts/index.d.ts +51 -0
- package/dist/scanners/prompts/index.d.ts.map +1 -0
- package/dist/scanners/prompts/index.js +340 -0
- package/dist/scanners/prompts/index.js.map +1 -0
- package/dist/scanners/prompts/types.d.ts +127 -0
- package/dist/scanners/prompts/types.d.ts.map +1 -0
- package/dist/scanners/prompts/types.js +37 -0
- package/dist/scanners/prompts/types.js.map +1 -0
- package/dist/setup.d.ts +65 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +261 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage.d.ts +147 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +931 -0
- package/dist/storage.js.map +1 -0
- package/dist/types.d.ts +296 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/dist/ui-server.d.ts +17 -0
- package/dist/ui-server.d.ts.map +1 -0
- package/dist/ui-server.js +815 -0
- package/dist/ui-server.js.map +1 -0
- package/hooks/hooks.json +57 -0
- package/package.json +80 -0
- package/scripts/ibr-ui-test.mjs +359 -0
- package/scripts/postinstall.cjs +35 -0
- package/skills/architecture-awareness/SKILL.md +141 -0
package/dist/scanner.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NavGator Main Scanner
|
|
3
|
+
* Orchestrates all component and connection scanners
|
|
4
|
+
*/
|
|
5
|
+
import { glob } from 'glob';
|
|
6
|
+
import { scanNpmPackages, detectNpm } from './scanners/packages/npm.js';
|
|
7
|
+
import { scanPipPackages, detectPip } from './scanners/packages/pip.js';
|
|
8
|
+
import { scanInfrastructure } from './scanners/infrastructure/index.js';
|
|
9
|
+
import { scanServiceCalls } from './scanners/connections/service-calls.js';
|
|
10
|
+
import { scanWithAST, scanDatabaseOperations } from './scanners/connections/ast-scanner.js';
|
|
11
|
+
import { scanPrompts, convertToArchitecture, formatPromptsOutput } from './scanners/prompts/index.js';
|
|
12
|
+
import { storeComponents, storeConnections, buildIndex, buildGraph, buildFileMap, buildSummary, savePromptScan, clearStorage, computeFileHashes, saveHashes, detectFileChanges, formatFileChangeSummary, } from './storage.js';
|
|
13
|
+
import { getConfig, ensureStorageDirectories } from './config.js';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// MAIN SCANNER
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Run a full architecture scan
|
|
19
|
+
*/
|
|
20
|
+
export async function scan(projectRoot, options = {}) {
|
|
21
|
+
const startTime = Date.now();
|
|
22
|
+
const root = projectRoot || process.cwd();
|
|
23
|
+
const config = getConfig();
|
|
24
|
+
if (options.verbose) {
|
|
25
|
+
console.log(`Scanning project: ${root}`);
|
|
26
|
+
}
|
|
27
|
+
// Clear existing data if requested
|
|
28
|
+
if (options.clearFirst) {
|
|
29
|
+
await clearStorage(config, root);
|
|
30
|
+
}
|
|
31
|
+
// Ensure storage directories exist
|
|
32
|
+
ensureStorageDirectories(config, root);
|
|
33
|
+
// ==========================================================================
|
|
34
|
+
// Phase 0: File Discovery & Change Detection
|
|
35
|
+
// ==========================================================================
|
|
36
|
+
const sourceFiles = await glob('**/*.{ts,tsx,js,jsx,py}', {
|
|
37
|
+
cwd: root,
|
|
38
|
+
ignore: ['node_modules/**', 'dist/**', 'build/**', '.next/**', '__pycache__/**', 'venv/**', '.git/**'],
|
|
39
|
+
});
|
|
40
|
+
let fileChanges;
|
|
41
|
+
if (!options.clearFirst) {
|
|
42
|
+
fileChanges = await detectFileChanges(sourceFiles, root, config);
|
|
43
|
+
if (options.verbose) {
|
|
44
|
+
console.log(`File changes: ${formatFileChangeSummary(fileChanges)}`);
|
|
45
|
+
if (fileChanges.added.length > 0 && fileChanges.added.length <= 5) {
|
|
46
|
+
console.log(` Added: ${fileChanges.added.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
if (fileChanges.modified.length > 0 && fileChanges.modified.length <= 5) {
|
|
49
|
+
console.log(` Modified: ${fileChanges.modified.join(', ')}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const allComponents = [];
|
|
54
|
+
const allConnections = [];
|
|
55
|
+
const allWarnings = [];
|
|
56
|
+
let promptScanResultHolder;
|
|
57
|
+
// ==========================================================================
|
|
58
|
+
// Phase 1: Package Detection
|
|
59
|
+
// ==========================================================================
|
|
60
|
+
if (options.verbose) {
|
|
61
|
+
console.log('Phase 1: Scanning packages...');
|
|
62
|
+
}
|
|
63
|
+
// NPM packages
|
|
64
|
+
if (detectNpm(root)) {
|
|
65
|
+
if (options.verbose)
|
|
66
|
+
console.log(' - Detected npm/yarn/pnpm project');
|
|
67
|
+
const result = await scanNpmPackages(root);
|
|
68
|
+
allComponents.push(...result.components);
|
|
69
|
+
allWarnings.push(...result.warnings);
|
|
70
|
+
}
|
|
71
|
+
// Python packages
|
|
72
|
+
if (detectPip(root)) {
|
|
73
|
+
if (options.verbose)
|
|
74
|
+
console.log(' - Detected Python project');
|
|
75
|
+
const result = await scanPipPackages(root);
|
|
76
|
+
allComponents.push(...result.components);
|
|
77
|
+
allWarnings.push(...result.warnings);
|
|
78
|
+
}
|
|
79
|
+
// ==========================================================================
|
|
80
|
+
// Phase 2: Infrastructure Detection
|
|
81
|
+
// ==========================================================================
|
|
82
|
+
if (options.verbose) {
|
|
83
|
+
console.log('Phase 2: Scanning infrastructure...');
|
|
84
|
+
}
|
|
85
|
+
const infraResult = await scanInfrastructure(root);
|
|
86
|
+
allComponents.push(...infraResult.components);
|
|
87
|
+
allWarnings.push(...infraResult.warnings);
|
|
88
|
+
// ==========================================================================
|
|
89
|
+
// Phase 3: Connection Detection (unless quick mode)
|
|
90
|
+
// ==========================================================================
|
|
91
|
+
if (!options.quick || options.connections) {
|
|
92
|
+
if (options.verbose) {
|
|
93
|
+
console.log('Phase 3: Scanning connections...');
|
|
94
|
+
}
|
|
95
|
+
if (options.useAST) {
|
|
96
|
+
// AST-based scanning (more accurate)
|
|
97
|
+
if (options.verbose)
|
|
98
|
+
console.log(' - Running AST analysis (ts-morph)...');
|
|
99
|
+
try {
|
|
100
|
+
const astResult = await scanWithAST(root);
|
|
101
|
+
allComponents.push(...astResult.components);
|
|
102
|
+
allConnections.push(...astResult.connections);
|
|
103
|
+
allWarnings.push(...astResult.warnings);
|
|
104
|
+
// Also scan for database operations
|
|
105
|
+
if (options.verbose)
|
|
106
|
+
console.log(' - Scanning database operations...');
|
|
107
|
+
const dbResult = await scanDatabaseOperations(root);
|
|
108
|
+
allComponents.push(...dbResult.components);
|
|
109
|
+
allConnections.push(...dbResult.connections);
|
|
110
|
+
allWarnings.push(...dbResult.warnings);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
allWarnings.push({
|
|
114
|
+
type: 'parse_error',
|
|
115
|
+
message: `AST scanning failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
116
|
+
});
|
|
117
|
+
// Fall back to regex scanning
|
|
118
|
+
if (options.verbose)
|
|
119
|
+
console.log(' - Falling back to regex scanning...');
|
|
120
|
+
const serviceResult = await scanServiceCalls(root);
|
|
121
|
+
allComponents.push(...serviceResult.components);
|
|
122
|
+
allConnections.push(...serviceResult.connections);
|
|
123
|
+
allWarnings.push(...serviceResult.warnings);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Regex-based scanning (faster but less accurate)
|
|
128
|
+
if (options.verbose)
|
|
129
|
+
console.log(' - Scanning service calls (regex)...');
|
|
130
|
+
const serviceResult = await scanServiceCalls(root);
|
|
131
|
+
allComponents.push(...serviceResult.components);
|
|
132
|
+
allConnections.push(...serviceResult.connections);
|
|
133
|
+
allWarnings.push(...serviceResult.warnings);
|
|
134
|
+
}
|
|
135
|
+
// AI prompts - use enhanced scanner if --prompts flag, otherwise basic
|
|
136
|
+
if (options.prompts) {
|
|
137
|
+
if (options.verbose)
|
|
138
|
+
console.log(' - Running enhanced prompt scan...');
|
|
139
|
+
promptScanResultHolder = await scanPrompts(root, {
|
|
140
|
+
includeRawContent: true,
|
|
141
|
+
detectVariables: true,
|
|
142
|
+
});
|
|
143
|
+
// Convert to architecture format
|
|
144
|
+
const promptArchitecture = convertToArchitecture(promptScanResultHolder.prompts);
|
|
145
|
+
allComponents.push(...promptArchitecture.components);
|
|
146
|
+
allConnections.push(...promptArchitecture.connections);
|
|
147
|
+
allWarnings.push(...promptArchitecture.warnings);
|
|
148
|
+
if (options.verbose) {
|
|
149
|
+
console.log(` Found ${promptScanResultHolder.prompts.length} prompts`);
|
|
150
|
+
if (promptScanResultHolder.summary.byProvider) {
|
|
151
|
+
for (const [provider, count] of Object.entries(promptScanResultHolder.summary.byProvider)) {
|
|
152
|
+
console.log(` ${provider}: ${count}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ==========================================================================
|
|
159
|
+
// Phase 4: Deduplicate & Store
|
|
160
|
+
// ==========================================================================
|
|
161
|
+
if (options.verbose) {
|
|
162
|
+
console.log('Phase 4: Storing results...');
|
|
163
|
+
}
|
|
164
|
+
// Deduplicate components by name (within current scan)
|
|
165
|
+
const componentMap = new Map();
|
|
166
|
+
for (const component of allComponents) {
|
|
167
|
+
const existing = componentMap.get(component.name);
|
|
168
|
+
if (!existing || component.source.confidence > existing.source.confidence) {
|
|
169
|
+
componentMap.set(component.name, component);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const uniqueComponents = Array.from(componentMap.values());
|
|
173
|
+
// Clear old components/connections before storing new ones
|
|
174
|
+
// This ensures no duplicate accumulation across scans
|
|
175
|
+
await clearStorage(config, root);
|
|
176
|
+
ensureStorageDirectories(config, root);
|
|
177
|
+
// Store components and connections
|
|
178
|
+
await storeComponents(uniqueComponents, config, root);
|
|
179
|
+
await storeConnections(allConnections, config, root);
|
|
180
|
+
// Build index, graph, file map, and summary
|
|
181
|
+
await buildIndex(config, root);
|
|
182
|
+
await buildGraph(config, root);
|
|
183
|
+
await buildFileMap(config, root);
|
|
184
|
+
await buildSummary(config, root, promptScanResultHolder);
|
|
185
|
+
// Persist prompt scan results if available
|
|
186
|
+
if (promptScanResultHolder) {
|
|
187
|
+
await savePromptScan(promptScanResultHolder, config, root);
|
|
188
|
+
}
|
|
189
|
+
// ==========================================================================
|
|
190
|
+
// Phase 5: Save File Hashes
|
|
191
|
+
// ==========================================================================
|
|
192
|
+
if (options.verbose) {
|
|
193
|
+
console.log('Phase 5: Saving file hashes...');
|
|
194
|
+
}
|
|
195
|
+
const fileHashes = await computeFileHashes(sourceFiles, root);
|
|
196
|
+
await saveHashes(fileHashes, config, root);
|
|
197
|
+
const duration = Date.now() - startTime;
|
|
198
|
+
const filesChanged = fileChanges
|
|
199
|
+
? fileChanges.added.length + fileChanges.modified.length + fileChanges.removed.length
|
|
200
|
+
: sourceFiles.length;
|
|
201
|
+
if (options.verbose) {
|
|
202
|
+
console.log(`\nScan complete in ${duration}ms`);
|
|
203
|
+
console.log(` Components: ${uniqueComponents.length}`);
|
|
204
|
+
console.log(` Connections: ${allConnections.length}`);
|
|
205
|
+
console.log(` Files scanned: ${sourceFiles.length}`);
|
|
206
|
+
console.log(` Files changed: ${filesChanged}`);
|
|
207
|
+
console.log(` Warnings: ${allWarnings.length}`);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
components: uniqueComponents,
|
|
211
|
+
connections: allConnections,
|
|
212
|
+
warnings: allWarnings,
|
|
213
|
+
fileChanges,
|
|
214
|
+
promptScan: promptScanResultHolder,
|
|
215
|
+
stats: {
|
|
216
|
+
scan_duration_ms: duration,
|
|
217
|
+
components_found: uniqueComponents.length,
|
|
218
|
+
connections_found: allConnections.length,
|
|
219
|
+
warnings_count: allWarnings.length,
|
|
220
|
+
files_scanned: sourceFiles.length,
|
|
221
|
+
files_changed: filesChanged,
|
|
222
|
+
prompts_found: promptScanResultHolder?.prompts.length,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Quick scan - only packages, no code analysis
|
|
228
|
+
*/
|
|
229
|
+
export async function quickScan(projectRoot) {
|
|
230
|
+
const result = await scan(projectRoot, { quick: true });
|
|
231
|
+
return {
|
|
232
|
+
components: result.components,
|
|
233
|
+
connections: result.connections,
|
|
234
|
+
warnings: result.warnings,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Scan only for AI prompts (detailed)
|
|
239
|
+
*/
|
|
240
|
+
export async function scanPromptsOnly(projectRoot, options = {}) {
|
|
241
|
+
const root = projectRoot || process.cwd();
|
|
242
|
+
if (options.verbose) {
|
|
243
|
+
console.log(`Scanning for AI prompts in: ${root}`);
|
|
244
|
+
}
|
|
245
|
+
const result = await scanPrompts(root, {
|
|
246
|
+
includeRawContent: true,
|
|
247
|
+
detectVariables: true,
|
|
248
|
+
});
|
|
249
|
+
if (options.verbose) {
|
|
250
|
+
console.log(formatPromptsOutput(result));
|
|
251
|
+
}
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
// Re-export prompt utilities
|
|
255
|
+
export { formatPromptsOutput, formatPromptDetail } from './scanners/prompts/index.js';
|
|
256
|
+
/**
|
|
257
|
+
* Get scan status/summary without running a full scan
|
|
258
|
+
*/
|
|
259
|
+
export async function getScanStatus(projectRoot) {
|
|
260
|
+
const config = getConfig();
|
|
261
|
+
const root = projectRoot || process.cwd();
|
|
262
|
+
const { loadIndex } = await import('./storage.js');
|
|
263
|
+
const index = await loadIndex(config, root);
|
|
264
|
+
if (!index) {
|
|
265
|
+
return {
|
|
266
|
+
initialized: false,
|
|
267
|
+
last_scan: null,
|
|
268
|
+
needs_rescan: true,
|
|
269
|
+
component_count: 0,
|
|
270
|
+
connection_count: 0,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const hoursSinceLastScan = (Date.now() - index.last_scan) / (1000 * 60 * 60);
|
|
274
|
+
return {
|
|
275
|
+
initialized: true,
|
|
276
|
+
last_scan: index.last_scan,
|
|
277
|
+
needs_rescan: hoursSinceLastScan > 24,
|
|
278
|
+
component_count: index.stats.total_components,
|
|
279
|
+
connection_count: index.stats.total_connections,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-based Connection Scanner
|
|
3
|
+
* Uses ts-morph for accurate TypeScript/JavaScript analysis
|
|
4
|
+
*
|
|
5
|
+
* This scanner provides higher accuracy than regex by:
|
|
6
|
+
* - Tracking import statements and their usage
|
|
7
|
+
* - Following method chains (import { customers } from 'stripe'; customers.create())
|
|
8
|
+
* - Detecting API calls, database operations, and service integrations
|
|
9
|
+
*
|
|
10
|
+
* NOTE: ts-morph is an optional dependency. Install it with:
|
|
11
|
+
* npm install ts-morph
|
|
12
|
+
*/
|
|
13
|
+
import { ScanResult } from '../../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Check if ts-morph is available
|
|
16
|
+
*/
|
|
17
|
+
export declare function isTsMorphAvailable(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Scan TypeScript/JavaScript files using AST analysis
|
|
20
|
+
*/
|
|
21
|
+
export declare function scanWithAST(projectRoot: string): Promise<ScanResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Scan for database operations (Prisma patterns)
|
|
24
|
+
*/
|
|
25
|
+
export declare function scanDatabaseOperations(projectRoot: string): Promise<ScanResult>;
|
|
26
|
+
//# sourceMappingURL=ast-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-scanner.d.ts","sourceRoot":"","sources":["../../../src/scanners/connections/ast-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAKL,UAAU,EAEX,MAAM,gBAAgB,CAAC;AA6ExB;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS3D;AAMD;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsQ1E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoHrF"}
|