claude-nomad 0.53.3 → 0.55.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,35 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.55.0](https://github.com/funkadelic/claude-nomad/compare/v0.54.0...v0.55.0) (2026-06-28)
4
+
5
+
6
+ ### Added
7
+
8
+ * **doctor:** warn on misaligned host key when NOMAD_HOST is unset ([#356](https://github.com/funkadelic/claude-nomad/issues/356)) ([a13e833](https://github.com/funkadelic/claude-nomad/commit/a13e833a09636f98f1e9c51e9c41f01a4323dea2))
9
+ * **init:** offer to snapshot an existing ~/.claude on init ([#357](https://github.com/funkadelic/claude-nomad/issues/357)) ([92e90b1](https://github.com/funkadelic/claude-nomad/commit/92e90b1977fff51d565fa5d11b3c640790ee1b57))
10
+
11
+
12
+ ### Fixed
13
+
14
+ * make sync warning messages user-friendly ([#345](https://github.com/funkadelic/claude-nomad/issues/345)) ([002f57d](https://github.com/funkadelic/claude-nomad/commit/002f57de240dfb1349742fa4c2b4ac5e51b5f7ba))
15
+
16
+
17
+ ### Documentation
18
+
19
+ * clarify onboarding (two-dir model, session sync, push order) ([#355](https://github.com/funkadelic/claude-nomad/issues/355)) ([396fbb8](https://github.com/funkadelic/claude-nomad/commit/396fbb875b4331800ee74834944da17decbcad92))
20
+
21
+ ## [0.54.0](https://github.com/funkadelic/claude-nomad/compare/v0.53.3...v0.54.0) (2026-06-27)
22
+
23
+
24
+ ### Added
25
+
26
+ * **doctor:** add preflight hardening checks ([#344](https://github.com/funkadelic/claude-nomad/issues/344)) ([551ab16](https://github.com/funkadelic/claude-nomad/commit/551ab16a6c0c6bdf88a51c5dbf5a76f3cd4a7f22))
27
+
28
+
29
+ ### Fixed
30
+
31
+ * **update:** silence npm output on successful self-update ([#342](https://github.com/funkadelic/claude-nomad/issues/342)) ([b7171b9](https://github.com/funkadelic/claude-nomad/commit/b7171b933c6bb9b4578b7e109bb334baa0f147b8))
32
+
3
33
  ## [0.53.3](https://github.com/funkadelic/claude-nomad/compare/v0.53.2...v0.53.3) (2026-06-26)
4
34
 
5
35
 
package/README.md CHANGED
@@ -39,19 +39,26 @@ survives different file paths and your secrets never ride along.
39
39
  live settings syncs normally via `nomad capture-settings`.
40
40
  - **Every push is secret-scanned.** Only an explicit allow-list of paths ever leaves the machine,
41
41
  credentials never sync, and gitleaks scans the exact files about to be published. The push aborts
42
- on any hit, with an interactive menu to redact, allow, or drop the finding.
42
+ on any hit, with an interactive menu to redact, allow, or drop the finding. Always publish through
43
+ `nomad push`: the sync repo is an ordinary Git repo, so a manual `git push` from it skips the scan
44
+ entirely and can leak a secret that `nomad push` would have caught.
43
45
  - **Preview before you trust it.** `nomad diff` shows offline what a pull would change (gsd-owned
44
46
  hook churn is filtered the same as on pull, so the preview matches what a real pull writes), and
45
47
  `--dry-run` on pull and push prints the plan without writing anything.
46
48
  - **One command tells you what is wrong.** `nomad doctor` is a read-only health check: wedged sync
47
49
  repo, broken hook references, hooks that would crash on session start because of a missing
48
- `--preserve-symlinks-main` flag, version drift, oversized backup cache, and settings drift in both
49
- directions: keys present in the repo merge but absent from your live `settings.json` (behind; the
50
- next `nomad pull` will restore them, fix: `nomad pull`) and keys present locally but not yet in
51
- the repo (ahead; local-only additions, fix: `nomad capture-settings`). Each issue includes a fix
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.
50
+ `--preserve-symlinks-main` flag, version drift, oversized backup cache, missing git committer
51
+ identity in the sync repo (a push fails at commit time without one), path-map entries whose local
52
+ project folder no longer exists on this machine, a multi-host repo where this machine's
53
+ hostname-derived key matches no `hosts/<HOST>.json` or path-map entry (a sign `NOMAD_HOST` is
54
+ unset here, so per-host settings and session sync will not line up with the other hosts), synced
55
+ skills with local edits that differ from the shared copy, and settings drift in both directions:
56
+ keys present in the repo merge but absent from your live `settings.json` (behind; the next
57
+ `nomad pull` will restore them, fix: `nomad pull`) and keys present locally but not yet in the
58
+ repo (ahead; local-only additions, fix: `nomad capture-settings`). Each issue includes a fix hint.
59
+ By default the report is compact: it shows only checks that need action plus a one-line verdict.
60
+ Add `--verbose` (or `--all` / `-v`) to see the full per-check tree, including everything that
61
+ passed.
55
62
  - **Self-healing sync.** Every overwrite is backed up first, and `nomad pull --force-remote`
56
63
  recovers two kinds of stuck sync repo: a repo stuck mid-rebase or mid-merge (aborts the operation,
57
64
  parks stranded work on a branch, refuses if shared config is at risk), and a repo where the rebase
@@ -66,15 +73,27 @@ opt-in per-project sync, transcript redaction, backup pruning, and more.
66
73
 
67
74
  ## Quickstart
68
75
 
76
+ nomad works with two directories, and the difference is the one thing worth learning up front:
77
+
78
+ - **`~/claude-nomad/`** is your private sync repo. This is the one you edit.
79
+ - **`~/.claude/`** is Claude Code's live config. nomad regenerates it on every `pull`.
80
+
81
+ Edit the repo, never the live config. In particular, never hand-edit `~/.claude/settings.json`: it
82
+ is rebuilt from the repo on every pull and your changes are lost. Change `shared/settings.base.json`
83
+ (or `hosts/<HOST>.json`) in the repo instead, or run `nomad capture-settings` to pull local changes
84
+ back into the repo (see [Changing settings](#changing-settings)).
85
+
69
86
  **First host** (once, ever):
70
87
 
71
88
  ```bash
72
89
  # 1. Install the CLI.
73
90
  $ npm i -g claude-nomad
74
91
 
75
- # 2. Create your private sync repo and scaffold it.
92
+ # 2. Create your private sync repo and scaffold it. If you already have a
93
+ # ~/.claude/ worth keeping, init offers to seed the repo from it.
76
94
  $ nomad init # prompts for a repo name (default: claude-nomad-config)
77
- $ nomad init --repo my-config # non-interactive
95
+ $ nomad init --repo my-config # set the repo name without the prompt
96
+ $ nomad init --snapshot # seed from existing ~/.claude/ without being asked
78
97
 
79
98
  # 3. Add a stable host label to ~/.zshrc or ~/.bashrc, then reload.
80
99
  export NOMAD_HOST=<your-host-label>
@@ -100,6 +119,45 @@ $ nomad pull # apply config to ~/.claude/
100
119
  $ nomad push # publish local changes (sessions, settings)
101
120
  ```
102
121
 
122
+ Pull before you push whenever both machines may have changed. Sync is last-write-wins, so pushing
123
+ stale local state over newer remote state silently overwrites it. The
124
+ [FAQ](https://funkadelic.github.io/claude-nomad/faq/) covers the full push/pull order when both
125
+ sides have changed.
126
+
127
+ ### Make your sessions follow you
128
+
129
+ Session history only syncs for projects you list in `path-map.json`, and a fresh `init` starts with
130
+ none, so no sessions sync until you add a mapping. Each entry maps a logical project name to the
131
+ absolute path it lives at on each host:
132
+
133
+ ```json
134
+ {
135
+ "projects": {
136
+ "my-app": {
137
+ "laptop": "/Users/you/code/my-app",
138
+ "desktop": "/home/you/projects/my-app"
139
+ }
140
+ }
141
+ }
142
+ ```
143
+
144
+ The host keys (`laptop`, `desktop`) are the same labels you set in `NOMAD_HOST` on each machine.
145
+ After editing `path-map.json`, `nomad push` publishes the matching sessions and `nomad pull` on
146
+ another host copies them into place, rewriting the embedded file paths so `claude --resume` finds
147
+ them at that host's path.
148
+
149
+ ### Changing settings
150
+
151
+ There are two ways a settings change reaches the repo, and the right one depends on where you made
152
+ it:
153
+
154
+ - **You are deciding the change:** edit `shared/settings.base.json` (shared by every host) or
155
+ `hosts/<HOST>.json` (one machine only) in the repo, then `nomad push`.
156
+ - **Something else already wrote it** (Claude Code or a tool added keys to your live
157
+ `~/.claude/settings.json`): run `nomad capture-settings` to promote those keys into the repo
158
+ before the next `nomad pull` overwrites them. Add `--host` to land machine-specific values (such
159
+ as absolute paths) in `hosts/<HOST>.json` instead of the shared base.
160
+
103
161
  During `nomad push` and `nomad pull`, long-running steps (rebase, secret scan, git push, session
104
162
  sync) show an animated progress indicator on an interactive terminal so the CLI does not look hung.
105
163
  In CI and when output is piped, only plain text lines are printed, with no ANSI control codes, so
@@ -166,7 +224,10 @@ but requires nomad `>= 0.35.0` because it calls recent subcommands (`nomad diff`
166
224
  - `gh` ([GitHub CLI](https://cli.github.com/)), required by `nomad init`
167
225
 
168
226
  **Optional:** [curl](https://curl.se/) or [wget](https://www.gnu.org/software/wget/) for the
169
- version-staleness check and `nomad doctor --check-schema`. The CLI works without them.
227
+ version-staleness check and `nomad doctor --check-schema`. The CLI works without them. The opt-in
228
+ `nomad doctor --check-remote` flag reads the locally-cached `origin/main` remote-tracking ref (no
229
+ curl or wget needed) and verifies that `shared/` and a valid `path-map.json` are present there; it
230
+ skips with a `⚠︎` when the ref is unavailable, and is non-fatal in all cases.
170
231
 
171
232
  ## Learn more
172
233