ccprofiles-core 0.7.2 → 0.7.3

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 (2) hide show
  1. package/dist/apply.js +20 -2
  2. package/package.json +1 -1
package/dist/apply.js CHANGED
@@ -11,8 +11,26 @@ function configPathFor(dir, home, agent) {
11
11
  return join(dir, 'config.toml');
12
12
  return dir === join(home, '.claude') ? join(home, '.claude.json') : join(dir, '.claude.json');
13
13
  }
14
- function sortKeys(o) {
15
- return Object.fromEntries(Object.entries(o).sort(([a], [b]) => a.localeCompare(b)));
14
+ /**
15
+ * Deep, order-insensitive normalization for drift comparison. Plain-object keys are sorted
16
+ * recursively at every depth (array element order is preserved — arrays like `args` are
17
+ * order-significant). Without recursing into nested objects, two semantically identical
18
+ * server defs could compare unequal purely from key-insertion order — which genuinely
19
+ * happens: Zod's `.passthrough()` always places schema-declared keys before passthrough
20
+ * (unknown) keys in its output, e.g. Codex's `startup_timeout_sec` (not in McpServerSchema)
21
+ * ends up after `env` once a manifest round-trips through the schema, while the live
22
+ * TOML file has it before `env` in source order — a manifest reload would otherwise never
23
+ * converge to "in sync" for any Codex server combining an `env` table with a vendor field.
24
+ */
25
+ function sortKeys(value) {
26
+ if (Array.isArray(value))
27
+ return value.map(sortKeys);
28
+ if (value && typeof value === 'object') {
29
+ return Object.fromEntries(Object.entries(value)
30
+ .map(([k, v]) => [k, sortKeys(v)])
31
+ .sort(([a], [b]) => a.localeCompare(b)));
32
+ }
33
+ return value;
16
34
  }
17
35
  const SECRET_PREFIX = 'secret://';
18
36
  // exported so adopt.ts (buildManifest) can recognize pooled session-dir symlinks with the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccprofiles-core",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Core library for ccprofiles — discovery, manifest, secrets, apply, and LAN sync for Claude Code multi-account setups",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",