@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.
- package/README.md +82 -17
- package/dist/{agent-smith-W7F55E6P.js → agent-smith-5QOZXLMV.js} +2 -2
- package/dist/{agent-smith-runner-SH76O724.js → agent-smith-runner-ZTDCJJQG.js} +2 -2
- package/dist/{chunk-BAME4KVK.js → chunk-6T7S77U7.js} +339 -20
- package/dist/chunk-6T7S77U7.js.map +1 -0
- package/dist/{chunk-5AS3BWAZ.js → chunk-JDICQHNT.js} +84 -62
- package/dist/chunk-JDICQHNT.js.map +1 -0
- package/dist/{chunk-OB45V2QC.js → chunk-KQOMSIVR.js} +201 -234
- package/dist/chunk-KQOMSIVR.js.map +1 -0
- package/dist/{chunk-R5HWHP5N.js → chunk-VZYCZXEQ.js} +55 -66
- package/dist/chunk-VZYCZXEQ.js.map +1 -0
- package/dist/cli/main.js +107 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +3 -3
- package/dist/index.js +12 -7
- package/dist/index.js.map +1 -1
- package/dist/workers/agent-worker.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-5AS3BWAZ.js.map +0 -1
- package/dist/chunk-BAME4KVK.js.map +0 -1
- package/dist/chunk-OB45V2QC.js.map +0 -1
- package/dist/chunk-R5HWHP5N.js.map +0 -1
- /package/dist/{agent-smith-W7F55E6P.js.map → agent-smith-5QOZXLMV.js.map} +0 -0
- /package/dist/{agent-smith-runner-SH76O724.js.map → agent-smith-runner-ZTDCJJQG.js.map} +0 -0
|
@@ -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-
|
|
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-
|
|
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
|
|
3971
|
+
return `>> Starting ${update.data.agent}...`;
|
|
3972
3972
|
case "agent_complete":
|
|
3973
|
-
const
|
|
3974
|
-
return `${
|
|
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 ? `
|
|
3980
|
-
return
|
|
3979
|
+
const current = currentFile ? ` - ${currentFile.split("/").pop()}` : "";
|
|
3980
|
+
return `Progress: ${progress}% (${processedFiles}/${totalFiles})${active}${current}`;
|
|
3981
3981
|
case "scan_complete":
|
|
3982
|
-
return
|
|
3982
|
+
return `[COMPLETE] Scan finished. Found ${update.data.totalIssues} issues across ${update.data.totalFiles} files`;
|
|
3983
3983
|
case "error":
|
|
3984
|
-
return
|
|
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", "
|
|
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(`
|
|
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
|
|
6065
|
-
if (
|
|
6066
|
-
|
|
6067
|
-
console.error(`
|
|
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:
|
|
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
|
|
6275
|
+
console.error("\n Detected Context Signals:");
|
|
6268
6276
|
const signals = [];
|
|
6269
|
-
if (context.touchesAuth) signals.push("
|
|
6270
|
-
if (context.touchesPayments) signals.push("
|
|
6271
|
-
if (context.touchesDatabase) signals.push("
|
|
6272
|
-
if (context.touchesAPI) signals.push("
|
|
6273
|
-
if (context.touchesUI) signals.push("
|
|
6274
|
-
if (context.touchesUserData) signals.push("
|
|
6275
|
-
if (context.touchesHealthData) signals.push("
|
|
6276
|
-
if (context.touchesSecurityConfig) signals.push("
|
|
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("
|
|
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
|
-
|
|
6285
|
-
console.error(`
|
|
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
|
|
6290
|
-
low: "
|
|
6291
|
-
medium: "
|
|
6292
|
-
high: "
|
|
6293
|
-
critical: "
|
|
6297
|
+
const riskLabel = {
|
|
6298
|
+
low: "[LOW]",
|
|
6299
|
+
medium: "[MEDIUM]",
|
|
6300
|
+
high: "[HIGH]",
|
|
6301
|
+
critical: "[CRITICAL]"
|
|
6294
6302
|
};
|
|
6295
6303
|
console.error(`
|
|
6296
|
-
${
|
|
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(`
|
|
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
|
-
|
|
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 ? "
|
|
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 +=
|
|
6383
|
+
output2 += `TRIE SCAN COMPLETE
|
|
6384
|
+
`;
|
|
6385
|
+
output2 += `==================
|
|
6376
6386
|
|
|
6377
6387
|
`;
|
|
6378
|
-
output2 +=
|
|
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 += `##
|
|
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 += `##
|
|
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 += `###
|
|
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 +=
|
|
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
|
|
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 += `###
|
|
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 +=
|
|
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
|
|
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 += `###
|
|
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 += `-
|
|
6515
|
+
if (dataFlowMatch) output2 += `- [CRITICAL] **${dataFlowMatch[1]} data flow vulnerabilities** (untrusted input reaching dangerous sinks)
|
|
6494
6516
|
`;
|
|
6495
|
-
if (authMatch) output2 += `-
|
|
6517
|
+
if (authMatch) output2 += `- [CRITICAL] **${authMatch[1]} authentication issues** (missing or bypassable auth)
|
|
6496
6518
|
`;
|
|
6497
|
-
if (raceMatch) output2 += `-
|
|
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 += `###
|
|
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 += `
|
|
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 += `###
|
|
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}
|
|
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 += `###
|
|
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 += `##
|
|
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 +=
|
|
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-
|
|
6683
|
+
//# sourceMappingURL=chunk-JDICQHNT.js.map
|