@codyswann/lisa 2.7.0 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/lisa.d.ts +21 -0
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +40 -1
- package/dist/core/lisa.js.map +1 -1
- package/dist/utils/postinstall-trampoline.d.ts +20 -0
- package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
- package/dist/utils/postinstall-trampoline.js +37 -0
- package/dist/utils/postinstall-trampoline.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +5 -5
- package/plugins/lisa/agents/github-agent.md +141 -0
- package/plugins/lisa/agents/github-build-intake.md +62 -0
- package/plugins/lisa/agents/github-prd-intake.md +64 -0
- package/plugins/lisa/agents/linear-prd-intake.md +5 -5
- package/plugins/lisa/agents/notion-prd-intake.md +5 -5
- package/plugins/lisa/commands/intake.md +2 -2
- package/plugins/lisa/commands/plan.md +2 -2
- package/plugins/lisa/rules/intent-routing.md +16 -11
- package/plugins/lisa/rules/tracker-resolution.md +76 -0
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -11
- package/plugins/{src/base/skills/confluence-to-jira → lisa/skills/confluence-to-tracker}/SKILL.md +31 -31
- package/plugins/lisa/skills/github-add-journey/SKILL.md +114 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +188 -0
- package/plugins/lisa/skills/github-create/SKILL.md +101 -0
- package/plugins/lisa/skills/github-evidence/SKILL.md +116 -0
- package/plugins/lisa/skills/github-journey/SKILL.md +121 -0
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +286 -0
- package/plugins/lisa/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/lisa/skills/github-sync/SKILL.md +73 -0
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +312 -0
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +288 -0
- package/plugins/lisa/skills/github-verify/SKILL.md +29 -0
- package/plugins/lisa/skills/github-write-issue/SKILL.md +304 -0
- package/plugins/lisa/skills/implement/SKILL.md +4 -4
- package/plugins/lisa/skills/intake/SKILL.md +14 -4
- package/plugins/lisa/skills/jira-source-artifacts/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +10 -10
- package/plugins/lisa/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/{src/base/skills/notion-to-jira → lisa/skills/notion-to-tracker}/SKILL.md +34 -34
- package/plugins/lisa/skills/plan/SKILL.md +8 -6
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +22 -12
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +1 -1
- package/plugins/lisa/skills/spec-conformance/SKILL.md +2 -3
- package/plugins/lisa/skills/ticket-triage/SKILL.md +7 -7
- package/plugins/lisa/skills/tracker-add-journey/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-create/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-journey/SKILL.md +24 -0
- package/plugins/lisa/skills/tracker-read/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-sync/SKILL.md +26 -0
- package/plugins/lisa/skills/tracker-validate/SKILL.md +35 -0
- package/plugins/lisa/skills/tracker-verify/SKILL.md +25 -0
- package/plugins/lisa/skills/tracker-write/SKILL.md +43 -0
- package/plugins/lisa/skills/verify/SKILL.md +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/skills/jira-verify/SKILL.md +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +5 -5
- package/plugins/src/base/agents/github-agent.md +141 -0
- package/plugins/src/base/agents/github-build-intake.md +62 -0
- package/plugins/src/base/agents/github-prd-intake.md +64 -0
- package/plugins/src/base/agents/linear-prd-intake.md +5 -5
- package/plugins/src/base/agents/notion-prd-intake.md +5 -5
- package/plugins/src/base/commands/intake.md +2 -2
- package/plugins/src/base/commands/plan.md +2 -2
- package/plugins/src/base/rules/intent-routing.md +16 -11
- package/plugins/src/base/rules/tracker-resolution.md +76 -0
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -11
- package/plugins/{lisa/skills/confluence-to-jira → src/base/skills/confluence-to-tracker}/SKILL.md +31 -31
- package/plugins/src/base/skills/github-add-journey/SKILL.md +114 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +188 -0
- package/plugins/src/base/skills/github-create/SKILL.md +101 -0
- package/plugins/src/base/skills/github-evidence/SKILL.md +116 -0
- package/plugins/src/base/skills/github-journey/SKILL.md +121 -0
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +286 -0
- package/plugins/src/base/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/src/base/skills/github-sync/SKILL.md +73 -0
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +312 -0
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +288 -0
- package/plugins/src/base/skills/github-verify/SKILL.md +29 -0
- package/plugins/src/base/skills/github-write-issue/SKILL.md +304 -0
- package/plugins/src/base/skills/implement/SKILL.md +4 -4
- package/plugins/src/base/skills/intake/SKILL.md +14 -4
- package/plugins/src/base/skills/jira-source-artifacts/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-verify/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +10 -10
- package/plugins/src/base/skills/{linear-to-jira → linear-to-tracker}/SKILL.md +30 -31
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/{lisa/skills/notion-to-jira → src/base/skills/notion-to-tracker}/SKILL.md +34 -34
- package/plugins/src/base/skills/plan/SKILL.md +8 -6
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +22 -12
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +1 -1
- package/plugins/src/base/skills/spec-conformance/SKILL.md +2 -3
- package/plugins/src/base/skills/ticket-triage/SKILL.md +7 -7
- package/plugins/src/base/skills/tracker-add-journey/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-create/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-journey/SKILL.md +24 -0
- package/plugins/src/base/skills/tracker-read/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-sync/SKILL.md +26 -0
- package/plugins/src/base/skills/tracker-validate/SKILL.md +35 -0
- package/plugins/src/base/skills/tracker-verify/SKILL.md +25 -0
- package/plugins/src/base/skills/tracker-write/SKILL.md +43 -0
- package/plugins/src/base/skills/verify/SKILL.md +1 -1
- package/plugins/src/expo/skills/jira-verify/SKILL.md +1 -1
- package/plugins/src/rails/skills/jira-verify/SKILL.md +1 -1
- /package/cdk/{copy-overwrite → merge}/.oxlintrc.json +0 -0
- /package/expo/{copy-overwrite → merge}/.oxlintrc.json +0 -0
- /package/nestjs/{copy-overwrite → merge}/.oxlintrc.json +0 -0
- /package/typescript/{copy-overwrite → merge}/.oxlintrc.json +0 -0
|
@@ -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
|
|
21
|
-
- JIRA ticket → `lisa:jira-read-ticket`
|
|
22
|
-
-
|
|
23
|
-
-
|
|
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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: intake
|
|
3
|
-
description: "Vendor-agnostic batch scanner for Ready queues. Given a Notion PRD database URL → finds Ready PRDs and runs lisa:plan per item. Given a Confluence space or parent page URL → finds prd-ready PRDs and runs lisa:plan per item. Given a Linear workspace URL or team key → finds prd-ready Linear projects and runs lisa:plan per item. Given a JIRA project key or JQL filter → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule — one cycle per invocation, processes everything currently Ready, exits cleanly on empty. Symmetric counterpart to the single-item lisa:plan and lisa:implement skills."
|
|
3
|
+
description: "Vendor-agnostic batch scanner for Ready queues. Given a Notion PRD database URL → finds Ready PRDs and runs lisa:plan per item. Given a Confluence space or parent page URL → finds prd-ready PRDs and runs lisa:plan per item. Given a Linear workspace URL or team key → finds prd-ready Linear projects and runs lisa:plan per item. Given a GitHub repo URL or `org/repo` token → finds prd-ready GitHub issues and runs lisa:plan per item. Given a JIRA project key or JQL filter → finds Ready tickets and runs lisa:implement per item. Given a GitHub repo URL or `org/repo` token when `tracker = github` → finds `status:ready` issues and runs lisa:implement per item. Designed as the cron target for /schedule — one cycle per invocation, processes everything currently Ready, exits cleanly on empty. Symmetric counterpart to the single-item lisa:plan and lisa:implement skills."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue", "mcp__linear-server__list_projects", "mcp__linear-server__list_teams", "mcp__linear-server__list_project_labels"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -47,7 +47,9 @@ Detect the queue type from `$ARGUMENTS` and route:
|
|
|
47
47
|
| The literal token `linear` | PRD queue (Linear, default workspace) | Invoke `lisa:linear-prd-intake linear` — only valid if `LINEAR_WORKSPACE` is configured |
|
|
48
48
|
| A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims each via In Progress, runs `lisa:implement` per ticket, transitions to On Dev on success) |
|
|
49
49
|
| A full JQL filter (e.g. `project = SE AND component = "frontend"`) | Work queue (JIRA, narrowed) | Invoke `lisa:jira-build-intake` with the JQL |
|
|
50
|
-
| A GitHub
|
|
50
|
+
| A GitHub **repository** URL or `org/repo` token (e.g. `https://github.com/acme/product-prds` or `acme/product-prds`) when used for **PRDs** | PRD queue (GitHub) | Invoke `lisa:github-prd-intake` (which queries `gh issue list --label prd-ready`, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline). PRD discovery is independent of the destination tracker — the resulting tickets land wherever `.lisa.config.json` `tracker` says. |
|
|
51
|
+
| A GitHub **repository** URL or `org/repo` token when `tracker = github` is configured (build-queue mode) | Work queue (GitHub) | Invoke `lisa:tracker-build-intake` which dispatches to `lisa:github-build-intake` (which queries `gh issue list --label status:ready`, claims via `status:in-progress`, runs `lisa:implement` per issue, relabels to `status:on-dev` on success). |
|
|
52
|
+
| The literal token `github` | Defaults to `.lisa.config.json` `github.org` / `github.repo`. Routes by **the `intake_mode` flag** in `$ARGUMENTS` (`prd` or `build`); if the flag is absent, prefer the PRD queue when both label namespaces are present, otherwise pick whichever exists. | Invoke the matching skill (`lisa:github-prd-intake` or `lisa:tracker-build-intake`). |
|
|
51
53
|
|
|
52
54
|
Disambiguation rules:
|
|
53
55
|
|
|
@@ -56,10 +58,13 @@ Disambiguation rules:
|
|
|
56
58
|
- An Atlassian Confluence URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` → Confluence parent-page queue (the page is the parent whose descendants are PRDs). If the user actually meant "this single page is a PRD, plan it", route to `lisa:plan` instead — this skill is batch-only.
|
|
57
59
|
- A `linear.app` URL → Linear queue. If the path is `/<workspace>` only or `/<workspace>/team/<KEY>/...`, route here. If the path includes `/project/<slug>-<id>` it's a single-PRD URL — direct the caller to `lisa:plan` instead, this skill is batch-only.
|
|
58
60
|
- The literal token `linear` (case-insensitive) → Linear queue, default workspace from `LINEAR_WORKSPACE`.
|
|
59
|
-
- A
|
|
61
|
+
- A `github.com` URL or an `<org>/<repo>` token → GitHub queue. The PRD-vs-build dispatch is determined by which label namespace the repo currently uses: PRD-side (`prd-ready`) → `lisa:github-prd-intake`; build-side (`status:ready` and `tracker = github` in `.lisa.config.json`) → `lisa:tracker-build-intake`. If both namespaces are present, prefer the PRD queue unless `$ARGUMENTS` includes `intake_mode=build`. If the URL points at a single issue (`https://github.com/<org>/<repo>/issues/<n>`), this skill is batch-only — direct the caller to `lisa:plan` (for a single PRD issue) or `lisa:implement` (for a single build issue).
|
|
62
|
+
- The literal token `github` (case-insensitive) → GitHub queue, default repo from `.lisa.config.json` `github.org` / `github.repo`.
|
|
63
|
+
- A bare alphanumeric token that matches the configured `JIRA_PROJECT` regex (uppercase letters / digits / hyphen, ≤10 chars) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `mcp__linear-server__list_teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
|
|
64
|
+
- An `<org>/<repo>` token (slash-separated, both halves are GitHub-name-shaped) → GitHub queue.
|
|
60
65
|
- A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
|
|
61
66
|
|
|
62
|
-
The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch skills (`lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:linear-prd-intake`, `lisa:jira-build-intake`) are internal — Intake is the public entry point. Developers schedule `/lisa:intake <queue>`; the rest is composition.
|
|
67
|
+
The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch skills (`lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:linear-prd-intake`, `lisa:github-prd-intake`, `lisa:jira-build-intake`, `lisa:github-build-intake`) are internal — Intake is the public entry point. Developers schedule `/lisa:intake <queue>`; the rest is composition.
|
|
63
68
|
|
|
64
69
|
## Cycle behavior
|
|
65
70
|
|
|
@@ -70,7 +75,9 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
|
|
|
70
75
|
- Notion PRDs → `lisa:notion-prd-intake` handles per-item: claim (Status=In Review), dry-run validate, branch to Blocked or Ticketed, coverage audit
|
|
71
76
|
- Confluence PRDs → `lisa:confluence-prd-intake` handles per-item: claim (relabel to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed`, coverage audit
|
|
72
77
|
- Linear PRDs → `lisa:linear-prd-intake` handles per-item: claim (relabel project to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed` (with a sentinel feedback issue under each project hosting clarifying-question comments), coverage audit
|
|
78
|
+
- GitHub PRDs → `lisa:github-prd-intake` handles per-item: claim (relabel issue to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed` (with clarifying-question comments posted directly on the PRD issue), coverage audit
|
|
73
79
|
- JIRA tickets → `lisa:jira-build-intake` handles per-item: claim, dispatch to `lisa:jira-agent`, transition to On Dev on success
|
|
80
|
+
- GitHub build issues (when `tracker = github`) → `lisa:tracker-build-intake` → `lisa:github-build-intake` handles per-item: claim (relabel to `status:in-progress`), dispatch to `lisa:github-agent`, relabel to `status:on-dev` on success
|
|
74
81
|
5. **Failure isolation** — one item failing does not stop the cycle; record under "Errors" and continue.
|
|
75
82
|
6. **Summary report** — per-item outcomes, total processed, total errors.
|
|
76
83
|
|
|
@@ -81,7 +88,10 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
|
|
|
81
88
|
/schedule "every 30 minutes" /lisa:intake https://acme.atlassian.net/wiki/spaces/PRD
|
|
82
89
|
/schedule "every 30 minutes" /lisa:intake https://linear.app/acme
|
|
83
90
|
/schedule "every 30 minutes" /lisa:intake https://linear.app/acme/team/ENG/projects
|
|
91
|
+
/schedule "every 30 minutes" /lisa:intake https://github.com/acme/product-prds
|
|
92
|
+
/schedule "every 30 minutes" /lisa:intake acme/product-prds
|
|
84
93
|
/schedule "every 30 minutes" /lisa:intake SE
|
|
94
|
+
/schedule "every 30 minutes" /lisa:intake acme/frontend-v2 intake_mode=build
|
|
85
95
|
/schedule "every hour" /lisa:intake "project = SE AND component = 'frontend'"
|
|
86
96
|
```
|
|
87
97
|
|
|
@@ -8,7 +8,7 @@ allowed-tools: []
|
|
|
8
8
|
|
|
9
9
|
This skill is doctrine, not action — it defines the rules. Skills that need to extract, classify, attach, or reason about external artifacts (design files, prototypes, recordings, data samples) invoke this skill to load the taxonomy and apply it.
|
|
10
10
|
|
|
11
|
-
The reason this lives in one place: silent drift across skills is the failure mode this body of rules exists to prevent. If the rules differ between `lisa:notion-to-
|
|
11
|
+
The reason this lives in one place: silent drift across skills is the failure mode this body of rules exists to prevent. If the rules differ between `lisa:notion-to-tracker`, `lisa:jira-create`, and `lisa:jira-write-ticket`, agents will silently route artifacts wrong and developers will lose source of truth. Edit here, propagate everywhere.
|
|
12
12
|
|
|
13
13
|
## 1. Domains
|
|
14
14
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-validate-ticket
|
|
3
|
-
description: "Validates a proposed JIRA ticket spec (or an existing ticket) against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. This is the single source of truth for what makes a valid ticket — both the write path (jira-write-ticket runs it pre-write) and the dry-run path (notion-to-
|
|
3
|
+
description: "Validates a proposed JIRA ticket spec (or an existing ticket) against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. This is the single source of truth for what makes a valid ticket — both the write path (jira-write-ticket runs it pre-write) and the dry-run path (notion-to-tracker runs it during PRD intake) call this skill so the bar can never drift."
|
|
4
4
|
allowed-tools: ["Bash", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getIssueLinkTypes", "mcp__atlassian__getJiraProjectIssueTypesMetadata", "mcp__atlassian__getVisibleJiraProjects", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Validate JIRA Ticket: $ARGUMENTS
|
|
8
8
|
|
|
9
|
-
Run all organizational quality gates against a ticket spec OR an existing ticket. **This skill is read-only — it never writes to JIRA.** The output is a structured report consumed by callers (`lisa:jira-write-ticket` for pre-write gating, `lisa:notion-to-
|
|
9
|
+
Run all organizational quality gates against a ticket spec OR an existing ticket. **This skill is read-only — it never writes to JIRA.** The output is a structured report consumed by callers (`lisa:jira-write-ticket` for pre-write gating, `lisa:notion-to-tracker` for PRD dry-run, `lisa:jira-verify` for post-write checks).
|
|
10
10
|
|
|
11
11
|
## Input
|
|
12
12
|
|
|
@@ -166,7 +166,7 @@ When `runtime_behavior_change = true`, description must contain `h2. Validation
|
|
|
166
166
|
|
|
167
167
|
The caller controls the strictness by passing `journey_followup: "auto"` or `journey_followup: "none"` in the spec:
|
|
168
168
|
- `auto` (default): if the section is absent, return `FAIL` with remediation `"Invoke lisa:jira-add-journey to append the section after create"`. Callers like `lisa:jira-write-ticket` know to chain `lisa:jira-add-journey` automatically, so this counts as a fixable failure they can resolve in-line — they re-run validation after appending.
|
|
169
|
-
- `none`: missing section is a `FAIL` that the caller will not auto-fix, so the verdict gates progress (used by dry-run paths like `lisa:notion-to-
|
|
169
|
+
- `none`: missing section is a `FAIL` that the caller will not auto-fix, so the verdict gates progress (used by dry-run paths like `lisa:notion-to-tracker` PRD intake, where there's no agent standing by to add the journey).
|
|
170
170
|
|
|
171
171
|
Either way the gate emits `FAIL`, not a third state. Strictness is the caller's policy, not the validator's.
|
|
172
172
|
|
|
@@ -8,7 +8,7 @@ allowed-tools: ["Skill", "mcp__atlassian__getJiraIssue", "mcp__atlassian__getAcc
|
|
|
8
8
|
|
|
9
9
|
Verify that the existing JIRA ticket `$ARGUMENTS` meets organizational standards. This skill is a thin post-write wrapper around `lisa:jira-validate-ticket`: it fetches the live ticket and asks `lisa:jira-validate-ticket` to run the gates against the fetched state.
|
|
10
10
|
|
|
11
|
-
This indirection exists so the gate definitions live in exactly one place (`lisa:jira-validate-ticket`). When the bar changes, change it there — `lisa:jira-verify`, `lisa:jira-write-ticket` (Phase 5.5 pre-write), and `lisa:notion-to-
|
|
11
|
+
This indirection exists so the gate definitions live in exactly one place (`lisa:jira-validate-ticket`). When the bar changes, change it there — `lisa:jira-verify`, `lisa:jira-write-ticket` (Phase 5.5 pre-write), and `lisa:notion-to-tracker` (PRD dry-run) all pick it up.
|
|
12
12
|
|
|
13
13
|
## Process
|
|
14
14
|
|
|
@@ -172,7 +172,7 @@ Identify and attach:
|
|
|
172
172
|
- Incident tickets (PagerDuty, Statuspage)
|
|
173
173
|
- **Source artifacts from the originating PRD / parent epic**: classify and inherit per the rules in `lisa:jira-source-artifacts` (invoke that skill if you haven't loaded the rules in this session). The short version: enumerate the parent epic's remote links and inherit the ones whose domain matches this ticket's scope (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 — attach it here.
|
|
174
174
|
|
|
175
|
-
If the ticket was generated from a PRD (by `lisa:notion-to-
|
|
175
|
+
If the ticket was generated from a PRD (by `lisa:notion-to-tracker` or similar) and the parent epic has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction before proceeding.
|
|
176
176
|
|
|
177
177
|
### 4d. Source Precedence (must appear on the ticket)
|
|
178
178
|
|
|
@@ -182,7 +182,7 @@ For UI-touching tickets, include the existing-component reuse expectation per `l
|
|
|
182
182
|
|
|
183
183
|
### 4e. Live Product Walkthrough Findings (UI-touching tickets)
|
|
184
184
|
|
|
185
|
-
If the ticket modifies an existing user-facing surface, a `lisa:product-walkthrough` should already have been run upstream (by `lisa:notion-to-
|
|
185
|
+
If the ticket modifies an existing user-facing surface, a `lisa:product-walkthrough` should already have been run upstream (by `lisa:notion-to-tracker` Phase 2b or `lisa:jira-create`). Inherit its findings under a `## Current Product` subsection in the ticket description so the implementer sees what's shipped today before changing it. If the upstream skill skipped the walkthrough but this ticket clearly modifies an existing surface, invoke `lisa:product-walkthrough` here before proceeding.
|
|
186
186
|
|
|
187
187
|
Use Jira's web UI or `mcp__atlassian__editJiraIssue` to set the `Development` field / remote links where supported.
|
|
188
188
|
|
|
@@ -202,7 +202,7 @@ Before create/update, verify each field is populated where applicable:
|
|
|
202
202
|
|
|
203
203
|
Before any write, invoke `lisa:jira-validate-ticket` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa:jira-validate-ticket` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
204
204
|
|
|
205
|
-
The validator is the **single source of truth** for what makes a valid ticket. The same gates are used by `lisa:notion-to-
|
|
205
|
+
The validator is the **single source of truth** for what makes a valid ticket. The same gates are used by `lisa:notion-to-tracker` dry-run, by `lisa:jira-verify` post-write, and here. Do not re-implement gate logic in this skill — if a gate needs to change, change `lisa:jira-validate-ticket` so every caller benefits.
|
|
206
206
|
|
|
207
207
|
If the validator reports `FAIL`:
|
|
208
208
|
- Surface the failure list and the per-gate remediation to the user.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-prd-intake
|
|
3
|
-
description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-
|
|
3
|
+
description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_teams"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -100,19 +100,19 @@ The `save_project` call must preserve all other project fields (description, sta
|
|
|
100
100
|
|
|
101
101
|
#### 3b. Dry-run validation
|
|
102
102
|
|
|
103
|
-
Invoke the `lisa:linear-to-
|
|
103
|
+
Invoke the `lisa:linear-to-tracker` skill with `dry_run: true` and the project's URL. The skill returns a structured report containing:
|
|
104
104
|
- The planned ticket hierarchy
|
|
105
105
|
- Per-ticket validation verdicts and remediation
|
|
106
106
|
- An overall PASS / FAIL verdict
|
|
107
107
|
- A failure count
|
|
108
108
|
|
|
109
|
-
This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:
|
|
109
|
+
This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:linear-to-tracker` calls per ticket.
|
|
110
110
|
|
|
111
111
|
#### 3c. Branch on the verdict
|
|
112
112
|
|
|
113
113
|
**If `PASS`** (every planned ticket passed every applicable gate):
|
|
114
114
|
|
|
115
|
-
1. Re-invoke `lisa:linear-to-
|
|
115
|
+
1. Re-invoke `lisa:linear-to-tracker` with `dry_run: false` to actually write the tickets. This re-runs Phases 1-5 and runs the preservation gate (Phase 5.5).
|
|
116
116
|
2. Capture the created ticket keys from the skill's output.
|
|
117
117
|
3. Ensure the project has a sentinel feedback issue (see "Sentinel feedback issue" below for the helper). Post a comment on it via `mcp__linear-server__save_comment` listing the created tickets (epic, stories, sub-tasks) with their JIRA URLs. Lead with: `"Ticketed by Claude. Created N JIRA issues — see below. Add the prd-shipped label to the Linear project after the work is delivered."`
|
|
118
118
|
4. Transition labels: remove `prd-in-review`, add `prd-ticketed` via `save_project`.
|
|
@@ -169,7 +169,7 @@ Use these exact badge labels — they are the validator's category values transl
|
|
|
169
169
|
|
|
170
170
|
- Gate IDs (`S4`, `F2`, etc.). Never appear in a comment body.
|
|
171
171
|
- JIRA terminology that has no product meaning (e.g. "Gherkin", "epic parent", "issue link", "validation journey", "sub-task hierarchy"). Paraphrase before posting.
|
|
172
|
-
- Internal skill names (`lisa:
|
|
172
|
+
- Internal skill names (`lisa:tracker-validate`, `linear-to-tracker`).
|
|
173
173
|
- Engineering shorthand (`AC`, `OOS`, `repo`, `env var`).
|
|
174
174
|
- "Clarify this" / "Please specify" without candidate resolutions. The validator is required to provide candidates; if `recommendation` is empty or vague, treat the failure as an Error and surface internally rather than posting a useless comment.
|
|
175
175
|
|
|
@@ -195,7 +195,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
195
195
|
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.3 — anchored on the relevant sub-issue when `prd_anchor` is non-null, on the sentinel feedback issue otherwise; category badge from the gap's `category` field; `What's unclear` and `Recommendation` from the audit report's `what` and `recommendation` fields. Apply the same forbidden-language rules from Phase 3c.5. (b) Post one summary comment on the sentinel feedback issue listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Transition labels from `prd-ticketed` back to `prd-blocked` via `save_project`. |
|
|
196
196
|
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave label as `prd-ticketed` with a comment flagging the audit failure for human review. |
|
|
197
197
|
|
|
198
|
-
3. The created tickets remain in
|
|
198
|
+
3. The created tickets remain in the destination tracker regardless of the verdict — they are valid in their own right. The audit only tells us whether *more* are needed.
|
|
199
199
|
|
|
200
200
|
### Phase 4 — Summary report
|
|
201
201
|
|
|
@@ -243,25 +243,25 @@ Idempotency: the helper finds-or-creates. Re-runs of the cycle reuse the same se
|
|
|
243
243
|
## Idempotency & safety
|
|
244
244
|
|
|
245
245
|
- **Single-cycle scope**: this skill processes the `prd-ready` set as it exists at the start of Phase 2. New `prd-ready` projects added mid-cycle are picked up next run.
|
|
246
|
-
- **No writes outside the lifecycle**: this skill only ever writes to
|
|
246
|
+
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:linear-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes Linear project labels among `prd-in-review`, `prd-blocked`, `prd-ticketed`, only ever creates/comments on the sentinel feedback issue (never any other Linear issue). It never edits project descriptions, never edits Linear documents, never touches `prd-draft` or `prd-shipped`, never archives or deletes projects.
|
|
247
247
|
- **Claim-first ordering**: the label flip to `prd-in-review` happens BEFORE validation runs, so a re-entrant call won't double-process.
|
|
248
248
|
- **Failure isolation**: an exception processing one project must not stop the cycle. Catch, record under "Errors" in the summary, continue to the next project. The project that errored is left labelled `prd-in-review` — the human investigates from there.
|
|
249
249
|
- **Single-label invariant**: after every transition, verify exactly one lifecycle label is present on the project. If two are present (rare race), surface as an Error and skip — do NOT auto-resolve, the human decides.
|
|
250
250
|
|
|
251
251
|
## Configuration
|
|
252
252
|
|
|
253
|
-
Same env vars as `lisa:linear-to-
|
|
253
|
+
Same env vars as `lisa:linear-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `LINEAR_WORKSPACE`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
|
|
254
254
|
|
|
255
255
|
## Rules
|
|
256
256
|
|
|
257
|
-
- Never write to
|
|
257
|
+
- Never write to the destination tracker outside of `lisa:linear-to-tracker` → `lisa:tracker-write`. The validator's verdict gates progress; bypassing it produces broken tickets.
|
|
258
258
|
- Never add or remove a label this skill doesn't own (`prd-in-review`, `prd-blocked`, `prd-ticketed`). Product owns `prd-draft`, `prd-ready`, `prd-shipped`. The issue-level `prd-intake-feedback` label is owned by this skill but is not a lifecycle label.
|
|
259
259
|
- Never edit a project's description or any attached Linear document. Communication with product happens only through comments on sub-issues or on the sentinel feedback issue.
|
|
260
260
|
- Never post a single dump of all gate failures on one comment. One comment per `prd_anchor` group on the relevant sub-issue (or one comment on the sentinel feedback issue for unanchored failures only). Comments must be sub-issue-anchored where possible, categorized, plain-language, and contain a concrete recommendation.
|
|
261
261
|
- Never include a gate ID, internal skill name, or engineering shorthand in a comment body.
|
|
262
262
|
- Never run more than one intake cycle concurrently against the same scope. This skill assumes serial execution.
|
|
263
263
|
- Never close, archive, or otherwise modify the sentinel feedback issue except to post comments on it. Its longevity is the audit trail.
|
|
264
|
-
- If `lisa:linear-to-
|
|
264
|
+
- If `lisa:linear-to-tracker` returns errors, treat them as gate failures: comment + `prd-blocked`. Don't silently fail.
|
|
265
265
|
|
|
266
266
|
## Adoption (one-time per project)
|
|
267
267
|
|