@kernel.chat/kbot 2.5.0 → 2.7.0
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 +98 -42
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +116 -21
- package/dist/agent.js.map +1 -1
- package/dist/auth.d.ts +11 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +165 -7
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +207 -22
- package/dist/cli.js.map +1 -1
- package/dist/ide/acp-server.js +2 -2
- package/dist/ide/acp-server.js.map +1 -1
- package/dist/ide/mcp-server.js +1 -1
- package/dist/matrix.d.ts +6 -0
- package/dist/matrix.d.ts.map +1 -1
- package/dist/matrix.js +98 -0
- package/dist/matrix.js.map +1 -1
- package/dist/planner.d.ts.map +1 -1
- package/dist/planner.js +29 -0
- package/dist/planner.js.map +1 -1
- package/dist/provider-fallback.d.ts +51 -0
- package/dist/provider-fallback.d.ts.map +1 -0
- package/dist/provider-fallback.js +237 -0
- package/dist/provider-fallback.js.map +1 -0
- package/dist/repo-map.d.ts +9 -0
- package/dist/repo-map.d.ts.map +1 -0
- package/dist/repo-map.js +280 -0
- package/dist/repo-map.js.map +1 -0
- package/dist/self-eval.d.ts +45 -0
- package/dist/self-eval.d.ts.map +1 -0
- package/dist/self-eval.js +232 -0
- package/dist/self-eval.js.map +1 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +22 -2
- package/dist/streaming.js.map +1 -1
- package/dist/task-ledger.d.ts +71 -0
- package/dist/task-ledger.d.ts.map +1 -0
- package/dist/task-ledger.js +282 -0
- package/dist/task-ledger.js.map +1 -0
- package/dist/tools/computer.js +3 -3
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +2 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +228 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/quality.d.ts +2 -0
- package/dist/tools/quality.d.ts.map +1 -0
- package/dist/tools/quality.js +313 -0
- package/dist/tools/quality.js.map +1 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +33 -18
- package/dist/ui.js.map +1 -1
- package/package.json +27 -3
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// K:BOT Memory Tools — Active memory management (Letta/MemGPT-inspired)
|
|
2
|
+
//
|
|
3
|
+
// Gives agents the ability to self-edit their persistent memory:
|
|
4
|
+
// - Save facts, preferences, patterns, and solutions
|
|
5
|
+
// - Search memories by keyword
|
|
6
|
+
// - Update existing memories (preserving creation time)
|
|
7
|
+
// - Forget specific memories
|
|
8
|
+
//
|
|
9
|
+
// Memory is stored as individual JSON files under ~/.kbot/memory/{category}/
|
|
10
|
+
import { registerTool } from './index.js';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from 'node:fs';
|
|
14
|
+
const VALID_CATEGORIES = ['fact', 'preference', 'pattern', 'solution'];
|
|
15
|
+
// ── Helpers ──
|
|
16
|
+
const MEMORY_BASE = join(homedir(), '.kbot', 'memory');
|
|
17
|
+
function ensureCategoryDir(category) {
|
|
18
|
+
const dir = join(MEMORY_BASE, category);
|
|
19
|
+
if (!existsSync(dir)) {
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
return dir;
|
|
23
|
+
}
|
|
24
|
+
/** Sanitize key for safe filesystem usage */
|
|
25
|
+
function sanitizeKey(key) {
|
|
26
|
+
return key
|
|
27
|
+
.toLowerCase()
|
|
28
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
29
|
+
.replace(/-+/g, '-')
|
|
30
|
+
.replace(/^-|-$/g, '')
|
|
31
|
+
.slice(0, 128);
|
|
32
|
+
}
|
|
33
|
+
function getMemoryPath(category, key) {
|
|
34
|
+
return join(ensureCategoryDir(category), `${sanitizeKey(key)}.json`);
|
|
35
|
+
}
|
|
36
|
+
function readMemoryFile(filePath) {
|
|
37
|
+
try {
|
|
38
|
+
if (!existsSync(filePath))
|
|
39
|
+
return null;
|
|
40
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function writeMemoryFile(filePath, entry) {
|
|
47
|
+
writeFileSync(filePath, JSON.stringify(entry, null, 2), 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
/** Search all memories in a specific category directory */
|
|
50
|
+
function searchInCategory(category, query) {
|
|
51
|
+
const dir = join(MEMORY_BASE, category);
|
|
52
|
+
if (!existsSync(dir))
|
|
53
|
+
return [];
|
|
54
|
+
const matches = [];
|
|
55
|
+
const lowerQuery = query.toLowerCase();
|
|
56
|
+
try {
|
|
57
|
+
const files = readdirSync(dir).filter(f => f.endsWith('.json'));
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
const entry = readMemoryFile(join(dir, file));
|
|
60
|
+
if (!entry)
|
|
61
|
+
continue;
|
|
62
|
+
const keyMatch = entry.key.toLowerCase().includes(lowerQuery);
|
|
63
|
+
const contentMatch = entry.content.toLowerCase().includes(lowerQuery);
|
|
64
|
+
if (keyMatch || contentMatch) {
|
|
65
|
+
matches.push(entry);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch { /* dir read failed */ }
|
|
70
|
+
return matches;
|
|
71
|
+
}
|
|
72
|
+
/** Find a memory by key across all categories. Returns [entry, filePath, category] or null. */
|
|
73
|
+
function findMemoryByKey(key, category) {
|
|
74
|
+
const sanitized = sanitizeKey(key);
|
|
75
|
+
const categoriesToSearch = category && VALID_CATEGORIES.includes(category)
|
|
76
|
+
? [category]
|
|
77
|
+
: VALID_CATEGORIES;
|
|
78
|
+
for (const cat of categoriesToSearch) {
|
|
79
|
+
const filePath = join(MEMORY_BASE, cat, `${sanitized}.json`);
|
|
80
|
+
const entry = readMemoryFile(filePath);
|
|
81
|
+
if (entry)
|
|
82
|
+
return [entry, filePath, cat];
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
// ── Tools ──
|
|
87
|
+
export function registerMemoryTools() {
|
|
88
|
+
// ── memory_save ──
|
|
89
|
+
registerTool({
|
|
90
|
+
name: 'memory_save',
|
|
91
|
+
description: 'Save a fact, preference, learned pattern, or solution to persistent memory. Use this proactively when you learn something important about the user, their project, or discover a reusable solution.',
|
|
92
|
+
parameters: {
|
|
93
|
+
key: { type: 'string', description: 'Short descriptive key for this memory (e.g. "isaac-prefers-vanilla-css")', required: true },
|
|
94
|
+
content: { type: 'string', description: 'The memory content to save — be specific and actionable', required: true },
|
|
95
|
+
category: { type: 'string', description: 'Category: "fact", "preference", "pattern", or "solution" (default: "fact")' },
|
|
96
|
+
},
|
|
97
|
+
tier: 'free',
|
|
98
|
+
timeout: 10_000,
|
|
99
|
+
async execute(args) {
|
|
100
|
+
const key = String(args.key || '').trim();
|
|
101
|
+
const content = String(args.content || '').trim();
|
|
102
|
+
const category = (VALID_CATEGORIES.includes(args.category) ? args.category : 'fact');
|
|
103
|
+
if (!key)
|
|
104
|
+
return 'Error: key is required.';
|
|
105
|
+
if (!content)
|
|
106
|
+
return 'Error: content is required.';
|
|
107
|
+
const filePath = getMemoryPath(category, key);
|
|
108
|
+
const existing = readMemoryFile(filePath);
|
|
109
|
+
const now = new Date().toISOString();
|
|
110
|
+
const entry = {
|
|
111
|
+
key: sanitizeKey(key),
|
|
112
|
+
content,
|
|
113
|
+
category,
|
|
114
|
+
created_at: existing?.created_at || now,
|
|
115
|
+
modified_at: now,
|
|
116
|
+
access_count: existing ? existing.access_count + 1 : 0,
|
|
117
|
+
};
|
|
118
|
+
writeMemoryFile(filePath, entry);
|
|
119
|
+
return `Saved memory [${category}/${sanitizeKey(key)}]: ${content.slice(0, 120)}${content.length > 120 ? '...' : ''}`;
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
// ── memory_search ──
|
|
123
|
+
registerTool({
|
|
124
|
+
name: 'memory_search',
|
|
125
|
+
description: 'Search persistent memories by keyword. Use this to recall user preferences, previously learned patterns, known facts, or saved solutions before starting a task.',
|
|
126
|
+
parameters: {
|
|
127
|
+
query: { type: 'string', description: 'Keyword or phrase to search for in memory keys and content', required: true },
|
|
128
|
+
category: { type: 'string', description: 'Limit search to a specific category: "fact", "preference", "pattern", or "solution" (default: search all)' },
|
|
129
|
+
},
|
|
130
|
+
tier: 'free',
|
|
131
|
+
timeout: 10_000,
|
|
132
|
+
async execute(args) {
|
|
133
|
+
const query = String(args.query || '').trim();
|
|
134
|
+
if (!query)
|
|
135
|
+
return 'Error: query is required.';
|
|
136
|
+
const categoriesToSearch = args.category && VALID_CATEGORIES.includes(args.category)
|
|
137
|
+
? [args.category]
|
|
138
|
+
: VALID_CATEGORIES;
|
|
139
|
+
let allMatches = [];
|
|
140
|
+
for (const cat of categoriesToSearch) {
|
|
141
|
+
allMatches = allMatches.concat(searchInCategory(cat, query));
|
|
142
|
+
}
|
|
143
|
+
if (allMatches.length === 0) {
|
|
144
|
+
return `No memories found matching "${query}".`;
|
|
145
|
+
}
|
|
146
|
+
// Sort by modified_at descending (most recent first)
|
|
147
|
+
allMatches.sort((a, b) => b.modified_at.localeCompare(a.modified_at));
|
|
148
|
+
// Take top 10
|
|
149
|
+
const top = allMatches.slice(0, 10);
|
|
150
|
+
// Increment access_count for each accessed memory
|
|
151
|
+
for (const entry of top) {
|
|
152
|
+
const filePath = getMemoryPath(entry.category, entry.key);
|
|
153
|
+
entry.access_count++;
|
|
154
|
+
writeMemoryFile(filePath, entry);
|
|
155
|
+
}
|
|
156
|
+
const results = top.map((entry, i) => {
|
|
157
|
+
const age = entry.modified_at.split('T')[0];
|
|
158
|
+
return `${i + 1}. [${entry.category}/${entry.key}] (${age}, accessed ${entry.access_count}x)\n ${entry.content.slice(0, 200)}${entry.content.length > 200 ? '...' : ''}`;
|
|
159
|
+
}).join('\n');
|
|
160
|
+
return `Found ${allMatches.length} memor${allMatches.length === 1 ? 'y' : 'ies'} matching "${query}"${allMatches.length > 10 ? ` (showing top 10)` : ''}:\n\n${results}`;
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
// ── memory_forget ──
|
|
164
|
+
registerTool({
|
|
165
|
+
name: 'memory_forget',
|
|
166
|
+
description: 'Remove a specific memory by key. Use this when information is outdated, incorrect, or no longer relevant.',
|
|
167
|
+
parameters: {
|
|
168
|
+
key: { type: 'string', description: 'The key of the memory to remove', required: true },
|
|
169
|
+
category: { type: 'string', description: 'Category to search in (default: search all categories)' },
|
|
170
|
+
},
|
|
171
|
+
tier: 'free',
|
|
172
|
+
timeout: 10_000,
|
|
173
|
+
async execute(args) {
|
|
174
|
+
const key = String(args.key || '').trim();
|
|
175
|
+
if (!key)
|
|
176
|
+
return 'Error: key is required.';
|
|
177
|
+
const found = findMemoryByKey(key, args.category);
|
|
178
|
+
if (!found) {
|
|
179
|
+
return `No memory found with key "${sanitizeKey(key)}"${args.category ? ` in category "${args.category}"` : ''}.`;
|
|
180
|
+
}
|
|
181
|
+
const [entry, filePath, category] = found;
|
|
182
|
+
try {
|
|
183
|
+
unlinkSync(filePath);
|
|
184
|
+
return `Removed memory [${category}/${entry.key}]: ${entry.content.slice(0, 80)}${entry.content.length > 80 ? '...' : ''}`;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
return `Error removing memory: ${err instanceof Error ? err.message : String(err)}`;
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
// ── memory_update ──
|
|
192
|
+
registerTool({
|
|
193
|
+
name: 'memory_update',
|
|
194
|
+
description: 'Update the content of an existing memory while preserving its creation timestamp. Use this when a fact, preference, or pattern has changed but the memory entry should be kept.',
|
|
195
|
+
parameters: {
|
|
196
|
+
key: { type: 'string', description: 'The key of the memory to update', required: true },
|
|
197
|
+
content: { type: 'string', description: 'The new content to replace the existing content', required: true },
|
|
198
|
+
category: { type: 'string', description: 'Category to search in (default: search all categories)' },
|
|
199
|
+
},
|
|
200
|
+
tier: 'free',
|
|
201
|
+
timeout: 10_000,
|
|
202
|
+
async execute(args) {
|
|
203
|
+
const key = String(args.key || '').trim();
|
|
204
|
+
const content = String(args.content || '').trim();
|
|
205
|
+
if (!key)
|
|
206
|
+
return 'Error: key is required.';
|
|
207
|
+
if (!content)
|
|
208
|
+
return 'Error: content is required.';
|
|
209
|
+
const found = findMemoryByKey(key, args.category);
|
|
210
|
+
if (!found) {
|
|
211
|
+
return `No memory found with key "${sanitizeKey(key)}"${args.category ? ` in category "${args.category}"` : ''}. Use memory_save to create a new memory.`;
|
|
212
|
+
}
|
|
213
|
+
const [entry, filePath, category] = found;
|
|
214
|
+
const now = new Date().toISOString();
|
|
215
|
+
const updated = {
|
|
216
|
+
key: entry.key,
|
|
217
|
+
content,
|
|
218
|
+
category,
|
|
219
|
+
created_at: entry.created_at,
|
|
220
|
+
modified_at: now,
|
|
221
|
+
access_count: entry.access_count + 1,
|
|
222
|
+
};
|
|
223
|
+
writeMemoryFile(filePath, updated);
|
|
224
|
+
return `Updated memory [${category}/${entry.key}]:\n Old: ${entry.content.slice(0, 100)}${entry.content.length > 100 ? '...' : ''}\n New: ${content.slice(0, 100)}${content.length > 100 ? '...' : ''}`;
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=memory-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../src/tools/memory-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/tools/quality.ts"],"names":[],"mappings":"AAkFA,wBAAgB,oBAAoB,IAAI,IAAI,CA4Q3C"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// K:BOT Quality Tools — Linting, Testing, Dependency Auditing
|
|
2
|
+
//
|
|
3
|
+
// These tools fill the biggest gap vs competitors (Aider, OpenCode, Claude Code).
|
|
4
|
+
// All run locally, parse structured output, and return actionable results.
|
|
5
|
+
import { registerTool } from './index.js';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { existsSync, readFileSync } from 'fs';
|
|
8
|
+
// ── Helpers ──
|
|
9
|
+
function tryExec(cmd, cwd, timeout = 60_000) {
|
|
10
|
+
try {
|
|
11
|
+
const stdout = execSync(cmd, {
|
|
12
|
+
cwd: cwd || process.cwd(),
|
|
13
|
+
timeout,
|
|
14
|
+
encoding: 'utf-8',
|
|
15
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
16
|
+
});
|
|
17
|
+
return { stdout, error: false };
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const e = err;
|
|
21
|
+
// Many linters/test runners exit non-zero on failures — that's expected
|
|
22
|
+
return { stdout: e.stdout || e.stderr || e.message || 'Command failed', error: false };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function detectPackageManager() {
|
|
26
|
+
if (existsSync('bun.lockb') || existsSync('bun.lock'))
|
|
27
|
+
return 'bun';
|
|
28
|
+
if (existsSync('pnpm-lock.yaml'))
|
|
29
|
+
return 'pnpm';
|
|
30
|
+
if (existsSync('yarn.lock'))
|
|
31
|
+
return 'yarn';
|
|
32
|
+
if (existsSync('package-lock.json') || existsSync('package.json'))
|
|
33
|
+
return 'npm';
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function detectTestFramework() {
|
|
37
|
+
try {
|
|
38
|
+
const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));
|
|
39
|
+
const deps = { ...pkg.devDependencies, ...pkg.dependencies };
|
|
40
|
+
if (deps.vitest)
|
|
41
|
+
return { cmd: 'npx vitest run --reporter=json', name: 'vitest' };
|
|
42
|
+
if (deps.jest)
|
|
43
|
+
return { cmd: 'npx jest --json --forceExit', name: 'jest' };
|
|
44
|
+
if (deps.mocha)
|
|
45
|
+
return { cmd: 'npx mocha --reporter json', name: 'mocha' };
|
|
46
|
+
}
|
|
47
|
+
catch { /* no package.json */ }
|
|
48
|
+
if (existsSync('pytest.ini') || existsSync('pyproject.toml')) {
|
|
49
|
+
return { cmd: 'python -m pytest --tb=short -q', name: 'pytest' };
|
|
50
|
+
}
|
|
51
|
+
if (existsSync('go.mod')) {
|
|
52
|
+
return { cmd: 'go test ./... -json', name: 'go test' };
|
|
53
|
+
}
|
|
54
|
+
if (existsSync('Cargo.toml')) {
|
|
55
|
+
return { cmd: 'cargo test 2>&1', name: 'cargo test' };
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function detectLinter() {
|
|
60
|
+
try {
|
|
61
|
+
const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));
|
|
62
|
+
const deps = { ...pkg.devDependencies, ...pkg.dependencies };
|
|
63
|
+
if (deps.eslint)
|
|
64
|
+
return { cmd: 'npx eslint --format json', name: 'eslint' };
|
|
65
|
+
if (deps.biome || deps['@biomejs/biome'])
|
|
66
|
+
return { cmd: 'npx biome check --reporter json', name: 'biome' };
|
|
67
|
+
}
|
|
68
|
+
catch { /* no package.json */ }
|
|
69
|
+
if (existsSync('.flake8') || existsSync('pyproject.toml')) {
|
|
70
|
+
return { cmd: 'python -m flake8 --format json', name: 'flake8' };
|
|
71
|
+
}
|
|
72
|
+
if (existsSync('Cargo.toml')) {
|
|
73
|
+
return { cmd: 'cargo clippy --message-format json 2>&1', name: 'clippy' };
|
|
74
|
+
}
|
|
75
|
+
if (existsSync('go.mod')) {
|
|
76
|
+
return { cmd: 'golangci-lint run --out-format json 2>&1', name: 'golangci-lint' };
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// ── Tools ──
|
|
81
|
+
export function registerQualityTools() {
|
|
82
|
+
// ── Lint Check ──
|
|
83
|
+
registerTool({
|
|
84
|
+
name: 'lint_check',
|
|
85
|
+
description: 'Run linter on files and return violations with line numbers and fix suggestions. Auto-detects ESLint, Biome, Flake8, Clippy, golangci-lint.',
|
|
86
|
+
parameters: {
|
|
87
|
+
path: { type: 'string', description: 'File or directory to lint (default: current directory)' },
|
|
88
|
+
fix: { type: 'boolean', description: 'Auto-fix fixable issues (default: false)' },
|
|
89
|
+
},
|
|
90
|
+
tier: 'free',
|
|
91
|
+
timeout: 120_000,
|
|
92
|
+
async execute(args) {
|
|
93
|
+
const linter = detectLinter();
|
|
94
|
+
if (!linter) {
|
|
95
|
+
return 'No linter detected. Install one: npm i -D eslint, pip install flake8, or cargo install clippy';
|
|
96
|
+
}
|
|
97
|
+
const target = args.path ? ` ${String(args.path)}` : ' .';
|
|
98
|
+
const fixFlag = args.fix ? ' --fix' : '';
|
|
99
|
+
const cmd = `${linter.cmd}${fixFlag}${target}`;
|
|
100
|
+
const { stdout } = tryExec(cmd);
|
|
101
|
+
// Try to parse JSON output for structured results
|
|
102
|
+
try {
|
|
103
|
+
const data = JSON.parse(stdout);
|
|
104
|
+
if (Array.isArray(data)) {
|
|
105
|
+
const issues = data.flatMap((f) => {
|
|
106
|
+
const messages = f.messages || [];
|
|
107
|
+
return messages.map(m => ({
|
|
108
|
+
file: f.filePath || f.file,
|
|
109
|
+
line: m.line,
|
|
110
|
+
col: m.column,
|
|
111
|
+
severity: m.severity === 2 ? 'error' : 'warning',
|
|
112
|
+
message: m.message,
|
|
113
|
+
rule: m.ruleId || m.rule,
|
|
114
|
+
}));
|
|
115
|
+
});
|
|
116
|
+
const errors = issues.filter(i => i.severity === 'error').length;
|
|
117
|
+
const warnings = issues.filter(i => i.severity === 'warning').length;
|
|
118
|
+
const summary = `${linter.name}: ${errors} errors, ${warnings} warnings`;
|
|
119
|
+
const details = issues.slice(0, 50).map(i => ` ${i.file}:${i.line}:${i.col} ${i.severity} ${i.message} (${i.rule})`).join('\n');
|
|
120
|
+
return `${summary}\n${details}${issues.length > 50 ? `\n ... and ${issues.length - 50} more` : ''}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* not JSON, return raw */ }
|
|
124
|
+
return `${linter.name} output:\n${stdout.slice(0, 10000)}`;
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
// ── Test Runner ──
|
|
128
|
+
registerTool({
|
|
129
|
+
name: 'test_run',
|
|
130
|
+
description: 'Run tests and return pass/fail counts, failures with stack traces, and duration. Auto-detects Vitest, Jest, Mocha, pytest, go test, cargo test.',
|
|
131
|
+
parameters: {
|
|
132
|
+
path: { type: 'string', description: 'Test file or pattern (default: run all tests)' },
|
|
133
|
+
watch: { type: 'boolean', description: 'Watch mode (default: false)' },
|
|
134
|
+
},
|
|
135
|
+
tier: 'free',
|
|
136
|
+
timeout: 300_000, // 5 min for large test suites
|
|
137
|
+
async execute(args) {
|
|
138
|
+
const framework = detectTestFramework();
|
|
139
|
+
if (!framework) {
|
|
140
|
+
return 'No test framework detected. Install one: npm i -D vitest, npm i -D jest, pip install pytest';
|
|
141
|
+
}
|
|
142
|
+
let cmd = framework.cmd;
|
|
143
|
+
if (args.path)
|
|
144
|
+
cmd += ` ${String(args.path)}`;
|
|
145
|
+
const { stdout } = tryExec(cmd, undefined, 240_000);
|
|
146
|
+
// Parse Vitest/Jest JSON output
|
|
147
|
+
if (framework.name === 'vitest' || framework.name === 'jest') {
|
|
148
|
+
try {
|
|
149
|
+
const data = JSON.parse(stdout);
|
|
150
|
+
const passed = data.numPassedTests || data.testResults?.filter((t) => t.status === 'passed').length || 0;
|
|
151
|
+
const failed = data.numFailedTests || data.testResults?.filter((t) => t.status === 'failed').length || 0;
|
|
152
|
+
const total = data.numTotalTests || (passed + failed);
|
|
153
|
+
const duration = data.testResults?.[0]?.perfStats?.runtime || data.startTime ? 'see output' : 'unknown';
|
|
154
|
+
let result = `${framework.name}: ${passed} passed, ${failed} failed (${total} total)`;
|
|
155
|
+
if (failed > 0) {
|
|
156
|
+
const failures = data.testResults
|
|
157
|
+
?.filter((t) => t.status === 'failed')
|
|
158
|
+
?.slice(0, 10)
|
|
159
|
+
?.map((t) => ` FAIL ${t.name}\n ${String(t.message || '').slice(0, 200)}`)
|
|
160
|
+
?.join('\n') || '';
|
|
161
|
+
result += `\n\nFailures:\n${failures}`;
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
catch { /* not valid JSON, return raw */ }
|
|
166
|
+
}
|
|
167
|
+
// Summarize raw output
|
|
168
|
+
const lines = stdout.split('\n');
|
|
169
|
+
const passLine = lines.find(l => /pass|ok|success/i.test(l) && /\d/.test(l));
|
|
170
|
+
const failLine = lines.find(l => /fail|error|FAIL/i.test(l) && /\d/.test(l));
|
|
171
|
+
let summary = `${framework.name} results:\n`;
|
|
172
|
+
if (passLine)
|
|
173
|
+
summary += ` ${passLine.trim()}\n`;
|
|
174
|
+
if (failLine)
|
|
175
|
+
summary += ` ${failLine.trim()}\n`;
|
|
176
|
+
// Include last 50 lines for context
|
|
177
|
+
const tail = lines.slice(-50).join('\n');
|
|
178
|
+
return `${summary}\n${tail}`.slice(0, 10000);
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
// ── Dependency Audit ──
|
|
182
|
+
registerTool({
|
|
183
|
+
name: 'deps_audit',
|
|
184
|
+
description: 'Audit dependencies for known vulnerabilities. Returns CVE IDs, severity, and fix suggestions. Auto-detects npm, pip, cargo, go.',
|
|
185
|
+
parameters: {
|
|
186
|
+
fix: { type: 'boolean', description: 'Auto-fix vulnerabilities where possible (default: false)' },
|
|
187
|
+
},
|
|
188
|
+
tier: 'free',
|
|
189
|
+
timeout: 120_000,
|
|
190
|
+
async execute(args) {
|
|
191
|
+
const pm = detectPackageManager();
|
|
192
|
+
if (pm) {
|
|
193
|
+
const fixFlag = args.fix ? ' fix' : '';
|
|
194
|
+
const cmd = pm === 'pnpm' ? `pnpm audit${fixFlag} --json`
|
|
195
|
+
: pm === 'yarn' ? `yarn audit${fixFlag} --json`
|
|
196
|
+
: pm === 'bun' ? 'bun pm audit'
|
|
197
|
+
: `npm audit${fixFlag} --json`;
|
|
198
|
+
const { stdout } = tryExec(cmd);
|
|
199
|
+
try {
|
|
200
|
+
const data = JSON.parse(stdout);
|
|
201
|
+
const vulns = data.vulnerabilities || data.advisories || {};
|
|
202
|
+
const entries = Object.values(vulns);
|
|
203
|
+
if (entries.length === 0)
|
|
204
|
+
return 'No vulnerabilities found.';
|
|
205
|
+
const summary = entries.slice(0, 30).map((v) => {
|
|
206
|
+
const severity = v.severity || 'unknown';
|
|
207
|
+
const name = v.name || v.module_name || 'unknown';
|
|
208
|
+
const title = v.title || v.overview || '';
|
|
209
|
+
const fixAvailable = v.fixAvailable ? ' (fix available)' : '';
|
|
210
|
+
const range = v.range || '';
|
|
211
|
+
return ` ${String(severity).toUpperCase()} ${name}${range ? `@${range}` : ''}: ${title}${fixAvailable}`;
|
|
212
|
+
}).join('\n');
|
|
213
|
+
const meta = data.metadata || {};
|
|
214
|
+
const total = meta.vulnerabilities
|
|
215
|
+
? `${meta.vulnerabilities.critical || 0} critical, ${meta.vulnerabilities.high || 0} high, ${meta.vulnerabilities.moderate || 0} moderate, ${meta.vulnerabilities.low || 0} low`
|
|
216
|
+
: `${entries.length} issues`;
|
|
217
|
+
return `Vulnerabilities: ${total}\n${summary}${entries.length > 30 ? `\n ... and ${entries.length - 30} more` : ''}`;
|
|
218
|
+
}
|
|
219
|
+
catch { /* not JSON */ }
|
|
220
|
+
return `Audit output:\n${stdout.slice(0, 10000)}`;
|
|
221
|
+
}
|
|
222
|
+
// Python
|
|
223
|
+
if (existsSync('requirements.txt') || existsSync('pyproject.toml')) {
|
|
224
|
+
const { stdout } = tryExec('pip audit --format json 2>/dev/null || pip check');
|
|
225
|
+
return `Python audit:\n${stdout.slice(0, 10000)}`;
|
|
226
|
+
}
|
|
227
|
+
// Rust
|
|
228
|
+
if (existsSync('Cargo.toml')) {
|
|
229
|
+
const { stdout } = tryExec('cargo audit 2>&1');
|
|
230
|
+
return `Cargo audit:\n${stdout.slice(0, 10000)}`;
|
|
231
|
+
}
|
|
232
|
+
// Go
|
|
233
|
+
if (existsSync('go.mod')) {
|
|
234
|
+
const { stdout } = tryExec('govulncheck ./... 2>&1');
|
|
235
|
+
return `Go vulncheck:\n${stdout.slice(0, 10000)}`;
|
|
236
|
+
}
|
|
237
|
+
return 'No package manager detected. Supported: npm, pnpm, yarn, bun, pip, cargo, go.';
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
// ── Type Check ──
|
|
241
|
+
registerTool({
|
|
242
|
+
name: 'type_check',
|
|
243
|
+
description: 'Run TypeScript type checker (tsc --noEmit) and return errors with file locations.',
|
|
244
|
+
parameters: {
|
|
245
|
+
path: { type: 'string', description: 'tsconfig.json path (default: auto-detect)' },
|
|
246
|
+
},
|
|
247
|
+
tier: 'free',
|
|
248
|
+
timeout: 120_000,
|
|
249
|
+
async execute(args) {
|
|
250
|
+
const tsconfig = args.path ? ` -p ${String(args.path)}` : '';
|
|
251
|
+
if (!existsSync('tsconfig.json') && !args.path) {
|
|
252
|
+
return 'No tsconfig.json found in current directory.';
|
|
253
|
+
}
|
|
254
|
+
const { stdout } = tryExec(`npx tsc --noEmit${tsconfig}`);
|
|
255
|
+
if (!stdout.trim())
|
|
256
|
+
return 'No type errors found.';
|
|
257
|
+
const lines = stdout.split('\n');
|
|
258
|
+
const errors = lines.filter(l => /error TS\d+/.test(l));
|
|
259
|
+
if (errors.length === 0)
|
|
260
|
+
return `Type check passed.\n${stdout.slice(0, 2000)}`;
|
|
261
|
+
return `${errors.length} type errors:\n${errors.slice(0, 50).join('\n')}${errors.length > 50 ? `\n... and ${errors.length - 50} more` : ''}`;
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
// ── Format Check ──
|
|
265
|
+
registerTool({
|
|
266
|
+
name: 'format_check',
|
|
267
|
+
description: 'Check code formatting without modifying files. Auto-detects Prettier, Biome, Black, gofmt, rustfmt.',
|
|
268
|
+
parameters: {
|
|
269
|
+
path: { type: 'string', description: 'File or directory to check (default: current directory)' },
|
|
270
|
+
fix: { type: 'boolean', description: 'Auto-format files (default: false — check only)' },
|
|
271
|
+
},
|
|
272
|
+
tier: 'free',
|
|
273
|
+
timeout: 60_000,
|
|
274
|
+
async execute(args) {
|
|
275
|
+
const target = args.path ? ` ${String(args.path)}` : ' .';
|
|
276
|
+
// Detect formatter
|
|
277
|
+
let cmd = null;
|
|
278
|
+
let name = '';
|
|
279
|
+
try {
|
|
280
|
+
const pkg = JSON.parse(readFileSync('package.json', 'utf-8'));
|
|
281
|
+
const deps = { ...pkg.devDependencies, ...pkg.dependencies };
|
|
282
|
+
if (deps.prettier) {
|
|
283
|
+
cmd = args.fix ? `npx prettier --write${target}` : `npx prettier --check${target}`;
|
|
284
|
+
name = 'prettier';
|
|
285
|
+
}
|
|
286
|
+
else if (deps.biome || deps['@biomejs/biome']) {
|
|
287
|
+
cmd = args.fix ? `npx biome format --write${target}` : `npx biome format${target}`;
|
|
288
|
+
name = 'biome';
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch { /* no package.json */ }
|
|
292
|
+
if (!cmd && existsSync('pyproject.toml')) {
|
|
293
|
+
cmd = args.fix ? `black${target}` : `black --check${target}`;
|
|
294
|
+
name = 'black';
|
|
295
|
+
}
|
|
296
|
+
if (!cmd && existsSync('go.mod')) {
|
|
297
|
+
cmd = args.fix ? `gofmt -w${target}` : `gofmt -l${target}`;
|
|
298
|
+
name = 'gofmt';
|
|
299
|
+
}
|
|
300
|
+
if (!cmd && existsSync('Cargo.toml')) {
|
|
301
|
+
cmd = args.fix ? `rustfmt${target}` : `rustfmt --check${target}`;
|
|
302
|
+
name = 'rustfmt';
|
|
303
|
+
}
|
|
304
|
+
if (!cmd)
|
|
305
|
+
return 'No formatter detected. Install one: npm i -D prettier, pip install black';
|
|
306
|
+
const { stdout } = tryExec(cmd);
|
|
307
|
+
if (!stdout.trim())
|
|
308
|
+
return `${name}: all files formatted correctly.`;
|
|
309
|
+
return `${name}:\n${stdout.slice(0, 10000)}`;
|
|
310
|
+
},
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../../src/tools/quality.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AASA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AASnC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAe;AACzD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,OAAO,EAAE,SAA4C,CAAA;AACrF,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,OAAO,EAAE,SAAyB,CAAA;AA0BnE,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAEpE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjD;AAID,wBAAgB,MAAM,IAAI,MAAM,CAS/B;AA0CD,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtE;AAID,wBAAgB,aAAa,CAAC,IAAI,SAAgB,GAAG,GAAG,CAOvD;AAID,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAajE;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASnF;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAMrE;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAW5G;AAID,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AA6BD,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAID,wBAAgB,SAAS,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AASA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AASnC,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAe;AACzD,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,OAAO,EAAE,SAA4C,CAAA;AACrF,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,OAAO,EAAE,SAAyB,CAAA;AA0BnE,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAEpE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOjD;AAID,wBAAgB,MAAM,IAAI,MAAM,CAS/B;AA0CD,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtE;AAID,wBAAgB,aAAa,CAAC,IAAI,SAAgB,GAAG,GAAG,CAOvD;AAID,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAajE;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASnF;AAED,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAMrE;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,IAAI,CAW5G;AAID,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AA6BD,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAID,wBAAgB,SAAS,IAAI,IAAI,CA0ChC;AAID,wBAAgB,YAAY,IAAI,IAAI,CAInC"}
|