@codyswann/lisa 4.22.9 → 4.22.11

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 (274) hide show
  1. package/all/copy-overwrite/scripts/check-release-package-identity.mjs +51 -41
  2. package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +127 -0
  3. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +63 -8
  4. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +36 -6
  5. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +35 -13
  6. package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +11 -3
  7. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +41 -8
  8. package/all/copy-overwrite/scripts/lisa-schema-validate.mjs +2 -2
  9. package/all/copy-overwrite/scripts/lisa-work-item.mjs +2 -1
  10. package/cdk/package-lisa/package.lisa.json +1 -1
  11. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  12. package/dist/core/lisa-owned-hash-ledger.js +26 -0
  13. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  14. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  15. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  16. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  17. package/dist/core/upstream-evidence-manifest.js +61 -52
  18. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  19. package/dist/opencode/plugin-templates/parity-safety-net.sh +36 -6
  20. package/nestjs/package-lisa/package.lisa.json +1 -1
  21. package/package.json +3 -3
  22. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +10 -13
  25. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +4 -2
  26. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  27. package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +8 -3
  28. package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +7 -10
  29. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +5 -0
  30. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  31. package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +1 -1
  32. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +8 -12
  33. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +1 -1
  34. package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  35. package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +7 -10
  36. package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +7 -10
  37. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +19 -3
  38. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  39. package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +7 -10
  40. package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +7 -10
  41. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +9 -12
  42. package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +7 -10
  43. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  44. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +6 -1
  45. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  46. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  47. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  48. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  49. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  50. package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  51. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +1 -1
  52. package/plugins/lisa/hooks/parity-safety-net.sh +36 -6
  53. package/plugins/lisa/hooks/threshold-ratchet-families.mjs +31 -7
  54. package/plugins/lisa/rules/reference/base-rules.md +1 -1
  55. package/plugins/lisa/rules/reference/config-resolution.md +5 -14
  56. package/plugins/lisa/scripts/install-remote-agent-aws.mjs +5 -1
  57. package/plugins/lisa/scripts/rollup-blocker-classification.mjs +18 -3
  58. package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +10 -13
  59. package/plugins/lisa/skills/lisa-doctor/SKILL.md +4 -2
  60. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  61. package/plugins/lisa/skills/lisa-github-sync/SKILL.md +8 -3
  62. package/plugins/lisa/skills/lisa-jam-access/SKILL.md +7 -10
  63. package/plugins/lisa/skills/lisa-jira-journey/SKILL.md +5 -0
  64. package/plugins/lisa/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  65. package/plugins/lisa/skills/lisa-jira-sync/SKILL.md +1 -1
  66. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +8 -12
  67. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +1 -1
  68. package/plugins/lisa/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  69. package/plugins/lisa/skills/lisa-notion-access/SKILL.md +7 -10
  70. package/plugins/lisa/skills/lisa-posthog-access/SKILL.md +7 -10
  71. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +19 -3
  72. package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  73. package/plugins/lisa/skills/lisa-sentry-access/SKILL.md +7 -10
  74. package/plugins/lisa/skills/lisa-setup-atlassian/SKILL.md +7 -10
  75. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +9 -12
  76. package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +7 -10
  77. package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  78. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +6 -1
  79. package/plugins/lisa/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  80. package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  81. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  82. package/plugins/lisa/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  83. package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  84. package/plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  85. package/plugins/lisa/skills/lisa-tracker-sync/SKILL.md +1 -1
  86. package/plugins/lisa-agy/hooks/parity-safety-net.sh +36 -6
  87. package/plugins/lisa-agy/plugin.json +1 -1
  88. package/plugins/lisa-agy/scripts/install-remote-agent-aws.mjs +5 -1
  89. package/plugins/lisa-agy/scripts/rollup-blocker-classification.mjs +18 -3
  90. package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +10 -13
  91. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +4 -2
  92. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  93. package/plugins/lisa-agy/skills/lisa-github-sync/SKILL.md +8 -3
  94. package/plugins/lisa-agy/skills/lisa-jam-access/SKILL.md +7 -10
  95. package/plugins/lisa-agy/skills/lisa-jira-journey/SKILL.md +5 -0
  96. package/plugins/lisa-agy/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  97. package/plugins/lisa-agy/skills/lisa-jira-sync/SKILL.md +1 -1
  98. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +8 -12
  99. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +1 -1
  100. package/plugins/lisa-agy/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  101. package/plugins/lisa-agy/skills/lisa-notion-access/SKILL.md +7 -10
  102. package/plugins/lisa-agy/skills/lisa-posthog-access/SKILL.md +7 -10
  103. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +19 -3
  104. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  105. package/plugins/lisa-agy/skills/lisa-sentry-access/SKILL.md +7 -10
  106. package/plugins/lisa-agy/skills/lisa-setup-atlassian/SKILL.md +7 -10
  107. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +9 -12
  108. package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +7 -10
  109. package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  110. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +6 -1
  111. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  112. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  113. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  114. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  115. package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  116. package/plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  117. package/plugins/lisa-agy/skills/lisa-tracker-sync/SKILL.md +1 -1
  118. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  120. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  121. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  122. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  123. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +36 -6
  125. package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +31 -7
  126. package/plugins/lisa-copilot/rules/reference/base-rules.md +1 -1
  127. package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -14
  128. package/plugins/lisa-copilot/scripts/install-remote-agent-aws.mjs +5 -1
  129. package/plugins/lisa-copilot/scripts/rollup-blocker-classification.mjs +18 -3
  130. package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +10 -13
  131. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +4 -2
  132. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  133. package/plugins/lisa-copilot/skills/lisa-github-sync/SKILL.md +8 -3
  134. package/plugins/lisa-copilot/skills/lisa-jam-access/SKILL.md +7 -10
  135. package/plugins/lisa-copilot/skills/lisa-jira-journey/SKILL.md +5 -0
  136. package/plugins/lisa-copilot/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  137. package/plugins/lisa-copilot/skills/lisa-jira-sync/SKILL.md +1 -1
  138. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +8 -12
  139. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +1 -1
  140. package/plugins/lisa-copilot/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  141. package/plugins/lisa-copilot/skills/lisa-notion-access/SKILL.md +7 -10
  142. package/plugins/lisa-copilot/skills/lisa-posthog-access/SKILL.md +7 -10
  143. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +19 -3
  144. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  145. package/plugins/lisa-copilot/skills/lisa-sentry-access/SKILL.md +7 -10
  146. package/plugins/lisa-copilot/skills/lisa-setup-atlassian/SKILL.md +7 -10
  147. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +9 -12
  148. package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +7 -10
  149. package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  150. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +6 -1
  151. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  152. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  153. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  154. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  155. package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  156. package/plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  157. package/plugins/lisa-copilot/skills/lisa-tracker-sync/SKILL.md +1 -1
  158. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  159. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +36 -6
  160. package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +31 -7
  161. package/plugins/lisa-cursor/rules/base-rules-reference.mdc +1 -1
  162. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -14
  163. package/plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs +5 -1
  164. package/plugins/lisa-cursor/scripts/rollup-blocker-classification.mjs +18 -3
  165. package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +10 -13
  166. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +4 -2
  167. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  168. package/plugins/lisa-cursor/skills/lisa-github-sync/SKILL.md +8 -3
  169. package/plugins/lisa-cursor/skills/lisa-jam-access/SKILL.md +7 -10
  170. package/plugins/lisa-cursor/skills/lisa-jira-journey/SKILL.md +5 -0
  171. package/plugins/lisa-cursor/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  172. package/plugins/lisa-cursor/skills/lisa-jira-sync/SKILL.md +1 -1
  173. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +8 -12
  174. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +1 -1
  175. package/plugins/lisa-cursor/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  176. package/plugins/lisa-cursor/skills/lisa-notion-access/SKILL.md +7 -10
  177. package/plugins/lisa-cursor/skills/lisa-posthog-access/SKILL.md +7 -10
  178. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +19 -3
  179. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  180. package/plugins/lisa-cursor/skills/lisa-sentry-access/SKILL.md +7 -10
  181. package/plugins/lisa-cursor/skills/lisa-setup-atlassian/SKILL.md +7 -10
  182. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +9 -12
  183. package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +7 -10
  184. package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  185. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +6 -1
  186. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  187. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  188. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  189. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  190. package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  191. package/plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  192. package/plugins/lisa-cursor/skills/lisa-tracker-sync/SKILL.md +1 -1
  193. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  194. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  195. package/plugins/lisa-expo-agy/plugin.json +1 -1
  196. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  197. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  198. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  199. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  200. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  201. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  202. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  203. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  204. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  205. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  206. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  207. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  208. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  209. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  210. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  211. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  212. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  213. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  214. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  215. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  216. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  217. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  218. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  219. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  220. package/plugins/lisa-rails-agy/plugin.json +1 -1
  221. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  222. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  223. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  224. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  225. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  226. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  227. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  228. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  229. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  230. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  231. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  232. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  233. package/plugins/src/base/hooks/parity-safety-net.sh +36 -6
  234. package/plugins/src/base/hooks/threshold-ratchet-families.mjs +31 -7
  235. package/plugins/src/base/rules/reference/base-rules.md +1 -1
  236. package/plugins/src/base/rules/reference/config-resolution.md +5 -14
  237. package/plugins/src/base/scripts/install-remote-agent-aws.mjs +5 -1
  238. package/plugins/src/base/scripts/rollup-blocker-classification.mjs +18 -3
  239. package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +10 -13
  240. package/plugins/src/base/skills/lisa-doctor/SKILL.md +4 -2
  241. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
  242. package/plugins/src/base/skills/lisa-github-sync/SKILL.md +8 -3
  243. package/plugins/src/base/skills/lisa-jam-access/SKILL.md +7 -10
  244. package/plugins/src/base/skills/lisa-jira-journey/SKILL.md +5 -0
  245. package/plugins/src/base/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
  246. package/plugins/src/base/skills/lisa-jira-sync/SKILL.md +1 -1
  247. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +8 -12
  248. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +1 -1
  249. package/plugins/src/base/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
  250. package/plugins/src/base/skills/lisa-notion-access/SKILL.md +7 -10
  251. package/plugins/src/base/skills/lisa-posthog-access/SKILL.md +7 -10
  252. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +19 -3
  253. package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
  254. package/plugins/src/base/skills/lisa-sentry-access/SKILL.md +7 -10
  255. package/plugins/src/base/skills/lisa-setup-atlassian/SKILL.md +7 -10
  256. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +9 -12
  257. package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +7 -10
  258. package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +7 -2
  259. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +6 -1
  260. package/plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
  261. package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
  262. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
  263. package/plugins/src/base/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
  264. package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
  265. package/plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md +7 -10
  266. package/plugins/src/base/skills/lisa-tracker-sync/SKILL.md +1 -1
  267. package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
  268. package/scripts/check-release-package-identity.mjs +51 -41
  269. package/scripts/lisa-remote-env/session-start.sh +19 -0
  270. package/scripts/lisa-remote-env/setup.sh +1 -0
  271. package/scripts/two-channel-couplings.json +1 -1
  272. package/typescript/copy-contents/.husky/pre-push +1 -1
  273. package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
  274. package/typescript/package-lisa/package.lisa.json +1 -1
