@codyswann/lisa 2.155.2 → 2.155.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 (61) 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/rules/reference/config-resolution.md +15 -6
  5. package/plugins/lisa/skills/doctor/SKILL.md +6 -2
  6. package/plugins/lisa/skills/sync-down/SKILL.md +9 -4
  7. package/plugins/lisa-agy/plugin.json +1 -1
  8. package/plugins/lisa-agy/skills/doctor/SKILL.md +6 -2
  9. package/plugins/lisa-agy/skills/sync-down/SKILL.md +9 -4
  10. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  13. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-copilot/rules/reference/config-resolution.md +15 -6
  17. package/plugins/lisa-copilot/skills/doctor/SKILL.md +6 -2
  18. package/plugins/lisa-copilot/skills/sync-down/SKILL.md +9 -4
  19. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +15 -6
  21. package/plugins/lisa-cursor/skills/doctor/SKILL.md +6 -2
  22. package/plugins/lisa-cursor/skills/sync-down/SKILL.md +9 -4
  23. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo-agy/plugin.json +1 -1
  26. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  36. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  41. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails-agy/plugin.json +1 -1
  46. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  51. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  56. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/src/base/rules/reference/config-resolution.md +15 -6
  59. package/plugins/src/base/skills/doctor/SKILL.md +6 -2
  60. package/plugins/src/base/skills/sync-down/SKILL.md +9 -4
  61. package/scripts/migrate-deploy-order.sh +3 -1
package/package.json CHANGED
@@ -84,7 +84,7 @@
84
84
  "lodash": ">=4.18.1"
85
85
  },
86
86
  "name": "@codyswann/lisa",
87
- "version": "2.155.2",
87
+ "version": "2.155.3",
88
88
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
89
89
  "main": "dist/index.js",
90
90
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.3",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -404,9 +404,15 @@ Rules:
404
404
 
405
405
  - **Single-environment projects** (one entry in `deploy.branches`) may omit
406
406
  `deploy.order`; the derived chain is empty and the back-sync no-ops.
407
- - **Multi-environment projects MUST set `deploy.order`** for config-driven
408
- back-sync. If it is absent, the Action fails rather than guessing the rank
409
- (or the workflow wrapper must pass an explicit `chain`, which always wins).
407
+ - **Projects whose environments all map to the same branch** (e.g.
408
+ `dev`/`staging`/`production` all `main`) may also omit `deploy.order`: the
409
+ branches resolve to a single distinct branch, so there is nothing to back-sync
410
+ and the derived chain is the empty no-op. `deploy.order` is only required when
411
+ `deploy.branches` resolves to **more than one distinct branch**.
412
+ - **Multi-branch projects MUST set `deploy.order`** for config-driven back-sync.
413
+ If `deploy.branches` resolves to more than one distinct branch and `deploy.order`
414
+ is absent, the Action fails rather than guessing the rank (or the workflow
415
+ wrapper must pass an explicit `chain`, which always wins).
410
416
  - The env-name set of `deploy.order` and `deploy.branches` **must match exactly**
411
417
  — every env in one appears in the other. A mismatch is a config error.
412
418
 
@@ -475,9 +481,12 @@ Doctor must validate config in three layers:
475
481
  and `deploy.branches`.
476
482
 
477
483
  4. **Deploy env-order correctness**
478
- - When `deploy.branches` defines more than one environment but `deploy.order` is absent, `WARN`:
479
- config-driven back-sync cannot derive a chain without the ranking (the wrapper must add
480
- `deploy.order` or pass an explicit `chain`).
484
+ - When `deploy.branches` resolves to more than one **distinct** branch but `deploy.order` is
485
+ absent, `WARN`: config-driven back-sync cannot derive a chain without the ranking (the wrapper
486
+ must add `deploy.order` or pass an explicit `chain`).
487
+ - When `deploy.branches` defines multiple environments that all map to the **same** branch (e.g.
488
+ `dev`/`staging`/`production` all → `main`), `deploy.order` is **not** required — the chain is the
489
+ empty no-op. Do not `WARN` in this case.
481
490
  - When `deploy.order` is present but its env names do not exactly match the `deploy.branches`
482
491
  keys, `FAIL` — the derived sync-down chain would be wrong or empty.
