claude-nomad 0.52.3 → 0.53.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.53.1](https://github.com/funkadelic/claude-nomad/compare/v0.53.0...v0.53.1) (2026-06-21)
4
+
5
+
6
+ ### Testing
7
+
8
+ * **doctor:** assert okGlyph in verbose tree so release publish passes ([#334](https://github.com/funkadelic/claude-nomad/issues/334)) ([b587e99](https://github.com/funkadelic/claude-nomad/commit/b587e99bcadb4802a6cf9edcc9a139d84b479e86))
9
+
10
+ ## [0.53.0](https://github.com/funkadelic/claude-nomad/compare/v0.52.4...v0.53.0) (2026-06-21)
11
+
12
+
13
+ ### Added
14
+
15
+ * **doctor:** compact default output with --verbose/--all/-v flag ([#327](https://github.com/funkadelic/claude-nomad/issues/327)) ([654dc91](https://github.com/funkadelic/claude-nomad/commit/654dc9174459efe0d89af2b92771bf68057e13a9))
16
+
17
+
18
+ ### Changed
19
+
20
+ * **docs:** add docs-sync gate requiring docs updates with CLI changes ([#328](https://github.com/funkadelic/claude-nomad/issues/328)) ([da2ffe9](https://github.com/funkadelic/claude-nomad/commit/da2ffe9c53824a847bb12d25b7dc879695623c13))
21
+ * drop dead exports flagged by fallow and knip; add knip config ([#330](https://github.com/funkadelic/claude-nomad/issues/330)) ([da8bab5](https://github.com/funkadelic/claude-nomad/commit/da8bab52bb9c5e457cda552b46a1dedabb00a805))
22
+
23
+
24
+ ### Documentation
25
+
26
+ * **plugin:** add marketplace description and plugin keywords ([#331](https://github.com/funkadelic/claude-nomad/issues/331)) ([51ce1f8](https://github.com/funkadelic/claude-nomad/commit/51ce1f8604002dd15a9812d0411b5d0ac17e84eb))
27
+ * **plugin:** sync plugin and marketplace descriptions ([#332](https://github.com/funkadelic/claude-nomad/issues/332)) ([33c58b2](https://github.com/funkadelic/claude-nomad/commit/33c58b21f0fcb68320cf9c051b67fde119c94b68))
28
+ * **site:** add privacy page ([#333](https://github.com/funkadelic/claude-nomad/issues/333)) ([f8f17da](https://github.com/funkadelic/claude-nomad/commit/f8f17da5bcd06d25eb6a26f328133b7083371e99))
29
+
30
+ ## [0.52.4](https://github.com/funkadelic/claude-nomad/compare/v0.52.3...v0.52.4) (2026-06-20)
31
+
32
+
33
+ ### Fixed
34
+
35
+ * **hooks-filter:** detect gsd hook entries with quoted launcher paths ([#325](https://github.com/funkadelic/claude-nomad/issues/325)) ([71d79f4](https://github.com/funkadelic/claude-nomad/commit/71d79f4a1555a3bfcf2537d02cad2f52612cc8fc))
36
+
3
37
  ## [0.52.3](https://github.com/funkadelic/claude-nomad/compare/v0.52.2...v0.52.3) (2026-06-20)
4
38
 
5
39
 
package/README.md CHANGED
@@ -49,7 +49,9 @@ survives different file paths and your secrets never ride along.
49
49
  directions: keys present in the repo merge but absent from your live `settings.json` (behind; the
50
50
  next `nomad pull` will restore them, fix: `nomad pull`) and keys present locally but not yet in
51
51
  the repo (ahead; local-only additions, fix: `nomad capture-settings`). Each issue includes a fix
52
- hint.
52
+ hint. By default the report is compact: it shows only checks that need action plus a one-line
53
+ verdict. Add `--verbose` (or `--all` / `-v`) to see the full per-check tree, including everything
54
+ that passed.
53
55
  - **Self-healing sync.** Every overwrite is backed up first, and `nomad pull --force-remote`
54
56
  recovers two kinds of stuck sync repo: a repo stuck mid-rebase or mid-merge (aborts the operation,
55
57
  parks stranded work on a branch, refuses if shared config is at risk), and a repo where the rebase
package/dist/nomad.mjs CHANGED
@@ -1277,6 +1277,16 @@ function scriptBasename(token) {
1277
1277
  const lastSlash = Math.max(token.lastIndexOf("/"), token.lastIndexOf("\\"));
1278
1278
  return lastSlash >= 0 ? token.slice(lastSlash + 1) : token;
1279
1279
  }
1280
+ function stripQuotes(token) {
1281
+ if (token.length >= 2) {
1282
+ const head = token.at(0);
1283
+ const tail = token.at(-1);
1284
+ if (head === '"' && tail === '"' || head === "'" && tail === "'") {
1285
+ return token.slice(1, -1);
1286
+ }
1287
+ }
1288
+ return token;
1289
+ }
1280
1290
  function isGsdHookEntry(command) {
1281
1291
  const tokens = command.trim().split(/\s+/);
1282
1292
  if (tokens.length === 0 || tokens[0] === "") return false;
@@ -1285,7 +1295,7 @@ function isGsdHookEntry(command) {
1285
1295
  while (i < tokens.length && envAssign.test(tokens[i])) {
1286
1296
  i++;
1287
1297
  }
1288
- const first = tokens[i] ?? "";
1298
+ const first = stripQuotes(tokens[i] ?? "");
1289
1299
  const firstBase = scriptBasename(first);
1290
1300
  const firstHasPath = first.includes("/") || first.includes("\\");
1291
1301
  if (firstHasPath && !KNOWN_LAUNCHER_BASENAMES.has(firstBase) || first.startsWith(GSD_PREFIX)) {
@@ -1293,7 +1303,7 @@ function isGsdHookEntry(command) {
1293
1303
  }
1294
1304
  for (let j = i + 1; j < tokens.length; j++) {
1295
1305
  if (tokens[j].startsWith("-")) continue;
1296
- return scriptBasename(tokens[j]).startsWith(GSD_PREFIX);
1306
+ return scriptBasename(stripQuotes(tokens[j])).startsWith(GSD_PREFIX);
1297
1307
  }
1298
1308
  return false;
1299
1309
  }
@@ -4430,6 +4440,25 @@ function buildVerdictSection(sections) {
4430
4440
  return summary;
4431
4441
  }
4432
4442
 
4443
+ // src/commands.doctor.compact.ts
4444
+ init_color();
4445
+ var ALWAYS_FULL = /* @__PURE__ */ new Set(["Nomad Version", "Summary", "Shared scan", "Schema scan"]);
4446
+ function isProblem(item2) {
4447
+ return item2.includes(failGlyph) || item2.includes(warnGlyph);
4448
+ }
4449
+ function isRepoStateLine(item2) {
4450
+ return item2.includes("repo state:");
4451
+ }
4452
+ function compactSections(sections) {
4453
+ return sections.map((s) => {
4454
+ if (ALWAYS_FULL.has(s.header)) return s;
4455
+ if (s.header === "Environment") {
4456
+ return { ...s, items: s.items.filter((it) => isRepoStateLine(it) || isProblem(it)) };
4457
+ }
4458
+ return { ...s, items: s.items.filter(isProblem) };
4459
+ });
4460
+ }
4461
+
4433
4462
  // src/commands.doctor.ts
4434
4463
  function gatherDoctorSections(opts) {
4435
4464
  const host = section("Environment");
@@ -4500,7 +4529,26 @@ function cmdDoctor(opts = {}) {
4500
4529
  } finally {
4501
4530
  sp.stop();
4502
4531
  }
4503
- renderDoctor(report);
4532
+ renderDoctor(opts.verbose === true ? report : compactSections(report));
4533
+ }
4534
+
4535
+ // src/nomad.dispatch.doctor.ts
4536
+ function parseDoctorArgs(args) {
4537
+ if (args[0] === "--resume-cmd") {
4538
+ const id = args[1];
4539
+ if (args.length !== 2 || id.length === 0) return { kind: "error" };
4540
+ return { kind: "resume", id };
4541
+ }
4542
+ let checkShared = false;
4543
+ let checkSchema = false;
4544
+ let verbose = false;
4545
+ for (const arg of args) {
4546
+ if (arg === "--check-shared") checkShared = true;
4547
+ else if (arg === "--check-schema") checkSchema = true;
4548
+ else if (arg === "--verbose" || arg === "--all" || arg === "-v") verbose = true;
4549
+ else return { kind: "error" };
4550
+ }
4551
+ return { kind: "run", checkShared, checkSchema, verbose };
4504
4552
  }
4505
4553
 
4506
4554
  // src/commands.drop-session.ts
@@ -6795,7 +6843,7 @@ function parsePushArgs(argv) {
6795
6843
  // package.json
6796
6844
  var package_default = {
6797
6845
  name: "claude-nomad",
6798
- version: "0.52.3",
6846
+ version: "0.53.1",
6799
6847
  type: "module",
6800
6848
  description: "Sync Claude Code config (~/.claude/) across machines via a private Git repo, with path remapping and per-host settings overrides.",
6801
6849
  keywords: [
@@ -6935,7 +6983,8 @@ var DEFAULT_HELP = [
6935
6983
  ),
6936
6984
  "",
6937
6985
  row(" doctor", "Read-only health check (symlinks, host file, path-map,"),
6938
- cont("gitleaks, gitlinks)."),
6986
+ cont("gitleaks, gitlinks). Compact by default: shows problems plus a verdict."),
6987
+ row(" --verbose, --all, -v", "Show the full per-check tree, including passing checks."),
6939
6988
  row(" --check-shared", "Preflight gitleaks scan of the session transcripts a"),
6940
6989
  cont("`nomad push` would stage (a temp copy, never the live dir)."),
6941
6990
  row(" --check-schema", "Flag settings.json keys absent from the live published"),
@@ -7195,27 +7244,24 @@ try {
7195
7244
  });
7196
7245
  break;
7197
7246
  }
7198
- case "doctor":
7199
- if (process.argv[3] === void 0) {
7200
- cmdDoctor();
7201
- } else if (process.argv[3] === "--check-shared" && process.argv.length === 4) {
7202
- cmdDoctor({ checkShared: true });
7203
- } else if (process.argv[3] === "--check-schema" && process.argv.length === 4) {
7204
- cmdDoctor({ checkSchema: true });
7205
- } else if (process.argv[3] === "--resume-cmd") {
7206
- const id = process.argv[4];
7207
- if (process.argv.length !== 5 || typeof id !== "string" || id.length === 0) {
7208
- console.error("usage: nomad doctor --resume-cmd <session-id>");
7209
- process.exit(1);
7210
- }
7211
- resumeCmd(id);
7212
- } else {
7247
+ case "doctor": {
7248
+ const parsed = parseDoctorArgs(process.argv.slice(3));
7249
+ if (parsed.kind === "error") {
7213
7250
  console.error(
7214
- "usage: nomad doctor [--check-shared | --check-schema | --resume-cmd <session-id>]"
7251
+ "usage: nomad doctor [--check-shared] [--check-schema] [--verbose|--all|-v] | --resume-cmd <session-id>"
7215
7252
  );
7216
7253
  process.exit(1);
7254
+ } else if (parsed.kind === "resume") {
7255
+ resumeCmd(parsed.id);
7256
+ } else {
7257
+ cmdDoctor({
7258
+ checkShared: parsed.checkShared,
7259
+ checkSchema: parsed.checkSchema,
7260
+ verbose: parsed.verbose
7261
+ });
7217
7262
  }
7218
7263
  break;
7264
+ }
7219
7265
  case "drop-session": {
7220
7266
  const id = process.argv[3];
7221
7267
  if (process.argv.length !== 4 || typeof id !== "string" || !/^\w[\w-]{0,127}$/.test(id)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-nomad",
3
- "version": "0.52.3",
3
+ "version": "0.53.1",
4
4
  "type": "module",
5
5
  "description": "Sync Claude Code config (~/.claude/) across machines via a private Git repo, with path remapping and per-host settings overrides.",
6
6
  "keywords": [