claude-nomad 0.69.2 → 0.69.4

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 +56 -0
  2. package/README.md +41 -23
  3. package/dist/nomad.mjs +3895 -3645
  4. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.69.4](https://github.com/funkadelic/claude-nomad/compare/v0.69.3...v0.69.4) (2026-09-24)
4
+
5
+
6
+ ### What's new
7
+
8
+ * `nomad pull` no longer overwrites a hook you added on this machine when your sync repo already has hooks. It stops, names the hook, and leaves `~/.claude/settings.json` as it is. Run `nomad capture-settings` to save the hook to your repo, or add `--host` to keep it on this machine only.
9
+ * When another machine removes a hook from your repo, `nomad pull` now names it as it deletes it, and your settings from before the pull stay in `~/.cache/claude-nomad/backup/`.
10
+ * `nomad init` and `nomad doctor` no longer treat a remote on another host as a GitHub repo just because its address mentions github.com.
11
+ * On native Windows (PowerShell, cmd, or Git Bash; WSL2 behaves like Linux and is not affected), `nomad pull` now warns when a file nomad never syncs is tracked in your sync repo and has turned into a broken link.
12
+
13
+
14
+ ### Fixed
15
+
16
+ * **init:** only treat a remote as GitHub when github.com is its host ([#631](https://github.com/funkadelic/claude-nomad/issues/631)) ([ed0301a](https://github.com/funkadelic/claude-nomad/commit/ed0301ac2c63426d0bf954cfa58cdb7049d100b4))
17
+ * **pull:** stop overwriting a hook you added locally ([#638](https://github.com/funkadelic/claude-nomad/issues/638)) ([59ea891](https://github.com/funkadelic/claude-nomad/commit/59ea89103376c402604cda3efc0c5e1e844ea5cd))
18
+ * **pull:** warn on Windows when a never-sync file in the repo becomes a broken link ([#635](https://github.com/funkadelic/claude-nomad/issues/635)) ([312d6b9](https://github.com/funkadelic/claude-nomad/commit/312d6b945cafd0d4ba6e1c509f0bf251c50c2692))
19
+
20
+
21
+ ### Changed
22
+
23
+ * **dependabot:** group action bumps and add a release cooldown ([#627](https://github.com/funkadelic/claude-nomad/issues/627)) ([eefdf06](https://github.com/funkadelic/claude-nomad/commit/eefdf0641cd14ad7339ecfeb4b270a78b25b08df))
24
+ * move the TTY check and the manifest store out of the push command ([#633](https://github.com/funkadelic/claude-nomad/issues/633)) ([50584df](https://github.com/funkadelic/claude-nomad/commit/50584df68f609dd84c295f21cea22dbe56b157a5))
25
+ * publish a test-count badge from main ([#637](https://github.com/funkadelic/claude-nomad/issues/637)) ([7cd6f1d](https://github.com/funkadelic/claude-nomad/commit/7cd6f1d7750a4c2fb3e080feb87aaede939b7c1c))
26
+ * **sync:** move settings drift helpers into sync ([#634](https://github.com/funkadelic/claude-nomad/issues/634)) ([3462c6f](https://github.com/funkadelic/claude-nomad/commit/3462c6f4e3b919b8dd7ec6225ae1ac62f87a901b))
27
+
28
+
29
+ ### Testing
30
+
31
+ * cover the defensive fault-handling branches ([#636](https://github.com/funkadelic/claude-nomad/issues/636)) ([b187ef5](https://github.com/funkadelic/claude-nomad/commit/b187ef5763e8ce2e97f6cae1c35cd526699cea0f))
32
+ * pin the home preflight, crash redaction and spinner worker path ([#632](https://github.com/funkadelic/claude-nomad/issues/632)) ([6ad01cd](https://github.com/funkadelic/claude-nomad/commit/6ad01cdf3260a2867a3b2b690a81142d0398bcb0))
33
+
34
+
35
+ ### Dependencies
36
+
37
+ * bump @astrojs/starlight from 0.42.0 to 0.42.1 in /docs-site in the prod-dependencies group across 1 directory ([#626](https://github.com/funkadelic/claude-nomad/issues/626)) ([6f8a2dc](https://github.com/funkadelic/claude-nomad/commit/6f8a2dcc0d189c6358b6def2b5ba0b61e0bbbcc2))
38
+ * bump astro from 7.3.2 to 7.3.3 in /docs-site in the astro group ([#624](https://github.com/funkadelic/claude-nomad/issues/624)) ([ff34642](https://github.com/funkadelic/claude-nomad/commit/ff3464207ee8686728bccfa8684f520a91a028ba))
39
+ * bump starlight-llms-txt from 0.11.0 to 0.12.0 in /docs-site in the dev-dependencies group across 1 directory ([#625](https://github.com/funkadelic/claude-nomad/issues/625)) ([ca728a4](https://github.com/funkadelic/claude-nomad/commit/ca728a42fdcce079656a1fcc8da29609cfa70909))
40
+ * bump the actions group across 1 directory with 4 updates ([#630](https://github.com/funkadelic/claude-nomad/issues/630)) ([8b10d51](https://github.com/funkadelic/claude-nomad/commit/8b10d5150b205348604a3fbcd785bb6da8f3ef7b))
41
+ * bump the dev-dependencies group across 1 directory with 5 updates ([#629](https://github.com/funkadelic/claude-nomad/issues/629)) ([dd8aa58](https://github.com/funkadelic/claude-nomad/commit/dd8aa58dd08de0e0a0106ea0e147809ac6d02d5a))
42
+
43
+ ## [0.69.3](https://github.com/funkadelic/claude-nomad/compare/v0.69.2...v0.69.3) (2026-09-19)
44
+
45
+
46
+ ### What's new
47
+
48
+ A quick follow-up to 0.69.2 for a recent change in Claude Code.
49
+
50
+ * Claude Code 2.1.275 and later copy the skills enabled on your claude.ai account into `~/.claude/skills/synced/`, and can also create `skills/.trash/` and `skills/.staging/` next to it. nomad now leaves all three folders alone: `nomad push` no longer copies them into your sync repo and removes any copy an earlier push left there, `nomad pull` never touches them, and `nomad doctor` stops listing their files as out of sync.
51
+ * To stop Claude Code syncing those skills at all, set `"syncClaudeAiSkills": false` in `~/.claude/settings.json` (on a synced machine, put it in your base or host settings file in the sync repo instead).
52
+
53
+
54
+ ### Fixed
55
+
56
+ * **skills:** also skip Claude Code's skills .trash and .staging folders ([#618](https://github.com/funkadelic/claude-nomad/issues/618)) ([fbb9eb1](https://github.com/funkadelic/claude-nomad/commit/fbb9eb173842598f6aaf1be387bc73fffc1cb43f))
57
+ * **skills:** stop syncing Claude Code's skills/synced folder ([#616](https://github.com/funkadelic/claude-nomad/issues/616)) ([59618dc](https://github.com/funkadelic/claude-nomad/commit/59618dcc25333b4bed2a7a1da73167d1be5dd660))
58
+
3
59
  ## [0.69.2](https://github.com/funkadelic/claude-nomad/compare/v0.69.1...v0.69.2) (2026-09-19)
4
60
 
5
61
 
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # claude-nomad
2
2
 
3
3
  [![tests](https://img.shields.io/github/actions/workflow/status/funkadelic/claude-nomad/tests.yml?branch=main&label=tests)](https://github.com/funkadelic/claude-nomad/actions/workflows/tests.yml)
4
+ [![test count](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Ffunkadelic%2Fe814bc9b80ce48781f29b860011051d9%2Fraw%2Fclaude-nomad-tests.json&color=brightgreen)](https://app.codecov.io/gh/funkadelic/claude-nomad/tests/main)
4
5
  [![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
6
  [![codecov](https://codecov.io/gh/funkadelic/claude-nomad/graph/badge.svg?token=5NML626POS)](https://codecov.io/gh/funkadelic/claude-nomad)
6
- [![NPM Version](https://img.shields.io/npm/v/claude-nomad?logo=npm)](https://www.npmjs.com/package/claude-nomad)
7
+ [![NPM Version](https://img.shields.io/npm/v/claude-nomad?logo=npm&color=brightgreen)](https://www.npmjs.com/package/claude-nomad)
7
8
  [![npm downloads](https://img.shields.io/npm/dm/claude-nomad?logo=npm)](https://www.npmjs.com/package/claude-nomad)
8
9
  [![node](https://img.shields.io/node/v/claude-nomad?logo=nodedotjs)](https://www.npmjs.com/package/claude-nomad)
9
- [![license](https://img.shields.io/npm/l/claude-nomad)](LICENSE)
10
10
 
11
11
  ![claude-nomad - Sync your Claude Code setup. Same environment. Any machine.](docs/hero.svg)
12
12
 
@@ -32,13 +32,16 @@ session history survives different file paths and your secrets never ride along.
32
32
  - **One shared setup, per-machine exceptions.** Your own skills, slash commands, rules, and your
33
33
  `CLAUDE.md` live in one place and follow you everywhere. `hooks/` and `agents/` are installed
34
34
  per-host by `@opengsd/gsd-core` via npm and are not synced (syncing them caused version-skew
35
- churn). Skills sync as a filtered copy: your own skills travel, `gsd-*` skills are excluded (see
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`.
35
+ churn). Skills sync as a filtered copy: your own skills travel, while `gsd-*` skills and Claude
36
+ Code's own account-skills folders (`skills/synced/`, `skills/.trash/`, `skills/.staging/`) stay
37
+ behind (see `SHARED_LINKS` in `src/core/config.ts` and `src/sync/skills-sync.ts`). Claude Code
38
+ keeps its copy of the skills enabled on your claude.ai account there. Settings merge a shared base
39
+ with a per-host override, so one machine can run a different model or MCP URL without forking the
40
+ rest. GSD-owned hook entries (scripts whose basename starts with `gsd-`) are filtered out of the
41
+ generated `~/.claude/settings.json` during pull and stripped from `shared/settings.base.json` on
42
+ the next push; GSD reinstalls the correct per-host hook set itself. A pull never overwrites a
43
+ non-gsd hook you add to your live settings; run `nomad capture-settings` to save it so it syncs to
44
+ your other machines.
42
45
  - **Every push is secret-scanned.** Only an explicit allow-list of paths ever leaves the machine,
43
46
  credentials never sync, and gitleaks scans the exact files about to be published. The push aborts
44
47
  on any hit, with an interactive menu to redact, allow, or drop the finding. Always publish through
@@ -226,6 +229,20 @@ longer want them. Your shared files, skills, sessions, and project extras still
226
229
  command exits with a non-zero status so a scripted or cron-driven pull does not report success. Once
227
230
  you have saved or deleted the settings, the next pull proceeds normally.
228
231
 
232
+ When your repo already has hooks and you add another one on this machine, `nomad pull` stops the
233
+ same way. It names the new hook by its event, and by its command too when the command is short
234
+ enough to show, for example `PreToolUse hook 'python3 ~/x.py'`. Save it with
235
+ `nomad capture-settings`, which adds it to the shared hooks for that event. A hook another machine
236
+ removed from the repo is removed here too and named by the pull, the same as any other setting, and
237
+ `nomad capture-settings` does not save it back.
238
+
239
+ With `--host`, capture writes that event's whole hook list, shared entries included, into this
240
+ machine's host file. Later changes to that event's hooks in the shared file then stop reaching this
241
+ machine, and capture warns you before it writes. If your host file already sets its own hooks for
242
+ that event, or sets `hooks` to `null`, a plain `nomad capture-settings` does not save the hook and
243
+ tells you to add `--host`. A `--host` capture over `hooks: null` replaces the `null`, so the shared
244
+ hooks for every other event reach this machine again, and capture warns about that too.
245
+
229
246
  Credential settings are the one exception. Keys that can hold a secret (`env`, `apiKeyHelper`,
230
247
  `awsAuthRefresh`, `awsCredentialExport`, `otelHeadersHelper`) are never printed, so pull cannot list
231
248
  them and will not stop for them. When it finds some your repo does not track, it writes
@@ -234,13 +251,13 @@ them and will not stop for them. When it finds some your repo does not track, it
234
251
 
235
252
  A setting that another machine removed from the repo is removed here too. Each time nomad writes
236
253
  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`.
254
+ machine, with a fingerprint of each value and of each hook. A setting in that record that the repo
255
+ no longer carries, and that still has the value nomad wrote, is one nomad put there, so the next
256
+ pull removes it. The pull names each setting it removes (so does `nomad pull --dry-run`), and the
257
+ file from before the pull stays in `~/.cache/claude-nomad/backup/`. A setting missing from the
258
+ record is one you added, and one you changed since is yours now, so either is kept and listed as
259
+ above. A removal is handled the same whether it arrives with this pull or reached your repo earlier
260
+ through an edit you made, a `nomad push`, or a `nomad pull --dry-run`.
244
261
 
245
262
  A machine that has not finished a pull yet, or whose cache folder was cleared, has nothing recorded.
246
263
  There a removal that reached the repo earlier is still listed as a setting you added. Save it or
@@ -283,13 +300,14 @@ file still carries conflict markers, so they are never copied into your live con
283
300
  specific problem and points at the right fix.
284
301
 
285
302
  If an external tool (such as Claude Code or GSD) wrote new keys into your `~/.claude/settings.json`
286
- that are not yet in your shared repo, run `nomad capture-settings` to promote them before the next
287
- `nomad pull` overwrites them. With `--host`, the keys land in `hosts/<NOMAD_HOST>.json` instead of
288
- `shared/settings.base.json` (useful for machine-specific values such as absolute paths). `--dry-run`
289
- shows what would be written without touching anything. Before it writes, `capture-settings` shows
290
- the destination and the keys and asks you to confirm; pass `--yes` (or `-y`) to skip the prompt,
291
- which is required when running without an interactive terminal. `nomad push` also warns when it
292
- detects ahead-drift so you have a prompt to act before the push completes.
303
+ that are not yet in your shared repo, run `nomad capture-settings` to promote them, or to save a
304
+ hook it added under an event your repo already tracks, before the next `nomad pull` overwrites them.
305
+ With `--host`, the keys land in `hosts/<NOMAD_HOST>.json` instead of `shared/settings.base.json`
306
+ (useful for machine-specific values such as absolute paths). `--dry-run` shows what would be written
307
+ without touching anything. Before it writes, `capture-settings` shows the destination and the keys
308
+ and asks you to confirm; pass `--yes` (or `-y`) to skip the prompt, which is required when running
309
+ without an interactive terminal. `nomad push` also warns when it detects ahead-drift so you have a
310
+ prompt to act before the push completes.
293
311
 
294
312
  ## Claude Code plugin
295
313