483
492
 
@@ -104,8 +104,12 @@ this order:
104
104
  6. **Deploy env-order audit** (only when `deploy.branches` is present)
105
105
  - `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
106
106
  optional and the back-sync chain is empty.
107
- - `WARN` when `deploy.branches` defines **more than one** environment but `deploy.order` is
108
- absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
107
+ - `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
108
+ **same** branch (e.g. `dev`/`staging`/`production` all `main`). The branches resolve to a
109
+ single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
110
+ `deploy.order` is not required. Do not WARN.
111
+ - `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
112
+ is absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
109
113
  source→target chain without the env ranking; the repo must either add `deploy.order`
110
114
  (low→high, e.g. `["dev","staging","production"]`) or pass an explicit `chain` in its
111
115
  `claude-sync-down-branches.yml` wrapper. WARN not FAIL because the explicit-chain override is
@@ -44,6 +44,7 @@ CHAIN=$(jq -e -r '
44
44
  | ($b | keys | sort) as $bk
45
45
  | ($o | sort) as $ok
46
46
  | if ($b | length) <= 1 then "{}"
47
+ elif (($b | [.[]] | unique | length) <= 1) then "{}"
47
48
  elif ($o | length) == 0 then "ERR_NO_ORDER"
48
49
  elif ($bk != $ok) then "ERR_MISMATCH"
49
50
  else ($o | reverse) as $hl
@@ -53,12 +54,16 @@ CHAIN=$(jq -e -r '
53
54
  ' .lisa.config.json)
54
55
  ```
55
56
 
56
- - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments but
57
- `deploy.order` is missing. Tell the user to add `deploy.order` (low→high, e.g.
58
- `["dev","staging","production"]`). Do not guess the ranking.
57
+ - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments mapped to
58
+ more than one distinct branch but `deploy.order` is missing. Tell the user to
59
+ add `deploy.order` (low→high, e.g. `["dev","staging","production"]`). Do not
60
+ guess the ranking.
59
61
  - `ERR_MISMATCH` → stop: `deploy.order` and `deploy.branches` name different
60
62
  environments. They must match exactly.
61
- - `{}` (single-environment project) → nothing to sync; report and exit cleanly.
63
+ - `{}` → nothing to sync; report and exit cleanly. This covers both a
64
+ single-environment project and a multi-environment project whose branches all
65
+ resolve to the **same** branch (e.g. dev/staging/production all → `main`), where
66
+ `deploy.order` is not required.
62
67
 
63
68
  ### 2. Resolve the source branch
64
69
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.155.2",
3
+ "version": "2.155.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -104,8 +104,12 @@ this order:
104
104
  6. **Deploy env-order audit** (only when `deploy.branches` is present)
105
105
  - `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
106
106
  optional and the back-sync chain is empty.
107
- - `WARN` when `deploy.branches` defines **more than one** environment but `deploy.order` is
108
- absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
107
+ - `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
108
+ **same** branch (e.g. `dev`/`staging`/`production` all `main`). The branches resolve to a
109
+ single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
110
+ `deploy.order` is not required. Do not WARN.
111
+ - `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
112
+ is absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
109
113
  source→target chain without the env ranking; the repo must either add `deploy.order`
110
114
  (low→high, e.g. `["dev","staging","production"]`) or pass an explicit `chain` in its
111
115
  `claude-sync-down-branches.yml` wrapper. WARN not FAIL because the explicit-chain override is
@@ -44,6 +44,7 @@ CHAIN=$(jq -e -r '
44
44
  | ($b | keys | sort) as $bk
45
45
  | ($o | sort) as $ok
46
46
  | if ($b | length) <= 1 then "{}"
47
+ elif (($b | [.[]] | unique | length) <= 1) then "{}"
47
48
  elif ($o | length) == 0 then "ERR_NO_ORDER"
48
49
  elif ($bk != $ok) then "ERR_MISMATCH"
49
50
  else ($o | reverse) as $hl
@@ -53,12 +54,16 @@ CHAIN=$(jq -e -r '
53
54
  ' .lisa.config.json)
54
55
  ```
55
56
 
