@codyswann/lisa 2.21.1 → 2.23.1

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 (152) hide show
  1. package/package.json +3 -2
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +11 -9
  5. package/plugins/lisa/agents/github-agent.md +18 -10
  6. package/plugins/lisa/agents/github-build-intake.md +10 -8
  7. package/plugins/lisa/agents/github-prd-intake.md +11 -9
  8. package/plugins/lisa/agents/jira-agent.md +12 -8
  9. package/plugins/lisa/agents/jira-build-intake.md +9 -7
  10. package/plugins/lisa/agents/learnings-synthesizer.md +1 -1
  11. package/plugins/lisa/agents/linear-agent.md +15 -9
  12. package/plugins/lisa/agents/linear-build-intake.md +13 -11
  13. package/plugins/lisa/agents/linear-prd-intake.md +11 -9
  14. package/plugins/lisa/agents/notion-prd-intake.md +11 -9
  15. package/plugins/lisa/agents/pr-mining-specialist.md +1 -1
  16. package/plugins/lisa/agents/tracker-mining-specialist.md +1 -1
  17. package/plugins/lisa/commands/setup/atlassian.md +7 -0
  18. package/plugins/lisa/commands/setup/confluence.md +7 -0
  19. package/plugins/lisa/commands/setup/jira.md +7 -0
  20. package/plugins/lisa/commands/setup/notion.md +7 -0
  21. package/plugins/lisa/hooks/enforce-team-first.sh +14 -6
  22. package/plugins/lisa/rules/base-rules.md +3 -3
  23. package/plugins/lisa/rules/config-resolution.md +242 -24
  24. package/plugins/lisa/rules/intent-routing.md +4 -4
  25. package/plugins/lisa/rules/repo-scope-split.md +41 -0
  26. package/plugins/lisa/rules/verification.md +13 -0
  27. package/plugins/lisa/skills/atlassian-access/SKILL.md +260 -0
  28. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +167 -82
  29. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +39 -26
  30. package/plugins/lisa/skills/debrief/SKILL.md +4 -5
  31. package/plugins/lisa/skills/github-add-journey/SKILL.md +1 -0
  32. package/plugins/lisa/skills/github-build-intake/SKILL.md +104 -40
  33. package/plugins/lisa/skills/github-evidence/SKILL.md +22 -5
  34. package/plugins/lisa/skills/github-prd-intake/SKILL.md +87 -51
  35. package/plugins/lisa/skills/github-to-tracker/SKILL.md +2 -2
  36. package/plugins/lisa/skills/github-validate-issue/SKILL.md +11 -1
  37. package/plugins/lisa/skills/implement/SKILL.md +5 -6
  38. package/plugins/lisa/skills/intake/SKILL.md +5 -6
  39. package/plugins/lisa/skills/jira-add-journey/SKILL.md +1 -0
  40. package/plugins/lisa/skills/jira-build-intake/SKILL.md +110 -45
  41. package/plugins/lisa/skills/jira-create/SKILL.md +5 -3
  42. package/plugins/lisa/skills/jira-evidence/SKILL.md +19 -2
  43. package/plugins/lisa/skills/jira-journey/SKILL.md +3 -1
  44. package/plugins/lisa/skills/jira-read-ticket/SKILL.md +10 -8
  45. package/plugins/lisa/skills/jira-sync/SKILL.md +11 -5
  46. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +22 -10
  47. package/plugins/lisa/skills/jira-verify/SKILL.md +5 -3
  48. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +16 -14
  49. package/plugins/lisa/skills/linear-add-journey/SKILL.md +1 -0
  50. package/plugins/lisa/skills/linear-build-intake/SKILL.md +90 -32
  51. package/plugins/lisa/skills/linear-evidence/SKILL.md +22 -5
  52. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +92 -57
  53. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -0
  54. package/plugins/lisa/skills/monitor/SKILL.md +4 -5
  55. package/plugins/lisa/skills/notion-access/SKILL.md +193 -0
  56. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +105 -46
  57. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +7 -5
  58. package/plugins/lisa/skills/plan/SKILL.md +4 -5
  59. package/plugins/lisa/skills/research/SKILL.md +4 -5
  60. package/plugins/lisa/skills/setup-atlassian/SKILL.md +316 -0
  61. package/plugins/lisa/skills/setup-confluence/SKILL.md +245 -0
  62. package/plugins/lisa/skills/setup-jira/SKILL.md +198 -0
  63. package/plugins/lisa/skills/setup-notion/SKILL.md +283 -0
  64. package/plugins/lisa/skills/task-decomposition/SKILL.md +2 -0
  65. package/plugins/lisa/skills/ticket-triage/SKILL.md +4 -1
  66. package/plugins/lisa/skills/tracker-evidence/SKILL.md +1 -0
  67. package/plugins/lisa/skills/verification-lifecycle/SKILL.md +2 -0
  68. package/plugins/lisa/skills/verify/SKILL.md +4 -5
  69. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo/skills/ops-browser-uat/SKILL.md +1 -1
  74. package/plugins/lisa-expo/skills/ops-check-logs/SKILL.md +1 -1
  75. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  77. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-nestjs/skills/nestjs-graphql/references/project-patterns.md +48 -0
  80. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  84. package/plugins/src/base/agents/confluence-prd-intake.md +11 -9
  85. package/plugins/src/base/agents/github-agent.md +18 -10
  86. package/plugins/src/base/agents/github-build-intake.md +10 -8
  87. package/plugins/src/base/agents/github-prd-intake.md +11 -9
  88. package/plugins/src/base/agents/jira-agent.md +12 -8
  89. package/plugins/src/base/agents/jira-build-intake.md +9 -7
  90. package/plugins/src/base/agents/learnings-synthesizer.md +1 -1
  91. package/plugins/src/base/agents/linear-agent.md +15 -9
  92. package/plugins/src/base/agents/linear-build-intake.md +13 -11
  93. package/plugins/src/base/agents/linear-prd-intake.md +11 -9
  94. package/plugins/src/base/agents/notion-prd-intake.md +11 -9
  95. package/plugins/src/base/agents/pr-mining-specialist.md +1 -1
  96. package/plugins/src/base/agents/tracker-mining-specialist.md +1 -1
  97. package/plugins/src/base/commands/setup/atlassian.md +7 -0
  98. package/plugins/src/base/commands/setup/confluence.md +7 -0
  99. package/plugins/src/base/commands/setup/jira.md +7 -0
  100. package/plugins/src/base/commands/setup/notion.md +7 -0
  101. package/plugins/src/base/hooks/enforce-team-first.sh +14 -6
  102. package/plugins/src/base/rules/base-rules.md +3 -3
  103. package/plugins/src/base/rules/config-resolution.md +242 -24
  104. package/plugins/src/base/rules/intent-routing.md +4 -4
  105. package/plugins/src/base/rules/repo-scope-split.md +41 -0
  106. package/plugins/src/base/rules/verification.md +13 -0
  107. package/plugins/src/base/skills/atlassian-access/SKILL.md +260 -0
  108. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +167 -82
  109. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +39 -26
  110. package/plugins/src/base/skills/debrief/SKILL.md +4 -5
  111. package/plugins/src/base/skills/github-add-journey/SKILL.md +1 -0
  112. package/plugins/src/base/skills/github-build-intake/SKILL.md +104 -40
  113. package/plugins/src/base/skills/github-evidence/SKILL.md +22 -5
  114. package/plugins/src/base/skills/github-prd-intake/SKILL.md +87 -51
  115. package/plugins/src/base/skills/github-to-tracker/SKILL.md +2 -2
  116. package/plugins/src/base/skills/github-validate-issue/SKILL.md +11 -1
  117. package/plugins/src/base/skills/implement/SKILL.md +5 -6
  118. package/plugins/src/base/skills/intake/SKILL.md +5 -6
  119. package/plugins/src/base/skills/jira-add-journey/SKILL.md +1 -0
  120. package/plugins/src/base/skills/jira-build-intake/SKILL.md +110 -45
  121. package/plugins/src/base/skills/jira-create/SKILL.md +5 -3
  122. package/plugins/src/base/skills/jira-evidence/SKILL.md +19 -2
  123. package/plugins/src/base/skills/jira-journey/SKILL.md +3 -1
  124. package/plugins/src/base/skills/jira-read-ticket/SKILL.md +10 -8
  125. package/plugins/src/base/skills/jira-sync/SKILL.md +11 -5
  126. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +22 -10
  127. package/plugins/src/base/skills/jira-verify/SKILL.md +5 -3
  128. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +16 -14
  129. package/plugins/src/base/skills/linear-add-journey/SKILL.md +1 -0
  130. package/plugins/src/base/skills/linear-build-intake/SKILL.md +90 -32
  131. package/plugins/src/base/skills/linear-evidence/SKILL.md +22 -5
  132. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +92 -57
  133. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -0
  134. package/plugins/src/base/skills/monitor/SKILL.md +4 -5
  135. package/plugins/src/base/skills/notion-access/SKILL.md +193 -0
  136. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +105 -46
  137. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +7 -5
  138. package/plugins/src/base/skills/plan/SKILL.md +4 -5
  139. package/plugins/src/base/skills/research/SKILL.md +4 -5
  140. package/plugins/src/base/skills/setup-atlassian/SKILL.md +316 -0
  141. package/plugins/src/base/skills/setup-confluence/SKILL.md +245 -0
  142. package/plugins/src/base/skills/setup-jira/SKILL.md +198 -0
  143. package/plugins/src/base/skills/setup-notion/SKILL.md +283 -0
  144. package/plugins/src/base/skills/task-decomposition/SKILL.md +2 -0
  145. package/plugins/src/base/skills/ticket-triage/SKILL.md +4 -1
  146. package/plugins/src/base/skills/tracker-evidence/SKILL.md +1 -0
  147. package/plugins/src/base/skills/verification-lifecycle/SKILL.md +2 -0
  148. package/plugins/src/base/skills/verify/SKILL.md +4 -5
  149. package/plugins/src/expo/skills/ops-browser-uat/SKILL.md +1 -1
  150. package/plugins/src/expo/skills/ops-check-logs/SKILL.md +1 -1
  151. package/plugins/src/nestjs/skills/nestjs-graphql/references/project-patterns.md +48 -0
  152. package/scripts/check-plugins-sync.sh +45 -0
