@triedotdev/mcp 1.0.45 → 1.0.47
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/{chunk-BAME4KVK.js → chunk-6T7S77U7.js} +339 -20
- package/dist/chunk-6T7S77U7.js.map +1 -0
- package/dist/cli/main.js +108 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/chunk-BAME4KVK.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@triedotdev/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.47",
|
|
4
4
|
"description": "Intelligent Agent Orchestration for AI Coding Tools",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
+
"trie": "dist/cli/main.js",
|
|
8
9
|
"mcp": "dist/index.js",
|
|
9
10
|
"trie-agent": "dist/cli/main.js",
|
|
10
11
|
"trie-mcp": "dist/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/checkpoint.ts","../src/bootstrap/files.ts","../src/bootstrap/stack-detector.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 * 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","/**\n * Stack Detector\n * \n * Detects project technology stack from config files.\n * Used by bootstrap system to suggest skills and agents.\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\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 } 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 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 // 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 // Framework detection\n if (deps['next']) {\n stack.framework = `Next.js ${deps['next'].replace('^', '')}`;\n stack.suggestedSkills.push('vercel-labs/agent-skills react-best-practices');\n stack.suggestedAgents.push('accessibility', 'design');\n } else if (deps['react']) {\n stack.framework = `React ${deps['react'].replace('^', '')}`;\n stack.suggestedSkills.push('vercel-labs/agent-skills react-best-practices');\n stack.suggestedAgents.push('accessibility');\n } else if (deps['vue']) {\n stack.framework = `Vue ${deps['vue'].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 }\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 stack.suggestedSkills.push('better-auth/skills better-auth-best-practices');\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 stack.suggestedSkills.push('supabase/agent-skills supabase-postgres-best-practices');\n } else if (deps['mongoose']) {\n stack.database = 'MongoDB (Mongoose)';\n } else if (deps['pg']) {\n stack.database = 'PostgreSQL';\n }\n\n // Additional skills based on deps\n if (deps['stripe'] || deps['@stripe/stripe-js']) {\n stack.suggestedSkills.push('stripe/ai stripe-best-practices');\n stack.suggestedAgents.push('moneybags');\n }\n\n if (deps['expo']) {\n stack.suggestedSkills.push('expo/skills upgrading-expo');\n }\n\n if (deps['remotion']) {\n stack.suggestedSkills.push('remotion-dev/skills remotion-best-practices');\n }\n\n if (deps['react-native']) {\n stack.suggestedSkills.push('callstackincubator/agent-skills react-native-best-practices');\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 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"],"mappings":"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","names":["readFile","writeFile","mkdir","existsSync","join","readFile","existsSync","join","join","needsBootstrap","existsSync","readFile","mkdir","writeFile"]}
|