milens 0.7.0 → 0.7.2

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.
Files changed (211) hide show
  1. package/.agents/skills/adapters/SKILL.md +59 -51
  2. package/.agents/skills/analyzer/SKILL.md +23 -21
  3. package/.agents/skills/apps/SKILL.md +65 -68
  4. package/.agents/skills/docs/SKILL.md +10 -25
  5. package/.agents/skills/milens/SKILL.md +11 -8
  6. package/.agents/skills/orchestrator/SKILL.md +13 -10
  7. package/.agents/skills/parser/SKILL.md +15 -12
  8. package/.agents/skills/root/SKILL.md +30 -29
  9. package/.agents/skills/scripts/SKILL.md +18 -16
  10. package/.agents/skills/security/SKILL.md +7 -7
  11. package/.agents/skills/server/SKILL.md +36 -26
  12. package/.agents/skills/store/SKILL.md +24 -23
  13. package/.agents/skills/test/SKILL.md +24 -22
  14. package/.agents/skills/ui/SKILL.md +6 -1
  15. package/README.md +12 -3
  16. package/adapters/README.md +144 -107
  17. package/adapters/claude-code/.claude/settings.json.hooks-snippet.json +26 -0
  18. package/adapters/claude-code/.claude-plugin/plugin.json +11 -0
  19. package/adapters/claude-code/.mcp.json +9 -0
  20. package/adapters/claude-code/CLAUDE.md +2 -0
  21. package/adapters/claude-code/hooks/hooks.json +27 -0
  22. package/adapters/codex/.codex/config.toml +3 -0
  23. package/adapters/copilot/.vscode/mcp.json +10 -0
  24. package/adapters/cursor/.cursor/mcp.json +9 -0
  25. package/adapters/cursor/.cursorrules +69 -9
  26. package/adapters/gemini/.gemini/settings.json +9 -0
  27. package/dist/agents-md.d.ts +1 -1
  28. package/dist/agents-md.js +47 -3
  29. package/dist/agents-md.js.map +1 -1
  30. package/dist/analyzer/config.d.ts +0 -1
  31. package/dist/analyzer/config.js +32 -0
  32. package/dist/analyzer/config.js.map +1 -1
  33. package/dist/analyzer/engine.d.ts +0 -1
  34. package/dist/analyzer/engine.js +67 -41
  35. package/dist/analyzer/engine.js.map +1 -1
  36. package/dist/analyzer/enrich.d.ts +0 -1
  37. package/dist/analyzer/enrich.js +81 -1
  38. package/dist/analyzer/enrich.js.map +1 -1
  39. package/dist/analyzer/resolver.d.ts +4 -2
  40. package/dist/analyzer/resolver.js +283 -36
  41. package/dist/analyzer/resolver.js.map +1 -1
  42. package/dist/analyzer/review.d.ts +2 -2
  43. package/dist/analyzer/review.js +39 -61
  44. package/dist/analyzer/review.js.map +1 -1
  45. package/dist/analyzer/risk.d.ts +20 -0
  46. package/dist/analyzer/risk.js +76 -0
  47. package/dist/analyzer/risk.js.map +1 -0
  48. package/dist/analyzer/scanner.d.ts +0 -1
  49. package/dist/analyzer/scanner.js +5 -4
  50. package/dist/analyzer/scanner.js.map +1 -1
  51. package/dist/analyzer/scope-resolver.d.ts +0 -1
  52. package/dist/analyzer/scope-resolver.js +2 -2
  53. package/dist/analyzer/scope-resolver.js.map +1 -1
  54. package/dist/build-info.d.ts +2 -0
  55. package/dist/build-info.js +4 -0
  56. package/dist/build-info.js.map +1 -0
  57. package/dist/cli.d.ts +0 -1
  58. package/dist/cli.js +225 -30
  59. package/dist/cli.js.map +1 -1
  60. package/dist/metrics.d.ts +0 -1
  61. package/dist/orchestrator/orchestrator.d.ts +1 -2
  62. package/dist/orchestrator/orchestrator.js +30 -7
  63. package/dist/orchestrator/orchestrator.js.map +1 -1
  64. package/dist/orchestrator/reporter.d.ts +0 -1
  65. package/dist/parser/extract.d.ts +7 -1
  66. package/dist/parser/extract.js +76 -29
  67. package/dist/parser/extract.js.map +1 -1
  68. package/dist/parser/lang-css.d.ts +0 -1
  69. package/dist/parser/lang-css.js +12 -0
  70. package/dist/parser/lang-css.js.map +1 -1
  71. package/dist/parser/lang-go.d.ts +0 -1
  72. package/dist/parser/lang-html.d.ts +0 -1
  73. package/dist/parser/lang-java.d.ts +0 -1
  74. package/dist/parser/lang-js.d.ts +0 -1
  75. package/dist/parser/lang-js.js +15 -4
  76. package/dist/parser/lang-js.js.map +1 -1
  77. package/dist/parser/lang-md.d.ts +0 -1
  78. package/dist/parser/lang-md.js +1 -0
  79. package/dist/parser/lang-md.js.map +1 -1
  80. package/dist/parser/lang-php.d.ts +0 -1
  81. package/dist/parser/lang-py.d.ts +0 -1
  82. package/dist/parser/lang-ruby.d.ts +0 -1
  83. package/dist/parser/lang-rust.d.ts +0 -1
  84. package/dist/parser/lang-ts.d.ts +0 -1
  85. package/dist/parser/lang-ts.js +40 -6
  86. package/dist/parser/lang-ts.js.map +1 -1
  87. package/dist/parser/lang-vue.d.ts +0 -1
  88. package/dist/parser/lang-vue.js +0 -21
  89. package/dist/parser/lang-vue.js.map +1 -1
  90. package/dist/parser/language-provider.d.ts +0 -1
  91. package/dist/parser/languages.d.ts +0 -1
  92. package/dist/parser/loader.d.ts +0 -1
  93. package/dist/security/deps.d.ts +0 -1
  94. package/dist/security/rules.d.ts +0 -1
  95. package/dist/security/rules.js +35 -35
  96. package/dist/security/rules.js.map +1 -1
  97. package/dist/server/guard-hook.d.ts +10 -0
  98. package/dist/server/guard-hook.js +179 -0
  99. package/dist/server/guard-hook.js.map +1 -0
  100. package/dist/server/hooks.d.ts +0 -1
  101. package/dist/server/hooks.js +2 -1
  102. package/dist/server/hooks.js.map +1 -1
  103. package/dist/server/mcp-prompts.d.ts +0 -1
  104. package/dist/server/mcp-prompts.js +509 -523
  105. package/dist/server/mcp-prompts.js.map +1 -1
  106. package/dist/server/mcp.d.ts +0 -1
  107. package/dist/server/mcp.js +324 -681
  108. package/dist/server/mcp.js.map +1 -1
  109. package/dist/server/test-plan.d.ts +1 -1
  110. package/dist/server/test-plan.js +25 -7
  111. package/dist/server/test-plan.js.map +1 -1
  112. package/dist/server/tools/deps.d.ts +28 -0
  113. package/dist/server/tools/deps.js +2 -0
  114. package/dist/server/tools/deps.js.map +1 -0
  115. package/dist/server/tools/findings-report.d.ts +3 -0
  116. package/dist/server/tools/findings-report.js +170 -0
  117. package/dist/server/tools/findings-report.js.map +1 -0
  118. package/dist/server/tools/resources.d.ts +3 -0
  119. package/dist/server/tools/resources.js +103 -0
  120. package/dist/server/tools/resources.js.map +1 -0
  121. package/dist/server/tools/security.d.ts +3 -0
  122. package/dist/server/tools/security.js +232 -0
  123. package/dist/server/tools/security.js.map +1 -0
  124. package/dist/server/tools/session.d.ts +3 -0
  125. package/dist/server/tools/session.js +160 -0
  126. package/dist/server/tools/session.js.map +1 -0
  127. package/dist/server/tools/testing.d.ts +3 -0
  128. package/dist/server/tools/testing.js +247 -0
  129. package/dist/server/tools/testing.js.map +1 -0
  130. package/dist/server/watcher.d.ts +0 -1
  131. package/dist/server/watcher.js +1 -1
  132. package/dist/server/watcher.js.map +1 -1
  133. package/dist/skills.d.ts +0 -1
  134. package/dist/skills.js +23 -11
  135. package/dist/skills.js.map +1 -1
  136. package/dist/store/annotations.d.ts +6 -1
  137. package/dist/store/annotations.js +56 -9
  138. package/dist/store/annotations.js.map +1 -1
  139. package/dist/store/confidence.d.ts +0 -1
  140. package/dist/store/confidence.js +2 -0
  141. package/dist/store/confidence.js.map +1 -1
  142. package/dist/store/db.d.ts +22 -1
  143. package/dist/store/db.js +225 -45
  144. package/dist/store/db.js.map +1 -1
  145. package/dist/store/registry.d.ts +1 -1
  146. package/dist/store/registry.js +17 -6
  147. package/dist/store/registry.js.map +1 -1
  148. package/dist/store/schema.sql +2 -1
  149. package/dist/store/vectors.d.ts +0 -1
  150. package/dist/types.d.ts +23 -2
  151. package/dist/ui/progress.d.ts +0 -1
  152. package/dist/uninstall.d.ts +1 -1
  153. package/dist/uninstall.js +33 -10
  154. package/dist/uninstall.js.map +1 -1
  155. package/dist/utils.d.ts +2 -1
  156. package/dist/utils.js +37 -2
  157. package/dist/utils.js.map +1 -1
  158. package/package.json +11 -8
  159. package/dist/agents-md.d.ts.map +0 -1
  160. package/dist/analyzer/config.d.ts.map +0 -1
  161. package/dist/analyzer/engine.d.ts.map +0 -1
  162. package/dist/analyzer/enrich.d.ts.map +0 -1
  163. package/dist/analyzer/resolver.d.ts.map +0 -1
  164. package/dist/analyzer/review.d.ts.map +0 -1
  165. package/dist/analyzer/scanner.d.ts.map +0 -1
  166. package/dist/analyzer/scope-resolver.d.ts.map +0 -1
  167. package/dist/analyzer/testplan.d.ts +0 -59
  168. package/dist/analyzer/testplan.d.ts.map +0 -1
  169. package/dist/analyzer/testplan.js +0 -218
  170. package/dist/analyzer/testplan.js.map +0 -1
  171. package/dist/cli.d.ts.map +0 -1
  172. package/dist/metrics.d.ts.map +0 -1
  173. package/dist/orchestrator/orchestrator.d.ts.map +0 -1
  174. package/dist/orchestrator/reporter.d.ts.map +0 -1
  175. package/dist/parser/extract.d.ts.map +0 -1
  176. package/dist/parser/lang-css.d.ts.map +0 -1
  177. package/dist/parser/lang-go.d.ts.map +0 -1
  178. package/dist/parser/lang-html.d.ts.map +0 -1
  179. package/dist/parser/lang-java.d.ts.map +0 -1
  180. package/dist/parser/lang-js.d.ts.map +0 -1
  181. package/dist/parser/lang-md.d.ts.map +0 -1
  182. package/dist/parser/lang-php.d.ts.map +0 -1
  183. package/dist/parser/lang-py.d.ts.map +0 -1
  184. package/dist/parser/lang-ruby.d.ts.map +0 -1
  185. package/dist/parser/lang-rust.d.ts.map +0 -1
  186. package/dist/parser/lang-ts.d.ts.map +0 -1
  187. package/dist/parser/lang-vue.d.ts.map +0 -1
  188. package/dist/parser/language-provider.d.ts.map +0 -1
  189. package/dist/parser/languages.d.ts.map +0 -1
  190. package/dist/parser/loader.d.ts.map +0 -1
  191. package/dist/security/deps.d.ts.map +0 -1
  192. package/dist/security/rules.d.ts.map +0 -1
  193. package/dist/server/hooks.d.ts.map +0 -1
  194. package/dist/server/mcp-prompts.d.ts.map +0 -1
  195. package/dist/server/mcp.d.ts.map +0 -1
  196. package/dist/server/test-plan.d.ts.map +0 -1
  197. package/dist/server/watcher.d.ts.map +0 -1
  198. package/dist/skills.d.ts.map +0 -1
  199. package/dist/store/annotations.d.ts.map +0 -1
  200. package/dist/store/confidence.d.ts.map +0 -1
  201. package/dist/store/db.d.ts.map +0 -1
  202. package/dist/store/registry.d.ts.map +0 -1
  203. package/dist/store/vectors.d.ts.map +0 -1
  204. package/dist/types.d.ts.map +0 -1
  205. package/dist/ui/progress.d.ts.map +0 -1
  206. package/dist/uninstall.d.ts.map +0 -1
  207. package/dist/utils.d.ts.map +0 -1
  208. package/docs/README.md +0 -25
  209. package/docs/diagram1.svg +0 -1
  210. package/docs/diagram2.svg +0 -1
  211. package/docs/diagram3.svg +0 -1
