0xray 3.4.5 → 3.4.6

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Quick reference for the 0xRay AI orchestration framework (shipped to your project on `npm install 0xray`).
4
4
 
5
- **v3.4.5** — 7 MCP servers · 45 skills · 68 codex terms · 4 platform bridges
5
+ **v3.4.6** — 7 MCP servers · 45 skills · 68 codex terms · 4 platform bridges
6
6
 
7
7
  ## Postinstall (automatic)
8
8
 
package/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # xray Agents
2
2
 
3
- Quick reference for the xray AI orchestration framework (**v3.4.5**).
3
+ Quick reference for the xray AI orchestration framework (**v3.4.6**).
4
4
 
5
5
  **42 agents** · **45 skills** · **7 consumer MCP servers** · **68 codex terms** · **3,226 tests**
6
6
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # xray — MCP-Centric AI Governance OS
2
2
 
3
- **v3.4.5** — 42 agents · 45 skills · 7 MCP servers · 68 codex terms · 3,226 tests
3
+ **v3.4.6** — 42 agents · 45 skills · 7 MCP servers · 68 codex terms · 3,226 tests
4
4
 
5
5
  xray is the pure v2 three-subsystem AI orchestration framework — **MCP-centric**, governed by Dynamo, and autonomous via thinDispatch. Consumer `npm install 0xray` auto-wires all four platform bridges and seven MCP servers with zero manual config.
6
6
 
package/SKILLS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 0xray Skills
2
2
 
3
- **v3.4.5** — **45 skills** · invoked via `xray-skills` MCP · synced on postinstall
3
+ **v3.4.6** — **45 skills** · invoked via `xray-skills` MCP · synced on postinstall
4
4
 
5
5
  xray ships 45 knowledge skills (`src/skills/<name>/SKILL.md`) across the full software lifecycle. Lead-dev operating model lives in **`orchestrator`** skill + `multi_agent_orchestration.lead_dev_mode` in features.json. Skills load on demand via the **xray-skills** MCP server (`npx -y 0xray mcp skills`), agent `@mentions`, or platform skill directories after postinstall.
6
6
 
package/dist/AGENTS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # xray Agents
2
2
 
3
- Quick reference for the xray AI orchestration framework (**v3.4.5**).
3
+ Quick reference for the xray AI orchestration framework (**v3.4.6**).
4
4
 
5
5
  **42 agents** · **45 skills** · **7 consumer MCP servers** · **68 codex terms** · **3,226 tests**
6
6
 
