@agentskit/code-review 0.1.0 → 0.4.1

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 (76) hide show
  1. package/.doc-bridge/capabilities.json +34 -0
  2. package/.doc-bridge/index.json +94 -0
  3. package/.pre-commit-hooks.yaml +9 -0
  4. package/AGENTS.md +20 -0
  5. package/CHANGELOG.md +85 -0
  6. package/CONTRIBUTING.md +45 -0
  7. package/README.md +238 -33
  8. package/ROADMAP.md +20 -0
  9. package/SECURITY.md +16 -0
  10. package/action.yml +120 -0
  11. package/dist/agents/code-review/agent.js +453 -76
  12. package/dist/agents/code-review/agent.js.map +1 -1
  13. package/dist/agents/code-review/lenses.js +17 -1
  14. package/dist/agents/code-review/lenses.js.map +1 -1
  15. package/dist/agents/code-review/reporters.js +83 -7
  16. package/dist/agents/code-review/reporters.js.map +1 -1
  17. package/dist/agents/code-review/sources.js +324 -73
  18. package/dist/agents/code-review/sources.js.map +1 -1
  19. package/dist/src/acp-cli-adapter.js +127 -0
  20. package/dist/src/acp-cli-adapter.js.map +1 -0
  21. package/dist/src/batch-coverage.js +111 -0
  22. package/dist/src/batch-coverage.js.map +1 -0
  23. package/dist/src/claude-code-adapter.js +44 -60
  24. package/dist/src/claude-code-adapter.js.map +1 -1
  25. package/dist/src/cli.js +347 -50
  26. package/dist/src/cli.js.map +1 -1
  27. package/dist/src/codex-adapter.js +114 -69
  28. package/dist/src/codex-adapter.js.map +1 -1
  29. package/dist/src/github-review-state.js +134 -0
  30. package/dist/src/github-review-state.js.map +1 -0
  31. package/dist/src/grok-cli-adapter.js +27 -0
  32. package/dist/src/grok-cli-adapter.js.map +1 -0
  33. package/dist/src/headless-cli-adapter.js +78 -0
  34. package/dist/src/headless-cli-adapter.js.map +1 -0
  35. package/dist/src/local-cli-process.js +328 -0
  36. package/dist/src/local-cli-process.js.map +1 -0
  37. package/dist/src/local-cli-timeout.js +14 -0
  38. package/dist/src/local-cli-timeout.js.map +1 -0
  39. package/dist/src/ollama-adapter.js +155 -0
  40. package/dist/src/ollama-adapter.js.map +1 -0
  41. package/dist/src/opencode-cli-adapter.js +57 -0
  42. package/dist/src/opencode-cli-adapter.js.map +1 -0
  43. package/dist/src/provider-circuit-breaker.js +52 -0
  44. package/dist/src/provider-circuit-breaker.js.map +1 -0
  45. package/dist/src/provider-registry.js +168 -0
  46. package/dist/src/provider-registry.js.map +1 -0
  47. package/dist/src/review-config.js +145 -0
  48. package/dist/src/review-config.js.map +1 -0
  49. package/doc-bridge.config.json +116 -0
  50. package/docs/OPERATIONS.md +358 -0
  51. package/docs/assets/agentskit-mark.svg +10 -0
  52. package/docs/assets/code-review-terminal.png +0 -0
  53. package/docs/continuous-improvement.md +35 -0
  54. package/docs/for-agents/code-review-cli.md +70 -0
  55. package/docs/for-agents/index.md +5 -0
  56. package/docs/plans/ecosystem-doc-quality-code-review.md +61 -0
  57. package/docs/provider-compatibility.json +35 -0
  58. package/ecosystem-claims.json +187 -0
  59. package/ecosystem.json +277 -0
  60. package/examples/pull-request.yml +29 -0
  61. package/llms-full.txt +1049 -0
  62. package/llms.txt +24 -0
  63. package/package.json +53 -7
  64. package/scripts/generate-llms-full.mjs +68 -0
  65. package/scripts/run-cycle-benchmark.mjs +64 -0
  66. package/test/cli-smoke.test.mjs +507 -0
  67. package/test/continuous-improvement.test.mjs +20 -0
  68. package/test/documentation.test.mjs +238 -0
  69. package/test/release-workflow.test.mjs +31 -0
  70. package/dist/agents/code-review/agent.d.ts +0 -115
  71. package/dist/agents/code-review/lenses.d.ts +0 -10
  72. package/dist/agents/code-review/reporters.d.ts +0 -31
  73. package/dist/agents/code-review/sources.d.ts +0 -27
  74. package/dist/src/claude-code-adapter.d.ts +0 -4
  75. package/dist/src/cli.d.ts +0 -2
  76. package/dist/src/codex-adapter.d.ts +0 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-circuit-breaker.js","sourceRoot":"","sources":["../../src/provider-circuit-breaker.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD;QACE,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAKJ;IAAgC;IAJrD,QAAQ,GAAG,CAAC,CAAA;IACZ,QAAQ,GAAG,CAAC,CAAA;IACZ,OAAO,GAAG,KAAK,CAAA;IAEvB,YAA6B,YAAY,CAAC,EAAmB,aAAa,MAAM;QAAnD,cAAS,GAAT,SAAS,CAAI;QAAmB,eAAU,GAAV,UAAU,CAAS;IAAG,CAAC;IAEpF,IAAI,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU;YAAE,OAAO,MAAM,CAAA;QAC/D,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,wBAAwB,EAAE,CAAA;QACrG,IAAI,KAAK,KAAK,WAAW;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IAChD,CAAC;IAED,aAAa;QACX,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,aAAa,CAAC,SAAS,GAAG,KAAK;QAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC9E,CAAC;CACF"}
