@codyswann/lisa 2.10.1 → 2.11.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/README.md +65 -14
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
- package/plugins/lisa/agents/github-prd-intake.md +2 -2
- package/plugins/lisa/agents/linear-agent.md +128 -0
- package/plugins/lisa/agents/linear-build-intake.md +62 -0
- package/plugins/lisa/agents/linear-prd-intake.md +2 -2
- package/plugins/lisa/agents/notion-prd-intake.md +1 -1
- package/plugins/lisa/commands/plan.md +1 -1
- package/plugins/lisa/rules/config-resolution.md +187 -0
- package/plugins/lisa/rules/intent-routing.md +13 -13
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/lisa/skills/github-create/SKILL.md +4 -4
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/lisa/skills/implement/SKILL.md +1 -1
- package/plugins/lisa/skills/intake/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
- package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/lisa/skills/plan/SKILL.md +3 -2
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
- package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
- 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-create/SKILL.md +4 -4
- 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-create/SKILL.md +4 -4
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
- package/plugins/src/base/agents/github-prd-intake.md +2 -2
- package/plugins/src/base/agents/linear-agent.md +128 -0
- package/plugins/src/base/agents/linear-build-intake.md +62 -0
- package/plugins/src/base/agents/linear-prd-intake.md +2 -2
- package/plugins/src/base/agents/notion-prd-intake.md +1 -1
- package/plugins/src/base/commands/plan.md +1 -1
- package/plugins/src/base/rules/config-resolution.md +187 -0
- package/plugins/src/base/rules/intent-routing.md +13 -13
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/src/base/skills/github-create/SKILL.md +4 -4
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/src/base/skills/implement/SKILL.md +1 -1
- package/plugins/src/base/skills/intake/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
- package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
- package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/src/base/skills/plan/SKILL.md +3 -2
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
- package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
- package/plugins/src/base/skills/verify/SKILL.md +1 -1
- package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa/rules/tracker-resolution.md +0 -76
- package/plugins/src/base/rules/tracker-resolution.md +0 -76
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-build-intake
|
|
3
|
+
description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims status:ready Issues, dispatches each to the linear-agent build flow, relabels to status:on-dev on success. Symmetric counterpart of jira-build-intake and github-build-intake. Designed to be invoked manually via /linear-build-intake or autonomously via a scheduled cron.
|
|
4
|
+
skills:
|
|
5
|
+
- linear-build-intake
|
|
6
|
+
- linear-read-issue
|
|
7
|
+
- linear-verify
|
|
8
|
+
- linear-validate-issue
|
|
9
|
+
- linear-write-issue
|
|
10
|
+
- linear-sync
|
|
11
|
+
- linear-evidence
|
|
12
|
+
- linear-add-journey
|
|
13
|
+
- ticket-triage
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Linear Build Intake Agent
|
|
17
|
+
|
|
18
|
+
You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find `status:ready` Issues, dispatch each through the build flow, relabel successful builds to `status:on-dev` — then report what happened.
|
|
19
|
+
|
|
20
|
+
## Confirmation policy
|
|
21
|
+
|
|
22
|
+
Once you have a team key, RUN. Do not ask the caller whether to proceed, do not preview projected scope (Issue counts, PR counts, build estimates), do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you. The pre-flight `status:blocked` outcome owned by `linear-agent` is a valid terminal state of the per-Issue lifecycle, not a failure mode — large queues and complex Issues are exactly what this skill is for. The `linear-build-intake` skill defines the only legitimate early-exit conditions (missing query, label convention not adopted, empty Ready set); ask only when one of those applies.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
### 1. Receive the query
|
|
27
|
+
|
|
28
|
+
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear team key (e.g. `ENG`) or the literal token `linear` (which falls back to `linear.teamKey` in `.lisa.config.json`). You do not pick the team yourself.
|
|
29
|
+
|
|
30
|
+
If no query is provided AND no `linear.teamKey` is configured, stop and ask. Never run intake against a default scope without explicit configuration — the side effects (label transitions, PRs opened, builds running) are too high to act without an explicit target.
|
|
31
|
+
|
|
32
|
+
### 2. Run the intake skill
|
|
33
|
+
|
|
34
|
+
Invoke the `linear-build-intake` skill with the query as `$ARGUMENTS`. The skill owns the cycle logic — Linear MCP queries, claim, dispatch to `linear-agent`, transition on success, summary. Do not duplicate that logic here.
|
|
35
|
+
|
|
36
|
+
The skill in turn invokes `linear-agent` per Issue, which owns the per-Issue lifecycle (read full graph, verify, triage, route to flow, sync progress, post evidence). You do not call `linear-agent` directly — the intake skill does.
|
|
37
|
+
|
|
38
|
+
### 3. Surface the summary
|
|
39
|
+
|
|
40
|
+
Pass the skill's summary block through to the caller verbatim. The caller needs the structured record:
|
|
41
|
+
|
|
42
|
+
- Total processed
|
|
43
|
+
- Per-Issue outcomes (`status:on-dev` → which PR; `status:blocked` by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
|
|
44
|
+
- PR count
|
|
45
|
+
|
|
46
|
+
If the cycle errored before processing any Issues (e.g. label convention not adopted — `status:ready` doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent labels.
|
|
47
|
+
|
|
48
|
+
### 4. Suggest next actions when warranted
|
|
49
|
+
|
|
50
|
+
After a successful cycle, if any Issues ended at `status:on-dev`, mention that the next phase (QA, deploy, or downstream verification) is owned by humans or a future intake skill. This skill does not own anything past `status:on-dev`.
|
|
51
|
+
|
|
52
|
+
If any Issues ended at `status:blocked` (pre-flight verify failed) or `Held` (triage found ambiguities), point that out so the caller knows which Issues need human attention before they can be re-claimed. The `status:blocked` ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
|
|
53
|
+
|
|
54
|
+
## Rules
|
|
55
|
+
|
|
56
|
+
- **Never run a cycle without an explicit query or configured `linear.teamKey`.** Side effects too high to default.
|
|
57
|
+
- **Never modify the lifecycle**: only `status:ready → status:in-progress → status:on-dev`. Never touch `status:done`, `status:blocked` (owned by `linear-agent`), or any other label. (Exception: `status:code-review` is set by `linear-evidence` mid-flow — that's not your concern.)
|
|
58
|
+
- **Never bypass `linear-agent` to do build work directly.** The intake skill dispatches; `linear-agent` builds. Skipping the dispatch produces broken work.
|
|
59
|
+
- **Never invent labels.** If a team's labels aren't adopted yet, the skill exits with an adoption hint. Don't guess label names.
|
|
60
|
+
- **Never start a second cycle while one is in flight against an overlapping team.** Serial execution. Scheduling layer (when added) is responsible for not double-firing.
|
|
61
|
+
- **Stop and surface failures rather than retry-loop.** If `linear-agent` returns an unexpected response or an error, the skill records it under "Errors" — pass that through. Do not auto-retry.
|
|
62
|
+
- **Pre-flight failures are not your problem to fix.** If an Issue fails `linear-verify` (missing Validation Journey, sign-in, etc.), `linear-agent` transitions it to `status:blocked` and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
|
|
@@ -5,7 +5,7 @@ skills:
|
|
|
5
5
|
- linear-prd-intake
|
|
6
6
|
- linear-to-tracker
|
|
7
7
|
- tracker-validate
|
|
8
|
-
-
|
|
8
|
+
- tracker-source-artifacts
|
|
9
9
|
- product-walkthrough
|
|
10
10
|
- tracker-write
|
|
11
11
|
- prd-ticket-coverage
|
|
@@ -25,7 +25,7 @@ Once you have a workspace or team scope, RUN. Do not ask the caller whether to p
|
|
|
25
25
|
|
|
26
26
|
### 1. Receive the scope URL or key
|
|
27
27
|
|
|
28
|
-
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `
|
|
28
|
+
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `linear.workspace` in `.lisa.config.json`). You do not pick the scope yourself.
|
|
29
29
|
|
|
30
30
|
If no scope is provided, stop and ask. Never run intake against a default or guessed scope — the side effects (label changes, sentinel-issue creation, JIRA tickets created) are too high to act without an explicit target.
|
|
31
31
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA
|
|
2
|
+
description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Source can be a Notion / Confluence / Linear / GitHub Issue URL, a JIRA epic key, a markdown file, or a free-form description. For batch scanning of all Ready PRDs in a queue, use /lisa:intake instead."
|
|
3
3
|
argument-hint: "<single-PRD-url | GitHub-issue-url | @file | ticket-id-or-url | description>"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Config Resolution
|
|
2
|
+
|
|
3
|
+
Lisa is vendor-agnostic. PRDs can be sourced from Notion, Confluence, Linear, GitHub Issues, or JIRA. Tickets can be written to JIRA, GitHub Issues, or Linear. Per-project configuration lives in `.lisa.config.json` at the repo root, with optional `.lisa.config.local.json` overriding on a per-key basis.
|
|
4
|
+
|
|
5
|
+
This rule is the single source of truth for the `.lisa.config.json` schema, the resolution algorithm, and the dispatch tables every vendor-neutral skill follows.
|
|
6
|
+
|
|
7
|
+
## File location and precedence
|
|
8
|
+
|
|
9
|
+
Read configuration from the repo root in this order:
|
|
10
|
+
|
|
11
|
+
1. `.lisa.config.local.json` — gitignored, per-developer overrides (e.g., a developer running with a different destination tracker for one branch).
|
|
12
|
+
2. `.lisa.config.json` — committed, project-wide settings.
|
|
13
|
+
|
|
14
|
+
Local overrides global on a **per-key basis**: missing keys in `.lisa.config.local.json` fall through to `.lisa.config.json`. Use `jq` from Bash for all reads — never hand-parse JSON.
|
|
15
|
+
|
|
16
|
+
A typical Bash read:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
local_value=$(jq -r '.tracker // empty' .lisa.config.local.json 2>/dev/null)
|
|
20
|
+
global_value=$(jq -r '.tracker // empty' .lisa.config.json 2>/dev/null)
|
|
21
|
+
tracker="${local_value:-${global_value:-jira}}"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Schema
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"tracker": "jira",
|
|
29
|
+
"source": "notion",
|
|
30
|
+
|
|
31
|
+
"atlassian": { "cloudId": "<uuid>" },
|
|
32
|
+
"jira": { "project": "<KEY>" },
|
|
33
|
+
"confluence": { "spaceKey": "<KEY>", "parentPageId": "<id>" },
|
|
34
|
+
"github": { "org": "<org-or-user>", "repo": "<repo>" },
|
|
35
|
+
"notion": { "prdDatabaseId": "<uuid>", "statusProperty": "Status", "readyValue": "Ready" },
|
|
36
|
+
"linear": { "workspace": "<workspace-slug>", "teamKey": "<TEAM>" }
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Top-level fields
|
|
41
|
+
|
|
42
|
+
| Field | Required | Default | Notes |
|
|
43
|
+
|-------|----------|---------|-------|
|
|
44
|
+
| `tracker` | no | `"jira"` | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing key resolves to `"jira"` for back-compat. |
|
|
45
|
+
| `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
|
|
46
|
+
|
|
47
|
+
### Vendor sections
|
|
48
|
+
|
|
49
|
+
Each vendor section is **conditionally required**: required only when that vendor is referenced as `tracker`, as `source`, or by an explicit invocation. Skills validate their own required keys at entry and stop with a clear error if missing — never invent values.
|
|
50
|
+
|
|
51
|
+
#### `atlassian`
|
|
52
|
+
|
|
53
|
+
| Field | Required when | Notes |
|
|
54
|
+
|-------|---------------|-------|
|
|
55
|
+
| `atlassian.cloudId` | `tracker = "jira"`, `source = "jira"`, `source = "confluence"`, or any `confluence-*` / `jira-*` skill is invoked | Atlassian Cloud site UUID. Resolve once via the Atlassian MCP `getAccessibleAtlassianResources` and paste in. Shared between JIRA and Confluence (same Atlassian site). If a project ever needs separate sites for JIRA vs Confluence, override via `jira.cloudId` / `confluence.cloudId` (not currently implemented — file an issue). |
|
|
56
|
+
|
|
57
|
+
#### `jira`
|
|
58
|
+
|
|
59
|
+
| Field | Required when | Notes |
|
|
60
|
+
|-------|---------------|-------|
|
|
61
|
+
| `jira.project` | `tracker = "jira"` or any `jira-*` skill is invoked | JIRA project key (e.g. `SE`, `ENG`). |
|
|
62
|
+
|
|
63
|
+
#### `confluence`
|
|
64
|
+
|
|
65
|
+
| Field | Required when | Notes |
|
|
66
|
+
|-------|---------------|-------|
|
|
67
|
+
| `confluence.spaceKey` | `source = "confluence"` and `parentPageId` is not set | Confluence space key (e.g. `ENG`). |
|
|
68
|
+
| `confluence.parentPageId` | `source = "confluence"` and `spaceKey` is not set | Confluence parent page ID. Either `spaceKey` or `parentPageId` must be set; both is allowed (parent page ID narrows the scope). |
|
|
69
|
+
|
|
70
|
+
#### `github`
|
|
71
|
+
|
|
72
|
+
| Field | Required when | Notes |
|
|
73
|
+
|-------|---------------|-------|
|
|
74
|
+
| `github.org` | `tracker = "github"` or `source = "github"` or any `github-*` skill is invoked | GitHub organization or user name. |
|
|
75
|
+
| `github.repo` | same as above | GitHub repository name. |
|
|
76
|
+
|
|
77
|
+
When `tracker = "github"` AND `source = "github"` (self-host), both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide — see "Self-host edge case" below.
|
|
78
|
+
|
|
79
|
+
#### `notion`
|
|
80
|
+
|
|
81
|
+
| Field | Required when | Notes |
|
|
82
|
+
|-------|---------------|-------|
|
|
83
|
+
| `notion.prdDatabaseId` | `source = "notion"` | Notion database ID (UUID, dashes optional). The database is the PRD queue. |
|
|
84
|
+
| `notion.statusProperty` | `source = "notion"` | Name of the database property that drives the lifecycle. Defaults to `"Status"` if absent. |
|
|
85
|
+
| `notion.readyValue` | `source = "notion"` | Status value that means "ready for ticketing". Defaults to `"Ready"` if absent. The full lifecycle (Ready → In Review → Blocked / Ticketed → Shipped) is hardcoded; only the entry-point value name is configurable for now. |
|
|
86
|
+
|
|
87
|
+
#### `linear`
|
|
88
|
+
|
|
89
|
+
| Field | Required when | Notes |
|
|
90
|
+
|-------|---------------|-------|
|
|
91
|
+
| `linear.workspace` | `tracker = "linear"`, `source = "linear"`, or any `linear-*` skill is invoked | Linear workspace slug (e.g. `acme`). |
|
|
92
|
+
| `linear.teamKey` | `tracker = "linear"` | Linear team key (e.g. `ENG`). The team owns the destination Issues. For source mode, projects are workspace-scoped or team-scoped per the URL passed. |
|
|
93
|
+
|
|
94
|
+
## Resolution algorithm
|
|
95
|
+
|
|
96
|
+
Every `tracker-*` shim and every vendor-neutral caller follows this:
|
|
97
|
+
|
|
98
|
+
1. Read `.lisa.config.local.json` first (if present), then `.lisa.config.json`. Local overrides global on a per-key basis. Use `jq` — never hand-parse JSON.
|
|
99
|
+
2. Extract the `tracker` field. If missing or null, default to `"jira"`.
|
|
100
|
+
3. Dispatch:
|
|
101
|
+
- `tracker = "jira"` → delegate to the matching `jira-*` skill. Validate `atlassian.cloudId` and `jira.project` are present.
|
|
102
|
+
- `tracker = "github"` → delegate to the matching `github-*` skill. Validate `github.org` and `github.repo` are present.
|
|
103
|
+
- `tracker = "linear"` → delegate to the matching `linear-*` skill. Validate `linear.workspace` and `linear.teamKey` are present.
|
|
104
|
+
4. Any other value: stop and report `"Unknown tracker '<value>' in .lisa.config.json. Expected 'jira', 'github', or 'linear'."`
|
|
105
|
+
|
|
106
|
+
For batch skills that consume `source`:
|
|
107
|
+
|
|
108
|
+
1. If `$ARGUMENTS` contains an explicit URL or key, parse the source vendor from it (always wins).
|
|
109
|
+
2. If `$ARGUMENTS` is the bare token `notion` / `confluence` / `linear` / `github` / `jira`, the source is that vendor; resolve location from the corresponding config section.
|
|
110
|
+
3. If `$ARGUMENTS` is empty, fall back to `source` from config; if that's also empty, stop and report `"No source specified and no 'source' field in .lisa.config.json."`
|
|
111
|
+
|
|
112
|
+
## Skill mapping
|
|
113
|
+
|
|
114
|
+
The shim → vendor mapping is fixed:
|
|
115
|
+
|
|
116
|
+
| Shim | jira tracker | github tracker | linear tracker |
|
|
117
|
+
|------|--------------|----------------|----------------|
|
|
118
|
+
| `lisa:tracker-write` | `lisa:jira-write-ticket` | `lisa:github-write-issue` | `lisa:linear-write-issue` |
|
|
119
|
+
| `lisa:tracker-validate` | `lisa:jira-validate-ticket` | `lisa:github-validate-issue` | `lisa:linear-validate-issue` |
|
|
120
|
+
| `lisa:tracker-verify` | `lisa:jira-verify` | `lisa:github-verify` | `lisa:linear-verify` |
|
|
121
|
+
| `lisa:tracker-read` | `lisa:jira-read-ticket` | `lisa:github-read-issue` | `lisa:linear-read-issue` |
|
|
122
|
+
| `lisa:tracker-evidence` | `lisa:jira-evidence` | `lisa:github-evidence` | `lisa:linear-evidence` |
|
|
123
|
+
| `lisa:tracker-sync` | `lisa:jira-sync` | `lisa:github-sync` | `lisa:linear-sync` |
|
|
124
|
+
| `lisa:tracker-add-journey` | `lisa:jira-add-journey` | `lisa:github-add-journey` | `lisa:linear-add-journey` |
|
|
125
|
+
| `lisa:tracker-journey` | `lisa:jira-journey` | `lisa:github-journey` | `lisa:linear-journey` |
|
|
126
|
+
| `lisa:tracker-create` | `lisa:jira-create` | `lisa:github-create` | `lisa:linear-create` |
|
|
127
|
+
| `lisa:tracker-build-intake` | `lisa:jira-build-intake` | `lisa:github-build-intake` | `lisa:linear-build-intake` |
|
|
128
|
+
|
|
129
|
+
The `tracker-source-artifacts` skill (formerly `tracker-source-artifacts`) is read-only and vendor-neutral — it has no shim and is invoked directly by every `*-to-tracker` skill and every destination write skill (`jira-write-ticket`, `github-write-issue`, `linear-write-issue`).
|
|
130
|
+
|
|
131
|
+
## Caller responsibilities
|
|
132
|
+
|
|
133
|
+
- **PRD-source skills** (`notion-to-tracker`, `confluence-to-tracker`, `linear-to-tracker`, `github-to-tracker`) MUST invoke `tracker-write` and `tracker-validate` — never `jira-write-ticket` / `github-write-issue` / `linear-write-issue` directly. This is what makes a project's destination switchable via config.
|
|
134
|
+
- **Lifecycle skills** (`implement`, `verify`, `monitor`) MUST invoke `tracker-read`, `tracker-evidence`, `tracker-sync` for ticket interaction — never the vendor-specific equivalents.
|
|
135
|
+
- **Per-vendor PRD intake skills** (`notion-prd-intake`, `confluence-prd-intake`, `linear-prd-intake`, `github-prd-intake`) compose the PRD-source skills (which in turn invoke the shims) — they do not need to read `tracker` themselves.
|
|
136
|
+
- **Vendor-specific destination skills** (`jira-*`, `github-*`, `linear-*`) read their own vendor config section directly. They do NOT consult `tracker` — they are the targets of dispatch, not the dispatchers.
|
|
137
|
+
|
|
138
|
+
## Linear destination semantics (best practices)
|
|
139
|
+
|
|
140
|
+
Linear's data model differs from JIRA / GitHub. The destination mapping follows Linear's recommended patterns:
|
|
141
|
+
|
|
142
|
+
| Concept (JIRA / GitHub) | Linear equivalent | Linear MCP write |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| Epic | **Project** (with milestones, target dates, lead, state) | `save_project` |
|
|
145
|
+
| Story | **Issue** with `projectId` set, no `parentId` | `save_issue` |
|
|
146
|
+
| Sub-task | **Sub-issue** with `parentId` = Story issue ID | `save_issue` |
|
|
147
|
+
| Fix version | Linear **ProjectMilestone** (native, dated) | `save_project` (milestones array) |
|
|
148
|
+
| Priority | Native `priority` field (0=No, 1=Urgent, 2=High, 3=Medium, 4=Low) | issue field |
|
|
149
|
+
| Estimate / story points | Native `estimate` field | issue field |
|
|
150
|
+
| Status workflow | **Labels** (`status:ready`, `status:in-progress`, `status:on-dev`, `status:done`) — portable across teams | issue labels |
|
|
151
|
+
| Component | Label prefix `component:` | issue labels |
|
|
152
|
+
| Issue links (blocks / relates / duplicates) | Native Linear relations | `save_issue_relation` |
|
|
153
|
+
|
|
154
|
+
`linear-write-issue` is **polymorphic**: dispatches internally on `issue_type` (Epic → `save_project`, Story / Sub-task → `save_issue`). Parity with `jira-write-ticket` / `github-write-issue` is preserved at the shim level.
|
|
155
|
+
|
|
156
|
+
Initiatives (Linear's cross-Project rollup) are NOT used — they're intended for cross-quarter, cross-team groupings rarely appropriate for an Epic. If a project ever needs Initiative-level grouping, that's a future extension to this rule.
|
|
157
|
+
|
|
158
|
+
## Self-host edge case (GitHub PRDs → GitHub destination)
|
|
159
|
+
|
|
160
|
+
When `github-to-tracker` is invoked AND `tracker = "github"`, both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide:
|
|
161
|
+
|
|
162
|
+
- PRD-source labels: `prd-draft`, `prd-ready`, `prd-in-review`, `prd-blocked`, `prd-ticketed`, `prd-shipped` — owned by `github-prd-intake` and the human PM.
|
|
163
|
+
- Build-queue labels: `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done` — owned by `github-build-intake` and `github-agent`.
|
|
164
|
+
- Sentinel issue label: `prd-intake-feedback` — owned by `github-prd-intake`.
|
|
165
|
+
|
|
166
|
+
Never overload one label across both lifecycles.
|
|
167
|
+
|
|
168
|
+
The same separation applies for Linear self-host (`source = "linear"` AND `tracker = "linear"`): project-level labels (`prd-*`) drive the PRD lifecycle; issue-level labels (`status:*`) drive the build lifecycle; the sentinel feedback issue carries the issue-level `prd-intake-feedback` label.
|
|
169
|
+
|
|
170
|
+
## Invariants
|
|
171
|
+
|
|
172
|
+
- Project tracker selection is **persistent** within a project — always read from config, never infer from the shape of `$ARGUMENTS`. If a developer wants a different destination for one run, they edit `.lisa.config.local.json`.
|
|
173
|
+
- A vendor-neutral skill never embeds vendor-specific terminology in its prompts (no "JIRA ticket key", "epic parent" — use "tracker key", "parent issue"). The vendor skill is responsible for translating its inputs.
|
|
174
|
+
- The shim layer is intentionally thin — its only job is dispatch. Gate logic, validation rules, and field schemas all live in the vendor skills.
|
|
175
|
+
- Secrets stay in env (`JIRA_API_TOKEN`, `LINEAR_API_KEY`, `GH_TOKEN`, `NOTION_API_KEY`, `ATLASSIAN_API_TOKEN`). Configuration in `.lisa.config.json` is non-secret only — IDs, keys, slugs, project codes.
|
|
176
|
+
- E2E test config (`E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`) stays in env for now — not tracker-related and frequently per-environment.
|
|
177
|
+
|
|
178
|
+
## Migration from the previous schema
|
|
179
|
+
|
|
180
|
+
The pre-expansion `.lisa.config.json` had only `tracker` and `github.{org,repo}`. Existing projects continue to work — the new fields are all conditionally required, and `tracker = "jira"` (the default) only requires `atlassian.cloudId` and `jira.project`, which were previously read from env (`JIRA_SERVER`, `JIRA_PROJECT`).
|
|
181
|
+
|
|
182
|
+
To migrate a project off env vars:
|
|
183
|
+
|
|
184
|
+
1. Add `atlassian.cloudId` (resolve via `getAccessibleAtlassianResources` once).
|
|
185
|
+
2. Add `jira.project` (was `JIRA_PROJECT`).
|
|
186
|
+
3. Drop `JIRA_SERVER` from env (replaced by `atlassian.cloudId`).
|
|
187
|
+
4. Optionally add `source` to set the default PRD source for batch skills.
|
|
@@ -310,33 +310,33 @@ Sequence:
|
|
|
310
310
|
1. `ops-specialist` -- health checks, log inspection, error monitoring, performance analysis
|
|
311
311
|
2. Report findings, escalate if action needed
|
|
312
312
|
|
|
313
|
-
## Tracker Entry Point (JIRA
|
|
313
|
+
## Tracker Entry Point (JIRA, GitHub Issues, or Linear)
|
|
314
314
|
|
|
315
|
-
When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL,
|
|
315
|
+
When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL, an `org/repo#<n>` token, or a Linear identifier like `ENG-123` or a Linear project URL):
|
|
316
316
|
|
|
317
|
-
1. Hand off to the matching vendor agent — `jira-agent` (
|
|
318
|
-
2. The agent reads the
|
|
319
|
-
3. The agent validates
|
|
317
|
+
1. Hand off to the matching vendor agent — `jira-agent` (JIRA refs), `github-agent` (GitHub Issue refs), or `linear-agent` (Linear identifier or project URL). The configured destination tracker (`.lisa.config.json` `tracker`) is the default when the ref shape is ambiguous.
|
|
318
|
+
2. The agent reads the work item fully via the matching read skill (`jira-read-ticket` / `github-read-issue` / `linear-read-issue`) — description / body, comments, attachments, linked items, parent (Epic / Project / parent Issue), siblings.
|
|
319
|
+
3. The agent validates item quality via the matching verify skill (`jira-verify` / `github-verify` / `linear-verify`).
|
|
320
320
|
4. The agent runs analytical triage via the vendor-neutral `ticket-triage` skill.
|
|
321
321
|
5. If triage finds unresolved ambiguities (`BLOCKED` verdict), the agent posts findings and STOPS -- no work begins.
|
|
322
322
|
6. The agent determines intent and delegates to the appropriate flow:
|
|
323
323
|
|
|
324
|
-
|
|
|
325
|
-
|
|
326
|
-
| Epic | Plan | -- |
|
|
324
|
+
| Item kind | Flow | Work Type |
|
|
325
|
+
|-----------|------|-----------|
|
|
326
|
+
| Epic (JIRA Epic / GitHub Epic-labeled / Linear Project) | Plan | -- |
|
|
327
327
|
| Story | Implement | Build |
|
|
328
328
|
| Task | Implement | Build |
|
|
329
329
|
| Bug | Implement | Fix |
|
|
330
330
|
| Spike | Implement | Investigate Only |
|
|
331
331
|
| Improvement | Implement | Improve |
|
|
332
|
-
| Sub-task | Implement | (per parent's intent) |
|
|
332
|
+
| Sub-task / sub-Issue | Implement | (per parent's intent) |
|
|
333
333
|
|
|
334
|
-
For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label.
|
|
334
|
+
For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label. For Linear, the type typically comes from a label (`type:story`, `type:bug`) or is inferred from the description if unlabeled — `linear-agent` handles the inference.
|
|
335
335
|
|
|
336
|
-
If the
|
|
336
|
+
If the item type is ambiguous, read the description / body to classify. A "Task" that describes broken behavior is a Fix. A "Bug" that requests new functionality is a Build.
|
|
337
337
|
|
|
338
|
-
7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync`).
|
|
339
|
-
8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence`).
|
|
338
|
+
7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync` / `linear-sync`).
|
|
339
|
+
8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence` / `linear-evidence`).
|
|
340
340
|
|
|
341
341
|
Vendor-neutral callers (e.g., `implement`, `verify`) should invoke the `tracker-*` shims — they dispatch to the right vendor automatically.
|
|
342
342
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: confluence-prd-intake
|
|
3
|
-
description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-tracker, tracker-validate,
|
|
3
|
+
description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__getPagesInConfluenceSpace", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__updateConfluencePage", "mcp__atlassian__createConfluenceFooterComment", "mcp__atlassian__createConfluenceInlineComment", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -28,7 +28,7 @@ Specifically forbidden:
|
|
|
28
28
|
|
|
29
29
|
The only legitimate reasons to stop early:
|
|
30
30
|
|
|
31
|
-
- Missing space/parent argument or required configuration (`
|
|
31
|
+
- Missing space/parent argument or required configuration (`atlassian.cloudId` in `.lisa.config.json`, `E2E_BASE_URL`, etc.). Surface the missing value and exit.
|
|
32
32
|
- Space/parent unreachable, or the labelling convention not yet adopted (no PRDs carry any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
|
|
33
33
|
- Empty `prd-ready` set. Exit cleanly with `"No PRDs labelled prd-ready. Nothing to do."`
|
|
34
34
|
|
|
@@ -105,7 +105,7 @@ Invoke the `lisa:confluence-to-tracker` skill with `dry_run: true` and the PRD's
|
|
|
105
105
|
- An overall PASS / FAIL verdict
|
|
106
106
|
- A failure count
|
|
107
107
|
|
|
108
|
-
This call also indirectly invokes `lisa:
|
|
108
|
+
This call also indirectly invokes `lisa:tracker-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:confluence-to-tracker` calls per ticket.
|
|
109
109
|
|
|
110
110
|
#### 3c. Branch on the verdict
|
|
111
111
|
|
|
@@ -236,7 +236,12 @@ Print to the agent's output. Do not write this summary to Confluence or JIRA —
|
|
|
236
236
|
|
|
237
237
|
## Configuration
|
|
238
238
|
|
|
239
|
-
Same
|
|
239
|
+
Same configuration as `lisa:confluence-to-tracker`. See that skill for the full table. Key items:
|
|
240
|
+
|
|
241
|
+
- **From `.lisa.config.json`**: `atlassian.cloudId` (required for Confluence MCP), `confluence.spaceKey` and/or `confluence.parentPageId` (when `$ARGUMENTS` doesn't pin a specific page).
|
|
242
|
+
- **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
|
|
243
|
+
|
|
244
|
+
Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
|
|
240
245
|
|
|
241
246
|
## Rules
|
|
242
247
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: confluence-to-tracker
|
|
3
3
|
description: >
|
|
4
|
-
Break down a Confluence PRD page into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA
|
|
4
|
+
Break down a Confluence PRD page into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Use this skill whenever the
|
|
5
5
|
user shares a Confluence PRD URL and wants it converted into tracker tickets, or asks to "break down
|
|
6
6
|
this Confluence spec", "create tickets from a Confluence page", "turn this Confluence doc into tickets",
|
|
7
7
|
or similar. This skill mirrors `lisa:notion-to-tracker` for projects whose PRDs live in Confluence —
|
|
@@ -12,7 +12,7 @@ allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atla
|
|
|
12
12
|
|
|
13
13
|
# Confluence PRD to Tracker Breakdown
|
|
14
14
|
|
|
15
|
-
Convert a Confluence PRD into a structured ticket hierarchy in the configured destination tracker (JIRA
|
|
15
|
+
Convert a Confluence PRD into a structured ticket hierarchy in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json): Epics > Stories > Sub-tasks.
|
|
16
16
|
Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
|
|
17
17
|
|
|
18
18
|
This skill is the Confluence counterpart of `lisa:notion-to-tracker`. The two skills share the same
|
|
@@ -102,22 +102,29 @@ page. The caller wanted `lisa:confluence-prd-intake` (batch mode).
|
|
|
102
102
|
|
|
103
103
|
## Configuration
|
|
104
104
|
|
|
105
|
-
This skill reads project
|
|
106
|
-
|
|
105
|
+
This skill reads project configuration from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key) and operational E2E test config from environment variables. See the `config-resolution` rule for the full schema.
|
|
106
|
+
|
|
107
|
+
### From `.lisa.config.json`
|
|
108
|
+
|
|
109
|
+
This skill is a **PRD source** (Confluence); destination tracker resolution is handled by `lisa:tracker-write` and `lisa:tracker-validate` internally — this skill does NOT read `tracker` directly. The relevant config for the source side:
|
|
110
|
+
|
|
111
|
+
| Field | Purpose | Required when |
|
|
112
|
+
|-------|---------|---------------|
|
|
113
|
+
| `atlassian.cloudId` | Atlassian Cloud site UUID for Confluence MCP calls | always |
|
|
114
|
+
| `confluence.spaceKey` | Confluence space hosting PRDs | invoked without an explicit page URL (batch / arg-less mode) and `confluence.parentPageId` is unset |
|
|
115
|
+
| `confluence.parentPageId` | Confluence parent page under which PRDs live | invoked without an explicit page URL (batch / arg-less mode) and `confluence.spaceKey` is unset |
|
|
116
|
+
|
|
117
|
+
### From environment variables (E2E test config — operational, not tracker)
|
|
107
118
|
|
|
108
119
|
| Variable | Purpose | Example |
|
|
109
120
|
|----------|---------|---------|
|
|
110
|
-
| `JIRA_PROJECT` | JIRA project key for ticket creation | `SE` |
|
|
111
|
-
| `JIRA_SERVER` | Atlassian instance URL (site host) | `mycompany.atlassian.net` |
|
|
112
|
-
| `CONFLUENCE_HOST` | Confluence host (often same as `JIRA_SERVER`) | `mycompany.atlassian.net` |
|
|
113
121
|
| `E2E_TEST_PHONE` | Test user phone number for verification plans | `0000000099` |
|
|
114
122
|
| `E2E_TEST_OTP` | Test user OTP code | `555555` |
|
|
115
123
|
| `E2E_TEST_ORG` | Test organization name | `Arsenal` |
|
|
116
124
|
| `E2E_BASE_URL` | Frontend base URL for Playwright tests | `https://dev.example.io/` |
|
|
117
125
|
| `E2E_GRAPHQL_URL` | GraphQL API URL for curl verification | `https://gql.dev.example.io/graphql` |
|
|
118
126
|
|
|
119
|
-
If env vars are not available, ask the user to provide them explicitly before proceeding.
|
|
120
|
-
Do not retrieve credentials from repository files or local agent settings.
|
|
127
|
+
If env vars are not available, ask the user to provide them explicitly before proceeding. Do not retrieve credentials from repository files or local agent settings.
|
|
121
128
|
|
|
122
129
|
## Workflow
|
|
123
130
|
|
|
@@ -151,17 +158,17 @@ PRDs typically reference external design, UX, and data artifacts (Figma files, L
|
|
|
151
158
|
- Embedded images and file attachments on the page itself
|
|
152
159
|
- Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
|
|
153
160
|
|
|
154
|
-
2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:
|
|
161
|
+
2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:tracker-source-artifacts` skill. That skill is the single source of truth for: domains (`ui-design` / `ux-flow` / `data` / `ops` / `reference`), per-tool classification rules (Figma `/proto/` vs design, Lovable as `ux-flow`, Loom, screenshots), and coverage smells. Do not restate the rules here — invoke the skill so any drift in the rules propagates uniformly.
|
|
155
162
|
|
|
156
163
|
3. **Build an `artifacts` map** keyed by domain. Each entry: `{ url, title, domain, source_page, source_page_url, classification_reason }`. The `classification_reason` makes disambiguation auditable. The `source_page` lets you trace each reference back to where it appeared in the PRD.
|
|
157
164
|
|
|
158
|
-
4. **Surface coverage smells** as defined in `lisa:
|
|
165
|
+
4. **Surface coverage smells** as defined in `lisa:tracker-source-artifacts` §5. Record any detected smells on the epic.
|
|
159
166
|
|
|
160
167
|
### Phase 1.6: Source Precedence & Conflict Resolution
|
|
161
168
|
|
|
162
|
-
Source precedence rules and cross-axis conflict handling are defined in `lisa:
|
|
169
|
+
Source precedence rules and cross-axis conflict handling are defined in `lisa:tracker-source-artifacts` §3 and §4. Apply them during ticket synthesis: every conflict between artifacts must be recorded under `## Open Questions` on the affected ticket, never silently reconciled.
|
|
163
170
|
|
|
164
|
-
The existing-component reuse expectation is defined in `lisa:
|
|
171
|
+
The existing-component reuse expectation is defined in `lisa:tracker-source-artifacts` §7. Encode it on every UI-touching story.
|
|
165
172
|
|
|
166
173
|
### Phase 2: Codebase + Live Product Research
|
|
167
174
|
|
|
@@ -181,7 +188,7 @@ Walkthrough findings are attached to the originating Confluence PRD as a **foote
|
|
|
181
188
|
|
|
182
189
|
For each PRD epic, **invoke the `lisa:tracker-write` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
|
|
183
190
|
|
|
184
|
-
- `project_key`:
|
|
191
|
+
- `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
|
|
185
192
|
- `issue_type`: `Epic`
|
|
186
193
|
- `summary`: epic title from the PRD
|
|
187
194
|
- `description_body`: a draft of the 3-audience description containing:
|
|
@@ -209,7 +216,7 @@ For each Epic, plan two kinds of stories:
|
|
|
209
216
|
|
|
210
217
|
For each story, **invoke `lisa:tracker-write`** with:
|
|
211
218
|
|
|
212
|
-
- `project_key`:
|
|
219
|
+
- `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
|
|
213
220
|
- `issue_type`: `Story`
|
|
214
221
|
- `epic_parent`: the Epic key captured in Phase 3 (mandatory)
|
|
215
222
|
- `summary`: prefixed per the naming convention above
|
|
@@ -237,7 +244,7 @@ Sub-tasks inherit their parent story's artifacts by reference (the parent link).
|
|
|
237
244
|
|
|
238
245
|
### Phase 5.5: Artifact Preservation Gate (mandatory)
|
|
239
246
|
|
|
240
|
-
Run the preservation gate defined in `lisa:
|
|
247
|
+
Run the preservation gate defined in `lisa:tracker-source-artifacts` §8 against the artifacts extracted in Phase 1.5 and the tickets just created. Do NOT restate or modify the gate logic here — invoke the rules from `lisa:tracker-source-artifacts`.
|
|
241
248
|
|
|
242
249
|
To run the gate, this skill must:
|
|
243
250
|
|
|
@@ -11,7 +11,7 @@ Analyze the provided file(s) and plan a GitHub Issue hierarchy. **This skill pla
|
|
|
11
11
|
## Process
|
|
12
12
|
|
|
13
13
|
1. **Analyze**: Read `$ARGUMENTS` to understand scope.
|
|
14
|
-
2. **Extract source artifacts**: invoke the `lisa:
|
|
14
|
+
2. **Extract source artifacts**: invoke the `lisa:tracker-source-artifacts` skill (vendor-neutral), then enumerate every external URL, embed, attachment, or example payload in the input and classify each by domain per its rules. Build the `artifacts` map (one entry per artifact: url, title, domain, source page, classification reason).
|
|
15
15
|
3. **Walk the live product** (when applicable): if the work touches existing user-facing surfaces, invoke the `lisa:product-walkthrough` skill.
|
|
16
16
|
4. **Determine structure**:
|
|
17
17
|
- Epic needed if: multiple features, major changes, >3 related files.
|
|
@@ -22,8 +22,8 @@ Analyze the provided file(s) and plan a GitHub Issue hierarchy. **This skill pla
|
|
|
22
22
|
Epic → Story → Sub-tasks (test, implement, document, cleanup)
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
6. **Delegate every write to `lisa:github-write-issue`** in dependency order (Epic first, then Stories with the Epic as parent sub-issue, then Sub-tasks with their Story as parent). Pass artifacts (filtered by domain per `lisa:
|
|
26
|
-
7. **Run the artifact preservation gate** (`lisa:
|
|
25
|
+
6. **Delegate every write to `lisa:github-write-issue`** in dependency order (Epic first, then Stories with the Epic as parent sub-issue, then Sub-tasks with their Story as parent). Pass artifacts (filtered by domain per `lisa:tracker-source-artifacts` inheritance rules) and walkthrough findings (under `## Current Product`).
|
|
26
|
+
7. **Run the artifact preservation gate** (`lisa:tracker-source-artifacts` §8): after all writes complete, build the preservation matrix and verify every extracted artifact is reachable from the created issues. Fail loudly if anything was dropped.
|
|
27
27
|
|
|
28
28
|
## Mandatory for Every Code Issue
|
|
29
29
|
|
|
@@ -40,7 +40,7 @@ Issues that change runtime behavior should include a `## Validation Journey` sec
|
|
|
40
40
|
|
|
41
41
|
If `$ARGUMENTS` references any external artifact — PRD, design doc, Figma URL, Lovable prototype, Loom walkthrough, screenshot, example payload — those references MUST be preserved as `## Links` and `## Source Artifacts` sections on the created issues. Silent artifact loss is the single most common quality failure in this pipeline.
|
|
42
42
|
|
|
43
|
-
**Invoke `lisa:
|
|
43
|
+
**Invoke `lisa:tracker-source-artifacts`** for the canonical rules: domains, per-tool classification, source precedence, conflict handling under `## Open Questions`, inheritance from epic → story → sub-task, and the existing-component reuse expectation. This skill is vendor-neutral and used by both the JIRA and the GitHub paths.
|
|
44
44
|
|
|
45
45
|
When delegating actual writes to `lisa:github-write-issue`, pass the extracted artifact list so its Phase 4c (Remote Links / Source Artifacts) step attaches them.
|
|
46
46
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-prd-intake
|
|
3
|
-
description: "Scans a GitHub repository for issues labeled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA
|
|
3
|
+
description: "Scans a GitHub repository for issues labeled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written (to whatever destination tracker is configured — JIRA, GitHub Issues itself, or Linear) and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. The GitHub counterpart of lisa:notion-prd-intake / lisa:confluence-prd-intake / lisa:linear-prd-intake. Composes existing skills (github-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -116,7 +116,7 @@ Invoke the `lisa:github-to-tracker` skill with `dry_run: true` and the PRD issue
|
|
|
116
116
|
- An overall PASS / FAIL verdict
|
|
117
117
|
- A failure count
|
|
118
118
|
|
|
119
|
-
This call indirectly invokes `lisa:
|
|
119
|
+
This call indirectly invokes `lisa:tracker-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 dispatches to `lisa:jira-validate-ticket` or `lisa:github-validate-issue` depending on the configured destination).
|
|
120
120
|
|
|
121
121
|
#### 3c. Branch on the verdict
|
|
122
122
|
|
|
@@ -254,7 +254,12 @@ When the configured destination tracker is GitHub Issues AND the PRD repo is the
|
|
|
254
254
|
|
|
255
255
|
## Configuration
|
|
256
256
|
|
|
257
|
-
Same
|
|
257
|
+
Same configuration as `lisa:github-to-tracker`. See that skill for the full table. Key items:
|
|
258
|
+
|
|
259
|
+
- **From `.lisa.config.json`**: `github.org` and `github.repo` (required for the source repo, and also for the destination repo when `tracker = "github"` — self-host case).
|
|
260
|
+
- **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
|
|
261
|
+
|
|
262
|
+
Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface and exit — never invent values.
|
|
258
263
|
|
|
259
264
|
## Rules
|
|
260
265
|
|
|
@@ -103,20 +103,29 @@ Resolve `<org>/<repo>` from `.lisa.config.json` if `$ARGUMENTS` is just `#<n>` o
|
|
|
103
103
|
|
|
104
104
|
## Configuration
|
|
105
105
|
|
|
106
|
-
This skill reads project
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
|
113
|
-
|
|
106
|
+
This skill reads project configuration from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key) and operational E2E test config from environment variables. See the `config-resolution` rule for the full schema.
|
|
107
|
+
|
|
108
|
+
### From `.lisa.config.json`
|
|
109
|
+
|
|
110
|
+
This skill is a **PRD source** (GitHub Issues). Destination tracker resolution is handled by `lisa:tracker-write` / `lisa:tracker-validate` internally; this skill reads only the source-side config.
|
|
111
|
+
|
|
112
|
+
| Field | Purpose | Required when |
|
|
113
|
+
|-------|---------|---------------|
|
|
114
|
+
| `github.org` | GitHub org hosting the PRD repo | always (source repo); also when `tracker = "github"` (destination repo, can be the same in self-host case) |
|
|
115
|
+
| `github.repo` | GitHub repo hosting the PRD | same |
|
|
116
|
+
|
|
117
|
+
### From environment variables (E2E test config — operational, not tracker)
|
|
118
|
+
|
|
119
|
+
| Variable | Purpose | Example |
|
|
120
|
+
|----------|---------|---------|
|
|
114
121
|
| `E2E_TEST_PHONE` | Test user phone for verification plans | `0000000099` |
|
|
115
122
|
| `E2E_TEST_OTP` | Test user OTP code | `555555` |
|
|
116
123
|
| `E2E_TEST_ORG` | Test organization name | `Arsenal` |
|
|
117
124
|
| `E2E_BASE_URL` | Frontend base URL for Playwright tests | `https://dev.example.io/` |
|
|
118
125
|
| `E2E_GRAPHQL_URL` | GraphQL API URL for curl verification | `https://gql.dev.example.io/graphql` |
|
|
119
126
|
|
|
127
|
+
If env vars are not available, ask the user to provide them explicitly before proceeding. Do not retrieve credentials from repository files or local agent settings.
|
|
128
|
+
|
|
120
129
|
## Workflow
|
|
121
130
|
|
|
122
131
|
### Phase 1: Fetch & Analyze the PRD
|
|
@@ -146,17 +155,17 @@ PRDs typically reference external design, UX, and data artifacts (Figma files, L
|
|
|
146
155
|
- Embedded images and file attachments referenced in the body
|
|
147
156
|
- Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
|
|
148
157
|
|
|
149
|
-
2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:
|
|
158
|
+
2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:tracker-source-artifacts` skill. That skill is the single source of truth for: domains (`ui-design` / `ux-flow` / `data` / `ops` / `reference`), per-tool classification rules, and coverage smells.
|
|
150
159
|
|
|
151
160
|
3. **Build an `artifacts` map** keyed by domain. Each entry: `{ url, title, domain, source_page, source_page_url, classification_reason }`. `source_page` lets you trace each reference back to where it appeared (PRD body vs a specific sub-issue vs a specific comment).
|
|
152
161
|
|
|
153
|
-
4. **Surface coverage smells** as defined in `lisa:
|
|
162
|
+
4. **Surface coverage smells** as defined in `lisa:tracker-source-artifacts` §5. Record on the Epic.
|
|
154
163
|
|
|
155
164
|
### Phase 1.6: Source Precedence & Conflict Resolution
|
|
156
165
|
|
|
157
|
-
Source precedence rules and cross-axis conflict handling are defined in `lisa:
|
|
166
|
+
Source precedence rules and cross-axis conflict handling are defined in `lisa:tracker-source-artifacts` §3 and §4. Apply them during ticket synthesis: every conflict between artifacts must be recorded under `## Open Questions` on the affected ticket, never silently reconciled.
|
|
158
167
|
|
|
159
|
-
The existing-component reuse expectation is defined in `lisa:
|
|
168
|
+
The existing-component reuse expectation is defined in `lisa:tracker-source-artifacts` §7. Encode it on every UI-touching story.
|
|
160
169
|
|
|
161
170
|
### Phase 2: Codebase + Live Product Research
|
|
162
171
|
|
|
@@ -230,7 +239,7 @@ Sub-tasks inherit their parent Story's artifacts by reference (the parent link).
|
|
|
230
239
|
|
|
231
240
|
### Phase 5.5: Artifact Preservation Gate (mandatory)
|
|
232
241
|
|
|
233
|
-
Run the preservation gate defined in `lisa:
|
|
242
|
+
Run the preservation gate defined in `lisa:tracker-source-artifacts` §8 against the artifacts extracted in Phase 1.5 and the tickets just created. Do NOT restate or modify the gate logic here — invoke the rules from `lisa:tracker-source-artifacts`.
|
|
234
243
|
|
|
235
244
|
To run the gate, this skill must:
|
|
236
245
|
|