@triedotdev/mcp 1.0.138 → 1.0.140
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 +184 -38
- package/dist/{autonomy-config-TZ6HF4FA.js → autonomy-config-ZCOSTMPD.js} +2 -2
- package/dist/{chunk-X3F5QDER.js → chunk-4O2KRHK4.js} +934 -132
- package/dist/chunk-4O2KRHK4.js.map +1 -0
- package/dist/{chunk-J5EMP4XW.js → chunk-5KJ4UJOY.js} +9 -4
- package/dist/chunk-5KJ4UJOY.js.map +1 -0
- package/dist/chunk-62POBLFC.js +1925 -0
- package/dist/chunk-62POBLFC.js.map +1 -0
- package/dist/{chunk-GFFUDJMK.js → chunk-75ADWWUF.js} +13 -13
- package/dist/chunk-75ADWWUF.js.map +1 -0
- package/dist/{chunk-D3AS5LY7.js → chunk-7OJ6JIPL.js} +39 -604
- package/dist/chunk-7OJ6JIPL.js.map +1 -0
- package/dist/{chunk-3RRXWX3V.js → chunk-AF2APASP.js} +38 -4
- package/dist/{chunk-3RRXWX3V.js.map → chunk-AF2APASP.js.map} +1 -1
- package/dist/{chunk-QSWUPSLK.js → chunk-FH335WL5.js} +9 -1
- package/dist/chunk-FH335WL5.js.map +1 -0
- package/dist/{chunk-Y32FM3MR.js → chunk-FPEMP54L.js} +21 -15
- package/dist/chunk-FPEMP54L.js.map +1 -0
- package/dist/{chunk-EDDT4ZIH.js → chunk-GXF6JOCN.js} +21 -323
- package/dist/chunk-GXF6JOCN.js.map +1 -0
- package/dist/chunk-LD7ZEFNY.js +132 -0
- package/dist/chunk-LD7ZEFNY.js.map +1 -0
- package/dist/chunk-NKHO34UZ.js +467 -0
- package/dist/chunk-NKHO34UZ.js.map +1 -0
- package/dist/{chunk-YOKQ25IW.js → chunk-OQ4A3RDY.js} +14 -14
- package/dist/{chunk-6LLH3TBZ.js → chunk-UOSTOLU7.js} +12 -12
- package/dist/{chunk-67GSG2ST.js → chunk-XTTZAQWJ.js} +18 -15
- package/dist/chunk-XTTZAQWJ.js.map +1 -0
- package/dist/{chunk-FOCXXIXY.js → chunk-YEIJW6X6.js} +2 -2
- package/dist/chunk-YOJGSRZK.js +216 -0
- package/dist/chunk-YOJGSRZK.js.map +1 -0
- package/dist/cli/main.js +573 -59
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/yolo-daemon.js +15 -13
- package/dist/cli/yolo-daemon.js.map +1 -1
- package/dist/{client-JTU5TRLB.js → client-INNE2GGZ.js} +2 -2
- package/dist/{codebase-index-FNJ4GCBE.js → codebase-index-5SEOESWM.js} +3 -3
- package/dist/fast-analyzer-AYLZB5TW.js +216 -0
- package/dist/fast-analyzer-AYLZB5TW.js.map +1 -0
- package/dist/github-ingester-J2ZFYXVE.js +11 -0
- package/dist/{goal-manager-6BJQ36AH.js → goal-manager-ZBWKWEML.js} +3 -3
- package/dist/{goal-validator-GISXYANK.js → goal-validator-HNXXUCPW.js} +3 -3
- package/dist/{graph-X2FMRQLG.js → graph-J4OGTYCO.js} +2 -2
- package/dist/{hypothesis-K3KQJOXJ.js → hypothesis-JCUMZKTG.js} +3 -3
- package/dist/index.js +1090 -108
- package/dist/index.js.map +1 -1
- package/dist/{issue-store-BO5OWLJW.js → issue-store-LZWZIGM7.js} +2 -2
- package/dist/linear-ingester-JRDQAIAA.js +11 -0
- package/dist/linear-ingester-JRDQAIAA.js.map +1 -0
- package/dist/{trie-agent-XMSGMD7E.js → trie-agent-M6PHM6UD.js} +10 -10
- package/dist/trie-agent-M6PHM6UD.js.map +1 -0
- package/package.json +15 -8
- package/dist/chunk-67GSG2ST.js.map +0 -1
- package/dist/chunk-D3AS5LY7.js.map +0 -1
- package/dist/chunk-EDDT4ZIH.js.map +0 -1
- package/dist/chunk-GFFUDJMK.js.map +0 -1
- package/dist/chunk-J5EMP4XW.js.map +0 -1
- package/dist/chunk-QSWUPSLK.js.map +0 -1
- package/dist/chunk-X3F5QDER.js.map +0 -1
- package/dist/chunk-Y32FM3MR.js.map +0 -1
- package/dist/chunk-Z2P4WST6.js +0 -883
- package/dist/chunk-Z2P4WST6.js.map +0 -1
- /package/dist/{autonomy-config-TZ6HF4FA.js.map → autonomy-config-ZCOSTMPD.js.map} +0 -0
- /package/dist/{chunk-YOKQ25IW.js.map → chunk-OQ4A3RDY.js.map} +0 -0
- /package/dist/{chunk-6LLH3TBZ.js.map → chunk-UOSTOLU7.js.map} +0 -0
- /package/dist/{chunk-FOCXXIXY.js.map → chunk-YEIJW6X6.js.map} +0 -0
- /package/dist/{client-JTU5TRLB.js.map → client-INNE2GGZ.js.map} +0 -0
- /package/dist/{codebase-index-FNJ4GCBE.js.map → codebase-index-5SEOESWM.js.map} +0 -0
- /package/dist/{goal-manager-6BJQ36AH.js.map → github-ingester-J2ZFYXVE.js.map} +0 -0
- /package/dist/{goal-validator-GISXYANK.js.map → goal-manager-ZBWKWEML.js.map} +0 -0
- /package/dist/{graph-X2FMRQLG.js.map → goal-validator-HNXXUCPW.js.map} +0 -0
- /package/dist/{hypothesis-K3KQJOXJ.js.map → graph-J4OGTYCO.js.map} +0 -0
- /package/dist/{issue-store-BO5OWLJW.js.map → hypothesis-JCUMZKTG.js.map} +0 -0
- /package/dist/{trie-agent-XMSGMD7E.js.map → issue-store-LZWZIGM7.js.map} +0 -0
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
resolveGoalViolation,
|
|
11
11
|
searchIssues,
|
|
12
12
|
storeIssues
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-62POBLFC.js";
|
|
14
14
|
import "./chunk-4MJ52WBH.js";
|
|
15
15
|
import "./chunk-43X6JBEM.js";
|
|
16
16
|
import "./chunk-SH7H3WRU.js";
|
|
@@ -29,4 +29,4 @@ export {
|
|
|
29
29
|
searchIssues,
|
|
30
30
|
storeIssues
|
|
31
31
|
};
|
|
32
|
-
//# sourceMappingURL=issue-store-
|
|
32
|
+
//# sourceMappingURL=issue-store-LZWZIGM7.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LinearIngester
|
|
3
|
+
} from "./chunk-LD7ZEFNY.js";
|
|
4
|
+
import "./chunk-NKHO34UZ.js";
|
|
5
|
+
import "./chunk-SH7H3WRU.js";
|
|
6
|
+
import "./chunk-APMV77PU.js";
|
|
7
|
+
import "./chunk-DGUM43GV.js";
|
|
8
|
+
export {
|
|
9
|
+
LinearIngester
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=linear-ingester-JRDQAIAA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
TrieAgent,
|
|
3
3
|
getTrieAgent
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-OQ4A3RDY.js";
|
|
5
|
+
import "./chunk-YEIJW6X6.js";
|
|
6
|
+
import "./chunk-XTTZAQWJ.js";
|
|
7
7
|
import "./chunk-3MUCUZ46.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-UOSTOLU7.js";
|
|
9
|
+
import "./chunk-FH335WL5.js";
|
|
10
|
+
import "./chunk-FPEMP54L.js";
|
|
10
11
|
import "./chunk-LT6VUZG2.js";
|
|
12
|
+
import "./chunk-62POBLFC.js";
|
|
13
|
+
import "./chunk-4MJ52WBH.js";
|
|
14
|
+
import "./chunk-43X6JBEM.js";
|
|
11
15
|
import "./chunk-F4NJ4CBP.js";
|
|
12
16
|
import "./chunk-IXO4G4D3.js";
|
|
13
17
|
import "./chunk-6NLHFIYA.js";
|
|
14
18
|
import "./chunk-FG467PDD.js";
|
|
15
|
-
import "./chunk-QSWUPSLK.js";
|
|
16
|
-
import "./chunk-Z2P4WST6.js";
|
|
17
|
-
import "./chunk-4MJ52WBH.js";
|
|
18
|
-
import "./chunk-43X6JBEM.js";
|
|
19
19
|
import "./chunk-SH7H3WRU.js";
|
|
20
20
|
import "./chunk-APMV77PU.js";
|
|
21
21
|
import "./chunk-DGUM43GV.js";
|
|
@@ -23,4 +23,4 @@ export {
|
|
|
23
23
|
TrieAgent,
|
|
24
24
|
getTrieAgent
|
|
25
25
|
};
|
|
26
|
-
//# sourceMappingURL=trie-agent-
|
|
26
|
+
//# sourceMappingURL=trie-agent-M6PHM6UD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@triedotdev/mcp",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Trainable AI
|
|
3
|
+
"version": "1.0.140",
|
|
4
|
+
"description": "Trainable AI agent with a cryptographic governance ledger and portable context for AI-generated codebases.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -25,17 +25,24 @@
|
|
|
25
25
|
"prepublishOnly": "npm run build"
|
|
26
26
|
},
|
|
27
27
|
"keywords": [
|
|
28
|
+
"governance",
|
|
29
|
+
"ledger",
|
|
28
30
|
"ai",
|
|
31
|
+
"agent",
|
|
32
|
+
"mcp",
|
|
33
|
+
"cursor",
|
|
34
|
+
"claude",
|
|
29
35
|
"code-review",
|
|
30
36
|
"security",
|
|
31
|
-
"mcp",
|
|
32
|
-
"agent",
|
|
33
37
|
"orchestration",
|
|
38
|
+
"decision-memory",
|
|
39
|
+
"incident-tracking",
|
|
40
|
+
"linear",
|
|
41
|
+
"github",
|
|
34
42
|
"trie",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"knowledge-base"
|
|
43
|
+
"custom-agent",
|
|
44
|
+
"knowledge-base",
|
|
45
|
+
"blockchain"
|
|
39
46
|
],
|
|
40
47
|
"author": "Trie Team",
|
|
41
48
|
"license": "MIT",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent/hypothesis.ts"],"sourcesContent":["/**\n * Hypothesis System - Self-improving hypothesis generation and validation\n * \n * Features:\n * - Generate hypotheses from patterns\n * - Track evidence for/against hypotheses\n * - Auto-validate/invalidate based on evidence\n * - Adjust confidence over time\n * - Learn from hypothesis outcomes\n */\n\nimport type { Hypothesis } from './project-state.js';\nimport { getProjectState } from './project-state.js';\nimport { getInsightStore, type Insight } from './insight-store.js';\nimport { searchIssues } from '../memory/issue-store.js';\nimport { dirname } from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Hypothesis template for auto-generation\n */\nexport interface HypothesisTemplate {\n category: 'timing' | 'pattern' | 'team' | 'code' | 'general';\n statement: string;\n testCriteria: string;\n minConfidence: number;\n dataRequired: string[];\n}\n\n/**\n * Evidence for a hypothesis\n */\nexport interface HypothesisEvidence {\n type: 'supporting' | 'contradicting';\n description: string;\n weight: number; // 0-1\n timestamp: string;\n}\n\n/**\n * Hypothesis analysis result\n */\nexport interface HypothesisAnalysis {\n hypothesis: Hypothesis;\n recentEvidence: HypothesisEvidence[];\n confidenceChange: number;\n statusChange?: 'validated' | 'invalidated';\n actionRequired: boolean;\n}\n\n// ============================================================================\n// Hypothesis Templates\n// ============================================================================\n\nconst HYPOTHESIS_TEMPLATES: HypothesisTemplate[] = [\n {\n category: 'timing',\n statement: 'Issues spike after weekend deployments',\n testCriteria: 'Compare Monday issue counts to other days',\n minConfidence: 0.3,\n dataRequired: ['issue_timestamps', 'deployment_data'],\n },\n {\n category: 'timing',\n statement: 'Code quality declines on Fridays',\n testCriteria: 'Compare Friday issue introduction rate to weekly average',\n minConfidence: 0.3,\n dataRequired: ['issue_timestamps'],\n },\n {\n category: 'pattern',\n statement: 'Auth-related code has the highest incident rate',\n testCriteria: 'Compare auth/ issue count to other directories',\n minConfidence: 0.4,\n dataRequired: ['issue_files'],\n },\n {\n category: 'pattern',\n statement: 'Security issues cluster in specific directories',\n testCriteria: 'Check if security issues are concentrated (>50% in <3 dirs)',\n minConfidence: 0.4,\n dataRequired: ['issue_files', 'issue_agents'],\n },\n {\n category: 'code',\n statement: 'Files with multiple authors have more issues',\n testCriteria: 'Correlate file author count with issue count',\n minConfidence: 0.4,\n dataRequired: ['issue_files', 'git_blame'],\n },\n {\n category: 'code',\n statement: 'Recently modified files are more likely to have issues',\n testCriteria: 'Compare issue rate for recent vs old files',\n minConfidence: 0.3,\n dataRequired: ['issue_timestamps', 'file_modification_times'],\n },\n {\n category: 'pattern',\n statement: 'Critical issues often come in clusters',\n testCriteria: 'Check temporal clustering of critical issues',\n minConfidence: 0.3,\n dataRequired: ['issue_timestamps', 'issue_severities'],\n },\n];\n\n// ============================================================================\n// HypothesisEngine Class\n// ============================================================================\n\n/**\n * Engine for generating and validating hypotheses\n */\nexport class HypothesisEngine {\n private projectPath: string;\n private projectState;\n private insightStore;\n \n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.projectState = getProjectState(projectPath);\n this.insightStore = getInsightStore(projectPath);\n }\n \n /**\n * Create a new hypothesis\n */\n async createHypothesis(statement: string, options?: {\n category?: Hypothesis['category'];\n testCriteria?: string;\n initialConfidence?: number;\n autoGenerated?: boolean;\n }): Promise<Hypothesis> {\n const hypothesis: Hypothesis = {\n id: `hyp-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n statement,\n confidence: options?.initialConfidence ?? 0,\n status: 'proposed',\n evidence: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n testCriteria: options?.testCriteria,\n category: options?.category ?? 'general',\n autoGenerated: options?.autoGenerated ?? false,\n };\n \n await this.projectState.addHypothesis(hypothesis);\n \n return hypothesis;\n }\n \n /**\n * Auto-generate hypotheses based on detected patterns\n */\n async autoGenerateHypotheses(): Promise<Hypothesis[]> {\n const generated: Hypothesis[] = [];\n \n try {\n // Get existing hypotheses to avoid duplicates\n await this.projectState.load();\n const existing = this.projectState.getAllHypotheses();\n const existingStatements = new Set(existing.map(h => h.statement.toLowerCase()));\n \n // Get data for pattern detection\n const issues = await searchIssues('', {\n workDir: this.projectPath,\n limit: 500,\n includeResolved: true,\n });\n \n if (issues.length < 10) {\n return generated; // Not enough data\n }\n \n // Check each template for applicability\n for (const template of HYPOTHESIS_TEMPLATES) {\n // Skip if already have similar hypothesis\n if (existingStatements.has(template.statement.toLowerCase())) {\n continue;\n }\n \n // Check if we have enough evidence to propose this hypothesis\n const evidence = await this.gatherInitialEvidence(template, issues);\n \n if (evidence.length > 0 && evidence[0]!.weight >= template.minConfidence) {\n const hypothesis = await this.createHypothesis(template.statement, {\n category: template.category,\n testCriteria: template.testCriteria,\n initialConfidence: evidence[0]!.weight,\n autoGenerated: true,\n });\n \n // Add initial evidence\n for (const e of evidence) {\n await this.projectState.addEvidence(hypothesis.id, e);\n }\n \n generated.push(hypothesis);\n \n // Limit to 2 new hypotheses per run\n if (generated.length >= 2) break;\n }\n }\n \n } catch (error) {\n console.error('Failed to auto-generate hypotheses:', error);\n }\n \n return generated;\n }\n \n /**\n * Use Claude AI to generate novel hypotheses from observed patterns\n * This enables fully agentic hypothesis creation based on actual codebase observations\n */\n async generateHypothesesWithAI(context: {\n recentIssues?: any[];\n patterns?: string[];\n observations?: string[];\n }): Promise<Hypothesis[]> {\n const { isAIAvailable, runAIAnalysis } = await import('../ai/client.js');\n \n if (!isAIAvailable()) {\n return []; // Fall back to template-based generation\n }\n \n const generated: Hypothesis[] = [];\n \n try {\n // Get existing hypotheses to avoid duplicates\n await this.projectState.load();\n const existing = this.projectState.getAllHypotheses();\n const existingStatements = existing.map(h => h.statement);\n \n // Get recent issue data\n const issues = context.recentIssues || await searchIssues('', {\n workDir: this.projectPath,\n limit: 100,\n includeResolved: true,\n });\n \n if (issues.length < 5) {\n return generated; // Not enough data for AI\n }\n \n // Build context for Claude\n const issuesSummary = this.summarizeIssuesForAI(issues);\n const patternsSummary = context.patterns?.join('\\n') || 'No explicit patterns provided';\n const observationsSummary = context.observations?.join('\\n') || 'No explicit observations provided';\n \n const prompt = `You are an AI agent observing a codebase over time. Based on the patterns below, generate 1-3 testable hypotheses about this codebase's quality patterns.\n\n## Recent Issues Summary\n${issuesSummary}\n\n## Observed Patterns\n${patternsSummary}\n\n## Additional Observations\n${observationsSummary}\n\n## Existing Hypotheses (avoid duplicates)\n${existingStatements.length > 0 ? existingStatements.map(s => `- ${s}`).join('\\n') : 'None yet'}\n\nGenerate hypotheses that are:\n1. Specific and testable (can be validated with data)\n2. Actionable (if validated, can guide improvements)\n3. Novel (not duplicates of existing hypotheses)\n4. Based on real patterns in the data above\n\nReturn ONLY a JSON array of hypotheses. Each hypothesis must have:\n- \"statement\": Clear, concise hypothesis statement\n- \"category\": One of: \"timing\", \"pattern\", \"team\", \"code\", \"general\"\n- \"testCriteria\": How to test this hypothesis\n- \"confidence\": Initial confidence (0-1)\n- \"reasoning\": Why you think this hypothesis is worth testing\n\nExample format:\n[\n {\n \"statement\": \"Authentication code changes correlate with security issues\",\n \"category\": \"pattern\",\n \"testCriteria\": \"Track auth file changes and subsequent security issue rates\",\n \"confidence\": 0.6,\n \"reasoning\": \"65% of security issues occur in files modified in the past week\"\n }\n]\n\nReturn empty array [] if no novel hypotheses can be generated from the data.`;\n \n const result = await runAIAnalysis({\n systemPrompt: 'You are an expert code quality analyst who identifies patterns and generates testable hypotheses.',\n userPrompt: prompt,\n maxTokens: 1024,\n temperature: 0.7, // Higher temperature for creative hypothesis generation\n });\n \n if (!result.success || !result.content.trim()) {\n return generated;\n }\n \n // Parse AI response\n let aiHypotheses: Array<{\n statement: string;\n category: Hypothesis['category'];\n testCriteria: string;\n confidence: number;\n reasoning: string;\n }> = [];\n \n try {\n const cleaned = result.content.replace(/```json?\\n?|\\n?```/g, '').trim();\n aiHypotheses = JSON.parse(cleaned);\n if (!Array.isArray(aiHypotheses)) aiHypotheses = [];\n } catch {\n return generated; // AI response wasn't valid JSON\n }\n \n // Create hypotheses from AI suggestions\n for (const aiHypo of aiHypotheses.slice(0, 3)) {\n // Check for duplicates\n const isDuplicate = existingStatements.some(existing => \n existing.toLowerCase().includes(aiHypo.statement.toLowerCase().slice(0, 30))\n );\n \n if (isDuplicate) continue;\n \n const hypothesis = await this.createHypothesis(aiHypo.statement, {\n category: aiHypo.category,\n testCriteria: aiHypo.testCriteria,\n initialConfidence: Math.max(0.3, Math.min(0.7, aiHypo.confidence)),\n autoGenerated: true,\n });\n \n // Add AI reasoning as initial evidence\n await this.projectState.addEvidence(hypothesis.id, {\n type: 'supporting',\n description: `AI observed: ${aiHypo.reasoning}`,\n weight: aiHypo.confidence,\n });\n \n generated.push(hypothesis);\n }\n \n } catch (error) {\n console.error('Failed to generate hypotheses with AI:', error);\n }\n \n return generated;\n }\n \n /**\n * Summarize issues for AI context\n */\n private summarizeIssuesForAI(issues: Array<{ issue: any; score: number }>): string {\n const totalIssues = issues.length;\n \n // Severity breakdown\n const severityCounts: Record<string, number> = {};\n for (const { issue } of issues) {\n severityCounts[issue.severity] = (severityCounts[issue.severity] || 0) + 1;\n }\n \n // Agent breakdown\n const agentCounts: Record<string, number> = {};\n for (const { issue } of issues) {\n agentCounts[issue.agent] = (agentCounts[issue.agent] || 0) + 1;\n }\n \n // File/directory patterns\n const fileCounts: Record<string, number> = {};\n for (const { issue } of issues) {\n const dir = dirname(issue.file);\n fileCounts[dir] = (fileCounts[dir] || 0) + 1;\n }\n \n // Time patterns\n const dayOfWeekCounts: Record<number, number> = {};\n for (const { issue } of issues) {\n const date = new Date(issue.timestamp);\n const day = date.getDay();\n dayOfWeekCounts[day] = (dayOfWeekCounts[day] || 0) + 1;\n }\n \n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const dayDistribution = Object.entries(dayOfWeekCounts)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([day, count]) => `${dayNames[Number(day)]}: ${count}`)\n .join(', ');\n \n const topDirs = Object.entries(fileCounts)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5)\n .map(([dir, count]) => `${dir}: ${count}`)\n .join(', ');\n \n const topAgents = Object.entries(agentCounts)\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5)\n .map(([agent, count]) => `${agent}: ${count}`)\n .join(', ');\n \n return `Total Issues: ${totalIssues}\nSeverities: ${Object.entries(severityCounts).map(([s, c]) => `${s}=${c}`).join(', ')}\nTop Agents: ${topAgents}\nTop Directories: ${topDirs}\nDay Distribution: ${dayDistribution}`;\n }\n \n /**\n * Gather initial evidence for a hypothesis template\n */\n private async gatherInitialEvidence(\n template: HypothesisTemplate,\n issues: Array<{ issue: any; score: number }>\n ): Promise<HypothesisEvidence[]> {\n const evidence: HypothesisEvidence[] = [];\n \n switch (template.category) {\n case 'timing':\n evidence.push(...this.analyzeTimingPatterns(template, issues));\n break;\n case 'pattern':\n evidence.push(...this.analyzeLocationPatterns(template, issues));\n break;\n case 'code':\n evidence.push(...this.analyzeCodePatterns(template, issues));\n break;\n }\n \n return evidence;\n }\n \n /**\n * Analyze timing patterns in issues\n */\n private analyzeTimingPatterns(\n template: HypothesisTemplate,\n issues: Array<{ issue: any; score: number }>\n ): HypothesisEvidence[] {\n const evidence: HypothesisEvidence[] = [];\n \n // Analyze day-of-week patterns\n const dayOfWeekCounts: Record<number, number> = {};\n for (const { issue } of issues) {\n const date = new Date(issue.timestamp);\n const day = date.getDay();\n dayOfWeekCounts[day] = (dayOfWeekCounts[day] || 0) + 1;\n }\n \n // Check for Friday pattern\n if (template.statement.includes('Friday')) {\n const fridayCount = dayOfWeekCounts[5] || 0;\n const avgOtherDays = (Object.values(dayOfWeekCounts).reduce((a, b) => a + b, 0) - fridayCount) / 4;\n \n if (fridayCount > avgOtherDays * 1.5) {\n evidence.push({\n type: 'supporting',\n description: `Friday has ${((fridayCount / avgOtherDays - 1) * 100).toFixed(0)}% more issues than average`,\n weight: Math.min(0.8, 0.3 + (fridayCount / avgOtherDays - 1) * 0.2),\n timestamp: new Date().toISOString(),\n });\n } else {\n evidence.push({\n type: 'contradicting',\n description: 'Friday issue count is not significantly higher',\n weight: 0.3,\n timestamp: new Date().toISOString(),\n });\n }\n }\n \n // Check for Monday/weekend pattern\n if (template.statement.includes('weekend') || template.statement.includes('Monday')) {\n const mondayCount = dayOfWeekCounts[1] || 0;\n const avgOtherDays = (Object.values(dayOfWeekCounts).reduce((a, b) => a + b, 0) - mondayCount) / 4;\n \n if (mondayCount > avgOtherDays * 1.5) {\n evidence.push({\n type: 'supporting',\n description: `Monday has ${((mondayCount / avgOtherDays - 1) * 100).toFixed(0)}% more issues than average`,\n weight: Math.min(0.8, 0.3 + (mondayCount / avgOtherDays - 1) * 0.2),\n timestamp: new Date().toISOString(),\n });\n }\n }\n \n return evidence;\n }\n \n /**\n * Analyze location patterns in issues\n */\n private analyzeLocationPatterns(\n template: HypothesisTemplate,\n issues: Array<{ issue: any; score: number }>\n ): HypothesisEvidence[] {\n const evidence: HypothesisEvidence[] = [];\n \n // Analyze directory distribution\n const dirCounts: Record<string, number> = {};\n for (const { issue } of issues) {\n const dir = dirname(issue.file);\n dirCounts[dir] = (dirCounts[dir] || 0) + 1;\n }\n \n const sortedDirs = Object.entries(dirCounts)\n .sort(([, a], [, b]) => b - a);\n \n // Check for auth pattern\n if (template.statement.includes('Auth')) {\n const authDirs = sortedDirs.filter(([dir]) => \n dir.toLowerCase().includes('auth') || \n dir.toLowerCase().includes('login') ||\n dir.toLowerCase().includes('session')\n );\n \n const authCount = authDirs.reduce((sum, [, count]) => sum + count, 0);\n const percentage = (authCount / issues.length) * 100;\n \n if (percentage >= 20) {\n evidence.push({\n type: 'supporting',\n description: `Auth-related code has ${percentage.toFixed(0)}% of issues`,\n weight: Math.min(0.85, 0.4 + percentage / 100),\n timestamp: new Date().toISOString(),\n });\n }\n }\n \n // Check for clustering pattern\n if (template.statement.includes('cluster')) {\n const topThreeDirs = sortedDirs.slice(0, 3);\n const topThreeCount = topThreeDirs.reduce((sum, [, count]) => sum + count, 0);\n const percentage = (topThreeCount / issues.length) * 100;\n \n if (percentage >= 50) {\n evidence.push({\n type: 'supporting',\n description: `Top 3 directories have ${percentage.toFixed(0)}% of issues`,\n weight: Math.min(0.8, 0.3 + percentage / 100),\n timestamp: new Date().toISOString(),\n });\n }\n }\n \n return evidence;\n }\n \n /**\n * Analyze code patterns\n */\n private analyzeCodePatterns(\n template: HypothesisTemplate,\n issues: Array<{ issue: any; score: number }>\n ): HypothesisEvidence[] {\n const evidence: HypothesisEvidence[] = [];\n \n // Analyze temporal clustering (critical issues in bursts)\n if (template.statement.includes('cluster')) {\n const criticalIssues = issues.filter(r => r.issue.severity === 'critical');\n \n if (criticalIssues.length >= 3) {\n // Check if critical issues are clustered in time\n const timestamps = criticalIssues\n .map(r => new Date(r.issue.timestamp).getTime())\n .sort((a, b) => a - b);\n \n let clusteredCount = 0;\n for (let i = 1; i < timestamps.length; i++) {\n // If within 24 hours of previous\n if (timestamps[i]! - timestamps[i - 1]! < 24 * 60 * 60 * 1000) {\n clusteredCount++;\n }\n }\n \n const clusterRatio = clusteredCount / (timestamps.length - 1);\n \n if (clusterRatio >= 0.5) {\n evidence.push({\n type: 'supporting',\n description: `${(clusterRatio * 100).toFixed(0)}% of critical issues occur within 24h of another`,\n weight: Math.min(0.75, 0.3 + clusterRatio * 0.4),\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n \n return evidence;\n }\n \n /**\n * Update confidence scores based on new data\n */\n async updateConfidenceFromOutcomes(): Promise<HypothesisAnalysis[]> {\n const analyses: HypothesisAnalysis[] = [];\n \n try {\n await this.projectState.load();\n const activeHypotheses = this.projectState.getActiveHypotheses();\n \n for (const hypothesis of activeHypotheses) {\n const analysis = await this.analyzeHypothesis(hypothesis);\n analyses.push(analysis);\n \n // Create insight if hypothesis was validated or invalidated\n if (analysis.statusChange && this.insightStore.canCreateInsight('hypothesis-update')) {\n const insight = this.createHypothesisInsight(analysis);\n await this.insightStore.addInsight(insight);\n await this.insightStore.markInsightCreated('hypothesis-update');\n }\n }\n \n // Update hypothesis accuracy metric\n await this.projectState.updateHypothesisAccuracy();\n \n } catch (error) {\n console.error('Failed to update hypothesis confidence:', error);\n }\n \n return analyses;\n }\n \n /**\n * Analyze a single hypothesis\n */\n private async analyzeHypothesis(hypothesis: Hypothesis): Promise<HypothesisAnalysis> {\n // Get recent issues for new evidence\n const issues = await searchIssues('', {\n workDir: this.projectPath,\n limit: 100,\n includeResolved: false,\n });\n \n // Find the matching template\n const template = HYPOTHESIS_TEMPLATES.find(t => \n t.statement.toLowerCase() === hypothesis.statement.toLowerCase()\n );\n \n const recentEvidence: HypothesisEvidence[] = [];\n \n if (template) {\n recentEvidence.push(...await this.gatherInitialEvidence(template, issues));\n } else {\n // For user-created hypotheses, use semantic evidence gathering\n recentEvidence.push(...this.gatherSemanticEvidence(hypothesis, issues));\n }\n \n // Calculate confidence change\n const oldConfidence = hypothesis.confidence;\n let newConfidence = oldConfidence;\n \n for (const evidence of recentEvidence) {\n if (evidence.type === 'supporting') {\n newConfidence = Math.min(1, newConfidence + evidence.weight * 0.1);\n } else {\n newConfidence = Math.max(0, newConfidence - evidence.weight * 0.1);\n }\n }\n \n // Determine status change\n let statusChange: 'validated' | 'invalidated' | undefined;\n \n if (newConfidence >= 0.8 && hypothesis.evidence.length >= 3) {\n statusChange = 'validated';\n await this.projectState.updateHypothesis(hypothesis.id, {\n status: 'validated',\n confidence: newConfidence,\n validatedAt: new Date().toISOString(),\n });\n } else if (newConfidence <= 0.2 && hypothesis.evidence.length >= 3) {\n statusChange = 'invalidated';\n await this.projectState.updateHypothesis(hypothesis.id, {\n status: 'invalidated',\n confidence: newConfidence,\n });\n } else {\n // Just update confidence\n await this.projectState.updateHypothesis(hypothesis.id, {\n confidence: newConfidence,\n });\n }\n \n // Add new evidence\n for (const evidence of recentEvidence) {\n await this.projectState.addEvidence(hypothesis.id, evidence);\n }\n \n const analysis: HypothesisAnalysis = {\n hypothesis: { ...hypothesis, confidence: newConfidence },\n recentEvidence,\n confidenceChange: newConfidence - oldConfidence,\n actionRequired: statusChange !== undefined,\n };\n \n if (statusChange) {\n analysis.statusChange = statusChange;\n }\n \n return analysis;\n }\n \n /**\n * Gather evidence for user-created hypotheses using semantic matching\n * \n * This enables agentic tracking for natural language hypotheses like:\n * - \"Mondays have more bugs than Fridays\"\n * - \"Code reviews reduce bug rate\"\n * - \"Security issues cluster in auth code\"\n */\n private gatherSemanticEvidence(\n hypothesis: Hypothesis,\n issues: Array<{ issue: any; score: number }>\n ): HypothesisEvidence[] {\n const evidence: HypothesisEvidence[] = [];\n const stmt = hypothesis.statement.toLowerCase();\n \n // Time-based hypotheses (days of week patterns)\n if (stmt.includes('monday') || stmt.includes('friday') || stmt.includes('weekend') ||\n stmt.includes('morning') || stmt.includes('afternoon')) {\n const dayNames = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n const dayOfWeekCounts: Record<number, number> = { 0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0 };\n \n for (const { issue } of issues) {\n const date = new Date(issue.timestamp);\n const day = date.getDay();\n dayOfWeekCounts[day] = (dayOfWeekCounts[day] || 0) + 1;\n }\n \n const totalIssues = Object.values(dayOfWeekCounts).reduce((a, b) => a + b, 0);\n const avgPerDay = totalIssues / 7;\n \n // Check each day mentioned\n for (let dayIdx = 0; dayIdx < 7; dayIdx++) {\n const dayName = dayNames[dayIdx]!;\n if (stmt.includes(dayName)) {\n const dayCount = dayOfWeekCounts[dayIdx] || 0;\n \n if (stmt.includes('more') || stmt.includes('higher') || stmt.includes('spike')) {\n // Testing if this day has MORE issues\n if (dayCount > avgPerDay * 1.3) {\n evidence.push({\n type: 'supporting',\n description: `${dayName.charAt(0).toUpperCase() + dayName.slice(1)} has ${dayCount} issues (${((dayCount/avgPerDay - 1) * 100).toFixed(0)}% above average)`,\n weight: Math.min(0.7, 0.3 + (dayCount / avgPerDay - 1) * 0.3),\n timestamp: new Date().toISOString(),\n });\n } else {\n evidence.push({\n type: 'contradicting',\n description: `${dayName.charAt(0).toUpperCase() + dayName.slice(1)} has average or below average issue count`,\n weight: 0.3,\n timestamp: new Date().toISOString(),\n });\n }\n } else if (stmt.includes('fewer') || stmt.includes('less') || stmt.includes('reduce')) {\n // Testing if this day has FEWER issues\n if (dayCount < avgPerDay * 0.7) {\n evidence.push({\n type: 'supporting',\n description: `${dayName.charAt(0).toUpperCase() + dayName.slice(1)} has ${dayCount} issues (${((1 - dayCount/avgPerDay) * 100).toFixed(0)}% below average)`,\n weight: Math.min(0.7, 0.3 + (1 - dayCount / avgPerDay) * 0.3),\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n }\n }\n \n // Code review hypotheses\n if (stmt.includes('review') || stmt.includes('pr') || stmt.includes('pull request')) {\n // Look for patterns in reviewed vs unreviewed code (approximated by commit patterns)\n const recentIssues = issues.slice(0, 30); // Most recent\n const olderIssues = issues.slice(30); // Older\n \n if (recentIssues.length >= 10 && olderIssues.length >= 10) {\n const recentRate = recentIssues.length;\n const olderRate = olderIssues.length;\n \n if (stmt.includes('reduce') || stmt.includes('fewer') || stmt.includes('less')) {\n if (recentRate < olderRate) {\n evidence.push({\n type: 'supporting',\n description: `Recent period has ${((1 - recentRate/olderRate) * 100).toFixed(0)}% fewer issues`,\n weight: Math.min(0.6, 0.3 + (1 - recentRate/olderRate) * 0.3),\n timestamp: new Date().toISOString(),\n });\n } else {\n evidence.push({\n type: 'contradicting',\n description: `Issue rate has not decreased recently`,\n weight: 0.2,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n }\n \n // Directory/location clustering hypotheses\n if (stmt.includes('cluster') || stmt.includes('concentrate') || stmt.includes('auth') ||\n stmt.includes('specific') || stmt.includes('certain files')) {\n const dirCounts: Record<string, number> = {};\n for (const { issue } of issues) {\n const dir = dirname(issue.file);\n dirCounts[dir] = (dirCounts[dir] || 0) + 1;\n }\n \n const sortedDirs = Object.entries(dirCounts).sort(([, a], [, b]) => b - a);\n const topThreeCount = sortedDirs.slice(0, 3).reduce((sum, [, count]) => sum + count, 0);\n const totalCount = issues.length;\n const concentration = topThreeCount / totalCount;\n \n if (concentration >= 0.5) {\n evidence.push({\n type: 'supporting',\n description: `Top 3 directories have ${(concentration * 100).toFixed(0)}% of issues (concentrated)`,\n weight: Math.min(0.7, 0.3 + concentration * 0.4),\n timestamp: new Date().toISOString(),\n });\n } else {\n evidence.push({\n type: 'contradicting',\n description: `Issues are distributed across many directories`,\n weight: 0.3,\n timestamp: new Date().toISOString(),\n });\n }\n }\n \n // Severity trend hypotheses\n if (stmt.includes('critical') || stmt.includes('security') || stmt.includes('severity')) {\n const criticalCount = issues.filter(r => r.issue.severity === 'critical').length;\n const seriousCount = issues.filter(r => r.issue.severity === 'serious').length;\n const highSeverityRatio = (criticalCount + seriousCount) / issues.length;\n \n if (stmt.includes('increase') || stmt.includes('more') || stmt.includes('rise')) {\n if (highSeverityRatio > 0.3) {\n evidence.push({\n type: 'supporting',\n description: `${(highSeverityRatio * 100).toFixed(0)}% of issues are high severity`,\n weight: Math.min(0.7, 0.3 + highSeverityRatio),\n timestamp: new Date().toISOString(),\n });\n }\n } else if (stmt.includes('decrease') || stmt.includes('fewer') || stmt.includes('reduce')) {\n if (highSeverityRatio < 0.2) {\n evidence.push({\n type: 'supporting',\n description: `Only ${(highSeverityRatio * 100).toFixed(0)}% of issues are high severity`,\n weight: 0.5,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n \n // Agent/skill specific hypotheses\n const agents = ['security', 'performance', 'accessibility', 'test', 'typecheck', 'bug-finding'];\n for (const agent of agents) {\n if (stmt.includes(agent) || stmt.includes(agent.replace('-', ' '))) {\n const agentIssues = issues.filter(r => r.issue.agent === agent);\n const agentRatio = agentIssues.length / issues.length;\n \n if (stmt.includes('most') || stmt.includes('majority') || stmt.includes('main')) {\n if (agentRatio > 0.4) {\n evidence.push({\n type: 'supporting',\n description: `${agent} accounts for ${(agentRatio * 100).toFixed(0)}% of issues`,\n weight: Math.min(0.7, 0.3 + agentRatio),\n timestamp: new Date().toISOString(),\n });\n } else {\n evidence.push({\n type: 'contradicting',\n description: `${agent} only accounts for ${(agentRatio * 100).toFixed(0)}% of issues`,\n weight: 0.3,\n timestamp: new Date().toISOString(),\n });\n }\n }\n }\n }\n \n return evidence;\n }\n \n /**\n * Create an insight for hypothesis status change\n */\n private createHypothesisInsight(analysis: HypothesisAnalysis): Insight {\n const isValidated = analysis.statusChange === 'validated';\n \n return {\n id: `insight-hyp-${analysis.hypothesis.id}`,\n type: isValidated ? 'celebration' : 'observation',\n message: isValidated\n ? `Hypothesis confirmed: \"${analysis.hypothesis.statement}\"`\n : `Hypothesis disproven: \"${analysis.hypothesis.statement}\"`,\n context: `Confidence: ${(analysis.hypothesis.confidence * 100).toFixed(0)}%. ${analysis.recentEvidence.length} evidence points analyzed.`,\n relatedIssues: [],\n priority: 5,\n timestamp: Date.now(),\n dismissed: false,\n category: 'pattern',\n details: {\n examples: analysis.recentEvidence.map(e => `${e.type}: ${e.description}`),\n },\n };\n }\n \n /**\n * Get hypothesis by ID\n */\n async getHypothesis(hypothesisId: string): Promise<Hypothesis | undefined> {\n await this.projectState.load();\n return this.projectState.getHypothesis(hypothesisId);\n }\n \n /**\n * Get all hypotheses\n */\n async getAllHypotheses(): Promise<Hypothesis[]> {\n await this.projectState.load();\n return this.projectState.getAllHypotheses();\n }\n \n /**\n * Get validated hypotheses\n */\n async getValidatedHypotheses(): Promise<Hypothesis[]> {\n await this.projectState.load();\n return this.projectState.getValidatedHypotheses();\n }\n \n /**\n * Get hypothesis accuracy stats\n */\n getAccuracy(): number {\n const metrics = this.projectState.getMetrics();\n return metrics.hypothesisAccuracy;\n }\n}\n\n// ============================================================================\n// Singleton Management\n// ============================================================================\n\nconst hypothesisEngines: Map<string, HypothesisEngine> = new Map();\n\n/**\n * Get the HypothesisEngine for a project (singleton per project)\n */\nexport function getHypothesisEngine(projectPath: string): HypothesisEngine {\n let engine = hypothesisEngines.get(projectPath);\n if (!engine) {\n engine = new HypothesisEngine(projectPath);\n hypothesisEngines.set(projectPath, engine);\n }\n return engine;\n}\n\n/**\n * Clear all HypothesisEngine instances (for testing)\n */\nexport function clearHypothesisEngines(): void {\n hypothesisEngines.clear();\n}\n\n/**\n * Gather evidence for a specific hypothesis (manual check from UI)\n */\nexport async function gatherEvidenceForHypothesis(\n hypothesisId: string,\n projectPath: string\n): Promise<Array<{ supports: boolean; description: string; weight: number }>> {\n const engine = getHypothesisEngine(projectPath);\n const projectState = getProjectState(projectPath);\n await projectState.load();\n \n const hypothesis = projectState.getAllHypotheses().find(h => h.id === hypothesisId);\n if (!hypothesis) {\n throw new Error(`Hypothesis ${hypothesisId} not found`);\n }\n \n // Get the analysis - access private method via bracket notation\n const analysis = await (engine as any).analyzeHypothesis(hypothesis);\n \n // Convert evidence to simpler format\n return analysis.recentEvidence.map((e: HypothesisEvidence) => ({\n supports: e.type === 'supporting',\n description: e.description,\n weight: e.weight,\n }));\n}\n"],"mappings":"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","names":["existing"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/project-info.ts","../src/utils/context-state.ts","../src/config/loader.ts","../src/config/validation.ts","../src/bootstrap/stack-detector.ts","../src/bootstrap/files.ts","../src/ingest/linear-ingester.ts"],"sourcesContent":["/**\n * Project Info Manager\n * \n * Manages the .trie/PROJECT.md file that stores user-defined project context.\n * Unlike AGENTS.md (auto-generated), PROJECT.md is fully user-controlled.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from './workspace.js';\n\nconst PROJECT_MD_PATH = 'PROJECT.md';\n\n/**\n * Default PROJECT.md template\n */\nexport function getProjectTemplate(): string {\n return `# Project Information\n\n> This file stores important project context for AI assistants.\n> Edit freely - this file is yours, not auto-generated.\n> Available via MCP resource: \\`trie://project\\`\n\n---\n\n## Project Overview\n\n<!-- Describe your project's purpose and goals -->\n\n[Add project description here]\n\n---\n\n## Technology Stack\n\n<!-- List frameworks, languages, databases, cloud services, etc. -->\n\n- **Language:** \n- **Framework:** \n- **Database:** \n- **Hosting:** \n\n---\n\n## Architecture\n\n<!-- Key patterns, architectural decisions, and system design -->\n\n[Describe your architecture here]\n\n---\n\n## Coding Conventions\n\n<!-- Style guidelines, naming conventions, patterns to follow -->\n\n- \n- \n- \n\n---\n\n## Environment\n\n<!-- URLs, API endpoints, deployment info -->\n\n| Environment | URL | Notes |\n|-------------|-----|-------|\n| Development | | |\n| Staging | | |\n| Production | | |\n\n---\n\n## Team\n\n<!-- Ownership, contacts, responsibilities -->\n\n- **Owner:** \n- **Team:** \n\n---\n\n## Compliance\n\n<!-- HIPAA, SOC2, GDPR, PCI-DSS requirements if applicable -->\n\n- [ ] GDPR\n- [ ] SOC2\n- [ ] HIPAA\n- [ ] PCI-DSS\n\n---\n\n## AI Instructions\n\n<!-- Special instructions for AI assistants working on this project -->\n\nWhen working on this project, AI assistants should:\n\n1. \n2. \n3. \n\n---\n\n*This file is read by Trie agents and exposed via \\`trie://project\\` MCP resource.*\n*Edit this file to provide context to Claude Code, Cursor, GitHub Actions, and other AI tools.*\n`;\n}\n\n/**\n * Check if PROJECT.md exists\n */\nexport function projectInfoExists(workDir?: string): boolean {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const projectPath = join(getTrieDirectory(dir), PROJECT_MD_PATH);\n return existsSync(projectPath);\n}\n\n/**\n * Load PROJECT.md content\n */\nexport async function loadProjectInfo(workDir?: string): Promise<string | null> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const projectPath = join(getTrieDirectory(dir), PROJECT_MD_PATH);\n \n try {\n if (!existsSync(projectPath)) {\n return null;\n }\n return await readFile(projectPath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/**\n * Save PROJECT.md content\n */\nexport async function saveProjectInfo(content: string, workDir?: string): Promise<void> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(dir);\n const projectPath = join(trieDir, PROJECT_MD_PATH);\n \n // Ensure .trie directory exists\n await mkdir(trieDir, { recursive: true });\n \n await writeFile(projectPath, content, 'utf-8');\n}\n\n/**\n * Initialize PROJECT.md with template\n */\nexport async function initProjectInfo(workDir?: string): Promise<{ created: boolean; path: string }> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const projectPath = join(getTrieDirectory(dir), PROJECT_MD_PATH);\n \n if (existsSync(projectPath)) {\n return { created: false, path: projectPath };\n }\n \n await saveProjectInfo(getProjectTemplate(), dir);\n return { created: true, path: projectPath };\n}\n\n/**\n * Get a specific section from PROJECT.md\n */\nexport async function getProjectSection(sectionName: string, workDir?: string): Promise<string | null> {\n const content = await loadProjectInfo(workDir);\n if (!content) return null;\n \n // Find section by header\n const sectionRegex = new RegExp(\n `## ${escapeRegex(sectionName)}\\\\s*\\\\n([\\\\s\\\\S]*?)(?=\\\\n## |\\\\n---\\\\s*$|$)`,\n 'i'\n );\n \n const match = content.match(sectionRegex);\n if (match?.[1]) {\n return match[1].trim();\n }\n \n return null;\n}\n\n/**\n * Update a specific section in PROJECT.md\n */\nexport async function updateProjectSection(\n sectionName: string, \n newContent: string, \n workDir?: string\n): Promise<boolean> {\n let content = await loadProjectInfo(workDir);\n \n if (!content) {\n // Initialize with template first\n await initProjectInfo(workDir);\n content = await loadProjectInfo(workDir);\n if (!content) return false;\n }\n \n // Find and replace section content\n const sectionRegex = new RegExp(\n `(## ${escapeRegex(sectionName)}\\\\s*\\\\n)([\\\\s\\\\S]*?)((?=\\\\n## )|(?=\\\\n---\\\\s*$)|$)`,\n 'i'\n );\n \n if (content.match(sectionRegex)) {\n const updatedContent = content.replace(sectionRegex, `$1\\n${newContent}\\n\\n$3`);\n await saveProjectInfo(updatedContent, workDir);\n return true;\n }\n \n return false;\n}\n\n/**\n * Append content to a section\n */\nexport async function appendToSection(\n sectionName: string,\n contentToAdd: string,\n workDir?: string\n): Promise<boolean> {\n const currentContent = await getProjectSection(sectionName, workDir);\n if (currentContent === null) return false;\n \n const newContent = currentContent + '\\n' + contentToAdd;\n return updateProjectSection(sectionName, newContent, workDir);\n}\n\n/**\n * Get all section names from PROJECT.md\n */\nexport async function getProjectSections(workDir?: string): Promise<string[]> {\n const content = await loadProjectInfo(workDir);\n if (!content) return [];\n \n const sectionRegex = /^## (.+)$/gm;\n const sections: string[] = [];\n let match;\n \n while ((match = sectionRegex.exec(content)) !== null) {\n if (match[1]) {\n sections.push(match[1].trim());\n }\n }\n \n return sections;\n}\n\n/**\n * Get project info as structured data (for JSON responses)\n */\nexport async function getProjectInfoStructured(workDir?: string): Promise<{\n exists: boolean;\n path: string;\n sections: Record<string, string>;\n raw: string | null;\n}> {\n const dir = workDir || getWorkingDirectory(undefined, true);\n const projectPath = join(getTrieDirectory(dir), PROJECT_MD_PATH);\n const content = await loadProjectInfo(dir);\n \n if (!content) {\n return {\n exists: false,\n path: projectPath,\n sections: {},\n raw: null,\n };\n }\n \n const sectionNames = await getProjectSections(dir);\n const sections: Record<string, string> = {};\n \n for (const name of sectionNames) {\n const sectionContent = await getProjectSection(name, dir);\n if (sectionContent) {\n sections[name] = sectionContent;\n }\n }\n \n return {\n exists: true,\n path: projectPath,\n sections,\n raw: content,\n };\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * Context State Manager\n * \n * Manages the .trie/AGENTS.md file that provides context to AI coding assistants.\n * Updates automatically when agents run to keep context current.\n * Also integrates with issue memory and cross-project tracking.\n * \n * Phase 1 Hardening:\n * - Atomic writes to prevent corruption\n */\n\nimport { readFile, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join, basename } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from './workspace.js';\nimport type { AgentResult } from '../types/index.js';\nimport type { SkillRecord } from '../types/external-skill.js';\nimport { loadProjectInfo, projectInfoExists } from './project-info.js';\nimport { storeIssues, autoResolveIssues, getIssueHash } from '../memory/issue-store.js';\nimport { recordToGlobalMemory, updateGlobalMemoryMd } from '../memory/global-memory.js';\nimport { atomicWriteJSON, atomicWriteFile } from './atomic-write.js';\n\nexport interface ScanSummary {\n timestamp: string;\n agents: string[];\n filesScanned: number;\n issues: {\n critical: number;\n serious: number;\n moderate: number;\n low: number;\n total: number;\n };\n duration: number;\n hotFiles: Array<{ file: string; issueCount: number }>;\n}\n\nexport interface ContextState {\n lastScan: ScanSummary | null;\n activePriorities: string[];\n contextSignals: Record<string, boolean>;\n agentStatus: Record<string, {\n lastRun: string | null;\n issuesFound: number;\n skillsApplied?: string[];\n }>;\n scanHistory: ScanSummary[];\n customAgents: string[];\n skills: Record<string, SkillRecord>;\n environment?: string;\n}\n\nconst AGENTS_MD_PATH = 'AGENTS.md';\nconst STATE_JSON_PATH = 'state.json';\n\n/**\n * Load current context state\n */\nexport async function loadContextState(): Promise<ContextState> {\n const workDir = getWorkingDirectory(undefined, true);\n const statePath = join(getTrieDirectory(workDir), STATE_JSON_PATH);\n const defaults = getDefaultState();\n \n try {\n if (existsSync(statePath)) {\n const content = await readFile(statePath, 'utf-8');\n const loaded = JSON.parse(content);\n const { healthScore: _dropped, ...loadedRest } = loaded;\n // Merge with defaults to ensure new fields exist (omit legacy healthScore)\n return {\n ...defaults,\n ...loadedRest,\n skills: loaded.skills || defaults.skills,\n };\n }\n } catch {\n // Return default state\n }\n \n return defaults;\n}\n\n/**\n * Save context state using atomic write\n */\nexport async function saveContextState(state: ContextState): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(workDir);\n const statePath = join(trieDir, STATE_JSON_PATH);\n \n // Ensure directory exists\n await mkdir(trieDir, { recursive: true });\n \n // Use atomic write to prevent corruption\n await atomicWriteJSON(statePath, state);\n}\n\n/**\n * Update context state after a scan\n */\nexport async function updateContextAfterScan(\n results: AgentResult[],\n filesScanned: number,\n contextSignals: Record<string, boolean>,\n duration: number,\n scannedFiles?: string[]\n): Promise<void> {\n const state = await loadContextState();\n const workDir = getWorkingDirectory(undefined, true);\n const now = new Date().toISOString();\n \n // Calculate issue counts\n const allIssues = results.flatMap(r => r.issues);\n const issueCounts = {\n critical: allIssues.filter(i => i.severity === 'critical').length,\n serious: allIssues.filter(i => i.severity === 'serious').length,\n moderate: allIssues.filter(i => i.severity === 'moderate').length,\n low: allIssues.filter(i => i.severity === 'low').length,\n total: allIssues.length,\n };\n \n // Find hot files\n const fileIssueMap = new Map<string, number>();\n for (const issue of allIssues) {\n const count = fileIssueMap.get(issue.file) || 0;\n fileIssueMap.set(issue.file, count + 1);\n }\n const hotFiles = Array.from(fileIssueMap.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([file, issueCount]) => ({ file, issueCount }));\n \n // Create scan summary\n const scanSummary: ScanSummary = {\n timestamp: now,\n agents: results.map(r => r.agent),\n filesScanned,\n issues: issueCounts,\n duration,\n hotFiles,\n };\n \n // Update agent status\n for (const result of results) {\n state.agentStatus[result.agent] = {\n lastRun: now,\n issuesFound: result.issues.length,\n };\n }\n \n // Update priorities based on issues\n state.activePriorities = generatePriorities(issueCounts, contextSignals);\n \n // Update context signals\n state.contextSignals = { ...state.contextSignals, ...contextSignals };\n \n // Update scan history (keep last 20)\n state.scanHistory = [scanSummary, ...state.scanHistory.slice(0, 19)];\n state.lastScan = scanSummary;\n \n // Save state\n await saveContextState(state);\n \n // Update AGENTS.md\n await updateAgentsMd(state);\n \n // Store issues to memory\n const projectName = basename(workDir);\n if (allIssues.length > 0) {\n try {\n await storeIssues(allIssues, projectName, workDir);\n await recordToGlobalMemory(allIssues, projectName, workDir);\n await updateGlobalMemoryMd();\n } catch {\n // Memory storage is non-critical, don't fail the scan\n }\n }\n \n // Auto-resolve issues that are no longer detected in scanned files\n if (scannedFiles && scannedFiles.length > 0) {\n try {\n // Build set of hashes from current scan\n const currentHashes = new Set(allIssues.map(issue => getIssueHash(issue)));\n const { resolved } = await autoResolveIssues(currentHashes, scannedFiles, workDir);\n if (resolved > 0) {\n // Log auto-resolution in non-interactive mode\n const { isInteractiveMode } = await import('./progress.js');\n if (!isInteractiveMode()) {\n console.error(` ✓ Auto-resolved ${resolved} issue${resolved > 1 ? 's' : ''} no longer detected`);\n }\n }\n } catch {\n // Auto-resolution is non-critical\n }\n }\n}\n\n/**\n * Update the AGENTS.md file with current state\n */\nasync function updateAgentsMd(state: ContextState): Promise<void> {\n const workDir = getWorkingDirectory(undefined, true);\n const mdPath = join(getTrieDirectory(workDir), AGENTS_MD_PATH);\n \n let content: string;\n try {\n content = await readFile(mdPath, 'utf-8');\n } catch {\n // Use template if file doesn't exist\n content = getAgentsMdTemplate();\n }\n \n // Update sections\n content = updateSection(content, 'Project State', generateProjectStateTable(state));\n content = updateSection(content, 'Active Priorities', generatePrioritiesList(state));\n content = updateSection(content, 'Agent Status', generateAgentStatusTable(state));\n content = updateSection(content, 'Recent Scan History', generateScanHistoryTable(state));\n content = updateSection(content, 'Context Signals Detected', generateContextSignals(state));\n content = updateSection(content, 'Risk Assessment', generateRiskAssessment(state));\n content = updateSection(content, 'Hot Files', generateHotFilesSection(state));\n \n // Update last updated timestamp\n content = content.replace(\n /Last updated:.*$/m,\n `Last updated: ${new Date().toISOString()}`\n );\n \n // Use atomic write to prevent corruption\n await atomicWriteFile(mdPath, content);\n}\n\n/**\n * Update a specific section in the markdown\n */\nfunction updateSection(content: string, sectionName: string, newContent: string): string {\n // Look for the section header and replace content until the next section\n const sectionRegex = new RegExp(\n `(### ${sectionName}[\\\\s\\\\S]*?)(?=###|---|\\n## |$)`,\n 'g'\n );\n \n const replacement = `### ${sectionName}\\n${newContent}\\n\\n`;\n \n if (content.match(sectionRegex)) {\n return content.replace(sectionRegex, replacement);\n }\n \n // Section doesn't exist, don't add it\n return content;\n}\n\n/**\n * Generate the project state table\n */\nfunction generateProjectStateTable(state: ContextState): string {\n const lastScan = state.lastScan;\n const lastScanDate = lastScan ? new Date(lastScan.timestamp).toLocaleString() : 'Never';\n const criticalCount = lastScan?.issues.critical ?? 0;\n const totalTasks = lastScan?.issues.total ?? 0;\n \n return `| Metric | Value | Updated |\n|--------|-------|---------|\n| Last Scan | ${lastScanDate} | ${lastScan ? 'Auto' : '-'} |\n| Critical Issues | ${criticalCount} | ${lastScan ? 'Auto' : '-'} |\n| Open Tasks | ${totalTasks} | ${lastScan ? 'Auto' : '-'} |`;\n}\n\n/**\n * Generate priorities list\n */\nfunction generatePrioritiesList(state: ContextState): string {\n if (state.activePriorities.length === 0) {\n return '_No active priorities. Run a scan to identify issues._';\n }\n \n return state.activePriorities\n .map((p, i) => `${i + 1}. ${p}`)\n .join('\\n');\n}\n\n/**\n * Generate priorities based on scan results\n */\nfunction generatePriorities(\n issues: { critical: number; serious: number; moderate: number; low: number },\n contextSignals: Record<string, boolean>\n): string[] {\n const priorities: string[] = [];\n \n if (issues.critical > 0) {\n priorities.push(`Fix ${issues.critical} critical security issue${issues.critical > 1 ? 's' : ''} immediately`);\n }\n \n if (issues.serious > 0) {\n priorities.push(`Address ${issues.serious} serious issue${issues.serious > 1 ? 's' : ''} before deployment`);\n }\n \n if (contextSignals.touchesAuth && issues.critical === 0) {\n priorities.push('Auth code reviewed - continue monitoring');\n }\n \n if (contextSignals.touchesPayments) {\n priorities.push('💳 Payment code detected - ensure PCI compliance');\n }\n \n if (issues.moderate > 5) {\n priorities.push(`Schedule time to address ${issues.moderate} moderate issues`);\n }\n \n if (priorities.length === 0) {\n priorities.push('No critical issues - focus on feature development');\n }\n \n return priorities.slice(0, 5);\n}\n\n/**\n * Generate agent status table\n */\nfunction generateAgentStatusTable(state: ContextState): string {\n const builtInAgents = [\n 'security', 'legal', 'accessibility', 'bugs',\n 'design', 'architecture', 'performance', 'devops', 'soc2',\n 'e2e', 'typecheck', 'visual-qa', 'data-flow'\n ];\n \n let table = `| Agent | Status | Last Run | Issues Found |\n|-------|--------|----------|--------------|`;\n \n for (const agent of builtInAgents) {\n const status = state.agentStatus[agent];\n const lastRun = status?.lastRun \n ? new Date(status.lastRun).toLocaleDateString()\n : 'Never';\n const issues = status?.issuesFound ?? '-';\n const statusEmoji = status ? '✅' : '⏸️';\n \n table += `\\n| ${agent} | ${statusEmoji} Ready | ${lastRun} | ${issues} |`;\n }\n \n return table;\n}\n\n/**\n * Generate scan history table\n */\nfunction generateScanHistoryTable(state: ContextState): string {\n if (state.scanHistory.length === 0) {\n return `| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|\n| - | - | - | - | - |`;\n }\n \n let table = `| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|`;\n \n for (const scan of state.scanHistory.slice(0, 10)) {\n const date = new Date(scan.timestamp).toLocaleDateString();\n const agents = scan.agents.slice(0, 3).join(', ') + (scan.agents.length > 3 ? '...' : '');\n const duration = `${(scan.duration / 1000).toFixed(1)}s`;\n \n table += `\\n| ${date} | ${agents} | ${scan.filesScanned} | ${scan.issues.total} | ${duration} |`;\n }\n \n return table;\n}\n\n/**\n * Generate context signals section\n */\nfunction generateContextSignals(state: ContextState): string {\n const signals = [\n 'touchesAuth',\n 'touchesPayments', \n 'touchesUserData',\n 'touchesAPI',\n 'touchesDatabase',\n 'touchesCrypto'\n ];\n \n return signals\n .map(s => {\n const value = state.contextSignals[s];\n const emoji = value === true ? '✅' : value === false ? '❌' : '❓';\n return `- \\`${s}\\`: ${emoji} ${value === undefined ? 'Unknown' : value ? 'Yes' : 'No'}`;\n })\n .join('\\n');\n}\n\n/**\n * Generate risk assessment section\n */\nfunction generateRiskAssessment(state: ContextState): string {\n if (state.lastScan === null) {\n return `- Overall Risk: Unknown\n- Confidence: 0%`;\n }\n\n const { critical, serious, total } = state.lastScan.issues;\n let riskLevel: string;\n let confidence: number;\n\n if (critical > 0) {\n riskLevel = '🔴 Critical';\n confidence = 90;\n } else if (serious > 2 || total > 20) {\n riskLevel = '🟠 High';\n confidence = 80;\n } else if (serious > 0 || total > 10) {\n riskLevel = '🟡 Medium';\n confidence = 85;\n } else {\n riskLevel = '🟢 Low';\n confidence = 95;\n }\n\n return `- Overall Risk: ${riskLevel}\n- Confidence: ${confidence}%`;\n}\n\n/**\n * Generate hot files section\n */\nfunction generateHotFilesSection(state: ContextState): string {\n if (!state.lastScan || state.lastScan.hotFiles.length === 0) {\n return '_Run a scan to identify hot files._';\n }\n \n return state.lastScan.hotFiles\n .map(f => `- \\`${f.file}\\` - ${f.issueCount} issue${f.issueCount > 1 ? 's' : ''}`)\n .join('\\n');\n}\n\n/**\n * Get default state\n */\nfunction getDefaultState(): ContextState {\n return {\n lastScan: null,\n activePriorities: [\n 'Initial setup required - run first scan with `trie scan`',\n 'Configure agents in `.trie/config.json`',\n 'Set up CI/CD integration'\n ],\n contextSignals: {},\n agentStatus: {},\n scanHistory: [],\n customAgents: [],\n skills: {},\n environment: detectEnvironment(),\n };\n}\n\n/**\n * Detect the current execution environment\n */\nexport function detectEnvironment(): string {\n if (process.env.GITHUB_ACTIONS) return 'github-actions';\n if (process.env.GITLAB_CI) return 'gitlab-ci';\n if (process.env.CI) return 'ci';\n const parent = process.env._ || '';\n if (parent.includes('cursor')) return 'cursor';\n if (parent.includes('claude')) return 'claude-code';\n return 'cli';\n}\n\n/**\n * Record skill installation in context state\n */\nexport async function recordSkillInstalled(params: {\n name: string;\n source: string;\n}): Promise<void> {\n const state = await loadContextState();\n state.skills[params.name] = {\n source: params.source,\n installedAt: new Date().toISOString(),\n timesApplied: 0,\n appliedBy: [],\n };\n await saveContextState(state);\n}\n\n/**\n * Record skill usage by an agent\n */\nexport async function recordSkillUsage(params: {\n skillNames: string[];\n agentName: string;\n}): Promise<void> {\n const state = await loadContextState();\n const now = new Date().toISOString();\n \n for (const skillName of params.skillNames) {\n const skillRecord = state.skills[skillName];\n if (skillRecord) {\n skillRecord.timesApplied++;\n skillRecord.lastApplied = now;\n if (!skillRecord.appliedBy.includes(params.agentName)) {\n skillRecord.appliedBy.push(params.agentName);\n }\n }\n }\n \n const agentStatus = state.agentStatus[params.agentName];\n if (agentStatus) {\n agentStatus.skillsApplied = params.skillNames;\n }\n \n await saveContextState(state);\n}\n\n/**\n * Get the AGENTS.md template\n */\nfunction getAgentsMdTemplate(): string {\n return `# Trie Agent Context\n\n> **Auto-generated file** - Updated automatically when agents run.\n> Last updated: Never (initial state)\n\nThis file provides prioritized context for all AI coding assistants working with this codebase.\nAgents should read this file first and update it after completing scans.\n\n---\n\n## Quick Context (Read First)\n\n### Project State\n| Metric | Value | Updated |\n|--------|-------|---------|\n| Last Scan | Never | - |\n| Critical Issues | 0 | - |\n| Open Tasks | 0 | - |\n| Health Score | Unknown | - |\n\n### Active Priorities\n1. Initial setup required - run first scan with \\`trie scan\\`\n2. Configure agents in \\`.trie/config.json\\`\n3. Set up CI/CD integration\n\n### Hot Files\n_Run a scan to identify hot files._\n\n---\n\n## Agent Status\n\n### Agent Status\n| Agent | Status | Last Run | Issues Found |\n|-------|--------|----------|--------------|\n| security | Ready | Never | - |\n| bugs | Ready | Never | - |\n\n### Recent Scan History\n| Date | Agents | Files | Issues | Duration |\n|------|--------|-------|--------|----------|\n| - | - | - | - | - |\n\n---\n\n## Context Analysis\n\n### Context Signals Detected\n- \\`touchesAuth\\`: Unknown\n- \\`touchesPayments\\`: Unknown\n- \\`touchesUserData\\`: Unknown\n- \\`touchesAPI\\`: Unknown\n- \\`touchesDatabase\\`: Unknown\n- \\`touchesCrypto\\`: Unknown\n\n### Risk Assessment\n- Overall Risk: Unknown\n- Confidence: 0%\n\n---\n\n*This file is maintained by Trie agents. Manual edits will be preserved in non-auto sections.*\n`;\n}\n\n/**\n * Add custom skill to context state\n */\nexport async function addCustomAgentToContext(agentName: string): Promise<void> {\n const state = await loadContextState();\n \n if (!state.customAgents.includes(agentName)) {\n state.customAgents.push(agentName);\n await saveContextState(state);\n }\n}\n\n/**\n * Get context state for AI assistants (formatted summary)\n */\nexport async function getContextForAI(): Promise<string> {\n const state = await loadContextState();\n const workDir = getWorkingDirectory(undefined, true);\n \n const lines: string[] = [];\n \n // Include PROJECT.md content first (user-defined context takes priority)\n if (projectInfoExists(workDir)) {\n const projectInfo = await loadProjectInfo(workDir);\n if (projectInfo) {\n lines.push(projectInfo);\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n }\n \n // Add Trie scan context\n lines.push(\n '## Trie Scan Context',\n '',\n `**Last Scan:** ${state.lastScan ? new Date(state.lastScan.timestamp).toLocaleString() : 'Never'}`,\n '',\n '**Active Priorities:**',\n ...state.activePriorities.map(p => `- ${p}`),\n ''\n );\n \n if (state.lastScan) {\n lines.push(\n '**Recent Issues:**',\n `- Critical: ${state.lastScan.issues.critical}`,\n `- Serious: ${state.lastScan.issues.serious}`,\n `- Moderate: ${state.lastScan.issues.moderate}`,\n `- Low: ${state.lastScan.issues.low}`,\n ''\n );\n \n if (state.lastScan.hotFiles.length > 0) {\n lines.push(\n '**Hot Files (most issues):**',\n ...state.lastScan.hotFiles.slice(0, 5).map(f => `- ${f.file}: ${f.issueCount} issues`),\n ''\n );\n }\n }\n \n return lines.join('\\n');\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, mkdirSync } 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 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}","/**\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', 'bugs'],\n dependencies: new Set(),\n };\n\n // Detect language\n if (existsSync(join(projectDir, 'tsconfig.json'))) {\n stack.language = 'TypeScript';\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 }\n } catch {\n // package.json parsing failed\n }\n\n // Database from other sources\n if (!stack.database) {\n if (existsSync(join(projectDir, 'prisma', 'schema.prisma'))) {\n stack.database = 'Prisma ORM';\n } else if (existsSync(join(projectDir, 'drizzle.config.ts'))) {\n stack.database = 'Drizzle ORM';\n }\n }\n\n // Deduplicate\n stack.suggestedSkills = [...new Set(stack.suggestedSkills)];\n stack.suggestedAgents = [...new Set(stack.suggestedAgents)];\n\n return stack;\n}\n\n/**\n * Get skills for a specific category\n */\nexport function getSkillsByCategory(category: string): string[] {\n return SKILL_CATEGORIES[category] || [];\n}\n\n/**\n * Get all available skill categories\n */\nexport function getSkillCategories(): { name: string; count: number }[] {\n return Object.entries(SKILL_CATEGORIES).map(([name, skills]) => ({\n name,\n count: skills.length,\n }));\n}\n\n/**\n * Get project dependencies from package.json\n */\nexport async function getProjectDependencies(projectDir: string): Promise<Set<string>> {\n try {\n const pkgPath = join(projectDir, 'package.json');\n if (!existsSync(pkgPath)) {\n return new Set();\n }\n \n const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));\n return new Set([\n ...Object.keys(pkg.dependencies || {}),\n ...Object.keys(pkg.devDependencies || {}),\n ]);\n } catch {\n return new Set();\n }\n}\n","/**\n * Bootstrap File System\n * \n * Manages workspace files that inject context at scan start.\n * Files: BOOTSTRAP.md, RULES.md, TEAM.md\n */\n\nimport { readFile, writeFile, unlink, mkdir } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { getWorkingDirectory, getTrieDirectory } from '../utils/workspace.js';\nimport { detectStack, type DetectedStack } from './stack-detector.js';\n\nexport interface BootstrapFile {\n name: string;\n path: string;\n type: 'user' | 'auto' | 'one-time';\n exists: boolean;\n content?: string;\n}\n\nexport interface BootstrapContext {\n files: BootstrapFile[];\n injectedContent: string;\n needsBootstrap: boolean;\n}\n\ninterface BootstrapFileSpec {\n name: string;\n type: 'user' | 'auto' | 'one-time';\n description: string;\n}\n\nconst BOOTSTRAP_FILES: BootstrapFileSpec[] = [\n { name: 'PROJECT.md', type: 'user', description: 'Project overview and conventions' },\n { name: 'RULES.md', type: 'user', description: 'Coding standards agents enforce' },\n { name: 'TEAM.md', type: 'user', description: 'Team ownership and escalation' },\n { name: 'BOOTSTRAP.md', type: 'one-time', description: 'First-run setup (deleted after)' },\n { name: 'AGENTS.md', type: 'auto', description: 'Auto-generated scan context' },\n];\n\n/**\n * Load bootstrap files and inject into agent context\n */\nexport async function loadBootstrapContext(workDir?: string): Promise<BootstrapContext> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(projectDir);\n const files: BootstrapFile[] = [];\n const contentParts: string[] = [];\n let needsBootstrap = false;\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n \n if (file.name === 'BOOTSTRAP.md' && exists) {\n needsBootstrap = true;\n }\n \n let content: string | undefined;\n if (exists) {\n try {\n content = await readFile(filePath, 'utf-8');\n if (content.trim() && file.type !== 'one-time') {\n contentParts.push(`<!-- ${file.name} -->\\n${content}`);\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n const fileEntry: BootstrapFile = {\n name: file.name,\n path: filePath,\n type: file.type,\n exists,\n };\n if (content) fileEntry.content = content;\n files.push(fileEntry);\n }\n\n return {\n files,\n injectedContent: contentParts.join('\\n\\n---\\n\\n'),\n needsBootstrap,\n };\n}\n\n/**\n * Initialize bootstrap files for a new project\n */\nexport async function initializeBootstrapFiles(options: {\n workDir?: string;\n force?: boolean;\n skipBootstrap?: boolean;\n} = {}): Promise<{ created: string[]; skipped: string[]; stack: DetectedStack }> {\n const projectDir = options.workDir || getWorkingDirectory(undefined, true);\n const trieDir = getTrieDirectory(projectDir);\n await mkdir(trieDir, { recursive: true });\n\n const created: string[] = [];\n const skipped: string[] = [];\n\n const stack = await detectStack(projectDir);\n\n for (const file of BOOTSTRAP_FILES) {\n const filePath = join(trieDir, file.name);\n const exists = existsSync(filePath);\n\n if (exists && !options.force) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'BOOTSTRAP.md' && options.skipBootstrap) {\n skipped.push(file.name);\n continue;\n }\n\n if (file.name === 'AGENTS.md') {\n skipped.push(file.name);\n continue;\n }\n\n const template = getFileTemplate(file.name, stack);\n if (template) {\n await writeFile(filePath, template);\n created.push(file.name);\n }\n }\n\n return { created, skipped, stack };\n}\n\n/**\n * Mark bootstrap as complete (delete BOOTSTRAP.md)\n */\nexport async function completeBootstrap(workDir?: string): Promise<boolean> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(getTrieDirectory(projectDir), 'BOOTSTRAP.md');\n\n try {\n await unlink(bootstrapPath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if bootstrap is needed (BOOTSTRAP.md exists)\n */\nexport function needsBootstrap(workDir?: string): boolean {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const bootstrapPath = join(getTrieDirectory(projectDir), 'BOOTSTRAP.md');\n return existsSync(bootstrapPath);\n}\n\n/**\n * Get rules from RULES.md\n */\nexport async function loadRules(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const rulesPath = join(getTrieDirectory(projectDir), 'RULES.md');\n \n try {\n if (existsSync(rulesPath)) {\n return await readFile(rulesPath, 'utf-8');\n }\n } catch {\n // Rules file doesn't exist or can't be read\n }\n \n return null;\n}\n\n/**\n * Get team info from TEAM.md\n */\nexport async function loadTeamInfo(workDir?: string): Promise<string | null> {\n const projectDir = workDir || getWorkingDirectory(undefined, true);\n const teamPath = join(getTrieDirectory(projectDir), 'TEAM.md');\n \n try {\n if (existsSync(teamPath)) {\n return await readFile(teamPath, 'utf-8');\n }\n } catch {\n // Team file doesn't exist or can't be read\n }\n \n return null;\n}\n\nfunction getFileTemplate(fileName: string, stack: DetectedStack): string | null {\n switch (fileName) {\n case 'PROJECT.md':\n return getProjectTemplate(stack);\n case 'RULES.md':\n return getRulesTemplate(stack);\n case 'TEAM.md':\n return getTeamTemplate();\n case 'BOOTSTRAP.md':\n return getBootstrapTemplate(stack);\n default:\n return null;\n }\n}\n\nfunction getProjectTemplate(stack: DetectedStack): string {\n const lines: string[] = ['# Project Overview', '', '> Define your project context here. AI assistants read this first.', ''];\n \n lines.push('## Description', '', '[Describe what this project does and who it\\'s for]', '');\n \n lines.push('## Technology Stack', '');\n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n if (!stack.framework && !stack.language && !stack.database) {\n lines.push('[Add your technology stack]');\n }\n lines.push('');\n \n lines.push('## Architecture', '', '[Key patterns and design decisions]', '');\n lines.push('## Coding Conventions', '', '[Style rules agents should follow]', '');\n lines.push('## AI Instructions', '', 'When working on this project:', '1. [Instruction 1]', '2. [Instruction 2]', '3. [Instruction 3]', '');\n lines.push('---', '', '*Edit this file to provide project context to AI assistants.*');\n \n return lines.join('\\n');\n}\n\nfunction getRulesTemplate(stack: DetectedStack): string {\n const packageManager = stack.packageManager || 'npm';\n \n return `# Project Rules\n\n> These rules are enforced by Trie agents during scans.\n> Violations appear as issues with [RULES] prefix.\n\n## Code Style\n\n1. Use named exports, not default exports\n2. Prefer \\`${packageManager}\\` for package management\n3. Maximum file length: 300 lines\n4. Use TypeScript strict mode\n\n## Testing Requirements\n\n1. Critical paths require unit tests\n2. API endpoints require integration tests\n3. Minimum coverage: 70%\n\n## Security Rules\n\n1. Never log sensitive data (passwords, tokens, PII)\n2. All API routes require authentication\n3. Rate limiting required on public endpoints\n4. SQL queries must use parameterized statements\n\n## Review Requirements\n\n1. All PRs require at least 1 reviewer\n2. Security-sensitive changes require security review\n3. Database migrations require review\n\n---\n\n*Edit this file to define your project's coding standards.*\n`;\n}\n\nfunction getTeamTemplate(): string {\n return `# Team Structure\n\n## Code Ownership\n\n| Area | Owner | Backup | Review Required |\n|------|-------|--------|-----------------|\n| \\`/src/api/\\` | @backend-team | - | 1 approver |\n| \\`/src/ui/\\` | @frontend-team | - | 1 approver |\n| \\`/src/auth/\\` | @security-team | - | Security review |\n\n## Escalation\n\n| Severity | First Contact | Escalate To | SLA |\n|----------|--------------|-------------|-----|\n| Critical | Team lead | CTO | 1 hour |\n| Serious | PR reviewer | Team lead | 4 hours |\n| Moderate | Self-serve | - | 1 day |\n\n## Contacts\n\n- **Security:** [email/slack]\n- **Privacy:** [email/slack]\n- **Emergencies:** [phone/pager]\n\n---\n\n*Edit this file to define your team structure.*\n`;\n}\n\nfunction getBootstrapTemplate(stack: DetectedStack): string {\n const skillCommands = stack.suggestedSkills\n .map(s => `trie skills add ${s}`)\n .join('\\n');\n\n const agentList = stack.suggestedAgents.join(', ');\n\n const lines: string[] = [\n '# Trie Bootstrap Checklist',\n '',\n 'This file guides your first scan setup. **Delete when complete.**',\n '',\n '## Auto-Detected Stack',\n '',\n 'Based on your project, Trie detected:',\n ];\n \n if (stack.framework) lines.push(`- **Framework:** ${stack.framework}`);\n if (stack.language) lines.push(`- **Language:** ${stack.language}`);\n if (stack.database) lines.push(`- **Database:** ${stack.database}`);\n if (stack.auth) lines.push(`- **Auth:** ${stack.auth}`);\n \n lines.push('', '## Recommended Actions', '', '### 1. Skills to Install', 'Based on your stack, consider installing:', '```bash');\n lines.push(skillCommands || '# No specific skills detected - browse https://skills.sh');\n lines.push('```', '', '### 2. Agents to Enable', `Your stack suggests these agents: ${agentList || 'security, bugs'}`, '');\n lines.push('### 3. Configure Rules', 'Add your coding standards to `.trie/RULES.md`.', '');\n lines.push('### 4. Run First Scan', '```bash', 'trie scan', '```', '');\n lines.push('---', '', '**Delete this file after completing setup.** Run:', '```bash', 'rm .trie/BOOTSTRAP.md', '```');\n \n return lines.join('\\n');\n}\n","import { loadConfig } from '../config/loader.js';\nimport { ContextGraph } from '../context/graph.js';\nimport type { LinearTicketNodeData } from '../context/nodes.js';\n\nexport interface LinearTicket {\n id: string;\n identifier: string;\n title: string;\n description: string;\n priority: number;\n status: { name: string };\n assignee?: { name: string };\n labels: { nodes: { name: string }[] };\n createdAt: string;\n updatedAt: string;\n}\n\nexport class LinearIngester {\n private readonly graph: ContextGraph;\n\n constructor(_projectPath: string, graph: ContextGraph) {\n this.graph = graph;\n }\n\n async syncTickets(): Promise<void> {\n const apiKey = await this.getApiKey();\n if (!apiKey) {\n console.warn('Linear API key not found. Run \"trie linear auth <key>\" to enable ticket sync.');\n return;\n }\n\n const tickets = await this.fetchActiveTickets(apiKey);\n for (const ticket of tickets) {\n await this.ingestTicket(ticket);\n }\n }\n\n private async getApiKey(): Promise<string | null> {\n const config = await loadConfig();\n return (config.apiKeys as any)?.linear || process.env.LINEAR_API_KEY || null;\n }\n\n private async fetchActiveTickets(apiKey: string): Promise<LinearTicket[]> {\n const query = `\n query {\n issues(filter: { state: { type: { in: [\"started\", \"unstarted\"] } } }) {\n nodes {\n id\n identifier\n title\n description\n priority\n status {\n name\n }\n assignee {\n name\n }\n labels {\n nodes {\n name\n }\n }\n createdAt\n updatedAt\n }\n }\n }\n `;\n\n const response = await fetch('https://api.linear.app/graphql', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': apiKey,\n },\n body: JSON.stringify({ query }),\n });\n\n if (!response.ok) {\n throw new Error(`Linear API error: ${response.statusText}`);\n }\n\n const data = (await response.json()) as any;\n return data.data.issues.nodes as LinearTicket[];\n }\n\n private async ingestTicket(ticket: LinearTicket): Promise<void> {\n const labels = ticket.labels.nodes.map(l => l.name);\n const intentVibe = this.extractIntentVibes(ticket.title, ticket.description, labels);\n \n // Attempt to find linked files in description or via labels (heuristic)\n const linkedFiles = this.extractLinkedFiles(ticket.description);\n\n const data: LinearTicketNodeData = {\n ticketId: ticket.identifier,\n title: ticket.title,\n description: ticket.description || '',\n priority: this.mapPriority(ticket.priority),\n labels,\n intentVibe,\n linkedFiles,\n status: ticket.status.name,\n assignee: ticket.assignee?.name || null,\n createdAt: ticket.createdAt,\n updatedAt: ticket.updatedAt,\n };\n\n await this.graph.addNode('linear-ticket', data);\n\n // Link to files if found\n for (const file of linkedFiles) {\n const fileNode = await this.graph.getNode('file', file); // Use ID (path)\n if (fileNode) {\n await this.graph.addEdge(`linear:${ticket.identifier}`, fileNode.id, 'relatedTo');\n }\n }\n }\n\n private extractIntentVibes(title: string, description: string, labels: string[]): string[] {\n const vibes = new Set<string>();\n const text = (title + ' ' + (description || '') + ' ' + labels.join(' ')).toLowerCase();\n\n if (text.includes('performance') || text.includes('slow') || text.includes('optimize')) vibes.add('performance');\n if (text.includes('security') || text.includes('auth') || text.includes('vulnerability')) vibes.add('security');\n if (text.includes('refactor') || text.includes('cleanup') || text.includes('debt')) vibes.add('refactor');\n if (text.includes('feature') || text.includes('new')) vibes.add('feature');\n if (text.includes('bug') || text.includes('fix') || text.includes('broken')) vibes.add('bug');\n if (text.includes('breaking') || text.includes('major change')) vibes.add('breaking-change');\n\n return Array.from(vibes);\n }\n\n private extractLinkedFiles(description: string): string[] {\n if (!description) return [];\n const matches = description.match(/[\\\\w./_-]+\\\\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs)/gi);\n if (!matches) return [];\n return Array.from(new Set(matches.map(m => m.replace(/^\\.\\/+/, ''))));\n }\n\n private mapPriority(priority: number): string {\n switch (priority) {\n case 1: return 'urgent';\n case 2: return 'high';\n case 3: return 'medium';\n case 4: return 'low';\n default: return 'none';\n }\n }\n}\n"],"mappings":"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","names":["readFile","mkdir","existsSync","join","join","existsSync","readFile","readFile","writeFile","mkdir","existsSync","join","existsSync","join","join","existsSync","join","existsSync","readFile","mkdir","writeFile","readFile","existsSync","join","readFile","writeFile","mkdir","existsSync","join","needsBootstrap","join","existsSync","readFile","mkdir","writeFile","getProjectTemplate"]}
|