@codyswann/lisa 4.54.13 → 4.55.0

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 (578) hide show
  1. package/all/copy-contents/.gitattributes +8 -0
  2. package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +78 -9
  3. package/all/copy-overwrite/scripts/check-third-party-action-pins.mjs +17 -1
  4. package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +194 -7
  5. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +31 -0
  6. package/all/copy-overwrite/scripts/lisa-hooks/block-blind-automerge.sh +81 -2
  7. package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +293 -8
  8. package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +21 -0
  9. package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +78 -15
  10. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +21 -0
  11. package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +21 -0
  12. package/all/copy-overwrite/scripts/lisa-hooks/guard-dedupe.bash +340 -0
  13. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +29 -1
  14. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +183 -1
  15. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.sh +21 -0
  16. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +21 -1
  17. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +100 -5
  18. package/all/copy-overwrite/scripts/lisa-work-item.mjs +1085 -80
  19. package/all/create-only/.github/workflows/continuous-gates.yml +7 -0
  20. package/cdk/create-only/.github/workflows/ci.yml +7 -0
  21. package/cdk/create-only/.github/workflows/deploy.yml +21 -0
  22. package/dist/cli/apply.d.ts.map +1 -1
  23. package/dist/cli/apply.js +9 -1
  24. package/dist/cli/apply.js.map +1 -1
  25. package/dist/cli/doctor-apply-deletions.d.ts +61 -0
  26. package/dist/cli/doctor-apply-deletions.d.ts.map +1 -0
  27. package/dist/cli/doctor-apply-deletions.js +137 -0
  28. package/dist/cli/doctor-apply-deletions.js.map +1 -0
  29. package/dist/cli/doctor-cdk-preset-adoption.d.ts +15 -0
  30. package/dist/cli/doctor-cdk-preset-adoption.d.ts.map +1 -0
  31. package/dist/cli/doctor-cdk-preset-adoption.js +316 -0
  32. package/dist/cli/doctor-cdk-preset-adoption.js.map +1 -0
  33. package/dist/cli/doctor-config-shadowing.d.ts +22 -0
  34. package/dist/cli/doctor-config-shadowing.d.ts.map +1 -0
  35. package/dist/cli/doctor-config-shadowing.js +123 -0
  36. package/dist/cli/doctor-config-shadowing.js.map +1 -0
  37. package/dist/cli/doctor-rails-deploy-intent.d.ts +15 -0
  38. package/dist/cli/doctor-rails-deploy-intent.d.ts.map +1 -0
  39. package/dist/cli/doctor-rails-deploy-intent.js +197 -0
  40. package/dist/cli/doctor-rails-deploy-intent.js.map +1 -0
  41. package/dist/cli/doctor-seeded-artifacts.d.ts +12 -0
  42. package/dist/cli/doctor-seeded-artifacts.d.ts.map +1 -0
  43. package/dist/cli/doctor-seeded-artifacts.js +54 -0
  44. package/dist/cli/doctor-seeded-artifacts.js.map +1 -0
  45. package/dist/cli/doctor-stale-banner-scan.d.ts +44 -0
  46. package/dist/cli/doctor-stale-banner-scan.d.ts.map +1 -0
  47. package/dist/cli/doctor-stale-banner-scan.js +152 -0
  48. package/dist/cli/doctor-stale-banner-scan.js.map +1 -0
  49. package/dist/cli/doctor-stale-managed-banner.d.ts +19 -0
  50. package/dist/cli/doctor-stale-managed-banner.d.ts.map +1 -0
  51. package/dist/cli/doctor-stale-managed-banner.js +198 -0
  52. package/dist/cli/doctor-stale-managed-banner.js.map +1 -0
  53. package/dist/cli/doctor.d.ts.map +1 -1
  54. package/dist/cli/doctor.js +16 -0
  55. package/dist/cli/doctor.js.map +1 -1
  56. package/dist/cli/ui-detected-stacks.d.ts.map +1 -1
  57. package/dist/cli/ui-detected-stacks.js +3 -2
  58. package/dist/cli/ui-detected-stacks.js.map +1 -1
  59. package/dist/cli/update-check.d.ts.map +1 -1
  60. package/dist/cli/update-check.js +14 -0
  61. package/dist/cli/update-check.js.map +1 -1
  62. package/dist/cli/worktree-liveness.d.ts +5 -0
  63. package/dist/cli/worktree-liveness.d.ts.map +1 -1
  64. package/dist/cli/worktree-liveness.js +7 -6
  65. package/dist/cli/worktree-liveness.js.map +1 -1
  66. package/dist/cli/worktree-ownership.d.ts +13 -0
  67. package/dist/cli/worktree-ownership.d.ts.map +1 -1
  68. package/dist/cli/worktree-ownership.js +14 -0
  69. package/dist/cli/worktree-ownership.js.map +1 -1
  70. package/dist/configs/eslint/base.d.ts +34 -0
  71. package/dist/configs/eslint/base.d.ts.map +1 -1
  72. package/dist/configs/eslint/base.js +34 -0
  73. package/dist/configs/eslint/base.js.map +1 -1
  74. package/dist/core/apply-receipt.d.ts +65 -0
  75. package/dist/core/apply-receipt.d.ts.map +1 -1
  76. package/dist/core/apply-receipt.js +62 -2
  77. package/dist/core/apply-receipt.js.map +1 -1
  78. package/dist/core/cdk-preset-adoption.d.ts +136 -0
  79. package/dist/core/cdk-preset-adoption.d.ts.map +1 -0
  80. package/dist/core/cdk-preset-adoption.js +135 -0
  81. package/dist/core/cdk-preset-adoption.js.map +1 -0
  82. package/dist/core/config-shadowing.d.ts +36 -0
  83. package/dist/core/config-shadowing.d.ts.map +1 -1
  84. package/dist/core/config-shadowing.js +38 -0
  85. package/dist/core/config-shadowing.js.map +1 -1
  86. package/dist/core/config.d.ts +11 -0
  87. package/dist/core/config.d.ts.map +1 -1
  88. package/dist/core/config.js.map +1 -1
  89. package/dist/core/learnings-merge-driver.d.ts +10 -0
  90. package/dist/core/learnings-merge-driver.d.ts.map +1 -1
  91. package/dist/core/learnings-merge-driver.js +18 -0
  92. package/dist/core/learnings-merge-driver.js.map +1 -1
  93. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  94. package/dist/core/lisa-owned-hash-ledger.js +136 -0
  95. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  96. package/dist/core/lisa.d.ts.map +1 -1
  97. package/dist/core/lisa.js +9 -1
  98. package/dist/core/lisa.js.map +1 -1
  99. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts +5 -5
  100. package/dist/core/nightly-e2e-guard-behavior-certificate.js +7 -7
  101. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  102. package/dist/core/ownership-header.d.ts +74 -0
  103. package/dist/core/ownership-header.d.ts.map +1 -0
  104. package/dist/core/ownership-header.js +76 -0
  105. package/dist/core/ownership-header.js.map +1 -0
  106. package/dist/core/rails-deploy-production-intent.d.ts +36 -0
  107. package/dist/core/rails-deploy-production-intent.d.ts.map +1 -0
  108. package/dist/core/rails-deploy-production-intent.js +79 -0
  109. package/dist/core/rails-deploy-production-intent.js.map +1 -0
  110. package/dist/core/stale-managed-banner.d.ts +78 -0
  111. package/dist/core/stale-managed-banner.d.ts.map +1 -0
  112. package/dist/core/stale-managed-banner.js +118 -0
  113. package/dist/core/stale-managed-banner.js.map +1 -0
  114. package/dist/core/two-channel-delivery-scan.d.ts +33 -1
  115. package/dist/core/two-channel-delivery-scan.d.ts.map +1 -1
  116. package/dist/core/two-channel-delivery-scan.js +133 -6
  117. package/dist/core/two-channel-delivery-scan.js.map +1 -1
  118. package/dist/core/two-channel-delivery.d.ts +101 -4
  119. package/dist/core/two-channel-delivery.d.ts.map +1 -1
  120. package/dist/core/two-channel-delivery.js +121 -13
  121. package/dist/core/two-channel-delivery.js.map +1 -1
  122. package/dist/core/two-channel-staleness.d.ts +137 -0
  123. package/dist/core/two-channel-staleness.d.ts.map +1 -0
  124. package/dist/core/two-channel-staleness.js +268 -0
  125. package/dist/core/two-channel-staleness.js.map +1 -0
  126. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  127. package/dist/core/upstream-evidence-manifest.js +265 -121
  128. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  129. package/dist/core/workflow-deletion-ownership.d.ts +6 -24
  130. package/dist/core/workflow-deletion-ownership.d.ts.map +1 -1
  131. package/dist/core/workflow-deletion-ownership.js +22 -42
  132. package/dist/core/workflow-deletion-ownership.js.map +1 -1
  133. package/dist/detection/detectors/cdk.d.ts.map +1 -1
  134. package/dist/detection/detectors/cdk.js +2 -1
  135. package/dist/detection/detectors/cdk.js.map +1 -1
  136. package/dist/health/template-inspection.d.ts.map +1 -1
  137. package/dist/health/template-inspection.js +2 -1
  138. package/dist/health/template-inspection.js.map +1 -1
  139. package/dist/migrations/ensure-lisa-postinstall.d.ts +16 -0
  140. package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
  141. package/dist/migrations/ensure-lisa-postinstall.js +16 -0
  142. package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
  143. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts +2 -2
  144. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts.map +1 -1
  145. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js +98 -34
  146. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js.map +1 -1
  147. package/dist/migrations/ensure-playwright-dedicated-caller.d.ts.map +1 -1
  148. package/dist/migrations/ensure-playwright-dedicated-caller.js +1 -0
  149. package/dist/migrations/ensure-playwright-dedicated-caller.js.map +1 -1
  150. package/dist/opencode/hooks-installer.d.ts.map +1 -1
  151. package/dist/opencode/hooks-installer.js +1 -0
  152. package/dist/opencode/hooks-installer.js.map +1 -1
  153. package/dist/opencode/plugin-templates/block-managed-file-edits.sh +78 -15
  154. package/dist/opencode/plugin-templates/block-no-verify.sh +21 -0
  155. package/dist/opencode/plugin-templates/guard-dedupe.bash +337 -0
  156. package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +242 -55
  157. package/dist/opencode/plugin-templates/parity-safety-net.sh +29 -1
  158. package/dist/strategies/package-lisa.d.ts.map +1 -1
  159. package/dist/strategies/package-lisa.js +2 -1
  160. package/dist/strategies/package-lisa.js.map +1 -1
  161. package/dist/utils/path-utils.d.ts +29 -0
  162. package/dist/utils/path-utils.d.ts.map +1 -1
  163. package/dist/utils/path-utils.js +41 -0
  164. package/dist/utils/path-utils.js.map +1 -1
  165. package/expo/create-only/.github/workflows/ci.yml +21 -0
  166. package/expo/create-only/.github/workflows/deploy.yml +28 -0
  167. package/expo/create-only/.github/workflows/maestro-e2e.yml +7 -0
  168. package/expo/create-only/.github/workflows/nightly-e2e-bypass-reaper.yml +124 -13
  169. package/expo/create-only/.github/workflows/nightly-e2e-health.yml +7 -0
  170. package/expo/create-only/.github/workflows/nightly-e2e-report.yml +7 -0
  171. package/expo/create-only/.github/workflows/nightly-e2e-tracking.yml +8 -0
  172. package/expo/create-only/.github/workflows/playwright-e2e.yml +7 -0
  173. package/harper-fabric/copy-overwrite/.github/workflows/ci.yml +7 -0
  174. package/harper-fabric/create-only/.github/workflows/deploy.yml +14 -0
  175. package/nestjs/create-only/.github/workflows/ci.yml +14 -0
  176. package/nestjs/create-only/.github/workflows/deploy.yml +28 -0
  177. package/package.json +10 -5
  178. package/phaser/copy-overwrite/.github/workflows/ci.yml +7 -0
  179. package/plugins/lisa/.claude-plugin/plugin.json +28 -1
  180. package/plugins/lisa/.codex-plugin/hooks.json +27 -0
  181. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  182. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  183. package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +27 -4
  184. package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +1 -1
  185. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +22 -0
  186. package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +14 -0
  187. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +51 -0
  188. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +1 -1
  189. package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +27 -4
  190. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  191. package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +14 -0
  192. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  193. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +55 -2
  194. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +27 -4
  195. package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +47 -30
  196. package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  197. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  198. package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +14 -0
  199. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +54 -3
  200. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  201. package/plugins/lisa/.codex-plugin/skills/lisa-qa-clear/SKILL.md +19 -7
  202. package/plugins/lisa/.codex-plugin/skills/lisa-qa-fail/SKILL.md +28 -3
  203. package/plugins/lisa/.codex-plugin/skills/lisa-qa-queue/SKILL.md +28 -3
  204. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +94 -24
  205. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +32 -2
  206. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +4 -4
  207. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
  208. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  209. package/plugins/lisa/agents/linear-prd-intake.md +8 -8
  210. package/plugins/lisa/hooks/block-blind-automerge.sh +81 -2
  211. package/plugins/lisa/hooks/block-direct-issue-create.agy.sh +64 -16
  212. package/plugins/lisa/hooks/block-direct-issue-create.sh +293 -8
  213. package/plugins/lisa/hooks/block-instruction-file-edits.sh +21 -0
  214. package/plugins/lisa/hooks/block-managed-file-edits.sh +78 -15
  215. package/plugins/lisa/hooks/block-no-verify.sh +21 -0
  216. package/plugins/lisa/hooks/block-shell-json-parsing.sh +21 -0
  217. package/plugins/lisa/hooks/failure-signature-index.mjs +240 -5
  218. package/plugins/lisa/hooks/guard-dedupe.bash +337 -0
  219. package/plugins/lisa/hooks/inject-rules.sh +13 -5
  220. package/plugins/lisa/hooks/operational-hazards.mjs +736 -0
  221. package/plugins/lisa/hooks/operational-hazards.sh +28 -0
  222. package/plugins/lisa/hooks/parity-safety-net.sh +29 -1
  223. package/plugins/lisa/hooks/threshold-ratchet-compare.mjs +102 -21
  224. package/plugins/lisa/hooks/threshold-ratchet-families.mjs +130 -2
  225. package/plugins/lisa/hooks/threshold-ratchet.mjs +63 -13
  226. package/plugins/lisa/hooks/worktree-binding-guard.mjs +183 -1
  227. package/plugins/lisa/hooks/worktree-binding-guard.sh +21 -0
  228. package/plugins/lisa/rules/eager/00-rule-index.md +1 -0
  229. package/plugins/lisa/rules/eager/operational-hazards.md +50 -0
  230. package/plugins/lisa/rules/eager/tracked-work.md +1 -1
  231. package/plugins/lisa/rules/reference/config-resolution.md +1 -1
  232. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
  233. package/plugins/lisa/rules/reference/operational-hazards.md +115 -0
  234. package/plugins/lisa/rules/reference/work-item-trailer-definition.md +129 -0
  235. package/plugins/lisa/scripts/intake-blocker-reprobe.mjs +407 -26
  236. package/plugins/lisa/scripts/qa-signal-lifecycle.mjs +507 -0
  237. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  238. package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +27 -4
  239. package/plugins/lisa/skills/lisa-github-prd-intake/SKILL.md +1 -1
  240. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +22 -0
  241. package/plugins/lisa/skills/lisa-github-verify/SKILL.md +14 -0
  242. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +51 -0
  243. package/plugins/lisa/skills/lisa-intake/SKILL.md +1 -1
  244. package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +27 -4
  245. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  246. package/plugins/lisa/skills/lisa-jira-verify/SKILL.md +14 -0
  247. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  248. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +55 -2
  249. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +27 -4
  250. package/plugins/lisa/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  251. package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  252. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  253. package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +14 -0
  254. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +54 -3
  255. package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  256. package/plugins/lisa/skills/lisa-qa-clear/SKILL.md +19 -7
  257. package/plugins/lisa/skills/lisa-qa-fail/SKILL.md +28 -3
  258. package/plugins/lisa/skills/lisa-qa-queue/SKILL.md +28 -3
  259. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +94 -24
  260. package/plugins/lisa/skills/lisa-rework-triage/SKILL.md +32 -2
  261. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +5 -5
  262. package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
  263. package/plugins/lisa/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  264. package/plugins/lisa-agy/agents/linear-prd-intake.md +8 -8
  265. package/plugins/lisa-agy/hooks/block-blind-automerge.sh +81 -2
  266. package/plugins/lisa-agy/hooks/block-direct-issue-create.agy.sh +64 -16
  267. package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +293 -8
  268. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +21 -0
  269. package/plugins/lisa-agy/hooks/block-managed-file-edits.sh +78 -15
  270. package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +21 -0
  271. package/plugins/lisa-agy/hooks/guard-dedupe.bash +337 -0
  272. package/plugins/lisa-agy/hooks/parity-safety-net.sh +29 -1
  273. package/plugins/lisa-agy/hooks.json +1 -1
  274. package/plugins/lisa-agy/plugin.json +1 -1
  275. package/plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs +407 -26
  276. package/plugins/lisa-agy/scripts/qa-signal-lifecycle.mjs +507 -0
  277. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  278. package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +27 -4
  279. package/plugins/lisa-agy/skills/lisa-github-prd-intake/SKILL.md +1 -1
  280. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +22 -0
  281. package/plugins/lisa-agy/skills/lisa-github-verify/SKILL.md +14 -0
  282. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +51 -0
  283. package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +1 -1
  284. package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +27 -4
  285. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  286. package/plugins/lisa-agy/skills/lisa-jira-verify/SKILL.md +14 -0
  287. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  288. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +55 -2
  289. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +27 -4
  290. package/plugins/lisa-agy/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  291. package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  292. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  293. package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +14 -0
  294. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +54 -3
  295. package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  296. package/plugins/lisa-agy/skills/lisa-qa-clear/SKILL.md +19 -7
  297. package/plugins/lisa-agy/skills/lisa-qa-fail/SKILL.md +28 -3
  298. package/plugins/lisa-agy/skills/lisa-qa-queue/SKILL.md +28 -3
  299. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +94 -24
  300. package/plugins/lisa-agy/skills/lisa-rework-triage/SKILL.md +32 -2
  301. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +5 -5
  302. package/plugins/lisa-agy/skills/lisa-track/SKILL.md +1 -1
  303. package/plugins/lisa-agy/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  304. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  305. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  306. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  307. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  308. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  309. package/plugins/lisa-copilot/.claude-plugin/plugin.json +19 -1
  310. package/plugins/lisa-copilot/agents/linear-prd-intake.agent.md +8 -8
  311. package/plugins/lisa-copilot/hooks/block-blind-automerge.sh +81 -2
  312. package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +293 -8
  313. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +21 -0
  314. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +78 -15
  315. package/plugins/lisa-copilot/hooks/block-no-verify.sh +21 -0
  316. package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +21 -0
  317. package/plugins/lisa-copilot/hooks/failure-signature-index.mjs +240 -5
  318. package/plugins/lisa-copilot/hooks/guard-dedupe.bash +337 -0
  319. package/plugins/lisa-copilot/hooks/inject-rules.sh +13 -5
  320. package/plugins/lisa-copilot/hooks/operational-hazards.mjs +736 -0
  321. package/plugins/lisa-copilot/hooks/operational-hazards.sh +28 -0
  322. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +29 -1
  323. package/plugins/lisa-copilot/hooks/threshold-ratchet-compare.mjs +102 -21
  324. package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +130 -2
  325. package/plugins/lisa-copilot/hooks/threshold-ratchet.mjs +63 -13
  326. package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +183 -1
  327. package/plugins/lisa-copilot/hooks/worktree-binding-guard.sh +21 -0
  328. package/plugins/lisa-copilot/rules/eager/00-rule-index.md +1 -0
  329. package/plugins/lisa-copilot/rules/eager/operational-hazards.md +50 -0
  330. package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
  331. package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
  332. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
  333. package/plugins/lisa-copilot/rules/reference/operational-hazards.md +115 -0
  334. package/plugins/lisa-copilot/rules/reference/work-item-trailer-definition.md +129 -0
  335. package/plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs +407 -26
  336. package/plugins/lisa-copilot/scripts/qa-signal-lifecycle.mjs +507 -0
  337. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  338. package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +27 -4
  339. package/plugins/lisa-copilot/skills/lisa-github-prd-intake/SKILL.md +1 -1
  340. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +22 -0
  341. package/plugins/lisa-copilot/skills/lisa-github-verify/SKILL.md +14 -0
  342. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +51 -0
  343. package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +1 -1
  344. package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +27 -4
  345. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  346. package/plugins/lisa-copilot/skills/lisa-jira-verify/SKILL.md +14 -0
  347. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  348. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +55 -2
  349. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +27 -4
  350. package/plugins/lisa-copilot/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  351. package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  352. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  353. package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +14 -0
  354. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +54 -3
  355. package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  356. package/plugins/lisa-copilot/skills/lisa-qa-clear/SKILL.md +19 -7
  357. package/plugins/lisa-copilot/skills/lisa-qa-fail/SKILL.md +28 -3
  358. package/plugins/lisa-copilot/skills/lisa-qa-queue/SKILL.md +28 -3
  359. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +94 -24
  360. package/plugins/lisa-copilot/skills/lisa-rework-triage/SKILL.md +32 -2
  361. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +5 -5
  362. package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
  363. package/plugins/lisa-copilot/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  364. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  365. package/plugins/lisa-cursor/agents/linear-prd-intake.md +8 -8
  366. package/plugins/lisa-cursor/hooks/block-blind-automerge.sh +81 -2
  367. package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +293 -8
  368. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +21 -0
  369. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +78 -15
  370. package/plugins/lisa-cursor/hooks/block-no-verify.sh +21 -0
  371. package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +21 -0
  372. package/plugins/lisa-cursor/hooks/failure-signature-index.mjs +240 -5
  373. package/plugins/lisa-cursor/hooks/guard-dedupe.bash +337 -0
  374. package/plugins/lisa-cursor/hooks/hooks.json +10 -0
  375. package/plugins/lisa-cursor/hooks/operational-hazards.mjs +736 -0
  376. package/plugins/lisa-cursor/hooks/operational-hazards.sh +28 -0
  377. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +29 -1
  378. package/plugins/lisa-cursor/hooks/threshold-ratchet-compare.mjs +102 -21
  379. package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +130 -2
  380. package/plugins/lisa-cursor/hooks/threshold-ratchet.mjs +63 -13
  381. package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +183 -1
  382. package/plugins/lisa-cursor/hooks/worktree-binding-guard.sh +21 -0
  383. package/plugins/lisa-cursor/rules/00-rule-index.mdc +1 -0
  384. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
  385. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
  386. package/plugins/lisa-cursor/rules/operational-hazards-reference.mdc +120 -0
  387. package/plugins/lisa-cursor/rules/operational-hazards.mdc +55 -0
  388. package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
  389. package/plugins/lisa-cursor/rules/work-item-trailer-definition-reference.mdc +134 -0
  390. package/plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs +407 -26
  391. package/plugins/lisa-cursor/scripts/qa-signal-lifecycle.mjs +507 -0
  392. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  393. package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +27 -4
  394. package/plugins/lisa-cursor/skills/lisa-github-prd-intake/SKILL.md +1 -1
  395. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +22 -0
  396. package/plugins/lisa-cursor/skills/lisa-github-verify/SKILL.md +14 -0
  397. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +51 -0
  398. package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +1 -1
  399. package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +27 -4
  400. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  401. package/plugins/lisa-cursor/skills/lisa-jira-verify/SKILL.md +14 -0
  402. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  403. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +55 -2
  404. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +27 -4
  405. package/plugins/lisa-cursor/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  406. package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  407. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  408. package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +14 -0
  409. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +54 -3
  410. package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  411. package/plugins/lisa-cursor/skills/lisa-qa-clear/SKILL.md +19 -7
  412. package/plugins/lisa-cursor/skills/lisa-qa-fail/SKILL.md +28 -3
  413. package/plugins/lisa-cursor/skills/lisa-qa-queue/SKILL.md +28 -3
  414. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +94 -24
  415. package/plugins/lisa-cursor/skills/lisa-rework-triage/SKILL.md +32 -2
  416. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +5 -5
  417. package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +1 -1
  418. package/plugins/lisa-cursor/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  419. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  420. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  421. package/plugins/lisa-expo-agy/plugin.json +1 -1
  422. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  423. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  424. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  425. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  426. package/plugins/lisa-harper-fabric/hooks/inject-rules.sh +14 -3
  427. package/plugins/lisa-harper-fabric/rules/eager/harper-fabric.md +31 -0
  428. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  429. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  430. package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +14 -3
  431. package/plugins/lisa-harper-fabric-copilot/rules/eager/harper-fabric.md +31 -0
  432. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  433. package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric-reference.mdc +57 -0
  434. package/plugins/lisa-harper-fabric-cursor/rules/harper-fabric.mdc +32 -53
  435. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  436. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  437. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  438. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  439. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  440. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  441. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  442. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  443. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  444. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  445. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  446. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  447. package/plugins/lisa-phaser/hooks/inject-rules.sh +14 -3
  448. package/plugins/lisa-phaser/rules/eager/phaser.md +44 -0
  449. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  450. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  451. package/plugins/lisa-phaser-copilot/hooks/inject-rules.sh +14 -3
  452. package/plugins/lisa-phaser-copilot/rules/eager/phaser.md +44 -0
  453. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  454. package/plugins/lisa-phaser-cursor/rules/phaser-reference.mdc +189 -0
  455. package/plugins/lisa-phaser-cursor/rules/phaser.mdc +45 -185
  456. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  457. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  458. package/plugins/lisa-rails/hooks/inject-rules.sh +14 -4
  459. package/plugins/lisa-rails/rules/eager/rails-conventions.md +23 -0
  460. package/plugins/lisa-rails-agy/plugin.json +1 -1
  461. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  462. package/plugins/lisa-rails-copilot/hooks/inject-rules.sh +14 -4
  463. package/plugins/lisa-rails-copilot/rules/eager/rails-conventions.md +23 -0
  464. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  465. package/plugins/lisa-rails-cursor/rules/rails-conventions-reference.mdc +181 -0
  466. package/plugins/lisa-rails-cursor/rules/rails-conventions.mdc +24 -177
  467. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  468. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  469. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  470. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  471. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  472. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  473. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  474. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  475. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  476. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  477. package/plugins/materialized-artifacts.json +1 -0
  478. package/plugins/src/base/.claude-plugin/plugin.json +27 -0
  479. package/plugins/src/base/agents/linear-prd-intake.md +8 -8
  480. package/plugins/src/base/hooks/block-blind-automerge.sh +81 -2
  481. package/plugins/src/base/hooks/block-direct-issue-create.agy.sh +64 -16
  482. package/plugins/src/base/hooks/block-direct-issue-create.sh +293 -8
  483. package/plugins/src/base/hooks/block-instruction-file-edits.sh +21 -0
  484. package/plugins/src/base/hooks/block-managed-file-edits.sh +78 -15
  485. package/plugins/src/base/hooks/block-no-verify.sh +21 -0
  486. package/plugins/src/base/hooks/block-shell-json-parsing.sh +21 -0
  487. package/plugins/src/base/hooks/failure-signature-index.mjs +240 -5
  488. package/plugins/src/base/hooks/guard-dedupe.bash +337 -0
  489. package/plugins/src/base/hooks/inject-rules.sh +13 -5
  490. package/plugins/src/base/hooks/operational-hazards.mjs +736 -0
  491. package/plugins/src/base/hooks/operational-hazards.sh +28 -0
  492. package/plugins/src/base/hooks/parity-safety-net.sh +29 -1
  493. package/plugins/src/base/hooks/threshold-ratchet-compare.mjs +102 -21
  494. package/plugins/src/base/hooks/threshold-ratchet-families.mjs +130 -2
  495. package/plugins/src/base/hooks/threshold-ratchet.mjs +63 -13
  496. package/plugins/src/base/hooks/worktree-binding-guard.mjs +183 -1
  497. package/plugins/src/base/hooks/worktree-binding-guard.sh +21 -0
  498. package/plugins/src/base/rules/eager/00-rule-index.md +1 -0
  499. package/plugins/src/base/rules/eager/operational-hazards.md +50 -0
  500. package/plugins/src/base/rules/eager/tracked-work.md +1 -1
  501. package/plugins/src/base/rules/reference/config-resolution.md +1 -1
  502. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
  503. package/plugins/src/base/rules/reference/operational-hazards.md +115 -0
  504. package/plugins/src/base/rules/reference/work-item-trailer-definition.md +129 -0
  505. package/plugins/src/base/scripts/intake-blocker-reprobe.mjs +407 -26
  506. package/plugins/src/base/scripts/qa-signal-lifecycle.mjs +507 -0
  507. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +130 -19
  508. package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +27 -4
  509. package/plugins/src/base/skills/lisa-github-prd-intake/SKILL.md +1 -1
  510. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +22 -0
  511. package/plugins/src/base/skills/lisa-github-verify/SKILL.md +14 -0
  512. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +51 -0
  513. package/plugins/src/base/skills/lisa-intake/SKILL.md +1 -1
  514. package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +27 -4
  515. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  516. package/plugins/src/base/skills/lisa-jira-verify/SKILL.md +14 -0
  517. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +51 -0
  518. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +55 -2
  519. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +27 -4
  520. package/plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md +48 -31
  521. package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  522. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  523. package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +14 -0
  524. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +54 -3
  525. package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  526. package/plugins/src/base/skills/lisa-qa-clear/SKILL.md +19 -7
  527. package/plugins/src/base/skills/lisa-qa-fail/SKILL.md +28 -3
  528. package/plugins/src/base/skills/lisa-qa-queue/SKILL.md +28 -3
  529. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +94 -24
  530. package/plugins/src/base/skills/lisa-rework-triage/SKILL.md +32 -2
  531. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +5 -5
  532. package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
  533. package/plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md +9 -0
  534. package/plugins/src/harper-fabric/hooks/inject-rules.sh +14 -3
  535. package/plugins/src/harper-fabric/rules/eager/harper-fabric.md +31 -0
  536. package/plugins/src/phaser/hooks/inject-rules.sh +14 -3
  537. package/plugins/src/phaser/rules/eager/phaser.md +44 -0
  538. package/plugins/src/rails/hooks/inject-rules.sh +14 -4
  539. package/plugins/src/rails/rules/eager/rails-conventions.md +23 -0
  540. package/rails/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
  541. package/rails/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
  542. package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
  543. package/rails/create-only/.github/workflows/ci.yml +8 -0
  544. package/rails/create-only/.github/workflows/deploy.yml +22 -0
  545. package/scripts/build-plugins.sh +2 -1
  546. package/scripts/check-engine-floor.mjs +361 -0
  547. package/scripts/check-guard-parity-notes.mjs +709 -0
  548. package/scripts/check-template-workflow-refs.mjs +9 -0
  549. package/scripts/check-third-party-action-pins.mjs +17 -1
  550. package/scripts/check-workflow-contract-assertions.mjs +480 -0
  551. package/scripts/copy-opencode-plugin-templates.mjs +1 -0
  552. package/scripts/deployed-guard-advice.mjs +636 -0
  553. package/scripts/generate-agy-plugin-artifacts.mjs +35 -10
  554. package/scripts/generate-export-surface.mjs +105 -19
  555. package/scripts/generate-two-channel-couplings.ts +143 -212
  556. package/scripts/lisa-enforcement-fallback.sh +31 -0
  557. package/scripts/measure-scripts-profile-gap.mts +361 -0
  558. package/scripts/mutation-performance-measure.mjs +21 -5
  559. package/scripts/reconcile-release-tags.mjs +65 -84
  560. package/scripts/two-channel-couplings.json +302 -70
  561. package/scripts/workflow-contract-assertion.sh +47 -0
  562. package/typescript/copy-overwrite/.lintstagedrc.json +1 -0
  563. package/typescript/copy-overwrite/eslint.ignore.config.json +1 -0
  564. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +527 -53
  565. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +301 -13
  566. package/typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs +63 -13
  567. package/typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs +102 -21
  568. package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +130 -2
  569. package/typescript/create-only/.github/workflows/ci.yml +7 -0
  570. /package/plugins/lisa-harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  571. /package/plugins/lisa-harper-fabric-copilot/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  572. /package/plugins/lisa-phaser/rules/{phaser.md → reference/phaser.md} +0 -0
  573. /package/plugins/lisa-phaser-copilot/rules/{phaser.md → reference/phaser.md} +0 -0
  574. /package/plugins/lisa-rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
  575. /package/plugins/lisa-rails-copilot/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
  576. /package/plugins/src/harper-fabric/rules/{harper-fabric.md → reference/harper-fabric.md} +0 -0
  577. /package/plugins/src/phaser/rules/{phaser.md → reference/phaser.md} +0 -0
  578. /package/plugins/src/rails/rules/{rails-conventions.md → reference/rails-conventions.md} +0 -0