56
- - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments but
57
- `deploy.order` is missing. Tell the user to add `deploy.order` (low→high, e.g.
58
- `["dev","staging","production"]`). Do not guess the ranking.
57
+ - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments mapped to
58
+ more than one distinct branch but `deploy.order` is missing. Tell the user to
59
+ add `deploy.order` (low→high, e.g. `["dev","staging","production"]`). Do not
60
+ guess the ranking.
59
61
  - `ERR_MISMATCH` → stop: `deploy.order` and `deploy.branches` name different
60
62
  environments. They must match exactly.
61
- - `{}` (single-environment project) → nothing to sync; report and exit cleanly.
63
+ - `{}` → nothing to sync; report and exit cleanly. This covers both a
64
+ single-environment project and a multi-environment project whose branches all
65
+ resolve to the **same** branch (e.g. dev/staging/production all → `main`), where
66
+ `deploy.order` is not required.
62
67
 
63
68
  ### 2. Resolve the source branch
64
69
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -404,9 +404,15 @@ Rules:
404
404
 
405
405
  - **Single-environment projects** (one entry in `deploy.branches`) may omit
406
406
  `deploy.order`; the derived chain is empty and the back-sync no-ops.
407
- - **Multi-environment projects MUST set `deploy.order`** for config-driven
408
- back-sync. If it is absent, the Action fails rather than guessing the rank
409
- (or the workflow wrapper must pass an explicit `chain`, which always wins).
407
+ - **Projects whose environments all map to the same branch** (e.g.
408
+ `dev`/`staging`/`production` all `main`) may also omit `deploy.order`: the
409
+ branches resolve to a single distinct branch, so there is nothing to back-sync
410
+ and the derived chain is the empty no-op. `deploy.order` is only required when
411
+ `deploy.branches` resolves to **more than one distinct branch**.
412
+ - **Multi-branch projects MUST set `deploy.order`** for config-driven back-sync.
413
+ If `deploy.branches` resolves to more than one distinct branch and `deploy.order`
414
+ is absent, the Action fails rather than guessing the rank (or the workflow
415
+ wrapper must pass an explicit `chain`, which always wins).
410
416
  - The env-name set of `deploy.order` and `deploy.branches` **must match exactly**
411
417
  — every env in one appears in the other. A mismatch is a config error.
412
418
 
@@ -475,9 +481,12 @@ Doctor must validate config in three layers:
475
481
  and `deploy.branches`.
476
482
 
477
483
  4. **Deploy env-order correctness**
478
- - When `deploy.branches` defines more than one environment but `deploy.order` is absent, `WARN`:
479
- config-driven back-sync cannot derive a chain without the ranking (the wrapper must add
480
- `deploy.order` or pass an explicit `chain`).
484
+ - When `deploy.branches` resolves to more than one **distinct** branch but `deploy.order` is
485
+ absent, `WARN`: config-driven back-sync cannot derive a chain without the ranking (the wrapper
486
+ must add `deploy.order` or pass an explicit `chain`).
487
+ - When `deploy.branches` defines multiple environments that all map to the **same** branch (e.g.
488
+ `dev`/`staging`/`production` all → `main`), `deploy.order` is **not** required — the chain is the
489
+ empty no-op. Do not `WARN` in this case.
481
490
  - When `deploy.order` is present but its env names do not exactly match the `deploy.branches`
482
491
  keys, `FAIL` — the derived sync-down chain would be wrong or empty.
483
492
 
@@ -104,8 +104,12 @@ this order:
104
104
  6. **Deploy env-order audit** (only when `deploy.branches` is present)
105
105
  - `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
106
106
  optional and the back-sync chain is empty.
107
- - `WARN` when `deploy.branches` defines **more than one** environment but `deploy.order` is
108
- absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
107
+ - `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
108
+ **same** branch (e.g. `dev`/`staging`/`production` all `main`). The branches resolve to a
109
+ single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
110
+ `deploy.order` is not required. Do not WARN.
111
+ - `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
112
+ is absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
109
113
  source→target chain without the env ranking; the repo must either add `deploy.order`
110
114
  (low→high, e.g. `["dev","staging","production"]`) or pass an explicit `chain` in its
111
115
  `claude-sync-down-branches.yml` wrapper. WARN not FAIL because the explicit-chain override is
@@ -44,6 +44,7 @@ CHAIN=$(jq -e -r '
44
44
  | ($b | keys | sort) as $bk
45
45
  | ($o | sort) as $ok
46
46
  | if ($b | length) <= 1 then "{}"
47
+ elif (($b | [.[]] | unique | length) <= 1) then "{}"
47
48
  elif ($o | length) == 0 then "ERR_NO_ORDER"
48
49
  elif ($bk != $ok) then "ERR_MISMATCH"
49
50
  else ($o | reverse) as $hl
@@ -53,12 +54,16 @@ CHAIN=$(jq -e -r '
53
54
  ' .lisa.config.json)
54
55
  ```