@@ -63,9 +63,9 @@ read_sonar_secret() {
63
63
  local name="$1"
64
64
  [ -n "${!name:-}" ] && { echo "${!name}"; return; }
65
65
  #
66
- # Ordered repo-first, ending at the plugin's own copy. Repo-relative rungs
67
- # lead because a project that vendors the resolver has declared which copy it
68
- # wants used, and that decision must survive this change untouched. The plugin
66
+ # Ordered across trusted machine-managed substrates, ending at the installed
67
+ # package. Checkout-local paths are deliberately absent: a familiar generated
68
+ # destination is still repository-controlled executable code. The plugin
69
69
  # rungs are the floor: `resolve-secret.mjs` ships beside this skill, so a rung
70
70
  # pointing at it is reachable from anywhere the plugin itself is installed.
71
71
  # Without one, a consumer repository that vendors none of the leading paths
@@ -74,12 +74,9 @@ read_sonar_secret() {
74
74
  # lookups. This LADDER is identical in every skill that resolves a credential
75
75
  # and `credential-resolver-ladder` fails if any copy diverges. Only what
76
76
  # happens AFTER the ladder may differ between them.
77
- local candidates=(
78
- .claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs
79
- .agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs
80
- .opencode/skills/lisa/lisa-secrets-access/scripts/resolve-secret.mjs
81
- .codex/skills/lisa/lisa-secrets-access/scripts/resolve-secret.mjs
82
- )
77
+ # Execute only machine-managed plugin/package resolvers. Checkout-local
78
+ # candidates are repository-controlled code, not trusted merely by path.
79
+ local candidates=()
83
80
  if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
84
81
  candidates+=("$CLAUDE_PLUGIN_ROOT/skills/lisa-secrets-access/scripts/resolve-secret.mjs")
85
82
  fi
@@ -98,7 +95,7 @@ read_sonar_secret() {
98
95
  local via_lisa
99
96
  via_lisa=$(node "$resolver" get "$name" 2>/dev/null) \
100
97
  && [ -n "$via_lisa" ] && { echo "$via_lisa"; return; }
101
- break
98
+ # Empty/error means this substrate had no answer; try the next trusted one.
102
99
  fi
103
100
  done
104
101
  # Name every path. A bare `return 1` sends the next reader hunting for a
@@ -58,7 +58,7 @@ The state machine (first match wins, evaluated over the **required** leaves only
58
58
  | else any leaf has **started** (claimed or in review, or shipped while a sibling has not) | active / in-progress | `claimed` (or `review` where supported) |
59
59
  | else (leaves exist, none started) | unchanged | — |
60
60
 
61
- - **Blocked dominates** — one blocked leaf surfaces blocked on the parent even while others progress. It never says *which* child or *which kind* of hold; run `scripts/rollup-blocker-classification.mjs` over the resolved child graph and carry its per-class report — blocking leaf, path, and who must act — into the rollup note. A non-zero exit means it classified nothing; that is a failure to report, never an all-clear. See `leaf-only-lifecycle` → **Classifying a hold**.
61
+ - **Blocked dominates** — one blocked leaf surfaces blocked on the parent even while others progress. It never says *which* child or *which kind* of hold. Resolve the shared classifier from `${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-plugins/lisa}}/scripts/rollup-blocker-classification.mjs` (the current-directory fallback supports a Lisa checkout), run it over the resolved child graph, and carry its per-class report — blocking leaf, path, and who must act — into the rollup note. A missing classifier or non-zero exit is a strict **no-write** result for every vendor: no lifecycle mutation and no rollup-comment mutation. Report the failure, never an all-clear. See `leaf-only-lifecycle` → **Classifying a hold**.
62
62
  - **Least-advanced env wins** — a parent reaches an env only once all required leaves have reached at least that env (all `On Stg` → `On Stg`; mixed dev/staging → the dev value). Native terminal closure fires only at the production `done`, never at an intermediate env.
63
63
  - **The parent never carries `ready`** — `ready` is a human "claim this leaf" signal; rollup only moves a parent between non-ready container states.
64
64
  - **Rollup is recursive** — an Epic rolls up from its Stories, each of which rolls up from its own leaves. Evaluate bottom-up.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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": "4.22.9",
3
+ "version": "4.22.11",
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"
@@ -1064,8 +1064,38 @@ readonly AGENT_CREDENTIAL='(\.(claude|codex|cursor|copilot|gemini|antigravity)/[
1064
1064
  # 15d. Dotenv files. `.env.example`, `.sample`, `.template`, `.dist` and
1065
1065
  # `.schema` are checked-in documentation of which keys exist, never the values,
1066
1066
  # so they are excluded — that collision is the one this rule most had to avoid.
1067
- readonly DOTENV_SECRET='(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?([[:space:]'"$qc"']|$)'
1068
- readonly DOTENV_PUBLIC='\.env\.(example|sample|template|dist|schema|defaults)([[:space:]'"$qc"']|$)'
1067
+ # Decide dotenv privacy per PATH, never by subtracting one command-wide match
1068
+ # from another. A command that names `.env.example` and `.env` contains both a
1069
+ # public path and a private one; seeing the former cannot authorize the latter.
1070
+ #
1071
+ # The one write-only shape this guard has always allowed remains explicit:
1072
+ # seeding a private dotenv destination from one public template. This is safe
1073
+ # because the private path is the destination, not a value being read back.
1074
+ has_private_dotenv_path() {
1075
+ dotenv_scan_status=0
1076
+ dotenv_candidates="$(printf '%s' "$normalized_command_str" \
1077
+ | grep -Eio -- '(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?')" \
1078
+ || dotenv_scan_status=$?
1079
+ if [ "$dotenv_scan_status" -gt 1 ]; then
1080
+ block "dotenv path classification failed; denying the credential-store read fail-closed."
1081
+ fi
1082
+
1083
+ while IFS= read -r candidate; do
1084
+ [ -n "$candidate" ] || continue
1085
+ candidate="$(printf '%s' "$candidate" \
1086
+ | tr '[:upper:]' '[:lower:]' \
1087
+ | grep -Eo -- '\.env(\.[[:alnum:]_-]+)?')"
1088
+ case "$candidate" in
1089
+ .env.example | .env.sample | .env.template | .env.dist | .env.schema | .env.defaults) ;;
1090
+ *) return 0 ;;
1091
+ esac
1092
+ done <<EOF
1093
+ $dotenv_candidates
1094
+ EOF
1095
+ return 1
1096
+ }
1097
+
1098
+ readonly SAFE_DOTENV_SEED='^[[:space:]]*(cp|mv)[[:space:]]+\.env\.(example|sample|template|dist|schema|defaults)[[:space:]]+\.env(\.[[:alnum:]_-]+)?[[:space:]]*$'
1069
1099
 
