@codyswann/lisa 2.7.0 → 2.8.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.
Files changed (111) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/agents/confluence-prd-intake.md +5 -5
  4. package/plugins/lisa/agents/github-agent.md +141 -0
  5. package/plugins/lisa/agents/github-build-intake.md +62 -0
  6. package/plugins/lisa/agents/github-prd-intake.md +64 -0
  7. package/plugins/lisa/agents/linear-prd-intake.md +5 -5
  8. package/plugins/lisa/agents/notion-prd-intake.md +5 -5
  9. package/plugins/lisa/commands/intake.md +2 -2
  10. package/plugins/lisa/commands/plan.md +2 -2
  11. package/plugins/lisa/rules/intent-routing.md +16 -11
  12. package/plugins/lisa/rules/tracker-resolution.md +76 -0
  13. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -11
  14. package/plugins/lisa/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  15. package/plugins/lisa/skills/github-add-journey/SKILL.md +114 -0
  16. package/plugins/lisa/skills/github-build-intake/SKILL.md +188 -0
  17. package/plugins/lisa/skills/github-create/SKILL.md +101 -0
  18. package/plugins/lisa/skills/github-evidence/SKILL.md +116 -0
  19. package/plugins/lisa/skills/github-journey/SKILL.md +121 -0
  20. package/plugins/lisa/skills/github-prd-intake/SKILL.md +286 -0
  21. package/plugins/lisa/skills/github-read-issue/SKILL.md +248 -0
  22. package/plugins/lisa/skills/github-sync/SKILL.md +73 -0
  23. package/plugins/lisa/skills/github-to-tracker/SKILL.md +312 -0
  24. package/plugins/lisa/skills/github-validate-issue/SKILL.md +288 -0
  25. package/plugins/lisa/skills/github-verify/SKILL.md +29 -0
  26. package/plugins/lisa/skills/github-write-issue/SKILL.md +304 -0
  27. package/plugins/lisa/skills/implement/SKILL.md +4 -4
  28. package/plugins/lisa/skills/intake/SKILL.md +14 -4
  29. package/plugins/lisa/skills/jira-source-artifacts/SKILL.md +1 -1
  30. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +3 -3
  31. package/plugins/lisa/skills/jira-verify/SKILL.md +1 -1
  32. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  33. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +10 -10
  34. package/plugins/lisa/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  35. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
  36. package/plugins/{src/base/skills/notion-to-jira → lisa/skills/notion-to-tracker}/SKILL.md +34 -34
  37. package/plugins/lisa/skills/plan/SKILL.md +8 -6
  38. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +22 -12
  39. package/plugins/lisa/skills/product-walkthrough/SKILL.md +1 -1
  40. package/plugins/lisa/skills/spec-conformance/SKILL.md +2 -3
  41. package/plugins/lisa/skills/ticket-triage/SKILL.md +7 -7
  42. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +24 -0
  43. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +25 -0
  44. package/plugins/lisa/skills/tracker-create/SKILL.md +24 -0
  45. package/plugins/lisa/skills/tracker-evidence/SKILL.md +24 -0
  46. package/plugins/lisa/skills/tracker-journey/SKILL.md +24 -0
  47. package/plugins/lisa/skills/tracker-read/SKILL.md +25 -0
  48. package/plugins/lisa/skills/tracker-sync/SKILL.md +26 -0
  49. package/plugins/lisa/skills/tracker-validate/SKILL.md +35 -0
  50. package/plugins/lisa/skills/tracker-verify/SKILL.md +25 -0
  51. package/plugins/lisa/skills/tracker-write/SKILL.md +43 -0
  52. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  53. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo/skills/jira-verify/SKILL.md +1 -1
  56. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/skills/jira-verify/SKILL.md +1 -1
  59. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  60. package/plugins/src/base/agents/confluence-prd-intake.md +5 -5
  61. package/plugins/src/base/agents/github-agent.md +141 -0
  62. package/plugins/src/base/agents/github-build-intake.md +62 -0
  63. package/plugins/src/base/agents/github-prd-intake.md +64 -0
  64. package/plugins/src/base/agents/linear-prd-intake.md +5 -5
  65. package/plugins/src/base/agents/notion-prd-intake.md +5 -5
  66. package/plugins/src/base/commands/intake.md +2 -2
  67. package/plugins/src/base/commands/plan.md +2 -2
  68. package/plugins/src/base/rules/intent-routing.md +16 -11
  69. package/plugins/src/base/rules/tracker-resolution.md +76 -0
  70. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -11
  71. package/plugins/src/base/skills/{confluence-to-jira → confluence-to-tracker}/SKILL.md +31 -31
  72. package/plugins/src/base/skills/github-add-journey/SKILL.md +114 -0
  73. package/plugins/src/base/skills/github-build-intake/SKILL.md +188 -0
  74. package/plugins/src/base/skills/github-create/SKILL.md +101 -0
  75. package/plugins/src/base/skills/github-evidence/SKILL.md +116 -0
  76. package/plugins/src/base/skills/github-journey/SKILL.md +121 -0
  77. package/plugins/src/base/skills/github-prd-intake/SKILL.md +286 -0
  78. package/plugins/src/base/skills/github-read-issue/SKILL.md +248 -0
  79. package/plugins/src/base/skills/github-sync/SKILL.md +73 -0
  80. package/plugins/src/base/skills/github-to-tracker/SKILL.md +312 -0
  81. package/plugins/src/base/skills/github-validate-issue/SKILL.md +288 -0
  82. package/plugins/src/base/skills/github-verify/SKILL.md +29 -0
  83. package/plugins/src/base/skills/github-write-issue/SKILL.md +304 -0
  84. package/plugins/src/base/skills/implement/SKILL.md +4 -4
  85. package/plugins/src/base/skills/intake/SKILL.md +14 -4
  86. package/plugins/src/base/skills/jira-source-artifacts/SKILL.md +1 -1
  87. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +3 -3
  88. package/plugins/src/base/skills/jira-verify/SKILL.md +1 -1
  89. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  90. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +10 -10
  91. package/plugins/src/base/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
  92. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
  93. package/plugins/{lisa/skills/notion-to-jira → src/base/skills/notion-to-tracker}/SKILL.md +34 -34
  94. package/plugins/src/base/skills/plan/SKILL.md +8 -6
  95. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +22 -12
  96. package/plugins/src/base/skills/product-walkthrough/SKILL.md +1 -1
  97. package/plugins/src/base/skills/spec-conformance/SKILL.md +2 -3
  98. package/plugins/src/base/skills/ticket-triage/SKILL.md +7 -7
  99. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +24 -0
  100. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +25 -0
  101. package/plugins/src/base/skills/tracker-create/SKILL.md +24 -0
  102. package/plugins/src/base/skills/tracker-evidence/SKILL.md +24 -0
  103. package/plugins/src/base/skills/tracker-journey/SKILL.md +24 -0
  104. package/plugins/src/base/skills/tracker-read/SKILL.md +25 -0
  105. package/plugins/src/base/skills/tracker-sync/SKILL.md +26 -0
  106. package/plugins/src/base/skills/tracker-validate/SKILL.md +35 -0
  107. package/plugins/src/base/skills/tracker-verify/SKILL.md +25 -0
  108. package/plugins/src/base/skills/tracker-write/SKILL.md +43 -0
  109. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  110. package/plugins/src/expo/skills/jira-verify/SKILL.md +1 -1
  111. package/plugins/src/rails/skills/jira-verify/SKILL.md +1 -1