@@ -85,6 +85,7 @@ Compose the journey with `[EVIDENCE: name]` markers at key verification points:
85
85
  4. **Evidence names in kebab-case** — `api-response`, `schema-check`, `rate-limit-hit`.
86
86
  5. **Assertions are measurable** — `Returns 200 with {status: ok}` not "API works correctly".
87
87
  6. **Cover happy path AND error path** — At minimum, one success and one failure marker.
88
+ 7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every `[EVIDENCE: name]` here is the issue's evidence manifest: validation gate S14 requires at least one, and the issue cannot be closed until each named artifact is captured and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
88
89
 
89
90
  ### Step 6: Present to User for Approval
90
91
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: github-build-intake
3
- description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues labeled `status:ready`, claims each by relabeling to `status:in-progress`, runs the implementation/build flow via lisa:github-agent, and relabels to `status:on-dev` on completion. The `status:ready` label is the human-flipped signal that an issue is truly ready for development — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
3
+ description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, claims each by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:github-agent, and relabels to the configured `done` label on completion. The `ready` label is the human-flipped signal that an issue is truly ready for development — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
4
4
  allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
@@ -12,11 +12,64 @@ allowed-tools: ["Skill", "Bash"]
12
12
  2. A full GitHub repo URL (e.g., `https://github.com/acme/frontend-v2`).
