@codyswann/lisa 4.72.1 → 4.72.3

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 (377) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +225 -33
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  6. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  7. package/dist/core/upstream-evidence-manifest.js +9 -5
  8. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  9. package/package.json +4 -4
  10. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/SKILL.md +2 -0
  13. package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/SKILL.md +2 -0
  14. package/plugins/lisa/.codex-plugin/skills/lisa-agent-ready/SKILL.md +2 -0
  15. package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +2 -0
  16. package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +2 -0
  17. package/plugins/lisa/.codex-plugin/skills/lisa-attribute-failure/SKILL.md +2 -0
  18. package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/SKILL.md +2 -0
  19. package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +2 -0
  20. package/plugins/lisa/.codex-plugin/skills/lisa-capability-drift/SKILL.md +2 -0
  21. package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/SKILL.md +2 -0
  22. package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/SKILL.md +2 -0
  23. package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/SKILL.md +2 -0
  24. package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +2 -0
  25. package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/SKILL.md +2 -0
  26. package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/SKILL.md +2 -0
  27. package/plugins/lisa/.codex-plugin/skills/lisa-debrief/SKILL.md +2 -0
  28. package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +2 -0
  29. package/plugins/lisa/.codex-plugin/skills/lisa-delivery-effectiveness/SKILL.md +2 -0
  30. package/plugins/lisa/.codex-plugin/skills/lisa-design-intake/SKILL.md +2 -0
  31. package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/SKILL.md +2 -0
  32. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +2 -0
  33. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +2 -0
  34. package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/SKILL.md +2 -0
  35. package/plugins/lisa/.codex-plugin/skills/lisa-evaluation-suite/SKILL.md +2 -0
  36. package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +2 -0
  37. package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/SKILL.md +2 -0
  38. package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/SKILL.md +2 -0
  39. package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/SKILL.md +2 -0
  40. package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/SKILL.md +2 -0
  41. package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +2 -0
  42. package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/SKILL.md +2 -0
  43. package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +2 -0
  44. package/plugins/lisa/.codex-plugin/skills/lisa-github-claim/SKILL.md +2 -0
  45. package/plugins/lisa/.codex-plugin/skills/lisa-github-create/SKILL.md +2 -0
  46. package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/SKILL.md +2 -0
  47. package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/SKILL.md +2 -0
  48. package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +2 -0
  49. package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/SKILL.md +2 -0
  50. package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +2 -0
  51. package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +2 -0
  52. package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +2 -0
  53. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +2 -0
  54. package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +2 -0
  55. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +2 -0
  56. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/SKILL.md +2 -0
  57. package/plugins/lisa/.codex-plugin/skills/lisa-health/SKILL.md +2 -0
  58. package/plugins/lisa/.codex-plugin/skills/lisa-health-drift-cron/SKILL.md +2 -0
  59. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +2 -0
  60. package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/SKILL.md +2 -0
  61. package/plugins/lisa/.codex-plugin/skills/lisa-improve-harness/SKILL.md +2 -0
  62. package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/SKILL.md +2 -0
  63. package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/SKILL.md +2 -0
  64. package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/SKILL.md +2 -0
  65. package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/SKILL.md +2 -0
  66. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +2 -0
  67. package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/SKILL.md +2 -0
  68. package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +2 -0
  69. package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/SKILL.md +2 -0
  70. package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +2 -0
  71. package/plugins/lisa/.codex-plugin/skills/lisa-jira-claim/SKILL.md +2 -0
  72. package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/SKILL.md +2 -0
  73. package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/SKILL.md +2 -0
  74. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +2 -0
  75. package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/SKILL.md +2 -0
  76. package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +2 -0
  77. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +2 -0
  78. package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +2 -0
  79. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +2 -0
  80. package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/SKILL.md +2 -0
  81. package/plugins/lisa/.codex-plugin/skills/lisa-kane-browser/SKILL.md +2 -0
  82. package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +2 -0
  83. package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +2 -0
  84. package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/SKILL.md +2 -0
  85. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +2 -0
  86. package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +2 -0
  87. package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/SKILL.md +2 -0
  88. package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +2 -0
  89. package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/SKILL.md +2 -0
  90. package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +2 -0
  91. package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/SKILL.md +2 -0
  92. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +2 -0
  93. package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +2 -0
  94. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +2 -0
  95. package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +2 -0
  96. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +2 -0
  97. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/SKILL.md +2 -0
  98. package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +2 -0
  99. package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/SKILL.md +2 -0
  100. package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/SKILL.md +2 -0
  101. package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +2 -0
  102. package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +2 -0
  103. package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/SKILL.md +2 -0
  104. package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +2 -0
  105. package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/SKILL.md +2 -0
  106. package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/SKILL.md +2 -0
  107. package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/SKILL.md +3 -1
  108. package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/agents/openai.yaml +2 -2
  109. package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/SKILL.md +2 -0
  110. package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +2 -0
  111. package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/SKILL.md +2 -0
  112. package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/SKILL.md +2 -0
  113. package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/SKILL.md +2 -0
  114. package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +2 -0
  115. package/plugins/lisa/.codex-plugin/skills/lisa-plan/SKILL.md +2 -0
  116. package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/SKILL.md +2 -0
  117. package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +2 -0
  118. package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +2 -0
  119. package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/SKILL.md +2 -0
  120. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -0
  121. package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/SKILL.md +2 -0
  122. package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +2 -0
  123. package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +2 -0
  124. package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +2 -0
  125. package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/SKILL.md +2 -0
  126. package/plugins/lisa/.codex-plugin/skills/lisa-remote-dispatch/SKILL.md +2 -0
  127. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +2 -0
  128. package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +2 -0
  129. package/plugins/lisa/.codex-plugin/skills/lisa-research/SKILL.md +2 -0
  130. package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/SKILL.md +2 -0
  131. package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +2 -0
  132. package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +2 -0
  133. package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +2 -0
  134. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +2 -0
  135. package/plugins/lisa/.codex-plugin/skills/lisa-security-review/SKILL.md +2 -0
  136. package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/SKILL.md +2 -0
  137. package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +2 -0
  138. package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +2 -0
  139. package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +2 -0
  140. package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/SKILL.md +2 -0
  141. package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/SKILL.md +2 -0
  142. package/plugins/lisa/.codex-plugin/skills/lisa-setup-github-repo/SKILL.md +2 -0
  143. package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/SKILL.md +2 -0
  144. package/plugins/lisa/.codex-plugin/skills/lisa-setup-kane/SKILL.md +2 -0
  145. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +2 -0
  146. package/plugins/lisa/.codex-plugin/skills/lisa-setup-local-env/SKILL.md +2 -0
  147. package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +2 -0
  148. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +2 -0
  149. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +2 -0
  150. package/plugins/lisa/.codex-plugin/skills/lisa-setup-sonar/SKILL.md +2 -0
  151. package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/SKILL.md +2 -0
  152. package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +2 -0
  153. package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +2 -0
  154. package/plugins/lisa/.codex-plugin/skills/lisa-starter-sync/SKILL.md +2 -0
  155. package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +2 -0
  156. package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/SKILL.md +2 -0
  157. package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/SKILL.md +2 -0
  158. package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +2 -0
  159. package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +2 -0
  160. package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/SKILL.md +2 -0
  161. package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +2 -0
  162. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +2 -0
  163. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/SKILL.md +2 -0
  164. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +2 -0
  165. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-claim/SKILL.md +2 -0
  166. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/SKILL.md +2 -0
  167. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +2 -0
  168. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/SKILL.md +2 -0
  169. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/SKILL.md +2 -0
  170. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  171. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +2 -0
  172. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/SKILL.md +2 -0
  173. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/SKILL.md +2 -0
  174. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/SKILL.md +2 -0
  175. package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/SKILL.md +2 -0
  176. package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/SKILL.md +2 -0
  177. package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +2 -0
  178. package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/SKILL.md +2 -0
  179. package/plugins/lisa/.codex-plugin/skills/lisa-verify/SKILL.md +2 -0
  180. package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/SKILL.md +2 -0
  181. package/plugins/lisa/.codex-plugin/skills/lisa-verify-workflow-change/SKILL.md +2 -0
  182. package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/SKILL.md +2 -0
  183. package/plugins/lisa/hooks/worktree-binding-guard.mjs +225 -33
  184. package/plugins/lisa/rules/reference/design-source-of-truth.md +1 -1
  185. package/plugins/lisa/rules/reference/rejection-detection.md +1 -1
  186. package/plugins/lisa-agy/plugin.json +1 -1
  187. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  188. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  189. package/plugins/lisa-cdk/.codex-plugin/skills/lisa-setup-aws/SKILL.md +3 -1
  190. package/plugins/lisa-cdk/.codex-plugin/skills/lisa-setup-aws/agents/openai.yaml +2 -2
  191. package/plugins/lisa-cdk/.codex-plugin/skills/setup-aws-accounts/SKILL.md +2 -0
  192. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  193. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  194. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  195. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  196. package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +225 -33
  197. package/plugins/lisa-copilot/rules/reference/design-source-of-truth.md +1 -1
  198. package/plugins/lisa-copilot/rules/reference/rejection-detection.md +1 -1
  199. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  200. package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +225 -33
  201. package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +1 -1
  202. package/plugins/lisa-cursor/rules/rejection-detection-reference.mdc +1 -1
  203. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  204. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  205. package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/SKILL.md +2 -0
  206. package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/SKILL.md +2 -0
  207. package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/SKILL.md +2 -0
  208. package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/SKILL.md +2 -0
  209. package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/SKILL.md +2 -0
  210. package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/SKILL.md +2 -0
  211. package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/SKILL.md +2 -0
  212. package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
  213. package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/SKILL.md +2 -0
  214. package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/SKILL.md +2 -0
  215. package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/SKILL.md +2 -0
  216. package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/SKILL.md +2 -0
  217. package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/SKILL.md +2 -0
  218. package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/SKILL.md +2 -0
  219. package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/SKILL.md +2 -0
  220. package/plugins/lisa-expo/.codex-plugin/skills/expo-module/SKILL.md +2 -0
  221. package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/SKILL.md +2 -0
  222. package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/SKILL.md +2 -0
  223. package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/SKILL.md +2 -0
  224. package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/SKILL.md +2 -0
  225. package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/SKILL.md +2 -0
  226. package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/SKILL.md +2 -0
  227. package/plugins/lisa-expo/.codex-plugin/skills/jira-create/SKILL.md +2 -0
  228. package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/SKILL.md +2 -0
  229. package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/SKILL.md +2 -0
  230. package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/SKILL.md +2 -0
  231. package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
  232. package/plugins/lisa-expo/.codex-plugin/skills/lisa-maestro-mcp-setup/SKILL.md +2 -0
  233. package/plugins/lisa-expo/.codex-plugin/skills/local-state/SKILL.md +2 -0
  234. package/plugins/lisa-expo/.codex-plugin/skills/maestro-mcp-setup/SKILL.md +2 -0
  235. package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/SKILL.md +2 -0
  236. package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/SKILL.md +2 -0
  237. package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/SKILL.md +2 -0
  238. package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/SKILL.md +2 -0
  239. package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/SKILL.md +2 -0
  240. package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/SKILL.md +2 -0
  241. package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/SKILL.md +2 -0
  242. package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/SKILL.md +2 -0
  243. package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/SKILL.md +2 -0
  244. package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/SKILL.md +2 -0
  245. package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/SKILL.md +2 -0
  246. package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/SKILL.md +2 -0
  247. package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/SKILL.md +2 -0
  248. package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/SKILL.md +2 -0
  249. package/plugins/lisa-expo/.codex-plugin/skills/testing-library/SKILL.md +2 -0
  250. package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/SKILL.md +2 -0
  251. package/plugins/lisa-expo/.codex-plugin/skills/use-dom/SKILL.md +2 -0
  252. package/plugins/lisa-expo-agy/plugin.json +1 -1
  253. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  254. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  255. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  256. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  257. package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
  258. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/SKILL.md +2 -0
  259. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/SKILL.md +2 -0
  260. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/SKILL.md +2 -0
  261. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/SKILL.md +2 -0
  262. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/SKILL.md +2 -0
  263. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/SKILL.md +2 -0
  264. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/SKILL.md +2 -0
  265. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/SKILL.md +2 -0
  266. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/SKILL.md +2 -0
  267. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/SKILL.md +3 -1
  268. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/agents/openai.yaml +2 -2
  269. package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/SKILL.md +2 -0
  270. package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
  271. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  272. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  273. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  274. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  275. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  276. package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/SKILL.md +2 -0
  277. package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/SKILL.md +2 -0
  278. package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/SKILL.md +2 -0
  279. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  280. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  281. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  282. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  283. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  284. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/SKILL.md +2 -0
  285. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/SKILL.md +2 -0
  286. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/SKILL.md +2 -0
  287. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +2 -0
  288. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/SKILL.md +2 -0
  289. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/SKILL.md +2 -0
  290. package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/SKILL.md +2 -0
  291. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  292. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  293. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  294. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  295. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  296. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/SKILL.md +2 -0
  297. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/SKILL.md +2 -0
  298. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/SKILL.md +2 -0
  299. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/SKILL.md +2 -0
  300. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/SKILL.md +2 -0
  301. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/SKILL.md +2 -0
  302. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/SKILL.md +2 -0
  303. package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/SKILL.md +2 -0
  304. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  305. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  306. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  307. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  308. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  309. package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/SKILL.md +2 -0
  310. package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/SKILL.md +2 -0
  311. package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/SKILL.md +2 -0
  312. package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
  313. package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/SKILL.md +2 -0
  314. package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/SKILL.md +2 -0
  315. package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/SKILL.md +2 -0
  316. package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/SKILL.md +2 -0
  317. package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/SKILL.md +2 -0
  318. package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/SKILL.md +2 -0
  319. package/plugins/lisa-rails/.codex-plugin/skills/jira-create/SKILL.md +2 -0
  320. package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/SKILL.md +2 -0
  321. package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/SKILL.md +2 -0
  322. package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/SKILL.md +2 -0
  323. package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
  324. package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/SKILL.md +2 -0
  325. package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/SKILL.md +2 -0
  326. package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/SKILL.md +2 -0
  327. package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/SKILL.md +2 -0
  328. package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/SKILL.md +2 -0
  329. package/plugins/lisa-rails-agy/plugin.json +1 -1
  330. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  331. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  332. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  333. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  334. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  335. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  336. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  337. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  338. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  339. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/SKILL.md +2 -0
  340. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/SKILL.md +2 -0
  341. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/SKILL.md +2 -0
  342. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/SKILL.md +2 -0
  343. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/SKILL.md +2 -0
  344. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/SKILL.md +2 -0
  345. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/SKILL.md +2 -0
  346. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/SKILL.md +2 -0
  347. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/SKILL.md +2 -0
  348. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/SKILL.md +2 -0
  349. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/SKILL.md +2 -0
  350. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/SKILL.md +2 -0
  351. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/SKILL.md +2 -0
  352. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/SKILL.md +2 -0
  353. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/SKILL.md +2 -0
  354. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/SKILL.md +2 -0
  355. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/SKILL.md +2 -0
  356. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/SKILL.md +2 -0
  357. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/SKILL.md +2 -0
  358. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/SKILL.md +2 -0
  359. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/SKILL.md +2 -0
  360. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/SKILL.md +2 -0
  361. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/SKILL.md +2 -0
  362. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/SKILL.md +2 -0
  363. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/SKILL.md +2 -0
  364. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/SKILL.md +2 -0
  365. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/SKILL.md +2 -0
  366. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/SKILL.md +2 -0
  367. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/SKILL.md +2 -0
  368. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/SKILL.md +2 -0
  369. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/SKILL.md +2 -0
  370. package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/SKILL.md +2 -0
  371. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  372. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  373. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  374. package/plugins/src/base/hooks/worktree-binding-guard.mjs +225 -33
  375. package/plugins/src/base/rules/reference/design-source-of-truth.md +1 -1
  376. package/plugins/src/base/rules/reference/rejection-detection.md +1 -1
  377. package/scripts/generate-codex-plugin-artifacts.mjs +11 -6