55
56
 
56
- - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments but
57
- `deploy.order` is missing. Tell the user to add `deploy.order` (low→high, e.g.
58
- `["dev","staging","production"]`). Do not guess the ranking.
57
+ - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments mapped to
58
+ more than one distinct branch but `deploy.order` is missing. Tell the user to
59
+ add `deploy.order` (low→high, e.g. `["dev","staging","production"]`). Do not
60
+ guess the ranking.
59
61
  - `ERR_MISMATCH` → stop: `deploy.order` and `deploy.branches` name different
60
62
  environments. They must match exactly.
61
- - `{}` (single-environment project) → nothing to sync; report and exit cleanly.
63
+ - `{}` → nothing to sync; report and exit cleanly. This covers both a
64
+ single-environment project and a multi-environment project whose branches all
65
+ resolve to the **same** branch (e.g. dev/staging/production all → `main`), where
66
+ `deploy.order` is not required.
62
67
 
63
68
  ### 2. Resolve the source branch
64
69
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.155.2",
3
+ "version": "2.155.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -409,9 +409,15 @@ Rules:
409
409
 
410
410
  - **Single-environment projects** (one entry in `deploy.branches`) may omit
411
411
  `deploy.order`; the derived chain is empty and the back-sync no-ops.
412
- - **Multi-environment projects MUST set `deploy.order`** for config-driven
413
- back-sync. If it is absent, the Action fails rather than guessing the rank
414
- (or the workflow wrapper must pass an explicit `chain`, which always wins).
412
+ - **Projects whose environments all map to the same branch** (e.g.
413
+ `dev`/`staging`/`production` all `main`) may also omit `deploy.order`: the
414
+ branches resolve to a single distinct branch, so there is nothing to back-sync
415
+ and the derived chain is the empty no-op. `deploy.order` is only required when
416
+ `deploy.branches` resolves to **more than one distinct branch**.
417
+ - **Multi-branch projects MUST set `deploy.order`** for config-driven back-sync.
418
+ If `deploy.branches` resolves to more than one distinct branch and `deploy.order`
419
+ is absent, the Action fails rather than guessing the rank (or the workflow
420
+ wrapper must pass an explicit `chain`, which always wins).
415
421
  - The env-name set of `deploy.order` and `deploy.branches` **must match exactly**
416
422
  — every env in one appears in the other. A mismatch is a config error.
417
423
 
@@ -480,9 +486,12 @@ Doctor must validate config in three layers:
480
486
  and `deploy.branches`.
481
487
 
482
488
  4. **Deploy env-order correctness**
483
- - When `deploy.branches` defines more than one environment but `deploy.order` is absent, `WARN`:
484
- config-driven back-sync cannot derive a chain without the ranking (the wrapper must add
485
- `deploy.order` or pass an explicit `chain`).
489
+ - When `deploy.branches` resolves to more than one **distinct** branch but `deploy.order` is
490
+ absent, `WARN`: config-driven back-sync cannot derive a chain without the ranking (the wrapper
491
+ must add `deploy.order` or pass an explicit `chain`).
492
+ - When `deploy.branches` defines multiple environments that all map to the **same** branch (e.g.
493
+ `dev`/`staging`/`production` all → `main`), `deploy.order` is **not** required — the chain is the
494
+ empty no-op. Do not `WARN` in this case.
486
495
  - When `deploy.order` is present but its env names do not exactly match the `deploy.branches`
487
496
  keys, `FAIL` — the derived sync-down chain would be wrong or empty.
488
497
 
@@ -104,8 +104,12 @@ this order:
104
104
  6. **Deploy env-order audit** (only when `deploy.branches` is present)
