@caddis/cli 0.4.13 → 0.4.15

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 (28) hide show
  1. package/bundles/antigravity-plugin/caddis_statusline.py +30 -3
  2. package/bundles/antigravity-plugin/plugin.json +1 -1
  3. package/bundles/antigravity-plugin/repo_freshness.py +146 -0
  4. package/bundles/antigravity-plugin/scripts/caddis-run.ps1 +11 -0
  5. package/bundles/antigravity-plugin/scripts/caddis-run.sh +9 -0
  6. package/bundles/antigravity-plugin/scripts/caddis_gate.py +24 -3
  7. package/bundles/antigravity-plugin/scripts/caddis_governor.py +542 -0
  8. package/bundles/antigravity-plugin/scripts/caddis_host_guard.py +689 -0
  9. package/bundles/antigravity-plugin/scripts/caddis_lanes.py +1632 -0
  10. package/bundles/antigravity-plugin/scripts/caddis_statusline.py +30 -3
  11. package/bundles/antigravity-plugin/scripts/install-host-guard.ps1 +393 -0
  12. package/bundles/antigravity-plugin/skills/_registry.md +2 -0
  13. package/bundles/antigravity-plugin/skills/confluence-hla/SKILL.md +375 -0
  14. package/bundles/antigravity-plugin/skills/confluence-hla/scripts/convert_hla_to_confluence.py +1164 -0
  15. package/bundles/antigravity-plugin/skills/confluence-hla/scripts/discover_db_lineage.py +970 -0
  16. package/bundles/antigravity-plugin/skills/feature-plan/SKILL.md +30 -4
  17. package/bundles/antigravity-plugin/skills/implement/SKILL.md +48 -1
  18. package/bundles/antigravity-plugin/skills/pr-merge/SKILL.md +155 -0
  19. package/bundles/antigravity-plugin/warm_start_agy.py +38 -4
  20. package/bundles/codex/.codex/skills/docs/confluence-hla/SKILL.md +375 -0
  21. package/bundles/codex/.codex/skills/docs/confluence-hla/scripts/convert_hla_to_confluence.py +1164 -0
  22. package/bundles/codex/.codex/skills/docs/confluence-hla/scripts/discover_db_lineage.py +970 -0
  23. package/bundles/manifest.json +2 -2
  24. package/dist/claude-deepseek.js +50 -10
  25. package/dist/claude-glm.js +50 -10
  26. package/dist/claude-oss.js +50 -10
  27. package/dist/cli.js +173 -63
  28. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -3874,13 +3874,97 @@ var require_picocolors = __commonJS({
3874
3874
  }
3875
3875
  });
3876
3876
 
