@triedotdev/mcp 1.0.49 → 1.0.50
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.
- package/dist/{agent-smith-5QOZXLMV.js → agent-smith-RVXIMAL6.js} +2 -2
- package/dist/{agent-smith-runner-ZTDCJJQG.js → agent-smith-runner-3AWGEOZC.js} +2 -2
- package/dist/{chunk-VZYCZXEQ.js → chunk-37U65YW7.js} +244 -250
- package/dist/chunk-37U65YW7.js.map +1 -0
- package/dist/{chunk-KQOMSIVR.js → chunk-3SQK2RKF.js} +5 -1
- package/dist/chunk-3SQK2RKF.js.map +1 -0
- package/dist/{chunk-JDICQHNT.js → chunk-GERAB55E.js} +101 -10
- package/dist/chunk-GERAB55E.js.map +1 -0
- package/dist/cli/main.js +22 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +30 -18
- package/dist/cli/yolo-daemon.js.map +1 -1
- package/dist/index.js +36 -5
- package/dist/index.js.map +1 -1
- package/dist/workers/agent-worker.js +3 -2
- package/dist/workers/agent-worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-JDICQHNT.js.map +0 -1
- package/dist/chunk-KQOMSIVR.js.map +0 -1
- package/dist/chunk-VZYCZXEQ.js.map +0 -1
- /package/dist/{agent-smith-5QOZXLMV.js.map → agent-smith-RVXIMAL6.js.map} +0 -0
- /package/dist/{agent-smith-runner-ZTDCJJQG.js.map → agent-smith-runner-3AWGEOZC.js.map} +0 -0
package/dist/cli/main.js
CHANGED
|
@@ -574,6 +574,8 @@ COMMANDS:
|
|
|
574
574
|
skills Manage external skills from skills.sh
|
|
575
575
|
project View/manage project info (.trie/PROJECT.md)
|
|
576
576
|
memory Search and manage issue memory
|
|
577
|
+
agent-smith Run Agent Smith (35 vibe code hunters)
|
|
578
|
+
super-reviewer Run interactive PR review
|
|
577
579
|
version Show version information
|
|
578
580
|
|
|
579
581
|
EXAMPLES:
|
|
@@ -610,6 +612,12 @@ EXAMPLES:
|
|
|
610
612
|
# Search issue memory
|
|
611
613
|
trie-agent memory search "SQL injection"
|
|
612
614
|
|
|
615
|
+
# Run Agent Smith (vibe code hunter)
|
|
616
|
+
trie-agent agent-smith
|
|
617
|
+
|
|
618
|
+
# Run interactive PR review
|
|
619
|
+
trie-agent super-reviewer
|
|
620
|
+
|
|
613
621
|
MCP TOOLS (use via Cursor/Claude Desktop):
|
|
614
622
|
trie_scan Intelligent scan with agent selection
|
|
615
623
|
trie_fix Generate high-confidence fix prompts
|
|
@@ -628,14 +636,15 @@ MCP TOOLS (use via Cursor/Claude Desktop):
|
|
|
628
636
|
trie_types TypeScript type safety
|
|
629
637
|
trie_devops DevOps & deployment
|
|
630
638
|
trie_clean Clean up AI-generated code
|
|
639
|
+
|
|
640
|
+
Special Agents:
|
|
641
|
+
trie_agent_smith 35 vibe code hunters, cross-file detection
|
|
642
|
+
trie_super_reviewer Interactive PR review with cross-examination
|
|
631
643
|
|
|
632
644
|
Custom Skills:
|
|
633
645
|
trie_create_skill Create skill from PDF/TXT/MD document
|
|
634
646
|
trie_list_skills List all registered skills
|
|
635
647
|
|
|
636
|
-
NOTE: No API key required! Trie uses your AI tool's built-in Claude.
|
|
637
|
-
|
|
638
|
-
For more info: https://github.com/Trie-OS/Trie-Agent
|
|
639
648
|
`);
|
|
640
649
|
}
|
|
641
650
|
function showSetup() {
|
|
@@ -918,6 +927,16 @@ function main() {
|
|
|
918
927
|
case "watch":
|
|
919
928
|
runWatch(restArgs);
|
|
920
929
|
break;
|
|
930
|
+
case "agent-smith":
|
|
931
|
+
case "smith":
|
|
932
|
+
case "trie_agent_smith":
|
|
933
|
+
runScan(["--agents", "agent-smith", ...restArgs]);
|
|
934
|
+
break;
|
|
935
|
+
case "super-reviewer":
|
|
936
|
+
case "reviewer":
|
|
937
|
+
case "trie_super_reviewer":
|
|
938
|
+
runScan(["--agents", "super-reviewer", ...restArgs]);
|
|
939
|
+
break;
|
|
921
940
|
default:
|
|
922
941
|
if (command.startsWith("-")) {
|
|
923
942
|
const { spawn } = __require("child_process");
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/main.ts","../../src/cli/skills.ts","../../src/cli/init.ts","../../src/cli/memory.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent CLI\n * \n * Main command-line interface for Trie Agent.\n * Provides help, setup, and routes to specific tools.\n * \n * Usage:\n * trie-agent [command] [options]\n */\n\nimport { resolve, join, dirname } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { loadProjectInfo, initProjectInfo, projectInfoExists } from '../utils/project-info.js';\nimport { handleSkillsCommand } from './skills.js';\nimport { handleInitCommand } from './init.js';\nimport { handleMemoryCommand } from './memory.js';\nimport { handleCheckpointCommand } from './checkpoint.js';\n\n// ES module __dirname equivalent\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst VERSION = '1.0.0';\n\n/**\n * Show TRIE ASCII art banner\n */\nfunction showBanner(): void {\n console.log(`\n ████████╗██████╗ ██╗███████╗\n ╚══██╔══╝██╔══██╗██║██╔════╝\n ██║ ██████╔╝██║█████╗ \n ██║ ██╔══██╗██║██╔══╝ \n ██║ ██║ ██║██║███████╗\n ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝\n \n Your central registry for agents and skills\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n`);\n}\n\n/**\n * Show the main help message\n */\nfunction showHelp(): void {\n showBanner();\n console.log(`Version: ${VERSION}\n\nUSAGE:\n trie-agent <command> [options]\n\nCOMMANDS:\n help Show this help message\n init Initialize bootstrap files (.trie/RULES.md, etc.)\n setup Configure API key and environment\n scan Scan codebase once and exit\n checkpoint Save context without running a scan\n watch Watch for changes and scan continuously\n agents List all available agents\n skills Manage external skills from skills.sh\n project View/manage project info (.trie/PROJECT.md)\n memory Search and manage issue memory\n version Show version information\n\nEXAMPLES:\n # First time setup\n trie-agent setup\n\n # Scan your project once\n trie-agent scan\n\n # Watch mode (scan on file changes)\n trie-agent watch\n\n # Scan specific directory\n trie-agent scan --dir ./src\n\n # Scan with custom user count for cost estimation\n trie-agent scan --users 10000\n\n # Initialize project info file\n trie-agent project init\n\n # View project info\n trie-agent project\n\n # Install a skill from GitHub\n trie-agent skills add vercel-labs/agent-skills react-best-practices\n\n # List installed skills\n trie-agent skills list\n\n # Initialize bootstrap files\n trie-agent init\n\n # Search issue memory\n trie-agent memory search \"SQL injection\"\n\nMCP TOOLS (use via Cursor/Claude Desktop):\n trie_scan Intelligent scan with agent selection\n trie_fix Generate high-confidence fix prompts\n trie_explain Explain code, issues, or changes\n trie_watch Watch mode for autonomous reporting\n \n Individual Agents:\n trie_security Security vulnerabilities\n trie_privacy Privacy & GDPR compliance\n trie_soc2 SOC 2 Type II compliance\n trie_legal Legal compliance\n trie_accessibility WCAG 2.1 accessibility\n trie_architecture Code organization & SOLID\n trie_bugs Bug finding & null safety\n trie_ux UX testing (happy path, edge cases)\n trie_types TypeScript type safety\n trie_devops DevOps & deployment\n trie_clean Clean up AI-generated code\n\n Custom Skills:\n trie_create_skill Create skill from PDF/TXT/MD document\n trie_list_skills List all registered skills\n\nNOTE: No API key required! Trie uses your AI tool's built-in Claude.\n\nFor more info: https://github.com/Trie-OS/Trie-Agent\n`);\n}\n\n/**\n * Show setup instructions\n */\nfunction showSetup(): void {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 🔧 Trie Agent Setup ║\n╚══════════════════════════════════════════════════════════════════╝\n\nNo API key required! Trie uses your AI tool's built-in Claude.\n\nSTEP 1: Configure for your AI tool\n─────────────────────────────────────\n\nFor CLAUDE CODE:\n claude mcp add Trie -- npx @triedotdev/mcp\n\n Or add to ~/.claude/settings.json:\n {\n \"mcpServers\": {\n \"Trie\": {\n \"command\": \"node\",\n \"args\": [\"/path/to/@triedotdev/mcp/dist/index.js\"]\n }\n }\n }\n\nFor CURSOR (~/.cursor/mcp.json):\n{\n \"mcpServers\": {\n \"Trie\": {\n \"command\": \"node\",\n \"args\": [\"/path/to/@triedotdev/mcp/dist/index.js\"]\n }\n }\n}\n\nSTEP 2: Restart your AI tool\n─────────────────────────────────────\nRestart Claude Code or Cursor to load the MCP configuration.\n\nSTEP 3: Start scanning!\n─────────────────────────────────────\nAsk your AI assistant: \"Scan this with Trie\" or \"Use trie_scan\"\n\nNeed help? https://github.com/Trie-OS/Trie-Agent/issues\n`);\n}\n\n/**\n * List available agents\n */\nfunction listAgents(): void {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Available Agents ║\n╚══════════════════════════════════════════════════════════════════╝\n\nBUILT-IN AGENTS:\n─────────────────────────────────────\n security Security vulnerabilities, injection risks, auth issues\n privacy GDPR, HIPAA, PII handling, data encryption\n legal GDPR, CCPA, consent patterns, data retention\n accessibility WCAG 2.1 accessibility, keyboard nav, screen readers\n software-architect Code organization, SOLID principles, scalability\n bug-finding Null safety, edge cases, async issues\n user-testing Simulate users: happy path, security tester, confused user\n typecheck Type errors, missing annotations, null checks\n devops Config issues, logging, env vars, deployment\n trie_clean Clean up AI-generated code patterns\n moneybags Estimates dollar cost of bugs (IBM/NIST cost models)\n production-ready Production gate: health checks, scaling, security headers\n\n Custom Skills:\n ─────────────────────────────────────`);\n\n // Check for custom skills\n const skillsDir = join(getWorkingDirectory(undefined, true), '.trie', 'agents');\n if (existsSync(skillsDir)) {\n try {\n const { readdirSync } = require('fs');\n const files = readdirSync(skillsDir).filter((f: string) => f.endsWith('.json'));\n \n if (files.length > 0) {\n for (const file of files) {\n const config = JSON.parse(readFileSync(join(skillsDir, file), 'utf-8'));\n console.log(` ${config.name.padEnd(18)} ${config.description || 'Custom skill'}`);\n }\n } else {\n console.log(` (No custom skills found)`);\n }\n } catch {\n console.log(` (No custom skills found)`);\n }\n } else {\n console.log(` (No custom skills found)`);\n }\n\n console.log(`\nCREATE CUSTOM SKILLS:\n─────────────────────────────────────\nYou can create skills from PDF, TXT, or MD documents:\n\n Via MCP: Use trie_create_skill tool\n CLI: trie-create --file book.pdf --name my-skill\n\nThe agent will learn patterns from your document and apply them\nto code reviews. Great for style guides, compliance docs, etc.\n`);\n}\n\n/**\n * Show version\n */\nfunction showVersion(): void {\n showBanner();\n console.error(`v${VERSION}`);\n}\n\n/**\n * Handle project command\n */\nasync function handleProject(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const workDir = getWorkingDirectory(undefined, true);\n\n if (subcommand === 'init') {\n const result = await initProjectInfo(workDir);\n if (result.created) {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 PROJECT.md Created ║\n╚══════════════════════════════════════════════════════════════════╝\n\nPath: ${result.path}\n\nA template has been created with sections for:\n • Project Overview\n • Technology Stack\n • Architecture\n • Coding Conventions\n • Environment\n • Team\n • Compliance\n • AI Instructions\n\nNext steps:\n 1. Edit the file to add your project details\n 2. The info will be available via trie://project resource\n 3. AI assistants will use this context automatically\n`);\n } else {\n console.log(`PROJECT.md already exists at: ${result.path}`);\n console.log('Use \"trie-agent project\" to view it.');\n }\n return;\n }\n\n if (subcommand === 'edit') {\n const editor = process.env.EDITOR || process.env.VISUAL || 'nano';\n const projectPath = join(workDir, '.trie', 'PROJECT.md');\n \n if (!projectInfoExists(workDir)) {\n console.log('No PROJECT.md found. Creating one first...');\n await initProjectInfo(workDir);\n }\n \n const { spawn } = await import('child_process');\n const child = spawn(editor, [projectPath], { stdio: 'inherit' });\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n return;\n }\n\n // Default: show project info\n if (!projectInfoExists(workDir)) {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Project Information ║\n╚══════════════════════════════════════════════════════════════════╝\n\nNo PROJECT.md found in this project.\n\nCOMMANDS:\n trie-agent project init Create PROJECT.md from template\n trie-agent project edit Open PROJECT.md in $EDITOR\n trie-agent project View PROJECT.md contents\n\nWHAT IS PROJECT.MD?\nPROJECT.md stores important project context for AI assistants:\n • Project description and purpose\n • Technology stack and frameworks\n • Architecture decisions\n • Coding conventions\n • Environment info (URLs, endpoints)\n • Team ownership\n • Compliance requirements\n • Special instructions for AI\n\nThis info is available via trie://project MCP resource.\n`);\n return;\n }\n\n const content = await loadProjectInfo(workDir);\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Project Information ║\n╚══════════════════════════════════════════════════════════════════╝\n\nPath: ${join(workDir, '.trie', 'PROJECT.md')}\n\n${'-'.repeat(68)}\n`);\n console.log(content);\n}\n\n/**\n * Run scan command\n */\nasync function runScan(args: string[]): Promise<void> {\n // Forward to watch daemon with --once flag\n const { spawn } = await import('child_process');\n \n // Determine daemon path - works for both source (tsx) and built (node) execution\n let daemonPath: string;\n if (__filename.endsWith('.ts')) {\n // Running from source with tsx\n daemonPath = resolve(__dirname, 'yolo-daemon.ts');\n } else {\n // Running from built dist\n daemonPath = resolve(__dirname, 'yolo-daemon.js');\n }\n \n const daemonArgs = ['--once', ...args];\n \n // Use tsx for .ts files, node for .js files\n const executor = daemonPath.endsWith('.ts') ? 'npx' : 'node';\n const execArgs = daemonPath.endsWith('.ts') \n ? ['tsx', daemonPath, ...daemonArgs]\n : [daemonPath, ...daemonArgs];\n \n const child = spawn(executor, execArgs, {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n}\n\n/**\n * Run watch command\n */\nasync function runWatch(args: string[]): Promise<void> {\n const { spawn } = await import('child_process');\n \n // Determine daemon path - works for both source (tsx) and built (node) execution\n let daemonPath: string;\n if (__filename.endsWith('.ts')) {\n daemonPath = resolve(__dirname, 'yolo-daemon.ts');\n } else {\n daemonPath = resolve(__dirname, 'yolo-daemon.js');\n }\n \n // Use tsx for .ts files, node for .js files\n const executor = daemonPath.endsWith('.ts') ? 'npx' : 'node';\n const execArgs = daemonPath.endsWith('.ts') \n ? ['tsx', daemonPath, ...args]\n : [daemonPath, ...args];\n \n const child = spawn(executor, execArgs, {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n}\n\n/**\n * Main entry point\n */\nfunction main(): void {\n const args = process.argv.slice(2);\n const command = args[0]?.toLowerCase();\n const restArgs = args.slice(1);\n\n // No command or help flag\n if (!command || command === 'help' || command === '--help' || command === '-h') {\n showHelp();\n process.exit(0);\n }\n\n switch (command) {\n case 'setup':\n case 'config':\n case 'configure':\n showSetup();\n break;\n\n case 'init':\n case 'bootstrap':\n handleInitCommand(restArgs);\n break;\n\n case 'memory':\n case 'mem':\n handleMemoryCommand(restArgs);\n break;\n\n case 'checkpoint':\n case 'cp':\n case 'save':\n handleCheckpointCommand(restArgs);\n break;\n\n case 'agents':\n case 'list':\n case 'list-agents':\n listAgents();\n break;\n\n case 'project':\n case 'info':\n case 'project-info':\n handleProject(restArgs);\n break;\n\n case 'skills':\n case 'skill':\n handleSkillsCommand(restArgs);\n break;\n\n case 'version':\n case '--version':\n case '-v':\n showVersion();\n break;\n\n case 'scan':\n runScan(restArgs);\n break;\n\n case 'watch':\n runWatch(restArgs);\n break;\n\n default:\n // Check if it looks like a flag (pass to watch daemon)\n if (command.startsWith('-')) {\n // Treat as watch-daemon args\n const { spawn } = require('child_process');\n const daemonPath = resolve(__dirname, 'yolo-daemon.js');\n \n const child = spawn('node', [daemonPath, ...args], {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code: number) => {\n process.exit(code || 0);\n });\n } else {\n console.error(`Unknown command: ${command}`);\n console.error(`Run 'trie-agent help' for usage information.`);\n process.exit(1);\n }\n }\n}\n\nmain();\n","/**\n * Skills CLI Command Handler\n * \n * Manages external skills from skills.sh and other GitHub repositories.\n * Skills are reusable capabilities that agents apply during code review.\n */\n\nimport { installSkill, listInstalledSkills, removeSkill } from '../skills/installer.js';\nimport { loadContextState, recordSkillInstalled } from '../utils/context-state.js';\nimport { SKILL_CATEGORIES, getSkillCategories, getSkillsByCategory } from '../bootstrap/stack-detector.js';\n\nexport async function handleSkillsCommand(args: string[]): Promise<void> {\n const [cmd, ...rest] = args;\n\n switch (cmd) {\n case 'add':\n case 'install': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills add <owner/repo> [skill-name]');\n console.log('');\n console.log('Examples:');\n console.log(' trie-agent skills add vercel-labs/agent-skills react-best-practices');\n console.log(' trie-agent skills add anthropics/skills claude-code-review');\n console.log(' trie-agent skills add myorg/internal-standards');\n return;\n }\n \n console.log(`Installing skill from ${rest[0]}...`);\n const result = await installSkill(rest[0], rest[1]);\n \n if (result.success) {\n await recordSkillInstalled({ name: result.name, source: rest[0] });\n console.log(`Installed: ${result.name}`);\n console.log(`Path: ${result.path}`);\n console.log('');\n console.log('This skill is now a capability the skill-review agent can apply.');\n console.log('Run \"trie-agent scan\" to apply skills to your codebase.');\n } else {\n console.error(`Failed to install: ${result.error}`);\n process.exit(1);\n }\n break;\n }\n \n case 'list':\n case 'ls': {\n const categoryArg = rest[0]?.toLowerCase();\n \n // If a category is specified, show skills in that category\n if (categoryArg) {\n if (categoryArg === 'categories' || categoryArg === 'all') {\n // Show all available categories\n const categories = getSkillCategories();\n console.log('');\n console.log('Available Skill Categories:');\n console.log('');\n for (const cat of categories) {\n console.log(` ${cat.name.padEnd(15)} ${cat.count} skills`);\n }\n console.log('');\n console.log('View skills in a category:');\n console.log(' trie skills list <category>');\n console.log('');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n const categorySkills = getSkillsByCategory(categoryArg);\n if (categorySkills.length === 0) {\n const categories = getSkillCategories();\n console.log(`Unknown category: ${categoryArg}`);\n console.log('');\n console.log('Available categories:');\n for (const cat of categories) {\n console.log(` ${cat.name}`);\n }\n return;\n }\n \n console.log('');\n console.log(`${categoryArg.charAt(0).toUpperCase() + categoryArg.slice(1)} Skills (${categorySkills.length}):`);\n console.log('');\n for (const skill of categorySkills) {\n console.log(` trie skills add ${skill}`);\n }\n console.log('');\n console.log('Install any skill with: trie skills add <source> <name>');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n // No category - show installed skills\n const skills = await listInstalledSkills();\n const state = await loadContextState();\n \n if (skills.length === 0) {\n console.log('');\n console.log('No skills installed.');\n console.log('');\n console.log('Install a skill:');\n console.log(' trie skills add vercel-labs/agent-skills react-best-practices');\n console.log('');\n console.log('Explore skill categories:');\n const categories = getSkillCategories();\n for (const cat of categories.slice(0, 5)) {\n console.log(` trie skills list ${cat.name.padEnd(15)} # ${cat.count} skills`);\n }\n console.log(' trie skills list categories # see all');\n console.log('');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n console.log('');\n console.log(`Installed Skills (${skills.length}):`);\n console.log('');\n \n for (const skill of skills) {\n const record = state.skills?.[skill.name];\n const usage = record ? `applied ${record.timesApplied}x` : 'not yet applied';\n console.log(` ${skill.name} (${usage})`);\n console.log(` ${skill.description}`);\n console.log(` Source: ${skill.installedFrom}`);\n console.log('');\n }\n \n console.log('These skills are applied by the skill-review agent during scans.');\n console.log('');\n console.log('Explore more: trie skills list categories');\n break;\n }\n \n case 'remove':\n case 'rm':\n case 'uninstall': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills remove <skill-name>');\n return;\n }\n \n const removed = await removeSkill(rest[0]);\n if (removed) {\n console.log(`Removed: ${rest[0]}`);\n } else {\n console.error(`Skill not found: ${rest[0]}`);\n process.exit(1);\n }\n break;\n }\n \n case 'info': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills info <skill-name>');\n return;\n }\n \n const skills = await listInstalledSkills();\n const skill = skills.find(s => s.name === rest[0]);\n \n if (!skill) {\n console.error(`Skill not found: ${rest[0]}`);\n process.exit(1);\n return;\n }\n \n const state = await loadContextState();\n const record = state.skills?.[skill.name];\n \n console.log('');\n console.log(`Skill: ${skill.name}`);\n console.log(`Description: ${skill.description}`);\n console.log(`Path: ${skill.path}`);\n console.log(`Source: ${skill.installedFrom}`);\n console.log(`Installed: ${new Date(skill.installedAt).toLocaleString()}`);\n \n if (record) {\n console.log(`Times Applied: ${record.timesApplied}`);\n console.log(`Applied By: ${record.appliedBy.join(', ') || 'none'}`);\n if (record.lastApplied) {\n console.log(`Last Applied: ${new Date(record.lastApplied).toLocaleString()}`);\n }\n } else {\n console.log('Times Applied: 0');\n }\n break;\n }\n \n default: {\n const categories = getSkillCategories();\n console.log(`\nSkills - Reusable capabilities from skills.sh\n\nSkills are NOT agents - they are knowledge/instructions that the\nskill-review agent applies during code review.\n\nCommands:\n trie skills add <source> [name] Install a skill\n trie skills list List installed skills\n trie skills list <category> Browse skills by category\n trie skills list categories Show all categories\n trie skills info <name> Show skill details\n trie skills remove <name> Uninstall a skill\n\nExamples:\n trie skills add vercel-labs/agent-skills react-best-practices\n trie skills add anthropics/skills frontend-design\n trie skills add expo/skills upgrading-expo\n\nCategories (${categories.length} total, ${Object.values(SKILL_CATEGORIES).flat().length}+ skills):\n ${categories.map(c => `${c.name} (${c.count})`).join(', ')}\n\nHow it works:\n 1. You install skills (capabilities)\n 2. The skill-review agent applies them during 'trie scan'\n 3. Usage is tracked in your project context\n\nBrowse all skills: https://skills.sh\n `);\n }\n }\n}\n","/**\n * CLI Init Command\n * \n * Initialize bootstrap files for a new project.\n */\n\nimport { initializeBootstrapFiles, needsBootstrap, completeBootstrap } from '../bootstrap/index.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { getSkillCategories } from '../bootstrap/stack-detector.js';\n\nexport async function handleInitCommand(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const workDir = getWorkingDirectory(undefined, true);\n\n if (subcommand === 'complete') {\n const result = await completeBootstrap(workDir);\n if (result) {\n console.log('Bootstrap completed. BOOTSTRAP.md has been deleted.');\n } else {\n console.log('No BOOTSTRAP.md file found.');\n }\n return;\n }\n\n if (subcommand === 'status') {\n const needs = needsBootstrap(workDir);\n if (needs) {\n console.log('Bootstrap pending: .trie/BOOTSTRAP.md exists');\n console.log('Run \"trie init complete\" after finishing setup.');\n } else {\n console.log('Bootstrap complete: No pending setup.');\n }\n return;\n }\n\n const force = args.includes('--force') || args.includes('-f');\n const skipBootstrap = args.includes('--skip-bootstrap');\n\n console.log(`\n╔════════════════════════════════════════════════╗\n║ ║\n║ ████████╗██████╗ ██╗███████╗ ║\n║ ╚══██╔══╝██╔══██╗██║██╔════╝ ║\n║ ██║ ██████╔╝██║█████╗ ║\n║ ██║ ██╔══██╗██║██╔══╝ ║\n║ ██║ ██║ ██║██║███████╗ ║\n║ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝ ║\n║ ║\n║ Your central registry for agents and skills ║\n║ ║\n╚════════════════════════════════════════════════╝\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n\n`);\n\n const result = await initializeBootstrapFiles({\n workDir,\n force,\n skipBootstrap,\n });\n\n if (result.created.length > 0) {\n console.log('Created files:');\n for (const file of result.created) {\n console.log(` + .trie/${file}`);\n }\n }\n\n if (result.skipped.length > 0 && !force) {\n console.log('\\nSkipped (already exist):');\n for (const file of result.skipped) {\n console.log(` - .trie/${file}`);\n }\n }\n\n console.log('\\nDetected Stack:');\n if (result.stack.framework) console.log(` Framework: ${result.stack.framework}`);\n if (result.stack.language) console.log(` Language: ${result.stack.language}`);\n if (result.stack.database) console.log(` Database: ${result.stack.database}`);\n if (result.stack.auth) console.log(` Auth: ${result.stack.auth}`);\n if (result.stack.packageManager) console.log(` Package Manager: ${result.stack.packageManager}`);\n\n if (result.stack.suggestedSkills.length > 0) {\n // Limit to top 5 most relevant skills to avoid overwhelming output\n const topSkills = result.stack.suggestedSkills.slice(0, 5);\n console.log('\\nSuggested Skills (based on your stack):');\n for (const skill of topSkills) {\n console.log(` trie skills add ${skill}`);\n }\n if (result.stack.suggestedSkills.length > 5) {\n console.log(` ... and ${result.stack.suggestedSkills.length - 5} more (run \"trie init\" again to see all)`);\n }\n }\n\n // Show category exploration options\n const categories = getSkillCategories();\n const topCategories = categories.slice(0, 5);\n console.log('\\nExplore skill categories:');\n for (const cat of topCategories) {\n console.log(` trie skills list ${cat.name.padEnd(15)} # ${cat.count} skills`);\n }\n console.log(` trie skills list categories # see all ${categories.length} categories`);\n \n console.log('\\nBrowse all skills: https://skills.sh');\n\n console.log(`\nNext Steps:\n 1. Edit .trie/PROJECT.md with your project description\n 2. Define coding standards in .trie/RULES.md\n 3. Run \"trie scan\" to analyze your codebase\n 4. Run \"trie init complete\" when setup is done\n`);\n}\n","/**\n * CLI Memory Command\n * \n * Search and manage issue memory.\n */\n\nimport {\n searchIssues,\n getMemoryStats,\n getRecentIssues,\n getDailyLogs,\n markIssueResolved,\n} from '../memory/issue-store.js';\nimport {\n findCrossProjectPatterns,\n listTrackedProjects,\n getGlobalMemoryStats,\n updateGlobalMemoryMd,\n searchGlobalPatterns,\n} from '../memory/global-memory.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport async function handleMemoryCommand(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const restArgs = args.slice(1);\n\n switch (subcommand) {\n case 'search':\n await handleSearch(restArgs);\n break;\n case 'stats':\n await handleStats();\n break;\n case 'recent':\n await handleRecent(restArgs);\n break;\n case 'logs':\n await handleLogs();\n break;\n case 'resolve':\n await handleResolve(restArgs);\n break;\n case 'global':\n await handleGlobal(restArgs);\n break;\n default:\n showHelp();\n }\n}\n\nasync function handleSearch(args: string[]): Promise<void> {\n const query = args.join(' ');\n \n if (!query) {\n console.log('Usage: trie memory search <query>');\n console.log('Example: trie memory search \"SQL injection\"');\n return;\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n const results = await searchIssues(query, { workDir, limit: 10 });\n\n if (results.length === 0) {\n console.log(`No issues found matching \"${query}\"`);\n return;\n }\n\n console.log(`Found ${results.length} issue(s) matching \"${query}\":\\n`);\n\n for (const result of results) {\n const i = result.issue;\n const status = i.resolved ? '[RESOLVED]' : '';\n console.log(`[${i.severity.toUpperCase()}] ${status} ${i.issue.slice(0, 80)}`);\n console.log(` File: ${i.file}${i.line ? `:${i.line}` : ''}`);\n console.log(` Agent: ${i.agent} | Score: ${(result.score * 100).toFixed(0)}%`);\n console.log(` Date: ${new Date(i.timestamp).toLocaleDateString()}`);\n console.log('');\n }\n}\n\nasync function handleStats(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const stats = await getMemoryStats(workDir);\n const globalStats = await getGlobalMemoryStats();\n\n console.log('Local Issue Memory Stats:');\n console.log(` Total Issues: ${stats.totalIssues}`);\n console.log(` Resolved: ${stats.resolvedCount}`);\n \n if (stats.oldestIssue) {\n console.log(` Date Range: ${stats.oldestIssue.split('T')[0]} to ${stats.newestIssue?.split('T')[0]}`);\n }\n\n console.log('\\n By Severity:');\n for (const [severity, count] of Object.entries(stats.issuesBySeverity)) {\n console.log(` ${severity}: ${count}`);\n }\n\n console.log('\\n By Agent:');\n const sortedAgents = Object.entries(stats.issuesByAgent).sort((a, b) => b[1] - a[1]);\n for (const [agent, count] of sortedAgents.slice(0, 10)) {\n console.log(` ${agent}: ${count}`);\n }\n\n console.log('\\nGlobal Cross-Project Stats:');\n console.log(` Tracked Projects: ${globalStats.trackedProjects}`);\n console.log(` Total Patterns: ${globalStats.totalPatterns}`);\n console.log(` Cross-Project Patterns: ${globalStats.crossProjectPatterns}`);\n console.log(` Fixed Patterns: ${globalStats.fixedPatterns}`);\n}\n\nasync function handleRecent(args: string[]): Promise<void> {\n const limit = parseInt(args[0] || '10', 10);\n const workDir = getWorkingDirectory(undefined, true);\n const issues = await getRecentIssues({ workDir, limit });\n\n if (issues.length === 0) {\n console.log('No recent issues found.');\n return;\n }\n\n console.log(`Recent Issues (last 7 days):\\n`);\n\n for (const i of issues) {\n const status = i.resolved ? '[RESOLVED]' : '';\n console.log(`[${i.severity.toUpperCase()}] ${status} ${i.issue.slice(0, 70)}`);\n console.log(` ${i.file}${i.line ? `:${i.line}` : ''} | ${i.agent}`);\n console.log('');\n }\n}\n\nasync function handleLogs(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const logs = await getDailyLogs(workDir);\n\n if (logs.length === 0) {\n console.log('No daily logs found.');\n return;\n }\n\n console.log('Daily Logs (.trie/memory/):\\n');\n for (const log of logs.slice(0, 14)) {\n console.log(` ${log}`);\n }\n\n if (logs.length > 14) {\n console.log(` ... and ${logs.length - 14} more`);\n }\n}\n\nasync function handleResolve(args: string[]): Promise<void> {\n const issueId = args[0];\n \n if (!issueId) {\n console.log('Usage: trie memory resolve <issue-id>');\n return;\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n const result = await markIssueResolved(issueId, workDir);\n\n if (result) {\n console.log(`Issue ${issueId} marked as resolved.`);\n } else {\n console.log(`Issue ${issueId} not found.`);\n }\n}\n\nasync function handleGlobal(args: string[]): Promise<void> {\n const action = args[0]?.toLowerCase();\n\n if (action === 'patterns') {\n const patterns = await findCrossProjectPatterns(2);\n \n if (patterns.length === 0) {\n console.log('No cross-project patterns found yet.');\n console.log('Patterns appear when the same issue is detected in multiple projects.');\n return;\n }\n\n console.log(`Cross-Project Patterns (${patterns.length}):\\n`);\n \n for (const p of patterns.slice(0, 10)) {\n console.log(`[${p.severity.toUpperCase()}] ${p.pattern.slice(0, 60)}`);\n console.log(` Occurrences: ${p.occurrences} across ${p.projects.length} projects`);\n console.log(` Agent: ${p.agent}`);\n if (p.fixApplied) {\n console.log(` Fixed in: ${p.fixApplied.project}`);\n }\n console.log('');\n }\n return;\n }\n\n if (action === 'projects') {\n const projects = await listTrackedProjects();\n \n if (projects.length === 0) {\n console.log('No projects tracked yet.');\n return;\n }\n\n console.log(`Tracked Projects (${projects.length}):\\n`);\n console.log('| Project | Last Scan | Health | Issues |');\n console.log('|---------|-----------|--------|--------|');\n \n for (const p of projects) {\n console.log(`| ${p.name.slice(0, 20)} | ${p.lastScan.split('T')[0]} | ${p.healthScore}% | ${p.totalIssues} |`);\n }\n return;\n }\n\n if (action === 'search') {\n const query = args.slice(1).join(' ');\n if (!query) {\n console.log('Usage: trie memory global search <query>');\n return;\n }\n\n const patterns = await searchGlobalPatterns(query, { limit: 10 });\n \n if (patterns.length === 0) {\n console.log(`No global patterns found matching \"${query}\"`);\n return;\n }\n\n console.log(`Global patterns matching \"${query}\":\\n`);\n for (const p of patterns) {\n console.log(`[${p.severity.toUpperCase()}] ${p.pattern.slice(0, 60)}`);\n console.log(` Projects: ${p.projects.slice(0, 3).join(', ')}`);\n console.log('');\n }\n return;\n }\n\n if (action === 'update') {\n await updateGlobalMemoryMd();\n console.log('Updated ~/.trie/memory/GLOBAL_MEMORY.md');\n return;\n }\n\n console.log(`\nGlobal Memory Commands:\n trie memory global patterns Show cross-project patterns\n trie memory global projects Show tracked projects\n trie memory global search <q> Search global patterns\n trie memory global update Update GLOBAL_MEMORY.md\n`);\n}\n\nfunction showHelp(): void {\n console.log(`\nMemory - Search and manage issue memory\n\nCommands:\n trie memory search <query> Search issues by keyword\n trie memory stats Show memory statistics\n trie memory recent [limit] Show recent issues\n trie memory logs List daily log files\n trie memory resolve <id> Mark issue as resolved\n trie memory global <action> Cross-project memory\n\nExamples:\n trie memory search \"SQL injection\"\n trie memory recent 20\n trie memory global patterns\n`);\n}\n"],"mappings":"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","names":["result","__filename","__dirname","showHelp"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/main.ts","../../src/cli/skills.ts","../../src/cli/init.ts","../../src/cli/memory.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent CLI\n * \n * Main command-line interface for Trie Agent.\n * Provides help, setup, and routes to specific tools.\n * \n * Usage:\n * trie-agent [command] [options]\n */\n\nimport { resolve, join, dirname } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { loadProjectInfo, initProjectInfo, projectInfoExists } from '../utils/project-info.js';\nimport { handleSkillsCommand } from './skills.js';\nimport { handleInitCommand } from './init.js';\nimport { handleMemoryCommand } from './memory.js';\nimport { handleCheckpointCommand } from './checkpoint.js';\n\n// ES module __dirname equivalent\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst VERSION = '1.0.0';\n\n/**\n * Show TRIE ASCII art banner\n */\nfunction showBanner(): void {\n console.log(`\n ████████╗██████╗ ██╗███████╗\n ╚══██╔══╝██╔══██╗██║██╔════╝\n ██║ ██████╔╝██║█████╗ \n ██║ ██╔══██╗██║██╔══╝ \n ██║ ██║ ██║██║███████╗\n ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝\n \n Your central registry for agents and skills\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n`);\n}\n\n/**\n * Show the main help message\n */\nfunction showHelp(): void {\n showBanner();\n console.log(`Version: ${VERSION}\n\nUSAGE:\n trie-agent <command> [options]\n\nCOMMANDS:\n help Show this help message\n init Initialize bootstrap files (.trie/RULES.md, etc.)\n setup Configure API key and environment\n scan Scan codebase once and exit\n checkpoint Save context without running a scan\n watch Watch for changes and scan continuously\n agents List all available agents\n skills Manage external skills from skills.sh\n project View/manage project info (.trie/PROJECT.md)\n memory Search and manage issue memory\n agent-smith Run Agent Smith (35 vibe code hunters)\n super-reviewer Run interactive PR review\n version Show version information\n\nEXAMPLES:\n # First time setup\n trie-agent setup\n\n # Scan your project once\n trie-agent scan\n\n # Watch mode (scan on file changes)\n trie-agent watch\n\n # Scan specific directory\n trie-agent scan --dir ./src\n\n # Scan with custom user count for cost estimation\n trie-agent scan --users 10000\n\n # Initialize project info file\n trie-agent project init\n\n # View project info\n trie-agent project\n\n # Install a skill from GitHub\n trie-agent skills add vercel-labs/agent-skills react-best-practices\n\n # List installed skills\n trie-agent skills list\n\n # Initialize bootstrap files\n trie-agent init\n\n # Search issue memory\n trie-agent memory search \"SQL injection\"\n\n # Run Agent Smith (vibe code hunter)\n trie-agent agent-smith\n\n # Run interactive PR review\n trie-agent super-reviewer\n\nMCP TOOLS (use via Cursor/Claude Desktop):\n trie_scan Intelligent scan with agent selection\n trie_fix Generate high-confidence fix prompts\n trie_explain Explain code, issues, or changes\n trie_watch Watch mode for autonomous reporting\n \n Individual Agents:\n trie_security Security vulnerabilities\n trie_privacy Privacy & GDPR compliance\n trie_soc2 SOC 2 Type II compliance\n trie_legal Legal compliance\n trie_accessibility WCAG 2.1 accessibility\n trie_architecture Code organization & SOLID\n trie_bugs Bug finding & null safety\n trie_ux UX testing (happy path, edge cases)\n trie_types TypeScript type safety\n trie_devops DevOps & deployment\n trie_clean Clean up AI-generated code\n \n Special Agents:\n trie_agent_smith 35 vibe code hunters, cross-file detection\n trie_super_reviewer Interactive PR review with cross-examination\n\n Custom Skills:\n trie_create_skill Create skill from PDF/TXT/MD document\n trie_list_skills List all registered skills\n\n`);\n}\n\n/**\n * Show setup instructions\n */\nfunction showSetup(): void {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 🔧 Trie Agent Setup ║\n╚══════════════════════════════════════════════════════════════════╝\n\nNo API key required! Trie uses your AI tool's built-in Claude.\n\nSTEP 1: Configure for your AI tool\n─────────────────────────────────────\n\nFor CLAUDE CODE:\n claude mcp add Trie -- npx @triedotdev/mcp\n\n Or add to ~/.claude/settings.json:\n {\n \"mcpServers\": {\n \"Trie\": {\n \"command\": \"node\",\n \"args\": [\"/path/to/@triedotdev/mcp/dist/index.js\"]\n }\n }\n }\n\nFor CURSOR (~/.cursor/mcp.json):\n{\n \"mcpServers\": {\n \"Trie\": {\n \"command\": \"node\",\n \"args\": [\"/path/to/@triedotdev/mcp/dist/index.js\"]\n }\n }\n}\n\nSTEP 2: Restart your AI tool\n─────────────────────────────────────\nRestart Claude Code or Cursor to load the MCP configuration.\n\nSTEP 3: Start scanning!\n─────────────────────────────────────\nAsk your AI assistant: \"Scan this with Trie\" or \"Use trie_scan\"\n\nNeed help? https://github.com/Trie-OS/Trie-Agent/issues\n`);\n}\n\n/**\n * List available agents\n */\nfunction listAgents(): void {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Available Agents ║\n╚══════════════════════════════════════════════════════════════════╝\n\nBUILT-IN AGENTS:\n─────────────────────────────────────\n security Security vulnerabilities, injection risks, auth issues\n privacy GDPR, HIPAA, PII handling, data encryption\n legal GDPR, CCPA, consent patterns, data retention\n accessibility WCAG 2.1 accessibility, keyboard nav, screen readers\n software-architect Code organization, SOLID principles, scalability\n bug-finding Null safety, edge cases, async issues\n user-testing Simulate users: happy path, security tester, confused user\n typecheck Type errors, missing annotations, null checks\n devops Config issues, logging, env vars, deployment\n trie_clean Clean up AI-generated code patterns\n moneybags Estimates dollar cost of bugs (IBM/NIST cost models)\n production-ready Production gate: health checks, scaling, security headers\n\n Custom Skills:\n ─────────────────────────────────────`);\n\n // Check for custom skills\n const skillsDir = join(getWorkingDirectory(undefined, true), '.trie', 'agents');\n if (existsSync(skillsDir)) {\n try {\n const { readdirSync } = require('fs');\n const files = readdirSync(skillsDir).filter((f: string) => f.endsWith('.json'));\n \n if (files.length > 0) {\n for (const file of files) {\n const config = JSON.parse(readFileSync(join(skillsDir, file), 'utf-8'));\n console.log(` ${config.name.padEnd(18)} ${config.description || 'Custom skill'}`);\n }\n } else {\n console.log(` (No custom skills found)`);\n }\n } catch {\n console.log(` (No custom skills found)`);\n }\n } else {\n console.log(` (No custom skills found)`);\n }\n\n console.log(`\nCREATE CUSTOM SKILLS:\n─────────────────────────────────────\nYou can create skills from PDF, TXT, or MD documents:\n\n Via MCP: Use trie_create_skill tool\n CLI: trie-create --file book.pdf --name my-skill\n\nThe agent will learn patterns from your document and apply them\nto code reviews. Great for style guides, compliance docs, etc.\n`);\n}\n\n/**\n * Show version\n */\nfunction showVersion(): void {\n showBanner();\n console.error(`v${VERSION}`);\n}\n\n/**\n * Handle project command\n */\nasync function handleProject(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const workDir = getWorkingDirectory(undefined, true);\n\n if (subcommand === 'init') {\n const result = await initProjectInfo(workDir);\n if (result.created) {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 PROJECT.md Created ║\n╚══════════════════════════════════════════════════════════════════╝\n\nPath: ${result.path}\n\nA template has been created with sections for:\n • Project Overview\n • Technology Stack\n • Architecture\n • Coding Conventions\n • Environment\n • Team\n • Compliance\n • AI Instructions\n\nNext steps:\n 1. Edit the file to add your project details\n 2. The info will be available via trie://project resource\n 3. AI assistants will use this context automatically\n`);\n } else {\n console.log(`PROJECT.md already exists at: ${result.path}`);\n console.log('Use \"trie-agent project\" to view it.');\n }\n return;\n }\n\n if (subcommand === 'edit') {\n const editor = process.env.EDITOR || process.env.VISUAL || 'nano';\n const projectPath = join(workDir, '.trie', 'PROJECT.md');\n \n if (!projectInfoExists(workDir)) {\n console.log('No PROJECT.md found. Creating one first...');\n await initProjectInfo(workDir);\n }\n \n const { spawn } = await import('child_process');\n const child = spawn(editor, [projectPath], { stdio: 'inherit' });\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n return;\n }\n\n // Default: show project info\n if (!projectInfoExists(workDir)) {\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Project Information ║\n╚══════════════════════════════════════════════════════════════════╝\n\nNo PROJECT.md found in this project.\n\nCOMMANDS:\n trie-agent project init Create PROJECT.md from template\n trie-agent project edit Open PROJECT.md in $EDITOR\n trie-agent project View PROJECT.md contents\n\nWHAT IS PROJECT.MD?\nPROJECT.md stores important project context for AI assistants:\n • Project description and purpose\n • Technology stack and frameworks\n • Architecture decisions\n • Coding conventions\n • Environment info (URLs, endpoints)\n • Team ownership\n • Compliance requirements\n • Special instructions for AI\n\nThis info is available via trie://project MCP resource.\n`);\n return;\n }\n\n const content = await loadProjectInfo(workDir);\n console.log(`\n╔══════════════════════════════════════════════════════════════════╗\n║ 📋 Project Information ║\n╚══════════════════════════════════════════════════════════════════╝\n\nPath: ${join(workDir, '.trie', 'PROJECT.md')}\n\n${'-'.repeat(68)}\n`);\n console.log(content);\n}\n\n/**\n * Run scan command\n */\nasync function runScan(args: string[]): Promise<void> {\n // Forward to watch daemon with --once flag\n const { spawn } = await import('child_process');\n \n // Determine daemon path - works for both source (tsx) and built (node) execution\n let daemonPath: string;\n if (__filename.endsWith('.ts')) {\n // Running from source with tsx\n daemonPath = resolve(__dirname, 'yolo-daemon.ts');\n } else {\n // Running from built dist\n daemonPath = resolve(__dirname, 'yolo-daemon.js');\n }\n \n const daemonArgs = ['--once', ...args];\n \n // Use tsx for .ts files, node for .js files\n const executor = daemonPath.endsWith('.ts') ? 'npx' : 'node';\n const execArgs = daemonPath.endsWith('.ts') \n ? ['tsx', daemonPath, ...daemonArgs]\n : [daemonPath, ...daemonArgs];\n \n const child = spawn(executor, execArgs, {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n}\n\n/**\n * Run watch command\n */\nasync function runWatch(args: string[]): Promise<void> {\n const { spawn } = await import('child_process');\n \n // Determine daemon path - works for both source (tsx) and built (node) execution\n let daemonPath: string;\n if (__filename.endsWith('.ts')) {\n daemonPath = resolve(__dirname, 'yolo-daemon.ts');\n } else {\n daemonPath = resolve(__dirname, 'yolo-daemon.js');\n }\n \n // Use tsx for .ts files, node for .js files\n const executor = daemonPath.endsWith('.ts') ? 'npx' : 'node';\n const execArgs = daemonPath.endsWith('.ts') \n ? ['tsx', daemonPath, ...args]\n : [daemonPath, ...args];\n \n const child = spawn(executor, execArgs, {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code) => {\n process.exit(code || 0);\n });\n}\n\n/**\n * Main entry point\n */\nfunction main(): void {\n const args = process.argv.slice(2);\n const command = args[0]?.toLowerCase();\n const restArgs = args.slice(1);\n\n // No command or help flag\n if (!command || command === 'help' || command === '--help' || command === '-h') {\n showHelp();\n process.exit(0);\n }\n\n switch (command) {\n case 'setup':\n case 'config':\n case 'configure':\n showSetup();\n break;\n\n case 'init':\n case 'bootstrap':\n handleInitCommand(restArgs);\n break;\n\n case 'memory':\n case 'mem':\n handleMemoryCommand(restArgs);\n break;\n\n case 'checkpoint':\n case 'cp':\n case 'save':\n handleCheckpointCommand(restArgs);\n break;\n\n case 'agents':\n case 'list':\n case 'list-agents':\n listAgents();\n break;\n\n case 'project':\n case 'info':\n case 'project-info':\n handleProject(restArgs);\n break;\n\n case 'skills':\n case 'skill':\n handleSkillsCommand(restArgs);\n break;\n\n case 'version':\n case '--version':\n case '-v':\n showVersion();\n break;\n\n case 'scan':\n runScan(restArgs);\n break;\n\n case 'watch':\n runWatch(restArgs);\n break;\n\n case 'agent-smith':\n case 'smith':\n case 'trie_agent_smith':\n // Run agent-smith specifically\n runScan(['--agents', 'agent-smith', ...restArgs]);\n break;\n\n case 'super-reviewer':\n case 'reviewer':\n case 'trie_super_reviewer':\n // Run super-reviewer specifically\n runScan(['--agents', 'super-reviewer', ...restArgs]);\n break;\n\n default:\n // Check if it looks like a flag (pass to watch daemon)\n if (command.startsWith('-')) {\n // Treat as watch-daemon args\n const { spawn } = require('child_process');\n const daemonPath = resolve(__dirname, 'yolo-daemon.js');\n \n const child = spawn('node', [daemonPath, ...args], {\n stdio: 'inherit',\n env: process.env\n });\n\n child.on('close', (code: number) => {\n process.exit(code || 0);\n });\n } else {\n console.error(`Unknown command: ${command}`);\n console.error(`Run 'trie-agent help' for usage information.`);\n process.exit(1);\n }\n }\n}\n\nmain();\n","/**\n * Skills CLI Command Handler\n * \n * Manages external skills from skills.sh and other GitHub repositories.\n * Skills are reusable capabilities that agents apply during code review.\n */\n\nimport { installSkill, listInstalledSkills, removeSkill } from '../skills/installer.js';\nimport { loadContextState, recordSkillInstalled } from '../utils/context-state.js';\nimport { SKILL_CATEGORIES, getSkillCategories, getSkillsByCategory } from '../bootstrap/stack-detector.js';\n\nexport async function handleSkillsCommand(args: string[]): Promise<void> {\n const [cmd, ...rest] = args;\n\n switch (cmd) {\n case 'add':\n case 'install': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills add <owner/repo> [skill-name]');\n console.log('');\n console.log('Examples:');\n console.log(' trie-agent skills add vercel-labs/agent-skills react-best-practices');\n console.log(' trie-agent skills add anthropics/skills claude-code-review');\n console.log(' trie-agent skills add myorg/internal-standards');\n return;\n }\n \n console.log(`Installing skill from ${rest[0]}...`);\n const result = await installSkill(rest[0], rest[1]);\n \n if (result.success) {\n await recordSkillInstalled({ name: result.name, source: rest[0] });\n console.log(`Installed: ${result.name}`);\n console.log(`Path: ${result.path}`);\n console.log('');\n console.log('This skill is now a capability the skill-review agent can apply.');\n console.log('Run \"trie-agent scan\" to apply skills to your codebase.');\n } else {\n console.error(`Failed to install: ${result.error}`);\n process.exit(1);\n }\n break;\n }\n \n case 'list':\n case 'ls': {\n const categoryArg = rest[0]?.toLowerCase();\n \n // If a category is specified, show skills in that category\n if (categoryArg) {\n if (categoryArg === 'categories' || categoryArg === 'all') {\n // Show all available categories\n const categories = getSkillCategories();\n console.log('');\n console.log('Available Skill Categories:');\n console.log('');\n for (const cat of categories) {\n console.log(` ${cat.name.padEnd(15)} ${cat.count} skills`);\n }\n console.log('');\n console.log('View skills in a category:');\n console.log(' trie skills list <category>');\n console.log('');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n const categorySkills = getSkillsByCategory(categoryArg);\n if (categorySkills.length === 0) {\n const categories = getSkillCategories();\n console.log(`Unknown category: ${categoryArg}`);\n console.log('');\n console.log('Available categories:');\n for (const cat of categories) {\n console.log(` ${cat.name}`);\n }\n return;\n }\n \n console.log('');\n console.log(`${categoryArg.charAt(0).toUpperCase() + categoryArg.slice(1)} Skills (${categorySkills.length}):`);\n console.log('');\n for (const skill of categorySkills) {\n console.log(` trie skills add ${skill}`);\n }\n console.log('');\n console.log('Install any skill with: trie skills add <source> <name>');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n // No category - show installed skills\n const skills = await listInstalledSkills();\n const state = await loadContextState();\n \n if (skills.length === 0) {\n console.log('');\n console.log('No skills installed.');\n console.log('');\n console.log('Install a skill:');\n console.log(' trie skills add vercel-labs/agent-skills react-best-practices');\n console.log('');\n console.log('Explore skill categories:');\n const categories = getSkillCategories();\n for (const cat of categories.slice(0, 5)) {\n console.log(` trie skills list ${cat.name.padEnd(15)} # ${cat.count} skills`);\n }\n console.log(' trie skills list categories # see all');\n console.log('');\n console.log('Browse all skills: https://skills.sh');\n return;\n }\n \n console.log('');\n console.log(`Installed Skills (${skills.length}):`);\n console.log('');\n \n for (const skill of skills) {\n const record = state.skills?.[skill.name];\n const usage = record ? `applied ${record.timesApplied}x` : 'not yet applied';\n console.log(` ${skill.name} (${usage})`);\n console.log(` ${skill.description}`);\n console.log(` Source: ${skill.installedFrom}`);\n console.log('');\n }\n \n console.log('These skills are applied by the skill-review agent during scans.');\n console.log('');\n console.log('Explore more: trie skills list categories');\n break;\n }\n \n case 'remove':\n case 'rm':\n case 'uninstall': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills remove <skill-name>');\n return;\n }\n \n const removed = await removeSkill(rest[0]);\n if (removed) {\n console.log(`Removed: ${rest[0]}`);\n } else {\n console.error(`Skill not found: ${rest[0]}`);\n process.exit(1);\n }\n break;\n }\n \n case 'info': {\n if (!rest[0]) {\n console.log('Usage: trie-agent skills info <skill-name>');\n return;\n }\n \n const skills = await listInstalledSkills();\n const skill = skills.find(s => s.name === rest[0]);\n \n if (!skill) {\n console.error(`Skill not found: ${rest[0]}`);\n process.exit(1);\n return;\n }\n \n const state = await loadContextState();\n const record = state.skills?.[skill.name];\n \n console.log('');\n console.log(`Skill: ${skill.name}`);\n console.log(`Description: ${skill.description}`);\n console.log(`Path: ${skill.path}`);\n console.log(`Source: ${skill.installedFrom}`);\n console.log(`Installed: ${new Date(skill.installedAt).toLocaleString()}`);\n \n if (record) {\n console.log(`Times Applied: ${record.timesApplied}`);\n console.log(`Applied By: ${record.appliedBy.join(', ') || 'none'}`);\n if (record.lastApplied) {\n console.log(`Last Applied: ${new Date(record.lastApplied).toLocaleString()}`);\n }\n } else {\n console.log('Times Applied: 0');\n }\n break;\n }\n \n default: {\n const categories = getSkillCategories();\n console.log(`\nSkills - Reusable capabilities from skills.sh\n\nSkills are NOT agents - they are knowledge/instructions that the\nskill-review agent applies during code review.\n\nCommands:\n trie skills add <source> [name] Install a skill\n trie skills list List installed skills\n trie skills list <category> Browse skills by category\n trie skills list categories Show all categories\n trie skills info <name> Show skill details\n trie skills remove <name> Uninstall a skill\n\nExamples:\n trie skills add vercel-labs/agent-skills react-best-practices\n trie skills add anthropics/skills frontend-design\n trie skills add expo/skills upgrading-expo\n\nCategories (${categories.length} total, ${Object.values(SKILL_CATEGORIES).flat().length}+ skills):\n ${categories.map(c => `${c.name} (${c.count})`).join(', ')}\n\nHow it works:\n 1. You install skills (capabilities)\n 2. The skill-review agent applies them during 'trie scan'\n 3. Usage is tracked in your project context\n\nBrowse all skills: https://skills.sh\n `);\n }\n }\n}\n","/**\n * CLI Init Command\n * \n * Initialize bootstrap files for a new project.\n */\n\nimport { initializeBootstrapFiles, needsBootstrap, completeBootstrap } from '../bootstrap/index.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { getSkillCategories } from '../bootstrap/stack-detector.js';\n\nexport async function handleInitCommand(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const workDir = getWorkingDirectory(undefined, true);\n\n if (subcommand === 'complete') {\n const result = await completeBootstrap(workDir);\n if (result) {\n console.log('Bootstrap completed. BOOTSTRAP.md has been deleted.');\n } else {\n console.log('No BOOTSTRAP.md file found.');\n }\n return;\n }\n\n if (subcommand === 'status') {\n const needs = needsBootstrap(workDir);\n if (needs) {\n console.log('Bootstrap pending: .trie/BOOTSTRAP.md exists');\n console.log('Run \"trie init complete\" after finishing setup.');\n } else {\n console.log('Bootstrap complete: No pending setup.');\n }\n return;\n }\n\n const force = args.includes('--force') || args.includes('-f');\n const skipBootstrap = args.includes('--skip-bootstrap');\n\n console.log(`\n╔════════════════════════════════════════════════╗\n║ ║\n║ ████████╗██████╗ ██╗███████╗ ║\n║ ╚══██╔══╝██╔══██╗██║██╔════╝ ║\n║ ██║ ██████╔╝██║█████╗ ║\n║ ██║ ██╔══██╗██║██╔══╝ ║\n║ ██║ ██║ ██║██║███████╗ ║\n║ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝ ║\n║ ║\n║ Your central registry for agents and skills ║\n║ ║\n╚════════════════════════════════════════════════╝\n\n by Louis Kishfy\n\n Download the Trie workspace: https://www.trie.dev\n Follow me on X: https://x.com/louiskishfy\n\n`);\n\n const result = await initializeBootstrapFiles({\n workDir,\n force,\n skipBootstrap,\n });\n\n if (result.created.length > 0) {\n console.log('Created files:');\n for (const file of result.created) {\n console.log(` + .trie/${file}`);\n }\n }\n\n if (result.skipped.length > 0 && !force) {\n console.log('\\nSkipped (already exist):');\n for (const file of result.skipped) {\n console.log(` - .trie/${file}`);\n }\n }\n\n console.log('\\nDetected Stack:');\n if (result.stack.framework) console.log(` Framework: ${result.stack.framework}`);\n if (result.stack.language) console.log(` Language: ${result.stack.language}`);\n if (result.stack.database) console.log(` Database: ${result.stack.database}`);\n if (result.stack.auth) console.log(` Auth: ${result.stack.auth}`);\n if (result.stack.packageManager) console.log(` Package Manager: ${result.stack.packageManager}`);\n\n if (result.stack.suggestedSkills.length > 0) {\n // Limit to top 5 most relevant skills to avoid overwhelming output\n const topSkills = result.stack.suggestedSkills.slice(0, 5);\n console.log('\\nSuggested Skills (based on your stack):');\n for (const skill of topSkills) {\n console.log(` trie skills add ${skill}`);\n }\n if (result.stack.suggestedSkills.length > 5) {\n console.log(` ... and ${result.stack.suggestedSkills.length - 5} more (run \"trie init\" again to see all)`);\n }\n }\n\n // Show category exploration options\n const categories = getSkillCategories();\n const topCategories = categories.slice(0, 5);\n console.log('\\nExplore skill categories:');\n for (const cat of topCategories) {\n console.log(` trie skills list ${cat.name.padEnd(15)} # ${cat.count} skills`);\n }\n console.log(` trie skills list categories # see all ${categories.length} categories`);\n \n console.log('\\nBrowse all skills: https://skills.sh');\n\n console.log(`\nNext Steps:\n 1. Edit .trie/PROJECT.md with your project description\n 2. Define coding standards in .trie/RULES.md\n 3. Run \"trie scan\" to analyze your codebase\n 4. Run \"trie init complete\" when setup is done\n`);\n}\n","/**\n * CLI Memory Command\n * \n * Search and manage issue memory.\n */\n\nimport {\n searchIssues,\n getMemoryStats,\n getRecentIssues,\n getDailyLogs,\n markIssueResolved,\n} from '../memory/issue-store.js';\nimport {\n findCrossProjectPatterns,\n listTrackedProjects,\n getGlobalMemoryStats,\n updateGlobalMemoryMd,\n searchGlobalPatterns,\n} from '../memory/global-memory.js';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport async function handleMemoryCommand(args: string[]): Promise<void> {\n const subcommand = args[0]?.toLowerCase();\n const restArgs = args.slice(1);\n\n switch (subcommand) {\n case 'search':\n await handleSearch(restArgs);\n break;\n case 'stats':\n await handleStats();\n break;\n case 'recent':\n await handleRecent(restArgs);\n break;\n case 'logs':\n await handleLogs();\n break;\n case 'resolve':\n await handleResolve(restArgs);\n break;\n case 'global':\n await handleGlobal(restArgs);\n break;\n default:\n showHelp();\n }\n}\n\nasync function handleSearch(args: string[]): Promise<void> {\n const query = args.join(' ');\n \n if (!query) {\n console.log('Usage: trie memory search <query>');\n console.log('Example: trie memory search \"SQL injection\"');\n return;\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n const results = await searchIssues(query, { workDir, limit: 10 });\n\n if (results.length === 0) {\n console.log(`No issues found matching \"${query}\"`);\n return;\n }\n\n console.log(`Found ${results.length} issue(s) matching \"${query}\":\\n`);\n\n for (const result of results) {\n const i = result.issue;\n const status = i.resolved ? '[RESOLVED]' : '';\n console.log(`[${i.severity.toUpperCase()}] ${status} ${i.issue.slice(0, 80)}`);\n console.log(` File: ${i.file}${i.line ? `:${i.line}` : ''}`);\n console.log(` Agent: ${i.agent} | Score: ${(result.score * 100).toFixed(0)}%`);\n console.log(` Date: ${new Date(i.timestamp).toLocaleDateString()}`);\n console.log('');\n }\n}\n\nasync function handleStats(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const stats = await getMemoryStats(workDir);\n const globalStats = await getGlobalMemoryStats();\n\n console.log('Local Issue Memory Stats:');\n console.log(` Total Issues: ${stats.totalIssues}`);\n console.log(` Resolved: ${stats.resolvedCount}`);\n \n if (stats.oldestIssue) {\n console.log(` Date Range: ${stats.oldestIssue.split('T')[0]} to ${stats.newestIssue?.split('T')[0]}`);\n }\n\n console.log('\\n By Severity:');\n for (const [severity, count] of Object.entries(stats.issuesBySeverity)) {\n console.log(` ${severity}: ${count}`);\n }\n\n console.log('\\n By Agent:');\n const sortedAgents = Object.entries(stats.issuesByAgent).sort((a, b) => b[1] - a[1]);\n for (const [agent, count] of sortedAgents.slice(0, 10)) {\n console.log(` ${agent}: ${count}`);\n }\n\n console.log('\\nGlobal Cross-Project Stats:');\n console.log(` Tracked Projects: ${globalStats.trackedProjects}`);\n console.log(` Total Patterns: ${globalStats.totalPatterns}`);\n console.log(` Cross-Project Patterns: ${globalStats.crossProjectPatterns}`);\n console.log(` Fixed Patterns: ${globalStats.fixedPatterns}`);\n}\n\nasync function handleRecent(args: string[]): Promise<void> {\n const limit = parseInt(args[0] || '10', 10);\n const workDir = getWorkingDirectory(undefined, true);\n const issues = await getRecentIssues({ workDir, limit });\n\n if (issues.length === 0) {\n console.log('No recent issues found.');\n return;\n }\n\n console.log(`Recent Issues (last 7 days):\\n`);\n\n for (const i of issues) {\n const status = i.resolved ? '[RESOLVED]' : '';\n console.log(`[${i.severity.toUpperCase()}] ${status} ${i.issue.slice(0, 70)}`);\n console.log(` ${i.file}${i.line ? `:${i.line}` : ''} | ${i.agent}`);\n console.log('');\n }\n}\n\nasync function handleLogs(): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const logs = await getDailyLogs(workDir);\n\n if (logs.length === 0) {\n console.log('No daily logs found.');\n return;\n }\n\n console.log('Daily Logs (.trie/memory/):\\n');\n for (const log of logs.slice(0, 14)) {\n console.log(` ${log}`);\n }\n\n if (logs.length > 14) {\n console.log(` ... and ${logs.length - 14} more`);\n }\n}\n\nasync function handleResolve(args: string[]): Promise<void> {\n const issueId = args[0];\n \n if (!issueId) {\n console.log('Usage: trie memory resolve <issue-id>');\n return;\n }\n\n const workDir = getWorkingDirectory(undefined, true);\n const result = await markIssueResolved(issueId, workDir);\n\n if (result) {\n console.log(`Issue ${issueId} marked as resolved.`);\n } else {\n console.log(`Issue ${issueId} not found.`);\n }\n}\n\nasync function handleGlobal(args: string[]): Promise<void> {\n const action = args[0]?.toLowerCase();\n\n if (action === 'patterns') {\n const patterns = await findCrossProjectPatterns(2);\n \n if (patterns.length === 0) {\n console.log('No cross-project patterns found yet.');\n console.log('Patterns appear when the same issue is detected in multiple projects.');\n return;\n }\n\n console.log(`Cross-Project Patterns (${patterns.length}):\\n`);\n \n for (const p of patterns.slice(0, 10)) {\n console.log(`[${p.severity.toUpperCase()}] ${p.pattern.slice(0, 60)}`);\n console.log(` Occurrences: ${p.occurrences} across ${p.projects.length} projects`);\n console.log(` Agent: ${p.agent}`);\n if (p.fixApplied) {\n console.log(` Fixed in: ${p.fixApplied.project}`);\n }\n console.log('');\n }\n return;\n }\n\n if (action === 'projects') {\n const projects = await listTrackedProjects();\n \n if (projects.length === 0) {\n console.log('No projects tracked yet.');\n return;\n }\n\n console.log(`Tracked Projects (${projects.length}):\\n`);\n console.log('| Project | Last Scan | Health | Issues |');\n console.log('|---------|-----------|--------|--------|');\n \n for (const p of projects) {\n console.log(`| ${p.name.slice(0, 20)} | ${p.lastScan.split('T')[0]} | ${p.healthScore}% | ${p.totalIssues} |`);\n }\n return;\n }\n\n if (action === 'search') {\n const query = args.slice(1).join(' ');\n if (!query) {\n console.log('Usage: trie memory global search <query>');\n return;\n }\n\n const patterns = await searchGlobalPatterns(query, { limit: 10 });\n \n if (patterns.length === 0) {\n console.log(`No global patterns found matching \"${query}\"`);\n return;\n }\n\n console.log(`Global patterns matching \"${query}\":\\n`);\n for (const p of patterns) {\n console.log(`[${p.severity.toUpperCase()}] ${p.pattern.slice(0, 60)}`);\n console.log(` Projects: ${p.projects.slice(0, 3).join(', ')}`);\n console.log('');\n }\n return;\n }\n\n if (action === 'update') {\n await updateGlobalMemoryMd();\n console.log('Updated ~/.trie/memory/GLOBAL_MEMORY.md');\n return;\n }\n\n console.log(`\nGlobal Memory Commands:\n trie memory global patterns Show cross-project patterns\n trie memory global projects Show tracked projects\n trie memory global search <q> Search global patterns\n trie memory global update Update GLOBAL_MEMORY.md\n`);\n}\n\nfunction showHelp(): void {\n console.log(`\nMemory - Search and manage issue memory\n\nCommands:\n trie memory search <query> Search issues by keyword\n trie memory stats Show memory statistics\n trie memory recent [limit] Show recent issues\n trie memory logs List daily log files\n trie memory resolve <id> Mark issue as resolved\n trie memory global <action> Cross-project memory\n\nExamples:\n trie memory search \"SQL injection\"\n trie memory recent 20\n trie memory global patterns\n`);\n}\n"],"mappings":"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","names":["result","__filename","__dirname","showHelp"]}
|
package/dist/cli/yolo-daemon.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
TrieScanTool
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-GERAB55E.js";
|
|
5
|
+
import "../chunk-37U65YW7.js";
|
|
6
6
|
import "../chunk-PZDQIFKO.js";
|
|
7
7
|
import "../chunk-3CS6Z2SL.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-3SQK2RKF.js";
|
|
9
9
|
import {
|
|
10
10
|
getWorkingDirectory
|
|
11
11
|
} from "../chunk-IMFD4SJC.js";
|
|
@@ -115,28 +115,40 @@ var WatchDaemon = class {
|
|
|
115
115
|
issueCount = 0;
|
|
116
116
|
}
|
|
117
117
|
} else {
|
|
118
|
-
const
|
|
119
|
-
|
|
118
|
+
const patterns = [
|
|
119
|
+
/(\d+)\s+actionable\s+issues?\s+found/i,
|
|
120
|
+
// "30 actionable issues found"
|
|
121
|
+
/(\d+)\s+Issues?\s+Found/i,
|
|
122
|
+
// "30 Issues Found"
|
|
123
|
+
/Found\s+(\d+)\s+issues?/i,
|
|
124
|
+
// "Found 30 issues"
|
|
125
|
+
/\[COMPLETE\]\s+(\d+)\s+issues?/i,
|
|
126
|
+
// "[COMPLETE] 30 issues"
|
|
127
|
+
/(\d+)\s+total/i
|
|
128
|
+
// "30 total" (fallback)
|
|
129
|
+
];
|
|
130
|
+
for (const pattern of patterns) {
|
|
131
|
+
const match = resultText.match(pattern);
|
|
132
|
+
if (match && match[1]) {
|
|
133
|
+
issueCount = parseInt(match[1], 10);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
120
137
|
}
|
|
121
138
|
this.stats.filesScanned += files?.length || 1;
|
|
122
139
|
this.stats.issuesFound += issueCount;
|
|
123
140
|
if (issueCount > 0) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
});
|
|
128
|
-
const criticalMatch = resultText.match(/(\d+) CRITICAL/);
|
|
129
|
-
const seriousMatch = resultText.match(/(\d+) SERIOUS/);
|
|
130
|
-
if (criticalMatch && criticalMatch[1]) {
|
|
141
|
+
const criticalMatch = resultText.match(/(\d+)\s+critical/i);
|
|
142
|
+
const seriousMatch = resultText.match(/(\d+)\s+serious|(\d+)\s+important/i);
|
|
143
|
+
if (criticalMatch && criticalMatch[1] && parseInt(criticalMatch[1], 10) > 0) {
|
|
131
144
|
this.log("error", "Critical issues detected", { count: parseInt(criticalMatch[1], 10) });
|
|
132
145
|
}
|
|
133
|
-
if (seriousMatch && seriousMatch[1]) {
|
|
134
|
-
|
|
146
|
+
if (seriousMatch && (seriousMatch[1] || seriousMatch[2])) {
|
|
147
|
+
const count = parseInt(seriousMatch[1] || seriousMatch[2] || "0", 10);
|
|
148
|
+
if (count > 0) {
|
|
149
|
+
this.log("warn", "Serious issues detected", { count });
|
|
150
|
+
}
|
|
135
151
|
}
|
|
136
|
-
} else {
|
|
137
|
-
this.log("info", "No issues found", {
|
|
138
|
-
files: files?.map((f) => basename(f)) || ["full scan"]
|
|
139
|
-
});
|
|
140
152
|
}
|
|
141
153
|
} catch (error) {
|
|
142
154
|
this.stats.errors++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/yolo-daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent Watch Daemon\n * \n * Headless file watcher for local/CI environments.\n * Watches a directory and reports issues as they occur.\n * \n * Usage:\n * node dist/cli/yolo-daemon.js [options]\n * \n * Options:\n * --dir, -d Directory to watch (default: cwd)\n * --debounce, -D Debounce time in ms (default: 1000)\n * --json Output as JSON (for log aggregation)\n * --once Run once and exit (no watch)\n */\n\nimport { watch, existsSync, statSync, readFileSync } from 'fs';\nimport { readdir } from 'fs/promises';\nimport { join, extname, basename, resolve } from 'path';\nimport { TrieScanTool } from '../tools/scan.js';\nimport { getWorkingDirectory } from '../utils/workspace.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 runOnce: 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}\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 scanTool = new TrieScanTool();\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\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 }\n\n /**\n * Start the daemon\n */\n async start(): Promise<void> {\n this.log('info', 'Starting Trie Agent Watch Daemon', {\n directory: this.config.directory,\n debounceMs: this.config.debounceMs\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 // Run initial scan\n this.log('info', 'Running initial scan...');\n await this.runScan(this.config.files);\n\n // If run-once mode, exit after initial scan\n if (this.config.runOnce) {\n this.log('info', 'Run-once mode: exiting after initial scan', { ...this.stats });\n process.exit(this.stats.issuesFound > 0 ? 1 : 0);\n }\n\n // Start watching\n await this.watchDirectory(this.config.directory);\n this.log('info', 'Watching for file 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 * Run a scan on all files or specific files\n */\n private async runScan(files?: string[]): Promise<void> {\n try {\n const scanArgs: Record<string, unknown> = files\n ? { files }\n : { directory: this.config.directory };\n\n if (this.config.format) scanArgs.format = this.config.format;\n if (this.config.output) scanArgs.output = this.config.output;\n if (this.config.parallel !== undefined) scanArgs.parallel = this.config.parallel;\n if (this.config.cache !== undefined) scanArgs.cache = this.config.cache;\n if (this.config.maxConcurrency) scanArgs.maxConcurrency = this.config.maxConcurrency;\n if (this.config.streaming !== undefined) scanArgs.streaming = this.config.streaming;\n if (this.config.interactive !== undefined) scanArgs.interactive = this.config.interactive;\n if (this.config.workers !== undefined) scanArgs.workers = this.config.workers;\n if (this.config.timeoutMs) scanArgs.timeoutMs = this.config.timeoutMs;\n if (this.config.userCount) scanArgs.userCount = this.config.userCount;\n\n const result = await this.scanTool.execute(scanArgs);\n const resultText = result.content?.[0]?.text || '';\n\n // PRINT THE FULL REPORT TO STDOUT (for terminal/chat display)\n if (resultText && this.config.runOnce) {\n console.log(resultText);\n }\n\n // Parse results\n let issueCount = 0;\n if (this.config.format === 'json' && this.config.output && existsSync(this.config.output)) {\n try {\n const report = JSON.parse(readFileSync(this.config.output, 'utf-8'));\n issueCount = report?.results?.totalIssues ?? 0;\n } catch {\n issueCount = 0;\n }\n } else {\n const issueMatch = resultText.match(/(\\d+) total/);\n issueCount = issueMatch && issueMatch[1] ? parseInt(issueMatch[1], 10) : 0;\n }\n\n this.stats.filesScanned += files?.length || 1;\n this.stats.issuesFound += issueCount;\n\n if (issueCount > 0) {\n this.log('warn', 'Issues found', {\n count: issueCount,\n files: files?.map(f => basename(f)) || ['full scan']\n });\n\n // Parse severity breakdown\n const criticalMatch = resultText.match(/(\\d+) CRITICAL/);\n const seriousMatch = resultText.match(/(\\d+) SERIOUS/);\n\n if (criticalMatch && criticalMatch[1]) {\n this.log('error', 'Critical issues detected', { count: parseInt(criticalMatch[1], 10) });\n }\n if (seriousMatch && seriousMatch[1]) {\n this.log('warn', 'Serious issues detected', { count: parseInt(seriousMatch[1], 10) });\n }\n } else {\n this.log('info', 'No issues found', {\n files: files?.map(f => basename(f)) || ['full scan']\n });\n }\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Scan failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\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.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 await this.runScan(files);\n this.isProcessing = false;\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 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: 'ℹ️', warn: '⚠️', error: '❌' }[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 shutdown(signal: string): void {\n this.log('info', 'Shutting down', { signal, stats: this.stats });\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 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 directory: getWorkingDirectory(),\n debounceMs: 1000,\n jsonOutput: false,\n runOnce: false\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 '--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 '--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 '--once':\n config.runOnce = true;\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 Agent Watch Daemon\nHeadless file watcher for local/CI environments.\n\nUsage:\n node dist/cli/yolo-daemon.js [options]\n\nOptions:\n --dir, -d Directory to watch (default: cwd)\n --debounce, -D Debounce time in ms (default: 1000)\n --json Output as JSON (for log aggregation)\n --format Scan output format: text|json\n --output Output file path for json format\n --parallel Enable parallel execution\n --no-parallel Disable parallel execution\n --cache Enable result caching\n --no-cache Disable result caching\n --max-concurrency Max parallel agents\n --streaming Enable streaming updates\n --no-streaming Disable streaming updates\n --interactive Enable interactive dashboard (TTY only)\n --workers Use worker threads for agents\n --no-workers Disable worker threads\n --timeout Agent timeout in ms\n --files Comma-separated file list to scan\n --once Run once and exit (no watch)\n --users, -u User count for cost estimation (default: 250)\n --help, -h Show this help\n\nExamples:\n # Watch current directory\n node dist/cli/yolo-daemon.js\n\n # CI mode: scan once and exit with error code if issues found\n node dist/cli/yolo-daemon.js --once\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 console.error('Failed to start daemon:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["config"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/yolo-daemon.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Trie Agent Watch Daemon\n * \n * Headless file watcher for local/CI environments.\n * Watches a directory and reports issues as they occur.\n * \n * Usage:\n * node dist/cli/yolo-daemon.js [options]\n * \n * Options:\n * --dir, -d Directory to watch (default: cwd)\n * --debounce, -D Debounce time in ms (default: 1000)\n * --json Output as JSON (for log aggregation)\n * --once Run once and exit (no watch)\n */\n\nimport { watch, existsSync, statSync, readFileSync } from 'fs';\nimport { readdir } from 'fs/promises';\nimport { join, extname, basename, resolve } from 'path';\nimport { TrieScanTool } from '../tools/scan.js';\nimport { getWorkingDirectory } from '../utils/workspace.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 runOnce: 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}\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 scanTool = new TrieScanTool();\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\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 }\n\n /**\n * Start the daemon\n */\n async start(): Promise<void> {\n this.log('info', 'Starting Trie Agent Watch Daemon', {\n directory: this.config.directory,\n debounceMs: this.config.debounceMs\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 // Run initial scan\n this.log('info', 'Running initial scan...');\n await this.runScan(this.config.files);\n\n // If run-once mode, exit after initial scan\n if (this.config.runOnce) {\n this.log('info', 'Run-once mode: exiting after initial scan', { ...this.stats });\n process.exit(this.stats.issuesFound > 0 ? 1 : 0);\n }\n\n // Start watching\n await this.watchDirectory(this.config.directory);\n this.log('info', 'Watching for file 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 * Run a scan on all files or specific files\n */\n private async runScan(files?: string[]): Promise<void> {\n try {\n const scanArgs: Record<string, unknown> = files\n ? { files }\n : { directory: this.config.directory };\n\n if (this.config.format) scanArgs.format = this.config.format;\n if (this.config.output) scanArgs.output = this.config.output;\n if (this.config.parallel !== undefined) scanArgs.parallel = this.config.parallel;\n if (this.config.cache !== undefined) scanArgs.cache = this.config.cache;\n if (this.config.maxConcurrency) scanArgs.maxConcurrency = this.config.maxConcurrency;\n if (this.config.streaming !== undefined) scanArgs.streaming = this.config.streaming;\n if (this.config.interactive !== undefined) scanArgs.interactive = this.config.interactive;\n if (this.config.workers !== undefined) scanArgs.workers = this.config.workers;\n if (this.config.timeoutMs) scanArgs.timeoutMs = this.config.timeoutMs;\n if (this.config.userCount) scanArgs.userCount = this.config.userCount;\n\n const result = await this.scanTool.execute(scanArgs);\n const resultText = result.content?.[0]?.text || '';\n\n // PRINT THE FULL REPORT TO STDOUT (for terminal/chat display)\n if (resultText && this.config.runOnce) {\n console.log(resultText);\n }\n\n // Parse results - try multiple patterns to extract issue count\n let issueCount = 0;\n if (this.config.format === 'json' && this.config.output && existsSync(this.config.output)) {\n try {\n const report = JSON.parse(readFileSync(this.config.output, 'utf-8'));\n issueCount = report?.results?.totalIssues ?? 0;\n } catch {\n issueCount = 0;\n }\n } else {\n // Try multiple patterns to catch issue counts\n const patterns = [\n /(\\d+)\\s+actionable\\s+issues?\\s+found/i, // \"30 actionable issues found\"\n /(\\d+)\\s+Issues?\\s+Found/i, // \"30 Issues Found\"\n /Found\\s+(\\d+)\\s+issues?/i, // \"Found 30 issues\"\n /\\[COMPLETE\\]\\s+(\\d+)\\s+issues?/i, // \"[COMPLETE] 30 issues\"\n /(\\d+)\\s+total/i, // \"30 total\" (fallback)\n ];\n \n for (const pattern of patterns) {\n const match = resultText.match(pattern);\n if (match && match[1]) {\n issueCount = parseInt(match[1], 10);\n break;\n }\n }\n }\n\n this.stats.filesScanned += files?.length || 1;\n this.stats.issuesFound += issueCount;\n\n // Don't log \"No issues found\" after a full scan that displayed a report\n // The report already shows the issue count prominently\n if (issueCount > 0) {\n // Parse severity breakdown for additional logging\n const criticalMatch = resultText.match(/(\\d+)\\s+critical/i);\n const seriousMatch = resultText.match(/(\\d+)\\s+serious|(\\d+)\\s+important/i);\n\n if (criticalMatch && criticalMatch[1] && parseInt(criticalMatch[1], 10) > 0) {\n this.log('error', 'Critical issues detected', { count: parseInt(criticalMatch[1], 10) });\n }\n if (seriousMatch && (seriousMatch[1] || seriousMatch[2])) {\n const count = parseInt(seriousMatch[1] || seriousMatch[2] || '0', 10);\n if (count > 0) {\n this.log('warn', 'Serious issues detected', { count });\n }\n }\n }\n // NOTE: Removed the \"No issues found\" log because it was confusing\n // when printed after a full scan report that already shows issue counts\n } catch (error) {\n this.stats.errors++;\n this.log('error', 'Scan failed', { \n error: error instanceof Error ? error.message : String(error) \n });\n }\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.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 await this.runScan(files);\n this.isProcessing = false;\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 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: 'ℹ️', warn: '⚠️', error: '❌' }[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 shutdown(signal: string): void {\n this.log('info', 'Shutting down', { signal, stats: this.stats });\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 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 directory: getWorkingDirectory(),\n debounceMs: 1000,\n jsonOutput: false,\n runOnce: false\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 '--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 '--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 '--once':\n config.runOnce = true;\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 Agent Watch Daemon\nHeadless file watcher for local/CI environments.\n\nUsage:\n node dist/cli/yolo-daemon.js [options]\n\nOptions:\n --dir, -d Directory to watch (default: cwd)\n --debounce, -D Debounce time in ms (default: 1000)\n --json Output as JSON (for log aggregation)\n --format Scan output format: text|json\n --output Output file path for json format\n --parallel Enable parallel execution\n --no-parallel Disable parallel execution\n --cache Enable result caching\n --no-cache Disable result caching\n --max-concurrency Max parallel agents\n --streaming Enable streaming updates\n --no-streaming Disable streaming updates\n --interactive Enable interactive dashboard (TTY only)\n --workers Use worker threads for agents\n --no-workers Disable worker threads\n --timeout Agent timeout in ms\n --files Comma-separated file list to scan\n --once Run once and exit (no watch)\n --users, -u User count for cost estimation (default: 250)\n --help, -h Show this help\n\nExamples:\n # Watch current directory\n node dist/cli/yolo-daemon.js\n\n # CI mode: scan once and exit with error code if issues found\n node dist/cli/yolo-daemon.js --once\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 console.error('Failed to start daemon:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["config"]}
|
package/dist/index.js
CHANGED
|
@@ -18,12 +18,12 @@ import {
|
|
|
18
18
|
import {
|
|
19
19
|
TrieScanTool,
|
|
20
20
|
loadConfig
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-GERAB55E.js";
|
|
22
22
|
import {
|
|
23
23
|
CRITICAL_REVIEW_CHECKLIST,
|
|
24
24
|
SuperReviewerAgent,
|
|
25
25
|
getAgentRegistry
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-37U65YW7.js";
|
|
27
27
|
import {
|
|
28
28
|
appendToSection,
|
|
29
29
|
findCrossProjectPatterns,
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
updateProjectSection
|
|
48
48
|
} from "./chunk-PZDQIFKO.js";
|
|
49
49
|
import "./chunk-3CS6Z2SL.js";
|
|
50
|
-
import "./chunk-
|
|
50
|
+
import "./chunk-3SQK2RKF.js";
|
|
51
51
|
import {
|
|
52
52
|
getWorkingDirectory
|
|
53
53
|
} from "./chunk-IMFD4SJC.js";
|
|
@@ -5491,6 +5491,24 @@ var ToolRegistry = class {
|
|
|
5491
5491
|
}
|
|
5492
5492
|
}
|
|
5493
5493
|
}
|
|
5494
|
+
},
|
|
5495
|
+
{
|
|
5496
|
+
name: "trie_super_reviewer",
|
|
5497
|
+
description: "\u{1F50D} Super Reviewer: Interactive PR review with cross-examination. Walks through changes file-by-file.",
|
|
5498
|
+
inputSchema: {
|
|
5499
|
+
type: "object",
|
|
5500
|
+
properties: {
|
|
5501
|
+
files: {
|
|
5502
|
+
type: "array",
|
|
5503
|
+
items: { type: "string" },
|
|
5504
|
+
description: "Files to review (defaults to changed files)"
|
|
5505
|
+
},
|
|
5506
|
+
directory: {
|
|
5507
|
+
type: "string",
|
|
5508
|
+
description: "Directory to review. Pass the workspace/project root path."
|
|
5509
|
+
}
|
|
5510
|
+
}
|
|
5511
|
+
}
|
|
5494
5512
|
}
|
|
5495
5513
|
];
|
|
5496
5514
|
}
|
|
@@ -6397,6 +6415,15 @@ var RequestHandlers = class {
|
|
|
6397
6415
|
case "data_flow":
|
|
6398
6416
|
case "dataflow":
|
|
6399
6417
|
return await this.toolRegistry.getTool("agent").execute({ ...args, agent: "data-flow" });
|
|
6418
|
+
// Special agents
|
|
6419
|
+
case "agent_smith":
|
|
6420
|
+
case "agentsmith":
|
|
6421
|
+
case "smith":
|
|
6422
|
+
return await this.toolRegistry.getTool("agent").execute({ ...args, agent: "agent-smith" });
|
|
6423
|
+
case "super_reviewer":
|
|
6424
|
+
case "superreviewer":
|
|
6425
|
+
case "reviewer":
|
|
6426
|
+
return await this.toolRegistry.getTool("agent").execute({ ...args, agent: "super-reviewer" });
|
|
6400
6427
|
// Custom skill tools (with backward-compatible agent aliases)
|
|
6401
6428
|
case "create_skill":
|
|
6402
6429
|
case "create_agent":
|
|
@@ -6498,13 +6525,17 @@ var RequestHandlers = class {
|
|
|
6498
6525
|
"**Built-in agents:**",
|
|
6499
6526
|
"`security`, `privacy`, `legal`, `accessibility`, `design`, `architecture`, `bugs`, `ux`, `types`, `devops`, `clean`, `soc2`, `performance`, `e2e`, `visual_qa`, `data_flow`",
|
|
6500
6527
|
"",
|
|
6528
|
+
"**Special agents:**",
|
|
6529
|
+
"`agent_smith` \u2014 35 vibe code hunters with cross-file detection",
|
|
6530
|
+
"`super_reviewer` \u2014 Interactive PR review with cross-examination",
|
|
6531
|
+
"",
|
|
6501
6532
|
"All commands accept `trie_` prefix (e.g., `trie_scan`, `trie_security`). Short names still work for compatibility."
|
|
6502
6533
|
].join("\n")
|
|
6503
6534
|
}]
|
|
6504
6535
|
};
|
|
6505
6536
|
}
|
|
6506
6537
|
async handleAgentSmith(smithArgs) {
|
|
6507
|
-
const { AgentSmithAgent } = await import("./agent-smith-
|
|
6538
|
+
const { AgentSmithAgent } = await import("./agent-smith-RVXIMAL6.js");
|
|
6508
6539
|
if (smithArgs.clear_memory) {
|
|
6509
6540
|
const smith = new AgentSmithAgent();
|
|
6510
6541
|
const result = await smith.clearMemory();
|
|
@@ -6532,7 +6563,7 @@ var RequestHandlers = class {
|
|
|
6532
6563
|
}]
|
|
6533
6564
|
};
|
|
6534
6565
|
}
|
|
6535
|
-
const agentSmithRunner = await import("./agent-smith-runner-
|
|
6566
|
+
const agentSmithRunner = await import("./agent-smith-runner-3AWGEOZC.js");
|
|
6536
6567
|
return await agentSmithRunner.runAgentSmith(smithArgs);
|
|
6537
6568
|
}
|
|
6538
6569
|
};
|