@codyswann/lisa 2.119.0 → 2.121.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 (781) hide show
  1. package/.claude-plugin/marketplace.json +18 -0
  2. package/dist/agy/agents-md-installer.d.ts +24 -0
  3. package/dist/agy/agents-md-installer.d.ts.map +1 -0
  4. package/dist/agy/agents-md-installer.js +126 -0
  5. package/dist/agy/agents-md-installer.js.map +1 -0
  6. package/dist/agy/mcp-installer.d.ts +84 -0
  7. package/dist/agy/mcp-installer.d.ts.map +1 -0
  8. package/dist/agy/mcp-installer.js +134 -0
  9. package/dist/agy/mcp-installer.js.map +1 -0
  10. package/dist/agy/plugin-installer.d.ts +21 -0
  11. package/dist/agy/plugin-installer.d.ts.map +1 -0
  12. package/dist/agy/plugin-installer.js +84 -0
  13. package/dist/agy/plugin-installer.js.map +1 -0
  14. package/dist/claude/claude-md-installer.d.ts +18 -0
  15. package/dist/claude/claude-md-installer.d.ts.map +1 -0
  16. package/dist/claude/claude-md-installer.js +62 -0
  17. package/dist/claude/claude-md-installer.js.map +1 -0
  18. package/dist/codex/lisa-plugin-detection.d.ts +69 -0
  19. package/dist/codex/lisa-plugin-detection.d.ts.map +1 -0
  20. package/dist/codex/lisa-plugin-detection.js +135 -0
  21. package/dist/codex/lisa-plugin-detection.js.map +1 -0
  22. package/dist/copilot/copilot-instructions-installer.d.ts +18 -0
  23. package/dist/copilot/copilot-instructions-installer.d.ts.map +1 -0
  24. package/dist/copilot/copilot-instructions-installer.js +61 -0
  25. package/dist/copilot/copilot-instructions-installer.js.map +1 -0
  26. package/dist/copilot/plugin-installer.d.ts +29 -0
  27. package/dist/copilot/plugin-installer.d.ts.map +1 -0
  28. package/dist/copilot/plugin-installer.js +140 -0
  29. package/dist/copilot/plugin-installer.js.map +1 -0
  30. package/dist/core/config.d.ts +8 -4
  31. package/dist/core/config.d.ts.map +1 -1
  32. package/dist/core/config.js +4 -0
  33. package/dist/core/config.js.map +1 -1
  34. package/dist/core/lisa.d.ts +35 -0
  35. package/dist/core/lisa.d.ts.map +1 -1
  36. package/dist/core/lisa.js +93 -0
  37. package/dist/core/lisa.js.map +1 -1
  38. package/package.json +1 -1
  39. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa/.codex-plugin/hooks/block-no-verify.sh +37 -0
  41. package/plugins/lisa/.codex-plugin/hooks/inject-flow-context.sh +12 -0
  42. package/plugins/lisa/.codex-plugin/hooks/inject-rules.sh +33 -0
  43. package/plugins/lisa/.codex-plugin/hooks/install-pkgs.sh +69 -0
  44. package/plugins/lisa/.codex-plugin/hooks/notify-ntfy.sh +183 -0
  45. package/plugins/lisa/.codex-plugin/hooks/setup-jira-cli.sh +51 -0
  46. package/plugins/lisa/.codex-plugin/hooks.json +75 -0
  47. package/plugins/lisa/.codex-plugin/plugin.json +2 -1
  48. package/plugins/lisa-agy/agents/architecture-specialist.md +47 -0
  49. package/plugins/lisa-agy/agents/bug-fixer.md +39 -0
  50. package/plugins/lisa-agy/agents/builder.md +40 -0
  51. package/plugins/lisa-agy/agents/confluence-prd-intake.md +65 -0
  52. package/plugins/lisa-agy/agents/debug-specialist.md +114 -0
  53. package/plugins/lisa-agy/agents/git-history-analyzer.md +183 -0
  54. package/plugins/lisa-agy/agents/github-agent.md +148 -0
  55. package/plugins/lisa-agy/agents/github-build-intake.md +64 -0
  56. package/plugins/lisa-agy/agents/github-prd-intake.md +66 -0
  57. package/plugins/lisa-agy/agents/jira-agent.md +129 -0
  58. package/plugins/lisa-agy/agents/jira-build-intake.md +64 -0
  59. package/plugins/lisa-agy/agents/learner.md +43 -0
  60. package/plugins/lisa-agy/agents/learnings-synthesizer.md +135 -0
  61. package/plugins/lisa-agy/agents/linear-agent.md +134 -0
  62. package/plugins/lisa-agy/agents/linear-build-intake.md +64 -0
  63. package/plugins/lisa-agy/agents/linear-prd-intake.md +66 -0
  64. package/plugins/lisa-agy/agents/notion-prd-intake.md +63 -0
  65. package/plugins/lisa-agy/agents/performance-specialist.md +85 -0
  66. package/plugins/lisa-agy/agents/pr-mining-specialist.md +85 -0
  67. package/plugins/lisa-agy/agents/product-specialist.md +63 -0
  68. package/plugins/lisa-agy/agents/quality-specialist.md +56 -0
  69. package/plugins/lisa-agy/agents/security-specialist.md +51 -0
  70. package/plugins/lisa-agy/agents/skill-evaluator.md +245 -0
  71. package/plugins/lisa-agy/agents/spec-conformance-specialist.md +49 -0
  72. package/plugins/lisa-agy/agents/test-specialist.md +49 -0
  73. package/plugins/lisa-agy/agents/tracker-mining-specialist.md +85 -0
  74. package/plugins/lisa-agy/agents/verification-specialist.md +135 -0
  75. package/plugins/lisa-agy/commands/automation-status.md +12 -0
  76. package/plugins/lisa-agy/commands/codify-verification.md +6 -0
  77. package/plugins/lisa-agy/commands/debrief/apply.md +6 -0
  78. package/plugins/lisa-agy/commands/debrief.md +6 -0
  79. package/plugins/lisa-agy/commands/doctor.md +6 -0
  80. package/plugins/lisa-agy/commands/fix/linter-error.md +7 -0
  81. package/plugins/lisa-agy/commands/git/commit.md +7 -0
  82. package/plugins/lisa-agy/commands/git/prune.md +6 -0
  83. package/plugins/lisa-agy/commands/git/submit-pr.md +7 -0
  84. package/plugins/lisa-agy/commands/implement.md +6 -0
  85. package/plugins/lisa-agy/commands/improve/code-complexity.md +6 -0
  86. package/plugins/lisa-agy/commands/improve/max-lines-per-function.md +7 -0
  87. package/plugins/lisa-agy/commands/improve/max-lines.md +7 -0
  88. package/plugins/lisa-agy/commands/improve/test-coverage.md +7 -0
  89. package/plugins/lisa-agy/commands/improve/tests.md +7 -0
  90. package/plugins/lisa-agy/commands/intake-explain.md +31 -0
  91. package/plugins/lisa-agy/commands/intake.md +6 -0
  92. package/plugins/lisa-agy/commands/monitor.md +6 -0
  93. package/plugins/lisa-agy/commands/plan.md +6 -0
  94. package/plugins/lisa-agy/commands/plugin-sync-explain.md +8 -0
  95. package/plugins/lisa-agy/commands/product-walkthrough.md +7 -0
  96. package/plugins/lisa-agy/commands/project-ideation.md +6 -0
  97. package/plugins/lisa-agy/commands/pull-request/review.md +7 -0
  98. package/plugins/lisa-agy/commands/queue-status.md +34 -0
  99. package/plugins/lisa-agy/commands/repair-intake.md +6 -0
  100. package/plugins/lisa-agy/commands/research.md +6 -0
  101. package/plugins/lisa-agy/commands/review/local.md +6 -0
  102. package/plugins/lisa-agy/commands/security/zap-scan.md +6 -0
  103. package/plugins/lisa-agy/commands/setup/atlassian.md +7 -0
  104. package/plugins/lisa-agy/commands/setup/confluence.md +7 -0
  105. package/plugins/lisa-agy/commands/setup/github.md +7 -0
  106. package/plugins/lisa-agy/commands/setup/jira.md +7 -0
  107. package/plugins/lisa-agy/commands/setup/linear.md +7 -0
  108. package/plugins/lisa-agy/commands/setup/notion.md +7 -0
  109. package/plugins/lisa-agy/commands/setup-automations.md +6 -0
  110. package/plugins/lisa-agy/commands/tear-down-automations.md +6 -0
  111. package/plugins/lisa-agy/commands/verify-prd.md +6 -0
  112. package/plugins/lisa-agy/commands/verify.md +6 -0
  113. package/plugins/lisa-agy/commands/wiki/install.md +7 -0
  114. package/plugins/lisa-agy/plugin.json +8 -0
  115. package/plugins/lisa-agy/scripts/automation-status-claude-adapter.mjs +672 -0
  116. package/plugins/lisa-agy/scripts/automation-status-codex-adapter.mjs +697 -0
  117. package/plugins/lisa-agy/scripts/automation-status-contract-drift.mjs +392 -0
  118. package/plugins/lisa-agy/scripts/automation-status-expected-fleet.mjs +319 -0
  119. package/plugins/lisa-agy/scripts/automation-status-report.mjs +170 -0
  120. package/plugins/lisa-agy/scripts/doctor-report.mjs +143 -0
  121. package/plugins/lisa-agy/scripts/plugin-sync-explain.mjs +512 -0
  122. package/plugins/lisa-agy/scripts/project-ideation-idempotency-harness.mjs +319 -0
  123. package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +453 -0
  124. package/plugins/lisa-agy/scripts/queue-health-classification.mjs +157 -0
  125. package/plugins/lisa-agy/scripts/queue-status-build-readers.mjs +509 -0
  126. package/plugins/lisa-agy/scripts/queue-status-prd-readers.mjs +452 -0
  127. package/plugins/lisa-agy/skills/acceptance-criteria/SKILL.md +71 -0
  128. package/plugins/lisa-agy/skills/agent-design-best-practices/SKILL.md +219 -0
  129. package/plugins/lisa-agy/skills/atlassian-access/SKILL.md +293 -0
  130. package/plugins/lisa-agy/skills/automation-status/SKILL.md +111 -0
  131. package/plugins/lisa-agy/skills/bug-triage/SKILL.md +23 -0
  132. package/plugins/lisa-agy/skills/codebase-research/SKILL.md +87 -0
  133. package/plugins/lisa-agy/skills/codify-verification/SKILL.md +152 -0
  134. package/plugins/lisa-agy/skills/confluence-prd-intake/SKILL.md +417 -0
  135. package/plugins/lisa-agy/skills/confluence-to-tracker/SKILL.md +360 -0
  136. package/plugins/lisa-agy/skills/confluence-write-prd/SKILL.md +109 -0
  137. package/plugins/lisa-agy/skills/debrief/SKILL.md +94 -0
  138. package/plugins/lisa-agy/skills/debrief-apply/SKILL.md +63 -0
  139. package/plugins/lisa-agy/skills/doctor/SKILL.md +317 -0
  140. package/plugins/lisa-agy/skills/epic-triage/SKILL.md +28 -0
  141. package/plugins/lisa-agy/skills/fix-linter-error/SKILL.md +45 -0
  142. package/plugins/lisa-agy/skills/git-commit/SKILL.md +48 -0
  143. package/plugins/lisa-agy/skills/git-prune/SKILL.md +35 -0
  144. package/plugins/lisa-agy/skills/git-submit-pr/SKILL.md +105 -0
  145. package/plugins/lisa-agy/skills/github-add-journey/SKILL.md +115 -0
  146. package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +377 -0
  147. package/plugins/lisa-agy/skills/github-create/SKILL.md +101 -0
  148. package/plugins/lisa-agy/skills/github-evidence/SKILL.md +110 -0
  149. package/plugins/lisa-agy/skills/github-journey/SKILL.md +121 -0
  150. package/plugins/lisa-agy/skills/github-prd-intake/SKILL.md +432 -0
  151. package/plugins/lisa-agy/skills/github-project-v2/SKILL.md +227 -0
  152. package/plugins/lisa-agy/skills/github-read-issue/SKILL.md +248 -0
  153. package/plugins/lisa-agy/skills/github-sync/SKILL.md +119 -0
  154. package/plugins/lisa-agy/skills/github-to-tracker/SKILL.md +345 -0
  155. package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +331 -0
  156. package/plugins/lisa-agy/skills/github-verify/SKILL.md +29 -0
  157. package/plugins/lisa-agy/skills/github-write-issue/SKILL.md +339 -0
  158. package/plugins/lisa-agy/skills/github-write-prd/SKILL.md +157 -0
  159. package/plugins/lisa-agy/skills/implement/SKILL.md +145 -0
  160. package/plugins/lisa-agy/skills/improve-code-complexity/SKILL.md +44 -0
  161. package/plugins/lisa-agy/skills/improve-max-lines/SKILL.md +45 -0
  162. package/plugins/lisa-agy/skills/improve-max-lines-per-function/SKILL.md +46 -0
  163. package/plugins/lisa-agy/skills/improve-test-coverage/SKILL.md +44 -0
  164. package/plugins/lisa-agy/skills/improve-tests/SKILL.md +47 -0
  165. package/plugins/lisa-agy/skills/intake/SKILL.md +132 -0
  166. package/plugins/lisa-agy/skills/intake-explain/SKILL.md +279 -0
  167. package/plugins/lisa-agy/skills/jira-add-journey/SKILL.md +121 -0
  168. package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +286 -0
  169. package/plugins/lisa-agy/skills/jira-create/SKILL.md +154 -0
  170. package/plugins/lisa-agy/skills/jira-evidence/SKILL.md +90 -0
  171. package/plugins/lisa-agy/skills/jira-evidence/scripts/post-evidence.sh +163 -0
  172. package/plugins/lisa-agy/skills/jira-journey/SKILL.md +127 -0
  173. package/plugins/lisa-agy/skills/jira-journey/scripts/generate-templates.py +233 -0
  174. package/plugins/lisa-agy/skills/jira-journey/scripts/parse-plan.py +368 -0
  175. package/plugins/lisa-agy/skills/jira-read-ticket/SKILL.md +198 -0
  176. package/plugins/lisa-agy/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
  177. package/plugins/lisa-agy/skills/jira-sync/SKILL.md +95 -0
  178. package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +318 -0
  179. package/plugins/lisa-agy/skills/jira-verify/SKILL.md +30 -0
  180. package/plugins/lisa-agy/skills/jira-write-ticket/SKILL.md +265 -0
  181. package/plugins/lisa-agy/skills/jsdoc-best-practices/SKILL.md +432 -0
  182. package/plugins/lisa-agy/skills/linear-add-journey/SKILL.md +105 -0
  183. package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +283 -0
  184. package/plugins/lisa-agy/skills/linear-create/SKILL.md +146 -0
  185. package/plugins/lisa-agy/skills/linear-evidence/SKILL.md +103 -0
  186. package/plugins/lisa-agy/skills/linear-journey/SKILL.md +134 -0
  187. package/plugins/lisa-agy/skills/linear-prd-intake/SKILL.md +383 -0
  188. package/plugins/lisa-agy/skills/linear-read-issue/SKILL.md +200 -0
  189. package/plugins/lisa-agy/skills/linear-sync/SKILL.md +114 -0
  190. package/plugins/lisa-agy/skills/linear-to-tracker/SKILL.md +342 -0
  191. package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +313 -0
  192. package/plugins/lisa-agy/skills/linear-verify/SKILL.md +51 -0
  193. package/plugins/lisa-agy/skills/linear-write-issue/SKILL.md +292 -0
  194. package/plugins/lisa-agy/skills/linear-write-prd/SKILL.md +96 -0
  195. package/plugins/lisa-agy/skills/lisa-review-implementation/SKILL.md +209 -0
  196. package/plugins/lisa-agy/skills/monitor/SKILL.md +48 -0
  197. package/plugins/lisa-agy/skills/nightly-add-test-coverage/SKILL.md +40 -0
  198. package/plugins/lisa-agy/skills/nightly-improve-tests/SKILL.md +29 -0
  199. package/plugins/lisa-agy/skills/nightly-lower-code-complexity/SKILL.md +28 -0
  200. package/plugins/lisa-agy/skills/notion-access/SKILL.md +226 -0
  201. package/plugins/lisa-agy/skills/notion-prd-intake/SKILL.md +360 -0
  202. package/plugins/lisa-agy/skills/notion-to-tracker/SKILL.md +357 -0
  203. package/plugins/lisa-agy/skills/notion-write-prd/SKILL.md +109 -0
  204. package/plugins/lisa-agy/skills/performance-review/SKILL.md +94 -0
  205. package/plugins/lisa-agy/skills/plan/SKILL.md +60 -0
  206. package/plugins/lisa-agy/skills/plugin-sync-explain/SKILL.md +53 -0
  207. package/plugins/lisa-agy/skills/prd-backlink/SKILL.md +265 -0
  208. package/plugins/lisa-agy/skills/prd-source-write/SKILL.md +101 -0
  209. package/plugins/lisa-agy/skills/prd-ticket-coverage/SKILL.md +170 -0
  210. package/plugins/lisa-agy/skills/product-walkthrough/SKILL.md +129 -0
  211. package/plugins/lisa-agy/skills/project-ideation/SKILL.md +315 -0
  212. package/plugins/lisa-agy/skills/project-ideation/examples/evidence-card-format.md +21 -0
  213. package/plugins/lisa-agy/skills/project-ideation/examples/host-project-only.md +22 -0
  214. package/plugins/lisa-agy/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
  215. package/plugins/lisa-agy/skills/project-ideation/examples/public-external-inspiration.md +22 -0
  216. package/plugins/lisa-agy/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
  217. package/plugins/lisa-agy/skills/pull-request-review/SKILL.md +68 -0
  218. package/plugins/lisa-agy/skills/quality-review/SKILL.md +54 -0
  219. package/plugins/lisa-agy/skills/queue-status/SKILL.md +133 -0
  220. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +584 -0
  221. package/plugins/lisa-agy/skills/reproduce-bug/SKILL.md +96 -0
  222. package/plugins/lisa-agy/skills/research/SKILL.md +68 -0
  223. package/plugins/lisa-agy/skills/review-local/SKILL.md +88 -0
  224. package/plugins/lisa-agy/skills/root-cause-analysis/SKILL.md +155 -0
  225. package/plugins/lisa-agy/skills/security-review/SKILL.md +57 -0
  226. package/plugins/lisa-agy/skills/security-zap-scan/SKILL.md +33 -0
  227. package/plugins/lisa-agy/skills/setup-atlassian/SKILL.md +347 -0
  228. package/plugins/lisa-agy/skills/setup-automations/SKILL.md +99 -0
  229. package/plugins/lisa-agy/skills/setup-confluence/SKILL.md +254 -0
  230. package/plugins/lisa-agy/skills/setup-github/SKILL.md +268 -0
  231. package/plugins/lisa-agy/skills/setup-jira/SKILL.md +198 -0
  232. package/plugins/lisa-agy/skills/setup-linear/SKILL.md +251 -0
  233. package/plugins/lisa-agy/skills/setup-notion/SKILL.md +316 -0
  234. package/plugins/lisa-agy/skills/spec-conformance/SKILL.md +159 -0
  235. package/plugins/lisa-agy/skills/task-decomposition/SKILL.md +127 -0
  236. package/plugins/lisa-agy/skills/task-triage/SKILL.md +23 -0
  237. package/plugins/lisa-agy/skills/tdd-implementation/SKILL.md +83 -0
  238. package/plugins/lisa-agy/skills/tear-down-automations/SKILL.md +34 -0
  239. package/plugins/lisa-agy/skills/test-strategy/SKILL.md +63 -0
  240. package/plugins/lisa-agy/skills/ticket-triage/SKILL.md +182 -0
  241. package/plugins/lisa-agy/skills/tracker-add-journey/SKILL.md +26 -0
  242. package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +64 -0
  243. package/plugins/lisa-agy/skills/tracker-create/SKILL.md +26 -0
  244. package/plugins/lisa-agy/skills/tracker-evidence/SKILL.md +52 -0
  245. package/plugins/lisa-agy/skills/tracker-journey/SKILL.md +26 -0
  246. package/plugins/lisa-agy/skills/tracker-read/SKILL.md +27 -0
  247. package/plugins/lisa-agy/skills/tracker-source-artifacts/SKILL.md +107 -0
  248. package/plugins/lisa-agy/skills/tracker-sync/SKILL.md +51 -0
  249. package/plugins/lisa-agy/skills/tracker-validate/SKILL.md +36 -0
  250. package/plugins/lisa-agy/skills/tracker-verify/SKILL.md +27 -0
  251. package/plugins/lisa-agy/skills/tracker-write/SKILL.md +53 -0
  252. package/plugins/lisa-agy/skills/usage-accounting/SKILL.md +170 -0
  253. package/plugins/lisa-agy/skills/verification-lifecycle/SKILL.md +339 -0
  254. package/plugins/lisa-agy/skills/verify/SKILL.md +49 -0
  255. package/plugins/lisa-agy/skills/verify-prd/SKILL.md +392 -0
  256. package/plugins/lisa-agy/skills/wiki-install/SKILL.md +101 -0
  257. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  258. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  259. package/plugins/lisa-copilot/.claude-plugin/plugin.json +72 -0
  260. package/plugins/lisa-copilot/agents/architecture-specialist.agent.md +47 -0
  261. package/plugins/lisa-copilot/agents/bug-fixer.agent.md +39 -0
  262. package/plugins/lisa-copilot/agents/builder.agent.md +40 -0
  263. package/plugins/lisa-copilot/agents/confluence-prd-intake.agent.md +65 -0
  264. package/plugins/lisa-copilot/agents/debug-specialist.agent.md +114 -0
  265. package/plugins/lisa-copilot/agents/git-history-analyzer.agent.md +183 -0
  266. package/plugins/lisa-copilot/agents/github-agent.agent.md +148 -0
  267. package/plugins/lisa-copilot/agents/github-build-intake.agent.md +64 -0
  268. package/plugins/lisa-copilot/agents/github-prd-intake.agent.md +66 -0
  269. package/plugins/lisa-copilot/agents/jira-agent.agent.md +129 -0
  270. package/plugins/lisa-copilot/agents/jira-build-intake.agent.md +64 -0
  271. package/plugins/lisa-copilot/agents/learner.agent.md +43 -0
  272. package/plugins/lisa-copilot/agents/learnings-synthesizer.agent.md +135 -0
  273. package/plugins/lisa-copilot/agents/linear-agent.agent.md +134 -0
  274. package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +64 -0
  275. package/plugins/lisa-copilot/agents/linear-prd-intake.agent.md +66 -0
  276. package/plugins/lisa-copilot/agents/notion-prd-intake.agent.md +63 -0
  277. package/plugins/lisa-copilot/agents/performance-specialist.agent.md +85 -0
  278. package/plugins/lisa-copilot/agents/pr-mining-specialist.agent.md +85 -0
  279. package/plugins/lisa-copilot/agents/product-specialist.agent.md +63 -0
  280. package/plugins/lisa-copilot/agents/quality-specialist.agent.md +56 -0
  281. package/plugins/lisa-copilot/agents/security-specialist.agent.md +51 -0
  282. package/plugins/lisa-copilot/agents/skill-evaluator.agent.md +245 -0
  283. package/plugins/lisa-copilot/agents/spec-conformance-specialist.agent.md +49 -0
  284. package/plugins/lisa-copilot/agents/test-specialist.agent.md +49 -0
  285. package/plugins/lisa-copilot/agents/tracker-mining-specialist.agent.md +85 -0
  286. package/plugins/lisa-copilot/agents/verification-specialist.agent.md +135 -0
  287. package/plugins/lisa-copilot/commands/automation-status.md +12 -0
  288. package/plugins/lisa-copilot/commands/codify-verification.md +6 -0
  289. package/plugins/lisa-copilot/commands/debrief/apply.md +6 -0
  290. package/plugins/lisa-copilot/commands/debrief.md +6 -0
  291. package/plugins/lisa-copilot/commands/doctor.md +6 -0
  292. package/plugins/lisa-copilot/commands/fix/linter-error.md +7 -0
  293. package/plugins/lisa-copilot/commands/git/commit.md +7 -0
  294. package/plugins/lisa-copilot/commands/git/prune.md +6 -0
  295. package/plugins/lisa-copilot/commands/git/submit-pr.md +7 -0
  296. package/plugins/lisa-copilot/commands/implement.md +6 -0
  297. package/plugins/lisa-copilot/commands/improve/code-complexity.md +6 -0
  298. package/plugins/lisa-copilot/commands/improve/max-lines-per-function.md +7 -0
  299. package/plugins/lisa-copilot/commands/improve/max-lines.md +7 -0
  300. package/plugins/lisa-copilot/commands/improve/test-coverage.md +7 -0
  301. package/plugins/lisa-copilot/commands/improve/tests.md +7 -0
  302. package/plugins/lisa-copilot/commands/intake-explain.md +31 -0
  303. package/plugins/lisa-copilot/commands/intake.md +6 -0
  304. package/plugins/lisa-copilot/commands/monitor.md +6 -0
  305. package/plugins/lisa-copilot/commands/plan.md +6 -0
  306. package/plugins/lisa-copilot/commands/plugin-sync-explain.md +8 -0
  307. package/plugins/lisa-copilot/commands/product-walkthrough.md +7 -0
  308. package/plugins/lisa-copilot/commands/project-ideation.md +6 -0
  309. package/plugins/lisa-copilot/commands/pull-request/review.md +7 -0
  310. package/plugins/lisa-copilot/commands/queue-status.md +34 -0
  311. package/plugins/lisa-copilot/commands/repair-intake.md +6 -0
  312. package/plugins/lisa-copilot/commands/research.md +6 -0
  313. package/plugins/lisa-copilot/commands/review/local.md +6 -0
  314. package/plugins/lisa-copilot/commands/security/zap-scan.md +6 -0
  315. package/plugins/lisa-copilot/commands/setup/atlassian.md +7 -0
  316. package/plugins/lisa-copilot/commands/setup/confluence.md +7 -0
  317. package/plugins/lisa-copilot/commands/setup/github.md +7 -0
  318. package/plugins/lisa-copilot/commands/setup/jira.md +7 -0
  319. package/plugins/lisa-copilot/commands/setup/linear.md +7 -0
  320. package/plugins/lisa-copilot/commands/setup/notion.md +7 -0
  321. package/plugins/lisa-copilot/commands/setup-automations.md +6 -0
  322. package/plugins/lisa-copilot/commands/tear-down-automations.md +6 -0
  323. package/plugins/lisa-copilot/commands/verify-prd.md +6 -0
  324. package/plugins/lisa-copilot/commands/verify.md +6 -0
  325. package/plugins/lisa-copilot/commands/wiki/install.md +7 -0
  326. package/plugins/lisa-copilot/hooks/block-no-verify.sh +37 -0
  327. package/plugins/lisa-copilot/hooks/inject-rules.sh +33 -0
  328. package/plugins/lisa-copilot/hooks/install-pkgs.sh +69 -0
  329. package/plugins/lisa-copilot/hooks/notify-ntfy.sh +183 -0
  330. package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +51 -0
  331. package/plugins/lisa-copilot/rules/eager/base-rules.md +70 -0
  332. package/plugins/lisa-copilot/rules/eager/coding-philosophy.md +27 -0
  333. package/plugins/lisa-copilot/rules/eager/config-resolution.md +28 -0
  334. package/plugins/lisa-copilot/rules/eager/documentation-source-paths.md +13 -0
  335. package/plugins/lisa-copilot/rules/eager/empirical-inquiry.md +22 -0
  336. package/plugins/lisa-copilot/rules/eager/intent-routing.md +18 -0
  337. package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +39 -0
  338. package/plugins/lisa-copilot/rules/eager/prd-lifecycle-rollup.md +31 -0
  339. package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +39 -0
  340. package/plugins/lisa-copilot/rules/eager/security-audit-handling.md +29 -0
  341. package/plugins/lisa-copilot/rules/eager/usage-accounting.md +28 -0
  342. package/plugins/lisa-copilot/rules/eager/verification.md +21 -0
  343. package/plugins/lisa-copilot/rules/eager/wiki-knowledge-source.md +16 -0
  344. package/plugins/lisa-copilot/rules/reference/base-rules.md +133 -0
  345. package/plugins/lisa-copilot/rules/reference/coding-philosophy.md +428 -0
  346. package/plugins/lisa-copilot/rules/reference/config-resolution.md +691 -0
  347. package/plugins/lisa-copilot/rules/reference/documentation-source-paths.md +13 -0
  348. package/plugins/lisa-copilot/rules/reference/empirical-inquiry.md +27 -0
  349. package/plugins/lisa-copilot/rules/reference/intent-routing.md +407 -0
  350. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +120 -0
  351. package/plugins/lisa-copilot/rules/reference/prd-lifecycle-rollup.md +156 -0
  352. package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +58 -0
  353. package/plugins/lisa-copilot/rules/reference/security-audit-handling.md +30 -0
  354. package/plugins/lisa-copilot/rules/reference/usage-accounting.md +144 -0
  355. package/plugins/lisa-copilot/rules/reference/verification.md +124 -0
  356. package/plugins/lisa-copilot/rules/reference/wiki-knowledge-source.md +14 -0
  357. package/plugins/lisa-copilot/scripts/automation-status-claude-adapter.mjs +672 -0
  358. package/plugins/lisa-copilot/scripts/automation-status-codex-adapter.mjs +697 -0
  359. package/plugins/lisa-copilot/scripts/automation-status-contract-drift.mjs +392 -0
  360. package/plugins/lisa-copilot/scripts/automation-status-expected-fleet.mjs +319 -0
  361. package/plugins/lisa-copilot/scripts/automation-status-report.mjs +170 -0
  362. package/plugins/lisa-copilot/scripts/doctor-report.mjs +143 -0
  363. package/plugins/lisa-copilot/scripts/plugin-sync-explain.mjs +512 -0
  364. package/plugins/lisa-copilot/scripts/project-ideation-idempotency-harness.mjs +319 -0
  365. package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +453 -0
  366. package/plugins/lisa-copilot/scripts/queue-health-classification.mjs +157 -0
  367. package/plugins/lisa-copilot/scripts/queue-status-build-readers.mjs +509 -0
  368. package/plugins/lisa-copilot/scripts/queue-status-prd-readers.mjs +452 -0
  369. package/plugins/lisa-copilot/skills/acceptance-criteria/SKILL.md +71 -0
  370. package/plugins/lisa-copilot/skills/agent-design-best-practices/SKILL.md +219 -0
  371. package/plugins/lisa-copilot/skills/atlassian-access/SKILL.md +293 -0
  372. package/plugins/lisa-copilot/skills/automation-status/SKILL.md +111 -0
  373. package/plugins/lisa-copilot/skills/bug-triage/SKILL.md +23 -0
  374. package/plugins/lisa-copilot/skills/codebase-research/SKILL.md +87 -0
  375. package/plugins/lisa-copilot/skills/codify-verification/SKILL.md +152 -0
  376. package/plugins/lisa-copilot/skills/confluence-prd-intake/SKILL.md +417 -0
  377. package/plugins/lisa-copilot/skills/confluence-to-tracker/SKILL.md +360 -0
  378. package/plugins/lisa-copilot/skills/confluence-write-prd/SKILL.md +109 -0
  379. package/plugins/lisa-copilot/skills/debrief/SKILL.md +94 -0
  380. package/plugins/lisa-copilot/skills/debrief-apply/SKILL.md +63 -0
  381. package/plugins/lisa-copilot/skills/doctor/SKILL.md +317 -0
  382. package/plugins/lisa-copilot/skills/epic-triage/SKILL.md +28 -0
  383. package/plugins/lisa-copilot/skills/fix-linter-error/SKILL.md +45 -0
  384. package/plugins/lisa-copilot/skills/git-commit/SKILL.md +48 -0
  385. package/plugins/lisa-copilot/skills/git-prune/SKILL.md +35 -0
  386. package/plugins/lisa-copilot/skills/git-submit-pr/SKILL.md +105 -0
  387. package/plugins/lisa-copilot/skills/github-add-journey/SKILL.md +115 -0
  388. package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +377 -0
  389. package/plugins/lisa-copilot/skills/github-create/SKILL.md +101 -0
  390. package/plugins/lisa-copilot/skills/github-evidence/SKILL.md +110 -0
  391. package/plugins/lisa-copilot/skills/github-journey/SKILL.md +121 -0
  392. package/plugins/lisa-copilot/skills/github-prd-intake/SKILL.md +432 -0
  393. package/plugins/lisa-copilot/skills/github-project-v2/SKILL.md +227 -0
  394. package/plugins/lisa-copilot/skills/github-read-issue/SKILL.md +248 -0
  395. package/plugins/lisa-copilot/skills/github-sync/SKILL.md +119 -0
  396. package/plugins/lisa-copilot/skills/github-to-tracker/SKILL.md +345 -0
  397. package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +331 -0
  398. package/plugins/lisa-copilot/skills/github-verify/SKILL.md +29 -0
  399. package/plugins/lisa-copilot/skills/github-write-issue/SKILL.md +339 -0
  400. package/plugins/lisa-copilot/skills/github-write-prd/SKILL.md +157 -0
  401. package/plugins/lisa-copilot/skills/implement/SKILL.md +145 -0
  402. package/plugins/lisa-copilot/skills/improve-code-complexity/SKILL.md +44 -0
  403. package/plugins/lisa-copilot/skills/improve-max-lines/SKILL.md +45 -0
  404. package/plugins/lisa-copilot/skills/improve-max-lines-per-function/SKILL.md +46 -0
  405. package/plugins/lisa-copilot/skills/improve-test-coverage/SKILL.md +44 -0
  406. package/plugins/lisa-copilot/skills/improve-tests/SKILL.md +47 -0
  407. package/plugins/lisa-copilot/skills/intake/SKILL.md +132 -0
  408. package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +279 -0
  409. package/plugins/lisa-copilot/skills/jira-add-journey/SKILL.md +121 -0
  410. package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +286 -0
  411. package/plugins/lisa-copilot/skills/jira-create/SKILL.md +154 -0
  412. package/plugins/lisa-copilot/skills/jira-evidence/SKILL.md +90 -0
  413. package/plugins/lisa-copilot/skills/jira-evidence/scripts/post-evidence.sh +163 -0
  414. package/plugins/lisa-copilot/skills/jira-journey/SKILL.md +127 -0
  415. package/plugins/lisa-copilot/skills/jira-journey/scripts/generate-templates.py +233 -0
  416. package/plugins/lisa-copilot/skills/jira-journey/scripts/parse-plan.py +368 -0
  417. package/plugins/lisa-copilot/skills/jira-read-ticket/SKILL.md +198 -0
  418. package/plugins/lisa-copilot/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
  419. package/plugins/lisa-copilot/skills/jira-sync/SKILL.md +95 -0
  420. package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +318 -0
  421. package/plugins/lisa-copilot/skills/jira-verify/SKILL.md +30 -0
  422. package/plugins/lisa-copilot/skills/jira-write-ticket/SKILL.md +265 -0
  423. package/plugins/lisa-copilot/skills/jsdoc-best-practices/SKILL.md +432 -0
  424. package/plugins/lisa-copilot/skills/linear-add-journey/SKILL.md +105 -0
  425. package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +283 -0
  426. package/plugins/lisa-copilot/skills/linear-create/SKILL.md +146 -0
  427. package/plugins/lisa-copilot/skills/linear-evidence/SKILL.md +103 -0
  428. package/plugins/lisa-copilot/skills/linear-journey/SKILL.md +134 -0
  429. package/plugins/lisa-copilot/skills/linear-prd-intake/SKILL.md +383 -0
  430. package/plugins/lisa-copilot/skills/linear-read-issue/SKILL.md +200 -0
  431. package/plugins/lisa-copilot/skills/linear-sync/SKILL.md +114 -0
  432. package/plugins/lisa-copilot/skills/linear-to-tracker/SKILL.md +342 -0
  433. package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +313 -0
  434. package/plugins/lisa-copilot/skills/linear-verify/SKILL.md +51 -0
  435. package/plugins/lisa-copilot/skills/linear-write-issue/SKILL.md +292 -0
  436. package/plugins/lisa-copilot/skills/linear-write-prd/SKILL.md +96 -0
  437. package/plugins/lisa-copilot/skills/lisa-review-implementation/SKILL.md +209 -0
  438. package/plugins/lisa-copilot/skills/monitor/SKILL.md +48 -0
  439. package/plugins/lisa-copilot/skills/nightly-add-test-coverage/SKILL.md +40 -0
  440. package/plugins/lisa-copilot/skills/nightly-improve-tests/SKILL.md +29 -0
  441. package/plugins/lisa-copilot/skills/nightly-lower-code-complexity/SKILL.md +28 -0
  442. package/plugins/lisa-copilot/skills/notion-access/SKILL.md +226 -0
  443. package/plugins/lisa-copilot/skills/notion-prd-intake/SKILL.md +360 -0
  444. package/plugins/lisa-copilot/skills/notion-to-tracker/SKILL.md +357 -0
  445. package/plugins/lisa-copilot/skills/notion-write-prd/SKILL.md +109 -0
  446. package/plugins/lisa-copilot/skills/performance-review/SKILL.md +94 -0
  447. package/plugins/lisa-copilot/skills/plan/SKILL.md +60 -0
  448. package/plugins/lisa-copilot/skills/plugin-sync-explain/SKILL.md +53 -0
  449. package/plugins/lisa-copilot/skills/prd-backlink/SKILL.md +265 -0
  450. package/plugins/lisa-copilot/skills/prd-source-write/SKILL.md +101 -0
  451. package/plugins/lisa-copilot/skills/prd-ticket-coverage/SKILL.md +170 -0
  452. package/plugins/lisa-copilot/skills/product-walkthrough/SKILL.md +129 -0
  453. package/plugins/lisa-copilot/skills/project-ideation/SKILL.md +315 -0
  454. package/plugins/lisa-copilot/skills/project-ideation/examples/evidence-card-format.md +21 -0
  455. package/plugins/lisa-copilot/skills/project-ideation/examples/host-project-only.md +22 -0
  456. package/plugins/lisa-copilot/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
  457. package/plugins/lisa-copilot/skills/project-ideation/examples/public-external-inspiration.md +22 -0
  458. package/plugins/lisa-copilot/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
  459. package/plugins/lisa-copilot/skills/pull-request-review/SKILL.md +68 -0
  460. package/plugins/lisa-copilot/skills/quality-review/SKILL.md +54 -0
  461. package/plugins/lisa-copilot/skills/queue-status/SKILL.md +133 -0
  462. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +584 -0
  463. package/plugins/lisa-copilot/skills/reproduce-bug/SKILL.md +96 -0
  464. package/plugins/lisa-copilot/skills/research/SKILL.md +68 -0
  465. package/plugins/lisa-copilot/skills/review-local/SKILL.md +88 -0
  466. package/plugins/lisa-copilot/skills/root-cause-analysis/SKILL.md +155 -0
  467. package/plugins/lisa-copilot/skills/security-review/SKILL.md +57 -0
  468. package/plugins/lisa-copilot/skills/security-zap-scan/SKILL.md +33 -0
  469. package/plugins/lisa-copilot/skills/setup-atlassian/SKILL.md +347 -0
  470. package/plugins/lisa-copilot/skills/setup-automations/SKILL.md +99 -0
  471. package/plugins/lisa-copilot/skills/setup-confluence/SKILL.md +254 -0
  472. package/plugins/lisa-copilot/skills/setup-github/SKILL.md +268 -0
  473. package/plugins/lisa-copilot/skills/setup-jira/SKILL.md +198 -0
  474. package/plugins/lisa-copilot/skills/setup-linear/SKILL.md +251 -0
  475. package/plugins/lisa-copilot/skills/setup-notion/SKILL.md +316 -0
  476. package/plugins/lisa-copilot/skills/spec-conformance/SKILL.md +159 -0
  477. package/plugins/lisa-copilot/skills/task-decomposition/SKILL.md +127 -0
  478. package/plugins/lisa-copilot/skills/task-triage/SKILL.md +23 -0
  479. package/plugins/lisa-copilot/skills/tdd-implementation/SKILL.md +83 -0
  480. package/plugins/lisa-copilot/skills/tear-down-automations/SKILL.md +34 -0
  481. package/plugins/lisa-copilot/skills/test-strategy/SKILL.md +63 -0
  482. package/plugins/lisa-copilot/skills/ticket-triage/SKILL.md +182 -0
  483. package/plugins/lisa-copilot/skills/tracker-add-journey/SKILL.md +26 -0
  484. package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +64 -0
  485. package/plugins/lisa-copilot/skills/tracker-create/SKILL.md +26 -0
  486. package/plugins/lisa-copilot/skills/tracker-evidence/SKILL.md +52 -0
  487. package/plugins/lisa-copilot/skills/tracker-journey/SKILL.md +26 -0
  488. package/plugins/lisa-copilot/skills/tracker-read/SKILL.md +27 -0
  489. package/plugins/lisa-copilot/skills/tracker-source-artifacts/SKILL.md +107 -0
  490. package/plugins/lisa-copilot/skills/tracker-sync/SKILL.md +51 -0
  491. package/plugins/lisa-copilot/skills/tracker-validate/SKILL.md +36 -0
  492. package/plugins/lisa-copilot/skills/tracker-verify/SKILL.md +27 -0
  493. package/plugins/lisa-copilot/skills/tracker-write/SKILL.md +53 -0
  494. package/plugins/lisa-copilot/skills/usage-accounting/SKILL.md +170 -0
  495. package/plugins/lisa-copilot/skills/verification-lifecycle/SKILL.md +339 -0
  496. package/plugins/lisa-copilot/skills/verify/SKILL.md +49 -0
  497. package/plugins/lisa-copilot/skills/verify-prd/SKILL.md +392 -0
  498. package/plugins/lisa-copilot/skills/wiki-install/SKILL.md +101 -0
  499. package/plugins/lisa-cursor/.claude-plugin/plugin.json +52 -0
  500. package/plugins/lisa-cursor/agents/architecture-specialist.md +47 -0
  501. package/plugins/lisa-cursor/agents/bug-fixer.md +39 -0
  502. package/plugins/lisa-cursor/agents/builder.md +40 -0
  503. package/plugins/lisa-cursor/agents/confluence-prd-intake.md +65 -0
  504. package/plugins/lisa-cursor/agents/debug-specialist.md +114 -0
  505. package/plugins/lisa-cursor/agents/git-history-analyzer.md +183 -0
  506. package/plugins/lisa-cursor/agents/github-agent.md +148 -0
  507. package/plugins/lisa-cursor/agents/github-build-intake.md +64 -0
  508. package/plugins/lisa-cursor/agents/github-prd-intake.md +66 -0
  509. package/plugins/lisa-cursor/agents/jira-agent.md +129 -0
  510. package/plugins/lisa-cursor/agents/jira-build-intake.md +64 -0
  511. package/plugins/lisa-cursor/agents/learner.md +43 -0
  512. package/plugins/lisa-cursor/agents/learnings-synthesizer.md +135 -0
  513. package/plugins/lisa-cursor/agents/linear-agent.md +134 -0
  514. package/plugins/lisa-cursor/agents/linear-build-intake.md +64 -0
  515. package/plugins/lisa-cursor/agents/linear-prd-intake.md +66 -0
  516. package/plugins/lisa-cursor/agents/notion-prd-intake.md +63 -0
  517. package/plugins/lisa-cursor/agents/performance-specialist.md +85 -0
  518. package/plugins/lisa-cursor/agents/pr-mining-specialist.md +85 -0
  519. package/plugins/lisa-cursor/agents/product-specialist.md +63 -0
  520. package/plugins/lisa-cursor/agents/quality-specialist.md +56 -0
  521. package/plugins/lisa-cursor/agents/security-specialist.md +51 -0
  522. package/plugins/lisa-cursor/agents/skill-evaluator.md +245 -0
  523. package/plugins/lisa-cursor/agents/spec-conformance-specialist.md +49 -0
  524. package/plugins/lisa-cursor/agents/test-specialist.md +49 -0
  525. package/plugins/lisa-cursor/agents/tracker-mining-specialist.md +85 -0
  526. package/plugins/lisa-cursor/agents/verification-specialist.md +135 -0
  527. package/plugins/lisa-cursor/commands/automation-status.md +12 -0
  528. package/plugins/lisa-cursor/commands/codify-verification.md +6 -0
  529. package/plugins/lisa-cursor/commands/debrief/apply.md +6 -0
  530. package/plugins/lisa-cursor/commands/debrief.md +6 -0
  531. package/plugins/lisa-cursor/commands/doctor.md +6 -0
  532. package/plugins/lisa-cursor/commands/fix/linter-error.md +7 -0
  533. package/plugins/lisa-cursor/commands/git/commit.md +7 -0
  534. package/plugins/lisa-cursor/commands/git/prune.md +6 -0
  535. package/plugins/lisa-cursor/commands/git/submit-pr.md +7 -0
  536. package/plugins/lisa-cursor/commands/implement.md +6 -0
  537. package/plugins/lisa-cursor/commands/improve/code-complexity.md +6 -0
  538. package/plugins/lisa-cursor/commands/improve/max-lines-per-function.md +7 -0
  539. package/plugins/lisa-cursor/commands/improve/max-lines.md +7 -0
  540. package/plugins/lisa-cursor/commands/improve/test-coverage.md +7 -0
  541. package/plugins/lisa-cursor/commands/improve/tests.md +7 -0
  542. package/plugins/lisa-cursor/commands/intake-explain.md +31 -0
  543. package/plugins/lisa-cursor/commands/intake.md +6 -0
  544. package/plugins/lisa-cursor/commands/monitor.md +6 -0
  545. package/plugins/lisa-cursor/commands/plan.md +6 -0
  546. package/plugins/lisa-cursor/commands/plugin-sync-explain.md +8 -0
  547. package/plugins/lisa-cursor/commands/product-walkthrough.md +7 -0
  548. package/plugins/lisa-cursor/commands/project-ideation.md +6 -0
  549. package/plugins/lisa-cursor/commands/pull-request/review.md +7 -0
  550. package/plugins/lisa-cursor/commands/queue-status.md +34 -0
  551. package/plugins/lisa-cursor/commands/repair-intake.md +6 -0
  552. package/plugins/lisa-cursor/commands/research.md +6 -0
  553. package/plugins/lisa-cursor/commands/review/local.md +6 -0
  554. package/plugins/lisa-cursor/commands/security/zap-scan.md +6 -0
  555. package/plugins/lisa-cursor/commands/setup/atlassian.md +7 -0
  556. package/plugins/lisa-cursor/commands/setup/confluence.md +7 -0
  557. package/plugins/lisa-cursor/commands/setup/github.md +7 -0
  558. package/plugins/lisa-cursor/commands/setup/jira.md +7 -0
  559. package/plugins/lisa-cursor/commands/setup/linear.md +7 -0
  560. package/plugins/lisa-cursor/commands/setup/notion.md +7 -0
  561. package/plugins/lisa-cursor/commands/setup-automations.md +6 -0
  562. package/plugins/lisa-cursor/commands/tear-down-automations.md +6 -0
  563. package/plugins/lisa-cursor/commands/verify-prd.md +6 -0
  564. package/plugins/lisa-cursor/commands/verify.md +6 -0
  565. package/plugins/lisa-cursor/commands/wiki/install.md +7 -0
  566. package/plugins/lisa-cursor/hooks/block-no-verify.sh +37 -0
  567. package/plugins/lisa-cursor/hooks/install-pkgs.sh +69 -0
  568. package/plugins/lisa-cursor/hooks/notify-ntfy.sh +183 -0
  569. package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +51 -0
  570. package/plugins/lisa-cursor/rules/eager/base-rules.md +70 -0
  571. package/plugins/lisa-cursor/rules/eager/coding-philosophy.md +27 -0
  572. package/plugins/lisa-cursor/rules/eager/config-resolution.md +28 -0
  573. package/plugins/lisa-cursor/rules/eager/documentation-source-paths.md +13 -0
  574. package/plugins/lisa-cursor/rules/eager/empirical-inquiry.md +22 -0
  575. package/plugins/lisa-cursor/rules/eager/intent-routing.md +18 -0
  576. package/plugins/lisa-cursor/rules/eager/leaf-only-lifecycle.md +39 -0
  577. package/plugins/lisa-cursor/rules/eager/prd-lifecycle-rollup.md +31 -0
  578. package/plugins/lisa-cursor/rules/eager/repo-scope-split.md +39 -0
  579. package/plugins/lisa-cursor/rules/eager/security-audit-handling.md +29 -0
  580. package/plugins/lisa-cursor/rules/eager/usage-accounting.md +28 -0
  581. package/plugins/lisa-cursor/rules/eager/verification.md +21 -0
  582. package/plugins/lisa-cursor/rules/eager/wiki-knowledge-source.md +16 -0
  583. package/plugins/lisa-cursor/rules/reference/base-rules.md +133 -0
  584. package/plugins/lisa-cursor/rules/reference/coding-philosophy.md +428 -0
  585. package/plugins/lisa-cursor/rules/reference/config-resolution.md +691 -0
  586. package/plugins/lisa-cursor/rules/reference/documentation-source-paths.md +13 -0
  587. package/plugins/lisa-cursor/rules/reference/empirical-inquiry.md +27 -0
  588. package/plugins/lisa-cursor/rules/reference/intent-routing.md +407 -0
  589. package/plugins/lisa-cursor/rules/reference/leaf-only-lifecycle.md +120 -0
  590. package/plugins/lisa-cursor/rules/reference/prd-lifecycle-rollup.md +156 -0
  591. package/plugins/lisa-cursor/rules/reference/repo-scope-split.md +58 -0
  592. package/plugins/lisa-cursor/rules/reference/security-audit-handling.md +30 -0
  593. package/plugins/lisa-cursor/rules/reference/usage-accounting.md +144 -0
  594. package/plugins/lisa-cursor/rules/reference/verification.md +124 -0
  595. package/plugins/lisa-cursor/rules/reference/wiki-knowledge-source.md +14 -0
  596. package/plugins/lisa-cursor/scripts/automation-status-claude-adapter.mjs +672 -0
  597. package/plugins/lisa-cursor/scripts/automation-status-codex-adapter.mjs +697 -0
  598. package/plugins/lisa-cursor/scripts/automation-status-contract-drift.mjs +392 -0
  599. package/plugins/lisa-cursor/scripts/automation-status-expected-fleet.mjs +319 -0
  600. package/plugins/lisa-cursor/scripts/automation-status-report.mjs +170 -0
  601. package/plugins/lisa-cursor/scripts/doctor-report.mjs +143 -0
  602. package/plugins/lisa-cursor/scripts/plugin-sync-explain.mjs +512 -0
  603. package/plugins/lisa-cursor/scripts/project-ideation-idempotency-harness.mjs +319 -0
  604. package/plugins/lisa-cursor/scripts/queue-contract-resolution.mjs +453 -0
  605. package/plugins/lisa-cursor/scripts/queue-health-classification.mjs +157 -0
  606. package/plugins/lisa-cursor/scripts/queue-status-build-readers.mjs +509 -0
  607. package/plugins/lisa-cursor/scripts/queue-status-prd-readers.mjs +452 -0
  608. package/plugins/lisa-cursor/skills/acceptance-criteria/SKILL.md +71 -0
  609. package/plugins/lisa-cursor/skills/agent-design-best-practices/SKILL.md +219 -0
  610. package/plugins/lisa-cursor/skills/atlassian-access/SKILL.md +293 -0
  611. package/plugins/lisa-cursor/skills/automation-status/SKILL.md +111 -0
  612. package/plugins/lisa-cursor/skills/bug-triage/SKILL.md +23 -0
  613. package/plugins/lisa-cursor/skills/codebase-research/SKILL.md +87 -0
  614. package/plugins/lisa-cursor/skills/codify-verification/SKILL.md +152 -0
  615. package/plugins/lisa-cursor/skills/confluence-prd-intake/SKILL.md +417 -0
  616. package/plugins/lisa-cursor/skills/confluence-to-tracker/SKILL.md +360 -0
  617. package/plugins/lisa-cursor/skills/confluence-write-prd/SKILL.md +109 -0
  618. package/plugins/lisa-cursor/skills/debrief/SKILL.md +94 -0
  619. package/plugins/lisa-cursor/skills/debrief-apply/SKILL.md +63 -0
  620. package/plugins/lisa-cursor/skills/doctor/SKILL.md +317 -0
  621. package/plugins/lisa-cursor/skills/epic-triage/SKILL.md +28 -0
  622. package/plugins/lisa-cursor/skills/fix-linter-error/SKILL.md +45 -0
  623. package/plugins/lisa-cursor/skills/git-commit/SKILL.md +48 -0
  624. package/plugins/lisa-cursor/skills/git-prune/SKILL.md +35 -0
  625. package/plugins/lisa-cursor/skills/git-submit-pr/SKILL.md +105 -0
  626. package/plugins/lisa-cursor/skills/github-add-journey/SKILL.md +115 -0
  627. package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +377 -0
  628. package/plugins/lisa-cursor/skills/github-create/SKILL.md +101 -0
  629. package/plugins/lisa-cursor/skills/github-evidence/SKILL.md +110 -0
  630. package/plugins/lisa-cursor/skills/github-journey/SKILL.md +121 -0
  631. package/plugins/lisa-cursor/skills/github-prd-intake/SKILL.md +432 -0
  632. package/plugins/lisa-cursor/skills/github-project-v2/SKILL.md +227 -0
  633. package/plugins/lisa-cursor/skills/github-read-issue/SKILL.md +248 -0
  634. package/plugins/lisa-cursor/skills/github-sync/SKILL.md +119 -0
  635. package/plugins/lisa-cursor/skills/github-to-tracker/SKILL.md +345 -0
  636. package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +331 -0
  637. package/plugins/lisa-cursor/skills/github-verify/SKILL.md +29 -0
  638. package/plugins/lisa-cursor/skills/github-write-issue/SKILL.md +339 -0
  639. package/plugins/lisa-cursor/skills/github-write-prd/SKILL.md +157 -0
  640. package/plugins/lisa-cursor/skills/implement/SKILL.md +145 -0
  641. package/plugins/lisa-cursor/skills/improve-code-complexity/SKILL.md +44 -0
  642. package/plugins/lisa-cursor/skills/improve-max-lines/SKILL.md +45 -0
  643. package/plugins/lisa-cursor/skills/improve-max-lines-per-function/SKILL.md +46 -0
  644. package/plugins/lisa-cursor/skills/improve-test-coverage/SKILL.md +44 -0
  645. package/plugins/lisa-cursor/skills/improve-tests/SKILL.md +47 -0
  646. package/plugins/lisa-cursor/skills/intake/SKILL.md +132 -0
  647. package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +279 -0
  648. package/plugins/lisa-cursor/skills/jira-add-journey/SKILL.md +121 -0
  649. package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +286 -0
  650. package/plugins/lisa-cursor/skills/jira-create/SKILL.md +154 -0
  651. package/plugins/lisa-cursor/skills/jira-evidence/SKILL.md +90 -0
  652. package/plugins/lisa-cursor/skills/jira-evidence/scripts/post-evidence.sh +163 -0
  653. package/plugins/lisa-cursor/skills/jira-journey/SKILL.md +127 -0
  654. package/plugins/lisa-cursor/skills/jira-journey/scripts/generate-templates.py +233 -0
  655. package/plugins/lisa-cursor/skills/jira-journey/scripts/parse-plan.py +368 -0
  656. package/plugins/lisa-cursor/skills/jira-read-ticket/SKILL.md +198 -0
  657. package/plugins/lisa-cursor/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
  658. package/plugins/lisa-cursor/skills/jira-sync/SKILL.md +95 -0
  659. package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +318 -0
  660. package/plugins/lisa-cursor/skills/jira-verify/SKILL.md +30 -0
  661. package/plugins/lisa-cursor/skills/jira-write-ticket/SKILL.md +265 -0
  662. package/plugins/lisa-cursor/skills/jsdoc-best-practices/SKILL.md +432 -0
  663. package/plugins/lisa-cursor/skills/linear-add-journey/SKILL.md +105 -0
  664. package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +283 -0
  665. package/plugins/lisa-cursor/skills/linear-create/SKILL.md +146 -0
  666. package/plugins/lisa-cursor/skills/linear-evidence/SKILL.md +103 -0
  667. package/plugins/lisa-cursor/skills/linear-journey/SKILL.md +134 -0
  668. package/plugins/lisa-cursor/skills/linear-prd-intake/SKILL.md +383 -0
  669. package/plugins/lisa-cursor/skills/linear-read-issue/SKILL.md +200 -0
  670. package/plugins/lisa-cursor/skills/linear-sync/SKILL.md +114 -0
  671. package/plugins/lisa-cursor/skills/linear-to-tracker/SKILL.md +342 -0
  672. package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +313 -0
  673. package/plugins/lisa-cursor/skills/linear-verify/SKILL.md +51 -0
  674. package/plugins/lisa-cursor/skills/linear-write-issue/SKILL.md +292 -0
  675. package/plugins/lisa-cursor/skills/linear-write-prd/SKILL.md +96 -0
  676. package/plugins/lisa-cursor/skills/lisa-review-implementation/SKILL.md +209 -0
  677. package/plugins/lisa-cursor/skills/monitor/SKILL.md +48 -0
  678. package/plugins/lisa-cursor/skills/nightly-add-test-coverage/SKILL.md +40 -0
  679. package/plugins/lisa-cursor/skills/nightly-improve-tests/SKILL.md +29 -0
  680. package/plugins/lisa-cursor/skills/nightly-lower-code-complexity/SKILL.md +28 -0
  681. package/plugins/lisa-cursor/skills/notion-access/SKILL.md +226 -0
  682. package/plugins/lisa-cursor/skills/notion-prd-intake/SKILL.md +360 -0
  683. package/plugins/lisa-cursor/skills/notion-to-tracker/SKILL.md +357 -0
  684. package/plugins/lisa-cursor/skills/notion-write-prd/SKILL.md +109 -0
  685. package/plugins/lisa-cursor/skills/performance-review/SKILL.md +94 -0
  686. package/plugins/lisa-cursor/skills/plan/SKILL.md +60 -0
  687. package/plugins/lisa-cursor/skills/plugin-sync-explain/SKILL.md +53 -0
  688. package/plugins/lisa-cursor/skills/prd-backlink/SKILL.md +265 -0
  689. package/plugins/lisa-cursor/skills/prd-source-write/SKILL.md +101 -0
  690. package/plugins/lisa-cursor/skills/prd-ticket-coverage/SKILL.md +170 -0
  691. package/plugins/lisa-cursor/skills/product-walkthrough/SKILL.md +129 -0
  692. package/plugins/lisa-cursor/skills/project-ideation/SKILL.md +315 -0
  693. package/plugins/lisa-cursor/skills/project-ideation/examples/evidence-card-format.md +21 -0
  694. package/plugins/lisa-cursor/skills/project-ideation/examples/host-project-only.md +22 -0
  695. package/plugins/lisa-cursor/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
  696. package/plugins/lisa-cursor/skills/project-ideation/examples/public-external-inspiration.md +22 -0
  697. package/plugins/lisa-cursor/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
  698. package/plugins/lisa-cursor/skills/pull-request-review/SKILL.md +68 -0
  699. package/plugins/lisa-cursor/skills/quality-review/SKILL.md +54 -0
  700. package/plugins/lisa-cursor/skills/queue-status/SKILL.md +133 -0
  701. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +584 -0
  702. package/plugins/lisa-cursor/skills/reproduce-bug/SKILL.md +96 -0
  703. package/plugins/lisa-cursor/skills/research/SKILL.md +68 -0
  704. package/plugins/lisa-cursor/skills/review-local/SKILL.md +88 -0
  705. package/plugins/lisa-cursor/skills/root-cause-analysis/SKILL.md +155 -0
  706. package/plugins/lisa-cursor/skills/security-review/SKILL.md +57 -0
  707. package/plugins/lisa-cursor/skills/security-zap-scan/SKILL.md +33 -0
  708. package/plugins/lisa-cursor/skills/setup-atlassian/SKILL.md +347 -0
  709. package/plugins/lisa-cursor/skills/setup-automations/SKILL.md +99 -0
  710. package/plugins/lisa-cursor/skills/setup-confluence/SKILL.md +254 -0
  711. package/plugins/lisa-cursor/skills/setup-github/SKILL.md +268 -0
  712. package/plugins/lisa-cursor/skills/setup-jira/SKILL.md +198 -0
  713. package/plugins/lisa-cursor/skills/setup-linear/SKILL.md +251 -0
  714. package/plugins/lisa-cursor/skills/setup-notion/SKILL.md +316 -0
  715. package/plugins/lisa-cursor/skills/spec-conformance/SKILL.md +159 -0
  716. package/plugins/lisa-cursor/skills/task-decomposition/SKILL.md +127 -0
  717. package/plugins/lisa-cursor/skills/task-triage/SKILL.md +23 -0
  718. package/plugins/lisa-cursor/skills/tdd-implementation/SKILL.md +83 -0
  719. package/plugins/lisa-cursor/skills/tear-down-automations/SKILL.md +34 -0
  720. package/plugins/lisa-cursor/skills/test-strategy/SKILL.md +63 -0
  721. package/plugins/lisa-cursor/skills/ticket-triage/SKILL.md +182 -0
  722. package/plugins/lisa-cursor/skills/tracker-add-journey/SKILL.md +26 -0
  723. package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +64 -0
  724. package/plugins/lisa-cursor/skills/tracker-create/SKILL.md +26 -0
  725. package/plugins/lisa-cursor/skills/tracker-evidence/SKILL.md +52 -0
  726. package/plugins/lisa-cursor/skills/tracker-journey/SKILL.md +26 -0
  727. package/plugins/lisa-cursor/skills/tracker-read/SKILL.md +27 -0
  728. package/plugins/lisa-cursor/skills/tracker-source-artifacts/SKILL.md +107 -0
  729. package/plugins/lisa-cursor/skills/tracker-sync/SKILL.md +51 -0
  730. package/plugins/lisa-cursor/skills/tracker-validate/SKILL.md +36 -0
  731. package/plugins/lisa-cursor/skills/tracker-verify/SKILL.md +27 -0
  732. package/plugins/lisa-cursor/skills/tracker-write/SKILL.md +53 -0
  733. package/plugins/lisa-cursor/skills/usage-accounting/SKILL.md +170 -0
  734. package/plugins/lisa-cursor/skills/verification-lifecycle/SKILL.md +339 -0
  735. package/plugins/lisa-cursor/skills/verify/SKILL.md +49 -0
  736. package/plugins/lisa-cursor/skills/verify-prd/SKILL.md +392 -0
  737. package/plugins/lisa-cursor/skills/wiki-install/SKILL.md +101 -0
  738. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  739. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  740. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  741. package/plugins/lisa-harper-fabric/.codex-plugin/hooks/inject-rules.sh +16 -0
  742. package/plugins/lisa-harper-fabric/.codex-plugin/hooks.json +26 -0
  743. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +2 -1
  744. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  745. package/plugins/lisa-nestjs/.codex-plugin/hooks/block-migration-edits.sh +60 -0
  746. package/plugins/lisa-nestjs/.codex-plugin/hooks.json +15 -0
  747. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +2 -1
  748. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  749. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  750. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  751. package/plugins/lisa-rails/.codex-plugin/hooks/inject-rules.sh +22 -0
  752. package/plugins/lisa-rails/.codex-plugin/hooks/rubocop-on-edit.sh +78 -0
  753. package/plugins/lisa-rails/.codex-plugin/hooks/sg-scan-on-edit.sh +74 -0
  754. package/plugins/lisa-rails/.codex-plugin/hooks.json +41 -0
  755. package/plugins/lisa-rails/.codex-plugin/plugin.json +2 -1
  756. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  757. package/plugins/lisa-typescript/.codex-plugin/hooks/block-suppress-directives.sh +73 -0
  758. package/plugins/lisa-typescript/.codex-plugin/hooks/format-on-edit.sh +79 -0
  759. package/plugins/lisa-typescript/.codex-plugin/hooks/lint-on-edit.sh +134 -0
  760. package/plugins/lisa-typescript/.codex-plugin/hooks/sg-scan-on-edit.sh +71 -0
  761. package/plugins/lisa-typescript/.codex-plugin/hooks.json +34 -0
  762. package/plugins/lisa-typescript/.codex-plugin/plugin.json +2 -1
  763. package/plugins/lisa-typescript/hooks/format-on-edit.sh +5 -3
  764. package/plugins/lisa-typescript/hooks/lint-on-edit.sh +5 -2
  765. package/plugins/lisa-typescript/hooks/sg-scan-on-edit.sh +5 -2
  766. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  767. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  768. package/plugins/src/typescript/hooks/format-on-edit.sh +5 -3
  769. package/plugins/src/typescript/hooks/lint-on-edit.sh +5 -2
  770. package/plugins/src/typescript/hooks/sg-scan-on-edit.sh +5 -2
  771. package/scripts/build-plugins.sh +24 -0
  772. package/scripts/generate-agy-plugin-artifacts.mjs +168 -0
  773. package/scripts/generate-codex-plugin-artifacts.mjs +170 -12
  774. package/scripts/generate-copilot-plugin-artifacts.mjs +230 -0
  775. package/scripts/generate-cursor-plugin-artifacts.mjs +173 -0
  776. package/scripts/internal-agy-skill-policy.json +3 -0
  777. package/scripts/internal-copilot-runtime-probe.json +7 -0
  778. package/scripts/internal-copilot-skill-policy.json +3 -0
  779. package/scripts/internal-cursor-skill-policy.json +3 -0
  780. package/scripts/lib/per-agent-hook-filter.mjs +249 -0
  781. package/scripts/probes/wave3-verification.sh +106 -0
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate the GitHub Copilot variant of a Lisa plugin from the built Claude
4
+ * artifact.
5
+ *
6
+ * Copilot reads `.claude-plugin/plugin.json` as a documented fallback (per its
7
+ * manifest lookup order: plugin.json → .plugin/ → .github/plugin/ →
8
+ * .claude-plugin/). The Copilot variant keeps the `.claude-plugin/` manifest
9
+ * but rewrites hook event names to Copilot's camelCase convention
10
+ * (`preToolUse`, `agentStop`, etc.) and strips hooks that don't have a Copilot
11
+ * equivalent (SubagentStart entries — Copilot lacks the event).
12
+ *
13
+ * Per the Wave 1 audit, Copilot ships:
14
+ * block-no-verify.sh, inject-rules.sh (conservative default — conditional on
15
+ * the rules-auto-load probe), notify-ntfy.sh, install-pkgs.sh, setup-jira-cli.sh.
16
+ *
17
+ * Per the Wave 2 pattern-b-fan-out-spec.md, this generator runs four pre-flight
18
+ * probes when `copilot` is on PATH and caches the results. When `copilot` is
19
+ * not on PATH (CI builds, contributors without Copilot), the cached values are
20
+ * used; absent cache values fall through to conservative defaults.
21
+ *
22
+ * Usage: node scripts/generate-copilot-plugin-artifacts.mjs <source-plugin-dir> <out-dir> <version>
23
+ *
24
+ * @module scripts/generate-copilot-plugin-artifacts
25
+ */
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import { fileURLToPath } from "node:url";
29
+ import {
30
+ filterHooksForAgent,
31
+ filterScriptsForAgent,
32
+ } from "./lib/per-agent-hook-filter.mjs";
33
+
34
+ const REPO_ROOT = path.resolve(
35
+ path.dirname(fileURLToPath(import.meta.url)),
36
+ ".."
37
+ );
38
+ const POLICY_PATH = path.join(
39
+ REPO_ROOT,
40
+ "scripts",
41
+ "internal-copilot-skill-policy.json"
42
+ );
43
+ const PROBE_CACHE_PATH = path.join(
44
+ REPO_ROOT,
45
+ "scripts",
46
+ "internal-copilot-runtime-probe.json"
47
+ );
48
+
49
+ /**
50
+ * @returns {{ denylist?: string[] }}
51
+ */
52
+ function readPolicy() {
53
+ if (!fs.existsSync(POLICY_PATH)) return {};
54
+ try {
55
+ return JSON.parse(fs.readFileSync(POLICY_PATH, "utf8"));
56
+ } catch {
57
+ return {};
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Read cached Copilot runtime probe results.
63
+ *
64
+ * Fields documented in pattern-b-fan-out-spec.md §Pre-flight probes:
65
+ * - pluginRootEnvVar: e.g. "COPILOT_PLUGIN_ROOT" or null (use absolute paths)
66
+ * - rulesAutoLoads: boolean — Copilot reads plugin's rules/ natively
67
+ * - agentPathOverrideAccepted: boolean — manifest agents:"agents/" accepts non-.agent.md
68
+ * - cliVersion: string for invalidation
69
+ *
70
+ * @returns {{ pluginRootEnvVar?: string|null, rulesAutoLoads?: boolean, agentPathOverrideAccepted?: boolean, cliVersion?: string }}
71
+ */
72
+ function readProbeCache() {
73
+ if (!fs.existsSync(PROBE_CACHE_PATH)) return {};
74
+ try {
75
+ return JSON.parse(fs.readFileSync(PROBE_CACHE_PATH, "utf8"));
76
+ } catch {
77
+ return {};
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Recursive directory copy with optional path-level filter.
83
+ *
84
+ * @param {string} src
85
+ * @param {string} dst
86
+ * @param {(relPath: string, stat: fs.Stats) => boolean} keep
87
+ */
88
+ function copyDir(src, dst, keep = () => true) {
89
+ if (!fs.existsSync(src)) return;
90
+ fs.mkdirSync(dst, { recursive: true });
91
+ const walk = (current, rel) => {
92
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
93
+ const srcPath = path.join(current, entry.name);
94
+ const relPath = path.join(rel, entry.name);
95
+ const dstPath = path.join(dst, relPath);
96
+ const stat = fs.statSync(srcPath);
97
+ if (!keep(relPath, stat)) continue;
98
+ if (entry.isDirectory()) {
99
+ fs.mkdirSync(dstPath, { recursive: true });
100
+ walk(srcPath, relPath);
101
+ } else if (entry.isFile()) {
102
+ fs.copyFileSync(srcPath, dstPath);
103
+ }
104
+ }
105
+ };
106
+ walk(src, "");
107
+ }
108
+
109
+ /**
110
+ * Generate the Copilot variant.
111
+ *
112
+ * @param {string} srcDir Built Claude plugin directory (input).
113
+ * @param {string} outDir Copilot variant output directory.
114
+ * @param {string} version Version string for the manifest.
115
+ */
116
+ export function generateCopilotVariant(srcDir, outDir, version) {
117
+ if (!fs.existsSync(path.join(srcDir, ".claude-plugin", "plugin.json"))) {
118
+ return;
119
+ }
120
+
121
+ const policy = readPolicy();
122
+ const denylist = new Set(policy.denylist ?? []);
123
+ const probe = readProbeCache();
124
+
125
+ // Conservative defaults for any probe value not in cache:
126
+ // - rulesAutoLoads: false (ship inject-rules.sh, accept potential double-load
127
+ // until empirically refuted by the probe — same as the Wave 1 audit's default)
128
+ // - pluginRootEnvVar: null (use ${CLAUDE_PLUGIN_ROOT} in command strings; Copilot
129
+ // may or may not honor it. Wave 3 verify-by-run resolves this.)
130
+ // - agentPathOverrideAccepted: false (rename agents/*.md to *.agent.md in the variant
131
+ // to be safe; if the override works, this is harmless extra renaming)
132
+ const copilotRulesAutoLoads = probe.rulesAutoLoads === true;
133
+ const renameAgentsToAgentMd = probe.agentPathOverrideAccepted !== true;
134
+
135
+ fs.rmSync(outDir, { recursive: true, force: true });
136
+ fs.mkdirSync(outDir, { recursive: true });
137
+
138
+ // 1. Copy source minus .codex-plugin/ and apply skill denylist.
139
+ copyDir(srcDir, outDir, relPath => {
140
+ if (relPath.startsWith(".codex-plugin/") || relPath === ".codex-plugin")
141
+ return false;
142
+ // Drop Codex-specific per-skill openai.yaml artifacts — Copilot does not use them.
143
+ if (/^skills\/[^/]+\/agents\/openai\.ya?ml$/.test(relPath)) return false;
144
+ const skillsPrefix = path.join("skills") + path.sep;
145
+ if (relPath.startsWith(skillsPrefix)) {
146
+ const skillName = relPath.slice(skillsPrefix.length).split(path.sep)[0];
147
+ if (denylist.has(skillName)) return false;
148
+ }
149
+ return true;
150
+ });
151
+
152
+ // 1a. Remove any now-empty `skills/<n>/agents/` directories left by the openai.yaml strip.
153
+ const skillsDirForCleanup = path.join(outDir, "skills");
154
+ if (fs.existsSync(skillsDirForCleanup)) {
155
+ for (const skillName of fs.readdirSync(skillsDirForCleanup)) {
156
+ const agentsDir = path.join(skillsDirForCleanup, skillName, "agents");
157
+ if (fs.existsSync(agentsDir) && fs.readdirSync(agentsDir).length === 0) {
158
+ fs.rmdirSync(agentsDir);
159
+ }
160
+ }
161
+ }
162
+
163
+ // 2. Rename agents/<n>.md to agents/<n>.agent.md (per Copilot's default convention).
164
+ // This is the safe-default path; if the manifest agents-path override probe
165
+ // returns positive, this rename is unnecessary but harmless.
166
+ if (renameAgentsToAgentMd) {
167
+ const agentsDir = path.join(outDir, "agents");
168
+ if (fs.existsSync(agentsDir)) {
169
+ for (const entry of fs.readdirSync(agentsDir, { withFileTypes: true })) {
170
+ if (
171
+ entry.isFile() &&
172
+ entry.name.endsWith(".md") &&
173
+ !entry.name.endsWith(".agent.md")
174
+ ) {
175
+ const oldPath = path.join(agentsDir, entry.name);
176
+ const newName = entry.name.replace(/\.md$/, ".agent.md");
177
+ const newPath = path.join(agentsDir, newName);
178
+ fs.renameSync(oldPath, newPath);
179
+ }
180
+ }
181
+ }
182
+ }
183
+
184
+ // 3. Read + filter the manifest, translate event names to Copilot camelCase.
185
+ const manifestPath = path.join(outDir, ".claude-plugin", "plugin.json");
186
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
187
+ manifest.version = version;
188
+ const filteredHooks = filterHooksForAgent(manifest.hooks ?? {}, "copilot", {
189
+ copilotRulesAutoLoads,
190
+ });
191
+ if (filteredHooks) {
192
+ manifest.hooks = filteredHooks;
193
+ } else {
194
+ delete manifest.hooks;
195
+ }
196
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
197
+
198
+ // 4. Filter the hooks/ directory.
199
+ const hooksDir = path.join(outDir, "hooks");
200
+ if (fs.existsSync(hooksDir)) {
201
+ const all = fs
202
+ .readdirSync(hooksDir, { withFileTypes: true })
203
+ .filter(e => e.isFile() && e.name.endsWith(".sh"))
204
+ .map(e => e.name);
205
+ // Copilot ships everything Cursor ships, plus inject-rules.sh when
206
+ // copilotRulesAutoLoads is false. The filter helper handles this.
207
+ const keep = new Set(filterScriptsForAgent(all, "copilot"));
208
+ // If the rules-auto-load probe is positive, ALSO strip inject-rules.sh.
209
+ if (copilotRulesAutoLoads) keep.delete("inject-rules.sh");
210
+ for (const name of all) {
211
+ if (!keep.has(name)) fs.rmSync(path.join(hooksDir, name));
212
+ }
213
+ if (fs.readdirSync(hooksDir).length === 0) {
214
+ fs.rmdirSync(hooksDir);
215
+ }
216
+ }
217
+ }
218
+
219
+ // CLI entrypoint.
220
+ if (import.meta.url === `file://${process.argv[1]}`) {
221
+ const [srcDir, outDir, version] = process.argv.slice(2);
222
+ if (!srcDir || !outDir || !version) {
223
+ console.error(
224
+ "Usage: generate-copilot-plugin-artifacts.mjs <src> <out> <version>"
225
+ );
226
+ process.exit(1);
227
+ }
228
+ generateCopilotVariant(srcDir, outDir, version);
229
+ console.log(`Generated Copilot variant at ${outDir} (v${version})`);
230
+ }
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate the Cursor variant of a Lisa plugin from the built Claude artifact.
4
+ *
5
+ * Cursor reads `.claude-plugin/plugin.json` natively via its dual-namespace
6
+ * loader (also accepts `.cursor-plugin/plugin.json`). The Cursor variant
7
+ * therefore keeps the `.claude-plugin/` manifest but filters the hooks block
8
+ * to drop `inject-rules.sh` (Cursor auto-loads `rules/` from plugins natively,
9
+ * so shipping the polyfill would double-inject), `enforce-team-first.sh`
10
+ * (Claude-team-specific), and the `entire hooks claude-code *` analytics calls
11
+ * (Claude-only).
12
+ *
13
+ * The variant's `hooks/` directory mirrors the surviving script ship-list.
14
+ *
15
+ * Usage: node scripts/generate-cursor-plugin-artifacts.mjs <source-plugin-dir> <out-dir> <version>
16
+ *
17
+ * Where:
18
+ * source-plugin-dir: path to the built Claude plugin (e.g. plugins/lisa/)
19
+ * out-dir: path to write the Cursor variant (e.g. plugins/lisa-cursor/)
20
+ * version: version string injected into the manifest
21
+ *
22
+ * @module scripts/generate-cursor-plugin-artifacts
23
+ */
24
+ import fs from "node:fs";
25
+ import path from "node:path";
26
+ import { fileURLToPath } from "node:url";
27
+ import {
28
+ filterHooksForAgent,
29
+ filterScriptsForAgent,
30
+ } from "./lib/per-agent-hook-filter.mjs";
31
+
32
+ const REPO_ROOT = path.resolve(
33
+ path.dirname(fileURLToPath(import.meta.url)),
34
+ ".."
35
+ );
36
+ const POLICY_PATH = path.join(
37
+ REPO_ROOT,
38
+ "scripts",
39
+ "internal-cursor-skill-policy.json"
40
+ );
41
+
42
+ /**
43
+ * Read the per-agent skill policy file. Missing-policy is treated as
44
+ * "ship all skills" (no denylist).
45
+ *
46
+ * @returns {{ denylist?: string[] }}
47
+ */
48
+ function readPolicy() {
49
+ if (!fs.existsSync(POLICY_PATH)) return {};
50
+ try {
51
+ return JSON.parse(fs.readFileSync(POLICY_PATH, "utf8"));
52
+ } catch {
53
+ return {};
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Recursive directory copy with optional path-level filter.
59
+ *
60
+ * @param {string} src
61
+ * @param {string} dst
62
+ * @param {(relPath: string, stat: fs.Stats) => boolean} keep
63
+ */
64
+ function copyDir(src, dst, keep = () => true) {
65
+ if (!fs.existsSync(src)) return;
66
+ fs.mkdirSync(dst, { recursive: true });
67
+ const walk = (current, rel) => {
68
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
69
+ const srcPath = path.join(current, entry.name);
70
+ const relPath = path.join(rel, entry.name);
71
+ const dstPath = path.join(dst, relPath);
72
+ const stat = fs.statSync(srcPath);
73
+ if (!keep(relPath, stat)) continue;
74
+ if (entry.isDirectory()) {
75
+ fs.mkdirSync(dstPath, { recursive: true });
76
+ walk(srcPath, relPath);
77
+ } else if (entry.isFile()) {
78
+ fs.copyFileSync(srcPath, dstPath);
79
+ }
80
+ }
81
+ };
82
+ walk(src, "");
83
+ }
84
+
85
+ /**
86
+ * Generate the Cursor variant.
87
+ *
88
+ * @param {string} srcDir Built Claude plugin directory (input).
89
+ * @param {string} outDir Cursor variant output directory.
90
+ * @param {string} version Version string for the manifest.
91
+ */
92
+ export function generateCursorVariant(srcDir, outDir, version) {
93
+ if (!fs.existsSync(path.join(srcDir, ".claude-plugin", "plugin.json"))) {
94
+ return; // base plugin has no manifest; nothing to do
95
+ }
96
+
97
+ const policy = readPolicy();
98
+ const denylist = new Set(policy.denylist ?? []);
99
+
100
+ fs.rmSync(outDir, { recursive: true, force: true });
101
+ fs.mkdirSync(outDir, { recursive: true });
102
+
103
+ // 1. Copy the source plugin, applying the skill denylist filter.
104
+ copyDir(srcDir, outDir, relPath => {
105
+ // Drop the `.codex-plugin/` directory — Cursor does not consume it.
106
+ if (relPath.startsWith(".codex-plugin/") || relPath === ".codex-plugin")
107
+ return false;
108
+ // Drop Codex-specific per-skill openai.yaml artifacts — Cursor does not use them.
109
+ // These live at skills/<n>/agents/openai.yaml and are generated by the Codex
110
+ // artifact builder; the per-agent variants ship only the SKILL.md.
111
+ if (/^skills\/[^/]+\/agents\/openai\.ya?ml$/.test(relPath)) return false;
112
+ // Apply the per-agent skill denylist (skills/<name>/).
113
+ const skillsPrefix = path.join("skills") + path.sep;
114
+ if (relPath.startsWith(skillsPrefix)) {
115
+ const skillName = relPath.slice(skillsPrefix.length).split(path.sep)[0];
116
+ if (denylist.has(skillName)) return false;
117
+ }
118
+ return true;
119
+ });
120
+
121
+ // 1a. Remove any now-empty `skills/<n>/agents/` directories left by the openai.yaml strip.
122
+ const skillsDir = path.join(outDir, "skills");
123
+ if (fs.existsSync(skillsDir)) {
124
+ for (const skillName of fs.readdirSync(skillsDir)) {
125
+ const agentsDir = path.join(skillsDir, skillName, "agents");
126
+ if (fs.existsSync(agentsDir) && fs.readdirSync(agentsDir).length === 0) {
127
+ fs.rmdirSync(agentsDir);
128
+ }
129
+ }
130
+ }
131
+
132
+ // 2. Read + filter the manifest.
133
+ const manifestPath = path.join(outDir, ".claude-plugin", "plugin.json");
134
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
135
+ manifest.version = version;
136
+ const filteredHooks = filterHooksForAgent(manifest.hooks ?? {}, "cursor");
137
+ if (filteredHooks) {
138
+ manifest.hooks = filteredHooks;
139
+ } else {
140
+ delete manifest.hooks;
141
+ }
142
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
143
+
144
+ // 3. Filter the hooks/ directory to match the script ship-list.
145
+ const hooksDir = path.join(outDir, "hooks");
146
+ if (fs.existsSync(hooksDir)) {
147
+ const all = fs
148
+ .readdirSync(hooksDir, { withFileTypes: true })
149
+ .filter(e => e.isFile() && e.name.endsWith(".sh"))
150
+ .map(e => e.name);
151
+ const keep = new Set(filterScriptsForAgent(all, "cursor"));
152
+ for (const name of all) {
153
+ if (!keep.has(name)) fs.rmSync(path.join(hooksDir, name));
154
+ }
155
+ // Remove empty hooks dir.
156
+ if (fs.readdirSync(hooksDir).length === 0) {
157
+ fs.rmdirSync(hooksDir);
158
+ }
159
+ }
160
+ }
161
+
162
+ // CLI entrypoint.
163
+ if (import.meta.url === `file://${process.argv[1]}`) {
164
+ const [srcDir, outDir, version] = process.argv.slice(2);
165
+ if (!srcDir || !outDir || !version) {
166
+ console.error(
167
+ "Usage: generate-cursor-plugin-artifacts.mjs <src> <out> <version>"
168
+ );
169
+ process.exit(1);
170
+ }
171
+ generateCursorVariant(srcDir, outDir, version);
172
+ console.log(`Generated Cursor variant at ${outDir} (v${version})`);
173
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "denylist": []
3
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "_comment": "Cached Copilot runtime probe results. Updated by Wave 3 verification probes (Task #17) and consumed by scripts/generate-copilot-plugin-artifacts.mjs. Missing values fall through to conservative defaults.",
3
+ "cliVersion": null,
4
+ "pluginRootEnvVar": null,
5
+ "rulesAutoLoads": null,
6
+ "agentPathOverrideAccepted": null
7
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "denylist": []
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "denylist": []
3
+ }
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Per-agent hook ship/strip filter for Pattern B plugin variant generators.
3
+ *
4
+ * Implements the per-agent ship-list from
5
+ * wiki/architecture/lisa-hook-per-agent-ship-list.md (Wave 1 audit).
6
+ *
7
+ * Each Pattern B per-agent plugin variant generator imports `filterHooksForAgent`
8
+ * to walk the source plugin's hook block and the on-disk hook scripts, returning
9
+ * an agent-appropriate filtered set.
10
+ *
11
+ * Agent strategies:
12
+ * - Claude: keep everything (this module is not invoked for the Claude variant)
13
+ * - Codex: ship universal + SubagentStart (handled by the Codex generator's own
14
+ * ship list — this module is not invoked for Codex; Codex uses the existing
15
+ * generate-codex-plugin-artifacts.mjs path)
16
+ * - Cursor: strip inject-rules.sh (Cursor auto-loads rules/ natively), strip
17
+ * Claude-team-specific scripts and `entire hooks claude-code *` calls
18
+ * - agy: ship NOTHING (agy plugin hooks do not fire in -p mode per verified-by-run)
19
+ * - Copilot: strip SubagentStart hooks (event missing), strip Claude-team-specific
20
+ * scripts, conditionally strip inject-rules.sh if the rules-auto-load probe is
21
+ * positive (caller passes copilotRulesAutoLoads via options)
22
+ *
23
+ * @module scripts/lib/per-agent-hook-filter
24
+ */
25
+
26
+ /** Per-script applicability rules from the Wave 1 audit. */
27
+ const SCRIPT_RULES = {
28
+ "block-no-verify.sh": {
29
+ claude: true,
30
+ codex: true,
31
+ cursor: true,
32
+ agy: false,
33
+ copilot: true,
34
+ },
35
+ "enforce-team-first.sh": {
36
+ claude: true,
37
+ codex: false,
38
+ cursor: false,
39
+ agy: false,
40
+ copilot: false,
41
+ },
42
+ "inject-rules.sh": {
43
+ claude: true,
44
+ codex: true,
45
+ cursor: false, // collision: Cursor auto-loads rules/ natively
46
+ agy: false, // hooks don't fire in -p
47
+ copilot: true, // conservative default; conditionally stripped if rules-auto-load probe positive
48
+ },
49
+ "inject-flow-context.sh": {
50
+ claude: true,
51
+ codex: true,
52
+ cursor: false, // SubagentStart unverified on Cursor; conservative default
53
+ agy: false,
54
+ copilot: false, // Copilot lacks SubagentStart event
55
+ },
56
+ "install-pkgs.sh": {
57
+ claude: true,
58
+ codex: true,
59
+ cursor: true,
60
+ agy: false,
61
+ copilot: true,
62
+ },
63
+ "notify-ntfy.sh": {
64
+ claude: true,
65
+ codex: true,
66
+ cursor: true,
67
+ agy: false,
68
+ copilot: true,
69
+ },
70
+ "setup-jira-cli.sh": {
71
+ claude: true,
72
+ codex: true,
73
+ cursor: true,
74
+ agy: false,
75
+ copilot: true,
76
+ },
77
+ // Unregistered scripts — exclude by default until classified.
78
+ "ticket-sync-reminder.sh": {
79
+ claude: false,
80
+ codex: false,
81
+ cursor: false,
82
+ agy: false,
83
+ copilot: false,
84
+ },
85
+ "track-plan-sessions.sh": {
86
+ claude: false,
87
+ codex: false,
88
+ cursor: false,
89
+ agy: false,
90
+ copilot: false,
91
+ },
92
+ };
93
+
94
+ /** Universal exclude pattern: development helpers. */
95
+ const SCRIPT_EXCLUDE_PATTERNS = [/debug/i];
96
+
97
+ /** Hook command shape: { type: "command", command: "..." } */
98
+ const isEntireClaudeCodeCommand = cmd =>
99
+ typeof cmd === "string" &&
100
+ /^command -v entire >\/dev\/null 2>&1 && entire hooks claude-code /.test(cmd);
101
+
102
+ const scriptNameFromCommand = cmd => {
103
+ if (typeof cmd !== "string") return null;
104
+ const match = /\$\{CLAUDE_PLUGIN_ROOT\}\/hooks\/([^/\s]+\.sh)/.exec(cmd);
105
+ return match ? match[1] : null;
106
+ };
107
+
108
+ /**
109
+ * Translate Claude PascalCase event names to a target agent's native casing.
110
+ *
111
+ * Per the Wave 1 audit's Wave 3 contract step 4 + step 6:
112
+ * - Cursor: keep PascalCase (loader auto-normalizes)
113
+ * - Codex: keep PascalCase
114
+ * - Copilot: rewrite to lowercase / camelCase per Copilot's docs
115
+ *
116
+ * @param {string} eventName Claude event name (e.g. "PreToolUse")
117
+ * @param {"cursor"|"agy"|"copilot"} agent Target agent slug
118
+ * @returns {string} Translated event name
119
+ */
120
+ export function translateEventName(eventName, agent) {
121
+ if (agent !== "copilot") return eventName;
122
+ const COPILOT_EVENTS = {
123
+ PreToolUse: "preToolUse",
124
+ PostToolUse: "postToolUse",
125
+ SessionStart: "sessionStart",
126
+ SessionEnd: "sessionEnd",
127
+ UserPromptSubmit: "userPromptSubmitted",
128
+ Stop: "agentStop",
129
+ SubagentStart: "subagentStart", // not supported but include for symmetry
130
+ SubagentStop: "subagentStop",
131
+ };
132
+ return COPILOT_EVENTS[eventName] ?? eventName;
133
+ }
134
+
135
+ /**
136
+ * Whether a script ships to the given agent under the Wave 1 audit ship-list.
137
+ *
138
+ * Falls through to true (ship) for scripts not in the rules table — the
139
+ * conservative default for unknown scripts is to include them; explicit
140
+ * exclusions live in SCRIPT_RULES.
141
+ *
142
+ * @param {string} scriptName e.g. "inject-rules.sh"
143
+ * @param {"claude"|"codex"|"cursor"|"agy"|"copilot"} agent
144
+ * @returns {boolean}
145
+ */
146
+ export function shouldShipScript(scriptName, agent) {
147
+ // Universal exclude (debug helpers etc.)
148
+ if (SCRIPT_EXCLUDE_PATTERNS.some(re => re.test(scriptName))) return false;
149
+ const rules = SCRIPT_RULES[scriptName];
150
+ if (!rules) return true;
151
+ return Boolean(rules[agent]);
152
+ }
153
+
154
+ /**
155
+ * Whether a hook command entry ships to the given agent.
156
+ *
157
+ * Three classes of hook commands:
158
+ * 1. `entire hooks claude-code *` — Claude-only, strip for everyone else
159
+ * 2. `${CLAUDE_PLUGIN_ROOT}/hooks/<script>` — ship per script rules
160
+ * 3. Anything else — ship by default (rare; conservative)
161
+ *
162
+ * @param {{ type: string, command: string }} hook
163
+ * @param {string} eventName
164
+ * @param {"cursor"|"agy"|"copilot"|"codex"} agent
165
+ * @param {{ copilotRulesAutoLoads?: boolean }} [opts]
166
+ * @returns {boolean}
167
+ */
168
+ export function shouldShipHook(hook, _eventName, agent, opts = {}) {
169
+ if (!hook || typeof hook.command !== "string") return false;
170
+ const { command } = hook;
171
+
172
+ // entire calls are Claude-only.
173
+ if (isEntireClaudeCodeCommand(command)) return false;
174
+
175
+ // Script reference: look up per-script rules.
176
+ const scriptName = scriptNameFromCommand(command);
177
+ if (scriptName) {
178
+ // Cursor collision rule for rules + Copilot conditional rules strip
179
+ if (scriptName === "inject-rules.sh") {
180
+ if (agent === "cursor") return false;
181
+ if (agent === "agy") return false;
182
+ if (agent === "copilot" && opts.copilotRulesAutoLoads === true)
183
+ return false;
184
+ }
185
+ return shouldShipScript(scriptName, agent);
186
+ }
187
+
188
+ // Anything else (rare) — ship by default
189
+ return true;
190
+ }
191
+
192
+ /**
193
+ * Filter the plugin's hook block for a target agent and translate event names.
194
+ *
195
+ * Returns the new hook block (or undefined when the block ends up empty after
196
+ * filtering, which means the manifest should omit the hooks field entirely).
197
+ *
198
+ * For agy this function returns undefined regardless of input because agy
199
+ * variants ship no hooks.
200
+ *
201
+ * @param {Record<string, Array<{ matcher?: string, hooks: Array<object> }>>} hookBlock
202
+ * The Claude-format hook block from .claude-plugin/plugin.json.
203
+ * @param {"cursor"|"agy"|"copilot"|"codex"} agent
204
+ * @param {{ copilotRulesAutoLoads?: boolean }} [opts]
205
+ * @returns {Record<string, Array<{ matcher?: string, hooks: Array<object> }>> | undefined}
206
+ */
207
+ export function filterHooksForAgent(hookBlock, agent, opts = {}) {
208
+ if (agent === "agy") return undefined;
209
+ if (!hookBlock || typeof hookBlock !== "object") return undefined;
210
+
211
+ /** @type {Record<string, Array<{ matcher?: string, hooks: Array<object> }>>} */
212
+ const out = {};
213
+
214
+ for (const [claudeEventName, entries] of Object.entries(hookBlock)) {
215
+ if (!Array.isArray(entries)) continue;
216
+ const filteredEntries = [];
217
+ for (const entry of entries) {
218
+ const handlerArray = entry?.hooks;
219
+ if (!Array.isArray(handlerArray)) continue;
220
+ const filteredHandlers = handlerArray.filter(h =>
221
+ shouldShipHook(h, claudeEventName, agent, opts)
222
+ );
223
+ if (filteredHandlers.length > 0) {
224
+ filteredEntries.push({ ...entry, hooks: filteredHandlers });
225
+ }
226
+ }
227
+ if (filteredEntries.length > 0) {
228
+ const translated = translateEventName(claudeEventName, agent);
229
+ out[translated] = filteredEntries;
230
+ }
231
+ }
232
+
233
+ return Object.keys(out).length > 0 ? out : undefined;
234
+ }
235
+
236
+ /**
237
+ * Walk a hooks/ directory and return the list of script filenames that should
238
+ * ship to the agent. Scripts referenced by no surviving hook entry are
239
+ * naturally excluded by callers (they should call this to enumerate files
240
+ * to keep AFTER filtering the manifest).
241
+ *
242
+ * @param {string[]} scriptFilenames Filenames found in hooks/
243
+ * @param {"cursor"|"agy"|"copilot"|"codex"} agent
244
+ * @returns {string[]}
245
+ */
246
+ export function filterScriptsForAgent(scriptFilenames, agent) {
247
+ if (agent === "agy") return [];
248
+ return scriptFilenames.filter(name => shouldShipScript(name, agent));
249
+ }