@triedotdev/mcp 1.0.168 → 1.0.170

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 (149) hide show
  1. package/README.md +54 -500
  2. package/dist/chunk-2YXOBNKW.js +619 -0
  3. package/dist/chunk-2YXOBNKW.js.map +1 -0
  4. package/dist/chunk-QR64Y5TI.js +363 -0
  5. package/dist/chunk-QR64Y5TI.js.map +1 -0
  6. package/dist/cli/main.d.ts +0 -15
  7. package/dist/cli/main.js +356 -3100
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/index.js +2 -36
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/mcp-server.js +2 -36
  12. package/package.json +8 -31
  13. package/dist/autonomy-config-FSERX3O3.js +0 -30
  14. package/dist/autonomy-config-FSERX3O3.js.map +0 -1
  15. package/dist/chat-store-JNGNTDSN.js +0 -15
  16. package/dist/chat-store-JNGNTDSN.js.map +0 -1
  17. package/dist/chunk-2HF65EHQ.js +0 -311
  18. package/dist/chunk-2HF65EHQ.js.map +0 -1
  19. package/dist/chunk-43X6JBEM.js +0 -36
  20. package/dist/chunk-43X6JBEM.js.map +0 -1
  21. package/dist/chunk-4MXH2ZPT.js +0 -1827
  22. package/dist/chunk-4MXH2ZPT.js.map +0 -1
  23. package/dist/chunk-575YT2SD.js +0 -737
  24. package/dist/chunk-575YT2SD.js.map +0 -1
  25. package/dist/chunk-5BRRRTN6.js +0 -354
  26. package/dist/chunk-5BRRRTN6.js.map +0 -1
  27. package/dist/chunk-6NLHFIYA.js +0 -344
  28. package/dist/chunk-6NLHFIYA.js.map +0 -1
  29. package/dist/chunk-7WITSO22.js +0 -824
  30. package/dist/chunk-7WITSO22.js.map +0 -1
  31. package/dist/chunk-DGUM43GV.js +0 -11
  32. package/dist/chunk-DGUM43GV.js.map +0 -1
  33. package/dist/chunk-EFWVF6TI.js +0 -267
  34. package/dist/chunk-EFWVF6TI.js.map +0 -1
  35. package/dist/chunk-F6WFNUAY.js +0 -216
  36. package/dist/chunk-F6WFNUAY.js.map +0 -1
  37. package/dist/chunk-FQ45QP5A.js +0 -361
  38. package/dist/chunk-FQ45QP5A.js.map +0 -1
  39. package/dist/chunk-G2TGF6TR.js +0 -573
  40. package/dist/chunk-G2TGF6TR.js.map +0 -1
  41. package/dist/chunk-GTKYBOXL.js +0 -700
  42. package/dist/chunk-GTKYBOXL.js.map +0 -1
  43. package/dist/chunk-HVCDY3AK.js +0 -850
  44. package/dist/chunk-HVCDY3AK.js.map +0 -1
  45. package/dist/chunk-JVMBCWKS.js +0 -348
  46. package/dist/chunk-JVMBCWKS.js.map +0 -1
  47. package/dist/chunk-KDHN2ZQE.js +0 -313
  48. package/dist/chunk-KDHN2ZQE.js.map +0 -1
  49. package/dist/chunk-LQIMKE3P.js +0 -12524
  50. package/dist/chunk-LQIMKE3P.js.map +0 -1
  51. package/dist/chunk-ME2OERF5.js +0 -345
  52. package/dist/chunk-ME2OERF5.js.map +0 -1
  53. package/dist/chunk-MRHKX5M5.js +0 -662
  54. package/dist/chunk-MRHKX5M5.js.map +0 -1
  55. package/dist/chunk-OBQ74FOU.js +0 -27
  56. package/dist/chunk-OBQ74FOU.js.map +0 -1
  57. package/dist/chunk-OMR4YCBS.js +0 -987
  58. package/dist/chunk-OMR4YCBS.js.map +0 -1
  59. package/dist/chunk-Q5EKA5YA.js +0 -254
  60. package/dist/chunk-Q5EKA5YA.js.map +0 -1
  61. package/dist/chunk-Q63FFI6D.js +0 -132
  62. package/dist/chunk-Q63FFI6D.js.map +0 -1
  63. package/dist/chunk-SY6KQG44.js +0 -983
  64. package/dist/chunk-SY6KQG44.js.map +0 -1
  65. package/dist/chunk-T63OHG4Q.js +0 -440
  66. package/dist/chunk-T63OHG4Q.js.map +0 -1
  67. package/dist/chunk-TN5WEKWI.js +0 -173
  68. package/dist/chunk-TN5WEKWI.js.map +0 -1
  69. package/dist/chunk-VUL52BQL.js +0 -402
  70. package/dist/chunk-VUL52BQL.js.map +0 -1
  71. package/dist/chunk-VVITXIHN.js +0 -189
  72. package/dist/chunk-VVITXIHN.js.map +0 -1
  73. package/dist/chunk-WCN7S3EI.js +0 -14
  74. package/dist/chunk-WCN7S3EI.js.map +0 -1
  75. package/dist/chunk-XE6KQRKZ.js +0 -816
  76. package/dist/chunk-XE6KQRKZ.js.map +0 -1
  77. package/dist/chunk-XPZZFPBZ.js +0 -491
  78. package/dist/chunk-XPZZFPBZ.js.map +0 -1
  79. package/dist/chunk-XTFWT2XM.js +0 -727
  80. package/dist/chunk-XTFWT2XM.js.map +0 -1
  81. package/dist/chunk-YDHUCDHM.js +0 -4011
  82. package/dist/chunk-YDHUCDHM.js.map +0 -1
  83. package/dist/chunk-YZ6Y2H3P.js +0 -1289
  84. package/dist/chunk-YZ6Y2H3P.js.map +0 -1
  85. package/dist/chunk-ZJF5FTBX.js +0 -1396
  86. package/dist/chunk-ZJF5FTBX.js.map +0 -1
  87. package/dist/chunk-ZV2K6M7T.js +0 -74
  88. package/dist/chunk-ZV2K6M7T.js.map +0 -1
  89. package/dist/cli/create-agent.d.ts +0 -1
  90. package/dist/cli/create-agent.js +0 -1050
  91. package/dist/cli/create-agent.js.map +0 -1
  92. package/dist/cli/yolo-daemon.d.ts +0 -1
  93. package/dist/cli/yolo-daemon.js +0 -423
  94. package/dist/cli/yolo-daemon.js.map +0 -1
  95. package/dist/client-NJPZE5JT.js +0 -28
  96. package/dist/client-NJPZE5JT.js.map +0 -1
  97. package/dist/codebase-index-VAPF32XX.js +0 -12
  98. package/dist/codebase-index-VAPF32XX.js.map +0 -1
  99. package/dist/fast-analyzer-XXYMOXRK.js +0 -216
  100. package/dist/fast-analyzer-XXYMOXRK.js.map +0 -1
  101. package/dist/git-EO5SRFMN.js +0 -28
  102. package/dist/git-EO5SRFMN.js.map +0 -1
  103. package/dist/github-ingester-ZOKK6GRS.js +0 -11
  104. package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
  105. package/dist/goal-manager-YOB7VWK7.js +0 -25
  106. package/dist/goal-manager-YOB7VWK7.js.map +0 -1
  107. package/dist/goal-validator-ULKIBDPX.js +0 -24
  108. package/dist/goal-validator-ULKIBDPX.js.map +0 -1
  109. package/dist/graph-B3NA4S7I.js +0 -10
  110. package/dist/graph-B3NA4S7I.js.map +0 -1
  111. package/dist/hypothesis-7BFFT5JY.js +0 -23
  112. package/dist/hypothesis-7BFFT5JY.js.map +0 -1
  113. package/dist/incident-index-EFNUSGWL.js +0 -11
  114. package/dist/incident-index-EFNUSGWL.js.map +0 -1
  115. package/dist/insight-store-EC4PLSAW.js +0 -22
  116. package/dist/insight-store-EC4PLSAW.js.map +0 -1
  117. package/dist/issue-store-ZIRP23EP.js +0 -36
  118. package/dist/issue-store-ZIRP23EP.js.map +0 -1
  119. package/dist/ledger-TWZTGDFA.js +0 -58
  120. package/dist/ledger-TWZTGDFA.js.map +0 -1
  121. package/dist/linear-ingester-XXPAZZRW.js +0 -11
  122. package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
  123. package/dist/output-manager-RVJ37XKA.js +0 -13
  124. package/dist/output-manager-RVJ37XKA.js.map +0 -1
  125. package/dist/parse-goal-violation-SACGFG3C.js +0 -8
  126. package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
  127. package/dist/pattern-discovery-F7LU5K6E.js +0 -8
  128. package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
  129. package/dist/progress-SRQ2V3BP.js +0 -18
  130. package/dist/progress-SRQ2V3BP.js.map +0 -1
  131. package/dist/project-state-AHPA77SM.js +0 -28
  132. package/dist/project-state-AHPA77SM.js.map +0 -1
  133. package/dist/sync-M2FSWPBC.js +0 -12
  134. package/dist/sync-M2FSWPBC.js.map +0 -1
  135. package/dist/terminal-spawn-5YXDMUCF.js +0 -157
  136. package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
  137. package/dist/tiered-storage-Z3YCR465.js +0 -12
  138. package/dist/tiered-storage-Z3YCR465.js.map +0 -1
  139. package/dist/trie-agent-3YDPEGHJ.js +0 -28
  140. package/dist/trie-agent-3YDPEGHJ.js.map +0 -1
  141. package/dist/ui/chat.html +0 -1014
  142. package/dist/ui/goals.html +0 -967
  143. package/dist/ui/hypotheses.html +0 -1011
  144. package/dist/ui/ledger.html +0 -954
  145. package/dist/ui/nudges.html +0 -995
  146. package/dist/vibe-code-signatures-F6URTBW3.js +0 -16
  147. package/dist/vibe-code-signatures-F6URTBW3.js.map +0 -1
  148. package/dist/vulnerability-signatures-T7SKHORW.js +0 -18
  149. package/dist/vulnerability-signatures-T7SKHORW.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/ingest/agent-builder.ts","../../src/ingest/document-parser.ts","../../src/ingest/knowledge-compressor.ts","../../src/ingest/compression-prompts.ts","../../src/cli/create-agent.ts"],"sourcesContent":["/**\n * Agent Builder - Generates complete agent configs from compressed knowledge\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport type { \n DocumentParserResult, \n CompressedKnowledge, \n GeneratedAgentConfig,\n CreateAgentOptions,\n CreateAgentResult \n} from '../types/custom-agent.js';\nimport { parseDocument } from './document-parser.js';\nimport { compressKnowledge, generateAgentPrompts } from './knowledge-compressor.js';\nimport { mkdir, writeFile, readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\n\n/**\n * Build a complete agent from a document file\n */\nexport async function buildAgentFromDocument(\n options: CreateAgentOptions,\n verbose: boolean = true\n): Promise<CreateAgentResult> {\n const { filePath, agentName, category } = options;\n \n const log = verbose ? console.error.bind(console) : () => {};\n \n try {\n // Step 1: Parse the document\n log('📚 Parsing document...');\n const document = await parseDocument(filePath);\n log(` ├─ File type: ${document.metadata.fileType}`);\n log(` ├─ Words: ${document.metadata.wordCount.toLocaleString()}`);\n log(` └─ Sections: ${document.sections.length}`);\n \n // Step 2: Compress knowledge\n log('\\n🧠 Compressing knowledge...');\n const compressOptions: { agentName: string; category?: string; verbose: boolean } = {\n agentName,\n verbose,\n };\n if (category !== undefined) {\n compressOptions.category = category;\n }\n const knowledge = await compressKnowledge(document, compressOptions);\n log(` ├─ Core concepts: ${knowledge.coreConcepts.length}`);\n log(` ├─ Best practices: ${knowledge.bestPractices.length}`);\n log(` ├─ Anti-patterns: ${knowledge.antiPatterns.length}`);\n log(` └─ Detection rules: ${knowledge.detectionRules.length}`);\n \n // Step 3: Generate agent prompts\n log('\\n📝 Generating agent prompts...');\n const client = new Anthropic();\n const prompts = await generateAgentPrompts(\n client,\n knowledge,\n agentName,\n category || knowledge.domain\n );\n \n // Step 4: Build agent config\n log('\\n🤖 Building agent configuration...');\n const agentConfig = buildAgentConfig(\n document,\n knowledge,\n prompts,\n options\n );\n \n // Step 5: Save agent config\n const configPath = await saveAgentConfig(agentConfig);\n log(` └─ Saved to: ${configPath}`);\n \n return {\n success: true,\n agentName: agentConfig.name,\n configPath,\n stats: {\n documentWords: document.metadata.wordCount,\n conceptsExtracted: knowledge.coreConcepts.length,\n patternsGenerated: knowledge.detectionRules.length,\n compressionRatio: knowledge.sourceDocument.compressionRatio,\n },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log(`\\n❌ Error: ${errorMessage}`);\n \n return {\n success: false,\n agentName,\n configPath: '',\n stats: {\n documentWords: 0,\n conceptsExtracted: 0,\n patternsGenerated: 0,\n compressionRatio: 0,\n },\n error: errorMessage,\n };\n }\n}\n\n/**\n * Build the agent configuration object\n */\nfunction buildAgentConfig(\n document: DocumentParserResult,\n knowledge: CompressedKnowledge,\n prompts: { systemPrompt: string; analysisPrompt: string; fixPrompt: string },\n options: CreateAgentOptions\n): GeneratedAgentConfig {\n const { agentName, displayName, description, category } = options;\n const docTitle = document.metadata.title;\n \n // Determine activation rules based on domain\n const activationRules = buildActivationRules(knowledge);\n \n return {\n name: sanitizeAgentName(agentName),\n displayName: displayName || formatDisplayName(agentName),\n description: description || `Code review agent based on \"${document.metadata.title || agentName}\"`,\n version: '1.0.0',\n category: category || knowledge.domain,\n \n source: {\n type: 'document',\n originalFile: document.metadata.originalPath,\n fileType: document.metadata.fileType,\n compressedAt: new Date().toISOString(),\n ...(docTitle !== undefined && { documentTitle: docTitle }),\n },\n \n systemPrompt: prompts.systemPrompt,\n analysisPrompt: prompts.analysisPrompt,\n fixPrompt: prompts.fixPrompt,\n \n activationRules,\n patterns: knowledge.detectionRules,\n knowledge,\n };\n}\n\n/**\n * Build activation rules based on domain\n */\nfunction buildActivationRules(knowledge: CompressedKnowledge): GeneratedAgentConfig['activationRules'] {\n const domainRules: Record<string, Partial<GeneratedAgentConfig['activationRules']>> = {\n technical: {\n filePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx', '*.py', '*.go', '*.rs'],\n contextSignals: ['touchesUI', 'touchesAPI'],\n priority: 2,\n },\n legal: {\n filePatterns: ['*'],\n contextSignals: ['touchesUserData', 'touchesAuth', 'touchesPayments'],\n priority: 2,\n },\n policy: {\n filePatterns: ['*'],\n contextSignals: ['touchesAuth', 'touchesAPI', 'touchesDatabase'],\n priority: 3,\n },\n security: {\n filePatterns: ['*'],\n contextSignals: ['touchesAuth', 'touchesCrypto', 'touchesAPI', 'touchesDatabase'],\n priority: 1,\n },\n architecture: {\n filePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx', '*.py', '*.go'],\n contextSignals: ['touchesAPI', 'touchesDatabase'],\n priority: 2,\n },\n general: {\n filePatterns: ['*'],\n contextSignals: [],\n priority: 3,\n },\n };\n \n const domainDefaults = domainRules[knowledge.domain] ?? domainRules.general!;\n \n // Extract content patterns from detection rules\n const contentPatterns: string[] = [];\n for (const rule of knowledge.detectionRules) {\n if (rule.patterns.keywords) {\n contentPatterns.push(...rule.patterns.keywords.slice(0, 3));\n }\n }\n \n // Add patterns from core concepts\n for (const concept of knowledge.coreConcepts.slice(0, 5)) {\n if (concept.keywords) {\n contentPatterns.push(...concept.keywords.slice(0, 2));\n }\n }\n \n // Deduplicate\n const uniquePatterns = [...new Set(contentPatterns)].slice(0, 20);\n \n return {\n filePatterns: domainDefaults.filePatterns ?? ['*'],\n contentPatterns: uniquePatterns,\n contextSignals: domainDefaults.contextSignals ?? [],\n minConfidence: 0.3,\n priority: domainDefaults.priority ?? 2,\n };\n}\n\n/**\n * Save agent config to .trie/agents/\n */\nasync function saveAgentConfig(config: GeneratedAgentConfig): Promise<string> {\n const trieDir = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'agents');\n \n // Ensure directory exists\n await mkdir(trieDir, { recursive: true });\n \n const configPath = join(trieDir, `${config.name}.json`);\n await writeFile(configPath, JSON.stringify(config, null, 2));\n \n return configPath;\n}\n\n/**\n * Load an existing agent config\n */\nexport async function loadAgentConfig(name: string): Promise<GeneratedAgentConfig | null> {\n try {\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'agents', `${name}.json`);\n const content = await readFile(configPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * List all custom skills\n */\nexport async function listCustomAgents(): Promise<string[]> {\n try {\n const { readdir } = await import('fs/promises');\n const trieDir = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'agents');\n const files = await readdir(trieDir);\n return files\n .filter(f => f.endsWith('.json'))\n .map(f => f.replace('.json', ''));\n } catch {\n return [];\n }\n}\n\n/**\n * Sanitize agent name\n */\nfunction sanitizeAgentName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Format display name from agent name\n */\nfunction formatDisplayName(name: string): string {\n return name\n .split(/[-_]/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n","/**\n * Document Parser - Extracts text from TXT, MD, and RTF files\n */\n\nimport { readFile } from 'fs/promises';\nimport { extname, basename } from 'path';\nimport type { DocumentParserResult, DocumentSection, DocumentMetadata } from '../types/custom-agent.js';\n\n/**\n * Parse a document file and extract text content\n */\nexport async function parseDocument(filePath: string): Promise<DocumentParserResult> {\n const ext = extname(filePath).toLowerCase();\n const fileType = getFileType(ext);\n \n if (!fileType) {\n throw new Error(`Unsupported file type: ${ext}. Supported: .txt, .md, .rtf`);\n }\n \n let rawText: string;\n let metadata: Partial<DocumentMetadata> = {\n fileType,\n originalPath: filePath,\n parsedAt: new Date().toISOString(),\n };\n \n switch (fileType) {\n case 'txt':\n rawText = await parseTXT(filePath);\n break;\n \n case 'md':\n rawText = await parseMarkdown(filePath);\n break;\n \n case 'rtf':\n rawText = await parseRTF(filePath);\n break;\n \n default:\n throw new Error(`Unsupported file type: ${fileType}`);\n }\n \n // Count words\n metadata.wordCount = countWords(rawText);\n \n // Extract sections\n const sections = extractSections(rawText, fileType);\n \n // Try to extract title from content if not found\n if (!metadata.title) {\n metadata.title = extractTitle(rawText, sections) || basename(filePath, ext);\n }\n \n return {\n rawText,\n metadata: metadata as DocumentMetadata,\n sections,\n };\n}\n\nfunction getFileType(ext: string): 'txt' | 'md' | 'rtf' | null {\n const typeMap: Record<string, 'txt' | 'md' | 'rtf'> = {\n '.txt': 'txt',\n '.md': 'md',\n '.markdown': 'md',\n '.rtf': 'rtf',\n };\n return typeMap[ext] || null;\n}\n\n/**\n * Parse plain text files\n */\nasync function parseTXT(filePath: string): Promise<string> {\n return await readFile(filePath, 'utf-8');\n}\n\n/**\n * Parse Markdown files (strip some formatting for cleaner text)\n */\nasync function parseMarkdown(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf-8');\n \n // Keep the markdown mostly intact but clean up some elements\n return content\n // Remove horizontal rules\n .replace(/^[-*_]{3,}$/gm, '')\n // Clean up excessive whitespace\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\n/**\n * Parse RTF files (basic RTF stripping)\n */\nasync function parseRTF(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf-8');\n \n // Basic RTF to text conversion\n return stripRTF(content);\n}\n\n/**\n * Strip RTF formatting to get plain text\n */\nfunction stripRTF(rtf: string): string {\n // Remove RTF header\n let text = rtf.replace(/^{\\\\rtf1[^}]*}/i, '');\n \n // Remove RTF control words\n text = text.replace(/\\\\[a-z]+(-?\\d+)?[ ]?/gi, '');\n \n // Remove groups\n text = text.replace(/{[^{}]*}/g, '');\n \n // Handle special characters\n text = text\n .replace(/\\\\'([0-9a-f]{2})/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/\\\\par\\b/g, '\\n')\n .replace(/\\\\tab\\b/g, '\\t')\n .replace(/\\\\line\\b/g, '\\n')\n .replace(/[{}\\\\]/g, '');\n \n // Clean up whitespace\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n \n return text;\n}\n\n/**\n * Count words in text\n */\nfunction countWords(text: string): number {\n return text.split(/\\s+/).filter(word => word.length > 0).length;\n}\n\n/**\n * Extract sections/chapters from document\n */\nfunction extractSections(text: string, fileType: 'txt' | 'md' | 'rtf'): DocumentSection[] {\n const sections: DocumentSection[] = [];\n \n if (fileType === 'md') {\n // Parse Markdown headings\n const headingRegex = /^(#{1,6})\\s+(.+)$/gm;\n let match: RegExpExecArray | null;\n \n while ((match = headingRegex.exec(text)) !== null) {\n const level = match[1]!.length;\n const title = match[2]!.trim();\n const startIndex = match.index;\n \n // Close previous section\n if (sections.length > 0) {\n const lastSection = sections[sections.length - 1]!;\n lastSection.endIndex = startIndex;\n lastSection.content = text.slice(\n lastSection.startIndex,\n startIndex\n ).trim();\n }\n \n sections.push({\n title,\n level,\n startIndex,\n endIndex: text.length,\n content: '',\n });\n }\n \n // Set content for last section\n if (sections.length > 0) {\n const lastSection = sections[sections.length - 1]!;\n lastSection.content = text.slice(\n lastSection.startIndex\n ).trim();\n }\n } else {\n // For other formats, try to detect chapters/sections\n const chapterPatterns = [\n /^chapter\\s+(\\d+|[ivxlc]+)[:\\.\\s]+(.*)$/gim,\n /^section\\s+(\\d+|[ivxlc]+)[:\\.\\s]+(.*)$/gim,\n /^part\\s+(\\d+|[ivxlc]+)[:\\.\\s]+(.*)$/gim,\n /^(\\d+)\\.\\s+([A-Z][^.]+)$/gm,\n /^([A-Z][A-Z\\s]+)$/gm, // ALL CAPS headings\n ];\n \n for (const pattern of chapterPatterns) {\n let match: RegExpExecArray | null;\n pattern.lastIndex = 0;\n \n while ((match = pattern.exec(text)) !== null) {\n const title = match[2] || match[1] || match[0];\n \n sections.push({\n title: title.trim(),\n level: 1,\n startIndex: match.index,\n endIndex: text.length,\n content: '',\n });\n }\n \n if (sections.length > 0) break;\n }\n \n // Sort by position and calculate content\n sections.sort((a, b) => a.startIndex - b.startIndex);\n \n for (let i = 0; i < sections.length; i++) {\n const section = sections[i]!;\n const nextSection = sections[i + 1];\n const endIndex = nextSection !== undefined\n ? nextSection.startIndex \n : text.length;\n section.endIndex = endIndex;\n section.content = text.slice(section.startIndex, endIndex).trim();\n }\n }\n \n // If no sections found, create one for the whole document\n if (sections.length === 0) {\n sections.push({\n title: 'Document Content',\n level: 1,\n startIndex: 0,\n endIndex: text.length,\n content: text.trim(),\n });\n }\n \n return sections;\n}\n\n/**\n * Try to extract document title from content\n */\nfunction extractTitle(text: string, sections: DocumentSection[]): string | null {\n // Try first section heading\n const firstSection = sections[0];\n if (firstSection !== undefined && firstSection.title !== 'Document Content') {\n return firstSection.title;\n }\n \n // Try first line if it looks like a title\n const firstLine = text.split('\\n')[0]?.trim();\n if (firstLine && firstLine.length < 100 && !firstLine.includes('.')) {\n return firstLine;\n }\n \n return null;\n}\n\n/**\n * Chunk document into smaller pieces for processing\n */\nexport function chunkDocument(\n result: DocumentParserResult, \n maxChunkSize: number = 4000\n): string[] {\n const chunks: string[] = [];\n \n // If document is small enough, return as single chunk\n if (result.rawText.length <= maxChunkSize) {\n return [result.rawText];\n }\n \n // Try to chunk by sections first\n if (result.sections.length > 1) {\n let currentChunk = '';\n \n for (const section of result.sections) {\n const sectionText = `## ${section.title}\\n\\n${section.content}\\n\\n`;\n \n if (currentChunk.length + sectionText.length > maxChunkSize) {\n if (currentChunk) chunks.push(currentChunk.trim());\n \n // If section itself is too large, split it\n if (sectionText.length > maxChunkSize) {\n chunks.push(...splitByParagraphs(sectionText, maxChunkSize));\n currentChunk = '';\n } else {\n currentChunk = sectionText;\n }\n } else {\n currentChunk += sectionText;\n }\n }\n \n if (currentChunk) chunks.push(currentChunk.trim());\n } else {\n // Split by paragraphs\n chunks.push(...splitByParagraphs(result.rawText, maxChunkSize));\n }\n \n return chunks;\n}\n\n/**\n * Split text by paragraphs\n */\nfunction splitByParagraphs(text: string, maxSize: number): string[] {\n const chunks: string[] = [];\n const paragraphs = text.split(/\\n\\s*\\n/);\n let currentChunk = '';\n \n for (const para of paragraphs) {\n if (currentChunk.length + para.length + 2 > maxSize) {\n if (currentChunk) chunks.push(currentChunk.trim());\n \n // If paragraph itself is too large, split by sentences\n if (para.length > maxSize) {\n chunks.push(...splitBySentences(para, maxSize));\n currentChunk = '';\n } else {\n currentChunk = para;\n }\n } else {\n currentChunk += (currentChunk ? '\\n\\n' : '') + para;\n }\n }\n \n if (currentChunk) chunks.push(currentChunk.trim());\n return chunks;\n}\n\n/**\n * Split text by sentences\n */\nfunction splitBySentences(text: string, maxSize: number): string[] {\n const chunks: string[] = [];\n const sentences = text.match(/[^.!?]+[.!?]+/g) || [text];\n let currentChunk = '';\n \n for (const sentence of sentences) {\n if (currentChunk.length + sentence.length > maxSize) {\n if (currentChunk) chunks.push(currentChunk.trim());\n currentChunk = sentence;\n } else {\n currentChunk += sentence;\n }\n }\n \n if (currentChunk) chunks.push(currentChunk.trim());\n return chunks;\n}\n\n","/**\n * Knowledge Compressor - AI-powered knowledge extraction and compression\n */\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport { COMPRESSION_PROMPTS } from './compression-prompts.js';\nimport type { \n DocumentParserResult, \n CompressedKnowledge, \n CoreConcept, \n BestPractice, \n AntiPattern, \n DetectionRule \n} from '../types/custom-agent.js';\nimport { chunkDocument } from './document-parser.js';\n\ninterface ChunkExtraction {\n coreConcepts: CoreConcept[];\n bestPractices: BestPractice[];\n antiPatterns: AntiPattern[];\n codePatterns: {\n name: string;\n description: string;\n type: string;\n regexHint?: string;\n keywords: string[];\n }[];\n terminology: Record<string, string>;\n}\n\ninterface DomainDetection {\n domain: CompressedKnowledge['domain'];\n filePatterns: string[];\n contentPatterns: string[];\n contextSignals: string[];\n reasoning: string;\n}\n\n/**\n * Compress document knowledge using AI\n */\nexport async function compressKnowledge(\n document: DocumentParserResult,\n options: {\n agentName: string;\n category?: string;\n maxChunkSize?: number;\n verbose?: boolean;\n }\n): Promise<CompressedKnowledge> {\n const { agentName, maxChunkSize = 4000, verbose = false } = options;\n \n const client = new Anthropic();\n \n const log = verbose ? console.error.bind(console) : () => {};\n \n log('📚 Starting knowledge compression...');\n \n // Step 1: Detect domain\n log(' ├─ Detecting document domain...');\n const domainInfo = await detectDomain(client, document);\n log(` │ └─ Domain: ${domainInfo.domain}`);\n \n // Step 2: Chunk the document\n const chunks = chunkDocument(document, maxChunkSize);\n log(` ├─ Document chunked into ${chunks.length} pieces`);\n \n // Step 3: Extract knowledge from each chunk\n log(' ├─ Extracting knowledge from chunks...');\n const extractions: ChunkExtraction[] = [];\n \n for (let i = 0; i < chunks.length; i++) {\n log(` │ ├─ Processing chunk ${i + 1}/${chunks.length}...`);\n try {\n const chunk = chunks[i];\n if (chunk !== undefined) {\n const extraction = await extractFromChunk(client, chunk);\n extractions.push(extraction);\n }\n } catch (error) {\n log(` │ │ └─ Warning: Failed to extract from chunk ${i + 1}`);\n }\n }\n \n // Step 4: Merge extractions\n log(' ├─ Merging and deduplicating knowledge...');\n const mergedKnowledge = await mergeExtractions(client, extractions);\n \n // Step 5: Generate detection rules\n log(' ├─ Generating detection rules...');\n const detectionRules = await generateDetectionRules(\n client, \n mergedKnowledge, \n document.metadata.title || agentName,\n domainInfo.domain,\n agentName\n );\n log(` │ └─ Generated ${detectionRules.length} detection rules`);\n \n // Step 6: Generate summary\n log(' └─ Generating knowledge summary...');\n const summary = await generateSummary(client, document.rawText.slice(0, 8000));\n \n const compressed: CompressedKnowledge = {\n domain: domainInfo.domain,\n summary,\n coreConcepts: mergedKnowledge.coreConcepts,\n bestPractices: mergedKnowledge.bestPractices,\n antiPatterns: mergedKnowledge.antiPatterns,\n detectionRules,\n glossary: mergedKnowledge.terminology,\n sourceDocument: {\n title: document.metadata.title || agentName,\n wordCount: document.metadata.wordCount,\n compressionRatio: Math.round(document.metadata.wordCount / (summary.length + JSON.stringify(detectionRules).length / 5)),\n },\n };\n \n return compressed;\n}\n\n/**\n * Detect document domain\n */\nasync function detectDomain(\n client: Anthropic, \n document: DocumentParserResult\n): Promise<DomainDetection> {\n const sampleSize = Math.min(document.rawText.length, 3000);\n const sample = document.rawText.slice(0, sampleSize);\n \n const prompt = COMPRESSION_PROMPTS.detectDomain\n .replace('{{title}}', document.metadata.title || 'Unknown')\n .replace('{{sample}}', sample);\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 1000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n const text = firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n \n try {\n // Extract JSON from response\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[0]);\n }\n } catch (e) {\n // Fall back to defaults\n }\n \n return {\n domain: 'general',\n filePatterns: ['*'],\n contentPatterns: [],\n contextSignals: [],\n reasoning: 'Could not determine domain, using general',\n };\n}\n\n/**\n * Extract knowledge from a single chunk\n */\nasync function extractFromChunk(\n client: Anthropic, \n chunk: string\n): Promise<ChunkExtraction> {\n const prompt = COMPRESSION_PROMPTS.extractChunk.replace('{{chunk}}', chunk);\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n const text = firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n \n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n return {\n coreConcepts: parsed.coreConcepts || [],\n bestPractices: parsed.bestPractices || [],\n antiPatterns: parsed.antiPatterns || [],\n codePatterns: parsed.codePatterns || [],\n terminology: parsed.terminology || {},\n };\n }\n } catch (e) {\n // Return empty extraction\n }\n \n return {\n coreConcepts: [],\n bestPractices: [],\n antiPatterns: [],\n codePatterns: [],\n terminology: {},\n };\n}\n\n/**\n * Merge multiple extractions\n */\nasync function mergeExtractions(\n client: Anthropic,\n extractions: ChunkExtraction[]\n): Promise<ChunkExtraction> {\n // If only one or two extractions, just combine them\n if (extractions.length <= 2) {\n return combineExtractions(extractions);\n }\n \n // For larger sets, use AI to merge\n const prompt = COMPRESSION_PROMPTS.mergeKnowledge\n .replace('{{extractions}}', JSON.stringify(extractions, null, 2));\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 8000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n const text = firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n \n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[0]);\n }\n } catch (e) {\n // Fall back to simple combine\n }\n \n return combineExtractions(extractions);\n}\n\n/**\n * Simple combination of extractions\n */\nfunction combineExtractions(extractions: ChunkExtraction[]): ChunkExtraction {\n const combined: ChunkExtraction = {\n coreConcepts: [],\n bestPractices: [],\n antiPatterns: [],\n codePatterns: [],\n terminology: {},\n };\n \n const seenConcepts = new Set<string>();\n const seenPractices = new Set<string>();\n const seenAntiPatterns = new Set<string>();\n const seenPatterns = new Set<string>();\n \n for (const extraction of extractions) {\n for (const concept of extraction.coreConcepts) {\n const key = concept.name.toLowerCase();\n if (!seenConcepts.has(key)) {\n seenConcepts.add(key);\n combined.coreConcepts.push(concept);\n }\n }\n \n for (const practice of extraction.bestPractices) {\n const key = practice.name.toLowerCase();\n if (!seenPractices.has(key)) {\n seenPractices.add(key);\n combined.bestPractices.push(practice);\n }\n }\n \n for (const anti of extraction.antiPatterns) {\n const key = anti.name.toLowerCase();\n if (!seenAntiPatterns.has(key)) {\n seenAntiPatterns.add(key);\n combined.antiPatterns.push(anti);\n }\n }\n \n for (const pattern of extraction.codePatterns) {\n const key = pattern.name.toLowerCase();\n if (!seenPatterns.has(key)) {\n seenPatterns.add(key);\n combined.codePatterns.push(pattern);\n }\n }\n \n Object.assign(combined.terminology, extraction.terminology);\n }\n \n return combined;\n}\n\n/**\n * Generate detection rules from knowledge\n */\nasync function generateDetectionRules(\n client: Anthropic,\n knowledge: ChunkExtraction,\n title: string,\n domain: string,\n agentName: string\n): Promise<DetectionRule[]> {\n const prefix = agentName.toUpperCase().replace(/[^A-Z]/g, '').slice(0, 4) || 'CUST';\n \n const prompt = COMPRESSION_PROMPTS.generateDetectionRules\n .replace('{{knowledge}}', JSON.stringify(knowledge, null, 2))\n .replace('{{title}}', title)\n .replace('{{domain}}', domain)\n .replace('{{wordCount}}', String(knowledge.coreConcepts.length * 100))\n .replace(/\\{\\{prefix\\}\\}/g, prefix);\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 8000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n const text = firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n \n try {\n const jsonMatch = text.match(/\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n const rules = JSON.parse(jsonMatch[0]);\n // Validate and clean up rules\n return rules.map((rule: Partial<DetectionRule>, i: number) => ({\n id: rule.id || `${prefix}-${String(i + 1).padStart(3, '0')}`,\n name: rule.name || 'Unknown Rule',\n description: rule.description || '',\n severity: rule.severity || 'moderate',\n patterns: {\n regex: rule.patterns?.regex || [],\n keywords: rule.patterns?.keywords || [],\n semantic: rule.patterns?.semantic || '',\n },\n fix: {\n description: rule.fix?.description || 'Review and fix manually',\n example: rule.fix?.example || undefined,\n autoFixable: rule.fix?.autoFixable || false,\n },\n regulation: rule.regulation || undefined,\n category: rule.category || domain,\n }));\n }\n } catch (e) {\n console.error('Failed to parse detection rules:', e);\n }\n \n return [];\n}\n\n/**\n * Generate document summary\n */\nasync function generateSummary(client: Anthropic, content: string): Promise<string> {\n const prompt = COMPRESSION_PROMPTS.generateSummary\n .replace('{{content}}', content);\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 1000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n return firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n}\n\n/**\n * Generate agent prompts from knowledge\n */\nexport async function generateAgentPrompts(\n client: Anthropic,\n knowledge: CompressedKnowledge,\n agentName: string,\n category: string\n): Promise<{ systemPrompt: string; analysisPrompt: string; fixPrompt: string }> {\n const prompt = COMPRESSION_PROMPTS.generateAgentPrompts\n .replace('{{summary}}', knowledge.summary)\n .replace('{{concepts}}', JSON.stringify(knowledge.coreConcepts.slice(0, 10), null, 2))\n .replace('{{patterns}}', JSON.stringify(knowledge.detectionRules.slice(0, 10), null, 2))\n .replace('{{agentName}}', agentName)\n .replace('{{category}}', category)\n .replace('{{domain}}', knowledge.domain);\n \n const response = await client.messages.create({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4000,\n system: COMPRESSION_PROMPTS.system,\n messages: [{ role: 'user', content: prompt }],\n });\n \n const firstContent = response.content[0];\n const text = firstContent !== undefined && firstContent.type === 'text' ? firstContent.text : '';\n \n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[0]);\n }\n } catch (e) {\n // Return defaults\n }\n \n return {\n systemPrompt: `You are an expert code reviewer specializing in ${category}. Review code based on best practices and patterns from \"${agentName}\".`,\n analysisPrompt: `Review this code for issues related to ${category}:\\n\\n\\`\\`\\`{{language}}\\n{{code}}\\n\\`\\`\\`\\n\\nFile: {{filePath}}`,\n fixPrompt: `Fix this issue: {{issue}}\\n\\nCode:\\n\\`\\`\\`{{language}}\\n{{code}}\\n\\`\\`\\`\\n\\nFile: {{filePath}}`,\n };\n}\n\n","/**\n * Prompts for AI-powered knowledge compression\n */\n\nexport const COMPRESSION_PROMPTS = {\n /**\n * System prompt for the knowledge extractor\n */\n system: `You are an expert knowledge extraction system. Your job is to analyze documents and extract structured, actionable knowledge that can be used by a code review agent.\n\nYou must output valid JSON that matches the required schema exactly. Be thorough but concise - extract the essence of the knowledge without unnecessary verbosity.\n\nFocus on:\n1. Core concepts that are fundamental to understand the material\n2. Best practices that should be followed\n3. Anti-patterns and mistakes to avoid\n4. Detection patterns that could identify issues in code\n5. Key terminology and definitions`,\n\n /**\n * Prompt for extracting knowledge from a chunk\n */\n extractChunk: `Analyze this document chunk and extract structured knowledge.\n\n## Document Chunk:\n{{chunk}}\n\n## Instructions:\nExtract the following from this chunk:\n\n1. **Core Concepts**: Key ideas, principles, or rules that are taught\n2. **Best Practices**: Recommended approaches or patterns\n3. **Anti-Patterns**: Things to avoid, common mistakes\n4. **Code Patterns**: Any code patterns or detection rules that could identify issues\n5. **Terminology**: Important terms and their definitions\n\nOutput as JSON:\n{\n \"coreConcepts\": [\n {\n \"name\": \"string\",\n \"description\": \"string\",\n \"importance\": \"critical\" | \"important\" | \"supplementary\",\n \"keywords\": [\"string\"]\n }\n ],\n \"bestPractices\": [\n {\n \"name\": \"string\",\n \"description\": \"string\",\n \"rationale\": \"string\",\n \"codeExample\": \"string or null\"\n }\n ],\n \"antiPatterns\": [\n {\n \"name\": \"string\",\n \"description\": \"string\",\n \"whyBad\": \"string\",\n \"betterAlternative\": \"string\"\n }\n ],\n \"codePatterns\": [\n {\n \"name\": \"string\",\n \"description\": \"string\",\n \"type\": \"best-practice\" | \"anti-pattern\" | \"security\" | \"compliance\",\n \"regexHint\": \"string (a regex pattern that might detect this, or null)\",\n \"keywords\": [\"string\"]\n }\n ],\n \"terminology\": {\n \"term\": \"definition\"\n }\n}\n\nOnly include items that are clearly present in the chunk. Quality over quantity.`,\n\n /**\n * Prompt for merging extracted knowledge\n */\n mergeKnowledge: `Merge and deduplicate these knowledge extractions into a cohesive summary.\n\n## Extractions to Merge:\n{{extractions}}\n\n## Instructions:\n1. Combine similar concepts\n2. Remove duplicates\n3. Prioritize the most important items\n4. Ensure consistency in terminology\n5. Rank items by importance\n\nOutput a single merged JSON with the same structure, keeping only the most valuable and distinct items.\nLimit to top 20 core concepts, 15 best practices, 15 anti-patterns, and 25 code patterns.`,\n\n /**\n * Prompt for generating detection rules\n */\n generateDetectionRules: `Based on this knowledge base, generate detection rules for a code review agent.\n\n## Knowledge Base:\n{{knowledge}}\n\n## Document Context:\n- Title: {{title}}\n- Domain: {{domain}}\n- Word Count: {{wordCount}}\n\n## Instructions:\nFor each anti-pattern and best practice, generate detection rules that could find violations in code.\n\nFor each rule, provide:\n1. A unique ID (format: {{prefix}}-XXX)\n2. Clear name and description\n3. Severity (critical, serious, moderate, low, info)\n4. Detection patterns:\n - regex: Array of regex patterns (JavaScript-compatible)\n - keywords: Words that might indicate this issue\n - semantic: Natural language description for AI-based detection\n5. Fix information:\n - description: How to fix\n - example: Code example if applicable\n - autoFixable: boolean\n\nOutput as JSON array of detection rules:\n[\n {\n \"id\": \"string\",\n \"name\": \"string\",\n \"description\": \"string\",\n \"severity\": \"critical\" | \"serious\" | \"moderate\" | \"low\" | \"info\",\n \"patterns\": {\n \"regex\": [\"string\"],\n \"keywords\": [\"string\"],\n \"semantic\": \"string\"\n },\n \"fix\": {\n \"description\": \"string\",\n \"example\": \"string or null\",\n \"autoFixable\": boolean\n },\n \"regulation\": \"string or null (for legal/compliance rules)\",\n \"category\": \"string\"\n }\n]\n\nGenerate 15-30 detection rules prioritizing the most impactful issues.`,\n\n /**\n * Prompt for generating agent prompts\n */\n generateAgentPrompts: `Generate system and analysis prompts for a code review agent based on this knowledge.\n\n## Knowledge Base Summary:\n{{summary}}\n\n## Core Concepts:\n{{concepts}}\n\n## Detection Focus:\n{{patterns}}\n\n## Agent Info:\n- Name: {{agentName}}\n- Category: {{category}}\n- Domain: {{domain}}\n\n## Instructions:\nGenerate:\n1. A system prompt that gives the agent its persona and expertise\n2. An analysis prompt template for reviewing code\n3. A fix prompt template for suggesting fixes\n\nThe prompts should:\n- Reference the specific knowledge from the document\n- Be authoritative but helpful\n- Include the key concepts and terminology\n- Guide the agent to look for the specific patterns\n\nOutput as JSON:\n{\n \"systemPrompt\": \"string\",\n \"analysisPrompt\": \"string (use {{code}}, {{filePath}}, {{language}} as placeholders)\",\n \"fixPrompt\": \"string (use {{issue}}, {{code}}, {{filePath}} as placeholders)\"\n}`,\n\n /**\n * Prompt for detecting document domain\n */\n detectDomain: `Analyze this document and determine its primary domain/category.\n\n## Document Title:\n{{title}}\n\n## Sample Content:\n{{sample}}\n\n## Instructions:\nDetermine the primary domain of this document. Choose ONE:\n- \"technical\": Programming, frameworks, libraries, code patterns\n- \"legal\": Laws, regulations, compliance (GDPR, HIPAA, etc.)\n- \"policy\": Company policies, internal rules, guidelines\n- \"security\": Security practices, vulnerability prevention\n- \"architecture\": System design, patterns, architecture principles\n- \"general\": General knowledge, doesn't fit other categories\n\nAlso determine:\n1. What types of code/files this knowledge applies to\n2. What context signals should trigger this agent\n3. Key content patterns to look for\n\nOutput as JSON:\n{\n \"domain\": \"technical\" | \"legal\" | \"policy\" | \"security\" | \"architecture\" | \"general\",\n \"filePatterns\": [\"*.ext\", ...],\n \"contentPatterns\": [\"regex pattern\", ...],\n \"contextSignals\": [\"touchesAuth\", \"touchesUI\", ...],\n \"reasoning\": \"Brief explanation of why this domain was chosen\"\n}`,\n\n /**\n * Prompt for generating a summary\n */\n generateSummary: `Create a concise executive summary of this document for use in an AI agent's context.\n\n## Document:\n{{content}}\n\n## Instructions:\nWrite a 2-3 paragraph summary that:\n1. Explains what the document covers\n2. Highlights the most important takeaways\n3. Describes how this knowledge applies to code review\n\nThe summary will be used as context for an AI code review agent, so focus on actionable insights.\n\nKeep it under 500 words.`\n};\n\nexport type CompressionPromptKey = keyof typeof COMPRESSION_PROMPTS;\n\n","#!/usr/bin/env node\n/**\n * Trie Agent Creator CLI\n * \n * Create custom skills from TXT, MD, or RTF documents.\n * \n * Usage:\n * trie-create <file-path> <agent-name> [options]\n * \n * Examples:\n * trie-create ./react-guide.md react-fundamentals\n * trie-create ~/Documents/gdpr-guide.txt gdpr-compliance --category legal\n * \n * Drag & Drop:\n * Just drag a file to terminal and add the agent name:\n * trie-create /path/to/dropped/file.md my-agent\n */\n\nimport { buildAgentFromDocument } from '../ingest/agent-builder.js';\nimport { existsSync } from 'fs';\nimport { resolve, basename, extname } from 'path';\n\ninterface CLIOptions {\n filePath: string;\n agentName: string;\n displayName?: string;\n description?: string;\n category?: string;\n}\n\nfunction parseArgs(): CLIOptions | null {\n const args = process.argv.slice(2);\n \n // Show help\n if (args.length === 0 || args.includes('--help') || args.includes('-h')) {\n showHelp();\n return null;\n }\n \n // First arg is file path (handles drag & drop)\n let filePath = args[0];\n if (!filePath) {\n console.error('Error: Please provide a file path');\n showHelp();\n return null;\n }\n \n // Clean up path (remove quotes that might be added by drag & drop)\n filePath = filePath.replace(/^['\"]|['\"]$/g, '').trim();\n filePath = resolve(filePath);\n \n // Second arg is agent name (optional - will auto-generate if not provided)\n let agentName = args[1];\n if (!agentName || agentName.startsWith('--')) {\n // Auto-generate from filename\n const filename = basename(filePath, extname(filePath));\n agentName = filename\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n console.log(`Auto-generated agent name: ${agentName}`);\n }\n \n // Parse options\n const options: CLIOptions = {\n filePath,\n agentName,\n };\n \n for (let i = 2; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n \n switch (arg) {\n case '--display-name':\n case '-n':\n if (nextArg) options.displayName = nextArg;\n i++;\n break;\n case '--description':\n case '-d':\n if (nextArg) options.description = nextArg;\n i++;\n break;\n case '--category':\n case '-c':\n if (nextArg) options.category = nextArg;\n i++;\n break;\n }\n }\n \n return options;\n}\n\nfunction showHelp(): void {\n console.log(`\n📚 Trie Agent Creator\nCreate custom code review agents from documents.\n\nUsage:\n trie-create <file-path> [agent-name] [options]\n\nArguments:\n file-path Path to TXT, MD, or RTF file (drag & drop supported!)\n agent-name Name for the agent (optional - auto-generated from filename)\n\nOptions:\n --display-name, -n Friendly display name for the agent\n --description, -d Description of what the agent does\n --category, -c Category (react, security, compliance, architecture, etc.)\n --help, -h Show this help message\n\nExamples:\n # Basic usage\n trie-create ./react-guide.md react-fundamentals\n\n # With options\n trie-create ./gdpr-guide.txt gdpr-compliance --category legal\n\n # Auto-generate name from filename\n trie-create ./clean-code.txt\n\n # Drag & drop a file to terminal, then add name\n trie-create /Users/you/Downloads/my-guide.md my-agent\n\nSupported File Types:\n • Text (.txt) - Plain text files\n • Markdown (.md, .markdown)\n • RTF (.rtf) - Rich Text Format\n\nAfter Creation:\n The agent is saved to .trie/agents/<name>.json and will automatically\n activate during scans when it detects relevant code patterns.\n`);\n}\n\nasync function main(): Promise<void> {\n console.log('\\nTrie Agent Creator\\n');\n \n const options = parseArgs();\n if (!options) {\n process.exit(0);\n }\n \n // Validate file exists\n if (!existsSync(options.filePath)) {\n console.error(`File not found: ${options.filePath}`);\n console.error('\\nTip: Drag & drop the file directly into the terminal!');\n process.exit(1);\n }\n \n // Validate file type\n const ext = extname(options.filePath).toLowerCase();\n const supportedTypes = ['.txt', '.md', '.markdown', '.rtf'];\n if (!supportedTypes.includes(ext)) {\n console.error(`Unsupported file type: ${ext}`);\n console.error(` Supported types: ${supportedTypes.join(', ')}`);\n process.exit(1);\n }\n \n console.log(`File: ${options.filePath}`);\n console.log(`Agent: ${options.agentName}`);\n if (options.category) console.log(`Category: ${options.category}`);\n console.log('');\n \n try {\n const createOptions: Parameters<typeof buildAgentFromDocument>[0] = {\n filePath: options.filePath,\n agentName: options.agentName,\n };\n if (options.displayName) createOptions.displayName = options.displayName;\n if (options.description) createOptions.description = options.description;\n if (options.category) createOptions.category = options.category;\n \n const result = await buildAgentFromDocument(createOptions, true);\n \n if (result.success) {\n console.log('\\n' + '━'.repeat(50));\n console.log('Agent created successfully!');\n console.log('━'.repeat(50));\n console.log(`\\nConfig saved to: ${result.configPath}`);\n console.log(`\\nStats:`);\n console.log(` • Document words: ${result.stats.documentWords.toLocaleString()}`);\n console.log(` • Concepts extracted: ${result.stats.conceptsExtracted}`);\n console.log(` • Detection patterns: ${result.stats.patternsGenerated}`);\n console.log(` • Compression ratio: ${result.stats.compressionRatio}:1`);\n console.log('\\nThe agent will now activate during code scans!');\n console.log(' Run: trie watch to test it\\n');\n } else {\n console.error(`\\nFailed: ${result.error}`);\n process.exit(1);\n }\n } catch (error) {\n console.error(`\\nError: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n}\n\nmain();\n\n"],"mappings":"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","names":["Anthropic","readFile","Anthropic","basename","extname"]}
@@ -1 +0,0 @@
1
- #!/usr/bin/env node
@@ -1,423 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- InteractiveDashboard,
4
- StreamingManager,
5
- TrieWatchTool
6
- } from "../chunk-LQIMKE3P.js";
7
- import "../chunk-Q5EKA5YA.js";
8
- import "../chunk-JVMBCWKS.js";
9
- import "../chunk-4MXH2ZPT.js";
10
- import "../chunk-XTFWT2XM.js";
11
- import "../chunk-WCN7S3EI.js";
12
- import "../chunk-G2TGF6TR.js";
13
- import "../chunk-MRHKX5M5.js";
14
- import "../chunk-T63OHG4Q.js";
15
- import {
16
- isTrieInitialized
17
- } from "../chunk-YZ6Y2H3P.js";
18
- import "../chunk-5BRRRTN6.js";
19
- import "../chunk-OBQ74FOU.js";
20
- import "../chunk-XPZZFPBZ.js";
21
- import "../chunk-TN5WEKWI.js";
22
- import "../chunk-ZV2K6M7T.js";
23
- import "../chunk-7WITSO22.js";
24
- import "../chunk-SY6KQG44.js";
25
- import "../chunk-OMR4YCBS.js";
26
- import "../chunk-VUL52BQL.js";
27
- import "../chunk-6NLHFIYA.js";
28
- import "../chunk-575YT2SD.js";
29
- import "../chunk-FQ45QP5A.js";
30
- import "../chunk-XE6KQRKZ.js";
31
- import "../chunk-ZJF5FTBX.js";
32
- import "../chunk-GTKYBOXL.js";
33
- import "../chunk-EFWVF6TI.js";
34
- import "../chunk-43X6JBEM.js";
35
- import "../chunk-ME2OERF5.js";
36
- import {
37
- getWorkingDirectory
38
- } from "../chunk-VVITXIHN.js";
39
- import {
40
- isInteractiveMode,
41
- setInteractiveMode
42
- } from "../chunk-KDHN2ZQE.js";
43
- import "../chunk-2HF65EHQ.js";
44
- import "../chunk-DGUM43GV.js";
45
-
46
- // src/cli/yolo-daemon.ts
47
- import { watch, existsSync, statSync } from "fs";
48
- import { readdir } from "fs/promises";
49
- import { join, extname, basename, resolve } from "path";
50
- var WATCH_EXTENSIONS = /* @__PURE__ */ new Set([
51
- ".ts",
52
- ".tsx",
53
- ".js",
54
- ".jsx",
55
- ".mjs",
56
- ".vue",
57
- ".svelte",
58
- ".astro",
59
- ".py",
60
- ".go",
61
- ".rs"
62
- ]);
63
- var SKIP_DIRS = /* @__PURE__ */ new Set([
64
- "node_modules",
65
- ".git",
66
- "dist",
67
- "build",
68
- ".next",
69
- ".nuxt",
70
- "coverage",
71
- ".turbo",
72
- ".cache",
73
- "__pycache__",
74
- ".venv"
75
- ]);
76
- var WatchDaemon = class {
77
- config;
78
- stats;
79
- watchers = /* @__PURE__ */ new Map();
80
- pendingFiles = /* @__PURE__ */ new Set();
81
- debounceTimer = null;
82
- isProcessing = false;
83
- streamingManager = void 0;
84
- dashboard = void 0;
85
- trieWatchTool;
86
- constructor(config2) {
87
- this.config = config2;
88
- this.stats = {
89
- filesScanned: 0,
90
- issuesFound: 0,
91
- errors: 0,
92
- startTime: Date.now()
93
- };
94
- this.trieWatchTool = new TrieWatchTool();
95
- }
96
- /**
97
- * Start the daemon
98
- */
99
- async start() {
100
- const hasInteractiveTTY = process.stdout.isTTY === true && process.stdin.isTTY === true && typeof process.stdin.setRawMode === "function";
101
- if (this.config.interactive !== false && hasInteractiveTTY && !this.config.once) {
102
- setInteractiveMode(true);
103
- }
104
- if (!isTrieInitialized(this.config.directory)) {
105
- if (!isInteractiveMode()) {
106
- console.error("Trie is not initialized for this project.");
107
- console.error("Run `trie init` first.");
108
- }
109
- process.exit(1);
110
- }
111
- if (this.config.once) {
112
- console.log("Pre-commit mode detected - hook should query ledger directly");
113
- process.exit(0);
114
- }
115
- this.log("info", "Starting Trie Watch", {
116
- directory: this.config.directory,
117
- debounceMs: this.config.debounceMs
118
- });
119
- if (!isInteractiveMode()) {
120
- console.error("\nTrie is watching for goal violations.\n");
121
- }
122
- if (!existsSync(this.config.directory)) {
123
- this.log("error", "Directory not found", { directory: this.config.directory });
124
- process.exit(1);
125
- }
126
- if (isInteractiveMode()) {
127
- this.streamingManager = new StreamingManager();
128
- this.dashboard = new InteractiveDashboard();
129
- this.streamingManager.subscribe((update) => this.dashboard?.handleStreamUpdate(update));
130
- await this.dashboard.start();
131
- this.streamingManager.reportWatchStatus({
132
- watching: true,
133
- directories: 0,
134
- debounceMs: this.config.debounceMs
135
- });
136
- }
137
- await this.trieWatchTool.execute({
138
- action: "start",
139
- directory: this.config.directory,
140
- debounceMs: this.config.debounceMs
141
- });
142
- await this.watchDirectory(this.config.directory);
143
- this.streamingManager?.reportWatchStatus({
144
- watching: true,
145
- directories: this.watchers.size,
146
- debounceMs: this.config.debounceMs
147
- });
148
- this.log("info", "Watching for changes...", {
149
- directories: this.watchers.size
150
- });
151
- process.on("SIGINT", () => this.shutdown("SIGINT"));
152
- process.on("SIGTERM", () => this.shutdown("SIGTERM"));
153
- }
154
- /**
155
- * Watch a directory recursively
156
- */
157
- async watchDirectory(dir) {
158
- if (!existsSync(dir)) return;
159
- try {
160
- const stat = statSync(dir);
161
- if (!stat.isDirectory()) return;
162
- const dirName = basename(dir);
163
- if (SKIP_DIRS.has(dirName) || dirName.startsWith(".")) return;
164
- const watcher = watch(dir, { persistent: true }, (_eventType, filename) => {
165
- if (!filename) return;
166
- const fullPath = join(dir, filename);
167
- const ext = extname(filename).toLowerCase();
168
- if (!WATCH_EXTENSIONS.has(ext)) return;
169
- if (!existsSync(fullPath)) return;
170
- this.pendingFiles.add(fullPath);
171
- this.streamingManager?.reportWatchChange(fullPath);
172
- this.scheduleProcessing();
173
- });
174
- this.watchers.set(dir, watcher);
175
- const entries = await readdir(dir, { withFileTypes: true });
176
- for (const entry of entries) {
177
- if (entry.isDirectory()) {
178
- await this.watchDirectory(join(dir, entry.name));
179
- }
180
- }
181
- } catch (error) {
182
- }
183
- }
184
- /**
185
- * Schedule processing of pending files (debounced)
186
- */
187
- scheduleProcessing() {
188
- if (this.debounceTimer) {
189
- clearTimeout(this.debounceTimer);
190
- }
191
- this.debounceTimer = setTimeout(() => {
192
- this.processPendingFiles();
193
- }, this.config.debounceMs);
194
- }
195
- /**
196
- * Process all pending files
197
- */
198
- async processPendingFiles() {
199
- if (this.isProcessing || this.pendingFiles.size === 0) return;
200
- this.isProcessing = true;
201
- const files = Array.from(this.pendingFiles);
202
- this.pendingFiles.clear();
203
- this.log("info", "Processing changed files", {
204
- count: files.length,
205
- files: files.map((f) => basename(f))
206
- });
207
- try {
208
- const result = await this.trieWatchTool.execute({
209
- action: "status"
210
- });
211
- const statusMatch = result.content?.[0]?.text?.match(/Issues Found: (\d+)/);
212
- if (statusMatch && statusMatch[1]) {
213
- const issuesFound = parseInt(statusMatch[1], 10);
214
- this.stats.issuesFound += issuesFound;
215
- if (issuesFound > 0) {
216
- this.log("info", "Goal violations detected", {
217
- count: issuesFound,
218
- files: files.length
219
- });
220
- }
221
- }
222
- } catch (error) {
223
- this.log("error", "Failed to check for goal violations", {
224
- error: error instanceof Error ? error.message : String(error)
225
- });
226
- this.stats.errors++;
227
- }
228
- this.isProcessing = false;
229
- }
230
- /**
231
- * Log a message
232
- */
233
- log(level, message, data) {
234
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
235
- const uptime = Math.round((Date.now() - this.stats.startTime) / 1e3);
236
- if (!this.config.jsonOutput && isInteractiveMode()) {
237
- return;
238
- }
239
- if (this.config.jsonOutput) {
240
- console.log(JSON.stringify({
241
- timestamp,
242
- level,
243
- message,
244
- uptime,
245
- ...data,
246
- stats: this.stats
247
- }));
248
- } else {
249
- const levelEmoji = { info: "[i]", warn: "[!]", error: "[X]" }[level];
250
- const dataStr = data ? ` ${JSON.stringify(data)}` : "";
251
- console.log(`[${timestamp}] ${levelEmoji} ${message}${dataStr}`);
252
- }
253
- }
254
- /**
255
- * Graceful shutdown
256
- */
257
- async shutdown(signal) {
258
- this.log("info", "Shutting down", { signal, stats: this.stats });
259
- try {
260
- await this.trieWatchTool.execute({ action: "stop" });
261
- } catch (error) {
262
- }
263
- for (const watcher of this.watchers.values()) {
264
- watcher.close();
265
- }
266
- if (this.debounceTimer) {
267
- clearTimeout(this.debounceTimer);
268
- }
269
- if (this.streamingManager) {
270
- this.streamingManager.reportWatchStatus({
271
- watching: false,
272
- directories: 0
273
- });
274
- }
275
- if (this.dashboard) {
276
- this.dashboard.stop();
277
- }
278
- process.exit(0);
279
- }
280
- };
281
- function parseArgs() {
282
- const args = process.argv.slice(2);
283
- const config2 = {
284
- // Silent mode for initial workspace detection (TUI will handle display)
285
- directory: getWorkingDirectory(void 0, true),
286
- debounceMs: 1e3,
287
- jsonOutput: false,
288
- // Default to interactive mode for TTY terminals
289
- interactive: process.stdout.isTTY === true
290
- };
291
- for (let i = 0; i < args.length; i++) {
292
- const arg = args[i];
293
- const nextArg = args[i + 1];
294
- switch (arg) {
295
- case "--dir":
296
- case "-d":
297
- config2.directory = resolve(nextArg || ".");
298
- i++;
299
- break;
300
- case "--debounce":
301
- case "-D":
302
- config2.debounceMs = parseInt(nextArg || "1000", 10);
303
- i++;
304
- break;
305
- case "--json":
306
- config2.jsonOutput = true;
307
- break;
308
- case "--format":
309
- if (nextArg) {
310
- config2.format = nextArg === "json" ? "json" : "text";
311
- i++;
312
- }
313
- break;
314
- case "--output":
315
- if (nextArg) {
316
- config2.output = nextArg;
317
- i++;
318
- }
319
- break;
320
- case "--parallel":
321
- config2.parallel = true;
322
- break;
323
- case "--no-parallel":
324
- config2.parallel = false;
325
- break;
326
- case "--cache":
327
- config2.cache = true;
328
- break;
329
- case "--no-cache":
330
- config2.cache = false;
331
- break;
332
- case "--force-rescan":
333
- case "--force":
334
- config2.cache = false;
335
- break;
336
- case "--max-concurrency":
337
- config2.maxConcurrency = parseInt(nextArg || "4", 10);
338
- i++;
339
- break;
340
- case "--streaming":
341
- config2.streaming = true;
342
- break;
343
- case "--no-streaming":
344
- config2.streaming = false;
345
- break;
346
- case "--interactive":
347
- config2.interactive = true;
348
- break;
349
- case "--no-interactive":
350
- config2.interactive = false;
351
- break;
352
- case "--once":
353
- config2.interactive = false;
354
- config2.once = true;
355
- break;
356
- case "--staged-only":
357
- config2.stagedOnly = true;
358
- break;
359
- case "--fail-on":
360
- if (nextArg && ["never", "critical", "serious"].includes(nextArg)) {
361
- config2.failOn = nextArg;
362
- i++;
363
- }
364
- break;
365
- case "--workers":
366
- config2.workers = true;
367
- break;
368
- case "--no-workers":
369
- config2.workers = false;
370
- break;
371
- case "--timeout":
372
- config2.timeoutMs = parseInt(nextArg || "120000", 10);
373
- i++;
374
- break;
375
- case "--files":
376
- if (nextArg) {
377
- config2.files = nextArg.split(",").map((f) => f.trim()).filter(Boolean);
378
- i++;
379
- }
380
- break;
381
- case "--users":
382
- case "-u":
383
- config2.userCount = parseInt(nextArg || "250", 10);
384
- i++;
385
- break;
386
- case "--help":
387
- case "-h":
388
- console.log(`
389
- Trie Watch - File Watcher
390
-
391
- USAGE:
392
- trie watch [options] Watch for changes
393
-
394
- OPTIONS:
395
- --dir, -d <path> Directory to watch (default: current directory)
396
- --debounce, -D <ms> Debounce time in ms (default: 1000)
397
- --users, -u <count> User count for cost estimation (default: 250)
398
-
399
- OUTPUT:
400
- --json Output as JSON (for log aggregation)
401
-
402
- DISPLAY:
403
- --interactive Enable interactive dashboard (default for TTY)
404
- --no-interactive Disable interactive dashboard (for CI/scripts)
405
-
406
- EXAMPLES:
407
- trie watch # Watch current directory
408
- trie watch --no-interactive # CI mode: watch without dashboard
409
- `);
410
- process.exit(0);
411
- }
412
- }
413
- return config2;
414
- }
415
- var config = parseArgs();
416
- var daemon = new WatchDaemon(config);
417
- daemon.start().catch((error) => {
418
- if (!process.stdout.isTTY || process.argv.includes("--non-interactive")) {
419
- console.error("Failed to start daemon:", error);
420
- }
421
- process.exit(1);
422
- });
423
- //# sourceMappingURL=yolo-daemon.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/yolo-daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Watch - File Watcher\n * \n * Watches a directory for changes and checks for goal violations.\n * \n * Usage:\n * trie watch [options] # Watch for changes\n * \n * See `trie watch --help` for all options.\n */\n\nimport { watch, existsSync, statSync } from 'fs';\nimport { readdir } from 'fs/promises';\nimport { join, extname, basename, resolve } from 'path';\nimport { StreamingManager } from '../utils/streaming.js';\nimport { InteractiveDashboard } from './interactive-dashboard.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { isInteractiveMode, setInteractiveMode } from '../utils/progress.js';\nimport { isTrieInitialized } from '../utils/trie-init.js';\nimport { TrieWatchTool } from '../tools/watch.js';\n\n// File extensions to watch\nconst WATCH_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs',\n '.vue', '.svelte', '.astro',\n '.py', '.go', '.rs'\n]);\n\n// Directories to skip\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt',\n 'coverage', '.turbo', '.cache', '__pycache__', '.venv'\n]);\n\ninterface DaemonConfig {\n directory: string;\n debounceMs: number;\n jsonOutput: boolean;\n format?: 'text' | 'json';\n output?: string;\n parallel?: boolean;\n cache?: boolean;\n maxConcurrency?: number;\n streaming?: boolean;\n interactive?: boolean;\n workers?: boolean;\n timeoutMs?: number;\n files?: string[];\n /** User count for cost estimation (default: 250) */\n userCount?: number;\n /** Run once and exit (for pre-commit hooks) */\n once?: boolean;\n /** Only scan staged files (for pre-commit hooks) */\n stagedOnly?: boolean;\n /** Exit code to use on failure: 'never', 'critical', 'serious' */\n failOn?: 'never' | 'critical' | 'serious';\n}\n\ninterface DaemonStats {\n filesScanned: number;\n issuesFound: number;\n errors: number;\n startTime: number;\n}\n\nclass WatchDaemon {\n private config: DaemonConfig;\n private stats: DaemonStats;\n private watchers: Map<string, ReturnType<typeof watch>> = new Map();\n private pendingFiles: Set<string> = new Set();\n private debounceTimer: NodeJS.Timeout | null = null;\n private isProcessing = false;\n private streamingManager: StreamingManager | undefined = undefined;\n private dashboard: InteractiveDashboard | undefined = undefined;\n private trieWatchTool: TrieWatchTool;\n\n constructor(config: DaemonConfig) {\n this.config = config;\n this.stats = {\n filesScanned: 0,\n issuesFound: 0,\n errors: 0,\n startTime: Date.now()\n };\n this.trieWatchTool = new TrieWatchTool();\n }\n\n /**\n * Start the daemon\n */\n async start(): Promise<void> {\n // Enable global interactive mode only when:\n // 1. Both stdout AND stdin are TTY\n // 2. stdin supports setRawMode (required by Ink)\n // (git hooks/CI often have non-TTY stdin, and some terminals don't support raw mode)\n const hasInteractiveTTY =\n process.stdout.isTTY === true && \n process.stdin.isTTY === true &&\n typeof process.stdin.setRawMode === 'function';\n if (this.config.interactive !== false && hasInteractiveTTY && !this.config.once) {\n setInteractiveMode(true);\n }\n if (!isTrieInitialized(this.config.directory)) {\n if (!isInteractiveMode()) {\n console.error('Trie is not initialized for this project.');\n console.error('Run `trie init` first.');\n }\n process.exit(1);\n }\n\n // If in once mode (pre-commit hook), just exit - the hook itself queries the ledger\n if (this.config.once) {\n console.log('Pre-commit mode detected - hook should query ledger directly');\n process.exit(0);\n }\n\n this.log('info', 'Starting Trie Watch', {\n directory: this.config.directory,\n debounceMs: this.config.debounceMs\n });\n if (!isInteractiveMode()) {\n console.error('\\nTrie is watching for goal violations.\\n');\n }\n\n // Validate directory\n if (!existsSync(this.config.directory)) {\n this.log('error', 'Directory not found', { directory: this.config.directory });\n process.exit(1);\n }\n\n // Start interactive dashboard if enabled\n if (isInteractiveMode()) {\n this.streamingManager = new StreamingManager();\n this.dashboard = new InteractiveDashboard();\n this.streamingManager.subscribe(update => this.dashboard?.handleStreamUpdate(update));\n await this.dashboard.start();\n this.streamingManager.reportWatchStatus({\n watching: true,\n directories: 0,\n debounceMs: this.config.debounceMs\n });\n }\n\n // Initialize the TrieWatchTool for goal checking\n await this.trieWatchTool.execute({\n action: 'start',\n directory: this.config.directory,\n debounceMs: this.config.debounceMs\n });\n\n // Start watching\n await this.watchDirectory(this.config.directory);\n this.streamingManager?.reportWatchStatus({\n watching: true,\n directories: this.watchers.size,\n debounceMs: this.config.debounceMs\n });\n this.log('info', 'Watching for changes...', { \n directories: this.watchers.size \n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => this.shutdown('SIGINT'));\n process.on('SIGTERM', () => this.shutdown('SIGTERM'));\n }\n\n /**\n * Watch a directory recursively\n */\n private async watchDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) return;\n\n try {\n const stat = statSync(dir);\n if (!stat.isDirectory()) return;\n\n const dirName = basename(dir);\n if (SKIP_DIRS.has(dirName) || dirName.startsWith('.')) return;\n\n // Watch this directory\n const watcher = watch(dir, { persistent: true }, (_eventType, filename) => {\n if (!filename) return;\n\n const fullPath = join(dir, filename);\n const ext = extname(filename).toLowerCase();\n\n if (!WATCH_EXTENSIONS.has(ext)) return;\n if (!existsSync(fullPath)) return;\n\n this.pendingFiles.add(fullPath);\n this.streamingManager?.reportWatchChange(fullPath);\n this.scheduleProcessing();\n });\n\n this.watchers.set(dir, watcher);\n\n // Recursively watch subdirectories\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n await this.watchDirectory(join(dir, entry.name));\n }\n }\n } catch (error) {\n // Skip inaccessible directories\n }\n }\n\n /**\n * Schedule processing of pending files (debounced)\n */\n private scheduleProcessing(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.processPendingFiles();\n }, this.config.debounceMs);\n }\n\n /**\n * Process all pending files\n */\n private async processPendingFiles(): Promise<void> {\n if (this.isProcessing || this.pendingFiles.size === 0) return;\n\n this.isProcessing = true;\n const files = Array.from(this.pendingFiles);\n this.pendingFiles.clear();\n\n this.log('info', 'Processing changed files', { \n count: files.length,\n files: files.map(f => basename(f))\n });\n\n try {\n // Trigger goal violation checking via TrieWatchTool\n // The tool handles AI-powered goal checking, priority scoring, caching, etc.\n const result = await this.trieWatchTool.execute({\n action: 'status'\n });\n\n // Extract issues from the result\n const statusMatch = result.content?.[0]?.text?.match(/Issues Found: (\\d+)/);\n if (statusMatch && statusMatch[1]) {\n const issuesFound = parseInt(statusMatch[1], 10);\n this.stats.issuesFound += issuesFound;\n \n if (issuesFound > 0) {\n this.log('info', 'Goal violations detected', { \n count: issuesFound,\n files: files.length \n });\n }\n }\n } catch (error) {\n this.log('error', 'Failed to check for goal violations', { \n error: error instanceof Error ? error.message : String(error)\n });\n this.stats.errors++;\n }\n \n this.isProcessing = false;\n }\n\n\n /**\n * Log a message\n */\n private log(level: 'info' | 'warn' | 'error', message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const uptime = Math.round((Date.now() - this.stats.startTime) / 1000);\n\n // Suppress human-readable logs when interactive dashboard is active\n if (!this.config.jsonOutput && isInteractiveMode()) {\n return;\n }\n\n if (this.config.jsonOutput) {\n console.log(JSON.stringify({\n timestamp,\n level,\n message,\n uptime,\n ...data,\n stats: this.stats\n }));\n } else {\n const levelEmoji = { info: '[i]', warn: '[!]', error: '[X]' }[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : '';\n console.log(`[${timestamp}] ${levelEmoji} ${message}${dataStr}`);\n }\n }\n\n /**\n * Graceful shutdown\n */\n private async shutdown(signal: string): Promise<void> {\n this.log('info', 'Shutting down', { signal, stats: this.stats });\n\n // Stop the TrieWatchTool\n try {\n await this.trieWatchTool.execute({ action: 'stop' });\n } catch (error) {\n // Ignore errors during shutdown\n }\n\n // Close all watchers\n for (const watcher of this.watchers.values()) {\n watcher.close();\n }\n\n // Clear timers\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n if (this.streamingManager) {\n this.streamingManager.reportWatchStatus({\n watching: false,\n directories: 0\n });\n }\n if (this.dashboard) {\n this.dashboard.stop();\n }\n\n process.exit(0);\n }\n}\n\n/**\n * Parse command line arguments\n */\nfunction parseArgs(): DaemonConfig {\n const args = process.argv.slice(2);\n const config: DaemonConfig = {\n // Silent mode for initial workspace detection (TUI will handle display)\n directory: getWorkingDirectory(undefined, true),\n debounceMs: 1000,\n jsonOutput: false,\n // Default to interactive mode for TTY terminals\n interactive: process.stdout.isTTY === true\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const nextArg = args[i + 1];\n\n switch (arg) {\n case '--dir':\n case '-d':\n config.directory = resolve(nextArg || '.');\n i++;\n break;\n case '--debounce':\n case '-D':\n config.debounceMs = parseInt(nextArg || '1000', 10);\n i++;\n break;\n case '--json':\n config.jsonOutput = true;\n break;\n case '--format':\n if (nextArg) {\n config.format = nextArg === 'json' ? 'json' : 'text';\n i++;\n }\n break;\n case '--output':\n if (nextArg) {\n config.output = nextArg;\n i++;\n }\n break;\n case '--parallel':\n config.parallel = true;\n break;\n case '--no-parallel':\n config.parallel = false;\n break;\n case '--cache':\n config.cache = true;\n break;\n case '--no-cache':\n config.cache = false;\n break;\n case '--force-rescan':\n case '--force':\n config.cache = false; // Force rescan by disabling cache\n break;\n case '--max-concurrency':\n config.maxConcurrency = parseInt(nextArg || '4', 10);\n i++;\n break;\n case '--streaming':\n config.streaming = true;\n break;\n case '--no-streaming':\n config.streaming = false;\n break;\n case '--interactive':\n config.interactive = true;\n break;\n case '--no-interactive':\n config.interactive = false;\n break;\n case '--once':\n // One-shot mode (e.g. pre-commit hook): never use interactive dashboard\n config.interactive = false;\n config.once = true;\n break;\n case '--staged-only':\n // Only check staged files (for pre-commit hooks)\n config.stagedOnly = true;\n break;\n case '--fail-on':\n if (nextArg && ['never', 'critical', 'serious'].includes(nextArg)) {\n config.failOn = nextArg as 'never' | 'critical' | 'serious';\n i++;\n }\n break;\n case '--workers':\n config.workers = true;\n break;\n case '--no-workers':\n config.workers = false;\n break;\n case '--timeout':\n config.timeoutMs = parseInt(nextArg || '120000', 10);\n i++;\n break;\n case '--files':\n if (nextArg) {\n config.files = nextArg.split(',').map(f => f.trim()).filter(Boolean);\n i++;\n }\n break;\n case '--users':\n case '-u':\n config.userCount = parseInt(nextArg || '250', 10);\n i++;\n break;\n case '--help':\n case '-h':\n console.log(`\nTrie Watch - File Watcher\n\nUSAGE:\n trie watch [options] Watch for changes\n\nOPTIONS:\n --dir, -d <path> Directory to watch (default: current directory)\n --debounce, -D <ms> Debounce time in ms (default: 1000)\n --users, -u <count> User count for cost estimation (default: 250)\n\nOUTPUT:\n --json Output as JSON (for log aggregation)\n\nDISPLAY:\n --interactive Enable interactive dashboard (default for TTY)\n --no-interactive Disable interactive dashboard (for CI/scripts)\n\nEXAMPLES:\n trie watch # Watch current directory\n trie watch --no-interactive # CI mode: watch without dashboard\n`);\n process.exit(0);\n }\n }\n\n return config;\n}\n\n// Run the daemon\nconst config = parseArgs();\nconst daemon = new WatchDaemon(config);\ndaemon.start().catch(error => {\n if (!process.stdout.isTTY || process.argv.includes('--non-interactive')) {\n console.error('Failed to start daemon:', error);\n }\n process.exit(1);\n});\n"],"mappings":"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","names":["config"]}
@@ -1,28 +0,0 @@
1
- import {
2
- analyzeCodeIssues,
3
- getAIStatusMessage,
4
- getClient,
5
- getKeyFromKeychain,
6
- isAIAvailable,
7
- runAIAnalysis,
8
- runAIWithTools,
9
- saveKeyToKeychain,
10
- setAPIKey,
11
- tryGetClient
12
- } from "./chunk-FQ45QP5A.js";
13
- import "./chunk-VVITXIHN.js";
14
- import "./chunk-KDHN2ZQE.js";
15
- import "./chunk-DGUM43GV.js";
16
- export {
17
- analyzeCodeIssues,
18
- getAIStatusMessage,
19
- getClient,
20
- getKeyFromKeychain,
21
- isAIAvailable,
22
- runAIAnalysis,
23
- runAIWithTools,
24
- saveKeyToKeychain,
25
- setAPIKey,
26
- tryGetClient
27
- };
28
- //# sourceMappingURL=client-NJPZE5JT.js.map