@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,51 @@
1
+ /**
2
+ * Prompt Scanner
3
+ *
4
+ * Comprehensive AI prompt detection and tracking for codebases.
5
+ * Tracks prompt locations, content, purpose, and which AI services they're sent to.
6
+ *
7
+ * Features:
8
+ * - Full prompt content extraction (up to 2000 chars)
9
+ * - Template variable detection
10
+ * - AI provider linkage (Claude, OpenAI, etc.)
11
+ * - Purpose inference from comments and content
12
+ * - Category classification
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { scanPrompts } from './scanners/prompts';
17
+ *
18
+ * const result = await scanPrompts('/path/to/project');
19
+ * console.log(`Found ${result.prompts.length} prompts`);
20
+ *
21
+ * for (const prompt of result.prompts) {
22
+ * console.log(`${prompt.name} (${prompt.category})`);
23
+ * console.log(` File: ${prompt.location.file}:${prompt.location.lineStart}`);
24
+ * console.log(` Provider: ${prompt.provider?.provider || 'unknown'}`);
25
+ * console.log(` Purpose: ${prompt.purpose || 'not detected'}`);
26
+ * }
27
+ * ```
28
+ */
29
+ import { DetectorOptions } from './detector.js';
30
+ import { DetectedPrompt, PromptScanResult } from './types.js';
31
+ import { ScanResult } from '../../types.js';
32
+ export * from './types.js';
33
+ export { PromptDetector, createDetector } from './detector.js';
34
+ /**
35
+ * Scan a project for AI prompts
36
+ */
37
+ export declare function scanPrompts(projectRoot: string, options?: DetectorOptions): Promise<PromptScanResult>;
38
+ /**
39
+ * Convert detected prompts to NavGator components and connections
40
+ * for integration with the main architecture graph
41
+ */
42
+ export declare function convertToArchitecture(prompts: DetectedPrompt[]): ScanResult;
43
+ /**
44
+ * Format prompts for CLI output
45
+ */
46
+ export declare function formatPromptsOutput(result: PromptScanResult): string;
47
+ /**
48
+ * Format a single prompt for detailed view
49
+ */
50
+ export declare function formatPromptDetail(prompt: DetectedPrompt): string;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAkC,eAAe,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EACL,cAAc,EAEd,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,UAAU,EAGX,MAAM,gBAAgB,CAAC;AAGxB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/D;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAY3B;AAwCD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EAAE,GACxB,UAAU,CAuHZ;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA6EpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyEjE"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Prompt Scanner
3
+ *
4
+ * Comprehensive AI prompt detection and tracking for codebases.
5
+ * Tracks prompt locations, content, purpose, and which AI services they're sent to.
6
+ *
7
+ * Features:
8
+ * - Full prompt content extraction (up to 2000 chars)
9
+ * - Template variable detection
10
+ * - AI provider linkage (Claude, OpenAI, etc.)
11
+ * - Purpose inference from comments and content
12
+ * - Category classification
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { scanPrompts } from './scanners/prompts';
17
+ *
18
+ * const result = await scanPrompts('/path/to/project');
19
+ * console.log(`Found ${result.prompts.length} prompts`);
20
+ *
21
+ * for (const prompt of result.prompts) {
22
+ * console.log(`${prompt.name} (${prompt.category})`);
23
+ * console.log(` File: ${prompt.location.file}:${prompt.location.lineStart}`);
24
+ * console.log(` Provider: ${prompt.provider?.provider || 'unknown'}`);
25
+ * console.log(` Purpose: ${prompt.purpose || 'not detected'}`);
26
+ * }
27
+ * ```
28
+ */
29
+ import { createDetector } from './detector.js';
30
+ import { generateComponentId, generateConnectionId, } from '../../types.js';
31
+ // Re-export types
32
+ export * from './types.js';
33
+ export { PromptDetector, createDetector } from './detector.js';
34
+ // =============================================================================
35
+ // MAIN SCAN FUNCTION
36
+ // =============================================================================
37
+ /**
38
+ * Scan a project for AI prompts
39
+ */
40
+ export async function scanPrompts(projectRoot, options) {
41
+ const detector = createDetector(options);
42
+ const { prompts, warnings } = await detector.scanProject(projectRoot);
43
+ // Build summary
44
+ const summary = buildSummary(prompts);
45
+ return {
46
+ prompts,
47
+ summary,
48
+ warnings,
49
+ };
50
+ }
51
+ /**
52
+ * Build summary statistics from prompts
53
+ */
54
+ function buildSummary(prompts) {
55
+ const byProvider = {};
56
+ const byCategory = {};
57
+ let templatesCount = 0;
58
+ let withToolsCount = 0;
59
+ for (const prompt of prompts) {
60
+ // Count by provider
61
+ const provider = prompt.provider?.provider || 'unknown';
62
+ byProvider[provider] = (byProvider[provider] || 0) + 1;
63
+ // Count by category
64
+ const category = prompt.category || 'unknown';
65
+ byCategory[category] = (byCategory[category] || 0) + 1;
66
+ // Count templates
67
+ if (prompt.isTemplate)
68
+ templatesCount++;
69
+ // Count tool-using prompts
70
+ if (prompt.tags.includes('tool-use'))
71
+ withToolsCount++;
72
+ }
73
+ return {
74
+ totalPrompts: prompts.length,
75
+ byProvider,
76
+ byCategory,
77
+ templatesCount,
78
+ withToolsCount,
79
+ };
80
+ }
81
+ // =============================================================================
82
+ // CONVERT TO ARCHITECTURE COMPONENTS/CONNECTIONS
83
+ // =============================================================================
84
+ /**
85
+ * Convert detected prompts to NavGator components and connections
86
+ * for integration with the main architecture graph
87
+ */
88
+ export function convertToArchitecture(prompts) {
89
+ const components = [];
90
+ const connections = [];
91
+ const timestamp = Date.now();
92
+ for (const prompt of prompts) {
93
+ // Create component for the prompt
94
+ const component = {
95
+ component_id: generateComponentId('prompt', prompt.name),
96
+ name: prompt.name,
97
+ type: 'prompt',
98
+ version: undefined,
99
+ role: {
100
+ purpose: prompt.purpose || `AI prompt (${prompt.category})`,
101
+ layer: 'backend',
102
+ critical: true,
103
+ },
104
+ source: {
105
+ detection_method: 'auto',
106
+ config_files: [prompt.location.file],
107
+ confidence: prompt.confidence,
108
+ },
109
+ connects_to: [],
110
+ connected_from: [],
111
+ status: 'active',
112
+ tags: [
113
+ 'prompt',
114
+ prompt.category || 'unknown',
115
+ ...(prompt.provider ? [prompt.provider.provider] : []),
116
+ ...prompt.tags,
117
+ ],
118
+ timestamp,
119
+ last_updated: timestamp,
120
+ // Store rich prompt metadata
121
+ metadata: {
122
+ promptId: prompt.id,
123
+ category: prompt.category,
124
+ isTemplate: prompt.isTemplate,
125
+ variables: prompt.variables.map(v => v.name),
126
+ provider: prompt.provider?.provider,
127
+ model: prompt.provider?.model,
128
+ messageCount: prompt.messages.length,
129
+ hasSystemPrompt: prompt.messages.some(m => m.role === 'system'),
130
+ // Store first message content (truncated)
131
+ systemPrompt: prompt.messages.find(m => m.role === 'system')?.content?.slice(0, 500),
132
+ userTemplate: prompt.messages.find(m => m.role === 'user')?.content?.slice(0, 500),
133
+ },
134
+ };
135
+ components.push(component);
136
+ // Create connection showing where prompt is defined
137
+ const locationConnection = {
138
+ connection_id: generateConnectionId('prompt-location'),
139
+ from: {
140
+ component_id: component.component_id,
141
+ location: {
142
+ file: prompt.location.file,
143
+ line: prompt.location.lineStart,
144
+ function: prompt.location.functionName,
145
+ },
146
+ },
147
+ to: {
148
+ component_id: component.component_id,
149
+ },
150
+ connection_type: 'prompt-location',
151
+ code_reference: {
152
+ file: prompt.location.file,
153
+ symbol: prompt.location.functionName || prompt.name,
154
+ symbol_type: prompt.location.functionName ? 'function' : 'variable',
155
+ line_start: prompt.location.lineStart,
156
+ line_end: prompt.location.lineEnd,
157
+ code_snippet: prompt.rawContent?.slice(0, 200),
158
+ },
159
+ description: `Prompt defined: ${prompt.name}`,
160
+ detected_from: 'Prompt scanner',
161
+ confidence: prompt.confidence,
162
+ timestamp,
163
+ last_verified: timestamp,
164
+ };
165
+ connections.push(locationConnection);
166
+ // Create connections for each usage
167
+ for (const usage of prompt.usedBy) {
168
+ const usageConnection = {
169
+ connection_id: generateConnectionId('prompt-usage'),
170
+ from: {
171
+ component_id: `FILE:${usage.file}`,
172
+ location: {
173
+ file: usage.file,
174
+ line: usage.line,
175
+ function: usage.functionName,
176
+ },
177
+ },
178
+ to: {
179
+ component_id: component.component_id,
180
+ },
181
+ connection_type: 'service-call',
182
+ code_reference: {
183
+ file: usage.file,
184
+ symbol: usage.functionName || `line_${usage.line}`,
185
+ symbol_type: 'function',
186
+ line_start: usage.line,
187
+ code_snippet: usage.callPattern,
188
+ },
189
+ description: `Calls AI (${prompt.provider?.provider || 'unknown'}) with ${prompt.name}`,
190
+ detected_from: 'Prompt usage detection',
191
+ confidence: prompt.confidence,
192
+ timestamp,
193
+ last_verified: timestamp,
194
+ };
195
+ connections.push(usageConnection);
196
+ }
197
+ }
198
+ return {
199
+ components,
200
+ connections,
201
+ warnings: [],
202
+ };
203
+ }
204
+ // =============================================================================
205
+ // FORMATTED OUTPUT
206
+ // =============================================================================
207
+ /**
208
+ * Format prompts for CLI output
209
+ */
210
+ export function formatPromptsOutput(result) {
211
+ const lines = [];
212
+ lines.push('');
213
+ lines.push('AI PROMPTS DETECTED');
214
+ lines.push('='.repeat(60));
215
+ lines.push('');
216
+ if (result.prompts.length === 0) {
217
+ lines.push('No AI prompts detected.');
218
+ return lines.join('\n');
219
+ }
220
+ // Summary
221
+ lines.push(`Total prompts: ${result.summary.totalPrompts}`);
222
+ lines.push(`Templates: ${result.summary.templatesCount}`);
223
+ lines.push(`With tools: ${result.summary.withToolsCount}`);
224
+ lines.push('');
225
+ // By provider
226
+ lines.push('By Provider:');
227
+ for (const [provider, count] of Object.entries(result.summary.byProvider)) {
228
+ lines.push(` ${provider}: ${count}`);
229
+ }
230
+ lines.push('');
231
+ // By category
232
+ lines.push('By Category:');
233
+ for (const [category, count] of Object.entries(result.summary.byCategory)) {
234
+ lines.push(` ${category}: ${count}`);
235
+ }
236
+ lines.push('');
237
+ // Individual prompts
238
+ lines.push('-'.repeat(60));
239
+ for (const prompt of result.prompts) {
240
+ lines.push('');
241
+ lines.push(`PROMPT: ${prompt.name}`);
242
+ lines.push(` File: ${prompt.location.file}:${prompt.location.lineStart}-${prompt.location.lineEnd}`);
243
+ if (prompt.location.functionName) {
244
+ lines.push(` Function: ${prompt.location.functionName}`);
245
+ }
246
+ lines.push(` Provider: ${prompt.provider?.provider || 'unknown'}`);
247
+ lines.push(` Category: ${prompt.category}`);
248
+ if (prompt.purpose) {
249
+ lines.push(` Purpose: ${prompt.purpose}`);
250
+ }
251
+ if (prompt.isTemplate && prompt.variables.length > 0) {
252
+ lines.push(` Variables: ${prompt.variables.map(v => v.name).join(', ')}`);
253
+ }
254
+ if (prompt.tags.length > 0) {
255
+ lines.push(` Tags: ${prompt.tags.join(', ')}`);
256
+ }
257
+ // Show message preview
258
+ const systemMsg = prompt.messages.find(m => m.role === 'system');
259
+ if (systemMsg) {
260
+ const preview = systemMsg.content.slice(0, 100).replace(/\n/g, ' ');
261
+ lines.push(` System: "${preview}${systemMsg.content.length > 100 ? '...' : ''}"`);
262
+ }
263
+ const userMsg = prompt.messages.find(m => m.role === 'user');
264
+ if (userMsg) {
265
+ const preview = userMsg.content.slice(0, 100).replace(/\n/g, ' ');
266
+ lines.push(` User: "${preview}${userMsg.content.length > 100 ? '...' : ''}"`);
267
+ }
268
+ lines.push(` Confidence: ${(prompt.confidence * 100).toFixed(0)}%`);
269
+ }
270
+ return lines.join('\n');
271
+ }
272
+ /**
273
+ * Format a single prompt for detailed view
274
+ */
275
+ export function formatPromptDetail(prompt) {
276
+ const lines = [];
277
+ lines.push('');
278
+ lines.push(`PROMPT: ${prompt.name}`);
279
+ lines.push('='.repeat(60));
280
+ lines.push('');
281
+ lines.push(`ID: ${prompt.id}`);
282
+ lines.push(`File: ${prompt.location.file}`);
283
+ lines.push(`Lines: ${prompt.location.lineStart}-${prompt.location.lineEnd}`);
284
+ if (prompt.location.functionName) {
285
+ lines.push(`Function: ${prompt.location.functionName}`);
286
+ }
287
+ if (prompt.location.className) {
288
+ lines.push(`Class: ${prompt.location.className}`);
289
+ }
290
+ lines.push('');
291
+ lines.push('METADATA');
292
+ lines.push('-'.repeat(40));
293
+ lines.push(`Provider: ${prompt.provider?.provider || 'unknown'}`);
294
+ if (prompt.provider?.model) {
295
+ lines.push(`Model: ${prompt.provider.model}`);
296
+ }
297
+ lines.push(`Category: ${prompt.category}`);
298
+ lines.push(`Is Template: ${prompt.isTemplate}`);
299
+ if (prompt.templateSyntax) {
300
+ lines.push(`Template Syntax: ${prompt.templateSyntax}`);
301
+ }
302
+ if (prompt.purpose) {
303
+ lines.push(`Purpose: ${prompt.purpose}`);
304
+ }
305
+ lines.push(`Confidence: ${(prompt.confidence * 100).toFixed(0)}%`);
306
+ lines.push(`Tags: ${prompt.tags.join(', ') || 'none'}`);
307
+ if (prompt.variables.length > 0) {
308
+ lines.push('');
309
+ lines.push('VARIABLES');
310
+ lines.push('-'.repeat(40));
311
+ for (const variable of prompt.variables) {
312
+ lines.push(` ${variable.name} (${variable.pattern})`);
313
+ }
314
+ }
315
+ lines.push('');
316
+ lines.push('MESSAGES');
317
+ lines.push('-'.repeat(40));
318
+ for (const msg of prompt.messages) {
319
+ lines.push('');
320
+ lines.push(`[${msg.role.toUpperCase()}]`);
321
+ lines.push(msg.content);
322
+ if (msg.truncated) {
323
+ lines.push(`... (truncated, original length: ${msg.originalLength})`);
324
+ }
325
+ }
326
+ if (prompt.usedBy.length > 0) {
327
+ lines.push('');
328
+ lines.push('USAGE LOCATIONS');
329
+ lines.push('-'.repeat(40));
330
+ for (const usage of prompt.usedBy) {
331
+ lines.push(` ${usage.file}:${usage.line}`);
332
+ lines.push(` Call: ${usage.callPattern}`);
333
+ if (usage.functionName) {
334
+ lines.push(` Function: ${usage.functionName}`);
335
+ }
336
+ }
337
+ }
338
+ return lines.join('\n');
339
+ }
340
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Prompt Scanner Types
3
+ *
4
+ * Rich types for tracking AI prompts in codebases.
5
+ * Inspired by PromptLayer's registry pattern for version control and metadata.
6
+ *
7
+ * @see https://docs.promptlayer.com/features/prompt-registry/overview
8
+ */
9
+ /**
10
+ * A single message in a prompt (system, user, assistant)
11
+ */
12
+ export interface PromptMessage {
13
+ role: 'system' | 'user' | 'assistant' | 'function' | 'tool';
14
+ content: string;
15
+ name?: string;
16
+ truncated?: boolean;
17
+ originalLength?: number;
18
+ }
19
+ /**
20
+ * Variables/placeholders in a prompt template
21
+ */
22
+ export interface PromptVariable {
23
+ name: string;
24
+ pattern: string;
25
+ type?: 'string' | 'array' | 'object' | 'unknown';
26
+ required?: boolean;
27
+ defaultValue?: string;
28
+ }
29
+ /**
30
+ * AI provider configuration detected with the prompt
31
+ */
32
+ export interface PromptProviderConfig {
33
+ provider: 'anthropic' | 'openai' | 'azure' | 'google' | 'cohere' | 'unknown';
34
+ model?: string;
35
+ temperature?: number;
36
+ maxTokens?: number;
37
+ topP?: number;
38
+ stopSequences?: string[];
39
+ tools?: string[];
40
+ }
41
+ /**
42
+ * A detected prompt in the codebase
43
+ */
44
+ export interface DetectedPrompt {
45
+ id: string;
46
+ name: string;
47
+ location: {
48
+ file: string;
49
+ lineStart: number;
50
+ lineEnd: number;
51
+ functionName?: string;
52
+ className?: string;
53
+ exportName?: string;
54
+ };
55
+ messages: PromptMessage[];
56
+ rawContent?: string;
57
+ isTemplate: boolean;
58
+ variables: PromptVariable[];
59
+ templateSyntax?: 'jinja2' | 'fstring' | 'mustache' | 'template-literal' | 'unknown';
60
+ provider?: PromptProviderConfig;
61
+ usedBy: PromptUsage[];
62
+ purpose?: string;
63
+ tags: string[];
64
+ category?: PromptCategory;
65
+ confidence: number;
66
+ detectionMethod: 'ast' | 'regex' | 'heuristic';
67
+ timestamp: number;
68
+ }
69
+ /**
70
+ * Where a prompt is used (called)
71
+ */
72
+ export interface PromptUsage {
73
+ file: string;
74
+ line: number;
75
+ functionName?: string;
76
+ callPattern: string;
77
+ isAsync: boolean;
78
+ hasStreaming: boolean;
79
+ }
80
+ /**
81
+ * Prompt category based on detected purpose
82
+ */
83
+ export type PromptCategory = 'chat' | 'completion' | 'extraction' | 'classification' | 'summarization' | 'translation' | 'code-generation' | 'code-review' | 'agent' | 'embedding' | 'unknown';
84
+ /**
85
+ * Pattern definition for detecting prompts
86
+ */
87
+ export interface PromptPattern {
88
+ name: string;
89
+ provider: PromptProviderConfig['provider'];
90
+ patterns: RegExp[];
91
+ messageExtractor?: (content: string, match: RegExpMatchArray) => PromptMessage[] | null;
92
+ configExtractor?: (content: string) => Partial<PromptProviderConfig>;
93
+ }
94
+ /**
95
+ * Result of prompt scanning
96
+ */
97
+ export interface PromptScanResult {
98
+ prompts: DetectedPrompt[];
99
+ summary: {
100
+ totalPrompts: number;
101
+ byProvider: Record<string, number>;
102
+ byCategory: Record<string, number>;
103
+ templatesCount: number;
104
+ withToolsCount: number;
105
+ };
106
+ warnings: PromptWarning[];
107
+ }
108
+ export interface PromptWarning {
109
+ type: 'parse_error' | 'truncated' | 'ambiguous' | 'deprecated_pattern';
110
+ message: string;
111
+ file?: string;
112
+ line?: number;
113
+ }
114
+ /**
115
+ * Maximum prompt content length to store (characters)
116
+ * Longer prompts are truncated with a note
117
+ */
118
+ export declare const MAX_PROMPT_LENGTH = 2000;
119
+ /**
120
+ * Maximum number of messages to store per prompt
121
+ */
122
+ export declare const MAX_MESSAGES_PER_PROMPT = 10;
123
+ /**
124
+ * Keywords that suggest prompt purpose
125
+ */
126
+ export declare const PURPOSE_KEYWORDS: Record<PromptCategory, string[]>;
127
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/prompts/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Prompt Scanner Types
3
+ *
4
+ * Rich types for tracking AI prompts in codebases.
5
+ * Inspired by PromptLayer's registry pattern for version control and metadata.
6
+ *
7
+ * @see https://docs.promptlayer.com/features/prompt-registry/overview
8
+ */
9
+ // =============================================================================
10
+ // CONSTANTS
11
+ // =============================================================================
12
+ /**
13
+ * Maximum prompt content length to store (characters)
14
+ * Longer prompts are truncated with a note
15
+ */
16
+ export const MAX_PROMPT_LENGTH = 2000;
17
+ /**
18
+ * Maximum number of messages to store per prompt
19
+ */
20
+ export const MAX_MESSAGES_PER_PROMPT = 10;
21
+ /**
22
+ * Keywords that suggest prompt purpose
23
+ */
24
+ export const PURPOSE_KEYWORDS = {
25
+ 'chat': ['chat', 'conversation', 'assistant', 'helpful'],
26
+ 'completion': ['complete', 'continue', 'generate'],
27
+ 'extraction': ['extract', 'parse', 'identify', 'find'],
28
+ 'classification': ['classify', 'categorize', 'label', 'determine'],
29
+ 'summarization': ['summarize', 'summary', 'tldr', 'condense'],
30
+ 'translation': ['translate', 'convert', 'language'],
31
+ 'code-generation': ['code', 'implement', 'write function', 'generate code'],
32
+ 'code-review': ['review', 'analyze code', 'find bugs', 'improve'],
33
+ 'agent': ['tool', 'function', 'action', 'execute'],
34
+ 'embedding': ['embed', 'vector', 'similarity'],
35
+ 'unknown': [],
36
+ };
37
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scanners/prompts/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4JH,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IAChE,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC;IACxD,YAAY,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IAClD,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;IACtD,gBAAgB,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,CAAC;IAClE,eAAe,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC;IAC7D,aAAa,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;IACnD,iBAAiB,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,CAAC;IAC3E,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,CAAC;IACjE,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC;IAClD,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC;IAC9C,SAAS,EAAE,EAAE;CACd,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * NavGator Setup & Initial Scan
3
+ *
4
+ * Provides a two-phase scanning approach:
5
+ * 1. Fast scan: Quick package detection, basic file structure (instant feedback)
6
+ * 2. Deep scan: Full AST analysis, connection detection, prompt scanning
7
+ *
8
+ * The fast scan uses lightweight regex patterns and file system analysis.
9
+ * The deep scan uses ts-morph AST analysis for accurate detection.
10
+ */
11
+ export interface SetupOptions {
12
+ /** Project root path */
13
+ projectPath?: string;
14
+ /** Skip the deep scan phase */
15
+ fastOnly?: boolean;
16
+ /** Run deep scan immediately instead of in background */
17
+ deepImmediate?: boolean;
18
+ /** Generate initial diagram */
19
+ generateDiagram?: boolean;
20
+ /** Verbose output */
21
+ verbose?: boolean;
22
+ /** Callback for progress updates */
23
+ onProgress?: (phase: string, message: string) => void;
24
+ }
25
+ export interface SetupResult {
26
+ success: boolean;
27
+ fastScanComplete: boolean;
28
+ deepScanComplete: boolean;
29
+ componentsFound: number;
30
+ connectionsFound: number;
31
+ promptsFound: number;
32
+ diagram?: string;
33
+ duration: {
34
+ fastMs: number;
35
+ deepMs?: number;
36
+ totalMs: number;
37
+ };
38
+ errors: string[];
39
+ }
40
+ /**
41
+ * Run initial NavGator setup with two-phase scanning
42
+ */
43
+ export declare function setup(options?: SetupOptions): Promise<SetupResult>;
44
+ /**
45
+ * Run fast scan only (for quick initial view)
46
+ */
47
+ export declare function fastSetup(projectPath?: string): Promise<SetupResult>;
48
+ /**
49
+ * Run full setup with both phases
50
+ */
51
+ export declare function fullSetup(projectPath?: string): Promise<SetupResult>;
52
+ /**
53
+ * Check if NavGator has been set up for a project
54
+ */
55
+ export declare function isSetupComplete(projectPath?: string): Promise<{
56
+ hasScanned: boolean;
57
+ lastScan?: Date;
58
+ phase?: 'fast' | 'deep';
59
+ stale: boolean;
60
+ }>;
61
+ /**
62
+ * Get setup status for display
63
+ */
64
+ export declare function formatSetupStatus(result: SetupResult): string;
65
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmI5E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAM1E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC,CAuBD;AAyDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsC7D"}