@codyswann/lisa 2.176.1 → 2.176.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 (62) 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/skills/drive-pr-to-merge/SKILL.md +31 -5
  5. package/plugins/lisa/skills/repair-intake/SKILL.md +6 -3
  6. package/plugins/lisa-agy/plugin.json +1 -1
  7. package/plugins/lisa-agy/skills/drive-pr-to-merge/SKILL.md +31 -5
  8. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +6 -3
  9. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  12. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-copilot/skills/drive-pr-to-merge/SKILL.md +31 -5
  16. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +6 -3
  17. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cursor/skills/drive-pr-to-merge/SKILL.md +31 -5
  19. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +6 -3
  20. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo-agy/plugin.json +1 -1
  23. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  33. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  38. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  43. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails-agy/plugin.json +1 -1
  48. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  53. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  58. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/src/base/skills/drive-pr-to-merge/SKILL.md +31 -5
  61. package/plugins/src/base/skills/repair-intake/SKILL.md +6 -3
  62. package/typescript/package-lisa/package.lisa.json +4 -0
package/package.json CHANGED
@@ -91,7 +91,7 @@
91
91
  "ws": ">=8.20.1"
92
92
  },
93
93
  "name": "@codyswann/lisa",
94
- "version": "2.176.1",
94
+ "version": "2.176.3",
95
95
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
96
96
  "main": "dist/index.js",
97
97
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -25,9 +25,10 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
25
25
  resolve review comments, dismiss stale review gates — drive until merged.
26
26
  - **`report`** (diagnose & mechanically nudge only): perform just the safe,
27
27
  idempotent, non-destructive actions — ensure auto-merge is enabled and, if the
28
- PR is `BEHIND` but otherwise clean, run `gh pr update-branch`. For **anything**
29
- that would require editing code, resolving threads, or dismissing a review,
30
- **do not act** stop and return a structured blocker classification
28
+ PR is `BEHIND` but otherwise clean, run `gh pr update-branch` only when the
29
+ base branch requires strict up-to-date checks. For **anything** that would
30
+ require editing code, resolving threads, or dismissing a review, **do not
31
+ act** — stop and return a structured blocker classification
31
32
  (`merged` / `will-merge-after-resync` / `blocked:<conflict|checks|changes_requested|deploy>`)
32
33
  so the caller applies its own policy. This is the mode `repair-intake` and the
33
34
  build-intake skills use to diagnose-and-route without fixing in place.
@@ -60,8 +61,33 @@ apply; for any of (b)–(e) do not act — classify the blocker and return per t
60
61
  contract above.
61
62
 
62
63
  ### a. Branch behind base (`mergeStateStatus == BEHIND`)
63
- Once required checks are green, run `gh pr update-branch <pr>` and keep watching the
64
- new head while checks rerun.
64
+ Before proactively syncing a clean `BEHIND` PR, check whether the base branch
65
+ actually requires up-to-date branches:
66
+
67
+ ```bash
68
+ owner_repo=$(gh repo view --json nameWithOwner -q .nameWithOwner)
69
+ base=$(gh pr view <pr> --json baseRefName -q .baseRefName)
70
+ strict=$(gh api "repos/$owner_repo/rules/branches/$base" \
71
+ --jq '[.[] | select(.type == "required_status_checks") | .parameters.strict_required_status_checks_policy // false] | any')
72
+ ```
73
+
74
+ If that rules endpoint is unavailable, fall back to classic branch protection:
75
+
76
+ ```bash
77
+ strict=$(gh api "repos/$owner_repo/branches/$base/protection/required_status_checks" \
78
+ --jq '.strict // false')
79
+ ```
80
+
81
+ Only when `strict == true`, once required checks are green, run
82
+ `gh pr update-branch <pr>` and keep watching the new head while checks rerun.
83
+ If `strict == false`, do **not** update the branch solely because the base moved:
84
+ continue the mergeability loop and let GitHub merge the existing head once the
85
+ checks/reviews are acceptable. This avoids cancellation storms in repos whose CI
86
+ uses `concurrency.cancel-in-progress: true`.
87
+
88
+ Still sync when it is necessary to resolve a genuine merge conflict, and it is
89
+ acceptable to perform one final sync immediately before a direct merge if the
90
+ merge attempt proves the head must be updated.
65
91
 
