@triedotdev/mcp 1.0.88 → 1.0.90
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 +11 -3
- package/dist/{agent-smith-MCKGNWPL.js → agent-smith-KIFP2XG3.js} +4 -4
- package/dist/{agent-smith-runner-GP5HLL7E.js → agent-smith-runner-Z73W5DR5.js} +4 -4
- package/dist/{chunk-YSES743V.js → chunk-3HTPH3P2.js} +14 -13
- package/dist/chunk-3HTPH3P2.js.map +1 -0
- package/dist/{chunk-HNDHVFA3.js → chunk-A44W6SZJ.js} +17 -16
- package/dist/chunk-A44W6SZJ.js.map +1 -0
- package/dist/{chunk-Z6JP2QQU.js → chunk-BBEFK56U.js} +27 -26
- package/dist/chunk-BBEFK56U.js.map +1 -0
- package/dist/{chunk-X3E6ISEG.js → chunk-CFE7FZU7.js} +7 -4
- package/dist/chunk-CFE7FZU7.js.map +1 -0
- package/dist/{chunk-KGVKUMFO.js → chunk-D35TI7NY.js} +2 -2
- package/dist/{chunk-CM7EHNQK.js → chunk-D5VEUZLP.js} +33 -2
- package/dist/chunk-D5VEUZLP.js.map +1 -0
- package/dist/{chunk-TBRU735C.js → chunk-F3WW4FY2.js} +6 -3
- package/dist/chunk-F3WW4FY2.js.map +1 -0
- package/dist/{chunk-DXBYHIA7.js → chunk-G4DUCCMT.js} +8 -8
- package/dist/{chunk-DCJKNE2L.js → chunk-GMKPXL4Q.js} +4 -3
- package/dist/chunk-GMKPXL4Q.js.map +1 -0
- package/dist/{chunk-7UPNCM66.js → chunk-JG2TAVAO.js} +14 -13
- package/dist/chunk-JG2TAVAO.js.map +1 -0
- package/dist/{chunk-THJKXIMJ.js → chunk-OXZKSR6J.js} +7 -4
- package/dist/chunk-OXZKSR6J.js.map +1 -0
- package/dist/{chunk-TDWPEV3N.js → chunk-PFWGEHIA.js} +8 -5
- package/dist/chunk-PFWGEHIA.js.map +1 -0
- package/dist/{chunk-PH4HZEAM.js → chunk-QH5XB4K6.js} +6 -5
- package/dist/chunk-QH5XB4K6.js.map +1 -0
- package/dist/{chunk-4CYQGEWE.js → chunk-TBL3FWWG.js} +22 -21
- package/dist/chunk-TBL3FWWG.js.map +1 -0
- package/dist/cli/create-agent.js +2 -2
- package/dist/cli/main.js +25 -17
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +12 -12
- package/dist/{goal-manager-JTM6MOZG.js → goal-manager-7D3GUJVV.js} +5 -5
- package/dist/guardian-agent-QBYV2JLR.js +21 -0
- package/dist/index.js +23 -22
- package/dist/index.js.map +1 -1
- package/dist/{issue-store-AZ3D4LOG.js → issue-store-WTXCQZEA.js} +3 -3
- package/dist/workers/agent-worker.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-4CYQGEWE.js.map +0 -1
- package/dist/chunk-7UPNCM66.js.map +0 -1
- package/dist/chunk-CM7EHNQK.js.map +0 -1
- package/dist/chunk-DCJKNE2L.js.map +0 -1
- package/dist/chunk-HNDHVFA3.js.map +0 -1
- package/dist/chunk-PH4HZEAM.js.map +0 -1
- package/dist/chunk-TBRU735C.js.map +0 -1
- package/dist/chunk-TDWPEV3N.js.map +0 -1
- package/dist/chunk-THJKXIMJ.js.map +0 -1
- package/dist/chunk-X3E6ISEG.js.map +0 -1
- package/dist/chunk-YSES743V.js.map +0 -1
- package/dist/chunk-Z6JP2QQU.js.map +0 -1
- package/dist/guardian-agent-RIF7XBFL.js +0 -21
- /package/dist/{agent-smith-MCKGNWPL.js.map → agent-smith-KIFP2XG3.js.map} +0 -0
- /package/dist/{agent-smith-runner-GP5HLL7E.js.map → agent-smith-runner-Z73W5DR5.js.map} +0 -0
- /package/dist/{chunk-KGVKUMFO.js.map → chunk-D35TI7NY.js.map} +0 -0
- /package/dist/{chunk-DXBYHIA7.js.map → chunk-G4DUCCMT.js.map} +0 -0
- /package/dist/{goal-manager-JTM6MOZG.js.map → goal-manager-7D3GUJVV.js.map} +0 -0
- /package/dist/{guardian-agent-RIF7XBFL.js.map → guardian-agent-QBYV2JLR.js.map} +0 -0
- /package/dist/{issue-store-AZ3D4LOG.js.map → issue-store-WTXCQZEA.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1087,8 +1087,8 @@ Save, validate, and share patterns that worked well across projects:
|
|
|
1087
1087
|
|
|
1088
1088
|
```bash
|
|
1089
1089
|
# Save patterns (auto-detects type: file structure, code pattern, or detection rule)
|
|
1090
|
-
trie patterns save "
|
|
1091
|
-
trie patterns save "
|
|
1090
|
+
trie patterns save "auth/login.ts" "This error handling prevented 3 bugs"
|
|
1091
|
+
trie patterns save "auth/*" "This folder structure worked well"
|
|
1092
1092
|
trie patterns save security "This scout caught issues early"
|
|
1093
1093
|
|
|
1094
1094
|
# List saved patterns
|
|
@@ -1099,7 +1099,7 @@ trie patterns list --validated # Only validated patterns
|
|
|
1099
1099
|
trie patterns validate pattern-abc123 "Worked great in production"
|
|
1100
1100
|
|
|
1101
1101
|
# Export patterns to share
|
|
1102
|
-
trie patterns export patterns.json --validated
|
|
1102
|
+
trie patterns export my-patterns.json --validated
|
|
1103
1103
|
|
|
1104
1104
|
# Import patterns into another project
|
|
1105
1105
|
cd ../another-project
|
|
@@ -1188,6 +1188,14 @@ Global patterns stored in `~/.trie/memory/`:
|
|
|
1188
1188
|
- Skill effectiveness data
|
|
1189
1189
|
- Your personal coding patterns
|
|
1190
1190
|
|
|
1191
|
+
### Git Worktrees
|
|
1192
|
+
Trie is worktree-aware and shares a single `.trie/` across linked worktrees by default.
|
|
1193
|
+
|
|
1194
|
+
If you want isolated memory per worktree, set:
|
|
1195
|
+
```
|
|
1196
|
+
TRIE_WORKTREE_MODE=isolated
|
|
1197
|
+
```
|
|
1198
|
+
|
|
1191
1199
|
### Memory Management
|
|
1192
1200
|
```bash
|
|
1193
1201
|
# View capacity (default: 10,000 issues)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentSmithSkill,
|
|
3
3
|
PATTERN_HUNTER_CONFIGS
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-F3WW4FY2.js";
|
|
5
|
+
import "./chunk-GMKPXL4Q.js";
|
|
6
|
+
import "./chunk-D5VEUZLP.js";
|
|
7
7
|
import "./chunk-MIL54SAF.js";
|
|
8
8
|
import "./chunk-DGUM43GV.js";
|
|
9
9
|
export {
|
|
@@ -11,4 +11,4 @@ export {
|
|
|
11
11
|
AgentSmithSkill,
|
|
12
12
|
PATTERN_HUNTER_CONFIGS
|
|
13
13
|
};
|
|
14
|
-
//# sourceMappingURL=agent-smith-
|
|
14
|
+
//# sourceMappingURL=agent-smith-KIFP2XG3.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AgentSmithSkill
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-F3WW4FY2.js";
|
|
4
4
|
import {
|
|
5
5
|
getAIStatusMessage,
|
|
6
6
|
isAIAvailable,
|
|
7
7
|
runAIAnalysis
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-GMKPXL4Q.js";
|
|
9
9
|
import {
|
|
10
10
|
getWorkingDirectory
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-D5VEUZLP.js";
|
|
12
12
|
import {
|
|
13
13
|
isInteractiveMode
|
|
14
14
|
} from "./chunk-MIL54SAF.js";
|
|
@@ -570,4 +570,4 @@ ${getAIStatusMessage()}`);
|
|
|
570
570
|
export {
|
|
571
571
|
runAgentSmith
|
|
572
572
|
};
|
|
573
|
-
//# sourceMappingURL=agent-smith-runner-
|
|
573
|
+
//# sourceMappingURL=agent-smith-runner-Z73W5DR5.js.map
|
|
@@ -3,19 +3,20 @@ import {
|
|
|
3
3
|
getSkillRegistry,
|
|
4
4
|
loadContextState,
|
|
5
5
|
runExecFile
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BBEFK56U.js";
|
|
7
7
|
import {
|
|
8
8
|
getGlobalMemoryStats
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-D35TI7NY.js";
|
|
10
10
|
import {
|
|
11
11
|
getHistoricalInsights,
|
|
12
12
|
getMemoryStats,
|
|
13
13
|
getRecentIssues,
|
|
14
14
|
searchIssues
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-JG2TAVAO.js";
|
|
16
16
|
import {
|
|
17
|
+
getTrieDirectory,
|
|
17
18
|
getWorkingDirectory
|
|
18
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-D5VEUZLP.js";
|
|
19
20
|
import {
|
|
20
21
|
isInteractiveMode
|
|
21
22
|
} from "./chunk-MIL54SAF.js";
|
|
@@ -36,7 +37,7 @@ var INIT_MARKERS = [
|
|
|
36
37
|
];
|
|
37
38
|
function isTrieInitialized(workDir) {
|
|
38
39
|
const dir = workDir || getWorkingDirectory(void 0, true);
|
|
39
|
-
const trieDir =
|
|
40
|
+
const trieDir = getTrieDirectory(dir);
|
|
40
41
|
return INIT_MARKERS.some((marker) => existsSync(join(trieDir, marker)));
|
|
41
42
|
}
|
|
42
43
|
|
|
@@ -184,7 +185,7 @@ var ConfigValidator = class {
|
|
|
184
185
|
let anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
185
186
|
if (!anthropicKey) {
|
|
186
187
|
try {
|
|
187
|
-
const configPath = join2(getWorkingDirectory(void 0, true), "
|
|
188
|
+
const configPath = join2(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
|
|
188
189
|
if (existsSync2(configPath)) {
|
|
189
190
|
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
190
191
|
anthropicKey = config.apiKeys?.anthropic;
|
|
@@ -420,7 +421,7 @@ var DEFAULT_CONFIG = {
|
|
|
420
421
|
// src/config/loader.ts
|
|
421
422
|
async function loadConfig() {
|
|
422
423
|
const validator = new ConfigValidator();
|
|
423
|
-
const configPath = join3(getWorkingDirectory(void 0, true), "
|
|
424
|
+
const configPath = join3(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
|
|
424
425
|
try {
|
|
425
426
|
if (!existsSync3(configPath)) {
|
|
426
427
|
return DEFAULT_CONFIG;
|
|
@@ -456,7 +457,7 @@ async function loadConfig() {
|
|
|
456
457
|
}
|
|
457
458
|
}
|
|
458
459
|
async function saveConfig(config) {
|
|
459
|
-
const configPath = join3(getWorkingDirectory(void 0, true), "
|
|
460
|
+
const configPath = join3(getTrieDirectory(getWorkingDirectory(void 0, true)), "config.json");
|
|
460
461
|
const dir = dirname(configPath);
|
|
461
462
|
if (!existsSync3(dir)) {
|
|
462
463
|
await mkdir(dir, { recursive: true });
|
|
@@ -1414,7 +1415,7 @@ var CacheManager = class {
|
|
|
1414
1415
|
// 24 hours
|
|
1415
1416
|
MAX_ENTRIES = 1e3;
|
|
1416
1417
|
constructor(baseDir) {
|
|
1417
|
-
this.cacheDir = join4(baseDir, "
|
|
1418
|
+
this.cacheDir = join4(getTrieDirectory(baseDir), "cache");
|
|
1418
1419
|
this.indexPath = join4(this.cacheDir, "index.json");
|
|
1419
1420
|
}
|
|
1420
1421
|
/**
|
|
@@ -2234,7 +2235,7 @@ import { readFile as readFile4, writeFile as writeFile3 } from "fs/promises";
|
|
|
2234
2235
|
import { existsSync as existsSync7 } from "fs";
|
|
2235
2236
|
import { join as join6, basename } from "path";
|
|
2236
2237
|
async function loadSavedPatterns(workDir) {
|
|
2237
|
-
const patternsPath = join6(workDir, "
|
|
2238
|
+
const patternsPath = join6(getTrieDirectory(workDir), "saved-patterns.json");
|
|
2238
2239
|
try {
|
|
2239
2240
|
if (existsSync7(patternsPath)) {
|
|
2240
2241
|
const content = await readFile4(patternsPath, "utf-8");
|
|
@@ -2246,8 +2247,8 @@ async function loadSavedPatterns(workDir) {
|
|
|
2246
2247
|
}
|
|
2247
2248
|
async function savePatternsToProject(patterns, workDir) {
|
|
2248
2249
|
const { mkdir: mkdir3 } = await import("fs/promises");
|
|
2249
|
-
const patternsPath = join6(workDir, "
|
|
2250
|
-
await mkdir3(
|
|
2250
|
+
const patternsPath = join6(getTrieDirectory(workDir), "saved-patterns.json");
|
|
2251
|
+
await mkdir3(getTrieDirectory(workDir), { recursive: true });
|
|
2251
2252
|
await writeFile3(patternsPath, JSON.stringify(patterns, null, 2));
|
|
2252
2253
|
}
|
|
2253
2254
|
async function savePatternToProject(pattern, workDir) {
|
|
@@ -2445,4 +2446,4 @@ export {
|
|
|
2445
2446
|
createSavedPattern,
|
|
2446
2447
|
buildSavedPatternIssues
|
|
2447
2448
|
};
|
|
2448
|
-
//# sourceMappingURL=chunk-
|
|
2449
|
+
//# sourceMappingURL=chunk-3HTPH3P2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/trie-init.ts","../src/config/loader.ts","../src/config/validation.ts","../src/orchestrator/triager.ts","../src/utils/parallel-executor.ts","../src/utils/cache-manager.ts","../src/orchestrator/executor.ts","../src/agent/git.ts","../src/bootstrap/stack-detector.ts","../src/patterns/saved-patterns.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from './workspace.js';\n\nconst INIT_MARKERS = [\n 'PROJECT.md',\n 'RULES.md',\n 'TEAM.md',\n 'BOOTSTRAP.md',\n 'AGENTS.md',\n 'config.json',\n];\n\nexport function isTrieInitialized(workDir?: string): boolean {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(dir);\n return INIT_MARKERS.some((marker) => existsSync(join(trieDir, marker)));\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { ConfigValidator, DEFAULT_CONFIG, type TrieConfig } from './validation.js';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { isInteractiveMode } from '../utils/progress.js';\n\nexport async function loadConfig(): Promise<TrieConfig> {\n const validator = new ConfigValidator();\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n\n try {\n // Look for config in .trie/config.json\n if (!existsSync(configPath)) {\n return DEFAULT_CONFIG;\n }\n\n const configFile = await readFile(configPath, 'utf-8');\n const userConfig = JSON.parse(configFile) as Record<string, unknown>;\n\n // Deep merge with defaults\n const merged = mergeConfig(DEFAULT_CONFIG, userConfig);\n\n // Validate merged config\n const result = validator.validateConfig(merged);\n if (!result.success) {\n // Suppress console output in interactive mode (TUI handles display)\n if (!isInteractiveMode()) {\n console.error('Configuration validation failed:');\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n }\n return DEFAULT_CONFIG;\n }\n\n // Environment validation warnings (skip in interactive mode)\n if (!isInteractiveMode()) {\n const envValidation = validator.validateEnvironment();\n for (const warning of envValidation.warnings) {\n console.warn(warning);\n }\n for (const error of envValidation.errors) {\n console.error(error);\n }\n }\n\n return result.data;\n } catch (error) {\n // If no config found, return defaults (suppress in interactive mode)\n if (!isInteractiveMode()) {\n console.error('Failed to load config, using defaults:', error);\n }\n return DEFAULT_CONFIG;\n }\n}\n\nexport async function saveConfig(config: TrieConfig): Promise<void> {\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nfunction mergeConfig<T extends Record<string, unknown>>(defaults: T, user: Record<string, unknown>): T {\n if (typeof user !== 'object' || user === null || Array.isArray(user)) {\n return { ...defaults };\n }\n\n const result = { ...defaults } as T;\n\n for (const [key, value] of Object.entries(user)) {\n const defaultValue = defaults[key as keyof T];\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && typeof defaultValue === 'object' && defaultValue !== null) {\n result[key as keyof T] = mergeConfig(defaultValue as Record<string, unknown>, value as Record<string, unknown>) as T[keyof T];\n } else {\n result[key as keyof T] = value as T[keyof T];\n }\n }\n\n return result;\n}","import { z } from 'zod';\nimport { existsSync, readFileSync } from 'fs';\nimport { resolve, join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\n\n// API key validation patterns\nconst API_KEY_PATTERNS = {\n anthropic: /^sk-ant-api\\d{2}-[\\w-]{95}$/,\n openai: /^sk-[\\w]{48}$/,\n github: /^ghp_[\\w]{36}$/,\n vercel: /^[\\w]{24}$/,\n linear: /^lin_api_[\\w]{40,60}$/,\n} as const;\n\n// Configuration schemas\nconst ApiKeysSchema = z.object({\n anthropic: z.string().regex(API_KEY_PATTERNS.anthropic, 'Invalid Anthropic API key format').optional(),\n openai: z.string().regex(API_KEY_PATTERNS.openai, 'Invalid OpenAI API key format').optional(),\n github: z.string().regex(API_KEY_PATTERNS.github, 'Invalid GitHub token format').optional(),\n vercel: z.string().regex(API_KEY_PATTERNS.vercel, 'Invalid Vercel token format').optional(),\n linear: z.string().optional(), // Linear keys can vary, so we'll be flexible but allow storage\n});\n\nconst AgentConfigSchema = z.object({\n enabled: z.array(z.string()).optional().default([]),\n disabled: z.array(z.string()).optional().default([]),\n parallel: z.boolean().optional().default(true),\n maxConcurrency: z.number().int().min(1).max(20).optional().default(4),\n timeout: z.number().int().min(1000).max(300000).optional().default(120000), // 2 minutes\n cache: z.boolean().optional().default(true),\n});\n\nconst ComplianceSchema = z.object({\n standards: z.array(z.enum(['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS'])).optional().default(['SOC2']),\n enforceCompliance: z.boolean().optional().default(false),\n reportFormat: z.enum(['json', 'sarif', 'csv', 'html']).optional().default('json'),\n});\n\nconst OutputSchema = z.object({\n format: z.enum(['console', 'json', 'sarif', 'junit']).optional().default('console'),\n level: z.enum(['critical', 'serious', 'moderate', 'low', 'all']).optional().default('all'),\n interactive: z.boolean().optional().default(false),\n streaming: z.boolean().optional().default(true),\n colors: z.boolean().optional().default(true),\n});\n\nconst PathsSchema = z.object({\n include: z.array(z.string()).optional().default([]),\n exclude: z.array(z.string()).optional().default(['node_modules', 'dist', 'build', '.git']),\n configDir: z.string().optional().default('.trie'),\n outputDir: z.string().optional().default('trie-reports'),\n});\n\nconst IntegrationsSchema = z.object({\n github: z.object({\n enabled: z.boolean().optional().default(false),\n token: z.string().optional(),\n webhook: z.string().url().optional(),\n }).optional(),\n slack: z.object({\n enabled: z.boolean().optional().default(false),\n webhook: z.string().url().optional(),\n channel: z.string().optional(),\n }).optional(),\n jira: z.object({\n enabled: z.boolean().optional().default(false),\n url: z.string().url().optional(),\n token: z.string().optional(),\n project: z.string().optional(),\n }).optional(),\n});\n\n// User identity for attribution tracking\nconst UserSchema = z.object({\n name: z.string().min(1).optional(),\n email: z.string().email().optional(),\n role: z.enum([\n 'developer',\n 'designer', \n 'qa',\n 'devops',\n 'security',\n 'architect',\n 'manager',\n 'contributor'\n ]).optional().default('developer'),\n github: z.string().optional(), // GitHub username\n url: z.string().url().optional(), // Personal/portfolio URL\n});\n\nexport const TrieConfigSchema = z.object({\n version: z.string().optional().default('1.0.0'),\n apiKeys: ApiKeysSchema.optional(),\n agents: AgentConfigSchema.optional(),\n compliance: ComplianceSchema.optional(),\n output: OutputSchema.optional(),\n paths: PathsSchema.optional(),\n integrations: IntegrationsSchema.optional(),\n user: UserSchema.optional(), // User identity for attribution\n});\n\nexport type TrieConfig = z.infer<typeof TrieConfigSchema>;\nexport type ApiKeys = z.infer<typeof ApiKeysSchema>;\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n/**\n * Configuration validator with detailed error reporting\n */\nexport class ConfigValidator {\n /**\n * Validate configuration object\n */\n validateConfig(config: unknown): { success: true; data: TrieConfig } | { success: false; errors: string[] } {\n try {\n const validated = TrieConfigSchema.parse(config);\n\n // Additional business logic validation\n const businessErrors = this.validateBusinessLogic(validated);\n if (businessErrors.length > 0) {\n return { success: false, errors: businessErrors };\n }\n\n return { success: true, data: validated };\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(err =>\n `${err.path.join('.')}: ${err.message}`\n );\n return { success: false, errors };\n }\n\n return {\n success: false,\n errors: [`Configuration validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`]\n };\n }\n }\n\n /**\n * Validate environment variables for API keys\n */\n validateEnvironment(): { valid: boolean; warnings: string[]; errors: string[] } {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Check for potentially exposed secrets\n const exposedPatterns = [\n 'NEXT_PUBLIC_ANTHROPIC',\n 'REACT_APP_ANTHROPIC',\n 'VITE_ANTHROPIC',\n 'PUBLIC_ANTHROPIC'\n ];\n\n for (const pattern of exposedPatterns) {\n const envVars = Object.keys(process.env).filter(key => key.includes(pattern));\n for (const envVar of envVars) {\n errors.push(`[!] Security risk: API key in client-side environment variable: ${envVar}`);\n }\n }\n\n // Check API key format if present (check env var first, then config)\n let anthropicKey = process.env.ANTHROPIC_API_KEY;\n \n // Also check config file if available (for validation purposes)\n // Note: This is a read-only check for validation, actual usage goes through isAIAvailable()\n if (!anthropicKey) {\n try {\n const configPath = join(getTrieDirectory(getWorkingDirectory(undefined, true)), 'config.json');\n if (existsSync(configPath)) {\n const config = JSON.parse(readFileSync(configPath, 'utf-8'));\n anthropicKey = config.apiKeys?.anthropic;\n }\n } catch {\n // Config file check failed, continue with env var only\n }\n }\n \n if (anthropicKey && !API_KEY_PATTERNS.anthropic.test(anthropicKey)) {\n errors.push('ANTHROPIC_API_KEY does not match expected format');\n }\n\n // Warnings for missing optional keys\n if (!anthropicKey) {\n warnings.push('ANTHROPIC_API_KEY not set - AI features will be disabled. Set in environment, .trie/config.json, or .env file');\n }\n\n if (!process.env.GITHUB_TOKEN && process.env.CI) {\n warnings.push('GITHUB_TOKEN not set - GitHub integration disabled');\n }\n\n return {\n valid: errors.length === 0,\n warnings,\n errors\n };\n }\n\n /**\n * Validate file paths in configuration\n */\n validatePaths(paths: z.infer<typeof PathsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (paths?.include) {\n for (const path of paths.include) {\n const resolvedPath = resolve(path);\n if (!existsSync(resolvedPath)) {\n errors.push(`Include path does not exist: ${path}`);\n }\n }\n }\n\n if (paths?.configDir) {\n const configPath = resolve(paths.configDir);\n if (!existsSync(configPath)) {\n try {\n // Try to create the directory\n require('fs').mkdirSync(configPath, { recursive: true });\n } catch {\n errors.push(`Cannot create config directory: ${paths.configDir}`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Validate integration configurations\n */\n validateIntegrations(integrations: z.infer<typeof IntegrationsSchema>): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // GitHub integration\n if (integrations?.github?.enabled) {\n if (!integrations.github.token) {\n errors.push('GitHub integration enabled but no token provided');\n }\n }\n\n // Slack integration\n if (integrations?.slack?.enabled) {\n if (!integrations.slack.webhook) {\n errors.push('Slack integration enabled but no webhook URL provided');\n }\n }\n\n // JIRA integration\n if (integrations?.jira?.enabled) {\n if (!integrations.jira.url || !integrations.jira.token || !integrations.jira.project) {\n errors.push('JIRA integration enabled but missing required fields (url, token, project)');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Business logic validation\n */\n private validateBusinessLogic(config: TrieConfig): string[] {\n const errors: string[] = [];\n\n // Agent configuration validation\n if (config.agents?.enabled && config.agents?.disabled) {\n const overlap = config.agents.enabled.filter(agent =>\n config.agents?.disabled?.includes(agent)\n );\n if (overlap.length > 0) {\n errors.push(`Agents cannot be both enabled and disabled: ${overlap.join(', ')}`);\n }\n }\n\n // Concurrency validation\n if (config.agents?.maxConcurrency && config.agents.maxConcurrency > 10) {\n errors.push('maxConcurrency should not exceed 10 for optimal performance');\n }\n\n // Compliance standards validation\n if (config.compliance?.standards) {\n const invalidStandards = config.compliance.standards.filter(standard =>\n !['SOC2', 'GDPR', 'HIPAA', 'CCPA', 'PCI-DSS'].includes(standard)\n );\n if (invalidStandards.length > 0) {\n errors.push(`Invalid compliance standards: ${invalidStandards.join(', ')}`);\n }\n }\n\n // Path validation\n if (config.paths) {\n const pathValidation = this.validatePaths(config.paths);\n errors.push(...pathValidation.errors);\n }\n\n // Integration validation\n if (config.integrations) {\n const integrationValidation = this.validateIntegrations(config.integrations);\n errors.push(...integrationValidation.errors);\n }\n\n return errors;\n }\n\n /**\n * Generate configuration template\n */\n generateTemplate(): TrieConfig {\n return {\n version: '1.0.0',\n agents: {\n enabled: ['security', 'bugs', 'types'],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json'\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git'],\n configDir: '.trie',\n outputDir: 'trie-reports'\n }\n };\n }\n\n /**\n * Validate and provide suggestions for improvement\n */\n analyze(config: TrieConfig): {\n score: number;\n suggestions: string[];\n securityIssues: string[];\n optimizations: string[];\n } {\n const suggestions: string[] = [];\n const securityIssues: string[] = [];\n const optimizations: string[] = [];\n let score = 100;\n\n // Check for AI enhancement (check config, env var, and .env files)\n let hasApiKey = Boolean(config.apiKeys?.anthropic || process.env.ANTHROPIC_API_KEY);\n if (!hasApiKey) {\n // Check .env files as well\n try {\n const workDir = getWorkingDirectory(undefined, true);\n const envFiles = ['.env', '.env.local', '.env.production'];\n for (const envFile of envFiles) {\n const envPath = join(workDir, envFile);\n if (existsSync(envPath)) {\n const envContent = readFileSync(envPath, 'utf-8');\n if (envContent.includes('ANTHROPIC_API_KEY=')) {\n hasApiKey = true;\n break;\n }\n }\n }\n } catch {\n // .env check failed, continue\n }\n }\n \n if (!hasApiKey) {\n suggestions.push('Add ANTHROPIC_API_KEY to enable AI-powered analysis for better issue detection. Set in environment, .trie/config.json, or .env file');\n score -= 10;\n }\n\n // Check parallel execution\n if (config.agents?.parallel === false) {\n optimizations.push('Enable parallel agent execution for 3-5x faster scans');\n score -= 15;\n }\n\n // Check caching\n if (config.agents?.cache === false) {\n optimizations.push('Enable result caching to speed up repeated scans');\n score -= 10;\n }\n\n // Check compliance standards\n if (!config.compliance?.standards || config.compliance.standards.length === 0) {\n suggestions.push('Configure compliance standards (SOC2, GDPR, etc.) for regulatory requirements');\n score -= 5;\n }\n\n // Check integrations for team collaboration\n const hasIntegrations = config.integrations && (\n config.integrations.github?.enabled ||\n config.integrations.slack?.enabled ||\n config.integrations.jira?.enabled\n );\n if (!hasIntegrations) {\n suggestions.push('Consider enabling GitHub/Slack/JIRA integrations for better team collaboration');\n score -= 5;\n }\n\n // Security checks\n if (config.apiKeys) {\n securityIssues.push('API keys in config file - consider using environment variables instead');\n score -= 20;\n }\n\n return {\n score: Math.max(0, score),\n suggestions,\n securityIssues,\n optimizations\n };\n }\n}\n\n/**\n * Default configuration with security best practices\n */\nexport const DEFAULT_CONFIG: TrieConfig = {\n version: '1.0.0',\n agents: {\n enabled: [],\n disabled: [],\n parallel: true,\n maxConcurrency: 4,\n timeout: 120000,\n cache: true,\n },\n compliance: {\n standards: ['SOC2'],\n enforceCompliance: false,\n reportFormat: 'json',\n },\n output: {\n format: 'console',\n level: 'all',\n interactive: false,\n streaming: true,\n colors: true,\n },\n paths: {\n include: [],\n exclude: ['node_modules', 'dist', 'build', '.git', '.next', '.nuxt', 'coverage'],\n configDir: '.trie',\n outputDir: 'trie-reports',\n },\n};\n\n/**\n * Validate startup configuration\n */\nexport function validateStartupConfig(): {\n valid: boolean;\n config: TrieConfig;\n warnings: string[];\n errors: string[];\n} {\n const validator = new ConfigValidator();\n\n // Validate environment\n const envValidation = validator.validateEnvironment();\n\n // Use default config as base\n const configResult = validator.validateConfig(DEFAULT_CONFIG);\n\n if (!configResult.success) {\n return {\n valid: false,\n config: DEFAULT_CONFIG,\n warnings: envValidation.warnings,\n errors: [...envValidation.errors, ...configResult.errors]\n };\n }\n\n return {\n valid: envValidation.valid,\n config: configResult.data,\n warnings: envValidation.warnings,\n errors: envValidation.errors\n };\n}","import type { CodeContext, RiskLevel, Agent, TriagingConfig } from '../types/index.js';\nimport { getSkillRegistry } from '../skills/built-in/registry.js';\nimport { CustomSkill } from '../skills/built-in/custom-skill.js';\nimport { loadContextState, type ContextState } from '../utils/context-state.js';\nimport { getMemoryStats, getRecentIssues } from '../memory/issue-store.js';\nimport { getHistoricalInsights } from '../memory/compactor.js';\nimport { getGlobalMemoryStats } from '../memory/global-memory.js';\nimport { isInteractiveMode } from '../utils/progress.js';\n\ninterface AgentScore {\n agent: Agent;\n confidence: number;\n reasons: string[];\n tier: number;\n isCustom: boolean;\n}\n\ninterface MemoryInsights {\n issuesByAgent: Record<string, number>;\n recentAgents: Set<string>;\n recurringPatternAgents: Set<string>;\n trend: 'improving' | 'stable' | 'declining' | 'unknown';\n crossProjectAgents: Set<string>;\n}\n\nexport class Triager {\n private agentRegistry = getSkillRegistry();\n private config: TriagingConfig;\n private customSkillsLoaded = false;\n private contextState: ContextState | null = null;\n private memoryInsights: MemoryInsights | null = null;\n\n constructor(config?: Partial<TriagingConfig>) {\n this.config = {\n minConfidence: 0.15,\n maxAgents: 11,\n timeoutMs: 60000,\n enableCostAware: false,\n enableDependencies: true,\n ...config\n };\n }\n\n /**\n * Load previous context state for smart triaging\n */\n private async loadPreviousContext(): Promise<void> {\n if (this.contextState === null) {\n try {\n this.contextState = await loadContextState();\n } catch {\n this.contextState = null;\n }\n }\n }\n\n /**\n * Load memory insights for memory-influenced triaging\n */\n private async loadMemoryInsights(): Promise<void> {\n if (this.memoryInsights !== null) return;\n\n try {\n const [stats, recent, historical, global] = await Promise.all([\n getMemoryStats().catch(() => null),\n getRecentIssues({ limit: 20 }).catch(() => []),\n getHistoricalInsights(process.cwd()).catch(() => null),\n getGlobalMemoryStats().catch(() => null),\n ]);\n\n const recentAgents = new Set<string>();\n for (const issue of recent) {\n recentAgents.add(issue.agent);\n }\n\n const recurringPatternAgents = new Set<string>();\n if (historical?.recurringPatterns) {\n for (const pattern of historical.recurringPatterns) {\n recurringPatternAgents.add(pattern.agent);\n }\n }\n\n const crossProjectAgents = new Set<string>();\n if (global?.patternsByAgent) {\n for (const [agent, count] of Object.entries(global.patternsByAgent)) {\n if (count >= 2) {\n crossProjectAgents.add(agent);\n }\n }\n }\n\n this.memoryInsights = {\n issuesByAgent: stats?.issuesByAgent || {},\n recentAgents,\n recurringPatternAgents,\n trend: historical?.improvementTrend || 'unknown',\n crossProjectAgents,\n };\n } catch {\n this.memoryInsights = {\n issuesByAgent: {},\n recentAgents: new Set(),\n recurringPatternAgents: new Set(),\n trend: 'unknown',\n crossProjectAgents: new Set(),\n };\n }\n }\n\n /**\n * Ensure custom skills are loaded before triaging\n */\n private async ensureCustomSkillsLoaded(): Promise<void> {\n if (!this.customSkillsLoaded) {\n await this.agentRegistry.loadCustomSkills();\n this.customSkillsLoaded = true;\n }\n }\n\n async selectAgents(context: CodeContext, riskLevel: RiskLevel): Promise<Agent[]> {\n // Load custom skills if not already loaded\n await this.ensureCustomSkillsLoaded();\n \n // Load previous context state and memory insights for smart triaging\n await Promise.all([\n this.loadPreviousContext(),\n this.loadMemoryInsights(),\n ]);\n \n // Escalate risk based on previous health score\n let effectiveRiskLevel = riskLevel;\n if (this.contextState?.healthScore !== undefined && this.contextState.healthScore < 50) {\n // Low health score = escalate to high risk\n if (riskLevel === 'low' || riskLevel === 'medium') {\n effectiveRiskLevel = 'high';\n if (!isInteractiveMode()) {\n console.error(` Health score ${this.contextState.healthScore}% - escalating to ${effectiveRiskLevel.toUpperCase()} risk`);\n }\n }\n }\n \n // HIGH or CRITICAL RISK = ALL SCOUTS (except those that explicitly decline)\n if (effectiveRiskLevel === 'critical' || effectiveRiskLevel === 'high') {\n if (!isInteractiveMode()) {\n console.error(` ${effectiveRiskLevel.toUpperCase()} risk - activating all scouts for comprehensive review`);\n }\n // Filter out agents that explicitly return false from shouldActivate\n // (e.g., agent-smith, super-reviewer which are manually invoked only)\n return this.getAllAgents().filter(agent => agent.shouldActivate(context));\n }\n\n // Score all agents based on context (with history boost)\n const scores = this.scoreAgents(context, effectiveRiskLevel);\n \n // Boost agents based on context state (last scan) and memory (patterns over time)\n this.boostAgentsWithHistory(scores);\n this.boostAgentsWithMemory(scores);\n \n // Log scoring for transparency\n this.logAgentScoring(scores);\n\n // Filter by confidence threshold\n const qualified = scores.filter(s => s.confidence >= this.config.minConfidence);\n\n // Sort by tier (priority) then confidence\n qualified.sort((a, b) => {\n if (a.tier !== b.tier) return a.tier - b.tier;\n return b.confidence - a.confidence;\n });\n\n // Resolve dependencies if enabled\n if (this.config.enableDependencies) {\n return this.resolveDependencies(qualified.map(s => s.agent));\n }\n\n return qualified.map(s => s.agent);\n }\n\n /**\n * Boost confidence for agents that found issues in previous scans\n */\n private boostAgentsWithHistory(scores: AgentScore[]): void {\n if (!this.contextState?.agentStatus) return;\n \n for (const score of scores) {\n const previousRun = this.contextState.agentStatus[score.agent.name];\n if (previousRun?.issuesFound && previousRun.issuesFound > 0) {\n // Boost confidence for agents that found issues before\n const boost = Math.min(0.3, previousRun.issuesFound * 0.05);\n score.confidence = Math.min(1.0, score.confidence + boost);\n score.reasons.push(`found ${previousRun.issuesFound} issues in last scan`);\n }\n }\n }\n\n /**\n * Boost confidence for agents based on memory patterns\n */\n private boostAgentsWithMemory(scores: AgentScore[]): void {\n if (!this.memoryInsights) return;\n\n for (const score of scores) {\n const agentName = score.agent.name;\n \n // Boost if agent has found many issues historically\n const historicalCount = this.memoryInsights.issuesByAgent[agentName] || 0;\n if (historicalCount >= 10) {\n const boost = Math.min(0.2, historicalCount * 0.01);\n score.confidence = Math.min(1.0, score.confidence + boost);\n score.reasons.push(`${historicalCount} historical issues`);\n }\n\n // Boost if agent found issues recently\n if (this.memoryInsights.recentAgents.has(agentName)) {\n score.confidence = Math.min(1.0, score.confidence + 0.1);\n score.reasons.push('recent activity');\n }\n\n // Boost if agent has recurring patterns (persistent problems)\n if (this.memoryInsights.recurringPatternAgents.has(agentName)) {\n score.confidence = Math.min(1.0, score.confidence + 0.15);\n score.reasons.push('recurring patterns');\n }\n\n // Boost if this agent type has cross-project patterns\n if (this.memoryInsights.crossProjectAgents.has(agentName)) {\n score.confidence = Math.min(1.0, score.confidence + 0.1);\n score.reasons.push('cross-project pattern');\n }\n }\n\n // If codebase is declining, boost all agents slightly\n if (this.memoryInsights.trend === 'declining') {\n for (const score of scores) {\n if (score.confidence > 0) {\n score.confidence = Math.min(1.0, score.confidence + 0.05);\n }\n }\n }\n }\n\n private scoreAgents(context: CodeContext, riskLevel: RiskLevel): AgentScore[] {\n const allAgents = this.getAllAgents();\n const scores: AgentScore[] = [];\n\n for (const agent of allAgents) {\n const score = this.scoreAgent(agent, context, riskLevel);\n scores.push(score);\n }\n\n return scores;\n }\n\n private scoreAgent(agent: Agent, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n // Check if this is a custom skill\n if (agent instanceof CustomSkill) {\n return this.scoreCustomSkill(agent, context, riskLevel);\n }\n \n // Built-in agent scoring\n return this.scoreBuiltinAgent(agent, context, riskLevel);\n }\n\n /**\n * Score custom skills using their activation rules\n */\n private scoreCustomSkill(agent: CustomSkill, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n const reasons: string[] = [];\n \n // Use the agent's built-in activation confidence\n let confidence = agent.getActivationConfidence(context);\n \n if (confidence > 0) {\n reasons.push(`custom skill: ${agent.getMetadata().category}`);\n \n // Add metadata info\n const meta = agent.getMetadata();\n if (meta.patternCount > 0) {\n reasons.push(`${meta.patternCount} detection patterns`);\n }\n }\n \n // Risk escalation for custom skills too\n if (riskLevel === 'high' && confidence > 0) {\n confidence = Math.min(1.0, confidence * 1.2);\n }\n \n return {\n agent,\n confidence,\n reasons,\n tier: agent.priority.tier,\n isCustom: true,\n };\n }\n\n /**\n * Score built-in agents\n */\n private scoreBuiltinAgent(agent: Agent, context: CodeContext, riskLevel: RiskLevel): AgentScore {\n const reasons: string[] = [];\n let confidence = 0;\n let tier = 3; // default to lowest tier\n\n // TIER 1: ALWAYS RUN AGENTS\n if (agent.name === 'typecheck') {\n tier = 1;\n confidence = 1.0;\n reasons.push('fundamental type safety');\n }\n\n if (agent.name === 'comprehension') {\n tier = 1;\n confidence = 1.0;\n reasons.push('stakeholder communication');\n }\n\n // TIER 2: CONTEXT-DEPENDENT AGENTS\n if (agent.name === 'security') {\n tier = 2;\n if (context.touchesAuth) { confidence += 0.4; reasons.push('auth code'); }\n if (context.touchesPayments) { confidence += 0.4; reasons.push('payment code'); }\n if (context.touchesAPI) { confidence += 0.3; reasons.push('API endpoints'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('database access'); }\n if (context.touchesCrypto) { confidence += 0.35; reasons.push('cryptographic operations'); }\n if (context.touchesUserData) { confidence += 0.3; reasons.push('user data'); }\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesThirdPartyAPI) { confidence += 0.2; reasons.push('third-party integration'); }\n if (context.patterns?.hasFileUploads) { confidence += 0.3; reasons.push('file uploads'); }\n \n // Risk escalation\n if (riskLevel === 'high') confidence *= 1.2;\n }\n\n if (agent.name === 'privacy') {\n tier = 2;\n if (context.touchesUserData) { confidence += 0.5; reasons.push('PII handling'); }\n if (context.touchesAuth) { confidence += 0.3; reasons.push('credentials'); }\n if (context.touchesLogging) { confidence += 0.25; reasons.push('logging (may expose data)'); }\n if (context.patterns?.hasEmailHandling) { confidence += 0.3; reasons.push('email handling'); }\n if (context.patterns?.hasFormHandling) { confidence += 0.2; reasons.push('form data'); }\n }\n\n if (agent.name === 'legal') {\n tier = 2;\n if (context.touchesUserData) { confidence += 0.4; reasons.push('GDPR/CCPA'); }\n if (context.touchesPayments) { confidence += 0.35; reasons.push('PCI-DSS'); }\n if (context.patterns?.hasEmailHandling) { confidence += 0.25; reasons.push('CAN-SPAM'); }\n }\n\n if (agent.name === 'accessibility') {\n tier = 2;\n if (context.touchesUI) { confidence += 0.6; reasons.push('UI components'); }\n if (context.framework === 'react' || context.framework === 'vue') { \n confidence += 0.2; \n reasons.push(`${context.framework} framework`); \n }\n if (context.patterns?.hasFormHandling) { confidence += 0.2; reasons.push('form UX'); }\n }\n\n if (agent.name === 'test') {\n tier = 2;\n if (context.isNewFeature) { confidence += 0.4; reasons.push('new feature'); }\n if (context.touchesAuth) { confidence += 0.35; reasons.push('auth needs tests'); }\n if (context.touchesPayments) { confidence += 0.4; reasons.push('payments need tests'); }\n if (context.touchesAPI) { confidence += 0.3; reasons.push('API testing'); }\n if (!context.hasTests) { confidence += 0.2; reasons.push('no existing tests'); }\n if (context.complexity === 'high') { confidence += 0.25; reasons.push('complex code'); }\n }\n\n if (agent.name === 'software-architect') {\n tier = 2;\n if (context.isNewFeature) { confidence += 0.35; reasons.push('architecture review'); }\n if (context.touchesDatabase) { confidence += 0.35; reasons.push('data modeling'); }\n if (context.linesChanged > 200) { confidence += 0.3; reasons.push('large change'); }\n if (context.touchesAPI) { confidence += 0.25; reasons.push('API design'); }\n if (context.patterns?.hasWebSockets) { confidence += 0.3; reasons.push('real-time architecture'); }\n if (context.patterns?.hasQueue) { confidence += 0.3; reasons.push('async architecture'); }\n }\n\n if (agent.name === 'devops') {\n tier = 2;\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesFileSystem) { confidence += 0.3; reasons.push('file operations'); }\n if (context.touchesLogging) { confidence += 0.25; reasons.push('logging'); }\n if (context.touchesErrorHandling) { confidence += 0.2; reasons.push('error handling'); }\n if (context.patterns?.hasCaching) { confidence += 0.25; reasons.push('caching'); }\n if (context.patterns?.hasRateLimiting) { confidence += 0.3; reasons.push('rate limiting'); }\n }\n\n if (agent.name === 'bug-finding') {\n tier = 2;\n if (context.touchesPayments) { confidence += 0.5; reasons.push('payments = zero bugs'); }\n if (context.isNewFeature) { confidence += 0.3; reasons.push('new code'); }\n if (context.patterns?.hasAsyncCode) { confidence += 0.35; reasons.push('async patterns'); }\n if (context.complexity === 'high') { confidence += 0.3; reasons.push('complex logic'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('data mutations'); }\n }\n\n if (agent.name === 'user-testing') {\n tier = 3; // lower priority - only when clearly needed\n if (context.touchesUI) { confidence += 0.5; reasons.push('UI changes'); }\n if (context.isNewFeature && context.touchesUI) { confidence += 0.3; reasons.push('new UI feature'); }\n if (context.patterns?.hasFormHandling) { confidence += 0.25; reasons.push('form UX'); }\n }\n \n if (agent.name === 'trie_clean') {\n tier = 2;\n if (context.touchesUI) { confidence += 0.4; reasons.push('UI code'); }\n if (context.isNewFeature) { confidence += 0.3; reasons.push('new feature'); }\n if (context.framework === 'react') { confidence += 0.2; reasons.push('React code'); }\n }\n\n if (agent.name === 'soc2') {\n tier = 2;\n if (context.touchesAuth) { confidence += 0.4; reasons.push('authentication'); }\n if (context.touchesSecurityConfig) { confidence += 0.4; reasons.push('security config'); }\n if (context.touchesLogging) { confidence += 0.3; reasons.push('logging'); }\n if (context.touchesAPI) { confidence += 0.25; reasons.push('API endpoints'); }\n if (context.touchesDatabase) { confidence += 0.2; reasons.push('data access'); }\n }\n\n if (agent.name === 'moneybags') {\n tier = 3; // Runs after primary agents\n if (context.touchesPayments) { confidence += 0.6; reasons.push('payment code = high cost risk'); }\n if (context.touchesAuth) { confidence += 0.4; reasons.push('auth bugs are expensive'); }\n if (context.touchesHealthData) { confidence += 0.5; reasons.push('HIPAA violations'); }\n if (context.touchesUserData) { confidence += 0.3; reasons.push('PII exposure costs'); }\n if (context.touchesDatabase) { confidence += 0.25; reasons.push('data loss risk'); }\n if (context.isNewFeature) { confidence += 0.2; reasons.push('new code risk'); }\n \n // Only activate if there's significant risk\n if (riskLevel === 'high' || riskLevel === 'critical') {\n confidence *= 1.3;\n reasons.push('high-stakes context');\n }\n }\n\n if (agent.name === 'production-ready') {\n tier = 3; // Final gate before shipping\n if (context.touchesAPI) { confidence += 0.4; reasons.push('API deployment'); }\n if (context.touchesDatabase) { confidence += 0.35; reasons.push('database operations'); }\n if (context.touchesAuth) { confidence += 0.35; reasons.push('auth system'); }\n if (context.touchesPayments) { confidence += 0.5; reasons.push('payment processing'); }\n if (context.linesChanged > 200) { confidence += 0.3; reasons.push('significant changes'); }\n \n // Always run on high/critical risk\n if (riskLevel === 'high' || riskLevel === 'critical') {\n confidence += 0.4;\n reasons.push('production gate check');\n }\n }\n\n // Cap confidence at 1.0\n confidence = Math.min(1.0, confidence);\n\n return { agent, confidence, reasons, tier, isCustom: false };\n }\n\n private logAgentScoring(scores: AgentScore[]): void {\n if (isInteractiveMode()) return;\n \n console.error('\\n Agent Confidence Scores:');\n \n const sorted = [...scores].sort((a, b) => b.confidence - a.confidence);\n \n for (const score of sorted) {\n const bar = this.getConfidenceBar(score.confidence);\n const status = score.confidence >= this.config.minConfidence ? '✓' : '✗';\n const tierLabel = score.tier === 1 ? '[T1]' : score.tier === 2 ? '[T2]' : '[T3]';\n const customLabel = score.isCustom ? ' 📚' : '';\n \n console.error(` ${status} ${score.agent.name.padEnd(18)} ${tierLabel} ${bar} ${(score.confidence * 100).toFixed(0)}%${customLabel}`);\n \n if (score.reasons.length > 0 && score.confidence > 0) {\n console.error(` └─ ${score.reasons.join(', ')}`);\n }\n }\n console.error('');\n }\n\n private getConfidenceBar(confidence: number): string {\n const filled = Math.round(confidence * 10);\n const empty = 10 - filled;\n return '█'.repeat(filled) + '░'.repeat(empty);\n }\n\n private resolveDependencies(agents: Agent[]): Agent[] {\n const agentNames = new Set(agents.map(a => a.name));\n const resolved: Agent[] = [];\n const added = new Set<string>();\n\n // Define dependencies\n const dependencies: Record<string, string[]> = {\n 'legal': ['privacy'], // legal should see privacy issues first\n 'test': ['bug-finding'], // find bugs before writing tests\n 'user-testing': ['accessibility'], // accessibility before UX\n };\n\n // Add dependencies first\n for (const agent of agents) {\n const deps = dependencies[agent.name] || [];\n for (const depName of deps) {\n if (!added.has(depName)) {\n const depAgent = this.agentRegistry.getAgent(depName);\n if (depAgent && agentNames.has(depName)) {\n resolved.push(depAgent);\n added.add(depName);\n }\n }\n }\n \n if (!added.has(agent.name)) {\n resolved.push(agent);\n added.add(agent.name);\n }\n }\n\n return resolved;\n }\n\n getTriagingReason(context: CodeContext, riskLevel: RiskLevel): string {\n if (riskLevel === 'critical') {\n return 'Critical risk detected - activating all scouts for comprehensive review';\n }\n\n const reasons: string[] = [];\n\n if (context.touchesAuth) reasons.push('authentication');\n if (context.touchesPayments) reasons.push('payments');\n if (context.touchesDatabase) reasons.push('database');\n if (context.touchesUserData) reasons.push('user data');\n if (context.touchesUI) reasons.push('UI');\n if (context.touchesAPI) reasons.push('API');\n if (context.isNewFeature) reasons.push('new feature');\n if (context.touchesCrypto) reasons.push('cryptography');\n if (context.touchesThirdPartyAPI) reasons.push('3rd party API');\n\n if (reasons.length === 0) {\n return `${riskLevel} risk - general code changes`;\n }\n\n return `${riskLevel} risk: ${reasons.join(', ')}`;\n }\n\n async getSkippedAgents(context: CodeContext, riskLevel: RiskLevel): Promise<string[]> {\n await this.ensureCustomSkillsLoaded();\n \n if (riskLevel === 'critical') return [];\n\n const scores = this.scoreAgents(context, riskLevel);\n return scores\n .filter(s => s.confidence < this.config.minConfidence)\n .map(s => s.agent.name);\n }\n\n async getTriagingConfidence(context: CodeContext, riskLevel: RiskLevel): Promise<number> {\n await this.ensureCustomSkillsLoaded();\n \n // How confident are we in our triaging decision?\n const scores = this.scoreAgents(context, riskLevel);\n const qualified = scores.filter(s => s.confidence >= this.config.minConfidence);\n \n if (qualified.length === 0) return 0.5; // uncertain\n \n // Average confidence of selected agents\n const avgConfidence = qualified.reduce((sum, s) => sum + s.confidence, 0) / qualified.length;\n \n // Boost if we have strong context signals\n const contextStrength = this.getContextStrength(context);\n \n return Math.min(1.0, avgConfidence * 0.7 + contextStrength * 0.3);\n }\n\n private getContextStrength(context: CodeContext): number {\n let signals = 0;\n\n // Count how many context signals we detected\n const checks = [\n context.touchesAuth,\n context.touchesPayments,\n context.touchesDatabase,\n context.touchesAPI,\n context.touchesUI,\n context.touchesUserData,\n context.touchesHealthData,\n context.touchesSecurityConfig,\n context.touchesCrypto,\n context.touchesFileSystem,\n context.isNewFeature,\n ];\n\n for (const check of checks) {\n if (check) signals++;\n }\n\n // More signals = more confidence in triaging\n return signals > 0 ? Math.min(1.0, signals / 3) : 0.3;\n }\n\n private getAllAgents(): Agent[] {\n return this.agentRegistry.getAllAgents();\n }\n \n /**\n * Get custom skills count\n */\n getCustomSkillCount(): number {\n return this.agentRegistry.getCustomSkills().length;\n }\n\n // Backward compatibility alias\n getCustomAgentCount(): number {\n return this.getCustomSkillCount();\n }\n \n /**\n * Reload custom skills\n */\n async reloadCustomSkills(): Promise<void> {\n await this.agentRegistry.reloadCustomSkills();\n }\n\n // Backward compatibility alias\n async reloadCustomAgents(): Promise<void> {\n return this.reloadCustomSkills();\n }\n}\n","import { Worker } from 'worker_threads';\nimport { cpus } from 'os';\nimport { existsSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { StreamingManager } from './streaming.js';\nimport { CacheManager } from './cache-manager.js';\nimport { isInteractiveMode } from './progress.js';\n\ninterface ParallelTask {\n agent: Agent;\n files: string[];\n context: ScanContext;\n priority: number;\n timeoutMs: number;\n}\n\ninterface ParallelResult {\n agent: string;\n result: AgentResult;\n fromCache: boolean;\n executionTime: number;\n}\n\n/**\n * Parallel execution engine for Trie agents\n *\n * Features:\n * - True parallel execution using worker threads\n * - Intelligent scheduling based on agent priority\n * - Result caching and cache-aware scheduling\n * - Real-time progress streaming\n * - Dynamic resource management\n */\nexport class ParallelExecutor {\n private maxWorkers: number;\n private cache: CacheManager | null;\n private streaming?: StreamingManager;\n private activeWorkers: Set<Worker> = new Set();\n private cacheEnabled: boolean = true;\n private useWorkerThreads: boolean = false;\n private workerAvailable: boolean | null = null;\n private warnedWorkerFallback: boolean = false;\n\n constructor(\n cacheManager: CacheManager | null,\n maxWorkers: number = Math.max(2, Math.min(cpus().length - 1, 8)),\n options?: { cacheEnabled?: boolean; useWorkerThreads?: boolean }\n ) {\n this.maxWorkers = maxWorkers;\n this.cache = cacheManager;\n this.cacheEnabled = options?.cacheEnabled ?? true;\n this.useWorkerThreads = options?.useWorkerThreads ?? false;\n }\n\n /**\n * Set streaming manager for real-time updates\n */\n setStreaming(streaming: StreamingManager): void {\n this.streaming = streaming;\n }\n\n /**\n * Execute agents in parallel with intelligent scheduling\n */\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext\n ): Promise<Map<string, AgentResult>> {\n if (agents.length === 0) {\n return new Map();\n }\n\n // Initialize streaming\n if (this.streaming && this.streaming.getProgress().totalFiles === 0) {\n this.streaming.startScan(files.length);\n }\n\n // Check cache for existing results\n const cacheResults = new Map<string, AgentResult>();\n const uncachedTasks: ParallelTask[] = [];\n\n for (const agent of agents) {\n const cached = await this.checkAgentCache(agent, files);\n if (cached) {\n cacheResults.set(agent.name, cached);\n this.streaming?.completeAgent(agent.name, cached.issues);\n } else {\n uncachedTasks.push({\n agent,\n files,\n context,\n priority: agent.priority?.tier || 2,\n timeoutMs: context?.config?.timeoutMs || 120000\n });\n }\n }\n\n // Sort tasks by priority (tier 1 = highest priority)\n uncachedTasks.sort((a, b) => a.priority - b.priority);\n\n // Execute uncached tasks in parallel\n const parallelResults = await this.executeTasksParallel(uncachedTasks);\n\n // Cache new results\n await this.cacheResults(parallelResults);\n\n // Combine cached and new results\n const allResults = new Map<string, AgentResult>();\n\n // Add cached results\n for (const [agent, result] of cacheResults) {\n allResults.set(agent, result);\n }\n\n // Add new results\n for (const result of parallelResults) {\n allResults.set(result.agent, result.result);\n }\n\n // Complete streaming\n const allIssues = Array.from(allResults.values()).flatMap(r => r.issues);\n this.streaming?.completeScan(allIssues);\n\n return allResults;\n }\n\n /**\n * Check if agent has cached results for given files\n */\n private async checkAgentCache(agent: Agent, files: string[]): Promise<AgentResult | null> {\n if (!this.cacheEnabled || !this.cache) {\n return null;\n }\n\n const cachedIssues = await this.cache.getCachedBatch(files, agent.name);\n\n // Only use cache if we have results for ALL files\n if (cachedIssues.size === files.length) {\n const allIssues = Array.from(cachedIssues.values()).flat();\n return {\n agent: agent.name,\n issues: allIssues,\n executionTime: 0, // Cached\n success: true,\n metadata: {\n filesAnalyzed: files.length,\n linesAnalyzed: 0\n }\n };\n }\n\n return null;\n }\n\n /**\n * Execute tasks in parallel batches\n */\n private async executeTasksParallel(tasks: ParallelTask[]): Promise<ParallelResult[]> {\n if (tasks.length === 0) {\n return [];\n }\n\n const results: ParallelResult[] = [];\n const batches = this.createBatches(tasks, this.maxWorkers);\n\n for (const batch of batches) {\n const batchResults = await Promise.all(\n batch.map(task => this.executeTask(task))\n );\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Create batches for parallel execution\n */\n private createBatches(tasks: ParallelTask[], batchSize: number): ParallelTask[][] {\n const batches: ParallelTask[][] = [];\n\n for (let i = 0; i < tasks.length; i += batchSize) {\n batches.push(tasks.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(task: ParallelTask): Promise<ParallelResult> {\n const startTime = Date.now();\n\n this.streaming?.startAgent(task.agent.name);\n\n try {\n const result = this.canUseWorkers()\n ? await this.executeTaskInWorker(task)\n : await task.agent.scan(task.files, task.context);\n const executionTime = Date.now() - startTime;\n\n this.streaming?.completeAgent(task.agent.name, result.issues);\n\n return {\n agent: task.agent.name,\n result,\n fromCache: false,\n executionTime\n };\n } catch (error) {\n const executionTime = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n this.streaming?.reportError(new Error(errorMessage), `Agent: ${task.agent.name}`);\n\n return {\n agent: task.agent.name,\n result: {\n agent: task.agent.name,\n issues: [],\n executionTime,\n success: false,\n error: errorMessage\n },\n fromCache: false,\n executionTime\n };\n }\n }\n\n private canUseWorkers(): boolean {\n if (!this.useWorkerThreads) {\n return false;\n }\n if (this.workerAvailable !== null) {\n return this.workerAvailable;\n }\n const workerUrl = this.getWorkerUrl();\n this.workerAvailable = existsSync(fileURLToPath(workerUrl));\n if (!this.workerAvailable && !this.warnedWorkerFallback && !isInteractiveMode()) {\n console.error('Worker threads unavailable; falling back to in-process agents.');\n this.warnedWorkerFallback = true;\n }\n return this.workerAvailable;\n }\n\n private getWorkerUrl(): URL {\n const distDir = new URL('.', import.meta.url);\n return new URL('workers/agent-worker.js', distDir);\n }\n\n private async executeTaskInWorker(task: ParallelTask): Promise<AgentResult> {\n // Use dirname to get the dist folder, then resolve to workers subfolder\n // This works whether the code is bundled into chunks or in utils/ folder\n const workerUrl = this.getWorkerUrl();\n\n return new Promise((resolve, reject) => {\n const worker = new Worker(workerUrl, {\n workerData: {\n agentName: task.agent.name,\n files: task.files,\n context: task.context\n }\n } as ConstructorParameters<typeof Worker>[1]);\n\n this.activeWorkers.add(worker);\n\n const timeout = setTimeout(() => {\n worker.terminate().catch(() => undefined);\n reject(new Error(`Agent ${task.agent.name} timed out after ${task.timeoutMs}ms`));\n }, task.timeoutMs);\n\n worker.on('message', (message) => {\n if (message?.type === 'result') {\n clearTimeout(timeout);\n resolve(message.result as AgentResult);\n } else if (message?.type === 'error') {\n clearTimeout(timeout);\n reject(new Error(message.error));\n }\n });\n\n worker.on('error', (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n worker.on('exit', (code) => {\n this.activeWorkers.delete(worker);\n if (code !== 0) {\n clearTimeout(timeout);\n reject(new Error(`Worker stopped with exit code ${code}`));\n }\n });\n });\n }\n\n /**\n * Cache results for future use\n */\n private async cacheResults(results: ParallelResult[]): Promise<void> {\n if (!this.cacheEnabled || !this.cache) {\n return;\n }\n\n const cachePromises = results\n .filter(r => r.result.success && !r.fromCache)\n .map(r => {\n const issuesByFile = this.groupIssuesByFile(r.result.issues);\n const perFilePromises = Object.entries(issuesByFile).map(([file, issues]) =>\n this.cache!.setCached(file, r.agent, issues, r.executionTime)\n );\n return Promise.all(perFilePromises);\n });\n\n await Promise.allSettled(cachePromises);\n }\n\n /**\n * Cleanup resources\n */\n async cleanup(): Promise<void> {\n // Terminate any active workers\n const terminationPromises = Array.from(this.activeWorkers).map(worker =>\n worker.terminate()\n );\n\n await Promise.allSettled(terminationPromises);\n this.activeWorkers.clear();\n }\n\n private groupIssuesByFile(issues: AgentResult['issues']): Record<string, AgentResult['issues']> {\n const grouped: Record<string, AgentResult['issues']> = {};\n\n for (const issue of issues) {\n if (!grouped[issue.file]) {\n grouped[issue.file] = [];\n }\n grouped[issue.file]!.push(issue);\n }\n\n return grouped;\n }\n}\n\n/**\n * Smart agent prioritization based on dependencies and execution characteristics\n */\nexport function prioritizeAgents(agents: Agent[]): Agent[] {\n const prioritized = [...agents];\n\n // Sort by priority tier, then by estimated execution time\n prioritized.sort((a, b) => {\n const aTier = a.priority?.tier || 2;\n const bTier = b.priority?.tier || 2;\n\n if (aTier !== bTier) {\n return aTier - bTier; // Lower tier = higher priority\n }\n\n // Within same tier, prioritize faster agents\n const aTime = a.priority?.estimatedTimeMs || 1000;\n const bTime = b.priority?.estimatedTimeMs || 1000;\n\n return aTime - bTime;\n });\n\n return prioritized;\n}\n\n/**\n * Calculate optimal concurrency based on system resources and agent characteristics\n */\nexport function calculateOptimalConcurrency(): number {\n const numCPUs = cpus().length;\n const availableMemoryGB = process.memoryUsage().rss / 1024 / 1024 / 1024;\n\n // Conservative concurrency for stability\n let optimal = Math.max(2, Math.min(numCPUs - 1, 8));\n\n // Reduce concurrency if low memory\n if (availableMemoryGB < 2) {\n optimal = Math.max(2, Math.floor(optimal / 2));\n }\n\n // Increase slightly for systems with lots of CPU cores\n if (numCPUs > 8) {\n optimal = Math.min(optimal + 2, 12);\n }\n\n return optimal;\n}","import { readFile, writeFile, mkdir, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport type { Issue } from '../types/index.js';\nimport { isInteractiveMode } from './progress.js';\nimport { getTrieDirectory } from './workspace.js';\n\ninterface CacheEntry {\n version: string;\n timestamp: number;\n fileHash: string;\n fileSize: number;\n agent: string;\n issues: Issue[];\n executionTime: number;\n}\n\ninterface CacheIndex {\n version: string;\n created: number;\n entries: Record<string, CacheEntry>;\n}\n\nexport class CacheManager {\n private cacheDir: string;\n private indexPath: string;\n private readonly VERSION = '1.0.0';\n private readonly MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours\n private readonly MAX_ENTRIES = 1000;\n\n constructor(baseDir: string) {\n this.cacheDir = join(getTrieDirectory(baseDir), 'cache');\n this.indexPath = join(this.cacheDir, 'index.json');\n }\n\n /**\n * Generate cache key for a file and agent combination\n */\n private generateCacheKey(filePath: string, agent: string, fileHash: string): string {\n const key = `${filePath}:${agent}:${fileHash}`;\n return createHash('sha256').update(key).digest('hex').slice(0, 16);\n }\n\n /**\n * Get file hash for cache validation\n */\n private async getFileHash(filePath: string): Promise<{ hash: string; size: number; mtime: number }> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const stats = await stat(filePath);\n const hash = createHash('sha256').update(content).digest('hex').slice(0, 16);\n return {\n hash,\n size: stats.size,\n mtime: stats.mtime.getTime()\n };\n } catch {\n return { hash: '', size: 0, mtime: 0 };\n }\n }\n\n /**\n * Load cache index\n */\n private async loadIndex(): Promise<CacheIndex> {\n try {\n const content = await readFile(this.indexPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n }\n }\n\n /**\n * Save cache index\n */\n private async saveIndex(index: CacheIndex): Promise<void> {\n try {\n await mkdir(this.cacheDir, { recursive: true });\n await writeFile(this.indexPath, JSON.stringify(index, null, 2));\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to save cache index:', error);\n }\n }\n }\n\n /**\n * Clean up expired entries\n */\n private cleanupExpired(index: CacheIndex): CacheIndex {\n const now = Date.now();\n const validEntries: Record<string, CacheEntry> = {};\n\n for (const [key, entry] of Object.entries(index.entries)) {\n if (now - entry.timestamp < this.MAX_AGE_MS) {\n validEntries[key] = entry;\n }\n }\n\n // If still too many, keep the most recent ones\n const entries = Object.entries(validEntries);\n if (entries.length > this.MAX_ENTRIES) {\n entries.sort((a, b) => b[1].timestamp - a[1].timestamp);\n const limited = entries.slice(0, this.MAX_ENTRIES);\n return {\n ...index,\n entries: Object.fromEntries(limited)\n };\n }\n\n return {\n ...index,\n entries: validEntries\n };\n }\n\n /**\n * Get cached result for a file and agent\n */\n async getCached(filePath: string, agent: string): Promise<Issue[] | null> {\n try {\n const { hash, size: _size, mtime: _mtime } = await this.getFileHash(filePath);\n if (!hash) return null;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n const entry = index.entries[cacheKey];\n\n if (!entry) return null;\n\n // Validate entry is still fresh\n const isValid = entry.fileHash === hash &&\n entry.version === this.VERSION &&\n (Date.now() - entry.timestamp) < this.MAX_AGE_MS;\n\n if (!isValid) {\n delete index.entries[cacheKey];\n await this.saveIndex(index);\n return null;\n }\n\n return entry.issues;\n } catch {\n return null;\n }\n }\n\n /**\n * Cache result for a file and agent\n */\n async setCached(\n filePath: string,\n agent: string,\n issues: Issue[],\n executionTime: number\n ): Promise<void> {\n try {\n const { hash, size } = await this.getFileHash(filePath);\n if (!hash) return;\n\n const index = await this.loadIndex();\n const cacheKey = this.generateCacheKey(filePath, agent, hash);\n\n index.entries[cacheKey] = {\n version: this.VERSION,\n timestamp: Date.now(),\n fileHash: hash,\n fileSize: size,\n agent,\n issues,\n executionTime\n };\n\n // Clean up old entries\n const cleanedIndex = this.cleanupExpired(index);\n await this.saveIndex(cleanedIndex);\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to cache result:', error);\n }\n }\n }\n\n /**\n * Check if multiple files have cached results\n */\n async getCachedBatch(files: string[], agent: string): Promise<Map<string, Issue[]>> {\n const results = new Map<string, Issue[]>();\n\n await Promise.all(\n files.map(async (file) => {\n const cached = await this.getCached(file, agent);\n if (cached) {\n results.set(file, cached);\n }\n })\n );\n\n return results;\n }\n\n /**\n * Get cache statistics\n */\n async getStats(): Promise<{\n totalEntries: number;\n totalSizeKB: number;\n oldestEntry: number | null;\n newestEntry: number | null;\n agents: string[];\n hitRate?: number;\n }> {\n try {\n const index = await this.loadIndex();\n const entries = Object.values(index.entries);\n\n const totalSizeKB = entries.reduce((acc, entry) => acc + entry.fileSize, 0) / 1024;\n const timestamps = entries.map(e => e.timestamp);\n const agents = [...new Set(entries.map(e => e.agent))];\n\n return {\n totalEntries: entries.length,\n totalSizeKB: Math.round(totalSizeKB),\n oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,\n newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,\n agents\n };\n } catch {\n return {\n totalEntries: 0,\n totalSizeKB: 0,\n oldestEntry: null,\n newestEntry: null,\n agents: []\n };\n }\n }\n\n /**\n * Clear all cache\n */\n async clear(): Promise<void> {\n try {\n const emptyIndex: CacheIndex = {\n version: this.VERSION,\n created: Date.now(),\n entries: {}\n };\n await this.saveIndex(emptyIndex);\n } catch (error) {\n if (!isInteractiveMode()) {\n console.warn('Failed to clear cache:', error);\n }\n }\n }\n}","import type { Agent, AgentResult, ScanContext } from '../types/index.js';\nimport { ParallelExecutor, calculateOptimalConcurrency } from '../utils/parallel-executor.js';\nimport { CacheManager } from '../utils/cache-manager.js';\nimport type { StreamingManager } from '../utils/streaming.js';\nimport { isInteractiveMode } from '../utils/progress.js';\n\nexport class Executor {\n async executeAgents(\n agents: Agent[],\n files: string[],\n context: ScanContext,\n options?: {\n streaming?: StreamingManager;\n parallel?: boolean;\n cacheEnabled?: boolean;\n maxConcurrency?: number;\n useWorkerThreads?: boolean;\n timeoutMs?: number;\n }\n ): Promise<AgentResult[]> {\n const parallel = options?.parallel ?? true;\n const cacheEnabled = options?.cacheEnabled ?? true;\n const maxConcurrency = options?.maxConcurrency ?? calculateOptimalConcurrency();\n const useWorkerThreads = options?.useWorkerThreads ?? false;\n\n if (!isInteractiveMode()) {\n console.error(`Executing ${agents.length} scouts ${parallel ? 'in parallel' : 'sequentially'}...`);\n }\n\n if (parallel) {\n const cacheManager = cacheEnabled ? new CacheManager(context.workingDir) : null;\n const executor = new ParallelExecutor(cacheManager, maxConcurrency, {\n cacheEnabled,\n useWorkerThreads\n });\n\n if (options?.streaming) {\n executor.setStreaming(options.streaming);\n }\n\n const results = await executor.executeAgents(agents, files, {\n ...context,\n config: { timeoutMs: options?.timeoutMs ?? 120000 }\n });\n\n return agents.map(agent => results.get(agent.name)!).filter(Boolean);\n }\n\n // Execute scouts in parallel with timeout\n const promises = agents.map(agent =>\n this.executeAgentWithTimeout(agent, files, context, options?.timeoutMs ?? 30000)\n );\n\n try {\n const results = await Promise.allSettled(promises);\n return results.map((result, index) => {\n if (result.status === 'fulfilled') {\n if (!isInteractiveMode()) {\n console.error(`${agents[index]!.name} completed in ${result.value.executionTime}ms`);\n }\n return result.value;\n } else {\n if (!isInteractiveMode()) {\n console.error(`${agents[index]!.name} failed:`, result.reason);\n }\n return {\n agent: agents[index]!.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: result.reason instanceof Error ? result.reason.message : String(result.reason)\n };\n }\n });\n } catch (error) {\n if (!isInteractiveMode()) {\n console.error('Executor error:', error);\n }\n return agents.map(agent => ({\n agent: agent.name,\n issues: [],\n executionTime: 0,\n success: false,\n error: 'Execution failed'\n }));\n }\n }\n\n private async executeAgentWithTimeout(\n agent: Agent,\n files: string[],\n context: ScanContext,\n timeoutMs: number = 30000 // 30 second timeout\n ): Promise<AgentResult> {\n return new Promise(async (resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Agent ${agent.name} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n try {\n const result = await agent.scan(files, context);\n clearTimeout(timeout);\n resolve(result);\n } catch (error) {\n clearTimeout(timeout);\n reject(error);\n }\n });\n }\n}","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { runExecFile } from '../utils/command-runner.js';\n\nexport interface Commit {\n hash: string;\n author: string;\n date: string;\n message: string;\n}\n\nexport interface Change {\n path: string;\n status: string;\n oldPath?: string;\n}\n\nasync function execGit(args: string[], cwd: string): Promise<string | null> {\n try {\n const { stdout } = await runExecFile(\n 'git',\n ['-C', cwd, ...args],\n { actor: 'internal:git', triggeredBy: 'manual', targetPath: cwd },\n { maxBuffer: 10 * 1024 * 1024, captureOutput: false }\n );\n return stdout.trim();\n } catch (error: any) {\n const stderr: string | undefined = error?.stderr?.toString();\n // Gracefully handle non-git directories and repos with no commits\n if (stderr?.includes('not a git repository') || stderr?.includes('does not have any commits')) {\n return null;\n }\n throw error;\n }\n}\n\nasync function ensureRepo(projectPath: string): Promise<boolean> {\n const result = await execGit(['rev-parse', '--is-inside-work-tree'], projectPath);\n return result === 'true';\n}\n\nfunction parseNameStatus(output: string): Change[] {\n return output\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parts = line.split('\\t');\n const status = parts[0] ?? '';\n const filePath = parts[1] ?? '';\n const oldPath = parts[2];\n const change: Change = { status, path: filePath };\n if (oldPath) change.oldPath = oldPath;\n return change;\n })\n .filter((entry) => entry.path.length > 0);\n}\n\nexport async function getRecentCommits(projectPath: string, limit: number): Promise<Commit[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const output = await execGit(\n ['log', `-n`, String(limit), '--pretty=format:%H%x09%an%x09%ad%x09%s', '--date=iso'],\n projectPath\n );\n\n if (!output) return [];\n\n return output.split('\\n').map((line) => {\n const [hash, author, date, message] = line.split('\\t');\n return { hash, author, date, message } as Commit;\n });\n}\n\nexport async function getLastCommit(projectPath: string): Promise<Commit | null> {\n const commits = await getRecentCommits(projectPath, 1);\n return commits[0] ?? null;\n}\n\nexport async function getStagedChanges(projectPath: string): Promise<Change[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const output = await execGit(['diff', '--cached', '--name-status'], projectPath);\n if (!output) return [];\n return parseNameStatus(output);\n}\n\nexport async function getUncommittedChanges(projectPath: string): Promise<Change[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n const changes: Change[] = [];\n\n const unstaged = await execGit(['diff', '--name-status'], projectPath);\n if (unstaged) {\n changes.push(...parseNameStatus(unstaged));\n }\n\n const untracked = await execGit(['ls-files', '--others', '--exclude-standard'], projectPath);\n if (untracked) {\n changes.push(\n ...untracked\n .split('\\n')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => ({ status: '??', path: p }))\n );\n }\n\n return changes;\n}\n\nexport async function getDiff(projectPath: string, commitHash: string): Promise<string> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return '';\n\n const diff = await execGit(['show', commitHash, '--unified=3', '--no-color'], projectPath);\n return diff ?? '';\n}\n\nexport async function getWorkingTreeDiff(projectPath: string, stagedOnly = false): Promise<string> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return '';\n\n const args = stagedOnly ? ['diff', '--cached', '--unified=3', '--no-color'] : ['diff', '--unified=3', '--no-color'];\n const diff = await execGit(args, projectPath);\n return diff ?? '';\n}\n\nexport async function getUnpushedCommits(projectPath: string): Promise<Commit[]> {\n const isRepo = await ensureRepo(projectPath);\n if (!isRepo) return [];\n\n // Handles detached HEAD by falling back to HEAD if upstream missing\n const upstream = await execGit(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], projectPath);\n if (!upstream) {\n return getRecentCommits(projectPath, 10);\n }\n\n const output = await execGit(['log', `${upstream}..HEAD`, '--pretty=format:%H%x09%an%x09%ad%x09%s', '--date=iso'], projectPath);\n if (!output) return [];\n\n return output.split('\\n').filter(Boolean).map((line) => {\n const [hash, author, date, message] = line.split('\\t');\n return { hash, author, date, message } as Commit;\n });\n}\n\nexport function resolveRepoPath(projectPath: string): string {\n const gitDir = path.join(projectPath, '.git');\n if (existsSync(gitDir)) return projectPath;\n return projectPath;\n}\n\n/**\n * Check if the given path is inside a git repository\n */\nexport async function isGitRepo(projectPath: string): Promise<boolean> {\n const result = await execGit(['rev-parse', '--is-inside-work-tree'], projectPath);\n return result === 'true';\n}\n\n/**\n * Get files changed since a given timestamp\n * Uses git log to find commits after timestamp, then gets affected files\n * Returns null if not a git repo or on error\n */\nexport async function getChangedFilesSinceTimestamp(\n projectPath: string,\n timestamp: number\n): Promise<string[] | null> {\n const isRepo = await isGitRepo(projectPath);\n if (!isRepo) return null;\n\n try {\n // Convert timestamp to ISO date for git\n const sinceDate = new Date(timestamp).toISOString();\n \n // Get all files that changed in commits since the timestamp\n const committedChanges = await execGit(\n ['log', `--since=${sinceDate}`, '--name-only', '--pretty=format:'],\n projectPath\n );\n\n // Get currently modified files (staged + unstaged)\n const stagedChanges = await execGit(['diff', '--cached', '--name-only'], projectPath);\n const unstagedChanges = await execGit(['diff', '--name-only'], projectPath);\n \n // Get untracked files\n const untrackedFiles = await execGit(\n ['ls-files', '--others', '--exclude-standard'],\n projectPath\n );\n\n // Combine all changed files\n const changedFiles = new Set<string>();\n \n const addFiles = (output: string | null) => {\n if (output) {\n output.split('\\n')\n .map(f => f.trim())\n .filter(Boolean)\n .forEach(f => changedFiles.add(path.join(projectPath, f)));\n }\n };\n\n addFiles(committedChanges);\n addFiles(stagedChanges);\n addFiles(unstagedChanges);\n addFiles(untrackedFiles);\n\n return Array.from(changedFiles);\n } catch {\n return null;\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 * Saved Patterns\n *\n * Unified pattern storage for:\n * - File structure patterns (architecture decisions)\n * - Code patterns (specific fixes/approaches)\n * - Detection rules (scout preferences)\n */\n\nimport { createHash } from 'crypto';\nimport { readFile, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, basename } from 'path';\nimport type { Issue } from '../types/index.js';\nimport { searchIssues } from '../memory/issue-store.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport type SavedPatternType = 'file-structure' | 'code-pattern' | 'detection-rule';\n\nexport interface SavedPattern {\n id: string;\n type: SavedPatternType;\n name: string;\n description: string;\n\n filePatterns?: string[];\n architecture?: {\n structure: string;\n rationale: string;\n };\n\n codePattern?: {\n pattern: string;\n fix: string;\n context: string;\n };\n\n detectionRule?: {\n agent: string;\n rule: string;\n severity: string;\n };\n\n validated: boolean;\n validationNotes?: string;\n projects: string[];\n occurrences: number;\n savedAt: string;\n savedBy: string;\n}\n\nexport async function loadSavedPatterns(workDir: string): Promise<SavedPattern[]> {\n const patternsPath = join(getTrieDirectory(workDir), 'saved-patterns.json');\n\n try {\n if (existsSync(patternsPath)) {\n const content = await readFile(patternsPath, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // File doesn't exist or invalid - return empty\n }\n\n return [];\n}\n\nexport async function savePatternsToProject(patterns: SavedPattern[], workDir: string): Promise<void> {\n const { mkdir } = await import('fs/promises');\n const patternsPath = join(getTrieDirectory(workDir), 'saved-patterns.json');\n\n await mkdir(getTrieDirectory(workDir), { recursive: true });\n await writeFile(patternsPath, JSON.stringify(patterns, null, 2));\n}\n\nexport async function savePatternToProject(pattern: SavedPattern, workDir: string): Promise<void> {\n const patterns = await loadSavedPatterns(workDir);\n const existing = patterns.findIndex(p => p.id === pattern.id);\n\n if (existing >= 0) {\n patterns[existing] = {\n ...patterns[existing]!,\n ...pattern,\n occurrences: patterns[existing]!.occurrences + 1,\n };\n } else {\n patterns.push(pattern);\n }\n\n await savePatternsToProject(patterns, workDir);\n}\n\nexport function detectPatternType(target: string, workDir: string): SavedPatternType {\n const scoutNames = [\n 'security', 'privacy', 'legal', 'accessibility', 'bug-finding',\n 'architecture', 'types', 'clean', 'devops', 'performance',\n 'ux', 'design', 'production-ready', 'agent-smith'\n ];\n\n if (scoutNames.includes(target.toLowerCase())) {\n return 'detection-rule';\n }\n\n const fullPath = join(workDir, target);\n if (\n existsSync(fullPath) ||\n target.includes('/') ||\n target.includes('*') ||\n target.endsWith('.ts') ||\n target.endsWith('.js')\n ) {\n return 'file-structure';\n }\n\n return 'code-pattern';\n}\n\nexport function generatePatternId(target: string, type: SavedPatternType): string {\n const hash = createHash('sha256')\n .update(`${type}:${target}`)\n .digest('hex')\n .slice(0, 12);\n return `${type}-${hash}`;\n}\n\nexport function getDetectionRuleAgents(patterns: SavedPattern[]): string[] {\n return patterns\n .filter(p => p.type === 'detection-rule')\n .map(p => p.detectionRule?.agent || p.name)\n .filter(Boolean);\n}\n\nexport async function createSavedPattern(\n target: string,\n note: string | undefined,\n workDir: string\n): Promise<SavedPattern> {\n const projectName = basename(workDir);\n const patternType = detectPatternType(target, workDir);\n\n const savedPattern: SavedPattern = {\n id: generatePatternId(target, patternType),\n type: patternType,\n name: target,\n description: note || `Pattern saved from ${projectName}`,\n validated: false,\n projects: [projectName],\n occurrences: 1,\n savedAt: new Date().toISOString(),\n savedBy: projectName,\n };\n\n if (patternType === 'file-structure') {\n savedPattern.filePatterns = [target];\n savedPattern.architecture = {\n structure: `Files matching ${target}`,\n rationale: note || 'File structure pattern that worked well',\n };\n } else if (patternType === 'code-pattern') {\n const issues = await searchIssues(target, { limit: 5 });\n if (issues.length > 0) {\n const latestIssue = issues[0];\n savedPattern.codePattern = {\n pattern: latestIssue?.issue.issue || target,\n fix: latestIssue?.issue.fix || 'Review and apply similar fix',\n context: note || 'Code pattern that worked well',\n };\n } else {\n savedPattern.codePattern = {\n pattern: target,\n fix: 'Review and apply similar fix',\n context: note || 'Code pattern that worked well',\n };\n }\n } else if (patternType === 'detection-rule') {\n savedPattern.detectionRule = {\n agent: target,\n rule: `Detection rules from ${target} scout`,\n severity: 'moderate',\n };\n }\n\n return savedPattern;\n}\n\nexport async function buildSavedPatternIssues(\n patterns: SavedPattern[],\n files: string[],\n readFileContent: (filePath: string) => Promise<string>\n): Promise<Issue[]> {\n const issues: Issue[] = [];\n\n for (const pattern of patterns) {\n if (pattern.type === 'detection-rule') continue;\n\n const targetFiles = filterFilesForPattern(files, pattern);\n if (targetFiles.length === 0) continue;\n\n if (pattern.type === 'file-structure') {\n for (const file of targetFiles) {\n issues.push(createPatternIssue(pattern, file, undefined));\n }\n continue;\n }\n\n if (pattern.type === 'code-pattern' && pattern.codePattern) {\n for (const file of targetFiles) {\n const content = await readFileContent(file);\n const match = findPatternMatch(content, pattern.codePattern.pattern);\n if (match) {\n issues.push(createPatternIssue(pattern, file, match.line));\n }\n }\n }\n }\n\n return issues;\n}\n\nfunction filterFilesForPattern(files: string[], pattern: SavedPattern): string[] {\n if (pattern.type === 'file-structure' && pattern.filePatterns) {\n return files.filter(file => pattern.filePatterns!.some(p => matchesFilePattern(file, p)));\n }\n if (pattern.type === 'code-pattern') {\n return files;\n }\n return [];\n}\n\nfunction matchesFilePattern(filePath: string, pattern: string): boolean {\n const normalized = filePath.replace(/\\\\/g, '/');\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '___DOUBLESTAR___')\n .replace(/\\*/g, '[^/]*')\n .replace(/___DOUBLESTAR___/g, '.*');\n const regex = new RegExp(`^${escaped}$`, 'i');\n return regex.test(normalized) || normalized.includes(pattern.replace(/\\*+/g, ''));\n}\n\nfunction findPatternMatch(content: string, pattern: string): { line: number } | null {\n try {\n const regex = new RegExp(pattern, 'i');\n const match = regex.exec(content);\n if (!match || match.index === undefined) return null;\n const line = getLineNumber(content, match.index);\n return { line };\n } catch {\n const index = content.toLowerCase().indexOf(pattern.toLowerCase());\n if (index === -1) return null;\n const line = getLineNumber(content, index);\n return { line };\n }\n}\n\nfunction getLineNumber(content: string, index: number): number {\n return content.slice(0, index).split('\\n').length;\n}\n\nfunction createPatternIssue(pattern: SavedPattern, file: string, line?: number): Issue {\n const description = pattern.description || `Saved pattern: ${pattern.name}`;\n const fix = pattern.codePattern?.fix || 'Apply the saved pattern from your other project.';\n const issue: Issue = {\n id: `saved-${pattern.id}-${hashFile(file)}`,\n severity: 'low',\n issue: `Saved pattern suggestion: ${description}`,\n fix,\n file,\n confidence: 0.6,\n autoFixable: false,\n agent: 'saved-patterns',\n category: 'pattern-sharing',\n };\n if (line !== undefined) {\n issue.line = line;\n }\n return issue;\n}\n\nfunction hashFile(file: string): string {\n return createHash('sha256').update(file).digest('hex').slice(0, 8);\n}\n"],"mappings":"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","names":["existsSync","join","existsSync","join","join","existsSync","path","join","existsSync","existsSync","existsSync","resolve","readFile","writeFile","mkdir","join","join","readFile","mkdir","writeFile","resolve","existsSync","readFile","existsSync","join","createHash","readFile","writeFile","existsSync","join","join","existsSync","readFile","mkdir","writeFile","createHash"]}
|