ownkey 1.2.0 → 1.4.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 +69 -1
- package/dist/ai/anthropic.d.ts +2 -3
- package/dist/ai/anthropic.d.ts.map +1 -1
- package/dist/ai/anthropic.js +5 -15
- package/dist/ai/anthropic.js.map +1 -1
- package/dist/ai/gemini.d.ts +3 -3
- package/dist/ai/gemini.d.ts.map +1 -1
- package/dist/ai/gemini.js +9 -20
- package/dist/ai/gemini.js.map +1 -1
- package/dist/ai/ollama.d.ts +7 -3
- package/dist/ai/ollama.d.ts.map +1 -1
- package/dist/ai/ollama.js +27 -17
- package/dist/ai/ollama.js.map +1 -1
- package/dist/ai/openai.d.ts +2 -3
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +7 -15
- package/dist/ai/openai.js.map +1 -1
- package/dist/ai/provider.d.ts +17 -8
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +16 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/bench/cases.d.ts +5 -0
- package/dist/bench/cases.d.ts.map +1 -1
- package/dist/bench/cases.js +47 -0
- package/dist/bench/cases.js.map +1 -1
- package/dist/commands/bench.d.ts +2 -1
- package/dist/commands/bench.d.ts.map +1 -1
- package/dist/commands/bench.js +13 -5
- package/dist/commands/bench.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +25 -3
- package/dist/commands/review.js.map +1 -1
- package/dist/core/review/agent.d.ts +58 -0
- package/dist/core/review/agent.d.ts.map +1 -0
- package/dist/core/review/agent.js +225 -0
- package/dist/core/review/agent.js.map +1 -0
- package/dist/core/review/report.d.ts +2 -2
- package/dist/core/review/report.d.ts.map +1 -1
- package/dist/core/review/report.js +4 -2
- package/dist/core/review/report.js.map +1 -1
- package/dist/core/review/run.d.ts +11 -2
- package/dist/core/review/run.d.ts.map +1 -1
- package/dist/core/review/run.js +12 -4
- package/dist/core/review/run.js.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/App.d.ts +25 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +123 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/Keeper.d.ts +18 -0
- package/dist/ui/Keeper.d.ts.map +1 -0
- package/dist/ui/Keeper.js +45 -0
- package/dist/ui/Keeper.js.map +1 -0
- package/dist/ui/complete.d.ts +22 -0
- package/dist/ui/complete.d.ts.map +1 -0
- package/dist/ui/complete.js +41 -0
- package/dist/ui/complete.js.map +1 -0
- package/dist/ui/context.d.ts +11 -0
- package/dist/ui/context.d.ts.map +1 -0
- package/dist/ui/context.js +37 -0
- package/dist/ui/context.js.map +1 -0
- package/dist/ui/keeper-term.d.ts +33 -0
- package/dist/ui/keeper-term.d.ts.map +1 -0
- package/dist/ui/keeper-term.js +104 -0
- package/dist/ui/keeper-term.js.map +1 -0
- package/dist/ui/keeper.d.ts +60 -0
- package/dist/ui/keeper.d.ts.map +1 -0
- package/dist/ui/keeper.js +167 -0
- package/dist/ui/keeper.js.map +1 -0
- package/dist/ui/session.d.ts +6 -0
- package/dist/ui/session.d.ts.map +1 -0
- package/dist/ui/session.js +139 -0
- package/dist/ui/session.js.map +1 -0
- package/dist/ui/words.d.ts +6 -0
- package/dist/ui/words.d.ts.map +1 -0
- package/dist/ui/words.js +46 -0
- package/dist/ui/words.js.map +1 -0
- package/package.json +16 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAuE3D,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAIjE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1F"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { render } from 'ink';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
|
5
|
+
import { homedir, tmpdir } from 'os';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { Prompt } from './App.js';
|
|
9
|
+
import { BUILTINS } from './complete.js';
|
|
10
|
+
import { loadSessionInfo } from './context.js';
|
|
11
|
+
import { splitWords } from './words.js';
|
|
12
|
+
const HISTORY_FILE = join(homedir(), '.ownkey', 'history');
|
|
13
|
+
const HISTORY_MAX = 500;
|
|
14
|
+
const STATE_FILE = join(tmpdir(), `ownkey-session-${process.pid}.json`);
|
|
15
|
+
/** The mood a command reported for Keeper, if it reported one; clears it for the next. */
|
|
16
|
+
function takeReportedMood() {
|
|
17
|
+
try {
|
|
18
|
+
const { mood } = JSON.parse(readFileSync(STATE_FILE, 'utf-8'));
|
|
19
|
+
rmSync(STATE_FILE, { force: true });
|
|
20
|
+
return mood;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function loadHistory() {
|
|
27
|
+
try {
|
|
28
|
+
return readFileSync(HISTORY_FILE, 'utf-8').split('\n').filter(Boolean).slice(-HISTORY_MAX);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function saveHistory(history) {
|
|
35
|
+
try {
|
|
36
|
+
mkdirSync(join(homedir(), '.ownkey'), { recursive: true });
|
|
37
|
+
writeFileSync(HISTORY_FILE, history.slice(-HISTORY_MAX).join('\n') + '\n', { mode: 0o600 });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// History is a convenience; never fail a session over it
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function ask(props) {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
let answer = null;
|
|
46
|
+
const app = render(_jsx(Prompt, { ...props, onDone: (line) => (answer = line) }), { exitOnCtrlC: false });
|
|
47
|
+
app.waitUntilExit().then(() => resolve(answer));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/** Run one ownkey command as a child process with the real terminal, exactly as if typed in a shell. */
|
|
51
|
+
function runCommand(args) {
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
// Ctrl+C belongs to the running command; the session survives it
|
|
54
|
+
const ignore = () => undefined;
|
|
55
|
+
process.on('SIGINT', ignore);
|
|
56
|
+
const child = spawn(process.execPath, [...process.execArgv, process.argv[1], ...args], {
|
|
57
|
+
stdio: 'inherit',
|
|
58
|
+
env: { ...process.env, OWNKEY_NO_UI: '1', OWNKEY_SESSION_STATE: STATE_FILE },
|
|
59
|
+
});
|
|
60
|
+
const done = (code) => {
|
|
61
|
+
process.off('SIGINT', ignore);
|
|
62
|
+
resolve(code);
|
|
63
|
+
};
|
|
64
|
+
child.on('error', () => done(2));
|
|
65
|
+
child.on('close', (code, signal) => done(code ?? (signal ? 130 : 1)));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function printHelp(commands) {
|
|
69
|
+
const rows = [...commands, ...BUILTINS];
|
|
70
|
+
console.log('');
|
|
71
|
+
for (const c of rows)
|
|
72
|
+
console.log(` ${chalk.bold(c.name.padEnd(10))} ${chalk.gray(c.description)}`);
|
|
73
|
+
console.log(chalk.gray('\n Add --help to any command for its options, e.g. review --help'));
|
|
74
|
+
console.log(chalk.gray(' Keys: Tab complete, ↑↓ history or suggestions, ←→ move, Ctrl+U clear line, Esc clear, Ctrl+D exit\n'));
|
|
75
|
+
}
|
|
76
|
+
/** Exit codes: review uses 1 for findings at --fail-on, and 2 for an error. */
|
|
77
|
+
export function moodFor(command, code) {
|
|
78
|
+
if (code === 0)
|
|
79
|
+
return 'clean';
|
|
80
|
+
if (code === 1 && (command === 'review' || command === 'bench'))
|
|
81
|
+
return 'found';
|
|
82
|
+
return 'error';
|
|
83
|
+
}
|
|
84
|
+
export async function startSession(commands, version) {
|
|
85
|
+
const history = loadHistory();
|
|
86
|
+
const known = new Set(commands.map((c) => c.name));
|
|
87
|
+
let banner = version;
|
|
88
|
+
// Keeper wears the outcome of the last command at the next prompt
|
|
89
|
+
let mood = 'idle';
|
|
90
|
+
for (;;) {
|
|
91
|
+
const info = await loadSessionInfo(process.cwd(), version);
|
|
92
|
+
const line = await ask({ info, commands, history, banner, mood });
|
|
93
|
+
banner = undefined;
|
|
94
|
+
mood = 'idle';
|
|
95
|
+
if (line === null)
|
|
96
|
+
break;
|
|
97
|
+
const trimmed = line.trim();
|
|
98
|
+
if (!trimmed)
|
|
99
|
+
continue;
|
|
100
|
+
if (history[history.length - 1] !== trimmed)
|
|
101
|
+
history.push(trimmed);
|
|
102
|
+
saveHistory(history);
|
|
103
|
+
let args;
|
|
104
|
+
try {
|
|
105
|
+
args = splitWords(trimmed);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
console.log(chalk.red(` ${e.message}`));
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (args[0] === 'ownkey')
|
|
112
|
+
args = args.slice(1);
|
|
113
|
+
const [name] = args;
|
|
114
|
+
if (!name)
|
|
115
|
+
continue;
|
|
116
|
+
if (name === 'exit' || name === 'quit' || name === 'q')
|
|
117
|
+
break;
|
|
118
|
+
if (name === 'help' || name === '?') {
|
|
119
|
+
printHelp(commands);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (name === 'clear' || name === 'cls') {
|
|
123
|
+
process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (!known.has(name) && !name.startsWith('-')) {
|
|
127
|
+
console.log(chalk.yellow(` Unknown command "${name}". Type help to see them all.`));
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const started = Date.now();
|
|
131
|
+
const code = await runCommand(args);
|
|
132
|
+
mood = takeReportedMood() ?? moodFor(name, code);
|
|
133
|
+
const secs = ((Date.now() - started) / 1000).toFixed(1);
|
|
134
|
+
console.log(code === 0 ? chalk.gray(` ✓ done in ${secs}s\n`) : chalk.red(` ✗ exited with code ${code} after ${secs}s\n`));
|
|
135
|
+
}
|
|
136
|
+
rmSync(STATE_FILE, { force: true });
|
|
137
|
+
console.log(chalk.gray(' Bye.'));
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a typed command line into arguments the way a shell would for simple cases:
|
|
3
|
+
* whitespace separates, single and double quotes group, backslash escapes the next character.
|
|
4
|
+
*/
|
|
5
|
+
export declare function splitWords(line: string): string[];
|
|
6
|
+
//# sourceMappingURL=words.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../../src/ui/words.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BjD"}
|
package/dist/ui/words.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a typed command line into arguments the way a shell would for simple cases:
|
|
3
|
+
* whitespace separates, single and double quotes group, backslash escapes the next character.
|
|
4
|
+
*/
|
|
5
|
+
export function splitWords(line) {
|
|
6
|
+
const out = [];
|
|
7
|
+
let cur = '';
|
|
8
|
+
let quote = null;
|
|
9
|
+
let has = false;
|
|
10
|
+
for (let i = 0; i < line.length; i++) {
|
|
11
|
+
const ch = line[i];
|
|
12
|
+
if (quote) {
|
|
13
|
+
if (ch === quote)
|
|
14
|
+
quote = null;
|
|
15
|
+
else if (ch === '\\' && quote === '"' && i + 1 < line.length)
|
|
16
|
+
cur += line[++i];
|
|
17
|
+
else
|
|
18
|
+
cur += ch;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (ch === '"' || ch === "'") {
|
|
22
|
+
quote = ch;
|
|
23
|
+
has = true;
|
|
24
|
+
}
|
|
25
|
+
else if (ch === '\\' && i + 1 < line.length) {
|
|
26
|
+
cur += line[++i];
|
|
27
|
+
has = true;
|
|
28
|
+
}
|
|
29
|
+
else if (/\s/.test(ch)) {
|
|
30
|
+
if (has)
|
|
31
|
+
out.push(cur);
|
|
32
|
+
cur = '';
|
|
33
|
+
has = false;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
cur += ch;
|
|
37
|
+
has = true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (quote)
|
|
41
|
+
throw new Error('Unclosed quote');
|
|
42
|
+
if (has)
|
|
43
|
+
out.push(cur);
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=words.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"words.js","sourceRoot":"","sources":["../../src/ui/words.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,KAAK,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC;iBAC1B,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;gBAC1E,GAAG,IAAI,EAAE,CAAC;YACf,SAAS;QACb,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC3B,KAAK,GAAG,EAAE,CAAC;YACX,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACjB,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,IAAI,GAAG;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,GAAG,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,KAAK,CAAC;QAChB,CAAC;aAAM,CAAC;YACJ,GAAG,IAAI,EAAE,CAAC;YACV,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;IACL,CAAC;IACD,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,GAAG;QAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ownkey",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Local-first AI code reviewer CLI: review git changes, gate PRs with SARIF, and apply verified fixes using your own OpenAI, Anthropic, Gemini, or Ollama keys",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -56,24 +56,28 @@
|
|
|
56
56
|
"node": ">=18.0.0"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
+
"chalk": "^5.3.0",
|
|
59
60
|
"commander": "^12.1.0",
|
|
61
|
+
"diff": "^7.0.0",
|
|
60
62
|
"drizzle-orm": "^0.36.4",
|
|
61
|
-
"postgres": "^3.4.5",
|
|
62
|
-
"chalk": "^5.3.0",
|
|
63
|
-
"ora": "^8.1.1",
|
|
64
|
-
"inquirer": "^12.2.0",
|
|
65
63
|
"ignore": "^6.0.2",
|
|
66
|
-
"
|
|
67
|
-
"
|
|
64
|
+
"ink": "^5.2.1",
|
|
65
|
+
"inquirer": "^12.2.0",
|
|
66
|
+
"keytar": "^7.9.0",
|
|
67
|
+
"ora": "^8.1.1",
|
|
68
|
+
"postgres": "^3.4.5",
|
|
69
|
+
"react": "^18.3.1"
|
|
68
70
|
},
|
|
69
71
|
"devDependencies": {
|
|
70
|
-
"@types/node": "^22.10.5",
|
|
71
72
|
"@types/diff": "^6.0.0",
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
73
|
+
"@types/node": "^22.10.5",
|
|
74
|
+
"@types/react": "^18.3.31",
|
|
75
|
+
"drizzle-kit": "^0.30.1",
|
|
75
76
|
"eslint": "^9.18.0",
|
|
77
|
+
"ink-testing-library": "^4.0.0",
|
|
76
78
|
"prettier": "^3.4.2",
|
|
77
|
-
"
|
|
79
|
+
"tsx": "^4.19.2",
|
|
80
|
+
"typescript": "^5.7.3",
|
|
81
|
+
"vitest": "^2.1.8"
|
|
78
82
|
}
|
|
79
83
|
}
|