@codyswann/lisa 2.186.10 → 2.186.11

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 (53) 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 +27 -10
  53. package/typescript/copy-overwrite/scripts/check-verification-coverage.mjs +27 -9
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.10",
96
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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.10",
3
+ "version": "2.186.11",
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"
@@ -18,33 +18,50 @@
18
18
  # and standalone `cd && claude` sessions then resolve every enabled plugin.
19
19
  #
20
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);
21
+ # - only in a LINKED git worktree (its private git dir differs from the shared
22
+ # common dir); the primary checkout is handled by `lisa apply`. This catches
23
+ # worktrees created anywhere (`git worktree add ../feature`), not just under
24
+ # .claude/worktrees;
23
25
  # - only on a branch checkout ($3 = 1), never a file checkout;
24
26
  # - only once per worktree (a sentinel in the worktree's private git dir), so
25
27
  # ordinary branch switches do not re-run 10+ installs;
26
28
  # - only when `claude` and `jq` are on PATH and settings exist (skips CI/remote);
29
+ # - each Claude call is time-bounded (when a `timeout` binary exists) so a
30
+ # stalled network can't hang `git worktree add` past the WorktreeCreate budget;
27
31
  # - best-effort — never blocks or fails the checkout.
28
32
 
33
+ # Run the Claude CLI with a wall-clock bound when `timeout`/`gtimeout` is
34
+ # available, so a hung network call can't stall worktree creation indefinitely.
35
+ _lisa_claude() {
36
+ if command -v timeout >/dev/null 2>&1; then
37
+ timeout 45 claude "$@"
38
+ elif command -v gtimeout >/dev/null 2>&1; then
39
+ gtimeout 45 claude "$@"
40
+ else
41
+ claude "$@"
42
+ fi
43
+ }
44
+
29
45
  _lisa_bootstrap_worktree_plugins() {
30
46
  # $3 == 1 -> branch checkout (worktree add / branch switch); 0 -> file checkout
31
47
  [ "${3:-1}" = "1" ] || return 0
32
48
  command -v claude >/dev/null 2>&1 || return 0
33
49
  command -v jq >/dev/null 2>&1 || return 0
34
50
 
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
51
+ # Only LINKED worktrees need bootstrapping — detect via git metadata rather
52
+ # than a path substring, so worktrees created outside .claude/worktrees still
53
+ # get their project-scoped installs. Equal dirs ⇒ primary checkout ⇒ skip.
54
+ _gitdir="$(git rev-parse --git-dir 2>/dev/null || echo .git)"
55
+ _common_gitdir="$(git rev-parse --git-common-dir 2>/dev/null || echo "$_gitdir")"
56
+ [ "$_gitdir" != "$_common_gitdir" ] || return 0
40
57
 
58
+ _root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
41
59
  _settings="$_root/.claude/settings.json"
42
60
  [ -f "$_settings" ] || return 0
43
61
 
44
62
  # Per-worktree sentinel lives in the worktree's private git dir
45
63
  # (<main>/.git/worktrees/<name>), so it neither pollutes the tree nor leaks to
46
64
  # other worktrees, and survives branch switches.
47
- _gitdir="$(git rev-parse --git-dir 2>/dev/null || echo .git)"
48
65
  _sentinel="$_gitdir/lisa-plugins-bootstrapped"
49
66
  [ -f "$_sentinel" ] && return 0
50
67
 
@@ -53,14 +70,14 @@ _lisa_bootstrap_worktree_plugins() {
53
70
  [ -n "$_plugins" ] || return 0
54
71
 
55
72
  echo "🔌 Bootstrapping Claude Code plugins for new worktree (scope: project)…"
56
- claude plugin marketplace update lisa >/dev/null 2>&1 || true
73
+ _lisa_claude plugin marketplace update lisa >/dev/null 2>&1 || true
57
74
  _had_failure=0
58
75
  for _p in $_plugins; do
59
76
  # Skip ids with shell-unsafe characters before interpolating into the CLI.
60
77
  case "$_p" in
61
78
  *[!A-Za-z0-9@._/-]*) continue ;;
62
79
  esac
63
- if claude plugin install "$_p" --scope project >/dev/null 2>&1; then
80
+ if _lisa_claude plugin install "$_p" --scope project >/dev/null 2>&1; then
64
81
  echo " ✓ $_p"
65
82
  else
66
83
  echo " ⚠ $_p (skipped)"
@@ -52,6 +52,7 @@ function parseLabels(value) {
52
52
  * @param {string | undefined} input.prNumber - Pull request number
53
53
  * @param {string | undefined} input.token - GitHub token
54
54
  * @param {typeof fetch} [input.fetchImpl] - Fetch implementation for tests
55
+ * @param {number} [input.timeoutMs] - Abort the request after this many ms
55
56
  * @returns {Promise<string[] | null>} Live labels, or null when context is absent
56
57
  */
57
58
  export async function fetchLivePullRequestLabels({
@@ -59,6 +60,7 @@ export async function fetchLivePullRequestLabels({
59
60
  prNumber,
60
61
  token,
61
62
  fetchImpl = globalThis.fetch,
63
+ timeoutMs = 10000,
62
64
  }) {
63
65
  if (!repository || !prNumber || !token) {
64
66
  return null;
@@ -67,16 +69,32 @@ export async function fetchLivePullRequestLabels({
67
69
  throw new Error("Live label lookup requires a fetch implementation.");
68
70
  }
69
71
 
70
- const response = await fetchImpl(
71
- `https://api.github.com/repos/${repository}/pulls/${prNumber}`,
72
- {
73
- headers: {
74
- Accept: "application/vnd.github+json",
75
- Authorization: `Bearer ${token}`,
76
- "X-GitHub-Api-Version": "2022-11-28",
77
- },
72
+ // Bound the request so a stalled GitHub connection can't hang the gate until
73
+ // the outer CI timeout kills the job.
74
+ let response;
75
+ try {
76
+ response = await fetchImpl(
77
+ `https://api.github.com/repos/${repository}/pulls/${prNumber}`,
78
+ {
79
+ headers: {
80
+ Accept: "application/vnd.github+json",
81
+ Authorization: `Bearer ${token}`,
82
+ "X-GitHub-Api-Version": "2022-11-28",
83
+ },
84
+ signal: AbortSignal.timeout(timeoutMs),
85
+ }
86
+ );
87
+ } catch (error) {
88
+ if (
89
+ error &&
90
+ (error.name === "TimeoutError" || error.name === "AbortError")
91
+ ) {
92
+ throw new Error(
93
+ `Failed to fetch live PR labels: GitHub API request timed out after ${timeoutMs}ms.`
94
+ );
78
95
  }
79
- );
96
+ throw error;
97
+ }
80
98
  if (!response.ok) {
81
99
  throw new Error(
82
100
  `Failed to fetch live PR labels: GitHub API returned ${response.status}.`