@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.
Files changed (118) hide show
  1. package/README.md +65 -14
  2. package/package.json +1 -1
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  5. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  6. package/plugins/lisa/agents/linear-agent.md +128 -0
  7. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  8. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  9. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  10. package/plugins/lisa/commands/plan.md +1 -1
  11. package/plugins/lisa/rules/config-resolution.md +187 -0
  12. package/plugins/lisa/rules/intent-routing.md +13 -13
  13. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  14. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  15. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  16. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  17. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  18. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  19. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  20. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  21. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  22. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  23. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  24. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  25. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  26. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  27. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  28. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  29. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  30. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  31. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  32. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  33. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  34. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  35. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  36. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  37. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  38. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  39. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  40. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  41. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  42. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  43. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  44. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  49. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  50. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  51. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  52. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  53. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  54. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  55. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  56. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  59. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  62. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  63. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  64. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  65. package/plugins/src/base/agents/linear-agent.md +128 -0
  66. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  67. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  68. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  69. package/plugins/src/base/commands/plan.md +1 -1
  70. package/plugins/src/base/rules/config-resolution.md +187 -0
  71. package/plugins/src/base/rules/intent-routing.md +13 -13
  72. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  73. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  74. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  75. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  76. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  77. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  78. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  79. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  80. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  81. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  82. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  83. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  84. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  85. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  86. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  87. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  88. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  89. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  90. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  91. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  92. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  93. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  94. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  95. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  96. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  97. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  98. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  99. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  100. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  101. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  102. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  103. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  108. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  109. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  110. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  111. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  112. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  113. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  114. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  115. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  116. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  117. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  118. 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
- - jira-source-artifacts
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 `LINEAR_WORKSPACE`). You do not pick the scope yourself.
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
 
@@ -5,7 +5,7 @@ skills:
5
5
  - notion-prd-intake
6
6
  - notion-to-tracker
7
7
  - tracker-validate
8
- - jira-source-artifacts
8
+ - tracker-source-artifacts
9
9
  - product-walkthrough
10
10
  - tracker-write
11
11
  - prd-ticket-coverage
@@ -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 or GitHub Issues 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."
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 or GitHub Issues)
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, or an `org/repo#<n>` token):
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` (for JIRA refs) or `github-agent` (for GitHub Issue refs). The configured destination tracker (`.lisa.config.json` `tracker`) is the default when the ref shape is ambiguous.
318
- 2. The agent reads the ticket fully via the matching read skill (`jira-read-ticket` / `github-read-issue`) — description / body, comments, attachments, linked issues, parent (Epic / parent sub-issue), siblings.
319
- 3. The agent validates ticket quality via the matching verify skill (`jira-verify` / `github-verify`).
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
- | Ticket Type | Flow | Work Type |
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 ticket 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.
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, jira-source-artifacts, product-walkthrough)."
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 (`JIRA_PROJECT`, `JIRA_SERVER`, `E2E_BASE_URL`, etc.). Surface the missing value and exit.
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: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:confluence-to-tracker` calls per ticket.
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 env vars as `lisa:confluence-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `CONFLUENCE_HOST`, `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.
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 or GitHub Issues per .lisa.config.json). Use this skill whenever the
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 or GitHub Issues per .lisa.config.json): Epics > Stories > Sub-tasks.
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-specific configuration from environment variables. If these are not set,
106
- ask the user for the values before proceeding.
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:jira-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.
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:jira-source-artifacts` §5. Record any detected smells on the epic.
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:jira-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.
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:jira-source-artifacts` §7. Encode it on every UI-touching story.
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`: from `JIRA_PROJECT` config
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`: from `JIRA_PROJECT` config
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:jira-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:jira-source-artifacts`.
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:jira-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).
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:jira-source-artifacts` inheritance rules) and walkthrough findings (under `## Current Product`).
26
- 7. **Run the artifact preservation gate** (`lisa:jira-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.
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:jira-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.
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 or GitHub Issues itself) 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, jira-source-artifacts, product-walkthrough)."
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: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 dispatches to `lisa:jira-validate-ticket` or `lisa:github-validate-issue` depending on the configured destination).
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 env vars as `lisa:github-to-tracker` plus `.lisa.config.json` `github.org` / `github.repo`. If any required value is missing, surface and exit — never invent values.
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-specific configuration from environment variables and from `.lisa.config.json`. If these are not set, ask the user before proceeding never invent values.
107
-
108
- | Variable / config | Purpose | Example |
109
- |-------------------|---------|---------|
110
- | `.lisa.config.json` `tracker` | Destination tracker (jira / github) | `github` |
111
- | `.lisa.config.json` `github.org` / `github.repo` | GitHub org/repo when tracker=github (and the source repo) | `acme` / `frontend-v2` |
112
- | `JIRA_PROJECT` | Destination JIRA project key when tracker=jira | `SE` |
113
- | `JIRA_SERVER` | Atlassian instance URL | `mycompany.atlassian.net` |
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:jira-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.
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:jira-source-artifacts` §5. Record on the Epic.
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:jira-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.
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:jira-source-artifacts` §7. Encode it on every UI-touching story.
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:jira-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:jira-source-artifacts`.
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