karajan-code 1.58.2 → 1.59.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 (60) hide show
  1. package/package.json +1 -1
  2. package/src/agents/aider-agent.js +7 -0
  3. package/src/agents/claude-agent.js +36 -2
  4. package/src/agents/codex-agent.js +4 -0
  5. package/src/agents/gemini-agent.js +4 -0
  6. package/src/agents/opencode-agent.js +4 -0
  7. package/src/bootstrap.js +20 -9
  8. package/src/cli.js +1 -0
  9. package/src/commands/doctor.js +19 -0
  10. package/src/commands/report.js +13 -0
  11. package/src/commands/status.js +7 -0
  12. package/src/config.js +35 -0
  13. package/src/domains/domain-loader.js +85 -4
  14. package/src/git/automation.js +32 -4
  15. package/src/guards/policy-guard.js +90 -0
  16. package/src/mcp/handlers/run-handler.js +20 -3
  17. package/src/mcp/shared-helpers.js +4 -2
  18. package/src/mcp/sovereignty-guard.js +1 -1
  19. package/src/mcp/tools.js +2 -1
  20. package/src/orchestrator.js +77 -20
  21. package/src/prompts/coder.js +5 -4
  22. package/src/prompts/reviewer.js +5 -4
  23. package/src/prompts/rtk-snippet.js +12 -0
  24. package/src/proxy/adapters/anthropic.js +131 -0
  25. package/src/proxy/adapters/gemini.js +106 -0
  26. package/src/proxy/adapters/index.js +51 -0
  27. package/src/proxy/adapters/openai.js +71 -0
  28. package/src/proxy/compression/ai-compressor.js +209 -0
  29. package/src/proxy/compression/dedup-cache.js +100 -0
  30. package/src/proxy/compression/deterministic/bash-build.js +60 -0
  31. package/src/proxy/compression/deterministic/bash-git.js +101 -0
  32. package/src/proxy/compression/deterministic/bash-infra.js +64 -0
  33. package/src/proxy/compression/deterministic/bash-misc.js +53 -0
  34. package/src/proxy/compression/deterministic/bash-pkg.js +49 -0
  35. package/src/proxy/compression/deterministic/bash-test.js +61 -0
  36. package/src/proxy/compression/deterministic/glob.js +26 -0
  37. package/src/proxy/compression/deterministic/grep.js +53 -0
  38. package/src/proxy/compression/deterministic/index.js +58 -0
  39. package/src/proxy/compression/deterministic/read.js +22 -0
  40. package/src/proxy/compression/deterministic/utils.js +33 -0
  41. package/src/proxy/compression/pipeline.js +270 -0
  42. package/src/proxy/middleware/prompt-injector.js +165 -0
  43. package/src/proxy/middleware/response-interceptor.js +223 -0
  44. package/src/proxy/progress-monitor.js +98 -0
  45. package/src/proxy/proxy-lifecycle.js +201 -0
  46. package/src/proxy/proxy-server.js +239 -0
  47. package/src/proxy/security.js +45 -0
  48. package/src/review/diff-generator.js +10 -8
  49. package/src/roles/coder-role.js +1 -0
  50. package/src/roles/impeccable-role.js +2 -4
  51. package/src/roles/researcher-role.js +2 -4
  52. package/src/roles/reviewer-role.js +10 -8
  53. package/src/roles/solomon-role.js +2 -4
  54. package/src/session-cleanup.js +39 -15
  55. package/src/sonar/cloud-scanner.js +6 -3
  56. package/src/sonar/scanner.js +12 -7
  57. package/src/utils/banner.js +66 -0
  58. package/src/utils/display.js +46 -7
  59. package/src/utils/git.js +5 -0
  60. package/src/utils/welcome.js +3 -8
@@ -1,6 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { fileURLToPath } from "node:url";
4
+ import { printBanner } from "./banner.js";
4
5
 
5
6
  // TODO: i18n display messages
6
7
  const DISPLAY_PKG_PATH = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../package.json");
