@judge-java/cli 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,2 @@
1
+ export declare function runDashboard(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhE"}
@@ -0,0 +1,29 @@
1
+ import * as path from "path";
2
+ export async function runDashboard(args) {
3
+ const repoRoot = parseRepoArg(args) ?? process.cwd();
4
+ const outputArg = parseOutputArg(args);
5
+ console.log(`\n◈ judge-java dashboard\n`);
6
+ console.log(` Repository: ${repoRoot}`);
7
+ // Dynamically import to avoid bundling dashboard into CLI unnecessarily
8
+ const { generateDashboard } = await import("@judge-java/dashboard");
9
+ const outputPath = await generateDashboard(repoRoot, outputArg);
10
+ console.log(` Output: ${outputPath}`);
11
+ console.log(`\n✓ Dashboard generated.\n`);
12
+ console.log(` Open in browser: file://${outputPath}`);
13
+ console.log(` Or host on GitHub Pages by pointing Pages source to .codeagent/\n`);
14
+ }
15
+ function parseRepoArg(args) {
16
+ const idx = args.indexOf("--repo");
17
+ if (idx !== -1 && args[idx + 1]) {
18
+ return path.resolve(args[idx + 1]);
19
+ }
20
+ return undefined;
21
+ }
22
+ function parseOutputArg(args) {
23
+ const idx = args.indexOf("--output");
24
+ if (idx !== -1 && args[idx + 1]) {
25
+ return path.resolve(args[idx + 1]);
26
+ }
27
+ return undefined;
28
+ }
29
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAEzC,wEAAwE;IACxE,MAAM,EAAC,iBAAiB,EAAC,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CACP,6BAA6B,UAAU,EAAE,CAC5C,CAAC;IACF,OAAO,CAAC,GAAG,CACP,qEAAqE,CACxE,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAAA,CAAC;IACtE,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,IAAc;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAAA,CAAC;IACtE,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runInit(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B3D"}
@@ -0,0 +1,212 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import * as readline from "readline";
4
+ import { fileURLToPath } from "url";
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ // ─── Entry point ─────────────────────────────────────────────────────────────
7
+ export async function runInit(args) {
8
+ const repoRoot = parseRepoArg(args) ?? process.cwd();
9
+ console.log(`\n◈ judge-java init\n`);
10
+ console.log(` Repository: ${repoRoot}\n`);
11
+ // Verify it looks like a git repo
12
+ await assertGitRepo(repoRoot);
13
+ // Check what already exists
14
+ const existing = await checkExisting(repoRoot);
15
+ if (existing.allPresent) {
16
+ console.log(" judge-java is already initialised in this repository.\n");
17
+ console.log(" To re-initialise, remove the existing files and run again:");
18
+ console.log(" .github/workflows/code-review.yml");
19
+ console.log(" .github/workflows/code-review-override.yml");
20
+ console.log(" .codeagent/config.yml");
21
+ console.log(" .codeagent/memory.md\n");
22
+ return;
23
+ }
24
+ // Prompt for configuration
25
+ const config = await promptConfig();
26
+ // Scaffold files
27
+ await scaffoldWorkflows(repoRoot, existing);
28
+ await scaffoldCodeagent(repoRoot, config, existing);
29
+ // Print next steps
30
+ printNextSteps(repoRoot, config);
31
+ }
32
+ // ─── Scaffolding ──────────────────────────────────────────────────────────────
33
+ async function scaffoldWorkflows(repoRoot, existing) {
34
+ const workflowDir = path.join(repoRoot, ".github", "workflows");
35
+ await fs.mkdir(workflowDir, { recursive: true });
36
+ const files = [
37
+ { template: "code-review.yml", dest: "code-review.yml" },
38
+ { template: "code-review-override.yml", dest: "code-review-override.yml" },
39
+ ];
40
+ for (const { template, dest } of files) {
41
+ const destPath = path.join(workflowDir, dest);
42
+ const alreadyExists = existing.workflows.includes(dest);
43
+ if (alreadyExists) {
44
+ console.log(` ⚠ Skipped .github/workflows/${dest} (already exists)`);
45
+ continue;
46
+ }
47
+ await copyTemplate(template, destPath);
48
+ console.log(` ✓ Created .github/workflows/${dest}`);
49
+ }
50
+ }
51
+ async function scaffoldCodeagent(repoRoot, config, existing) {
52
+ const codeagentDir = path.join(repoRoot, ".codeagent");
53
+ await fs.mkdir(codeagentDir, { recursive: true });
54
+ // config.yml — inject user choices
55
+ if (existing.hasConfig) {
56
+ console.log(` ⚠ Skipped .codeagent/config.yml (already exists)`);
57
+ }
58
+ else {
59
+ let configContent = await readTemplate("config.yml");
60
+ configContent = configContent
61
+ .replace("provider: anthropic", `provider: ${config.provider}`)
62
+ .replace("model_id: claude-opus-4-5", `model_id: ${config.modelId}`)
63
+ .replace("api_key_env: CODEAGENT_API_KEY", `api_key_env: ${config.apiKeyEnv}`);
64
+ await fs.writeFile(path.join(codeagentDir, "config.yml"), configContent, "utf-8");
65
+ console.log(` ✓ Created .codeagent/config.yml`);
66
+ }
67
+ // memory.md — always scaffold if missing, it's the team's to fill in
68
+ if (existing.hasMemory) {
69
+ console.log(` ⚠ Skipped .codeagent/memory.md (already exists)`);
70
+ }
71
+ else {
72
+ await copyTemplate("memory.md", path.join(codeagentDir, "memory.md"));
73
+ console.log(` ✓ Created .codeagent/memory.md`);
74
+ }
75
+ // Seed empty decisions.json and issues.json so the agent doesn't have to create them
76
+ const decisionsPath = path.join(codeagentDir, "decisions.json");
77
+ if (!existing.hasDecisions) {
78
+ await fs.writeFile(decisionsPath, "[]", "utf-8");
79
+ console.log(` ✓ Created .codeagent/decisions.json`);
80
+ }
81
+ const issuesPath = path.join(codeagentDir, "issues.json");
82
+ if (!existing.hasIssues) {
83
+ await fs.writeFile(issuesPath, "[]", "utf-8");
84
+ console.log(` ✓ Created .codeagent/issues.json`);
85
+ }
86
+ }
87
+ async function promptConfig() {
88
+ const rl = readline.createInterface({
89
+ input: process.stdin,
90
+ output: process.stdout,
91
+ });
92
+ const ask = (question, defaultVal) => new Promise((resolve) => {
93
+ rl.question(` ${question} (${defaultVal}): `, (answer) => {
94
+ resolve(answer.trim() || defaultVal);
95
+ });
96
+ });
97
+ console.log(" Configure your LLM (press Enter to accept defaults):\n");
98
+ const providerInput = await ask("Provider — anthropic / openai / openai-compatible", "anthropic");
99
+ const defaultModel = providerInput === "anthropic"
100
+ ? "claude-opus-4-5"
101
+ : providerInput === "openai"
102
+ ? "gpt-4o"
103
+ : "your-model-id";
104
+ const modelId = await ask("Model ID", defaultModel);
105
+ const defaultKeyEnv = providerInput === "anthropic"
106
+ ? "CODEAGENT_API_KEY"
107
+ : providerInput === "openai"
108
+ ? "OPENAI_API_KEY"
109
+ : "CODEAGENT_API_KEY";
110
+ const apiKeyEnv = await ask("GitHub Actions secret name for your API key", defaultKeyEnv);
111
+ rl.close();
112
+ console.log("");
113
+ return {
114
+ provider: providerInput,
115
+ modelId,
116
+ apiKeyEnv,
117
+ };
118
+ }
119
+ // ─── Post-init Instructions ───────────────────────────────────────────────────
120
+ function printNextSteps(repoRoot, config) {
121
+ const isCurrentDir = repoRoot === process.cwd();
122
+ const repoNote = isCurrentDir ? "this repository" : repoRoot;
123
+ console.log(`\n✓ judge-java initialised in ${repoNote}\n`);
124
+ console.log("─".repeat(60));
125
+ console.log("\n Next steps:\n");
126
+ console.log(` 1. Add your API key as a GitHub Actions secret named ${config.apiKeyEnv}:`);
127
+ console.log(` Repository → Settings → Secrets and variables → Actions`);
128
+ console.log(` Name: ${config.apiKeyEnv}`);
129
+ console.log(` Value: <your ${config.provider} API key>\n`);
130
+ console.log(` 2. Fill in .codeagent/memory.md with your domain context:`);
131
+ console.log(` - Your domain language and ubiquitous terms`);
132
+ console.log(` - Naming conventions for methods, tests, classes`);
133
+ console.log(` - Architectural rules and known anti-patterns\n`);
134
+ console.log(` 3. Commit everything:`);
135
+ console.log(` git add .github/ .codeagent/`);
136
+ console.log(` git commit -m "chore: add judge-java"`);
137
+ console.log(` git push\n`);
138
+ console.log(` 4. Open a pull request — judge-java will run automatically.\n`);
139
+ console.log(` To override a blocked PR, comment on it:`);
140
+ console.log(` /override-review <your reason>\n`);
141
+ console.log("─".repeat(60));
142
+ }
143
+ async function checkExisting(repoRoot) {
144
+ const workflowDir = path.join(repoRoot, ".github", "workflows");
145
+ const codeagentDir = path.join(repoRoot, ".codeagent");
146
+ const existingWorkflows = [];
147
+ for (const wf of ["code-review.yml", "code-review-override.yml"]) {
148
+ if (await fileExists(path.join(workflowDir, wf))) {
149
+ existingWorkflows.push(wf);
150
+ }
151
+ }
152
+ const hasConfig = await fileExists(path.join(codeagentDir, "config.yml"));
153
+ const hasMemory = await fileExists(path.join(codeagentDir, "memory.md"));
154
+ const hasDecisions = await fileExists(path.join(codeagentDir, "decisions.json"));
155
+ const hasIssues = await fileExists(path.join(codeagentDir, "issues.json"));
156
+ const allPresent = existingWorkflows.length === 2 && hasConfig && hasMemory;
157
+ return {
158
+ allPresent,
159
+ workflows: existingWorkflows,
160
+ hasConfig,
161
+ hasMemory,
162
+ hasDecisions,
163
+ hasIssues,
164
+ };
165
+ }
166
+ // ─── Git Repo Check ───────────────────────────────────────────────────────────
167
+ async function assertGitRepo(repoRoot) {
168
+ const gitDir = path.join(repoRoot, ".git");
169
+ const exists = await fileExists(gitDir);
170
+ if (!exists) {
171
+ throw new Error(`${repoRoot} does not appear to be a git repository.\n` +
172
+ `Run "git init" first, or specify the correct path with --repo.`);
173
+ }
174
+ }
175
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
176
+ async function copyTemplate(templateName, destPath) {
177
+ const content = await readTemplate(templateName);
178
+ await fs.writeFile(destPath, content, "utf-8");
179
+ }
180
+ async function readTemplate(templateName) {
181
+ // Templates are copied into dist/templates/ during build
182
+ const candidates = [
183
+ path.join(__dirname, "../../templates", templateName), // dist/templates/
184
+ path.join(__dirname, "../templates", templateName), // fallback for dev
185
+ ];
186
+ for (const candidate of candidates) {
187
+ try {
188
+ return await fs.readFile(candidate, "utf-8");
189
+ }
190
+ catch {
191
+ // try next
192
+ }
193
+ }
194
+ throw new Error(`Template not found: ${templateName}`);
195
+ }
196
+ async function fileExists(filePath) {
197
+ try {
198
+ await fs.access(filePath);
199
+ return true;
200
+ }
201
+ catch {
202
+ return false;
203
+ }
204
+ }
205
+ function parseRepoArg(args) {
206
+ const idx = args.indexOf("--repo");
207
+ if (idx !== -1 && args[idx + 1]) {
208
+ return path.resolve(args[idx + 1]);
209
+ }
210
+ return undefined;
211
+ }
212
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runStatus(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E7D"}
@@ -0,0 +1,68 @@
1
+ import * as path from "path";
2
+ import { loadConfig, loadMemory } from "@judge-java/core";
3
+ export async function runStatus(args) {
4
+ const repoRoot = parseRepoArg(args) ?? process.cwd();
5
+ console.log(`\n◈ judge-java status\n`);
6
+ console.log(` Repository: ${repoRoot}\n`);
7
+ const [memory, config] = await Promise.all([
8
+ loadMemory(repoRoot),
9
+ loadConfig(repoRoot),
10
+ ]);
11
+ // ── LLM config ─────────────────────────────────────────────────────────────
12
+ console.log(` LLM`);
13
+ console.log(` Provider: ${config.llm.provider}`);
14
+ console.log(` Model: ${config.llm.modelId}`);
15
+ console.log(` Key env: ${config.llm.apiKeyEnv}`);
16
+ console.log(``);
17
+ // ── Review levels ───────────────────────────────────────────────────────────
18
+ console.log(` Review Levels`);
19
+ const levels = Object.entries(config.reviewLevels);
20
+ const enabled = levels.filter(([, v]) => v.enabled);
21
+ const disabled = levels.filter(([, v]) => !v.enabled);
22
+ for (const [level, cfg] of enabled) {
23
+ const blocker = cfg.blocker ? " (blocker)" : " (warning)";
24
+ console.log(` ✓ ${level}${blocker}`);
25
+ }
26
+ for (const [level] of disabled) {
27
+ console.log(` - ${level} (disabled)`);
28
+ }
29
+ console.log(``);
30
+ // ── Memory ──────────────────────────────────────────────────────────────────
31
+ console.log(` Memory`);
32
+ const narrativeLines = memory.narrative.trim().split("\n").filter(Boolean).length;
33
+ console.log(` Conventions: ${narrativeLines} lines in memory.md`);
34
+ console.log(` Decisions: ${memory.decisions.length} recorded`);
35
+ const openIssues = memory.trackedIssues.filter((i) => i.status === "open");
36
+ const closedIssues = memory.trackedIssues.filter((i) => i.status === "closed");
37
+ console.log(` Tracked issues: ${openIssues.length} open, ${closedIssues.length} resolved`);
38
+ console.log(``);
39
+ // ── Decisions detail ────────────────────────────────────────────────────────
40
+ if (memory.decisions.length > 0) {
41
+ console.log(` Decisions`);
42
+ for (const d of memory.decisions) {
43
+ console.log(` • ${d.title}`);
44
+ console.log(` ${d.reason} (${d.date})`);
45
+ }
46
+ console.log(``);
47
+ }
48
+ // ── Open issues detail ──────────────────────────────────────────────────────
49
+ if (openIssues.length > 0) {
50
+ console.log(` Open Tracked Issues`);
51
+ for (const issue of openIssues) {
52
+ console.log(` #${issue.githubIssueNumber} ${issue.title} [${issue.reviewLevel}]`);
53
+ }
54
+ console.log(``);
55
+ }
56
+ // ── Overrides ───────────────────────────────────────────────────────────────
57
+ console.log(` Overrides`);
58
+ console.log(` Allowed: ${config.overrides.allowed ? "yes" : "no"}`);
59
+ console.log(` Audit log: ${config.overrides.auditLog ? "yes" : "no"}\n`);
60
+ }
61
+ function parseRepoArg(args) {
62
+ const idx = args.indexOf("--repo");
63
+ if (idx !== -1 && args[idx + 1]) {
64
+ return path.resolve(args[idx + 1]);
65
+ }
66
+ return undefined;
67
+ }
68
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * judge-java CLI
4
+ *
5
+ * Usage:
6
+ * npx @judge-java/cli init — scaffold into current repository
7
+ * npx @judge-java/cli dashboard — generate static HTML dashboard
8
+ * npx @judge-java/cli status — show current .codeagent/ state
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * judge-java CLI
4
+ *
5
+ * Usage:
6
+ * npx @judge-java/cli init — scaffold into current repository
7
+ * npx @judge-java/cli dashboard — generate static HTML dashboard
8
+ * npx @judge-java/cli status — show current .codeagent/ state
9
+ */
10
+ import { runInit } from "./commands/init.js";
11
+ import { runDashboard } from "./commands/dashboard.js";
12
+ import { runStatus } from "./commands/status.js";
13
+ const args = process.argv.slice(2);
14
+ const command = args[0];
15
+ const HELP = `
16
+ judge-java — domain-aware code review for teams
17
+
18
+ Usage:
19
+ judge-java init Scaffold judge-java into this repository
20
+ judge-java dashboard Generate the static HTML dashboard
21
+ judge-java status Show current memory, decisions, and tracked issues
22
+ judge-java help Show this help
23
+
24
+ Options:
25
+ --repo <path> Target repository root (default: current directory)
26
+
27
+ Examples:
28
+ npx @judge-java/cli init
29
+ npx @judge-java/cli init --repo /path/to/my-repo
30
+ npx @judge-java/cli dashboard
31
+ npx @judge-java/cli status
32
+ `;
33
+ async function main() {
34
+ switch (command) {
35
+ case "init":
36
+ await runInit(args.slice(1));
37
+ break;
38
+ case "dashboard":
39
+ await runDashboard(args.slice(1));
40
+ break;
41
+ case "status":
42
+ await runStatus(args.slice(1));
43
+ break;
44
+ case "help":
45
+ case "--help":
46
+ case "-h":
47
+ case undefined:
48
+ console.log(HELP);
49
+ break;
50
+ default:
51
+ console.error(`\nUnknown command: ${command}\n`);
52
+ console.log(HELP);
53
+ process.exit(1);
54
+ }
55
+ }
56
+ main().catch((err) => {
57
+ console.error(`\n✗ ${String(err)}\n`);
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAE/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACf,QAAQ,OAAO,EAAE,CAAC;QACd,KAAK,MAAM;YACP,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM;QACV,KAAK,WAAW;YACZ,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM;QACV,KAAK,QAAQ;YACT,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM;QACV,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM;QACV;YACI,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ name: Override Code Review
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [ created ]
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: write
10
+ statuses: write
11
+
12
+ jobs:
13
+ override:
14
+ name: Process Override Command
15
+ runs-on: ubuntu-latest
16
+ if: |
17
+ github.event.issue.pull_request &&
18
+ startsWith(github.event.comment.body, '/override-review')
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Setup Node.js
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: "20"
28
+ cache: "npm"
29
+
30
+ - name: Install judge-java
31
+ run: npm install --save-dev @judge-java/core @judge-java/github
32
+
33
+ - name: Process override
34
+ env:
35
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36
+ PR_NUMBER: ${{ github.event.issue.number }}
37
+ ACTOR: ${{ github.event.comment.user.login }}
38
+ COMMENT_BODY: ${{ github.event.comment.body }}
39
+ run: node node_modules/@judge-java/github/dist/override.js
40
+
41
+ - name: Commit audit log
42
+ run: |
43
+ git config user.name "judge-java[bot]"
44
+ git config user.email "judge-java[bot]@users.noreply.github.com"
45
+ git add .codeagent/audit.log
46
+ git diff --staged --quiet || git commit -m "chore: log judge-java override [skip ci]"
47
+ git push
@@ -0,0 +1,47 @@
1
+ name: Code Review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, reopened]
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: write
10
+ issues: write
11
+ statuses: write
12
+
13
+ jobs:
14
+ review:
15
+ name: Run Code Review
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - name: Checkout repository
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Setup Node.js
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: "20"
28
+ cache: "npm"
29
+
30
+ - name: Install judge-java
31
+ run: npm install --save-dev @judge-java/core @judge-java/github
32
+
33
+ - name: Run code review
34
+ env:
35
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36
+ CODEAGENT_API_KEY: ${{ secrets.CODEAGENT_API_KEY }}
37
+ REVIEW_LEVELS: ${{ vars.CODEAGENT_REVIEW_LEVELS }}
38
+ run: node node_modules/@judge-java/github/dist/action.js
39
+
40
+ - name: Commit memory updates
41
+ if: always()
42
+ run: |
43
+ git config user.name "judge-java[bot]"
44
+ git config user.email "judge-java[bot]@users.noreply.github.com"
45
+ git add .codeagent/
46
+ git diff --staged --quiet || git commit -m "chore: update judge-java memory [skip ci]"
47
+ git push
@@ -0,0 +1,26 @@
1
+ # judge-java configuration
2
+
3
+ llm:
4
+ provider: anthropic # anthropic | openai | openai-compatible
5
+ api_key_env: CODEAGENT_API_KEY # name of the GitHub Actions secret
6
+ model_id: claude-opus-4-5
7
+ max_tokens: 8096
8
+
9
+ review_levels:
10
+ scope_check: { enabled: true, blocker: true }
11
+ domain_language: { enabled: true, blocker: true }
12
+ test_quality: { enabled: true, blocker: true }
13
+ obvious_bugs: { enabled: true, blocker: true }
14
+ pr_hygiene: { enabled: true, blocker: false }
15
+ security: { enabled: false, blocker: true }
16
+ performance: { enabled: false, blocker: false }
17
+ architecture: { enabled: false, blocker: false }
18
+ accessibility: { enabled: false, blocker: false }
19
+ refactoring_opportunities: { enabled: false, blocker: false }
20
+
21
+ github:
22
+ label_prefix: judge-java
23
+
24
+ overrides:
25
+ allowed: true
26
+ audit_log: true
@@ -0,0 +1,73 @@
1
+ # Team Context, Conventions & Domain Knowledge
2
+
3
+ Edit this file to teach judge-java about your domain, naming conventions,
4
+ and architectural patterns. The more context you provide, the more accurate
5
+ and domain-aware your reviews will be.
6
+
7
+ ---
8
+
9
+ ## Domain & Ubiquitous Language
10
+
11
+ <!--
12
+ Describe your business domain and the specific language your team uses.
13
+
14
+ Example:
15
+ - We are building a payments platform.
16
+ - Use "authorise" not "approve". Use "merchant" not "vendor".
17
+ - A "Transaction" is the completed ledger entry. A "Payment" is the intent.
18
+ -->
19
+
20
+ *Add your domain language here.*
21
+
22
+ ---
23
+
24
+ ## Naming Conventions
25
+
26
+ <!--
27
+ Example:
28
+ - Service methods: verb-noun — authorisePayment(), refundTransaction()
29
+ - Test names: test_[scenario]_[expectedOutcome]
30
+ - Events are past tense: PaymentAuthorised, OrderPlaced
31
+ - Booleans: isActive, hasExpired, wasRefunded
32
+ -->
33
+
34
+ *Add your naming conventions here.*
35
+
36
+ ---
37
+
38
+ ## Architecture & Patterns
39
+
40
+ <!--
41
+ Example:
42
+ - Layered architecture: Controllers → Services → Repositories
43
+ - Services must not call other Services — use domain events
44
+ - No business logic in Controllers
45
+ -->
46
+
47
+ *Add your architectural patterns here.*
48
+
49
+ ---
50
+
51
+ ## Test Conventions
52
+
53
+ <!--
54
+ Example:
55
+ - Unit tests live alongside source files
56
+ - Use Arrange-Act-Assert structure
57
+ - Mock only external dependencies, never domain services
58
+ -->
59
+
60
+ *Add your test conventions here.*
61
+
62
+ ---
63
+
64
+ ## Known Anti-Patterns
65
+
66
+ <!--
67
+ Example:
68
+ - Do not use raw SQL strings — use the QueryBuilder
69
+ - Do not catch and swallow exceptions
70
+ - Do not pass userId as a plain string — use a UserId value object
71
+ -->
72
+
73
+ *Add patterns you always want flagged here.*
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@judge-java/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for judge-java \u2014 init, dashboard, and management commands",
5
+ "type": "module",
6
+ "files": ["dist"],
7
+ "bin": {
8
+ "judge-java": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.json && npm run copy-templates",
12
+ "copy-templates": "cp -r src/templates dist/templates",
13
+ "test": "vitest run"
14
+ },
15
+ "dependencies": {
16
+ "@judge-java/core": "*",
17
+ "@judge-java/dashboard": "*"
18
+ },
19
+ "main": "./dist/index.js"
20
+ }