package/dist/CHANGELOG.md CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Conventional Commits](https://www.conventionalcommits.org/).
6
6
 
7
+ ## [3.4.6] - 2026-06-18
8
+
9
+ ### 🐛 Bug Fixes
10
+ - **Postinstall config merge** — `deployXrayConfig` deep-merges existing consumer `features.json`, `codex.json`, and `config.json` instead of overwriting on mtime; consumer opt-ins (e.g. `memory_routing`) are preserved and `features.version` bumps to the installed package
11
+
12
+ ---
13
+
7
14
  ## [3.4.5] - 2026-06-18
8
15
 
9
16
  ### ✨ Features
package/dist/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # xray — MCP-Centric AI Governance OS
2
2
 
3
- **v3.4.5** — 42 agents · 45 skills · 7 MCP servers · 68 codex terms · 3,226 tests
3
+ **v3.4.6** — 42 agents · 45 skills · 7 MCP servers · 68 codex terms · 3,226 tests
4
4
 
5
5
  xray is the pure v2 three-subsystem AI orchestration framework — **MCP-centric**, governed by Dynamo, and autonomous via thinDispatch. Consumer `npm install 0xray` auto-wires all four platform bridges and seven MCP servers with zero manual config.
6
6
 
package/dist/SKILLS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 0xray Skills
2
2
 
3
- **v3.4.5** — **45 skills** · invoked via `xray-skills` MCP · synced on postinstall
3
+ **v3.4.6** — **45 skills** · invoked via `xray-skills` MCP · synced on postinstall
4
4
 
5
5
  xray ships 45 knowledge skills (`src/skills/<name>/SKILL.md`) across the full software lifecycle. Lead-dev operating model lives in **`orchestrator`** skill + `multi_agent_orchestration.lead_dev_mode` in features.json. Skills load on demand via the **xray-skills** MCP server (`npx -y 0xray mcp skills`), agent `@mentions`, or platform skill directories after postinstall.
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xray",
3
- "version": "3.4.5",
3
+ "version": "3.4.6",
4
4
  "description": "Multi-agent orchestration and Codex governance for OpenCode, Hermes, Grok Build, and OpenClaw",
5
5
  "readme": "README.md",
6
6
  "license": "MIT",
@@ -403,6 +403,64 @@ function installOpenclawBridge(targetDir, packageRoot, log) {
403
403
 
404
404
  const XRAY_CONFIG_FILES = ["codex.json", "features.json", "features.schema.json", "config.json"];
405
405
 
406
+ /** Consumer JSON configs merge on upgrade — consumer values win; shipped fills new keys. */
407
+ const MERGE_CONFIG_FILES = new Set(["features.json", "config.json", "codex.json"]);
408
+
409
+ function readPackageVersion(packageRoot) {
410
+ try {
411
+ const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
412
+ return pkg.version || null;
413
+ } catch {
414
+ return null;
415
+ }
416
+ }
417
+
418
+ function writeJsonFile(filePath, data) {
419
+ fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`);
420
+ }
421
+
422
+ function deployXrayConfigFile(file, src, dst, packageRoot) {
423
+ if (!fs.existsSync(dst)) {
424
+ fs.copyFileSync(src, dst);
425
+ return true;
426
+ }
427
+
428
+ if (file === "features.schema.json") {
429
+ if (fs.statSync(src).mtime > fs.statSync(dst).mtime) {
430
+ fs.copyFileSync(src, dst);
431
+ return true;
432
+ }
433
+ return false;
434
+ }
435
+
436
+ if (MERGE_CONFIG_FILES.has(file)) {
437
+ try {
438
+ const shipped = JSON.parse(fs.readFileSync(src, "utf8"));
439
+ const consumer = JSON.parse(fs.readFileSync(dst, "utf8"));
440
+ const merged = deepMerge(shipped, consumer);
441
+ if (file === "features.json") {
442
+ const pkgVersion = readPackageVersion(packageRoot);
443
+ if (pkgVersion) merged.version = pkgVersion;
444
+ else if (shipped.version) merged.version = shipped.version;
445
+ }
446
+ writeJsonFile(dst, merged);
447
+ return true;
448
+ } catch {
449
+ if (fs.statSync(src).mtime > fs.statSync(dst).mtime) {
450
+ fs.copyFileSync(src, dst);
451
+ return true;
452
+ }
453
+ return false;
454
+ }
455
+ }
456
+
457
+ if (fs.statSync(src).mtime > fs.statSync(dst).mtime) {
458
+ fs.copyFileSync(src, dst);
459
+ return true;
460
+ }
461
+ return false;
462
+ }
463
+
406
464
  function resolveXrayConfigSource(packageRoot, file) {
407
465
  // Shipped SSOT: xray/ template wins over dev .xray/ runtime copy (P0.2)
408
466
  const xrayDir = path.join(packageRoot, "xray", file);
@@ -423,9 +481,7 @@ function deployXrayConfig(targetDir, packageRoot, log) {
423
481
  const src = resolveXrayConfigSource(packageRoot, file);
424
482
  const dst = path.join(xrayTargetDir, file);
425
483
  if (!src) continue;
426
- const shouldCopy = !fs.existsSync(dst) || fs.statSync(src).mtime > fs.statSync(dst).mtime;
427
- if (shouldCopy) {
428
- fs.copyFileSync(src, dst);
484
+ if (deployXrayConfigFile(file, src, dst, packageRoot)) {
429
485
  copied++;
430
486
  }
431
487
  }
@@ -479,6 +535,8 @@ module.exports = {
479
535
  syncBuiltinSkills,
480
536
  isConsumerInstall,
481
537
  deployXrayConfig,
538
+ deployXrayConfigFile,
482
539
  resolveXrayConfigSource,
483
540
  XRAY_CONFIG_FILES,
541
+ MERGE_CONFIG_FILES,
484
542
  };