@codyswann/lisa 3.26.1 → 3.26.2

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 (151) hide show
  1. package/all/copy-overwrite/scripts/check-state-classification.mjs +31 -0
  2. package/all/copy-overwrite/scripts/lisa-gates.mjs +10 -1
  3. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  4. package/dist/core/lisa-owned-hash-ledger.js +3 -0
  5. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  6. package/dist/core/upstream-evidence-manifest.js +21 -21
  7. package/package.json +1 -1
  8. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  11. package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  12. package/plugins/lisa/.codex-plugin/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  13. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  14. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  15. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  16. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  17. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  18. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  19. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  20. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  21. package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  22. package/plugins/lisa/.codex-plugin/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  23. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  24. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  25. package/plugins/lisa/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  26. package/plugins/lisa/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  27. package/plugins/lisa/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  28. package/plugins/lisa/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  29. package/plugins/lisa/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  30. package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  31. package/plugins/lisa/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  32. package/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  33. package/plugins/lisa/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  34. package/plugins/lisa/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  35. package/plugins/lisa/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  36. package/plugins/lisa/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  37. package/plugins/lisa/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  38. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  39. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  40. package/plugins/lisa-agy/plugin.json +1 -1
  41. package/plugins/lisa-agy/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  42. package/plugins/lisa-agy/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  43. package/plugins/lisa-agy/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  44. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  45. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  46. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  47. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  48. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  49. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  50. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  51. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  52. package/plugins/lisa-agy/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  53. package/plugins/lisa-agy/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  54. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  55. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  56. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  59. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-copilot/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  63. package/plugins/lisa-copilot/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  64. package/plugins/lisa-copilot/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  65. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  66. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  67. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  68. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  69. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  70. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  71. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  72. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  73. package/plugins/lisa-copilot/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  74. package/plugins/lisa-copilot/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  75. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  76. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  77. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-cursor/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  79. package/plugins/lisa-cursor/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  80. package/plugins/lisa-cursor/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  81. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  82. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  83. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  84. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  85. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  86. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  87. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  88. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  89. package/plugins/lisa-cursor/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  90. package/plugins/lisa-cursor/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  91. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  92. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  93. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  95. package/plugins/lisa-expo-agy/plugin.json +1 -1
  96. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  100. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  101. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  105. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  106. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  110. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  111. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  112. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  114. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  115. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  116. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  117. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  118. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  120. package/plugins/lisa-rails-agy/plugin.json +1 -1
  121. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  122. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  123. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  125. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  126. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  127. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  128. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  129. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  130. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  131. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  132. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  133. package/plugins/src/base/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
  134. package/plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
  135. package/plugins/src/base/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
  136. package/plugins/src/base/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
  137. package/plugins/src/base/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
  138. package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
  139. package/plugins/src/base/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
  140. package/plugins/src/base/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
  141. package/plugins/src/base/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
  142. package/plugins/src/base/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
  143. package/plugins/src/base/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
  144. package/plugins/src/base/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
  145. package/plugins/src/base/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
  146. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
  147. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
  148. package/scripts/generate-agy-plugin-artifacts.mjs +2 -1
  149. package/scripts/generate-copilot-plugin-artifacts.mjs +2 -1
  150. package/scripts/generate-cursor-plugin-artifacts.mjs +2 -1
  151. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +14 -3
@@ -23,7 +23,7 @@
23
23
  * @module local-env
24
24
  */
25
25
 
26
- import { existsSync } from "node:fs";
26
+ import { existsSync, realpathSync } from "node:fs";
27
27
  import { dirname, resolve } from "node:path";
28
28
  import { fileURLToPath, pathToFileURL } from "node:url";
29
29
 
@@ -159,7 +159,29 @@ export async function run(argv) {
159
159
  return 0;
160
160
  }
161
161
 
