@codyswann/lisa 2.328.3 → 2.328.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/upstream-evidence-manifest.js +10 -10
- package/dist/sync/lifecycle-defaults.d.ts +12 -3
- package/dist/sync/lifecycle-defaults.d.ts.map +1 -1
- package/dist/sync/lifecycle-defaults.js +13 -4
- package/dist/sync/lifecycle-defaults.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +5 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +2 -2
- package/plugins/lisa/agents/linear-agent.md +2 -2
- package/plugins/lisa/agents/linear-build-intake.md +13 -13
- package/plugins/lisa/rules/reference/config-resolution.md +5 -3
- package/plugins/lisa/scripts/queue-contract-resolution.mjs +20 -8
- package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/lisa/skills/lisa-linear-claim/SKILL.md +6 -5
- package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +2 -2
- package/plugins/lisa-agy/agents/linear-agent.md +2 -2
- package/plugins/lisa-agy/agents/linear-build-intake.md +13 -13
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +20 -8
- package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/lisa-agy/skills/lisa-linear-claim/SKILL.md +6 -5
- package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +2 -2
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/linear-agent.agent.md +2 -2
- package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +13 -13
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -3
- package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +20 -8
- package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/lisa-copilot/skills/lisa-linear-claim/SKILL.md +6 -5
- package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +2 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/linear-agent.md +2 -2
- package/plugins/lisa-cursor/agents/linear-build-intake.md +13 -13
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -3
- package/plugins/lisa-cursor/scripts/queue-contract-resolution.mjs +20 -8
- package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/lisa-cursor/skills/lisa-linear-claim/SKILL.md +6 -5
- package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +2 -2
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/linear-agent.md +2 -2
- package/plugins/src/base/agents/linear-build-intake.md +13 -13
- package/plugins/src/base/rules/reference/config-resolution.md +5 -3
- package/plugins/src/base/scripts/queue-contract-resolution.mjs +20 -8
- package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +8 -8
- package/plugins/src/base/skills/lisa-linear-claim/SKILL.md +6 -5
- package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +19 -19
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +5 -5
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +2 -2
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +2 -2
|
@@ -61,12 +61,12 @@ authenticated_surface: true # → requires Sign-in Required
|
|
|
61
61
|
artifacts_attached: true # → requires Source Precedence section
|
|
62
62
|
relations: [{ id: "ENG-99", type: "blocked_by" }] # known issue relations (may be empty)
|
|
63
63
|
remote_links: [{ url: "https://github.com/...", title: "PR #42" }]
|
|
64
|
-
build_ready: true # caller asserts the build-ready role (the `
|
|
64
|
+
build_ready: true # caller asserts the build-ready role (the `Ready` state) is/would be set — see S15
|
|
65
65
|
child_refs: ["ENG-601", "ENG-602"] # known child work (sub-issues / project-member issues / blocked_by parentage) — see S15
|
|
66
66
|
prd_source: "https://notion.so/..." # set when the Issue was generated from a PRD — requires the Source Requirement section, see S16
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
-
If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (
|
|
69
|
+
If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
|
|
70
70
|
|
|
71
71
|
## Gates
|
|
72
72
|
|
|
@@ -235,9 +235,9 @@ This gate depends on S11. It is `N/A` for containers — a **Project** (the Epic
|
|
|
235
235
|
|
|
236
236
|
#### S15 — Leaf-only build-ready
|
|
237
237
|
|
|
238
|
-
Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only a leaf work unit may carry the build-ready role.** This is the symmetric write-side guard for the Linear validator — a
|
|
238
|
+
Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only a leaf work unit may carry the build-ready role.** This is the symmetric write-side guard for the Linear validator — a container sitting in the configured `ready` state is a lifecycle error and must FAIL here, regardless of how the item was produced. (Mirrors the "build-ready is leaf-only" rule that `lisa-linear-write-issue` applies at write time.)
|
|
239
239
|
|
|
240
|
-
**When the gate applies.** Run S15 whenever the item is build-ready — i.e. `build_ready = true`, or the
|
|
240
|
+
**When the gate applies.** Run S15 whenever the item is build-ready — i.e. `build_ready = true`, or the item's live state is the configured `ready` state. If the item is not build-ready, S15 is `N/A` (nothing claims a non-ready item, so the invariant is vacuous).
|
|
241
241
|
|
|
242
242
|
**Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: an item is a **container** if it has child work, whatever its declared type; otherwise the **issue type** decides. Determine child work from (in order) `child_refs`, native sub-issues, project-member issues (an Epic is modeled as a Linear Project), and `blocked_by` / parent references — the same hierarchy resolution `lisa-linear-read-issue` uses. When validating a live identifier, query sub-issues / project members alongside the item fetch.
|
|
243
243
|
|
|
@@ -362,7 +362,7 @@ system, and never invent or ask for credentials inline.
|
|
|
362
362
|
|
|
363
363
|
## Execution
|
|
364
364
|
|
|
365
|
-
1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (
|
|
365
|
+
1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
|
|
366
366
|
2. Resolve team ID via `lisa-linear-access operation: list-teams({query: <teamKey>})` if any feasibility gate will run.
|
|
367
367
|
3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
|
|
368
368
|
4. Unless the caller passed `--spec-only` (dry-run), run every Feasibility gate. Collect results.
|
|
@@ -31,7 +31,7 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
|
|
|
31
31
|
| `Bug` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
|
|
32
32
|
| `Spike` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
|
|
33
33
|
|
|
34
|
-
The build lifecycle uses native **workflow states** (`
|
|
34
|
+
The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state by default; `build_ready: false` leaves it in the team's default backlog state instead, and a container is never put in `ready` at all (see the Build-ready control input below).
|
|
35
35
|
|
|
36
36
|
## Phase 1 — Resolve Intent
|
|
37
37
|
|
|
@@ -227,7 +227,7 @@ If the item modifies an existing user-facing surface, a `lisa-product-walkthroug
|
|
|
227
227
|
|
|
228
228
|
Before create/update, verify each field is populated where applicable:
|
|
229
229
|
|
|
230
|
-
- **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `
|
|
230
|
+
- **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `Ready`) on a new **leaf** work unit (Bug / Task / Sub-task / Improvement with no child work) per `leaf-only-lifecycle`, **unless `build_ready: false`** (see the Build-ready control input below). A container (Epic Project / Story with sub-issues / Spike) is never put in the build-ready state.
|
|
231
231
|
- **Labels**: taxonomy only — `type:<Kind>`, `repo:<name>`, `component:<name>`, and the `prd-intake-feedback` sentinel. Lifecycle is **not** a label on Linear; do not add `status:*` labels.
|
|
232
232
|
- **Native priority field**: 0–4 per Linear's scale; explicit, not "unset".
|
|
233
233
|
- **Native estimate**: per Linear's team-configured estimate scale (often 0–8 Fibonacci); skip for Epic / Spike.
|
|
@@ -167,14 +167,14 @@ read_state() { # $1=role path (e.g. ready, done.dev) $2=default
|
|
|
167
167
|
|
|
168
168
|
Enumerate the team's states with `lisa-linear-access operation: list-workflow-states` (each carries `id`, `name`, `type`, `position`). For each role, resolve in this order — the same cascade `lisa-setup-jira` uses, with one extra rung Linear affords that JIRA does not:
|
|
169
169
|
|
|
170
|
-
1. **Exact name match** → resolved, nothing to do.
|
|
170
|
+
1. **Exact name match** → resolved, nothing to do. For `ready`, additionally refuse to resolve onto the team's DEFAULT state (`Todo` on a stock team): that inverts the gate from "a human flipped this" to "nobody has touched this" and makes every untouched backlog item claimable. Offer to create a dedicated state instead.
|
|
171
171
|
2. **A plausible existing state of the right `type`** (`ready` → `unstarted`, `claimed`/`review` → `started`, `blocked` → `started` or `unstarted`, terminal `done` → `completed`) → present the team's state list via `AskUserQuestion` and let the user pick which state means this role. Record the choice as a config override in Step 4.
|
|
172
172
|
3. **Nothing plausible** → offer to **create** the state via `lisa-linear-access operation: create-workflow-state` (name, `type`, `position`, colour), showing the exact name and type first. Linear's API permits this where JIRA's workflow editing is admin-gated — which is why this rung exists here and not there.
|
|
173
173
|
4. **User declines creation** → stop and say which role is unresolvable and that the lifecycle cannot run without it. Never silently fall back to a state whose meaning differs, and never invent a name in config that does not exist in the team.
|
|
174
174
|
|
|
175
175
|
| Role | Default state | `type` | Ships with a stock team? |
|
|
176
176
|
|------|---------------|--------|--------------------------|
|
|
177
|
-
| `ready` | `
|
|
177
|
+
| `ready` | `Ready` | `unstarted` | **no — must be created or mapped** |
|
|
178
178
|
| `claimed` | `In Progress` | `started` | yes |
|
|
179
179
|
| `review` | `In Review` | `started` | yes |
|
|
180
180
|
| `blocked` | `Blocked` | `unstarted` | **no — must be created or mapped** |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.328.
|
|
3
|
+
"version": "2.328.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.328.
|
|
3
|
+
"version": "2.328.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.328.
|
|
3
|
+
"version": "2.328.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.328.
|
|
3
|
+
"version": "2.328.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.328.
|
|
3
|
+
"version": "2.328.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -47,7 +47,7 @@ Use the `linear-verify` skill to check the item against organizational standards
|
|
|
47
47
|
|
|
48
48
|
**Gating behavior — this is the one place auto-transitioning is allowed:**
|
|
49
49
|
|
|
50
|
-
Resolve build
|
|
50
|
+
Resolve build-lifecycle STATES from `.lisa.config.json` `linear.workflow.*` (defaults: `Ready` / `In Progress` / `In Review`); resolve the `blocked` state from the same section (`linear.workflow.blocked`, default `Blocked`) and the `human_needed` marker label from the same section (`linear.labels.build.human_needed`, default `human-needed`).
|
|
51
51
|
|
|
52
52
|
If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
|
|
53
53
|
1. **Best-effort autofill (before blocking).** Run `pre-flight-autofill` for every work item. Preserve a human bare configured key or `Confirmed: <env>`; automation writes `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, `Assumption: <env> — remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces the annotation with the bare key or `Confirmed: <env>`. For a legacy bare value, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Resolve one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname; exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. A reported bug environment is an example, not a restriction. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop; never infer from arbitrary branch text, URL paths/query strings, or substrings. Write through `linear-write-issue`, never overwrite human prose, then re-run `linear-verify`.
|
|
@@ -112,7 +112,7 @@ Use the `linear-sync` skill to update the item at these milestones:
|
|
|
112
112
|
Use the `linear-evidence` skill to:
|
|
113
113
|
- Upload verification evidence to the GitHub PR
|
|
114
114
|
- Post evidence summary as a Linear comment
|
|
115
|
-
- Transition
|
|
115
|
+
- Transition the workflow state: move from the configured `claimed` state to the configured `review` state (`linear.workflow.{claimed,review}`)
|
|
116
116
|
|
|
117
117
|
### 8. Suggest Status Transition
|
|
118
118
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-build-intake
|
|
3
|
-
description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims Issues
|
|
3
|
+
description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims Issues in the configured `ready` workflow state, dispatches each to the linear-agent build flow, transitions to the configured (env-aware) `done` state 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
4
|
skills:
|
|
5
5
|
- linear-build-intake
|
|
6
6
|
- linear-read-issue
|
|
@@ -15,21 +15,21 @@ skills:
|
|
|
15
15
|
|
|
16
16
|
# Linear Build Intake Agent
|
|
17
17
|
|
|
18
|
-
You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find Issues
|
|
18
|
+
You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find Issues in the configured `ready` workflow STATE, dispatch each through the build flow, transition successful builds to the configured (env-aware) `done` state — then report what happened.
|
|
19
19
|
|
|
20
|
-
Build-lifecycle role names (`ready`, `claimed`, `review`, `blocked`, `done`) are resolved from `.lisa.config.json` `linear.workflow.*` by the `linear-build-intake` skill, and name native **workflow states**, not labels. Defaults: `
|
|
20
|
+
Build-lifecycle role names (`ready`, `claimed`, `review`, `blocked`, `done`) are resolved from `.lisa.config.json` `linear.workflow.*` by the `linear-build-intake` skill, and name native **workflow states**, not labels. Defaults: `Ready`, `In Progress`, `In Review`, `Blocked`, env-keyed `{ dev: "On Dev", staging: "On Stg", production: "Done" }`. `ready` is a DEDICATED state, never the team default (`Todo`) — mapping it to the default makes every untouched backlog item claimable.
|
|
21
21
|
|
|
22
22
|
## Confirmation policy
|
|
23
23
|
|
|
24
|
-
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 configured `blocked`
|
|
24
|
+
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 configured `blocked` state 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, workflow states not adopted, empty ready set); ask only when one of those applies.
|
|
25
25
|
|
|
26
26
|
## Workflow
|
|
27
27
|
|
|
28
28
|
### 1. Receive the query
|
|
29
29
|
|
|
30
|
-
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. Lifecycle
|
|
30
|
+
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. Lifecycle state names are read from `linear.workflow.*` and are not your concern at this layer.
|
|
31
31
|
|
|
32
|
-
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 (
|
|
32
|
+
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 (state transitions, PRs opened, builds running) are too high to act without an explicit target.
|
|
33
33
|
|
|
34
34
|
### 2. Run the intake skill
|
|
35
35
|
|
|
@@ -42,23 +42,23 @@ The skill runs the linear-agent workflow in-session per Issue — read full grap
|
|
|
42
42
|
Pass the skill's summary block through to the caller verbatim. The caller needs the structured record:
|
|
43
43
|
|
|
44
44
|
- Total processed
|
|
45
|
-
- Per-Issue outcomes (configured `done`
|
|
45
|
+
- Per-Issue outcomes (configured `done` state → which PR; configured `blocked` state by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
|
|
46
46
|
- PR count
|
|
47
47
|
|
|
48
|
-
If the cycle errored before processing any Issues (e.g.
|
|
48
|
+
If the cycle errored before processing any Issues (e.g. workflow states not adopted — the configured `ready` state doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent states: a workflow state carries a `type` and a board position, and guessing either puts an Issue somewhere no human sanctioned. Point at `/lisa:setup:linear`.
|
|
49
49
|
|
|
50
50
|
### 4. Suggest next actions when warranted
|
|
51
51
|
|
|
52
|
-
After a successful cycle, if any Issues ended at the configured `done`
|
|
52
|
+
After a successful cycle, if any Issues ended at the configured `done` state, note which env rung they reached. Terminal closure needs no separate step now: only the production/final `done` state is typed `completed`, so reaching it IS the native closure, while the intermediate env rungs are typed `started` and correctly leave the Issue open.
|
|
53
53
|
|
|
54
|
-
If any Issues ended at the configured `blocked`
|
|
54
|
+
If any Issues ended at the configured `blocked` state (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 blocked ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
|
|
55
55
|
|
|
56
56
|
## Rules
|
|
57
57
|
|
|
58
58
|
- **Never run a cycle without an explicit query or configured `linear.teamKey`.** Side effects too high to default.
|
|
59
|
-
- **Never modify the lifecycle**: only the configured `ready → claimed → done` transitions
|
|
59
|
+
- **Never modify the lifecycle**: only the configured `ready → claimed → done` state transitions. Never move an Issue to the configured `blocked` state (owned by `linear-agent`) or to any state outside those three. (Exception: the configured `review` state is set by `linear-evidence` mid-flow — that's not your concern.)
|
|
60
60
|
- **Never bypass `linear-agent` to do build work directly.** The intake skill dispatches; `linear-agent` builds. Skipping the dispatch produces broken work.
|
|
61
|
-
- **Never invent
|
|
61
|
+
- **Never invent states.** Names live in `.lisa.config.json` `linear.workflow.*` (canonical) — the setup skill writes them. If a team hasn't adopted them yet, the skill exits with an adoption hint. Don't guess state names.
|
|
62
62
|
- **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.
|
|
63
63
|
- **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.
|
|
64
|
-
- **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 the configured `blocked`
|
|
64
|
+
- **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 the configured `blocked` state and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
|
|
@@ -344,7 +344,7 @@ When `github.projects.v2` is present, later setup/doctor and writer preflight va
|
|
|
344
344
|
|-------|---------------|-------|
|
|
345
345
|
| `linear.workspace` | `tracker = "linear"`, `source = "linear"`, or any `linear-*` skill is invoked | Linear workspace slug (e.g. `acme`). |
|
|
346
346
|
| `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. |
|
|
347
|
-
| `linear.workflow` | `tracker = "linear"` | Workflow **state** name per build lifecycle role — the Linear analogue of `jira.workflow`, not of `github.labels`. Defaults `{ ready: "
|
|
347
|
+
| `linear.workflow` | `tracker = "linear"` | Workflow **state** name per build lifecycle role — the Linear analogue of `jira.workflow`, not of `github.labels`. Defaults `{ ready: "Ready", claimed: "In Progress", review: "In Review", blocked: "Blocked", done: { dev: "On Dev", staging: "On Stg", production: "Done" } }`. **`ready` is a dedicated state, never the team's default** — see below. Resolve and verify with `/lisa:setup:linear`. |
|
|
348
348
|
| `linear.labels` | `tracker = "linear"` or `source = "linear"` | **Markers and the PRD lane only.** `build.human_needed` (default `human-needed`) and the `prd.*` map. The build lifecycle does **not** live here — see `linear.workflow`. |
|
|
349
349
|
|
|
350
350
|
##### Why Linear uses states, not labels
|
|
@@ -429,7 +429,7 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
|
|
|
429
429
|
|
|
430
430
|
| Role | What it means | JIRA default | Linear default | GitHub default |
|
|
431
431
|
|---|---|---|---|---|
|
|
432
|
-
| `ready` | Human signal "this is buildable; agent may claim" | `Ready` (status) | `
|
|
432
|
+
| `ready` | Human signal "this is buildable; agent may claim" | `Ready` (status) | `Ready` (state) | `status:ready` (label) |
|
|
433
433
|
| `claimed` | Agent has picked the item up | `In Progress` (status) | `In Progress` (state) | `status:in-progress` (label) |
|
|
434
434
|
| `review` | Optional post-build review hold, when a tracker/project still uses one | `Code Review` (status) | `In Review` (state) | no default review label |
|
|
435
435
|
| `blocked` | Agent stopped on triage ambiguities or external blocker | `Blocked` (status) | `Blocked` (state) | `status:blocked` (label) |
|
|
@@ -439,7 +439,9 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
|
|
|
439
439
|
|
|
440
440
|
`review` is optional. GitHub build intake skips it by default and moves successful builds directly from `claimed` to the configured `done` label. Linear and JIRA projects that still use a post-build review hold can configure `review`; projects that keep the ticket in `claimed` until terminal can omit it and lifecycle skills will skip the intermediate transition.
|
|
441
441
|
|
|
442
|
-
|
|
442
|
+
**`ready` must never resolve to the team's DEFAULT state.** `Todo` is where Linear puts a brand-new issue, so using it for `ready` inverts the gate: the lane stops meaning "a human flipped this to build-ready" and starts meaning "nobody has touched this". Measured on the first team migrated: 20 issues in the lane, only 8 ever explicitly marked ready. JIRA avoids this because `jira.workflow.ready` is a dedicated `Ready` status while a fresh ticket lands in the project default.
|
|
443
|
+
|
|
444
|
+
**Linear state resolution is `type`-aware.** When a configured name is missing, a lifecycle skill may fall back to the team's states by `type` — `claimed`/`review` → the lowest-position `started`, `blocked` → `started` or `unstarted`, terminal `done` → `completed` — but only to *read*. **`ready` has no fallback on purpose:** every candidate would be the team's default unstarted state, which is exactly the inversion described above. A missing `ready` state is reported, never guessed; it must never invent a state to write into. Missing states are a setup defect, repaired by `/lisa:setup:linear`, not papered over at runtime.
|
|
443
445
|
|
|
444
446
|
`blocked` is what every vendor agent flips to when triage finds unresolved ambiguities or the build path is blocked by something the agent can't resolve. Different from `claimed` because it explicitly signals "human attention required."
|
|
445
447
|
|