@codyswann/lisa 2.186.4 → 2.186.6

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 (54) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa-agy/plugin.json +1 -1
  5. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  8. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-expo-agy/plugin.json +1 -1
  15. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  20. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  25. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  30. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  35. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-rails-agy/plugin.json +1 -1
  40. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  45. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  50. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  52. package/typescript/copy-contents/.husky/post-checkout +83 -0
  53. package/typescript/copy-overwrite/.claude/hooks/worktree-create.sh +77 -0
  54. package/typescript/merge/.claude/settings.json +13 -0
package/package.json CHANGED
@@ -93,7 +93,7 @@
93
93
  "ws": ">=8.20.1"
94
94
  },
95
95
  "name": "@codyswann/lisa",
96
- "version": "2.186.4",
96
+ "version": "2.186.6",
97
97
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
98
98
  "main": "dist/index.js",
99
99
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
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": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Expo and 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": "2.186.4",
3
+ "version": "2.186.6",
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": "2.186.4",
3
+ "version": "2.186.6",
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": "2.186.4",
3
+ "version": "2.186.6",
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-harper-fabric",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, 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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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-wiki",
3
- "version": "2.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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.186.4",
3
+ "version": "2.186.6",
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"
@@ -0,0 +1,83 @@
1
+ # BEGIN: AI GUARDRAILS
2
+
3
+ # Worktree plugin bootstrap.
4
+ #
5
+ # A git worktree is a DISTINCT project path to Claude Code, so the plugins
6
+ # enabled in .claude/settings.json are "enabled in project settings but isn't
7
+ # installed here" for the worktree until `claude plugin install --scope project`
8
+ # runs against that path. The result: Lisa's guardrail hooks (block-no-verify,
9
+ # the verification gate, inject-rules) AND the other managed plugins
10
+ # (coderabbit / sentry / atlassian / safety-net / …) load ZERO hooks in a
11
+ # worktree session started as `cd <worktree> && claude`. (A `claude -w` session
12
+ # inherits the marketplace plugins, but the project-scoped ones still report
13
+ # "not installed here".)
14
+ #
15
+ # git fires post-checkout INSIDE the new worktree at `git worktree add` time
16
+ # (which `claude -w` and Fleet both use), so this is a deadlock-free place to
17
+ # seed those installs once, before any session loads plugins. Both `claude -w`
18
+ # and standalone `cd && claude` sessions then resolve every enabled plugin.
19
+ #
20
+ # Guards keep it cheap and safe:
21
+ # - only inside a *.claude/worktrees/* path (the main checkout is handled by
22
+ # `lisa apply`'s plugin registration);
23
+ # - only on a branch checkout ($3 = 1), never a file checkout;
24
+ # - only once per worktree (a sentinel in the worktree's private git dir), so
25
+ # ordinary branch switches do not re-run 10+ installs;
26
+ # - only when `claude` and `jq` are on PATH and settings exist (skips CI/remote);
27
+ # - best-effort — never blocks or fails the checkout.
28
+
29
+ _lisa_bootstrap_worktree_plugins() {
30
+ # $3 == 1 -> branch checkout (worktree add / branch switch); 0 -> file checkout
31
+ [ "${3:-1}" = "1" ] || return 0
32
+ command -v claude >/dev/null 2>&1 || return 0
33
+ command -v jq >/dev/null 2>&1 || return 0
34
+
35
+ _root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
36
+ case "$_root" in
37
+ */.claude/worktrees/*) : ;;
38
+ *) return 0 ;; # main checkout: `lisa apply` installs plugins there
39
+ esac
40
+
41
+ _settings="$_root/.claude/settings.json"
42
+ [ -f "$_settings" ] || return 0
43
+
44
+ # Per-worktree sentinel lives in the worktree's private git dir
45
+ # (<main>/.git/worktrees/<name>), so it neither pollutes the tree nor leaks to
46
+ # other worktrees, and survives branch switches.
47
+ _gitdir="$(git rev-parse --git-dir 2>/dev/null || echo .git)"
48
+ _sentinel="$_gitdir/lisa-plugins-bootstrapped"
49
+ [ -f "$_sentinel" ] && return 0
50
+
51
+ # Only the truthy entries — an explicit `false` means "disabled", not "install".
52
+ _plugins="$(jq -r '(.enabledPlugins // {}) | to_entries[] | select(.value == true) | .key' "$_settings" 2>/dev/null)"
53
+ [ -n "$_plugins" ] || return 0
54
+
55
+ echo "🔌 Bootstrapping Claude Code plugins for new worktree (scope: project)…"
56
+ claude plugin marketplace update lisa >/dev/null 2>&1 || true
57
+ _had_failure=0
58
+ for _p in $_plugins; do
59
+ # Skip ids with shell-unsafe characters before interpolating into the CLI.
60
+ case "$_p" in
61
+ *[!A-Za-z0-9@._/-]*) continue ;;
62
+ esac
63
+ if claude plugin install "$_p" --scope project >/dev/null 2>&1; then
64
+ echo " ✓ $_p"
65
+ else
66
+ echo " ⚠ $_p (skipped)"
67
+ _had_failure=1
68
+ fi
69
+ done
70
+
71
+ # Mark bootstrapped only when every install succeeded, so a transient failure
72
+ # retries on the next checkout instead of being skipped forever.
73
+ if [ "$_had_failure" = "0" ]; then
74
+ : >"$_sentinel" 2>/dev/null || true
75
+ fi
76
+ }
77
+
78
+ # Never let a bootstrap hiccup block the checkout.
79
+ _lisa_bootstrap_worktree_plugins "$@" || true
80
+
81
+ exit 0
82
+
83
+ # END: AI GUARDRAILS
@@ -0,0 +1,77 @@
1
+ #!/bin/sh
2
+ # This file is managed by Lisa.
3
+ # Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ #
5
+ # WorktreeCreate hook — fast-path setup for `claude -w` / `isolation: worktree`.
6
+ #
7
+ # Claude Code REPLACES its default git worktree creation with this hook, so it
8
+ # MUST: create the worktree, print ONLY its absolute path on stdout, and exit 0.
9
+ # Any non-zero exit, or extra text on stdout, aborts/breaks worktree creation —
10
+ # so every git command redirects its output off stdout, and progress goes to
11
+ # stderr (NOT /dev/tty, which is "not configured" in headless `-p`/CI sessions).
12
+ #
13
+ # It mirrors Claude's default layout — <cwd>/.claude/worktrees/<name> on a fresh
14
+ # `worktree-<name>` branch — so behavior is unchanged; the value is clean,
15
+ # pre-TUI output and an explicit, durable creation path. The plugin bootstrap
16
+ # itself is done by the `post-checkout` hook that `git worktree add` fires, so
17
+ # `claude -w` and standalone `cd && claude` sessions converge on the same state.
18
+ #
19
+ # Payload (observed, Claude Code stdin):
20
+ # { "name": "<worktree>", "cwd": "<project root>", "hook_event_name": ... }
21
+
22
+ _log() { echo "$*" >&2; }
23
+
24
+ _payload="$(cat)"
25
+
26
+ if command -v jq >/dev/null 2>&1; then
27
+ _name="$(printf '%s' "$_payload" | jq -r '.name // .worktree_name // empty' 2>/dev/null)"
28
+ _cwd="$(printf '%s' "$_payload" | jq -r '.cwd // empty' 2>/dev/null)"
29
+ fi
30
+
31
+ # A new worktree needs a name; without one (or jq) we cannot honor the contract.
32
+ if [ -z "${_name:-}" ]; then
33
+ _log "WorktreeCreate: no worktree name in payload; aborting."
34
+ exit 1
35
+ fi
36
+
37
+ # The name is interpolated into a filesystem path and a git ref, so reject path
38
+ # traversal/separators, a leading dash, and any character outside a safe slug.
39
+ case "$_name" in
40
+ *..* | /* | -* | *[!A-Za-z0-9._-]*)
41
+ _log "WorktreeCreate: unsafe worktree name '$_name'; aborting."
42
+ exit 1
43
+ ;;
44
+ esac
45
+
46
+ _root="${_cwd:-$(pwd)}"
47
+ _base="$_root/.claude/worktrees"
48
+ _path="$_base/$_name"
49
+ _wt_branch="worktree-$_name"
50
+
51
+ # Idempotent: an existing worktree just gets its path returned.
52
+ if [ -d "$_path" ]; then
53
+ _log "Worktree already exists: $_path"
54
+ printf '%s\n' "$_path"
55
+ exit 0
56
+ fi
57
+
58
+ mkdir -p "$_base" 2>/dev/null || true
59
+ _log "Creating worktree $_path (branch: $_wt_branch)…"
60
+
61
+ # Reuse the worktree branch if it already exists, else create it from HEAD.
62
+ # All git output is kept off stdout (its "Preparing worktree…" line would
63
+ # corrupt the path contract and hang Claude).
64
+ if git -C "$_root" show-ref --verify --quiet "refs/heads/$_wt_branch" 2>/dev/null; then
65
+ git -C "$_root" worktree add "$_path" "$_wt_branch" >/dev/null 2>&1
66
+ else
67
+ git -C "$_root" worktree add -b "$_wt_branch" "$_path" HEAD >/dev/null 2>&1
68
+ fi
69
+
70
+ if [ ! -d "$_path" ]; then
71
+ _log "WorktreeCreate: git worktree add failed for $_path."
72
+ exit 1
73
+ fi
74
+
75
+ # THE ONLY thing on stdout: the absolute worktree path.
76
+ printf '%s\n' "$_path"
77
+ exit 0
@@ -30,5 +30,18 @@
30
30
  "permissions": {
31
31
  "deny": ["Read(./.entire/metadata/**)"]
32
32
  },
33
+ "hooks": {
34
+ "WorktreeCreate": [
35
+ {
36
+ "hooks": [
37
+ {
38
+ "type": "command",
39
+ "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/worktree-create.sh",
40
+ "timeout": 60000
41
+ }
42
+ ]
43
+ }
44
+ ]
45
+ },
33
46
  "plansDirectory": "./plans"
34
47
  }