13
13
  3. The literal token `github` — falls back to `.lisa.config.json` (`github.org` / `github.repo`).
14
14
 
15
- Run one build-intake cycle. Each `status:ready` issue is claimed, built via the `lisa:github-agent` flow, and relabeled to `status:on-dev` (or the equivalent next-label for that repo). The cycle is the symmetric mirror of `lisa:notion-prd-intake`: humans flip `status:ready`, agents pick up and progress.
15
+ Run one build-intake cycle. Each issue in the configured `ready` build label is claimed, built via the `lisa:github-agent` flow, and relabeled to the configured `done` label (env-aware see Workflow resolution). The cycle is the symmetric mirror of `lisa:notion-prd-intake`: humans flip the `ready` label, agents pick up and progress.
16
+
17
+ ## Workflow resolution
18
+
19
+ Build-queue label names are read from `.lisa.config.json` `github.labels.build.*`, falling back to defaults documented in the `config-resolution` rule. Bash pattern:
20
+
21
+ ```bash
22
+ # Read role with default fallback. Local overrides global per-key.
23
+ read_role() {
24
+ local role="$1" default="$2"
25
+ local local_v global_v
26
+ local_v=$(jq -r ".github.labels.build.${role} // empty" .lisa.config.local.json 2>/dev/null)
27
+ global_v=$(jq -r ".github.labels.build.${role} // empty" .lisa.config.json 2>/dev/null)
28
+ echo "${local_v:-${global_v:-$default}}"
29
+ }
30
+
31
+ READY=$(read_role ready "status:ready")
32
+ CLAIMED=$(read_role claimed "status:in-progress")
33
+ REVIEW=$(read_role review "status:code-review")
34
+ ```
35
+
36
+ For env-keyed `done`, resolve the env first, then look up `done[<env>]`:
37
+
38
+ 1. Explicit caller arg (`target_env=staging`) wins.
39
+ 2. Otherwise, infer the env from the PR's base branch via `deploy.branches` (reverse lookup).
40
+ 3. If `done` is a **string** in config, use it directly regardless of env.
41
+ 4. If `done` is a **map** and env cannot be resolved, **fail loudly** — do not pick arbitrarily.
42
+
43
+ ```bash
44
+ TARGET_ENV="${target_env:-}"
45
+ if [ -z "$TARGET_ENV" ] && [ -n "$PR_BASE_BRANCH" ]; then
46
+ TARGET_ENV=$(jq -r --arg b "$PR_BASE_BRANCH" \
47
+ '.deploy.branches // {} | to_entries[] | select(.value == $b) | .key' \
48
+ .lisa.config.json 2>/dev/null | head -1)
49
+ fi
50
+
51
+ DONE_TYPE=$(jq -r '.github.labels.build.done | type' .lisa.config.json 2>/dev/null)
52
+ if [ "$DONE_TYPE" = "string" ]; then
53
+ DONE=$(jq -r '.github.labels.build.done' .lisa.config.json)
54
+ elif [ "$DONE_TYPE" = "object" ]; then
55
+ [ -z "$TARGET_ENV" ] && { echo "ERROR: github.labels.build.done is env-keyed but env not resolvable"; exit 1; }
56
+ DONE=$(jq -r --arg e "$TARGET_ENV" '.github.labels.build.done[$e] // empty' .lisa.config.json)
57
+ [ -z "$DONE" ] && { echo "ERROR: github.labels.build.done has no entry for env '$TARGET_ENV'"; exit 1; }
58
+ else
59
+ case "$TARGET_ENV" in
60
+ dev) DONE="status:on-dev" ;;
61
+ staging) DONE="status:on-stg" ;;
62
+ production) DONE="status:done" ;;
63
+ *) echo "ERROR: cannot resolve done label without env"; exit 1 ;;
64
+ esac
65
+ fi
66
+ ```
67
+
68
+ In prose below, the role names refer to the resolved labels: e.g. "the `ready` label" means whatever `github.labels.build.ready` resolves to (default: `status:ready`).
16
69
 
