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 +34 -0
- package/README.md +3 -1
- package/dist/nomad.mjs +67 -21
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
7200
|
-
|
|
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
|
|
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