@codyswann/lisa 2.21.0 → 2.23.0
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.
- package/package.json +3 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +11 -9
- package/plugins/lisa/agents/github-agent.md +18 -10
- package/plugins/lisa/agents/github-build-intake.md +10 -8
- package/plugins/lisa/agents/github-prd-intake.md +11 -9
- package/plugins/lisa/agents/jira-agent.md +12 -8
- package/plugins/lisa/agents/jira-build-intake.md +9 -7
- package/plugins/lisa/agents/linear-agent.md +15 -9
- package/plugins/lisa/agents/linear-build-intake.md +13 -11
- package/plugins/lisa/agents/linear-prd-intake.md +11 -9
- package/plugins/lisa/agents/notion-prd-intake.md +11 -9
- package/plugins/lisa/commands/setup/atlassian.md +7 -0
- package/plugins/lisa/commands/setup/confluence.md +7 -0
- package/plugins/lisa/commands/setup/jira.md +7 -0
- package/plugins/lisa/commands/setup/notion.md +7 -0
- package/plugins/lisa/rules/base-rules.md +2 -2
- package/plugins/lisa/rules/config-resolution.md +242 -24
- package/plugins/lisa/rules/repo-scope-split.md +41 -0
- package/plugins/lisa/rules/verification.md +13 -0
- package/plugins/lisa/skills/atlassian-access/SKILL.md +260 -0
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +167 -82
- package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +39 -26
- package/plugins/lisa/skills/git-submit-pr/SKILL.md +1 -1
- package/plugins/lisa/skills/github-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +104 -40
- package/plugins/lisa/skills/github-evidence/SKILL.md +22 -5
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +87 -51
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +2 -2
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +11 -1
- package/plugins/lisa/skills/jira-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +110 -45
- package/plugins/lisa/skills/jira-create/SKILL.md +5 -3
- package/plugins/lisa/skills/jira-evidence/SKILL.md +19 -2
- package/plugins/lisa/skills/jira-journey/SKILL.md +3 -1
- package/plugins/lisa/skills/jira-read-ticket/SKILL.md +10 -8
- package/plugins/lisa/skills/jira-sync/SKILL.md +11 -5
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +22 -10
- package/plugins/lisa/skills/jira-verify/SKILL.md +5 -3
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +16 -14
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +90 -32
- package/plugins/lisa/skills/linear-evidence/SKILL.md +22 -5
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +92 -57
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -0
- package/plugins/lisa/skills/notion-access/SKILL.md +193 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +105 -46
- package/plugins/lisa/skills/notion-to-tracker/SKILL.md +7 -5
- package/plugins/lisa/skills/setup-atlassian/SKILL.md +316 -0
- package/plugins/lisa/skills/setup-confluence/SKILL.md +245 -0
- package/plugins/lisa/skills/setup-jira/SKILL.md +198 -0
- package/plugins/lisa/skills/setup-notion/SKILL.md +283 -0
- package/plugins/lisa/skills/task-decomposition/SKILL.md +2 -0
- package/plugins/lisa/skills/ticket-triage/SKILL.md +4 -1
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +1 -0
- package/plugins/lisa/skills/verification-lifecycle/SKILL.md +2 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +11 -9
- package/plugins/src/base/agents/github-agent.md +18 -10
- package/plugins/src/base/agents/github-build-intake.md +10 -8
- package/plugins/src/base/agents/github-prd-intake.md +11 -9
- package/plugins/src/base/agents/jira-agent.md +12 -8
- package/plugins/src/base/agents/jira-build-intake.md +9 -7
- package/plugins/src/base/agents/linear-agent.md +15 -9
- package/plugins/src/base/agents/linear-build-intake.md +13 -11
- package/plugins/src/base/agents/linear-prd-intake.md +11 -9
- package/plugins/src/base/agents/notion-prd-intake.md +11 -9
- package/plugins/src/base/commands/setup/atlassian.md +7 -0
- package/plugins/src/base/commands/setup/confluence.md +7 -0
- package/plugins/src/base/commands/setup/jira.md +7 -0
- package/plugins/src/base/commands/setup/notion.md +7 -0
- package/plugins/src/base/rules/base-rules.md +2 -2
- package/plugins/src/base/rules/config-resolution.md +242 -24
- package/plugins/src/base/rules/repo-scope-split.md +41 -0
- package/plugins/src/base/rules/verification.md +13 -0
- package/plugins/src/base/skills/atlassian-access/SKILL.md +260 -0
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +167 -82
- package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +39 -26
- package/plugins/src/base/skills/git-submit-pr/SKILL.md +1 -1
- package/plugins/src/base/skills/github-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +104 -40
- package/plugins/src/base/skills/github-evidence/SKILL.md +22 -5
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +87 -51
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +2 -2
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +11 -1
- package/plugins/src/base/skills/jira-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +110 -45
- package/plugins/src/base/skills/jira-create/SKILL.md +5 -3
- package/plugins/src/base/skills/jira-evidence/SKILL.md +19 -2
- package/plugins/src/base/skills/jira-journey/SKILL.md +3 -1
- package/plugins/src/base/skills/jira-read-ticket/SKILL.md +10 -8
- package/plugins/src/base/skills/jira-sync/SKILL.md +11 -5
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +22 -10
- package/plugins/src/base/skills/jira-verify/SKILL.md +5 -3
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +16 -14
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +90 -32
- package/plugins/src/base/skills/linear-evidence/SKILL.md +22 -5
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +92 -57
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -0
- package/plugins/src/base/skills/notion-access/SKILL.md +193 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +105 -46
- package/plugins/src/base/skills/notion-to-tracker/SKILL.md +7 -5
- package/plugins/src/base/skills/setup-atlassian/SKILL.md +316 -0
- package/plugins/src/base/skills/setup-confluence/SKILL.md +245 -0
- package/plugins/src/base/skills/setup-jira/SKILL.md +198 -0
- package/plugins/src/base/skills/setup-notion/SKILL.md +283 -0
- package/plugins/src/base/skills/task-decomposition/SKILL.md +2 -0
- package/plugins/src/base/skills/ticket-triage/SKILL.md +4 -1
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +1 -0
- package/plugins/src/base/skills/verification-lifecycle/SKILL.md +2 -0
- package/scripts/check-plugins-sync.sh +45 -0
|
@@ -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
|
|
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 `
|
|
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
|
|
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 `
|
|
32
|
-
- Empty
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
- `
|
|
46
|
-
- `
|
|
100
|
+
- `$READY` → `$CLAIMED` (claim)
|
|
101
|
+
- `$CLAIMED` → `$DONE` (build complete, PR ready)
|
|
47
102
|
|
|
48
|
-
It never touches `
|
|
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
|
|
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
|
|
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
|
|
120
|
+
### Phase 2 — Find ready issues
|
|
66
121
|
|
|
67
122
|
```bash
|
|
68
|
-
gh issue list --repo <org>/<repo> --label
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 `
|
|
106
|
-
- **Blocked by ticket-triage ambiguities** — `lisa:github-agent` posts findings and stops. The issue stays in
|
|
107
|
-
- **Errored** — exception, missing config, etc. Leave the issue in `
|
|
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
|
|
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
|
|
115
|
-
gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Build complete. PR <URL>. Transitioned to
|
|
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 `
|
|
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
|
|
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
|
-
-
|
|
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**: `
|
|
149
|
-
- **No writes outside the lifecycle**: this skill only relabels
|
|
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
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
|
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 `
|
|
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
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
|
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 `
|
|
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
|
|
83
|
-
--add-label
|
|
99
|
+
--remove-label "$CLAIMED" \
|
|
100
|
+
--add-label "$REVIEW"
|
|
84
101
|
```
|
|
85
102
|
|
|
86
|
-
If the current label is already
|
|
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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-prd-intake
|
|
3
|
-
description: "Scans a GitHub repository for issues
|
|
3
|
+
description: "Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA, GitHub Issues itself, or Linear) and the label flipped to the configured `ticketed` label; PRDs that fail get clarifying-question comments and the label flipped to the configured `blocked` label. The GitHub counterpart of lisa:notion-prd-intake / lisa:confluence-prd-intake / lisa:linear-prd-intake. Composes existing skills (github-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -8,56 +8,81 @@ allowed-tools: ["Skill", "Bash"]
|
|
|
8
8
|
|
|
9
9
|
`$ARGUMENTS` is one of:
|
|
10
10
|
|
|
11
|
-
- A GitHub `org/repo` token (e.g., `acme/product-prds`) — scans the repo for issues
|
|
11
|
+
- A GitHub `org/repo` token (e.g., `acme/product-prds`) — scans the repo for issues carrying the configured `ready` PRD label.
|
|
12
12
|
- A full GitHub repo URL (e.g., `https://github.com/acme/product-prds`).
|
|
13
13
|
- The literal token `github` — falls back to `.lisa.config.json` (`github.org` / `github.repo`).
|
|
14
14
|
|
|
15
|
-
Run one intake cycle against that repo. Each issue with the `
|
|
15
|
+
Run one intake cycle against that repo. Each issue with the `ready` label is claimed, validated, and routed to either the `blocked` label (with clarifying comments) or the `ticketed` label (with destination tickets created).
|
|
16
|
+
|
|
17
|
+
## Workflow resolution
|
|
18
|
+
|
|
19
|
+
PRD label names are read from `.lisa.config.json` `github.labels.prd.*`, 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.prd.${role} // empty" .lisa.config.local.json 2>/dev/null)
|
|
27
|
+
global_v=$(jq -r ".github.labels.prd.${role} // empty" .lisa.config.json 2>/dev/null)
|
|
28
|
+
echo "${local_v:-${global_v:-$default}}"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
READY=$(read_role ready "prd-ready")
|
|
32
|
+
IN_REVIEW=$(read_role in_review "prd-in-review")
|
|
33
|
+
BLOCKED=$(read_role blocked "prd-blocked")
|
|
34
|
+
TICKETED=$(read_role ticketed "prd-ticketed")
|
|
35
|
+
SHIPPED=$(read_role shipped "prd-shipped")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
In prose below, the role names refer to the resolved labels: e.g. "the `ready` label" means whatever `github.labels.prd.ready` resolves to (default: `prd-ready`).
|
|
16
39
|
|
|
17
40
|
This skill is the GitHub counterpart of `lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, and `lisa:linear-prd-intake`. Phases, gates, comment templates, and rules are identical — the only differences are (1) the lifecycle is encoded as **issue labels** (mirroring Linear's project labels and Confluence's page labels), (2) the fetch / update tools are the `gh` CLI, and (3) clarifying-question comments land directly on the source PRD issue (because GitHub Issues *do* have native comments — no sentinel issue required, unlike Linear). Keep all four skills behaviorally aligned: when changing intake logic, change them together.
|
|
18
41
|
|
|
19
42
|
## Confirmation policy
|
|
20
43
|
|
|
21
|
-
Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, validate, branch to `
|
|
44
|
+
Do NOT ask the caller whether to proceed. Once invoked with a repo, run the cycle to completion — claim, validate, branch to `$BLOCKED` or `$TICKETED`, write the summary. The caller has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
|
|
22
45
|
|
|
23
46
|
Specifically forbidden:
|
|
24
47
|
|
|
25
48
|
- Previewing projected scope and asking whether to continue.
|
|
26
49
|
- Offering A/B/C-style choices like "proceed / skip / dry-run only" — the documented behavior IS the default.
|
|
27
|
-
- Pausing because a PRD looks large, has many open questions, or is likely to end in
|
|
50
|
+
- Pausing because a PRD looks large, has many open questions, or is likely to end in `$BLOCKED`. The `blocked` label is a valid terminal state of this lifecycle, not a failure mode.
|
|
28
51
|
- Pausing because the dry-run validation looks expensive.
|
|
29
52
|
|
|
30
53
|
The only legitimate reasons to stop early:
|
|
31
54
|
|
|
32
55
|
- Missing repo argument or required configuration. Surface and exit.
|
|
33
|
-
- Repo unreachable, or the labelling convention not yet adopted (no issue carries any of `
|
|
34
|
-
- Empty
|
|
56
|
+
- Repo unreachable, or the labelling convention not yet adopted (no issue carries any of `$READY` / `$IN_REVIEW` / `$BLOCKED` / `$TICKETED`). Surface and exit.
|
|
57
|
+
- Empty ready set. Exit cleanly with `"No GitHub issues labeled $READY in <org>/<repo>. Nothing to do."`
|
|
35
58
|
|
|
36
59
|
## Lifecycle assumed
|
|
37
60
|
|
|
38
61
|
The PRD lifecycle is encoded as **issue labels**:
|
|
39
62
|
|
|
40
63
|
```text
|
|
41
|
-
|
|
42
|
-
|
|
64
|
+
draft → ready → in_review → blocked | ticketed → shipped
|
|
65
|
+
(product) (us) (us) (product)
|
|
43
66
|
```
|
|
44
67
|
|
|
68
|
+
(Defaults: `prd-draft` / `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed` / `prd-shipped`.)
|
|
69
|
+
|
|
45
70
|
Exactly one of these labels is expected on a PRD issue at any time.
|
|
46
71
|
|
|
47
72
|
This skill ONLY transitions:
|
|
48
73
|
|
|
49
|
-
- `
|
|
50
|
-
- `
|
|
51
|
-
- `
|
|
52
|
-
- `
|
|
74
|
+
- `$READY` → `$IN_REVIEW` (claim)
|
|
75
|
+
- `$IN_REVIEW` → `$BLOCKED` (gate failures or coverage gaps)
|
|
76
|
+
- `$IN_REVIEW` → `$TICKETED` (success)
|
|
77
|
+
- `$TICKETED` → `$BLOCKED` (post-write coverage gaps from Phase 3e)
|
|
53
78
|
|
|
54
|
-
It never adds, removes, or touches `
|
|
79
|
+
It never adds, removes, or touches the `draft` or `shipped` labels. Those labels are owned by product.
|
|
55
80
|
|
|
56
81
|
A "transition" means: remove the old lifecycle label and add the new one (`gh issue edit <num> --remove-label <old> --add-label <new>`). The skill MUST verify exactly one lifecycle label is present after the update.
|
|
57
82
|
|
|
58
|
-
If the repo has not yet adopted
|
|
83
|
+
If the repo has not yet adopted these labels, this skill cannot run. See "Adoption" at the bottom.
|
|
59
84
|
|
|
60
|
-
**Label namespace separation:** the PRD lifecycle uses the `prd-*`
|
|
85
|
+
**Label namespace separation:** the PRD lifecycle uses the configured PRD labels (defaults `prd-*`). The build-queue lifecycle (used by `lisa:github-build-intake`) uses the configured build labels (defaults `status:*`). The two never overlap. When the destination tracker is also GitHub Issues (self-host case), the same repo can host both — but a single issue is either a PRD (carrying a PRD lifecycle label) or a build ticket (carrying a build label), never both.
|
|
61
86
|
|
|
62
87
|
## Phases
|
|
63
88
|
|
|
@@ -69,40 +94,42 @@ If the repo has not yet adopted `prd-*` labels, this skill cannot run. See "Adop
|
|
|
69
94
|
- Literal `github` → resolve from `.lisa.config.json`; error if not set.
|
|
70
95
|
2. Confirm `gh auth status` succeeds.
|
|
71
96
|
3. Confirm the repo is reachable: `gh repo view <org>/<repo> --json name`.
|
|
72
|
-
4. Verify the
|
|
97
|
+
4. Verify the PRD label set exists:
|
|
73
98
|
```bash
|
|
74
|
-
gh label list --repo <org>/<repo> --json name --jq '
|
|
99
|
+
gh label list --repo <org>/<repo> --json name --jq '.[] | .name' \
|
|
100
|
+
| grep -xE "$READY|$IN_REVIEW|$BLOCKED|$TICKETED|$SHIPPED"
|
|
75
101
|
```
|
|
76
|
-
If none of
|
|
102
|
+
If none of the configured PRD labels are present, surface a label-convention error and exit (see "Adoption").
|
|
77
103
|
|
|
78
|
-
### Phase 2 — Find
|
|
104
|
+
### Phase 2 — Find ready PRDs
|
|
79
105
|
|
|
80
106
|
```bash
|
|
81
|
-
gh issue list --repo <org>/<repo> --label
|
|
107
|
+
gh issue list --repo <org>/<repo> --label "$READY" --state open --limit 100 \
|
|
82
108
|
--json number,title,body,labels,author,milestone,createdAt,updatedAt,url
|
|
83
109
|
```
|
|
84
110
|
|
|
85
|
-
For each candidate, confirm exactly one lifecycle label is present (the `--label` filter selects `
|
|
111
|
+
For each candidate, confirm exactly one lifecycle label is present (the `--label` filter selects `$READY` matches, but a PRD could have ended up with two labels by hand — that's a misconfiguration, not a normal queue entry).
|
|
86
112
|
|
|
87
113
|
If empty, run a secondary check:
|
|
88
114
|
|
|
89
115
|
```bash
|
|
90
|
-
gh issue list --repo <org>/<repo> --state open --limit 100 --json number,labels
|
|
116
|
+
gh issue list --repo <org>/<repo> --state open --limit 100 --json number,labels \
|
|
117
|
+
--jq "[.[] | .labels[] | select(.name == \"$READY\" or .name == \"$IN_REVIEW\" or .name == \"$BLOCKED\" or .name == \"$TICKETED\") | .name] | unique"
|
|
91
118
|
```
|
|
92
119
|
|
|
93
|
-
If no
|
|
120
|
+
If no PRD lifecycle labels appear on any open issue → convention not adopted; surface error and exit. If lifecycle labels exist but none are `$READY` → genuinely empty queue, exit cleanly with the idle message.
|
|
94
121
|
|
|
95
|
-
### Phase 3 — Process each
|
|
122
|
+
### Phase 3 — Process each ready PRD
|
|
96
123
|
|
|
97
124
|
Process serially to keep label transitions auditable.
|
|
98
125
|
|
|
99
126
|
#### 3a. Claim
|
|
100
127
|
|
|
101
128
|
```bash
|
|
102
|
-
gh issue edit <num> --repo <org>/<repo> --remove-label
|
|
129
|
+
gh issue edit <num> --repo <org>/<repo> --remove-label "$READY" --add-label "$IN_REVIEW"
|
|
103
130
|
```
|
|
104
131
|
|
|
105
|
-
This is the idempotency lock — a re-entrant cycle's `--label
|
|
132
|
+
This is the idempotency lock — a re-entrant cycle's `--label $READY` filter won't see this issue again.
|
|
106
133
|
|
|
107
134
|
If the relabel fails (permission, race), log and skip. Do not proceed to validation on a PRD you didn't successfully claim.
|
|
108
135
|
|
|
@@ -128,8 +155,8 @@ This call indirectly invokes `lisa:tracker-source-artifacts` (artifact extractio
|
|
|
128
155
|
```bash
|
|
129
156
|
gh issue comment <prd-num> --repo <org>/<repo> --body-file /tmp/ticketed-comment.md
|
|
130
157
|
```
|
|
131
|
-
Lead with: `"Ticketed by Claude. Created N tickets in <destination> — see below. Add the
|
|
132
|
-
4. Transition labels: `gh issue edit <prd-num> --remove-label
|
|
158
|
+
Lead with: `"Ticketed by Claude. Created N tickets in <destination> — see below. Add the $SHIPPED label after the work is delivered."` The destination is named (JIRA / GitHub Issues) so product knows where to look.
|
|
159
|
+
4. Transition labels: `gh issue edit <prd-num> --remove-label "$IN_REVIEW" --add-label "$TICKETED"`.
|
|
133
160
|
5. **Run Phase 3e (coverage audit)** before considering this PRD done.
|
|
134
161
|
|
|
135
162
|
**If `FAIL`**:
|
|
@@ -160,7 +187,7 @@ Each comment template MUST contain these parts in this order, no exceptions:
|
|
|
160
187
|
|
|
161
188
|
**Recommendation:** <validator's `recommendation` field, verbatim — must contain 1–3 concrete options, never a generic "please clarify">
|
|
162
189
|
|
|
163
|
-
**Action:** Update this section in the PRD, then replace the `
|
|
190
|
+
**Action:** Update this section in the PRD, then replace the `$BLOCKED` label with `$READY` on the issue and Claude will re-run intake.
|
|
164
191
|
```
|
|
165
192
|
|
|
166
193
|
If multiple failures share an anchor, render each as its own `**What's unclear:** ... **Recommendation:** ...` block within the same comment, separated by `---`. Keep the single `[Category badge]` heading at the top.
|
|
@@ -191,13 +218,13 @@ For unanchored failures (`prd_anchor: null`), post one rollup comment prefixed w
|
|
|
191
218
|
|
|
192
219
|
##### 3c.5 Label transition
|
|
193
220
|
|
|
194
|
-
After all comments are posted, transition: `gh issue edit <num> --remove-label
|
|
221
|
+
After all comments are posted, transition: `gh issue edit <num> --remove-label "$IN_REVIEW" --add-label "$BLOCKED"`. Do NOT write any tickets.
|
|
195
222
|
|
|
196
223
|
#### 3d. Continue
|
|
197
224
|
|
|
198
|
-
Move to the next
|
|
225
|
+
Move to the next ready PRD. One PRD failing does not affect others.
|
|
199
226
|
|
|
200
|
-
#### 3e. Coverage audit (mandatory after
|
|
227
|
+
#### 3e. Coverage audit (mandatory after $TICKETED)
|
|
201
228
|
|
|
202
229
|
Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* of tickets covers the *whole* PRD. Invoke `lisa:prd-ticket-coverage` to catch silent drops.
|
|
203
230
|
|
|
@@ -206,10 +233,10 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
206
233
|
|
|
207
234
|
| Verdict | Action |
|
|
208
235
|
|---------|--------|
|
|
209
|
-
| `COMPLETE` | Done. Leave label as
|
|
210
|
-
| `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the PRD issue naming the scope-creep tickets. Leave label as
|
|
211
|
-
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.2 — anchored when `prd_anchor` is non-null. (b) Post one summary comment listing the tickets that *were* successfully created. (c) Transition labels from `
|
|
212
|
-
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. Log as Error; leave label as `
|
|
236
|
+
| `COMPLETE` | Done. Leave label as `$TICKETED`. Move to next PRD. |
|
|
237
|
+
| `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the PRD issue naming the scope-creep tickets. Leave label as `$TICKETED`. |
|
|
238
|
+
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.2 — anchored when `prd_anchor` is non-null. (b) Post one summary comment listing the tickets that *were* successfully created. (c) Transition labels from `$TICKETED` back to `$BLOCKED`. |
|
|
239
|
+
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. Log as Error; leave label as `$TICKETED` with a flag comment. |
|
|
213
240
|
|
|
214
241
|
3. The created tickets remain in the destination tracker regardless of the verdict. The audit only tells us whether *more* are needed.
|
|
215
242
|
|
|
@@ -223,9 +250,9 @@ Cycle started: <ISO timestamp>
|
|
|
223
250
|
Cycle completed: <ISO timestamp>
|
|
224
251
|
|
|
225
252
|
PRDs processed: <n>
|
|
226
|
-
-
|
|
253
|
+
- $TICKETED: <n>
|
|
227
254
|
- <issue-ref> "<title>" → <epic-ref> + <story-count> stories + <subtask-count> sub-tasks (coverage: COMPLETE | COMPLETE_WITH_SCOPE_CREEP)
|
|
228
|
-
-
|
|
255
|
+
- $BLOCKED: <n>
|
|
229
256
|
- <issue-ref> "<title>" → <gate-failure-count> gate failures (pre-write) OR <gap-count> coverage gaps (post-write)
|
|
230
257
|
- Errors (claim failed, etc): <n>
|
|
231
258
|
- <issue-ref> "<title>" — <reason>
|
|
@@ -240,40 +267,48 @@ Print to the agent's output. Do not write this summary to GitHub.
|
|
|
240
267
|
|
|
241
268
|
When the configured destination tracker is GitHub Issues AND the PRD repo is the same as the destination repo, both reads and writes hit the same place. Disambiguation rules:
|
|
242
269
|
|
|
243
|
-
- A PRD issue carries a
|
|
270
|
+
- A PRD issue carries a PRD lifecycle label (configured under `github.labels.prd.*`). Built tickets carry a `type:*` + build-status label set (configured under `github.labels.build.*`), but never a PRD lifecycle label.
|
|
244
271
|
- The "Ticketed by Claude" comment on the PRD links to the destination ticket numbers (which live in the same repo, so the links are simple `#<n>` refs).
|
|
245
272
|
- `lisa:prd-ticket-coverage` filters out the source PRD itself when listing destination tickets — the PRD is never a ticket of its own work.
|
|
246
273
|
|
|
247
274
|
## Idempotency & safety
|
|
248
275
|
|
|
249
|
-
- **Single-cycle scope**: this skill processes the
|
|
250
|
-
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:github-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes labels among
|
|
251
|
-
- **Claim-first ordering**: the label flip to `
|
|
252
|
-
- **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue. The PRD that errored is left labeled `
|
|
276
|
+
- **Single-cycle scope**: this skill processes the ready set as it exists at the start of Phase 2. New ready issues added mid-cycle are picked up next run.
|
|
277
|
+
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:github-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes labels among `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, only ever comments on the source PRD issue. It never edits PRD bodies, never touches `draft` or `shipped` labels, never closes or deletes PRD issues.
|
|
278
|
+
- **Claim-first ordering**: the label flip to `$IN_REVIEW` happens BEFORE validation runs.
|
|
279
|
+
- **Failure isolation**: an exception processing one PRD must not stop the cycle. Catch, record under "Errors" in the summary, continue. The PRD that errored is left labeled `$IN_REVIEW` — humans investigate from there.
|
|
253
280
|
- **Single-label invariant**: after every transition, verify exactly one lifecycle label is present.
|
|
254
281
|
|
|
255
282
|
## Configuration
|
|
256
283
|
|
|
257
284
|
Same configuration as `lisa:github-to-tracker`. See that skill for the full table. Key items:
|
|
258
285
|
|
|
259
|
-
- **From `.lisa.config.json`**: `github.org` and `github.repo` (required for the source repo, and also for the destination repo when `tracker = "github"` — self-host case).
|
|
286
|
+
- **From `.lisa.config.json`**: `github.org` and `github.repo` (required for the source repo, and also for the destination repo when `tracker = "github"` — self-host case), plus `github.labels.prd.*` for the lifecycle label vocabulary (all optional; defaults documented above).
|
|
260
287
|
- **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
|
|
261
288
|
|
|
262
289
|
Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface and exit — never invent values.
|
|
263
290
|
|
|
291
|
+
| Field | Default | Purpose |
|
|
292
|
+
|-------|---------|---------|
|
|
293
|
+
| `.lisa.config.json` `github.labels.prd.ready` | `prd-ready` | Label signalling "PRD ready for ticketing" |
|
|
294
|
+
| `.lisa.config.json` `github.labels.prd.in_review` | `prd-in-review` | Label set on claim |
|
|
295
|
+
| `.lisa.config.json` `github.labels.prd.blocked` | `prd-blocked` | Label set on validation failure |
|
|
296
|
+
| `.lisa.config.json` `github.labels.prd.ticketed` | `prd-ticketed` | Label set on success |
|
|
297
|
+
| `.lisa.config.json` `github.labels.prd.shipped` | `prd-shipped` | Label product sets after delivery |
|
|
298
|
+
|
|
264
299
|
## Rules
|
|
265
300
|
|
|
266
301
|
- Never write to the destination tracker outside of `lisa:github-to-tracker` → `lisa:tracker-write`.
|
|
267
|
-
- Never add or remove a label this skill doesn't own (
|
|
302
|
+
- Never add or remove a label this skill doesn't own (`$IN_REVIEW`, `$BLOCKED`, `$TICKETED`). Product owns the `draft`, `ready`, and `shipped` PRD labels.
|
|
268
303
|
- Never edit a PRD's body. Communication with product happens only via comments.
|
|
269
304
|
- Never post a single dump of all gate failures on one comment. One comment per `prd_anchor` group, plus one rollup for unanchored failures.
|
|
270
305
|
- Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
|
|
271
306
|
- Never run more than one intake cycle concurrently against the same repo.
|
|
272
|
-
- If `lisa:github-to-tracker` returns errors, treat them as gate failures: comment +
|
|
307
|
+
- If `lisa:github-to-tracker` returns errors, treat them as gate failures: comment + `$BLOCKED`. Don't silently fail.
|
|
273
308
|
|
|
274
309
|
## Adoption (one-time per repo)
|
|
275
310
|
|
|
276
|
-
Before this skill can run, the repo must adopt the
|
|
311
|
+
Before this skill can run, the repo must adopt the PRD lifecycle issue-label convention. Using the defaults:
|
|
277
312
|
|
|
278
313
|
1. Create the labels:
|
|
279
314
|
```bash
|
|
@@ -284,8 +319,9 @@ Before this skill can run, the repo must adopt the `prd-*` issue-label conventio
|
|
|
284
319
|
gh label create prd-ticketed --color 0E8A16 --description "Tickets created — see comments" --repo <org>/<repo>
|
|
285
320
|
gh label create prd-shipped --color 1D76DB --description "Work delivered (product owns)" --repo <org>/<repo>
|
|
286
321
|
```
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
322
|
+
If your project overrides any `github.labels.prd.*` role name in config, substitute the actual label names you configured.
|
|
323
|
+
2. Apply the `$READY` label to issues that are ready for ticketing.
|
|
324
|
+
3. Reserve `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` for this skill — humans should not set them manually except to recover from an error.
|
|
325
|
+
4. Keep the PRD label namespace strictly separate from the build-queue label namespace owned by `lisa:github-build-intake`.
|
|
290
326
|
|
|
291
327
|
If the repo hasn't adopted these labels, the first run exits with a label-convention error (not the idle empty-set message) — this distinguishes setup from a genuinely empty queue.
|