@codyswann/lisa 2.10.1 → 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -14
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
- package/plugins/lisa/agents/github-prd-intake.md +2 -2
- package/plugins/lisa/agents/linear-agent.md +128 -0
- package/plugins/lisa/agents/linear-build-intake.md +62 -0
- package/plugins/lisa/agents/linear-prd-intake.md +2 -2
- package/plugins/lisa/agents/notion-prd-intake.md +1 -1
- package/plugins/lisa/commands/plan.md +1 -1
- package/plugins/lisa/rules/config-resolution.md +187 -0
- package/plugins/lisa/rules/intent-routing.md +13 -13
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/lisa/skills/github-create/SKILL.md +4 -4
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/lisa/skills/implement/SKILL.md +1 -1
- package/plugins/lisa/skills/intake/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
- package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/lisa/skills/plan/SKILL.md +3 -2
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
- package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
- package/plugins/lisa/skills/verify/SKILL.md +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
- package/plugins/src/base/agents/github-prd-intake.md +2 -2
- package/plugins/src/base/agents/linear-agent.md +128 -0
- package/plugins/src/base/agents/linear-build-intake.md +62 -0
- package/plugins/src/base/agents/linear-prd-intake.md +2 -2
- package/plugins/src/base/agents/notion-prd-intake.md +1 -1
- package/plugins/src/base/commands/plan.md +1 -1
- package/plugins/src/base/rules/config-resolution.md +187 -0
- package/plugins/src/base/rules/intent-routing.md +13 -13
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/src/base/skills/github-create/SKILL.md +4 -4
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/src/base/skills/implement/SKILL.md +1 -1
- package/plugins/src/base/skills/intake/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
- package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
- package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/src/base/skills/plan/SKILL.md +3 -2
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
- package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
- package/plugins/src/base/skills/verify/SKILL.md +1 -1
- package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa/rules/tracker-resolution.md +0 -76
- package/plugins/src/base/rules/tracker-resolution.md +0 -76
package/README.md
CHANGED
|
@@ -12,9 +12,9 @@ A request to fix a bug routes to a different flow than a request to build a feat
|
|
|
12
12
|
|
|
13
13
|
### Flows and Agents
|
|
14
14
|
|
|
15
|
-
A flow is a pipeline. Each step in the pipeline is an **agent** — a scoped AI with specific tools and
|
|
15
|
+
A flow is a pipeline. Each step in the pipeline is an **agent** — a scoped AI with specific tools and instructions. One agent investigates git history, another reproduces bugs, another writes code, another verifies the result.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Behind the scenes, agents delegate domain-specific work to reusable instruction sets that are loaded automatically when a command runs. The same logic that triages a JIRA ticket interactively is the same logic invoked by the nightly triage workflow — you don't need to know which one is running.
|
|
18
18
|
|
|
19
19
|
Flows can nest. A build flow includes a verification sub-flow, which includes a ship sub-flow. This composition keeps each flow focused while enabling complex end-to-end workflows.
|
|
20
20
|
|
|
@@ -28,13 +28,13 @@ Lisa enforces quality through layered gates:
|
|
|
28
28
|
|
|
29
29
|
### Location Agnostic
|
|
30
30
|
|
|
31
|
-
The same rules,
|
|
31
|
+
The same rules, workflows, and quality gates apply everywhere:
|
|
32
32
|
|
|
33
33
|
- On a developer's workstation running Claude Code interactively
|
|
34
34
|
- In a GitHub Action running a nightly improvement job
|
|
35
35
|
- In a CI workflow responding to a PR review comment
|
|
36
36
|
|
|
37
|
-
The
|
|
37
|
+
The orchestration adapts to context — using MCP integrations locally and REST APIs in CI — but the standards don't change.
|
|
38
38
|
|
|
39
39
|
### Template Governance
|
|
40
40
|
|
|
@@ -44,7 +44,7 @@ Lisa distributes its standards to downstream projects as templates. When a proje
|
|
|
44
44
|
- Test and coverage infrastructure
|
|
45
45
|
- CI/CD workflows
|
|
46
46
|
- Git hooks
|
|
47
|
-
- AI agent definitions
|
|
47
|
+
- AI agent definitions and project rules
|
|
48
48
|
|
|
49
49
|
Templates follow governance rules: some files are overwritten on every update (enforced standards), some are created once and left alone (project customization), and some are merged (shared defaults with project additions).
|
|
50
50
|
|
|
@@ -58,15 +58,66 @@ curl -fsSL https://claude.ai/install.sh | bash
|
|
|
58
58
|
|
|
59
59
|
## Working With Lisa
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Lisa exposes a small set of top-level commands that map to the work lifecycle. Run them in Claude Code; everything underneath — agents, sub-flows, and the supporting libraries that power each step — happens automatically.
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
### The Lifecycle
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
- `/build` — route through the feature build flow
|
|
67
|
-
- `/improve` — route through the improvement flow
|
|
68
|
-
- `/investigate` — route through the investigation flow
|
|
69
|
-
- `/jira:triage <TICKET-ID>` — analytical triage gate: detect ambiguities, edge cases, and verification methodology
|
|
70
|
-
- `/plan:improve-tests <target>` — improve test quality by analyzing and strengthening weak or brittle tests
|
|
65
|
+
A piece of work moves through five stages. Each stage has one command.
|
|
71
66
|
|
|
72
|
-
|
|
67
|
+
| Stage | Command | What it does |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| Research | `/lisa:research <problem>` | Investigates the codebase and problem space, then produces a PRD ready for planning. |
|
|
70
|
+
| Plan | `/lisa:plan <PRD>` | Decomposes a PRD into ordered work items in your tracker (JIRA, GitHub Issues, or Linear). |
|
|
71
|
+
| Implement | `/lisa:implement <ticket>` | Takes one work item from spec to shipped: assembles an agent team, runs the build, opens a PR, handles review, merges. |
|
|
72
|
+
| Verify | `/lisa:verify` | Commits, pushes, opens a PR, monitors deploy, and verifies behavior in the target environment. Folded into `/lisa:implement` but available standalone. |
|
|
73
|
+
| Debrief | `/lisa:debrief <epic>` | After shipping, mines tickets and PRs to surface edge cases, gotchas, and friction. Produces a triage doc; `/lisa:debrief:apply` persists accepted learnings. |
|
|
74
|
+
|
|
75
|
+
Most users only ever call `/lisa:research`, `/lisa:plan`, and `/lisa:implement`. The rest run automatically as sub-flows.
|
|
76
|
+
|
|
77
|
+
### Batch and Scheduled Work
|
|
78
|
+
|
|
79
|
+
| Command | What it does |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `/lisa:intake <queue-url>` | Scans a Ready queue (Notion PRD database, JIRA project, GitHub repo, Linear team, Confluence space) and dispatches each item through the right lifecycle command. Designed as the cron target for unattended runs. |
|
|
82
|
+
|
|
83
|
+
### Maintenance and Operations
|
|
84
|
+
|
|
85
|
+
| Command | What it does |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| `/lisa:monitor [environment]` | Checks application health, logs, error rates, and performance for the named environment. |
|
|
88
|
+
| `/lisa:product-walkthrough <route>` | Walks the live product through a real browser to ground PRD or ticket reasoning in current behavior. |
|
|
89
|
+
| `/lisa:codify-verification <type> <what>` | Converts a passing manual verification into a regression test in the appropriate framework (Playwright, integration test, benchmark). Runs automatically after `/lisa:verify`. |
|
|
90
|
+
| `/lisa:review:local` | Reviews local branch changes against `main`. |
|
|
91
|
+
| `/lisa:pull-request:review <pr-url>` | Pulls down review comments on a PR and implements the valid ones. |
|
|
92
|
+
| `/lisa:security:zap-scan` | Runs an OWASP ZAP baseline scan against the local app. |
|
|
93
|
+
|
|
94
|
+
### Targeted Improvements
|
|
95
|
+
|
|
96
|
+
These commands tighten a specific quality threshold and fix every violation in one pass — useful for incremental hardening or nightly jobs.
|
|
97
|
+
|
|
98
|
+
| Command | What it does |
|
|
99
|
+
| --- | --- |
|
|
100
|
+
| `/lisa:improve:test-coverage <pct>` | Raises coverage to the target percentage by adding tests for uncovered code. |
|
|
101
|
+
| `/lisa:improve:tests <target>` | Strengthens weak, brittle, or poorly-written tests. |
|
|
102
|
+
| `/lisa:improve:code-complexity` | Lowers the cognitive-complexity threshold by 2 and fixes resulting violations. |
|
|
103
|
+
| `/lisa:improve:max-lines <n>` | Reduces the max-file-lines threshold and fixes violations. |
|
|
104
|
+
| `/lisa:improve:max-lines-per-function <n>` | Reduces the max-lines-per-function threshold and fixes violations. |
|
|
105
|
+
| `/lisa:fix:linter-error <rule> [...]` | Fixes every violation of one or more ESLint rules across the codebase. |
|
|
106
|
+
|
|
107
|
+
### Git Helpers
|
|
108
|
+
|
|
109
|
+
| Command | What it does |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| `/lisa:git:commit [hint]` | Creates conventional commits from the current changes. |
|
|
112
|
+
| `/lisa:git:submit-pr [hint]` | Pushes and opens or updates a PR. |
|
|
113
|
+
| `/lisa:git:prune` | Prunes local branches whose remotes have been deleted. |
|
|
114
|
+
|
|
115
|
+
### Talking to Lisa in Plain English
|
|
116
|
+
|
|
117
|
+
You don't have to remember any of this. Tell Claude what you want and the right command will run:
|
|
118
|
+
|
|
119
|
+
> "I have JIRA ticket PROJ-1234. Research, plan, and implement it."
|
|
120
|
+
> "Walk through the checkout flow and tell me what's broken."
|
|
121
|
+
> "Get test coverage to 90%."
|
|
122
|
+
|
|
123
|
+
> Ask Claude: "What commands are available?" for the full list at any time.
|
package/package.json
CHANGED
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"lodash": ">=4.18.1"
|
|
80
80
|
},
|
|
81
81
|
"name": "@codyswann/lisa",
|
|
82
|
-
"version": "2.
|
|
82
|
+
"version": "2.11.1",
|
|
83
83
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
84
84
|
"main": "dist/index.js",
|
|
85
85
|
"exports": {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-prd-intake
|
|
3
|
-
description: PRD intake agent for GitHub Issues hosted PRDs. Runs one intake cycle against a GitHub repository — claims `prd-ready` issues (relabels to `prd-in-review`), validates each through the dry-run pipeline, and routes to `prd-blocked` (with clarifying comments on the PRD issue) or `prd-ticketed` (with destination tickets created in JIRA
|
|
3
|
+
description: PRD intake agent for GitHub Issues hosted PRDs. Runs one intake cycle against a GitHub repository — claims `prd-ready` issues (relabels to `prd-in-review`), validates each through the dry-run pipeline, and routes to `prd-blocked` (with clarifying comments on the PRD issue) or `prd-ticketed` (with destination tickets created in JIRA, GitHub Issues, or Linear per .lisa.config.json). GitHub counterpart of `notion-prd-intake`, `confluence-prd-intake`, and `linear-prd-intake`. Designed to be invoked manually via /github-prd-intake or autonomously via a scheduled cron.
|
|
4
4
|
skills:
|
|
5
5
|
- github-prd-intake
|
|
6
6
|
- github-to-tracker
|
|
7
7
|
- tracker-validate
|
|
8
|
-
-
|
|
8
|
+
- tracker-source-artifacts
|
|
9
9
|
- product-walkthrough
|
|
10
10
|
- tracker-write
|
|
11
11
|
- prd-ticket-coverage
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-agent
|
|
3
|
+
description: Linear lifecycle agent. Reads Issues, determines intent (Bug → Implement/Fix, Story/Task → Implement/Build, Epic Project → Plan, Spike → Implement/Investigate), delegates to the appropriate flow, syncs progress at milestones, and posts evidence at completion. Linear counterpart of jira-agent and github-agent.
|
|
4
|
+
skills:
|
|
5
|
+
- linear-read-issue
|
|
6
|
+
- linear-write-issue
|
|
7
|
+
- linear-sync
|
|
8
|
+
- linear-evidence
|
|
9
|
+
- linear-verify
|
|
10
|
+
- linear-add-journey
|
|
11
|
+
- ticket-triage
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Linear Agent
|
|
15
|
+
|
|
16
|
+
You are a Linear lifecycle agent. Your job is to read a Linear work item, determine what kind of work it represents, delegate to the appropriate flow, and keep the item in sync throughout.
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
### 1. Read the Item
|
|
21
|
+
|
|
22
|
+
Invoke the `linear-read-issue` skill with the identifier. This is mandatory — do NOT read the item ad-hoc via MCP calls. The skill fetches the primary item AND its full graph in one pass:
|
|
23
|
+
|
|
24
|
+
- Full description, acceptance criteria, Validation Journey
|
|
25
|
+
- All comments in chronological order (with thread structure)
|
|
26
|
+
- All metadata (state, priority, assignee, labels, project, parent, cycle, milestone, estimate)
|
|
27
|
+
- Attachments — PRs (with state and unresolved review comments via `gh`), Confluence pages, dashboards
|
|
28
|
+
- Every native relation (`blocks`, `blocked_by`, `relates_to`, `duplicates`) with descriptions, states, recent comments
|
|
29
|
+
- Project parent (Epic-equivalent) — full description, comments, milestones, attached documents
|
|
30
|
+
- Project siblings — so you see in-flight related work before starting
|
|
31
|
+
- Sub-Issues
|
|
32
|
+
|
|
33
|
+
Pass the resulting context bundle verbatim to every downstream agent. Extract credentials, URLs, and reproduction steps from the bundle. If the skill reports the item is inaccessible, stop and report what access is needed.
|
|
34
|
+
|
|
35
|
+
**Never act on an item in isolation.** If the bundle shows open blockers, flag them and stop. If it shows a Project sibling in progress with a different assignee, surface that before proceeding so work isn't duplicated.
|
|
36
|
+
|
|
37
|
+
### 2. Validate Item Quality (Pre-flight Gate)
|
|
38
|
+
|
|
39
|
+
Use the `linear-verify` skill to check the item against organizational standards:
|
|
40
|
+
- Project parent exists (Stories under Epic), parent Issue exists (Sub-tasks under Story)
|
|
41
|
+
- Description quality (audience sections, Gherkin acceptance criteria)
|
|
42
|
+
- Validation Journey present (runtime-behavior items)
|
|
43
|
+
- Target backend environment named in description (runtime-behavior items)
|
|
44
|
+
- Sign-in credentials named in description (when item touches authenticated surfaces)
|
|
45
|
+
- Single-repo scope (Bug / Task / Sub-task)
|
|
46
|
+
- Relationship discovery (≥1 relation or documented git + Linear search)
|
|
47
|
+
|
|
48
|
+
**Gating behavior — this is the one place auto-transitioning is allowed:**
|
|
49
|
+
|
|
50
|
+
If `linear-verify` returns `FAIL` on any of the above, do NOT continue:
|
|
51
|
+
1. Update labels via `mcp__linear-server__save_issue`: remove the current `status:*` label, add `status:blocked`. (Create `status:blocked` via `create_issue_label` if needed.)
|
|
52
|
+
2. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
|
|
53
|
+
3. Post a comment via `mcp__linear-server__save_comment` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
|
|
54
|
+
4. Stop. Do not run triage, do not delegate to a flow, do not start work.
|
|
55
|
+
|
|
56
|
+
If `linear-verify` returns `PASS`, proceed to Step 3.
|
|
57
|
+
|
|
58
|
+
### 3. Analytical Triage Gate
|
|
59
|
+
|
|
60
|
+
Determine the repo name: `basename $(git rev-parse --show-toplevel)`
|
|
61
|
+
|
|
62
|
+
Check if the item already has the `claude-triaged-{repo}` label. If yes, skip to Step 4.
|
|
63
|
+
|
|
64
|
+
If not triaged:
|
|
65
|
+
1. Fetch the full item details from the context bundle.
|
|
66
|
+
2. Invoke the `ticket-triage` skill with the item details.
|
|
67
|
+
3. Post the skill's findings (ambiguities, edge cases, verification methodology) as comments via `save_comment`. Prefix all comments with `[{repo}]`.
|
|
68
|
+
4. Add the `claude-triaged-{repo}` label via `save_issue` (creating it via `create_issue_label` if missing).
|
|
69
|
+
|
|
70
|
+
**Gating behavior:**
|
|
71
|
+
- `BLOCKED` (ambiguities found): post the ambiguities; do NOT proceed. Report to the human: "This item has unresolved ambiguities. Triage posted findings as comments. Please resolve and retry."
|
|
72
|
+
- `NOT_RELEVANT`: add the label and report "Item is not relevant to this repository."
|
|
73
|
+
- `PASSED` or `PASSED_WITH_FINDINGS`: proceed to Step 4.
|
|
74
|
+
|
|
75
|
+
### 4. Determine Intent
|
|
76
|
+
|
|
77
|
+
Map the item to a flow:
|
|
78
|
+
|
|
79
|
+
| Item kind | Flow | Work Type |
|
|
80
|
+
|-----------|------|-----------|
|
|
81
|
+
| Project (Epic) | Plan | -- |
|
|
82
|
+
| Story Issue (with `projectId`) | Implement | Build |
|
|
83
|
+
| Task Issue | Implement | Build |
|
|
84
|
+
| Bug Issue | Implement | Fix |
|
|
85
|
+
| Spike Issue | Implement | Investigate Only |
|
|
86
|
+
| Improvement Issue | Implement | Improve |
|
|
87
|
+
| Sub-Issue | Implement | Same as parent's work type |
|
|
88
|
+
|
|
89
|
+
Linear doesn't have a single "issue type" field like JIRA — type is typically encoded as a label (`type:story`, `type:bug`) or inferred from the description. If the type is ambiguous, read the description to classify. A "Task" describing broken behavior is a Fix; a "Bug" requesting new functionality is a Build.
|
|
90
|
+
|
|
91
|
+
### 5. Delegate to Flow
|
|
92
|
+
|
|
93
|
+
Hand off to the appropriate flow as defined in the `intent-routing` rule. Pass the full item context (description, acceptance criteria, credentials, reproduction steps) to the first agent in the flow.
|
|
94
|
+
|
|
95
|
+
### 6. Sync Progress at Milestones
|
|
96
|
+
|
|
97
|
+
Use the `linear-sync` skill to update the item at these milestones:
|
|
98
|
+
- **Plan created** — post plan summary, branch name
|
|
99
|
+
- **Implementation started** — post task completion progress
|
|
100
|
+
- **PR ready** — post PR link, summary of changes
|
|
101
|
+
- **PR merged** — post final summary
|
|
102
|
+
|
|
103
|
+
### 7. Post Evidence at Completion
|
|
104
|
+
|
|
105
|
+
Use the `linear-evidence` skill to:
|
|
106
|
+
- Upload verification evidence to the GitHub PR
|
|
107
|
+
- Post evidence summary as a Linear comment
|
|
108
|
+
- Transition labels: remove `status:in-progress`, add `status:code-review`
|
|
109
|
+
|
|
110
|
+
### 8. Suggest Status Transition
|
|
111
|
+
|
|
112
|
+
Based on the milestone, suggest (but don't auto-transition the native Linear `state`):
|
|
113
|
+
|
|
114
|
+
| Milestone | Suggested label transition |
|
|
115
|
+
|-----------|---------------------------|
|
|
116
|
+
| Plan created | `status:in-progress` |
|
|
117
|
+
| PR ready | `status:code-review` |
|
|
118
|
+
| PR merged | `status:on-dev` (build-intake will perform if dispatched via that flow) |
|
|
119
|
+
|
|
120
|
+
The label transitions ARE the canonical signal. The native `state` field stays as the human / triage decision.
|
|
121
|
+
|
|
122
|
+
## Rules
|
|
123
|
+
|
|
124
|
+
- Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), update labels to `status:blocked` and reassign to the creator. Every other status change remains a label-driven suggestion.
|
|
125
|
+
- Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
|
|
126
|
+
- Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `mcp__linear-server__save_issue` and `mcp__linear-server__save_comment` directly to set `status:blocked` and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `mcp__linear-server__save_comment` to post triage findings and `mcp__linear-server__save_issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
|
|
127
|
+
- If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
128
|
+
- If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-build-intake
|
|
3
|
+
description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims status:ready Issues, dispatches each to the linear-agent build flow, relabels to status:on-dev on success. Symmetric counterpart of jira-build-intake and github-build-intake. Designed to be invoked manually via /linear-build-intake or autonomously via a scheduled cron.
|
|
4
|
+
skills:
|
|
5
|
+
- linear-build-intake
|
|
6
|
+
- linear-read-issue
|
|
7
|
+
- linear-verify
|
|
8
|
+
- linear-validate-issue
|
|
9
|
+
- linear-write-issue
|
|
10
|
+
- linear-sync
|
|
11
|
+
- linear-evidence
|
|
12
|
+
- linear-add-journey
|
|
13
|
+
- ticket-triage
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Linear Build Intake Agent
|
|
17
|
+
|
|
18
|
+
You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find `status:ready` Issues, dispatch each through the build flow, relabel successful builds to `status:on-dev` — then report what happened.
|
|
19
|
+
|
|
20
|
+
## Confirmation policy
|
|
21
|
+
|
|
22
|
+
Once you have a team key, RUN. Do not ask the caller whether to proceed, do not preview projected scope (Issue counts, PR counts, build estimates), do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you. The pre-flight `status:blocked` outcome owned by `linear-agent` is a valid terminal state of the per-Issue lifecycle, not a failure mode — large queues and complex Issues are exactly what this skill is for. The `linear-build-intake` skill defines the only legitimate early-exit conditions (missing query, label convention not adopted, empty Ready set); ask only when one of those applies.
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
### 1. Receive the query
|
|
27
|
+
|
|
28
|
+
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear team key (e.g. `ENG`) or the literal token `linear` (which falls back to `linear.teamKey` in `.lisa.config.json`). You do not pick the team yourself.
|
|
29
|
+
|
|
30
|
+
If no query is provided AND no `linear.teamKey` is configured, stop and ask. Never run intake against a default scope without explicit configuration — the side effects (label transitions, PRs opened, builds running) are too high to act without an explicit target.
|
|
31
|
+
|
|
32
|
+
### 2. Run the intake skill
|
|
33
|
+
|
|
34
|
+
Invoke the `linear-build-intake` skill with the query as `$ARGUMENTS`. The skill owns the cycle logic — Linear MCP queries, claim, dispatch to `linear-agent`, transition on success, summary. Do not duplicate that logic here.
|
|
35
|
+
|
|
36
|
+
The skill in turn invokes `linear-agent` per Issue, which owns the per-Issue lifecycle (read full graph, verify, triage, route to flow, sync progress, post evidence). You do not call `linear-agent` directly — the intake skill does.
|
|
37
|
+
|
|
38
|
+
### 3. Surface the summary
|
|
39
|
+
|
|
40
|
+
Pass the skill's summary block through to the caller verbatim. The caller needs the structured record:
|
|
41
|
+
|
|
42
|
+
- Total processed
|
|
43
|
+
- Per-Issue outcomes (`status:on-dev` → which PR; `status:blocked` by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
|
|
44
|
+
- PR count
|
|
45
|
+
|
|
46
|
+
If the cycle errored before processing any Issues (e.g. label convention not adopted — `status:ready` doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent labels.
|
|
47
|
+
|
|
48
|
+
### 4. Suggest next actions when warranted
|
|
49
|
+
|
|
50
|
+
After a successful cycle, if any Issues ended at `status:on-dev`, mention that the next phase (QA, deploy, or downstream verification) is owned by humans or a future intake skill. This skill does not own anything past `status:on-dev`.
|
|
51
|
+
|
|
52
|
+
If any Issues ended at `status:blocked` (pre-flight verify failed) or `Held` (triage found ambiguities), point that out so the caller knows which Issues need human attention before they can be re-claimed. The `status:blocked` ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
|
|
53
|
+
|
|
54
|
+
## Rules
|
|
55
|
+
|
|
56
|
+
- **Never run a cycle without an explicit query or configured `linear.teamKey`.** Side effects too high to default.
|
|
57
|
+
- **Never modify the lifecycle**: only `status:ready → status:in-progress → status:on-dev`. Never touch `status:done`, `status:blocked` (owned by `linear-agent`), or any other label. (Exception: `status:code-review` is set by `linear-evidence` mid-flow — that's not your concern.)
|
|
58
|
+
- **Never bypass `linear-agent` to do build work directly.** The intake skill dispatches; `linear-agent` builds. Skipping the dispatch produces broken work.
|
|
59
|
+
- **Never invent labels.** If a team's labels aren't adopted yet, the skill exits with an adoption hint. Don't guess label names.
|
|
60
|
+
- **Never start a second cycle while one is in flight against an overlapping team.** Serial execution. Scheduling layer (when added) is responsible for not double-firing.
|
|
61
|
+
- **Stop and surface failures rather than retry-loop.** If `linear-agent` returns an unexpected response or an error, the skill records it under "Errors" — pass that through. Do not auto-retry.
|
|
62
|
+
- **Pre-flight failures are not your problem to fix.** If an Issue fails `linear-verify` (missing Validation Journey, sign-in, etc.), `linear-agent` transitions it to `status:blocked` and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
|
|
@@ -5,7 +5,7 @@ skills:
|
|
|
5
5
|
- linear-prd-intake
|
|
6
6
|
- linear-to-tracker
|
|
7
7
|
- tracker-validate
|
|
8
|
-
-
|
|
8
|
+
- tracker-source-artifacts
|
|
9
9
|
- product-walkthrough
|
|
10
10
|
- tracker-write
|
|
11
11
|
- prd-ticket-coverage
|
|
@@ -25,7 +25,7 @@ Once you have a workspace or team scope, RUN. Do not ask the caller whether to p
|
|
|
25
25
|
|
|
26
26
|
### 1. Receive the scope URL or key
|
|
27
27
|
|
|
28
|
-
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `
|
|
28
|
+
The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `linear.workspace` in `.lisa.config.json`). You do not pick the scope yourself.
|
|
29
29
|
|
|
30
30
|
If no scope is provided, stop and ask. Never run intake against a default or guessed scope — the side effects (label changes, sentinel-issue creation, JIRA tickets created) are too high to act without an explicit target.
|
|
31
31
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA
|
|
2
|
+
description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Source can be a Notion / Confluence / Linear / GitHub Issue URL, a JIRA epic key, a markdown file, or a free-form description. For batch scanning of all Ready PRDs in a queue, use /lisa:intake instead."
|
|
3
3
|
argument-hint: "<single-PRD-url | GitHub-issue-url | @file | ticket-id-or-url | description>"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Config Resolution
|
|
2
|
+
|
|
3
|
+
Lisa is vendor-agnostic. PRDs can be sourced from Notion, Confluence, Linear, GitHub Issues, or JIRA. Tickets can be written to JIRA, GitHub Issues, or Linear. Per-project configuration lives in `.lisa.config.json` at the repo root, with optional `.lisa.config.local.json` overriding on a per-key basis.
|
|
4
|
+
|
|
5
|
+
This rule is the single source of truth for the `.lisa.config.json` schema, the resolution algorithm, and the dispatch tables every vendor-neutral skill follows.
|
|
6
|
+
|
|
7
|
+
## File location and precedence
|
|
8
|
+
|
|
9
|
+
Read configuration from the repo root in this order:
|
|
10
|
+
|
|
11
|
+
1. `.lisa.config.local.json` — gitignored, per-developer overrides (e.g., a developer running with a different destination tracker for one branch).
|
|
12
|
+
2. `.lisa.config.json` — committed, project-wide settings.
|
|
13
|
+
|
|
14
|
+
Local overrides global on a **per-key basis**: missing keys in `.lisa.config.local.json` fall through to `.lisa.config.json`. Use `jq` from Bash for all reads — never hand-parse JSON.
|
|
15
|
+
|
|
16
|
+
A typical Bash read:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
local_value=$(jq -r '.tracker // empty' .lisa.config.local.json 2>/dev/null)
|
|
20
|
+
global_value=$(jq -r '.tracker // empty' .lisa.config.json 2>/dev/null)
|
|
21
|
+
tracker="${local_value:-${global_value:-jira}}"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Schema
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"tracker": "jira",
|
|
29
|
+
"source": "notion",
|
|
30
|
+
|
|
31
|
+
"atlassian": { "cloudId": "<uuid>" },
|
|
32
|
+
"jira": { "project": "<KEY>" },
|
|
33
|
+
"confluence": { "spaceKey": "<KEY>", "parentPageId": "<id>" },
|
|
34
|
+
"github": { "org": "<org-or-user>", "repo": "<repo>" },
|
|
35
|
+
"notion": { "prdDatabaseId": "<uuid>", "statusProperty": "Status", "readyValue": "Ready" },
|
|
36
|
+
"linear": { "workspace": "<workspace-slug>", "teamKey": "<TEAM>" }
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Top-level fields
|
|
41
|
+
|
|
42
|
+
| Field | Required | Default | Notes |
|
|
43
|
+
|-------|----------|---------|-------|
|
|
44
|
+
| `tracker` | no | `"jira"` | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing key resolves to `"jira"` for back-compat. |
|
|
45
|
+
| `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
|
|
46
|
+
|
|
47
|
+
### Vendor sections
|
|
48
|
+
|
|
49
|
+
Each vendor section is **conditionally required**: required only when that vendor is referenced as `tracker`, as `source`, or by an explicit invocation. Skills validate their own required keys at entry and stop with a clear error if missing — never invent values.
|
|
50
|
+
|
|
51
|
+
#### `atlassian`
|
|
52
|
+
|
|
53
|
+
| Field | Required when | Notes |
|
|
54
|
+
|-------|---------------|-------|
|
|
55
|
+
| `atlassian.cloudId` | `tracker = "jira"`, `source = "jira"`, `source = "confluence"`, or any `confluence-*` / `jira-*` skill is invoked | Atlassian Cloud site UUID. Resolve once via the Atlassian MCP `getAccessibleAtlassianResources` and paste in. Shared between JIRA and Confluence (same Atlassian site). If a project ever needs separate sites for JIRA vs Confluence, override via `jira.cloudId` / `confluence.cloudId` (not currently implemented — file an issue). |
|
|
56
|
+
|
|
57
|
+
#### `jira`
|
|
58
|
+
|
|
59
|
+
| Field | Required when | Notes |
|
|
60
|
+
|-------|---------------|-------|
|
|
61
|
+
| `jira.project` | `tracker = "jira"` or any `jira-*` skill is invoked | JIRA project key (e.g. `SE`, `ENG`). |
|
|
62
|
+
|
|
63
|
+
#### `confluence`
|
|
64
|
+
|
|
65
|
+
| Field | Required when | Notes |
|
|
66
|
+
|-------|---------------|-------|
|
|
67
|
+
| `confluence.spaceKey` | `source = "confluence"` and `parentPageId` is not set | Confluence space key (e.g. `ENG`). |
|
|
68
|
+
| `confluence.parentPageId` | `source = "confluence"` and `spaceKey` is not set | Confluence parent page ID. Either `spaceKey` or `parentPageId` must be set; both is allowed (parent page ID narrows the scope). |
|
|
69
|
+
|
|
70
|
+
#### `github`
|
|
71
|
+
|
|
72
|
+
| Field | Required when | Notes |
|
|
73
|
+
|-------|---------------|-------|
|
|
74
|
+
| `github.org` | `tracker = "github"` or `source = "github"` or any `github-*` skill is invoked | GitHub organization or user name. |
|
|
75
|
+
| `github.repo` | same as above | GitHub repository name. |
|
|
76
|
+
|
|
77
|
+
When `tracker = "github"` AND `source = "github"` (self-host), both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide — see "Self-host edge case" below.
|
|
78
|
+
|
|
79
|
+
#### `notion`
|
|
80
|
+
|
|
81
|
+
| Field | Required when | Notes |
|
|
82
|
+
|-------|---------------|-------|
|
|
83
|
+
| `notion.prdDatabaseId` | `source = "notion"` | Notion database ID (UUID, dashes optional). The database is the PRD queue. |
|
|
84
|
+
| `notion.statusProperty` | `source = "notion"` | Name of the database property that drives the lifecycle. Defaults to `"Status"` if absent. |
|
|
85
|
+
| `notion.readyValue` | `source = "notion"` | Status value that means "ready for ticketing". Defaults to `"Ready"` if absent. The full lifecycle (Ready → In Review → Blocked / Ticketed → Shipped) is hardcoded; only the entry-point value name is configurable for now. |
|
|
86
|
+
|
|
87
|
+
#### `linear`
|
|
88
|
+
|
|
89
|
+
| Field | Required when | Notes |
|
|
90
|
+
|-------|---------------|-------|
|
|
91
|
+
| `linear.workspace` | `tracker = "linear"`, `source = "linear"`, or any `linear-*` skill is invoked | Linear workspace slug (e.g. `acme`). |
|
|
92
|
+
| `linear.teamKey` | `tracker = "linear"` | Linear team key (e.g. `ENG`). The team owns the destination Issues. For source mode, projects are workspace-scoped or team-scoped per the URL passed. |
|
|
93
|
+
|
|
94
|
+
## Resolution algorithm
|
|
95
|
+
|
|
96
|
+
Every `tracker-*` shim and every vendor-neutral caller follows this:
|
|
97
|
+
|
|
98
|
+
1. Read `.lisa.config.local.json` first (if present), then `.lisa.config.json`. Local overrides global on a per-key basis. Use `jq` — never hand-parse JSON.
|
|
99
|
+
2. Extract the `tracker` field. If missing or null, default to `"jira"`.
|
|
100
|
+
3. Dispatch:
|
|
101
|
+
- `tracker = "jira"` → delegate to the matching `jira-*` skill. Validate `atlassian.cloudId` and `jira.project` are present.
|
|
102
|
+
- `tracker = "github"` → delegate to the matching `github-*` skill. Validate `github.org` and `github.repo` are present.
|
|
103
|
+
- `tracker = "linear"` → delegate to the matching `linear-*` skill. Validate `linear.workspace` and `linear.teamKey` are present.
|
|
104
|
+
4. Any other value: stop and report `"Unknown tracker '<value>' in .lisa.config.json. Expected 'jira', 'github', or 'linear'."`
|
|
105
|
+
|
|
106
|
+
For batch skills that consume `source`:
|
|
107
|
+
|
|
108
|
+
1. If `$ARGUMENTS` contains an explicit URL or key, parse the source vendor from it (always wins).
|
|
109
|
+
2. If `$ARGUMENTS` is the bare token `notion` / `confluence` / `linear` / `github` / `jira`, the source is that vendor; resolve location from the corresponding config section.
|
|
110
|
+
3. If `$ARGUMENTS` is empty, fall back to `source` from config; if that's also empty, stop and report `"No source specified and no 'source' field in .lisa.config.json."`
|
|
111
|
+
|
|
112
|
+
## Skill mapping
|
|
113
|
+
|
|
114
|
+
The shim → vendor mapping is fixed:
|
|
115
|
+
|
|
116
|
+
| Shim | jira tracker | github tracker | linear tracker |
|
|
117
|
+
|------|--------------|----------------|----------------|
|
|
118
|
+
| `lisa:tracker-write` | `lisa:jira-write-ticket` | `lisa:github-write-issue` | `lisa:linear-write-issue` |
|
|
119
|
+
| `lisa:tracker-validate` | `lisa:jira-validate-ticket` | `lisa:github-validate-issue` | `lisa:linear-validate-issue` |
|
|
120
|
+
| `lisa:tracker-verify` | `lisa:jira-verify` | `lisa:github-verify` | `lisa:linear-verify` |
|
|
121
|
+
| `lisa:tracker-read` | `lisa:jira-read-ticket` | `lisa:github-read-issue` | `lisa:linear-read-issue` |
|
|
122
|
+
| `lisa:tracker-evidence` | `lisa:jira-evidence` | `lisa:github-evidence` | `lisa:linear-evidence` |
|
|
123
|
+
| `lisa:tracker-sync` | `lisa:jira-sync` | `lisa:github-sync` | `lisa:linear-sync` |
|
|
124
|
+
| `lisa:tracker-add-journey` | `lisa:jira-add-journey` | `lisa:github-add-journey` | `lisa:linear-add-journey` |
|
|
125
|
+
| `lisa:tracker-journey` | `lisa:jira-journey` | `lisa:github-journey` | `lisa:linear-journey` |
|
|
126
|
+
| `lisa:tracker-create` | `lisa:jira-create` | `lisa:github-create` | `lisa:linear-create` |
|
|
127
|
+
| `lisa:tracker-build-intake` | `lisa:jira-build-intake` | `lisa:github-build-intake` | `lisa:linear-build-intake` |
|
|
128
|
+
|
|
129
|
+
The `tracker-source-artifacts` skill (formerly `tracker-source-artifacts`) is read-only and vendor-neutral — it has no shim and is invoked directly by every `*-to-tracker` skill and every destination write skill (`jira-write-ticket`, `github-write-issue`, `linear-write-issue`).
|
|
130
|
+
|
|
131
|
+
## Caller responsibilities
|
|
132
|
+
|
|
133
|
+
- **PRD-source skills** (`notion-to-tracker`, `confluence-to-tracker`, `linear-to-tracker`, `github-to-tracker`) MUST invoke `tracker-write` and `tracker-validate` — never `jira-write-ticket` / `github-write-issue` / `linear-write-issue` directly. This is what makes a project's destination switchable via config.
|
|
134
|
+
- **Lifecycle skills** (`implement`, `verify`, `monitor`) MUST invoke `tracker-read`, `tracker-evidence`, `tracker-sync` for ticket interaction — never the vendor-specific equivalents.
|
|
135
|
+
- **Per-vendor PRD intake skills** (`notion-prd-intake`, `confluence-prd-intake`, `linear-prd-intake`, `github-prd-intake`) compose the PRD-source skills (which in turn invoke the shims) — they do not need to read `tracker` themselves.
|
|
136
|
+
- **Vendor-specific destination skills** (`jira-*`, `github-*`, `linear-*`) read their own vendor config section directly. They do NOT consult `tracker` — they are the targets of dispatch, not the dispatchers.
|
|
137
|
+
|
|
138
|
+
## Linear destination semantics (best practices)
|
|
139
|
+
|
|
140
|
+
Linear's data model differs from JIRA / GitHub. The destination mapping follows Linear's recommended patterns:
|
|
141
|
+
|
|
142
|
+
| Concept (JIRA / GitHub) | Linear equivalent | Linear MCP write |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| Epic | **Project** (with milestones, target dates, lead, state) | `save_project` |
|
|
145
|
+
| Story | **Issue** with `projectId` set, no `parentId` | `save_issue` |
|
|
146
|
+
| Sub-task | **Sub-issue** with `parentId` = Story issue ID | `save_issue` |
|
|
147
|
+
| Fix version | Linear **ProjectMilestone** (native, dated) | `save_project` (milestones array) |
|
|
148
|
+
| Priority | Native `priority` field (0=No, 1=Urgent, 2=High, 3=Medium, 4=Low) | issue field |
|
|
149
|
+
| Estimate / story points | Native `estimate` field | issue field |
|
|
150
|
+
| Status workflow | **Labels** (`status:ready`, `status:in-progress`, `status:on-dev`, `status:done`) — portable across teams | issue labels |
|
|
151
|
+
| Component | Label prefix `component:` | issue labels |
|
|
152
|
+
| Issue links (blocks / relates / duplicates) | Native Linear relations | `save_issue_relation` |
|
|
153
|
+
|
|
154
|
+
`linear-write-issue` is **polymorphic**: dispatches internally on `issue_type` (Epic → `save_project`, Story / Sub-task → `save_issue`). Parity with `jira-write-ticket` / `github-write-issue` is preserved at the shim level.
|
|
155
|
+
|
|
156
|
+
Initiatives (Linear's cross-Project rollup) are NOT used — they're intended for cross-quarter, cross-team groupings rarely appropriate for an Epic. If a project ever needs Initiative-level grouping, that's a future extension to this rule.
|
|
157
|
+
|
|
158
|
+
## Self-host edge case (GitHub PRDs → GitHub destination)
|
|
159
|
+
|
|
160
|
+
When `github-to-tracker` is invoked AND `tracker = "github"`, both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide:
|
|
161
|
+
|
|
162
|
+
- PRD-source labels: `prd-draft`, `prd-ready`, `prd-in-review`, `prd-blocked`, `prd-ticketed`, `prd-shipped` — owned by `github-prd-intake` and the human PM.
|
|
163
|
+
- Build-queue labels: `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done` — owned by `github-build-intake` and `github-agent`.
|
|
164
|
+
- Sentinel issue label: `prd-intake-feedback` — owned by `github-prd-intake`.
|
|
165
|
+
|
|
166
|
+
Never overload one label across both lifecycles.
|
|
167
|
+
|
|
168
|
+
The same separation applies for Linear self-host (`source = "linear"` AND `tracker = "linear"`): project-level labels (`prd-*`) drive the PRD lifecycle; issue-level labels (`status:*`) drive the build lifecycle; the sentinel feedback issue carries the issue-level `prd-intake-feedback` label.
|
|
169
|
+
|
|
170
|
+
## Invariants
|
|
171
|
+
|
|
172
|
+
- Project tracker selection is **persistent** within a project — always read from config, never infer from the shape of `$ARGUMENTS`. If a developer wants a different destination for one run, they edit `.lisa.config.local.json`.
|
|
173
|
+
- A vendor-neutral skill never embeds vendor-specific terminology in its prompts (no "JIRA ticket key", "epic parent" — use "tracker key", "parent issue"). The vendor skill is responsible for translating its inputs.
|
|
174
|
+
- The shim layer is intentionally thin — its only job is dispatch. Gate logic, validation rules, and field schemas all live in the vendor skills.
|
|
175
|
+
- Secrets stay in env (`JIRA_API_TOKEN`, `LINEAR_API_KEY`, `GH_TOKEN`, `NOTION_API_KEY`, `ATLASSIAN_API_TOKEN`). Configuration in `.lisa.config.json` is non-secret only — IDs, keys, slugs, project codes.
|
|
176
|
+
- E2E test config (`E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`) stays in env for now — not tracker-related and frequently per-environment.
|
|
177
|
+
|
|
178
|
+
## Migration from the previous schema
|
|
179
|
+
|
|
180
|
+
The pre-expansion `.lisa.config.json` had only `tracker` and `github.{org,repo}`. Existing projects continue to work — the new fields are all conditionally required, and `tracker = "jira"` (the default) only requires `atlassian.cloudId` and `jira.project`, which were previously read from env (`JIRA_SERVER`, `JIRA_PROJECT`).
|
|
181
|
+
|
|
182
|
+
To migrate a project off env vars:
|
|
183
|
+
|
|
184
|
+
1. Add `atlassian.cloudId` (resolve via `getAccessibleAtlassianResources` once).
|
|
185
|
+
2. Add `jira.project` (was `JIRA_PROJECT`).
|
|
186
|
+
3. Drop `JIRA_SERVER` from env (replaced by `atlassian.cloudId`).
|
|
187
|
+
4. Optionally add `source` to set the default PRD source for batch skills.
|
|
@@ -310,33 +310,33 @@ Sequence:
|
|
|
310
310
|
1. `ops-specialist` -- health checks, log inspection, error monitoring, performance analysis
|
|
311
311
|
2. Report findings, escalate if action needed
|
|
312
312
|
|
|
313
|
-
## Tracker Entry Point (JIRA
|
|
313
|
+
## Tracker Entry Point (JIRA, GitHub Issues, or Linear)
|
|
314
314
|
|
|
315
|
-
When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL,
|
|
315
|
+
When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL, an `org/repo#<n>` token, or a Linear identifier like `ENG-123` or a Linear project URL):
|
|
316
316
|
|
|
317
|
-
1. Hand off to the matching vendor agent — `jira-agent` (
|
|
318
|
-
2. The agent reads the
|
|
319
|
-
3. The agent validates
|
|
317
|
+
1. Hand off to the matching vendor agent — `jira-agent` (JIRA refs), `github-agent` (GitHub Issue refs), or `linear-agent` (Linear identifier or project URL). The configured destination tracker (`.lisa.config.json` `tracker`) is the default when the ref shape is ambiguous.
|
|
318
|
+
2. The agent reads the work item fully via the matching read skill (`jira-read-ticket` / `github-read-issue` / `linear-read-issue`) — description / body, comments, attachments, linked items, parent (Epic / Project / parent Issue), siblings.
|
|
319
|
+
3. The agent validates item quality via the matching verify skill (`jira-verify` / `github-verify` / `linear-verify`).
|
|
320
320
|
4. The agent runs analytical triage via the vendor-neutral `ticket-triage` skill.
|
|
321
321
|
5. If triage finds unresolved ambiguities (`BLOCKED` verdict), the agent posts findings and STOPS -- no work begins.
|
|
322
322
|
6. The agent determines intent and delegates to the appropriate flow:
|
|
323
323
|
|
|
324
|
-
|
|
|
325
|
-
|
|
326
|
-
| Epic | Plan | -- |
|
|
324
|
+
| Item kind | Flow | Work Type |
|
|
325
|
+
|-----------|------|-----------|
|
|
326
|
+
| Epic (JIRA Epic / GitHub Epic-labeled / Linear Project) | Plan | -- |
|
|
327
327
|
| Story | Implement | Build |
|
|
328
328
|
| Task | Implement | Build |
|
|
329
329
|
| Bug | Implement | Fix |
|
|
330
330
|
| Spike | Implement | Investigate Only |
|
|
331
331
|
| Improvement | Implement | Improve |
|
|
332
|
-
| Sub-task | Implement | (per parent's intent) |
|
|
332
|
+
| Sub-task / sub-Issue | Implement | (per parent's intent) |
|
|
333
333
|
|
|
334
|
-
For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label.
|
|
334
|
+
For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label. For Linear, the type typically comes from a label (`type:story`, `type:bug`) or is inferred from the description if unlabeled — `linear-agent` handles the inference.
|
|
335
335
|
|
|
336
|
-
If the
|
|
336
|
+
If the item type is ambiguous, read the description / body to classify. A "Task" that describes broken behavior is a Fix. A "Bug" that requests new functionality is a Build.
|
|
337
337
|
|
|
338
|
-
7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync`).
|
|
339
|
-
8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence`).
|
|
338
|
+
7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync` / `linear-sync`).
|
|
339
|
+
8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence` / `linear-evidence`).
|
|
340
340
|
|
|
341
341
|
Vendor-neutral callers (e.g., `implement`, `verify`) should invoke the `tracker-*` shims — they dispatch to the right vendor automatically.
|
|
342
342
|
|