@dsh-cc/settings-cascade 0.5.0 → 0.6.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/README.md CHANGED
@@ -30,8 +30,9 @@ Defaulting is one explicit `resolveSpec(config)` step.
30
30
  - **Flag settings merge file-then-inline.** If both a `--settings` file and inline content are present, the inline content merges over the file within the flag layer.
31
31
  - **Misconfiguration fails loud.** A present-but-invalid settings document (unparsable JSON, or a non-object root) fails plugin load; an absent source file contributes nothing and is not an error.
32
32
  - **The provider is writable through the user layer.** `writable` is `true`, so the seam's in-process `update()`/`replace()`/`mutate()` paths are accepted. A write is applied as a surgical delta onto the user-layer settings file (default `$DSH_HOME/settings.json`): only the keys the caller actually changed land in the user file. Values the write did not touch are not copied in, even if they were inherited from a higher layer. The seam still owns validation, revision, and update events; project/local/flag/policy sources remain read-side-only contributors.
33
- - **The local settings file path hoists git-style.** When the launch directory is a git worktree or a subdirectory of a git repo, `.claude/settings.local.json` is read from the git **main checkout root** (worktree) or **toplevel** (subdirectory start), matching Claude Code. Project `settings.json` stays at the launch directory, the session cwd and git operations are unaffected, and paths *inside* the file still resolve against the launch directory. Fallbacks that keep the file at the launch directory: not a git repo, Windows (`win32`), the repo root is `$HOME`, a bare-main hoist target without `.git`, a git probe failure, or ownership of the repo root / `.git` / `.claude` not confirmed as the current user (fail-closed). A worktree-local `settings.local.json` is silently not loaded (merging both is unconfirmed in Claude Code). No hot-reload: entering a worktree mid-session does not re-resolve.
33
+ - **The local settings file path hoists git-style.** When the launch directory is a git worktree or a subdirectory of a git repo, `.claude/settings.local.json` is read from the git **main checkout root** (worktree) or **toplevel** (subdirectory start), matching Claude Code. Project `settings.json` stays at the launch directory, the session cwd and git operations are unaffected, and paths *inside* the file still resolve against the launch directory. Fallbacks that keep the file at the launch directory: not a git repo, Windows (`win32`), the repo root is `$HOME`, a bare-main hoist target without `.git`, a git probe failure, or ownership of the repo root / `.git` / `.claude` not confirmed as the current user (fail-closed). A worktree-local `settings.local.json` is silently not loaded (merging both is unconfirmed in Claude Code). The hoist resolution itself is boot-time only: entering a worktree mid-session does not re-resolve the local path (file contents still hot-reload — see below).
34
34
  - **CC camelCase keys alias onto kebab namespaces.** After the five-layer merge (and before publish), a fixed whitelist of Claude Code camelCase top-level keys (`statusLine` → `statusline`) is copied onto its dsh-native kebab namespace. The alias is injected only when the CC key's value is a plain object AND the kebab key is absent from the merged document — a dsh-native key already present wins untouched, and non-object CC values are ignored. No fuzzy matching: the whitelist map is the contract; unknown camelCase keys are never aliased.
35
+ - **File sources hot-reload in a running session.** The provider watches the resolved settings file paths — user, project, the git-hoisted local file, the `--settings` flag file, and file-based managed-policy paths — with chokidar, and republishes through the `SettingsProvider` seam, so every registered consumer (permission rules, model aliases, statusline, output styles, plugin loader) re-resolves live; editing `permissions` mid-session takes effect on the very next `decide()`. Watched paths are realpath-canonicalized (symlink-swap updates are caught), not-yet-existent paths are still watched so file creation after boot works, and rapid writes coalesce. A malformed mid-write document keeps the last-good state with a warning and recovers on the fix. Outside hot-reload: inline flag settings, remote policy, `hooks.json` (a separate seam in the hooks bridge), and the boot-time git-hoist probe above.
35
36
  - **`env` applies in two stages.** A top-level `env` section is split out of the merged document and exposed through `getEnv()` with every value coerced to a string. `applyEnv()` assigns ordinary variables; `applyTrustedEnv()` additionally assigns environment-altering variables (`LD_PRELOAD`, `PATH`, `DYLD_INSERT_LIBRARIES`, and the other `DANGEROUS_ENV_VARS`) and runs only after the user grants trust.