66
92
  ### b. Sync/merge conflict
67
93
  If `gh pr update-branch` reports a conflict (or `mergeStateStatus == DIRTY`):
@@ -393,9 +393,12 @@ drive-pr-to-merge pr=<n> on_blocker=report
393
393
  ```
394
394
 
395
395
  In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
396
- PR is `BEHIND`-but-clean; it never edits code, resolves threads, or dismisses reviews. It returns a
397
- classification (`merged` / `will-merge-after-resync` / `blocked:<reason>`). On a `merged` /
398
- `will-merge-after-resync` result,
396
+ PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
397
+ strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
398
+ If strict checks are off, it does not update the branch solely because the base moved; that avoids
399
+ CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
400
+ never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
401
+ `will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
399
402
  record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
400
403
  the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
401
404
  step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.176.1",
3
+ "version": "2.176.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -25,9 +25,10 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
25
25
  resolve review comments, dismiss stale review gates — drive until merged.
26
26
  - **`report`** (diagnose & mechanically nudge only): perform just the safe,
27
27
  idempotent, non-destructive actions — ensure auto-merge is enabled and, if the
28
- PR is `BEHIND` but otherwise clean, run `gh pr update-branch`. For **anything**
29
- that would require editing code, resolving threads, or dismissing a review,
30
- **do not act** stop and return a structured blocker classification
28
+ PR is `BEHIND` but otherwise clean, run `gh pr update-branch` only when the
29
+ base branch requires strict up-to-date checks. For **anything** that would
30
+ require editing code, resolving threads, or dismissing a review, **do not
31
+ act** — stop and return a structured blocker classification
31
32
  (`merged` / `will-merge-after-resync` / `blocked:<conflict|checks|changes_requested|deploy>`)
32
33
  so the caller applies its own policy. This is the mode `repair-intake` and the
33
34
  build-intake skills use to diagnose-and-route without fixing in place.
@@ -60,8 +61,33 @@ apply; for any of (b)–(e) do not act — classify the blocker and return per t
60
61
  contract above.
61
62
 
62
63
  ### a. Branch behind base (`mergeStateStatus == BEHIND`)
63
- Once required checks are green, run `gh pr update-branch <pr>` and keep watching the
64
- new head while checks rerun.
64
+ Before proactively syncing a clean `BEHIND` PR, check whether the base branch
65
+ actually requires up-to-date branches:
66
+
67
+ ```bash
68
+ owner_repo=$(gh repo view --json nameWithOwner -q .nameWithOwner)
69
+ base=$(gh pr view <pr> --json baseRefName -q .baseRefName)
70
+ strict=$(gh api "repos/$owner_repo/rules/branches/$base" \
71
+ --jq '[.[] | select(.type == "required_status_checks") | .parameters.strict_required_status_checks_policy // false] | any')
72
+ ```
73
+
74
+ If that rules endpoint is unavailable, fall back to classic branch protection:
75
+
76
+ ```bash
77
+ strict=$(gh api "repos/$owner_repo/branches/$base/protection/required_status_checks" \
78
+ --jq '.strict // false')
79
+ ```
80
+
81
+ Only when `strict == true`, once required checks are green, run
82
+ `gh pr update-branch <pr>` and keep watching the new head while checks rerun.
83
+ If `strict == false`, do **not** update the branch solely because the base moved:
84
+ continue the mergeability loop and let GitHub merge the existing head once the
85
+ checks/reviews are acceptable. This avoids cancellation storms in repos whose CI
86
+ uses `concurrency.cancel-in-progress: true`.
87
+
88
+ Still sync when it is necessary to resolve a genuine merge conflict, and it is
89
+ acceptable to perform one final sync immediately before a direct merge if the
90
+ merge attempt proves the head must be updated.
65
91
 
66
92
  ### b. Sync/merge conflict
67
93
  If `gh pr update-branch` reports a conflict (or `mergeStateStatus == DIRTY`):
