Skip to content

feat(008): inline markdown checklists for Linear and JIRA#1140

Merged
zbigniewsobiecki merged 6 commits intodevfrom
feat/008-inline-checklists
Apr 18, 2026
Merged

feat(008): inline markdown checklists for Linear and JIRA#1140
zbigniewsobiecki merged 6 commits intodevfrom
feat/008-inline-checklists

Conversation

@zbigniewsobiecki
Copy link
Copy Markdown
Member

Summary

Linear and JIRA checklists (acceptance criteria, implementation steps, dependency lists) are now stored as inline markdown checkboxes in the parent issue's description, instead of full sub-issues / subtasks. Trello continues to use its native checklist API.

The problem: A splitting agent that broke a feature into 5 stories with 6 acceptance criteria each was creating 30 orphan issues in the Linear/JIRA workspace — each with its own identifier, state, project assignment, and lifecycle. These cluttered boards, polluted search, inflated backlog counts, and confused users seeing dozens of "Tests verify…" items as top-level work.

The fix: For providers without native checklists, append ### {Checklist Name} markdown sections to the parent description, with - [ ] / - [x] items underneath. Both Linear and JIRA render these as interactive checkboxes natively. The PMProvider interface is unchanged — only adapter internals.

Spec 008 | Plans 1 2

Architecture

  • Shared engine (src/pm/_shared/inline-checklist.ts): pure string transformer with parse / append / addItem / toggle / remove / hash. ~280 LOC, 28 tests, zero external dependencies.
  • Linear adapter: reads/writes description field as plain markdown.
  • JIRA adapter: reads/writes description via ADF round-trip (adfToPlainText → mutate → markdownToAdf). Extended ADF converter to handle taskList / taskItem nodes.
  • Read-modify-write with one retry on conflict for safe concurrent description updates.
  • Content-hash item IDs (cl-a1b2c3d4) — stable as long as item text doesn't change.

Files changed

Area Files
Engine src/pm/_shared/inline-checklist.ts (new)
Linear adapter src/pm/linear/adapter.ts (5 checklist methods rewritten)
JIRA adapter src/pm/jira/adapter.ts (5 checklist methods rewritten, removed getSubtaskTypeName)
ADF src/pm/jira/adf.ts (added taskList/taskItem cases)
Tests 4 test files: new engine tests + rewritten adapter checklist sections + new ADF tests
Docs src/integrations/README.md (new "Checklist implementation by provider" section), CHANGELOG.md
Cleanup .gitignore (lock file), parser refactor to remove lint warning

Test plan

  • 28 engine tests covering hash, parse, append, addItem, toggle, remove, full round-trip
  • Linear adapter: 12 inline-checklist tests including retry on conflict
  • JIRA adapter: 11 inline-checklist tests including ADF round-trip and retry
  • ADF: 4 new tests for taskList/taskItem → markdown conversion
  • Full unit suite: 7891 tests pass
  • Typecheck clean, lint clean (no warnings)
  • Deploy to dev, trigger a splitting run, verify acceptance criteria appear as checkboxes in the Linear issue description (not as sub-issues)

Migration

Forward-only. Existing sub-issues / subtasks created before this change are not migrated — they remain as-is. New checklists use the inline format.

🤖 Generated with Claude Code

zbigniewsobiecki and others added 6 commits April 17, 2026 21:15
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pure string transformer for reading, writing, and mutating inline
markdown checklists within issue descriptions. Supports parsing,
appending, adding items, toggling checked state, removing items,
and stable content-hash IDs.

Dormant — no adapter wiring yet (plan 2).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replaces sub-issue/subtask checklist implementation with inline
markdown checkboxes appended to the parent issue's description.
Linear writes plain markdown; JIRA round-trips through ADF.

Both adapters use the shared engine from plan 1. PMProvider interface
unchanged. Read-modify-write with one retry on conflict.

Trello unchanged (uses native checklists).

Closes spec 008.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Untrack .claude/scheduled_tasks.lock (committed by accident); add to
gitignore. Refactor parseInlineChecklists to extract state-handling
helper, removing the cognitive complexity warning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 18, 2026

Codecov Report

❌ Patch coverage is 91.79331% with 27 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/pm/_shared/inline-checklist.ts 92.26% 14 Missing and 1 partial ⚠️
src/pm/linear/adapter.ts 90.62% 5 Missing and 1 partial ⚠️
src/pm/jira/adapter.ts 92.30% 4 Missing and 1 partial ⚠️
src/pm/jira/adf.ts 83.33% 0 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@zbigniewsobiecki zbigniewsobiecki merged commit c4561c3 into dev Apr 18, 2026
9 checks passed
@zbigniewsobiecki zbigniewsobiecki deleted the feat/008-inline-checklists branch April 18, 2026 08:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant