@rune-kit/rune 2.26.0 → 2.26.1

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
@@ -103,11 +103,15 @@ Plus **9 domain packs** (product, sales, data-science, support, growth, media, p
103
103
 
104
104
  ---
105
105
 
106
- ## What's New (v2.26.0Motion Craft)
106
+ ## What's New (v2.26.1Codex Wiring)
107
+
108
+ > **v2.26.1 (2026-07-22):** Rune's runtime hooks were silently inert on **Codex CLI**. `hooks/hooks.json` is loaded by both Claude Code and Codex — Codex reads `<plugin>/hooks/hooks.json`, the same path, and maps the event names — but every tool matcher named only Claude's tools. Codex has no `Read`, `Write`, `Edit` or `Bash` tool; it issues `shell_command`, `exec`, `apply_patch`, `view_image`, `spawn_agent`. So the privacy gate and the secret scanner matched nothing and never fired. Matchers now name both platforms' tools (plain alternation — Claude behaviour is byte-for-byte unchanged), and `pre-tool-guard` reads the target path out of a Codex `apply_patch` payload (`*** Update File: <path>`), which is what makes it an actual gate there instead of a no-op. Note that Codex does not support `async` hooks yet and skips them, so Rune's six background hooks stay inactive on Codex — `async` is kept because Claude Code honours it.
109
+
110
+ ### Previous (v2.26.0 — Motion Craft)
107
111
 
108
112
  > **v2.26.0 (2026-07-18):** Rune's UI mesh gains a deep **motion authority**. New reference `skills/design/MOTION-CRAFT.md` is the canonical source for animation decisions: the *should-it-animate* frequency gate (never animate keyboard/100+-per-day actions), easing decision tree with strong custom curves, per-element duration budgets (UI under 300ms, modals/drawers exempt to 500ms), physicality rules (never `scale(0)`, origin-aware popovers, press feedback), spring physics (damping/response, velocity handoff, momentum projection, rubber-banding), interruptibility (transitions vs keyframes, `@starting-style`), motion performance, reduced-motion, and a reverse-lookup vocabulary glossary. `design` (v0.8.0) loads it whenever a domain involves motion and gains an advisory motion-audit mode. `review` (v1.5.0) adds **Motion Craft Checks** — an advisory lens that fires only on motion diffs, flagging `ease-in` on UI, `scale(0)` entrances, animation on high-frequency actions, layout-property animation, and more, citing MOTION-CRAFT for exact fixes. `perf` (v0.6.0) adds **Step 5.5 Motion Performance** — GPU-property, Framer-Motion-shorthand, and recalc-storm detection ranked in the Cost Impact Hierarchy. Advisory-first throughout (no new HARD-GATEs) — enrichment only, mesh unchanged at 66 skills.
109
113
 
110
- ### Previous (v2.25.0 — Council)
114
+ #### Earlier (v2.25.0 — Council)
111
115
 
112
116
  > **v2.25.0 (2026-07-11):** New **`council`** L3 primitive — genuinely decorrelated multi-perspective gathering. Detects installed AI CLIs, fans a question across distinct model families (external CLIs when present, subagents when not), gates off-topic/malformed voices, normalizes claims (anchor-first + shared-evidence arbiter fallback — prose similarity never counts), and arbitrates inline with an honest `NO_DECORRELATION` stamp when fewer than 2 real model families answered. Wired into 4 consumers: `adversary` (CRITICAL-tier plans), `review` (high-blast-radius diffs), `brainstorm` (Design-It-Twice candidate judgment), `problem-solver` (high-stakes conclusions) — every integration explicitly refuses to launder a same-family run as independent confirmation. **Live-dogfooded same day**: a real 3-voice self-test (external `grok` dispatch + 2 subagent fallbacks) independently converged on a real gap — "confirmed" `model_family` was CLI-brand identity, not verified backend identity, letting two CLIs redirected to the same backend (BYOK/proxy override) defeat the gate — fixed before shipping. **Pro**: `council-cockpit` (separate repo) adds a read-only live panel + cost-aware allocation + history-informed family weighting, PRE-council advisory only — Free never depends on Pro. Mesh now 66 skills / 208 connections / 45 signals.
113
117
 
package/hooks/hooks.json CHANGED
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "PreToolUse": [
28
28
  {
29
- "matcher": "Read|Write|Edit",
29
+ "matcher": "Read|Write|Edit|apply_patch|view_image",
30
30
  "hooks": [
31
31
  {
32
32
  "type": "command",
@@ -46,7 +46,7 @@
46
46
  ]
47
47
  },
48
48
  {
49
- "matcher": "Bash",
49
+ "matcher": "Bash|shell_command",
50
50
  "hooks": [
51
51
  {
52
52
  "type": "command",
@@ -58,7 +58,7 @@
58
58
  ],
59
59
  "PostToolUse": [
60
60
  {
61
- "matcher": "Edit|Write",
61
+ "matcher": "Edit|Write|apply_patch",
62
62
  "hooks": [
63
63
  {
64
64
  "type": "command",
@@ -73,7 +73,7 @@
73
73
  ]
74
74
  },
75
75
  {
76
- "matcher": "Skill|Task|Agent",
76
+ "matcher": "Skill|Task|Agent|spawn_agent",
77
77
  "hooks": [
78
78
  {
79
79
  "type": "command",
@@ -83,7 +83,7 @@
83
83
  ]
84
84
  },
85
85
  {
86
- "matcher": "mcp__.*|WebFetch|Read",
86
+ "matcher": "mcp__.*|WebFetch|Read|web_search",
87
87
  "hooks": [
88
88
  {
89
89
  "type": "command",
@@ -50,6 +50,26 @@ function appendGateOutcome(gate, outcome, detail) {
50
50
  }
51
51
  }
52
52
 
53
+ /**
54
+ * Path a Codex `apply_patch` call is about to write.
55
+ *
56
+ * Codex has no Edit/Write tool — file writes arrive as one `apply_patch` call
57
+ * whose payload is raw patch text, so there is no `file_path` to read. The
58
+ * target is in the patch header. Without this the privacy gate is a no-op on
59
+ * Codex: every write sails past.
60
+ *
61
+ * @param {string} toolName
62
+ * @param {object} toolInput
63
+ * @returns {string} target path, or '' when this is not a patch we understand
64
+ */
65
+ function patchTargetPath(toolName, toolInput) {
66
+ if (toolName !== 'apply_patch') return '';
67
+ const patch = typeof toolInput === 'string' ? toolInput : toolInput.input || toolInput.patch || '';
68
+ if (typeof patch !== 'string') return '';
69
+ const match = patch.match(/^\*\*\* (?:Update|Add|Delete) File:\s*(.+)$/m);
70
+ return match ? match[1].trim() : '';
71
+ }
72
+
53
73
  // Read tool_input from Claude Code hook stdin
54
74
  let input = '';
55
75
  process.stdin.setEncoding('utf-8');
@@ -66,7 +86,7 @@ process.stdin.on('end', () => {
66
86
  process.exit(0);
67
87
  }
68
88
 
69
- const filePath = toolInput.file_path || toolInput.path || '';
89
+ const filePath = toolInput.file_path || toolInput.path || patchTargetPath(toolName, toolInput);
70
90
  if (!filePath) process.exit(0);
71
91
 
72
92
  const basename = path.basename(filePath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rune-kit/rune",
3
- "version": "2.26.0",
3
+ "version": "2.26.1",
4
4
  "description": "65-skill mesh for AI coding assistants — runtime auto-discipline via native hooks (Claude/Cursor/Windsurf/Antigravity), 5-layer architecture, 204 connections + 43 signals, multi-platform compiler. converge (L3) scans spec vs code so dead-button/frontend-only implementations can't ship.",
5
5
  "type": "module",
6
6
  "bin": {