@@ -393,9 +393,12 @@ drive-pr-to-merge pr=<n> on_blocker=report
393
393
  ```
394
394
 
395
395
  In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
396
- PR is `BEHIND`-but-clean; it never edits code, resolves threads, or dismisses reviews. It returns a
397
- classification (`merged` / `will-merge-after-resync` / `blocked:<reason>`). On a `merged` /
398
- `will-merge-after-resync` result,
396
+ PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
397
+ strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
398
+ If strict checks are off, it does not update the branch solely because the base moved; that avoids
399
+ CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
400
+ never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
401
+ `will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
399
402
  record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
400
403
  the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
401
404
  step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -25,9 +25,10 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
25
25
  resolve review comments, dismiss stale review gates — drive until merged.
26
26
  - **`report`** (diagnose & mechanically nudge only): perform just the safe,
27
27
  idempotent, non-destructive actions — ensure auto-merge is enabled and, if the
28
- PR is `BEHIND` but otherwise clean, run `gh pr update-branch`. For **anything**
29
- that would require editing code, resolving threads, or dismissing a review,
30
- **do not act** stop and return a structured blocker classification
28
+ PR is `BEHIND` but otherwise clean, run `gh pr update-branch` only when the
29
+ base branch requires strict up-to-date checks. For **anything** that would
30
+ require editing code, resolving threads, or dismissing a review, **do not
31
+ act** — stop and return a structured blocker classification
31
32
  (`merged` / `will-merge-after-resync` / `blocked:<conflict|checks|changes_requested|deploy>`)
32
33
  so the caller applies its own policy. This is the mode `repair-intake` and the
33
34
  build-intake skills use to diagnose-and-route without fixing in place.
@@ -60,8 +61,33 @@ apply; for any of (b)–(e) do not act — classify the blocker and return per t
60
61
  contract above.
61
62
 
62
63
  ### a. Branch behind base (`mergeStateStatus == BEHIND`)
63
- Once required checks are green, run `gh pr update-branch <pr>` and keep watching the
64
- new head while checks rerun.
64
+ Before proactively syncing a clean `BEHIND` PR, check whether the base branch
65
+ actually requires up-to-date branches:
66
+
67
+ ```bash
68
+ owner_repo=$(gh repo view --json nameWithOwner -q .nameWithOwner)
69
+ base=$(gh pr view <pr> --json baseRefName -q .baseRefName)
70
+ strict=$(gh api "repos/$owner_repo/rules/branches/$base" \
71
+ --jq '[.[] | select(.type == "required_status_checks") | .parameters.strict_required_status_checks_policy // false] | any')
72
+ ```
73
+
74
+ If that rules endpoint is unavailable, fall back to classic branch protection:
75
+
76
+ ```bash
77
+ strict=$(gh api "repos/$owner_repo/branches/$base/protection/required_status_checks" \
78
+ --jq '.strict // false')
79
+ ```
80
+
81
+ Only when `strict == true`, once required checks are green, run
82
+ `gh pr update-branch <pr>` and keep watching the new head while checks rerun.
83
+ If `strict == false`, do **not** update the branch solely because the base moved:
84
+ continue the mergeability loop and let GitHub merge the existing head once the
85
+ checks/reviews are acceptable. This avoids cancellation storms in repos whose CI
86
+ uses `concurrency.cancel-in-progress: true`.
87
+
88
+ Still sync when it is necessary to resolve a genuine merge conflict, and it is
89
+ acceptable to perform one final sync immediately before a direct merge if the
90
+ merge attempt proves the head must be updated.
65
91
 
66
92
  ### b. Sync/merge conflict
67
93
  If `gh pr update-branch` reports a conflict (or `mergeStateStatus == DIRTY`):
@@ -393,9 +393,12 @@ drive-pr-to-merge pr=<n> on_blocker=report
393
393
  ```
394
394
 
395
395
  In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
396
- PR is `BEHIND`-but-clean; it never edits code, resolves threads, or dismisses reviews. It returns a
397
- classification (`merged` / `will-merge-after-resync` / `blocked:<reason>`). On a `merged` /
398
- `will-merge-after-resync` result,
396
+ PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
397
+ strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
398
+ If strict checks are off, it does not update the branch solely because the base moved; that avoids
399
+ CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
400
+ never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
401
+ `will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
399
402
  record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
400
403
  the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
401
404
  step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.176.1",
3
+ "version": "2.176.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -25,9 +25,10 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
25
25
  resolve review comments, dismiss stale review gates — drive until merged.