1070
1100
  if matches "$SECRET_READ_VERB"; then
1071
1101
  if matches "$SSH_PRIVATE_KEY"; then
@@ -1077,10 +1107,10 @@ if matches "$SECRET_READ_VERB"; then
1077
1107
  if matches "$AGENT_CREDENTIAL"; then
1078
1108
  block "reading, copying or transmitting a coding-agent or package-registry credential store. These tokens impersonate the operator to every service the agent can reach."
1079
1109
  fi
1080
- # `.env` only when the path is NOT one of the public example forms. Ordered as
1081
- # an exclusion rather than a narrower pattern so a new example suffix is one
1082
- # word to add, and so the reason a file is exempt stays readable.
1083
- if matches "$DOTENV_SECRET" && ! matches "$DOTENV_PUBLIC"; then
1110
+ # A public path elsewhere in the command never exempts a private path. The
1111
+ # narrow public-template -> private-destination seed is write-only and remains
1112
+ # allowed; every other command containing a private dotenv path is refused.
1113
+ if has_private_dotenv_path && ! matches "$SAFE_DOTENV_SEED"; then
1084
1114
  block "reading, copying or transmitting a dotenv file holding real values. \`.env.example\`, \`.env.sample\`, \`.env.template\` and \`.env.dist\` are readable, and WRITING a .env is unaffected — only reading one back is refused."
