0xray 4.0.14 → 4.0.15

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 (68) hide show
  1. package/.grok-plugin/plugin.json +1 -1
  2. package/.opencode/skills/orchestrator/SKILL.md +19 -1
  3. package/.xray/features.json +2 -2
  4. package/AGENTS-consumer.md +10 -5
  5. package/AGENTS.md +10 -7
  6. package/README.md +8 -7
  7. package/SKILLS.md +3 -2
  8. package/dist/AGENTS.md +10 -7
  9. package/dist/CHANGELOG.md +48 -0
  10. package/dist/README.md +8 -7
  11. package/dist/SKILLS.md +3 -2
  12. package/dist/cli/commands/hermes-install.js +2 -1
  13. package/dist/cli/commands/openclaw-install.js +2 -1
  14. package/dist/cli/commands/opencode-install.js +2 -1
  15. package/dist/cli/index.js +2 -1
  16. package/dist/integrations/cursor/hooks/cursor-hook-utils.js +9 -0
  17. package/dist/integrations/grok/grok-cli.js +2 -1
  18. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  19. package/dist/reporting/log-parser.js +2 -2
  20. package/dist/skills/orchestrator/SKILL.md +19 -1
  21. package/llms.txt +8 -7
  22. package/package.json +2 -1
  23. package/scripts/foundry/CHANGELOG.md +33 -1
  24. package/scripts/foundry/README.md +12 -5
  25. package/scripts/foundry/assert-packed-dist-cli.mjs +6 -0
  26. package/scripts/foundry/blip-kapow.cjs +2 -0
  27. package/scripts/foundry/blip-looker.cjs +2 -0
  28. package/scripts/foundry/blip-render.cjs +2 -1237
  29. package/scripts/foundry/blip-rippel-organs.cjs +2 -0
  30. package/scripts/foundry/blip-rippel.cjs +2 -1963
  31. package/scripts/foundry/blip-scene.cjs +2 -0
  32. package/scripts/foundry/blip-stroke.cjs +2 -0
  33. package/scripts/foundry/blip-vibe.cjs +2 -0
  34. package/scripts/foundry/blip.mjs +23 -97
  35. package/scripts/foundry/cli.mjs +2 -2
  36. package/scripts/foundry/inspect.mjs +62 -19
  37. package/scripts/foundry/mill-plant.cjs +598 -0
  38. package/scripts/foundry/mint-suit.cjs +189 -99
  39. package/scripts/foundry/package.json +12 -1
  40. package/scripts/foundry/plant/agents/blip-inspect.yml +1 -1
  41. package/scripts/foundry/plant/agents/blip-looker.yml +5 -0
  42. package/scripts/foundry/plant/agents/blip-vibe.yml +5 -0
  43. package/scripts/foundry/plant/agents/blip.yml +1 -1
  44. package/scripts/foundry/plant/agents/inspect.yml +1 -1
  45. package/scripts/foundry/plant/agents/mill.yml +1 -1
  46. package/scripts/foundry/plant/agents/sound-inspect.yml +1 -1
  47. package/scripts/foundry/plant/agents/sound-mixer.yml +5 -0
  48. package/scripts/foundry/plant/agents/sound.yml +1 -1
  49. package/scripts/foundry/plant/motions/MOTION-REGISTRY.md +15 -9
  50. package/scripts/foundry/plant/motions/registry.json +5 -4
  51. package/scripts/foundry/plant/skills/blip/SKILL.md +4 -4
  52. package/scripts/foundry/plant/skills/blip-inspect/SKILL.md +2 -2
  53. package/scripts/foundry/plant/skills/blip-looker/SKILL.md +30 -0
  54. package/scripts/foundry/plant/skills/blip-vibe/SKILL.md +30 -0
  55. package/scripts/foundry/plant/skills/inspect/SKILL.md +2 -2
  56. package/scripts/foundry/plant/skills/sound/SKILL.md +3 -1
  57. package/scripts/foundry/plant/skills/sound-inspect/SKILL.md +1 -1
  58. package/scripts/foundry/plant/skills/sound-mixer/SKILL.md +28 -0
  59. package/scripts/foundry/sound-bed.cjs +2 -454
  60. package/scripts/foundry/sound-mixer.cjs +2 -0
  61. package/scripts/foundry/sound-rippel.cjs +2 -1434
  62. package/scripts/foundry/sound-taste.cjs +2 -0
  63. package/scripts/foundry/sound-voice.cjs +2 -0
  64. package/scripts/foundry/sound.mjs +23 -81
  65. package/scripts/node/install-bridges.cjs +39 -4
  66. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  67. package/src/skills/orchestrator/SKILL.md +19 -1
  68. package/xray/features.json +2 -2
