@codyswann/lisa 2.350.0 → 2.352.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 (296) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh +1 -1
  2. package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +1 -1
  3. package/all/create-only/.agents/rules/README.md +45 -0
  4. package/dist/cli/doctor-lisa-owned-artifacts.d.ts +18 -0
  5. package/dist/cli/doctor-lisa-owned-artifacts.d.ts.map +1 -0
  6. package/dist/cli/doctor-lisa-owned-artifacts.js +129 -0
  7. package/dist/cli/doctor-lisa-owned-artifacts.js.map +1 -0
  8. package/dist/cli/doctor.d.ts.map +1 -1
  9. package/dist/cli/doctor.js +2 -0
  10. package/dist/cli/doctor.js.map +1 -1
  11. package/dist/codex/scripts/_extract-edit-paths.sh +1 -1
  12. package/dist/codex/scripts/format-on-edit.sh +1 -1
  13. package/dist/codex/scripts/lint-on-edit.sh +1 -1
  14. package/dist/codex/scripts/rubocop-on-edit.sh +1 -1
  15. package/dist/codex/scripts/sg-scan-on-edit.sh +1 -1
  16. package/dist/configs/eslint/cdk.js +2 -2
  17. package/dist/configs/eslint/cdk.js.map +1 -1
  18. package/dist/configs/eslint/nestjs.js +2 -2
  19. package/dist/configs/eslint/nestjs.js.map +1 -1
  20. package/dist/configs/eslint/typescript.js +2 -2
  21. package/dist/configs/eslint/typescript.js.map +1 -1
  22. package/dist/core/host-rules-pointer.d.ts +33 -0
  23. package/dist/core/host-rules-pointer.d.ts.map +1 -0
  24. package/dist/core/host-rules-pointer.js +115 -0
  25. package/dist/core/host-rules-pointer.js.map +1 -0
  26. package/dist/core/instruction-files-migration.d.ts +3 -2
  27. package/dist/core/instruction-files-migration.d.ts.map +1 -1
  28. package/dist/core/instruction-files-migration.js +62 -64
  29. package/dist/core/instruction-files-migration.js.map +1 -1
  30. package/dist/core/learnings.d.ts +1 -1
  31. package/dist/core/learnings.d.ts.map +1 -1
  32. package/dist/core/learnings.js +1 -1
  33. package/dist/core/learnings.js.map +1 -1
  34. package/dist/core/lisa-owned-templates.d.ts +34 -0
  35. package/dist/core/lisa-owned-templates.d.ts.map +1 -0
  36. package/dist/core/lisa-owned-templates.js +41 -0
  37. package/dist/core/lisa-owned-templates.js.map +1 -0
  38. package/dist/core/lisa.d.ts.map +1 -1
  39. package/dist/core/lisa.js +5 -1
  40. package/dist/core/lisa.js.map +1 -1
  41. package/dist/core/project-config.d.ts +39 -9
  42. package/dist/core/project-config.d.ts.map +1 -1
  43. package/dist/core/project-config.js +37 -10
  44. package/dist/core/project-config.js.map +1 -1
  45. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  46. package/dist/core/upstream-evidence-manifest.js +73 -37
  47. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  48. package/dist/opencode/plugin-templates/lisa-block-instruction-file-edits.ts +1 -1
  49. package/dist/strategies/copy-overwrite.d.ts +13 -6
  50. package/dist/strategies/copy-overwrite.d.ts.map +1 -1
  51. package/dist/strategies/copy-overwrite.js +16 -7
  52. package/dist/strategies/copy-overwrite.js.map +1 -1
  53. package/dist/sync/registry.d.ts.map +1 -1
  54. package/dist/sync/registry.js +0 -6
  55. package/dist/sync/registry.js.map +1 -1
  56. package/package.json +1 -1
  57. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa/.codex-plugin/skills/lisa-debrief/SKILL.md +1 -1
  60. package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +3 -3
  61. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +4 -1
  62. package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +1 -0
  63. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +22 -0
  64. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +15 -0
  65. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +6 -0
  66. package/plugins/lisa/.codex-plugin/skills/lisa-improve-harness/SKILL.md +2 -2
  67. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  68. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  69. package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +6 -3
  70. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +25 -3
  71. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  72. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +15 -0
  73. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +20 -2
  74. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  75. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  76. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  77. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  78. package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +17 -0
  79. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +17 -0
  80. package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +17 -0
  81. package/plugins/lisa/agents/learnings-synthesizer.md +1 -1
  82. package/plugins/lisa/agents/skill-evaluator.md +1 -1
  83. package/plugins/lisa/hooks/block-instruction-file-edits.sh +1 -1
  84. package/plugins/lisa/hooks/block-shell-json-parsing.sh +1 -1
  85. package/plugins/lisa/rules/eager/config-resolution.md +6 -3
  86. package/plugins/lisa/rules/eager/derived-branch-plan.md +45 -0
  87. package/plugins/lisa/rules/eager/project-learnings.md +3 -2
  88. package/plugins/lisa/rules/reference/config-resolution.md +26 -2
  89. package/plugins/lisa/rules/reference/derived-branch-plan.md +112 -0
  90. package/plugins/lisa/rules/reference/intent-routing.md +1 -1
  91. package/plugins/lisa/rules/reference/project-learnings.md +6 -4
  92. package/plugins/lisa/rules/reference/promotion-contract.md +2 -1
  93. package/plugins/lisa/skills/lisa-debrief/SKILL.md +1 -1
  94. package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +3 -3
  95. package/plugins/lisa/skills/lisa-doctor/SKILL.md +4 -1
  96. package/plugins/lisa/skills/lisa-github-read-issue/SKILL.md +1 -0
  97. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +22 -0
  98. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +15 -0
  99. package/plugins/lisa/skills/lisa-implement/SKILL.md +6 -0
  100. package/plugins/lisa/skills/lisa-improve-harness/SKILL.md +2 -2
  101. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  102. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  103. package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +6 -3
  104. package/plugins/lisa/skills/lisa-linear-access/SKILL.md +25 -3
  105. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  106. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +15 -0
  107. package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +20 -2
  108. package/plugins/lisa/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  109. package/plugins/lisa/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  110. package/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  111. package/plugins/lisa/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  112. package/plugins/lisa/skills/lisa-setup-atlassian/SKILL.md +17 -0
  113. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +17 -0
  114. package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +17 -0
  115. package/plugins/lisa-agy/agents/learnings-synthesizer.md +1 -1
  116. package/plugins/lisa-agy/agents/skill-evaluator.md +1 -1
  117. package/plugins/lisa-agy/hooks/block-instruction-file-edits.sh +1 -1
  118. package/plugins/lisa-agy/hooks/block-shell-json-parsing.sh +1 -1
  119. package/plugins/lisa-agy/plugin.json +1 -1
  120. package/plugins/lisa-agy/skills/lisa-debrief/SKILL.md +1 -1
  121. package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +3 -3
  122. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +4 -1
  123. package/plugins/lisa-agy/skills/lisa-github-read-issue/SKILL.md +1 -0
  124. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +22 -0
  125. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +15 -0
  126. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +6 -0
  127. package/plugins/lisa-agy/skills/lisa-improve-harness/SKILL.md +2 -2
  128. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  129. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  130. package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +6 -3
  131. package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +25 -3
  132. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  133. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +15 -0
  134. package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +20 -2
  135. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  136. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  137. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  138. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  139. package/plugins/lisa-agy/skills/lisa-setup-atlassian/SKILL.md +17 -0
  140. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +17 -0
  141. package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +17 -0
  142. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  143. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  144. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  145. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  146. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  147. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  148. package/plugins/lisa-copilot/agents/learnings-synthesizer.agent.md +1 -1
  149. package/plugins/lisa-copilot/agents/skill-evaluator.agent.md +1 -1
  150. package/plugins/lisa-copilot/hooks/block-instruction-file-edits.sh +1 -1
  151. package/plugins/lisa-copilot/hooks/block-shell-json-parsing.sh +1 -1
  152. package/plugins/lisa-copilot/rules/eager/config-resolution.md +6 -3
  153. package/plugins/lisa-copilot/rules/eager/derived-branch-plan.md +45 -0
  154. package/plugins/lisa-copilot/rules/eager/project-learnings.md +3 -2
  155. package/plugins/lisa-copilot/rules/reference/config-resolution.md +26 -2
  156. package/plugins/lisa-copilot/rules/reference/derived-branch-plan.md +112 -0
  157. package/plugins/lisa-copilot/rules/reference/intent-routing.md +1 -1
  158. package/plugins/lisa-copilot/rules/reference/project-learnings.md +6 -4
  159. package/plugins/lisa-copilot/rules/reference/promotion-contract.md +2 -1
  160. package/plugins/lisa-copilot/skills/lisa-debrief/SKILL.md +1 -1
  161. package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +3 -3
  162. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +4 -1
  163. package/plugins/lisa-copilot/skills/lisa-github-read-issue/SKILL.md +1 -0
  164. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +22 -0
  165. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +15 -0
  166. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +6 -0
  167. package/plugins/lisa-copilot/skills/lisa-improve-harness/SKILL.md +2 -2
  168. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  169. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  170. package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +6 -3
  171. package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +25 -3
  172. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  173. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +15 -0
  174. package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +20 -2
  175. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  176. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  177. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  178. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  179. package/plugins/lisa-copilot/skills/lisa-setup-atlassian/SKILL.md +17 -0
  180. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +17 -0
  181. package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +17 -0
  182. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  183. package/plugins/lisa-cursor/agents/learnings-synthesizer.md +1 -1
  184. package/plugins/lisa-cursor/agents/skill-evaluator.md +1 -1
  185. package/plugins/lisa-cursor/hooks/block-instruction-file-edits.sh +1 -1
  186. package/plugins/lisa-cursor/hooks/block-shell-json-parsing.sh +1 -1
  187. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +26 -2
  188. package/plugins/lisa-cursor/rules/config-resolution.mdc +6 -3
  189. package/plugins/lisa-cursor/rules/derived-branch-plan-reference.mdc +117 -0
  190. package/plugins/lisa-cursor/rules/derived-branch-plan.mdc +50 -0
  191. package/plugins/lisa-cursor/rules/intent-routing-reference.mdc +1 -1
  192. package/plugins/lisa-cursor/rules/project-learnings-reference.mdc +6 -4
  193. package/plugins/lisa-cursor/rules/project-learnings.mdc +3 -2
  194. package/plugins/lisa-cursor/rules/promotion-contract-reference.mdc +2 -1
  195. package/plugins/lisa-cursor/skills/lisa-debrief/SKILL.md +1 -1
  196. package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +3 -3
  197. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +4 -1
  198. package/plugins/lisa-cursor/skills/lisa-github-read-issue/SKILL.md +1 -0
  199. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +22 -0
  200. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +15 -0
  201. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +6 -0
  202. package/plugins/lisa-cursor/skills/lisa-improve-harness/SKILL.md +2 -2
  203. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  204. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  205. package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +6 -3
  206. package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +25 -3
  207. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  208. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +15 -0
  209. package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +20 -2
  210. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  211. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  212. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  213. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  214. package/plugins/lisa-cursor/skills/lisa-setup-atlassian/SKILL.md +17 -0
  215. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +17 -0
  216. package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +17 -0
  217. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  218. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  219. package/plugins/lisa-expo-agy/plugin.json +1 -1
  220. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  221. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  222. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  223. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  224. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  225. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  226. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  227. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  228. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  229. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  230. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  231. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  232. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  233. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  234. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  235. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  236. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  237. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  238. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  239. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  240. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  241. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  242. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  243. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  244. package/plugins/lisa-rails-agy/plugin.json +1 -1
  245. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  246. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  247. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  248. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  249. package/plugins/lisa-typescript/hooks/block-suppress-directives.sh +1 -1
  250. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  251. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  252. package/plugins/lisa-typescript-copilot/hooks/block-suppress-directives.sh +1 -1
  253. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  254. package/plugins/lisa-typescript-cursor/hooks/block-suppress-directives.sh +1 -1
  255. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  256. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  257. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  258. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  259. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  260. package/plugins/src/base/agents/learnings-synthesizer.md +1 -1
  261. package/plugins/src/base/agents/skill-evaluator.md +1 -1
  262. package/plugins/src/base/hooks/block-instruction-file-edits.sh +1 -1
  263. package/plugins/src/base/hooks/block-shell-json-parsing.sh +1 -1
  264. package/plugins/src/base/rules/eager/config-resolution.md +6 -3
  265. package/plugins/src/base/rules/eager/derived-branch-plan.md +45 -0
  266. package/plugins/src/base/rules/eager/project-learnings.md +3 -2
  267. package/plugins/src/base/rules/reference/config-resolution.md +26 -2
  268. package/plugins/src/base/rules/reference/derived-branch-plan.md +112 -0
  269. package/plugins/src/base/rules/reference/intent-routing.md +1 -1
  270. package/plugins/src/base/rules/reference/project-learnings.md +6 -4
  271. package/plugins/src/base/rules/reference/promotion-contract.md +2 -1
  272. package/plugins/src/base/skills/lisa-debrief/SKILL.md +1 -1
  273. package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +3 -3
  274. package/plugins/src/base/skills/lisa-doctor/SKILL.md +4 -1
  275. package/plugins/src/base/skills/lisa-github-read-issue/SKILL.md +1 -0
  276. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +22 -0
  277. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +15 -0
  278. package/plugins/src/base/skills/lisa-implement/SKILL.md +6 -0
  279. package/plugins/src/base/skills/lisa-improve-harness/SKILL.md +2 -2
  280. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +22 -0
  281. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +15 -0
  282. package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +6 -3
  283. package/plugins/src/base/skills/lisa-linear-access/SKILL.md +25 -3
  284. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +22 -0
  285. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +15 -0
  286. package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +20 -2
  287. package/plugins/src/base/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +13 -9
  288. package/plugins/src/base/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
  289. package/plugins/src/base/skills/lisa-secrets-access/scripts/resolve-secret.mjs +32 -6
  290. package/plugins/src/base/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +6 -2
  291. package/plugins/src/base/skills/lisa-setup-atlassian/SKILL.md +17 -0
  292. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +17 -0
  293. package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +17 -0
  294. package/plugins/src/typescript/hooks/block-suppress-directives.sh +1 -1
  295. package/scripts/github-status-check.sh +22 -7
  296. package/all/create-only/.claude/rules/PROJECT_RULES.md +0 -17
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -16,7 +16,7 @@
16
16
 