36
37
 
37
38
  ## Permissions schema
@@ -52,6 +53,5 @@ No direct invalidation; the consuming plugin owns any request-prefix changes.
52
53
  - **Unsetting an inherited key is not persisted.** Unsetting a key that comes from a lower-priority source (project/local/flag/policy) cannot be persisted to the user file; the unset holds for the running process, but the value reappears on restart. Also, `describe()`'s `user` field reflects the merged section rather than the literal user file, so GUI override markers are approximate (pre-existing behavior).
53
54
  - **Concurrent writers can lose updates.** Concurrent writes from multiple dsh processes to the same user settings file can silently lose updates — atomic rename prevents file corruption, not lost writes; the stock provider's cross-process lock was dropped for this port. Single-process profiles (the norm) are unaffected.
54
55
  - **Writes go to the user layer, not the hoisted local file.** `persist()` writes to the user settings file (pre-existing); an always-allow granted in a worktree therefore still does not update the main checkout's `settings.local.json`.
55
- - **No file hot-reload.** External edits to any source file take effect only on restart (pre-existing).
56
56
  - **No per-source provenance.** The merged result does not record which source supplied each resolved value, and `describe()` cannot mark a field's origin across the five layers the way a single user layer does.
57
57
  - **Dangerous env is a static allowlist.** `DANGEROUS_ENV_VARS` names a fixed set; deployment-specific variables need an explicit extension point before first use.
package/README.zh.md CHANGED
@@ -30,7 +30,8 @@
30
30
  - **flag 设置先文件后内联。** 若同时存在 `--settings` 文件与内联内容,内联内容在 flag 层内部覆盖文件。
31
31
  - **坏配置加载期明确报错。** 存在但非法的设置文档(不可解析的 JSON,或非对象根)使插件加载失败;来源文件缺失不算错误,不贡献任何内容。
32
32
  - **提供方经用户层可写。** `writable` 为 `true`,seam 的进程内 `update()`/`replace()`/`mutate()` 路径被接受。写入以 surgical delta(外科手术式增量)应用到用户层设置文件(默认 `$DSH_HOME/settings.json`):只有调用方实际改动的键才落入用户文件。写入未触及的值——即使源自更高层——也不会被带进来。校验、修订号与更新事件仍由 seam 负责;project/local/flag/policy 来源仍是只读侧贡献者。
33
- - **本地设置文件路径按 git 语义上提。** 启动目录位于 git worktree 或 git 仓库子目录时,`.claude/settings.local.json` 改从 git **主检出根**(worktree)或**顶层目录**(子目录启动)读取,与 Claude Code 一致。项目 `settings.json` 仍留在启动目录,会话 cwd 与 git 操作不受影响,文件内部的路径仍相对启动目录解析。以下情形回退到启动目录本身:非 git 仓库、Windows(`win32`)、仓库根为 `$HOME`、上提目标缺少 `.git` 的裸主仓库、git 探测失败,或仓库根 / `.git` / `.claude` 的属主未确认为当前用户(fail-closed)。worktree 本地的 `settings.local.json` 不会被读取(两者合并的行为在 Claude Code 中未确认)。无热重载:会话中途进入 worktree 不会重新解析。
33
+ - **本地设置文件路径按 git 语义上提。** 启动目录位于 git worktree 或 git 仓库子目录时,`.claude/settings.local.json` 改从 git **主检出根**(worktree)或**顶层目录**(子目录启动)读取,与 Claude Code 一致。项目 `settings.json` 仍留在启动目录,会话 cwd 与 git 操作不受影响,文件内部的路径仍相对启动目录解析。以下情形回退到启动目录本身:非 git 仓库、Windows(`win32`)、仓库根为 `$HOME`、上提目标缺少 `.git` 的裸主仓库、git 探测失败,或仓库根 / `.git` / `.claude` 的属主未确认为当前用户(fail-closed)。worktree 本地的 `settings.local.json` 不会被读取(两者合并的行为在 Claude Code 中未确认)。上提解析本身仅在启动时进行:会话中途进入 worktree 不会重新解析本地路径(文件内容仍会热重载——见下)。
34
+ - **文件来源在运行中的会话里热重载。** 提供方用 chokidar 监听已解析的设置文件路径——user、project、git 上提的本地文件、`--settings` flag 文件、以及基于文件的 managed-policy 路径——并经由 `SettingsProvider` seam 重新发布,因此每个注册消费方(permission rules、model aliases、statusline、output styles、plugin loader)都实时重新解析;会话中途编辑 `permissions` 在下一次 `decide()` 即生效。监听路径经 realpath 规范化(符号链接替换式的更新也能捕获),尚不存在的路径同样被监听(启动后创建的文件照样生效),快速连续写入会被合并。写入中途产生的非法文档保留 last-good 状态并告警,修复后自动恢复。不属于热重载范围的:内联 flag 设置、远程 policy、`hooks.json`(走 hooks bridge 的独立 seam)、以及上文所述启动时一次性完成的 git 上提解析。
34
35
  - **`env` 分两阶段应用。** 顶层 `env` 分节从合并文档中拆出,经 `getEnv()` 暴露,所有值已强制转为字符串。`applyEnv()` 赋值普通变量;`applyTrustedEnv()` 另赋值改变环境的变量(`LD_PRELOAD`、`PATH`、`DYLD_INSERT_LIBRARIES` 及其余 `DANGEROUS_ENV_VARS`),仅在用户授予信任后运行。
