@agentskit/code-review 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-adapter.js","sourceRoot":"","sources":["../../src/claude-code-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,gFAAgF;QAChF,kFAAkF;QAClF,iEAAiE;QACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACrH,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,GAAG,GAA2C,CAAC;gBACtD,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;gBAClB,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;gBAClB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA2B,EAAE;IACtD,OAAO;QACL,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE;QACvE,YAAY,EAAE,CAAC,OAAuB,EAAgB,EAAE,CAAC,CAAC;YACxD,MAAM,EAAE,KAAK,SAAS,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;oBAChF,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ;yBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;yBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;yBACnD,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;oBAE3C,IAAI,MAAM,GAAG,GAAG,MAAM,OAAO,KAAK,EAAE,CAAC;oBACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;wBACpB,MAAM,IAAI,8DAA8D,CAAC,CAAC,IAAI,yEAAyE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpL,CAAC;oBAED,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC5B,IAAI,IAAI,CAAC,KAAK;wBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACjD,MAAM,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBAClH,CAAC;yBAAM,CAAC;wBACN,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;oBACvC,CAAC;oBACD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACzB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,uEAAuE;oBACvE,4EAA4E;oBAC5E,MAAM,CAAC,GAAG,GAA6D,CAAC;oBACxE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACrE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACpJ,CAAC;YACH,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;SAChB,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thin local CLI over the registry `code-review` agent. Provider-agnostic:
4
+ * `--provider <name>` selects a local CLI or any @agentskit/adapters
5
+ * factory (anthropic, openai, gemini, grok, ollama, deepseek, mistral, groq,
6
+ * openrouter, together, …).
7
+ *
8
+ * agentskit-review --provider codex-cli # local CLI, git diff vs origin/main
9
+ * code-review --pr owner/repo#42 --post # post a batched PR review (GITHUB_TOKEN)
10
+ * code-review --provider openai --model gpt-4o # any provider (key via --api-key / *_API_KEY / LLM_API_KEY)
11
+ * code-review --provider ollama --model llama3 --base-url http://localhost:11434
12
+ * echo "const x=a.b" | code-review --stdin --lang ts
13
+ *
14
+ * Exit code: 1 when a finding at/above --block survives (unless --no-fail) — wire to CI.
15
+ */
16
+ import * as adapters from '@agentskit/adapters';
17
+ import { createProgressObserver } from '@agentskit/ink';
18
+ import { readFileSync } from 'node:fs';
19
+ import { createCodeReviewAgent } from '../agents/code-review/agent.js';
20
+ import { githubInlineReporter, githubSummaryReporter, markdownReporter, sarifReporter } from '../agents/code-review/reporters.js';
21
+ import { claudeCode } from './claude-code-adapter.js';
22
+ import { codexCli } from './codex-adapter.js';
23
+ const HELP = `AgentsKit Code Review — deep, low-noise review with your model
24
+
25
+ Usage:
26
+ agentskit-review --provider <name> [options]
27
+
28
+ Providers:
29
+ codex-cli, claude-cli, or any @agentskit/adapters provider
30
+ (anthropic, openai, gemini, ollama, openrouter, mistral, groq, ...)
31
+
32
+ Examples:
33
+ agentskit-review --provider codex-cli
34
+ agentskit-review --provider claude-cli --base main
35
+ agentskit-review --provider openai --model gpt-4o
36
+ agentskit-review --provider ollama --model llama3 --base-url http://localhost:11434
37
+
38
+ Sources:
39
+ --base <ref> Review the git diff against a base (default: origin/main)
40
+ --pr <owner/repo#N> Review a GitHub PR (requires GITHUB_TOKEN)
41
+ --paths <paths...> Review complete files or directories
42
+ --stdin [--lang <ext>] Review source from stdin
43
+
44
+ Review options:
45
+ --votes <n> Adversarial verification votes (default: 3)
46
+ --min-severity <level> Minimum finding severity
47
+ --min-confidence <n> Minimum finding confidence
48
+ --block <level> CI gate floor (default: blocker)
49
+ --max-files <n> File budget
50
+ --concurrency <n> Parallel model calls (default: 4)
51
+ --conventions <path> Project conventions file
52
+ --validate-patch Validate suggested patches with git apply --check
53
+ --sarif <file> Also write a SARIF report
54
+ --post Post a PR review (with --pr)
55
+ --no-fail Report findings without failing the process
56
+
57
+ Provider options:
58
+ --model <id> Model id (required for API/local-server providers)
59
+ --api-key <key> Or use LLM_API_KEY / <PROVIDER>_API_KEY
60
+ --base-url <url> Custom endpoint or local gateway
61
+ --api Back-compatible alias for --provider anthropic
62
+
63
+ --help Show this help
64
+ --list-providers List common providers
65
+ `;
66
+ const PROVIDERS = 'codex-cli\nclaude-cli\nanthropic\nopenai\ngemini\ngrok\nollama\ndeepseek\nmistral\ngroq\nopenrouter\ntogether';
67
+ function flag(name) {
68
+ const i = process.argv.indexOf(`--${name}`);
69
+ return i >= 0 ? process.argv[i + 1] : undefined;
70
+ }
71
+ const has = (name) => process.argv.includes(`--${name}`);
72
+ function readStdin() {
73
+ return new Promise((resolve) => {
74
+ let data = '';
75
+ process.stdin.setEncoding('utf8');
76
+ process.stdin.on('data', (c) => (data += c));
77
+ process.stdin.on('end', () => resolve(data));
78
+ });
79
+ }
80
+ async function resolveSource() {
81
+ const pr = flag('pr');
82
+ if (pr) {
83
+ const m = pr.match(/^([^/]+)\/([^#]+)#(\d+)$/);
84
+ if (!m)
85
+ throw new Error('--pr must be owner/repo#number');
86
+ const token = process.env.GITHUB_TOKEN;
87
+ if (!token)
88
+ throw new Error('--pr needs GITHUB_TOKEN');
89
+ return { kind: 'github-pr', owner: m[1], repo: m[2], number: Number(m[3]), token };
90
+ }
91
+ if (has('stdin'))
92
+ return { kind: 'stdin', content: await readStdin(), filename: `snippet.${flag('lang') ?? 'txt'}` };
93
+ if (has('paths')) {
94
+ const i = process.argv.indexOf('--paths');
95
+ const paths = [];
96
+ for (let j = i + 1; j < process.argv.length && !process.argv[j].startsWith('--'); j++)
97
+ paths.push(process.argv[j]);
98
+ if (!paths.length)
99
+ throw new Error('--paths needs at least one file/dir');
100
+ return { kind: 'paths', paths, cwd: process.cwd() };
101
+ }
102
+ return { kind: 'git-diff', base: flag('base') ?? 'origin/main', cwd: process.cwd() };
103
+ }
104
+ async function main() {
105
+ if (has('help') || has('h')) {
106
+ console.log(HELP);
107
+ return;
108
+ }
109
+ if (has('list-providers')) {
110
+ console.log(PROVIDERS);
111
+ return;
112
+ }
113
+ const source = await resolveSource();
114
+ const adapter = buildAdapter();
115
+ const reporters = [markdownReporter()];
116
+ const sarif = flag('sarif');
117
+ if (sarif)
118
+ reporters.push(sarifReporter({ file: sarif }));
119
+ if (has('post') && source.kind === 'github-pr') {
120
+ const { owner, repo, number, token } = source;
121
+ reporters.push(githubInlineReporter({ owner, repo, number, token }), githubSummaryReporter({ owner, repo, number, token }));
122
+ }
123
+ const config = {
124
+ adapter,
125
+ source,
126
+ reporters,
127
+ observers: [createProgressObserver()],
128
+ auditVotes: flag('votes') ? Number(flag('votes')) : undefined,
129
+ validatePatch: has('validate-patch'),
130
+ blockingSeverity: flag('block') ?? 'blocker',
131
+ budget: { maxFiles: flag('max-files') ? Number(flag('max-files')) : undefined, concurrency: flag('concurrency') ? Number(flag('concurrency')) : 4 },
132
+ conventions: flag('conventions') ? { path: flag('conventions') } : autoConventions(),
133
+ thresholds: {
134
+ minSeverity: flag('min-severity'),
135
+ minConfidence: flag('min-confidence') ? Number(flag('min-confidence')) : undefined,
136
+ },
137
+ };
138
+ const review = await createCodeReviewAgent(config).run();
139
+ // --no-fail = advisory: post the review but never fail the job (exit 0). Real errors
140
+ // still surface via the catch below (exit 2).
141
+ process.exit(review.blocking && !has('no-fail') ? 1 : 0);
142
+ }
143
+ /**
144
+ * Provider-neutral adapter selection. Local CLIs are explicit choices; any other
145
+ * name resolves to a `@agentskit/adapters` factory and is given
146
+ * `{ apiKey, model, baseUrl? }`. `--api` is a back-compat alias for `--provider anthropic`.
147
+ */
148
+ function buildAdapter() {
149
+ const provider = flag('provider') ?? (has('api') ? 'anthropic' : undefined);
150
+ if (!provider)
151
+ throw new Error('choose a provider with --provider <name> (run --list-providers for common options)');
152
+ const model = flag('model') ?? (has('api') ? 'claude-opus-4-8' : undefined);
153
+ if (provider === 'claude-cli')
154
+ return claudeCode({ model });
155
+ if (provider === 'codex-cli')
156
+ return codexCli({ model });
157
+ const make = adapters[provider];
158
+ if (typeof make !== 'function') {
159
+ throw new Error(`unknown --provider "${provider}". Use "claude-cli" or any @agentskit/adapters factory (anthropic, openai, gemini, grok, ollama, deepseek, mistral, groq, openrouter, together, …).`);
160
+ }
161
+ if (!model)
162
+ throw new Error(`--model is required for provider "${provider}"`);
163
+ const apiKey = flag('api-key') ?? process.env.LLM_API_KEY ?? process.env[`${provider.toUpperCase()}_API_KEY`] ?? '';
164
+ const baseUrl = flag('base-url');
165
+ return make({ apiKey, model, ...(baseUrl ? { baseUrl } : {}) });
166
+ }
167
+ /** Best-effort: feed a conventions doc to every lens if one exists. */
168
+ function autoConventions() {
169
+ for (const f of ['CONVENTIONS.md', 'CONTRIBUTING.md', '.cursorrules', 'AGENTS.md']) {
170
+ try {
171
+ return readFileSync(f, 'utf8').slice(0, 6000);
172
+ }
173
+ catch {
174
+ /* next */
175
+ }
176
+ }
177
+ return undefined;
178
+ }
179
+ main().catch((e) => {
180
+ console.error(e instanceof Error ? e.message : e);
181
+ process.exit(2);
182
+ });
183
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AdapterFactory } from "@agentskit/core";
2
+ export declare function codexCli(opts?: {
3
+ model?: string;
4
+ }): AdapterFactory;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * AgentsKit adapter backed by the local OpenAI **Codex CLI** (`codex exec`) — the
3
+ * codex equivalent of the claude -p adapter. Uses your logged-in Codex session
4
+ * (ChatGPT subscription), no OPENAI_API_KEY, no per-call API cost. Headless: the
5
+ * prompt goes in as an arg, the final message is written to a temp file via
6
+ * `-o`, sandbox is read-only (the agent only emits JSON, runs no tools).
7
+ */
8
+ import { execFile } from "node:child_process";
9
+ import { mkdtempSync, readFileSync, rmSync } from "node:fs";
10
+ import { tmpdir } from "node:os";
11
+ import { join } from "node:path";
12
+ /** Pull the JSON object out of a reply: first `{` to last `}` over the whole output. */
13
+ function extractJson(text) {
14
+ const start = text.indexOf("{");
15
+ const end = text.lastIndexOf("}");
16
+ if (start === -1 || end === -1 || end < start) {
17
+ throw new Error(`no JSON object in codex output:\n${text.slice(0, 400)}`);
18
+ }
19
+ return text.slice(start, end + 1);
20
+ }
21
+ /** Run `codex exec` and return its final message (captured via -o). */
22
+ function runCodex(prompt, model) {
23
+ return new Promise((resolve, reject) => {
24
+ const dir = mkdtempSync(join(tmpdir(), "cr-codex-"));
25
+ const outFile = join(dir, "out.txt");
26
+ const args = [
27
+ "exec",
28
+ "--skip-git-repo-check",
29
+ "-s",
30
+ "read-only",
31
+ "-C",
32
+ process.env.HOME ?? process.cwd(),
33
+ "-o",
34
+ outFile,
35
+ ];
36
+ if (model)
37
+ args.push("-m", model);
38
+ args.push(prompt);
39
+ const child = execFile("codex", args, { maxBuffer: 20 * 1024 * 1024 }, (err, _stdout, stderr) => {
40
+ let message = "";
41
+ try {
42
+ message = readFileSync(outFile, "utf8");
43
+ }
44
+ catch {
45
+ /* no output file */
46
+ }
47
+ rmSync(dir, { recursive: true, force: true });
48
+ if (message.trim())
49
+ return resolve(message);
50
+ const e = (err ?? new Error("codex produced no output"));
51
+ e.stderr = stderr;
52
+ e.stdout = _stdout;
53
+ reject(e);
54
+ });
55
+ child.stdin?.end(); // headless: don't let codex wait on stdin
56
+ });
57
+ }
58
+ export function codexCli(opts = {}) {
59
+ return {
60
+ capabilities: { streaming: false, tools: true, structuredOutput: true },
61
+ createSource: (request) => ({
62
+ stream: async function* () {
63
+ try {
64
+ const system = request.messages.find((m) => m.role === "system")?.content ?? "";
65
+ const convo = request.messages
66
+ .filter((m) => m.role !== "system")
67
+ .map((m) => `${m.role.toUpperCase()}: ${m.content}`)
68
+ .join("\n\n");
69
+ const tools = request.context?.tools ?? [];
70
+ let prompt = `${system}\n\n${convo}`;
71
+ if (tools.length === 1) {
72
+ const t = tools[0];
73
+ prompt += `\n\nReturn ONLY a JSON object that is the argument to the "${t.name}" tool, matching this JSON Schema exactly. No prose, no code fences:\n${JSON.stringify(t.schema)}`;
74
+ }
75
+ const out = (await runCodex(prompt, opts.model)).trim();
76
+ if (tools.length === 1) {
77
+ yield { type: "tool_call", toolCall: { id: `tc-${Date.now()}`, name: tools[0].name, args: extractJson(out) } };
78
+ }
79
+ else {
80
+ yield { type: "text", content: out };
81
+ }
82
+ yield { type: "done" };
83
+ }
84
+ catch (err) {
85
+ const e = err;
86
+ const detail = [e.stderr, e.stdout].filter(Boolean).join(" ").trim();
87
+ yield { type: "error", content: `codex exec failed${detail ? `: ${detail.slice(0, 400)}` : ` (no output): ${(e.message ?? "").split("\n")[0]}`}` };
88
+ }
89
+ },
90
+ abort: () => { },
91
+ }),
92
+ };
93
+ }
94
+ //# sourceMappingURL=codex-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-adapter.js","sourceRoot":"","sources":["../../src/codex-adapter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@agentskit/code-review",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Provider-agnostic, low-noise AI code review for local development and GitHub Actions.",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "agentskit-review": "dist/src/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/AgentsKit-io/code-review-cli.git"
18
+ },
19
+ "homepage": "https://github.com/AgentsKit-io/code-review-cli#readme",
20
+ "bugs": "https://github.com/AgentsKit-io/code-review-cli/issues",
21
+ "keywords": [
22
+ "ai-code-review",
23
+ "code-review",
24
+ "github-action",
25
+ "llm",
26
+ "ollama"
27
+ ],
28
+ "scripts": {
29
+ "review": "tsx src/cli.ts",
30
+ "build": "tsc -p tsconfig.build.json",
31
+ "typecheck": "tsc --noEmit",
32
+ "check": "npm run typecheck && npm run build && node dist/src/cli.js --help",
33
+ "prepare": "npm run build",
34
+ "prepack": "npm run build"
35
+ },
36
+ "dependencies": {
37
+ "@agentskit/adapters": "^0.12.2",
38
+ "@agentskit/core": "^1.9.0",
39
+ "@agentskit/ink": "^0.9.0",
40
+ "@agentskit/runtime": "^0.7.3",
41
+ "@agentskit/tools": "^0.9.4",
42
+ "zod": "^3.25.0",
43
+ "zod-to-json-schema": "^3.24.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/json-schema": "^7.0.15",
47
+ "@types/node": "^22.10.0",
48
+ "tsx": "^4.19.0",
49
+ "typescript": "^5.7.2"
50
+ },
51
+ "engines": {
52
+ "node": ">=20"
53
+ }
54
+ }