@open-code-review/cli 1.6.0 → 1.7.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 (59) hide show
  1. package/README.md +20 -4
  2. package/dist/dashboard/client/assets/{_basePickBy-BGuMbEDR.js → _basePickBy-DbLJVCA4.js} +1 -1
  3. package/dist/dashboard/client/assets/{_baseUniq-Bx8loabg.js → _baseUniq-IXEG0cJJ.js} +1 -1
  4. package/dist/dashboard/client/assets/{arc-DUgpt7nY.js → arc-lsKxmOJY.js} +1 -1
  5. package/dist/dashboard/client/assets/{architectureDiagram-VXUJARFQ-D25nt6Xz.js → architectureDiagram-VXUJARFQ-DfMlzFJX.js} +1 -1
  6. package/dist/dashboard/client/assets/{blockDiagram-VD42YOAC-D8PUF3h4.js → blockDiagram-VD42YOAC-bSpnd26J.js} +1 -1
  7. package/dist/dashboard/client/assets/{c4Diagram-YG6GDRKO-lorsCz-I.js → c4Diagram-YG6GDRKO-DPYmVhCZ.js} +1 -1
  8. package/dist/dashboard/client/assets/channel-C--wY_Wd.js +1 -0
  9. package/dist/dashboard/client/assets/{chunk-4BX2VUAB-8lVyfRJM.js → chunk-4BX2VUAB-CI9zC4lV.js} +1 -1
  10. package/dist/dashboard/client/assets/{chunk-55IACEB6-C4SjgsZO.js → chunk-55IACEB6-BqUdJdx5.js} +1 -1
  11. package/dist/dashboard/client/assets/{chunk-B4BG7PRW-BXzTPbH1.js → chunk-B4BG7PRW-DymQrTp-.js} +1 -1
  12. package/dist/dashboard/client/assets/{chunk-DI55MBZ5-Bp7QllDt.js → chunk-DI55MBZ5-lZ_9LKGJ.js} +1 -1
  13. package/dist/dashboard/client/assets/{chunk-FMBD7UC4-B4g9S67N.js → chunk-FMBD7UC4-DC5rgLNm.js} +1 -1
  14. package/dist/dashboard/client/assets/{chunk-QN33PNHL-Dyk7Hc0J.js → chunk-QN33PNHL-BrygpHrX.js} +1 -1
  15. package/dist/dashboard/client/assets/{chunk-QZHKN3VN-DTvkGdnm.js → chunk-QZHKN3VN-CWJqBdNg.js} +1 -1
  16. package/dist/dashboard/client/assets/{chunk-TZMSLE5B-BAeZLvrI.js → chunk-TZMSLE5B-BACgM5pG.js} +1 -1
  17. package/dist/dashboard/client/assets/classDiagram-2ON5EDUG-DoxmMlnf.js +1 -0
  18. package/dist/dashboard/client/assets/classDiagram-v2-WZHVMYZB-DoxmMlnf.js +1 -0
  19. package/dist/dashboard/client/assets/clone-BgvweD4v.js +1 -0
  20. package/dist/dashboard/client/assets/{cose-bilkent-S5V4N54A--6-kzrdu.js → cose-bilkent-S5V4N54A-BYvGIfo0.js} +1 -1
  21. package/dist/dashboard/client/assets/{dagre-6UL2VRFP-D10_QE2P.js → dagre-6UL2VRFP-B1rZyiLJ.js} +1 -1
  22. package/dist/dashboard/client/assets/{diagram-PSM6KHXK-kS1x75Bl.js → diagram-PSM6KHXK-Dvl5dQMd.js} +1 -1
  23. package/dist/dashboard/client/assets/{diagram-QEK2KX5R-D_LLCPas.js → diagram-QEK2KX5R-Cmntmhht.js} +1 -1
  24. package/dist/dashboard/client/assets/{diagram-S2PKOQOG-Duy1t5UO.js → diagram-S2PKOQOG-BqZcpG85.js} +1 -1
  25. package/dist/dashboard/client/assets/{erDiagram-Q2GNP2WA-DyQXwzLf.js → erDiagram-Q2GNP2WA-Cw7BALso.js} +1 -1
  26. package/dist/dashboard/client/assets/{flowDiagram-NV44I4VS-D9U11XVw.js → flowDiagram-NV44I4VS-B_amTHzQ.js} +1 -1
  27. package/dist/dashboard/client/assets/{ganttDiagram-JELNMOA3-STy-TC-3.js → ganttDiagram-JELNMOA3-B1j2-sTo.js} +1 -1
  28. package/dist/dashboard/client/assets/{gitGraphDiagram-V2S2FVAM-B04PgURg.js → gitGraphDiagram-V2S2FVAM-D5BkfAMt.js} +1 -1
  29. package/dist/dashboard/client/assets/{graph-AiGwnT5H.js → graph-B_v15DHv.js} +1 -1
  30. package/dist/dashboard/client/assets/index-UkJZZdYD.js +548 -0
  31. package/dist/dashboard/client/assets/index-Zl---B_3.css +1 -0
  32. package/dist/dashboard/client/assets/{infoDiagram-HS3SLOUP-D4arwl6T.js → infoDiagram-HS3SLOUP-C4dtIkj3.js} +1 -1
  33. package/dist/dashboard/client/assets/{journeyDiagram-XKPGCS4Q-CsKqlKkf.js → journeyDiagram-XKPGCS4Q-hha4Am8v.js} +1 -1
  34. package/dist/dashboard/client/assets/{kanban-definition-3W4ZIXB7-CUFnzQE3.js → kanban-definition-3W4ZIXB7-1EY8l7Ng.js} +1 -1
  35. package/dist/dashboard/client/assets/{layout-BvvYJVPv.js → layout-7SmAbjFT.js} +1 -1
  36. package/dist/dashboard/client/assets/{linear-BiBJkzyE.js → linear-BfjSBezh.js} +1 -1
  37. package/dist/dashboard/client/assets/{mermaid-renderer-DGUmIWXY.js → mermaid-renderer-PPIt-kY4.js} +4 -4
  38. package/dist/dashboard/client/assets/{mindmap-definition-VGOIOE7T-D-Kc9Xgu.js → mindmap-definition-VGOIOE7T-BFpjN9LY.js} +1 -1
  39. package/dist/dashboard/client/assets/{pieDiagram-ADFJNKIX-CooPKLnX.js → pieDiagram-ADFJNKIX-GBbQtDBQ.js} +1 -1
  40. package/dist/dashboard/client/assets/{quadrantDiagram-AYHSOK5B-3soPtaSQ.js → quadrantDiagram-AYHSOK5B-Dm0vOhOw.js} +1 -1
  41. package/dist/dashboard/client/assets/{requirementDiagram-UZGBJVZJ-rE40t0IG.js → requirementDiagram-UZGBJVZJ-BrKONIV8.js} +1 -1
  42. package/dist/dashboard/client/assets/{sankeyDiagram-TZEHDZUN-CrgDF_jW.js → sankeyDiagram-TZEHDZUN-IOobtmDc.js} +1 -1
  43. package/dist/dashboard/client/assets/{sequenceDiagram-WL72ISMW-B628IlDW.js → sequenceDiagram-WL72ISMW-Dnb0bOW5.js} +1 -1
  44. package/dist/dashboard/client/assets/{stateDiagram-FKZM4ZOC-C4yb7S9D.js → stateDiagram-FKZM4ZOC-C9-bf7bn.js} +1 -1
  45. package/dist/dashboard/client/assets/stateDiagram-v2-4FDKWEC3-C8Gr4khP.js +1 -0
  46. package/dist/dashboard/client/assets/{timeline-definition-IT6M3QCI-5uLN4f_J.js → timeline-definition-IT6M3QCI-tJogDEHB.js} +1 -1
  47. package/dist/dashboard/client/assets/{treemap-GDKQZRPO-BHXME3bw.js → treemap-GDKQZRPO-DQY6HADq.js} +1 -1
  48. package/dist/dashboard/client/assets/{xychartDiagram-PRI3JC2R-BYTod6eI.js → xychartDiagram-PRI3JC2R-DfxeQmTO.js} +1 -1
  49. package/dist/dashboard/client/index.html +2 -2
  50. package/dist/dashboard/server.js +292 -162
  51. package/dist/index.js +295 -8
  52. package/package.json +2 -2
  53. package/dist/dashboard/client/assets/channel-yW2sWou_.js +0 -1
  54. package/dist/dashboard/client/assets/classDiagram-2ON5EDUG-1pMX5UXO.js +0 -1
  55. package/dist/dashboard/client/assets/classDiagram-v2-WZHVMYZB-1pMX5UXO.js +0 -1
  56. package/dist/dashboard/client/assets/clone-DQwdw3YR.js +0 -1
  57. package/dist/dashboard/client/assets/index-BzQ3i_QR.js +0 -458
  58. package/dist/dashboard/client/assets/index-CGGYXSm-.css +0 -1
  59. package/dist/dashboard/client/assets/stateDiagram-v2-4FDKWEC3-BoFeOfLI.js +0 -1
