# Store starter: Jira Cloud. `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: acli, Atlassian's official CLI (`acli jira workitem ...`): create with --parent, transition, # links, comments, assign, JQL. The Atlassian Rovo MCP server (https://mcp.atlassian.com/v1/mcp/authv2) # is the alternative for an org that prefers MCP; it has no link-creation tool. description = "Jira Cloud through acli: work types, transitions, links, JQL. For teams already on Jira, usually with an admin who can adjust the project workflow." [tickets] store = "jira" key = "" # the default Jira project key, e.g. "SHOP"; Jira assigns the number. A container's own `key` overrides it for everything under it site = "" # https://yourorg.atlassian.net access = """ Use acli against `site`. Custom fields go through `--from-json`; check a subcommand's spelling with `acli jira workitem --help` before first use. """ fields = """ severity is Jira's priority: P0 = Highest, P1 = High, P2 = Medium, P3 = Low; set it at create (--priority, or --from-json when the flag is absent) and change it the same way. risk is a label risk-low, risk-medium, or risk-high. estimate is the Story Points field on a story and a label est: on an epic, through --from-json. Empty field: default priority, no label. """ reference = """ acli creates no web links; the description line is the reference. """ [verbs] setup = """ Connect, unless acli is already installed and signed in to `site`: install acli (on macOS, `brew tap atlassian/homebrew-acli && brew install acli`; elsewhere, per Atlassian's acli install guide), then `acli jira auth login --web --site `. acli cannot create work types or statuses; those live in the project's settings. At first publish, read an existing work item (`acli jira workitem view --json --fields issuetype,status`) and the project's work types, compare with [tickets.types] and [tickets.status], and tell the user exactly what to add in Jira or which map entry to set in the project's store config. Jira's defaults (To Do, In Progress, Done; resolution Won't Do) need no setup; [tickets.status] also expects an In Review status. Do not ask for a level above Epic: by default the initiative stays local and everything below it publishes. A team-managed project's admin adds a status as a board column under Project settings, Board; a company-managed project needs a Jira admin to add it to the workflow. """ write = """ The project is the ticket's own `key`, else that of the nearest container above it, else `key` here. tracker_id is the work item's key and remote its url. Create: `acli jira workitem create --project --type --summary --description-file --parent --label [,hitl,risk-]`, priority per `fields` on a bug. Changes: `edit` (body, labels), `assign`, `transition --status <[tickets.status].>` — status never moves by edit — `link create --out --in --type "Blocks"`, `comment create`. No parent: omit --parent — the item sits loose in the project. Custom fields go through --from-json; when dropped shares a status with done, set the resolution the same way so the two stay distinct. Epics sit loose in the project while [tickets.types].initiative is empty. Set that type only when the project has a level above Epic; then epics take it as --parent. """ query = """ One work item: `acli jira workitem view --json --fields key,issuetype,summary,status,assignee,parent,labels,issuelinks,resolution,description`. after is the "is blocked by" links; Done with resolution Won't Do is dropped; the description's covers holds the source requirement ids. Children: `search --jql "parent = "`. Words: `search --jql 'project = AND text ~ ""'`, narrowed by issuetype or status per the maps. """ # BMad type -> this store's type. [tickets.types] initiative = "" # empty: the initiative stays local. Jira's default hierarchy is Epic > Story > Subtask; a level above Epic needs Plans (Premium or Enterprise). Set to "Initiative" only when the project has that level. epic = "Epic" story = "Story" spike = "Task" # plus label spike bug = "Bug" # BMad state -> this store's status. [tickets.status] backlog = "To Do" in-progress = "In Progress" review = "In Review" # not a default Jira status; `setup` asks for it. With no review status, set it to the in-progress one done = "Done" dropped = "Done" # Jira default has no separate status; resolution Won't Do distinguishes it