@@ -38,9 +38,9 @@
38
38
  * first attempt and lets the retry through is defeated by a blind retry, which
39
39
  * is the single most likely next action. So the block stands until the session
40
40
  * states, in the acknowledgement, the absolute path it now intends to work in.
41
- * A path that does not match what the session is actually in is refused too —
42
- * that is the rejection control, and it is what stops a stale acknowledgement
43
- * copied from another agent's transcript from silently rebinding this one.
41
+ * An acknowledgement can choose the observed root, return to the initial root,
42
+ * or accept a linked target this session was explicitly offered. A selected
43
+ * target does not prove a move: the next guarded call must actually be there.
44
44
  *
45
45
  * FAILING OPEN, LOUDLY. Anything this cannot determine — no session id, no
46
46
  * cwd, not a git repository, an unreadable state file — exits 0 with a line on
@@ -71,6 +71,7 @@ const GUARDED_TOOLS = new Set(["Bash", "Write", "Edit", "MultiEdit"]);
71
71
  * on its own PreToolUse pass — which is exactly where a command string arrives.
72
72
  */
73
73
  const ACCEPT_PREFIX = "lisa-worktree-binding: accept";
74
+ const ACK_AND_SEPARATOR = Symbol("acknowledgement AND separator");
74
75
 
75
76
  /**
76
77
  * Resolve a path the way git reports one.
@@ -157,6 +158,46 @@ function mainCheckout(cwd) {
157
158
  return null;
158
159
  }
159
160
 
161
+ /** Registered roots of the bound repository, with Git path quoting disabled. */
162
+ function linkedWorktreeRoots(bound) {
163
+ const listing = git(["worktree", "list", "--porcelain", "-z"], bound);
164
+ if (listing === null) {
165
+ say(
166
+ "git could not identify linked worktrees; repository identity is NOT enforced"
167
+ );
168
+ return null;
169
+ }
170
+ return new Set(
171
+ listing
172
+ .split("\0")
173
+ .filter(record => record.startsWith("worktree "))
174
+ .map(record => realpath(record.slice("worktree ".length)))
175
+ );
176
+ }
177
+
178
+ /** Canonical common Git directory: stable identity across linked checkouts. */
179
+ function repositoryIdentity(root) {
180
+ if (typeof root !== "string") return null;
181
+ const common = git(["rev-parse", "--git-common-dir"], root);
182
+ if (common === null) {
183
+ say("git could not compare repository identity; identity is NOT enforced");
184
+ return null;
185
+ }
186
+ return realpath(resolve(root, common));
187
+ }
188
+
189
+ /** A registration is only authoritative while its live repository agrees. */
190
+ function isLinkedWorktree(
191
+ bound,
192
+ candidate,
193
+ roots = linkedWorktreeRoots(bound)
194
+ ) {
195
+ if (!roots?.has(candidate) || worktreeRoot(candidate) !== candidate)
196
+ return false;
197
+ const common = repositoryIdentity(bound);
198
+ return common !== null && common === repositoryIdentity(candidate);
199
+ }
200
+
160
201
  /**
161
202
  * How much of an executed script this guard will read, in bytes.
162
203
  *
@@ -300,6 +341,7 @@ function executedPath(segment) {
300
341
  * fooled by exactly that and was caught only by a known-answer control.
301
342
  */