105
105
  - `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
106
106
  optional and the back-sync chain is empty.
107
- - `WARN` when `deploy.branches` defines **more than one** environment but `deploy.order` is
108
- absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
107
+ - `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
108
+ **same** branch (e.g. `dev`/`staging`/`production` all `main`). The branches resolve to a
109
+ single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
110
+ `deploy.order` is not required. Do not WARN.
111
+ - `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
112
+ is absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
109
113
  source→target chain without the env ranking; the repo must either add `deploy.order`
110
114
  (low→high, e.g. `["dev","staging","production"]`) or pass an explicit `chain` in its
111
115
  `claude-sync-down-branches.yml` wrapper. WARN not FAIL because the explicit-chain override is
@@ -44,6 +44,7 @@ CHAIN=$(jq -e -r '
44
44
  | ($b | keys | sort) as $bk
45
45
  | ($o | sort) as $ok
46
46
  | if ($b | length) <= 1 then "{}"
47
+ elif (($b | [.[]] | unique | length) <= 1) then "{}"
47
48
  elif ($o | length) == 0 then "ERR_NO_ORDER"
48
49
  elif ($bk != $ok) then "ERR_MISMATCH"
49
50
  else ($o | reverse) as $hl
@@ -53,12 +54,16 @@ CHAIN=$(jq -e -r '
53
54
  ' .lisa.config.json)
54
55
  ```
55
56
 
56
- - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments but
57
- `deploy.order` is missing. Tell the user to add `deploy.order` (low→high, e.g.
58
- `["dev","staging","production"]`). Do not guess the ranking.
57
+ - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments mapped to
58
+ more than one distinct branch but `deploy.order` is missing. Tell the user to
59
+ add `deploy.order` (low→high, e.g. `["dev","staging","production"]`). Do not
60
+ guess the ranking.
59
61
  - `ERR_MISMATCH` → stop: `deploy.order` and `deploy.branches` name different
60
62
  environments. They must match exactly.
61
- - `{}` (single-environment project) → nothing to sync; report and exit cleanly.
63
+ - `{}` → nothing to sync; report and exit cleanly. This covers both a
64
+ single-environment project and a multi-environment project whose branches all
65
+ resolve to the **same** branch (e.g. dev/staging/production all → `main`), where
66
+ `deploy.order` is not required.
62
67
 
63
68
  ### 2. Resolve the source branch
64
69
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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-rails",
3
- "version": "2.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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.155.2",
3
+ "version": "2.155.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"
@@ -404,9 +404,15 @@ Rules:
404
404
 
405
405
  - **Single-environment projects** (one entry in `deploy.branches`) may omit
406
406
  `deploy.order`; the derived chain is empty and the back-sync no-ops.
407
- - **Multi-environment projects MUST set `deploy.order`** for config-driven
408
- back-sync. If it is absent, the Action fails rather than guessing the rank
409
- (or the workflow wrapper must pass an explicit `chain`, which always wins).
407
+ - **Projects whose environments all map to the same branch** (e.g.
408
+ `dev`/`staging`/`production` all `main`) may also omit `deploy.order`: the
409
+ branches resolve to a single distinct branch, so there is nothing to back-sync
410
+ and the derived chain is the empty no-op. `deploy.order` is only required when
411
+ `deploy.branches` resolves to **more than one distinct branch**.
412
+ - **Multi-branch projects MUST set `deploy.order`** for config-driven back-sync.
413
+ If `deploy.branches` resolves to more than one distinct branch and `deploy.order`
414
+ is absent, the Action fails rather than guessing the rank (or the workflow
415
+ wrapper must pass an explicit `chain`, which always wins).
410
416
  - The env-name set of `deploy.order` and `deploy.branches` **must match exactly**
411
417
  — every env in one appears in the other. A mismatch is a config error.
412
418
 
@@ -475,9 +481,12 @@ Doctor must validate config in three layers:
475
481
  and `deploy.branches`.
476
482
 
477
483
  4. **Deploy env-order correctness**
