@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
@@ -90,6 +90,33 @@ function tarMember(tarballPath, member) {
90
90
  }
91
91
  }
92
92
 
93
+ /** Create the one npm archive whose bytes will be published. */
94
+ function createCandidateArchive(root, packDestination) {
95
+ mkdirSync(packDestination, { recursive: true });
96
+ if (readdirSync(packDestination).length !== 0) {
97
+ mismatch(`pack destination must be empty (${packDestination})`);
98
+ }
99
+ try {
100
+ return String(
101
+ boundedExecFileSync(
102
+ "npm",
103
+ [
104
+ "pack",
105
+ "--ignore-scripts",
106
+ "--silent",
107
+ "--pack-destination",
108
+ packDestination,
109
+ ],
110
+ { cwd: root, encoding: "utf8", timeout: 120_000 }
111
+ )
112
+ );
113
+ } catch (error) {
114
+ mismatch(
115
+ `npm pack failed before publication (${error instanceof Error ? error.message : String(error)})`
116
+ );
117
+ }
118
+ }
119
+
93
120
  /** Extract the one workspace package version certified by generated bytes. */
94
121
  function certificateVersion(bytes, label) {
95
122
  const match = String(bytes).match(
@@ -115,18 +142,24 @@ export function assertReleaseCommit(releaseCommit) {
115
142
  * @returns {{headCommit: string, tagCommit: string, releaseCommit: string}}
116
143
  */
117
144
  export function assertCheckoutIdentity({ root, releaseCommit, tag }) {
118
- assertReleaseCommit(releaseCommit);
145
+ const validatedReleaseCommit = assertReleaseCommit(releaseCommit);
119
146
  const headCommit = gitCommit(root, "HEAD");
120
- if (headCommit !== releaseCommit) {
147
+ if (headCommit !== validatedReleaseCommit) {
121
148
  mismatch(
122
- `HEAD ${headCommit} does not match release commit ${releaseCommit}`
149
+ `HEAD ${headCommit} does not match release commit ${validatedReleaseCommit}`
123
150
  );
124
151
  }
125
152
  const tagCommit = gitCommit(root, tag);
126
- if (tagCommit !== releaseCommit) {
127
- mismatch(`tag ${tag} resolves ${tagCommit}, expected ${releaseCommit}`);
153
+ if (tagCommit !== validatedReleaseCommit) {
154
+ mismatch(
155
+ `tag ${tag} resolves ${tagCommit}, expected ${validatedReleaseCommit}`
156
+ );
128
157
  }
129
- return Object.freeze({ headCommit, tagCommit, releaseCommit });
158
+ return Object.freeze({
159
+ headCommit,
160
+ tagCommit,
161
+ releaseCommit: validatedReleaseCommit,
162
+ });
130
163
  }
131
164
 
132
165
  /**
@@ -140,21 +173,21 @@ export function packAndValidateReleaseCandidate({
140
173
  releaseCommit,
141
174
  packDestination,
142
175
  }) {
143
- assertReleaseCommit(releaseCommit);
176
+ const validatedReleaseCommit = assertReleaseCommit(releaseCommit);
144
177
  const packageJson = readJson(path.join(root, "package.json"), "package.json");
145
178
  if (packageJson.version !== version) {
146
179
  mismatch(
147
180
  `package.json version ${JSON.stringify(packageJson.version)} expected ${version}`
148
181
  );
149
182
  }
150
- if (packageJson.lisaReleaseCommit !== releaseCommit) {
183
+ if (packageJson.lisaReleaseCommit !== validatedReleaseCommit) {
151
184
  mismatch(
152
- `package.json lisaReleaseCommit ${JSON.stringify(packageJson.lisaReleaseCommit)} expected ${releaseCommit}`
185
+ `package.json lisaReleaseCommit ${JSON.stringify(packageJson.lisaReleaseCommit)} expected ${validatedReleaseCommit}`
153
186
  );
154
187
  }
155
- if (packageJson.gitHead !== releaseCommit) {
188
+ if (packageJson.gitHead !== validatedReleaseCommit) {
156
189
  mismatch(
157
- `package.json gitHead ${JSON.stringify(packageJson.gitHead)} expected ${releaseCommit}`
190
+ `package.json gitHead ${JSON.stringify(packageJson.gitHead)} expected ${validatedReleaseCommit}`
158
191
  );
159
192
  }
160
193
 
@@ -172,30 +205,7 @@ export function packAndValidateReleaseCandidate({
172
205
  }
173
206
  }
174
207
 
175
- mkdirSync(packDestination, { recursive: true });
176
- if (readdirSync(packDestination).length !== 0) {
177
- mismatch(`pack destination must be empty (${packDestination})`);
178
- }
179
- let packOutput;
180
- try {
181
- packOutput = String(
182
- boundedExecFileSync(
183
- "npm",
184
- [
185
- "pack",
186
- "--ignore-scripts",
187
- "--silent",
188
- "--pack-destination",
189
- packDestination,
190
- ],
191
- { cwd: root, encoding: "utf8", timeout: 120_000 }
192
- )
193
- );
194
- } catch (error) {
195
- mismatch(
196
- `npm pack failed before publication (${error instanceof Error ? error.message : String(error)})`
197
- );
198
- }
208
+ const packOutput = createCandidateArchive(root, packDestination);
199
209
  const candidates = readdirSync(packDestination).filter(file =>
200
210
  file.endsWith(".tgz")
201
211
  );
@@ -223,14 +233,14 @@ export function packAndValidateReleaseCandidate({
223
233
  `packed package version ${JSON.stringify(packedPackage.version)} expected ${version}`
224
234
  );
225
235
  }
226
- if (packedPackage.lisaReleaseCommit !== releaseCommit) {
236
+ if (packedPackage.lisaReleaseCommit !== validatedReleaseCommit) {
227
237
  mismatch(
228
- `packed lisaReleaseCommit ${JSON.stringify(packedPackage.lisaReleaseCommit)} expected ${releaseCommit}`
238
+ `packed lisaReleaseCommit ${JSON.stringify(packedPackage.lisaReleaseCommit)} expected ${validatedReleaseCommit}`
229
239
  );
230
240
  }
231
- if (packedPackage.gitHead !== releaseCommit) {
241
+ if (packedPackage.gitHead !== validatedReleaseCommit) {
232
242
  mismatch(
233
- `packed gitHead ${JSON.stringify(packedPackage.gitHead)} expected ${releaseCommit}`
243
+ `packed gitHead ${JSON.stringify(packedPackage.gitHead)} expected ${validatedReleaseCommit}`
234
244
  );
235
245
  }
236
246
 
@@ -241,7 +251,7 @@ export function packAndValidateReleaseCandidate({
241
251
  packedCertificateVersion = certificateVersion(member, "packed certificate");
242
252
  if (packedCertificateVersion !== version) {
243
253
  mismatch(
244
- `packed certificate names ${packedCertificateVersion}, expected ${version} at release commit ${releaseCommit} (${PACKED_CERTIFICATE})`
254
+ `packed certificate names ${packedCertificateVersion}, expected ${version} at release commit ${validatedReleaseCommit} (${PACKED_CERTIFICATE})`
245
255
  );
246
256
  }
247
257
  certificateMemberSha256 = sha256(member);
@@ -249,7 +259,7 @@ export function packAndValidateReleaseCandidate({
249
259
 
250
260
  return Object.freeze({
251
261
  version,
252
- releaseCommit,
262
+ releaseCommit: validatedReleaseCommit,
253
263
  certificateVersion: packedCertificateVersion,
254
264
  tarballPath,
255
265
  tarballSha256: sha256(tarballBytes),
@@ -46,8 +46,27 @@ here="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)"
46
46
  # SessionStart hosts are fail-open, so they surface that result and still allow
47
47
  # the agent session to continue.
48
48
  bash "${here}/setup.sh" --phase=toolchain "$@"
49
+
50
+ # The toolchain child cannot export into this parent shell. Its durable output
51
+ # is linked into ~/.local/bin, so make that directory visible before the next
52
+ # child tries to execute the provider CLI it just installed.
53
+ case ":$PATH:" in
54
+ *":$HOME/.local/bin:"*) ;;
55
+ *) PATH="$HOME/.local/bin:$PATH"; export PATH ;;
56
+ esac
57
+
49
58
  bash "${here}/setup.sh" --phase=secrets "$@"
50
59
 
60
+ # Materialization writes a Lisa-owned block into .profile that sources the
61
+ # generated environment and removes ambient AWS credential poison. The project
62
+ # hook is another non-login child, so load that block here and let the child
63
+ # inherit the exact environment materialization just produced.
64
+ if [ -r "$HOME/.profile" ]; then
65
+ # The materializer owns this runtime path.
66
+ # shellcheck disable=SC1090
67
+ . "$HOME/.profile"
68
+ fi
69
+
51
70
  # A project hook is part of the remote toolchain contract too. It covers tools
52
71
  # that cannot be expressed by the pinned manifest, so skipping it on a cached
53
72
  # session can leave fresh credentials with no client capable of using them.
@@ -132,6 +132,7 @@ for candidate in \
132
132
  ".claude/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
133
133
  ".agents/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
134
134
  ".codex/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
135
+ ".opencode/skills/lisa/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
135
136
  "plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs" \
136
137
  "node_modules/@codyswann/lisa/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs"; do
137
138
  if [ -f "$candidate" ]; then
@@ -7,7 +7,7 @@
7
7
  "workflows": 23,
8
8
  "steps": 639,
9
9
  "couplings": 27,
10
- "inventory": 57
10
+ "inventory": 58
11
11
  },
12
12
  "counts": {
13
13
  "package-backed": 10,
@@ -553,7 +553,7 @@ fi
553
553
  # measured, and the honest command for such a project is still `test:cov` —
554
554
  # slower, but answering to the floor that was configured for what it runs.
555
555
  COVERAGE_SCRIPT="test:cov"
556
- if node -e 'const s=require("./package.json").scripts||{};const u=s["test:cov:unit"];process.exit(typeof u==="string"&&u.includes("LISA_COVERAGE_SCOPE=unit")?0:1)' >/dev/null 2>&1; then
556
+ if node -e 'const s=require("./package.json").scripts||{};const u=s["test:cov:unit"];const marker=/^(?:env(?:\s+-\S+)*\s+)?(?:[A-Za-z_][A-Za-z0-9_]*=\S+\s+)*LISA_COVERAGE_SCOPE=unit(?:\s|$)/;process.exit(typeof u==="string"&&marker.test(u.trim())?0:1)' >/dev/null 2>&1; then
557
557
  COVERAGE_SCRIPT="test:cov:unit"
558
558
  fi
559
559
 
@@ -95,11 +95,11 @@ export const FAMILIES = [
95
95
  * Unknown keys stay unwatched until their direction is explicit here.
96
96
  * @type {Readonly<Record<string, "min"|"max">>}
97
97
  */
98
- export const LIGHTHOUSE_ASSERTION_DIRECTIONS = {
98
+ export const LIGHTHOUSE_ASSERTION_DIRECTIONS = Object.freeze({
99
99
  minScore: "min",
100
100
  maxNumericValue: "max",
101
101
  maxLength: "max",
102
- };
102
+ });
103
103
 
104
104
  /**
105
105
  * Extract numeric Lighthouse assertions with a direction chosen per key.
@@ -112,10 +112,22 @@ export const LIGHTHOUSE_ASSERTION_DIRECTIONS = {
112
112
  */
113
113
  export function extractLighthouseAssertions(conf) {
114
114
  const out = new Map();
115
- const assertions =
115
+ const root =
116
116
  conf && typeof conf === "object" && !Array.isArray(conf)
117
- ? /** @type {Record<string, unknown>} */ (conf).assertions
117
+ ? /** @type {Record<string, unknown>} */ (conf)
118
118
  : undefined;
119
+ const ci =
120
+ root?.ci && typeof root.ci === "object" && !Array.isArray(root.ci)
121
+ ? /** @type {Record<string, unknown>} */ (root.ci)
122
+ : undefined;
123
+ const assert =
124
+ ci?.assert && typeof ci.assert === "object" && !Array.isArray(ci.assert)
125
+ ? /** @type {Record<string, unknown>} */ (ci.assert)
126
+ : undefined;
127
+ // Lighthouse CI's canonical shape is `ci.assert.assertions`. Keep the
128
+ // historical top-level shape as a compatibility lane for already-generated
129
+ // project configs, but never merge the two into an ambiguous hybrid.
130
+ const assertions = assert?.assertions ?? root?.assertions;
119
131
  if (
120
132
  !assertions ||
121
133
  typeof assertions !== "object" ||
@@ -124,9 +136,21 @@ export function extractLighthouseAssertions(conf) {
124
136
  return out;
125
137
  }
126
138
  for (const [audit, spec] of Object.entries(assertions)) {
127
- if (!spec || typeof spec !== "object" || Array.isArray(spec)) continue;
128
- for (const [key, value] of Object.entries(spec)) {
129
- const direction = LIGHTHOUSE_ASSERTION_DIRECTIONS[key];
139
+ const options =
140
+ Array.isArray(spec) &&
141
+ spec.length >= 2 &&
142
+ spec[1] &&
143
+ typeof spec[1] === "object" &&
144
+ !Array.isArray(spec[1])
145
+ ? /** @type {Record<string, unknown>} */ (spec[1])
146
+ : spec && typeof spec === "object" && !Array.isArray(spec)
147
+ ? /** @type {Record<string, unknown>} */ (spec)
148
+ : undefined;
149
+ if (!options) continue;
150
+ for (const [key, value] of Object.entries(options)) {
151
+ const direction = Object.hasOwn(LIGHTHOUSE_ASSERTION_DIRECTIONS, key)
152
+ ? LIGHTHOUSE_ASSERTION_DIRECTIONS[key]
153
+ : undefined;
130
154
  if (direction && typeof value === "number" && Number.isFinite(value)) {
131
155
  out.set(`${audit}.${key}`, { value, direction });
132
156
  }
@@ -7,7 +7,7 @@
7
7
  "format": "prettier --check . --write",
8
8
  "test": "vitest run",
9
9
  "test:unit": "vitest run --exclude='**/integration/**'",
10
- "test:integration:lisa": "vitest run '.integration.' 'integration/' --passWithNoTests",
10
+ "test:integration:lisa": "vitest run '.integration.' 'integration/'",
11
11
  "test:cov": "vitest run --coverage",
12
12
  "test:cov:unit": "LISA_COVERAGE_SCOPE=unit vitest run --coverage --exclude='**/integration/**'",
13
13
  "test:mutation": "node scripts/lisa-mutation.mjs",