302
343
  function foreignTreeIn(text, bound, cwd) {
344
+ let linkedRoots;
303
345
  const code = text
304
346
  .split("\n")
305
347
  .map(line => line.replace(/^\s*#.*$/u, ""))
@@ -320,7 +362,10 @@ function foreignTreeIn(text, bound, cwd) {
320
362
  } catch {
321
363
  continue;
322
364
  }
323
- if (root && root !== bound) return root;
365
+ if (root && root !== bound) {
366
+ if (linkedRoots === undefined) linkedRoots = linkedWorktreeRoots(bound);
367
+ if (isLinkedWorktree(bound, root, linkedRoots)) return root;
368
+ }
324
369
  }
325
370
  return null;
326
371
  }
@@ -499,10 +544,10 @@ function reachesOut(script, foreign, bound) {
499
544
  ` script: ${script}`,
500
545
  ` reaches: ${foreign}`,
501
546
  ` bound to: ${bound}`,
502
- "The directory change lives inside the file, so it happens after this",
503
- "guard has measured where the session is. Run the work from the tree it",
504
- "belongs to, or acknowledge the move:",
547
+ "The access lives inside the file, after this guard measures the session.",
548
+ "Run the work from the tree it belongs to, or acknowledge that target:",
505
549
  acceptanceLine(foreign),
550
+ "Then move to the acknowledged tree before further guarded calls.",
506
551
  ]);
