claude-nomad 0.64.0 → 0.65.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,109 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.65.0](https://github.com/funkadelic/claude-nomad/compare/v0.64.1...v0.65.0) (2026-08-13)
4
+
5
+ ### What's new
6
+
7
+ **On native Windows (PowerShell or cmd).** Note: WSL2 behaves like Linux and none of these apply to
8
+ it.
9
+
10
+ - **`nomad pull --force-remote` no longer discards edits you have not published.** The flag exists
11
+ to rescue a sync repo that got stuck part-way through an update. On native Windows it also skipped
12
+ the step that saves your local shared-config edits into the repo, every time it ran, even on a
13
+ healthy machine with nothing to rescue. That was the flag's only visible effect on a healthy repo,
14
+ and nothing told you it had happened. It now rescues a stuck repo and nothing else, and when a
15
+ rescue genuinely does replace your copies, the pull says how many and where your previous ones
16
+ were saved.
17
+ - **A pull now says what it did to your shared config.** On Windows your shared config is kept as
18
+ real file copies rather than symlinks, so every pull starts by copying your local edits into the
19
+ sync repo. That step used to be silent. It now prints a `Symlinks` section naming each file it
20
+ picked up, and each file it removed from the repo because you deleted it here. If a file cannot be
21
+ read at all, because another program is holding it open or its permissions changed, the pull names
22
+ it and says why rather than leaving a silent gap. `nomad diff` and `nomad pull --dry-run` read
23
+ from the same place, so a preview now matches what a real pull does.
24
+ - **Windows keeps the same things out of your sync repo that your other machines do.** The Windows
25
+ copy step used to hold back only files whose names looked like passwords or keys. It now skips
26
+ everything on the never-sync list, so the folders Claude Code uses for its own state, named things
27
+ like `sessions`, `tasks`, `plans`, and `cache`, stay on the machine even when they sit inside a
28
+ folder you share. If one of them is already sitting in your sync repo, the pull tells you, and
29
+ takes a backup copy before removing it.
30
+
31
+ **On all supported platforms, i.e. \*nix, Mac, WSL2, and native Windows.**
32
+
33
+ - **`nomad doctor` names the files that have drifted.** When it reports that your skills or your
34
+ shared config no longer match the repo, it lists them. Before, you got a count and had to run it
35
+ again with `--verbose` to find out which files it meant.
36
+ - **`nomad pull --force-remote` tells you when there was nothing to rescue.** On a repo that is not
37
+ stuck it now says so and pulls normally, instead of appearing to do nothing. If it cannot tell
38
+ whether the repo is stuck, it says that too rather than reporting a clean repo. The help text,
39
+ README, and docs site now agree on what the flag does.
40
+
41
+
42
+ ### Added
43
+
44
+ * **doctor:** open with the nomad wordmark and name the diverging files ([#508](https://github.com/funkadelic/claude-nomad/issues/508)) ([1fea0c7](https://github.com/funkadelic/claude-nomad/commit/1fea0c7913b38f934d529d888a0aef96dc1dfc08))
45
+ * make the win32 pre-pull mirror visible and gate what it writes ([#503](https://github.com/funkadelic/claude-nomad/issues/503)) ([8d3a76d](https://github.com/funkadelic/claude-nomad/commit/8d3a76dd42c89efd38b2a76b2684b8b4014878ac))
46
+ * **pull:** report the shared files a pull removes, not just the ones it captures ([#510](https://github.com/funkadelic/claude-nomad/issues/510)) ([9ab6ef5](https://github.com/funkadelic/claude-nomad/commit/9ab6ef5b9961a8542eb25a650ada27bd3bdf9de6))
47
+
48
+
49
+ ### Fixed
50
+
51
+ * **mirror:** report what the never-sync cleanup actually removed ([#509](https://github.com/funkadelic/claude-nomad/issues/509)) ([6596ed3](https://github.com/funkadelic/claude-nomad/commit/6596ed341d4e764b29a56bb73f900aa6dd48fcc9))
52
+ * **mirror:** warn when the win32 mirror skips a name it cannot stat ([#505](https://github.com/funkadelic/claude-nomad/issues/505)) ([5806db6](https://github.com/funkadelic/claude-nomad/commit/5806db6e2d2861747738d498d0255fe0483a6650))
53
+ * **pull:** make --force-remote mean wedge recovery again ([#506](https://github.com/funkadelic/claude-nomad/issues/506)) ([2bf8d5d](https://github.com/funkadelic/claude-nomad/commit/2bf8d5d3b19e8c022ff1137be96b0f009e5503df))
54
+
55
+
56
+ ### Changed
57
+
58
+ * fail the gitleaks install on a download error, not a checksum mismatch ([#504](https://github.com/funkadelic/claude-nomad/issues/504)) ([724dd3c](https://github.com/funkadelic/claude-nomad/commit/724dd3c276bdea113f9719e5b62ee0741a3c3885))
59
+
60
+
61
+ ### Documentation
62
+
63
+ * describe what the force-remote recovery warning actually counts ([#507](https://github.com/funkadelic/claude-nomad/issues/507)) ([6235858](https://github.com/funkadelic/claude-nomad/commit/6235858e40459e136deff4b081187c89b9e7b670))
64
+ * keep the Windows explainer in one place ([#511](https://github.com/funkadelic/claude-nomad/issues/511)) ([9a9287f](https://github.com/funkadelic/claude-nomad/commit/9a9287f87d86e2353ca4a0d936346482e37a1041))
65
+
66
+
67
+ ### Dependencies
68
+
69
+ * bump @astrojs/starlight from 0.41.6 to 0.41.7 in /docs-site in the prod-dependencies group ([#499](https://github.com/funkadelic/claude-nomad/issues/499)) ([61ecb3f](https://github.com/funkadelic/claude-nomad/commit/61ecb3fef0213c6bc0f2a36713da0e166e356238))
70
+ * bump astro from 7.1.6 to 7.2.0 in /docs-site ([#500](https://github.com/funkadelic/claude-nomad/issues/500)) ([4909e02](https://github.com/funkadelic/claude-nomad/commit/4909e02e5754081432e567cae2344989ab8b1309))
71
+ * bump the codeql-action group across 1 directory with 2 updates ([#498](https://github.com/funkadelic/claude-nomad/issues/498)) ([ad3310d](https://github.com/funkadelic/claude-nomad/commit/ad3310d33e9662ae407d304ef949efd1bebf9c3e))
72
+ * bump the dev-dependencies group across 1 directory with 4 updates ([#501](https://github.com/funkadelic/claude-nomad/issues/501)) ([446c6da](https://github.com/funkadelic/claude-nomad/commit/446c6dae3905609bef1d3ec4366d58e50651c44a))
73
+
74
+ ## [0.64.1](https://github.com/funkadelic/claude-nomad/compare/v0.64.0...v0.64.1) (2026-08-07)
75
+
76
+ ### What's new
77
+
78
+ - **A stray dot or space at the end of a file name no longer hides a secret.** nomad never copies
79
+ password and key files (things like `.env`, `id_rsa`, or `server.pem`) out of the project folders
80
+ you sync. It spots them by name, and a name with an extra dot or space on the end, such as
81
+ `.env.`, did not match, so a file like that could end up in your sync repo. It matches now, and so
82
+ do the other files nomad always keeps out, such as `settings.local.json`. Nothing changes in how
83
+ you use nomad. It simply catches more ways of writing the same names it already blocked.
84
+ - **A `.claude` folder is recognized however it is capitalized.** If a project had a folder named
85
+ `.Claude` instead of `.claude`, nomad checked what was inside it less carefully than it should
86
+ have. Both are treated the same now.
87
+ - **A folder name nomad will never sync is turned down as soon as you add it.** You can ask nomad to
88
+ sync extra folders by listing their names in `path-map.json`. If a name you list is one nomad
89
+ refuses to sync, because it looks like a password file, or because it is a name that causes
90
+ trouble on one of the machines you sync to, you are told straight away and told why. Before,
91
+ nothing was said until a later `nomad push` stopped without explaining itself. `nomad doctor` also
92
+ lists any names in this situation and what to do about them.
93
+
94
+ All of this applies on macOS, Linux, WSL2, and native Windows.
95
+
96
+
97
+ ### Fixed
98
+
99
+ * **config:** close the trailing-dot bypass in the secret-name guard ([#495](https://github.com/funkadelic/claude-nomad/issues/495)) ([9aaf5d9](https://github.com/funkadelic/claude-nomad/commit/9aaf5d958027a3557974c1ab32254c6171aea631))
100
+ * reject a secret-shaped name as a shared dir ([#493](https://github.com/funkadelic/claude-nomad/issues/493)) ([3054464](https://github.com/funkadelic/claude-nomad/commit/3054464c91c974a7abdad24b2067bab8386e1dfd))
101
+
102
+
103
+ ### Changed
104
+
105
+ * **release:** publish the release body from CHANGELOG.md ([#496](https://github.com/funkadelic/claude-nomad/issues/496)) ([e7bff07](https://github.com/funkadelic/claude-nomad/commit/e7bff07504935e563936733eae1146dc6eeaca83))
106
+
3
107
  ## [0.64.0](https://github.com/funkadelic/claude-nomad/compare/v0.63.2...v0.64.0) (2026-08-05)
4
108
 
5
109
  ### What's new
package/README.md CHANGED
@@ -71,7 +71,8 @@ survives different file paths and your secrets never ride along.
71
71
  parks stranded work on a branch, refuses if shared config is at risk), and a repo where the rebase
72
72
  was interrupted but the git index was left with unmerged entries and no active operation (clears
73
73
  the index via `git reset --mixed HEAD`, surfaces any orphaned stash entry left by the interrupted
74
- autostash, never discards working-tree edits).
74
+ autostash, never discards working-tree edits). On a repo that is not stuck, the flag reports there
75
+ is nothing to recover and pulls normally instead of doing nothing silently.
75
76
  - **Easy off.** `nomad eject` replaces every managed `~/.claude/` symlink with a real copy in one
76
77
  step, so your setup keeps working after you delete the sync checkout and uninstall the CLI.
77
78
 
@@ -118,27 +119,40 @@ export NOMAD_HOST=<your-host-label> # add to ~/.zshrc or ~/.bashrc
118
119
  $ nomad pull
119
120
  ```
120
121
 
122
+ Everyday loop on any host:
123
+
124
+ ```bash
125
+ $ nomad doctor # confirm setup
126
+ $ nomad sync # pull config, then publish local changes, in one step
127
+ ```
128
+
129
+ `nomad sync` is the command to reach for day to day: it always pulls first (so changes from your
130
+ other machines land before anything is pushed, and work that exists only on this machine is kept,
131
+ not deleted) and then pushes, under one lock, so there is no ordering to remember. Output is compact
132
+ by default: a run prints only a short Sync summary, not the full status tree; pass
133
+ `nomad sync --verbose` (or `--all` / `-v`) to see the full tree. `nomad pull` and `nomad push` are
134
+ still available as lower-level commands for cases `sync` does not cover: recovering a wedged repo
135
+ with `nomad pull --force-remote`, or resolving a detected secret without the interactive menu via
136
+ `nomad push --redact-all` / `--allow` / `--allow-all` (see [Changing settings](#changing-settings)
137
+ and [Recovery flows](https://funkadelic.github.io/claude-nomad/recovery/)). The
138
+ [FAQ](https://funkadelic.github.io/claude-nomad/faq/) covers what `sync` does under the hood and the
139
+ push/pull order it enforces.
140
+
121
141
  ### Windows
122
142
 
123
143
  claude-nomad runs natively on Windows (PowerShell or cmd), and WSL2 works too. The everyday loop is
124
144
  the same either way; the difference is under the hood.
125
145
 
126
- On macOS, Linux, and WSL2, claude-nomad symlinks your shared config into `~/.claude/`, so there is
127
- only ever one file: the one in your sync repo. Native Windows cannot use symlinks, because creating
128
- one there needs Developer Mode or admin rights, so claude-nomad keeps a real copy there instead.
129
- That leaves two files to keep in step, and claude-nomad does it for you: `nomad pull` and
130
- `nomad sync` both copy your edits into the repo before they fetch, so an unpublished edit is never
131
- overwritten. Enabling Developer Mode does not change this; copies are used on every native Windows
132
- host either way.
133
-
134
- Two things come from native Windows specifically, both covered in the bullets below: a
135
- `.gitleaksignore` allow entry may not travel to a macOS, Linux, or WSL2 host, and deep session paths
136
- can hit the native Windows 260-character path limit.
137
-
138
- The native Windows steps are the same as above with a couple of PowerShell-specific swaps:
146
+ Native Windows cannot use symlinks, so claude-nomad keeps a real copy of your shared config in
147
+ `~/.claude/` instead of a symlink. `nomad pull` and `nomad sync` both mirror your local copies into
148
+ the repo before they fetch, so an edit you have not published yet is captured rather than
149
+ overwritten. If a file cannot be read, the pull leaves it out and warns naming the file: fix that
150
+ and run again before you rely on the result.
139
151
 
140
152
  ```powershell
141
- # 1. Install the CLI.
153
+ # 1. Install prerequisites and the CLI. (Using Scoop instead? scoop install gh gitleaks.)
154
+ > winget install GitHub.cli
155
+ > winget install gitleaks.gitleaks
142
156
  > npm i -g claude-nomad
143
157
 
144
158
  # 2. Create your private sync repo and scaffold it.
@@ -155,66 +169,9 @@ The native Windows steps are the same as above with a couple of PowerShell-speci
155
169
  > nomad push
156
170
  ```
157
171
 
158
- A few native Windows specifics worth knowing. WSL2 behaves like Linux, so the copy-sync and
159
- path-length items below do not apply to it; the `.gitleaksignore` one can still reach it, from the
160
- other side:
161
-
162
- - **Installing gh:** `winget install GitHub.cli` (or `scoop install gh`), then `gh auth login`.
163
- Needed before `nomad init` on the first host; later hosts only clone with it.
164
- - **Installing gitleaks:** `winget install gitleaks.gitleaks` (or `scoop install gitleaks` if you
165
- use Scoop). `nomad doctor` prints the same hint whenever gitleaks is missing from PATH.
166
- - **Shared config is copied, not symlinked.** On macOS and Linux, files like `CLAUDE.md` and your
167
- skills live in the sync repo and are symlinked into `~/.claude/`, so there is one source of truth
168
- on disk. Creating a symlink on native Windows needs Developer Mode or admin rights, so there these
169
- are real copies instead, whether or not you have Developer Mode enabled. WSL2 is unaffected and
170
- behaves like Linux. What this means for you: nothing extra. On native Windows both `nomad pull`
171
- and `nomad sync` mirror your local copies into the repo before they fetch, so an unpublished edit
172
- is captured rather than reverted. A file you delete from a shared directory is handled the same
173
- way: it is removed from the sync repo by the next pull, exactly as deleting inside a symlinked
174
- directory already removes it on macOS or Linux. The removal is left uncommitted, so it publishes
175
- on your next push and passes the same secret scan as everything else, and the file is snapshotted
176
- to the backup dir first. The safety rule behind this: nomad only removes a file it has a record of
177
- having given this machine, so a repo file this machine has never synced is never touched. That
178
- record is also why the first pull after you upgrade to this version is an exception: there is
179
- nothing to compare against yet, so a deletion made before that pull comes back once, and deleting
180
- it again sticks. If a file you created has the same name as one another machine just created, the
181
- pull stops before it changes anything and tells you which file under `~/.claude/` to move or
182
- rename, with the two ways to finish. Nothing is lost either way: your file stays exactly as you
183
- left it and the update simply waits for the next pull. The one command that deliberately takes the
184
- repo's version is `nomad pull --force-remote`, which is what that flag is for; the copy it
185
- replaces is snapshotted to the backup dir first. This is the same behavior claude-nomad's
186
- `skills/` sync already has on every platform.
187
- - **A `.gitleaksignore` allow entry may not travel across hosts.** gitleaks fingerprints each
188
- finding using the file path exactly as it saw it: backslashes on native Windows, forward slashes
189
- on macOS/Linux/WSL2. If you allow a finding with `nomad push --allow` (or `nomad allow`) on native
190
- Windows, the identical finding can reappear as "new" the first time it is scanned from a macOS,
191
- Linux, or WSL2 host, and the same happens in reverse. This is a known gitleaks limitation, not a
192
- claude-nomad bug; just allow it again from the other host.
193
- - **Line endings stay put.** A fresh `nomad init` writes a `.gitattributes` with `* -text`, so Git
194
- never converts line endings between hosts. If you are joining a sync repo created before this file
195
- existed, add that one line from any host (or watch for the `nomad doctor` warning that nudges
196
- you), otherwise a native Windows checkout with the common `core.autocrlf=true` Git default would
197
- rewrite every text file's line endings, and every host would then see the whole tree as
198
- permanently changed.
199
-
200
- Everyday loop on any host:
201
-
202
- ```bash
203
- $ nomad doctor # confirm setup
204
- $ nomad sync # pull config, then publish local changes, in one step
205
- ```
206
-
207
- `nomad sync` is the command to reach for day to day: it always pulls first (so changes from your
208
- other machines land before anything is pushed, and work that exists only on this machine is kept,
209
- not deleted) and then pushes, under one lock, so there is no ordering to remember. Output is compact
210
- by default: a run prints only a short Sync summary, not the full status tree; pass
211
- `nomad sync --verbose` (or `--all` / `-v`) to see the full tree. `nomad pull` and `nomad push` are
212
- still available as lower-level commands for cases `sync` does not cover: recovering a wedged repo
213
- with `nomad pull --force-remote`, or resolving a detected secret without the interactive menu via
214
- `nomad push --redact-all` / `--allow` / `--allow-all` (see [Changing settings](#changing-settings)
215
- and [Recovery flows](https://funkadelic.github.io/claude-nomad/recovery/)). The
216
- [FAQ](https://funkadelic.github.io/claude-nomad/faq/) covers what `sync` does under the hood and the
217
- push/pull order it enforces.
172
+ See the full explainer at <https://funkadelic.github.io/claude-nomad/quickstart/#windows> for how
173
+ the copy-sync behaves on pull and push, why a `.gitleaksignore` allow entry may not travel to a
174
+ macOS, Linux, or WSL2 host, the 260-character path limit, and the line-endings setting.
218
175
 
219
176
  ### Make your sessions follow you
220
177
 
@@ -321,8 +278,8 @@ independently from the CLI, but requires nomad `>= 0.35.0` because it calls rece
321
278
  - `gh` ([GitHub CLI](https://cli.github.com/)), required by `nomad init`
322
279
 
323
280
  Works on macOS, Linux (including WSL2), and native Windows (PowerShell or cmd). See
324
- [Windows](#windows) above for the native Windows equivalents of the install and host-label steps,
325
- the copy-sync trade-off, and the `.gitleaksignore` cross-host caveat.
281
+ [Windows](#windows) above for the native Windows equivalents of the install and host-label steps and
282
+ the copy-sync trade-off.
326
283
 
327
284
  **Optional:** [curl](https://curl.se/) or [wget](https://www.gnu.org/software/wget/) for the
328
285
  version-staleness check and `nomad doctor --check-schema`. The CLI works without them. The opt-in