35
36
 
36
37
  ## 权限 schema
@@ -51,6 +52,5 @@
51
52
  - **取消继承键不落盘。** 取消一个来自更低优先级来源(project/local/flag/policy)的键无法写入用户文件;该取消对运行中的进程生效,但重启后该值重现。此外,`describe()` 的 `user` 字段反映合并段而非用户文件实含量,因此 GUI 的 override 标记为近似(既有行为)。
52
53
  - **并发写入可能丢更新。** 多个 dsh 进程并发写同一个用户设置文件可能静默丢失更新——原子 rename 只防文件损坏、不防丢写;原生提供方的跨进程锁已在本移植中移除。单进程配置(通常情况)不受影响。
53
54
  - **写入仍走用户层,而非上提后的本地文件。** `persist()` 写入用户设置文件(既有行为);因此在 worktree 中授予的 always-allow 仍不会更新主检出的 `settings.local.json`。
54
- - **无文件热重载。** 任何来源文件的外部编辑均在重启后才生效(既有)。
55
55
  - **无逐来源出处。** 合并结果不记录每个解析值来自哪个来源,`describe()` 也无法像单一用户层那样标注字段在五层之间的出处。
56
56
  - **危险环境变量是静态白名单。** `DANGEROUS_ENV_VARS` 命名固定集合;部署专属变量在首次使用前需要显式的扩展点。
package/lib/index.d.ts CHANGED
@@ -53,6 +53,13 @@ export interface Config {
53
53
  flagSettingsInline?: unknown;
54
54
  /** Policy sub-sources; the first non-empty one wins. */
55
55
  policy?: CascadePolicyConfig;
56
+ /** Watcher write-settle tuning (chokidar `awaitWriteFinish`); defaults 100/10. */
57
+ watch?: {
58
+ /** How long a file must stay unchanged before its event fires. */
59
+ stabilityThresholdMs?: number;
60
+ /** How often a settling file is polled for further changes. */
61
+ pollIntervalMs?: number;
62
+ };
56
63
  }
57
64
  /** Fully resolved provider parameters; defaulting happens here, never inline. */