26
26
  - **`report`** (diagnose & mechanically nudge only): perform just the safe,
27
27
  idempotent, non-destructive actions — ensure auto-merge is enabled and, if the
28
- PR is `BEHIND` but otherwise clean, run `gh pr update-branch`. For **anything**
29
- that would require editing code, resolving threads, or dismissing a review,
30
- **do not act** stop and return a structured blocker classification
28
+ PR is `BEHIND` but otherwise clean, run `gh pr update-branch` only when the
29
+ base branch requires strict up-to-date checks. For **anything** that would
30
+ require editing code, resolving threads, or dismissing a review, **do not
31
+ act** — stop and return a structured blocker classification
31
32
  (`merged` / `will-merge-after-resync` / `blocked:<conflict|checks|changes_requested|deploy>`)
32
33
  so the caller applies its own policy. This is the mode `repair-intake` and the
33
34
  build-intake skills use to diagnose-and-route without fixing in place.
@@ -60,8 +61,33 @@ apply; for any of (b)–(e) do not act — classify the blocker and return per t
60
61
  contract above.
61
62
 
62
63
  ### a. Branch behind base (`mergeStateStatus == BEHIND`)
63
- Once required checks are green, run `gh pr update-branch <pr>` and keep watching the
64
- new head while checks rerun.
64
+ Before proactively syncing a clean `BEHIND` PR, check whether the base branch
65
+ actually requires up-to-date branches:
66
+
67
+ ```bash
68
+ owner_repo=$(gh repo view --json nameWithOwner -q .nameWithOwner)
69
+ base=$(gh pr view <pr> --json baseRefName -q .baseRefName)
70
+ strict=$(gh api "repos/$owner_repo/rules/branches/$base" \
71
+ --jq '[.[] | select(.type == "required_status_checks") | .parameters.strict_required_status_checks_policy // false] | any')
72
+ ```
73
+
74
+ If that rules endpoint is unavailable, fall back to classic branch protection:
75
+
76
+ ```bash
77
+ strict=$(gh api "repos/$owner_repo/branches/$base/protection/required_status_checks" \
78
+ --jq '.strict // false')
79
+ ```
80
+
81
+ Only when `strict == true`, once required checks are green, run
82
+ `gh pr update-branch <pr>` and keep watching the new head while checks rerun.
83
+ If `strict == false`, do **not** update the branch solely because the base moved:
84
+ continue the mergeability loop and let GitHub merge the existing head once the
85
+ checks/reviews are acceptable. This avoids cancellation storms in repos whose CI
86
+ uses `concurrency.cancel-in-progress: true`.
87
+
88
+ Still sync when it is necessary to resolve a genuine merge conflict, and it is
89
+ acceptable to perform one final sync immediately before a direct merge if the
90
+ merge attempt proves the head must be updated.
65
91
 
66
92
  ### b. Sync/merge conflict
67
93
  If `gh pr update-branch` reports a conflict (or `mergeStateStatus == DIRTY`):
@@ -393,9 +393,12 @@ drive-pr-to-merge pr=<n> on_blocker=report
393
393
  ```
394
394
 
395
395
  In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
396
- PR is `BEHIND`-but-clean; it never edits code, resolves threads, or dismisses reviews. It returns a
397
- classification (`merged` / `will-merge-after-resync` / `blocked:<reason>`). On a `merged` /
398
- `will-merge-after-resync` result,
396
+ PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
397
+ strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
398
+ If strict checks are off, it does not update the branch solely because the base moved; that avoids
399
+ CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
400
+ never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
401
+ `will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
399
402
  record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
400
403
  the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
401
404
  step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.176.1",
3
+ "version": "2.176.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": "2.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.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": "2.176.1",
3
+ "version": "2.176.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": "2.176.1",
3
+ "version": "2.176.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-harper-fabric",
3
- "version": "2.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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.176.1",
3
+ "version": "2.176.3",
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"
@@ -25,9 +25,10 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
25
25
  resolve review comments, dismiss stale review gates — drive until merged.
26
26
  - **`report`** (diagnose & mechanically nudge only): perform just the safe,
27
27
  idempotent, non-destructive actions — ensure auto-merge is enabled and, if the
