@triedotdev/mcp 1.0.46 → 1.0.49

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/checkpoint.ts","../src/bootstrap/stack-detector.ts","../src/bootstrap/files.ts"],"sourcesContent":["/**\n * Checkpoint CLI\n * \n * Save your work context to .trie/ without running a full scan.\n * Think of it as a quick save - captures what you're working on.\n */\n\nimport { existsSync } from 'fs';\nimport { mkdir, writeFile, readFile } from 'fs/promises';\nimport { join, relative } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\n\nexport interface Checkpoint {\n id: string;\n timestamp: string;\n message?: string;\n files: string[];\n notes?: string;\n createdBy: 'cli' | 'mcp';\n}\n\nexport interface CheckpointLog {\n checkpoints: Checkpoint[];\n lastCheckpoint?: string;\n}\n\n/**\n * Save a checkpoint\n */\nexport async function saveCheckpoint(options: {\n message?: string;\n files?: string[];\n notes?: string;\n workDir?: string;\n createdBy?: 'cli' | 'mcp';\n}): Promise<Checkpoint> {\n const workDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = join(workDir, '.trie');\n const checkpointPath = join(trieDir, 'checkpoints.json');\n \n await mkdir(trieDir, { recursive: true });\n \n // Load existing checkpoints\n let log: CheckpointLog = { checkpoints: [] };\n try {\n if (existsSync(checkpointPath)) {\n log = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n }\n } catch {\n log = { checkpoints: [] };\n }\n \n // Create new checkpoint\n const checkpoint: Checkpoint = {\n id: `cp-${Date.now().toString(36)}`,\n timestamp: new Date().toISOString(),\n message: options.message,\n files: options.files || [],\n notes: options.notes,\n createdBy: options.createdBy || 'cli',\n };\n \n // Add to log\n log.checkpoints.push(checkpoint);\n log.lastCheckpoint = checkpoint.id;\n \n // Keep last 50 checkpoints\n if (log.checkpoints.length > 50) {\n log.checkpoints = log.checkpoints.slice(-50);\n }\n \n // Save\n await writeFile(checkpointPath, JSON.stringify(log, null, 2));\n \n // Also update AGENTS.md with checkpoint note\n await updateAgentsMdWithCheckpoint(checkpoint, workDir);\n \n return checkpoint;\n}\n\n/**\n * List checkpoints\n */\nexport async function listCheckpoints(workDir?: string): Promise<Checkpoint[]> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const checkpointPath = join(dir, '.trie', 'checkpoints.json');\n \n try {\n if (existsSync(checkpointPath)) {\n const log: CheckpointLog = JSON.parse(await readFile(checkpointPath, 'utf-8'));\n return log.checkpoints;\n }\n } catch {\n // File doesn't exist or is corrupted\n }\n \n return [];\n}\n\n/**\n * Get the last checkpoint\n */\nexport async function getLastCheckpoint(workDir?: string): Promise<Checkpoint | null> {\n const checkpoints = await listCheckpoints(workDir);\n return checkpoints.length > 0 ? checkpoints[checkpoints.length - 1] : null;\n}\n\n/**\n * Update AGENTS.md with checkpoint info\n */\nasync function updateAgentsMdWithCheckpoint(checkpoint: Checkpoint, workDir: string): Promise<void> {\n const agentsPath = join(workDir, '.trie', 'AGENTS.md');\n \n let content = '';\n try {\n if (existsSync(agentsPath)) {\n content = await readFile(agentsPath, 'utf-8');\n }\n } catch {\n content = '';\n }\n \n // Find or create checkpoint section\n const checkpointSection = `\n## Last Checkpoint\n\n- **ID:** ${checkpoint.id}\n- **Time:** ${checkpoint.timestamp}\n${checkpoint.message ? `- **Message:** ${checkpoint.message}` : ''}\n${checkpoint.files.length > 0 ? `- **Files:** ${checkpoint.files.length} files` : ''}\n${checkpoint.notes ? `- **Notes:** ${checkpoint.notes}` : ''}\n`;\n \n // Replace existing checkpoint section or append\n const checkpointRegex = /## Last Checkpoint[\\s\\S]*?(?=\\n## |\\n---|\\Z)/;\n if (checkpointRegex.test(content)) {\n content = content.replace(checkpointRegex, checkpointSection.trim());\n } else {\n content = content.trim() + '\\n\\n' + checkpointSection.trim() + '\\n';\n }\n \n await writeFile(agentsPath, content);\n}\n\n/**\n * CLI handler for checkpoint command\n */\nexport async function handleCheckpointCommand(args: string[]): Promise<void> {\n const subcommand = args[0] || 'save';\n \n switch (subcommand) {\n case 'save': {\n // Parse options\n let message: string | undefined;\n let notes: string | undefined;\n const files: string[] = [];\n \n for (let i = 1; i < args.length; i++) {\n if (args[i] === '-m' || args[i] === '--message') {\n message = args[++i];\n } else if (args[i] === '-n' || args[i] === '--notes') {\n notes = args[++i];\n } else if (args[i] === '-f' || args[i] === '--file') {\n files.push(args[++i]);\n } else if (!args[i].startsWith('-')) {\n // Treat as message if no flag\n message = args[i];\n }\n }\n \n const checkpoint = await saveCheckpoint({ message, files, notes });\n \n console.log('\\n Checkpoint saved\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${checkpoint.timestamp}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('\\n Context saved to .trie/\\n');\n break;\n }\n \n case 'list': {\n const checkpoints = await listCheckpoints();\n \n if (checkpoints.length === 0) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Checkpoints:\\n');\n for (const cp of checkpoints.slice(-10).reverse()) {\n const date = new Date(cp.timestamp).toLocaleString();\n console.log(` ${cp.id} ${date} ${cp.message || '(no message)'}`);\n }\n console.log('');\n break;\n }\n \n case 'last': {\n const checkpoint = await getLastCheckpoint();\n \n if (!checkpoint) {\n console.log('\\n No checkpoints yet. Run `trie checkpoint` to save one.\\n');\n return;\n }\n \n console.log('\\n Last Checkpoint:\\n');\n console.log(` ID: ${checkpoint.id}`);\n console.log(` Time: ${new Date(checkpoint.timestamp).toLocaleString()}`);\n if (checkpoint.message) {\n console.log(` Message: ${checkpoint.message}`);\n }\n if (checkpoint.notes) {\n console.log(` Notes: ${checkpoint.notes}`);\n }\n if (checkpoint.files.length > 0) {\n console.log(` Files: ${checkpoint.files.join(', ')}`);\n }\n console.log('');\n break;\n }\n \n default:\n console.log(`\n Usage: trie checkpoint [command] [options]\n\n Commands:\n save [message] Save a checkpoint (default)\n list List recent checkpoints\n last Show the last checkpoint\n\n Options:\n -m, --message Checkpoint message\n -n, --notes Additional notes\n -f, --file File to include (can be repeated)\n\n Examples:\n trie checkpoint \"finished auth flow\"\n trie checkpoint save -m \"WIP: payment integration\" -n \"needs testing\"\n trie checkpoint list\n`);\n }\n}\n","/**\n * Stack Detector\n * \n * Detects project technology stack from config files.\n * Used by bootstrap system to suggest skills and agents.\n * \n * Skills data sourced from:\n * - https://skills.sh (leaderboard)\n * - https://github.com/anthropics/skills\n * - Partner repositories (Expo, Stripe, Supabase, etc.)\n */\n\nimport { readFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\n\nexport interface DetectedStack {\n framework?: string;\n language?: string;\n database?: string;\n auth?: string;\n packageManager?: string;\n suggestedSkills: string[];\n suggestedAgents: string[];\n dependencies: Set<string>;\n}\n\n/**\n * Comprehensive dependency-to-skill mappings\n * Format: dependency name -> array of skill identifiers\n */\nconst SKILL_MAPPINGS: Record<string, string[]> = {\n // Frontend Frameworks - React/Next.js\n 'next': [\n 'vercel-labs/agent-skills vercel-react-best-practices',\n 'vercel-labs/agent-skills web-design-guidelines',\n 'anthropics/skills frontend-design',\n 'wshobson/agents nextjs-app-router-patterns',\n ],\n 'react': [\n 'vercel-labs/agent-skills vercel-react-best-practices',\n 'anthropics/skills frontend-design',\n 'wshobson/agents react-state-management',\n ],\n\n // Vue/Nuxt Ecosystem\n 'vue': [\n 'hyf0/vue-skills vue-best-practices',\n 'hyf0/vue-skills pinia-best-practices',\n 'hyf0/vue-skills vueuse-best-practices',\n 'onmax/nuxt-skills vue',\n ],\n 'nuxt': [\n 'onmax/nuxt-skills nuxt',\n 'onmax/nuxt-skills nuxt-ui',\n 'onmax/nuxt-skills nuxt-content',\n 'onmax/nuxt-skills nuxt-modules',\n 'onmax/nuxt-skills nuxt-better-auth',\n 'onmax/nuxt-skills nuxthub',\n ],\n 'pinia': [\n 'hyf0/vue-skills pinia-best-practices',\n ],\n '@vueuse/core': [\n 'hyf0/vue-skills vueuse-best-practices',\n 'onmax/nuxt-skills vueuse',\n ],\n\n // Mobile - Expo\n 'expo': [\n 'expo/skills building-native-ui',\n 'expo/skills upgrading-expo',\n 'expo/skills native-data-fetching',\n 'expo/skills expo-dev-client',\n 'expo/skills expo-deployment',\n 'expo/skills expo-api-routes',\n 'expo/skills expo-tailwind-setup',\n 'expo/skills expo-cicd-workflows',\n 'expo/skills use-dom',\n ],\n\n // Mobile - React Native\n 'react-native': [\n 'callstackincubator/agent-skills react-native-best-practices',\n 'wshobson/agents react-native-architecture',\n ],\n\n // Backend Frameworks\n '@nestjs/core': [\n 'kadajett/agent-nestjs-skills nestjs-best-practices',\n ],\n 'nestjs': [\n 'kadajett/agent-nestjs-skills nestjs-best-practices',\n ],\n 'elysia': [\n 'elysiajs/skills elysiajs',\n ],\n 'hono': [\n 'elysiajs/skills elysiajs',\n ],\n\n // Database/BaaS\n '@supabase/supabase-js': [\n 'supabase/agent-skills supabase-postgres-best-practices',\n ],\n 'convex': [\n 'waynesutton/convexskills convex-best-practices',\n ],\n 'pg': [\n 'wshobson/agents postgresql-table-design',\n ],\n 'postgres': [\n 'wshobson/agents postgresql-table-design',\n ],\n\n // Auth\n 'better-auth': [\n 'better-auth/skills better-auth-best-practices',\n 'better-auth/skills create-auth-skill',\n ],\n\n // Payments\n 'stripe': [\n 'stripe/ai stripe-best-practices',\n ],\n '@stripe/stripe-js': [\n 'stripe/ai stripe-best-practices',\n ],\n\n // Media/Graphics\n 'remotion': [\n 'remotion-dev/skills remotion-best-practices',\n ],\n 'three': [\n 'cloudai-x/threejs-skills threejs-fundamentals',\n 'cloudai-x/threejs-skills threejs-animation',\n 'cloudai-x/threejs-skills threejs-materials',\n 'cloudai-x/threejs-skills threejs-shaders',\n 'cloudai-x/threejs-skills threejs-lighting',\n 'cloudai-x/threejs-skills threejs-geometry',\n 'cloudai-x/threejs-skills threejs-textures',\n 'cloudai-x/threejs-skills threejs-loaders',\n 'cloudai-x/threejs-skills threejs-interaction',\n 'cloudai-x/threejs-skills threejs-postprocessing',\n ],\n\n // UI Libraries\n 'tailwindcss': [\n 'wshobson/agents tailwind-design-system',\n 'jezweb/claude-skills tailwind-v4-shadcn',\n 'wshobson/agents responsive-design',\n ],\n '@shadcn/ui': [\n 'giuseppe-trisciuoglio/developer-kit shadcn-ui',\n ],\n 'shadcn': [\n 'giuseppe-trisciuoglio/developer-kit shadcn-ui',\n ],\n '@radix-ui/react-slot': [\n 'onmax/nuxt-skills reka-ui',\n ],\n\n // State Management\n '@tanstack/react-query': [\n 'jezweb/claude-skills tanstack-query',\n ],\n\n // Testing\n 'playwright': [\n 'anthropics/skills webapp-testing',\n 'wshobson/agents e2e-testing-patterns',\n ],\n 'puppeteer': [\n 'anthropics/skills webapp-testing',\n ],\n 'vitest': [\n 'wshobson/agents e2e-testing-patterns',\n ],\n 'jest': [\n 'wshobson/agents e2e-testing-patterns',\n ],\n\n // DevTools/MCP\n '@modelcontextprotocol/sdk': [\n 'anthropics/skills mcp-builder',\n ],\n\n // Security\n 'semgrep': [\n 'trailofbits/skills semgrep',\n ],\n\n // Monorepos\n 'turbo': [\n 'wshobson/agents monorepo-management',\n ],\n 'nx': [\n 'wshobson/agents monorepo-management',\n ],\n 'lerna': [\n 'wshobson/agents monorepo-management',\n ],\n\n // TypeScript (handled separately based on tsconfig.json)\n 'typescript': [\n 'wshobson/agents typescript-advanced-types',\n ],\n};\n\n/**\n * Skills categories for user opt-in browsing\n */\nexport const SKILL_CATEGORIES: Record<string, string[]> = {\n documents: [\n 'anthropics/skills pdf',\n 'anthropics/skills xlsx',\n 'anthropics/skills pptx',\n 'anthropics/skills docx',\n 'anthropics/skills doc-coauthoring',\n ],\n design: [\n 'anthropics/skills canvas-design',\n 'anthropics/skills theme-factory',\n 'anthropics/skills web-artifacts-builder',\n 'anthropics/skills algorithmic-art',\n 'anthropics/skills brand-guidelines',\n 'anthropics/skills slack-gif-creator',\n 'nextlevelbuilder/ui-ux-pro-max ui-ux-pro-max',\n 'superdesigndev/superdesign-skill superdesign',\n 'wshobson/agents design-system-patterns',\n ],\n marketing: [\n 'coreyhaines31/marketingskills seo-audit',\n 'coreyhaines31/marketingskills copywriting',\n 'coreyhaines31/marketingskills marketing-psychology',\n 'coreyhaines31/marketingskills programmatic-seo',\n 'coreyhaines31/marketingskills marketing-ideas',\n 'coreyhaines31/marketingskills copy-editing',\n 'coreyhaines31/marketingskills pricing-strategy',\n 'coreyhaines31/marketingskills social-content',\n 'coreyhaines31/marketingskills launch-strategy',\n 'coreyhaines31/marketingskills page-cro',\n 'coreyhaines31/marketingskills competitor-alternatives',\n 'coreyhaines31/marketingskills analytics-tracking',\n 'coreyhaines31/marketingskills schema-markup',\n 'coreyhaines31/marketingskills onboarding-cro',\n 'coreyhaines31/marketingskills email-sequence',\n 'coreyhaines31/marketingskills paid-ads',\n 'coreyhaines31/marketingskills signup-flow-cro',\n 'coreyhaines31/marketingskills free-tool-strategy',\n 'coreyhaines31/marketingskills form-cro',\n 'coreyhaines31/marketingskills paywall-upgrade-cro',\n 'coreyhaines31/marketingskills referral-program',\n 'coreyhaines31/marketingskills popup-cro',\n 'coreyhaines31/marketingskills ab-test-setup',\n ],\n development: [\n 'obra/superpowers brainstorming',\n 'obra/superpowers test-driven-development',\n 'obra/superpowers systematic-debugging',\n 'obra/superpowers writing-plans',\n 'obra/superpowers executing-plans',\n 'obra/superpowers verification-before-completion',\n 'obra/superpowers using-superpowers',\n 'obra/superpowers subagent-driven-development',\n 'obra/superpowers requesting-code-review',\n 'obra/superpowers writing-skills',\n 'obra/superpowers dispatching-parallel-agents',\n 'obra/superpowers receiving-code-review',\n 'obra/superpowers using-git-worktrees',\n 'obra/superpowers finishing-a-development-branch',\n 'wshobson/agents code-review-excellence',\n 'wshobson/agents api-design-principles',\n 'wshobson/agents architecture-patterns',\n 'wshobson/agents error-handling-patterns',\n 'wshobson/agents nodejs-backend-patterns',\n 'wshobson/agents microservices-patterns',\n 'wshobson/agents modern-javascript-patterns',\n 'wshobson/agents web-component-design',\n 'wshobson/agents async-python-patterns',\n 'wshobson/agents python-testing-patterns',\n 'boristane/agent-skills logging-best-practices',\n ],\n productivity: [\n 'softaworks/agent-toolkit daily-meeting-update',\n 'softaworks/agent-toolkit agent-md-refactor',\n 'softaworks/agent-toolkit session-handoff',\n 'softaworks/agent-toolkit meme-factory',\n 'softaworks/agent-toolkit qa-test-planner',\n 'softaworks/agent-toolkit writing-clearly-and-concisely',\n 'softaworks/agent-toolkit commit-work',\n 'softaworks/agent-toolkit mermaid-diagrams',\n 'softaworks/agent-toolkit dependency-updater',\n 'softaworks/agent-toolkit crafting-effective-readmes',\n 'softaworks/agent-toolkit reducing-entropy',\n 'softaworks/agent-toolkit feedback-mastery',\n 'softaworks/agent-toolkit marp-slide',\n 'softaworks/agent-toolkit professional-communication',\n 'softaworks/agent-toolkit difficult-workplace-conversations',\n 'anthropics/skills internal-comms',\n 'othmanadi/planning-with-files planning-with-files',\n ],\n security: [\n 'trailofbits/skills semgrep',\n 'trailofbits/skills secure-workflow-guide',\n 'trailofbits/skills codeql',\n 'trailofbits/skills property-based-testing',\n 'trailofbits/skills variant-analysis',\n 'trailofbits/skills guidelines-advisor',\n 'trailofbits/skills sharp-edges',\n 'trailofbits/skills differential-review',\n 'trailofbits/skills ask-questions-if-underspecified',\n 'squirrelscan/skills audit-website',\n ],\n mobile: [\n 'wshobson/agents mobile-ios-design',\n 'wshobson/agents mobile-android-design',\n 'dimillian/skills swiftui-ui-patterns',\n 'dimillian/skills swiftui-liquid-glass',\n ],\n obsidian: [\n 'kepano/obsidian-skills obsidian-markdown',\n 'kepano/obsidian-skills obsidian-bases',\n 'kepano/obsidian-skills json-canvas',\n ],\n prompts: [\n 'f/awesome-chatgpt-prompts skill-lookup',\n 'f/awesome-chatgpt-prompts prompt-lookup',\n 'wshobson/agents prompt-engineering-patterns',\n ],\n browser: [\n 'vercel-labs/agent-browser agent-browser',\n ],\n content: [\n 'op7418/humanizer-zh humanizer-zh',\n 'blader/humanizer humanizer',\n 'op7418/youtube-clipper-skill youtube-clipper',\n 'jimliu/baoyu-skills baoyu-slide-deck',\n 'jimliu/baoyu-skills baoyu-article-illustrator',\n 'jimliu/baoyu-skills baoyu-cover-image',\n 'jimliu/baoyu-skills baoyu-comic',\n 'jimliu/baoyu-skills baoyu-infographic',\n 'jimliu/baoyu-skills baoyu-image-gen',\n ],\n integrations: [\n 'intellectronica/agent-skills context7',\n 'softaworks/agent-toolkit gemini',\n 'softaworks/agent-toolkit codex',\n ],\n};\n\nexport async function detectStack(projectDir: string): Promise<DetectedStack> {\n const stack: DetectedStack = {\n suggestedSkills: [],\n suggestedAgents: ['security', 'privacy', 'bugs'],\n dependencies: new Set(),\n };\n\n // Detect language\n if (existsSync(join(projectDir, 'tsconfig.json'))) {\n stack.language = 'TypeScript';\n stack.suggestedAgents.push('typecheck');\n // Add TypeScript skills\n stack.suggestedSkills.push('wshobson/agents typescript-advanced-types');\n } else if (existsSync(join(projectDir, 'package.json'))) {\n stack.language = 'JavaScript';\n } else if (existsSync(join(projectDir, 'requirements.txt')) || existsSync(join(projectDir, 'pyproject.toml'))) {\n stack.language = 'Python';\n } else if (existsSync(join(projectDir, 'go.mod'))) {\n stack.language = 'Go';\n } else if (existsSync(join(projectDir, 'Cargo.toml'))) {\n stack.language = 'Rust';\n }\n\n // Detect Swift/iOS projects\n if (existsSync(join(projectDir, 'Package.swift')) || \n existsSync(join(projectDir, 'project.pbxproj')) ||\n existsSync(join(projectDir, '*.xcodeproj'))) {\n stack.language = 'Swift';\n stack.suggestedSkills.push('dimillian/skills swiftui-ui-patterns');\n stack.suggestedSkills.push('dimillian/skills swiftui-liquid-glass');\n }\n\n // Detect package manager\n if (existsSync(join(projectDir, 'pnpm-lock.yaml'))) {\n stack.packageManager = 'pnpm';\n } else if (existsSync(join(projectDir, 'yarn.lock'))) {\n stack.packageManager = 'yarn';\n } else if (existsSync(join(projectDir, 'bun.lockb'))) {\n stack.packageManager = 'bun';\n } else if (existsSync(join(projectDir, 'package-lock.json'))) {\n stack.packageManager = 'npm';\n }\n\n // Check for GitHub Actions\n if (existsSync(join(projectDir, '.github', 'workflows'))) {\n stack.suggestedSkills.push('wshobson/agents github-actions-templates');\n }\n\n // Parse package.json for framework detection\n try {\n const pkgPath = join(projectDir, 'package.json');\n if (existsSync(pkgPath)) {\n const pkgContent = await readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Store all dependencies\n for (const dep of Object.keys(deps)) {\n stack.dependencies.add(dep);\n }\n\n // Add skills based on dependency mappings\n for (const dep of Object.keys(deps)) {\n const skills = SKILL_MAPPINGS[dep];\n if (skills) {\n stack.suggestedSkills.push(...skills);\n }\n }\n\n // Framework detection (for display purposes)\n if (deps['next']) {\n stack.framework = `Next.js ${deps['next'].replace('^', '')}`;\n stack.suggestedAgents.push('accessibility', 'design');\n } else if (deps['react']) {\n stack.framework = `React ${deps['react'].replace('^', '')}`;\n stack.suggestedAgents.push('accessibility');\n } else if (deps['vue']) {\n stack.framework = `Vue ${deps['vue'].replace('^', '')}`;\n } else if (deps['nuxt']) {\n stack.framework = `Nuxt ${deps['nuxt'].replace('^', '')}`;\n } else if (deps['svelte']) {\n stack.framework = 'Svelte';\n } else if (deps['express']) {\n stack.framework = 'Express.js';\n } else if (deps['fastify']) {\n stack.framework = 'Fastify';\n } else if (deps['hono']) {\n stack.framework = 'Hono';\n } else if (deps['elysia']) {\n stack.framework = 'Elysia';\n } else if (deps['@nestjs/core']) {\n stack.framework = 'NestJS';\n }\n\n // Auth detection\n if (deps['next-auth'] || deps['@auth/core']) {\n stack.auth = 'NextAuth.js';\n } else if (deps['passport']) {\n stack.auth = 'Passport.js';\n } else if (deps['@clerk/nextjs'] || deps['@clerk/clerk-react']) {\n stack.auth = 'Clerk';\n } else if (deps['better-auth']) {\n stack.auth = 'Better Auth';\n }\n\n // Database detection\n if (deps['prisma'] || deps['@prisma/client']) {\n stack.database = 'Prisma ORM';\n } else if (deps['drizzle-orm']) {\n stack.database = 'Drizzle ORM';\n } else if (deps['@supabase/supabase-js']) {\n stack.database = 'Supabase';\n } else if (deps['mongoose']) {\n stack.database = 'MongoDB (Mongoose)';\n } else if (deps['pg']) {\n stack.database = 'PostgreSQL';\n } else if (deps['convex']) {\n stack.database = 'Convex';\n }\n\n // Add moneybags agent for payment integrations\n if (deps['stripe'] || deps['@stripe/stripe-js']) {\n stack.suggestedAgents.push('moneybags');\n }\n }\n } catch {\n // package.json parsing failed\n }\n\n // Database from other sources\n if (!stack.database) {\n if (existsSync(join(projectDir, 'prisma', 'schema.prisma'))) {\n stack.database = 'Prisma ORM';\n } else if (existsSync(join(projectDir, 'drizzle.config.ts'))) {\n stack.database = 'Drizzle ORM';\n }\n }\n\n // Deduplicate\n stack.suggestedSkills = [...new Set(stack.suggestedSkills)];\n stack.suggestedAgents = [...new Set(stack.suggestedAgents)];\n\n return stack;\n}\n\n/**\n * Get skills for a specific category\n */\nexport function getSkillsByCategory(category: string): string[] {\n return SKILL_CATEGORIES[category] || [];\n}\n\n/**\n * Get all available skill categories\n */\nexport function getSkillCategories(): { name: string; count: number }[] {\n return Object.entries(SKILL_CATEGORIES).map(([name, skills]) => ({\n name,\n count: skills.length,\n }));\n}\n\n/**\n * Get project dependencies from package.json\n */\nexport async function getProjectDependencies(projectDir: string): Promise<Set<string>> {\n try {\n const pkgPath = join(projectDir, 'package.json');\n if (!existsSync(pkgPath)) {\n return new Set();\n }\n \n const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));\n return new Set([\n ...Object.keys(pkg.dependencies || {}),\n ...Object.keys(pkg.devDependencies || {}),\n ]);\n } catch {\n return new Set();\n }\n}\n","/**\n * Bootstrap File System\n * \n * Manages workspace files that inject context at scan start.\n * Files: BOOTSTRAP.md, RULES.md, TEAM.md\n */\n\nimport { readFile, writeFile, unlink, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory } from '../utils/workspace.js';\nimport { detectStack, type DetectedStack } from './stack-detector.js';\n\nexport interface BootstrapFile {\n name: string;\n path: string;\n type: 'user' | 'auto' | 'one-time';\n exists: boolean;\n content?: string;\n}\n\nexport interface BootstrapContext {\n files: BootstrapFile[];\n injectedContent: string;\n needsBootstrap: boolean;\n}\n\ninterface BootstrapFileSpec {\n name: string;\n type: 'user' | 'auto' | 'one-time';\n description: string;\n}\n\nconst BOOTSTRAP_FILES: BootstrapFileSpec[] = [\n { name: 'PROJECT.md', type: 'user', description: 'Project overview and conventions' },\n { name: 'RULES.md', type: 'user', description: 'Coding standards agents enforce' },\n { name: 'TEAM.md', type: 'user', description: 'Team ownership and escalation' },\n { name: 'BOOTSTRAP.md', type: 'one-time', description: 'First-run setup (deleted after)' },\n { name: 'AGENTS.md', type: 'auto', description: 'Auto-generated scan context' },\n];\n\n/**\n * Load bootstrap files and inject into agent context\n */\nexport async function loadBootstrapContext(workDir?: string): Promise<BootstrapContext> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = join(projectDir, '.trie');\n const files: BootstrapFile[] = [];\n const contentParts: string[] = [];\n let needsBootstrap = false;\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n \n if (file.name === 'BOOTSTRAP.md' && exists) {\n needsBootstrap = true;\n }\n \n let content: string | undefined;\n if (exists) {\n try {\n content = await readFile(filePath, 'utf-8');\n if (content.trim() && file.type !== 'one-time') {\n contentParts.push(`<!-- ${file.name} -->\\n${content}`);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n files.push({\n name: file.name,\n path: filePath,\n type: file.type,\n exists,\n content,\n });\n }\n\n return {\n files,\n injectedContent: contentParts.join('\\n\\n---\\n\\n'),\n needsBootstrap,\n };\n}\n\n/**\n * Initialize bootstrap files for a new project\n */\nexport async function initializeBootstrapFiles(options: {\n workDir?: string;\n force?: boolean;\n skipBootstrap?: boolean;\n} = {}): Promise<{ created: string[]; skipped: string[]; stack: DetectedStack }> {\n const projectDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = join(projectDir, '.trie');\n await mkdir(trieDir, { recursive: true });\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n const stack = await detectStack(projectDir);\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n\n if (exists && !options.force) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'BOOTSTRAP.md' && options.skipBootstrap) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'AGENTS.md') {\n skipped.push(file.name);\n continue;\n }\n\n const template = getFileTemplate(file.name, stack);\n if (template) {\n await writeFile(filePath, template);\n created.push(file.name);\n }\n }\n\n return { created, skipped, stack };\n}\n\n/**\n * Mark bootstrap as complete (delete BOOTSTRAP.md)\n */\nexport async function completeBootstrap(workDir?: string): Promise<boolean> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(projectDir, '.trie', 'BOOTSTRAP.md');\n\n try {\n await unlink(bootstrapPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if bootstrap is needed (BOOTSTRAP.md exists)\n */\nexport function needsBootstrap(workDir?: string): boolean {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(projectDir, '.trie', 'BOOTSTRAP.md');\n return existsSync(bootstrapPath);\n}\n\n/**\n * Get rules from RULES.md\n */\nexport async function loadRules(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const rulesPath = join(projectDir, '.trie', 'RULES.md');\n \n try {\n if (existsSync(rulesPath)) {\n return await readFile(rulesPath, 'utf-8');\n }\n } catch {\n // Rules file doesn't exist or can't be read\n }\n \n return null;\n}\n\n/**\n * Get team info from TEAM.md\n */\nexport async function loadTeamInfo(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const teamPath = join(projectDir, '.trie', 'TEAM.md');\n \n try {\n if (existsSync(teamPath)) {\n return await readFile(teamPath, 'utf-8');\n }\n } catch {\n // Team file doesn't exist or can't be read\n }\n \n return null;\n}\n\nfunction getFileTemplate(fileName: string, stack: DetectedStack): string | null {\n switch (fileName) {\n case 'PROJECT.md':\n return getProjectTemplate(stack);\n case 'RULES.md':\n return getRulesTemplate(stack);\n case 'TEAM.md':\n return getTeamTemplate();\n case 'BOOTSTRAP.md':\n return getBootstrapTemplate(stack);\n default:\n return null;\n }\n}\n\nfunction getProjectTemplate(stack: DetectedStack): string {\n const lines: string[] = ['# Project Overview', '', '> Define your project context here. AI assistants read this first.', ''];\n \n lines.push('## Description', '', '[Describe what this project does and who it\\'s for]', '');\n \n lines.push('## Technology Stack', '');\n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n if (!stack.framework && !stack.language && !stack.database) {\n lines.push('[Add your technology stack]');\n }\n lines.push('');\n \n lines.push('## Architecture', '', '[Key patterns and design decisions]', '');\n lines.push('## Coding Conventions', '', '[Style rules agents should follow]', '');\n lines.push('## AI Instructions', '', 'When working on this project:', '1. [Instruction 1]', '2. [Instruction 2]', '3. [Instruction 3]', '');\n lines.push('---', '', '*Edit this file to provide project context to AI assistants.*');\n \n return lines.join('\\n');\n}\n\nfunction getRulesTemplate(stack: DetectedStack): string {\n const packageManager = stack.packageManager || 'npm';\n \n return `# Project Rules\n\n> These rules are enforced by Trie agents during scans.\n> Violations appear as issues with [RULES] prefix.\n\n## Code Style\n\n1. Use named exports, not default exports\n2. Prefer \\`${packageManager}\\` for package management\n3. Maximum file length: 300 lines\n4. Use TypeScript strict mode\n\n## Testing Requirements\n\n1. Critical paths require unit tests\n2. API endpoints require integration tests\n3. Minimum coverage: 70%\n\n## Security Rules\n\n1. Never log sensitive data (passwords, tokens, PII)\n2. All API routes require authentication\n3. Rate limiting required on public endpoints\n4. SQL queries must use parameterized statements\n\n## Review Requirements\n\n1. All PRs require at least 1 reviewer\n2. Security-sensitive changes require security review\n3. Database migrations require review\n\n---\n\n*Edit this file to define your project's coding standards.*\n`;\n}\n\nfunction getTeamTemplate(): string {\n return `# Team Structure\n\n## Code Ownership\n\n| Area | Owner | Backup | Review Required |\n|------|-------|--------|-----------------|\n| \\`/src/api/\\` | @backend-team | - | 1 approver |\n| \\`/src/ui/\\` | @frontend-team | - | 1 approver |\n| \\`/src/auth/\\` | @security-team | - | Security review |\n\n## Escalation\n\n| Severity | First Contact | Escalate To | SLA |\n|----------|--------------|-------------|-----|\n| Critical | Team lead | CTO | 1 hour |\n| Serious | PR reviewer | Team lead | 4 hours |\n| Moderate | Self-serve | - | 1 day |\n\n## Contacts\n\n- **Security:** [email/slack]\n- **Privacy:** [email/slack]\n- **Emergencies:** [phone/pager]\n\n---\n\n*Edit this file to define your team structure.*\n`;\n}\n\nfunction getBootstrapTemplate(stack: DetectedStack): string {\n const skillCommands = stack.suggestedSkills\n .map(s => `trie skills add ${s}`)\n .join('\\n');\n\n const agentList = stack.suggestedAgents.join(', ');\n\n const lines: string[] = [\n '# Trie Bootstrap Checklist',\n '',\n 'This file guides your first scan setup. **Delete when complete.**',\n '',\n '## Auto-Detected Stack',\n '',\n 'Based on your project, Trie detected:',\n ];\n \n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n \n lines.push('', '## Recommended Actions', '', '### 1. Skills to Install', 'Based on your stack, consider installing:', '```bash');\n lines.push(skillCommands || '# No specific skills detected - browse https://skills.sh');\n lines.push('```', '', '### 2. Agents to Enable', `Your stack suggests these agents: ${agentList || 'security, privacy, bugs'}`, '');\n lines.push('### 3. Configure Rules', 'Add your coding standards to `.trie/RULES.md`.', '');\n lines.push('### 4. Run First Scan', '```bash', 'trie scan', '```', '');\n lines.push('---', '', '**Delete this file after completing setup.** Run:', '```bash', 'rm .trie/BOOTSTRAP.md', '```');\n \n return lines.join('\\n');\n}\n"],"mappings":"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","names":["readFile","existsSync","join","readFile","writeFile","mkdir","existsSync","join","join","needsBootstrap","existsSync","readFile","mkdir","writeFile"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CustomSkill,
3
3
  getAgentRegistry
4
- } from "./chunk-R5HWHP5N.js";
4
+ } from "./chunk-VZYCZXEQ.js";
5
5
  import {
6
6
  getGlobalMemoryStats,
7
7
  getHistoricalInsights,
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-PZDQIFKO.js";
13
13
  import {
14
14
  ProgressReporter
15
- } from "./chunk-OB45V2QC.js";
15
+ } from "./chunk-KQOMSIVR.js";
16
16
  import {
17
17
  getWorkingDirectory
18
18
  } from "./chunk-IMFD4SJC.js";