package/dist/index.js CHANGED
@@ -20361,6 +20361,153 @@ function installCommandsForTool(tool, commandsSource, targetDir) {
20361
20361
  return false;
20362
20362
  }
20363
20363
  }
20364
+ var BUILTIN_ICON_MAP = {
20365
+ architect: "blocks",
20366
+ fullstack: "layers",
20367
+ reliability: "activity",
20368
+ "staff-engineer": "compass",
20369
+ principal: "crown",
20370
+ frontend: "layout",
20371
+ backend: "server",
20372
+ infrastructure: "cloud",
20373
+ performance: "gauge",
20374
+ accessibility: "accessibility",
20375
+ data: "database",
20376
+ devops: "rocket",
20377
+ dx: "terminal",
20378
+ mobile: "smartphone",
20379
+ security: "shield-alert",
20380
+ quality: "sparkles",
20381
+ testing: "test-tubes",
20382
+ ai: "bot",
20383
+ "docs-writer": "file-text"
20384
+ };
20385
+ var HOLISTIC_IDS = /* @__PURE__ */ new Set(["architect", "fullstack", "reliability", "staff-engineer", "principal"]);
20386
+ var SPECIALIST_IDS = /* @__PURE__ */ new Set([
20387
+ "frontend",
20388
+ "backend",
20389
+ "infrastructure",
20390
+ "performance",
20391
+ "accessibility",
20392
+ "data",
20393
+ "devops",
20394
+ "dx",
20395
+ "mobile",
20396
+ "security",
20397
+ "quality",
20398
+ "testing",
20399
+ "ai",
20400
+ "docs-writer"
20401
+ ]);
20402
+ var PERSONA_IDS = /* @__PURE__ */ new Set([
20403
+ "martin-fowler",
20404
+ "kent-beck",
20405
+ "john-ousterhout",
20406
+ "anders-hejlsberg",
20407
+ "vladimir-khorikov",
20408
+ "kent-dodds",
20409
+ "tanner-linsley",
20410
+ "kamil-mysliwiec",
20411
+ "sandi-metz",
20412
+ "rich-hickey"
20413
+ ]);
20414
+ function classifyTier(id) {
20415
+ if (PERSONA_IDS.has(id)) return "persona";
20416
+ if (HOLISTIC_IDS.has(id)) return "holistic";
20417
+ if (SPECIALIST_IDS.has(id)) return "specialist";
20418
+ return "custom";
20419
+ }
20420
+ function extractReviewerName(content) {
20421
+ const match = content.match(/^#\s+(.+?)(?:\s+—\s+Reviewer|\s+Reviewer)\s*$/m);
20422
+ if (match?.[1]) return match[1];
20423
+ const titleMatch = content.match(/^#\s+(.+)$/m);
20424
+ return titleMatch?.[1]?.replace(/\s*Reviewer\s*$/, "").trim() ?? "Unknown";
20425
+ }
20426
+ function extractReviewerDescription(content) {
20427
+ const lines = content.split("\n");
20428
+ for (const line of lines) {
20429
+ const trimmed = line.trim();
20430
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith(">")) continue;
20431
+ if (trimmed.startsWith("You are a **") || trimmed.startsWith("You are reviewing")) {
20432
+ return trimmed.replace(/\*\*/g, "").replace(/^You are a /, "").replace(/^You are reviewing code through the lens of .*?\.\s*/, "").trim();
20433
+ }
20434
+ }
20435
+ return "";
20436
+ }
20437
+ function extractFocusAreas(content) {
20438
+ const areas = [];
20439
+ const focusMatch = content.match(/## Your Focus Areas\n([\s\S]*?)(?=\n##|\n---|\z)/);
20440
+ if (focusMatch?.[1]) {
20441
+ const bullets = focusMatch[1].match(/- \*\*(.+?)\*\*/g);
20442
+ if (bullets) {
20443
+ for (const b of bullets) {
20444
+ const m = b.match(/- \*\*(.+?)\*\*/);
20445
+ if (m?.[1]) areas.push(m[1]);
20446
+ }
20447
+ }
20448
+ }
20449
+ return areas;
20450
+ }
20451
+ function extractPersonaFields(content) {
20452
+ const knownMatch = content.match(/>\s*\*\*Known for\*\*:\s*(.+)/);
20453
+ const philMatch = content.match(/>\s*\*\*Philosophy\*\*:\s*([\s\S]*?)(?=\n(?!>)|\n\n)/);
20454
+ const result = {};
20455
+ if (knownMatch?.[1]) result.known_for = knownMatch[1].trim();
20456
+ if (philMatch?.[1]) {
20457
+ result.philosophy = philMatch[1].split("\n").map((l) => l.replace(/^>\s*/, "").trim()).join(" ").trim();
20458
+ }
20459
+ return result;
20460
+ }
20461
+ function generateReviewersMeta(reviewersDir, configPath) {
20462
+ if (!existsSync2(reviewersDir)) return null;
20463
+ const files = readdirSync(reviewersDir).filter((f) => f.endsWith(".md"));
20464
+ if (files.length === 0) return null;
20465
+ const defaultTeamIds = /* @__PURE__ */ new Set();
20466
+ if (existsSync2(configPath)) {
20467
+ try {
20468
+ const configContent = readFileSync3(configPath, "utf-8");
20469
+ const teamMatch = configContent.match(/default_team:\s*\n((?:\s+\w[\w-]*:\s*\d+\s*(?:#[^\n]*)?\n?)*)/);
20470
+ if (teamMatch?.[1]) {
20471
+ const entries = teamMatch[1].matchAll(/\s+([\w-]+):\s*\d+/g);
20472
+ for (const entry of entries) {
20473
+ if (entry[1]) defaultTeamIds.add(entry[1]);
20474
+ }
20475
+ }
20476
+ } catch {
20477
+ }
20478
+ }
20479
+ const reviewers = [];
20480
+ for (const file of files) {
20481
+ const id = file.replace(/\.md$/, "");
20482
+ try {
20483
+ const content = readFileSync3(join2(reviewersDir, file), "utf-8");
20484
+ const tier = classifyTier(id);
20485
+ const isBuiltin = HOLISTIC_IDS.has(id) || SPECIALIST_IDS.has(id) || PERSONA_IDS.has(id);
20486
+ const reviewer = {
20487
+ id,
20488
+ name: extractReviewerName(content),
20489
+ tier,
20490
+ icon: BUILTIN_ICON_MAP[id] ?? (tier === "persona" ? "brain" : "user"),
20491
+ description: extractReviewerDescription(content),
20492
+ focus_areas: extractFocusAreas(content),
20493
+ is_default: defaultTeamIds.has(id),
20494
+ is_builtin: isBuiltin
20495
+ };
20496
+ if (tier === "persona") {
20497
+ const persona = extractPersonaFields(content);
20498
+ if (persona.known_for) reviewer.known_for = persona.known_for;
20499
+ if (persona.philosophy) reviewer.philosophy = persona.philosophy;
20500
+ }
20501
+ reviewers.push(reviewer);
20502
+ } catch {
20503
+ }
20504
+ }
20505
+ return {
20506
+ schema_version: 1,
20507
+ generated_at: (/* @__PURE__ */ new Date()).toISOString(),
20508
+ reviewers
20509
+ };
20510
+ }
20364
20511
  function installForTool(tool, targetDir) {
20365
20512
  const agentsPath = getAgentsPackagePath();
20366
20513
  const ocrSkillsSource = join2(agentsPath, "skills", "ocr");
@@ -20435,6 +20582,14 @@ function installForTool(tool, targetDir) {
20435
20582
  }
20436
20583
  }
20437
20584
  }
20585
+ const metaPath = join2(ocrDir, "reviewers-meta.json");
20586
+ try {
20587
+ const meta = generateReviewersMeta(reviewersDir, configPath);
20588
+ if (meta) {
20589
+ writeFileSync3(metaPath, JSON.stringify(meta, null, 2) + "\n");
20590
+ }
20591
+ } catch {
20592
+ }
20438
20593
  const commandsOk = installCommandsForTool(tool, commandsSource, targetDir);
20439
20594
  if (!commandsOk) {
20440
20595
  return {
@@ -25616,14 +25771,145 @@ var doctorCommand = new Command("doctor").description("Check OCR installation an
25616
25771
  console.log();
25617
25772
  });
25618
25773
 
25774
+ // src/commands/reviewers.ts
25775
+ import { writeFileSync as writeFileSync8, renameSync as renameSync2 } from "node:fs";
25776
+ import { join as join18 } from "node:path";
25777
+ async function readStdin2() {
25778
+ const chunks = [];
25779
+ for await (const chunk of process.stdin) {
25780
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
25781
+ }
25782
+ const data = Buffer.concat(chunks).toString("utf-8").trim();
25783
+ if (data.length === 0) {
25784
+ throw new Error("No data received on stdin");
25785
+ }
25786
+ return data;
25787
+ }
25788
+ var VALID_TIERS = /* @__PURE__ */ new Set(["holistic", "specialist", "persona", "custom"]);
25789
+ var SLUG_RE = /^[a-z][a-z0-9-]*$/;
25790
+ function validateReviewersMeta(data) {
25791
+ if (typeof data !== "object" || data === null || Array.isArray(data)) {
25792
+ throw new Error("Payload must be a JSON object");
25793
+ }
25794
+ const obj = data;
25795
+ if (obj.schema_version !== 1) {
25796
+ throw new Error(`schema_version must be 1, got ${JSON.stringify(obj.schema_version)}`);
25797
+ }
25798
+ if (typeof obj.generated_at !== "string" || obj.generated_at.length === 0) {
25799
+ throw new Error("generated_at must be a non-empty ISO 8601 string");
25800
+ }
25801
+ if (!Array.isArray(obj.reviewers)) {
25802
+ throw new Error("reviewers must be an array");
25803
+ }
25804
+ const seenIds = /* @__PURE__ */ new Set();
25805
+ for (let i = 0; i < obj.reviewers.length; i++) {
25806
+ const r = obj.reviewers[i];
25807
+ const prefix = `reviewers[${i}]`;
25808
+ if (typeof r.id !== "string" || !SLUG_RE.test(r.id)) {
25809
+ throw new Error(`${prefix}.id must be a lowercase slug (got ${JSON.stringify(r.id)})`);
25810
+ }
25811
+ if (seenIds.has(r.id)) {
25812
+ throw new Error(`Duplicate reviewer id: "${r.id}"`);
25813
+ }
25814
+ seenIds.add(r.id);
25815
+ if (typeof r.name !== "string" || r.name.length === 0) {
25816
+ throw new Error(`${prefix}.name must be a non-empty string`);
25817
+ }
25818
+ if (!VALID_TIERS.has(r.tier)) {
25819
+ throw new Error(`${prefix}.tier must be one of: ${[...VALID_TIERS].join(", ")} (got ${JSON.stringify(r.tier)})`);
25820
+ }
25821
+ if (typeof r.description !== "string" || r.description.length === 0) {
25822
+ throw new Error(`${prefix}.description must be a non-empty string`);
25823
+ }
25824
+ if (!Array.isArray(r.focus_areas)) {
25825
+ throw new Error(`${prefix}.focus_areas must be an array`);
25826
+ }
25827
+ if (r.known_for !== void 0 && typeof r.known_for !== "string") {
25828
+ throw new Error(`${prefix}.known_for must be a string if provided`);
25829
+ }
25830
+ if (r.philosophy !== void 0 && typeof r.philosophy !== "string") {
25831
+ throw new Error(`${prefix}.philosophy must be a string if provided`);
25832
+ }
25833
+ }
25834
+ return data;
25835
+ }
25836
+ var syncSubcommand2 = new Command("sync").description("Sync reviewers-meta.json from reviewer markdown files or structured JSON").option("--stdin", "Read reviewers JSON from stdin (for AI-invoked sync)").action(async (options) => {
25837
+ const targetDir = process.cwd();
25838
+ requireOcrSetup(targetDir);
25839
+ const ocrDir = join18(targetDir, ".ocr");
25840
+ if (!options.stdin) {
25841
+ try {
25842
+ const reviewersDir = join18(ocrDir, "skills", "references", "reviewers");
25843
+ const configPath = join18(ocrDir, "config.yaml");
25844
+ const meta = generateReviewersMeta(reviewersDir, configPath);
25845
+ if (!meta || meta.reviewers.length === 0) {
25846
+ console.error(source_default.yellow("No reviewer files found in .ocr/skills/references/reviewers/"));
25847
+ process.exit(1);
25848
+ }
25849
+ const metaPath = join18(ocrDir, "reviewers-meta.json");
25850
+ const tmpPath = metaPath + ".tmp";
25851
+ writeFileSync8(tmpPath, JSON.stringify(meta, null, 2) + "\n");
25852
+ renameSync2(tmpPath, metaPath);
25853
+ const tierCounts = meta.reviewers.reduce(
25854
+ (acc, r) => {
25855
+ acc[r.tier] = (acc[r.tier] ?? 0) + 1;
25856
+ return acc;
25857
+ },
25858
+ {}
25859
+ );
25860
+ const breakdown = Object.entries(tierCounts).map(([tier, count]) => `${count} ${tier}`).join(", ");
25861
+ console.log(source_default.green(`Synced ${meta.reviewers.length} reviewer(s) (${breakdown}).`));
25862
+ } catch (error) {
25863
+ console.error(
25864
+ source_default.red(`Error: ${error instanceof Error ? error.message : "Failed to sync reviewers"}`)
25865
+ );
25866
+ process.exit(1);
25867
+ }
25868
+ return;
25869
+ }
25870
+ try {
25871
+ const raw = await readStdin2();
25872
+ let parsed;
25873
+ try {
25874
+ parsed = JSON.parse(raw);
25875
+ } catch {
25876
+ throw new Error("Invalid JSON on stdin");
25877
+ }
25878
+ const meta = validateReviewersMeta(parsed);
25879
+ const metaPath = join18(ocrDir, "reviewers-meta.json");
25880
+ const tmpPath = metaPath + ".tmp";
25881
+ writeFileSync8(tmpPath, JSON.stringify(meta, null, 2) + "\n");
25882
+ renameSync2(tmpPath, metaPath);
25883
+ const tierCounts = meta.reviewers.reduce(
25884
+ (acc, r) => {
25885
+ acc[r.tier] = (acc[r.tier] ?? 0) + 1;
25886
+ return acc;
25887
+ },
25888
+ {}
25889
+ );
25890
+ const breakdown = Object.entries(tierCounts).map(([tier, count]) => `${count} ${tier}`).join(", ");
25891
+ console.log(
25892
+ source_default.green(`Synced ${meta.reviewers.length} reviewer(s) (${breakdown}).`)
25893
+ );
25894
+ } catch (error) {
25895
+ console.error(
25896
+ source_default.red(
25897
+ `Error: ${error instanceof Error ? error.message : "Failed to sync reviewers"}`
25898
+ )
25899
+ );
25900
+ process.exit(1);
25901
+ }
25902
+ });
25903
+ var reviewersCommand = new Command("reviewers").description("Manage OCR reviewer metadata").addCommand(syncSubcommand2);
25904
+
25619
25905
  // src/lib/update-check.ts
25620
25906
  import { homedir } from "node:os";
25621
- import { join as join18 } from "node:path";
25622
- import { readFileSync as readFileSync10, writeFileSync as writeFileSync8, mkdirSync as mkdirSync6 } from "node:fs";
25907
+ import { join as join19 } from "node:path";
25908
+ import { readFileSync as readFileSync10, writeFileSync as writeFileSync9, mkdirSync as mkdirSync6 } from "node:fs";
25623
25909
  var PACKAGE_NAME = "@open-code-review/cli";
25624
25910
  var REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
25625
- var CACHE_DIR = join18(homedir(), ".ocr");
25626
- var CACHE_FILE = join18(CACHE_DIR, "update-check.json");
25911
+ var CACHE_DIR = join19(homedir(), ".ocr");
25912
+ var CACHE_FILE = join19(CACHE_DIR, "update-check.json");
25627
25913
  var CHECK_INTERVAL_MS = 4 * 60 * 60 * 1e3;
25628
25914
  var FETCH_TIMEOUT_MS = 3e3;
25629
25915
  function readCache(cacheFile) {
@@ -25635,8 +25921,8 @@ function readCache(cacheFile) {
25635
25921
  }
25636
25922
  function writeCache(cacheFile, cache) {
25637
25923
  try {
25638
- mkdirSync6(join18(cacheFile, ".."), { recursive: true });
25639
- writeFileSync8(cacheFile, JSON.stringify(cache));
25924
+ mkdirSync6(join19(cacheFile, ".."), { recursive: true });
25925
+ writeFileSync9(cacheFile, JSON.stringify(cache));
25640
25926
  } catch {
25641
25927
  }
25642
25928
  }
@@ -25656,7 +25942,7 @@ async function checkForUpdate(currentVersion, options) {
25656
25942
  if (process.env.CI || process.env.OCR_NO_UPDATE_CHECK) {
25657
25943
  return null;
25658
25944
  }
25659
- const cacheFile = join18(options?.cacheDir ?? CACHE_DIR, "update-check.json");
25945
+ const cacheFile = join19(options?.cacheDir ?? CACHE_DIR, "update-check.json");
25660
25946
  try {
25661
25947
  const cache = readCache(cacheFile);
25662
25948
  if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {
@@ -25700,7 +25986,7 @@ ${line2}
25700
25986
  }
25701
25987
 
25702
25988
  // src/index.ts
25703
- var cliVersion = true ? "1.6.0" : createRequire(import.meta.url)("../package.json").version;
25989
+ var cliVersion = true ? "1.7.0" : createRequire(import.meta.url)("../package.json").version;
25704
25990
  var HUMAN_COMMANDS = /* @__PURE__ */ new Set(["init", "update", "doctor", "dashboard", "progress"]);
25705
25991
  var subcommand = process.argv[2];
25706
25992
  var updateCheck = subcommand && HUMAN_COMMANDS.has(subcommand) ? checkForUpdate(cliVersion) : null;
@@ -25712,6 +25998,7 @@ program2.addCommand(stateCommand);
25712
25998
  program2.addCommand(updateCommand);
25713
25999
  program2.addCommand(dashboardCommand);
25714
26000
  program2.addCommand(doctorCommand);
26001
+ program2.addCommand(reviewersCommand);
25715
26002
  await program2.parseAsync();
25716
26003
  if (updateCheck) {
25717
26004
  const updateResult = await Promise.race([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-code-review/cli",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "CLI for Open Code Review - Multi-environment setup and progress tracking",
5
5
  "type": "module",
6
6
  "bin": {
@@ -50,7 +50,7 @@
50
50
  "ora": "^8.1.1",
51
51
  "socket.io": "^4.8",
52
52
  "sql.js": "^1.14.1",
53
- "@open-code-review/agents": "1.6.0"
53
+ "@open-code-review/agents": "1.7.0"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./mermaid-renderer-DGUmIWXY.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-BXzTPbH1.js";import{_ as i}from"./mermaid-renderer-DGUmIWXY.js";import"./chunk-FMBD7UC4-B4g9S67N.js";import"./chunk-55IACEB6-C4SjgsZO.js";import"./chunk-QN33PNHL-Dyk7Hc0J.js";import"./index-BzQ3i_QR.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-BXzTPbH1.js";import{_ as i}from"./mermaid-renderer-DGUmIWXY.js";import"./chunk-FMBD7UC4-B4g9S67N.js";import"./chunk-55IACEB6-C4SjgsZO.js";import"./chunk-QN33PNHL-Dyk7Hc0J.js";import"./index-BzQ3i_QR.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./_baseUniq-Bx8loabg.js";var e=4;function a(o){return r(o,e)}export{a as c};