76 lines
4.0 KiB
TOML
76 lines
4.0 KiB
TOML
# Store starter: Linear. `scripts/read_store.py` reads this file as the base layer; the project's
|
|
# _bmad/custom/ticketing-store-config.toml names the store, fills the empty fields below, and replaces
|
|
# any other key here, key by key.
|
|
# It updates with the skill and holds only what is specific to this store: the rules every store shares
|
|
# are in references/board.md. Comments and `description` are never loaded; `description` is for choosing a store.
|
|
#
|
|
# One tool: Linear's official MCP server. Initiatives hold projects, parent issues are epics, labels carry
|
|
# type, relations carry blocking. Linear ships no CLI; community CLIs are not used here.
|
|
|
|
description = "Linear through its MCP server: projects, parent issues, relations, labels. For product teams on Linear."
|
|
|
|
[tickets]
|
|
store = "linear"
|
|
key = "" # Linear team key, e.g. "SHOP"; Linear assigns the number
|
|
team = "" # the default team, key or name. A container's own `key` overrides it for everything under it
|
|
access = """
|
|
Use the Linear MCP (create_issue, update_issue, create_project, update_project, get_issue,
|
|
list_issues, list_issue_statuses, create_issue_label, create_comment) against `team`. Confirm from the tool schema whether parent
|
|
and blockedBy take identifiers (SHOP-12) or ids, and the exact tool names against the server's list at first use.
|
|
"""
|
|
|
|
fields = """
|
|
severity is Linear's priority, set on the issue: P0 = Urgent, P1 = High, P2 = Medium, P3 = Low.
|
|
risk 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.
|
|
"""
|
|
|
|
reference = """
|
|
Also pass the url in the issue's links so it shows in the sidebar.
|
|
"""
|
|
|
|
[verbs]
|
|
setup = """
|
|
Connect, unless the Linear tools already answer: add the MCP server https://mcp.linear.app/mcp to
|
|
the agent tool in use (in Claude Code, `claude mcp add --transport http linear-server https://mcp.linear.app/mcp`),
|
|
then sign in over OAuth. Do not use the deprecated /sse endpoint.
|
|
`create_issue_label` for every non-empty value in [tickets.types], `hitl`, and risk:low, risk:medium,
|
|
risk:high that the team lacks. States
|
|
cannot be created from the MCP: `list_issue_statuses`, compare with [tickets.status], and tell the
|
|
user what to add under Settings, Teams, Issue statuses, or which map entry to set in the project's
|
|
store config. Linear's defaults (Backlog, Todo, In Progress, Done, Canceled) need no setup; [tickets.status]
|
|
also expects an In Review state in the Started group.
|
|
"""
|
|
|
|
write = """
|
|
The team is the ticket's own `key`, else that of the nearest container above it, else `team` here.
|
|
tracker_id is the issue's identifier and remote its url.
|
|
`create_issue` creates, `update_issue` changes — title, description, state, assignee, parent,
|
|
blockedBy, labels, priority, project. The issue's state is [tickets.status].<state>. Labels carry type, hitl, and
|
|
risk:<value>; priority carries severity per `fields`. A standalone ticket: omit parent and project.
|
|
Epics are parent issues. Set [tickets.types].initiative to map onto a Linear Initiative only when the
|
|
server exposes initiative tools.
|
|
"""
|
|
|
|
query = """
|
|
One issue: `get_issue` with includeRelations — labels, priority, state, assignee, parent,
|
|
project, relations, description; after is the "blocked by" relations, and the description's
|
|
covers holds the source requirement ids. Many: `list_issues` by project, parent, label, state, or
|
|
query words.
|
|
"""
|
|
|
|
# BMad type -> this store's type.
|
|
[tickets.types]
|
|
initiative = "" # 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.
|
|
epic = "epic" # label on a parent issue
|
|
story = "story"
|
|
spike = "spike"
|
|
bug = "bug"
|
|
|
|
# BMad state -> this store's status.
|
|
[tickets.status]
|
|
backlog = "Backlog" # or "Todo" — the team's choice
|
|
in-progress = "In Progress"
|
|
review = "In Review" # not a default Linear state; `setup` asks for it. With no review state, set it to the in-progress one
|
|
done = "Done"
|
|
dropped = "Canceled"
|