@@ -758,7 +758,7 @@ var Triager = class {
758
758
  }
759
759
  if (effectiveRiskLevel === "critical" || effectiveRiskLevel === "high") {
760
760
  console.error(` \u26A0\uFE0F ${effectiveRiskLevel.toUpperCase()} risk - activating all agents for comprehensive review`);
761
- return this.getAllAgents();
761
+ return this.getAllAgents().filter((agent) => agent.shouldActivate(context));
762
762
  }
763
763
  const scores = this.scoreAgents(context, effectiveRiskLevel);
764
764
  this.boostAgentsWithHistory(scores);
@@ -3968,20 +3968,20 @@ var StreamingManager = class {
3968
3968
  function formatConsoleUpdate(update) {
3969
3969
  switch (update.type) {
3970
3970
  case "agent_start":
3971
- return `\u{1F50D} Starting ${update.data.agent}...`;
3971
+ return `>> Starting ${update.data.agent}...`;
3972
3972
  case "agent_complete":
3973
- const emoji = update.data.issueCount > 0 ? "\u26A0\uFE0F" : "\u2705";
3974
- return `${emoji} ${update.data.agent} found ${update.data.issueCount} issues`;
3973
+ const label = update.data.issueCount > 0 ? "[WARN]" : "[OK]";
3974
+ return `${label} ${update.data.agent} found ${update.data.issueCount} issues`;
3975
3975
  case "progress":
3976
3976
  const { processedFiles, totalFiles, currentFile, activeAgents } = update.data;
3977
3977
  const progress = totalFiles > 0 ? Math.round(processedFiles / totalFiles * 100) : 0;
3978
3978
  const active = activeAgents.length > 0 ? ` (${activeAgents.join(", ")})` : "";
3979
- const current = currentFile ? ` \u2022 ${currentFile.split("/").pop()}` : "";
3980
- return `\u{1F4CA} Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;
3979
+ const current = currentFile ? ` - ${currentFile.split("/").pop()}` : "";
3980
+ return `Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;
3981
3981
  case "scan_complete":
3982
- return `\u{1F389} Scan complete! Found ${update.data.totalIssues} issues across ${update.data.totalFiles} files`;
3982
+ return `[COMPLETE] Scan finished. Found ${update.data.totalIssues} issues across ${update.data.totalFiles} files`;
3983
3983
  case "error":
3984
- return `\u274C Error: ${update.data.message}`;
3984
+ return `[ERROR] ${update.data.message}`;
3985
3985
  default:
3986
3986
  return null;
3987
3987
  }
@@ -5983,7 +5983,7 @@ var TrieScanTool = class {
5983
5983
  });
5984
5984
  }
