Problem statement
Teams adopting iloom-cli have no reliable, org-wide way to distinguish AI-assisted tickets from human-authored ones in their issue tracker. Agents can technically supply labels via the MCP create_issue tool, but relying on agent behavior is non-deterministic — labels get missed, inconsistent, or dropped silently (Jira drops them entirely today).
A settings-driven default would make every iloom-created ticket identifiable without relying on agent instructions.
Goals
- Configure a list of labels in
settings.json that get applied automatically to every issue created through iloom-cli
- Merge configured defaults with any agent-supplied labels (union, dedup) so configured identifiers are always present
- Propagate the config through the MCP env-var bridge so the issue-management MCP server picks it up
- Deliver for GitHub and Jira in this epic
Scope
In scope:
- GitHub and Jira tracker providers
- New
settings.issueManagement.{github,jira}.defaultLabels: string[] config (defaults to [])
- Configured defaults merged (case-sensitive union with dedup, configured-first order) with agent-supplied labels
- MCP env-var bridge propagates config to the subprocess
- Documentation in
docs/iloom-commands.md
Out of scope:
- Linear: Labels are currently unimplemented in iloom-cli's Linear integration (
createLinearIssue and createLinearChildIssue in src/utils/linear.ts silently drop the _labels parameter), and Linear's SDK requires resolving label names to label UUIDs via a lookup helper that does not yet exist. Deferred to a follow-up epic focused on Linear label support.
- Legacy
JiraIssueTracker.createIssue CLI path (unused by the MCP-driven issue creation flow)
- First-run-setup prompting
- Telemetry (no workflow change)
Summary of approach
One config-surface change (schema + env bridge + docs) establishes the contract. Two parallel per-tracker wiring changes (GitHub and Jira) consume the contract and merge the configured defaults with agent-supplied labels before the label list reaches each tracker's API. A final integration verification confirms the wires are connected end-to-end.
Task overview
| # |
Title |
Description |
Dependencies |
Complexity |
| 1 |
Add defaultLabels to settings schema + env-var bridge + docs |
Extend settings schema and MCP env-var bridge with defaultLabels for GitHub and Jira; document in settings reference. |
None |
Simple |
| 2 |
Apply defaultLabels in Jira provider + API client |
Merge configured + agent labels in Jira MCP provider; forward as fields.labels in REST API POST body. |
Task 1 |
Simple |
| 3 |
Apply defaultLabels in GitHub provider |
Merge configured + agent labels in GitHub MCP provider; forward to existing gh CLI label pipeline. |
Task 1 |
Simple |
| 4 |
Verify default-label integration |
Integration tests confirming merged-label flow end-to-end for both providers with no regression when unset. |
Tasks 2, 3 |
Simple |
Detailed breakdown
The full implementation breakdown — per-task acceptance criteria, shared contracts, scope boundaries, must-haves, and the architectural decision record — is posted as a comment on this issue.
Note
An earlier version of this plan was incorrectly created as four separate issues (#986, #987, #988, #989). Those have been closed; this issue is the single source of truth for the plan.
Problem statement
Teams adopting iloom-cli have no reliable, org-wide way to distinguish AI-assisted tickets from human-authored ones in their issue tracker. Agents can technically supply labels via the MCP
create_issuetool, but relying on agent behavior is non-deterministic — labels get missed, inconsistent, or dropped silently (Jira drops them entirely today).A settings-driven default would make every iloom-created ticket identifiable without relying on agent instructions.
Goals
settings.jsonthat get applied automatically to every issue created through iloom-cliScope
In scope:
settings.issueManagement.{github,jira}.defaultLabels: string[]config (defaults to[])docs/iloom-commands.mdOut of scope:
createLinearIssueandcreateLinearChildIssueinsrc/utils/linear.tssilently drop the_labelsparameter), and Linear's SDK requires resolving label names to label UUIDs via a lookup helper that does not yet exist. Deferred to a follow-up epic focused on Linear label support.JiraIssueTracker.createIssueCLI path (unused by the MCP-driven issue creation flow)Summary of approach
One config-surface change (schema + env bridge + docs) establishes the contract. Two parallel per-tracker wiring changes (GitHub and Jira) consume the contract and merge the configured defaults with agent-supplied labels before the label list reaches each tracker's API. A final integration verification confirms the wires are connected end-to-end.
Task overview
defaultLabelsto settings schema + env-var bridge + docsdefaultLabelsfor GitHub and Jira; document in settings reference.defaultLabelsin Jira provider + API clientfields.labelsin REST API POST body.defaultLabelsin GitHub providerghCLI label pipeline.Detailed breakdown
The full implementation breakdown — per-task acceptance criteria, shared contracts, scope boundaries, must-haves, and the architectural decision record — is posted as a comment on this issue.
Note
An earlier version of this plan was incorrectly created as four separate issues (#986, #987, #988, #989). Those have been closed; this issue is the single source of truth for the plan.