@triedotdev/mcp 1.0.119 → 1.0.121

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.
@@ -3,7 +3,7 @@ import {
3
3
  InteractiveDashboard,
4
4
  StreamingManager,
5
5
  TrieScanTool
6
- } from "../chunk-GSYMJLZY.js";
6
+ } from "../chunk-7BY2KVIN.js";
7
7
  import "../chunk-5TQ7J7UI.js";
8
8
  import "../chunk-IQBHPTV7.js";
9
9
  import "../chunk-GPLRFTMB.js";
@@ -64,6 +64,7 @@ async function checkFilesForGoalViolations(goals, projectPath, filesToCheck) {
64
64
  files = filesToCheck;
65
65
  } else {
66
66
  const { execSync } = await import("child_process");
67
+ const { glob } = await import("glob");
67
68
  try {
68
69
  const gitOutput = execSync(
69
70
  "git diff --name-only HEAD && git ls-files --modified && git ls-files --others --exclude-standard",
@@ -73,16 +74,35 @@ async function checkFilesForGoalViolations(goals, projectPath, filesToCheck) {
73
74
  const gitFiles = new Set(gitOutput.split("\n").filter(Boolean));
74
75
  files = Array.from(gitFiles).map((f) => `${projectPath}/${f}`).filter((f) => {
75
76
  return /\.(ts|tsx|js|jsx|py|go|rs|java|c|cpp|h|hpp|cs|rb|php)$/.test(f);
76
- }).slice(0, 20);
77
+ });
77
78
  }
78
79
  } catch {
79
80
  }
81
+ if (files.length === 0) {
82
+ const pattern = `${projectPath}/**/*.{ts,tsx,js,jsx,py,go,rs,java,c,cpp,h,hpp,cs,rb,php}`;
83
+ const allFiles = await glob(pattern, {
84
+ ignore: ["**/node_modules/**", "**/dist/**", "**/build/**", "**/.git/**"],
85
+ nodir: true
86
+ });
87
+ const { stat } = await import("fs/promises");
88
+ const withStats = await Promise.all(
89
+ allFiles.map(async (f) => {
90
+ try {
91
+ const stats = await stat(f);
92
+ return { file: f, mtime: stats.mtime.getTime() };
93
+ } catch {
94
+ return null;
95
+ }
96
+ })
97
+ );
98
+ files = withStats.filter((f) => f !== null).sort((a, b) => b.mtime - a.mtime).slice(0, 30).map((f) => f.file);
99
+ }
100
+ files = files.slice(0, 20);
80
101
  }
81
102
  if (files.length === 0) {
82
- return [];
103
+ throw new Error("No files found to check");
83
104
  }
84
105
  const { readFile } = await import("fs/promises");
