codingbuddy 5.1.1 → 5.1.3

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 (33) hide show
  1. package/dist/src/checklist/checklist.types.d.ts +1 -1
  2. package/dist/src/checklist/checklist.types.js +1 -0
  3. package/dist/src/checklist/checklist.types.js.map +1 -1
  4. package/dist/src/cli/run-tui.js +16 -0
  5. package/dist/src/cli/run-tui.js.map +1 -1
  6. package/dist/src/config/config.schema.d.ts +9 -0
  7. package/dist/src/config/config.schema.js +10 -0
  8. package/dist/src/config/config.schema.js.map +1 -1
  9. package/dist/src/keyword/keyword.service.d.ts +2 -0
  10. package/dist/src/keyword/keyword.service.js +24 -0
  11. package/dist/src/keyword/keyword.service.js.map +1 -1
  12. package/dist/src/mcp/handlers/index.d.ts +2 -0
  13. package/dist/src/mcp/handlers/index.js +5 -1
  14. package/dist/src/mcp/handlers/index.js.map +1 -1
  15. package/dist/src/mcp/handlers/plugin-validation.handler.d.ts +12 -0
  16. package/dist/src/mcp/handlers/plugin-validation.handler.js +148 -0
  17. package/dist/src/mcp/handlers/plugin-validation.handler.js.map +1 -0
  18. package/dist/src/mcp/handlers/release-check.handler.d.ts +16 -0
  19. package/dist/src/mcp/handlers/release-check.handler.js +247 -0
  20. package/dist/src/mcp/handlers/release-check.handler.js.map +1 -0
  21. package/dist/src/mcp/mcp.module.js +2 -0
  22. package/dist/src/mcp/mcp.module.js.map +1 -1
  23. package/dist/src/shared/version.d.ts +1 -1
  24. package/dist/src/shared/version.js +1 -1
  25. package/dist/src/tui/events/hud-file-bridge.d.ts +21 -0
  26. package/dist/src/tui/events/hud-file-bridge.js +112 -0
  27. package/dist/src/tui/events/hud-file-bridge.js.map +1 -0
  28. package/dist/src/tui/events/index.d.ts +1 -0
  29. package/dist/src/tui/events/index.js +3 -1
  30. package/dist/src/tui/events/index.js.map +1 -1
  31. package/dist/src/tui-bundle.mjs +55 -33
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +2 -2
@@ -595,21 +595,21 @@ var require_eventemitter2 = __commonJS({
595
595
  function collectTreeEvents(tree, events, root, asArray) {
596
596
  var branches = ownKeys(tree);
597
597
  var i = branches.length;
598
- var branch, branchName, path9;
598
+ var branch, branchName, path10;
599
599
  var hasListeners = tree["_listeners"];
600
600
  var isArrayPath;
601
601
  while (i-- > 0) {
602
602
  branchName = branches[i];
603
603
  branch = tree[branchName];
604
604
  if (branchName === "_listeners") {
605
- path9 = root;
605
+ path10 = root;
606
606
  } else {
607
- path9 = root ? root.concat(branchName) : [branchName];
607
+ path10 = root ? root.concat(branchName) : [branchName];
608
608
  }
609
609
  isArrayPath = asArray || typeof branchName === "symbol";
610
- hasListeners && events.push(isArrayPath ? path9 : path9.join(this.delimiter));
610
+ hasListeners && events.push(isArrayPath ? path10 : path10.join(this.delimiter));
611
611
  if (typeof branch === "object") {
612
- collectTreeEvents.call(this, branch, events, path9, isArrayPath);
612
+ collectTreeEvents.call(this, branch, events, path10, isArrayPath);
613
613
  }
614
614
  }
615
615
  return events;
@@ -2366,7 +2366,7 @@ function getReadFile(deps) {
2366
2366
  function getReaddir(deps) {
2367
2367
  return deps?.readdir ?? defaultReaddir;
2368
2368
  }
2369
- function resolveRulesDir(dirname2, options) {
2369
+ function resolveRulesDir(dirname3, options) {
2370
2370
  if (options?.envRulesDir) {
2371
2371
  return options.envRulesDir;
2372
2372
  }
@@ -2374,15 +2374,15 @@ function resolveRulesDir(dirname2, options) {
2374
2374
  return options.packageRulesPath;
2375
2375
  }
2376
2376
  const candidates = [
2377
- path2.resolve(dirname2, "../../../../packages/rules/.ai-rules"),
2378
- path2.resolve(dirname2, "../../../packages/rules/.ai-rules"),
2379
- path2.resolve(dirname2, "../../../../.ai-rules"),
2380
- path2.resolve(dirname2, "../../../.ai-rules")
2377
+ path2.resolve(dirname3, "../../../../packages/rules/.ai-rules"),
2378
+ path2.resolve(dirname3, "../../../packages/rules/.ai-rules"),
2379
+ path2.resolve(dirname3, "../../../../.ai-rules"),
2380
+ path2.resolve(dirname3, "../../../.ai-rules")
2381
2381
  ];
2382
- const existsSync6 = options?.existsSync;
2383
- if (existsSync6) {
2382
+ const existsSync7 = options?.existsSync;
2383
+ if (existsSync7) {
2384
2384
  for (const candidate of candidates) {
2385
- if (existsSync6(candidate)) {
2385
+ if (existsSync7(candidate)) {
2386
2386
  return candidate;
2387
2387
  }
2388
2388
  }
@@ -3035,6 +3035,22 @@ var AIConfigSchema = z3.object({
3035
3035
  var AutoConfigSchema = z3.object({
3036
3036
  maxIterations: z3.number().int().min(1).max(10).default(3)
3037
3037
  });
3038
+ var ReleaseConfigSchema = z3.object({
3039
+ /** Files that contain the project version (checked for consistency) */
3040
+ versionFiles: z3.array(z3.string()).optional(),
3041
+ /** Lockfile path to verify sync (auto-detected if omitted) */
3042
+ lockfile: z3.string().optional(),
3043
+ /** Commands to run before release (e.g., ['lint', 'typecheck', 'test:coverage', 'build']) */
3044
+ preReleaseChecks: z3.array(z3.string()).optional(),
3045
+ /** Run security audit before release. Default: true */
3046
+ securityAudit: z3.boolean().default(true).optional(),
3047
+ /** Minimum test coverage percentage required */
3048
+ coverageThreshold: z3.number().min(0).max(100).optional(),
3049
+ /** Plugin manifest validation (auto-detected if .claude-plugin/ exists). Default: true */
3050
+ validatePlugin: z3.boolean().default(true).optional(),
3051
+ /** Version bump script path (e.g., 'scripts/bump-version.sh') */
3052
+ bumpScript: z3.string().optional()
3053
+ });
3038
3054
  var ContextConfigSchema = z3.object({
3039
3055
  /** Maximum items per array (decisions, notes, etc.). Default: 100 */
3040
3056
  maxArrayItems: z3.number().int().min(10).max(1e3).default(100),
@@ -3060,6 +3076,8 @@ var CodingBuddyConfigSchema = z3.object({
3060
3076
  ai: AIConfigSchema.optional(),
3061
3077
  // AUTO mode settings
3062
3078
  auto: AutoConfigSchema.optional(),
3079
+ // Release configuration
3080
+ release: ReleaseConfigSchema.optional(),
3063
3081
  // Context document limits (DoS prevention)
3064
3082
  context: ContextConfigSchema.optional(),
3065
3083
  // Upstream Repository Mapping (for cross-repo issue creation)
@@ -4123,6 +4141,10 @@ TuiEventsModule = __decorateClass([
4123
4141
  })
4124
4142
  ], TuiEventsModule);
4125
4143
 
4144
+ // src/tui/events/hud-file-bridge.ts
4145
+ import * as fs4 from "node:fs";
4146
+ import * as path8 from "node:path";
4147
+
4126
4148
  // src/tui/hooks/use-focus-agent.ts
4127
4149
  function selectFocusedAgent(agents, currentFocusId) {
4128
4150
  if (agents.size === 0) return null;
@@ -5411,57 +5433,57 @@ var ColorBuffer = class {
5411
5433
 
5412
5434
  // src/tui/utils/edge-router.ts
5413
5435
  function computeEdgePath(from, to) {
5414
- const path9 = [];
5436
+ const path10 = [];
5415
5437
  const midX = Math.floor((from.x + to.x) / 2);
5416
5438
  if (from.y === to.y) {
5417
5439
  const dir = to.x > from.x ? 1 : -1;
5418
5440
  for (let x = from.x; x !== to.x; x += dir) {
5419
- path9.push({ x, y: from.y, char: "\u2500" });
5441
+ path10.push({ x, y: from.y, char: "\u2500" });
5420
5442
  }
5421
- path9.push({ x: to.x, y: to.y, char: dir > 0 ? "\u25B8" : "\u25C2" });
5443
+ path10.push({ x: to.x, y: to.y, char: dir > 0 ? "\u25B8" : "\u25C2" });
5422
5444
  } else if (from.x === to.x) {
5423
5445
  const dir = to.y > from.y ? 1 : -1;
5424
5446
  for (let y = from.y; y !== to.y; y += dir) {
5425
- path9.push({ x: from.x, y, char: "\u2502" });
5447
+ path10.push({ x: from.x, y, char: "\u2502" });
5426
5448
  }
5427
- path9.push({ x: to.x, y: to.y, char: dir > 0 ? "\u25BE" : "\u25B4" });
5449
+ path10.push({ x: to.x, y: to.y, char: dir > 0 ? "\u25BE" : "\u25B4" });
5428
5450
  } else {
5429
5451
  const dirX = midX > from.x ? 1 : midX < from.x ? -1 : 0;
5430
5452
  if (dirX !== 0) {
5431
5453
  for (let x = from.x; x !== midX; x += dirX) {
5432
- path9.push({ x, y: from.y, char: "\u2500" });
5454
+ path10.push({ x, y: from.y, char: "\u2500" });
5433
5455
  }
5434
5456
  }
5435
5457
  const dirY = to.y > from.y ? 1 : -1;
5436
- path9.push({
5458
+ path10.push({
5437
5459
  x: midX,
5438
5460
  y: from.y,
5439
5461
  char: dirX >= 0 ? dirY > 0 ? "\u256E" : "\u256F" : dirY > 0 ? "\u256D" : "\u2570"
5440
5462
  });
5441
5463
  for (let y = from.y + dirY; y !== to.y; y += dirY) {
5442
- path9.push({ x: midX, y, char: "\u2502" });
5464
+ path10.push({ x: midX, y, char: "\u2502" });
5443
5465
  }
5444
5466
  const dirX2 = to.x > midX ? 1 : to.x < midX ? -1 : 0;
5445
- path9.push({
5467
+ path10.push({
5446
5468
  x: midX,
5447
5469
  y: to.y,
5448
5470
  char: dirY > 0 ? dirX2 >= 0 ? "\u2570" : "\u256F" : dirX2 >= 0 ? "\u256D" : "\u256E"
5449
5471
  });
5450
5472
  if (dirX2 !== 0) {
5451
5473
  for (let x = midX + dirX2; x !== to.x; x += dirX2) {
5452
- path9.push({ x, y: to.y, char: "\u2500" });
5474
+ path10.push({ x, y: to.y, char: "\u2500" });
5453
5475
  }
5454
5476
  }
5455
5477
  if (to.x !== midX) {
5456
- path9.push({ x: to.x, y: to.y, char: dirX2 >= 0 ? "\u25B8" : "\u25C2" });
5478
+ path10.push({ x: to.x, y: to.y, char: dirX2 >= 0 ? "\u25B8" : "\u25C2" });
5457
5479
  } else {
5458
- path9[path9.length - 1].char = dirY > 0 ? "\u25BE" : "\u25B4";
5480
+ path10[path10.length - 1].char = dirY > 0 ? "\u25BE" : "\u25B4";
5459
5481
  }
5460
5482
  }
5461
- return path9;
5483
+ return path10;
5462
5484
  }
5463
- function computeLabelPosition(path9, label) {
5464
- const hSegments = path9.filter((p) => p.char === "\u2500");
5485
+ function computeLabelPosition(path10, label) {
5486
+ const hSegments = path10.filter((p) => p.char === "\u2500");
5465
5487
  if (hSegments.length < label.length + 2) return null;
5466
5488
  const startIdx = Math.floor((hSegments.length - label.length) / 2);
5467
5489
  return { x: hSegments[startIdx].x, y: hSegments[startIdx].y };
@@ -5732,14 +5754,14 @@ function renderFlowMap(agents, edges, width, height, activeStage = null) {
5732
5754
  x: toPos.x - 1,
5733
5755
  y: toPos.y + Math.floor(toPos.height / 2)
5734
5756
  };
5735
- const path9 = computeEdgePath(fromPoint, toPoint);
5757
+ const path10 = computeEdgePath(fromPoint, toPoint);
5736
5758
  const edgeDimmed = inactiveIds.has(edge.from) && inactiveIds.has(edge.to);
5737
- for (const seg of path9) {
5759
+ for (const seg of path10) {
5738
5760
  const isArrow = seg.char === "\u25B8" || seg.char === "\u25C2" || seg.char === "\u25BE" || seg.char === "\u25B4";
5739
5761
  const segStyle = edgeDimmed ? DIMMED_STYLE : isArrow ? EDGE_STYLES.arrow : EDGE_STYLES.path;
5740
5762
  buf.setChar(seg.x, seg.y, seg.char, segStyle);
5741
5763
  }
5742
- const labelPos = computeLabelPosition(path9, edge.label);
5764
+ const labelPos = computeLabelPosition(path10, edge.label);
5743
5765
  if (labelPos) {
5744
5766
  buf.writeText(
5745
5767
  labelPos.x,
@@ -6729,7 +6751,7 @@ function DashboardApp({
6729
6751
  // src/tui/multi-session-app.tsx
6730
6752
  import React15, { useMemo as useMemo8, useCallback as useCallback2 } from "react";
6731
6753
  import { Box as Box15, useInput } from "ink";
6732
- import * as path8 from "path";
6754
+ import * as path9 from "path";
6733
6755
 
6734
6756
  // src/tui/hooks/use-multi-session-state.ts
6735
6757
  import { useState as useState3, useCallback, useEffect as useEffect4, useRef } from "react";
@@ -6954,7 +6976,7 @@ function MultiSessionApp({ manager }) {
6954
6976
  result.push({
6955
6977
  pid,
6956
6978
  index,
6957
- projectName: path8.basename(sessionState.projectRoot),
6979
+ projectName: path9.basename(sessionState.projectRoot),
6958
6980
  globalState: sessionState.dashboardState.globalState,
6959
6981
  isActive: pid === activeSessionPid
6960
6982
  });