17
70
  ## Confirmation policy
18
71
 
19
- Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, dispatch each issue through `lisa:github-agent`, relabel successful builds to `status:on-dev`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
72
+ Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, dispatch each issue through `lisa:github-agent`, relabel successful builds to `$DONE`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
20
73
 
21
74
  Specifically forbidden:
22
75
 
@@ -28,28 +81,30 @@ Specifically forbidden:
28
81
  The only legitimate reasons to stop early:
29
82
 
30
83
  - Missing repo or required configuration. Surface the missing value and exit.
31
- - Label namespace not adopted (no issue carries any of `status:ready` / `status:in-progress` / `status:code-review` / `status:on-dev` / `status:done`). Surface a label-convention error and exit (this is setup, not a normal idle cycle — see "Adoption" at the bottom).
32
- - Empty `status:ready` set. Exit cleanly with `"No GitHub issues labeled status:ready in <org>/<repo>. Nothing to do."`
84
+ - Label namespace not adopted (no issue carries any of `$READY` / `$CLAIMED` / `$REVIEW` / `$DONE`). Surface a label-convention error and exit (this is setup, not a normal idle cycle — see "Adoption" at the bottom).
85
+ - Empty ready set. Exit cleanly with `"No GitHub issues labeled $READY in <org>/<repo>. Nothing to do."`
33
86
 
34
87
  ## Lifecycle assumed
35
88
 
