@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.
Files changed (84) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +486 -0
  4. package/agents/architecture-advisor.md +109 -0
  5. package/commands/nav-check.md +64 -0
  6. package/commands/nav-connections.md +58 -0
  7. package/commands/nav-diagram.md +106 -0
  8. package/commands/nav-export.md +71 -0
  9. package/commands/nav-impact.md +58 -0
  10. package/commands/nav-scan.md +46 -0
  11. package/commands/nav-status.md +44 -0
  12. package/dist/cli/index.d.ts +7 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +627 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/config.d.ts +95 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +262 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/diagram.d.ts +36 -0
  21. package/dist/diagram.d.ts.map +1 -0
  22. package/dist/diagram.js +333 -0
  23. package/dist/diagram.js.map +1 -0
  24. package/dist/index.d.ts +16 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +18 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/scanner.d.ts +57 -0
  29. package/dist/scanner.d.ts.map +1 -0
  30. package/dist/scanner.js +282 -0
  31. package/dist/scanner.js.map +1 -0
  32. package/dist/scanners/connections/ast-scanner.d.ts +26 -0
  33. package/dist/scanners/connections/ast-scanner.d.ts.map +1 -0
  34. package/dist/scanners/connections/ast-scanner.js +430 -0
  35. package/dist/scanners/connections/ast-scanner.js.map +1 -0
  36. package/dist/scanners/connections/service-calls.d.ts +14 -0
  37. package/dist/scanners/connections/service-calls.d.ts.map +1 -0
  38. package/dist/scanners/connections/service-calls.js +719 -0
  39. package/dist/scanners/connections/service-calls.js.map +1 -0
  40. package/dist/scanners/infrastructure/index.d.ts +27 -0
  41. package/dist/scanners/infrastructure/index.d.ts.map +1 -0
  42. package/dist/scanners/infrastructure/index.js +233 -0
  43. package/dist/scanners/infrastructure/index.js.map +1 -0
  44. package/dist/scanners/packages/npm.d.ts +18 -0
  45. package/dist/scanners/packages/npm.d.ts.map +1 -0
  46. package/dist/scanners/packages/npm.js +256 -0
  47. package/dist/scanners/packages/npm.js.map +1 -0
  48. package/dist/scanners/packages/pip.d.ts +14 -0
  49. package/dist/scanners/packages/pip.d.ts.map +1 -0
  50. package/dist/scanners/packages/pip.js +228 -0
  51. package/dist/scanners/packages/pip.js.map +1 -0
  52. package/dist/scanners/prompts/detector.d.ts +119 -0
  53. package/dist/scanners/prompts/detector.d.ts.map +1 -0
  54. package/dist/scanners/prompts/detector.js +617 -0
  55. package/dist/scanners/prompts/detector.js.map +1 -0
  56. package/dist/scanners/prompts/index.d.ts +51 -0
  57. package/dist/scanners/prompts/index.d.ts.map +1 -0
  58. package/dist/scanners/prompts/index.js +340 -0
  59. package/dist/scanners/prompts/index.js.map +1 -0
  60. package/dist/scanners/prompts/types.d.ts +127 -0
  61. package/dist/scanners/prompts/types.d.ts.map +1 -0
  62. package/dist/scanners/prompts/types.js +37 -0
  63. package/dist/scanners/prompts/types.js.map +1 -0
  64. package/dist/setup.d.ts +65 -0
  65. package/dist/setup.d.ts.map +1 -0
  66. package/dist/setup.js +261 -0
  67. package/dist/setup.js.map +1 -0
  68. package/dist/storage.d.ts +147 -0
  69. package/dist/storage.d.ts.map +1 -0
  70. package/dist/storage.js +931 -0
  71. package/dist/storage.js.map +1 -0
  72. package/dist/types.d.ts +296 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +55 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/ui-server.d.ts +17 -0
  77. package/dist/ui-server.d.ts.map +1 -0
  78. package/dist/ui-server.js +815 -0
  79. package/dist/ui-server.js.map +1 -0
  80. package/hooks/hooks.json +57 -0
  81. package/package.json +80 -0
  82. package/scripts/ibr-ui-test.mjs +359 -0
  83. package/scripts/postinstall.cjs +35 -0
  84. package/skills/architecture-awareness/SKILL.md +141 -0
@@ -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"}