@codyswann/lisa 2.321.3 → 2.321.4

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 (60) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +2 -1
  3. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
  8. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
  9. package/plugins/lisa-agy/plugin.json +1 -1
  10. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
  11. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  14. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
  18. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
  20. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo-agy/plugin.json +1 -1
  23. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  33. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  38. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  43. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails-agy/plugin.json +1 -1
  48. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  53. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  58. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +30 -1
package/package.json CHANGED
@@ -115,7 +115,7 @@
115
115
  "brace-expansion": ">=5.0.9"
116
116
  },
117
117
  "name": "@codyswann/lisa",
118
- "version": "2.321.3",
118
+ "version": "2.321.4",
119
119
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
120
120
  "main": "dist/index.js",
121
121
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -37,7 +37,7 @@ import {
37
37
  rmSync,
38
38
  writeFileSync,
39
39
  } from "node:fs";
40
- import { basename, dirname, join, resolve } from "node:path";
40
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
41
41
  import { fileURLToPath, pathToFileURL } from "node:url";
42
42
 
43
43
  import { assertPinned, extractVersion, planToolchain } from "./toolchain.mjs";
@@ -197,6 +197,22 @@ function applyToolchain(tools, dryRun) {
197
197
  mkdirSync(binDir, { recursive: true, mode: 0o755 });
198
198
  const byName = new Map((tools.install ?? []).map(t => [t.name, t]));
199
199
 
200
+ // Installing a binary somewhere nothing looks is the same as not installing
201
+ // it. `~/.local/bin` is on PATH by default on a developer workstation and is
202
+ // NOT on a minimal container, so the toolchain step reported `install bws`,
203
+ // the file landed at ~/.local/bin/bws mode 755, and the very next step died
204
+ // with `spawnSync bws ENOENT`.
205
+ //
206
+ // This was invisible in every local test because a workstation shell already
207
+ // exports the directory — the environment doing the hiding was the one used
208
+ // to verify the fix.
209
+ //
210
+ // Prepended, not appended: a pinned-and-checksummed binary must win over
211
+ // whatever an image happens to ship under the same name.
212
+ if (!pathContains(binDir)) {
213
+ process.env.PATH = `${binDir}${delimiter}${process.env.PATH ?? ""}`;
214
+ }
215
+
200
216
  for (const step of plan) {
201
217
  console.log(` ${step.action.padEnd(8)} ${step.reason}`);
202
218
  if (step.action === "install" && !dryRun)
@@ -205,6 +221,19 @@ function applyToolchain(tools, dryRun) {
205
221
  return plan;
206
222
  }
207
223
 
224
+ /**
225
+ * Whether a directory is already on PATH.
226
+ *
227
+ * Compared entry by entry rather than by substring: a substring test would
228
+ * consider `/root/.local/bin` present because `/root/.local/bin/extra` is, and
229
+ * would then skip the prepend that makes the tool findable.
230
+ * @param {string} dir Directory to look for.
231
+ * @returns {boolean} True when PATH already contains exactly that entry.
232
+ */
233
+ export function pathContains(dir, path = process.env.PATH ?? "") {
234
+ return path.split(delimiter).filter(Boolean).includes(dir);
235
+ }
236
+
208
237
  /**
209
238
  * Run the project's own setup hook when it has one.
210
239
  *
@@ -37,7 +37,7 @@ import {
37
37
  rmSync,
38
38
  writeFileSync,
39
39
  } from "node:fs";
40
- import { basename, dirname, join, resolve } from "node:path";
40
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
41
41
  import { fileURLToPath, pathToFileURL } from "node:url";
42
42
 
43
43
  import { assertPinned, extractVersion, planToolchain } from "./toolchain.mjs";
@@ -197,6 +197,22 @@ function applyToolchain(tools, dryRun) {
197
197
  mkdirSync(binDir, { recursive: true, mode: 0o755 });
198
198
  const byName = new Map((tools.install ?? []).map(t => [t.name, t]));
199
199
 
200
+ // Installing a binary somewhere nothing looks is the same as not installing
201
+ // it. `~/.local/bin` is on PATH by default on a developer workstation and is
202
+ // NOT on a minimal container, so the toolchain step reported `install bws`,
203
+ // the file landed at ~/.local/bin/bws mode 755, and the very next step died
204
+ // with `spawnSync bws ENOENT`.
205
+ //
206
+ // This was invisible in every local test because a workstation shell already
207
+ // exports the directory — the environment doing the hiding was the one used
208
+ // to verify the fix.
209
+ //
210
+ // Prepended, not appended: a pinned-and-checksummed binary must win over
211
+ // whatever an image happens to ship under the same name.
212
+ if (!pathContains(binDir)) {
213
+ process.env.PATH = `${binDir}${delimiter}${process.env.PATH ?? ""}`;
214
+ }
215
+
200
216
  for (const step of plan) {
201
217
  console.log(` ${step.action.padEnd(8)} ${step.reason}`);
202
218
  if (step.action === "install" && !dryRun)
@@ -205,6 +221,19 @@ function applyToolchain(tools, dryRun) {
205
221
  return plan;
206
222
  }
207
223
 
224
+ /**
225
+ * Whether a directory is already on PATH.
226
+ *
227
+ * Compared entry by entry rather than by substring: a substring test would
228
+ * consider `/root/.local/bin` present because `/root/.local/bin/extra` is, and
229
+ * would then skip the prepend that makes the tool findable.
230
+ * @param {string} dir Directory to look for.
231
+ * @returns {boolean} True when PATH already contains exactly that entry.
232
+ */
233
+ export function pathContains(dir, path = process.env.PATH ?? "") {
234
+ return path.split(delimiter).filter(Boolean).includes(dir);
235
+ }
236
+
208
237
  /**
209
238
  * Run the project's own setup hook when it has one.
210
239
  *
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -37,7 +37,7 @@ import {
37
37
  rmSync,
38
38
  writeFileSync,
39
39
  } from "node:fs";
40
- import { basename, dirname, join, resolve } from "node:path";
40
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
41
41
  import { fileURLToPath, pathToFileURL } from "node:url";
42
42
 
43
43
  import { assertPinned, extractVersion, planToolchain } from "./toolchain.mjs";
@@ -197,6 +197,22 @@ function applyToolchain(tools, dryRun) {
197
197
  mkdirSync(binDir, { recursive: true, mode: 0o755 });
198
198
  const byName = new Map((tools.install ?? []).map(t => [t.name, t]));
199
199
 
200
+ // Installing a binary somewhere nothing looks is the same as not installing
201
+ // it. `~/.local/bin` is on PATH by default on a developer workstation and is
202
+ // NOT on a minimal container, so the toolchain step reported `install bws`,
203
+ // the file landed at ~/.local/bin/bws mode 755, and the very next step died
204
+ // with `spawnSync bws ENOENT`.
205
+ //
206
+ // This was invisible in every local test because a workstation shell already
207
+ // exports the directory — the environment doing the hiding was the one used
208
+ // to verify the fix.
209
+ //
210
+ // Prepended, not appended: a pinned-and-checksummed binary must win over
211
+ // whatever an image happens to ship under the same name.
212
+ if (!pathContains(binDir)) {
213
+ process.env.PATH = `${binDir}${delimiter}${process.env.PATH ?? ""}`;
214
+ }
215
+
200
216
  for (const step of plan) {
201
217
  console.log(` ${step.action.padEnd(8)} ${step.reason}`);
202
218
  if (step.action === "install" && !dryRun)
@@ -205,6 +221,19 @@ function applyToolchain(tools, dryRun) {
205
221
  return plan;
206
222
  }
207
223
 
224
+ /**
225
+ * Whether a directory is already on PATH.
226
+ *
227
+ * Compared entry by entry rather than by substring: a substring test would
228
+ * consider `/root/.local/bin` present because `/root/.local/bin/extra` is, and
229
+ * would then skip the prepend that makes the tool findable.
230
+ * @param {string} dir Directory to look for.
231
+ * @returns {boolean} True when PATH already contains exactly that entry.
232
+ */
233
+ export function pathContains(dir, path = process.env.PATH ?? "") {
234
+ return path.split(delimiter).filter(Boolean).includes(dir);
235
+ }
236
+
208
237
  /**
209
238
  * Run the project's own setup hook when it has one.
210
239
  *
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -37,7 +37,7 @@ import {
37
37
  rmSync,
38
38
  writeFileSync,
39
39
  } from "node:fs";
40
- import { basename, dirname, join, resolve } from "node:path";
40
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
41
41
  import { fileURLToPath, pathToFileURL } from "node:url";
42
42
 
43
43
  import { assertPinned, extractVersion, planToolchain } from "./toolchain.mjs";
@@ -197,6 +197,22 @@ function applyToolchain(tools, dryRun) {
197
197
  mkdirSync(binDir, { recursive: true, mode: 0o755 });
198
198
  const byName = new Map((tools.install ?? []).map(t => [t.name, t]));
199
199
 
200
+ // Installing a binary somewhere nothing looks is the same as not installing
201
+ // it. `~/.local/bin` is on PATH by default on a developer workstation and is
202
+ // NOT on a minimal container, so the toolchain step reported `install bws`,
203
+ // the file landed at ~/.local/bin/bws mode 755, and the very next step died
204
+ // with `spawnSync bws ENOENT`.
205
+ //
206
+ // This was invisible in every local test because a workstation shell already
207
+ // exports the directory — the environment doing the hiding was the one used
208
+ // to verify the fix.
209
+ //
210
+ // Prepended, not appended: a pinned-and-checksummed binary must win over
211
+ // whatever an image happens to ship under the same name.
212
+ if (!pathContains(binDir)) {
213
+ process.env.PATH = `${binDir}${delimiter}${process.env.PATH ?? ""}`;
214
+ }
215
+
200
216
  for (const step of plan) {
201
217
  console.log(` ${step.action.padEnd(8)} ${step.reason}`);
202
218
  if (step.action === "install" && !dryRun)
@@ -205,6 +221,19 @@ function applyToolchain(tools, dryRun) {
205
221
  return plan;
206
222
  }
207
223
 
224
+ /**
225
+ * Whether a directory is already on PATH.
226
+ *
227
+ * Compared entry by entry rather than by substring: a substring test would
228
+ * consider `/root/.local/bin` present because `/root/.local/bin/extra` is, and
229
+ * would then skip the prepend that makes the tool findable.
230
+ * @param {string} dir Directory to look for.
231
+ * @returns {boolean} True when PATH already contains exactly that entry.
232
+ */
233
+ export function pathContains(dir, path = process.env.PATH ?? "") {
234
+ return path.split(delimiter).filter(Boolean).includes(dir);
235
+ }
236
+
208
237
  /**
209
238
  * Run the project's own setup hook when it has one.
210
239
  *
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -37,7 +37,7 @@ import {
37
37
  rmSync,
38
38
  writeFileSync,
39
39
  } from "node:fs";
40
- import { basename, dirname, join, resolve } from "node:path";
40
+ import { basename, delimiter, dirname, join, resolve } from "node:path";
41
41
  import { fileURLToPath, pathToFileURL } from "node:url";
42
42
 
43
43
  import { assertPinned, extractVersion, planToolchain } from "./toolchain.mjs";
@@ -197,6 +197,22 @@ function applyToolchain(tools, dryRun) {
197
197
  mkdirSync(binDir, { recursive: true, mode: 0o755 });
198
198
  const byName = new Map((tools.install ?? []).map(t => [t.name, t]));
199
199
 
200
+ // Installing a binary somewhere nothing looks is the same as not installing
201
+ // it. `~/.local/bin` is on PATH by default on a developer workstation and is
202
+ // NOT on a minimal container, so the toolchain step reported `install bws`,
203
+ // the file landed at ~/.local/bin/bws mode 755, and the very next step died
204
+ // with `spawnSync bws ENOENT`.
205
+ //
206
+ // This was invisible in every local test because a workstation shell already
207
+ // exports the directory — the environment doing the hiding was the one used
208
+ // to verify the fix.
209
+ //
210
+ // Prepended, not appended: a pinned-and-checksummed binary must win over
211
+ // whatever an image happens to ship under the same name.
212
+ if (!pathContains(binDir)) {
213
+ process.env.PATH = `${binDir}${delimiter}${process.env.PATH ?? ""}`;
214
+ }
215
+
200
216
  for (const step of plan) {
201
217
  console.log(` ${step.action.padEnd(8)} ${step.reason}`);
202
218
  if (step.action === "install" && !dryRun)
@@ -205,6 +221,19 @@ function applyToolchain(tools, dryRun) {
205
221
  return plan;
206
222
  }
207
223
 
224
+ /**
225
+ * Whether a directory is already on PATH.
226
+ *
227
+ * Compared entry by entry rather than by substring: a substring test would
228
+ * consider `/root/.local/bin` present because `/root/.local/bin/extra` is, and
229
+ * would then skip the prepend that makes the tool findable.
230
+ * @param {string} dir Directory to look for.
231
+ * @returns {boolean} True when PATH already contains exactly that entry.
232
+ */
233
+ export function pathContains(dir, path = process.env.PATH ?? "") {
234
+ return path.split(delimiter).filter(Boolean).includes(dir);
235
+ }
236
+
208
237
  /**
209
238
  * Run the project's own setup hook when it has one.
210
239
  *
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.321.3",
3
+ "version": "2.321.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"