claude-nomad 0.20.0 → 0.21.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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.21.0](https://github.com/funkadelic/claude-nomad/compare/v0.20.0...v0.21.0) (2026-05-22)
4
+
5
+
6
+ ### Added
7
+
8
+ * **config:** add settings.local.json to NEVER_SYNC ([#100](https://github.com/funkadelic/claude-nomad/issues/100)) ([26c7dc1](https://github.com/funkadelic/claude-nomad/commit/26c7dc1ef15206056349d117395cd22a4ee5bd84))
9
+
10
+
11
+ ### Changed
12
+
13
+ * **utils:** drop unused writeJson helper ([#101](https://github.com/funkadelic/claude-nomad/issues/101)) ([168a9d7](https://github.com/funkadelic/claude-nomad/commit/168a9d7a582e3cd8ff97e26ac32c9ee4adad1a0d))
14
+
3
15
  ## [0.20.0](https://github.com/funkadelic/claude-nomad/compare/v0.19.0...v0.20.0) (2026-05-22)
4
16
 
5
17
 
package/README.md CHANGED
@@ -113,7 +113,7 @@ By default the CLI operates on `~/claude-nomad/` (see `REPO_HOME` in `src/config
113
113
  │ ├── commands/
114
114
  │ ├── rules/
115
115
  │ ├── my-statusline.cjs # any script you want symlinked into ~/.claude/
116
- │ ├── .gitignore # defense-in-depth: blocks .claude.json, *.token, *.key, .env
116
+ │ ├── .gitignore # defense-in-depth: blocks .claude.json, settings.local.json, *.token, *.key, .env
117
117
  │ └── projects/ # session transcripts under logical names
118
118
  ├── hosts/
119
119
  │ ├── <your-mac>.json # patches merged over settings.base.json
@@ -125,13 +125,13 @@ By default the CLI operates on `~/claude-nomad/` (see `REPO_HOME` in `src/config
125
125
 
126
126
  ## What gets synced vs. not
127
127
 
128
- | Category | Items | Behavior |
129
- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
130
- | **Synced** | `CLAUDE.md`, `agents/`, `skills/`, `commands/`, `rules/`, `my-statusline.cjs` | Symlinked into `~/.claude/` from `shared/` (see `SHARED_LINKS` in `src/config.ts`). |
131
- | **Generated** | `settings.json` | Deep-merge of `settings.base.json` with `hosts/<hostname>.json`. Rewritten on every pull. |
132
- | **Remapped** | `projects/` session transcripts | Copied with path translation per `path-map.json`. |
133
- | **Never synced** | `~/.claude.json` (OAuth, MCP state), `history.jsonl`, `stats-cache.json`, `todos/`, `shell-snapshots/`, `debug/`, `file-history/`, `plans/`, `session-env/`, `statsig/`, `telemetry/`, `ide/` | Per-host ephemeral state. |
134
- | **Auto-rehydrated** | `~/.claude/plugins/cache/<plugin>/...` | Plugin payloads not synced. Claude Code re-downloads them on first use from the `enabledPlugins` list in the regenerated `settings.json`; no manual `claude plugins install ...` per host. |
128
+ | Category | Items | Behavior |
129
+ | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
130
+ | **Synced** | `CLAUDE.md`, `agents/`, `skills/`, `commands/`, `rules/`, `my-statusline.cjs` | Symlinked into `~/.claude/` from `shared/` (see `SHARED_LINKS` in `src/config.ts`). |
131
+ | **Generated** | `settings.json` | Deep-merge of `settings.base.json` with `hosts/<hostname>.json`. Rewritten on every pull. |
132
+ | **Remapped** | `projects/` session transcripts | Copied with path translation per `path-map.json`. |
133
+ | **Never synced** | `~/.claude.json` (OAuth, MCP state), `history.jsonl`, `settings.local.json` (per-host overrides), `stats-cache.json`, `todos/`, `shell-snapshots/`, `debug/`, `file-history/`, `plans/`, `session-env/`, `statsig/`, `telemetry/`, `ide/` | Per-host ephemeral state. |
134
+ | **Auto-rehydrated** | `~/.claude/plugins/cache/<plugin>/...` | Plugin payloads not synced. Claude Code re-downloads them on first use from the `enabledPlugins` list in the regenerated `settings.json`; no manual `claude plugins install ...` per host. |
135
135
 
136
136
  > [!NOTE]
137
137
  > Plugins that depend on host-specific state (external binaries, API keys in env, MCP server URLs) still need that side set up on each host. Put them in `hosts/<host>.json` or the plugin's own per-host config.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-nomad",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "type": "module",
5
5
  "description": "Sync Claude Code config (~/.claude/) across machines via a private Git repo, with path remapping and per-host settings overrides.",
6
6
  "keywords": [
package/shared/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .env
4
4
  .env.*
5
5
  .claude.json
6
+ settings.local.json
6
7
  *.pem
7
8
  id_rsa
8
9
  id_ed25519
package/src/config.ts CHANGED
@@ -65,6 +65,7 @@ export const SHARED_LINKS = [
65
65
  export const NEVER_SYNC = new Set([
66
66
  '.claude.json',
67
67
  'history.jsonl',
68
+ 'settings.local.json',
68
69
  'stats-cache.json',
69
70
  'todos',
70
71
  'shell-snapshots',
package/src/utils.ts CHANGED
@@ -117,11 +117,6 @@ export function readJson<T>(path: string): T {
117
117
  return data as T;
118
118
  }
119
119
 
120
- /** Write `data` as pretty-printed JSON (2-space indent, trailing newline). Non-atomic. */
121
- export function writeJson(path: string, data: unknown): void {
122
- writeFileSync(path, JSON.stringify(data, null, 2) + '\n');
123
- }
124
-
125
120
  /**
126
121
  * Atomic write: temp + fsync + rename + parent-dir fsync. Survives
127
122
  * interrupted pulls. Preserves the destination file's existing mode when it