85
- const { basename } = await import("path");
86
106
  const fileContents = await Promise.all(
87
107
  files.map(async (filePath) => {
88
108
  try {
@@ -100,7 +120,7 @@ async function checkFilesForGoalViolations(goals, projectPath, filesToCheck) {
100
120
  );
101
121
  const validFiles = fileContents.filter((f) => f !== null);
102
122
  if (validFiles.length === 0) {
103
- return [];
123
+ throw new Error("Could not read any files");
104
124
  }
105
125
  const filesBlock = validFiles.map((f) => `--- ${f.path} ---
106
126
  ${f.content}`).join("\n\n");
@@ -109,6 +129,7 @@ USER-DEFINED GOALS (check EVERY file against ALL goals):
109
129
  ${goals.map((g, i) => ` ${i + 1}. "${g.description}"`).join("\n")}
110
130
 
111
131
  This is a MANUAL CHECK requested by the user. Report ALL goal violations you find.
132
+ For emoji detection, look for Unicode emoji characters (U+1F300-U+1F9FF, U+2600-U+27BF, etc.).
112
133
  `;
113
134
  const result = await runAIAnalysis({
114
135
  systemPrompt: `You are checking code for GOAL VIOLATIONS ONLY.
@@ -116,19 +137,21 @@ ${goalsSection}
116
137
  Reply ONLY with a JSON array. Each element must have:
117
138
  - "file": relative file path
118
139
  - "severity": "critical" | "major" | "minor"
119
- - "description": 1-sentence description of the goal violation
140
+ - "description": 1-sentence description of the goal violation with specific examples
120
141
  - "confidence": number 0-100, how confident you are this is a violation
121
142
  - "isGoalViolation": true (always true for this scan)
122
143
  - "goalIndex": 0-based index of the violated goal
123
144
 
124
- Be thorough. If a goal says "no emojis" and you see ANY emoji in the file, report it. If a goal says "no console.log" and you see console.log, report it.
145
+ Be thorough. If a goal says "no emojis" and you see ANY emoji character (\u{1F4CA}, \u{1F4AA}, \u{1F525}, \u2713, \u25CF, etc.), report it with the specific emoji found. If a goal says "no console.log" and you see console.log, report it.
146
+
147
+ IMPORTANT: Emojis include any Unicode emoji characters like \u{1F4CA}\u{1F4AA}\u{1F525}\u2713\u25CF\u25CB\u25BA\u25C4\u25B2\u25BC\u2600\u2601\u26A0 etc.
125
148
 
126
149
  If no violations found, reply with: []
127
150
  Output ONLY the JSON array, no markdown fences, no commentary.`,
128
- userPrompt: `Check these files for goal violations:
151
+ userPrompt: `Check these ${validFiles.length} files for goal violations:
129
152
 
130
153
  ${filesBlock}`,
131
- maxTokens: 2048,
154
+ maxTokens: 4096,
132
155
  temperature: 0.1
133
156
  });
134
157
  let issues = [];
@@ -137,7 +160,7 @@ ${filesBlock}`,
137
160
  issues = JSON.parse(cleaned);
138
161
  if (!Array.isArray(issues)) issues = [];
139
162
  } catch {
140
- return [];
163
+ throw new Error("Failed to parse AI response");
141
164
  }
142
165
  const violations = [];
143
166
  for (const issue of issues) {
@@ -161,4 +184,4 @@ export {
161
184
  recordGoalViolationCaught,
162
185
  recordGoalViolationFixed
163
186
  };
164
- //# sourceMappingURL=goal-validator-P67RNO2U.js.map
187
+ //# sourceMappingURL=goal-validator-RD6QBQJB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/guardian/goal-validator.ts"],"sourcesContent":["/**\n * Goal Validator - Helpers for goal tracking\n * \n * Goal detection is handled entirely by the AI watcher in watch.ts.\n * The AI (Anthropic) checks every changed file against user-defined goals,\n * using the Trie's priority scoring for cost control.\n * \n * This module provides:\n * - getActiveGoals: loads active goals for the AI prompt\n * - recordGoalViolationCaught: tracks when a violation is detected\n * - recordGoalViolationFixed: tracks when a violation is auto-fixed\n */\n\nimport type { Goal } from './guardian-state.js';\nimport { getGuardianState } from './guardian-state.js';\n\n/**\n * Get active goals for a project (used by the AI watcher)\n */\nexport async function getActiveGoals(projectPath: string): Promise<Goal[]> {\n const guardianState = getGuardianState(projectPath);\n await guardianState.load();\n return guardianState.getAllGoals().filter(g => g.status === 'active');\n}\n\nexport async function recordGoalViolationCaught(\n goal: Goal,\n file: string,\n projectPath: string\n): Promise<void> {\n const guardianState = getGuardianState(projectPath);\n await guardianState.load();\n \n const metadata = goal.metadata || {};\n const caughtCount = (metadata.caughtCount || 0) + 1;\n \n await guardianState.updateGoal(goal.id, {\n metadata: {\n ...metadata,\n caughtCount,\n lastCaught: new Date().toISOString(),\n lastCaughtFile: file,\n },\n });\n}\n\nexport async function recordGoalViolationFixed(\n goal: Goal,\n file: string,\n projectPath: string\n): Promise<void> {\n const guardianState = getGuardianState(projectPath);\n await guardianState.load();\n \n const metadata = goal.metadata || {};\n const caughtCount = (metadata.caughtCount || 0) + 1;\n const fixedCount = (metadata.fixedCount || 0) + 1;\n \n await guardianState.updateGoal(goal.id, {\n metadata: {\n ...metadata,\n caughtCount,\n fixedCount,\n lastFixed: new Date().toISOString(),\n lastFixedFile: file,\n },\n });\n \n if (goal.type === 'reduction') {\n const newValue = Math.max(0, goal.currentValue - 1);\n await guardianState.updateGoal(goal.id, {\n currentValue: newValue,\n });\n \n if (newValue <= goal.target) {\n await guardianState.updateGoal(goal.id, {\n status: 'achieved',\n achievedAt: new Date().toISOString(),\n });\n }\n }\n}\n\n/**\n * Manually check files against goals\n * Returns violations found\n */\nexport async function checkFilesForGoalViolations(\n goals: Goal[],\n projectPath: string,\n filesToCheck?: string[]\n): Promise<Array<{ file: string; message: string; severity: 'critical' | 'warning' | 'info' }>> {\n // Import AI client\n const { isAIAvailable, runAIAnalysis } = await import('../ai/client.js');\n \n if (!isAIAvailable()) {\n throw new Error('AI not available - ANTHROPIC_API_KEY not set');\n }\n \n // Get files to check\n let files: string[] = [];\n if (filesToCheck && filesToCheck.length > 0) {\n files = filesToCheck;\n } else {\n // Find files to check - prioritize modified files, but fall back to all files if none modified\n const { execSync } = await import('child_process');\n const { glob } = await import('glob');\n \n try {\n // Try git first\n const gitOutput = execSync(\n 'git diff --name-only HEAD && git ls-files --modified && git ls-files --others --exclude-standard',\n { cwd: projectPath, encoding: 'utf-8' }\n ).trim();\n \n if (gitOutput) {\n const gitFiles = new Set(gitOutput.split('\\n').filter(Boolean));\n files = Array.from(gitFiles)\n .map(f => `${projectPath}/${f}`)\n .filter(f => {\n // Filter to code files only\n return /\\.(ts|tsx|js|jsx|py|go|rs|java|c|cpp|h|hpp|cs|rb|php)$/.test(f);\n });\n }\n } catch {\n // Git command failed, ignore\n }\n \n // If no git files, scan recently modified files\n if (files.length === 0) {\n const pattern = `${projectPath}/**/*.{ts,tsx,js,jsx,py,go,rs,java,c,cpp,h,hpp,cs,rb,php}`;\n const allFiles = await glob(pattern, {\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],\n nodir: true,\n });\n \n // Sort by modification time, take most recent 30\n const { stat } = await import('fs/promises');\n const withStats = await Promise.all(\n allFiles.map(async (f) => {\n try {\n const stats = await stat(f);\n return { file: f, mtime: stats.mtime.getTime() };\n } catch {\n return null;\n }\n })\n );\n \n files = withStats\n .filter((f): f is { file: string; mtime: number } => f !== null)\n .sort((a, b) => b.mtime - a.mtime)\n .slice(0, 30)\n .map(f => f.file);\n }\n \n // Final limit\n files = files.slice(0, 20);\n }\n \n if (files.length === 0) {\n throw new Error('No files found to check');\n }\n \n // Read file contents\n const { readFile } = await import('fs/promises');\n const fileContents = await Promise.all(\n files.map(async (filePath) => {\n try {\n const content = await readFile(filePath, 'utf-8');\n const relativePath = filePath.replace(projectPath + '/', '');\n return {\n path: relativePath,\n content: content.slice(0, 5000), // Limit content size\n };\n } catch {\n return null;\n }\n })\n );\n \n const validFiles = fileContents.filter((f): f is { path: string; content: string } => f !== null);\n \n if (validFiles.length === 0) {\n throw new Error('Could not read any files');\n }\n \n // Build files block for AI\n const filesBlock = validFiles\n .map(f => `--- ${f.path} ---\\n${f.content}`)\n .join('\\n\\n');\n \n // Build goals section\n const goalsSection = `\nUSER-DEFINED GOALS (check EVERY file against ALL goals):\n${goals.map((g, i) => ` ${i + 1}. \"${g.description}\"`).join('\\n')}\n\nThis is a MANUAL CHECK requested by the user. Report ALL goal violations you find.\nFor emoji detection, look for Unicode emoji characters (U+1F300-U+1F9FF, U+2600-U+27BF, etc.).\n`;\n \n // Run AI analysis\n const result = await runAIAnalysis({\n systemPrompt: `You are checking code for GOAL VIOLATIONS ONLY.\n${goalsSection}\nReply ONLY with a JSON array. Each element must have:\n- \"file\": relative file path\n- \"severity\": \"critical\" | \"major\" | \"minor\"\n- \"description\": 1-sentence description of the goal violation with specific examples\n- \"confidence\": number 0-100, how confident you are this is a violation\n- \"isGoalViolation\": true (always true for this scan)\n- \"goalIndex\": 0-based index of the violated goal\n\nBe thorough. If a goal says \"no emojis\" and you see ANY emoji character (📊, 💪, 🔥, ✓, ●, etc.), report it with the specific emoji found. If a goal says \"no console.log\" and you see console.log, report it.\n\nIMPORTANT: Emojis include any Unicode emoji characters like 📊💪🔥✓●○►◄▲▼☀☁⚠ etc.\n\nIf no violations found, reply with: []\nOutput ONLY the JSON array, no markdown fences, no commentary.`,\n userPrompt: `Check these ${validFiles.length} files for goal violations:\\n\\n${filesBlock}`,\n maxTokens: 4096,\n temperature: 0.1,\n });\n \n // Parse response\n let issues: Array<{\n file: string;\n severity: 'critical' | 'major' | 'minor';\n description: string;\n confidence: number;\n isGoalViolation: boolean;\n goalIndex?: number;\n }> = [];\n \n try {\n const cleaned = result.content.replace(/```json?\\n?|\\n?```/g, '').trim();\n issues = JSON.parse(cleaned);\n if (!Array.isArray(issues)) issues = [];\n } catch {\n // Parse failed\n throw new Error('Failed to parse AI response');\n }\n \n // Convert to violation format and record\n const violations: Array<{ file: string; message: string; severity: 'critical' | 'warning' | 'info' }> = [];\n \n for (const issue of issues) {\n if (!issue.isGoalViolation || issue.confidence < 50) continue;\n if (issue.goalIndex == null || issue.goalIndex < 0 || issue.goalIndex >= goals.length) continue;\n \n const goal = goals[issue.goalIndex]!;\n const severity = issue.severity === 'critical' ? 'critical' : 'warning';\n const message = `Goal \"${goal.description}\" violated in ${issue.file}: ${issue.description} [${issue.confidence}% confidence]`;\n \n violations.push({\n file: issue.file,\n message,\n severity,\n });\n \n // Record violation\n await recordGoalViolationCaught(goal, issue.file, projectPath);\n }\n \n return violations;\n}\n"],"mappings":"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","names":[]}
package/dist/index.js CHANGED
@@ -38,7 +38,7 @@ import {
38
38
  getPrompt,
39
39
  getSystemPrompt,
40
40
  handleCheckpointTool
41
- } from "./chunk-GSYMJLZY.js";
41
+ } from "./chunk-7BY2KVIN.js";
42
42
  import "./chunk-5TQ7J7UI.js";