507
552
  }
508
553
 
@@ -602,9 +647,8 @@ function readState(bindingKeyValue, payload) {
602
647
  /**
603
648
  * Write the session's binding state, MERGING over whatever is already there.
604
649
  *
605
- * Every caller below hands in all three lifecycle fields explicitly, so the
606
- * merge changes nothing for them — `claimedRoot: null` still clears a claim.
607
- * What it buys is that a field one writer owns is not silently dropped by
650
+ * Explicit `claimedRoot: null` still clears a claim. Merging means that a
651
+ * field one writer owns is not silently dropped by
608
652
  * another writer that had no opinion about it: `runtimeNoticed` is written by
609
653
  * {@link noticeRuntimeDrift} and read by nobody else, and a clobbering write
610
654
  * would turn its "reported once" into "reported again after the next
@@ -617,12 +661,24 @@ function readState(bindingKeyValue, payload) {
617
661
  */
618
662
  function writeState(bindingKeyValue, state, payload) {
619
663
  const file = stateFile(bindingKeyValue);
664
+ const previous = readState(bindingKeyValue, payload);
665
+ const originalRoot =
666
+ previous?.originalRoot ?? previous?.boundRoot ?? state.boundRoot;
667
+ const originalCommonDir =
668
+ previous?.originalCommonDir ?? repositoryIdentity(originalRoot);
620
669
  try {
621
670
  mkdirSync(dirname(file), { recursive: true });
622
671
  writeFileSync(
623
672
  file,
624
673
  `${JSON.stringify(
625
- { ...readState(bindingKeyValue, payload), ...state },
674
+ {
675
+ ...previous,
676
+ ...state,
677
+ // Preserve the initial root after intentional rebinds. A legacy
678
+ // state's established root is its only proven recovery anchor.
679
+ originalRoot,
680
+ originalCommonDir,
681
+ },
626
682
  null,
627
683
  2
628
684
  )}\n`
@@ -749,43 +805,161 @@ function refuse(lines) {
749
805
  }
750
806
 
751
807
  function acceptanceLine(observed) {
752
- return ` echo '${ACCEPT_PREFIX} ${observed}'`;
808
+ const literal = `${ACCEPT_PREFIX} ${observed}`.replaceAll("'", "'\\''");
809
+ return ` echo '${literal}'`;
810
+ }
811
+
812
+ /** Read literal shell words and AND separators without evaluating expansions. */
813
+ function acknowledgementWords(text) {
814
+ const words = [];
815
+ let word = "",
816
+ active = false,
817
+ quote = null;
818
+ const emit = () => {
819
+ if (active) words.push(word);
820
+ word = "";
821
+ active = false;
822
+ };
823
+ for (let index = 0; index < text.length; index += 1) {
824
+ const char = text[index];
825
+ if (quote === "'") {
826
+ if (char === "'") quote = null;
827
+ else word += char;
828
+ continue;
829
+ }
830
+ if (char === "\\") {
831
+ const next = text[index + 1];
832
+ if (next === undefined) return null;
833
+ if (quote === '"' && !['"', "\\", "$", "`", "\n"].includes(next)) {
834
+ word += char;
835
+ continue;
836
+ }
837
+ index += 1;
838
+ if (next !== "\n") {
839
+ word += next;
840
+ active = true;
841
+ }
842
+ continue;
843
+ }
844
+ if (quote === '"') {
845
+ if (char === '"') quote = null;
846
+ else if (char === "$" || char === "`") return null;
847
+ else word += char;
848
+ continue;
849
+ }
850
+ if (char === "'" || char === '"') {
851
+ quote = char;
852
+ active = true;
853
+ } else if (char === " " || char === "\t") emit();
854
+ else if (char === "\n") return null;
855
+ else if (char === "&" && text[index + 1] === "&") {
856
+ emit();
857
+ words.push(ACK_AND_SEPARATOR);
858
+ index += 1;
859
+ } else if (/[&;|<>$`*?[\]{}()]/u.test(char)) return null;
860
+ else {
861
+ word += char;
862
+ active = true;
863
+ }
864
+ }
865
+ if (quote !== null) return null;
866
+ emit();
867
+ return words;
868
+ }
869
+
870
+ /** Strip only actual shell edge whitespace in linear time. */
871
+ function acknowledgementText(command) {
872
+ let start = 0,
873
+ end = command.length;
874
+ while (start < end && " \t\n".includes(command[start])) start += 1;
875
+ while (end > start && " \t\n".includes(command[end - 1])) end -= 1;
876
+ return command.slice(start, end);
877
+ }
878
+
879
+ /** A literal echo, optionally preceded by a literal cd to the stated root. */
880
+ function acceptanceRequest(command) {
881
+ const text = acknowledgementText(command);
882
+ const words = acknowledgementWords(text.replace(/;$/u, ""));
883
+ if (!words) return null;
884
+ const direct = words.length === 2 && words[0] === "echo";
885
+ const moving =
886
+ words.length === 5 &&
887
+ words[0] === "cd" &&
888
+ typeof words[1] === "string" &&
889
+ words[2] === ACK_AND_SEPARATOR &&
890
+ words[3] === "echo";
891
+ if (!direct && !moving) return null;
892
+ const message = words.at(-1);
893
+ if (typeof message !== "string" || !message.startsWith(`${ACCEPT_PREFIX} `))
894
+ return null;
895
+ const stated = message.slice(ACCEPT_PREFIX.length + 1);
896
+ // The printed protocol names absolute roots. Empty/relative operands and
897
+ // cd's special ~, -, or -- forms cannot authorize a move.
898
+ if (!isAbsolute(stated)) return null;
899
+ const path = realpath(stated);
900
+ const destination =
901
+ moving && isAbsolute(words[1]) ? realpath(words[1]) : null;
902
+ return {
903
+ path,
904
+ validMove: !moving || (destination !== null && destination === path),
905
+ };
753
906
  }
754
907
 
755
908
  /**
756
- * Handle an acknowledgement line, or return null when the command is not one.
757
- *
758
- * The path is compared against what the session is measurably in, not against
759
- * what it says it wants. An acknowledgement naming somewhere else is the case
760
- * this is for: it means the operator is reasoning about a tree they are not in.
909
+ * Validate the initial recovery root against the identity captured at baseline.
910
+ * The current checkout may have been removed or deliberately rebound elsewhere.
761
911
  */
912
+ function isOriginalRoot(state, path) {
913
+ const original = state?.originalRoot ?? state?.boundRoot;
914
+ if (path !== original || worktreeRoot(path) !== path) return false;
915
+ // Older state can only prove the repository of its established binding.
916
+ const common = state.originalCommonDir ?? repositoryIdentity(state.boundRoot);
917
+ return common !== null && common === repositoryIdentity(path);
918
+ }
919
+
920
+ /** Acknowledgements select intent; the next call must prove actual movement. */
762
921
  function handleAcceptance(payload, observed) {
763
922
  const command = payload.tool_input?.command;
764
923
  if (typeof command !== "string" || !command.includes(ACCEPT_PREFIX))
765
924
  return null;
766
- const stated = command.slice(
767
- command.indexOf(ACCEPT_PREFIX) + ACCEPT_PREFIX.length
768
- );
769
- const match = /([^\s'"]+)/.exec(stated);
770
- const path = match ? realpath(resolve(match[1])) : null;
771
- if (path !== observed) {
925
+ const request = acceptanceRequest(command);
926
+ if (!request) return null;
927
+ const { path, validMove } = request;
928
+ const previous = readState(bindingKey(payload), payload);
929
+ const original = previous?.originalRoot ?? previous?.boundRoot;
930
+ const recovering = isOriginalRoot(previous, path);
931
+ const offered =
932
+ path === previous?.offeredRoot &&
933
+ isLinkedWorktree(previous.boundRoot, path);
934
+ if (!validMove || (path !== observed && !recovering && !offered)) {
935
+ const suggestion = observed ?? original;
772
936
  return refuse([
773
937
  `worktree-binding-guard: this acknowledgement names ${path ?? "no path"},`,
774
- `but this session is operating in ${observed}. Not rebinding.`,
775
- `If ${observed} is where you mean to work, acknowledge that path:`,
776
- acceptanceLine(observed),
938
+ "but it is not a valid move to the observed, original, or offered worktree. Not rebinding.",
939
+ ...(suggestion
940
+ ? [
941
+ "Acknowledge the measured or original worktree:",
942
+ acceptanceLine(suggestion),
943
+ ]
944
+ : []),
777
945
  ]);
778
946
  }
779
- writeState(
947
+ const written = writeState(
780
948
  bindingKey(payload),
781
949
  {
782
- boundRoot: observed,
950
+ boundRoot: path,
783
951
  claimedRoot: null,
952
+ offeredRoot: null,
784
953
  updatedAt: new Date().toISOString(),
785
954
  },
786
955
  payload
787
956
  );
788
- say(`bound to ${observed}`);
957
+ if (written)
958
+ say(
959
+ path === observed
960
+ ? `bound to ${path}`
961
+ : `binding set to ${path}; move there before further guarded calls`
962
+ );
789
963
  return 0;
790
964
  }
791
965
 
@@ -985,6 +1159,11 @@ function evaluate(payload) {
985
1159
  }
986
1160
  const binding = bindingKey(payload);
987
1161
  const observed = worktreeRoot(cwd);
1162
+ // The initial-root recovery acknowledgement also works outside any repo.
1163
+ if (GUARDED_TOOLS.has(payload.tool_name)) {
1164
+ const accepted = handleAcceptance(payload, observed);
1165
+ if (accepted !== null) return accepted;
1166
+ }
988
1167
  if (!observed) return 0;
989
1168
 
990
1169
  if (payload.hook_event_name === "SessionStart") {
@@ -996,14 +1175,18 @@ function evaluate(payload) {
996
1175
  return 0;
997
1176
  }
998
1177
  if (payload.tool_name === "EnterWorktree") {
1178
+ const previous = readState(binding, payload);
1179
+ if (
1180
+ previous?.boundRoot &&
1181
+ previous.boundRoot !== observed &&
1182
+ !isLinkedWorktree(previous.boundRoot, observed)
1183
+ )
1184
+ return 0;
999
1185
  recordClaim(payload, observed);
1000
1186
  return 0;
1001
1187
  }
1002
1188
  if (!GUARDED_TOOLS.has(payload.tool_name)) return 0;
1003
1189
 
1004
- const accepted = handleAcceptance(payload, observed);
1005
- if (accepted !== null) return accepted;
1006
-
1007
1190
  const state = readState(binding, payload);
1008
1191
  if (!state?.boundRoot) {
1009
1192
  // No baseline means SessionStart did not run for this session — an older
@@ -1024,6 +1207,11 @@ function evaluate(payload) {
1024
1207
  );
1025
1208
  return 0;
1026
1209
  }
1210
+ if (
1211
+ state.boundRoot !== observed &&
1212
+ !isLinkedWorktree(state.boundRoot, observed)
1213
+ )
1214
+ return 0;
1027
1215
  if (state.claimedRoot && state.claimedRoot !== observed) {
1028
1216
  return unconfirmedSwitch(state.claimedRoot, observed);
1029
1217
  }
@@ -1033,6 +1221,7 @@ function evaluate(payload) {
1033
1221
  {
1034
1222
  boundRoot: observed,
1035
1223
  claimedRoot: null,
1224
+ offeredRoot: null,
1036
1225
  updatedAt: new Date().toISOString(),
1037
1226
  },
1038
1227
  payload
@@ -1043,7 +1232,10 @@ function evaluate(payload) {
1043
1232
  // Last, and only once the session is provably where it should be: a script
1044
1233
  // that moves somewhere else after this check has already run.
1045
1234
  const reach = scriptReachingForeignTree(payload, observed);
1046
- if (reach) return reachesOut(reach.script, reach.foreign, observed);
1235
+ if (reach) {
1236
+ writeState(binding, { offeredRoot: reach.foreign }, payload);
1237
+ return reachesOut(reach.script, reach.foreign, observed);
1238
+ }
1047
1239
  return 0;
1048
1240
  }
1049
1241
 
@@ -6,7 +6,7 @@ alwaysApply: false
6
6
  # Design Source of Truth
7
7
 
8
8
  > Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
9
- > section below is the former eager head, maintained with the full
9
+ > section below is the former eager head, preserved verbatim; the full
10
10
  > contract follows it. Reachable on demand via [the rule index](00-rule-index.mdc).
11
11
 
12
12
  ## Design Source of Truth (load-bearing)
@@ -277,7 +277,7 @@ The state-only reading is what fails today, so a backward move is **not** suffic
277
277
  - **JIRA** — `lisa-atlassian-access operation: changelog key:<K>`; each changelog entry carries an `author` alongside its `from`/`to` status items.
278
278
  - **Linear** — `lisa-linear-access operation: history id:<ID>`; each history node carries an `actor` alongside `fromState` / `toState`.
279
279
 
280
- An actor is **this flow** when it is the configured automation identity, or when the flow's own marker note (`[lisa-repair-intake]`) sits at that transition's timestamp. Any other actor is a human. Where the surface does not expose an actor at all, the result is `unknown` — never an assumed human.
280
+ An actor is **this flow** when it is the configured automation identity, or when the flow's own marker note (`[lisa-repair-intake]`) sits at that transition's timestamp. A different actor counts as human only when the provider positively identifies a person, rather than a bot, integration, or another automation identity. Missing or ambiguous actor information yields `unknown` — never an assumed human.
281
281
 
282
282
  **A marker and a transition on the same item say nothing until you know their order.** A hold label, a comment and a lane move routinely coexist on a reversed item, and co-occurrence reads equally well in both directions — a label applied *before* a transition guards it, the same label applied *after* records that the transition was undone. Sourcing the facts, attributing them correctly and reading the artifact all pass cleanly on an invented sequence; only ordering disconfirms it. Compare timestamps explicitly and treat an unorderable pair as `unknown`.
283
283
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.72.1",
3
+ "version": "4.72.3",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.72.1",
3
+ "version": "4.72.3",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -2,6 +2,8 @@
2
2
  name: add-app-clip
3
3
  description: "Add an iOS App Clip target to…"
4
4
  ---
5
+ Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
6
+
5
7
 
6
8
  # Add an App Clip to an Expo App
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: apollo-client
3
3
  description: "writing or modifying GraphQL…"
4
4
  ---
5
+ This skill should be used when writing or modifying GraphQL operations, hooks, or mutations using Apollo Client 3.10. It enforces best practices for optimistic responses, cache updates, and TypeScript type generation. Use this skill when creating new queries/mutations, reviewing Apollo code, or troubleshooting cache issues.
6
+
5
7
 
6
8
  # Apollo Client 3.10
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: atomic-design-gluestack
3
3
  description: "Enforces atomic design…"
4
4
  ---
5
+ Enforces atomic design methodology (atoms, molecules, organisms, templates, pages) for React Native/Expo projects using Gluestack UI. This skill should be used when creating new components, validating existing component organization, reviewing component placement decisions, or planning component architecture. Use this skill to ensure components are properly categorized, placed in correct directories, and follow composition patterns appropriate to their atomic level.
6
+
5
7
 
6
8
  # Atomic Design with Gluestack UI
7
9
 
@@ -4,6 +4,8 @@ description: "Complete guide for building…"
4
4
  version: 1.0.1
5
5
  license: MIT
6
6
  ---
7
+ Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
8
+
7
9
 
8
10
  # Expo UI Guidelines
9
11
 
@@ -2,6 +2,8 @@
2
2
  name: container-view-pattern
3
3
  description: "This skill enforces the…"
4
4
  ---
5
+ This skill enforces the Container/View pattern for React components. It should be used when creating new components, validating existing components, or refactoring components to follow the separation of concerns pattern where Container handles logic and View handles presentation.
6
+
5
7
 
6
8
  # Container/View Pattern
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: cross-platform-compatibility
3
3
  description: "This skill enforces…"
4
4
  ---
5
+ This skill enforces cross-platform compatibility best practices for Expo apps targeting iOS, Android, and web. It should be used when creating new features, components, or screens to ensure they work correctly on all platforms. Use this skill when writing platform-specific code, using Platform.OS checks, creating platform-specific files (.web.tsx, .native.tsx, .ios.tsx, .android.tsx), or reviewing code for cross-platform issues.
6
+
5
7
 
6
8
  # Cross-Platform Compatibility
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: directory-structure
3
3
  description: "This skill enforces the…"
4
4
  ---
5
+ This skill enforces the project's directory structure standards when creating or moving files. Use this skill when creating new components, screens, features, hooks, utilities, or any other code files to ensure they are placed in the correct location with proper naming conventions. Also use when reviewing file placement or restructuring code.
6
+
5
7
 
6
8
  # Directory Structure Enforcement
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: e2e-coverage-gaps
3
3
  description: "Playwright/e2e coverage-gap…"
4
4
  ---
5
+ Playwright/e2e coverage-gap explorer that FEEDS THE LIFECYCLE. Use when asked to find paths the automated end-to-end suite does NOT cover — routes with no test at all, or flows that are only happy-path tested (missing error, validation, permission, empty, loading, and edge states). It inventories the app's routes and the existing Playwright tests, explores the running app to confirm each uncovered or under-covered path is real and reachable, and files bounded build-ready work for worthwhile test gaps via lisa-tracker-write. For human usability/experience issues (confusing, cramped, or broken UI), use the lisa-exploratory-qa skill instead.
6
+
5
7
 
6
8
  # E2E Coverage Gaps
7
9
 
@@ -5,6 +5,8 @@ version: 1.0.0
5
5
  license: MIT
6
6
  allowed-tools: "Bash(eas *)"
7
7
  ---
8
+ Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.
9
+
8
10
 
9
11
  # EAS Update Insights
10
12
 
@@ -4,6 +4,8 @@ description: "Guidelines for creating API…"
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  ---
7
+ Guidelines for creating API routes in Expo Router with EAS Hosting
8
+
7
9
 
8
10
  ## When to Use API Routes
9
11
 
@@ -2,6 +2,8 @@
2
2
  name: expo-brownfield
3
3
  description: "Integrate Expo and React Native…"
4
4
  ---
5
+ Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.
6
+
5
7
 
6
8
  # Expo Brownfield
7
9
 
@@ -5,6 +5,8 @@ allowed-tools: "Read,Write,Bash(node:*)"
5
5
  version: 1.0.0
6
6
  license: MIT License
7
7
  ---
8
+ Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.
9
+
8
10
 
9
11
  # EAS Workflows Skill
10
12
 
@@ -4,6 +4,8 @@ description: "Deploying Expo apps to iOS App…"
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  ---
7
+ Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes
8
+
7
9
 
8
10
  # Deployment
9
11
 
@@ -4,6 +4,8 @@ description: "Build and distribute Expo…"
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  ---
7
+ Build and distribute Expo development clients locally or via TestFlight
8
+
7
9
 
8
10
  Use EAS Build to create development clients for testing native code changes on physical devices. Use this for creating custom Expo Go clients for testing branches of your app.
9
11
 
@@ -2,6 +2,8 @@
2
2
  name: expo-env-config
3
3
  description: "creating, modifying, or…"
4
4
  ---
5
+ This skill should be used when creating, modifying, or accessing environment variables in this Expo/React Native codebase. It enforces type-safe, validated environment configuration using Zod schemas. Use this skill when adding new environment variables, setting up env validation, or writing code that reads from process.env.
6
+
5
7
 
6
8
  # Expo Environment Configuration
7
9
 
@@ -4,6 +4,8 @@ description: "Guide for creating and writing…"
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  ---
7
+ Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.
8
+
7
9
 
8
10
  # Writing Expo Modules
9
11
 
@@ -2,6 +2,8 @@
2
2
  name: expo-router-best-practices
3
3
  description: "creating new routes…"
4
4
  ---
5
+ This skill should be used when creating new routes, configuring navigation layouts, implementing deep linking, or organizing the app/ directory structure in Expo Router projects. It provides best practices for file-based routing patterns.
6
+
5
7
 
6
8
  # Expo Router Best Practices
7
9
 
@@ -4,6 +4,8 @@ description: "Set up Tailwind CSS v4 in Expo…"
4
4
  version: 1.0.0
5
5
  license: MIT
6
6
  ---
7
+ Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
8
+
7
9
 
8
10
  # Tailwind CSS Setup for Expo with react-native-css
9
11
 
@@ -2,6 +2,8 @@
2
2
  name: Expo UI Jetpack Compose
3
3
  description: "`@expo/ui/jetpack-compose`…"
4
4
  ---
5
+ `@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.
6
+
5
7
 
6
8
  > The instructions in this skill apply to SDK 55 only. For other SDK versions, refer to the Expo UI Jetpack Compose docs for that version for the most accurate information.
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: Expo UI SwiftUI
3
3
  description: "`@expo/ui/swift-ui` package…"
4
4
  ---
5
+ `@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.
6
+
5
7
 
6
8
  > The instructions in this skill apply to SDK 55 only. For other SDK versions, refer to the Expo UI SwiftUI docs for that version for the most accurate information.
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: gluestack-nativewind
3
3
  description: "This skill enforces Gluestack…"
4
4
  ---
5
+ This skill enforces Gluestack UI v3 and NativeWind v4 design patterns for consistent, performant, and maintainable styling. It should be used when creating or reviewing components, fixing styling issues, or refactoring styles to follow the constrained design system.
6
+
5
7
 
6
8
  # Gluestack NativeWind Design Patterns
7
9
 
@@ -2,6 +2,8 @@
2
2
  name: jira-add-journey
3
3
  description: "Add a Validation Journey…"
4
4
  ---
5
+ Add a Validation Journey section to an existing JIRA ticket by reading the ticket description, understanding the feature, and generating the journey steps, viewports, and assertions.
6
+
5
7
 
6
8
  # Add Validation Journey to Existing JIRA Ticket
7
9
 
@@ -3,6 +3,8 @@ name: jira-create
3
3
  description: "creating JIRA epics, stories…"
4
4
  allowed-tools: ["Read", "Glob", "LS", "Skill", "mcp__atlassian__getVisibleJiraProjects", "mcp__atlassian__getJiraProjectIssueTypesMetadata", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
+ This skill should be used when creating JIRA epics, stories, and tasks from code files or descriptions. It analyzes the provided input, determines the appropriate issue hierarchy, and creates issues with comprehensive quality requirements including test-first development and documentation.
7
+
6
8
 
7
9
  # Create JIRA Issues from $ARGUMENTS
8
10