162
- if (import.meta.url === `file://${process.argv[1]}`) {
162
+ /**
163
+ * Whether this module is the one node was asked to run.
164
+ *
165
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
166
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
167
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
168
+ *
169
+ * A local copy rather than an import: plugin payload scripts ship standalone,
170
+ * with no `lib/` sibling to import from once installed.
171
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
172
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
173
+ * @returns {boolean} Whether the caller should run its CLI body.
174
+ */
175
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
176
+ if (!argv1) return false;
177
+ try {
178
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
179
+ } catch {
180
+ return false;
181
+ }
182
+ }
183
+
184
+ if (invokedAsScript(import.meta.url)) {
163
185
  const argv = {
164
186
  installTools: process.argv.includes("--install-tools"),
165
187
  dryRun: process.argv.includes("--dry-run"),
@@ -1519,7 +1519,29 @@ async function main() {
1519
1519
  console.log(`\nRemote environment ${dryRun ? "plan complete" : "ready"}.`);
1520
1520
  }
1521
1521
 
1522
- if (import.meta.url === `file://${process.argv[1]}`) {
1522
+ /**
1523
+ * Whether this module is the one node was asked to run.
1524
+ *
1525
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
1526
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
1527
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
1528
+ *
1529
+ * A local copy rather than an import: plugin payload scripts ship standalone,
1530
+ * with no `lib/` sibling to import from once installed.
1531
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
1532
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
1533
+ * @returns {boolean} Whether the caller should run its CLI body.
1534
+ */
1535
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
1536
+ if (!argv1) return false;
1537
+ try {
1538
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
1539
+ } catch {
1540
+ return false;
1541
+ }
1542
+ }
1543
+
1544
+ if (invokedAsScript(import.meta.url)) {
1523
1545
  // Awaited rather than called bare: main is async, so a synchronous try/catch
1524
1546
  // would let a rejected promise escape as an unhandled rejection and exit 0 —
1525
1547
  // reporting a prepared environment that was never prepared.
@@ -22,7 +22,8 @@
22
22
  */
23
23
 
24
24
  import { execFileSync } from "node:child_process";
25
- import { existsSync, readFileSync, statSync } from "node:fs";
25
+ import { fileURLToPath } from "node:url";
26
+ import { existsSync, readFileSync, statSync, realpathSync } from "node:fs";
26
27
  import { join } from "node:path";
27
28
 
28
29
  import { probe, readRemoteEnvConfig } from "./setup-remote-env.mjs";
@@ -213,7 +214,29 @@ function main() {
213
214
  console.log("\nRemote environment verified without revealing any value.");
214
215
  }
215
216
 
216
- if (import.meta.url === `file://${process.argv[1]}`) {
217
+ /**
218
+ * Whether this module is the one node was asked to run.
219
+ *
220
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
221
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
222
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
223
+ *
224
+ * A local copy rather than an import: plugin payload scripts ship standalone,
225
+ * with no `lib/` sibling to import from once installed.
226
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
227
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
228
+ * @returns {boolean} Whether the caller should run its CLI body.
229
+ */
230
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
231
+ if (!argv1) return false;
232
+ try {
233
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
234
+ } catch {
235
+ return false;
236
+ }
237
+ }
238
+
239
+ if (invokedAsScript(import.meta.url)) {
217
240
  try {
218
241
  main();
219
242
  } catch (err) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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": "3.26.1",
3
+ "version": "3.26.2",
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-typescript",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "3.26.1",
3
+ "version": "3.26.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -202,7 +202,29 @@ function parseInline(text) {
202
202
  return nodes.length > 0 ? nodes : [{ type: "text", text: "" }];
203
203
  }
204
204
 
205
- if (import.meta.url === `file://${process.argv[1]}`) {
205
+ /**
206
+ * Whether this module is the one node was asked to run.
207
+ *
208
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
209
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
210
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
211
+ *
212
+ * A local copy rather than an import: plugin payload scripts ship standalone,
213
+ * with no `lib/` sibling to import from once installed.
214
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
215
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
216
+ * @returns {boolean} Whether the caller should run its CLI body.
217
+ */
218
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
219
+ if (!argv1) return false;
220
+ try {
221
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
222
+ } catch {
223
+ return false;
224
+ }
225
+ }
226
+
227
+ if (invokedAsScript(import.meta.url)) {
206
228
  let input = "";
207
229
  process.stdin.setEncoding("utf8");
208
230
  process.stdin.on("data", chunk => {
@@ -22,7 +22,14 @@
22
22
  * @module detect-tooling
23
23
  */
24
24
 
25
- import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
25
+ import {
26
+ existsSync,
27
+ readFileSync,
28
+ readdirSync,
29
+ statSync,
30
+ realpathSync,
31
+ } from "node:fs";
32
+ import { fileURLToPath } from "node:url";
26
33
  import { join } from "node:path";
27
34
 
28
35
  import { commandsIn } from "./commands.mjs";
@@ -583,7 +590,29 @@ export function proposedEntries(proposal) {
583
590
  };
584
591
  }
585
592
 
586
- if (process.argv[1] && import.meta.url === `file://${process.argv[1]}`) {
593
+ /**
594
+ * Whether this module is the one node was asked to run.
595
+ *
596
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
597
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
598
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
599
+ *
600
+ * A local copy rather than an import: plugin payload scripts ship standalone,
601
+ * with no `lib/` sibling to import from once installed.
602
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
603
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
604
+ * @returns {boolean} Whether the caller should run its CLI body.
605
+ */
606
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
607
+ if (!argv1) return false;
608
+ try {
609
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
610
+ } catch {
611
+ return false;
612
+ }
613
+ }
614
+
615
+ if (invokedAsScript(import.meta.url)) {
587
616
  const proposals = detectTooling();
588
617
  if (process.argv.includes("--json")) {
589
618
  console.log(JSON.stringify(proposals, null, 2));
@@ -20,7 +20,13 @@
20
20
  */
21
21
 
22
22
  import { execFileSync } from "node:child_process";
23
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
23
+ import {
24
+ existsSync,
25
+ mkdirSync,
26
+ readFileSync,
27
+ writeFileSync,
28
+ realpathSync,
29
+ } from "node:fs";
24
30
  import { dirname, join, resolve } from "node:path";
25
31
  import { fileURLToPath } from "node:url";
26
32
 
@@ -495,7 +501,29 @@ async function main() {
495
501
  console.log(`recorded in ${LEDGER}; not polling — this process is done.`);
496
502
  }
497
503
 
498
- if (import.meta.url === `file://${process.argv[1]}`) {
504
+ /**
505
+ * Whether this module is the one node was asked to run.
506
+ *
507
+ * Both sides are realpath'd: a raw URL comparison answers "no" through a
508
+ * symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
509
+ * loads, runs nothing and exits 0 — a silent no-op that reads as success.
510
+ *
511
+ * A local copy rather than an import: plugin payload scripts ship standalone,
512
+ * with no `lib/` sibling to import from once installed.
513
+ * @param {string} moduleUrl - The caller's own `import.meta.url`.
514
+ * @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
515
+ * @returns {boolean} Whether the caller should run its CLI body.
516
+ */
517
+ function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
518
+ if (!argv1) return false;
519
+ try {
520
+ return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
521
+ } catch {
522
+ return false;
523
+ }
524
+ }
525
+
526
+ if (invokedAsScript(import.meta.url)) {
499
527
  // Awaited rather than called bare: one dispatch path is async, so a synchronous
500
528
  // try/catch would let a rejection escape as an unhandled rejection and exit 0 —
501
529
  // reporting dispatched work that was never accepted.