17
17
  JSON_INPUT=$(cat)
18
18
 
19
- # Project rule (.claude/rules/PROJECT_RULES.md): never parse JSON in shell with
19
+ # Project rule (host rules, .agents/rules/): never parse JSON in shell with
20
20
  # grep/sed/cut/awk — always use jq. Fail open without jq so we never hard-block
21
21
  # the agent on missing tooling.
22
22
  command -v jq >/dev/null 2>&1 || exit 0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -16,7 +16,7 @@
16
16
 
17
17
  JSON_INPUT=$(cat)
18
18
 
19
- # Project rule (.claude/rules/PROJECT_RULES.md): never parse JSON in shell with
19
+ # Project rule (host rules, .agents/rules/): never parse JSON in shell with
20
20
  # grep/sed/cut/awk — always use jq. Fail open without jq so we never hard-block
21
21
  # the agent on missing tooling.
22
22
  command -v jq >/dev/null 2>&1 || exit 0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -16,7 +16,7 @@
16
16
 
17
17
  JSON_INPUT=$(cat)
18
18
 
19
- # Project rule (.claude/rules/PROJECT_RULES.md): never parse JSON in shell with
19
+ # Project rule (host rules, .agents/rules/): never parse JSON in shell with
20
20
  # grep/sed/cut/awk — always use jq. Fail open without jq so we never hard-block
21
21
  # the agent on missing tooling.
22
22
  command -v jq >/dev/null 2>&1 || exit 0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.350.0",
3
+ "version": "2.352.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -44,7 +44,7 @@ Map every finding to exactly one category. When a finding could fit two, pick th
44
44
 
45
45
  A finding that does not fit any of the eight is itself a signal — surface it under an additional ad-hoc category `Uncategorized` with a note explaining why no category fit. Better to surface than to drop.
46
46
 
47
- The destination column is a **hint for the human triaging the row**, not the routing decision: `lisa-debrief-apply` routes on the category, never on this column. Keep the hint honest anyway — a human decides Accept/Reject partly on where the learning will land. The three knowledge categories (recurring gotcha, process friction, convention drift) all land in the committed learnings ledger through the executable contract. Machine-local auto-memory (`project_*.md`, `MEMORY.md`), `PROJECT_RULES.md`, and `AGENTS.md` (whose `CLAUDE.md` is only a `@AGENTS.md` pointer) are **never** destinations — the first is invisible to cloud runs and teammates, and the latter two are human-authored surfaces that agents do not write.
47
+ The destination column is a **hint for the human triaging the row**, not the routing decision: `lisa-debrief-apply` routes on the category, never on this column. Keep the hint honest anyway — a human decides Accept/Reject partly on where the learning will land. The three knowledge categories (recurring gotcha, process friction, convention drift) all land in the committed learnings ledger through the executable contract. Machine-local auto-memory (`project_*.md`, `MEMORY.md`), the host-rules directory `.agents/rules/`, and `AGENTS.md` (whose `CLAUDE.md` is only a `@AGENTS.md` pointer) are **never** destinations — the first is invisible to cloud runs and teammates, and the latter two are human-authored surfaces that agents do not write.
48
48
 
49
49
  ## Dedupe rules
50
50
 
@@ -18,7 +18,7 @@ Rungs are ordered by context cost and enforcement strength. Decision vocabulary:
18
18
  | Rung | Recommendation | Destination | Enters context | Admission policy |
19
19
  | --- | --- | --- | --- | --- |
20
20
  | 6 | EXECUTABLE-CONTROL | Lint / ast-grep / type / test / hook / `package.lisa.json` force | Never — diagnostic fires on violation | Mechanically decidable + stable + recurred |
21
- | 5 | EAGER-RULE | Auto-loaded rules tree | Unconditionally, every session | **Earned by failure evidence** (repeated misses despite retrievability); demotion-biased |
21
+ | 5 | EAGER-RULE | Host rules: `.agents/rules/` (project scope) · plugin `rules/eager/` (upstream scope) | Unconditionally, every session | **Earned by failure evidence** (repeated misses despite retrievability); demotion-biased |
22
22
  | 4 | SKILL | `.claude/skills/<name>/SKILL.md` | Description eager; body on invoke | Procedural, complex, recognizable trigger |
23
23
  | 3 | WIKI | Wiki page + index entry | Only when routed to | Durable reference knowledge |
24
24
  | 2 | KEEP-IN-LEDGER | `PROJECT_LEARNINGS.md` (bounded contract projection) | Bounded projection only | Default landing zone; probationary, expiring |
@@ -117,7 +117,7 @@ WHERE IT GOES INSTEAD — take the first one that fits:
117
117
  That is a project rule — but do not write it yourself. Capture it with
118
118
  \`/lisa:persist-learning\` so it lands in the learnings ledger with provenance
119
119
  and a confidence score. The gardener (\`/lisa:learnings:audit\`) then proposes
120
- promotion into \`.claude/rules/PROJECT_RULES.md\` as a human-gated ticket.
120
+ promotion into the host-rules directory \`.agents/rules/\` as a human-gated ticket.
121
121
 
122
122
  2. It changes how an existing skill should behave. Edit that skill's SKILL.md.
123
123
  Knowledge belongs next to the procedure it modifies, not in a global preamble.
@@ -3,7 +3,7 @@
3
3
  # Text tools (grep/sed/cut/awk) break on valid JSON — multiline values, escaped
4
4
  # quotes, reordered keys, nested objects — producing silently wrong output
5
5
  # instead of errors. jq is the required tool for structural JSON reads and
6
- # writes in shell. Promoted from PROJECT_RULES.md prose to an executable
6
+ # writes in shell. Promoted from host-rules prose to an executable
7
7
  # control by the learnings gardener (issue #1787).
8
8
  #
9
9
  # Precision-first: this hook fires only on high-confidence STRUCTURAL parsing
@@ -37,9 +37,12 @@ This is the shared slug for the config-bound-transitions policy (the `leaf-only-
37
37
 
38
38
  ## Project rules and learnings
39
39
 
40
- Resolve hand-authored project rules from `.lisa.config.json`
41
- `projectRulesFile`, defaulting to `.claude/rules/PROJECT_RULES.md`. Automated
42
- learnings never append to that file: they use the separate machine-managed
40
+ Host-authored project rules live in the fixed, agent-neutral directory
41
+ `.agents/rules/` not a configurable file. Every agent reaches it through the
42
+ Lisa-managed pointer block in `AGENTS.md`, so it is read once, on demand. A
43
+ project that still carries the retired `.claude/rules/PROJECT_RULES.md` keeps
44
+ it, untouched and authoritative; the pointer names it too. Automated
45
+ learnings never append to host rules: they use the separate machine-managed
43
46
  ledger resolved from `.lisa.config.json` — the optional `learnings.file`
44
47
  override, else the default `.lisa/PROJECT_LEARNINGS.md`. The ledger lives in the
45
48
  cold `.lisa/` tree (never an auto-loaded rules directory) and is consumed only
