
speckit-taskstolinear
by Obsidian-Owl
The Open Platform for building Data Platforms. Ship faster. Stay compliant. Scale to Data Mesh.
SKILL.md
name: speckit-taskstolinear description: Convert tasks.md to Linear issues and reconcile completed work bidirectionally.
User Input
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Overview
This skill creates Linear issues from tasks.md with Project organization, requirements traceability, and bidirectional reconciliation.
What it does:
- Validates tasks.md (duplicates, format)
- Creates Linear issues under the appropriate Project
- Reconciles bidirectionally (Linear status: tasks.md checkboxes)
- Sets up blocking dependencies between issues
- Syncs to Beads cache
Detailed patterns: Linear Workflow Guide
Memory Integration
This skill is primarily CRUD operations - no memory search/save needed.
Constitution Alignment
This skill enforces project principles:
- Traceability: Every task linked to Linear for visibility
- Single Source of Truth: Linear owns status, Beads is local cache
Outline
-
Setup & Validation
- Run
.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasksfrom repo root - Parse JSON output for
FEATURE_DIR - Test Linear MCP connection:
mcp__plugin_linear_linear__list_teams - Get team ID via
mcp__plugin_linear_linear__get_team({query: "floe"})
- Run
-
Determine Project & Label
- Extract feature info from directory path (e.g.,
specs/001-plugin-registry/) - Build project slug:
floe-{NN}-{feature-slug}(e.g.,floe-01-plugin-registry) - Build epic label:
epic:{NN}(e.g.,epic:01,epic:10a) - Query Linear projects via
mcp__plugin_linear_linear__list_projects - Find matching project by name or slug
- ERROR if project not found - must be created in Linear first
- Query labels via
mcp__plugin_linear_linear__list_issue_labels({team: teamId}) - If epic label doesn't exist, create via
mcp__plugin_linear_linear__create_issue_label({name: "epic:NN", teamId}) - Store label name for use in issue creation
- Extract feature info from directory path (e.g.,
-
Load or Initialize Mapping
- Check for existing
$FEATURE_DIR/.linear-mapping.json - If exists: load and use for reconciliation
- If not: initialize new mapping structure with metadata (feature name, project ID, timestamps)
- Check for existing
-
Parse & Validate tasks.md
- Parse tasks matching format:
- [x] T### [P] [US#] Description with file path - Extract: task ID, completed status, parallel marker, user story, requirements, description
- Duplicate detection: ERROR if same task ID appears twice
- TDD warning: Warn if implementation task doesn't have preceding test task
- Parse tasks matching format:
-
Query Linear for Existing Issues
- Query project issues via
mcp__plugin_linear_linear__list_issues({project: projectId}) - Query status names via
mcp__plugin_linear_linear__list_issue_statuses(never hardcode!) - Build status: type mapping (e.g., "Done":
completed) - Build reverse map: Linear ID: Task ID from existing mapping
- Identify tasks marked complete in Linear but not in tasks.md
- Query project issues via
-
Create Linear Issues
- For each task NOT already in mapping:
- Build title:
{TaskID}: {truncated description} - Build description with: Task ID, phase, parallel status, requirements, full description
- Add GitHub links for traceability (spec.md, plan.md, tasks.md URLs)
- Set priority from task (default: 2/High)
- Set initial state based on tasks.md checkbox
- Create via
mcp__plugin_linear_linear__create_issue:team: team IDproject: project IDlabels: [epic label name] (e.g.,["epic:10a"])title,description,priority,statelinks: GitHub doc URLs
- Store mapping: task ID: Linear ID, identifier, URL
- Build title:
- For each task NOT already in mapping:
-
Create Dependencies
- After all issues exist (Linear IDs required)
- Parse explicit dependencies: "Depends on T###" in descriptions
- For each task with dependencies:
- Collect Linear IDs of blocking tasks
- Update via
mcp__plugin_linear_linear__update_issue({id, blockedBy: [linearIds]})
- Verify at least one dependency via
get_issue({includeRelations: true})
-
Update tasks.md from Linear
- For tasks marked "Done" in Linear but
[ ]in tasks.md:- Update checkbox to
[x]in tasks.md
- Update checkbox to
- Write updated tasks.md
- For tasks marked "Done" in Linear but
-
Save Mapping & Sync
- Update
last_synctimestamp in mapping - Write mapping to
$FEATURE_DIR/.linear-mapping.json - If Beads available:
bd linear sync --pull
- Update
-
Report Summary
- Total tasks in tasks.md
- Issues created (with Linear identifiers and URLs)
- Tasks marked complete from Linear
- Dependencies created
- Next steps:
/speckit.implementto start work
Tool Patterns
Linear MCP tools:
| Tool | Purpose |
|---|---|
mcp__plugin_linear_linear__get_team({query: "floe"}) | Get team ID |
mcp__plugin_linear_linear__list_projects({team: teamId}) | Find project |
mcp__plugin_linear_linear__list_issue_statuses({team: teamId}) | Get status names |
mcp__plugin_linear_linear__list_issues({project: projectId}) | Get existing issues |
mcp__plugin_linear_linear__list_issue_labels({team: teamId}) | Check existing labels |
mcp__plugin_linear_linear__create_issue_label({name, teamId}) | Create epic label |
mcp__plugin_linear_linear__create_issue({..., labels: [...]}) | Create issue with labels |
mcp__plugin_linear_linear__update_issue({id, blockedBy}) | Set dependencies |
Mapping file format ($FEATURE_DIR/.linear-mapping.json):
{
"metadata": {
"feature": "001-plugin-registry",
"project": "floe-01-plugin-registry",
"project_id": "uuid",
"epic_label": "epic:01",
"created_at": "ISO timestamp",
"last_sync": "ISO timestamp"
},
"mappings": {
"T001": {
"linear_id": "uuid",
"linear_identifier": "FLO-33",
"title": "T001: Create plugin interfaces",
"url": "https://linear.app/...",
"status": "Todo"
}
}
}
Key Rules
-
Project must exist first - Create the Linear Project via Linear UI before running this command. Project naming:
floe-{NN}-{feature-slug}. -
Labels are mandatory - Every issue MUST have an epic label (e.g.,
epic:10a). This enables filtering withbd ready --label "epic:10a"when multiple epics are active. -
Never hardcode status names - Query
list_issue_statusesand match bytypefield. -
Dependencies after creation -
blockedByrequires Linear IDs, so all issues must exist first. -
GitHub links for traceability - Each issue gets links to spec.md, plan.md, tasks.md in the repo.
-
Bidirectional sync - Linear "Done" status propagates back to tasks.md checkboxes.
-
Filtering by epic - Use labels for epic filtering:
bd ready --label "epic:10a"shows only tasks from that epic.
Task Format
Tasks in tasks.md must follow this format:
- [ ] T001 [P] [US1] Description with file path
Components:
- [ ]or- [x]: Checkbox (required)T###: Task ID (required, sequential)[P]: Parallel marker (optional, means safe to run concurrently)[US#]: User story reference (optional)- Description: Should include file path
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Project not found | Project doesn't exist in Linear | Create project in Linear UI first |
| Duplicate task IDs | Same T### appears twice | Fix duplicates in tasks.md |
| Linear MCP unavailable | MCP not configured | Check API key configuration |
| Dependencies failed | Blocking task not in mapping | Ensure all tasks have issues first |
Handoff
After completing this skill:
- Start implementing: Run
/speckit.implementto execute tasks - Batch implement: Run
/speckit.implement-epicfor automatic continuation
References
- Linear Workflow Guide - Architecture, mapping format, detailed patterns
- speckit.tasks - Generate tasks.md
- speckit.implement - Execute tasks after Linear sync
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
1ヶ月以内に更新
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon
