ownkey 1.1.2 → 1.3.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.
Files changed (47) hide show
  1. package/README.md +43 -0
  2. package/dist/ai/factory.d.ts +3 -1
  3. package/dist/ai/factory.d.ts.map +1 -1
  4. package/dist/ai/factory.js +5 -5
  5. package/dist/ai/factory.js.map +1 -1
  6. package/dist/bench/cases.d.ts +25 -0
  7. package/dist/bench/cases.d.ts.map +1 -0
  8. package/dist/bench/cases.js +142 -0
  9. package/dist/bench/cases.js.map +1 -0
  10. package/dist/bench/score.d.ts +46 -0
  11. package/dist/bench/score.d.ts.map +1 -0
  12. package/dist/bench/score.js +61 -0
  13. package/dist/bench/score.js.map +1 -0
  14. package/dist/commands/bench.d.ts +9 -0
  15. package/dist/commands/bench.d.ts.map +1 -0
  16. package/dist/commands/bench.js +169 -0
  17. package/dist/commands/bench.js.map +1 -0
  18. package/dist/commands/review.d.ts.map +1 -1
  19. package/dist/commands/review.js +5 -24
  20. package/dist/commands/review.js.map +1 -1
  21. package/dist/core/review/run.d.ts +20 -0
  22. package/dist/core/review/run.d.ts.map +1 -0
  23. package/dist/core/review/run.js +32 -0
  24. package/dist/core/review/run.js.map +1 -0
  25. package/dist/index.js +17 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/ui/App.d.ts +17 -0
  28. package/dist/ui/App.d.ts.map +1 -0
  29. package/dist/ui/App.js +109 -0
  30. package/dist/ui/App.js.map +1 -0
  31. package/dist/ui/complete.d.ts +22 -0
  32. package/dist/ui/complete.d.ts.map +1 -0
  33. package/dist/ui/complete.js +41 -0
  34. package/dist/ui/complete.js.map +1 -0
  35. package/dist/ui/context.d.ts +11 -0
  36. package/dist/ui/context.d.ts.map +1 -0
  37. package/dist/ui/context.js +37 -0
  38. package/dist/ui/context.js.map +1 -0
  39. package/dist/ui/session.d.ts +3 -0
  40. package/dist/ui/session.d.ts.map +1 -0
  41. package/dist/ui/session.js +114 -0
  42. package/dist/ui/session.js.map +1 -0
  43. package/dist/ui/words.d.ts +6 -0
  44. package/dist/ui/words.d.ts.map +1 -0
  45. package/dist/ui/words.js +46 -0
  46. package/dist/ui/words.js.map +1 -0
  47. package/package.json +16 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/ui/complete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface SessionInfo {
2
+ version: string;
3
+ folder: string;
4
+ branch?: string;
5
+ changed?: number;
6
+ provider?: string;
7
+ model?: string;
8
+ }
9
+ /** What the header shows: where you are, what changed, and which model reviews it. */
10
+ export declare function loadSessionInfo(cwd: string, version: string): Promise<SessionInfo>;
11
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,sFAAsF;AACtF,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBxF"}
@@ -0,0 +1,37 @@
1
+ import { execFileSync } from 'child_process';
2
+ import { basename } from 'path';
3
+ import { configManager } from '../config/manager.js';
4
+ import { AIProviderFactory } from '../ai/factory.js';
5
+ function git(cwd, args) {
6
+ try {
7
+ return execFileSync('git', args, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ /** What the header shows: where you are, what changed, and which model reviews it. */
14
+ export async function loadSessionInfo(cwd, version) {
15
+ const root = git(cwd, ['rev-parse', '--show-toplevel']);
16
+ const info = { version, folder: basename(root ?? cwd) };
17
+ if (root) {
18
+ info.branch = git(root, ['rev-parse', '--abbrev-ref', 'HEAD']) || undefined;
19
+ const status = git(root, ['status', '--porcelain']);
20
+ info.changed = status === undefined ? undefined : status.split('\n').filter(Boolean).length;
21
+ }
22
+ try {
23
+ if (await configManager.exists()) {
24
+ const config = await configManager.load();
25
+ if (config.activeProvider) {
26
+ info.provider = config.activeProvider;
27
+ const p = config.providers[config.activeProvider];
28
+ info.model = p?.model || AIProviderFactory.getRecommendedModel(config.activeProvider);
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ // Unreadable config: the header just shows the setup hint
34
+ }
35
+ return info;
36
+ }
37
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAWrD,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACpC,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,OAAe;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;IACrE,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC;QAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChG,CAAC;IACD,IAAI,CAAC;QACD,IAAI,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;gBACtC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAmC,CAAC;gBACpF,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC1F,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,0DAA0D;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type CommandInfo } from './complete.js';
2
+ export declare function startSession(commands: CommandInfo[], version: string): Promise<void>;
3
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AA2D3D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD1F"}
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from 'ink';
3
+ import { spawn } from 'child_process';
4
+ import { mkdirSync, readFileSync, writeFileSync } from 'fs';
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ import chalk from 'chalk';
8
+ import { Banner, 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
+ function loadHistory() {
15
+ try {
16
+ return readFileSync(HISTORY_FILE, 'utf-8').split('\n').filter(Boolean).slice(-HISTORY_MAX);
17
+ }
18
+ catch {
19
+ return [];
20
+ }
21
+ }
22
+ function saveHistory(history) {
23
+ try {
24
+ mkdirSync(join(homedir(), '.ownkey'), { recursive: true });
25
+ writeFileSync(HISTORY_FILE, history.slice(-HISTORY_MAX).join('\n') + '\n', { mode: 0o600 });
26
+ }
27
+ catch {
28
+ // History is a convenience; never fail a session over it
29
+ }
30
+ }
31
+ function ask(props) {
32
+ return new Promise((resolve) => {
33
+ let answer = null;
34
+ const app = render(_jsx(Prompt, { ...props, onDone: (line) => (answer = line) }), { exitOnCtrlC: false });
35
+ app.waitUntilExit().then(() => resolve(answer));
36
+ });
37
+ }
38
+ /** Run one ownkey command as a child process with the real terminal, exactly as if typed in a shell. */
39
+ function runCommand(args) {
40
+ return new Promise((resolve) => {
41
+ // Ctrl+C belongs to the running command; the session survives it
42
+ const ignore = () => undefined;
43
+ process.on('SIGINT', ignore);
44
+ const child = spawn(process.execPath, [...process.execArgv, process.argv[1], ...args], {
45
+ stdio: 'inherit',
46
+ env: { ...process.env, OWNKEY_NO_UI: '1' },
47
+ });
48
+ const done = (code) => {
49
+ process.off('SIGINT', ignore);
50
+ resolve(code);
51
+ };
52
+ child.on('error', () => done(2));
53
+ child.on('close', (code, signal) => done(code ?? (signal ? 130 : 1)));
54
+ });
55
+ }
56
+ function printHelp(commands) {
57
+ const rows = [...commands, ...BUILTINS];
58
+ console.log('');
59
+ for (const c of rows)
60
+ console.log(` ${chalk.bold(c.name.padEnd(10))} ${chalk.gray(c.description)}`);
61
+ console.log(chalk.gray('\n Add --help to any command for its options, e.g. review --help'));
62
+ console.log(chalk.gray(' Keys: Tab complete, ↑↓ history or suggestions, ←→ move, Ctrl+U clear line, Esc clear, Ctrl+D exit\n'));
63
+ }
64
+ export async function startSession(commands, version) {
65
+ const history = loadHistory();
66
+ const known = new Set(commands.map((c) => c.name));
67
+ const banner = render(_jsx(Banner, { version: version }));
68
+ banner.unmount();
69
+ for (;;) {
70
+ const info = await loadSessionInfo(process.cwd(), version);
71
+ const line = await ask({ info, commands, history });
72
+ if (line === null)
73
+ break;
74
+ const trimmed = line.trim();
75
+ if (!trimmed)
76
+ continue;
77
+ if (history[history.length - 1] !== trimmed)
78
+ history.push(trimmed);
79
+ saveHistory(history);
80
+ let args;
81
+ try {
82
+ args = splitWords(trimmed);
83
+ }
84
+ catch (e) {
85
+ console.log(chalk.red(` ${e.message}`));
86
+ continue;
87
+ }
88
+ if (args[0] === 'ownkey')
89
+ args = args.slice(1);
90
+ const [name] = args;
91
+ if (!name)
92
+ continue;
93
+ if (name === 'exit' || name === 'quit' || name === 'q')
94
+ break;
95
+ if (name === 'help' || name === '?') {
96
+ printHelp(commands);
97
+ continue;
98
+ }
99
+ if (name === 'clear' || name === 'cls') {
100
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
101
+ continue;
102
+ }
103
+ if (!known.has(name) && !name.startsWith('-')) {
104
+ console.log(chalk.yellow(` Unknown command "${name}". Type help to see them all.`));
105
+ continue;
106
+ }
107
+ const started = Date.now();
108
+ const code = await runCommand(args);
109
+ const secs = ((Date.now() - started) / 1000).toFixed(1);
110
+ console.log(code === 0 ? chalk.gray(` ✓ done in ${secs}s\n`) : chalk.red(` ✗ exited with code ${code} after ${secs}s\n`));
111
+ }
112
+ console.log(chalk.gray(' Bye.'));
113
+ }
114
+ //# 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"}
@@ -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.1.2",
3
+ "version": "1.3.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
- "diff": "^7.0.0",
67
- "keytar": "^7.9.0"
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
- "typescript": "^5.7.3",
73
- "tsx": "^4.19.2",
74
- "vitest": "^2.1.8",
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
- "drizzle-kit": "^0.30.1"
79
+ "tsx": "^4.19.2",
80
+ "typescript": "^5.7.3",
81
+ "vitest": "^2.1.8"
78
82
  }
79
83
  }