@@ -0,0 +1,45 @@
1
+ # Derived Branch Plan (load-bearing)
2
+
3
+ **Every applicable leaf work item shows the branch it will be built from and the branch its PR lands in, as a generated `Branch Plan` section — and that section is derived data, not a second authority.** The authority is `## Target Backend Environment` resolved forward through `.lisa.config.json` `deploy.branches`. A work item that displays branches nobody can trace back to that mapping, or a flow that reads the displayed branches instead of recomputing them, is a contract violation.
4
+
5
+ **One vendor-neutral contract, cited by** `lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`, `lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`, and `lisa-implement` (the `leaf-only-lifecycle` / `repo-scope-split` precedent: one shared slug, never divergent per-vendor prose).
6
+
7
+ ## Why derived, and not two branch fields
8
+
9
+ The operator need is real: reading a ticket should not require resolving a config file to learn where the work starts and where it lands. But Lisa already owns that fact. Adding independent literal branch fields would create **a second source of truth that can drift** — and the failure mode of that drift is not a cosmetic mismatch, it is code silently shipped to the wrong environment. So the branches are rendered for humans and recomputed for machines. The rendered branches are **never read as input** by any flow, at any phase — a surface that needs the base branch derives it again from the environment.
10
+
11
+ ## The rendered section
12
+
13
+ Exactly three lines, identical across vendors (`h2. Branch Plan` in JIRA wiki markup, `## Branch Plan` in GitHub/Linear markdown):
14
+
15
+ ```
16
+ Branch from: <branch>
17
+ PR into: <branch>
18
+ Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
19
+ ```
20
+
21
+ The third line is the **derivation provenance line**. It is what marks the section machine-authored: a `Branch Plan` without it is treated as hand-authored, and hand-authored branches are never obeyed.
22
+
23
+ `Branch from` and `PR into` name the **same branch by construction** — implementation checks the feature branch out of `origin/<base>` and targets the PR back into `<base>`. A plan naming two different branches is malformed and fails validation. (A fix that genuinely lands on one branch and must reach another travels as a linked follow-up work item with its own branch plan, never as a divergence inside one plan.)
24
+
25
+ ## Derivation
26
+
27
+ 1. Resolve the environment under the existing `Target Backend Environment` grammar (`config-resolution`, `pre-flight-autofill`) — human-confirmed wins, then validated `Inferred:`, then `Assumption:`.
28
+ 2. Map that exact configured key forward through `deploy.branches`. The key must map uniquely and the mapped branch must exist on the remote.
29
+ 3. Render both fields to that branch plus the provenance line.
30
+
31
+ A missing or **ambiguous** mapping, a key that is **not unique**, or a branch absent from the remote **stops** the flow — exactly as `lisa-implement` already stops. **Never default independently to `main`, to the remote default branch, or to any other branch** to keep a write from failing. The remote default is a legitimate input only through the `Assumption:` fallback the environment grammar already defines, and it must be recorded as such.
32
+
33
+ ## Exemption
34
+
35
+ Work that declares no runtime behavior change — `runtime_behavior_change = false`, i.e. doc-only, config-only, and type-only items — carries **no `Target Backend Environment`**, therefore has nothing to derive from and **requires no branch plan**. Its **absence is correct**, not a missing section, and no gate may demand one. Containers (an Epic, or a Story/Spike still holding child work) are exempt for the same reason: they are not built directly.
36
+
37
+ The exemption is one-way. Exempt work that *carries* a branch plan fails validation — branches asserted for work that declared it has no runtime target are hand-authored by definition, which is the second-authority failure this rule exists to prevent.
38
+
39
+ ## Conflict, legacy, and drift
40
+
41
+ - **Conflict** — a present plan that disagrees with the recomputed plan **fails**; the flow never silently picks a side. The remediation is always to correct the environment, never to edit the branches.
42
+ - **Legacy** — an item written before this rule has no plan. At claim time the implementing agent derives it, **writes the assumption onto the item as a comment**, and proceeds. Never a silent guess.
43
+ - **Drift** — config changed after the plan was rendered. Current config wins; the stale plan is re-rendered and never followed.
44
+
45
+ Full derivation table, gate S19 semantics, the claim-time arms, and the vendor rendering details: [reference/derived-branch-plan.md](../reference/derived-branch-plan.md).
@@ -15,7 +15,8 @@ receive the contract's bounded projection, not the full file.
15
15
 
16
16
  Missing learnings are a silent no-op. Malformed, non-canonical, unsafe, or
17
17
  over-budget learnings produce one readable warning, apply no entry, and must not
18
- block unrelated task work. Never append automated learnings to
19
- `PROJECT_RULES.md`; project learnings are a separate machine-managed document.
18
+ block unrelated task work. Never append automated learnings to host rules
19
+ (`.agents/rules/`, or a surviving legacy `PROJECT_RULES.md`); project learnings
20
+ are a separate machine-managed document.
20
21
 
21
22
  Full prose: [reference/project-learnings.md](../reference/project-learnings.md).