478
- - When `deploy.branches` defines more than one environment but `deploy.order` is absent, `WARN`:
479
- config-driven back-sync cannot derive a chain without the ranking (the wrapper must add
480
- `deploy.order` or pass an explicit `chain`).
484
+ - When `deploy.branches` resolves to more than one **distinct** branch but `deploy.order` is
485
+ absent, `WARN`: config-driven back-sync cannot derive a chain without the ranking (the wrapper
486
+ must add `deploy.order` or pass an explicit `chain`).
487
+ - When `deploy.branches` defines multiple environments that all map to the **same** branch (e.g.
488
+ `dev`/`staging`/`production` all → `main`), `deploy.order` is **not** required — the chain is the
489
+ empty no-op. Do not `WARN` in this case.
481
490
  - When `deploy.order` is present but its env names do not exactly match the `deploy.branches`
482
491
  keys, `FAIL` — the derived sync-down chain would be wrong or empty.
483
492
 
@@ -104,8 +104,12 @@ this order:
104
104
  6. **Deploy env-order audit** (only when `deploy.branches` is present)
105
105
  - `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
106
106
  optional and the back-sync chain is empty.
107
- - `WARN` when `deploy.branches` defines **more than one** environment but `deploy.order` is
108
- absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
107
+ - `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
108
+ **same** branch (e.g. `dev`/`staging`/`production` all `main`). The branches resolve to a
109
+ single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
110
+ `deploy.order` is not required. Do not WARN.
111
+ - `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
112
+ is absent. Config-driven back-sync (`reusable-claude-sync-down-branches.yml`) cannot derive a
109
113
  source→target chain without the env ranking; the repo must either add `deploy.order`
110
114
  (low→high, e.g. `["dev","staging","production"]`) or pass an explicit `chain` in its
111
115
  `claude-sync-down-branches.yml` wrapper. WARN not FAIL because the explicit-chain override is
@@ -44,6 +44,7 @@ CHAIN=$(jq -e -r '
44
44
  | ($b | keys | sort) as $bk
45
45
  | ($o | sort) as $ok
46
46
  | if ($b | length) <= 1 then "{}"
47
+ elif (($b | [.[]] | unique | length) <= 1) then "{}"
47
48
  elif ($o | length) == 0 then "ERR_NO_ORDER"
48
49
  elif ($bk != $ok) then "ERR_MISMATCH"
49
50
  else ($o | reverse) as $hl
@@ -53,12 +54,16 @@ CHAIN=$(jq -e -r '
53
54
  ' .lisa.config.json)
54
55
  ```
55
56
 
56
- - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments but
57
- `deploy.order` is missing. Tell the user to add `deploy.order` (low→high, e.g.
58
- `["dev","staging","production"]`). Do not guess the ranking.
57
+ - `ERR_NO_ORDER` → stop: `deploy.branches` has multiple environments mapped to
58
+ more than one distinct branch but `deploy.order` is missing. Tell the user to
59
+ add `deploy.order` (low→high, e.g. `["dev","staging","production"]`). Do not
60
+ guess the ranking.
59
61
  - `ERR_MISMATCH` → stop: `deploy.order` and `deploy.branches` name different
60
62
  environments. They must match exactly.
61
- - `{}` (single-environment project) → nothing to sync; report and exit cleanly.
63
+ - `{}` → nothing to sync; report and exit cleanly. This covers both a
64
+ single-environment project and a multi-environment project whose branches all
65
+ resolve to the **same** branch (e.g. dev/staging/production all → `main`), where
66
+ `deploy.order` is not required.
62
67
 
63
68
  ### 2. Resolve the source branch
64
69
 
@@ -76,7 +76,9 @@ derive_chain() {
76
76
  jq -e -r '
77
77
  (.deploy.branches // {}) as $b | (.deploy.order // []) as $o
78
78
  | ($b|keys|sort) as $bk | ($o|sort) as $ok
79
- | if ($b|length)<=1 then "{}" elif ($o|length)==0 then "ERR_NO_ORDER"
79
+ | if ($b|length)<=1 then "{}"
80
+ elif (($b|[.[]]|unique|length)<=1) then "{}"
81
+ elif ($o|length)==0 then "ERR_NO_ORDER"
80
82
  elif ($bk!=$ok) then "ERR_MISMATCH"
81
83
  else ($o|reverse) as $hl
82
84
  | [ range(0;($hl|length)-1) | {($b[$hl[.]]):$b[$hl[.+1]]} ] | add | tojson end