5985
5985
  if (!interactiveEnabled) {
5986
- this.progress.startPhase("init", "\u{1F53A} TRIE AGENT - AI-Powered Code Analysis");
5986
+ this.progress.startPhase("init", "TRIE AGENT - AI-Powered Code Analysis");
5987
5987
  }
5988
5988
  if (!files || !Array.isArray(files) || files.length === 0) {
5989
5989
  this.progress.startPhase("discovery", `Discovering files in ${basename6(workDir)}...`);
@@ -6053,7 +6053,7 @@ var TrieScanTool = class {
6053
6053
  selectedAgents = selectedAgents.filter((a) => !excludeAgents.has(a.name));
6054
6054
  const removed = before - selectedAgents.length;
6055
6055
  if (removed > 0) {
6056
- console.error(` \u{1F6AB} Excluding ${removed} agent(s): ${Array.from(excludeAgents).join(", ")}`);
6056
+ console.error(` Excluding ${removed} agent(s): ${Array.from(excludeAgents).join(", ")}`);
6057
6057
  }
6058
6058
  }
6059
6059
  const allAgentNames = this.agentRegistry.getAgentNames();
@@ -6061,10 +6061,10 @@ var TrieScanTool = class {
6061
6061
  this.progress.update(`${selectedAgents.length} agents selected for ${riskLevel} risk code`);
6062
6062
  const userCount = args?.userCount;
6063
6063
  if (userCount) {
6064
- const moneybags = selectedAgents.find((a) => a.name === "moneybags");
6065
- if (moneybags && "configure" in moneybags && typeof moneybags.configure === "function") {
6066
- moneybags.configure({ userCount });
6067
- console.error(` \u{1F4B0} Cost estimates scaled for ${userCount.toLocaleString()} users`);
6064
+ const moneybags2 = selectedAgents.find((a) => a.name === "moneybags");
6065
+ if (moneybags2 && "configure" in moneybags2 && typeof moneybags2.configure === "function") {
6066
+ moneybags2.configure({ userCount });
6067
+ console.error(` Cost estimates scaled for ${userCount.toLocaleString()} users`);
6068
6068
  }
6069
6069
  }
6070
6070
  this.progress.startPhase("ai-review", "Running AI analysis...");
@@ -6091,6 +6091,13 @@ var TrieScanTool = class {
6091
6091
  const allIssues = agentResults.flatMap((result2) => result2.issues);
6092
6092
  const issueAnalyzer = new IssueAnalyzer();
6093
6093
  const priorityReport = issueAnalyzer.analyzeIssues(allIssues);
6094
+ const META_AGENTS = /* @__PURE__ */ new Set(["agent-smith", "super-reviewer"]);
6095
+ const costableIssues = allIssues.filter((issue) => !META_AGENTS.has(issue.agent || ""));
6096
+ let costReport = null;
6097
+ const moneybags = selectedAgents.find((a) => a.name === "moneybags");
6098
+ if (moneybags && "generateCostReport" in moneybags && typeof moneybags.generateCostReport === "function" && costableIssues.length > 0) {
6099
+ costReport = moneybags.generateCostReport(costableIssues, context);
6100
+ }
6094
6101
  this.progress.startPhase("prioritizing", "Prioritizing findings...");
6095
6102
  const prioritized = prioritizeIssues(allIssues);
6096
6103
  if (prioritized.critical.length > 0) {
@@ -6217,7 +6224,8 @@ var TrieScanTool = class {
6217
6224
  semanticOutput,
6218
6225
  attackSurfaceOutput,
6219
6226
  priorityReport,
6220
- assignments
6227
+ assignments,
6228
+ costReport
6221
6229
  );
6222
6230
  if (args?.format === "json" && args?.output) {
6223
6231
  const report = {
@@ -6257,43 +6265,43 @@ var TrieScanTool = class {
6257
6265
  content: [
6258
6266
  {
6259
6267
  type: "text",
6260
- text: `\u274C Scan failed: ${error instanceof Error ? error.message : String(error)}`
6268
+ text: `[ERROR] Scan failed: ${error instanceof Error ? error.message : String(error)}`
6261
6269
  }
6262
6270
  ]
6263
6271
  };
6264
6272
  }
6265
6273
  }
6266
6274
  logContextAnalysis(context) {
6267
- console.error("\n \u{1F4CB} Detected Context Signals:");
6275
+ console.error("\n Detected Context Signals:");
6268
6276
  const signals = [];
6269
- if (context.touchesAuth) signals.push("\u{1F510} Authentication/Authorization");
6270
- if (context.touchesPayments) signals.push("\u{1F4B3} Payment Processing");
6271
- if (context.touchesDatabase) signals.push("\u{1F5C4}\uFE0F Database Operations");
6272
- if (context.touchesAPI) signals.push("\u{1F310} API Endpoints");
6273
- if (context.touchesUI) signals.push("\u{1F3A8} User Interface");
6274
- if (context.touchesUserData) signals.push("\u{1F464} User/Personal Data");
6275
- if (context.touchesHealthData) signals.push("\u{1F3E5} Protected Health Info (PHI)");
6276
- if (context.touchesSecurityConfig) signals.push("\u{1F512} Security Configuration");
6277
+ if (context.touchesAuth) signals.push("* Authentication/Authorization");
6278
+ if (context.touchesPayments) signals.push("* Payment Processing");
6279
+ if (context.touchesDatabase) signals.push("* Database Operations");
6280
+ if (context.touchesAPI) signals.push("* API Endpoints");
6281
+ if (context.touchesUI) signals.push("* User Interface");
6282
+ if (context.touchesUserData) signals.push("* User/Personal Data");
6283
+ if (context.touchesHealthData) signals.push("* Protected Health Info (PHI)");
6284
+ if (context.touchesSecurityConfig) signals.push("* Security Configuration");
6277
6285
  if (signals.length === 0) {
6278
- signals.push("\u{1F4DD} General Code Changes");
6286
+ signals.push("* General Code Changes");
6279
6287
  }
6280
6288
  for (const signal of signals) {
6281
6289
  console.error(` ${signal}`);
6282
6290
  }
6283
6291
  console.error(`
6284
- \u{1F4CA} Lines analyzed: ${context.linesChanged}`);
6285
- console.error(` \u{1F4C1} File patterns: ${context.filePatterns.join(", ") || "none detected"}`);
6292
+ Lines analyzed: ${context.linesChanged}`);
6293
+ console.error(` File patterns: ${context.filePatterns.join(", ") || "none detected"}`);
6286
6294
  console.error("");
6287
6295
  }
6288
6296
  logRiskAssessment(context, riskLevel) {
6289
- const riskEmoji = {
6290
- low: "\u{1F7E2}",
6291
- medium: "\u{1F7E1}",
6292
- high: "\u{1F7E0}",
6293
- critical: "\u{1F534}"
6297
+ const riskLabel = {
6298
+ low: "[LOW]",
6299
+ medium: "[MEDIUM]",
6300
+ high: "[HIGH]",
6301
+ critical: "[CRITICAL]"
6294
6302
  };
6295
6303
  console.error(`
6296
- ${riskEmoji[riskLevel]} Risk Level: ${riskLevel.toUpperCase()}`);
6304
+ ${riskLabel[riskLevel]} Risk Level: ${riskLevel.toUpperCase()}`);
6297
6305
  const factors = [];
6298
6306
  if (context.touchesPayments) factors.push("Payment processing = automatic HIGH risk");
6299
6307
  if (context.touchesAuth) factors.push("Auth code requires extra scrutiny");
@@ -6304,18 +6312,18 @@ var TrieScanTool = class {
6304
6312
  if (factors.length > 0) {
6305
6313
  console.error(" Risk factors:");
6306
6314
  for (const factor of factors) {
6307
- console.error(` \u2022 ${factor}`);
6315
+ console.error(` - ${factor}`);
6308
6316
  }
6309
6317
  }
6310
6318
  console.error("");
6311
6319
  }
6312
6320
  logTriaging(selectedNames, allAgentNames, context, riskLevel) {
6313
6321
  console.error(`
6314
- \u{1F3AF} Agents Selected: ${selectedNames.length} of ${allAgentNames.length} available`);
6322
+ Agents Selected: ${selectedNames.length} of ${allAgentNames.length} available`);
6315
6323
  console.error("");
6316
6324
  for (const name of allAgentNames) {
6317
6325
  const isSelected = selectedNames.includes(name);
6318
- const icon = isSelected ? "\u2705" : "\u2B1C";
6326
+ const icon = isSelected ? "[x]" : "[ ]";
6319
6327
  const reason = isSelected ? this.getAgentReason(name, context, riskLevel) : "not needed for this context";
6320
6328
  console.error(` ${icon} ${name}: ${reason}`);
6321
6329
  }
@@ -6368,31 +6376,45 @@ var TrieScanTool = class {
6368
6376
  * Format a CONCISE summary for chat/terminal display
6369
6377
  * This is what users see - actionable, not overwhelming
6370
6378
  */
6371
- async formatChatSummary(result, prioritized, semanticOutput, attackSurfaceOutput, priorityReport, assignments) {
6379
+ async formatChatSummary(result, prioritized, semanticOutput, attackSurfaceOutput, priorityReport, assignments, costReport) {
6372
6380
  const { triaging, results: _results, executionTime } = result;
6373
6381
  let output2 = `
6374
6382
  `;
6375
- output2 += `# \u{1F53A} Trie Agent Scan Complete
6383
+ output2 += `TRIE SCAN COMPLETE
6384
+ `;
6385
+ output2 += `==================
6376
6386
 
6377
6387
  `;
6378
- output2 += `**Scanned:** ${triaging.agentsActivated.length} agents | **Time:** ${(executionTime / 1e3).toFixed(1)}s | **Risk:** ${triaging.riskLevel.toUpperCase()}
6388
+ output2 += `${triaging.agentsActivated.length} agents | ${(executionTime / 1e3).toFixed(1)}s | Risk: ${triaging.riskLevel.toUpperCase()}
6379
6389
 
6380
6390
  `;
6381
6391
  const totalActionable = prioritized.critical.length + prioritized.important.length;
6382
6392
  if (totalActionable === 0) {
6383
- output2 += `## \u2705 No Issues Found
6393
+ output2 += `## No Issues Found
6384
6394
 
6385
6395
  `;
6386
6396
  output2 += `Your code passed all checks.
6387
6397
 
6388
6398
  `;
6389
6399
  } else {
6390
- output2 += `## \u{1F3AF} ${totalActionable} Issues Found
6400
+ output2 += `## ${totalActionable} Issues Found
6401
+
6402
+ `;
6403
+ }
6404
+ const agentSummary = result.results.agentResults.filter((r) => r.issues.length > 0).map((r) => `${r.agent}: ${r.issues.length}`).slice(0, 6).join(" | ");
6405
+ if (agentSummary) {
6406
+ output2 += `**Agent Summary:** ${agentSummary}
6407
+
6408
+ `;
6409
+ }
6410
+ if (costReport && costReport.totalProductionCost > 0) {
6411
+ const formatCurrency = (n) => n >= 1e6 ? `$${(n / 1e6).toFixed(2)}M` : n >= 1e3 ? `$${(n / 1e3).toFixed(1)}k` : `$${n}`;
6412
+ output2 += `**Estimated Cost:** Fix now ${formatCurrency(costReport.totalNowCost)} | If production ${formatCurrency(costReport.totalProductionCost)} | Savings ${formatCurrency(costReport.totalSavings)}
6391
6413
 
6392
6414
  `;
6393
6415
  }
6394
6416
  if (prioritized.critical.length > 0) {
6395
- output2 += `### \u{1F534} Critical (${prioritized.critical.length})
6417
+ output2 += `### [CRITICAL] (${prioritized.critical.length})
6396
6418
 
6397
6419
  `;
6398
6420
  for (const issue of prioritized.critical.slice(0, 8)) {
@@ -6402,7 +6424,7 @@ var TrieScanTool = class {
6402
6424
  output2 += `**${issue.issue}**
6403
6425
 
6404
6426
  `;
6405
- output2 += `\u{1F4CD} \`${issue.file}:${issue.line || "?"}\`
6427
+ output2 += `File: \`${issue.file}:${issue.line || "?"}\`
6406
6428
 
6407
6429
  `;
6408
6430
  const snippet = await this.getCodeSnippet(issue.file, issue.line);
@@ -6417,7 +6439,7 @@ ${snippet}
6417
6439
 
6418
6440
  `;
6419
6441
  output2 += `<details>
6420
- <summary>\u{1F4AC} Prompt to fix this</summary>
6442
+ <summary>Prompt to fix this</summary>
6421
6443
 
6422
6444
  `;
6423
6445
  output2 += `\`\`\`
@@ -6438,7 +6460,7 @@ ${issue.fix}
6438
6460
  }
6439
6461
  }
6440
6462
  if (prioritized.important.length > 0) {
6441
- output2 += `### \u{1F7E0} Important (${prioritized.important.length})
6463
+ output2 += `### [SERIOUS] (${prioritized.important.length})
6442
6464
 
6443
6465
  `;
6444
6466
  for (const issue of prioritized.important.slice(0, 10)) {
@@ -6448,7 +6470,7 @@ ${issue.fix}
6448
6470
  output2 += `**${issue.issue}**
6449
6471
 
6450
6472
  `;
6451
- output2 += `\u{1F4CD} \`${issue.file}:${issue.line || "?"}\`
6473
+ output2 += `File: \`${issue.file}:${issue.line || "?"}\`
6452
6474
 
6453
6475
  `;
6454
6476
  const snippet = await this.getCodeSnippet(issue.file, issue.line);
@@ -6463,7 +6485,7 @@ ${snippet}
6463
6485
 
6464
6486
  `;
6465
6487
  output2 += `<details>
6466
- <summary>\u{1F4AC} Prompt to fix this</summary>
6488
+ <summary>Prompt to fix this</summary>
6467
6489
 
6468
6490
  `;
6469
6491
  output2 += `\`\`\`
@@ -6484,17 +6506,17 @@ ${issue.fix}
6484
6506
  }
6485
6507
  }
6486
6508
  if (semanticOutput && semanticOutput.includes("Data Flow") || semanticOutput.includes("Race Condition")) {
6487
- output2 += `### \u{1F9E0} Semantic Analysis
6509
+ output2 += `### Semantic Analysis
6488
6510
 
6489
6511
  `;
6490
6512
  const dataFlowMatch = semanticOutput.match(/Data Flow Vulnerabilities \((\d+)\)/);
6491
6513
  const raceMatch = semanticOutput.match(/Race Conditions \((\d+)\)/);
6492
6514
  const authMatch = semanticOutput.match(/Authentication Issues \((\d+)\)/);
6493
- if (dataFlowMatch) output2 += `- \u{1F534} **${dataFlowMatch[1]} data flow vulnerabilities** (untrusted input reaching dangerous sinks)
6515
+ if (dataFlowMatch) output2 += `- [CRITICAL] **${dataFlowMatch[1]} data flow vulnerabilities** (untrusted input reaching dangerous sinks)
6494
6516
  `;
6495
- if (authMatch) output2 += `- \u{1F534} **${authMatch[1]} authentication issues** (missing or bypassable auth)
6517
+ if (authMatch) output2 += `- [CRITICAL] **${authMatch[1]} authentication issues** (missing or bypassable auth)
6496
6518
  `;
6497
- if (raceMatch) output2 += `- \u{1F7E1} **${raceMatch[1]} race conditions** (TOCTOU, double-spend risks)
6519
+ if (raceMatch) output2 += `- [WARN] **${raceMatch[1]} race conditions** (TOCTOU, double-spend risks)
6498
6520
  `;
6499
6521
  output2 += `
6500
6522
  `;
@@ -6504,11 +6526,11 @@ ${issue.fix}
6504
6526
  const endpointsMatch = attackSurfaceOutput.match(/Total Endpoints \| (\d+)/);
6505
6527
  const publicMatch = attackSurfaceOutput.match(/Public \(No Auth\) \| (\d+)/);
6506
6528
  if (riskMatch || endpointsMatch) {
6507
- output2 += `### \u{1F3AF} Attack Surface
6529
+ output2 += `### Attack Surface
6508
6530
 
6509
6531
  `;
6510
6532
  if (endpointsMatch) output2 += `- **${endpointsMatch[1]} endpoints** found`;
6511
- if (publicMatch?.[1] && parseInt(publicMatch[1], 10) > 0) output2 += ` (\u26A0\uFE0F ${publicMatch[1]} public without auth)`;
6533
+ if (publicMatch?.[1] && parseInt(publicMatch[1], 10) > 0) output2 += ` [WARN: ${publicMatch[1]} public without auth]`;
6512
6534
  output2 += `
6513
6535
  `;
6514
6536
  if (riskMatch) output2 += `- **Risk Score:** ${riskMatch[1]}/100
@@ -6518,7 +6540,7 @@ ${issue.fix}
6518
6540
  }
6519
6541
  }
6520
6542
  if (priorityReport.totalGroups > 0) {
6521
- output2 += `### \u{1F9E9} Smart Grouping
6543
+ output2 += `### Smart Grouping
6522
6544
 
6523
6545
  `;
6524
6546
  output2 += `- **${priorityReport.totalGroups} issue groups** across ${priorityReport.totalIssues} issues
@@ -6532,7 +6554,7 @@ ${issue.fix}
6532
6554
  `;
6533
6555
  for (const group of topGroups) {
6534
6556
  const bulk = group.bulkFixAvailable ? " (bulk-fix available)" : "";
6535
- output2 += `- ${group.description} \u2014 ${group.count} issues${bulk}
6557
+ output2 += `- ${group.description} -- ${group.count} issues${bulk}
6536
6558
  `;
6537
6559
  }
6538
6560
  output2 += `
@@ -6550,7 +6572,7 @@ ${issue.fix}
6550
6572
  }
6551
6573
  }
6552
6574
  if (assignments.length > 0) {
6553
- output2 += `### \u{1F91D} Team Assignments
6575
+ output2 += `### Team Assignments
6554
6576
 
6555
6577
  `;
6556
6578
  const urgent = assignments.filter((a) => a.priority === "urgent").length;
@@ -6559,7 +6581,7 @@ ${issue.fix}
6559
6581
 
6560
6582
  `;
6561
6583
  }
6562
- output2 += `## \u{1F4CB} Next Steps
6584
+ output2 += `## Next Steps
6563
6585
 
6564
6586
  `;
6565
6587
  if (prioritized.critical.length > 0) {
@@ -6573,7 +6595,7 @@ ${issue.fix}
6573
6595
  `;
6574
6596
  output2 += `---
6575
6597
  `;
6576
- output2 += `*\u{1F4A1} Unlike other tools that dump 10,000 issues, Trie Agent shows you what matters.*
6598
+ output2 += `*Trie Agent shows you what matters, not 10,000 issues.*
6577
6599
  `;
6578
6600
  return output2;
6579
6601
  }
@@ -6658,4 +6680,4 @@ export {
6658
6680
  loadConfig,
6659
6681
  TrieScanTool
6660
6682
  };
6661
- //# sourceMappingURL=chunk-5AS3BWAZ.js.map
6683
+ //# sourceMappingURL=chunk-JDICQHNT.js.map