koneck 1.0.3 → 2.1.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/dist/auto-docs.d.ts +4 -0
- package/dist/auto-docs.d.ts.map +1 -0
- package/dist/auto-docs.js +57 -0
- package/dist/auto-docs.js.map +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +290 -0
- package/dist/chat.js.map +1 -1
- package/dist/code-graph.d.ts +14 -0
- package/dist/code-graph.d.ts.map +1 -0
- package/dist/code-graph.js +167 -0
- package/dist/code-graph.js.map +1 -0
- package/dist/critique.d.ts +4 -0
- package/dist/critique.d.ts.map +1 -0
- package/dist/critique.js +36 -0
- package/dist/critique.js.map +1 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +111 -0
- package/dist/daemon.js.map +1 -0
- package/dist/debugger.d.ts +4 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +104 -0
- package/dist/debugger.js.map +1 -0
- package/dist/engine.d.ts +5 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +22 -5
- package/dist/engine.js.map +1 -1
- package/dist/health.d.ts +2 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +201 -0
- package/dist/health.js.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -1
- package/dist/issues.d.ts +3 -0
- package/dist/issues.d.ts.map +1 -0
- package/dist/issues.js +77 -0
- package/dist/issues.js.map +1 -0
- package/dist/knowledge-graph.d.ts +3 -0
- package/dist/knowledge-graph.d.ts.map +1 -0
- package/dist/knowledge-graph.js +85 -0
- package/dist/knowledge-graph.js.map +1 -0
- package/dist/memory.d.ts +7 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +89 -2
- package/dist/memory.js.map +1 -1
- package/dist/pipeline.d.ts +3 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +79 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/plugin-packs.d.ts +14 -0
- package/dist/plugin-packs.d.ts.map +1 -0
- package/dist/plugin-packs.js +136 -0
- package/dist/plugin-packs.js.map +1 -0
- package/dist/reasoning-cache.d.ts +9 -0
- package/dist/reasoning-cache.d.ts.map +1 -0
- package/dist/reasoning-cache.js +67 -0
- package/dist/reasoning-cache.js.map +1 -0
- package/dist/recon.d.ts +2 -0
- package/dist/recon.d.ts.map +1 -0
- package/dist/recon.js +121 -0
- package/dist/recon.js.map +1 -0
- package/dist/refactor.d.ts +10 -0
- package/dist/refactor.d.ts.map +1 -0
- package/dist/refactor.js +182 -0
- package/dist/refactor.js.map +1 -0
- package/dist/test-gen.d.ts +3 -0
- package/dist/test-gen.d.ts.map +1 -0
- package/dist/test-gen.js +136 -0
- package/dist/test-gen.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/issues.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../src/issues.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6C9C,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAqCf"}
|
package/dist/issues.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { runAgent } from './engine.js';
|
|
4
|
+
const GH_INSTALL_MSG = 'GitHub CLI (gh) is required. Install from: https://cli.github.com/';
|
|
5
|
+
async function ghExec(args) {
|
|
6
|
+
try {
|
|
7
|
+
const { stdout } = await execa('gh', args);
|
|
8
|
+
return stdout;
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
const msg = String(err.message ?? '');
|
|
12
|
+
if (msg.includes('ENOENT') || msg.includes('not found')) {
|
|
13
|
+
throw new Error(GH_INSTALL_MSG);
|
|
14
|
+
}
|
|
15
|
+
throw err;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function listIssues() {
|
|
19
|
+
const raw = await ghExec(['issue', 'list', '--json', 'number,title,labels,state', '--limit', '20']);
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
async function fixIssue(issueId, config) {
|
|
23
|
+
const raw = await ghExec(['issue', 'view', String(issueId), '--json', 'title,body,comments']);
|
|
24
|
+
const issue = JSON.parse(raw);
|
|
25
|
+
const task = `Fix GitHub issue #${issueId}.\n\n` +
|
|
26
|
+
`Title: ${issue.title}\n\n` +
|
|
27
|
+
`Description:\n${issue.body ?? '(no description)'}\n\n` +
|
|
28
|
+
`Fix the issue, write tests, then create a commit with message ` +
|
|
29
|
+
`'fix: ${issue.title} (#${issueId})'.`;
|
|
30
|
+
await runAgent(task, config);
|
|
31
|
+
console.log(chalk.green(`\nDone. Run 'gh pr create' to open a PR.`));
|
|
32
|
+
}
|
|
33
|
+
export async function runIssues(action, config, issueId) {
|
|
34
|
+
try {
|
|
35
|
+
if (action === 'list') {
|
|
36
|
+
const issues = await listIssues();
|
|
37
|
+
if (issues.length === 0) {
|
|
38
|
+
console.log('No open issues found.');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log(chalk.bold('\n # State Labels Title'));
|
|
42
|
+
console.log(' ' + '─'.repeat(72));
|
|
43
|
+
for (const issue of issues) {
|
|
44
|
+
const num = chalk.cyan(`#${issue.number}`.padEnd(6));
|
|
45
|
+
const state = (issue.state === 'OPEN' ? chalk.green('Open ') : chalk.gray('Closed'));
|
|
46
|
+
const labels = issue.labels.map(l => l.name).join(', ').padEnd(15).slice(0, 15);
|
|
47
|
+
console.log(` ${num} ${state} ${chalk.yellow(labels)} ${issue.title}`);
|
|
48
|
+
}
|
|
49
|
+
console.log();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// fix
|
|
53
|
+
if (issueId !== undefined) {
|
|
54
|
+
await fixIssue(issueId, config);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const issues = await listIssues();
|
|
58
|
+
const bug = issues.find(i => i.state === 'OPEN' && i.labels.some(l => l.name.toLowerCase().includes('bug'))) ?? issues.find(i => i.state === 'OPEN');
|
|
59
|
+
if (!bug) {
|
|
60
|
+
console.log('No open issues to fix.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk.cyan(`Auto-selected issue #${bug.number}: ${bug.title}`));
|
|
64
|
+
await fixIssue(bug.number, config);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const msg = String(err.message ?? err);
|
|
69
|
+
if (msg.includes('cli.github.com')) {
|
|
70
|
+
console.error(chalk.red(msg));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../src/issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../src/knowledge-graph.ts"],"names":[],"mappings":"AAoCA,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CpE;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBvF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { globby } from 'globby';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
const CONCEPTS = [
|
|
7
|
+
'auth', 'user', 'login', 'session', 'token', 'payment', 'order', 'product',
|
|
8
|
+
'cart', 'email', 'file', 'upload', 'search', 'api', 'route', 'middleware',
|
|
9
|
+
'database', 'cache', 'queue', 'notification',
|
|
10
|
+
];
|
|
11
|
+
function splitCamel(name) {
|
|
12
|
+
return name
|
|
13
|
+
.replace(/_/g, ' ')
|
|
14
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.split(/\s+/)
|
|
17
|
+
.filter(Boolean);
|
|
18
|
+
}
|
|
19
|
+
function graphPath(cwd) {
|
|
20
|
+
return path.join(cwd, '.koneck', 'knowledge-graph.json');
|
|
21
|
+
}
|
|
22
|
+
export async function buildKnowledgeGraph(cwd) {
|
|
23
|
+
const spinner = ora('Building knowledge graph…').start();
|
|
24
|
+
const files = await globby(['**/*.ts', '**/*.js'], {
|
|
25
|
+
cwd,
|
|
26
|
+
ignore: ['node_modules/**', 'dist/**', '.koneck/**'],
|
|
27
|
+
absolute: false,
|
|
28
|
+
});
|
|
29
|
+
const conceptMap = new Map();
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const abs = path.join(cwd, file);
|
|
32
|
+
let src;
|
|
33
|
+
try {
|
|
34
|
+
src = await readFile(abs, 'utf8');
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const lines = src.split('\n');
|
|
40
|
+
const symRe = /export\s+(function|class|const|interface)\s+(\w+)/g;
|
|
41
|
+
for (let i = 0; i < lines.length; i++) {
|
|
42
|
+
let m;
|
|
43
|
+
symRe.lastIndex = 0;
|
|
44
|
+
while ((m = symRe.exec(lines[i])) !== null) {
|
|
45
|
+
const symbol = m[2];
|
|
46
|
+
const parts = splitCamel(symbol);
|
|
47
|
+
for (const concept of CONCEPTS) {
|
|
48
|
+
if (parts.some(p => p.includes(concept) || concept.includes(p))) {
|
|
49
|
+
if (!conceptMap.has(concept))
|
|
50
|
+
conceptMap.set(concept, []);
|
|
51
|
+
conceptMap.get(concept).push({ file, line: i + 1, symbol, confidence: 0.8 });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const entries = Array.from(conceptMap.entries()).map(([concept, locations]) => ({
|
|
58
|
+
concept,
|
|
59
|
+
locations,
|
|
60
|
+
updatedAt: new Date().toISOString(),
|
|
61
|
+
}));
|
|
62
|
+
const data = { entries, builtAt: new Date().toISOString() };
|
|
63
|
+
const dest = graphPath(cwd);
|
|
64
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
65
|
+
await writeFile(dest, JSON.stringify(data, null, 2));
|
|
66
|
+
spinner.succeed(`Knowledge graph built: ${entries.length} concepts across ${files.length} files`);
|
|
67
|
+
}
|
|
68
|
+
export async function queryKnowledgeGraph(concept, cwd) {
|
|
69
|
+
if (!existsSync(graphPath(cwd)))
|
|
70
|
+
await buildKnowledgeGraph(cwd);
|
|
71
|
+
const raw = await readFile(graphPath(cwd), 'utf8');
|
|
72
|
+
const data = JSON.parse(raw);
|
|
73
|
+
const q = concept.toLowerCase();
|
|
74
|
+
const matched = data.entries.filter(e => e.concept.includes(q) || q.includes(e.concept));
|
|
75
|
+
if (matched.length === 0)
|
|
76
|
+
return `No results found for "${concept}".`;
|
|
77
|
+
const lines = [`"${concept}" is implemented in:`];
|
|
78
|
+
for (const entry of matched) {
|
|
79
|
+
for (const loc of entry.locations) {
|
|
80
|
+
lines.push(` ${loc.symbol.padEnd(24)}→ ${loc.file}:${loc.line}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=knowledge-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../src/knowledge-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AAatB,MAAM,QAAQ,GAAG;IACf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS;IAC1E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY;IACzE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc;CAC7C,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SAClB,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,WAAW,EAAE;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEzD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;QACjD,GAAG;QACH,MAAM,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,YAAY,CAAC;QACpD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuC,CAAC;IAElE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,oDAAoD,CAAC;QAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAyB,CAAC;YAC9B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;gBACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;4BAAE,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC1D,UAAU,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;oBAChF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAqB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAChG,OAAO;QACP,SAAS;QACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC,CAAC;IAEJ,MAAM,IAAI,GAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO,CAAC,OAAO,CAAC,0BAA0B,OAAO,CAAC,MAAM,oBAAoB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,GAAW;IACpE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAuB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,yBAAyB,OAAO,IAAI,CAAC;IAEtE,MAAM,KAAK,GAAa,CAAC,IAAI,OAAO,sBAAsB,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
export declare function loadMemory(cwd: string): Promise<string | null>;
|
|
2
2
|
export declare function appendMemory(cwd: string, content: string, category?: string): Promise<void>;
|
|
3
|
+
export declare function addConvention(cwd: string, rule: string): Promise<void>;
|
|
4
|
+
export declare function addNoTouch(cwd: string, filePath: string, reason?: string): Promise<void>;
|
|
5
|
+
export declare function addPreference(cwd: string, pref: string): Promise<void>;
|
|
6
|
+
export declare function addArchNote(cwd: string, note: string): Promise<void>;
|
|
7
|
+
export declare function getMemoryByCategory(cwd: string, category: string): Promise<string[]>;
|
|
8
|
+
export declare function listMemoryCategories(cwd: string): Promise<string[]>;
|
|
9
|
+
export declare function removeMemoryEntry(cwd: string, category: string, entrySubstring: string): Promise<boolean>;
|
|
3
10
|
//# sourceMappingURL=memory.d.ts.map
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAmBA,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpE;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,SAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf;AAyBD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAa1F;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIzE;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
|
package/dist/memory.js
CHANGED
|
@@ -1,18 +1,105 @@
|
|
|
1
1
|
import fs from 'fs/promises';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
const MEMORY_FILE = '.koneck/MEMORY.md';
|
|
4
|
-
|
|
4
|
+
async function readMemoryFile(cwd) {
|
|
5
5
|
try {
|
|
6
6
|
return await fs.readFile(path.join(cwd, MEMORY_FILE), 'utf-8');
|
|
7
7
|
}
|
|
8
8
|
catch {
|
|
9
|
-
return
|
|
9
|
+
return '';
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
|
+
async function writeMemoryFile(cwd, content) {
|
|
13
|
+
const file = path.join(cwd, MEMORY_FILE);
|
|
14
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
15
|
+
await fs.writeFile(file, content, 'utf-8');
|
|
16
|
+
}
|
|
17
|
+
export async function loadMemory(cwd) {
|
|
18
|
+
const content = await readMemoryFile(cwd);
|
|
19
|
+
return content === '' ? null : content;
|
|
20
|
+
}
|
|
12
21
|
export async function appendMemory(cwd, content, category = 'notes') {
|
|
13
22
|
const file = path.join(cwd, MEMORY_FILE);
|
|
14
23
|
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
15
24
|
const date = new Date().toISOString().slice(0, 10);
|
|
16
25
|
await fs.appendFile(file, `\n## [${date}] ${category}\n${content}\n`, 'utf-8');
|
|
17
26
|
}
|
|
27
|
+
async function appendToSection(cwd, section, line) {
|
|
28
|
+
let content = await readMemoryFile(cwd);
|
|
29
|
+
const header = `## [${section}]`;
|
|
30
|
+
const idx = content.indexOf(header);
|
|
31
|
+
if (idx === -1) {
|
|
32
|
+
const separator = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
|
|
33
|
+
content += `${separator}\n${header}\n${line}\n`;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const after = idx + header.length;
|
|
37
|
+
const nextHeader = content.indexOf('\n##', after);
|
|
38
|
+
const insertAt = nextHeader === -1 ? content.length : nextHeader;
|
|
39
|
+
const block = content.slice(after, insertAt);
|
|
40
|
+
const trailingNewline = block.endsWith('\n') ? '' : '\n';
|
|
41
|
+
content =
|
|
42
|
+
content.slice(0, insertAt) +
|
|
43
|
+
trailingNewline +
|
|
44
|
+
line +
|
|
45
|
+
'\n' +
|
|
46
|
+
content.slice(insertAt);
|
|
47
|
+
}
|
|
48
|
+
await writeMemoryFile(cwd, content);
|
|
49
|
+
}
|
|
50
|
+
export async function addConvention(cwd, rule) {
|
|
51
|
+
await appendToSection(cwd, 'conventions', `- ${rule}`);
|
|
52
|
+
}
|
|
53
|
+
export async function addNoTouch(cwd, filePath, reason) {
|
|
54
|
+
const entry = reason ? `- ${filePath} — ${reason}` : `- ${filePath}`;
|
|
55
|
+
await appendToSection(cwd, 'no-touch', entry);
|
|
56
|
+
}
|
|
57
|
+
export async function addPreference(cwd, pref) {
|
|
58
|
+
await appendToSection(cwd, 'preferences', `- ${pref}`);
|
|
59
|
+
}
|
|
60
|
+
export async function addArchNote(cwd, note) {
|
|
61
|
+
await appendToSection(cwd, 'architecture', `- ${note}`);
|
|
62
|
+
}
|
|
63
|
+
export async function getMemoryByCategory(cwd, category) {
|
|
64
|
+
const content = await readMemoryFile(cwd);
|
|
65
|
+
if (!content)
|
|
66
|
+
return [];
|
|
67
|
+
const header = `## [${category}]`;
|
|
68
|
+
const idx = content.indexOf(header);
|
|
69
|
+
if (idx === -1)
|
|
70
|
+
return [];
|
|
71
|
+
const after = idx + header.length;
|
|
72
|
+
const nextHeader = content.indexOf('\n##', after);
|
|
73
|
+
const block = nextHeader === -1 ? content.slice(after) : content.slice(after, nextHeader);
|
|
74
|
+
return block
|
|
75
|
+
.split('\n')
|
|
76
|
+
.filter(l => l.trimStart().startsWith('- '))
|
|
77
|
+
.map(l => l.trimStart().slice(2));
|
|
78
|
+
}
|
|
79
|
+
export async function listMemoryCategories(cwd) {
|
|
80
|
+
const content = await readMemoryFile(cwd);
|
|
81
|
+
const matches = content.matchAll(/^## \[([^\]]+)\]/gm);
|
|
82
|
+
return [...matches].map(m => m[1]);
|
|
83
|
+
}
|
|
84
|
+
export async function removeMemoryEntry(cwd, category, entrySubstring) {
|
|
85
|
+
const content = await readMemoryFile(cwd);
|
|
86
|
+
if (!content)
|
|
87
|
+
return false;
|
|
88
|
+
const header = `## [${category}]`;
|
|
89
|
+
const idx = content.indexOf(header);
|
|
90
|
+
if (idx === -1)
|
|
91
|
+
return false;
|
|
92
|
+
const after = idx + header.length;
|
|
93
|
+
const nextHeader = content.indexOf('\n##', after);
|
|
94
|
+
const blockEnd = nextHeader === -1 ? content.length : nextHeader;
|
|
95
|
+
const block = content.slice(after, blockEnd);
|
|
96
|
+
const lines = block.split('\n');
|
|
97
|
+
const matchIdx = lines.findIndex(l => l.trimStart().startsWith('- ') && l.includes(entrySubstring));
|
|
98
|
+
if (matchIdx === -1)
|
|
99
|
+
return false;
|
|
100
|
+
lines.splice(matchIdx, 1);
|
|
101
|
+
const newContent = content.slice(0, after) + lines.join('\n') + content.slice(blockEnd);
|
|
102
|
+
await writeMemoryFile(cwd, newContent);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
18
105
|
//# sourceMappingURL=memory.js.map
|
package/dist/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,YAAY,CAAC;AA2CvD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DlF"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import * as readline from 'node:readline';
|
|
3
|
+
import { runAgent } from './engine.js';
|
|
4
|
+
function lastAssistantText(messages) {
|
|
5
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
6
|
+
const m = messages[i];
|
|
7
|
+
if (m.role === 'assistant' && typeof m.content === 'string' && m.content.trim()) {
|
|
8
|
+
return m.content;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
function printStageHeader(index, total, name) {
|
|
14
|
+
const label = `[${index}/${total}] ${name}`;
|
|
15
|
+
const line = '━'.repeat(Math.max(0, 40 - label.length - 4));
|
|
16
|
+
console.log(chalk.cyan(`\n━━━ ${label} ${line}`));
|
|
17
|
+
}
|
|
18
|
+
function printBox(title, body) {
|
|
19
|
+
const width = 60;
|
|
20
|
+
const border = '─'.repeat(width);
|
|
21
|
+
console.log(chalk.yellow(`┌${border}┐`));
|
|
22
|
+
console.log(chalk.yellow(`│ ${chalk.bold(title.padEnd(width - 1))}│`));
|
|
23
|
+
console.log(chalk.yellow(`├${border}┤`));
|
|
24
|
+
for (const line of body.split('\n')) {
|
|
25
|
+
const truncated = line.slice(0, width - 2);
|
|
26
|
+
console.log(chalk.yellow('│ ') + truncated.padEnd(width - 2) + chalk.yellow(' │'));
|
|
27
|
+
}
|
|
28
|
+
console.log(chalk.yellow(`└${border}┘`));
|
|
29
|
+
}
|
|
30
|
+
async function askApproval(prompt) {
|
|
31
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
rl.question(prompt, (answer) => {
|
|
34
|
+
rl.close();
|
|
35
|
+
const trimmed = answer.trim().toLowerCase();
|
|
36
|
+
resolve(trimmed !== 'n' && trimmed !== 'no');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export async function runPipeline(task, config) {
|
|
41
|
+
// ── 1. Planner ────────────────────────────────────────────────────────────
|
|
42
|
+
printStageHeader(1, 5, 'Planning');
|
|
43
|
+
const plannerConfig = { ...config, silent: true, maxTurns: 8 };
|
|
44
|
+
const plannerSession = await runAgent(`You are a planning agent. For this task: '${task}'\n\nProduce a structured plan:\n1. Requirements (what exactly needs to change)\n2. Files affected (list specific files)\n3. Risk estimate (low/medium/high and why)\n4. Step-by-step implementation plan\n\nDo NOT write any code. Just plan.`, plannerConfig);
|
|
45
|
+
const plannerOutput = lastAssistantText(plannerSession.messages);
|
|
46
|
+
printBox('Plan', plannerOutput || '(no output from planner)');
|
|
47
|
+
const approved = await askApproval(chalk.bold('\nApprove this plan and proceed? [Y/n] '));
|
|
48
|
+
if (!approved) {
|
|
49
|
+
console.log(chalk.red('Pipeline aborted by user.'));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// ── 2. Researcher ─────────────────────────────────────────────────────────
|
|
53
|
+
printStageHeader(2, 5, 'Research');
|
|
54
|
+
const researcherConfig = { ...config, silent: true, maxTurns: 10 };
|
|
55
|
+
const researcherSession = await runAgent(`You are a research agent. The task is: '${task}'\nThe plan is:\n${plannerOutput}\n\nRead all relevant files, understand the codebase, and write a detailed technical analysis. Do NOT make changes. Output everything you learn as structured notes.`, researcherConfig);
|
|
56
|
+
const researcherOutput = lastAssistantText(researcherSession.messages);
|
|
57
|
+
// ── 3. Coder ──────────────────────────────────────────────────────────────
|
|
58
|
+
printStageHeader(3, 5, 'Coding');
|
|
59
|
+
const coderConfig = { ...config, maxTurns: 20 };
|
|
60
|
+
await runAgent(`You are a coding agent. Implement this task: '${task}'\nPlan:\n${plannerOutput}\nResearch:\n${researcherOutput}\n\nImplement the plan step by step. Write tests as you go.`, coderConfig);
|
|
61
|
+
// ── 4. Reviewer ───────────────────────────────────────────────────────────
|
|
62
|
+
printStageHeader(4, 5, 'Review');
|
|
63
|
+
const reviewerConfig = { ...config, silent: true, maxTurns: 8 };
|
|
64
|
+
const reviewerSession = await runAgent(`You are a code reviewer. Review the implementation for task: '${task}'. Check for: correctness, security vulnerabilities, performance issues, missing tests, breaking changes. List issues found with file:line references.`, reviewerConfig);
|
|
65
|
+
const reviewOutput = lastAssistantText(reviewerSession.messages);
|
|
66
|
+
if (reviewOutput) {
|
|
67
|
+
printBox('Review Findings', reviewOutput);
|
|
68
|
+
}
|
|
69
|
+
// ── 5. Tester ─────────────────────────────────────────────────────────────
|
|
70
|
+
printStageHeader(5, 5, 'Testing');
|
|
71
|
+
const testerConfig = { ...config, silent: true, maxTurns: 10 };
|
|
72
|
+
const testerSession = await runAgent(`You are a test agent. Run the test suite. If tests fail, fix the failures. Report final test status.`, testerConfig);
|
|
73
|
+
const testOutput = lastAssistantText(testerSession.messages);
|
|
74
|
+
if (testOutput) {
|
|
75
|
+
console.log(chalk.green('\nTest Report:\n') + testOutput);
|
|
76
|
+
}
|
|
77
|
+
console.log(chalk.green.bold('\n✓ Pipeline complete.'));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PluginPack {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
detectPattern: string[];
|
|
5
|
+
systemPromptAddition: string;
|
|
6
|
+
toolHints: string[];
|
|
7
|
+
conventions: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare const PLUGIN_PACKS: Record<string, PluginPack>;
|
|
10
|
+
export declare function detectActivePacks(cwd: string): Promise<PluginPack[]>;
|
|
11
|
+
export declare function getPackSystemPrompt(cwd: string): Promise<string>;
|
|
12
|
+
export declare function listPluginPacks(): Promise<void>;
|
|
13
|
+
export declare function installPluginPack(packName: string, cwd: string): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=plugin-packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-packs.d.ts","sourceRoot":"","sources":["../src/plugin-packs.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAwEnD,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAO1E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBrD;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BpF"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { globby } from 'globby';
|
|
5
|
+
import { appendMemory } from './memory.js';
|
|
6
|
+
export const PLUGIN_PACKS = {
|
|
7
|
+
react: {
|
|
8
|
+
name: 'React',
|
|
9
|
+
description: 'React component and hooks patterns',
|
|
10
|
+
detectPattern: ['src/**/*.tsx', 'src/**/*.jsx'],
|
|
11
|
+
systemPromptAddition: `Use functional components exclusively — no class components. Define all hooks (useState, useEffect, useMemo, useCallback) before any JSX. Keep derived state out of useState; compute it inline or with useMemo. Avoid direct DOM manipulation; use refs only for imperative APIs (focus, animation). Memoize expensive renders with React.memo and costly computations with useMemo. Extract repeated logic into custom hooks. Prefer composition over prop-drilling; reach for Context only for truly global state.`,
|
|
12
|
+
toolHints: ['Search for existing hooks before creating new ones', 'Check component exports are named, not default where possible'],
|
|
13
|
+
conventions: ['Functional components only', 'Hooks before JSX', 'Co-locate component state', 'No direct DOM manipulation'],
|
|
14
|
+
},
|
|
15
|
+
nextjs: {
|
|
16
|
+
name: 'Next.js',
|
|
17
|
+
description: 'Next.js App Router and Pages Router conventions',
|
|
18
|
+
detectPattern: ['pages/**', 'app/**', 'next.config.*'],
|
|
19
|
+
systemPromptAddition: `Default to Server Components in the App Router — add "use client" only when you need browser APIs, event handlers, or React state/effects. Keep data-fetching in server components or route handlers; never expose credentials to the client. Use next/image for all images (automatic optimization). Use next/link for internal navigation. Prefer generateStaticParams + static rendering for content that rarely changes. Use route groups (parentheses directories) to share layouts without affecting the URL.`,
|
|
20
|
+
toolHints: ['Distinguish app/ vs pages/ routing before editing', 'Check for middleware.ts at project root'],
|
|
21
|
+
conventions: ['Server components by default', '"use client" only when required', 'File-based routing — match URL structure', 'next/image and next/link over raw HTML'],
|
|
22
|
+
},
|
|
23
|
+
typescript: {
|
|
24
|
+
name: 'TypeScript',
|
|
25
|
+
description: 'TypeScript strict-mode patterns and type safety',
|
|
26
|
+
detectPattern: ['tsconfig.json'],
|
|
27
|
+
systemPromptAddition: `Always enable strict mode. Provide explicit return types on all exported functions and class methods. Prefer interfaces for object shapes that may be extended; use type aliases for unions, intersections, and mapped types. Never use any — use unknown and narrow it, or unknown[] over any[]. Avoid non-null assertion (!); prefer optional chaining and nullish coalescing. Use const assertions (as const) for literal tuples and enums.`,
|
|
28
|
+
toolHints: ['Run tsc --noEmit to check types before finalising', 'Check tsconfig.json paths for aliases'],
|
|
29
|
+
conventions: ['Strict mode always on', 'Explicit return types on public APIs', 'No `any` — use `unknown` and narrow', 'Prefer `interface` for extendable shapes'],
|
|
30
|
+
},
|
|
31
|
+
prisma: {
|
|
32
|
+
name: 'Prisma',
|
|
33
|
+
description: 'Prisma ORM query patterns and migration safety',
|
|
34
|
+
detectPattern: ['prisma/schema.prisma'],
|
|
35
|
+
systemPromptAddition: `Never write raw SQL — use Prisma Client methods. Wrap all multi-table writes in prisma.$transaction(). Always handle the P2002 unique constraint error when creating records that could conflict. Use select/include explicitly rather than fetching entire records. Run prisma migrate dev in development; prisma migrate deploy in CI/CD. Keep the schema file as the single source of truth — do not edit the database directly.`,
|
|
36
|
+
toolHints: ['Read prisma/schema.prisma before writing queries', 'Check for existing relations before adding new ones'],
|
|
37
|
+
conventions: ['Never raw SQL', 'Transactions for multi-table writes', 'Handle P2002 uniqueness errors', 'Explicit select/include — no over-fetching'],
|
|
38
|
+
},
|
|
39
|
+
terraform: {
|
|
40
|
+
name: 'Terraform',
|
|
41
|
+
description: 'Terraform IaC patterns and remote state management',
|
|
42
|
+
detectPattern: ['*.tf', '**/*.tf'],
|
|
43
|
+
systemPromptAddition: `Organise infrastructure into reusable modules; call them from a root module. Tag every resource with at minimum: project, environment, managed-by=terraform. Store state in a remote backend (S3+DynamoDB, GCS, or Terraform Cloud) — never commit .tfstate files. Never hardcode secrets; use variable inputs sourced from a secrets manager or CI environment. Run terraform fmt and terraform validate before every plan. Use terraform plan output files (-out=tfplan) to guarantee apply matches the reviewed plan.`,
|
|
44
|
+
toolHints: ['Check for existing modules before adding resources', 'Verify backend config in terraform block'],
|
|
45
|
+
conventions: ['Use modules for reusable patterns', 'Tag all resources', 'Remote state backend mandatory', 'No hardcoded secrets'],
|
|
46
|
+
},
|
|
47
|
+
django: {
|
|
48
|
+
name: 'Django',
|
|
49
|
+
description: 'Django ORM, views, and application structure',
|
|
50
|
+
detectPattern: ['manage.py', '**/settings.py'],
|
|
51
|
+
systemPromptAddition: `Use the Django ORM exclusively — no raw SQL unless profiling proves it necessary, and even then wrap it in connection.execute with parameterised queries. Keep views thin: move business logic to service functions or model methods. Use Django signals only for cross-app side effects, not within the same app. Always use select_related and prefetch_related to avoid N+1 queries. Validate data with forms or serialisers before it reaches the model. Use environment variables (via django-environ or python-decouple) for all settings that vary between environments.`,
|
|
52
|
+
toolHints: ['Check INSTALLED_APPS before adding new models', 'Verify migration state before schema changes'],
|
|
53
|
+
conventions: ['Use ORM — no raw SQL', 'Thin views, fat models/services', 'Signals for cross-app effects only', 'select_related/prefetch_related to avoid N+1'],
|
|
54
|
+
},
|
|
55
|
+
postgres: {
|
|
56
|
+
name: 'PostgreSQL',
|
|
57
|
+
description: 'PostgreSQL query optimisation and migration practices',
|
|
58
|
+
detectPattern: ['migrations/**', '**/*.sql'],
|
|
59
|
+
systemPromptAddition: `Always add indexes on foreign key columns — PostgreSQL does not create them automatically. Use EXPLAIN ANALYZE to verify query plans before committing optimisations. Wrap multi-step writes in explicit transactions (BEGIN/COMMIT). Prefer UPSERT (INSERT ... ON CONFLICT) over separate SELECT+INSERT. Use SERIAL or IDENTITY columns for surrogate keys, not application-generated UUIDs unless globally unique IDs are required. Never run DDL (ALTER TABLE, DROP) directly in production without a tested rollback script.`,
|
|
60
|
+
toolHints: ['Check for existing indexes before adding new ones', 'Review EXPLAIN ANALYZE output for seq scans on large tables'],
|
|
61
|
+
conventions: ['Index all foreign keys', 'EXPLAIN ANALYZE before optimising', 'Transactions for multi-step writes', 'Rollback script before DDL in production'],
|
|
62
|
+
},
|
|
63
|
+
docker: {
|
|
64
|
+
name: 'Docker',
|
|
65
|
+
description: 'Dockerfile best practices and Compose patterns',
|
|
66
|
+
detectPattern: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml', 'compose.yml'],
|
|
67
|
+
systemPromptAddition: `Use multi-stage builds to keep production images small — build in one stage, copy artefacts into a minimal runtime image. Run processes as a non-root user; add a dedicated user in the Dockerfile and switch with USER. Pin base image versions to specific digests or tags (never use latest in production). Order layers from least to most frequently changed to maximise cache reuse. Use .dockerignore to exclude node_modules, .git, and build artefacts. In Compose, use named volumes for persistent data and healthchecks for service dependencies.`,
|
|
68
|
+
toolHints: ['Check .dockerignore exists before building', 'Verify non-root USER instruction is present'],
|
|
69
|
+
conventions: ['Multi-stage builds', 'Non-root user', 'Pin image versions', 'Layer order: deps before source'],
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
export async function detectActivePacks(cwd) {
|
|
73
|
+
const active = [];
|
|
74
|
+
for (const pack of Object.values(PLUGIN_PACKS)) {
|
|
75
|
+
const matches = await globby(pack.detectPattern, { cwd, onlyFiles: false });
|
|
76
|
+
if (matches.length > 0)
|
|
77
|
+
active.push(pack);
|
|
78
|
+
}
|
|
79
|
+
return active;
|
|
80
|
+
}
|
|
81
|
+
export async function getPackSystemPrompt(cwd) {
|
|
82
|
+
const active = await detectActivePacks(cwd);
|
|
83
|
+
if (active.length === 0)
|
|
84
|
+
return '';
|
|
85
|
+
const sections = active
|
|
86
|
+
.map(p => `### ${p.name}\n${p.systemPromptAddition}`)
|
|
87
|
+
.join('\n\n');
|
|
88
|
+
return `## Framework context (auto-detected)\n\n${sections}`;
|
|
89
|
+
}
|
|
90
|
+
export async function listPluginPacks() {
|
|
91
|
+
console.log(chalk.bold('\nAvailable plugin packs:\n'));
|
|
92
|
+
const nameW = 12;
|
|
93
|
+
const descW = 44;
|
|
94
|
+
const header = chalk.cyan('Name'.padEnd(nameW)) +
|
|
95
|
+
chalk.cyan('Description'.padEnd(descW)) +
|
|
96
|
+
chalk.cyan('Detect patterns');
|
|
97
|
+
console.log(header);
|
|
98
|
+
console.log('─'.repeat(nameW + descW + 40));
|
|
99
|
+
for (const pack of Object.values(PLUGIN_PACKS)) {
|
|
100
|
+
const name = chalk.green(pack.name.padEnd(nameW));
|
|
101
|
+
const desc = pack.description.padEnd(descW);
|
|
102
|
+
const patterns = chalk.dim(pack.detectPattern.join(', '));
|
|
103
|
+
console.log(`${name}${desc}${patterns}`);
|
|
104
|
+
}
|
|
105
|
+
console.log();
|
|
106
|
+
}
|
|
107
|
+
export async function installPluginPack(packName, cwd) {
|
|
108
|
+
const pack = PLUGIN_PACKS[packName];
|
|
109
|
+
if (!pack) {
|
|
110
|
+
console.error(chalk.red(`Unknown plugin pack: ${packName}`));
|
|
111
|
+
console.error(chalk.dim(`Available: ${Object.keys(PLUGIN_PACKS).join(', ')}`));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
// Append conventions to MEMORY.md
|
|
115
|
+
const conventionBlock = pack.conventions.map(c => `- ${c}`).join('\n');
|
|
116
|
+
await appendMemory(cwd, `${pack.name} conventions:\n${conventionBlock}`, 'conventions');
|
|
117
|
+
// Update packs.json
|
|
118
|
+
const packsFile = path.join(cwd, '.koneck', 'packs.json');
|
|
119
|
+
let installed = [];
|
|
120
|
+
try {
|
|
121
|
+
const raw = await fs.readFile(packsFile, 'utf-8');
|
|
122
|
+
installed = JSON.parse(raw);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// file absent — start fresh
|
|
126
|
+
}
|
|
127
|
+
if (!installed.includes(packName)) {
|
|
128
|
+
installed.push(packName);
|
|
129
|
+
await fs.mkdir(path.dirname(packsFile), { recursive: true });
|
|
130
|
+
await fs.writeFile(packsFile, JSON.stringify(installed, null, 2) + '\n', 'utf-8');
|
|
131
|
+
}
|
|
132
|
+
console.log(chalk.green(`✔ Installed ${chalk.bold(pack.name)} pack`));
|
|
133
|
+
console.log(chalk.dim(` Conventions added to .koneck/MEMORY.md`));
|
|
134
|
+
console.log(chalk.dim(` Pack recorded in .koneck/packs.json`));
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=plugin-packs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-packs.js","sourceRoot":"","sources":["../src/plugin-packs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getCached(key: string, cwd: string): Promise<string | null>;
|
|
2
|
+
export declare function setCached(key: string, value: string, cwd: string, ttlSeconds?: number): Promise<void>;
|
|
3
|
+
export declare function clearCache(cwd: string): Promise<void>;
|
|
4
|
+
export declare function getCacheStats(cwd: string): Promise<{
|
|
5
|
+
entries: number;
|
|
6
|
+
sizeKb: number;
|
|
7
|
+
oldestEntry: string | null;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=reasoning-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-cache.d.ts","sourceRoot":"","sources":["../src/reasoning-cache.ts"],"names":[],"mappings":"AAwBA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUhF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzG;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3D;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAqB1E"}
|