3877
+ // src/util/theme.ts
3878
+ function hex(hexStr) {
3879
+ const clean = hexStr.replace("#", "");
3880
+ const r2 = parseInt(clean.substring(0, 2), 16);
3881
+ const g2 = parseInt(clean.substring(2, 4), 16);
3882
+ const b3 = parseInt(clean.substring(4, 6), 16);
3883
+ return (text) => import_picocolors.default.isColorSupported ? `\x1B[38;2;${r2};${g2};${b3}m${text}\x1B[39m` : text;
3884
+ }
3885
+ var import_picocolors, theme;
3886
+ var init_theme = __esm({
3887
+ "src/util/theme.ts"() {
3888
+ "use strict";
3889
+ import_picocolors = __toESM(require_picocolors(), 1);
3890
+ theme = {
3891
+ // Primary Brand
3892
+ mint: hex("#00FFA6"),
3893
+ // Radiant Cyber Mint (#00FFA6)
3894
+ // Contrasting Accents
3895
+ violet: hex("#A855F7"),
3896
+ // Electric Violet (high-contrast complement)
3897
+ magenta: hex("#FF007F"),
3898
+ // Neon Magenta (warm contrast)
3899
+ sky: hex("#00D2FF"),
3900
+ // Electric Sky Cyan (cool highlight)
3901
+ amber: hex("#FFB703"),
3902
+ // Neon Amber (warning / drift)
3903
+ coral: hex("#FF4A6E"),
3904
+ // Electric Coral (errors)
3905
+ // Formatter utilities
3906
+ dim: import_picocolors.default.dim,
3907
+ bold: import_picocolors.default.bold,
3908
+ isColorSupported: import_picocolors.default.isColorSupported
3909
+ };
3910
+ }
3911
+ });
3912
+
3913
+ // src/util/banner.ts
3914
+ function renderBanner(options = {}) {
3915
+ process.stdout.write("\n");
3916
+ for (let i = 0; i < 7; i++) {
3917
+ const m2 = import_picocolors2.default.bold(theme.mint(MARK[i]));
3918
+ const w2 = i < 2 ? import_picocolors2.default.bold(theme.mint(WORDMARK[i])) : i < 4 ? import_picocolors2.default.bold(theme.violet(WORDMARK[i])) : import_picocolors2.default.bold(theme.magenta(WORDMARK[i]));
3919
+ process.stdout.write(` ${m2} ${w2}
3920
+ `);
3921
+ }
3922
+ const sub = options.subtitle ?? "Agent-Agnostic Developer Harness \xB7 Multi-Model Coding Core";
3923
+ process.stdout.write(` ${import_picocolors2.default.dim(sub)}
3924
+ `);
3925
+ if (options.cliVersion || options.poolVersion) {
3926
+ const parts = [];
3927
+ if (options.cliVersion) parts.push(`cli ${theme.mint(options.cliVersion)}`);
3928
+ if (options.poolVersion) parts.push(`pool ${theme.violet(import_picocolors2.default.bold(options.poolVersion))}`);
3929
+ process.stdout.write(` ${import_picocolors2.default.dim(parts.join(" \xB7 "))}
3930
+ `);
3931
+ }
3932
+ process.stdout.write("\n");
3933
+ }
3934
+ var import_picocolors2, MARK, WORDMARK;
3935
+ var init_banner = __esm({
3936
+ "src/util/banner.ts"() {
3937
+ "use strict";
3938
+ import_picocolors2 = __toESM(require_picocolors(), 1);
3939
+ init_theme();
3940
+ MARK = [
3941
+ " \u2584\u2588\u2588\u2588\u2588\u2588\u2588\u2584 ",
3942
+ " \u2584\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 ",
3943
+ " \u2588\u2588\u2588\u2588\u2588\u2580 \u2580\u2588\u2588\u2588\u2588 ",
3944
+ " \u2588\u2588\u2588\u2588 ",
3945
+ " \u2588\u2588\u2588\u2588\u2588\u2584 \u2584\u2588\u2588\u2588\u2588 ",
3946
+ " \u2580\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2580 ",
3947
+ " \u2580\u2588\u2588\u2588\u2588\u2588\u2588\u2580 "
3948
+ ];
3949
+ WORDMARK = [
3950
+ " \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
3951
+ "\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D",
3952
+ "\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557",
3953
+ "\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551",
3954
+ "\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551",
3955
+ " \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D",
3956
+ " "
3957
+ ];
3958
+ }
3959
+ });
3960
+
3877
3961
  // src/util/log.ts
3878
3962
  function mark(kind) {
3879
3963
  return MARKS[kind];
3880
3964
  }
3881
3965
  function heading(text) {
3882
3966
  process.stdout.write(`
3883
- ${import_picocolors.default.bold(text)}
3967
+ ${import_picocolors3.default.bold(theme.mint("\u25C6"))} ${import_picocolors3.default.bold(text)}
3884
3968
  `);
3885
3969
  }