@@ -0,0 +1,168 @@
1
+ import * as adapters from '@agentskit/adapters';
2
+ import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { runLocalCli } from './local-cli-process.js';
6
+ export const PROVIDER_REGISTRY_VERSION = 1;
7
+ const API_METADATA = {
8
+ anthropic: api('Anthropic', ['ANTHROPIC_API_KEY']),
9
+ openai: api('OpenAI', ['OPENAI_API_KEY']),
10
+ gemini: api('Google Gemini', ['GEMINI_API_KEY']),
11
+ grok: api('xAI Grok API', ['GROK_API_KEY']),
12
+ deepseek: api('DeepSeek', ['DEEPSEEK_API_KEY']),
13
+ mistral: api('Mistral', ['MISTRAL_API_KEY']),
14
+ groq: api('Groq', ['GROQ_API_KEY']),
15
+ openrouter: api('OpenRouter', ['OPENROUTER_API_KEY']),
16
+ together: api('Together AI', ['TOGETHER_API_KEY']),
17
+ };
18
+ const LOCAL_PROVIDERS = [
19
+ cli('codex-cli', 'OpenAI Codex CLI', 'codex', 'stable'),
20
+ cli('claude-cli', 'Claude Code CLI', 'claude', 'stable'),
21
+ {
22
+ ...cli('grok-cli', 'Grok Build CLI', 'grok', 'stable'),
23
+ transports: ['acp', 'headless', 'auto'],
24
+ defaultTransport: 'acp',
25
+ },
26
+ {
27
+ ...cli('opencode-cli', 'OpenCode CLI', 'opencode', 'stable'),
28
+ transports: ['acp', 'headless', 'auto'],
29
+ defaultTransport: 'acp',
30
+ },
31
+ localServer('ollama', 'Ollama local model server', 'stable'),
32
+ ];
33
+ const FACTORY_EXCLUSIONS = /(?:Adapter|Embedder)$|^(?:bail|chunkText|create|fetch|inMemorySink|mock|recording|replay|simulate|langchain|langgraph)/i;
34
+ const KNOWN_API_SUPPORT = new Set(Object.keys(API_METADATA));
35
+ function api(description, credentialEnv) {
36
+ return {
37
+ kind: 'api', support: 'stable', description, transports: ['api'], defaultTransport: 'api', model: 'required',
38
+ dataBoundary: 'remote', credentialEnv, credentialMode: 'api-key',
39
+ capabilities: { streaming: true, tools: true, structuredOutput: true },
40
+ };
41
+ }
42
+ function cli(id, description, executable, support) {
43
+ return {
44
+ id, aliases: [], kind: 'cli', support, description, executable, versionArgs: ['--version'], minimumVersion: '0.1.0',
45
+ transports: ['headless'], defaultTransport: 'headless', model: 'optional', dataBoundary: 'local',
46
+ credentialEnv: [], credentialMode: 'login', capabilities: { streaming: false, tools: true, structuredOutput: true },
47
+ };
48
+ }
49
+ function localServer(id, description, support) {
50
+ return {
51
+ id, aliases: [], kind: 'local-server', support, description,
52
+ transports: ['http'], defaultTransport: 'http', model: 'required', dataBoundary: 'local',
53
+ credentialEnv: [], credentialMode: 'none', capabilities: { streaming: true, tools: true, structuredOutput: true },
54
+ };
55
+ }
56
+ export function discoverApiFactories(source = adapters) {
57
+ return Object.keys(source).filter((name) => typeof source[name] === 'function' && !FACTORY_EXCLUSIONS.test(name)).sort();
58
+ }
59
+ export function providerRegistry(source = adapters) {
60
+ const entries = new Map();
61
+ for (const entry of LOCAL_PROVIDERS)
62
+ entries.set(entry.id, entry);
63
+ for (const id of discoverApiFactories(source)) {
64
+ if (entries.has(id))
65
+ continue;
66
+ const metadata = API_METADATA[id] ?? {
67
+ ...api(`${id} API adapter`, [`${id.toUpperCase()}_API_KEY`]),
68
+ support: KNOWN_API_SUPPORT.has(id) ? 'stable' : 'experimental',
69
+ };
70
+ entries.set(id, { id, aliases: id === 'anthropic' ? ['api'] : [], factoryName: id, ...metadata });
71
+ }
72
+ for (const [id, metadata] of Object.entries(API_METADATA)) {
73
+ if (!entries.has(id) && typeof source[id] === 'function')
74
+ entries.set(id, { id, aliases: id === 'anthropic' ? ['api'] : [], factoryName: id, ...metadata });
75
+ }
76
+ return [...entries.values()].sort((a, b) => a.id.localeCompare(b.id));
77
+ }
78
+ export function resolveProviderId(id, entries = providerRegistry()) {
79
+ const normalized = id.trim().toLowerCase();
80
+ return entries.find((entry) => entry.id.toLowerCase() === normalized || entry.aliases.some((alias) => alias.toLowerCase() === normalized))?.id;
81
+ }
82
+ export function providerEntry(id, entries = providerRegistry()) {
83
+ const resolved = resolveProviderId(id, entries);
84
+ return entries.find((entry) => entry.id === resolved);
85
+ }
86
+ const versionPattern = /(?:^|[^\d])v?(\d+)\.(\d+)\.(\d+)(?:[-+][0-9A-Za-z.-]+)?/m;
87
+ const VERSION_CHECK_TIMEOUT_MS = 5_000;
88
+ export function parseVersion(output) {
89
+ const match = output.match(versionPattern);
90
+ return match ? `${match[1]}.${match[2]}.${match[3]}` : undefined;
91
+ }
92
+ function compareVersions(left, right) {
93
+ const a = left.split('.').map(Number);
94
+ const b = right.split('.').map(Number);
95
+ return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
96
+ }
97
+ function checkVersion(entry, output, ci) {
98
+ const version = parseVersion(output);
99
+ if (!version)
100
+ return { name: 'version', status: ci ? 'fail' : 'warn', detail: ci ? 'unknown version (CI requires a recognized version)' : 'unknown version (local run allowed)' };
101
+ if (entry.minimumVersion && compareVersions(version, entry.minimumVersion) < 0)
102
+ return { name: 'version', status: 'fail', detail: `unsupported version ${version}` };
103
+ return { name: 'version', status: 'pass', detail: version };
104
+ }
105
+ export async function diagnoseProvider(options) {
106
+ const entries = options.entries ?? providerRegistry();
107
+ const entry = providerEntry(options.provider, entries);
108
+ if (!entry)
109
+ return { registryVersion: PROVIDER_REGISTRY_VERSION, schemaVersion: 1, provider: options.provider, support: 'unsupported', live: Boolean(options.live), ok: false, checks: [{ name: 'provider', status: 'fail', detail: 'unsupported provider' }] };
110
+ const env = options.env ?? process.env;
111
+ const ci = Boolean(options.ci || env.CI === 'true' || env.CI === '1');
112
+ const checks = [
113
+ { name: 'support', status: entry.support === 'experimental' ? 'warn' : entry.support === 'unsupported' ? 'fail' : 'pass', detail: entry.support },
114
+ { name: 'transport', status: options.transport && !entry.transports.includes(options.transport) ? 'fail' : 'pass', detail: options.transport ?? entry.defaultTransport },
115
+ { name: 'model', status: entry.model === 'required' && !options.model ? 'fail' : 'pass', detail: entry.model === 'required' ? (options.model ? 'configured' : 'required') : entry.model },
116
+ ];
117
+ const mode = options.mode ?? env.AGENTSKIT_REVIEW_MODE ?? 'isolated';
118
+ checks.push({ name: 'configuration', status: mode === 'trusted-local' && (ci || entry.kind === 'api') ? 'fail' : ['isolated', 'trusted-local'].includes(mode) ? 'pass' : 'fail', detail: mode });
119
+ const credentialPresent = Boolean(options.apiKey || env.LLM_API_KEY || entry.credentialEnv.some((name) => Boolean(env[name])));
120
+ checks.push({
121
+ name: 'credentials',
122
+ status: entry.credentialMode === 'api-key' ? (credentialPresent ? 'pass' : 'fail') : 'pass',
123
+ detail: entry.credentialMode === 'api-key' ? (credentialPresent ? 'configured' : 'missing') : entry.credentialMode === 'login' ? 'login-managed (not inspected offline)' : 'not required',
124
+ });
125
+ if (entry.executable) {
126
+ try {
127
+ const result = await runLocalCli(entry.executable, [...(entry.versionArgs ?? ['--version'])], { timeoutMs: VERSION_CHECK_TIMEOUT_MS });
128
+ checks.push({ name: 'executable', status: 'pass', detail: entry.executable });
129
+ checks.push(checkVersion(entry, `${result.stdout}\n${result.stderr}`, ci));
130
+ }
131
+ catch (error) {
132
+ const e = error;
133
+ checks.push({ name: 'executable', status: 'fail', detail: e.code === 'ENOENT' ? 'not found' : e.code === 'ETIMEDOUT' ? 'timed out' : 'unavailable' });
134
+ if (e.code === 'ETIMEDOUT')
135
+ checks.push({ name: 'version', status: 'fail', detail: e.message?.startsWith(entry.executable) ? e.message : 'version check timed out' });
136
+ }
137
+ }
138
+ else {
139
+ checks.push({ name: 'executable', status: 'skip', detail: 'API provider' });
140
+ checks.push({ name: 'version', status: 'skip', detail: 'API provider' });
141
+ }
142
+ if (options.live && entry.id === 'codex-cli') {
143
+ const liveTimeoutMs = Math.min(options.liveTimeoutMs ?? 15_000, 15_000);
144
+ const probeDir = mkdtempSync(join(tmpdir(), 'agentskit-review-health-'));
145
+ try {
146
+ const result = await runLocalCli('codex', ['exec', '--skip-git-repo-check', '-s', 'read-only', '-o', join(probeDir, 'out.txt'), 'Reply with exactly OK.'], {
147
+ mode: mode, timeoutMs: liveTimeoutMs, maxOutputBytes: 4096,
148
+ });
149
+ const output = readFileSync(join(probeDir, 'out.txt'), 'utf8');
150
+ checks.push({ name: 'live', status: /ok/i.test(`${output}\n${result.stdout}\n${result.stderr}`) ? 'pass' : 'fail', detail: /ok/i.test(output) ? 'provider smoke test completed' : 'provider returned no OK response' });
151
+ }
152
+ catch (error) {
153
+ const e = error;
154
+ checks.push({ name: 'live', status: 'fail', detail: e.code === 'ETIMEDOUT' ? `smoke test timed out after ${liveTimeoutMs}ms` : 'provider smoke test failed' });
155
+ }
156
+ finally {
157
+ rmSync(probeDir, { recursive: true, force: true });
158
+ }
159
+ }
160
+ else if (options.live)
161
+ checks.push({ name: 'live', status: 'skip', detail: 'provider smoke test is provider-specific' });
162
+ return { registryVersion: PROVIDER_REGISTRY_VERSION, schemaVersion: 1, provider: entry.id, support: entry.support, live: Boolean(options.live), ok: !checks.some((check) => check.status === 'fail'), checks };
163
+ }
164
+ export function factoryFor(entry) {
165
+ const factory = entry.factoryName ? adapters[entry.factoryName] : undefined;
166
+ return typeof factory === 'function' ? factory : undefined;
167
+ }
168
+ //# sourceMappingURL=provider-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/provider-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { ABSOLUTE_LOCAL_CLI_OUTPUT_BYTES, ABSOLUTE_LOCAL_CLI_TIMEOUT_MS, DEFAULT_LOCAL_CLI_OUTPUT_BYTES } from './local-cli-process.js';
5
+ import { DEFAULT_CODEX_CLI_TIMEOUT_MS, localCliTimeoutMs } from './local-cli-timeout.js';
6
+ export const BUILTIN_LENS_KEYS = [
7
+ 'correctness', 'security', 'performance', 'maintainability', 'design', 'tests', 'conventions',
8
+ ];
9
+ const lensPolicy = z.object({ enabled: z.boolean(), required: z.boolean() }).strict();
10
+ const lensOverrides = z.object({
11
+ correctness: lensPolicy.optional(), security: lensPolicy.optional(), performance: lensPolicy.optional(),
12
+ maintainability: lensPolicy.optional(), design: lensPolicy.optional(), tests: lensPolicy.optional(),
13
+ conventions: lensPolicy.optional(),
14
+ }).strict();
15
+ const positiveInt = z.number().int().min(1);
16
+ const nonNegativeInt = z.number().int().min(0);
17
+ const relativePattern = z.string().min(1).refine((pattern) => !pattern.startsWith('/') && !pattern.startsWith('\\') && !/^[A-Za-z]:[\\/]/.test(pattern) && !pattern.split('/').includes('..'), 'must be a repository-relative pattern without .. traversal');
18
+ const ReviewConfigSchema = z.object({
19
+ configVersion: z.literal(1),
20
+ profile: z.enum(['full', 'fast']).optional(),
21
+ lenses: lensOverrides.optional(),
22
+ incompleteProfile: z.boolean().optional(),
23
+ votes: positiveInt.max(25).optional(),
24
+ retries: nonNegativeInt.max(1).optional(),
25
+ thresholds: z.object({
26
+ minSeverity: z.enum(['blocker', 'high', 'med', 'nit']).optional(),
27
+ minConfidence: z.number().min(0).max(1).optional(),
28
+ maxPerFile: positiveInt.optional(),
29
+ suppressNits: z.boolean().optional(),
30
+ }).strict().optional(),
31
+ budget: z.object({
32
+ maxFiles: positiveInt.max(500).optional(), maxBytes: positiveInt.max(25 * 1024 * 1024).optional(),
33
+ maxCalls: positiveInt.max(1000).optional(), concurrency: positiveInt.max(32).optional(), deadlineMs: positiveInt.max(30 * 60 * 1000).optional(),
34
+ }).strict().optional(),
35
+ worker: z.object({
36
+ timeoutMs: positiveInt.max(ABSOLUTE_LOCAL_CLI_TIMEOUT_MS).optional(),
37
+ maxOutputBytes: positiveInt.max(ABSOLUTE_LOCAL_CLI_OUTPUT_BYTES).optional(),
38
+ }).strict().optional(),
39
+ conventions: relativePattern.optional(),
40
+ context: z.object({ mode: z.enum(['prompt', 'isolated-snapshot']), patterns: z.array(relativePattern).max(100).optional() }).strict().optional(),
41
+ provider: z.string().min(1).max(100).optional(), model: z.string().min(1).max(200).optional(),
42
+ transport: z.enum(['api', 'acp', 'headless', 'auto', 'http']).optional(),
43
+ healthCheck: z.enum(['auto', 'off']).optional(),
44
+ trustMode: z.enum(['isolated', 'trusted-local']).optional(),
45
+ redaction: z.enum(['required', 'high-confidence']).optional(),
46
+ permissions: z.object({ tools: z.boolean().optional(), write: z.boolean().optional(), shell: z.boolean().optional(), mcp: z.boolean().optional() }).strict().optional(),
47
+ }).strict();
48
+ export class ReviewConfigError extends Error {
49
+ constructor(message) { super(message); this.name = 'ReviewConfigError'; }
50
+ }
51
+ const DEFAULT_LENSES = {
52
+ correctness: { enabled: true, required: true }, security: { enabled: true, required: true },
53
+ performance: { enabled: true, required: false }, maintainability: { enabled: true, required: false },
54
+ design: { enabled: true, required: false }, tests: { enabled: true, required: true }, conventions: { enabled: true, required: false },
55
+ };
56
+ const TRUSTED_ONLY_KEYS = ['provider', 'model', 'transport', 'context', 'trustMode', 'redaction', 'permissions'];
57
+ function diagnostic(error) {
58
+ return error.issues.map((issue) => {
59
+ const path = issue.path.join('.') || 'config';
60
+ const label = path === 'budget.maxFiles' ? '--max-files' : path;
61
+ const message = label === '--max-files' && issue.message.includes('greater than or equal to 1') ? 'must be a positive integer' : issue.message;
62
+ return label === '--max-files' ? `${label} ${message}` : `${label}: ${message}`;
63
+ }).join('; ');
64
+ }
65
+ function parseFile(raw) {
66
+ const result = ReviewConfigSchema.safeParse(raw);
67
+ if (!result.success)
68
+ throw new ReviewConfigError(`invalid .agentskit-review.json: ${diagnostic(result.error)}`);
69
+ return result.data;
70
+ }
71
+ export function resolveReviewConfig(fileConfig, options = {}) {
72
+ const file = fileConfig === undefined ? undefined : parseFile(fileConfig);
73
+ const overrides = options.overrides ?? {};
74
+ if (file) {
75
+ const restricted = TRUSTED_ONLY_KEYS.filter((key) => key !== 'context' || file.context?.mode !== 'isolated-snapshot').filter((key) => file[key] !== undefined);
76
+ if (options.ci && restricted.length)
77
+ throw new ReviewConfigError(`project config cannot set trusted execution inputs in CI: ${restricted.join(', ')}`);
78
+ if (file.trustMode === 'trusted-local')
79
+ throw new ReviewConfigError('project config cannot enable trusted-local mode; use an explicit trusted CLI invocation');
80
+ if (file.context?.mode === 'isolated-snapshot' && !file.context.patterns?.length)
81
+ throw new ReviewConfigError('isolated-snapshot requires at least one context pattern');
82
+ }
83
+ const profile = overrides.profile ?? file?.profile ?? 'full';
84
+ const configuredLenses = Object.fromEntries(BUILTIN_LENS_KEYS.map((key) => [key, { ...DEFAULT_LENSES[key], ...(file?.lenses?.[key] ?? {}) }]));
85
+ const lenses = profile === 'fast'
86
+ ? Object.fromEntries(BUILTIN_LENS_KEYS.map((key) => [key, { ...configuredLenses[key], enabled: configuredLenses[key].required }]))
87
+ : configuredLenses;
88
+ const impossibleRequired = BUILTIN_LENS_KEYS.filter((key) => lenses[key].required && !lenses[key].enabled);
89
+ if (impossibleRequired.length && !file?.incompleteProfile)
90
+ throw new ReviewConfigError(`required lens cannot be disabled without incompleteProfile: ${impossibleRequired.join(', ')}`);
91
+ const incompleteProfile = Boolean(file?.incompleteProfile || impossibleRequired.length);
92
+ if (options.ci && (incompleteProfile || options.allowIncomplete))
93
+ throw new ReviewConfigError('--allow-incomplete and incomplete profiles are local-only; CI cannot approve an incomplete review');
94
+ if (options.ci && options.allowUnredacted)
95
+ throw new ReviewConfigError('--allow-unredacted is local-only and cannot disable CI redaction');
96
+ if (incompleteProfile && !options.allowIncomplete)
97
+ throw new ReviewConfigError('incomplete profile requires explicit --allow-incomplete for a local run');
98
+ const thresholds = { ...file?.thresholds, ...(profile === 'fast' && file?.thresholds?.maxPerFile === undefined && overrides.maxPerFile === undefined ? { maxPerFile: 1 } : {}), ...(overrides.minSeverity === undefined ? {} : { minSeverity: overrides.minSeverity }), ...(overrides.minConfidence === undefined ? {} : { minConfidence: overrides.minConfidence }), ...(overrides.maxPerFile === undefined ? {} : { maxPerFile: overrides.maxPerFile }) };
99
+ const budget = {
100
+ ...file?.budget,
101
+ ...(overrides.maxFiles === undefined ? {} : { maxFiles: overrides.maxFiles }),
102
+ ...(overrides.maxCalls === undefined ? {} : { maxCalls: overrides.maxCalls }),
103
+ ...(overrides.concurrency === undefined ? {} : { concurrency: overrides.concurrency }),
104
+ ...(overrides.deadlineMs === undefined ? {} : { deadlineMs: overrides.deadlineMs }),
105
+ };
106
+ const provider = overrides.provider ?? file?.provider;
107
+ const defaultConcurrency = profile === 'fast' ? (provider?.endsWith('-cli') ? 1 : 2) : provider?.endsWith('-cli') ? 1 : 4;
108
+ const defaultDeadlineMs = profile === 'fast' ? 120_000 : 10 * 60 * 1000;
109
+ const effective = {
110
+ configVersion: 1, profile, batchLenses: profile === 'fast', lenses, incompleteProfile,
111
+ votes: overrides.votes ?? file?.votes ?? (profile === 'fast' ? 1 : 3), retries: overrides.retries ?? file?.retries ?? (profile === 'fast' ? 0 : 1),
112
+ thresholds, budget: { ...budget, concurrency: budget.concurrency ?? defaultConcurrency, maxCalls: budget.maxCalls ?? 1000, deadlineMs: budget.deadlineMs ?? defaultDeadlineMs },
113
+ worker: { timeoutMs: file?.worker?.timeoutMs ?? localCliTimeoutMs(provider === 'codex-cli' ? DEFAULT_CODEX_CLI_TIMEOUT_MS : undefined), maxOutputBytes: file?.worker?.maxOutputBytes ?? DEFAULT_LOCAL_CLI_OUTPUT_BYTES },
114
+ conventions: overrides.conventions ?? file?.conventions,
115
+ context: { mode: file?.context?.mode ?? 'prompt', patterns: file?.context?.patterns ?? [] },
116
+ allowUnredacted: Boolean(options.allowUnredacted),
117
+ provider: overrides.provider ?? file?.provider, model: overrides.model ?? file?.model,
118
+ transport: (overrides.transport ?? file?.transport),
119
+ healthCheck: overrides.healthCheck ?? file?.healthCheck ?? 'auto',
120
+ trustMode: 'isolated', redaction: file?.redaction ?? 'required', permissions: file?.permissions ?? {},
121
+ };
122
+ const validation = z.object({
123
+ profile: z.enum(['full', 'fast']), healthCheck: z.enum(['auto', 'off']),
124
+ votes: positiveInt.max(25), retries: nonNegativeInt.max(1),
125
+ thresholds: z.object({ minSeverity: z.enum(['blocker', 'high', 'med', 'nit']).optional(), minConfidence: z.number().min(0).max(1).optional(), maxPerFile: positiveInt.optional() }),
126
+ budget: z.object({ maxFiles: positiveInt.max(500).optional(), maxBytes: positiveInt.max(25 * 1024 * 1024).optional(), maxCalls: positiveInt.max(1000), concurrency: positiveInt.max(32), deadlineMs: positiveInt.max(30 * 60 * 1000) }),
127
+ }).safeParse(effective);
128
+ if (!validation.success)
129
+ throw new ReviewConfigError(`invalid effective review config: ${diagnostic(validation.error)}`);
130
+ return effective;
131
+ }
132
+ export function loadReviewConfig(cwd, options = {}) {
133
+ const file = join(cwd, '.agentskit-review.json');
134
+ if (!existsSync(file))
135
+ return resolveReviewConfig(undefined, options);
136
+ let raw;
137
+ try {
138
+ raw = JSON.parse(readFileSync(file, 'utf8'));
139
+ }
140
+ catch {
141
+ throw new ReviewConfigError(`invalid ${file}: expected valid JSON`);
142
+ }
143
+ return resolveReviewConfig(raw, options);
144
+ }
145
+ //# sourceMappingURL=review-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-config.js","sourceRoot":"","sources":["../../src/review-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "project": {
4
+ "name": "AgentsKit Code Review"
5
+ },
6
+ "corpus": {
7
+ "agent": {
8
+ "root": "docs/for-agents",
9
+ "index": "docs/for-agents/index.md",
10
+ "include": ["**/*.md"]
11
+ },
12
+ "human": {
13
+ "plugin": "plain-markdown",
14
+ "options": {
15
+ "root": "docs",
16
+ "urlPrefix": null
17
+ }
18
+ }
19
+ },
20
+ "routing": {
21
+ "options": {
22
+ "ownership": {
23
+ "code-review-cli": {
24
+ "path": ".",
25
+ "purpose": "Provider-neutral local and GitHub code review CLI, Action, reporters, and repository documentation.",
26
+ "checks": ["npm run check", "npm pack --dry-run"],
27
+ "agentDoc": "docs/for-agents/code-review-cli.md",
28
+ "humanDoc": "OPERATIONS"
29
+ }
30
+ },
31
+ "intents": [
32
+ {
33
+ "id": "understand-or-run-code-review",
34
+ "title": "Understand or run Code Review",
35
+ "paths": ["README.md", "docs/OPERATIONS.md"]
36
+ }
37
+ ],
38
+ "changes": [
39
+ {
40
+ "id": "change-cli-provider-or-action",
41
+ "title": "Change a CLI provider, flag, reporter, or Action input",
42
+ "startHere": "docs/for-agents/code-review-cli.md"
43
+ }
44
+ ]
45
+ }
46
+ },
47
+ "index": {
48
+ "outFile": ".doc-bridge/index.json",
49
+ "llmsTxt": {
50
+ "enabled": true,
51
+ "outFile": "llms.txt",
52
+ "preamble": "AgentsKit Code Review is a pre-v1 provider-neutral CLI and GitHub Action for low-noise review using seven lenses and adversarial verification. It intentionally has no Fumadocs site or embedded chat.\n\n## Documentation surfaces\n\n- Full corpus: llms-full.txt\n- Public README: https://github.com/AgentsKit-io/code-review#readme\n- Operations: docs/OPERATIONS.md\n- For agents: docs/for-agents/index.md\n- Raw sources: https://raw.githubusercontent.com/AgentsKit-io/code-review/main/\n\n## AgentsKit ecosystem\n\n- AgentsKit: https://www.agentskit.io/docs\n- Registry: https://registry.agentskit.io/docs\n- AgentsKit Chat: https://chat.agentskit.io/docs\n- Playbook: https://playbook.agentskit.io/docs\n- Doc Bridge: https://agentskit-io.github.io/doc-bridge/\n- Code Review: https://github.com/AgentsKit-io/code-review#readme\n- AKOS: https://akos.agentskit.io/docs"
53
+ },
54
+ "capabilities": {
55
+ "enabled": true,
56
+ "outFile": ".doc-bridge/capabilities.json"
57
+ }
58
+ },
59
+ "conformance": {
60
+ "documentationStandardV1": {
61
+ "rawSources": [
62
+ "README.md",
63
+ "docs/OPERATIONS.md",
64
+ "docs/for-agents/code-review-cli.md"
65
+ ],
66
+ "contributionPaths": ["CONTRIBUTING.md"],
67
+ "metadata": [
68
+ {
69
+ "path": "README.md",
70
+ "contains": ["# AgentsKit Code Review", "Deep, low-noise AI code review"]
71
+ }
72
+ ],
73
+ "links": [
74
+ { "url": "https://www.agentskit.io", "paths": ["README.md"] },
75
+ { "url": "https://registry.agentskit.io/docs", "paths": ["README.md"] },
76
+ { "url": "https://chat.agentskit.io/docs", "paths": ["README.md"] },
77
+ { "url": "https://playbook.agentskit.io/docs", "paths": ["README.md"] },
78
+ { "url": "https://agentskit-io.github.io/doc-bridge/", "paths": ["README.md"] },
79
+ { "url": "https://akos.agentskit.io/docs", "paths": ["README.md"] }
80
+ ],
81
+ "ecosystemContract": {
82
+ "manifest": "ecosystem.json",
83
+ "claims": "ecosystem-claims.json",
84
+ "productId": "code-review"
85
+ },
86
+ "quickstarts": [
87
+ {
88
+ "id": "first-review",
89
+ "doc": "README.md",
90
+ "test": "test/cli-smoke.test.mjs",
91
+ "command": "npm run build && node --test test/cli-smoke.test.mjs",
92
+ "testContains": ["a clean local Codex CLI fixture completes an offline stdin review"]
93
+ }
94
+ ],
95
+ "visuals": ["docs/assets/agentskit-mark.svg"],
96
+ "diagrams": [
97
+ { "path": "README.md", "contains": ["```mermaid"] }
98
+ ],
99
+ "exceptions": []
100
+ }
101
+ },
102
+ "gates": {
103
+ "preset": "standard",
104
+ "include": ["documentation-standard-v1"]
105
+ },
106
+ "surfaces": {
107
+ "cli": {
108
+ "bin": "ak-docs",
109
+ "defaultFormat": "text"
110
+ },
111
+ "mcp": {
112
+ "enabled": true,
113
+ "transport": "stdio"
114
+ }
115
+ }
116
+ }