claude-nomad 0.69.0 → 0.69.2

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 (4) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +46 -16
  3. package/dist/nomad.mjs +1599 -1346
  4. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.69.2](https://github.com/funkadelic/claude-nomad/compare/v0.69.1...v0.69.2) (2026-09-19)
4
+
5
+
6
+ ### What's new
7
+
8
+ **On native Windows (PowerShell, cmd, or Git Bash).** WSL2 behaves like Linux, so these do not apply to it.
9
+
10
+ * `nomad allow`, and choosing Allow when `nomad push` finds a possible secret, no longer add a duplicate line to a `.gitleaksignore` saved with Windows line endings.
11
+ * The cleanup commands `nomad eject` prints now use forward slashes, so you can paste them into Git Bash as they are.
12
+
13
+ **On every platform**
14
+
15
+ * `nomad pull` no longer overwrites a setting you changed on this machine but haven't saved to your sync repo. It stops, names each one, and tells you to save it with `nomad capture-settings` or delete it. `nomad sync` and `nomad pull --dry-run` flag the same settings.
16
+ * When a setting is removed from your sync repo, whether you removed it or another machine did, a pull removes it here too, but only if you haven't edited it on this machine. The pull names each setting it removes, `nomad doctor` warns about them beforehand, and the settings file from before the pull is kept in `~/.cache/claude-nomad/backup/`.
17
+ * Settings that can hold a secret, such as `env` or `apiKeyHelper`, are never printed, so a pull can't list them. When it replaces some that your sync repo doesn't track, it now tells you how many. Keep values like these in `~/.claude/settings.local.json`, which nomad never touches.
18
+ * `nomad eject` now also deletes the records nomad keeps about this machine, so setting nomad up here again starts fresh.
19
+
20
+
21
+ ### Fixed
22
+
23
+ * **eject:** forget this machine's sync records ([#615](https://github.com/funkadelic/claude-nomad/issues/615)) ([899abd8](https://github.com/funkadelic/claude-nomad/commit/899abd82b2ffd1acd3f6faf36d8e1d26402eb6c7))
24
+ * **pull:** keep a setting you changed when the repo drops it ([#614](https://github.com/funkadelic/claude-nomad/issues/614)) ([f60cc98](https://github.com/funkadelic/claude-nomad/commit/f60cc98989296938f560db58cd05950280f335c7))
25
+ * **pull:** name the settings a pull removes ([#613](https://github.com/funkadelic/claude-nomad/issues/613)) ([8266fc9](https://github.com/funkadelic/claude-nomad/commit/8266fc90a19e3119782354751c8e1ee9c225e6b2))
26
+ * **pull:** stop overwriting settings you have not saved to the repo ([#606](https://github.com/funkadelic/claude-nomad/issues/606)) ([160abba](https://github.com/funkadelic/claude-nomad/commit/160abbaa10766786b58f3a73906fd2feb6c6e097))
27
+ * **pull:** stop refusing a setting you removed from the repo ([#612](https://github.com/funkadelic/claude-nomad/issues/612)) ([d7d620c](https://github.com/funkadelic/claude-nomad/commit/d7d620cf25534aa0d4d65afe0fcbd834d35b7c50))
28
+ * **pull:** warn before replacing a credential setting not in the repo ([#610](https://github.com/funkadelic/claude-nomad/issues/610)) ([db739f5](https://github.com/funkadelic/claude-nomad/commit/db739f510ac7a8fde6c7139f0ea00a22cf3c4aec))
29
+ * **redact:** stop adding duplicate lines to a Windows-style .gitleaksignore ([#609](https://github.com/funkadelic/claude-nomad/issues/609)) ([07152de](https://github.com/funkadelic/claude-nomad/commit/07152de8c26b31ee2ce93a45b1c5ef948e83b558))
30
+ * **redact:** stop re-appending a fingerprint to a CRLF .gitleaksignore ([07152de](https://github.com/funkadelic/claude-nomad/commit/07152de8c26b31ee2ce93a45b1c5ef948e83b558))
31
+
32
+
33
+ ### Changed
34
+
35
+ * split four oversized source files ([#608](https://github.com/funkadelic/claude-nomad/issues/608)) ([8a08ba7](https://github.com/funkadelic/claude-nomad/commit/8a08ba7d27cfb0dab9a7d9c89b69872c13d200c9))
36
+
37
+
38
+ ### Dependencies
39
+
40
+ * bump devalue from 5.8.1 to 5.9.2 in /docs-site ([#611](https://github.com/funkadelic/claude-nomad/issues/611)) ([ad47cbc](https://github.com/funkadelic/claude-nomad/commit/ad47cbcf98ee7cf85628e741b834487ce806cf37))
41
+
42
+ ## [0.69.1](https://github.com/funkadelic/claude-nomad/compare/v0.69.0...v0.69.1) (2026-09-15)
43
+
44
+
45
+ ### What's new
46
+
47
+ * `nomad push` refuses to sync files it does not recognize. That message used to name a source
48
+ file inside the tool, which is no help if you installed from npm. It now tells you to add the
49
+ folder to `sharedDirs` in your `path-map.json`.
50
+ * The summary `nomad push` prints was leaving things out. Changes to your `path-map.json`, and to
51
+ any folder you added through `sharedDirs`, were going up without being listed. Both now appear
52
+ alongside the rest of your global config.
53
+
54
+
55
+ ### Fixed
56
+
57
+ * **push:** list path-map.json and sharedDirs changes in the push summary ([#605](https://github.com/funkadelic/claude-nomad/issues/605)) ([b5ea573](https://github.com/funkadelic/claude-nomad/commit/b5ea573863ae10d895f2fbb24236de227251b282))
58
+ * **push:** suggest sharedDirs when push refuses an unsynced file ([#604](https://github.com/funkadelic/claude-nomad/issues/604)) ([ff5e263](https://github.com/funkadelic/claude-nomad/commit/ff5e26321cb8cae7e61c52a12dd4228e27cc78b0))
59
+
60
+
61
+ ### Changed
62
+
63
+ * add a prose check and tighten the docs ([#599](https://github.com/funkadelic/claude-nomad/issues/599)) ([2753d11](https://github.com/funkadelic/claude-nomad/commit/2753d1156a9a7a8a59235bfcab7e623489185258))
64
+
65
+
66
+ ### Dependencies
67
+
68
+ * bump astro from 7.3.1 to 7.3.2 in /docs-site in the astro group ([#603](https://github.com/funkadelic/claude-nomad/issues/603)) ([8f413ea](https://github.com/funkadelic/claude-nomad/commit/8f413eac62554a7310e0271dce987a0f0376f50d))
69
+ * bump the codeql-action group across 1 directory with 2 updates ([#602](https://github.com/funkadelic/claude-nomad/issues/602)) ([22f51e6](https://github.com/funkadelic/claude-nomad/commit/22f51e63db6a77b66fa455986e797498dae29870))
70
+ * bump the dev-dependencies group across 1 directory with 3 updates ([#601](https://github.com/funkadelic/claude-nomad/issues/601)) ([9a0bdf6](https://github.com/funkadelic/claude-nomad/commit/9a0bdf61c295e7c7bd19874f27b323338a34e2d9))
71
+
3
72
  ## [0.69.0](https://github.com/funkadelic/claude-nomad/compare/v0.68.0...v0.69.0) (2026-09-11)
4
73
 
5
74
 
package/README.md CHANGED
@@ -66,9 +66,10 @@ session history survives different file paths and your secrets never ride along.
66
66
  warning, not a failure), and settings drift in both directions: keys present in the repo merge but
67
67
  absent from your live `settings.json` (behind; the next `nomad pull` will restore them, fix:
68
68
  `nomad pull`) and keys present locally but not yet in the repo (ahead; local-only additions, fix:
69
- `nomad capture-settings`). Each issue includes a fix hint. By default the report is compact: it
70
- shows only checks that need action plus a one-line verdict. Add `--verbose` (or `--all` / `-v`) to
71
- see the full per-check tree, including everything that passed.
69
+ `nomad capture-settings`), plus a warning for a local setting the next pull will remove because
70
+ the repo dropped it. Each issue includes a fix hint. By default the report is compact: it shows
71
+ only checks that need action plus a one-line verdict. Add `--verbose` (or `--all` / `-v`) to see
72
+ the full per-check tree, including everything that passed.
72
73
  - **Self-healing sync.** Every overwrite is backed up first, and `nomad pull --force-remote`
73
74
  recovers two kinds of stuck sync repo: a repo stuck mid-rebase or mid-merge (aborts the operation,
74
75
  parks stranded work on a branch, refuses if shared config is at risk), and a repo where the rebase
@@ -138,13 +139,13 @@ still available as lower-level commands for cases `sync` does not cover: recover
138
139
  with `nomad pull --force-remote`, or resolving a detected secret without the interactive menu via
139
140
  `nomad push --redact-all` / `--allow` / `--allow-all` (see [Changing settings](#changing-settings)
140
141
  and [Recovery flows](https://funkadelic.github.io/claude-nomad/recovery/)). The
141
- [FAQ](https://funkadelic.github.io/claude-nomad/faq/) covers what `sync` does under the hood and the
142
- push/pull order it enforces.
142
+ [FAQ](https://funkadelic.github.io/claude-nomad/faq/) covers what `sync` does and the push/pull
143
+ order it enforces.
143
144
 
144
145
  ### Windows
145
146
 
146
147
  claude-nomad runs natively on Windows (PowerShell or cmd), and WSL2 works too. The everyday loop is
147
- the same either way; the difference is under the hood.
148
+ the same either way.
148
149
 
149
150
  Native Windows cannot use symlinks, so claude-nomad keeps a real copy of your shared config in
150
151
  `~/.claude/` instead of a symlink. `nomad pull` and `nomad sync` both mirror your local copies into
@@ -217,6 +218,34 @@ it:
217
218
  before the next `nomad pull` overwrites them. Add `--host` to land machine-specific values (such
218
219
  as absolute paths) in `hosts/<HOST>.json` instead of the shared base.
219
220
 
221
+ If `nomad pull` finds settings on this machine that your sync repo does not track, it leaves
222
+ `~/.claude/settings.json` as it is, so those settings are not lost. It lists the settings by name
223
+ and suggests two fixes: run `nomad capture-settings` to save them to the repo (add `--host` for
224
+ values that belong to this machine only), or delete them from `~/.claude/settings.json` if you no
225
+ longer want them. Your shared files, skills, sessions, and project extras still update, and the
226
+ command exits with a non-zero status so a scripted or cron-driven pull does not report success. Once
227
+ you have saved or deleted the settings, the next pull proceeds normally.
228
+
229
+ Credential settings are the one exception. Keys that can hold a secret (`env`, `apiKeyHelper`,
230
+ `awsAuthRefresh`, `awsCredentialExport`, `otelHeadersHelper`) are never printed, so pull cannot list
231
+ them and will not stop for them. When it finds some your repo does not track, it writes
232
+ `settings.json` as usual and tells you how many it replaced. Keep values like these in
233
+ `~/.claude/settings.local.json`, which nomad never touches.
234
+
235
+ A setting that another machine removed from the repo is removed here too. Each time nomad writes
236
+ your settings, on a pull or a `nomad capture-settings`, it records which settings it wrote on this
237
+ machine, with a fingerprint of each value. A setting in that record that the repo no longer carries,
238
+ and that still has the value nomad wrote, is one nomad put there, so the next pull removes it. The
239
+ pull names each setting it removes (so does `nomad pull --dry-run`), and the file from before the
240
+ pull stays in `~/.cache/claude-nomad/backup/`. A setting missing from the record is one you added,
241
+ and one you changed since is yours now, so either is kept and listed as above. A removal is handled
242
+ the same whether it arrives with this pull or reached your repo earlier through an edit you made, a
243
+ `nomad push`, or a `nomad pull --dry-run`.
244
+
245
+ A machine that has not finished a pull yet, or whose cache folder was cleared, has nothing recorded.
246
+ There a removal that reached the repo earlier is still listed as a setting you added. Save it or
247
+ delete it as above and pull again.
248
+
220
249
  During `nomad push` and `nomad pull`, long-running steps (rebase, secret scan, git push, session
221
250
  sync) show an animated progress indicator on an interactive terminal so the CLI does not look hung.
222
251
  In CI and when output is piped, only plain text lines are printed, with no ANSI control codes, so
@@ -292,7 +321,7 @@ the copy-sync trade-off.
292
321
 
293
322
  **Optional:** [curl](https://curl.se/) or [wget](https://www.gnu.org/software/wget/) for the
294
323
  version-staleness check and `nomad doctor --check-schema`. The CLI works without them. The opt-in
295
- `nomad doctor --check-remote` flag reads the locally-cached `origin/main` remote-tracking ref (no
324
+ `nomad doctor --check-remote` flag reads the locally cached `origin/main` remote-tracking ref (no
296
325
  curl or wget needed) and verifies that `shared/` and a valid `path-map.json` are present there; it
297
326
  skips with a `⚠︎` when the ref is unavailable, and is non-fatal in all cases.
298
327
 
@@ -301,14 +330,15 @@ skips with a `⚠︎` when the ref is unavailable, and is non-fatal in all cases
301
330
  Every `nomad` subcommand exits with one of a small set of codes, so a script or cron wrapper can
302
331
  branch on `$?` without parsing stderr text.
303
332
 
304
- | Code | Name | Meaning |
305
- | ---- | --------------- | ------------------------------------------------------------------------------------ |
306
- | 0 | Success | Completed successfully. |
307
- | 1 | Generic failure | Unclassified failure; the default for any error not covered below. |
308
- | 2 | Usage | Bad argv: an unknown subcommand, an unknown flag, or a malformed flag value. |
309
- | 4 | Conflict | The sync repo is wedged (e.g. an unresolved rebase) and needs manual git resolution. |
310
- | 5 | Leak blocked | gitleaks confirmed a secret in the staged tree and the push was aborted. |
311
- | 130 | Interrupted | You pressed Ctrl+C at an interactive prompt, so nomad stopped without finishing. |
333
+ | Code | Name | Meaning |
334
+ | ---- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
335
+ | 0 | Success | Completed successfully. |
336
+ | 1 | Generic failure | Unclassified failure; the default for any error not covered below. |
337
+ | 2 | Usage | Bad argv: an unknown subcommand, an unknown flag, or a malformed flag value. |
338
+ | 4 | Conflict | The sync repo is wedged (e.g. an unresolved rebase) and needs manual git resolution. |
339
+ | 5 | Leak blocked | gitleaks confirmed a secret in the staged tree and the push was aborted. |
340
+ | 6 | Settings blocked | Pull (or the pull half of `nomad sync`) found settings on this machine that are not in the sync repo, so it did not write your settings file. |
341
+ | 130 | Interrupted | You pressed Ctrl+C at an interactive prompt, so nomad stopped without finishing. |
312
342
 
313
343
  A run skipped because another nomad process already holds the lock also exits 0: this is an
314
344
  intentional no-op skip, not a failure, so a backgrounded shell-rc or cron invocation never raises a
@@ -333,7 +363,7 @@ What this means for you:
333
363
  best-effort secret scan runs the same gitleaks-based redaction nomad already uses for session
334
364
  transcripts. The secret scan works on a temporary, owner-only (`0o600`) copy that already has the
335
365
  structural scrub applied; that scratch file is deleted immediately after the scan, and only the
336
- fully-redacted report is kept.
366
+ fully redacted report is kept.
337
367
  - **It degrades safely without gitleaks.** If gitleaks is not installed, the structural scrub and
338
368
  the credential-shape backstop still run and the report is still written, with a one-line note that
339
369
  the deeper secret scan did not run. The backstop catches common token shapes but not everything,