@@ -352,6 +352,40 @@ const jsdocRulesOff = Object.fromEntries(Object.keys(jsdoc.rules ?? {}).map(name
352
352
  * meet — correctness and bug-finding rules (including the SonarJS rules an
353
353
  * external scanner also runs, e.g. `sonarjs/no-alphabetical-sort`) stay ON,
354
354
  * because those are precisely what the exclusion was hiding.
355
+ *
356
+ * WHAT THIS OVERRIDE COSTS, measured rather than asserted. Every rule below is
357
+ * argued, and none of those arguments says how much they add up to. Run
358
+ * `bun run measure:scripts-profile-gap` for today's number: it differences the
359
+ * config ESLint resolves inside `scripts/` against the config it resolves for
360
+ * the same extension outside it, then lints the tracked tree with every relaxed
361
+ * rule put back. Measured 2026-09-06 against Lisa's own `scripts/` tree — 90
362
+ * tracked files, 1,290 rules resolved for both probes — 33 rules are weaker
363
+ * here, 1 is STRICTER (`sonarjs/no-ignored-exceptions`, promoted on purpose),
364
+ * and restoring all 33 reports 1,115 findings across 76 files. Thirteen of the
365
+ * 33 report nothing, so they suppress a class this tree does not currently
366
+ * produce. Nothing gates on any of it.
367
+ *
368
+ * WHY THAT NUMBER IS NOT SIMPLY A BACKLOG TO BURN DOWN. The largest
369
+ * contributors are `jsdoc/*` (689) and `functional/no-let` (181) — exactly the
370
+ * two families this override argues do not apply to a linear CLI. The families
371
+ * that would be defects wherever they appeared are small and specific:
372
+ * `sonarjs/slow-regex` (32), `sonarjs/no-os-command-from-path` (5),
373
+ * `sonarjs/file-permissions` (2). Whether the boundary belongs where it is, per
374
+ * family rather than in one direction for all 33, is the open question in
375
+ * CodySwannGT/lisa#3773. It is not settled here, and it is not settled by the
376
+ * total.
377
+ *
378
+ * THE SHIPPED PAYLOAD RESOLVES THIS SAME PROFILE. Every `.mjs` Lisa installs
379
+ * lives under a `scripts/` directory, so `scriptsFilePatterns` matches it too:
380
+ * under the config Lisa ships to a consumer, a host's own `scripts/` file and a
381
+ * Lisa-shipped one resolve to identical severities for all 1,290 rules — zero
382
+ * differences. What holds the payload higher is not this override but
383
+ * `tests/unit/config/eslint-shipped-mjs-clean.test.ts`, which re-arms two of
384
+ * these suppressions over a roster it derives from the git index. So a file
385
+ * PROMOTED into a shipped tree meets the stricter bar automatically, with no
386
+ * step for anyone to forget — and a file that stays here never does. That
387
+ * asymmetry is the ticket's subject; do not read the automatic promotion check
388
+ * as closing it.
355
389
  * @returns {object} ESLint flat config object for standalone scripts
356
390
  */
357
391
  export const getScriptsFilesOverride = () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/configs/eslint/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/configs/eslint/base.ts"],"names":[],"mappings":"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"}
@@ -69,8 +69,36 @@ export interface ApplyReceipt {
69
69
  * Written by every apply, including the ones that delete nothing: an empty
70
70
  * array asserts "this apply removed nothing", which is a different statement
71
71
  * from a receipt too old to have the field.
72
+ *
73
+ * That assertion is true of a single apply and false of an INSTALL, which is
74
+ * why `recordSuccessfulApply` no longer lets an empty list overwrite a
75
+ * populated one — see the carry-forward note there.
72
76
  */
73
77
  readonly deleted_paths: readonly string[];
78
+ /**
79
+ * The same removals as prose, with the reason each one was authorised.
80
+ *
81
+ * `deleted_paths` answers "which files"; a consumer looking at a `D` in `git
82
+ * status` needs "and why", and the reason exists — a forced removal carries
83
+ * the ruling that ordered it, and a refused one carries what Lisa could not
84
+ * prove. The apply already composes both lines; until now they went only to
85
+ * a stream, which on this path is nobody.
86
+ *
87
+ * Deliberately wider than `deleted_paths`: it also carries the workflows Lisa
88
+ * DECLINED to remove. A refusal is the fail-closed half of the same decision,
89
+ * and a fail-closed branch that says nothing is indistinguishable from one
90
+ * that never ran.
91
+ */
92
+ readonly deletion_notices: readonly string[];
93
+ /**
94
+ * When the removals in `deleted_paths` actually happened.
95
+ *
96
+ * Not the same instant as `applied_at` once the record survives a later
97
+ * apply, and conflating them would make a carried-forward removal read as
98
+ * something the most recent apply just did. Null when no apply has recorded
99
+ * a removal here, or when the receipt predates the field.
100
+ */
101
+ readonly deletions_recorded_at: string | null;
74
102
  }
75
103
  /**
76
104
  * Resolve the single path every reader and writer uses.
@@ -85,6 +113,41 @@ export declare function resolveApplyReceiptPath(root: string): string;
85
113
  * @returns The receipt, or null when there is no usable one
86
114
  */
87
115
  export declare function readApplyReceipt(root: string): Promise<ApplyReceipt | null>;
116
+ /**
117
+ * The deletion record a new receipt should carry.
118
+ *
119
+ * An apply that removed nothing is not evidence that nothing was removed — on
120
+ * the install path it is the EXPECTED reading, and it arrives from the one
121
+ * process least able to say so. A plain `bun install` runs the apply twice: the
122
+ * postinstall apply removes the files, and the detached reconciliation
123
+ * trampoline re-applies afterwards, finds them already gone, and writes its own
124
+ * receipt over the first. Measured in a scratch fixture: `deleted_paths` held
125
+ * the removed workflow after the first apply and `[]` after the second, while
126
+ * git still showed the file deleted. The trampoline runs with `stdio:
127
+ * "ignore"`, so the process that erased the only durable record of a removal
128
+ * could not have reported doing so (CodySwannGT/lisa#4071).
129
+ *
130
+ * So an empty incoming list KEEPS whatever the receipt already held, and a
131
+ * non-empty one replaces it: those files are gone too, and the newer list is
132
+ * the live one. Carrying a removal forward over-reports at worst — the files
133
+ * really are still missing — and over-reporting a deletion is the safe
134
+ * direction, the same ruling `core/deletion-basis` makes about keeping a file
135
+ * on uncertainty.
136
+ * @param prior - The receipt already on disk, or null when there is none
137
+ * @param incoming - What this apply removed and said about it
138
+ * @param incoming.deletedPaths - Files this apply removed
139
+ * @param incoming.deletionNotices - This apply's removal and refusal lines
140
+ * @param now - Timestamp for a record this apply is creating
141
+ * @returns The deletion record to persist
142
+ */
143
+ export declare function resolveDeletionRecord(prior: ApplyReceipt | null, incoming: {
144
+ readonly deletedPaths: readonly string[];
145
+ readonly deletionNotices: readonly string[];
146
+ }, now: string): {
147
+ readonly deleted_paths: readonly string[];
148
+ readonly deletion_notices: readonly string[];
149
+ readonly deletions_recorded_at: string | null;
150
+ };
88
151
  /**
89
152
  * Record that an apply completed successfully.
90
153
  *
@@ -99,6 +162,7 @@ export declare function readApplyReceipt(root: string): Promise<ApplyReceipt | n
99
162
  * @param details.applyMode - Whether this was a full or postinstall-safe apply
100
163
  * @param details.stalePaths - Managed files the apply left out of date
101
164
  * @param details.deletedPaths - Files the apply removed
165
+ * @param details.deletionNotices - The apply's removal and refusal lines, with reasons
102
166
  * @param now - Clock, injectable for tests
103
167
  * @returns True when the receipt was persisted
104
168
  */
@@ -108,5 +172,6 @@ export declare function recordSuccessfulApply(root: string, details: {
108
172
  readonly applyMode: ApplyMode;
109
173
  readonly stalePaths: readonly string[];
110
174
  readonly deletedPaths: readonly string[];
175
+ readonly deletionNotices?: readonly string[];
111
176
  }, now?: () => Date): Promise<boolean>;
112
177
  //# sourceMappingURL=apply-receipt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-receipt.d.ts","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"AA2BA,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEhE,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AA6BD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAoB9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,EACD,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
1
+ {"version":3,"file":"apply-receipt.d.ts","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"AA2BA,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEhE,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;AA6BD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAyB9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,GAAG,IAAI,EAC1B,QAAQ,EAAE;IACR,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C,EACD,GAAG,EAAE,MAAM,GACV;IACD,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C,CAoBA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C,EACD,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CA+BlB"}
@@ -86,6 +86,58 @@ export async function readApplyReceipt(root) {
86
86
  apply_mode: toApplyMode(parsed.apply_mode),
87
87
  stale_paths: toPathList(parsed.stale_paths),
88
88
  deleted_paths: toPathList(parsed.deleted_paths),
89
+ deletion_notices: toPathList(parsed.deletion_notices),
90
+ deletions_recorded_at: typeof parsed.deletions_recorded_at === "string"
91
+ ? parsed.deletions_recorded_at
92
+ : null,
93
+ };
94
+ }
95
+ /**
96
+ * The deletion record a new receipt should carry.
97
+ *
98
+ * An apply that removed nothing is not evidence that nothing was removed — on
99
+ * the install path it is the EXPECTED reading, and it arrives from the one
100
+ * process least able to say so. A plain `bun install` runs the apply twice: the
101
+ * postinstall apply removes the files, and the detached reconciliation
102
+ * trampoline re-applies afterwards, finds them already gone, and writes its own
103
+ * receipt over the first. Measured in a scratch fixture: `deleted_paths` held
104
+ * the removed workflow after the first apply and `[]` after the second, while
105
+ * git still showed the file deleted. The trampoline runs with `stdio:
106
+ * "ignore"`, so the process that erased the only durable record of a removal
107
+ * could not have reported doing so (CodySwannGT/lisa#4071).
108
+ *
109
+ * So an empty incoming list KEEPS whatever the receipt already held, and a
110
+ * non-empty one replaces it: those files are gone too, and the newer list is
111
+ * the live one. Carrying a removal forward over-reports at worst — the files
112
+ * really are still missing — and over-reporting a deletion is the safe
113
+ * direction, the same ruling `core/deletion-basis` makes about keeping a file
114
+ * on uncertainty.
115
+ * @param prior - The receipt already on disk, or null when there is none
116
+ * @param incoming - What this apply removed and said about it
117
+ * @param incoming.deletedPaths - Files this apply removed
118
+ * @param incoming.deletionNotices - This apply's removal and refusal lines
119
+ * @param now - Timestamp for a record this apply is creating
120
+ * @returns The deletion record to persist
121
+ */
122
+ export function resolveDeletionRecord(prior, incoming, now) {
123
+ if (incoming.deletedPaths.length > 0) {
124
+ return {
125
+ deleted_paths: [...incoming.deletedPaths],
126
+ deletion_notices: [...incoming.deletionNotices],
127
+ deletions_recorded_at: now,
128
+ };
129
+ }
130
+ if (prior !== null && prior.deleted_paths.length > 0) {
131
+ return {
132
+ deleted_paths: [...prior.deleted_paths],
133
+ deletion_notices: [...prior.deletion_notices],
134
+ deletions_recorded_at: prior.deletions_recorded_at,
135
+ };
136
+ }
137
+ return {
138
+ deleted_paths: [],
139
+ deletion_notices: [...incoming.deletionNotices],
140
+ deletions_recorded_at: null,
89
141
  };
90
142
  }
91
143
  /**
@@ -102,18 +154,26 @@ export async function readApplyReceipt(root) {
102
154
  * @param details.applyMode - Whether this was a full or postinstall-safe apply
103
155
  * @param details.stalePaths - Managed files the apply left out of date
104
156
  * @param details.deletedPaths - Files the apply removed
157
+ * @param details.deletionNotices - The apply's removal and refusal lines, with reasons
105
158
  * @param now - Clock, injectable for tests
106
159
  * @returns True when the receipt was persisted
107
160
  */
108
161
  export async function recordSuccessfulApply(root, details, now = () => new Date()) {
162
+ const appliedAt = now().toISOString();
109
163
  const receipt = {
110
164
  schema_version: APPLY_RECEIPT_SCHEMA_VERSION,
111
165
  lisa_version: details.lisaVersion,
112
- applied_at: now().toISOString(),
166
+ applied_at: appliedAt,
113
167
  harness: details.harness,
114
168
  apply_mode: details.applyMode,
115
169
  stale_paths: [...details.stalePaths],
116
- deleted_paths: [...details.deletedPaths],
170
+ // Never a plain copy of `details.deletedPaths`: an idempotent re-apply
171
+ // deletes nothing by construction, and letting its empty list win erases
172
+ // the record of a removal that already happened. See resolveDeletionRecord.
173
+ ...resolveDeletionRecord(await readApplyReceipt(root), {
174
+ deletedPaths: details.deletedPaths,
175
+ deletionNotices: details.deletionNotices ?? [],
176
+ }, appliedAt),
117
177
  };
118
178
  const receiptPath = resolveApplyReceiptPath(root);
119
179
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"apply-receipt.js","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply-receipt.js","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Is a repository carrying the CDK application preset one that was ever
3
+ * eligible for it?
4
+ *
5
+ * `cdk.json` is now the only thing that admits the preset, and every surface
6
+ * that decides CDK-ness reads {@link CDK_APP_MARKER} rather than its own copy
7
+ * of the filename. That fix reaches the DECISION, not the repositories the old
8
+ * decision already wrote to: the preset's artifacts are `copy-overwrite`, its
9
+ * dependencies are force-merged into `package.json`, and nothing in the
10
+ * toolchain ever asked afterwards whether the repository it wrote them into
11
+ * was a CDK app (CodySwannGT/lisa#3533, CodySwannGT/lisa#3711).
12
+ *
13
+ * The classification lives here, apart from its callers, for the reason the
14
+ * Rails deploy-intent module gives: the seed-time decision and the
15
+ * installed-base check have to ask the identical question, and two spellings
16
+ * would drift silently in the direction that matters — an installed-base check
17
+ * quietly accepting a repository the seed guard would now reject.
18
+ *
19
+ * The naive discriminator is "preset artifacts present, `cdk.json` absent",
20
+ * and on its own it misses part of the affected population. `cdk.json` is
21
+ * itself one of the files the preset delivers, under `create-only`: a
22
+ * repository admitted by the old predicate and then applied received a
23
+ * `cdk.json` it never wrote, which makes it read as a genuine CDK app to any
24
+ * check that stops at the marker. So the marker is asked a second question —
25
+ * does the application entrypoint it names exist? A real CDK app cannot synth
26
+ * without one; a repository holding a seeded marker has never had one.
27
+ *
28
+ * Three states, kept apart because they are three different facts:
29
+ * {@link CdkPresetAdoption} distinguishes a repository that is entitled to the
30
+ * preset, one that is not, and one this module cannot place. Collapsing the
31
+ * third into either of the others is how a population stays unknown.
32
+ * @module core/cdk-preset-adoption
33
+ */
34
+ /**
35
+ * The single marker that makes a repository a CDK application.
36
+ *
37
+ * Exported so the detector, the package-lisa type scan, the health template
38
+ * inspection, the setup stack classification, and the installed-base doctor
39
+ * check all read one constant. Depending on a CDK package answers a different
40
+ * question — `aws-cdk-lib` and `constructs` say the repository USES CDK types,
41
+ * which any construct library does, while this file says it IS an app.
42
+ */
43
+ export declare const CDK_APP_MARKER = "cdk.json";
44
+ /**
45
+ * `copy-overwrite` artifacts that ONLY the CDK preset delivers.
46
+ *
47
+ * Their presence is what says the preset was applied here. The rest of
48
+ * `cdk/copy-overwrite` — `eslint.config.ts`, `knip.json`, `tsconfig.json`,
49
+ * `vitest.config.ts` and friends — is shipped by other stacks too, so it
50
+ * says nothing about which preset a repository received. `.github/workflows/
51
+ * .keep` is technically CDK-exclusive and deliberately excluded: it is a
52
+ * directory placeholder that any repository may create for its own reasons.
53
+ *
54
+ * A regression test derives this set from the shipped stack trees, so an
55
+ * artifact added to the preset later cannot leave this list behind.
56
+ */
57
+ export declare const CDK_PRESET_ARTIFACTS: readonly ["eslint.cdk.ts", "tsconfig.cdk.json", "vitest.cdk.ts"];
58
+ /**
59
+ * Runtime dependencies `cdk/package-lisa/package.lisa.json` force-merges.
60
+ *
61
+ * `force` means the values are not a suggestion: a repository that removes
62
+ * them by hand gets them back on the next apply for as long as it is still
63
+ * classified as a CDK app. Naming them is half the remedy, which is why the
64
+ * check states them rather than saying "some dependencies".
65
+ */
66
+ export declare const CDK_PRESET_FORCED_DEPENDENCIES: readonly ["aws-cdk-github-oidc", "constructs", "source-map-support"];
67
+ /** The `bin` entry the CDK preset force-merges, and the file it names. */
68
+ export declare const CDK_PRESET_BIN_ENTRY: {
69
+ readonly name: "infrastructure";
70
+ readonly target: "bin/infrastructure.js";
71
+ };
72
+ /**
73
+ * What the CDK application entrypoint declared by a `cdk.json` turns out to
74
+ * be.
75
+ *
76
+ * `unrecognised` is not a defect and not a pass. A `cdk.json` may drive a
77
+ * non-JavaScript app, or name its entry somewhere this module cannot pick a
78
+ * single token out of, and guessing either way would be worse than saying so.
79
+ */
80
+ export type CdkAppEntry =
81
+ /** A single source file the `app` command names. */
82
+ {
83
+ readonly kind: "resolved";
84
+ readonly source: string;
85
+ readonly present: boolean;
86
+ }
87
+ /** No single source file could be read out of the `app` command. */
88
+ | {
89
+ readonly kind: "unrecognised";
90
+ };
91
+ /** Filesystem evidence a caller gathers before classification. */
92
+ export interface CdkAdoptionEvidence {
93
+ /** Which of {@link CDK_PRESET_ARTIFACTS} are present in the repository. */
94
+ readonly presetArtifacts: readonly string[];
95
+ /** Whether {@link CDK_APP_MARKER} is present — the seed-time predicate. */
96
+ readonly hasAppMarker: boolean;
97
+ /** What the marker declares, or null when there is no marker to read. */
98
+ readonly appEntry: CdkAppEntry | null;
99
+ }
100
+ /**
101
+ * How a repository stands to the CDK application preset.
102
+ *
103
+ * `absent` and `eligible` are both "nothing to report" to an operator, and are
104
+ * still kept apart: one repository never received the preset and the other
105
+ * received it correctly, and a check that cannot tell them apart cannot say
106
+ * which of its own answers it is giving.
107
+ */
108
+ export type CdkPresetAdoption =
109
+ /** No CDK preset artifacts here. */
110
+ "absent"
111
+ /** Carries the preset, and is a CDK application. */
112
+ | "eligible"
113
+ /** Carries the preset, and is not a CDK application. */
114
+ | "ineligible"
115
+ /** Carries the preset; the evidence does not settle which. */
116
+ | "undeterminable";
117
+ /**
118
+ * The single source file a CDK `app` command names, when there is exactly one.
119
+ *
120
+ * Split on whitespace and filtered by extension rather than matched with a
121
+ * pattern: the command is arbitrary shell, and a token scan cannot backtrack.
122
+ * Zero candidates means the entry is not a source file this module knows how
123
+ * to look for; more than one means the command is doing something this module
124
+ * should not guess about. Both answer `null`, which the caller reports as
125
+ * undeterminable rather than as a finding.
126
+ * @param appCommand - The `app` value from a `cdk.json`
127
+ * @returns The entry source path, or null when it cannot be singled out
128
+ */
129
+ export declare function cdkAppEntrySource(appCommand: string): string | null;
130
+ /**
131
+ * Classify a repository's standing against the CDK application preset.
132
+ * @param evidence - Filesystem evidence gathered by the caller
133
+ * @returns Which of the four states the repository is in
134
+ */
135
+ export declare function classifyCdkPresetAdoption(evidence: CdkAdoptionEvidence): CdkPresetAdoption;
136
+ //# sourceMappingURL=cdk-preset-adoption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdk-preset-adoption.d.ts","sourceRoot":"","sources":["../../src/core/cdk-preset-adoption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,aAAa,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,kEAIvB,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,sEAIjC,CAAC;AAEX,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW;AACrB,oDAAoD;AAClD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AACH,oEAAoE;GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAEtC,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB;AAC3B,oCAAoC;AAClC,QAAQ;AACV,oDAAoD;GAClD,UAAU;AACZ,wDAAwD;GACtD,YAAY;AACd,8DAA8D;GAC5D,gBAAgB,CAAC;AAyBrB;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,mBAAmB,GAC5B,iBAAiB,CAOnB"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Is a repository carrying the CDK application preset one that was ever
3
+ * eligible for it?
4
+ *
5
+ * `cdk.json` is now the only thing that admits the preset, and every surface
6
+ * that decides CDK-ness reads {@link CDK_APP_MARKER} rather than its own copy
7
+ * of the filename. That fix reaches the DECISION, not the repositories the old
8
+ * decision already wrote to: the preset's artifacts are `copy-overwrite`, its
9
+ * dependencies are force-merged into `package.json`, and nothing in the
10
+ * toolchain ever asked afterwards whether the repository it wrote them into
11
+ * was a CDK app (CodySwannGT/lisa#3533, CodySwannGT/lisa#3711).
12
+ *
13
+ * The classification lives here, apart from its callers, for the reason the
14
+ * Rails deploy-intent module gives: the seed-time decision and the
15
+ * installed-base check have to ask the identical question, and two spellings
16
+ * would drift silently in the direction that matters — an installed-base check
17
+ * quietly accepting a repository the seed guard would now reject.
18
+ *
19
+ * The naive discriminator is "preset artifacts present, `cdk.json` absent",
20
+ * and on its own it misses part of the affected population. `cdk.json` is
21
+ * itself one of the files the preset delivers, under `create-only`: a
22
+ * repository admitted by the old predicate and then applied received a
23
+ * `cdk.json` it never wrote, which makes it read as a genuine CDK app to any
24
+ * check that stops at the marker. So the marker is asked a second question —
25
+ * does the application entrypoint it names exist? A real CDK app cannot synth
26
+ * without one; a repository holding a seeded marker has never had one.
27
+ *
28
+ * Three states, kept apart because they are three different facts:
29
+ * {@link CdkPresetAdoption} distinguishes a repository that is entitled to the
30
+ * preset, one that is not, and one this module cannot place. Collapsing the
31
+ * third into either of the others is how a population stays unknown.
32
+ * @module core/cdk-preset-adoption
33
+ */
34
+ /**
35
+ * The single marker that makes a repository a CDK application.
36
+ *
37
+ * Exported so the detector, the package-lisa type scan, the health template
38
+ * inspection, the setup stack classification, and the installed-base doctor
39
+ * check all read one constant. Depending on a CDK package answers a different
40
+ * question — `aws-cdk-lib` and `constructs` say the repository USES CDK types,
41
+ * which any construct library does, while this file says it IS an app.
42
+ */
43
+ export const CDK_APP_MARKER = "cdk.json";
44
+ /**
45
+ * `copy-overwrite` artifacts that ONLY the CDK preset delivers.
46
+ *
47
+ * Their presence is what says the preset was applied here. The rest of
48
+ * `cdk/copy-overwrite` — `eslint.config.ts`, `knip.json`, `tsconfig.json`,
49
+ * `vitest.config.ts` and friends — is shipped by other stacks too, so it
50
+ * says nothing about which preset a repository received. `.github/workflows/
51
+ * .keep` is technically CDK-exclusive and deliberately excluded: it is a
52
+ * directory placeholder that any repository may create for its own reasons.
53
+ *
54
+ * A regression test derives this set from the shipped stack trees, so an
55
+ * artifact added to the preset later cannot leave this list behind.
56
+ */
57
+ export const CDK_PRESET_ARTIFACTS = [
58
+ "eslint.cdk.ts",
59
+ "tsconfig.cdk.json",
60
+ "vitest.cdk.ts",
61
+ ];
62
+ /**
63
+ * Runtime dependencies `cdk/package-lisa/package.lisa.json` force-merges.
64
+ *
65
+ * `force` means the values are not a suggestion: a repository that removes
66
+ * them by hand gets them back on the next apply for as long as it is still
67
+ * classified as a CDK app. Naming them is half the remedy, which is why the
68
+ * check states them rather than saying "some dependencies".
69
+ */
70
+ export const CDK_PRESET_FORCED_DEPENDENCIES = [
71
+ "aws-cdk-github-oidc",
72
+ "constructs",
73
+ "source-map-support",
74
+ ];
75
+ /** The `bin` entry the CDK preset force-merges, and the file it names. */
76
+ export const CDK_PRESET_BIN_ENTRY = {
77
+ name: "infrastructure",
78
+ target: "bin/infrastructure.js",
79
+ };
80
+ /**
81
+ * File extensions a CDK `app` command can name its entry source with.
82
+ *
83
+ * Deliberately not exhaustive over every runtime: an `app` this list does not
84
+ * match yields `unrecognised`, which is reported as such rather than folded
85
+ * into either verdict.
86
+ */
87
+ const ENTRY_EXTENSIONS = [".ts", ".tsx", ".js", ".mjs", ".cjs"];
88
+ /** Quote characters a shell-ish `app` command may wrap a path in. */
89
+ const QUOTES = new Set(['"', "'", "`"]);
90
+ /**
91
+ * Strip one layer of surrounding quotes from a command token.
92
+ * @param token - Whitespace-delimited token from an `app` command
93
+ * @returns The token without its outer quotes
94
+ */
95
+ function unquote(token) {
96
+ const first = token.charAt(0);
97
+ if (token.length < 2 || !QUOTES.has(first))
98
+ return token;
99
+ return token.charAt(token.length - 1) === first ? token.slice(1, -1) : token;
100
+ }
101
+ /**
102
+ * The single source file a CDK `app` command names, when there is exactly one.
103
+ *
104
+ * Split on whitespace and filtered by extension rather than matched with a
105
+ * pattern: the command is arbitrary shell, and a token scan cannot backtrack.
106
+ * Zero candidates means the entry is not a source file this module knows how
107
+ * to look for; more than one means the command is doing something this module
108
+ * should not guess about. Both answer `null`, which the caller reports as
109
+ * undeterminable rather than as a finding.
110
+ * @param appCommand - The `app` value from a `cdk.json`
111
+ * @returns The entry source path, or null when it cannot be singled out
112
+ */
113
+ export function cdkAppEntrySource(appCommand) {
114
+ const candidates = appCommand
115
+ .split(/[ \t\r\n]+/u)
116
+ .map(unquote)
117
+ .filter(token => ENTRY_EXTENSIONS.some(extension => token.endsWith(extension)));
118
+ return candidates.length === 1 ? (candidates[0] ?? null) : null;
119
+ }
120
+ /**
121
+ * Classify a repository's standing against the CDK application preset.
122
+ * @param evidence - Filesystem evidence gathered by the caller
123
+ * @returns Which of the four states the repository is in
124
+ */
125
+ export function classifyCdkPresetAdoption(evidence) {
126
+ if (evidence.presetArtifacts.length === 0)
127
+ return "absent";
128
+ if (!evidence.hasAppMarker)
129
+ return "ineligible";
130
+ if (evidence.appEntry === null || evidence.appEntry.kind === "unrecognised") {
131
+ return "undeterminable";
132
+ }
133
+ return evidence.appEntry.present ? "eligible" : "ineligible";
134
+ }
135
+ //# sourceMappingURL=cdk-preset-adoption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdk-preset-adoption.js","sourceRoot":"","sources":["../../src/core/cdk-preset-adoption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,eAAe;IACf,mBAAmB;IACnB,eAAe;CACP,CAAC;AAEX;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,qBAAqB;IACrB,YAAY;IACZ,oBAAoB;CACZ,CAAC;AAEX,0EAA0E;AAC1E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,uBAAuB;CACvB,CAAC;AAgDX;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAEzE,qEAAqE;AACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAExC;;;;GAIG;AACH,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,MAAM,UAAU,GAAG,UAAU;SAC1B,KAAK,CAAC,aAAa,CAAC;SACpB,GAAG,CAAC,OAAO,CAAC;SACZ,MAAM,CAAC,KAAK,CAAC,EAAE,CACd,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAC9D,CAAC;IACJ,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA6B;IAE7B,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,YAAY;QAAE,OAAO,YAAY,CAAC;IAChD,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5E,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC;AAC/D,CAAC"}
@@ -69,4 +69,40 @@ export declare function shadowedConfigSibling(relativePath: string, exists: (can
69
69
  * @returns One line for the apply summary
70
70
  */
71
71
  export declare function shadowedConfigNote(template: string, tool: string, sibling: string): string;
72
+ /**
73
+ * One already-installed shadowing: Lisa's template on disk, outranking a
74
+ * config the project wrote itself.
75
+ */
76
+ export interface InstalledConfigShadowing {
77
+ /** The tool whose configuration is being outranked. */
78
+ readonly tool: string;
79
+ /** Repo-relative path of the Lisa-seeded template that wins. */
80
+ readonly template: string;
81
+ /** Repo-relative path of the project's own config that loses. */
82
+ readonly sibling: string;
83
+ }
84
+ /**
85
+ * Every shadowing pair that is ALREADY on disk in a project.
86
+ *
87
+ * The counterpart to {@link shadowedConfigSibling}, asking the same question
88
+ * one tense later. That function decides whether to write a file that is not
89
+ * there yet, so it is reached exactly once per path and never again; a
90
+ * repository that received the template before the guard existed is past that
91
+ * decision forever and nothing else looks. This function is what lets such a
92
+ * repository find itself: it requires the template to be PRESENT, then asks
93
+ * whether an outranked sibling is present too.
94
+ *
95
+ * Both arms read {@link CONFIG_FAMILIES}, deliberately. A second copy of
96
+ * "which filenames outrank Lisa's" would drift out of step with the guard, and
97
+ * the drift would be silent in exactly the way the original defect was.
98
+ *
99
+ * `exists` is expected to REJECT when it cannot determine an answer rather
100
+ * than resolve false. A probe that cannot read reports the same "nothing
101
+ * found" as a clean tree, which is this whole class of defect wearing the
102
+ * detector's hat.
103
+ * @param exists - Predicate answering whether a repo-relative path is present,
104
+ * rejecting when the answer cannot be determined
105
+ * @returns Every installed shadowing pair, empty when the project is clean
106
+ */
107
+ export declare function installedConfigShadowings(exists: (candidateRelativePath: string) => Promise<boolean>): Promise<readonly InstalledConfigShadowing[]>;
72
108
  //# sourceMappingURL=config-shadowing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-shadowing.d.ts","sourceRoot":"","sources":["../../src/core/config-shadowing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAyGH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC1D,OAAO,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAa1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,MAAM,CAMR"}
1
+ {"version":3,"file":"config-shadowing.d.ts","sourceRoot":"","sources":["../../src/core/config-shadowing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAyGH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC1D,OAAO,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAa1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,CAAC,qBAAqB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC1D,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAiB9C"}