Skills › BMAD Method › bmad-agent-po › linear-ticketing.toml
linear-ticketing.toml
75 lines · skills/bmad-agent-po/config/linear-ticketing.toml at bd70c64
1# Store starter: Linear. `scripts/read_store.py` reads this file as the base layer; the project's
2# _bmad/custom/ticketing-store-config.toml names the store, fills the empty fields below, and replaces
3# any other key here, key by key.
4# It updates with the skill and holds only what is specific to this store: the rules every store shares
5# are in references/board.md. Comments and `description` are never loaded; `description` is for choosing a store.
6#
7# One tool: Linear's official MCP server. Initiatives hold projects, parent issues are epics, labels carry
8# type, relations carry blocking. Linear ships no CLI; community CLIs are not used here.
10description = "Linear through its MCP server: projects, parent issues, relations, labels. For product teams on Linear."
12[tickets]
13store = "linear"
14key = "" # Linear team key, e.g. "SHOP"; Linear assigns the number
15team = "" # the default team, key or name. A container's own `key` overrides it for everything under it
16access = """
17Use the Linear MCP (create_issue, update_issue, create_project, update_project, get_issue,
18list_issues, list_issue_statuses, create_issue_label, create_comment) against `team`. Confirm from the tool schema whether parent
19and blockedBy take identifiers (SHOP-12) or ids, and the exact tool names against the server's list at first use.
20"""
22fields = """
23severity is Linear's priority, set on the issue: P0 = Urgent, P1 = High, P2 = Medium, P3 = Low.
24risk is a label risk:<value>; `setup` creates the three. estimate is Linear's estimate field on a story; a label est:<value> on an epic. Empty field: no priority, no label.
25"""
27reference = """
28Also pass the url in the issue's links so it shows in the sidebar.
29"""
31[verbs]
32setup = """
33Connect, unless the Linear tools already answer: add the MCP server https://mcp.linear.app/mcp to
34the agent tool in use (in Claude Code, `claude mcp add --transport http linear-server https://mcp.linear.app/mcp`),
35then sign in over OAuth. Do not use the deprecated /sse endpoint.
36`create_issue_label` for every non-empty value in [tickets.types], `hitl`, and risk:low, risk:medium,
37risk:high that the team lacks. States
38cannot be created from the MCP: `list_issue_statuses`, compare with [tickets.status], and tell the
39user what to add under Settings, Teams, Issue statuses, or which map entry to set in the project's
40store config. Linear's defaults (Backlog, Todo, In Progress, Done, Canceled) need no setup; [tickets.status]
41also expects an In Review state in the Started group.
42"""
44write = """
45The team is the ticket's own `key`, else that of the nearest container above it, else `team` here.
46tracker_id is the issue's identifier and remote its url.
47`create_issue` creates, `update_issue` changes — title, description, state, assignee, parent,
48blockedBy, labels, priority, project. The issue's state is [tickets.status].<state>. Labels carry type, hitl, and
49risk:<value>; priority carries severity per `fields`. A standalone ticket: omit parent and project.
50Epics are parent issues. Set [tickets.types].initiative to map onto a Linear Initiative only when the
51server exposes initiative tools.
52"""
54query = """
55One issue: `get_issue` with includeRelations — labels, priority, state, assignee, parent,
56project, relations, description; after is the "blocked by" relations, and the description's
57covers holds the source requirement ids. Many: `list_issues` by project, parent, label, state, or
58query words.
59"""
61# BMad type -> this store's type.
62[tickets.types]
63initiative = "" # empty: the initiative stays local. Linear has no Epic object and Projects cannot nest; set to "initiative" only to map onto Linear Initiatives, which nest five deep and allow several parents, so the tree cannot round-trip.
64epic = "epic" # label on a parent issue
65story = "story"
66spike = "spike"
67bug = "bug"
69# BMad state -> this store's status.
70[tickets.status]
71backlog = "Backlog" # or "Todo" — the team's choice
72in-progress = "In Progress"
73review = "In Review" # not a default Linear state; `setup` asks for it. With no review state, set it to the in-progress one
74done = "Done"
75dropped = "Canceled"