36
89
  The GitHub Issues build lifecycle uses **labels** (we deliberately do NOT key off open/closed alone — closed issues aren't always the right post-build state):
37
90
 
38
91
  ```text
39
- status:ready → status:in-progressstatus:code-review → status:on-dev status:done
40
- (human) (us claim) (us / PR opens) (us done; PR ready) (downstream / merge)
92
+ ready → claimed → review → done(env-keyed) (downstream merge / archive)
93
+ (human) (us claim) (us / PR opens) (us done; PR ready)
41
94
  ```
42
95
 
96
+ (Defaults: `status:ready` / `status:in-progress` / `status:code-review` / `status:on-dev`/`status:on-stg`/`status:done`.)
97
+
43
98
  This skill ONLY transitions:
44
99
 
45
- - `status:ready` → `status:in-progress` (claim)
46
- - `status:in-progress` → `status:on-dev` (build complete, PR ready)
100
+ - `$READY` → `$CLAIMED` (claim)
101
+ - `$CLAIMED` → `$DONE` (build complete, PR ready)
47
102
 
48
- It never touches `status:code-review` (set by the agent / PR open hook), `status:done` (set by merge automation or PM), or any other status.
103
+ It never touches `$REVIEW` (set by the agent / PR open hook), `status:done`-as-terminal (set by merge automation or PM), or any other status.
49
104
 
50
- A "transition" means: remove the old `status:*` label and add the new one, in two `gh issue edit` calls (`--remove-label` + `--add-label`) or one combined call. The skill MUST verify exactly one `status:*` label is present after the update — having two simultaneously breaks idempotency.
105
+ A "transition" means: remove the old role label and add the new one, in two `gh issue edit` calls (`--remove-label` + `--add-label`) or one combined call. The skill MUST verify exactly one build-lifecycle label (from the resolved `$READY`/`$CLAIMED`/`$REVIEW`/`$DONE` set) is present after the update — having two simultaneously breaks idempotency.
51
106
 
52
- **Pre-flight check**: at the start of each cycle, confirm at least one of the `status:*` labels exists on the repo via `gh label list --repo <org>/<repo> --json name`. If none exist, the convention has not been adopted — surface the label-convention error and exit.
107
+ **Pre-flight check**: at the start of each cycle, confirm at least one of the resolved role labels (`$READY`, `$CLAIMED`, `$REVIEW`, or any `$DONE` value) exists on the repo via `gh label list --repo <org>/<repo> --json name`. If none exist, the convention has not been adopted — surface the label-convention error and exit.
53
108
 
54
109
  ## Phases
55
110
 
@@ -62,30 +117,32 @@ A "transition" means: remove the old `status:*` label and add the new one, in tw
62
117
  2. Confirm `gh auth status` succeeds.
63
118
  3. Confirm the repo is reachable: `gh repo view <org>/<repo> --json name --jq '.name'`.
64
119
 
65
- ### Phase 2 — Find Ready issues
120
+ ### Phase 2 — Find ready issues
66
121
 
67
122
  ```bash
68
- gh issue list --repo <org>/<repo> --label status:ready --state open --json number,title,labels,assignees,milestone,createdAt --limit 100
123
+ gh issue list --repo <org>/<repo> --label "$READY" --state open --json number,title,labels,assignees,milestone,createdAt --limit 100
69
124
  ```
70
125
 
71
126
  If empty, run a secondary check to distinguish a genuinely empty queue from an unconfigured repo:
72
127
 
73
128
  ```bash
74
- gh label list --repo <org>/<repo> --json name --jq '.[] | select(startswith("status:")) | .name'
129
+ gh label list --repo <org>/<repo> --json name \
130
+ | jq -r --arg r "$READY" --arg c "$CLAIMED" --arg v "$REVIEW" --arg d "$DONE" \
131
+ '[.[] | .name | select(. == $r or . == $c or . == $v or . == $d)] | length'
75
132
  ```
76
133
 
77
- If no `status:*` labels exist → label namespace not adopted, surface a setup error and exit. If `status:*` labels exist but none are `status:ready` on any open issue → genuinely empty queue, exit cleanly with `"No GitHub issues labeled status:ready. Nothing to do."`
134
+ If none of the configured role labels exist on the repo → label convention not adopted, surface a setup error and exit. If the role labels exist but none are `$READY` on any open issue → genuinely empty queue, exit cleanly with `"No GitHub issues labeled $READY. Nothing to do."`
78
135
 
79
- ### Phase 3 — Process each Ready issue (serial)
136
+ ### Phase 3 — Process each ready issue (serial)
80
137
 
81
138
  #### 3a. Claim
82
139
 
83
140
  ```bash
84
- gh issue edit <number> --repo <org>/<repo> --remove-label status:ready --add-label status:in-progress
141
+ gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$CLAIMED"
85
142
  gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Claimed by Claude. Starting build."
86
143
  ```
87
144
 
88
- This is the idempotency lock — a re-entrant cycle's `--label status:ready` filter will not see this issue again.
145
+ This is the idempotency lock — a re-entrant cycle's `--label $READY` filter will not see this issue again.
89
146
 
90
147
  If the relabel fails (permission, race), log under "Errors" in the cycle summary and skip this issue. **Do not invoke the build flow on an issue you didn't successfully claim.**
91
148
 
@@ -102,24 +159,26 @@ Invoke `lisa:github-agent` (the per-issue lifecycle agent) with the issue ref. `
102
159
  Wait for `lisa:github-agent` to return. Capture its outcome:
103
160
 
104
161
  - **Success** — PR is ready (open or merged); evidence posted; ready for next status.
105
- - **Blocked by github-verify pre-flight gate** — `lisa:github-agent` itself relabels the issue to `status:blocked` (or removes `status:in-progress` and reassigns to the original author). This is correct and expected — let it stand. Record and move on.
106
- - **Blocked by ticket-triage ambiguities** — `lisa:github-agent` posts findings and stops. The issue stays in `status:in-progress`. Surface to human; do not auto-relabel. Record under "Errors".
107
- - **Errored** — exception, missing config, etc. Leave the issue in `status:in-progress` for human investigation. Record under "Errors".
162
+ - **Blocked by github-verify pre-flight gate** — `lisa:github-agent` itself relabels the issue to `status:blocked` (or removes `$CLAIMED` and reassigns to the original author). This is correct and expected — let it stand. Record and move on.
163
+ - **Blocked by ticket-triage ambiguities** — `lisa:github-agent` posts findings and stops. The issue stays in `$CLAIMED`. Surface to human; do not auto-relabel. Record under "Errors".
164
+ - **Errored** — exception, missing config, etc. Leave the issue in `$CLAIMED` for human investigation. Record under "Errors".
108
165
 
109
- #### 3c. Transition to On Dev (only on Success)
166
+ #### 3c. Transition to $DONE (only on Success)
110
167
 
111
168
  If `lisa:github-agent` returned Success:
112
169
 
170
+ 1. Resolve `$DONE` for this issue's PR base branch using the Workflow resolution algorithm above. If env can't be resolved and `done` is env-keyed, record an Error and skip this transition — never guess.
171
+
113
172
  ```bash
114
- gh issue edit <number> --repo <org>/<repo> --remove-label status:in-progress --add-label status:on-dev
115
- gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Build complete. PR <URL>. Transitioned to status:on-dev."
173
+ gh issue edit <number> --repo <org>/<repo> --remove-label "$CLAIMED" --add-label "$DONE"
174
+ gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Build complete. PR <URL>. Transitioned to $DONE."
116
175
  ```
117
176
 
118
- For any non-Success outcome, do NOT transition. The issue sits in `status:in-progress` (or wherever `lisa:github-agent` left it) — humans take it from there.
177
+ For any non-Success outcome, do NOT transition. The issue sits in `$CLAIMED` (or wherever `lisa:github-agent` left it) — humans take it from there.
119
178
 
120
179
  #### 3d. Continue
121
180
 
122
- Move to the next Ready issue. One issue failing does not stop others.
181
+ Move to the next ready issue. One issue failing does not stop others.
123
182
 
124
183
  ### Phase 4 — Summary report
125
184
 
@@ -131,7 +190,7 @@ Cycle started: <ISO timestamp>
131
190
  Cycle completed: <ISO timestamp>
132
191
 
133
192
  Issues processed: <n>
134
- - status:on-dev (build complete, PR ready): <n>
193
+ - $DONE (build complete, PR ready): <n>
135
194
  - <org>/<repo>#<number> <title> → PR <URL>
136
195
  - Blocked (pre-flight verify failed): <n>
137
196
  - <org>/<repo>#<number> <title> — see issue comments
@@ -145,11 +204,12 @@ Total PRs opened: <n>
145
204
 
146
205
  ## Idempotency & safety
147
206
 
148
- - **Claim-first ordering**: `status:in-progress` set BEFORE `lisa:github-agent` invocation — no double-pickup.
149
- - **No writes outside the lifecycle**: this skill only relabels `status:readystatus:in-progress` and `status:in-progressstatus:on-dev`. Every other label change is owned by `lisa:github-agent`.
207
+ - **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:github-agent` invocation — no double-pickup.
208
+ - **No writes outside the lifecycle**: this skill only relabels `$READY$CLAIMED` and `$CLAIMED$DONE`. Every other label change is owned by `lisa:github-agent`.
150
209
  - **Failure isolation**: per-issue exceptions caught and recorded; the cycle continues.
151
210
  - **Single cycle per repo**: do not run two `lisa:github-build-intake` cycles in parallel against the same repo — concurrent claims could race. The scheduling layer is responsible for serialization.
152
211
  - **Single-label invariant**: after every transition, verify exactly one `status:*` label is present on the issue. If two are present (rare race), surface as an Error and skip — do NOT auto-resolve.
212
+ - **Never pick an arbitrary env for `$DONE`**. If `done` is a map and env is ambiguous, fail loudly.
153
213
 
154
214
  ## Configuration
155
215
 
@@ -157,23 +217,26 @@ Total PRs opened: <n>
157
217
  |----------|---------|---------|
158
218
  | `.lisa.config.json` `github.org` | (from `$ARGUMENTS`) | GitHub org for the default queue |
159
219
  | `.lisa.config.json` `github.repo` | (from `$ARGUMENTS`) | GitHub repo for the default queue |
160
- | Label: queue | `status:ready` | The label that signals "human says this is buildable" |
161
- | Label: claim | `status:in-progress` | The label set on pickup |
162
- | Label: done | `status:on-dev` | The label set after a successful build |
220
+ | `.lisa.config.json` `github.labels.build.ready` | `status:ready` | The label that signals "human says this is buildable" |
221
+ | `.lisa.config.json` `github.labels.build.claimed` | `status:in-progress` | The label set on pickup |
222
+ | `.lisa.config.json` `github.labels.build.review` | `status:code-review` | The label set when the PR opens (owned by `lisa:github-evidence`) |
223
+ | `.lisa.config.json` `github.labels.build.done` | env-keyed map or string | The label set after a successful build; env-aware |
224
+ | `.lisa.config.json` `deploy.branches` | — | Reverse-lookup map for env inference from PR base branch |
163
225
 
164
- If the repo has not adopted the `status:*` label namespace, this skill cannot run. The remediation is to create the labels — `gh label create status:ready --color FBCA04 --description "Ready for build"` and similar — typically a one-time setup.
226
+ If the repo has not adopted the `status:*` label namespace, this skill cannot run. The remediation is to create the labels — `gh label create status:ready --color FBCA04 --description "Ready for build"` and similar — typically a one-time setup. See "Adoption" below for the full command set using the defaults; if your project overrides the role names, substitute accordingly.
165
227
 
166
228
  ## Rules
167
229
 
168
- - Never relabel an issue the cycle didn't claim. The `status:in-progress` label is the signature of cycle ownership.
230
+ - Never relabel an issue the cycle didn't claim. The `$CLAIMED` label is the signature of cycle ownership.
169
231
  - Never bypass `lisa:github-agent` to do build work directly. `lisa:github-agent` owns the per-issue lifecycle.
170
- - Never auto-transition past `status:on-dev`. Downstream labels (`status:done`, etc.) are owned by QA / PM / merge automation.
232
+ - Never auto-transition past `$DONE`. Downstream labels (terminal `status:done`, etc.) are owned by QA / PM / merge automation.
171
233
  - If the issue has no Validation Journey or no sign-in credentials, `lisa:github-agent`'s pre-flight verify will catch it — **don't try to fix the issue from here**.
172
234
  - On any unexpected response from `lisa:github-agent` (status it doesn't claim, missing PR URL on success), record as Error and surface — never assume.
235
+ - Never pick an arbitrary env for `$DONE` resolution. If `done` is a map and env is ambiguous, fail loudly.
173
236
 
174
237
  ## Adoption (one-time per repo)
175
238
 
176
- Before this skill can run, the repo must adopt the `status:*` label namespace:
239
+ Before this skill can run, the repo must adopt the `status:*` label namespace. Using the defaults:
177
240
 
178
241
  1. Create the labels:
179
242
  ```bash
@@ -183,6 +246,7 @@ Before this skill can run, the repo must adopt the `status:*` label namespace:
183
246
  gh label create status:on-dev --color 1D76DB --description "Built, deployed to dev" --repo <org>/<repo>
184
247
  gh label create status:done --color 0E8A16 --description "Shipped" --repo <org>/<repo>
185
248
  ```
186
- 2. Apply `status:ready` to issues that are ready for development.
187
- 3. Reserve `status:in-progress`, `status:on-dev` for this skill humans should not set them manually except to recover from an error.
188
- 4. PRD-source labels (`prd-ready`, `prd-in-review`, etc.) are a SEPARATE namespace owned by `lisa:github-prd-intake`. Don't conflate.
249
+ If your project overrides any `github.labels.build.*` role name in config, substitute the actual label names you configured.
250
+ 2. Apply the `$READY` label to issues that are ready for development.
251
+ 3. Reserve `$CLAIMED`, `$DONE` for this skill humans should not set them manually except to recover from an error.
252
+ 4. PRD-source labels (defaults: `prd-ready`, `prd-in-review`, etc.) are a SEPARATE namespace owned by `lisa:github-prd-intake`. Don't conflate.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: github-evidence
3
- description: "Upload text evidence to the GitHub `pr-assets` release, update PR description, post a GitHub Issue comment with code blocks, and relabel the issue to `status:code-review`. Reusable by any skill that captures evidence and generates evidence/comment.md (and optionally evidence/comment.txt). The GitHub counterpart of lisa:jira-evidence."
3
+ description: "Upload text evidence to the GitHub `pr-assets` release, update PR description, post a GitHub Issue comment with code blocks, and relabel the issue to the configured `review` label (default `status:code-review`). Reusable by any skill that captures evidence and generates evidence/comment.md (and optionally evidence/comment.txt). The GitHub counterpart of lisa:jira-evidence."
4
4
  allowed-tools: ["Bash"]
5
5
  ---
6
6
 
@@ -8,6 +8,23 @@ allowed-tools: ["Bash"]
8
8
 
9
9
  Upload captured evidence and generated templates to the GitHub PR description and the originating GitHub Issue. This skill is the posting step — it assumes evidence files and a comment template already exist in the evidence directory.
10
10
 
11
+ ## Workflow resolution
12
+
13
+ The `claimed` and `review` build labels are read from `.lisa.config.json` `github.labels.build.*`, falling back to the defaults documented in the `config-resolution` rule (`status:in-progress` and `status:code-review`).
14
+
15
+ ```bash
16
+ read_role() {
17
+ local role="$1" default="$2"
18
+ local local_v global_v
19
+ local_v=$(jq -r ".github.labels.build.${role} // empty" .lisa.config.local.json 2>/dev/null)
20
+ global_v=$(jq -r ".github.labels.build.${role} // empty" .lisa.config.json 2>/dev/null)
21
+ echo "${local_v:-${global_v:-$default}}"
22
+ }
23
+
24
+ CLAIMED=$(read_role claimed "status:in-progress")
25
+ REVIEW=$(read_role review "status:code-review")
26
+ ```
27
+
11
28
  ## Arguments
12
29
 
13
30
  `$ARGUMENTS`: `<ISSUE_REF> <EVIDENCE_DIR> <PR_NUMBER>`
@@ -75,15 +92,15 @@ Upload captured evidence and generated templates to the GitHub PR description an
75
92
  gh issue comment <issue-number> --repo <issue-org>/<issue-repo> --body-file "$EVIDENCE_DIR/comment.md"
76
93
  ```
77
94
 
78
- 6. **Relabel the issue to `status:code-review`**
95
+ 6. **Relabel the issue to the configured `review` label**
79
96
 
80
97
  ```bash
81
98
  gh issue edit <issue-number> --repo <issue-org>/<issue-repo> \
82
- --remove-label status:in-progress \
83
- --add-label status:code-review
99
+ --remove-label "$CLAIMED" \
100
+ --add-label "$REVIEW"
84
101
  ```
85
102
 
86
- If the current label is already `status:code-review`, skip. If neither `status:in-progress` nor `status:code-review` is present, log a warning and continue without changing labels — the issue may have been hand-managed.
103
+ If the current label is already `$REVIEW`, skip. If neither `$CLAIMED` nor `$REVIEW` is present, log a warning and continue without changing labels — the issue may have been hand-managed.
87
104
 
88
105
  ## Evidence Naming Convention
89
106