@@ -33,7 +33,6 @@ fi
33
33
  {
34
34
  "tracker": "jira",
35
35
  "source": "notion",
36
- "projectRulesFile": ".claude/rules/PROJECT_RULES.md",
37
36
 
38
37
  "atlassian": { "cloudId": "<uuid>", "site": "<host>" },
39
38
  "jira": {
@@ -179,12 +178,21 @@ fi
179
178
  |-------|----------|---------|-------|
180
179
  | `tracker` | **yes** | — | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing → fail with instruction to run the matching `/lisa:setup:*` skill. |
181
180
  | `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
182
- | `projectRulesFile` | no | `.claude/rules/PROJECT_RULES.md` | Safe repo-relative Markdown path for hand-authored project rules. Independent of the learnings ledger relocating the rules file never moves the ledger. |
181
+ | ~~`projectRulesFile`~~ | | | **Retired.** Host-authored rules now live in the fixed, agent-neutral directory `.agents/rules/` — not a configurable file. An existing key is still parsed and preserved so installed projects keep applying, but nothing serves rules from it. See **Host rules** below. |
183
182
  | `learnings.file` | no | `.lisa/PROJECT_LEARNINGS.md` | Safe repo-relative Markdown path for the machine-managed learnings ledger, overriding the `.lisa/` default. Rejected if it resolves inside any auto-loaded rules tree (`.claude/rules`, `.cursor/rules`, `.github/instructions`, `.agents/rules`) — the ledger must stay out of eager context. |
184
183
  | `health.schedule` | no | `off` | Health cadence contract: `off`, `daily`, or `weekly`. `lisa sync` populates the default with `_lisaSync.populated` provenance and rejects values outside this closed vocabulary. Runtime results live only at the gitignored `.lisa/health/latest.json`, never in either config file. |
185
184
  | `usage` | no | — | Optional token/cost pricing metadata consumed by the `usage-accounting` rule. Missing pricing never blocks a lifecycle flow; Lisa records token counts with `estimated_cost: null` when no trustworthy price source is configured. |
186
185
  | `wiki` | no | — | Wiki location for the `wiki-knowledge-source` rule. Omit for a local in-repo wiki (`wiki/`). See **Wiki source** below. |
187
186
 
187
+ ### Host rules (`.agents/rules/`)
188
+
189
+ Host-authored operating rules live in `.agents/rules/` — **fixed, not configurable**. One directory, every agent.
190
+
191
+ - **Not a native auto-load tree.** `.claude/rules`, `.cursor/rules`, and `.github/instructions` are; `.agents/rules` deliberately is not. Every agent reaches it through the single Lisa-managed pointer block in `AGENTS.md` (Claude via the `@AGENTS.md` import in `CLAUDE.md`), so no agent loads host rules twice.
192
+ - **Host-owned.** Lisa never writes rule bodies into `.agents/rules/`, and never edits or deletes a file there. Lisa's own rules originate in its plugins and arrive by their own route.
193
+ - **Not the learnings ledger.** `.agents/rules` is reserved in the auto-loaded-tree blocklist, so a `learnings.file` override can never resolve inside it.
194
+ - **Transition.** A project that still has the retired `.claude/rules/PROJECT_RULES.md` keeps it, untouched and authoritative. The pointer block names it so agents whose runtime does not auto-load `.claude/rules/` still find it. Moving that content is a human-gated decision, never an automated rewrite.
195
+
188
196
  ### Wiki source (`wiki`)
189
197
 
190
198
  Declares **where this repo's LLM Wiki lives** so the query/ingest skills can resolve and (for a remote wiki) mirror it. `wiki.source` has two shapes — **local** (`path`) and **remote** (`url`) — and the block belongs in the **consumer** repo's `.lisa.config.json`, not in `wiki/lisa-wiki.config.json` (which describes a wiki from the inside and is unavailable until a remote wiki is mirrored — chicken-and-egg). The whole `wiki` block is optional; omit it and the resolver falls back to the in-repo `wiki/` convention.
@@ -847,6 +855,22 @@ read_notion_token() {
847
855
  local slug=$(echo "$workspace" | tr '[:upper:]-' '[:lower:]_')
848
856
  local varname="NOTION_API_TOKEN_${slug}"
849
857
  [ -n "${!varname}" ] && { echo "${!varname}"; return; }
858
+ # Preferred path: the single secrets chokepoint, which owns the one-store rule
859
+ # and the surface ladder. An agent following this reference must try it before
860
+ # any keychain — a second reader is how one credential ends up in two places.
861
+ local resolver
862
+ for resolver in .claude/skills/lisa-secrets-access/scripts/resolve-secret.mjs \
863
+ .agents/skills/lisa-secrets-access/scripts/resolve-secret.mjs; do
864
+ if [ -f "$resolver" ]; then
865
+ local via_lisa
866
+ via_lisa=$(node "$resolver" get NOTION_API_TOKEN 2>/dev/null) \
867
+ && [ -n "$via_lisa" ] && { echo "$via_lisa"; return; }
868
+ break
869
+ fi
870
+ done
871
+ # Legacy fallback: the OS keychain written by the guided setup flow, for
872
+ # projects with no credentials provider. Reached only when the chokepoint is
873
+ # absent or has no entry.
850
874
  case "$(uname -s)" in
851
875
  Darwin) security find-generic-password -s lisa-notion -a "$workspace" -w 2>/dev/null ;;
852
876
  Linux) command -v secret-tool >/dev/null && \
@@ -0,0 +1,112 @@
1
+ # Derived Branch Plan — reference
2
+
3
+ The full body behind the `derived-branch-plan` eager head. It defines one vendor-neutral contract consumed by the three tracker writers (`lisa-jira-write-ticket`, `lisa-github-write-issue`, `lisa-linear-write-issue`), the three validators (`lisa-jira-validate-ticket`, `lisa-github-validate-issue`, `lisa-linear-validate-issue`) via gate **S19**, and `lisa-implement` at claim time. Each surface cites this slug rather than growing its own prose, exactly as the vendor arms cite `leaf-only-lifecycle` and `repo-scope-split`. One slug is what keeps a branch plan rejected on JIRA from being accepted on Linear.
4
+
5
+ ## The problem this solves, and the one it must not create
6
+
7
+ An operator reading a work item cannot see which branch the work starts from or which branch the PR lands in. Both facts are knowable, but only by resolving `.lisa.config.json` — which is exactly the kind of engineering step the factory model says a non-technical operator standing at the gate should not have to take.
8
+
9
+ The obvious fix — add a "source branch" field and a "PR target" field to the ticket template — is wrong, and it is worth being explicit about why, because it will look like the simple answer every time someone revisits this. Those fields would be **a second source of truth** for a fact Lisa already derives authoritatively from `## Target Backend Environment` + `deploy.branches`. Two authorities do not stay equal. They drift the first time an environment is corrected on a ticket whose branch fields nobody updated, or the first time `deploy.branches` is remapped. And the consequence of that drift is not a stale label: it is an agent branching from, and merging into, the wrong environment's branch — shipping unreviewed code to production, or shipping a production fix into a staging branch where nobody sees it.
10
+
11
+ So the contract renders the branches **for humans** and recomputes them **for machines**. The rendered section is output. It is never input.
12
+
13
+ Precedence is therefore not a negotiation: whenever a rendered plan and the resolved environment disagree, **the environment wins** — the authority wins, in every phase, on every vendor, with no exception for a plan a human edited by hand. The only question a disagreement raises is whether to re-render silently (staleness) or stop for a human (a conflict with a confirmed environment or an open PR base). It is never "which branch did they mean?"
14
+
15
+ ## The rendered section
16
+
17
+ | Vendor | Heading form |
18
+ |---|---|
19
+ | JIRA | `h2. Branch Plan` (ADF heading in live JIRA) |
20
+ | GitHub | `## Branch Plan` |
21
+ | Linear | `## Branch Plan` |
22
+
23
+ Body, identical on all three:
24
+
25
+ ```
26
+ Branch from: <branch>
27
+ PR into: <branch>
28
+ Derived from: Target Backend Environment <env> via .lisa.config.json deploy.branches
29
+ ```
30
+
31
+ ### The derivation provenance line
32
+
33
+ The third line is load-bearing. It is the discriminator between a section this contract produced and one a human typed, and it is deliberately visible prose rather than an HTML comment — the same reason the `Target Backend Environment` grammar uses visible `Inferred:` / `Assumption:` annotations: JIRA's ADF has no comment node, so a marker that only exists in markdown cannot be a vendor-neutral discriminator.
34
+
35
+ A `Branch Plan` **without the provenance line is treated as hand-authored**, and hand-authored branches are never obeyed — they are compared against the recomputed plan and, on any disagreement, fail. A provenance line naming an `<env>` that is not an exact configured `deploy.branches` key is itself malformed and fails.
36
+
37
+ ### One branch, two labels
38
+
39
+ `Branch from` and `PR into` always name the **same branch**. That is not a simplification, it is the invariant `lisa-implement` already implements: the feature branch is cut from `origin/<base>` and the PR targets `<base>`. Both labels exist because operators asked to see both questions answered, and because naming them separately gives the contract somewhere to say they are equal instead of leaving it implicit.
40
+
41
+ A plan whose two fields name **two different branches** is malformed and fails validation. The case that looks like a counter-example — a bug fixed on a non-integration environment branch that must also reach the integration branch — is handled the way `lisa-implement` already handles it: as a **linked forward cherry-pick follow-up item**, which is its own work item with its own single-branch plan. It is never a divergence inside one plan.
42
+
43
+ ## Derivation algorithm
44
+
45
+ 1. **Resolve the environment.** Use the existing grammar and precedence defined in `config-resolution` and `pre-flight-autofill`: a human-confirmed bare configured key or `Confirmed: <env>` wins; then a validated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`; then `Assumption: <env> — remote default branch <branch>`, or the branch-only `Assumption: remote default branch <branch>` when the reverse-map is not unique. This rule adds no new resolution logic and no new aliases.
46
+ 2. **Map forward.** Look the exact configured key up in `deploy.branches`. The key must resolve to exactly one branch.
47
+ 3. **Prove the branch.** The mapped branch must exist on the remote.
48
+ 4. **Render.** Both fields to that branch, plus the provenance line naming the `<env>` used.
49
+
50
+ ### Stop conditions
51
+
52
+ | Condition | Behavior |
53
+ |---|---|
54
+ | No environment resolvable and the item is not exempt | Stop — the `Target Backend Environment` gate (S8) already owns this |
55
+ | Environment key absent from `deploy.branches` | Stop |
56
+ | Mapping ambiguous / not unique | Stop |
57
+ | Mapped branch missing on the remote | Stop |
58
+
59
+ **Never guess.** There is no fallback that quietly substitutes `main`, the remote default branch, or the branch of a sibling environment to keep a write from failing — a silent guess here is the exact failure this contract exists to prevent, and a stopped write is cheap next to a wrong-branch merge. The remote default branch enters only through the `Assumption:` form the environment grammar already defines, and only recorded as an assumption.
60
+
61
+ ## Gate S19 — Branch Plan derivation
62
+
63
+ Registered in all three validators as `| S19 Branch Plan derivation | technical | false |`. The gate **recomputes** the plan from current config and compares; it never reads the rendered branches as input.
64
+
65
+ | Case | Verdict |
66
+ |---|---|
67
+ | Exempt work (`runtime_behavior_change = false`, or a container) with no plan | `N/A` |
68
+ | Exempt work **carrying** a plan | **FAIL** — hand-authored branches on work that declared no runtime target |
69
+ | Applicable work, plan present, matches recomputed plan | PASS |
70
+ | Applicable work, plan present, disagrees with recomputed plan | **FAIL** |
71
+ | Applicable work, plan present, missing the provenance line and disagreeing | **FAIL** (hand-authored) |
72
+ | Applicable work, two fields naming different branches | **FAIL** — malformed |
73
+ | Applicable work, derivation hits a stop condition | **FAIL** — same stop as implement |
74
+ | Applicable work, **proposed spec** (pre-write) with no plan | **FAIL** — the writer must render it before the write |
75
+ | Applicable work, **live legacy item** with no plan | `N/A` with a repair note routed to claim time |
76
+
77
+ The last two rows are the asymmetry that matters. Failing a *proposed* spec is free — the writer just renders the section. Failing every *existing* item would turn a whole legacy queue red overnight for a section no human ever had a way to add, so those are repaired at claim time instead, where the derivation is written onto the item as evidence.
78
+
79
+ ### Failure remediation
80
+
81
+ Every S19 failure names both plans (rendered and recomputed) and points the fix at **the environment, never the branches**:
82
+
83
+ > Branch Plan conflicts with the environment mapping. Rendered `Branch from: release/staging`; recomputed from `Target Backend Environment: production` via `deploy.branches` → `main`. Correct the environment, not the branch — the branches are derived. Then re-render.
84
+
85
+ The gate never silently chooses between the two. Picking one would be a guess wearing a verdict.
86
+
87
+ ## Claim-time behavior (`lisa-implement`)
88
+
89
+ At claim time the plan is recomputed against **current config and the remote** — never trusted from the item — and one of four arms runs:
90
+
91
+ - **Match** — proceed. The already-existing base-branch validation, feature-branch sync, and `target_branch=<base>` handoff are unchanged.
92
+ - **Legacy (no plan)** — derive it, **write the assumption onto the item as a comment**, then proceed. The comment carries a visible prose line plus a dedupe marker so a re-claim produces no duplicate:
93
+
94
+ ```
95
+ Branch plan derived for this item: branch from `main`, PR into `main` (Target Backend
96
+ Environment: production via .lisa.config.json deploy.branches).
97
+ <!-- [lisa-branch-plan] key=<work-item-ref>::<branch> -->
98
+ ```
99
+
100
+ Marker-dedupe is on `<work-item-ref>::<branch>`, so the comment reappears only if the derived branch actually changes. Where a vendor cannot host an HTML comment, the visible line alone carries it. If the comment cannot be written, that is a stop, not a shrug — proceeding would make it exactly the silent guess this rule forbids.
101
+ - **Conflict with a human-confirmed environment, or with an existing open PR's base** — **stop under the existing confirmation rules**. `lisa-implement` already surfaces a PR-base mismatch and re-targets only with confirmation, on the stated grounds that the ticket's environment is the source of truth; a branch plan never overrides that, and never supplies the confirmation itself.
102
+ - **Stale (config changed since the plan was rendered)** — **current config wins**. Re-render the section onto the item, record the change, and never follow the stale plan. A stale plan is not a conflict to escalate; it is output that fell behind its input.
103
+
104
+ ## Why the gate is `technical` / not product-relevant
105
+
106
+ S19 is categorized `technical`, `product_relevant: false`, matching S8 — the fact it checks is a deployment-topology fact, and a PRD-intake comment aimed at a product author cannot act on it. The operator-facing value of the section is that it is *visible on the item*, not that its failures are routed to product.
107
+
108
+ ## What this rule deliberately does not do
109
+
110
+ - It defines **no new environment resolution**, no new aliases, and no new provenance grammar. All of that stays in `config-resolution` / `pre-flight-autofill`, and this rule reads the result.
111
+ - It does **not** let a branch plan influence which environment is chosen, in any direction, at any phase.
112
+ - It does **not** introduce branch fields on PRDs. PRDs are not built directly; their generated leaves carry the plan.
@@ -223,7 +223,7 @@ Sequence:
223
223
  - **PRD defect** — the ticket faithfully captured the PRD, but the PRD itself was wrong, ambiguous, or missing the failing case
224
224
  - **Missing tool access** — an agent lacked a tool, credential, environment, or permission the work required
225
225
 
226
- The three knowledge categories (recurring gotcha, process friction, convention drift) persist to the committed learnings ledger through the executable contract — never to machine-local memory, `PROJECT_RULES.md`, or `AGENTS.md`.
226
+ The three knowledge categories (recurring gotcha, process friction, convention drift) persist to the committed learnings ledger through the executable contract — never to machine-local memory, host rules (`.agents/rules/`), or `AGENTS.md`.
227
227
  4. **Produce the human-triage document** — a markdown file with one row per candidate learning showing: category, summary, evidence (links to the source ticket comment / PR comment / commit), recommended persistence destination, and a checkbox-style disposition field the human will mark (Accept / Reject / Defer). Surface step-1 anomalies (work items missing PRs, etc.) in a separate section. The document is exhaustive — it lists every candidate, even ones the synthesizer rates low confidence — because the human, not the agent, decides what is worth keeping.
228
228
  5. **Record Debrief usage on the triage document** — invoke `lisa-usage-accounting` against the generated markdown artifact so the document carries its own direct `debrief` usage entry in the canonical `## Lisa Usage` section. If runtime usage is unavailable, write the entry with `source: unavailable` and nullable token/cost fields rather than skipping it.
229
229
  6. **Stop and hand the document to the human.** Debrief does NOT persist accepted learnings itself. The human triages, marks dispositions, and runs the **`/lisa:debrief:apply`** command (skill: `debrief-apply`) to route the accepted items to their destinations.