3886
3970
  function line(text = "") {
@@ -3891,32 +3975,42 @@ function item(kind, text) {
3891
3975
  line(` ${mark(kind)} ${text}`);
3892
3976
  }
3893
3977
  function detail(text) {
3894
- line(` ${import_picocolors.default.dim(text)}`);
3978
+ line(` ${import_picocolors3.default.dim(text)}`);
3895
3979
  }
3896
3980
  function hint(text) {
3897
- line(` ${import_picocolors.default.cyan("\u2192")} ${text}`);
3981
+ line(` ${theme.sky("\u2192")} ${text}`);
3898
3982
  }
3899
3983
  function errorLine(text) {
3900
- process.stderr.write(`${import_picocolors.default.red("error")} ${text}
3984
+ process.stderr.write(`${theme.coral("error")} ${text}
3901
3985
  `);
3902
3986
  }
3903
- var import_picocolors, OK, WARN, FAIL, SKIP, MARKS, color;
3987
+ var import_picocolors3, OK, WARN, FAIL, SKIP, MARKS, color;
3904
3988
  var init_log = __esm({
3905
3989
  "src/util/log.ts"() {
3906
3990
  "use strict";
3907
- import_picocolors = __toESM(require_picocolors(), 1);
3908
- OK = import_picocolors.default.green("OK");
3909
- WARN = import_picocolors.default.yellow("!!");
3910
- FAIL = import_picocolors.default.red("XX");
3911
- SKIP = import_picocolors.default.dim("--");
3991
+ import_picocolors3 = __toESM(require_picocolors(), 1);
3992
+ init_theme();
3993
+ init_banner();
3994
+ init_theme();
3995
+ OK = theme.mint("OK");
3996
+ WARN = theme.amber("!!");
3997
+ FAIL = theme.coral("XX");
3998
+ SKIP = import_picocolors3.default.dim("--");
3912
3999
  MARKS = {
3913
- ok: import_picocolors.default.green("\u2713"),
3914
- warn: import_picocolors.default.yellow("\u25B2"),
3915
- fail: import_picocolors.default.red("\u2717"),
3916
- skip: import_picocolors.default.dim("\xB7"),
3917
- info: import_picocolors.default.cyan("\u2022")
4000
+ ok: theme.mint("\u2713"),
4001
+ warn: theme.amber("\u25B2"),
4002
+ fail: theme.coral("\u2717"),
4003
+ skip: import_picocolors3.default.dim("\xB7"),
4004
+ info: theme.sky("\u2022")
3918
4005
  };
3919
- color = import_picocolors.default;
4006
+ color = Object.assign(import_picocolors3.default, {
4007
+ mint: theme.mint,
4008
+ violet: theme.violet,
4009
+ magenta: theme.magenta,
4010
+ sky: theme.sky,
4011
+ amber: theme.amber,
4012
+ coral: theme.coral
4013
+ });
3920
4014
  }
3921
4015
  });
3922
4016
 
@@ -4090,12 +4184,12 @@ function fD({ input: e2 = j, output: u2 = M, overwrite: t = true, hideCursor: F2
4090
4184
  e2.off("keypress", i), F2 && u2.write(import_sisteransi.cursor.show), e2.isTTY && !AD && e2.setRawMode(false), s.terminal = false, s.close();
4091
4185
  };
4092
4186
  }
4093
- var import_sisteransi, import_picocolors2, uD, W, tD, eD, FD, sD, w, N, I, R, r, iD, CD, ED, d, oD, y, V, nD, G, _, z, K, aD, k, hD, lD, xD, B, AD, S, gD, vD, h, x, dD, A, TD, jD, U, MD;
4187
+ var import_sisteransi, import_picocolors4, uD, W, tD, eD, FD, sD, w, N, I, R, r, iD, CD, ED, d, oD, y, V, nD, G, _, z, K, aD, k, hD, lD, xD, B, AD, S, gD, vD, h, x, dD, A, TD, jD, U, MD;
4094
4188
  var init_dist = __esm({
4095
4189
  "node_modules/@clack/core/dist/index.mjs"() {
4096
4190
  "use strict";
4097
4191
  import_sisteransi = __toESM(require_src(), 1);
4098
- import_picocolors2 = __toESM(require_picocolors(), 1);
4192
+ import_picocolors4 = __toESM(require_picocolors(), 1);
4099
4193
  uD = DD();
4100
4194
  W = { exports: {} };
4101
4195
  (function(e2) {
@@ -4336,10 +4430,10 @@ var init_dist = __esm({
4336
4430
  super(t), U(this, "valueWithCursor", ""), U(this, "_mask", "\u2022"), this._mask = u2 ?? "\u2022", this.on("finalize", () => {
4337
4431
  this.valueWithCursor = this.masked;
4338
4432
  }), this.on("value", () => {
4339
- if (this.cursor >= this.value.length) this.valueWithCursor = `${this.masked}${import_picocolors2.default.inverse(import_picocolors2.default.hidden("_"))}`;
4433
+ if (this.cursor >= this.value.length) this.valueWithCursor = `${this.masked}${import_picocolors4.default.inverse(import_picocolors4.default.hidden("_"))}`;
4340
4434
  else {
4341
4435
  const F2 = this.masked.slice(0, this.cursor), s = this.masked.slice(this.cursor);
4342
- this.valueWithCursor = `${F2}${import_picocolors2.default.inverse(s[0])}${s.slice(1)}`;
4436
+ this.valueWithCursor = `${F2}${import_picocolors4.default.inverse(s[0])}${s.slice(1)}`;
4343
4437
  }
4344
4438
  });
4345
4439
  }
@@ -4359,13 +4453,13 @@ import y2 from "process";
4359
4453
  function ce() {
4360
4454
  return y2.platform !== "win32" ? y2.env.TERM !== "linux" : !!y2.env.CI || !!y2.env.WT_SESSION || !!y2.env.TERMINUS_SUBLIME || y2.env.ConEmuTask === "{cmd::Cmder}" || y2.env.TERM_PROGRAM === "Terminus-Sublime" || y2.env.TERM_PROGRAM === "vscode" || y2.env.TERM === "xterm-256color" || y2.env.TERM === "alacritty" || y2.env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
4361
4455
  }
4362
- var import_picocolors3, import_sisteransi2, V2, u, le, L2, W2, C, ue, o, d2, k2, P2, A2, T, F, $e, _2, me, de, pe, q, D, U2, K2, b2, ge, ye, xe, Ie, Se, J, Y2;
4456
+ var import_picocolors5, import_sisteransi2, V2, u, le, L2, W2, C, ue, o, d2, k2, P2, A2, T, F, $e, _2, me, de, pe, q, D, U2, K2, b2, ge, ye, xe, Ie, Se, J, Y2;
4363
4457
  var init_dist2 = __esm({
4364
4458
  "node_modules/@clack/prompts/dist/index.mjs"() {
4365
4459
  "use strict";
4366
4460
  init_dist();
4367
4461
  init_dist();
4368
- import_picocolors3 = __toESM(require_picocolors(), 1);
4462
+ import_picocolors5 = __toESM(require_picocolors(), 1);
4369
4463
  import_sisteransi2 = __toESM(require_src(), 1);
4370
4464
  V2 = ce();
4371
4465
  u = (t, n) => V2 ? t : n;
@@ -4394,71 +4488,71 @@ var init_dist2 = __esm({
4394
4488
  switch (t) {
4395
4489
  case "initial":
4396
4490
  case "active":
4397
- return import_picocolors3.default.cyan(le);
4491
+ return import_picocolors5.default.cyan(le);
4398
4492
  case "cancel":
4399
- return import_picocolors3.default.red(L2);
4493
+ return import_picocolors5.default.red(L2);
4400
4494
  case "error":
4401
- return import_picocolors3.default.yellow(W2);
4495
+ return import_picocolors5.default.yellow(W2);
4402
4496
  case "submit":
4403
- return import_picocolors3.default.green(C);
4497
+ return import_picocolors5.default.green(C);
4404
4498
  }
4405
4499
  };
4406
4500
  ge = (t) => new MD({ validate: t.validate, mask: t.mask ?? $e, render() {
4407
- const n = `${import_picocolors3.default.gray(o)}
4501
+ const n = `${import_picocolors5.default.gray(o)}
4408
4502
  ${b2(this.state)} ${t.message}
4409
4503
  `, r2 = this.valueWithCursor, i = this.masked;
4410
4504
  switch (this.state) {
4411
4505
  case "error":
4412
4506
  return `${n.trim()}
4413
- ${import_picocolors3.default.yellow(o)} ${i}
4414
- ${import_picocolors3.default.yellow(d2)} ${import_picocolors3.default.yellow(this.error)}
4507
+ ${import_picocolors5.default.yellow(o)} ${i}
4508
+ ${import_picocolors5.default.yellow(d2)} ${import_picocolors5.default.yellow(this.error)}
4415
4509
  `;
4416
4510
  case "submit":
4417
- return `${n}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.dim(i)}`;
4511
+ return `${n}${import_picocolors5.default.gray(o)} ${import_picocolors5.default.dim(i)}`;
4418
4512
  case "cancel":
4419
- return `${n}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.strikethrough(import_picocolors3.default.dim(i ?? ""))}${i ? `
4420
- ${import_picocolors3.default.gray(o)}` : ""}`;
4513
+ return `${n}${import_picocolors5.default.gray(o)} ${import_picocolors5.default.strikethrough(import_picocolors5.default.dim(i ?? ""))}${i ? `
4514
+ ${import_picocolors5.default.gray(o)}` : ""}`;
4421
4515
  default:
4422
- return `${n}${import_picocolors3.default.cyan(o)} ${r2}
4423
- ${import_picocolors3.default.cyan(d2)}
4516
+ return `${n}${import_picocolors5.default.cyan(o)} ${r2}
4517
+ ${import_picocolors5.default.cyan(d2)}
4424
4518
  `;
4425
4519
  }
4426
4520
  } }).prompt();
4427
4521
  ye = (t) => {
4428
4522
  const n = t.active ?? "Yes", r2 = t.inactive ?? "No";
4429
4523
  return new dD({ active: n, inactive: r2, initialValue: t.initialValue ?? true, render() {
4430
- const i = `${import_picocolors3.default.gray(o)}
4524
+ const i = `${import_picocolors5.default.gray(o)}
4431
4525
  ${b2(this.state)} ${t.message}
4432
4526
  `, s = this.value ? n : r2;
4433
4527
  switch (this.state) {
4434
4528
  case "submit":
4435
- return `${i}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.dim(s)}`;
4529
+ return `${i}${import_picocolors5.default.gray(o)} ${import_picocolors5.default.dim(s)}`;
4436
4530
  case "cancel":
4437
- return `${i}${import_picocolors3.default.gray(o)} ${import_picocolors3.default.strikethrough(import_picocolors3.default.dim(s))}
4438
- ${import_picocolors3.default.gray(o)}`;
4531
+ return `${i}${import_picocolors5.default.gray(o)} ${import_picocolors5.default.strikethrough(import_picocolors5.default.dim(s))}
4532
+ ${import_picocolors5.default.gray(o)}`;
4439
4533
  default:
4440
- return `${i}${import_picocolors3.default.cyan(o)} ${this.value ? `${import_picocolors3.default.green(k2)} ${n}` : `${import_picocolors3.default.dim(P2)} ${import_picocolors3.default.dim(n)}`} ${import_picocolors3.default.dim("/")} ${this.value ? `${import_picocolors3.default.dim(P2)} ${import_picocolors3.default.dim(r2)}` : `${import_picocolors3.default.green(k2)} ${r2}`}
4441
- ${import_picocolors3.default.cyan(d2)}
4534
+ return `${i}${import_picocolors5.default.cyan(o)} ${this.value ? `${import_picocolors5.default.green(k2)} ${n}` : `${import_picocolors5.default.dim(P2)} ${import_picocolors5.default.dim(n)}`} ${import_picocolors5.default.dim("/")} ${this.value ? `${import_picocolors5.default.dim(P2)} ${import_picocolors5.default.dim(r2)}` : `${import_picocolors5.default.green(k2)} ${r2}`}
4535
+ ${import_picocolors5.default.cyan(d2)}
4442
4536
  `;
4443
4537
  }
4444
4538
  } }).prompt();
4445
4539
  };
4446
4540
  xe = (t = "") => {
4447
- process.stdout.write(`${import_picocolors3.default.gray(d2)} ${import_picocolors3.default.red(t)}
4541
+ process.stdout.write(`${import_picocolors5.default.gray(d2)} ${import_picocolors5.default.red(t)}
4448
4542
 
4449
4543
  `);
4450
4544
  };
4451
4545
  Ie = (t = "") => {
4452
- process.stdout.write(`${import_picocolors3.default.gray(ue)} ${t}
4546
+ process.stdout.write(`${import_picocolors5.default.gray(ue)} ${t}
4453
4547
  `);
4454
4548
  };
4455
4549
  Se = (t = "") => {
4456
- process.stdout.write(`${import_picocolors3.default.gray(o)}
4457
- ${import_picocolors3.default.gray(d2)} ${t}
4550
+ process.stdout.write(`${import_picocolors5.default.gray(o)}
4551
+ ${import_picocolors5.default.gray(d2)} ${t}
4458
4552
 
4459
4553
  `);
4460
4554
  };
4461
- J = `${import_picocolors3.default.gray(o)} `;
4555
+ J = `${import_picocolors5.default.gray(o)} `;
4462
4556
  Y2 = ({ indicator: t = "dots" } = {}) => {
4463
4557
  const n = V2 ? ["\u25D2", "\u25D0", "\u25D3", "\u25D1"] : ["\u2022", "o", "O", "0"], r2 = V2 ? 80 : 120, i = process.env.CI === "true";
4464
4558
  let s, c, a = false, l2 = "", $2, g2 = performance.now();
@@ -4480,13 +4574,13 @@ ${import_picocolors3.default.gray(d2)} ${t}
4480
4574
  const h2 = (performance.now() - m2) / 1e3, w2 = Math.floor(h2 / 60), I2 = Math.floor(h2 % 60);
4481
4575
  return w2 > 0 ? `[${w2}m ${I2}s]` : `[${I2}s]`;
4482
4576
  }, H = (m2 = "") => {
4483
- a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors3.default.gray(o)}
4577
+ a = true, s = fD(), l2 = R2(m2), g2 = performance.now(), process.stdout.write(`${import_picocolors5.default.gray(o)}
4484
4578
  `);
4485
4579
  let h2 = 0, w2 = 0;
4486
4580
  j2(), c = setInterval(() => {
4487
4581
  if (i && l2 === $2) return;
4488
4582
  B2(), $2 = l2;
4489
- const I2 = import_picocolors3.default.magenta(n[h2]);
4583
+ const I2 = import_picocolors5.default.magenta(n[h2]);
4490
4584
  if (i) process.stdout.write(`${I2} ${l2}...`);
4491
4585
  else if (t === "timer") process.stdout.write(`${I2} ${l2} ${O2(g2)}`);
4492
4586
  else {
@@ -4497,7 +4591,7 @@ ${import_picocolors3.default.gray(d2)} ${t}
4497
4591
  }, r2);
4498
4592
  }, N2 = (m2 = "", h2 = 0) => {
4499
4593
  a = false, clearInterval(c), B2();
4500
- const w2 = h2 === 0 ? import_picocolors3.default.green(C) : h2 === 1 ? import_picocolors3.default.red(L2) : import_picocolors3.default.red(W2);
4594
+ const w2 = h2 === 0 ? import_picocolors5.default.green(C) : h2 === 1 ? import_picocolors5.default.red(L2) : import_picocolors5.default.red(W2);
4501
4595
  l2 = R2(m2 ?? l2), t === "timer" ? process.stdout.write(`${w2} ${l2} ${O2(g2)}
4502
4596
  `) : process.stdout.write(`${w2} ${l2}
4503
4597
  `), E(), s();
@@ -4680,18 +4774,23 @@ __export(init_exports, {
4680
4774
  async function init(options) {
4681
4775
  const report = await gather(options.adapters);
4682
4776
  const interactive = !options.yes && !options.dryRun && process.stdout.isTTY === true;
4683
- Ie(`${color.bold("caddis")} ${color.dim(`cli ${report.cliVersion} \xB7 pool ${report.poolVersion}`)}`);
4777
+ renderBanner({ cliVersion: report.cliVersion, poolVersion: report.poolVersion });
4778
+ Ie(`${color.bold("caddis installer")} ${color.dim(`\xB7 pool ${report.poolVersion}`)}`);
4779
+ heading("Detected Agents");
4684
4780
  for (const entry of report.agents) {
4685
4781
  if (!entry.detection.present) {
4686
- item("skip", `${entry.adapter.name} \u2014 not found`);
4782
+ item("skip", `${entry.adapter.name} \u2014 ${color.dim("not found")}`);
4687
4783
  continue;
4688
4784
  }
4689
4785
  if (!entry.adapter.supported) {
4690
- item("info", `${entry.adapter.name} \u2014 detected, not yet supported (v0.2)`);
4786
+ item("info", `${entry.adapter.name} \u2014 ${color.dim("detected, not yet supported (v0.2)")}`);
4691
4787
  continue;
4692
4788
  }
4693
4789
  const current = entry.drift === "current";
4694
- item(current ? "ok" : "warn", `${entry.adapter.name} \u2014 ${current ? `caddis ${entry.status.version} (current)` : entry.status.installed ? `caddis ${entry.status.version ?? "?"} \u2192 ${report.poolVersion}` : "caddis not installed"}`);
4790
+ item(
4791
+ current ? "ok" : "warn",
4792
+ `${entry.adapter.name} \u2014 ${current ? `caddis ${entry.status.version} ${color.dim("(current)")}` : entry.status.installed ? `caddis ${entry.status.version ?? "?"} \u2192 ${color.bold(report.poolVersion)}` : color.amber("caddis not installed")}`
4793
+ );
4695
4794
  }
4696
4795
  const targets = actionable(report, { includeCurrent: true });
4697
4796
  if (targets.length === 0) {
@@ -4701,9 +4800,10 @@ async function init(options) {
4701
4800
  return 0;
4702
4801
  }
4703
4802
  line("");
4704
- line(` ${color.bold("Will run:")}`);
4803
+ heading("Planned Installations");
4705
4804
  for (const entry of targets) {
4706
- line(` ${color.dim("\u2022")} ${entry.adapter.name} \u2014 ${entry.adapter.summary}`);
4805
+ line(` ${color.mint("\u2022")} ${color.bold(entry.adapter.name)}`);
4806
+ line(` ${color.dim("\u2192")} ${entry.adapter.summary}`);
4707
4807
  }
4708
4808
  line("");
4709
4809
  if (interactive) {
@@ -4723,7 +4823,13 @@ async function init(options) {
4723
4823
  quiet: options.yes
4724
4824
  });
4725
4825
  const code = reportOutcome(outcome, options.dryRun);
4726
- Se(code === 0 ? `Run ${color.cyan("caddis doctor")} any time to check drift.` : "Finished with errors.");
4826
+ if (code === 0 && !options.dryRun) {
4827
+ line("");
4828
+ line(` ${color.mint("\u2713")} ${color.bold("Caddis dev harness is ready.")} Open any configured agent above to start.`);
4829
+ line(` ${color.dim("Run")} ${color.sky("caddis doctor")} ${color.dim("at any time to verify agent health and updates.")}`);
4830
+ line("");
4831
+ }
4832
+ Se(code === 0 ? color.green("Setup complete.") : color.red("Finished with errors."));
4727
4833
  return code;
4728
4834
  }
4729
4835
  var init_init = __esm({
@@ -5063,6 +5169,7 @@ async function doctor(options) {
5063
5169
  line(JSON.stringify(toJson(report), null, 2));
5064
5170
  return 0;
5065
5171
  }
5172
+ renderBanner({ cliVersion: report.cliVersion, poolVersion: report.poolVersion });
5066
5173
  renderEnvironment(report, findings);
5067
5174
  renderAgents(report, findings);
5068
5175
  renderSummary(report, findings);
@@ -5106,8 +5213,10 @@ function renderEnvironment(report, problems) {
5106
5213
  }
5107
5214
  function renderAgents(report, problems) {
5108
5215
  heading("Agents");
5109
- for (const entry of report.agents) {
5216
+ for (let i = 0; i < report.agents.length; i++) {
5217
+ const entry = report.agents[i];
5110
5218
  const { adapter, detection, status: status5 } = entry;
5219
+ if (i > 0) line("");
5111
5220
  item(markFor(entry.drift), `${color.bold(adapter.name)} \u2014 ${describe(entry, report.poolVersion)}`);
5112
5221
  if (detection.path) detail(detection.path);
5113
5222
  if (detection.agentVersion) detail(`agent version ${detection.agentVersion}`);
@@ -5141,13 +5250,13 @@ function renderSummary(report, findings) {
5141
5250
  const notes = findings.filter((f) => f.kind === "note");
5142
5251
  if (problems.length === 0) {
5143
5252
  line(`
5144
- ${color.green("Everything caddis manages is current.")}`);
5253
+ ${color.mint("Everything caddis manages is current.")}`);
5145
5254
  } else {
5146
5255
  line(`
5147
- ${color.yellow(`${problems.length} thing${problems.length === 1 ? "" : "s"} to fix:`)}`);
5256
+ ${color.amber(color.bold(`${problems.length} thing${problems.length === 1 ? "" : "s"} to fix:`))}`);
5148
5257
  for (const problem of problems) {
5149
5258
  line(` ${color.dim("\u2022")} ${problem.text}`);
5150
- if (problem.fix) line(` ${color.cyan(problem.fix)}`);
5259
+ if (problem.fix) line(` ${color.sky(problem.fix)}`);
5151
5260
  }
5152
5261
  }
5153
5262
  if (notes.length > 0) {
@@ -5155,6 +5264,7 @@ function renderSummary(report, findings) {
5155
5264
  ${color.dim("For your information:")}`);
5156
5265
  for (const note of notes) line(` ${color.dim(`\u2022 ${note.text}`)}`);
5157
5266
  }
5267
+ line("");
5158
5268
  }
5159
5269
  function markFor(drift) {
5160
5270
  switch (drift) {
@@ -5306,18 +5416,18 @@ function renderTable(headers, rows) {
5306
5416
  (header, i) => Math.max(visibleWidth(header), ...rows.map((row) => visibleWidth(row[i] ?? "")))
5307
5417
  );
5308
5418
  const out = [];
5309
- out.push(` ${headers.map((h2, i) => pad(import_picocolors4.default.bold(h2), widths[i] ?? 0)).join(" ")}`.trimEnd());
5310
- out.push(` ${widths.map((w2) => import_picocolors4.default.dim("\u2500".repeat(w2))).join(" ")}`);
5419
+ out.push(` ${headers.map((h2, i) => pad(import_picocolors6.default.bold(h2), widths[i] ?? 0)).join(" ")}`.trimEnd());
5420
+ out.push(` ${widths.map((w2) => import_picocolors6.default.dim("\u2500".repeat(w2))).join(" ")}`);
5311
5421
  for (const row of rows) {
5312
5422
  out.push(` ${row.map((cell, i) => pad(cell ?? "", widths[i] ?? 0)).join(" ")}`.trimEnd());
5313
5423
  }
5314
5424
  return out.join("\n");
5315
5425
  }
5316
- var import_picocolors4, ANSI;
5426
+ var import_picocolors6, ANSI;
5317
5427
  var init_table = __esm({
5318
5428
  "src/util/table.ts"() {
5319
5429
  "use strict";
5320
- import_picocolors4 = __toESM(require_picocolors(), 1);
5430
+ import_picocolors6 = __toESM(require_picocolors(), 1);
5321
5431
  ANSI = /\[[0-9;]*m/g;
5322
5432
  }
5323
5433
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caddis/cli",
3
- "version": "0.4.13",
3
+ "version": "0.4.15",
4
4
  "description": "Install, update and diagnose the caddis dev harness across every coding agent you use (Claude Code, agy/Antigravity, and more).",
5
5
  "keywords": [
6
6
  "caddis",