claude-nomad 0.67.3 → 0.69.0

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,107 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.69.0](https://github.com/funkadelic/claude-nomad/compare/v0.68.0...v0.69.0) (2026-09-11)
4
+
5
+
6
+ ### What's new
7
+
8
+ * `nomad pull` was deleting hooks it should have left alone. It reads each hook command to work
9
+ out whether GSD installed it or you wrote it, and several ways of writing that command led it
10
+ to the wrong answer, so hooks from either side could vanish with nothing printed to say so.
11
+ Reinstall a hook you lost this way and it stays put now.
12
+ * `nomad doctor` had two problems of its own. It warned that a script pointed at a missing file
13
+ when the only mention of that file sat inside quotes, and on a script containing an unmatched
14
+ quote it stopped partway through the check.
15
+ * `nomad update` now ends with a link to the release notes for the version you ended up on,
16
+ whether the update moved you forward or you were already current.
17
+
18
+
19
+ ### Added
20
+
21
+ * **update:** link to the release notes for the version you land on ([#598](https://github.com/funkadelic/claude-nomad/issues/598)) ([798aa5f](https://github.com/funkadelic/claude-nomad/commit/798aa5f55e7181161b827ec4c788f7a21fdea04b))
22
+
23
+
24
+ ### Fixed
25
+
26
+ * **deps:** force smol-toml to a patched version via an npm override ([#593](https://github.com/funkadelic/claude-nomad/issues/593)) ([40c3382](https://github.com/funkadelic/claude-nomad/commit/40c3382a28d446045677f251bc2d5d318c0eb40b))
27
+ * keep hooks you wrote and stop doctor from hanging ([#597](https://github.com/funkadelic/claude-nomad/issues/597)) ([284d6c6](https://github.com/funkadelic/claude-nomad/commit/284d6c6ffe909aed15fbca803183b6aae12843af))
28
+ * **sync:** recognize more ways a gsd hook command can be written ([#595](https://github.com/funkadelic/claude-nomad/issues/595)) ([41e283b](https://github.com/funkadelic/claude-nomad/commit/41e283b216dc378347e09530597e4b5eb2143fe4))
29
+ * **sync:** stop pull from deleting gsd hooks ([#594](https://github.com/funkadelic/claude-nomad/issues/594)) ([36b3b6b](https://github.com/funkadelic/claude-nomad/commit/36b3b6b66d5999888748a5934c5563cb4172fb31))
30
+ * **sync:** stop pull from deleting hooks that run through env ([#596](https://github.com/funkadelic/claude-nomad/issues/596)) ([eee6161](https://github.com/funkadelic/claude-nomad/commit/eee61615712c3a52c39ed86963e8997436ca57f9))
31
+
32
+
33
+ ### Changed
34
+
35
+ * **cli:** move the argv dispatch layer into src/cli/ ([#586](https://github.com/funkadelic/claude-nomad/issues/586)) ([bf3c219](https://github.com/funkadelic/claude-nomad/commit/bf3c219a8196c16314861ef6f02a292d4451e044))
36
+ * **commands:** move the remaining commands into src/commands/ ([#569](https://github.com/funkadelic/claude-nomad/issues/569)) ([724c17b](https://github.com/funkadelic/claude-nomad/commit/724c17b363d01241d5914fbfa90e614b8e8cb06f))
37
+ * **core:** move the core domain into src/core/ ([#582](https://github.com/funkadelic/claude-nomad/issues/582)) ([7c4fcd2](https://github.com/funkadelic/claude-nomad/commit/7c4fcd2491b2ba767f01685cf57e320fb9782179))
38
+ * **dependabot:** group peer-locked dependency updates into single PRs ([#589](https://github.com/funkadelic/claude-nomad/issues/589)) ([abe7693](https://github.com/funkadelic/claude-nomad/commit/abe7693a6c5bea217cded519de75a8249fef2f22))
39
+ * **dependabot:** group peer-locked vitest and astro updates into single PRs ([abe7693](https://github.com/funkadelic/claude-nomad/commit/abe7693a6c5bea217cded519de75a8249fef2f22))
40
+ * **doctor:** move the doctor domain into src/commands/doctor/ ([#564](https://github.com/funkadelic/claude-nomad/issues/564)) ([9da4f6c](https://github.com/funkadelic/claude-nomad/commit/9da4f6c9a28527b3bc91ba815bae412baf122f8a))
41
+ * keep the core modules from importing the command layer ([#584](https://github.com/funkadelic/claude-nomad/issues/584)) ([fa9e53e](https://github.com/funkadelic/claude-nomad/commit/fa9e53e77e10f60b7b0c98026c3f32a2e253eddc))
42
+ * **pull:** move the pull domain into src/commands/pull/ ([#568](https://github.com/funkadelic/claude-nomad/issues/568)) ([f7872c5](https://github.com/funkadelic/claude-nomad/commit/f7872c5c6389a24716b93f1bb30f1ef79e8dbd8d))
43
+ * **push:** move the push domain into src/commands/push/ ([#566](https://github.com/funkadelic/claude-nomad/issues/566)) ([04233f5](https://github.com/funkadelic/claude-nomad/commit/04233f5c40282fcacc091cc56212b5eb023d0c99))
44
+ * **render:** move the render domain into src/render/ ([#577](https://github.com/funkadelic/claude-nomad/issues/577)) ([d1615ad](https://github.com/funkadelic/claude-nomad/commit/d1615adc3ccb1e05bd046cdcb5b7a5f46f535d26))
45
+ * **sync:** move the sync domain into src/sync/ ([#578](https://github.com/funkadelic/claude-nomad/issues/578)) ([9d23ce5](https://github.com/funkadelic/claude-nomad/commit/9d23ce5c9574e679dfb0788c953ad3dcaa282f67))
46
+ * **test:** move the cross-domain tests into src/integration/ ([#587](https://github.com/funkadelic/claude-nomad/issues/587)) ([77ceb89](https://github.com/funkadelic/claude-nomad/commit/77ceb89ad081c8579fca6d1edf8f86a8f64489b3))
47
+
48
+
49
+ ### Documentation
50
+
51
+ * point module cross-references at their relocated paths ([#567](https://github.com/funkadelic/claude-nomad/issues/567)) ([2b63d08](https://github.com/funkadelic/claude-nomad/commit/2b63d085b72677f67c2d306c8897d8c8262eae43))
52
+ * point the contributing guide and docs site at the real module paths ([0bcfe09](https://github.com/funkadelic/claude-nomad/commit/0bcfe09cea123f6509f92ba0ede1f01ae9d12d89))
53
+ * **stryker:** note that mutation testing is broken under vitest 5 ([#592](https://github.com/funkadelic/claude-nomad/issues/592)) ([30ea308](https://github.com/funkadelic/claude-nomad/commit/30ea30833811496bd5c0f21757c3a924af12d272))
54
+
55
+
56
+ ### Dependencies
57
+
58
+ * bump @astrojs/starlight and starlight-links-validator in /docs-site ([#591](https://github.com/funkadelic/claude-nomad/issues/591)) ([49579a2](https://github.com/funkadelic/claude-nomad/commit/49579a242445d53010a297737f8a53c60c648849))
59
+ * bump actions/deploy-pages from 5.0.0 to 5.0.1 ([#573](https://github.com/funkadelic/claude-nomad/issues/573)) ([6882748](https://github.com/funkadelic/claude-nomad/commit/6882748c8fceb563cb7c7f449863421999e99bb3))
60
+ * bump astro from 7.2.9 to 7.3.1 in /docs-site ([#576](https://github.com/funkadelic/claude-nomad/issues/576)) ([6e9de39](https://github.com/funkadelic/claude-nomad/commit/6e9de39b49aed8b6d5b9c003d3fe82fffa989e6c))
61
+ * bump js-yaml from 4.3.1 to 4.3.2 ([#581](https://github.com/funkadelic/claude-nomad/issues/581)) ([c8ab3b7](https://github.com/funkadelic/claude-nomad/commit/c8ab3b7b401b54471eb19564ab1c841dd9e744f7))
62
+ * bump js-yaml from 4.3.1 to 4.3.2 in /docs-site ([#580](https://github.com/funkadelic/claude-nomad/issues/580)) ([6eaaa7c](https://github.com/funkadelic/claude-nomad/commit/6eaaa7c111a44d99dafa8a1a9d817f43a491e654))
63
+ * bump smol-toml from 1.7.0 to 1.8.0 in /docs-site ([#585](https://github.com/funkadelic/claude-nomad/issues/585)) ([30a4414](https://github.com/funkadelic/claude-nomad/commit/30a44143291e3bd0e30a7a5c0770bff189bc4dda))
64
+ * bump svgo from 4.0.2 to 4.1.0 in /docs-site ([#579](https://github.com/funkadelic/claude-nomad/issues/579)) ([2d6b60a](https://github.com/funkadelic/claude-nomad/commit/2d6b60a3486079d0ca6fdbbff9a5f45100602a0d))
65
+ * bump the dev-dependencies group across 1 directory with 4 updates ([#583](https://github.com/funkadelic/claude-nomad/issues/583)) ([823a1eb](https://github.com/funkadelic/claude-nomad/commit/823a1eb0747982f63d446247bac56f4e1bb8f098))
66
+ * bump vitest and @vitest/coverage-v8 from 4.1.11 to 5.0.0 in the vitest group ([#590](https://github.com/funkadelic/claude-nomad/issues/590)) ([8c24023](https://github.com/funkadelic/claude-nomad/commit/8c24023ef599ba8fe34a097e7d283620d1a558f4))
67
+
68
+ ## [0.68.0](https://github.com/funkadelic/claude-nomad/compare/v0.67.3...v0.68.0) (2026-09-03)
69
+
70
+
71
+ ### What's new
72
+
73
+ **On native Windows (PowerShell or cmd).** Note: WSL2 behaves like Linux and this does not apply to it.
74
+
75
+ - **A never-sync warning during `nomad pull` now suggests commands you can paste as they are.** Before a pull, nomad warns when a file that should never travel between machines turns up in your sync repo, and the warning names the git commands to deal with it. A filename containing a space split the suggested command in two, so pasting it acted on neither half. The paths are now quoted.
76
+
77
+ **On every platform.**
78
+
79
+ - **`nomad doctor` now warns when your sync repo is carrying a file that should never sync**, such as a credential or a per-machine settings file. Until now one of those was only noticed while it was new or changed, so a file that was committed and then left alone went unmentioned, and the check that did look ran only on Windows. Doctor names the file and the command that stops tracking it without deleting your copy. It only warns.
80
+ - **`nomad adopt` no longer fails on a deeply nested folder.** Adopting a shared folder scans it first, and a very deep tree could crash that scan. The scan handles any depth now.
81
+ - **A backup nomad cannot write is now reported as a plain error.** Nomad copies anything it is about to overwrite into a backup first. When that copy fails, say a full disk or a permissions problem, you get one message naming what it was copying, where it was going, and why it failed, instead of a crash report file. The message also says a partial copy may be left behind.
82
+
83
+ Everything else in this release is dependency updates.
84
+
85
+
86
+ ### Added
87
+
88
+ * **doctor:** warn when the sync repo tracks a never-synced file ([#562](https://github.com/funkadelic/claude-nomad/issues/562)) ([a1b3f71](https://github.com/funkadelic/claude-nomad/commit/a1b3f71a0a3deecac81e0bcc9e8ee214c1e50a4e))
89
+
90
+
91
+ ### Fixed
92
+
93
+ * **adopt:** handle deep directories and report a failed backup ([#560](https://github.com/funkadelic/claude-nomad/issues/560)) ([2b19ccb](https://github.com/funkadelic/claude-nomad/commit/2b19ccba5959efb7b42d16ee0db862df4d92a0ac))
94
+ * **backup:** report a failed backup instead of writing a crash report ([#561](https://github.com/funkadelic/claude-nomad/issues/561)) ([9d8484c](https://github.com/funkadelic/claude-nomad/commit/9d8484cdb59eb5a5905dfb0a3e16ae952acead5f))
95
+ * **pull:** quote file paths in the never-sync warning's suggested commands ([#559](https://github.com/funkadelic/claude-nomad/issues/559)) ([070cc17](https://github.com/funkadelic/claude-nomad/commit/070cc1709263d46cc50d01e99c345b3955d729ed))
96
+
97
+
98
+ ### Dependencies
99
+
100
+ * bump fast-uri from 3.1.5 to 3.1.7 ([#563](https://github.com/funkadelic/claude-nomad/issues/563)) ([7bf62e3](https://github.com/funkadelic/claude-nomad/commit/7bf62e3e481246b7c8125e31fb2df6654241dd54))
101
+ * bump the codeql-action group across 1 directory with 2 updates ([#556](https://github.com/funkadelic/claude-nomad/issues/556)) ([ad3ae73](https://github.com/funkadelic/claude-nomad/commit/ad3ae739043ae24f560d0ddd56baff79bb6b6ad6))
102
+ * bump the dev-dependencies group across 1 directory with 3 updates ([#555](https://github.com/funkadelic/claude-nomad/issues/555)) ([02aebe2](https://github.com/funkadelic/claude-nomad/commit/02aebe2a6407dcd4be67fe9e33723c735a1c44cd))
103
+ * bump the prod-dependencies group in /docs-site with 3 updates ([#557](https://github.com/funkadelic/claude-nomad/issues/557)) ([b6b5c8a](https://github.com/funkadelic/claude-nomad/commit/b6b5c8aebebcc8e4c73ac12d511bc972bda553d7))
104
+
3
105
  ## [0.67.3](https://github.com/funkadelic/claude-nomad/compare/v0.67.2...v0.67.3) (2026-08-29)
4
106
 
5
107
  ### What's new
@@ -560,14 +662,7 @@ All of this applies on macOS, Linux, WSL2, and native Windows.
560
662
 
561
663
  * **pull:** retain unpushed local work and surface it in the preview ([#376](https://github.com/funkadelic/claude-nomad/issues/376)) ([3f70019](https://github.com/funkadelic/claude-nomad/commit/3f70019c89ccd77726e6330d9623e106bb9ff69c))
562
664
 
563
- What this means: `nomad pull` no longer discards work you have not pushed
564
- yet. Chat sessions, subagent history, and memory files that exist only on
565
- this machine now survive a pull, and a synced file you have edited locally
566
- (a project's `.planning` notes or its `CLAUDE.md`) is kept instead of being
567
- overwritten when it differs from the incoming copy, with a note to push and
568
- reconcile. `nomad diff` and `pull --dry-run` now show the count of retained
569
- local-only items and the keep-local warning, where before they reported
570
- `clean` / `0 collisions`.
665
+ What this means: `nomad pull` no longer discards work you have not pushed yet. Chat sessions, subagent history, and memory files that exist only on this machine now survive a pull, and a synced file you have edited locally (a project's `.planning` notes or its `CLAUDE.md`) is kept instead of being overwritten when it differs from the incoming copy, with a note to push and reconcile. `nomad diff` and `pull --dry-run` now show the count of retained local-only items and the keep-local warning, where before they reported `clean` / `0 collisions`.
571
666
 
572
667
  ## [0.56.1](https://github.com/funkadelic/claude-nomad/compare/v0.56.0...v0.56.1) (2026-06-30)
573
668
 
package/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  [![codeql](https://img.shields.io/github/actions/workflow/status/funkadelic/claude-nomad/codeql.yml?branch=main&label=codeql)](https://github.com/funkadelic/claude-nomad/actions/workflows/codeql.yml)
5
5
  [![codecov](https://codecov.io/gh/funkadelic/claude-nomad/graph/badge.svg?token=5NML626POS)](https://codecov.io/gh/funkadelic/claude-nomad)
6
6
  [![NPM Version](https://img.shields.io/npm/v/claude-nomad?logo=npm)](https://www.npmjs.com/package/claude-nomad)
7
+ [![npm downloads](https://img.shields.io/npm/dm/claude-nomad?logo=npm)](https://www.npmjs.com/package/claude-nomad)
7
8
  [![node](https://img.shields.io/node/v/claude-nomad?logo=nodedotjs)](https://www.npmjs.com/package/claude-nomad)
8
9
  [![license](https://img.shields.io/npm/l/claude-nomad)](LICENSE)
9
10
 
@@ -32,12 +33,12 @@ session history survives different file paths and your secrets never ride along.
32
33
  `CLAUDE.md` live in one place and follow you everywhere. `hooks/` and `agents/` are installed
33
34
  per-host by `@opengsd/gsd-core` via npm and are not synced (syncing them caused version-skew
34
35
  churn). Skills sync as a filtered copy: your own skills travel, `gsd-*` skills are excluded (see
35
- `SHARED_LINKS` and `src/skills-sync.ts` in `src/config.ts`). Settings merge a shared base with a
36
- per-host override, so one machine can run a different model or MCP URL without forking the rest.
37
- GSD-owned hook entries (scripts whose basename starts with `gsd-`) are filtered out of the
38
- generated `~/.claude/settings.json` during pull and stripped from `shared/settings.base.json` on
39
- the next push; GSD reinstalls the correct per-host hook set itself. A non-gsd hook you add to your
40
- live settings syncs normally via `nomad capture-settings`.
36
+ `SHARED_LINKS` in `src/core/config.ts` and `src/sync/skills-sync.ts`). Settings merge a shared
37
+ base with a per-host override, so one machine can run a different model or MCP URL without forking
38
+ the rest. GSD-owned hook entries (scripts whose basename starts with `gsd-`) are filtered out of
39
+ the generated `~/.claude/settings.json` during pull and stripped from `shared/settings.base.json`
40
+ on the next push; GSD reinstalls the correct per-host hook set itself. A non-gsd hook you add to
41
+ your live settings syncs normally via `nomad capture-settings`.
41
42
  - **Every push is secret-scanned.** Only an explicit allow-list of paths ever leaves the machine,
42
43
  credentials never sync, and gitleaks scans the exact files about to be published. The push aborts
43
44
  on any hit, with an interactive menu to redact, allow, or drop the finding. Always publish through
@@ -54,18 +55,20 @@ session history survives different file paths and your secrets never ride along.
54
55
  - **One command tells you what is wrong.** `nomad doctor` is a read-only health check: wedged sync
55
56
  repo, broken hook references, hooks that would crash on session start because of a missing
56
57
  `--preserve-symlinks-main` flag, version drift, oversized backup cache, missing git committer
57
- identity in the sync repo (a push fails at commit time without one), path-map entries whose local
58
- project folder no longer exists on this machine, a multi-host repo where this machine's
59
- hostname-derived key matches no `hosts/<HOST>.json` or path-map entry (a sign `NOMAD_HOST` is
60
- unset here, so per-host settings and session sync will not line up with the other hosts), synced
61
- skills with local edits that differ from the shared copy, a native Windows shared-config copy that
62
- has drifted from the repo's copy (a warning, not a failure), and settings drift in both
63
- directions: keys present in the repo merge but absent from your live `settings.json` (behind; the
64
- next `nomad pull` will restore them, fix: `nomad pull`) and keys present locally but not yet in
65
- the repo (ahead; local-only additions, fix: `nomad capture-settings`). Each issue includes a fix
66
- hint. By default the report is compact: it shows only checks that need action plus a one-line
67
- verdict. Add `--verbose` (or `--all` / `-v`) to see the full per-check tree, including everything
68
- that passed.
58
+ identity in the sync repo (a push fails at commit time without one), a never-synced file such as a
59
+ credential or a per-host settings file that Git already tracks inside the repo's `shared/` folder
60
+ (once it is committed the pull-side guard can no longer see it, so doctor names the file and the
61
+ folder name that blocks it), path-map entries whose local project folder no longer exists on this
62
+ machine, a multi-host repo where this machine's hostname-derived key matches no
63
+ `hosts/<HOST>.json` or path-map entry (a sign `NOMAD_HOST` is unset here, so per-host settings and
64
+ session sync will not line up with the other hosts), synced skills with local edits that differ
65
+ from the shared copy, a native Windows shared-config copy that has drifted from the repo's copy (a
66
+ warning, not a failure), and settings drift in both directions: keys present in the repo merge but
67
+ absent from your live `settings.json` (behind; the next `nomad pull` will restore them, fix:
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
72
  - **Self-healing sync.** Every overwrite is backed up first, and `nomad pull --force-remote`
70
73
  recovers two kinds of stuck sync repo: a repo stuck mid-rebase or mid-merge (aborts the operation,
71
74
  parks stranded work on a branch, refuses if shared config is at risk), and a repo where the rebase