1085
1115
  fi
1086
1116
  # Fail-closed, narrowly. A read whose DIRECTORY is a known credential store
@@ -92,11 +92,11 @@ export const FAMILIES = [
92
92
  * Unknown keys stay unwatched until their direction is explicit here.
93
93
  * @type {Readonly<Record<string, "min"|"max">>}
94
94
  */
95
- export const LIGHTHOUSE_ASSERTION_DIRECTIONS = {
95
+ export const LIGHTHOUSE_ASSERTION_DIRECTIONS = Object.freeze({
96
96
  minScore: "min",
97
97
  maxNumericValue: "max",
98
98
  maxLength: "max",
99
- };
99
+ });
100
100
 
101
101
  /**
102
102
  * Extract numeric Lighthouse assertions with a direction chosen per key.
@@ -109,10 +109,22 @@ export const LIGHTHOUSE_ASSERTION_DIRECTIONS = {
109
109
  */
110
110
  export function extractLighthouseAssertions(conf) {
111
111
  const out = new Map();
112
- const assertions =
112
+ const root =
113
113
  conf && typeof conf === "object" && !Array.isArray(conf)
114
- ? /** @type {Record<string, unknown>} */ (conf).assertions
114
+ ? /** @type {Record<string, unknown>} */ (conf)
115
115
  : undefined;
116
+ const ci =
117
+ root?.ci && typeof root.ci === "object" && !Array.isArray(root.ci)
118
+ ? /** @type {Record<string, unknown>} */ (root.ci)
119
+ : undefined;
120
+ const assert =
121
+ ci?.assert && typeof ci.assert === "object" && !Array.isArray(ci.assert)
122
+ ? /** @type {Record<string, unknown>} */ (ci.assert)
123
+ : undefined;
124
+ // Lighthouse CI's canonical shape is `ci.assert.assertions`. Keep the
125
+ // historical top-level shape as a compatibility lane for already-generated
126
+ // project configs, but never merge the two into an ambiguous hybrid.
127
+ const assertions = assert?.assertions ?? root?.assertions;
116
128
  if (
117
129
  !assertions ||
118
130
  typeof assertions !== "object" ||
@@ -121,9 +133,21 @@ export function extractLighthouseAssertions(conf) {
121
133
  return out;
122
134
  }
123
135
  for (const [audit, spec] of Object.entries(assertions)) {
124
- if (!spec || typeof spec !== "object" || Array.isArray(spec)) continue;
125
- for (const [key, value] of Object.entries(spec)) {
126
- const direction = LIGHTHOUSE_ASSERTION_DIRECTIONS[key];
136
+ const options =
137
+ Array.isArray(spec) &&
138
+ spec.length >= 2 &&
139
+ spec[1] &&
140
+ typeof spec[1] === "object" &&
141
+ !Array.isArray(spec[1])
142
+ ? /** @type {Record<string, unknown>} */ (spec[1])
143
+ : spec && typeof spec === "object" && !Array.isArray(spec)
144
+ ? /** @type {Record<string, unknown>} */ (spec)
145
+ : undefined;
146
+ if (!options) continue;
147
+ for (const [key, value] of Object.entries(options)) {
148
+ const direction = Object.hasOwn(LIGHTHOUSE_ASSERTION_DIRECTIONS, key)
149
+ ? LIGHTHOUSE_ASSERTION_DIRECTIONS[key]
150
+ : undefined;
127
151
  if (direction && typeof value === "number" && Number.isFinite(value)) {
128
152
  out.set(`${audit}.${key}`, { value, direction });
129
153
  }
@@ -70,7 +70,7 @@ Testing Discipline:
70
70
  JIRA Discipline:
71
71
  - If working on a JIRA issue, make sure the branch you're working on references and is added to the JIRA issue.
72
72
  - If working on a JIRA issue, update the issue as you work through it. For example, if working on a Bug Triage, update the issue with your questions/feedback/suggestions.
73
- - When reading a JIRA issue, always read ALL comments on the ticket — not just the description. Comments contain critical context: stakeholder decisions, scope changes, blockers, triage findings from other repos, and implementation notes. Use the Atlassian MCP or first resolve the project root from `$CLAUDE_PROJECT_DIR` or `git rev-parse --show-toplevel`, then run `jira --config "$PROJECT_ROOT/.lisa/jira-cli/.config.yml" issue view <TICKET_ID> --comments 100`. If that project config is absent, omit `--config` to use the machine's own `~/.config/.jira/.config.yml`.
73
+ - When reading a JIRA issue, always read ALL comments on the ticket — not just the description. Comments contain critical context: stakeholder decisions, scope changes, blockers, triage findings from other repos, and implementation notes. Use the Atlassian MCP or first resolve the project root from `$CLAUDE_PROJECT_DIR` or `git rev-parse --show-toplevel`. When `$PROJECT_ROOT/.lisa/jira-cli/.config.yml` exists, run both `jira --config "$PROJECT_ROOT/.lisa/jira-cli/.config.yml" issue view <TICKET_ID>` and `jira --config "$PROJECT_ROOT/.lisa/jira-cli/.config.yml" issue comment list <TICKET_ID>`; the dedicated comment-list command returns the complete comment collection instead of a fixed recent-comment window. If that project config is absent, omit `--config` from both commands to use the machine's own `~/.config/.jira/.config.yml`.
74
74
  - When requesting clarification on a JIRA issue, post the question as a comment using ADF (Atlassian Document Format) and @mention the Reporter so they receive a notification.
75
75
  - When creating JIRA tickets, establish issue link relationships (e.g. "is blocked by", "blocks", "relates to", "is duplicated by") between tickets that have dependencies or logical connections. Do not leave related tickets unlinked. Relationship discovery is mandatory on every create and update — search BOTH the local git history (`git log --all --grep=<keyword>`, `git log -- <path>`) AND Jira (JQL by component, keyword, label, epic siblings) before declaring "no related work." Record the searches you ran and their outcomes in the description (or a comment) so a reviewer can see the search was real.
76
76
  - Ticket scope by type: Bug, Task, and Sub-task tickets MUST be single-repo (one work unit, one repo). Epic, Spike, and Story tickets MAY span multiple repos. If a Bug/Task/Sub-task crosses repos, split it per the `repo-scope-split` rule — at PRD-decomposition time via `task-decomposition` step 1.5 (parent Story + per-repo children); at work-time (an existing ticket an agent is about to implement) via the work-time split procedure (narrow the original to one repo, spin off a sibling per additional repo cloning its metadata, link the producer→consumer dependency, then proceed). A cross-repo work unit is a decomposition error the agent fixes by splitting, not a reason to bounce the ticket to the reporter.
@@ -899,19 +899,10 @@ read_notion_token() {
899
899
  # and the surface ladder. An agent following this reference must try it before
900
900
  # any keychain — a second reader is how one credential ends up in two places.
901
901
  #
902
- # Ordered repo-first, ending at the plugin's own copy. Repo-relative rungs
903
- # lead because a project that vendors the resolver has declared which copy it
904
- # wants used. The plugin rungs are the floor: `resolve-secret.mjs` ships
905
- # beside the skill, so a rung pointing at it is reachable from anywhere the
906
- # plugin itself is installed. Without one, a consumer repository that vendors
907
- # none of the leading paths never reaches a resolver at all — and an agent
908
- # copying a two-rung ladder out of THIS reference reproduces that.
909
- local candidates=(
910
- .claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs
911
- .agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs
912
- .opencode/skills/lisa/lisa-secrets-access/scripts/resolve-secret.mjs
913
- .codex/skills/lisa/lisa-secrets-access/scripts/resolve-secret.mjs
914
- )
902
+ # Resolver scripts are executable code, so a familiar checkout-local path is
903
+ # not provenance. Use only machine-managed plugin roots and the installed
904
+ # package; never execute repository-controlled candidates from this ladder.
905
+ local candidates=()
915
906
  if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
916
907
  candidates+=("$CLAUDE_PLUGIN_ROOT/skills/lisa-secrets-access/scripts/resolve-secret.mjs")
917
908
  fi
@@ -930,7 +921,7 @@ read_notion_token() {
930
921
  local via_lisa
931
922
  via_lisa=$(node "$resolver" get NOTION_API_TOKEN 2>/dev/null) \
932
923
  && [ -n "$via_lisa" ] && { echo "$via_lisa"; return; }
933
- break
924
+ # Empty/error means this substrate had no answer; try the next trusted one.
934
925
  fi
935
926
  done
936
927
  # Legacy fallback: the OS keychain written by the guided setup flow, for
@@ -329,12 +329,16 @@ the complete bundle from the shared account. Do not extract or distribute its
329
329
  individual access-key fields:
330
330
 
331
331
  \`\`\`bash
332
- aws --profile shared secretsmanager get-secret-value \\
332
+ aws secretsmanager get-secret-value \\
333
333
  --secret-id ${secretName} \\
334
334
  --query SecretString \\
335
335
  --output text
336
336
  \`\`\`
337
337
 
338
+ This uses the ambient AWS identity. Add \`--profile <source-profile>\` only when
339
+ this project requires a named source profile to read the emission; \`shared\` is
340
+ not an implicit requirement.
341
+
338
342
  Store that exact output as the masked secret \`LISA_AWS_BOOTSTRAP_JSON\` on each
339
343
  remote-agent platform. Run the setup command and require its live
340
344
  \`sts:GetCallerIdentity\` check to pass before considering the platform ready.