@@ -0,0 +1,2 @@
1
+ /** Shim — mill drawers live in @0xray/blip. */
2
+ module.exports = require("@0xray/blip/sound-taste");
@@ -0,0 +1,2 @@
1
+ /** Shim — mill drawers live in @0xray/blip. */
2
+ module.exports = require("@0xray/blip/sound-voice");
@@ -1,93 +1,35 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Factory-sound CLI. Render a bed or inspect the last receipt.
4
- * npx @0xray/foundry sound render [--brief TEXT] [--genre ambient|techno|jazz] [--seconds N] [--out FILE]
5
- * npx @0xray/foundry sound inspect
3
+ * Shim: sound mill lives in @0xray/blip.
4
+ * npx @0xray/foundry sound render|inspect|mix [...]
6
5
  */
7
-
6
+ import { spawnSync } from "node:child_process";
8
7
  import { createRequire } from "node:module";
9
8
  import path from "node:path";
10
- import { fileURLToPath } from "node:url";
11
- import { resolveMillRoot } from "./mill-root.mjs";
12
-
13
- const require = createRequire(import.meta.url);
14
- const bed = require("./sound-bed.cjs");
9
+ import { pathToFileURL } from "node:url";
15
10
 
16
- const HELP =
17
- "Usage: npx @0xray/foundry sound <render|inspect> [...args]\n" +
18
- "\n" +
19
- "Sound plant, not mill. FOUNDRY_ROOT overrides cwd.\n" +
20
- "render: brief → checksum seed → genre → wav → metrics receipt.\n" +
21
- "inspect: last .xray/sound-bed-receipt.json PASS/FAIL (missing is FAIL).\n";
22
-
23
- function argValue(argv, name, fallback) {
24
- const i = argv.indexOf(name);
25
- if (i < 0 || i + 1 >= argv.length) return fallback;
26
- return argv[i + 1];
27
- }
11
+ export { inspectBed } from "@0xray/blip/sound";
28
12
 
