@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,430 @@
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 * as path from 'path';
14
+ import { glob } from 'glob';
15
+ import { generateConnectionId, generateComponentId, } from '../../types.js';
16
+ const SERVICE_SIGNATURES = [
17
+ // AI Services
18
+ {
19
+ serviceName: 'Claude (Anthropic)',
20
+ importPatterns: ['@anthropic-ai/sdk', 'anthropic'],
21
+ callPatterns: ['messages.create', 'completions.create'],
22
+ componentType: 'service',
23
+ layer: 'external',
24
+ purpose: 'Claude AI API',
25
+ },
26
+ {
27
+ serviceName: 'OpenAI',
28
+ importPatterns: ['openai'],
29
+ callPatterns: ['chat.completions.create', 'completions.create'],
30
+ componentType: 'service',
31
+ layer: 'external',
32
+ purpose: 'OpenAI API',
33
+ },
34
+ // Payment Services
35
+ {
36
+ serviceName: 'Stripe',
37
+ importPatterns: ['stripe'],
38
+ callPatterns: ['customers', 'paymentIntents', 'subscriptions', 'checkout'],
39
+ componentType: 'service',
40
+ layer: 'external',
41
+ purpose: 'Stripe payments',
42
+ },
43
+ // Database Services
44
+ {
45
+ serviceName: 'Supabase',
46
+ importPatterns: ['@supabase/supabase-js'],
47
+ callPatterns: ['from', 'auth', 'storage'],
48
+ componentType: 'database',
49
+ layer: 'database',
50
+ purpose: 'Supabase backend',
51
+ },
52
+ {
53
+ serviceName: 'Prisma',
54
+ importPatterns: ['@prisma/client'],
55
+ callPatterns: ['findMany', 'findUnique', 'create', 'update', 'delete'],
56
+ componentType: 'database',
57
+ layer: 'database',
58
+ purpose: 'Prisma ORM',
59
+ },
60
+ // Queue Services
61
+ {
62
+ serviceName: 'BullMQ',
63
+ importPatterns: ['bullmq'],
64
+ callPatterns: ['Queue', 'Worker', 'add'],
65
+ componentType: 'queue',
66
+ layer: 'queue',
67
+ purpose: 'BullMQ job queue',
68
+ },
69
+ ];
70
+ // =============================================================================
71
+ // TS-MORPH AVAILABILITY
72
+ // =============================================================================
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ let tsMorphModule = null;
75
+ /**
76
+ * Check if ts-morph is available
77
+ */
78
+ export async function isTsMorphAvailable() {
79
+ if (tsMorphModule)
80
+ return true;
81
+ try {
82
+ // @ts-expect-error - ts-morph is optional
83
+ tsMorphModule = await import('ts-morph');
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ // =============================================================================
91
+ // AST SCANNER
92
+ // =============================================================================
93
+ /**
94
+ * Scan TypeScript/JavaScript files using AST analysis
95
+ */
96
+ export async function scanWithAST(projectRoot) {
97
+ const components = [];
98
+ const connections = [];
99
+ const warnings = [];
100
+ const timestamp = Date.now();
101
+ // Try to load ts-morph
102
+ if (!tsMorphModule) {
103
+ try {
104
+ // @ts-expect-error - ts-morph is optional
105
+ tsMorphModule = await import('ts-morph');
106
+ }
107
+ catch {
108
+ return {
109
+ components,
110
+ connections,
111
+ warnings: [{
112
+ type: 'parse_error',
113
+ message: 'ts-morph not installed. Run: npm install ts-morph',
114
+ }],
115
+ };
116
+ }
117
+ }
118
+ const { Project, Node } = tsMorphModule;
119
+ // Find all TypeScript/JavaScript files
120
+ const sourceFiles = await glob('**/*.{ts,tsx,js,jsx}', {
121
+ cwd: projectRoot,
122
+ ignore: ['node_modules/**', 'dist/**', 'build/**', '.next/**', '*.d.ts'],
123
+ absolute: true,
124
+ });
125
+ if (sourceFiles.length === 0) {
126
+ return { components, connections, warnings };
127
+ }
128
+ // Create ts-morph project
129
+ const project = new Project({
130
+ compilerOptions: {
131
+ allowJs: true,
132
+ skipLibCheck: true,
133
+ noEmit: true,
134
+ },
135
+ skipAddingFilesFromTsConfig: true,
136
+ });
137
+ // Add source files
138
+ for (const file of sourceFiles) {
139
+ try {
140
+ project.addSourceFileAtPath(file);
141
+ }
142
+ catch {
143
+ warnings.push({
144
+ type: 'parse_error',
145
+ message: `Could not parse: ${path.relative(projectRoot, file)}`,
146
+ file: path.relative(projectRoot, file),
147
+ });
148
+ }
149
+ }
150
+ // Track found services
151
+ const foundServices = new Map();
152
+ // Helper: Extract imports from source file
153
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
+ function extractImports(sourceFile) {
155
+ const imports = [];
156
+ for (const importDecl of sourceFile.getImportDeclarations()) {
157
+ const moduleName = importDecl.getModuleSpecifierValue();
158
+ const importedNames = [];
159
+ let defaultImport;
160
+ let namespaceImport;
161
+ const defaultImportNode = importDecl.getDefaultImport();
162
+ if (defaultImportNode) {
163
+ defaultImport = defaultImportNode.getText();
164
+ }
165
+ const namespaceImportNode = importDecl.getNamespaceImport();
166
+ if (namespaceImportNode) {
167
+ namespaceImport = namespaceImportNode.getText();
168
+ }
169
+ for (const namedImport of importDecl.getNamedImports()) {
170
+ importedNames.push(namedImport.getName());
171
+ }
172
+ imports.push({ moduleName, importedNames, defaultImport, namespaceImport });
173
+ }
174
+ return imports;
175
+ }
176
+ // Helper: Find containing function name
177
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
178
+ function findContainingFunction(node) {
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ let current = node;
181
+ while (current) {
182
+ if (Node.isVariableDeclaration(current)) {
183
+ return current.getName();
184
+ }
185
+ if (Node.isFunctionDeclaration(current)) {
186
+ return current.getName();
187
+ }
188
+ if (Node.isMethodDeclaration(current)) {
189
+ return current.getName();
190
+ }
191
+ current = current.getParent();
192
+ }
193
+ return undefined;
194
+ }
195
+ // Analyze each file
196
+ for (const sourceFile of project.getSourceFiles()) {
197
+ const filePath = path.relative(projectRoot, sourceFile.getFilePath());
198
+ if (filePath.endsWith('.d.ts'))
199
+ continue;
200
+ const imports = extractImports(sourceFile);
201
+ // Check for service usage
202
+ for (const signature of SERVICE_SIGNATURES) {
203
+ const serviceImport = imports.find(imp => signature.importPatterns.some(pattern => imp.moduleName === pattern || imp.moduleName.startsWith(pattern + '/')));
204
+ if (serviceImport) {
205
+ // Create service component if not exists
206
+ if (!foundServices.has(signature.serviceName)) {
207
+ const component = {
208
+ component_id: generateComponentId(signature.componentType, signature.serviceName),
209
+ name: signature.serviceName,
210
+ type: signature.componentType,
211
+ role: {
212
+ purpose: signature.purpose,
213
+ layer: signature.layer,
214
+ critical: true,
215
+ },
216
+ source: {
217
+ detection_method: 'auto',
218
+ config_files: [],
219
+ confidence: 1.0,
220
+ },
221
+ connects_to: [],
222
+ connected_from: [],
223
+ status: 'active',
224
+ tags: [signature.componentType, signature.layer, 'ast-detected'],
225
+ timestamp,
226
+ last_updated: timestamp,
227
+ };
228
+ foundServices.set(signature.serviceName, component);
229
+ components.push(component);
230
+ }
231
+ // Find call sites
232
+ const identifiersToTrack = [
233
+ ...serviceImport.importedNames,
234
+ serviceImport.defaultImport,
235
+ serviceImport.namespaceImport,
236
+ ].filter(Boolean);
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ sourceFile.forEachDescendant((node) => {
239
+ if (Node.isCallExpression(node)) {
240
+ const expression = node.getExpression();
241
+ const expressionText = expression.getText();
242
+ const involvesImport = identifiersToTrack.some(id => expressionText.startsWith(id) || expressionText.includes(`.${id}`));
243
+ if (involvesImport) {
244
+ const serviceComponent = foundServices.get(signature.serviceName);
245
+ const line = node.getStartLineNumber();
246
+ const containingFunction = findContainingFunction(node);
247
+ const connection = {
248
+ connection_id: generateConnectionId('service-call'),
249
+ from: {
250
+ component_id: `FILE:${filePath}`,
251
+ location: { file: filePath, line, function: containingFunction },
252
+ },
253
+ to: { component_id: serviceComponent.component_id },
254
+ connection_type: 'service-call',
255
+ code_reference: {
256
+ file: filePath,
257
+ symbol: containingFunction || expressionText.slice(0, 40),
258
+ symbol_type: containingFunction ? 'function' : 'method',
259
+ line_start: line,
260
+ code_snippet: node.getText().slice(0, 100),
261
+ },
262
+ description: `Calls ${signature.serviceName}`,
263
+ detected_from: 'AST analysis',
264
+ confidence: 0.95,
265
+ timestamp,
266
+ last_verified: timestamp,
267
+ };
268
+ connections.push(connection);
269
+ }
270
+ }
271
+ });
272
+ }
273
+ }
274
+ // Find API calls (fetch, axios)
275
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
276
+ sourceFile.forEachDescendant((node) => {
277
+ if (Node.isCallExpression(node)) {
278
+ const expression = node.getExpression();
279
+ const expressionText = expression.getText();
280
+ // Check for fetch() calls
281
+ if (expressionText === 'fetch') {
282
+ const args = node.getArguments();
283
+ let endpoint;
284
+ if (args.length > 0) {
285
+ const firstArg = args[0];
286
+ if (Node.isStringLiteral(firstArg)) {
287
+ endpoint = firstArg.getLiteralValue();
288
+ }
289
+ }
290
+ const line = node.getStartLineNumber();
291
+ const containingFunction = findContainingFunction(node);
292
+ connections.push({
293
+ connection_id: generateConnectionId('frontend-calls-api'),
294
+ from: {
295
+ component_id: `FILE:${filePath}`,
296
+ location: { file: filePath, line, function: containingFunction },
297
+ },
298
+ to: { component_id: `API:${endpoint || 'dynamic'}` },
299
+ connection_type: 'frontend-calls-api',
300
+ code_reference: {
301
+ file: filePath,
302
+ symbol: containingFunction || 'anonymous',
303
+ symbol_type: 'function',
304
+ line_start: line,
305
+ code_snippet: node.getText().slice(0, 100),
306
+ },
307
+ description: `API call: GET ${endpoint || '(dynamic)'}`,
308
+ detected_from: 'AST analysis',
309
+ confidence: endpoint ? 0.9 : 0.7,
310
+ timestamp,
311
+ last_verified: timestamp,
312
+ });
313
+ }
314
+ }
315
+ });
316
+ }
317
+ return { components, connections, warnings };
318
+ }
319
+ /**
320
+ * Scan for database operations (Prisma patterns)
321
+ */
322
+ export async function scanDatabaseOperations(projectRoot) {
323
+ const components = [];
324
+ const connections = [];
325
+ const warnings = [];
326
+ const timestamp = Date.now();
327
+ // Try to load ts-morph
328
+ if (!tsMorphModule) {
329
+ try {
330
+ // @ts-expect-error - ts-morph is optional
331
+ tsMorphModule = await import('ts-morph');
332
+ }
333
+ catch {
334
+ return { components, connections, warnings };
335
+ }
336
+ }
337
+ const { Project, Node } = tsMorphModule;
338
+ const sourceFiles = await glob('**/*.{ts,tsx}', {
339
+ cwd: projectRoot,
340
+ ignore: ['node_modules/**', 'dist/**', 'build/**'],
341
+ absolute: true,
342
+ });
343
+ const project = new Project({
344
+ compilerOptions: { allowJs: true, skipLibCheck: true, noEmit: true },
345
+ skipAddingFilesFromTsConfig: true,
346
+ });
347
+ for (const file of sourceFiles) {
348
+ try {
349
+ project.addSourceFileAtPath(file);
350
+ }
351
+ catch {
352
+ // Skip unparseable files
353
+ }
354
+ }
355
+ const foundTables = new Map();
356
+ const prismaOperations = ['findMany', 'findUnique', 'findFirst', 'create', 'update', 'delete', 'upsert', 'count'];
357
+ // Helper to find containing function
358
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
359
+ function findContainingFunction(node) {
360
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
361
+ let current = node;
362
+ while (current) {
363
+ if (Node.isVariableDeclaration(current))
364
+ return current.getName();
365
+ if (Node.isFunctionDeclaration(current))
366
+ return current.getName();
367
+ if (Node.isMethodDeclaration(current))
368
+ return current.getName();
369
+ current = current.getParent();
370
+ }
371
+ return undefined;
372
+ }
373
+ for (const sourceFile of project.getSourceFiles()) {
374
+ const filePath = path.relative(projectRoot, sourceFile.getFilePath());
375
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
376
+ sourceFile.forEachDescendant((node) => {
377
+ if (Node.isCallExpression(node)) {
378
+ const text = node.getExpression().getText();
379
+ const prismaMatch = text.match(/(\w+)\.(\w+)\.(\w+)/);
380
+ if (prismaMatch) {
381
+ const [, , tableName, operation] = prismaMatch;
382
+ if (prismaOperations.includes(operation)) {
383
+ if (!foundTables.has(tableName)) {
384
+ const component = {
385
+ component_id: generateComponentId('db-table', tableName),
386
+ name: tableName,
387
+ type: 'db-table',
388
+ role: { purpose: `Database table: ${tableName}`, layer: 'database', critical: true },
389
+ source: { detection_method: 'auto', config_files: [], confidence: 0.9 },
390
+ connects_to: [],
391
+ connected_from: [],
392
+ status: 'active',
393
+ tags: ['database', 'prisma', 'ast-detected'],
394
+ timestamp,
395
+ last_updated: timestamp,
396
+ };
397
+ foundTables.set(tableName, component);
398
+ components.push(component);
399
+ }
400
+ const tableComponent = foundTables.get(tableName);
401
+ const containingFunction = findContainingFunction(node);
402
+ connections.push({
403
+ connection_id: generateConnectionId('api-calls-db'),
404
+ from: {
405
+ component_id: `FILE:${filePath}`,
406
+ location: { file: filePath, line: node.getStartLineNumber(), function: containingFunction },
407
+ },
408
+ to: { component_id: tableComponent.component_id },
409
+ connection_type: 'api-calls-db',
410
+ code_reference: {
411
+ file: filePath,
412
+ symbol: containingFunction || `${tableName}_${operation}`,
413
+ symbol_type: 'function',
414
+ line_start: node.getStartLineNumber(),
415
+ code_snippet: node.getText().slice(0, 100),
416
+ },
417
+ description: `${operation} on ${tableName}`,
418
+ detected_from: 'AST analysis (Prisma)',
419
+ confidence: 0.95,
420
+ timestamp,
421
+ last_verified: timestamp,
422
+ });
423
+ }
424
+ }
425
+ }
426
+ });
427
+ }
428
+ return { components, connections, warnings };
429
+ }
430
+ //# sourceMappingURL=ast-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-scanner.js","sourceRoot":"","sources":["../../../src/scanners/connections/ast-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Service Call Scanner
3
+ * Detects connections to external services (Stripe, OpenAI, Claude, etc.)
4
+ */
5
+ import { ScanResult } from '../../types.js';
6
+ /**
7
+ * Scan for service calls in the codebase
8
+ */
9
+ export declare function scanServiceCalls(projectRoot: string): Promise<ScanResult>;
10
+ /**
11
+ * Specifically scan for AI prompt locations
12
+ */
13
+ export declare function scanPromptLocations(projectRoot: string): Promise<ScanResult>;
14
+ //# sourceMappingURL=service-calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-calls.d.ts","sourceRoot":"","sources":["../../../src/scanners/connections/service-calls.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAKL,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAgcxB;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA8I/E;AAgCD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+HlF"}