@codyswann/lisa 2.10.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  4. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  5. package/plugins/lisa/agents/linear-agent.md +128 -0
  6. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  7. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  8. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  9. package/plugins/lisa/commands/plan.md +1 -1
  10. package/plugins/lisa/rules/config-resolution.md +187 -0
  11. package/plugins/lisa/rules/intent-routing.md +13 -13
  12. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  13. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  14. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  15. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  16. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  17. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  18. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  19. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  20. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  21. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  22. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  23. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  24. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  25. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  26. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  27. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  28. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  29. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  30. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  31. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  32. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  33. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  34. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  35. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  36. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  37. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  38. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  39. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  40. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  41. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  42. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  43. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  44. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  49. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  50. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  51. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  52. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  53. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  54. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  55. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  58. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  61. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  62. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  63. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  64. package/plugins/src/base/agents/linear-agent.md +128 -0
  65. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  66. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  67. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  68. package/plugins/src/base/commands/plan.md +1 -1
  69. package/plugins/src/base/rules/config-resolution.md +187 -0
  70. package/plugins/src/base/rules/intent-routing.md +13 -13
  71. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  72. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  73. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  74. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  75. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  76. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  77. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  78. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  79. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  80. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  81. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  82. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  83. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  84. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  85. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  86. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  87. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  88. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  89. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  90. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  91. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  92. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  93. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  94. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  95. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  96. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  97. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  98. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  99. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  100. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  101. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  102. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  103. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  108. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  109. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  110. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  111. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  112. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  113. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  114. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  115. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  116. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  117. package/plugins/src/base/rules/tracker-resolution.md +0 -76
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: linear-journey
3
+ description: "Parse a Linear Issue's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries, Playwright), capture evidence at each [EVIDENCE: name] marker, and post to Linear + GitHub PR using the linear-evidence skill. Linear counterpart of lisa:jira-journey."
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue"]
5
+ ---
6
+
7
+ # Linear Validation Journey
8
+
9
+ Parse a Linear Issue's Validation Journey, execute the verification steps using the appropriate tools for the change type, capture evidence at each `[EVIDENCE: name]` marker, and post to Linear + GitHub PR.
10
+
11
+ This skill is the destination of the `lisa:tracker-journey` shim when `tracker = "linear"`.
12
+
13
+ ## Configuration
14
+
15
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
16
+
17
+ ## Arguments
18
+
19
+ `$ARGUMENTS`: `<IDENTIFIER> [PR_NUMBER]`
20
+
21
+ - `IDENTIFIER` (required): Linear Issue identifier (e.g. `ENG-123`)
22
+ - `PR_NUMBER` (optional): GitHub PR number to update description
23
+
24
+ ## Prerequisites
25
+
26
+ - Linear MCP authenticated
27
+ - `gh` CLI authenticated
28
+ - Appropriate services running for the verification type (dev server, database, etc.)
29
+
30
+ ## Workflow
31
+
32
+ ### Step 1: Parse the Validation Journey
33
+
34
+ Fetch the Issue via `mcp__linear-server__get_issue` and extract the `## Validation Journey` section from the markdown description. Parse:
35
+
36
+ - `### Prerequisites` — list of required services / env / setup
37
+ - `### Steps` — numbered steps, each potentially containing `[EVIDENCE: name]` markers
38
+ - `### Assertions` — what must be true after verification
39
+
40
+ If the section is missing or has no steps, report `"No Validation Journey on <IDENTIFIER>. Run /linear-add-journey first."` and stop.
41
+
42
+ ### Step 2: Satisfy Prerequisites
43
+
44
+ Before executing steps, verify each prerequisite:
45
+
46
+ 1. Required services running (dev server, database, queue worker)
47
+ 2. Database connectivity if needed
48
+ 3. Environment variables set
49
+ 4. Run any setup commands mentioned in prerequisites
50
+
51
+ Stop and report if any prerequisite is not satisfied.
52
+
53
+ ### Step 3: Execute Steps and Capture Evidence
54
+
55
+ Execute each step sequentially. Determine the verification approach based on the step text and change type:
56
+
57
+ - **API endpoints** → Run curl commands, capture HTTP response to `evidence/NN-name.txt` (or `.json` for structured data)
58
+ - **Database changes** → Run psql / migration commands, capture schema output
59
+ - **Background jobs** → Trigger the job, check queue / state, capture logs
60
+ - **Library / utility changes** → Run tests, capture output
61
+ - **Security fixes** → Reproduce exploit attempt, verify fix
62
+ - **UI / frontend** → Playwright browser flow, capture screenshots / DOM state
63
+
64
+ At each `[EVIDENCE: name]` marker, capture stdout / stderr to a numbered file:
65
+
66
+ #### Evidence Naming Convention
67
+
68
+ `{NN}-{evidence-name}.{ext}`
69
+
70
+ - `NN`: zero-padded sequential number (`01`, `02`, `03`...)
71
+ - `evidence-name`: the value from `[EVIDENCE: name]`
72
+ - `ext`: `.txt` for plain output, `.json` for structured data
73
+
74
+ Example:
75
+
76
+ ```text
77
+ evidence/
78
+ 01-health-check.json
79
+ 02-schema-after-migration.txt
80
+ 03-rate-limit-response.txt
81
+ comment.txt
82
+ code-blocks.md
83
+ ```
84
+
85
+ ### Step 4: Generate Evidence Comment + Code Blocks
86
+
87
+ After capturing all evidence, build:
88
+
89
+ - `evidence/comment.txt` — human-readable summary of the verification (Linear comment body, markdown-supported)
90
+ - `evidence/code-blocks.md` — fenced code blocks containing the captured evidence outputs (appended below `comment.txt` inside a `<details>` block)
91
+
92
+ ### Step 5: Post Evidence
93
+
94
+ Invoke `lisa:linear-evidence` with `<IDENTIFIER> ./evidence` to:
95
+
96
+ 1. Upload large evidence files to the GitHub `pr-assets` release (if files present in `evidence/files/`).
97
+ 2. Update the GitHub PR description with an Evidence section (when a PR is open).
98
+ 3. Post the Linear comment (`comment.txt` + collapsible `code-blocks.md`).
99
+ 4. Transition labels: remove `status:in-progress`, add `status:code-review`.
100
+
101
+ ### Step 6: Verify
102
+
103
+ Confirm:
104
+ - Evidence appears as a comment on the Linear Issue.
105
+ - The PR description shows the Evidence section.
106
+ - The Issue's `status:*` label transitioned to `code-review`.
107
+
108
+ ## Verification Patterns Reference
109
+
110
+ Use patterns from the project's `verification.md`:
111
+
112
+ | Change Type | Verification Method | Evidence Format |
113
+ |---|---|---|
114
+ | API endpoint | `curl -s localhost:PORT/endpoint` | JSON response |
115
+ | Database migration | `psql -c "\d table"` or migration output | Schema text |
116
+ | Background job | Trigger + check state | Log output |
117
+ | Library / utility | `bun run test -- path/to/test` | Test output |
118
+ | Security fix | Reproduce + verify fix | Request / response |
119
+ | Auth/authz | Multi-role verification | Status codes per role |
120
+ | UI / frontend | Playwright `browser_*` MCP tools | Screenshot + DOM |
121
+
122
+ ## Troubleshooting
123
+
124
+ ### Evidence file is empty
125
+
126
+ Ensure the command succeeded and produced output. Use `2>&1` to capture both stdout and stderr.
127
+
128
+ ### Parser returns no steps
129
+
130
+ The Issue may not have a Validation Journey section. Run `/linear-add-journey <IDENTIFIER>` to add one.
131
+
132
+ ### Label transition fails
133
+
134
+ Ensure `status:in-progress` and `status:code-review` exist on the team. `lisa:linear-evidence` creates them on demand if missing.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: linear-prd-intake
3
- description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
3
+ description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_teams"]
5
5
  ---