43
43
  import "./chunk-IQBHPTV7.js";
44
44
  import "./chunk-GPLRFTMB.js";
@@ -1633,7 +1633,7 @@ ${f.content.slice(0, 1e3)}`
1633
1633
  this.state.lastAutoScan = now;
1634
1634
  try {
1635
1635
  const graph = new ContextGraph(projectPath);
1636
- const { getActiveGoals, recordGoalViolationCaught } = await import("./goal-validator-P67RNO2U.js");
1636
+ const { getActiveGoals, recordGoalViolationCaught } = await import("./goal-validator-RD6QBQJB.js");
1637
1637
  const { appendIssuesToLedger } = await import("./ledger-JMPGJGLB.js");
1638
1638
  const activeGoals = await getActiveGoals(projectPath);
1639
1639
  const hasGoals = activeGoals.length > 0;
@@ -1844,7 +1844,7 @@ ${filesBlock}`,
1844
1844
  if (!isAIAvailable()) return;
1845
1845
  const projectPath = this.watchedDirectory || getWorkingDirectory(void 0, true);
1846
1846
  try {
1847
- const { getActiveGoals, recordGoalViolationCaught } = await import("./goal-validator-P67RNO2U.js");
1847
+ const { getActiveGoals, recordGoalViolationCaught } = await import("./goal-validator-RD6QBQJB.js");
1848
1848
  const activeGoals = await getActiveGoals(projectPath);
1849
1849
  if (activeGoals.length === 0) return;
1850
1850
  if (!isInteractiveMode()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@triedotdev/mcp",
3
- "version": "1.0.119",
3
+ "version": "1.0.121",
4
4
  "description": "Trainable AI Agent for Maintaining AI-Generated Codebases",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",