58
65
  export interface ResolvedSpec {
@@ -95,6 +102,8 @@ export declare function resolveSpec(config: Config, deps?: LocalRootDeps): Resol
95
102
  export declare class SettingsCascadeProvider extends SettingsProvider {
96
103
  static Config: z<Config>;
97
104
  private readonly spec;
105
+ /** Resolved watcher write-settle tuning (defaults mirror the file provider). */
106
+ private readonly watch;
98
107
  /** The top-level `env` section split out of the merged document, string-valued. */
99
108
  private env;
100
109
  /**
@@ -144,6 +153,8 @@ export declare class SettingsCascadeProvider extends SettingsProvider {
144
153
  * @param section - the complete merged user section to store.
145
154
  */
146
155
  protected persist(ns: SettingsNamespace, section: Record<string, unknown>): Promise<void>;
156
+ /** Resolves when every queued reload/persist has settled (never rejects). */
157
+ settled(): Promise<void>;
147
158
  /** Queue one exclusive document operation behind every earlier one. */
148
159
  private enqueue;
149
160
  /** Queue a reload; a failed reload keeps the last-good document and stays only a warning. */
@@ -152,13 +163,13 @@ export declare class SettingsCascadeProvider extends SettingsProvider {
152
163
  * Persist one namespace with optimistic concurrency: the user-file bytes
153
164
  * are re-read immediately before the atomic rename, and when an external
154
165
  * writer changed them since the read the op built on, the whole round
155
- * restarts from a fresh read (bounded, then loud). The shadow still moves
156
- * only after the write has durably succeeded.
166
+ * restarts from a fresh read (bounded, then loud). The diff base is the
167
+ * caller-frozen snapshot of the shadow at capture time (a queued reload may
168
+ * have reset the live shadow in between). The shadow still moves only after
169
+ * the write has durably succeeded.
157
170
  */
158
171
  private persistSection;
159
- /** Raw user-file text, or `undefined` when the file is absent. */
160
- private readUserText;
161
- /** Every concrete settings FILE path worth watching, canonicalized and deduped. */
172
+ /** Every concrete settings FILE path worth watching (see {@link resolveWatchPaths}). */
162
173
  private watchPaths;
163
174
  [Service.init](): AsyncGenerator<() => Promise<void> | void, void, void>;
164
175
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -13,15 +13,15 @@
13
13
  */
14
14
  import { Service } from '@deepseek-ai/cordis';
15
15
  import z from '@deepseek-ai/schemastery';
16
- import { watch as chokidarWatch } from 'chokidar';
17
16
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
18
17
  import { dirname, join, resolve } from 'node:path';
19
- import { canonicalizeWatchPath, resolveDshHome } from '@deepseek-ai/dsh-home-paths';
18
+ import { resolveDshHome } from '@deepseek-ai/dsh-home-paths';
20
19
  import { SettingsProvider } from '@deepseek-ai/dsh-settings';
21
20
  import { resolveLocalSettingsDir } from "./local-root.js";
22
21
  import { mergeSettingsSection } from "./merge.js";
23
22
  import { coerceEnv } from "./env.js";
24
- import { applyOpsToSection, diffSections, writeJsonAtomic } from "./persist.js";
23
+ import { applyOpsToSection, diffSections, readUserText, writeJsonAtomic } from "./persist.js";
24
+ import { resolveWatchPaths, resolveWatchTuning, startWatchers } from "./watcher.js";
25
25
  import { applyCcKeyAliases } from "./cc-key-aliases.js";
26
26
  export { applyCcKeyAliases, CC_KEY_ALIASES } from "./cc-key-aliases.js";
27
27
  export { resolveLocalSettingsDir } from "./local-root.js";
@@ -53,8 +53,6 @@ function isAccessDenied(error) {
53
53
  const code = error?.code;
54
54
  return code === 'EACCES' || code === 'EPERM';
55
55
  }
56
- /** Watcher write-settle window in milliseconds (mirrors the harness file provider's default). */
57
- const DEBOUNCE_MS = 100;
58
56
  /** Optimistic-retry bound for persist: how many read-check-write rounds before failing loud. */
59
57
  const MAX_PERSIST_ATTEMPTS = 5;
60
58
  /**
@@ -112,8 +110,14 @@ export class SettingsCascadeProvider extends SettingsProvider {
112
110
  systemPath: z.string(),
113
111
  userPath: z.string(),
114
112
  }),
113
+ watch: z.object({
114
+ stabilityThresholdMs: z.number(),
115
+ pollIntervalMs: z.number(),
116
+ }),
115
117
  });
116
118
  spec;
119
+ /** Resolved watcher write-settle tuning (defaults mirror the file provider). */
120
+ watch;
117
121
  /** The top-level `env` section split out of the merged document, string-valued. */
118
122
  env = {};
119
123
  /**
@@ -143,6 +147,7 @@ export class SettingsCascadeProvider extends SettingsProvider {
143
147
  // Programmatic construction may bypass Schemastery normalization; resolve
144
148
  // the same defaults in one explicit step either way.
145
149
  this.spec = resolveSpec(config);
150
+ this.watch = resolveWatchTuning(config.watch);
146
151
  }
147
152
  /** The cascade is now writable; writes edit the user layer. */
148
153
  get writable() {
@@ -186,10 +191,24 @@ export class SettingsCascadeProvider extends SettingsProvider {
186
191
  * @param section - the complete merged user section to store.
187
192
  */
188
193
  async persist(ns, section) {
194
+ // Freeze the diff base NOW, at capture time: a watcher reload queued
195
+ // ahead of this persist may reset the live shadow before the queued
196
+ // persistSection executes, and diffing against the reset shadow would
197
+ // re-emit keys the harness's document already had. The clone is taken
198
+ // synchronously, before the operation is enqueued.
199
+ // Freeze the diff base NOW, at capture time: a queued reload may reset the
200
+ // live shadow before the queued persistSection executes, and diffing the
201
+ // reset shadow would re-emit keys the document already had.
202
+ const current = this.shadow[ns];
203
+ const base = structuredClone(isPlainObject(current) ? current : {});
189
204
  // Serialize with watcher-triggered reloads on the one operation chain, and
190
205
  // retry optimistically when an external edit lands between the read and
191
206
  // the atomic rename.
192
- return this.enqueue(() => this.persistSection(ns, section));
207
+ return this.enqueue(() => this.persistSection(ns, base, section));
208
+ }
209
+ /** Resolves when every queued reload/persist has settled (never rejects). */
210
+ settled() {
211
+ return this.operations;
193
212
  }
194
213
  /** Queue one exclusive document operation behind every earlier one. */
195
214
  enqueue(operation) {
@@ -223,23 +242,25 @@ export class SettingsCascadeProvider extends SettingsProvider {
223
242
  * Persist one namespace with optimistic concurrency: the user-file bytes
224
243
  * are re-read immediately before the atomic rename, and when an external
225
244
  * writer changed them since the read the op built on, the whole round
226
- * restarts from a fresh read (bounded, then loud). The shadow still moves
227
- * only after the write has durably succeeded.
245
+ * restarts from a fresh read (bounded, then loud). The diff base is the
246
+ * caller-frozen snapshot of the shadow at capture time (a queued reload may
247
+ * have reset the live shadow in between). The shadow still moves only after
248
+ * the write has durably succeeded.
228
249
  */
229
- async persistSection(ns, section) {
250
+ async persistSection(ns, base, section) {
230
251
  const path = this.documentPath;
231
252
  let lastError;
232
253
  for (let attempt = 0; attempt < MAX_PERSIST_ATTEMPTS; attempt++) {
233
- const ops = diffSections(this.shadow[ns] ?? {}, section);
254
+ const ops = diffSections(base, section);
234
255
  if (ops.length === 0) {
235
256
  this.shadow[ns] = structuredClone(section);
236
257
  return;
237
258
  }
238
- const before = await this.readUserText(path);
259
+ const before = await readUserText(path);
239
260
  const root = before === undefined || before.trim().length === 0 ? {} : this.parse(path, before);
240
261
  const next = applyOpsToSection(root[ns], ops);
241
262
  const updated = { ...root, [ns]: next };
242
- if ((await this.readUserText(path)) !== before) {
263
+ if ((await readUserText(path)) !== before) {
243
264
  lastError = new Error(`settings-cascade: user settings file at ${path} changed concurrently during persist`);
244
265
  continue;
245
266
  }
@@ -249,61 +270,38 @@ export class SettingsCascadeProvider extends SettingsProvider {
249
270
  }
250
271
  throw lastError ?? new Error(`settings-cascade: persist at ${path} exhausted ${MAX_PERSIST_ATTEMPTS} optimistic-retry attempts`);
251
272
  }
252
- /** Raw user-file text, or `undefined` when the file is absent. */
253
- async readUserText(path) {
254
- try {
255
- return await readFile(path, 'utf8');
256
- }
257
- catch (error) {
258
- if (isENOENT(error))
259
- return undefined;
260
- throw error;
261
- }
262
- }
263
- /** Every concrete settings FILE path worth watching, canonicalized and deduped. */
264
- async watchPaths() {
265
- const paths = [
273
+ /** Every concrete settings FILE path worth watching (see {@link resolveWatchPaths}). */
274
+ watchPaths() {
275
+ return resolveWatchPaths([
266
276
  this.spec.sources.userSettings,
267
277
  this.spec.sources.projectSettings,
268
278
  this.spec.sources.localSettings,
269
279
  this.spec.sources.flagSettings,
270
280
  this.spec.policy.systemPath,
271
281
  this.spec.policy.userPath,
272
- ].filter((path) => path !== undefined);
273
- const canonical = await Promise.all(paths.map(path => canonicalizeWatchPath(path)));
274
- return [...new Set(canonical)];
282
+ ]);
275
283
  }
276
284
  async *[Service.init]() {
277
285
  // The base init loads and publishes the merged document; a parse failure
278
286
  // there is a boot failure and stays loud.
279
287
  yield* super[Service.init]();
280
- const watcher = chokidarWatch(await this.watchPaths(), {
281
- ignoreInitial: true,
282
- awaitWriteFinish: {
283
- stabilityThreshold: DEBOUNCE_MS,
284
- pollInterval: Math.max(1, Math.min(DEBOUNCE_MS, 10)),
285
- },
286
- });
287
- watcher.on('all', () => {
288
- if (this.isClosed())
289
- return;
290
- this.queueRefresh();
291
- });
292
- watcher.on('ready', () => {
293
- // The base init's load raced the watcher's own setup: a change written
294
- // between that read and the watcher becoming active never fires an
295
- // event. One reconcile at ready closes the gap.
288
+ const refresh = () => {
296
289
  if (this.isClosed())
297
290
  return;
298
291
  this.queueRefresh();
299
- });
300
- watcher.on('error', (error) => {
301
- this.ctx.logger.warn('settings-cascade: watcher error');
302
- this.ctx.logger.warn(error);
292
+ };
293
+ const closeWatchers = startWatchers({
294
+ paths: await this.watchPaths(),
295
+ tuning: this.watch,
296
+ refresh,
297
+ onError: (error) => {
298
+ this.ctx.logger.warn('settings-cascade: watcher error');
299
+ this.ctx.logger.warn(error);
300
+ },
303
301
  });
304
302
  yield async () => {
305
303
  this.closed = true;
306
- await watcher.close();
304
+ await closeWatchers();
307
305
  await this.operations;
308
306
  };
309
307
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/persist.d.ts CHANGED
@@ -50,6 +50,8 @@ export declare function applyOpsToSection(section: unknown, ops: JsonOp[]): unkn
50
50
  * @param path - the absolute settings file path.
51
51
  * @returns the parsed root document, or `{}` when the file is absent or blank.
52
52
  */
53
+ /** Raw user-file text, or `undefined` when the file is absent. */
54
+ export declare function readUserText(path: string): Promise<string | undefined>;
53
55
  export declare function readUserFile(path: string): Promise<Record<string, unknown>>;
54
56
  /**
55
57
  * Write a JSON root document atomically. The parent directory is created with
@@ -1 +1 @@
1
- {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,8EAA8E;AAC9E,MAAM,MAAM,MAAM,GACd;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAqBnC;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAmBxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAM1E;AA2CD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmBjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhG"}
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,8EAA8E;AAC9E,MAAM,MAAM,MAAM,GACd;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAqBnC;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAmBxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAM1E;AA2CD;;;;;;GAMG;AACH,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO5E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAmBjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhG"}
package/lib/persist.js CHANGED
@@ -135,6 +135,17 @@ function isENOENT(error) {
135
135
  * @param path - the absolute settings file path.
136
136
  * @returns the parsed root document, or `{}` when the file is absent or blank.
137
137
  */
138
+ /** Raw user-file text, or `undefined` when the file is absent. */
139
+ export async function readUserText(path) {
140
+ try {
141
+ return await readFile(path, 'utf8');
142
+ }
143
+ catch (error) {
144
+ if (isENOENT(error))
145
+ return undefined;
146
+ throw error;
147
+ }
148
+ }
138
149
  export async function readUserFile(path) {
139
150
  let text;
140
151
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../src/persist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Watcher wiring for the settings cascade: chokidar setup over the concrete
3
+ * settings files and their parent directories, the write-settle
4
+ * (`awaitWriteFinish`) tuning resolution, and the dispose closer. Kept apart
5
+ * from the provider so the provider file stays on its seam (merge + persist)
6
+ * and the watcher mechanics stay testable in isolation.
7
+ * @module @dsh-cc/settings-cascade/watcher
8
+ */
9
+ /** Watcher write-settle tuning (chokidar `awaitWriteFinish`). */
10
+ export interface WatchTuning {
11
+ /** How long a file must stay unchanged before its event fires. */
12
+ stabilityThresholdMs: number;
13
+ /** How often a settling file is polled for further changes. */
14
+ pollIntervalMs: number;
15
+ }
16
+ /** Resolve the watch tuning from plugin config; defaults (100/10) mirror the file provider. */
17
+ export declare function resolveWatchTuning(config?: {
18
+ stabilityThresholdMs?: number;
19
+ pollIntervalMs?: number;
20
+ }): WatchTuning;
21
+ /**
22
+ * Every concrete settings FILE path worth watching, canonicalized and
23
+ * deduped. The result also carries each file's parent directory: chokidar
24
+ * v4 emits nothing for a watched path whose parent directory does not yet
25
+ * exist, so a settings file created after boot (e.g. the project
26
+ * `.claude/settings.json`) is only seen through its directory watch.
27
+ */
28
+ export declare function resolveWatchPaths(paths: ReadonlyArray<string | undefined>): Promise<{
29
+ files: string[];
30
+ dirs: string[];
31
+ }>;
32
+ /** Options for {@link startWatchers}. */
33
+ export interface WatchersOptions {
34
+ /** Files and parent dirs to watch (from {@link resolveWatchPaths}). */
35
+ paths: {
36
+ files: string[];
37
+ dirs: string[];
38
+ };
39
+ /** Resolved write-settle tuning. */
40
+ tuning: WatchTuning;
41
+ /** Called on every settled watcher event (and once at ready). */
42
+ refresh: () => void;
43
+ /** Called with non-fatal watcher errors. */
44
+ onError: (error: unknown) => void;
45
+ }
46
+ /**
47
+ * Watch the settings files and their parent directories; returns the closer.
48
+ * Both watchers share one `awaitWriteFinish` window: writeJsonAtomic commits
49
+ * via rename, so the dir-derived events must settle the same window as the
50
+ * file events or renames bypass the debounce entirely.
51
+ */
52
+ export declare function startWatchers(options: WatchersOptions): () => Promise<void>;
53
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,oBAAoB,EAAE,MAAM,CAAA;IAC5B,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAA;CACvB;AAKD,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAChC,MAAM,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,WAAW,CAKb;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,GACvC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAO9C;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC1C,oCAAoC;IACpC,MAAM,EAAE,WAAW,CAAA;IACnB,iEAAiE;IACjE,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,4CAA4C;IAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CA2B3E"}
package/lib/watcher.js ADDED
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Watcher wiring for the settings cascade: chokidar setup over the concrete
3
+ * settings files and their parent directories, the write-settle
4
+ * (`awaitWriteFinish`) tuning resolution, and the dispose closer. Kept apart
5
+ * from the provider so the provider file stays on its seam (merge + persist)
6
+ * and the watcher mechanics stay testable in isolation.
7
+ * @module @dsh-cc/settings-cascade/watcher
8
+ */
9
+ import { watch as chokidarWatch } from 'chokidar';
10
+ import { canonicalizeWatchPath } from '@deepseek-ai/dsh-home-paths';
11
+ import { dirname } from 'node:path';
12
+ /** Watcher write-settle window in milliseconds (mirrors the harness file provider's default). */
13
+ const DEBOUNCE_MS = 100;
14
+ /** Resolve the watch tuning from plugin config; defaults (100/10) mirror the file provider. */
15
+ export function resolveWatchTuning(config) {
16
+ return {
17
+ stabilityThresholdMs: config?.stabilityThresholdMs ?? DEBOUNCE_MS,
18
+ pollIntervalMs: config?.pollIntervalMs ?? Math.max(1, Math.min(DEBOUNCE_MS, 10)),
19
+ };
20
+ }
21
+ /**
22
+ * Every concrete settings FILE path worth watching, canonicalized and
23
+ * deduped. The result also carries each file's parent directory: chokidar
24
+ * v4 emits nothing for a watched path whose parent directory does not yet
25
+ * exist, so a settings file created after boot (e.g. the project
26
+ * `.claude/settings.json`) is only seen through its directory watch.
27
+ */
28
+ export async function resolveWatchPaths(paths) {
29
+ const concrete = paths.filter((path) => path !== undefined);
30
+ const canonical = [...new Set(await Promise.all(concrete.map(path => canonicalizeWatchPath(path))))];
31
+ return {
32
+ files: canonical,
33
+ dirs: [...new Set(canonical.map(path => dirname(path)))],
34
+ };
35
+ }
36
+ /**
37
+ * Watch the settings files and their parent directories; returns the closer.
38
+ * Both watchers share one `awaitWriteFinish` window: writeJsonAtomic commits
39
+ * via rename, so the dir-derived events must settle the same window as the
40
+ * file events or renames bypass the debounce entirely.
41
+ */
42
+ export function startWatchers(options) {
43
+ const { paths, tuning, refresh, onError } = options;
44
+ const awaitWriteFinish = {
45
+ stabilityThreshold: tuning.stabilityThresholdMs,
46
+ pollInterval: tuning.pollIntervalMs,
47
+ };
48
+ const watcher = chokidarWatch(paths.files, { ignoreInitial: true, awaitWriteFinish });
49
+ // Parent directories are watched at depth 0: a plain dir watch would
50
+ // recurse (a settings file may live directly in $HOME), which is both a
51
+ // boot-cost and a noise problem. Depth 0 still reports direct children,
52
+ // which is all the creation-after-boot case needs.
53
+ const dirWatcher = chokidarWatch(paths.dirs, { ignoreInitial: true, depth: 0, awaitWriteFinish });
54
+ for (const w of [watcher, dirWatcher]) {
55
+ w.on('all', refresh);
56
+ w.on('ready', () => {
57
+ // The base init's load raced the watcher's own setup: a change written
58
+ // between that read and the watcher becoming active never fires an
59
+ // event. One reconcile at ready closes the gap.
60
+ refresh();
61
+ });
62
+ w.on('error', (error) => {
63
+ onError(error);
64
+ });
65
+ }
66
+ return async () => {
67
+ await Promise.all([watcher.close(), dirWatcher.close()]);
68
+ };
69
+ }
70
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,iGAAiG;AACjG,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB,+FAA+F;AAC/F,MAAM,UAAU,kBAAkB,CAChC,MAAmE;IAEnE,OAAO;QACL,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,IAAI,WAAW;QACjE,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;KACjF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAwC;IAExC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IAC3E,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACzD,CAAA;AACH,CAAC;AAcD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACnD,MAAM,gBAAgB,GAAG;QACvB,kBAAkB,EAAE,MAAM,CAAC,oBAAoB;QAC/C,YAAY,EAAE,MAAM,CAAC,cAAc;KACpC,CAAA;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACrF,qEAAqE;IACrE,wEAAwE;IACxE,wEAAwE;IACxE,mDAAmD;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;IACjG,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACpB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACjB,uEAAuE;YACvE,mEAAmE;YACnE,gDAAgD;YAChD,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dsh-cc/settings-cascade",
3
3
  "description": "Claude Code-style five-level settings cascade provider (ctx.settings) for the DeepSeek Harness",
4
- "version": "0.5.0",
4
+ "version": "0.6.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/dsh-cc/dsh-cc.git",
@@ -36,11 +36,11 @@
36
36
  ],
37
37
  "license": "Apache-2.0",
38
38
  "peerDependencies": {
39
- "@deepseek-ai/dsh-home-paths": ">=0.1.1-rc.2",
40
- "@deepseek-ai/dsh-invariants": ">=0.1.1-rc.2",
41
- "@deepseek-ai/dsh-settings": ">=0.1.1-rc.2",
42
- "@deepseek-ai/cordis": ">=0.1.1-rc.2",
43
- "@deepseek-ai/schemastery": ">=0.1.1-rc.2"
39
+ "@deepseek-ai/dsh-home-paths": ">=0.1.2-rc.1",
40
+ "@deepseek-ai/dsh-invariants": ">=0.1.2-rc.1",
41
+ "@deepseek-ai/dsh-settings": ">=0.1.2-rc.1",
42
+ "@deepseek-ai/cordis": ">=0.1.2-rc.1",
43
+ "@deepseek-ai/schemastery": ">=0.1.2-rc.1"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@deepseek-ai/dsh-home-paths": "link:../../../../deepseek-harness/packages/util/home-paths",