@@ -0,0 +1,232 @@
1
+ import { z } from 'zod';
2
+ import { resolve, relative, join, sep } from 'node:path';
3
+ import { readFileSync, existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';
4
+ import { loadRules } from '../../security/rules.js';
5
+ import { globToRegex } from '../../utils.js';
6
+ /** Resolve `file` under `root` and reject any path that escapes it (path traversal / symlink). */
7
+ function resolveInsideRoot(root, file) {
8
+ const resolvedRoot = resolve(root);
9
+ const fullPath = resolve(resolvedRoot, file);
10
+ if (fullPath !== resolvedRoot && !fullPath.startsWith(resolvedRoot + sep))
11
+ return null;
12
+ return fullPath;
13
+ }
14
+ export function registerSecurityTools(server, deps) {
15
+ const { getDb } = deps;
16
+ server.tool('security_scan', 'Scan codebase for security vulnerabilities using 190+ built-in rules across 25 categories. Replaces multiple manual grep() calls. Categories: secrets, injection, rce, xss, deserialization, ssrf, xxe, path-traversal, file-upload, unicode, dangerous, config, data-leak, crypto, auth, jwt, cors-headers, dependency, cloud, docker, kubernetes, iac, business-logic, api-security, misc, file-access.', {
17
+ scope: z.enum(['all', 'secrets', 'injection', 'rce', 'xss', 'deserialization', 'ssrf', 'xxe', 'path-traversal', 'file-upload', 'unicode', 'dangerous', 'config', 'data-leak', 'crypto', 'auth', 'jwt', 'cors-headers', 'dependency', 'cloud', 'docker', 'kubernetes', 'iac', 'business-logic', 'api-security', 'misc', 'file-access']).optional().default('all').describe('Scan scope'),
18
+ repo: z.string().optional().describe('Repository root path'),
19
+ severity: z.enum(['CRITICAL', 'HIGH', 'MEDIUM', 'LOW']).optional().describe('Minimum severity filter'),
20
+ limit: z.number().optional().default(50).describe('Max findings'),
21
+ }, async ({ scope, repo, severity, limit }) => {
22
+ const { db, root } = getDb(repo);
23
+ const rules = loadRules();
24
+ // Filter rules by scope and severity
25
+ const filtered = rules.filter(r => {
26
+ if (scope !== 'all' && r.category !== scope)
27
+ return false;
28
+ if (severity) {
29
+ const sevOrder = { CRITICAL: 4, HIGH: 3, MEDIUM: 2, LOW: 1 };
30
+ if ((sevOrder[r.severity] || 0) < (sevOrder[severity] || 0))
31
+ return false;
32
+ }
33
+ return r.enabled;
34
+ });
35
+ // Get all source files from the DB
36
+ const symbols = db.getAllSymbols();
37
+ const fileSet = new Set();
38
+ for (const s of symbols) {
39
+ if (s.filePath && !s.filePath.includes('node_modules') && !s.filePath.includes('.git')) {
40
+ fileSet.add(s.filePath);
41
+ }
42
+ }
43
+ // Also include non-code config files that may contain secrets
44
+ // (these typically have no indexed symbols but are critical for security scanning)
45
+ const SECRET_FILE_EXTS = new Set(['.env', '.yml', '.yaml', '.toml', '.ini', '.cfg', '.tf', '.json', '.npmrc', '.yarnrc']);
46
+ const SECRET_FILE_NAMES = new Set(['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml', '.dockerignore', '.env.example']);
47
+ try {
48
+ const walkDir = (dir) => {
49
+ let entries;
50
+ try {
51
+ entries = readdirSync(resolve(root, dir), { withFileTypes: true });
52
+ }
53
+ catch {
54
+ return;
55
+ }
56
+ for (const entry of entries) {
57
+ const relPath = join(dir, entry.name).replace(/\\/g, '/');
58
+ if (entry.name.startsWith('.git') || entry.name === 'node_modules' || entry.name === '.milens')
59
+ continue;
60
+ if (entry.isDirectory()) {
61
+ walkDir(relPath);
62
+ continue;
63
+ }
64
+ const ext = entry.name.includes('.') ? entry.name.substring(entry.name.lastIndexOf('.')) : '';
65
+ if (SECRET_FILE_EXTS.has(ext) || SECRET_FILE_NAMES.has(entry.name)) {
66
+ fileSet.add(relPath);
67
+ }
68
+ }
69
+ };
70
+ walkDir('.');
71
+ }
72
+ catch { /* ignore directory walk errors */ }
73
+ const files = [...fileSet].slice(0, 2000); // cap at 2000 files (upped from 1000 to accommodate config files)
74
+ const { readFileSync: rfs, existsSync: es } = await import('node:fs');
75
+ const { resolve: resolvePath } = await import('node:path');
76
+ const findings = [];
77
+ const byCategory = {};
78
+ const bySeverity = { CRITICAL: 0, HIGH: 0, MEDIUM: 0, LOW: 0 };
79
+ for (const file of files) {
80
+ const fullPath = resolvePath(root, file);
81
+ if (!es(fullPath))
82
+ continue;
83
+ // Apply excludeGlob from each rule's exclusion pattern
84
+ let shouldExclude = false;
85
+ for (const rule of filtered) {
86
+ if (rule.excludeGlob) {
87
+ const excludePatterns = rule.excludeGlob.split(',');
88
+ for (const pattern of excludePatterns) {
89
+ const regex = globToRegex(pattern.trim());
90
+ if (regex.test(file) || regex.test('/' + file)) {
91
+ shouldExclude = true;
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ if (shouldExclude)
97
+ break;
98
+ }
99
+ if (shouldExclude)
100
+ continue;
101
+ // Skip files that don't match rule fileGlobs (simple check)
102
+ const applicableRules = filtered.filter(r => {
103
+ if (!r.fileGlob)
104
+ return true;
105
+ // Simple glob: just check extension
106
+ const ext = r.fileGlob.replace('**/*.', '').replace('**/*', '');
107
+ return file.endsWith(ext) || r.fileGlob === '**/*';
108
+ });
109
+ if (applicableRules.length === 0)
110
+ continue;
111
+ try {
112
+ const content = rfs(fullPath, 'utf-8');
113
+ const lines = content.split('\n');
114
+ for (const rule of applicableRules) {
115
+ for (const pattern of rule.patterns) {
116
+ let match;
117
+ // Reset regex lastIndex for global patterns
118
+ pattern.lastIndex = 0;
119
+ while ((match = pattern.exec(content)) !== null) {
120
+ const lineNum = content.substring(0, match.index).split('\n').length;
121
+ const matchedLine = lines[lineNum - 1] || '';
122
+ // Filter SEC-001 false positives in Vue/HTML template attributes:
123
+ // - kebab-case event names (e.g., @generate-password="...")
124
+ // - template attribute bindings (e.g., @toggle-password="...", :password="...")
125
+ if (rule.id === 'SEC-001' && file.endsWith('.vue')) {
126
+ const beforeMatch = matchedLine.substring(0, matchedLine.indexOf(match[0]));
127
+ if (beforeMatch.includes('@') || beforeMatch.includes('v-on:') ||
128
+ beforeMatch.match(/(^|\s):(\w+-)*password/))
129
+ continue;
130
+ // Check if 'password' preceded by hyphen (kebab-case compound)
131
+ const keywordIdx = matchedLine.indexOf(match[0]);
132
+ if (keywordIdx > 0 && matchedLine[keywordIdx - 1] === '-')
133
+ continue;
134
+ }
135
+ const ctxStart = Math.max(0, lineNum - 3);
136
+ const ctxEnd = Math.min(lines.length, lineNum + 2);
137
+ // Minified/bundled files can have a single line spanning hundreds of KB
138
+ // (e.g. webpack bundles) — cap context length so one finding can't blow
139
+ // past the tool's output size limit.
140
+ const MAX_CONTEXT_LEN = 500;
141
+ let context = lines.slice(ctxStart, ctxEnd).join('\n');
142
+ if (context.length > MAX_CONTEXT_LEN) {
143
+ context = context.slice(0, MAX_CONTEXT_LEN) + '... [truncated]';
144
+ }
145
+ findings.push({
146
+ ruleId: rule.id,
147
+ category: rule.category,
148
+ severity: rule.severity,
149
+ owasp: rule.owasp,
150
+ file,
151
+ line: lineNum,
152
+ match: match[0].length > 100 ? match[0].slice(0, 97) + '...' : match[0],
153
+ context,
154
+ fix: rule.fix,
155
+ });
156
+ byCategory[rule.category] = (byCategory[rule.category] || 0) + 1;
157
+ bySeverity[rule.severity] = (bySeverity[rule.severity] || 0) + 1;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // Skip unreadable files
164
+ }
165
+ }
166
+ // Calculate security score (100 - deductions)
167
+ const deduction = findings.filter((f) => f.severity === 'CRITICAL').length * 5 +
168
+ findings.filter((f) => f.severity === 'HIGH').length * 2 +
169
+ findings.filter((f) => f.severity === 'MEDIUM').length * 0.5;
170
+ const score = Math.max(0, Math.round(100 - deduction));
171
+ const limited = findings.slice(0, limit);
172
+ return {
173
+ content: [{
174
+ type: 'text',
175
+ text: JSON.stringify({
176
+ summary: {
177
+ totalScanned: files.length,
178
+ findings: findings.length,
179
+ byCategory,
180
+ bySeverity,
181
+ score,
182
+ },
183
+ findings: limited,
184
+ }, null, 2),
185
+ }],
186
+ };
187
+ });
188
+ server.tool('fix_apply', 'Apply a security fix suggestion to a file. Creates a backup before modifying. CRITICAL rules require confirm: true.', {
189
+ ruleId: z.string().describe('Security rule ID (e.g. "hardcoded_secret")'),
190
+ file: z.string().describe('File path relative to repo root'),
191
+ line: z.number().describe('Line number where the issue was found'),
192
+ confirm: z.boolean().optional().default(false).describe('Confirmation required for CRITICAL rules'),
193
+ repo: z.string().optional(),
194
+ }, async ({ ruleId, file, line, confirm, repo }) => {
195
+ const { root } = getDb(repo);
196
+ const rules = loadRules();
197
+ const rule = rules.find(r => r.id === ruleId);
198
+ if (!rule)
199
+ return { content: [{ type: 'text', text: `Rule not found: "${ruleId}"` }] };
200
+ if (rule.severity === 'CRITICAL' && !confirm) {
201
+ return { content: [{ type: 'text', text: `CRITICAL rule "${ruleId}" requires confirmation. Set confirm: true to proceed.` }] };
202
+ }
203
+ const fullPath = resolveInsideRoot(root, file);
204
+ if (!fullPath)
205
+ return { content: [{ type: 'text', text: `Invalid file path: "${file}" resolves outside the repo root.` }] };
206
+ if (!existsSync(fullPath))
207
+ return { content: [{ type: 'text', text: `File not found: ${file}` }] };
208
+ const content = readFileSync(fullPath, 'utf-8');
209
+ const lines = content.split('\n');
210
+ if (line < 1 || line > lines.length)
211
+ return { content: [{ type: 'text', text: `Line ${line} out of range (file has ${lines.length} lines).` }] };
212
+ // Backup original
213
+ const backupDir = join(root, '.milens', 'backups');
214
+ mkdirSync(backupDir, { recursive: true });
215
+ const backupPath = join(backupDir, `${file.replace(/[\\/]/g, '_')}_${Date.now()}.bak`);
216
+ writeFileSync(backupPath, content, 'utf-8');
217
+ // Apply fix: add comment above the affected line with the fix suggestion
218
+ const targetLine = lines[line - 1];
219
+ const indent = targetLine.match(/^(\s*)/)?.[1] ?? '';
220
+ const ext = file.split('.').pop()?.toLowerCase() ?? '';
221
+ const isPythonStyle = /^(py|rb|sh|yaml|yml|toml|cfg|ini|env)$/.test(ext);
222
+ const isHtmlStyle = /^(html|htm|vue|xml)$/.test(ext);
223
+ const commentPrefix = isPythonStyle ? '#' : isHtmlStyle ? '<!--' : '//';
224
+ const commentSuffix = isHtmlStyle ? ' -->' : '';
225
+ const fixComment = `${indent}${commentPrefix} milens(fix): rule=${rule.id} — ${rule.fix ?? 'Review manually'}${commentSuffix}`;
226
+ lines.splice(line - 1, 0, fixComment);
227
+ const newContent = lines.join('\n');
228
+ writeFileSync(fullPath, newContent, 'utf-8');
229
+ return { content: [{ type: 'text', text: `Fix comment added for rule "${ruleId}" at ${file}:${line}\nSeverity: ${rule.severity}\nBackup: ${relative(root, backupPath)}\nSuggestion: ${rule.fix ?? 'Manual review needed'}\n\nAdded fix annotation above line ${line}. Original line is preserved below — replace manually following the suggestion.` }] };
230
+ });
231
+ }
232
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/server/tools/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Deps } from './deps.js';
3
+ export declare function registerSessionTools(server: McpServer, deps: Deps): void;
@@ -0,0 +1,160 @@
1
+ import { z } from 'zod';
2
+ import { AnnotationStore } from '../../store/annotations.js';
3
+ import { HookManager, defaultOnSessionStart, defaultOnSessionEnd, defaultOnPreCommit, defaultOnFileChange, defaultOnPreCompact, defaultOnPostCompact, } from '../hooks.js';
4
+ import { BUILD_SHA, BUILT_AT } from '../../build-info.js';
5
+ export function registerSessionTools(server, deps) {
6
+ const { getDb, guard, getToolCallCount } = deps;
7
+ server.tool('annotate', 'Record a note about a symbol for future sessions. Use after discovering bugs, patterns, or important caveats.', {
8
+ symbol: z.string(),
9
+ key: z.enum(['note', 'bug', 'security', 'architecture', 'workflow', 'test', 'dependency', 'refactor']),
10
+ value: z.string(),
11
+ agent: z.string().optional(),
12
+ session_id: z.string().optional(),
13
+ confidence: z.number().optional().default(0.5),
14
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)'),
15
+ }, async ({ symbol, key, value, agent, session_id, confidence, repo }) => {
16
+ const { db } = getDb(repo);
17
+ const store = new AnnotationStore(db.connection);
18
+ const symbolHash = store.getCurrentSymbolHash(symbol) ?? undefined;
19
+ const ann = store.annotate(symbol, key, value, { agent, sessionId: session_id, confidence, symbolHash });
20
+ return { content: [{ type: 'text', text: `Annotation saved: ${ann.id}\n symbol: ${ann.symbol}\n key: ${ann.key}\n confidence: ${ann.confidence}` }] };
21
+ });
22
+ server.tool('recall', 'Retrieve annotations saved in previous sessions. Filter by symbol, key, or agent. Set history=true to include evolution log entries (previous values before overwrites).', {
23
+ symbol: z.string().optional(), key: z.enum(['note', 'bug', 'security', 'architecture', 'workflow', 'test', 'dependency', 'refactor']).optional(),
24
+ agent: z.string().optional(), limit: z.number().optional().default(50),
25
+ history: z.boolean().optional().default(false).describe('Include evolution log entries showing previous values before overwrites'),
26
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)'),
27
+ }, async ({ symbol, key, agent, limit, history, repo }) => {
28
+ const { db } = getDb(repo);
29
+ const store = new AnnotationStore(db.connection);
30
+ const results = store.recall({ symbol, key, agent, limit });
31
+ if (results.length === 0)
32
+ return { content: [{ type: 'text', text: 'No annotations found.' }] };
33
+ const lines = [`${results.length} annotation(s):\n`];
34
+ for (const a of results) {
35
+ lines.push(`[${a.key}] ${a.symbol} — ${a.value.slice(0, 120)}`);
36
+ lines.push(` confidence: ${a.confidence.toFixed(1)} | agent: ${a.agent ?? '?'} | ${a.updatedAt}`);
37
+ if (history) {
38
+ const events = store.getHistory(a.id);
39
+ if (events.length > 0) {
40
+ lines.push(` evolution history (${events.length} event(s)):`);
41
+ for (const e of events) {
42
+ const oldVal = e.oldValue ? `"${e.oldValue.slice(0, 80)}"` : '(none)';
43
+ const newVal = e.newValue ? `"${e.newValue.slice(0, 80)}"` : '(none)';
44
+ lines.push(` ${e.createdAt} | ${e.event}: ${oldVal} → ${newVal}`);
45
+ }
46
+ }
47
+ }
48
+ lines.push('');
49
+ }
50
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
51
+ });
52
+ server.tool('session_start', 'Start a new session. Returns a session ID to use with annotate, session_end, and handoff.', { agent: z.string().describe('Agent name (e.g. vibe-coder, reviewer)'),
53
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)') }, async ({ agent, repo }) => {
54
+ const { db, root, dbPath } = getDb(repo);
55
+ const store = new AnnotationStore(db.connection);
56
+ const sessionId = store.sessionStart(agent);
57
+ let hookOutput = '';
58
+ try {
59
+ const manager = new HookManager();
60
+ const config = manager.loadConfig(root);
61
+ if (config.enabled && config.onSessionStart) {
62
+ hookOutput = await defaultOnSessionStart({ agent, sessionId, rootPath: root }, dbPath);
63
+ }
64
+ }
65
+ catch { /* hooks are best-effort */ }
66
+ const text = `Session started: ${sessionId}\nAgent: ${agent}\nBuild: ${BUILD_SHA} (${BUILT_AT})\nUse this ID with annotate() and session_end().`;
67
+ return { content: [{ type: 'text', text: hookOutput ? `${hookOutput}\n\n${text}` : text }] };
68
+ });
69
+ server.tool('session_context', 'Get metadata about a session: annotations, tool calls, duration.', { session_id: z.string(),
70
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)') }, async ({ session_id, repo }) => {
71
+ const { db, root } = getDb(repo);
72
+ const store = new AnnotationStore(db.connection);
73
+ const ctx = store.sessionContext(session_id);
74
+ if (!ctx.session)
75
+ return { content: [{ type: 'text', text: `Session "${session_id}" not found.` }] };
76
+ const s = ctx.session;
77
+ const liveCalls = getToolCallCount(root);
78
+ const displayCalls = s.toolCallsCount > 0 ? s.toolCallsCount : liveCalls;
79
+ const lines = [
80
+ `Session: ${s.id}`,
81
+ `Agent: ${s.agent} | Status: ${s.status}`,
82
+ `Started: ${s.startedAt} | Ended: ${s.endedAt ?? 'in progress'}`,
83
+ `Tool calls: ${displayCalls}${s.toolCallsCount === 0 ? ' (live count, resets on restart)' : ''} | Annotations: ${ctx.annotations.length}`,
84
+ ];
85
+ if (s.context)
86
+ lines.push(`Context: ${s.context}`);
87
+ if (ctx.annotations.length > 0) {
88
+ lines.push(`\nAnnotations (${ctx.annotations.length}):`);
89
+ for (const a of ctx.annotations) {
90
+ lines.push(` [${a.key}] ${a.symbol}: ${a.value.slice(0, 80)}`);
91
+ }
92
+ }
93
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
94
+ });
95
+ server.tool('session_end', 'End a session and record its stats. Shows audit trail: which symbols were safety-checked vs total edit operations. Use at the end of every session.', { session_id: z.string(), status: z.enum(['completed', 'failed']).optional().default('completed'),
96
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)') }, async ({ session_id, status, repo }) => {
97
+ const { db, root, dbPath } = getDb(repo);
98
+ const store = new AnnotationStore(db.connection);
99
+ const summary = store.sessionEnd(session_id, status);
100
+ // Audit trail from SessionGuard
101
+ const audit = guard.getAudit(session_id);
102
+ guard.clear(session_id);
103
+ let hookOutput = '';
104
+ try {
105
+ const ctx = store.sessionContext(session_id);
106
+ const manager = new HookManager();
107
+ const config = manager.loadConfig(root);
108
+ if (config.enabled && config.onSessionEnd) {
109
+ hookOutput = await defaultOnSessionEnd({ agent: ctx.session.agent, sessionId: session_id, rootPath: root }, dbPath);
110
+ }
111
+ }
112
+ catch { /* hooks are best-effort */ }
113
+ const lines = [
114
+ `Session ended: ${session_id}`,
115
+ `Status: ${status}`,
116
+ `Annotations: ${summary.annotationCount}`,
117
+ `───`,
118
+ `Audit Trail:`,
119
+ ` safety checks performed: ${audit.checked.length}`,
120
+ audit.checked.length > 0 ? ` symbols checked: ${audit.checked.join(', ')}` : ' ⚠ no symbols were checked via guard_edit_check',
121
+ audit.editOps > 0 ? ` edit operations reported: ${audit.editOps}` : null,
122
+ ].filter(Boolean);
123
+ const text = lines.join('\n');
124
+ return { content: [{ type: 'text', text: hookOutput ? `${text}\n\n${hookOutput}` : text }] };
125
+ });
126
+ server.tool('handoff', 'Transfer context from one agent session to another. Ends the source session and creates a new one for the target agent.', {
127
+ from_session: z.string(), to_agent: z.string(),
128
+ context: z.string().describe('Summary of what was done, key decisions, and caveats for the next agent'),
129
+ repo: z.string().optional().describe('Repository root path (for multi-repo workspaces)'),
130
+ }, async ({ from_session, to_agent, context, repo }) => {
131
+ const { db } = getDb(repo);
132
+ const store = new AnnotationStore(db.connection);
133
+ const result = store.handoff(from_session, to_agent, context);
134
+ return { content: [{ type: 'text', text: `Handoff complete.\nNew session: ${result.newSessionId}\nAgent: ${to_agent}\nAnnotations recorded in prior session: ${result.annotationsCopied} (retrievable via recall())` }] };
135
+ });
136
+ server.tool('pre_commit_check', 'Run pre-commit risk analysis: detect_changes + review_pr + dead code + coverage gaps. Use before committing.', { repo: z.string().optional().describe('Repository root path') }, async ({ repo }) => {
137
+ const { root } = getDb(repo);
138
+ const report = await defaultOnPreCommit(root);
139
+ return { content: [{ type: 'text', text: report }] };
140
+ });
141
+ server.tool('hook_onFileChange', 'Trigger the onFileChange hook. Call this when files are modified to get impact summary.', {
142
+ files: z.array(z.string()).describe('List of changed file paths'),
143
+ repo: z.string().optional(),
144
+ }, async ({ files, repo }) => {
145
+ const { root } = getDb(repo);
146
+ const report = await defaultOnFileChange(files, root);
147
+ return { content: [{ type: 'text', text: report }] };
148
+ });
149
+ server.tool('hook_preCompact', 'Trigger pre-compaction hook. Saves a metrics snapshot before context window compaction.', { repo: z.string().optional() }, async ({ repo }) => {
150
+ const { root, dbPath } = getDb(repo);
151
+ const report = await defaultOnPreCompact(root, dbPath);
152
+ return { content: [{ type: 'text', text: report }] };
153
+ });
154
+ server.tool('hook_postCompact', 'Trigger post-compaction hook. Recalls annotations to restore context after compaction.', { repo: z.string().optional() }, async ({ repo }) => {
155
+ const { root } = getDb(repo);
156
+ const report = await defaultOnPostCompact(root);
157
+ return { content: [{ type: 'text', text: report }] };
158
+ });
159
+ }
160
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/server/tools/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Deps } from './deps.js';
3
+ export declare function registerTestingTools(server: McpServer, deps: Deps): void;