6
6
 
@@ -10,7 +10,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__line
10
10
 
11
11
  - A Linear **workspace** URL — scans every project in the workspace whose labels include `prd-ready`. Example: `https://linear.app/acme`.
12
12
  - A Linear **team** URL or team key — scans every project on the team whose labels include `prd-ready`. Example: `https://linear.app/acme/team/ENG/projects` or bare `ENG`.
13
- - The literal token `linear` — equivalent to "the default Linear workspace"; only valid if `LINEAR_WORKSPACE` is configured.
13
+ - The literal token `linear` — equivalent to "the default Linear workspace"; only valid if `linear.workspace` is configured in `.lisa.config.json`.
14
14
 
15
15
  Run one intake cycle against that scope. Each project with the `prd-ready` label is claimed, validated, and routed to either `prd-blocked` (with clarifying comments on a sentinel feedback issue) or `prd-ticketed` (with JIRA tickets created).
16
16
 
@@ -29,7 +29,7 @@ Specifically forbidden:
29
29
 
30
30
  The only legitimate reasons to stop early:
31
31
 
32
- - Missing scope argument or required configuration (`JIRA_PROJECT`, `JIRA_SERVER`, `LINEAR_WORKSPACE`, `E2E_BASE_URL`, etc.). Surface the missing key(s) and exit this cycle — never invent values.
32
+ - Missing scope argument or required configuration (`linear.workspace` in `.lisa.config.json`, `E2E_BASE_URL`, etc.). Surface the missing key(s) and exit this cycle — never invent values.
33
33
  - Workspace/team unreachable, or the labelling convention not yet adopted (no projects carry any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
34
34
  - Empty `prd-ready` set. Exit cleanly with `"No Linear projects labelled prd-ready. Nothing to do."`
35
35
 
@@ -63,7 +63,7 @@ If the project does not yet use `prd-*` labels, this skill cannot run. Adopting
63
63
  - Workspace URL (`https://linear.app/<workspace>`) → extract workspace slug; the scope is the entire workspace.
64
64
  - Team URL containing `/team/<KEY>/...` → extract team key; the scope is that team.
65
65
  - Bare team key → use as-is; the scope is that team.
66
- - The literal `linear` → fall back to `LINEAR_WORKSPACE` env var; error if not set.
66
+ - The literal `linear` → fall back to `linear.workspace` from `.lisa.config.json`; error if not set.
67
67
  2. Verify the scope is reachable:
68
68
  - For a workspace: call `mcp__linear-server__list_teams` and confirm at least one team is returned (non-empty workspaces are readable; empty results indicate auth or workspace-mismatch).
69
69
  - For a team: call `mcp__linear-server__list_teams({query: <KEY>})` and confirm the team resolves.
@@ -106,7 +106,7 @@ Invoke the `lisa:linear-to-tracker` skill with `dry_run: true` and the project's
106
106
  - An overall PASS / FAIL verdict
107
107
  - A failure count
108
108
 
109
- This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:linear-to-tracker` calls per ticket.
109
+ 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:linear-to-tracker` calls per ticket.
110
110
 
111
111
  #### 3c. Branch on the verdict
112
112
 
@@ -250,7 +250,12 @@ Idempotency: the helper finds-or-creates. Re-runs of the cycle reuse the same se
250
250
 
251
251
  ## Configuration
252
252
 
253
- Same env vars as `lisa:linear-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `LINEAR_WORKSPACE`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
253
+ Same configuration as `lisa:linear-to-tracker`. See that skill for the full table. Key items:
254
+
255
+ - **From `.lisa.config.json`**: `linear.workspace` (required for Linear MCP). When the destination tracker is `linear`, also `linear.teamKey`.
256
+ - **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
257
+
258
+ 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.
254
259
 
255
260
  ## Rules
256
261
 
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: linear-read-issue
3
+ description: "Fetches the full scope of a Linear work item — Issue or Project — including metadata, description, acceptance criteria, all comments, attachments, native relations (blocks/blocked_by/relates_to/duplicates), Project parent (if any) with siblings, and sub-Issues. Produces a consolidated context bundle that downstream agents consume so they never act on a single item in isolation."
4
+ allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__list_comments", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
5
+ ---
6
+
7
+ # Read Linear Work Item: $ARGUMENTS
8
+
9
+ Fetch the full scope of the item AND its related graph. Downstream agents must never act on an item in isolation — always call this skill first so they see blockers, project siblings, linked PRs, and historical comments.
10
+
11
+ This skill is the destination of the `lisa:tracker-read` shim when `tracker = "linear"`. Read-only.
12
+
13
+ Repository name for scoped comments and logs: `basename $(git rev-parse --show-toplevel)`.
14
+
15
+ ## Configuration
16
+
17
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
18
+
19
+ ## Phase 1 — Resolve Context
20
+
21
+ 1. If `$ARGUMENTS` matches `<TEAM>-<n>` → Issue mode.
22
+ 2. If `$ARGUMENTS` is a URL containing `/project/<slug>-<short-id>` → Project mode (extract `<short-id>`).
23
+ 3. Otherwise stop and report. Do NOT guess.
24
+ 4. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
25
+
26
+ ## Phase 2 — Fetch Primary Item
27
+
28
+ ### Issue mode
29
+
30
+ Call `mcp__linear-server__get_issue`. Extract and preserve:
31
+
32
+ **Metadata**
33
+ - Identifier, title, issue type (typically a label or workflow state), state, priority (0–4)
34
+ - Assignee, creator, subscribers
35
+ - Labels (capture full names — `status:*`, `component:*`, `priority:*`, `prd-*`)
36
+ - Project (parent), parent Issue (if Sub-task), cycle, milestone (ProjectMilestone)
37
+ - Estimate, due date
38
+ - Created, updated, completed dates
39
+
40
+ **Body**
41
+ - Full description (preserve markdown)
42
+ - **Validation Journey** section if present (pass verbatim to downstream)
43
+ - Attachment URLs (capture, do not download unless needed)
44
+
45
+ **Comments**
46
+ Fetch ALL comments via `mcp__linear-server__list_comments({issueId: <id>})` in chronological order. Walk thread parents/children — Linear comments are threaded via `parentId`. Do not truncate. For each comment:
47
+ - Author, timestamp, body
48
+ - Flag comments that contain: credentials, reproduction steps, status updates from stakeholders, decisions, or triage headers.
49
+
50
+ ### Project mode
51
+
52
+ Call `mcp__linear-server__get_project` with `includeMilestones: true`, `includeResources: true`. Extract:
53
+
54
+ **Metadata**
55
+ - ID, slug, name, state, priority, lead, color
56
+ - Teams, labels, milestones, target date, start date
57
+ - Created, updated dates
58
+
59
+ **Body**
60
+ - Description (markdown)
61
+ - Attached documents — call `mcp__linear-server__list_documents({projectId})` then `get_document` per result. Treat each as additional spec content.
62
+
63
+ **Member Issues**
64
+ - Call `mcp__linear-server__list_issues({project: <id>})` to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).
65
+
66
+ ## Phase 3 — Fetch Attachments / Remote Links
67
+
68
+ Linear stores remote URLs as attachments on the Issue. For each:
69
+
70
+ - **GitHub PR or commit**: run `gh pr view <url> --json title,state,body,mergedAt,reviewDecision,comments,reviews` (PRs) or `gh api repos/<owner>/<repo>/commits/<sha>` (commits). Capture title, state, unresolved review comments, merge status.
71
+ - **Confluence page**: capture title and URL. Do not fetch body unless a downstream task explicitly needs it.
72
+ - **Dashboard / log link / external URL**: capture title and URL only.
73
+
74
+ If `gh` is not authenticated, note "gh auth required" and continue — do not abort.
75
+
76
+ ## Phase 4 — Fetch Relations
77
+
78
+ Linear native Issue relations are returned in the `get_issue` response under `relations`. Group by type:
79
+
80
+ - `blocks` / `blocked_by`
81
+ - `relates_to`
82
+ - `duplicates` / `duplicated_by`
83
+
84
+ For each related Issue, call `mcp__linear-server__get_issue` and capture:
85
+ - Identifier, title, state, priority, assignee
86
+ - Description (full, unless cancelled — then summary only)
87
+ - Acceptance Criteria section
88
+ - Last 10 comments (chronological)
89
+ - Attachments (URLs only — skip deep PR fetch unless the relation is `blocks` or `blocked_by`)
90
+
91
+ **Special handling for `blocked_by`:** fetch full PR details via `gh` for each blocker's GitHub attachments so the agent knows whether the blocker is actually shipped.
92
+
93
+ For Project-level relationships (Project ↔ Project), Linear doesn't model native relations — check the Project description and resources for cross-references and capture them as plain links.
94
+
95
+ ## Phase 5 — Fetch Project Context
96
+
97
+ If the primary Item is an Issue with a Project parent:
98
+
99
+ 1. Fetch the Project via `mcp__linear-server__get_project` — full description, milestones, labels, lead.
100
+ 2. Fetch Project documents (Phase 2 procedure).
101
+ 3. Find Project siblings via `mcp__linear-server__list_issues({project: <projectId>})` excluding the primary identifier.
102
+ 4. For each sibling, capture: identifier, title, state, priority, assignee, summary (first paragraph of description).
103
+ 5. If a sibling is `Started` or `In Review` with a different assignee, flag it prominently.
104
+
105
+ If the primary Item IS a Project, Phase 5 is the same as fetching all member Issues (already done in Phase 2 Project mode).
106
+
107
+ ## Phase 6 — Fetch Sub-Issues
108
+
109
+ If the primary Issue has children (sub-Issues), fetch each via `mcp__linear-server__get_issue`: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
110
+
111
+ ## Phase 7 — Assemble Context Bundle
112
+
113
+ Produce a single structured output the caller can pass verbatim to downstream agents.
114
+
115
+ ```text
116
+ # Linear Work Item Context: <IDENTIFIER>
117
+
118
+ ## Primary Item
119
+ - Identifier: <ID>
120
+ - Type: <Issue | Project>
121
+ - State: <state>
122
+ - Priority: <0–4 or named>
123
+ - Assignee: <name or none>
124
+ - Project (parent): <project-slug — name> or none
125
+ - Parent Issue: <ID — title> or none (Sub-task only)
126
+ - Cycle: <name or none>
127
+ - Milestone: <project-milestone or none>
128
+ - Labels: <comma-separated>
129
+ - Estimate: <points>
130
+
131
+ ### Description
132
+ <full description>
133
+
134
+ ### Acceptance Criteria
135
+ <criteria>
136
+
137
+ ### Validation Journey
138
+ <section or "None">
139
+
140
+ ### Comments (<count>)
141
+ <chronological comments, flagged items called out>
142
+
143
+ ### Attachments
144
+ <list of URLs with titles>
145
+
146
+ ## Remote Links
147
+ ### Pull Requests (<count>)
148
+ - <url> — <title> — <state> — <reviewDecision>
149
+ <body summary + unresolved review comments>
150
+
151
+ ### Confluence
152
+ - <title> — <url>
153
+
154
+ ### Other
155
+ - <title> — <url>
156
+
157
+ ## Relations
158
+ ### Blocks (<count>)
159
+ <per-issue block>
160
+
161
+ ### Blocked By (<count>)
162
+ <per-issue block with PR state>
163
+
164
+ ### Relates To (<count>)
165
+ <per-issue block>
166
+
167
+ ### Duplicates / Duplicated By
168
+ <per-issue block>
169
+
170
+ ## Project Context (when primary is an Issue under a Project)
171
+ ### Project <slug> — <name>
172
+ - State: <state>
173
+ - Description: <full markdown>
174
+ - Milestones: <list>
175
+ - Documents: <list of doc titles + identifiers>
176
+
177
+ ### Siblings In-Flight (<count>)
178
+ - <ID> — <state> — <assignee> — <title> **[FLAG: in progress by other assignee]**
179
+
180
+ ### Other Siblings (<count>)
181
+ - <ID> — <state> — <title>
182
+
183
+ ## Sub-Issues (<count>)
184
+ - <ID> — <state> — <assignee> — <title>
185
+
186
+ ## Summary for Downstream
187
+ - Full item count pulled: <N>
188
+ - Blockers still open: <list>
189
+ - Related in-flight work: <list>
190
+ - Relevant PRs: <list with state>
191
+ ```
192
+
193
+ ## Rules
194
+
195
+ - Never summarize or truncate the primary item's description or Validation Journey.
196
+ - Never skip a relation type, even if it seems unrelated — the downstream agent decides relevance.
197
+ - If a related item returns an access error, capture the error and continue. Do not abort the read.
198
+ - Flag in-flight sibling work prominently so the caller can avoid duplicate implementation.
199
+ - If the Issue has no Project parent, state this explicitly — do not silently skip Phase 5.
200
+ - Output is pure context. This skill never modifies the item.
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: linear-sync
3
+ description: "Syncs plan progress to a linked Linear Issue. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep Linear Issues in sync. The Linear counterpart of lisa:jira-sync and lisa:github-sync."
4
+ allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__save_issue"]
5
+ ---
6
+
7
+ # Sync Plan to Linear: $ARGUMENTS
8
+
9
+ Post milestone updates to the linked Linear Issue at key plan-lifecycle moments. This skill is the destination of the `lisa:tracker-sync` shim when `tracker = "linear"`.
10
+
11
+ ## Configuration
12
+
13
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
14
+
15
+ ## When to invoke
16
+
17
+ Callers (planning skills, lifecycle skills) invoke this skill at:
18
+
19
+ | Milestone | What to post |
20
+ |-----------|--------------|
21
+ | Plan created | Plan contents (sections + ordered tasks) as a comment, suggest transition `Backlog → Todo` (label: `status:ready`) |
22
+ | Implementation in progress | Branch URL + first commit, suggest transition `Todo → In Progress` (label: `status:in-progress`) |
23
+ | PR ready for review | PR URL + summary, the implementation handoff comment, suggest transition `In Progress → In Review` (label: `status:code-review`) |
24
+ | PR merged | Merge SHA + deploy environment (if known), suggest transition `In Review → Done` (label: `status:done`) |
25
+
26
+ This skill **suggests** transitions but does not auto-transition the native Linear `state` field. It DOES update the `status:*` label set when the caller asks (the build queue is keyed off labels). Native state transitions remain a human / triage decision.
27
+
28
+ ## Input
29
+
30
+ `$ARGUMENTS` is `<IDENTIFIER> <milestone>` where:
31
+
32
+ - `<IDENTIFIER>` is the Linear Issue identifier (e.g. `ENG-123`). If not provided, the skill searches the active plan file for a linked Linear Issue.
33
+ - `<milestone>` is one of `plan-created`, `implementation-in-progress`, `pr-ready`, `pr-merged`.
34
+
35
+ ## Phase 1 — Resolve Issue
36
+
37
+ 1. If `$ARGUMENTS` includes an identifier, parse it.
38
+ 2. Else search for the active plan file (most recent file under `plans/`) and extract the linked Linear Issue identifier from its frontmatter.
39
+ 3. Fetch the Issue via `mcp__linear-server__get_issue` to confirm it exists.
40
+
41
+ ## Phase 2 — Compose Milestone Comment
42
+
43
+ Per the milestone, build the comment body. Include:
44
+
45
+ - A milestone header (e.g. `**Plan created** — <plan-file>`)
46
+ - Relevant links (plan file, branch, PR)
47
+ - A short summary (first 5 lines of the plan section / commit message / PR description)
48
+ - The suggested status transition
49
+
50
+ Example for `plan-created`:
51
+
52
+ ```markdown
53
+ **Plan created** — `plans/feat-X.md`
54
+
55
+ Sections:
56
+ - Phase 1: Schema doc
57
+ - Phase 2: Linear destination skills
58
+ - ...
59
+
60
+ Tasks: 7 ordered items.
61
+
62
+ Next: implementation begins. Suggested status: **Todo** (label: `status:ready`).
63
+ ```
64
+
65
+ ## Phase 3 — Post Comment
66
+
67
+ Call `mcp__linear-server__save_comment({issueId: <id>, body: <comment>})`.
68
+
69
+ ## Phase 4 — Update Status Label (when caller requests)
70
+
71
+ If the caller passes `--update-label`, update the `status:*` label set via `mcp__linear-server__save_issue`:
72
+
73
+ - `plan-created` → add `status:ready`
74
+ - `implementation-in-progress` → remove `status:ready`, add `status:in-progress`
75
+ - `pr-ready` → remove `status:in-progress`, add `status:code-review`
76
+ - `pr-merged` → remove `status:code-review`, add `status:done`
77
+
78
+ If the requested label doesn't exist on the team, create it via `mcp__linear-server__create_issue_label`.
79
+
80
+ Verify exactly one `status:*` label remains after the update — having two simultaneously breaks the build-queue invariant.
81
+
82
+ Without `--update-label`, this skill posts the comment only and does NOT touch labels.
83
+
84
+ ## Rules
85
+
86
+ - Never auto-transition the native Linear `state` — only the label, and only when the caller explicitly asks.
87
+ - Never post empty or minimal comments — if a milestone has no meaningful content, skip the post.
88
+ - Do not delete prior milestone comments. They are the audit trail.
89
+ - If `save_comment` fails, retry once. If it fails again, surface the error.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-to-tracker
3
3
  description: >
4
- Break down a Linear PRD (a Linear Project) into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json). Use this skill
4
+ Break down a Linear PRD (a Linear Project) into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Use this skill
5
5
  whenever the user shares a Linear project URL and wants it converted into tracker tickets, or asks to
6
6
  "break down this Linear project", "create tickets from a Linear project", "turn this Linear PRD into tickets", or similar. This skill mirrors `lisa:notion-to-tracker` and `lisa:confluence-to-tracker` for projects
7
7
  whose PRDs live in Linear — the workflow, gates, dry-run mode, and validation rules are identical;
@@ -11,7 +11,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__get_project", "mcp__linear
11
11
 
12
12
  # Linear PRD to Tracker Breakdown
13
13
 
14
- Convert a Linear PRD (a Linear **Project**) into a structured ticket hierarchy in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json): Epics > Stories > Sub-tasks.
14
+ Convert a Linear PRD (a Linear **Project**) into a structured ticket hierarchy in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json): Epics > Stories > Sub-tasks.
15
15
  Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
16
16
 
17
17
  This skill is the Linear counterpart of `lisa:notion-to-tracker` and `lisa:confluence-to-tracker`. The three skills share the same phases, gates, dry-run contract, and per-ticket validation logic. Only the PRD-side fetch tools differ. When changing workflow logic, change ALL THREE skills together so the source vendors stay behaviorally identical.
@@ -101,13 +101,20 @@ Extract the trailing `<short-id>` (the alphanumeric segment after the last `-` i
101
101
 
102
102
  ## Configuration
103
103
 
104
- This skill reads project-specific configuration from environment variables. If these are not set, ask the user for the values before proceeding.
104
+ 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.
105
+
106
+ ### From `.lisa.config.json`
107
+
108
+ This skill is a **PRD source** (Linear); 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:
109
+
110
+ | Field | Purpose | Required when |
111
+ |-------|---------|---------------|
112
+ | `linear.workspace` | Linear workspace slug (used for URL synthesis on remote links) | always |
113
+
114
+ ### From environment variables (E2E test config — operational, not tracker)
105
115
 
106
116
  | Variable | Purpose | Example |
107
117
  |----------|---------|---------|
108
- | `JIRA_PROJECT` | JIRA project key for ticket creation | `SE` |
109
- | `JIRA_SERVER` | Atlassian instance URL (site host) | `mycompany.atlassian.net` |
110
- | `LINEAR_WORKSPACE` | Linear workspace slug (used for URL synthesis on JIRA remote links) | `acme` |
111
118
  | `E2E_TEST_PHONE` | Test user phone number for verification plans | `0000000099` |
112
119
  | `E2E_TEST_OTP` | Test user OTP code | `555555` |
113
120
  | `E2E_TEST_ORG` | Test organization name | `Arsenal` |
@@ -144,17 +151,17 @@ PRDs typically reference external design, UX, and data artifacts (Figma files, L
144
151
  - Embedded images and file attachments referenced in the project / documents
145
152
  - Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
146
153
 
147
- 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.
154
+ 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.
148
155
 
149
156
  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 (project description vs a specific document title vs a specific sub-issue comment).
150
157
 
151
- 4. **Surface coverage smells** as defined in `lisa:jira-source-artifacts` §5. Record any detected smells on the epic.
158
+ 4. **Surface coverage smells** as defined in `lisa:tracker-source-artifacts` §5. Record any detected smells on the epic.
152
159
 
153
160
  ### Phase 1.6: Source Precedence & Conflict Resolution
154
161
 
155
- 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.
162
+ 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.
156
163
 
157
- The existing-component reuse expectation is defined in `lisa:jira-source-artifacts` §7. Encode it on every UI-touching story.
164
+ The existing-component reuse expectation is defined in `lisa:tracker-source-artifacts` §7. Encode it on every UI-touching story.
158
165
 
159
166
  ### Phase 2: Codebase + Live Product Research
160
167
 
@@ -174,7 +181,7 @@ Walkthrough findings are surfaced back to product via the orchestrating intake s
174
181
 
175
182
  For each epic identified in Phase 1, **invoke the `lisa:tracker-write` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
176
183
 
177
- - `project_key`: from `JIRA_PROJECT` config
184
+ - `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
178
185
  - `issue_type`: `Epic`
179
186
  - `summary`: epic title from the PRD
180
187
  - `description_body`: a draft of the 3-audience description containing:
@@ -202,7 +209,7 @@ For each Epic, plan two kinds of stories:
202
209
 
203
210
  For each story, **invoke `lisa:tracker-write`** with:
204
211
 
205
- - `project_key`: from `JIRA_PROJECT` config
212
+ - `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
206
213
  - `issue_type`: `Story`
207
214
  - `epic_parent`: the Epic key captured in Phase 3 (mandatory)
208
215
  - `summary`: prefixed per the naming convention above
@@ -230,7 +237,7 @@ Sub-tasks inherit their parent story's artifacts by reference (the parent link).
230
237
 
231
238
  ### Phase 5.5: Artifact Preservation Gate (mandatory)
232
239
 
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`.
240
+ 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
241
 
235
242
  To run the gate, this skill must:
236
243