29
- function writeJson(value) {
30
- process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
31
- }
32
-
33
- function inspectBed(root) {
34
- const receipt = bed.readReceipt(root);
35
- if (!receipt) {
36
- return {
37
- ok: false,
38
- status: "FAIL",
39
- failClosed: true,
40
- detail: "missing .xray/sound-bed-receipt.json",
41
- receipt: null,
42
- };
43
- }
44
- const status = receipt.status === "PASS" ? "PASS" : "FAIL";
45
- return {
46
- ok: status === "PASS",
47
- status,
48
- failClosed: true,
49
- plant: "sound",
50
- receipt,
51
- };
52
- }
53
-
54
- function main() {
55
- const argv = process.argv.slice(2);
56
- const cmd = argv[0];
57
- const rest = argv.slice(1);
58
- const root = resolveMillRoot();
59
-
60
- if (!cmd || cmd === "--help" || cmd === "-h" || cmd === "help") {
61
- process.stdout.write(HELP);
62
- process.exit(cmd ? 0 : 1);
63
- }
64
-
65
- if (cmd === "inspect") {
66
- const report = inspectBed(root);
67
- writeJson(report);
68
- process.exit(report.ok ? 0 : 1);
69
- }
13
+ const require = createRequire(import.meta.url);
70
14
 
71
- if (cmd === "render") {
72
- const result = bed.renderBed({
73
- root,
74
- brief: argValue(rest, "--brief", "factory-sound bed"),
75
- genre: argValue(rest, "--genre", "ambient"),
76
- seconds: Number(argValue(rest, "--seconds", bed.DEFAULT_SECONDS)),
77
- out: argValue(rest, "--out", null),
78
- });
79
- writeJson(result.receipt);
80
- process.exit(result.receipt.status === "PASS" ? 0 : 1);
15
+ function runCli(args) {
16
+ let cli;
17
+ try {
18
+ cli = require.resolve("@0xray/blip/cli");
19
+ } catch {
20
+ process.stderr.write("Install @0xray/blip — the sound mill moved off the OS foundry.\n");
21
+ process.exit(1);
81
22
  }
82
-
83
- process.stderr.write(HELP);
84
- process.exit(1);
23
+ const result = spawnSync(process.execPath, [cli, "sound", ...args], {
24
+ stdio: "inherit",
25
+ cwd: process.env.FOUNDRY_ROOT || process.cwd(),
26
+ env: process.env,
27
+ });
28
+ process.exit(result.status === null ? 1 : result.status);
85
29
  }
86
30
 
87
- export { inspectBed };
88
-
89
- const isMain =
90
- process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
91
- if (isMain) {
92
- main();
31
+ const invoked =
32
+ process.argv[1] && pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url;
33
+ if (invoked) {
34
+ runCli(process.argv.slice(2));
93
35
  }
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * install-bridges.cjs — Unified 4-platform bridge installer for consumer postinstall.
4
- * Mirrors npx 0xray {opencode,grok,hermes,openclaw} install in one synchronous pass.
4
+ * Mirrors npx 0xray {opencode,grok,hermes,openclaw} install in one synchronous pass
5
+ * plus Cursor project hooks (fifth wear — not a fifth chat TUI).
5
6
  */
6
7
 
7
8
  const fs = require("fs");
@@ -709,6 +710,35 @@ function deployXrayConfig(targetDir, packageRoot, log) {
709
710
  return copied;
710
711
  }
711
712
 
713
+ function resolveCursorHooksTemplate(packageRoot) {
714
+ const src = path.join(packageRoot, "src", "integrations", "cursor", "hooks", "hooks.json");
715
+ if (fs.existsSync(src)) return src;
716
+ const dist = path.join(packageRoot, "dist", "integrations", "cursor", "hooks", "hooks.json");
717
+ if (fs.existsSync(dist)) return dist;
718
+ return null;
719
+ }
720
+
721
+ /**
722
+ * Fifth wear: project `.cursor/hooks.json` so Cursor Cloud heats Station and gates tools.
723
+ * Leave an existing file alone (this exo already wears src/ via invoke-probe).
724
+ */
725
+ function installCursorBridge(targetDir, packageRoot, log) {
726
+ const dest = path.join(targetDir, ".cursor", "hooks.json");
727
+ if (fs.existsSync(dest)) {
728
+ log("cursor-bridge", ".cursor/hooks.json exists — leave", "info");
729
+ return dest;
730
+ }
731
+ const template = resolveCursorHooksTemplate(packageRoot);
732
+ if (!template) {
733
+ log("cursor-bridge", "skipped", "warn", { reason: "cursor hooks template missing" });
734
+ return null;
735
+ }
736
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
737
+ fs.copyFileSync(template, dest);
738
+ log("cursor-bridge", "hooks.json fastened", "info", { path: ".cursor/hooks.json" });
739
+ return dest;
740
+ }
741
+
712
742
  function installGitHooks(packageRoot, log) {
713
743
  const installHooks = path.join(packageRoot, "scripts", "hooks", "install-hooks.cjs");
714
744
  if (!fs.existsSync(installHooks)) return;
@@ -730,6 +760,8 @@ function installFrameworkDogfoodWear(packageRoot, log) {
730
760
  applyResolvedMemoryRouting(featuresPath, packageRoot);
731
761
  }
732
762
 
763
+ installCursorBridge(packageRoot, packageRoot, log);
764
+
733
765
  const sourceDir = findGrokPluginSource(packageRoot);
734
766
  const pluginDest = path.join(packageRoot, ".grok", "plugins", "0xray");
735
767
  if (!sourceDir) {
@@ -744,7 +776,7 @@ function installFrameworkDogfoodWear(packageRoot, log) {
744
776
  }
745
777
 
746
778
  /**
747
- * Install all 4 platform bridges for a consumer project.
779
+ * Install 4 chat bridges plus Cursor project hooks for a consumer project.
748
780
  * @param {{ targetDir: string, packageRoot: string, log?: Function }} opts
749
781
  */
750
782
  function installAllBridges(opts) {
@@ -764,7 +796,7 @@ function installAllBridges(opts) {
764
796
  return;
765
797
  }
766
798
 
767
- log("install-bridges", "starting 4-platform install", "info");
799
+ log("install-bridges", "starting 4-platform + cursor wear", "info");
768
800
 
769
801
  deployXrayConfig(targetDir, packageRoot, log);
770
802
  deployProjectMcpJson(targetDir, log);
@@ -773,9 +805,10 @@ function installAllBridges(opts) {
773
805
  installGrokBridge(targetDir, packageRoot, log);
774
806
  installHermesBridge(targetDir, packageRoot, log);
775
807
  installOpenclawBridge(targetDir, packageRoot, log);
808
+ installCursorBridge(targetDir, packageRoot, log);
776
809
  installGitHooks(packageRoot, log);
777
810
 
778
- log("install-bridges", "4-platform install complete", "success");
811
+ log("install-bridges", "4-platform + cursor wear complete", "success");
779
812
  }
780
813
 
781
814
  module.exports = {
@@ -798,4 +831,6 @@ module.exports = {
798
831
  isIsolatedHome,
799
832
  installFrameworkDogfoodWear,
800
833
  wearVendoredRepertoire,
834
+ installCursorBridge,
835
+ resolveCursorHooksTemplate,
801
836
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xray-pre-tool",
3
- "version": "4.0.14",
3
+ "version": "4.0.15",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "0xRay constitution + temperament PreToolUse for OpenClaw",
@@ -58,4 +58,22 @@ When `multi_agent_orchestration.lead_dev_mode` is true in `features.json` (defau
58
58
  - **SessionStart** → `session-start.js` boots lead_dev_mode
59
59
  - **PreToolUse** → hints `per_suite_triage_required` on full `npm test`
60
60
 
61
- Config: `features.json` → `multi_agent_orchestration.lead_dev_mode`
61
+ Config: `features.json` → `multi_agent_orchestration.lead_dev_mode`
62
+
63
+ ## Lead cadence (syncopation)
64
+
65
+ The seven rules are the engine. The cadence is the time signature. Disk SSOT: `grok-bot/ops/LEAD-CADENCE.md`.
66
+
67
+ - **Peer test:** another instance with only worn 0xRay continues the ticket. No command stream.
68
+ - **Wear first:** Read `.xray/state/STATION.md`. Same cloud. Same critic (resume only). Dummy Reads Station.
69
+ - **Dummy tests `SKILLS.md`:** a suited dummy proves the worn catalog. Same-sess bodies keep context and hold a Station card.
70
+ - **Ship track:** always branch + worktree/aside + PR. Docs as you go. Builds. Rollback = close the PR.
71
+ - **Publish:** spawn the OTP browser, watch success, poll `npm view` until the new version is live. Do not move on early. Railway same law.
72
+ - **Live tick, not pacer:** `/loop` runs work now. Keep workstreams moving. Do not idle-wait 12 minutes.
73
+ - **Board clock:** PR events + resume the same critic. Not two idle pacers. Merge after PASS+CI (gate A). Publish only after mill-gate D + `foundry gate`.
74
+ - **Dispatch:** ticket + PR URLs + “Wear, then review.” The critic Reads `SEATS.md` Reviewer. Do not paste a command novel. When a law is spoken twice, encode it this wake.
75
+ - **Close:** loop until Station is done. Compact: Station survives the cut. Repertoire keeps names.
76
+ - **Board:** critic Strict comments; forge implements; lead stays main thread.
77
+ - **Codex 69:** rewire this skill and existing ops. Do not add a new `SKILL.md` to hold the cadence.
78
+ - **Ship matrix:** `LEAD-CADENCE.md` Decision matrix — A PR+CI · B pack · C `release:docs-check` · D `foundry release --i-mean-it`. Green CI is not ship. Spend / credentials stay Ask-first.
79
+ - **Metamorphosis:** LLM → OP-PROC is in-context worn seats (same critic, same dummy, resume only). Not more bots.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "./features.schema.json",
3
- "version": "4.0.14",
3
+ "version": "4.0.15",
4
4
  "description": "0xRay Framework - Unified Feature Configuration",
5
5
  "suit_temperament": {
6
6
  "profile": "auto",
@@ -162,7 +162,7 @@
162
162
  "provider": "repertoire",
163
163
  "module_path": "node_modules/@0xray/repertoire/dist/provider/memory-routing-provider.js",
164
164
  "config": {
165
- "signalsPath": "node_modules/@0xray/repertoire/data/curated_signals.json",
165
+ "signalsPath": ".xray/state/repertoire/curated_signals.json",
166
166
  "statePath": ".xray/state/repertoire/inference-state.json",
167
167
  "feedbackDir": ".xray/state/repertoire/feedback"
168
168
  }