@@ -83,9 +84,7 @@ const BAR = `${ANSI.dim}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u
83
84
 
84
85
  export function printHeader({ task, config }) {
85
86
  const version = DISPLAY_VERSION;
86
- console.log(BAR);
87
- console.log(`${ANSI.bold}${ANSI.cyan}\u25b6 Karajan Code v${version}${ANSI.reset}`);
88
- console.log(BAR);
87
+ printBanner(version);
89
88
  console.log(`${ANSI.bold}Task:${ANSI.reset} ${task}`);
90
89
  console.log(
91
90
  `${ANSI.bold}Coder:${ANSI.reset} ${config.roles?.coder?.provider || config.coder} ${ANSI.dim}|${ANSI.reset} ${ANSI.bold}Reviewer:${ANSI.reset} ${config.roles?.reviewer?.provider || config.reviewer}`
@@ -560,6 +559,24 @@ const EVENT_HANDLERS = {
560
559
  console.log(` ${ANSI.dim}\u2514${ANSI.reset}`);
561
560
  },
562
561
 
562
+ "session:checkpoint": (event) => {
563
+ const d = event.detail || {};
564
+ if (d.auto_continued) {
565
+ console.log(` \u251c\u2500 ${ANSI.dim}\u2714 Checkpoint: auto-continuing (${d.reason || "progress"})${ANSI.reset}`);
566
+ } else {
567
+ console.log(` \u251c\u2500 ${ANSI.yellow}\u23f8\ufe0f Interactive checkpoint at ${d.elapsed_minutes?.toFixed(1) || "?"}min${ANSI.reset}`);
568
+ }
569
+ },
570
+
571
+ "becaria:pr-created": (event) => {
572
+ const url = event.detail?.prUrl || "";
573
+ console.log(` \u251c\u2500 ${ANSI.green}\ud83d\ude80 BecarIA PR created: ${url}${ANSI.reset}`);
574
+ },
575
+
576
+ "solomon:alert": (event) => {
577
+ console.log(` \u251c\u2500 ${ANSI.yellow}\u2696\ufe0f Solomon alert: ${event.message || "conflict detected"}${ANSI.reset}`);
578
+ },
579
+
563
580
  "agent:output": (event) => {
564
581
  console.log(` \u2502 ${ANSI.dim}${event.message}${ANSI.reset}`);
565
582
  }
@@ -567,9 +584,30 @@ const EVENT_HANDLERS = {
567
584
 
568
585
  /* ── Quiet-mode filter ──────────────────────────────────────── */
569
586
 
570
- /** Event types suppressed in quiet mode (raw agent output noise). */
587
+ /** Event types suppressed in quiet mode (internal/noise events). */
571
588
  const QUIET_SUPPRESSED = new Set([
572
- "agent:output"
589
+ "agent:output",
590
+ "agent:stall",
591
+ "agent:heartbeat",
592
+ "pipeline:simplify",
593
+ "pipeline:analysis-only",
594
+ "policies:resolved",
595
+ "intent:classified",
596
+ "skills:auto-install",
597
+ "context:loaded",
598
+ "rtk:detected",
599
+ "proxy:started",
600
+ "board:started",
601
+ "plan:loaded",
602
+ "tdd:auto-detect",
603
+ "dry-run:summary",
604
+ "pg:decompose",
605
+ "tester:auto-continue",
606
+ "security:auto-continue",
607
+ "hu:sub-pipeline:start",
608
+ "hu:sub-pipeline:end",
609
+ "resilient:auto_resume",
610
+ "guard:blocked",
573
611
  ]);
574
612
 
575
613
  /* ── Main entry point ───────────────────────────────────────── */
@@ -591,7 +629,8 @@ export function printEvent(event, opts = {}) {
591
629
  const handler = EVENT_HANDLERS[event.type];
592
630
  if (handler) {
593
631
  handler(event, icon, elapsed, status);
594
- } else {
595
- console.log(` \u251c\u2500 ${icon} ${event.message || event.type} ${elapsed}`);
632
+ } else if (event.message) {
633
+ console.log(` \u251c\u2500 ${icon} ${event.message} ${elapsed}`);
596
634
  }
635
+ // Events without handler AND without message are silently dropped
597
636
  }
package/src/utils/git.js CHANGED
@@ -40,6 +40,11 @@ export async function currentBranch() {
40
40
  return runGit(["rev-parse", "--abbrev-ref", "HEAD"]);
41
41
  }
42
42
 
43
+ export async function hasCommits() {
44
+ const res = await run("git", ["rev-parse", "HEAD"]);
45
+ return res.exitCode === 0;
46
+ }
47
+
43
48
  export async function fetchBase(baseBranch) {
44
49
  await runGit(["fetch", "origin", baseBranch]);
45
50
  }
@@ -1,3 +1,5 @@
1
+ import { printBanner } from "./banner.js";
2
+
1
3
  const A = {
2
4
  reset: "\x1b[0m",
3
5
  bold: "\x1b[1m",
@@ -7,8 +9,6 @@ const A = {
7
9
  yellow: "\x1b[33m",
8
10
  };
9
11
 
10
- const BAR = `${A.dim}${"─".repeat(44)}${A.reset}`;
11
-
12
12
  const QUICK_START = [
13
13
  ["kj run <task>", "Run the full coder+reviewer pipeline"],
14
14
  ["kj init", "Initialize config and setup"],
@@ -24,12 +24,7 @@ const QUICK_START = [
24
24
  * @param {object} [opts.config] - Loaded KJ config (optional, shows configured agents)
25
25
  */
26
26
  export function printWelcomeScreen({ version, config = null }) {
27
- console.log();
28
- console.log(BAR);
29
- console.log(` ${A.bold}${A.cyan}▶ Karajan Code${A.reset} ${A.dim}v${version}${A.reset}`);
30
- console.log(` ${A.dim}AI-powered coding pipeline${A.reset}`);
31
- console.log(BAR);
32
- console.log();
27
+ printBanner(version, { force: true });
33
28
 
34
29
  if (config) {
35
30
  const coder = config.roles?.coder?.provider || config.coder || "claude";