@@ -0,0 +1,288 @@
1
+ ---
2
+ name: github-validate-issue
3
+ description: "Validates a proposed GitHub Issue spec (or an existing issue) against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. The GitHub counterpart of lisa:jira-validate-ticket — same gate definitions, translated to the GitHub Issues data model. Single source of truth for what makes a valid GitHub Issue. Both the write path (github-write-issue runs it pre-write) and the dry-run path (github-to-tracker runs it during PRD intake) call this skill."
4
+ allowed-tools: ["Bash", "Read"]
5
+ ---
6
+
7
+ # Validate GitHub Issue: $ARGUMENTS
8
+
9
+ Run all organizational quality gates against an issue spec OR an existing issue. **This skill is read-only — it never writes to GitHub.** The output is a structured report consumed by callers (`lisa:github-write-issue` for pre-write gating, `lisa:github-to-tracker` for PRD dry-run, `lisa:github-verify` for post-write checks).
10
+
11
+ ## Input
12
+
13
+ `$ARGUMENTS` is one of:
14
+
15
+ 1. **An existing issue ref** (`org/repo#<number>` or `https://github.com/<org>/<repo>/issues/<number>`): fetch it and validate the live state. Use this for post-write checks.
16
+ 2. **A proposed issue spec** (YAML block, see schema below): validate as-is without touching GitHub. Use this for pre-write and dry-run checks.
17
+
18
+ ### Spec schema
19
+
20
+ Specs are passed as a fenced YAML block. Required keys depend on `issue_type`.
21
+
22
+ ```yaml
23
+ issue_type: Story # Story | Task | Bug | Epic | Spike | Sub-task | Improvement
24
+ org: my-org
25
+ repo: my-repo
26
+ summary: "[CU-1.2] Upload contract PDF from settings"
27
+ priority: medium
28
+ parent_ref: "my-org/my-repo#1234" # Parent Epic for non-Bug/non-Epic; Story for Sub-task
29
+ body: |
30
+ ## Context / Business Value
31
+ ...
32
+
33
+ ## Technical Approach
34
+ ...
35
+
36
+ ## Acceptance Criteria
37
+ ```gherkin
38
+ Scenario: <name>
39
+ Given <precondition>
40
+ When <action>
41
+ Then <observable outcome>
42
+ ```
43
+
44
+ ## Out of Scope
45
+ ...
46
+
47
+ ## Target Backend Environment
48
+ dev
49
+
50
+ ## Sign-in Required
51
+ Account: ...
52
+
53
+ ## Repository
54
+ backend-api
55
+
56
+ ## Validation Journey
57
+ ...
58
+
59
+ # Behavioral flags — caller asserts these so the validator can pick the right gates
60
+ runtime_behavior_change: true # → requires Target Backend Environment + Validation Journey
61
+ authenticated_surface: true # → requires Sign-in Required
62
+ artifacts_attached: true # → requires Source Precedence section
63
+ links: [{ ref: "my-org/my-repo#99", type: "is blocked by" }] # known issue links (may be empty)
64
+ remote_links: [{ url: "https://github.com/.../pull/42", title: "PR #42" }]
65
+ journey_followup: auto # auto | none — see S11
66
+ ```
67
+
68
+ If the caller passes only an issue ref, fetch via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees`, parse the body sections, derive the spec fields, then run gates. The parser lives in `lisa:github-read-issue` (composition).
69
+
70
+ ## Gates
71
+
72
+ Gates are grouped into **Specification** (spec-only checks, no GitHub lookups) and **Feasibility** (requires GitHub lookups). The dry-run path may opt to run Specification gates only via `--spec-only`; the write path runs both.
73
+
74
+ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Categories are the same fixed set used by `lisa:jira-validate-ticket` so downstream PRD-intake comment-formatting policy is shared across vendors.
75
+
76
+ | Gate | Category | Product-relevant |
77
+ |------|----------|------------------|
78
+ | S1 Required core fields | `structural` | false |
79
+ | S2 Summary format | `structural` | false |
80
+ | S3 Description three audiences | `product-clarity` | true |
81
+ | S4 Acceptance criteria in Gherkin | `acceptance-criteria` | true |
82
+ | S5 Bug-specific content | `product-clarity` | true |
83
+ | S6 Spike-specific content | `scope` | true |
84
+ | S7 Parent sub-issue declared | `structural` | false |
85
+ | S8 Target Backend Environment | `technical` | false |
86
+ | S9 Sign-in Required | `technical` | false |
87
+ | S10 Single-repo scope | `scope` | true |
88
+ | S11 Validation Journey | `acceptance-criteria` | true |
89
+ | S12 Source Precedence | `design-ux` | true |
90
+ | S13 Relationship Search | `dependency` | true |
91
+ | F1 Issue type label exists in repo | `structural` | false |
92
+ | F2 Parent sub-issue exists and is the right type | `structural` | false |
93
+ | F3 Linked issues exist | `structural` | false |
94
+ | F4 Required labels populated | `structural` | false |
95
+
96
+ Category values are the same fixed set as `lisa:jira-validate-ticket`:
97
+
98
+ - `product-clarity`, `acceptance-criteria`, `design-ux`, `scope`, `dependency`, `data`, `technical`, `structural`.
99
+
100
+ ### Specification Gates
101
+
102
+ #### S1 — Required core fields
103
+
104
+ `org`, `repo`, `issue_type`, `summary`, `priority`, `body` must all be present and non-empty.
105
+
106
+ #### S2 — Summary format
107
+
108
+ - Single line, ≤ 100 characters.
109
+ - Imperative voice ("Add X", "Fix Y", not "Adding X" or "X is broken").
110
+ - Bug / Task / Sub-task summaries SHOULD start with a `[repo-name]` prefix when the project convention uses one.
111
+
112
+ #### S3 — Description has all three audiences
113
+
114
+ Body must include all of these sections (case-insensitive `## ` headings):
115
+
116
+ - `Context / Business Value` — stakeholder-facing
117
+ - `Technical Approach` — developer-facing
118
+ - `Acceptance Criteria` — coding-assistant-facing
119
+ - `Out of Scope` — explicit non-coverage list
120
+
121
+ Missing any → FAIL with name of missing section.
122
+
123
+ #### S4 — Acceptance criteria in Gherkin
124
+
125
+ Applies when `issue_type ∈ {Story, Task, Bug, Sub-task, Improvement}`.
126
+
127
+ The `## Acceptance Criteria` section must contain at least one `Scenario:` block with `Given / When / Then` form, ideally inside a ` ```gherkin ` code fence. Reject prose-only criteria, "should work" language, or numbered lists without Given/When/Then verbs.
128
+
129
+ #### S5 — Bug-specific content
130
+
131
+ When `issue_type = Bug`, body must additionally include:
132
+
133
+ - Reproduction steps
134
+ - Expected vs. actual behavior
135
+ - Environment where reproduced
136
+
137
+ #### S6 — Spike-specific content
138
+
139
+ When `issue_type = Spike`, body must include:
140
+
141
+ - The question being answered
142
+ - Definition of done (decision doc / prototype / findings deliverable)
143
+
144
+ #### S7 — Parent sub-issue declared
145
+
146
+ When `issue_type ∉ {Bug, Epic}`, `parent_ref` must be set. The native sub-issue link is set by `lisa:github-write-issue` Phase 6 step 3. (Validity of the parent is checked in feasibility gate F2.)
147
+
148
+ #### S8 — Target Backend Environment
149
+
150
+ When `runtime_behavior_change = true`, body must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
151
+
152
+ #### S9 — Sign-in Required
153
+
154
+ When `authenticated_surface = true`, body must contain `## Sign-in Required` naming the account/role and credential source.
155
+
156
+ If the spec doesn't set `authenticated_surface`, infer it: scan the body and AC for sign-in / login / "as a {role} user" / authenticated route signals. If signals present and no `Sign-in Required` section: FAIL.
157
+
158
+ #### S10 — Repository section, single-repo scope
159
+
160
+ When `issue_type ∈ {Bug, Task, Sub-task}`, body must contain `## Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation to split into per-repo issues under a shared Epic.
161
+
162
+ (GitHub Issues live in one repo by definition, so the `## Repository` section is technically redundant — keep it for parity with the JIRA path so downstream tooling sees the same shape.)
163
+
164
+ Story / Epic / Spike / Improvement: skipped (may span repos).
165
+
166
+ #### S11 — Validation Journey present
167
+
168
+ When `runtime_behavior_change = true`, body must contain `## Validation Journey`. Skipped for doc-only / config-only / type-only / Epic.
169
+
170
+ The caller controls strictness via `journey_followup`:
171
+ - `auto` (default): missing section is FAIL with remediation `"Invoke lisa:github-add-journey to append the section after create"`. Callers like `lisa:github-write-issue` know to chain the followup automatically.
172
+ - `none`: missing section is FAIL the caller will not auto-fix (used by dry-run paths).
173
+
174
+ #### S12 — Source Precedence (when artifacts attached)
175
+
176
+ When `artifacts_attached = true`, body must include source-precedence guidance covering: business rules → PRD body, visual treatment → mocks, flow → prototypes, API/data → data artifacts. Cross-axis conflicts surfaced under `## Open Questions`.
177
+
178
+ Accept either placement:
179
+ - A dedicated `## Source Precedence` subsection, OR
180
+ - A "Source Precedence" / "authoritative source" paragraph under `## Technical Approach`.
181
+
182
+ Detect by scanning for the phrase `Source Precedence` (case-insensitive) AND verifying the four axes (business rules, visual, flow, data) are each named.
183
+
184
+ #### S13 — Relationship Search documented
185
+
186
+ The issue must EITHER have at least one entry in `links`, OR the body must contain a `## Relationship Search` block listing the git history queries and `gh issue list` queries that were run with their outcomes. ("Searched git history for `<keywords>` and `gh issue list` for label `component:X`; no related work found.")
187
+
188
+ An issue with zero links and no documented search: FAIL.
189
+
190
+ ### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
191
+
192
+ #### F1 — Issue type label exists in repo
193
+
194
+ ```bash
195
+ gh label list --repo <org>/<repo> --json name --jq '.[].name'
196
+ ```
197
+
198
+ Confirm `type:<issue_type>` exists. Missing labels can be auto-created by `lisa:github-write-issue` Phase 5 — flag the absence as a structural FAIL with remediation "Run `gh label create type:<issue_type>` or let the write path auto-create."
199
+
200
+ #### F2 — Parent sub-issue exists and is the right type
201
+
202
+ When `parent_ref` is set:
203
+
204
+ ```bash
205
+ gh issue view <number> --repo <org>/<repo> --json number,labels,state
206
+ ```
207
+
208
+ Confirm the parent issue exists and:
209
+ - For non-Sub-task children: parent has `type:Epic` label.
210
+ - For Sub-task children: parent has `type:Story`, `type:Task`, `type:Bug`, or `type:Improvement` (anything that can host sub-tasks).
211
+
212
+ #### F3 — Linked issues exist
213
+
214
+ For each entry in `links`, run `gh issue view <number> --repo <link-org>/<link-repo>` to confirm the ref resolves. Flag broken refs.
215
+
216
+ #### F4 — Required labels populated
217
+
218
+ Per `Phase 5` of `lisa:github-write-issue`, every issue MUST carry: `type:<issue_type>`, `status:<status>`, `priority:<priority>`. If any are missing from the spec / live issue, FAIL with the missing label name.
219
+
220
+ ## Execution
221
+
222
+ 1. Parse `$ARGUMENTS`. If it's an issue ref, fetch via `gh issue view --json` and derive the spec fields. Otherwise parse the YAML spec.
223
+ 2. Confirm `gh auth status` succeeds before any feasibility gate runs.
224
+ 3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
225
+ 4. Unless the caller passed `--spec-only`, run every Feasibility gate.
226
+ 5. Emit the report below.
227
+
228
+ ## Output
229
+
230
+ Output is a single fenced text block. Callers parse it; do not add free-form prose around it.
231
+
232
+ ```text
233
+ ## github-validate-issue: <ISSUE-REF-or-SUMMARY>
234
+
235
+ ### Specification Gates
236
+ - [PASS|FAIL|N/A] S1 Required core fields — <one-line reason>
237
+ - [PASS|FAIL|N/A] S2 Summary format — <one-line reason>
238
+ - [PASS|FAIL|N/A] S3 Description three audiences — <one-line reason>
239
+ - [PASS|FAIL|N/A] S4 Acceptance criteria in Gherkin — <one-line reason>
240
+ - [PASS|FAIL|N/A] S5 Bug-specific content — <one-line reason>
241
+ - [PASS|FAIL|N/A] S6 Spike-specific content — <one-line reason>
242
+ - [PASS|FAIL|N/A] S7 Parent sub-issue declared — <one-line reason>
243
+ - [PASS|FAIL|N/A] S8 Target Backend Environment — <one-line reason>
244
+ - [PASS|FAIL|N/A] S9 Sign-in Required — <one-line reason>
245
+ - [PASS|FAIL|N/A] S10 Single-repo scope — <one-line reason>
246
+ - [PASS|FAIL|N/A] S11 Validation Journey — <one-line reason>
247
+ - [PASS|FAIL|N/A] S12 Source Precedence — <one-line reason>
248
+ - [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
249
+
250
+ ### Feasibility Gates (omit this section when --spec-only)
251
+ - [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
252
+ - [PASS|FAIL|N/A] F2 Parent sub-issue exists and is the right type — <one-line reason>
253
+ - [PASS|FAIL|N/A] F3 Linked issues exist — <one-line reason>
254
+ - [PASS|FAIL|N/A] F4 Required labels populated — <one-line reason>
255
+
256
+ ### Verdict: PASS | FAIL
257
+ ### Failures: <count>
258
+ ### Failure details
259
+ - gate: <gate-id>
260
+ category: <product-clarity|acceptance-criteria|design-ux|scope|dependency|data|technical|structural>
261
+ product_relevant: <true|false>
262
+ what: <plain-language description, no gate IDs, no GitHub jargon — written for a non-engineer product owner>
263
+ recommendation: <1–3 concrete options the caller (or downstream product team) can pick from. Never "clarify this".>
264
+ - gate: <gate-id>
265
+ ...
266
+ ```
267
+
268
+ The verdict is `PASS` if every applicable gate is `PASS`. Any `FAIL` makes the verdict `FAIL`. `N/A` does not affect the verdict.
269
+
270
+ ### Failure-detail fields
271
+
272
+ Same shape and meaning as `lisa:jira-validate-ticket` so downstream PRD-intake skills (Notion, Confluence, Linear, GitHub) can format comments uniformly:
273
+
274
+ - **gate**: the gate ID (`S1`–`S13`, `F1`–`F4`).
275
+ - **category**: the gate's fixed category from the table.
276
+ - **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem the caller should fix without bothering product.
277
+ - **what**: plain-language, product-readable.
278
+ - **recommendation**: 1–3 concrete options.
279
+
280
+ ## Rules
281
+
282
+ - Never write to GitHub. The `allowed-tools` list intentionally excludes any `gh issue create / edit / comment / close` invocation.
283
+ - Never auto-fix the spec. This skill reports gaps; callers decide what to do.
284
+ - Never silently skip a gate. Return `N/A` with the reason if a gate genuinely doesn't apply; never omit it.
285
+ - The `what` and `recommendation` must be concrete and product-readable — vague guidance ("clarify this") is useless.
286
+ - Never emit a category outside the fixed set.
287
+ - `product_relevant` is determined by the gate, not by the failure context.
288
+ - When validating an existing issue ref, parse the body via the same logic as `lisa:github-read-issue` so the two skills agree on what they see.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: github-verify
3
+ description: This skill should be used when verifying that a GitHub Issue meets organizational standards for parent-sub-issue relationships and description quality. It fetches the live issue and delegates the gate checks to github-validate-issue so the bar matches what github-write-issue enforces pre-write. The GitHub counterpart of lisa:jira-verify.
4
+ allowed-tools: ["Skill", "Bash"]
5
+ ---
6
+
7
+ # Verify GitHub Issue: $ARGUMENTS
8
+
9
+ Verify that the existing GitHub Issue `$ARGUMENTS` (`org/repo#<number>` or full URL) meets organizational standards. This skill is a thin post-write wrapper around `lisa:github-validate-issue`: it fetches the live issue and asks the validator to run the gates against the fetched state.
10
+
11
+ This indirection exists so the gate definitions live in exactly one place (`lisa:github-validate-issue`). When the bar changes, change it there — `lisa:github-verify`, `lisa:github-write-issue` (Phase 5.5 pre-write), and `lisa:github-to-tracker` (PRD dry-run) all pick it up.
12
+
13
+ ## Process
14
+
15
+ 1. Confirm `gh auth status` succeeds.
16
+ 2. Parse `$ARGUMENTS`. Resolve `<org>`, `<repo>`, `<number>`.
17
+ 3. Fetch the issue via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees,author,createdAt,updatedAt,closed,closedAt,url`.
18
+ 4. Invoke `lisa:github-validate-issue` and pass the issue ref. The validator fetches its own copy and runs every gate (Specification + Feasibility) against the live state.
19
+ 5. Surface the validator's report verbatim to the caller.
20
+
21
+ ## Output
22
+
23
+ Pass through `lisa:github-validate-issue`'s structured output unchanged. Do not summarize or paraphrase — downstream callers (e.g. `lisa:github-agent`'s pre-flight gate) parse the gate lines.
24
+
25
+ ## Notes
26
+
27
+ - This skill is read-only. It never edits the issue, posts comments, or changes labels.
28
+ - If a gate fails, the recommendation is part of the validator's report; surface it as-is.
29
+ - The Validation Journey check (S11) parses the `## Validation Journey` markdown section — same parser logic as `lisa:github-add-journey` and `lisa:github-journey`.
@@ -0,0 +1,304 @@
1
+ ---
2
+ name: github-write-issue
3
+ description: "Creates or updates a GitHub Issue following the same organizational best practices as lisa:jira-write-ticket — three-audience description, Gherkin acceptance criteria, parent sub-issue (Epic/Story hierarchy), explicit relationship discovery, remote links, labels for status/components/priority/story-points, and Validation Journey. Uses the `gh` CLI exclusively (no MCP). Rejects thin issues. The GitHub counterpart of lisa:jira-write-ticket."
4
+ allowed-tools: ["Bash", "Skill", "Read"]
5
+ ---
6
+
7
+ # Write GitHub Issue: $ARGUMENTS
8
+
9
+ Create or update a GitHub Issue with all required relationships, metadata, and quality gates. Every section below is mandatory. Thin issues are rejected.
10
+
11
+ This skill is the GitHub counterpart of `lisa:jira-write-ticket`. The two skills share the same gates, description structure, acceptance-criteria format, and verification flow. The data-model translation is documented under "GitHub Issues data model" below — keep that table in sync with `lisa:github-validate-issue` so what one skill writes the other accepts.
12
+
13
+ Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
14
+
15
+ ## Prerequisites
16
+
17
+ - `gh` CLI installed and authenticated (`gh auth status` must succeed). The skill never falls back to a different transport — if `gh` is unauthenticated, stop and surface the auth error.
18
+ - `.lisa.config.json` must declare `github.org` and `github.repo` for the destination repository. The configured repo is the issue's home; pass it on every `gh` invocation via `--repo <org>/<repo>`.
19
+ - `jq` installed (used to parse `gh` JSON outputs without hand-rolling parsers).
20
+
21
+ ## Phase 1 — Resolve Intent
22
+
23
+ Determine from `$ARGUMENTS` and context whether this is a CREATE or UPDATE:
24
+
25
+ - **CREATE**: no existing issue ref provided.
26
+ - **UPDATE**: an issue ref provided (`org/repo#<number>` or a full `https://github.com/<org>/<repo>/issues/<number>` URL). Call `lisa:github-read-issue <ref>` first to load the full current state before editing. Never overwrite without reading.
27
+
28
+ Resolve `<ORG>` and `<REPO>` from the ref or from `.lisa.config.json`.
29
+
30
+ ## Phase 2 — Gather Required Inputs
31
+
32
+ | Field | Required For | Notes |
33
+ |-------|--------------|-------|
34
+ | Issue type | CREATE | `Epic`, `Story`, `Task`, `Bug`, `Sub-task`, `Spike`, `Improvement`. Encoded as a label `type:<value>`. |
35
+ | Summary (title) | CREATE, UPDATE | One line, imperative voice, under 100 chars. |
36
+ | Description (body) | CREATE, UPDATE | Multi-section markdown — see Phase 3. |
37
+ | Parent sub-issue | Non-bug, non-epic | Native GitHub sub-issue link. Enforced by `lisa:github-verify`. |
38
+ | Priority | CREATE | Label `priority:<low|medium|high|critical>`. |
39
+ | Acceptance criteria | Story, Task, Bug, Sub-task, Improvement | Gherkin in `## Acceptance Criteria` — see Phase 3. |
40
+ | Validation Journey | Runtime-behavior changes | Delegate to `/github-add-journey`. |
41
+ | Target backend environment | Runtime-behavior changes | Recorded under `## Target Backend Environment`. Skip only for doc / config / type-only. |
42
+ | Sign-in account / credentials | Authenticated-surface tickets | Recorded under `## Sign-in Required`. |
43
+ | Repository | Bug, Task, Sub-task | GitHub Issues live in exactly one repo by definition — record the repo name under `## Repository`, and reject any AC bullet that references a different repo. |
44
+
45
+ Optional but recommended: assignee, milestone, components (label `component:<name>`), story points (label `points:<n>`), labels.
46
+
47
+ Use `gh api repos/<org>/<repo>/labels --paginate` to discover existing labels before referencing one. If a required label doesn't exist (e.g., `type:Story`, `status:ready`, `priority:high`), create it via `gh label create <name> --color <hex> --description <desc> --repo <org>/<repo>`. The first run on a fresh repo will create the full label set; subsequent runs reuse them.
48
+
49
+ ## Phase 3 — Description Quality
50
+
51
+ The description (issue body) MUST address three audiences. Reject and rewrite if any are missing.
52
+
53
+ ```markdown
54
+ ## Context / Business Value
55
+ [Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
56
+ Link to the originating Slack thread, PRD page, incident, or customer report.]
57
+
58
+ ## Technical Approach
59
+ [Developer-facing. Integration points, impacted modules, data model implications,
60
+ relevant tradeoffs. Not a full design doc — a pointer for someone picking it up.]
61
+
62
+ ## Acceptance Criteria
63
+ ```gherkin
64
+ Scenario: <name>
65
+ Given <precondition>
66
+ When <action>
67
+ Then <observable outcome>
68
+
69
+ Scenario: <name>
70
+ Given <precondition>
71
+ When <action>
72
+ Then <observable outcome>
73
+ ```
74
+
75
+ ## Out of Scope
76
+ [Explicit list of what this issue does NOT cover. Forces scope discipline.]
77
+
78
+ ## Target Backend Environment
79
+ [Required when the issue changes runtime behavior. One of: dev / staging / prod.
80
+ Skip section entirely for doc-only, config-only, or type-only issues.]
81
+
82
+ ## Sign-in Required
83
+ [Include this section ONLY if the work touches authenticated surfaces.
84
+ Specify: the account/role, where to get the credentials (1Password item,
85
+ env var, seeded fixture), and any MFA/SSO notes.]
86
+
87
+ ## Repository
88
+ [Required for Bug / Task / Sub-task. Name the single repo this issue covers.
89
+ If the work spans repos, this issue type is wrong — split into per-repo
90
+ Tasks/Sub-tasks under a parent Story or Epic.]
91
+
92
+ ## Source Artifacts
93
+ [Group by domain (UI / UX flow / Data / Ops / Reference). One bullet per
94
+ artifact with title and URL. Inherited from the parent epic per the rules
95
+ in lisa:jira-source-artifacts.]
96
+
97
+ ## Source Precedence
98
+ [When artifacts are attached, name the authoritative source per axis:
99
+ business rules → PRD body, visual treatment → mocks, flow → prototypes,
100
+ API/data → data artifacts. Cross-axis conflicts go under Open Questions.]
101
+
102
+ ## Links
103
+ [Remote links: PRs (`Resolves <org>/<repo>#<pr>`), Confluence pages,
104
+ dashboards, incident tickets. Native `Resolves #<pr>` lines are picked up
105
+ by GitHub for auto-close.]
106
+
107
+ ## Relationship Search
108
+ [Document the git+search outcomes from Phase 4b. "Searched git history
109
+ for `<keywords>` and `gh issue list` for label `component:X`; no related
110
+ work found." A no-result outcome is acceptable when documented.]
111
+
112
+ ## Validation Journey
113
+ [Delegate to /github-add-journey if the issue changes runtime behavior.
114
+ Skip only for doc-only, config-only, or type-only issues.]
115
+ ```
116
+
117
+ Rules:
118
+ - Every acceptance criterion uses Given/When/Then. No vague "should work" language.
119
+ - Every criterion is independently verifiable.
120
+ - If the issue is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
121
+ - If the issue is a Spike, include the question being answered and the definition of done.
122
+ - If sign-in is required, the implementer must be able to sign in from the description alone.
123
+
124
+ ## Phase 4 — Relationship Discovery (Mandatory)
125
+
126
+ ### 4a. Parent sub-issue
127
+
128
+ If the issue is not a Bug and not an Epic, it MUST have a parent sub-issue:
129
+
130
+ 1. If explicitly provided, use that issue number.
131
+ 2. Otherwise search active Epic issues:
132
+ ```bash
133
+ gh issue list --repo <org>/<repo> --label type:Epic --state open --json number,title,body --limit 100
134
+ ```
135
+ Match on keywords from the summary and description.
136
+ 3. If no Epic matches, stop and ask the human to create or pick one. Do NOT orphan the issue.
137
+
138
+ ### 4b. Related issues
139
+
140
+ Run BOTH searches and document outcomes — never declare "no related work" without doing both.
141
+
142
+ **Search 1: local git history**
143
+
144
+ ```bash
145
+ git log --all --oneline --grep="<keyword>"
146
+ git log --all --oneline -- <path-or-glob>
147
+ git log --since=90.days --oneline -- <path-or-glob>
148
+ ```
149
+
150
+ If a PR or commit surfaces, capture the PR URL — it becomes a Phase 4c link.
151
+
152
+ **Search 2: GitHub issue search**
153
+
154
+ ```bash
155
+ gh issue list --repo <org>/<repo> --search "<keyword>" --state all --limit 50 --json number,title,state,labels,updatedAt
156
+ gh issue list --repo <org>/<repo> --label "component:<component>" --state open --limit 100 --json number,title,state
157
+ gh issue list --repo <org>/<repo> --search "epic:#<epic-number>" --state all --limit 50 --json number,title,state
158
+ ```
159
+
160
+ For each candidate, classify the relationship using these markdown conventions in the issue body (under `## Links`):
161
+
162
+ | Link type | How it's encoded |
163
+ |-----------|------------------|
164
+ | `blocks` | `Blocks #<number>` (or full `org/repo#<number>` for cross-repo) |
165
+ | `is blocked by` | `Blocked by #<number>` |
166
+ | `relates to` | `Relates to #<number>` |
167
+ | `duplicates` | `Duplicates #<number>` (and close one as duplicate via `gh issue close <number> --reason "duplicate of #<other>"`) |
168
+ | `clones` | `Cloned from #<number>` |
169
+
170
+ GitHub does not have a native typed-link primitive for issues (only `Resolves #<pr>` for PR↔Issue). The text conventions above are parsed by `lisa:github-read-issue` to reconstruct the relationship graph.
171
+
172
+ ### 4c. Remote links
173
+
174
+ Identify and attach (under `## Links`):
175
+ - Related GitHub PRs, branches, or commits.
176
+ - Confluence / Notion / Linear PRD pages (the originating PRD).
177
+ - Dashboards (Grafana, Datadog, Sentry).
178
+ - **Source artifacts from the originating PRD / parent Epic**: classify and inherit per `lisa:jira-source-artifacts`. Inherit by domain — UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`. Never assume a developer will walk up to the Epic to find design context.
179
+
180
+ If the issue was generated from a PRD and the parent Epic has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction.
181
+
182
+ ### 4d. Source Precedence (must appear in description)
183
+
184
+ Same rule as `lisa:jira-write-ticket` Phase 4d — record source precedence under `## Source Precedence` (or a paragraph under `## Technical Approach`) when artifacts are attached. Cross-axis conflicts go under `## Open Questions`.
185
+
186
+ ### 4e. Live Product Walkthrough Findings (UI-touching issues)
187
+
188
+ If the issue modifies an existing user-facing surface, a `lisa:product-walkthrough` should already have been run upstream. Inherit findings under `## Current Product`.
189
+
190
+ ## Phase 5 — Set Metadata
191
+
192
+ GitHub Issues uses **labels** for the structured metadata that JIRA stores in custom fields. Apply the conventions:
193
+
194
+ | Concept | Label format | Example |
195
+ |---------|--------------|---------|
196
+ | Issue type | `type:<value>` | `type:Story`, `type:Bug`, `type:Epic`, `type:Sub-task`, `type:Spike`, `type:Improvement` |
197
+ | Status | `status:<value>` | `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done` |
198
+ | Priority | `priority:<value>` | `priority:low`, `priority:medium`, `priority:high`, `priority:critical` |
199
+ | Components | `component:<name>` | `component:auth`, `component:billing` |
200
+ | Story points | `points:<n>` | `points:3`, `points:5`, `points:8` |
201
+ | Fix version | `fix-version:<value>` | `fix-version:2.7.0` |
202
+ | Repo (multi-repo orgs) | implicit (issue lives in the repo) | — |
203
+ | Triage marker | `claude-triaged-<repo>` | `claude-triaged-frontend-v2` |
204
+
205
+ Milestones map to `fix-version:<value>` labels OR native GitHub Milestones — pick one convention per repo and document it in `.lisa.config.json` if needed. Default to labels for parity with the JIRA fix-version concept.
206
+
207
+ Create labels lazily — call `gh label create` if a referenced label doesn't exist. Use a stable color palette per category so the issue board reads cleanly.
208
+
209
+ ## Phase 5.5 — Validate (Pre-write Gate)
210
+
211
+ Before any write, invoke `lisa:github-validate-issue` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa:github-validate-issue` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
212
+
213
+ `lisa:github-validate-issue` is the **single source of truth** for what makes a valid GitHub Issue in this pipeline — same gate definitions as `lisa:jira-validate-ticket`, translated to GitHub's data model. Do not re-implement gate logic here.
214
+
215
+ If the validator reports `FAIL`, do NOT proceed to Phase 6. Fix the spec and re-run validation. Never call `gh issue create` while the validator's verdict is FAIL.
216
+
217
+ ## Phase 6 — Create or Update
218
+
219
+ ### CREATE
220
+
221
+ 1. Compose the body markdown from Phases 2/3/4 in a temp file (avoid quoting hell):
222
+ ```bash
223
+ gh issue create \
224
+ --repo <org>/<repo> \
225
+ --title "<summary>" \
226
+ --body-file /tmp/issue-body.md \
227
+ --label "type:<type>" --label "status:ready" --label "priority:<priority>" \
228
+ [--label "component:<name>" ...] [--milestone "<milestone>"] \
229
+ [--assignee "<login>"]
230
+ ```
231
+ 2. Capture the returned issue number.
232
+ 3. **Link to parent sub-issue** (if non-Epic): use the GraphQL sub-issue API.
233
+
234
+ Resolve the new issue's GraphQL node ID:
235
+ ```bash
236
+ child_id=$(gh api graphql -f query='query($org:String!,$repo:String!,$number:Int!){repository(owner:$org,name:$repo){issue(number:$number){id}}}' -F org=<org> -F repo=<repo> -F number=<new_number> --jq '.data.repository.issue.id')
237
+ ```
238
+ Resolve the parent issue's GraphQL node ID the same way. Then call:
239
+ ```bash
240
+ gh api graphql -f query='mutation($parentId:ID!,$childId:ID!){addSubIssue(input:{issueId:$parentId,subIssueId:$childId}){issue{number}subIssue{number}}}' -F parentId=$parent_id -F childId=$child_id
241
+ ```
242
+ If the GraphQL mutation isn't available on the repo (older GHES, sub-issues feature off), fall back to text linkage in the body (`Parent: #<parent>`) and surface a warning to the caller. Do NOT silently proceed without recording the parent.
243
+ 4. Phase 4b relationship lines (`Blocks #...`, `Blocked by #...`, etc.) are already in the body. No separate API call is needed — `lisa:github-read-issue` parses them on read.
244
+ 5. If the issue changes runtime behavior, invoke the `lisa:github-add-journey` skill to append the Validation Journey section.
245
+
246
+ ### UPDATE
247
+
248
+ 1. Re-read the current body via `gh issue view <number> --repo <org>/<repo> --json body --jq '.body'`. Edit only the sections being changed; preserve everything else verbatim.
249
+ 2. Apply the edit:
250
+ ```bash
251
+ gh issue edit <number> --repo <org>/<repo> --body-file /tmp/updated-body.md
252
+ ```
253
+ 3. Add labels: `gh issue edit <number> --add-label "<new-label>"`. Remove labels: `--remove-label`.
254
+ 4. Add new relationship lines to `## Links` if needed. Existing links are not touched unless explicitly removed.
255
+
256
+ ## Phase 7 — Verify
257
+
258
+ Call the `lisa:github-verify` skill on the resulting issue. `lisa:github-verify` re-fetches the issue and runs `lisa:github-validate-issue` against the live state — same gates as Phase 5.5, applied to what GitHub actually stored.
259
+
260
+ If it reports failures, fix them before returning.
261
+
262
+ ## Phase 8 — Announce
263
+
264
+ Post a creation comment via `gh issue comment <number> --repo <org>/<repo> --body-file /tmp/announce.md` with:
265
+ - `[<repo>]` prefix when the issue is repo-scoped (Bug / Task / Sub-task).
266
+ - Who the issue is assigned to.
267
+ - The relationships set in Phase 4b (`Blocks`, `Blocked by`, `Relates to`) with links.
268
+ - Any remote PRs attached.
269
+
270
+ Skip on UPDATE when no material change was made.
271
+
272
+ ## GitHub Issues data model
273
+
274
+ The mapping below is the single source of truth for how JIRA concepts translate to GitHub Issues. Mirror this in `lisa:github-validate-issue` and `lisa:github-read-issue` so the shape is symmetric.
275
+
276
+ | JIRA concept | GitHub Issues equivalent |
277
+ |---|---|
278
+ | Issue type | Label `type:<value>` |
279
+ | Status (Ready / In Progress / Code Review / On Dev / Done) | Label `status:<value>` |
280
+ | Epic / Story / Sub-task hierarchy | Native sub-issues via `gh api graphql addSubIssue` |
281
+ | Acceptance Criteria | `## Acceptance Criteria` markdown section with a Gherkin code-fence |
282
+ | Validation Journey | `## Validation Journey` markdown section |
283
+ | Source artifacts | `## Source Artifacts` markdown section grouped by domain |
284
+ | Epic parent | Native parent sub-issue link |
285
+ | Issue links (`blocks` / `is blocked by` / `relates to` / `duplicates` / `clones`) | Quick-action lines under `## Links`: `Blocks #N`, `Blocked by #N`, `Relates to #N`, `Duplicates #N`, `Cloned from #N` |
286
+ | Remote links (PRs, dashboards) | Markdown links under `## Links` plus native `Resolves #<pr>` for PR↔Issue auto-close |
287
+ | Components | Label `component:<name>` |
288
+ | Fix version | Label `fix-version:<value>` (or native milestone) |
289
+ | Story points | Label `points:<n>` |
290
+ | Priority | Label `priority:<value>` |
291
+ | Custom-field "Reporter" (the human) | The issue's `author` (immutable) plus the `Filed by:` line in the body |
292
+ | Worklog | Comments (no native time tracking) |
293
+ | Triage marker | Label `claude-triaged-<repo>` |
294
+
295
+ ## Rules
296
+
297
+ - Never create a non-bug issue without a parent Epic / Story (sub-issue link).
298
+ - Never skip relationship discovery — both git history AND `gh issue list` searches must run; outcomes documented under `## Relationship Search`. "None found" is acceptable only when documented.
299
+ - Never create a Bug, Task, or Sub-task whose AC references work in a different repo. GitHub Issues already live in one repo; reject AC bullets that span others — split into per-repo issues under a shared Epic.
300
+ - Never include a runtime-behavior issue without a target backend environment, and never include an authenticated-surface issue without sign-in credentials.
301
+ - Never overwrite an issue body without reading the current version first.
302
+ - All writes go through this skill (or the `tracker-write` shim). Other vendor-neutral skills must NEVER call `gh issue create` directly.
303
+ - The gate logic lives in `lisa:github-validate-issue`, NOT here. This skill calls the validator at Phase 5.5 and Phase 7. When a gate needs to change, change it in `lisa:github-validate-issue`.
304
+ - Never bypass the sub-issue mutation by encoding the parent only in the body. The native sub-issue link is what `lisa:github-read-issue` and the GitHub UI use to render the hierarchy.
@@ -17,10 +17,10 @@ When you do create the team, spawn every agent with `mode: "plan"` so they must
17
17
 
18
18
  $ARGUMENTS is either a url to a ticket containing the request, a pointer to a file containing the request, or the request in text format.
19
19
 
20
- If it's a ticket, use the appropriate vendor adapter to read and fully understand the request:
21
- - JIRA ticket → `lisa:jira-read-ticket` (preferred) or the Jira CLI
22
- - Linear ticketthe Linear CLI (no `lisa:linear-*` adapter built yet)
23
- - GitHub ticket → the Github CLI
20
+ If it's a ticket, use `lisa:tracker-read` (preferred vendor-agnostic; dispatches per `.lisa.config.json` `tracker`):
21
+ - JIRA ticket → `lisa:tracker-read` → `lisa:jira-read-ticket`
22
+ - GitHub Issue`lisa:tracker-read` `lisa:github-read-issue`
23
+ - Linear ticket → the Linear CLI (no `lisa:linear-*` build-side adapter; Linear is a PRD source only)
24
24
 
25
25
  Capture comments and metadata, not just the description.
26
26