28
- PR is `BEHIND` but otherwise clean, run `gh pr update-branch`. For **anything**
29
- that would require editing code, resolving threads, or dismissing a review,
30
- **do not act** stop and return a structured blocker classification
28
+ PR is `BEHIND` but otherwise clean, run `gh pr update-branch` only when the
29
+ base branch requires strict up-to-date checks. For **anything** that would
30
+ require editing code, resolving threads, or dismissing a review, **do not
31
+ act** — stop and return a structured blocker classification
31
32
  (`merged` / `will-merge-after-resync` / `blocked:<conflict|checks|changes_requested|deploy>`)
32
33
  so the caller applies its own policy. This is the mode `repair-intake` and the
33
34
  build-intake skills use to diagnose-and-route without fixing in place.
@@ -60,8 +61,33 @@ apply; for any of (b)–(e) do not act — classify the blocker and return per t
60
61
  contract above.
61
62
 
62
63
  ### a. Branch behind base (`mergeStateStatus == BEHIND`)
63
- Once required checks are green, run `gh pr update-branch <pr>` and keep watching the
64
- new head while checks rerun.
64
+ Before proactively syncing a clean `BEHIND` PR, check whether the base branch
65
+ actually requires up-to-date branches:
66
+
67
+ ```bash
68
+ owner_repo=$(gh repo view --json nameWithOwner -q .nameWithOwner)
69
+ base=$(gh pr view <pr> --json baseRefName -q .baseRefName)
70
+ strict=$(gh api "repos/$owner_repo/rules/branches/$base" \
71
+ --jq '[.[] | select(.type == "required_status_checks") | .parameters.strict_required_status_checks_policy // false] | any')
72
+ ```
73
+
74
+ If that rules endpoint is unavailable, fall back to classic branch protection:
75
+
76
+ ```bash
77
+ strict=$(gh api "repos/$owner_repo/branches/$base/protection/required_status_checks" \
78
+ --jq '.strict // false')
79
+ ```
80
+
81
+ Only when `strict == true`, once required checks are green, run
82
+ `gh pr update-branch <pr>` and keep watching the new head while checks rerun.
83
+ If `strict == false`, do **not** update the branch solely because the base moved:
84
+ continue the mergeability loop and let GitHub merge the existing head once the
85
+ checks/reviews are acceptable. This avoids cancellation storms in repos whose CI
86
+ uses `concurrency.cancel-in-progress: true`.
87
+
88
+ Still sync when it is necessary to resolve a genuine merge conflict, and it is
89
+ acceptable to perform one final sync immediately before a direct merge if the
90
+ merge attempt proves the head must be updated.
65
91
 
66
92
  ### b. Sync/merge conflict
67
93
  If `gh pr update-branch` reports a conflict (or `mergeStateStatus == DIRTY`):
@@ -393,9 +393,12 @@ drive-pr-to-merge pr=<n> on_blocker=report
393
393
  ```
394
394
 
395
395
  In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
396
- PR is `BEHIND`-but-clean; it never edits code, resolves threads, or dismisses reviews. It returns a
397
- classification (`merged` / `will-merge-after-resync` / `blocked:<reason>`). On a `merged` /
398
- `will-merge-after-resync` result,
396
+ PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
397
+ strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
398
+ If strict checks are off, it does not update the branch solely because the base moved; that avoids
399
+ CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
400
+ never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
401
+ `will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
399
402
  record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
400
403
  the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
401
404
  step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
@@ -31,6 +31,8 @@
31
31
  "esbuild": ">=0.28.1",
32
32
  "handlebars": ">=4.7.9",
33
33
  "lodash": ">=4.18.1",
34
+ "multer": ">=2.2.0",
35
+ "undici": ">=6.27.0",
34
36
  "vite": ">=8.0.16",
35
37
  "ws": ">=8.21.0",
36
38
  "form-data": ">=4.0.6"
@@ -41,6 +43,8 @@
41
43
  "esbuild": ">=0.28.1",
42
44
  "handlebars": ">=4.7.9",
43
45
  "lodash": ">=4.18.1",
46
+ "multer": ">=2.2.0",
47
+ "undici": ">=6.27.0",
44
48
  "vite": "^8.0.16",
45
49
  "ws": ">=8.21.0",
46
50
  "form-data": ">=4.0.6"