ソース情報
- リポジトリ
- CodySwannGT/lisa
- ソースの最終更新活動
- 2026年8月13日 11:51
- 検出された SKILL.md の言語
- 英語
- スター
- 3
- フォーク
- 3
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/CodySwannGT/lisa --skill lisa-linear-write-issueコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
any non-trivial request —…
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
SKILL.md を表示中
| name | lisa-linear-write-issue |
| description | Creates or updates a Linear… |
| allowed-tools | ["Bash","Skill"] |
Create or update a Linear work item — Project (for Epics), Issue (for Stories), or sub-Issue (for Sub-tasks) — with all required relationships, metadata, and quality gates. Every section below is mandatory. Thin items are rejected.
Repository name for scoped comments: basename $(git rev-parse --show-toplevel).
This skill reads configuration from .lisa.config.json (with .lisa.config.local.json overriding per key). Required keys:
linear.workspace — Linear workspace sluglinear.teamKey — Linear team key (e.g. ENG); the team owns the destination itemsIf either is missing, stop and report — never invent values.
Linear's data model maps Epic / Story / Sub-task to different entity types. This skill dispatches on issue_type:
issue_type | Linear entity | MCP write tool | Parent field |
|---|---|---|---|
Epic | Project | lisa-linear-access operation: save-project | (none — Projects are top-level within a team) |
Story / Task / Improvement | Issue | lisa-linear-access operation: save-issue | projectId (the Epic Project) |
Sub-task | sub-Issue | lisa-linear-access operation: save-issue | parentId (the Story Issue) |
Bug | Issue | lisa-linear-access operation: save-issue | projectId if part of an Epic; else top-level |
Spike | Issue | lisa-linear-access operation: save-issue | projectId if part of an Epic; else top-level |
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 only on explicit build_ready: true; omitted or false leaves it in the team's default backlog state, and a container is never put in ready at all (see the Build-ready control input below).
Determine from $ARGUMENTS and context whether this is a CREATE or UPDATE:
<TEAM>-<n> for Issue, project slug + short-id for Project) — call /linear-read-issue <ref> first to load the full current state. Never overwrite without reading.Resolve the team ID for linear.teamKey via lisa-linear-access operation: list-teams({query: <teamKey>}). Cache it.
Required fields (stop and ask if missing — never invent values):
| Field | Required For | Notes |
|---|---|---|
team_key | CREATE | From linear.teamKey config; required for both Project and Issue creation |
issue_type | CREATE | One of: Epic, Story, Task, Bug, Spike, Sub-task, Improvement |
| Summary | CREATE, UPDATE | One line, imperative voice, under 100 chars |
| Description | CREATE, UPDATE | Multi-section markdown — see Phase 3 |
| Project parent (for Story / Task / Bug / Spike / Improvement when part of an Epic) | non-Epic, non-Sub-task in Epic context | Linear Project ID — the Epic |
| Sub-task parent | Sub-task | Linear Issue ID — the Story |
| Priority | CREATE | Native Linear priority: 0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low |
| Acceptance criteria | Story, Task, Bug, Sub-task, Improvement | Gherkin — see Phase 3 |
| Validation Journey | Runtime-behavior changes | Delegate to /linear-add-journey |
| Target backend environment | Runtime-behavior changes | For every work type, use an exact deploy.branches key when an environment is known. Human: bare key or Confirmed: <env>. Automation: 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 an automated annotation with the bare key or Confirmed: <env>. |
| Sign-in account / credentials | Items that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description. Omit when sign-in is not required. |
| Single-repo scope | Bug, Task, Sub-task | These types MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
| Source Requirement | PRD-sourced Issues (prd_source provided) | ## Source Requirement with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-issues included. |
Optional but recommended: assignee, estimate (story points), labels, project milestone (fix-version equivalent), cycle.
Linear descriptions are markdown (NOT Jira wiki markup — no h2. headings, use ## instead). The description MUST address three audiences. Reject and rewrite if any are missing.
## Source Requirement
[Required whenever the Issue originates from a PRD (the caller passes
`prd_source`). Answers "why was this done?" — cite the PRD and quote the
requirement(s) VERBATIM, never paraphrased:
- **PRD**: <PRD title + link> §"<section heading>"
- **Requirement (R3)**: "<verbatim requirement text from the PRD>"
One Requirement line per satisfied requirement. Derived / cross-cutting
work that traces to no single requirement uses the supporting form:
"Derived work supporting R3, R7 — no single PRD section." Close with:
"This Issue exists to satisfy the quoted requirement. If implementation
scope drifts from the quoted text, the PRD is the authority — raise the
conflict rather than silently reinterpreting it." Omit the section only
for ad-hoc Issues with no PRD lineage.]
## Context / Business Value
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
Link to the originating Slack thread, Notion doc, incident, or customer report.]
## Technical Approach
[Developer-facing. Integration points, impacted modules, data model implications,
relevant tradeoffs. Not a full design doc — a pointer for someone picking it up.]
## Acceptance Criteria
1. Given <precondition>
When <action>
Then <observable outcome>
2. Given <precondition>
When <action>
Then
[Explicit list of what this item does NOT cover. Forces scope discipline.]
[ALWAYS required on a leaf — the SECTION is unconditional, only its
VALUE is conditional. It is where is
persisted, so omitting it records nothing rather than recording "no".
When the item changes runtime behavior, use an exact
key. A human-confirmed value is a bare key or
. An automated evidence write is
; an automated
generic default is .
Without a unique reverse-map use .
Human confirmation replaces the automated annotation with a bare key or
. ALWAYS render this section — it is where
is persisted, and an absent section reads as
, not exempt. Work that changes no runtime behavior declares the
exemption in place of an environment: `None — no runtime behavior change:
doc-onlyconfig-onlytype-only`). A Project/container declares
. Visible prose, not an HTML
comment, for the same reason the Branch Plan provenance line is: a marker that
survives in only one representation cannot be a vendor-neutral discriminator,
and every tracker this contract binds stores its body in some rich-text or
structured form that need not preserve HTML comments. A declaration a reader
can see is one every backend can store. See the rule.]
[GENERATED, never hand-authored. Render only when the item has a Target
Backend Environment; omit entirely when
(doc-only / config-only / type-only) or for a Project/container — absence is
correct there. Derive per the rule: resolve the
environment, map it forward through ,
and prove the branch exists on the remote. Do not accept caller-supplied
branches; recompute them. Exactly three lines:
Branch from:
PR into:
Derived from: Target Backend Environment via .lisa.config.json deploy.branches
Both fields name the same branch by construction. A missing, ambiguous, or
non-unique mapping, or a branch absent from the remote, STOPS the write —
never default to or the remote default to keep the write alive.]
[Include this section ONLY if the work touches authenticated surfaces.
Specify: the account/role to sign in as, where to get the credentials
(1Password item name, env var, seeded fixture), and any MFA/SSO notes.
Omit the section entirely when sign-in is not required.]
[Required for Bug / Task / Sub-task. Name the single repo this item covers.
If the work spans repos, this issue type is wrong — split into per-repo
Tasks/Sub-tasks under a parent Story or Epic.]
[Delegate to /linear-add-journey if the item changes runtime behavior.
Skip only for doc-only, config-only, or type-only items. Cross-work-item
evidence pointers use ;
they never replace this item's local S14 marker.]
Rules:
prd_source) MUST carry the Source Requirement section with verbatim quotes — paraphrases are rejected (validator gate S16). This applies at every level, sub-issues included: a leaf claimed in isolation must explain its own "why".Before creating or updating, find candidate relationships. Do NOT skip — this is the step agents most often omit.
If the item is not an Epic and not a top-level Bug/Spike, it MUST have a parent context:
projectId (the Epic Project) set.parentId (the Story Issue) set.If the parent is explicitly provided, use it. Otherwise:
lisa-linear-access operation: list-projects({team: <teamKey>, state: ["backlog", "planned", "started"]})
Match on keywords from the summary and description.Relationship discovery is mandatory on every create and every update — never declare "no related work" without doing both searches below and recording their outcomes on the item.
Search 1: local git history (catches PRs / commits that touched the same area but were never linked):
git log --all --oneline --grep="<keyword>"
git log --all --oneline -- <path-or-glob>
git log --since=90.days --oneline -- <path-or-glob>
If the git search surfaces a PR or commit that relates to this work, capture the PR URL — it becomes a remote link (Phase 4c) and may also point to a sibling item worth linking.
Search 2: Linear MCP (catches open and recently-closed items):
# Open items in the same Project
lisa-linear-access operation: list-issues({project: <projectId>, state_type: ["unstarted", "started"]})
# Open items with overlapping keywords (workspace-wide)
lisa-linear-access operation: list-issues({query: "<keyword>", state_type: ["unstarted", "started"]})
# Items with shared labels
lisa-linear-access operation: list-issues({label: "<label>", updatedAt: ">-30d"})
# Recently closed items in the same Project
lisa-linear-access operation: list-issues({project: <projectId>, state_type: ["completed", "canceled"], updatedAt: ">-30d"})
Record the outcome. Add a ## Relationship Search subsection (or a comment if updating) listing the queries you ran and what they returned. If the searches yielded nothing, write that explicitly — "Searched git history for <keywords> and Linear for project=X, label=Y; no related work found." An item with zero relations and no documented search is rejected.
For each candidate, classify the relationship:
| Relation Type | When to Use |
|---|---|
blocks | This item must ship before the linked item can proceed |
blocked_by | The linked item must ship before this one can proceed |
relates_to | Shared context, no ordering constraint |
duplicates | This item already exists — close one as duplicate |
Linear native relations are set on the Issue via save_issue's relations field (or via a paired save_issue_relation call if available in the MCP). For Project-level (Epic) relationships, capture them in the description under ## Related Projects since Linear doesn't model relations between Projects natively.
Identify and attach (Linear stores attachments / links on the Issue or in description body):
lisa-tracker-source-artifacts (invoke that skill if you haven't loaded the rules in this session). Enumerate the parent Project's links and inherit the ones whose domain matches this item's scope (UI → ui-design + ux-flow; backend → data; infra → ops; always inherit reference). Never assume a developer will walk up to the Project to find design context — attach it here.If the item was generated from a PRD (by lisa-notion-to-tracker or similar) and the parent Project has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction before proceeding.
Source precedence rules and cross-axis conflict handling are defined in lisa-tracker-source-artifacts §3 and §4. When an item carries both design artifacts and a description, record the precedence explicitly in the description (under Technical Approach or a dedicated ## Source Precedence subsection) so the implementer doesn't silently reconcile conflicts. Cross-axis conflicts go under ## Open Questions as BLOCKER items.
For UI-touching items, include the existing-component reuse expectation per lisa-tracker-source-artifacts §7.
If the item modifies an existing user-facing surface, a lisa-product-walkthrough should already have been run upstream. Inherit its findings under a ## Current Product subsection in the description so the implementer sees what's shipped today before changing it. If the upstream skill skipped the walkthrough but this item clearly modifies an existing surface, invoke lisa-product-walkthrough here before proceeding.
Before create/update, verify each field is populated where applicable:
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, only on explicit build_ready: true (see the Build-ready control input below). A container (Epic Project / Story with sub-issues / Spike) is never put in the build-ready state.type:<Kind>, repo:<name>, component:<name>, and the prd-intake-feedback sentinel. Lifecycle is not a label on Linear; do not add status:* labels.For Bug / Task / Sub-task, ensure the summary is prefixed with [<repo-name>].
build_ready)build_ready is a write-control input governed by the ready-role-filing rule — cite that slug for the full contract; do not restate its per-vendor normalization table here. It decides whether a leaf work unit is created in the resolved ready workflow state. It never overrides leaf-only-lifecycle — a container is never stamped build-ready regardless of build_ready. "Not build-ready" is not a special state: the Issue is simply left in the team's default backlog/unstarted state, which a human can promote later. This mirrors lisa-jira-write-ticket, because Linear is a state-driven tracker like JIRA, not a label-driven one like GitHub.
ready state on omission, so a caller that relied on that must now pass build_ready: true.build_ready: false → create the leaf without the ready state, leaving it in the team's default backlog state so it waits for a human to review and promote it into the queue.build_ready: true → transition the leaf to the resolved ready state (.linear.workflow.ready) so lisa-intake / lisa-linear-build-intake auto-picks it up. Best-effort: if the state cannot be resolved or the transition is rejected, do not fail the write — leave the Issue in its default state and record the reason.A filing with neither is an incomplete handoff. A leaf that is not build-ready must carry an explicit human_gate: "<why a human must judge this first>"; nothing in the ready lane means nothing ever claims it. When human_gate is supplied, stamp the hold on the Issue so it is auditable — a visible line plus the verbatim marker:
Held for a human product call: <reason>.
<!-- [lisa-human-gate] reason=<short-slug> -->
If a leaf arrives with build_ready omitted or false and no human_gate, do not create it: report the incomplete handoff and name both ways to resolve it (build_ready: true, or a human_gate reason). Containers are exempt — their state rolls up from children, so they need neither.
Before any write, invoke lisa-linear-validate-issue with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the lisa-linear-validate-issue schema, including runtime_behavior_change, authenticated_surface, and artifacts_attached flags so the right gates run.
The validator is the single source of truth for what makes a valid Linear work item. The same gates are used by lisa-linear-to-tracker dry-run, by lisa-linear-verify post-write, and here. Do not re-implement gate logic in this skill.
If the validator reports FAIL:
lisa-linear-access operation: save-project or lisa-linear-access operation: save-issue while the validator's verdict is FAIL.If the validator reports PASS, continue to Phase 6.
prd-ticketed, etc.) via lisa-linear-access operation: list-project-labels (create via lisa-linear-access operation: create-project-label if missing).lisa-linear-access operation: save-project with: name (summary), description (markdown), teamIds: [<teamId>], labelIds, priority (Linear Project priority is also 0–4), state (default backlog), milestones if dated.lisa-linear-to-tracker Phase 4 to use.type:<Kind>, repo:<name>, component:<name>, prd-intake-feedback only if this is a sentinel issue) via lisa-linear-access operation: list-issue-labels (create via lisa-linear-access operation: create-issue-label if missing). Separately resolve the ready state id via lisa-linear-access operation: list-workflow-states, and set it as stateId only for a leaf work unit and only when build_ready is not false — omit it for a container, and for a build_ready: false leaf which then waits in the default backlog state for a human to promote it.lisa-linear-access operation: save-issue with: team (teamId), title (summary), description (markdown), projectId (the Epic Project), priority (0–4), estimate, labelIds, assignee if known.ENG-123) — Phase 4 sub-tasks need it as parentId.save_issue (relations field) or paired relation calls.lisa-linear-add-journey to append the Validation Journey section.lisa-linear-access operation: save-issue with: team (teamId), title ([<repo>] <summary> prefix is mandatory), description (markdown), parentId (the Story Issue ID), projectId (inherit from parent), priority, estimate, labelIds.lisa-linear-access operation: save-project or lisa-linear-access operation: save-issue with only the fields being changed. Do NOT resend fields that weren't in the change set — Linear treats the call as a full overwrite of the listed fields./linear-read-issue first, including any existing canonical managed ## Lisa Usage section unless the caller intentionally supplied an updated canonical section. Use the shared lisa-usage-accounting serializer/merge path rather than freehand edits to ledger rows.Call the lisa-linear-verify skill on the resulting item. lisa-linear-verify fetches the live item and runs lisa-linear-validate-issue against it — same gates as Phase 5.5, but applied to what Linear actually stored. If it reports failures, fix them before returning. Do not report success on an item that fails verify.
Post a creation comment via lisa-linear-access operation: save-comment (on the Issue, or on a sentinel issue under the Project for Epic-level announcements) with:
[<repo>] prefix if the item is repo-scopedblocks, blocked_by, relates_to) with Linear identifiersSkip this step only on UPDATE when no material change was made.
## Lisa Usage section on update; never append a second usage
section or silently drop ledger rows.lisa-linear-create) should delegate here rather than calling the MCP write tools directly.lisa-linear-validate-issue, NOT in this skill. This skill calls the validator at Phase 5.5 (pre-write) and Phase 7 (via lisa-linear-verify post-write). When a gate needs to change, change it in lisa-linear-validate-issue — every caller picks it up automatically.lisa-tracker-write shim when tracker = "linear". Vendor-neutral callers (notion-to-tracker, confluence-to-tracker, linear-to-tracker, github-to-tracker) MUST go through lisa-tracker-write, not call this skill directly.