@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,617 @@
1
+ /**
2
+ * Prompt Detector
3
+ *
4
+ * Detects AI prompt patterns in source code using regex patterns.
5
+ * For more accurate detection, use the AST-based extractor.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { glob } from 'glob';
10
+ import { MAX_PROMPT_LENGTH, } from './types.js';
11
+ // =============================================================================
12
+ // DETECTION PATTERNS
13
+ // =============================================================================
14
+ /**
15
+ * Patterns for detecting AI API calls
16
+ */
17
+ export const AI_CALL_PATTERNS = [
18
+ // Anthropic/Claude
19
+ {
20
+ name: 'anthropic-messages',
21
+ provider: 'anthropic',
22
+ patterns: [
23
+ /anthropic\.messages\.create\s*\(/,
24
+ /client\.messages\.create\s*\(/,
25
+ /claude\.messages\.create\s*\(/,
26
+ /Anthropic\s*\(\s*\)\.messages\.create/,
27
+ ],
28
+ },
29
+ {
30
+ name: 'anthropic-completions',
31
+ provider: 'anthropic',
32
+ patterns: [
33
+ /anthropic\.completions\.create\s*\(/,
34
+ /client\.completions\.create\s*\(/,
35
+ ],
36
+ },
37
+ // OpenAI
38
+ {
39
+ name: 'openai-chat',
40
+ provider: 'openai',
41
+ patterns: [
42
+ /openai\.chat\.completions\.create\s*\(/,
43
+ /client\.chat\.completions\.create\s*\(/,
44
+ /ChatCompletion\.create\s*\(/,
45
+ ],
46
+ },
47
+ {
48
+ name: 'openai-completions',
49
+ provider: 'openai',
50
+ patterns: [
51
+ /openai\.completions\.create\s*\(/,
52
+ /Completion\.create\s*\(/,
53
+ ],
54
+ },
55
+ // Azure OpenAI
56
+ {
57
+ name: 'azure-openai',
58
+ provider: 'azure',
59
+ patterns: [
60
+ /AzureOpenAI\s*\(/,
61
+ /azure_endpoint/,
62
+ ],
63
+ },
64
+ // Google AI
65
+ {
66
+ name: 'google-gemini',
67
+ provider: 'google',
68
+ patterns: [
69
+ /genai\.GenerativeModel/,
70
+ /model\.generate_content/,
71
+ /gemini-pro/,
72
+ ],
73
+ },
74
+ ];
75
+ /**
76
+ * Patterns for detecting prompt definitions
77
+ */
78
+ export const PROMPT_DEFINITION_PATTERNS = [
79
+ // Message arrays
80
+ /messages\s*[=:]\s*\[/,
81
+ /messages\s*:\s*\[/,
82
+ // System prompts
83
+ /system_prompt\s*[=:]\s*[`'"]/i,
84
+ /SYSTEM_PROMPT\s*[=:]\s*[`'"]/,
85
+ /systemPrompt\s*[=:]\s*[`'"]/,
86
+ // Generic prompt variables
87
+ /(?:const|let|var)\s+(\w*[Pp]rompt\w*)\s*=\s*[`'"]/,
88
+ /(?:const|let|var)\s+(\w*[Ii]nstruction\w*)\s*=\s*[`'"]/,
89
+ // Python style
90
+ /^(?:PROMPT|SYSTEM_PROMPT|USER_PROMPT)\s*=\s*(?:"""|\\'\\'\\'|")/m,
91
+ ];
92
+ /**
93
+ * Patterns for detecting template variables
94
+ */
95
+ export const TEMPLATE_VARIABLE_PATTERNS = [
96
+ // JavaScript template literals
97
+ /\$\{(\w+)\}/g,
98
+ // Jinja2 / Mustache
99
+ /\{\{\s*(\w+)\s*\}\}/g,
100
+ // Python f-strings (captured in context)
101
+ /\{(\w+)\}/g,
102
+ // Handlebars-style
103
+ /\{\{\{\s*(\w+)\s*\}\}\}/g,
104
+ ];
105
+ /**
106
+ * Detects prompts in source files using regex patterns
107
+ */
108
+ export class PromptDetector {
109
+ options;
110
+ constructor(options = {}) {
111
+ this.options = {
112
+ maxPromptLength: options.maxPromptLength ?? MAX_PROMPT_LENGTH,
113
+ includeRawContent: options.includeRawContent ?? true,
114
+ detectVariables: options.detectVariables ?? true,
115
+ };
116
+ }
117
+ /**
118
+ * Scan a project for prompts
119
+ */
120
+ async scanProject(projectRoot) {
121
+ const prompts = [];
122
+ const warnings = [];
123
+ // Find source files
124
+ const sourceFiles = await glob('**/*.{ts,tsx,js,jsx,py}', {
125
+ cwd: projectRoot,
126
+ ignore: [
127
+ 'node_modules/**',
128
+ 'dist/**',
129
+ 'build/**',
130
+ '.next/**',
131
+ '__pycache__/**',
132
+ 'venv/**',
133
+ '.git/**',
134
+ '*.min.js',
135
+ '*.bundle.js',
136
+ ],
137
+ });
138
+ for (const file of sourceFiles) {
139
+ try {
140
+ const filePath = path.join(projectRoot, file);
141
+ const content = await fs.promises.readFile(filePath, 'utf-8');
142
+ const filePrompts = this.detectInFile(file, content);
143
+ prompts.push(...filePrompts);
144
+ }
145
+ catch (error) {
146
+ warnings.push({
147
+ type: 'parse_error',
148
+ message: `Failed to read ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`,
149
+ file,
150
+ });
151
+ }
152
+ }
153
+ return { prompts, warnings };
154
+ }
155
+ /**
156
+ * Detect prompts in a single file
157
+ */
158
+ detectInFile(filePath, content) {
159
+ const prompts = [];
160
+ const lines = content.split('\n');
161
+ // Track AI API calls to link prompts to providers
162
+ const apiCalls = this.findAPICalls(content, lines);
163
+ // Find prompt definitions
164
+ const promptMatches = this.findPromptDefinitions(content, lines);
165
+ for (const match of promptMatches) {
166
+ const prompt = this.buildPromptFromMatch(filePath, lines, match, apiCalls);
167
+ if (prompt) {
168
+ prompts.push(prompt);
169
+ }
170
+ }
171
+ return prompts;
172
+ }
173
+ /**
174
+ * Find AI API calls in the file
175
+ */
176
+ findAPICalls(content, lines) {
177
+ const calls = [];
178
+ for (const pattern of AI_CALL_PATTERNS) {
179
+ for (const regex of pattern.patterns) {
180
+ for (let i = 0; i < lines.length; i++) {
181
+ if (regex.test(lines[i])) {
182
+ calls.push({
183
+ line: i + 1,
184
+ provider: pattern.provider,
185
+ pattern: pattern.name,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ }
191
+ return calls;
192
+ }
193
+ /**
194
+ * Find prompt definitions in content
195
+ */
196
+ findPromptDefinitions(content, lines) {
197
+ const matches = [];
198
+ for (let i = 0; i < lines.length; i++) {
199
+ const line = lines[i];
200
+ // Check for messages array
201
+ if (/messages\s*[=:]\s*\[/.test(line)) {
202
+ const endLine = this.findArrayEnd(lines, i);
203
+ matches.push({
204
+ lineStart: i + 1,
205
+ lineEnd: endLine + 1,
206
+ type: 'messages',
207
+ });
208
+ continue;
209
+ }
210
+ // Check for prompt variable definitions
211
+ const varMatch = line.match(/(?:const|let|var)\s+(\w*[Pp]rompt\w*|\w*[Ii]nstruction\w*|SYSTEM_PROMPT|USER_PROMPT)\s*=\s*([`'"])/);
212
+ if (varMatch) {
213
+ const varName = varMatch[1];
214
+ const quote = varMatch[2];
215
+ const endLine = this.findStringEnd(lines, i, quote);
216
+ matches.push({
217
+ lineStart: i + 1,
218
+ lineEnd: endLine + 1,
219
+ type: quote === '`' ? 'template' : 'string',
220
+ name: varName,
221
+ });
222
+ continue;
223
+ }
224
+ // Check for Python multi-line strings
225
+ if (/^(?:PROMPT|SYSTEM_PROMPT|USER_PROMPT)\s*=\s*(?:"""|'''|f"""|f''')/.test(line)) {
226
+ const varMatch = line.match(/^(\w+)\s*=/);
227
+ const endLine = this.findPythonStringEnd(lines, i);
228
+ matches.push({
229
+ lineStart: i + 1,
230
+ lineEnd: endLine + 1,
231
+ type: 'template',
232
+ name: varMatch?.[1],
233
+ });
234
+ }
235
+ }
236
+ return matches;
237
+ }
238
+ /**
239
+ * Find the end of an array definition
240
+ */
241
+ findArrayEnd(lines, startLine) {
242
+ let depth = 0;
243
+ let inString = false;
244
+ let stringChar = '';
245
+ for (let i = startLine; i < lines.length; i++) {
246
+ const line = lines[i];
247
+ for (let j = 0; j < line.length; j++) {
248
+ const char = line[j];
249
+ const prevChar = j > 0 ? line[j - 1] : '';
250
+ // Handle string boundaries
251
+ if ((char === '"' || char === "'" || char === '`') && prevChar !== '\\') {
252
+ if (!inString) {
253
+ inString = true;
254
+ stringChar = char;
255
+ }
256
+ else if (char === stringChar) {
257
+ inString = false;
258
+ }
259
+ continue;
260
+ }
261
+ if (inString)
262
+ continue;
263
+ if (char === '[' || char === '{')
264
+ depth++;
265
+ if (char === ']' || char === '}')
266
+ depth--;
267
+ if (depth === 0 && char === ']') {
268
+ return i;
269
+ }
270
+ }
271
+ }
272
+ return Math.min(startLine + 50, lines.length - 1);
273
+ }
274
+ /**
275
+ * Find the end of a string definition
276
+ */
277
+ findStringEnd(lines, startLine, quote) {
278
+ if (quote === '`') {
279
+ // Template literal - find closing backtick
280
+ for (let i = startLine; i < lines.length; i++) {
281
+ const line = lines[i];
282
+ const startIdx = i === startLine ? line.indexOf('`') + 1 : 0;
283
+ for (let j = startIdx; j < line.length; j++) {
284
+ if (line[j] === '`' && line[j - 1] !== '\\') {
285
+ return i;
286
+ }
287
+ }
288
+ }
289
+ }
290
+ else {
291
+ // Single line string
292
+ return startLine;
293
+ }
294
+ return startLine;
295
+ }
296
+ /**
297
+ * Find the end of a Python multi-line string
298
+ */
299
+ findPythonStringEnd(lines, startLine) {
300
+ const line = lines[startLine];
301
+ const tripleQuote = line.includes('"""') ? '"""' : "'''";
302
+ // Check if it closes on the same line
303
+ const firstIdx = line.indexOf(tripleQuote);
304
+ const secondIdx = line.indexOf(tripleQuote, firstIdx + 3);
305
+ if (secondIdx !== -1) {
306
+ return startLine;
307
+ }
308
+ // Find closing triple quote
309
+ for (let i = startLine + 1; i < lines.length; i++) {
310
+ if (lines[i].includes(tripleQuote)) {
311
+ return i;
312
+ }
313
+ }
314
+ return Math.min(startLine + 50, lines.length - 1);
315
+ }
316
+ /**
317
+ * Build a DetectedPrompt from a match
318
+ */
319
+ buildPromptFromMatch(filePath, lines, match, apiCalls) {
320
+ const { lineStart, lineEnd, type, name } = match;
321
+ // Extract content
322
+ const contentLines = lines.slice(lineStart - 1, lineEnd);
323
+ const rawContent = contentLines.join('\n');
324
+ // Find containing function
325
+ const functionName = this.findContainingFunction(lines, lineStart - 1);
326
+ // Find nearest API call to determine provider
327
+ const nearestCall = this.findNearestAPICall(apiCalls, lineStart);
328
+ // Extract messages if it's a messages array
329
+ const messages = type === 'messages'
330
+ ? this.extractMessages(rawContent)
331
+ : this.extractSingleMessage(rawContent);
332
+ // Detect variables
333
+ const variables = this.options.detectVariables
334
+ ? this.detectVariables(rawContent)
335
+ : [];
336
+ // Determine purpose from comments and content
337
+ const purpose = this.extractPurpose(lines, lineStart - 1, rawContent);
338
+ // Generate ID
339
+ const id = this.generatePromptId(filePath, lineStart, name);
340
+ // Truncate content if needed
341
+ const truncated = rawContent.length > this.options.maxPromptLength;
342
+ const storedContent = truncated
343
+ ? rawContent.slice(0, this.options.maxPromptLength)
344
+ : rawContent;
345
+ return {
346
+ id,
347
+ name: name || this.generatePromptName(filePath, functionName, lineStart),
348
+ location: {
349
+ file: filePath,
350
+ lineStart,
351
+ lineEnd,
352
+ functionName,
353
+ },
354
+ messages,
355
+ rawContent: this.options.includeRawContent ? storedContent : undefined,
356
+ isTemplate: variables.length > 0,
357
+ variables,
358
+ templateSyntax: this.detectTemplateSyntax(rawContent),
359
+ provider: nearestCall ? {
360
+ provider: nearestCall.provider,
361
+ } : undefined,
362
+ usedBy: nearestCall ? [{
363
+ file: filePath,
364
+ line: nearestCall.line,
365
+ functionName,
366
+ callPattern: nearestCall.pattern,
367
+ isAsync: true,
368
+ hasStreaming: rawContent.includes('stream'),
369
+ }] : [],
370
+ purpose,
371
+ tags: this.generateTags(rawContent, messages),
372
+ category: this.detectCategory(rawContent, messages),
373
+ confidence: this.calculateConfidence(messages, nearestCall),
374
+ detectionMethod: 'regex',
375
+ timestamp: Date.now(),
376
+ };
377
+ }
378
+ /**
379
+ * Extract messages from a messages array
380
+ */
381
+ extractMessages(content) {
382
+ const messages = [];
383
+ // Match message objects
384
+ const messagePattern = /\{\s*role\s*:\s*['"](\w+)['"]\s*,\s*content\s*:\s*([`'"])([\s\S]*?)\2\s*\}/g;
385
+ let match;
386
+ while ((match = messagePattern.exec(content)) !== null) {
387
+ const role = match[1];
388
+ let msgContent = match[3];
389
+ // Truncate if too long
390
+ const truncated = msgContent.length > this.options.maxPromptLength;
391
+ if (truncated) {
392
+ msgContent = msgContent.slice(0, this.options.maxPromptLength);
393
+ }
394
+ messages.push({
395
+ role,
396
+ content: msgContent,
397
+ truncated,
398
+ originalLength: truncated ? match[3].length : undefined,
399
+ });
400
+ }
401
+ return messages;
402
+ }
403
+ /**
404
+ * Extract a single message from string content
405
+ */
406
+ extractSingleMessage(content) {
407
+ // Extract the string content
408
+ const stringMatch = content.match(/=\s*([`'"])([\s\S]*?)\1/);
409
+ if (!stringMatch)
410
+ return [];
411
+ let msgContent = stringMatch[2];
412
+ const truncated = msgContent.length > this.options.maxPromptLength;
413
+ if (truncated) {
414
+ msgContent = msgContent.slice(0, this.options.maxPromptLength);
415
+ }
416
+ // Determine role from variable name
417
+ const isSystem = /system/i.test(content);
418
+ return [{
419
+ role: isSystem ? 'system' : 'user',
420
+ content: msgContent,
421
+ truncated,
422
+ originalLength: truncated ? stringMatch[2].length : undefined,
423
+ }];
424
+ }
425
+ /**
426
+ * Detect template variables in content
427
+ */
428
+ detectVariables(content) {
429
+ const variables = [];
430
+ const seen = new Set();
431
+ for (const pattern of TEMPLATE_VARIABLE_PATTERNS) {
432
+ let match;
433
+ const regex = new RegExp(pattern.source, pattern.flags);
434
+ while ((match = regex.exec(content)) !== null) {
435
+ const name = match[1];
436
+ if (!seen.has(name)) {
437
+ seen.add(name);
438
+ variables.push({
439
+ name,
440
+ pattern: match[0],
441
+ type: 'unknown',
442
+ });
443
+ }
444
+ }
445
+ }
446
+ return variables;
447
+ }
448
+ /**
449
+ * Find the containing function for a line
450
+ */
451
+ findContainingFunction(lines, lineIndex) {
452
+ for (let i = lineIndex; i >= Math.max(0, lineIndex - 30); i--) {
453
+ const line = lines[i];
454
+ // JavaScript/TypeScript patterns
455
+ const jsMatch = line.match(/(?:async\s+)?(?:function\s+)?(\w+)\s*(?:=\s*(?:async\s*)?\(|[\(:])/);
456
+ if (jsMatch)
457
+ return jsMatch[1];
458
+ const arrowMatch = line.match(/(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\(/);
459
+ if (arrowMatch)
460
+ return arrowMatch[1];
461
+ const methodMatch = line.match(/(?:async\s+)?(\w+)\s*\([^)]*\)\s*[:{]/);
462
+ if (methodMatch)
463
+ return methodMatch[1];
464
+ // Python patterns
465
+ const pyMatch = line.match(/(?:async\s+)?def\s+(\w+)\s*\(/);
466
+ if (pyMatch)
467
+ return pyMatch[1];
468
+ }
469
+ return undefined;
470
+ }
471
+ /**
472
+ * Find nearest API call to a line
473
+ */
474
+ findNearestAPICall(apiCalls, promptLine) {
475
+ let nearest;
476
+ let minDistance = Infinity;
477
+ for (const call of apiCalls) {
478
+ const distance = Math.abs(call.line - promptLine);
479
+ // Prefer calls after the prompt (where it's used)
480
+ const adjustedDistance = call.line >= promptLine ? distance : distance + 100;
481
+ if (adjustedDistance < minDistance) {
482
+ minDistance = adjustedDistance;
483
+ nearest = call;
484
+ }
485
+ }
486
+ // Only return if reasonably close (within 50 lines)
487
+ return minDistance < 150 ? nearest : undefined;
488
+ }
489
+ /**
490
+ * Extract purpose from comments near the prompt
491
+ */
492
+ extractPurpose(lines, lineIndex, content) {
493
+ // Look for comments above the prompt
494
+ for (let i = lineIndex - 1; i >= Math.max(0, lineIndex - 5); i--) {
495
+ const line = lines[i].trim();
496
+ // JSDoc style
497
+ if (line.startsWith('*') && !line.startsWith('*/')) {
498
+ const comment = line.replace(/^\*\s*/, '').trim();
499
+ if (comment && !comment.startsWith('@')) {
500
+ return comment;
501
+ }
502
+ }
503
+ // Single line comment
504
+ if (line.startsWith('//') || line.startsWith('#')) {
505
+ const comment = line.replace(/^[/#]+\s*/, '').trim();
506
+ if (comment) {
507
+ return comment;
508
+ }
509
+ }
510
+ }
511
+ // Try to extract from content itself
512
+ if (content.includes('You are')) {
513
+ const match = content.match(/You are (?:a |an )?([^.!?\n]{10,60})/);
514
+ if (match)
515
+ return `AI assistant: ${match[1]}`;
516
+ }
517
+ return undefined;
518
+ }
519
+ /**
520
+ * Detect template syntax used
521
+ */
522
+ detectTemplateSyntax(content) {
523
+ if (/\$\{/.test(content))
524
+ return 'template-literal';
525
+ if (/\{\{[^{]/.test(content))
526
+ return 'jinja2';
527
+ if (/\{\{\{/.test(content))
528
+ return 'mustache';
529
+ if (/f['"]/.test(content) || /f"""/.test(content))
530
+ return 'fstring';
531
+ if (/\{[a-zA-Z_]\w*\}/.test(content))
532
+ return 'fstring';
533
+ return undefined;
534
+ }
535
+ /**
536
+ * Generate tags from content
537
+ */
538
+ generateTags(content, messages) {
539
+ const tags = [];
540
+ const lowerContent = content.toLowerCase();
541
+ if (messages.some(m => m.role === 'system'))
542
+ tags.push('has-system-prompt');
543
+ if (lowerContent.includes('json'))
544
+ tags.push('json-output');
545
+ if (lowerContent.includes('step by step') || lowerContent.includes('step-by-step'))
546
+ tags.push('chain-of-thought');
547
+ if (lowerContent.includes('tool') || lowerContent.includes('function'))
548
+ tags.push('tool-use');
549
+ if (lowerContent.includes('example'))
550
+ tags.push('few-shot');
551
+ if (/\{[\w_]+\}/.test(content))
552
+ tags.push('templated');
553
+ return tags;
554
+ }
555
+ /**
556
+ * Detect prompt category
557
+ */
558
+ detectCategory(content, messages) {
559
+ const lowerContent = content.toLowerCase();
560
+ if (lowerContent.includes('summarize') || lowerContent.includes('summary'))
561
+ return 'summarization';
562
+ if (lowerContent.includes('extract') || lowerContent.includes('parse'))
563
+ return 'extraction';
564
+ if (lowerContent.includes('classify') || lowerContent.includes('categorize'))
565
+ return 'classification';
566
+ if (lowerContent.includes('translate'))
567
+ return 'translation';
568
+ if (lowerContent.includes('code') && (lowerContent.includes('write') || lowerContent.includes('generate')))
569
+ return 'code-generation';
570
+ if (lowerContent.includes('review') && lowerContent.includes('code'))
571
+ return 'code-review';
572
+ if (lowerContent.includes('tool') || lowerContent.includes('function_call'))
573
+ return 'agent';
574
+ if (lowerContent.includes('embed'))
575
+ return 'embedding';
576
+ if (messages.length > 1 || lowerContent.includes('chat') || lowerContent.includes('conversation'))
577
+ return 'chat';
578
+ return 'unknown';
579
+ }
580
+ /**
581
+ * Calculate detection confidence
582
+ */
583
+ calculateConfidence(messages, apiCall) {
584
+ let confidence = 0.5; // Base confidence
585
+ if (messages.length > 0)
586
+ confidence += 0.2;
587
+ if (messages.some(m => m.role === 'system'))
588
+ confidence += 0.1;
589
+ if (apiCall)
590
+ confidence += 0.2;
591
+ return Math.min(confidence, 1.0);
592
+ }
593
+ /**
594
+ * Generate a unique prompt ID
595
+ */
596
+ generatePromptId(file, line, name) {
597
+ const hash = Buffer.from(`${file}:${line}:${name || ''}`).toString('base64').slice(0, 8);
598
+ return `PROMPT_${hash}`;
599
+ }
600
+ /**
601
+ * Generate a prompt name from context
602
+ */
603
+ generatePromptName(file, functionName, line) {
604
+ const baseName = path.basename(file, path.extname(file));
605
+ if (functionName) {
606
+ return `${functionName}_prompt`;
607
+ }
608
+ return `${baseName}_L${line}_prompt`;
609
+ }
610
+ }
611
+ /**
612
+ * Create a default detector instance
613
+ */
614
+ export function createDetector(options) {
615
+ return new PromptDetector(options);
616
+ }
617
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/scanners/prompts/detector.ts"],"names":[],"mappings":"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"}