Skip to content
Development
Command

/plan-to-issues

Batch-convert plan mode output into GitHub issues (--quick for fast mode)

From plugin
autonomous-dev
3226 skills16 agents26 commands1 MCP
Install
$ npx -y skills add akaszubski/autonomous-dev --agent claude-code

How it fires

How this command gets triggered: by you, by Claude, or both.

  • Fires itselfClaude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/plan-to-issues

Context preview

What this command does when you run it.

Batch-convert plan mode output into GitHub issues (--quick for fast mode)

Command definition

plan-to-issues.md
name: plan-to-issues
description: "Batch-convert plan mode output into GitHub issues (--quick for fast mode)"
argument-hint: "[--quick] (e.g., '/plan-to-issues' or '/plan-to-issues --quick')"
allowed-tools: [Agent, Read, Bash, Grep, Glob]
disable-model-invocation: false
user-invocable: true
user_facing: true

Batch-Convert Plan into GitHub Issues

Convert plan mode output (or any discussed plan) into individual, trackable GitHub issues.

> **Note**: `/plan` automatically runs issue creation in quick mode after plan-critic PROCEED. Use `/plan-to-issues` directly for thorough mode (full section templates) or if auto-creation was skipped (`--no-issues`).

Modes

| Mode | Time | Description | |------|------|-------------| | **Default (thorough)** | 10-15 min | Full issue bodies with all sections | | **--quick** | 5-8 min | Summary, Implementation, Acceptance Criteria only |

Implementation

**CRITICAL**: Follow these steps in order. Each checkpoint validates before proceeding.

ARGUMENTS: {{ARGUMENTS}}

---

STEP 0: Parse Arguments

Parse the `{{ARGUMENTS}}` placeholder for flags:

--quick       Fast mode (fewer sections per issue, no prompts)

If `--quick` is present, set quick_mode=true. Everything else is ignored (plan comes from context).

---

STEP 0.5: Detect Plan Files

Detect whether `.claude/plans/` directory exists and contains plan files:

ls -la .claude/plans/*.md 2>/dev/null

If plan files are found, offer them as the input source instead of conversation context:

Found plan files in .claude/plans/:
  - feature-name.md (created 2h ago)
  - other-feature.md (created 1d ago)

Use plan file as input? (recommended if you just ran /plan)
1. Use latest plan file
2. Use conversation context (default)

If the user selects a plan file, read its contents and use that as the plan source for Step 1.

---

STEP 1: Extract Plan Items

The plan is in the **current conversation context** (or from a `.claude/plans/` file selected in Step 0.5). Extract individual work items by scanning for structural markers:

**Patterns to match** (in order of specificity): 1. Numbered lists: `1. Item description`, `2. Another item` 2. Bold bullet items: `- **Phase 1: Name** -- description` 3. Section headers: `## Phase 1: Name` 4. Task items: `- [ ] Task description`, `- [x] Done task` 5. Unicode markers: `task description` 6. Phase/step labels: `Phase N:`, `Step N:`

**Each extracted item needs**:

  • A short title (suitable for GitHub issue title, prefixed with `feat:`, `fix:`, `refactor:`, etc.)
  • A description (the content/details associated with that item)

**Plan mode exit marker**: Detect `.claude/plan_mode_exit.json`. If it exists, note it as confirmation that plan mode was used. Read any `plan_content` field from the marker to supplement extraction.

**If no items can be extracted**: Prompt the user to describe the plan items explicitly. Do NOT proceed without items.

---

CHECKPOINT: Validate Extraction

Verify:

  • At least 1 item was extracted
  • Cap at 20 issues maximum (if more than 20, warn the user and ask them to prioritize)
  • Display the extracted items in a numbered list:
Extracted N plan items:

  1. feat: Project model system -- Core data model for projects
  2. feat: Recipe YAML configs -- Configuration file format
  3. refactor: CLI argument parser -- Modernize argument handling
  ...

Are these correct? Reply 'yes' to proceed, or describe corrections.

**REQUIRE** explicit user confirmation before proceeding. Do NOT auto-proceed.

---

STEP 2: Generate Issue Bodies

For each extracted item, invoke the **issue-creator** agent (subagent_type="issue-creator") with:

  • The item title and description
  • Mode flag (quick or default)

**In --quick mode**: Tell the agent to include ONLY: 1. Summary (1-2 sentences) 2. Implementation Approach 3. Acceptance Criteria

**In default mode**: Tell the agent to include the full template (Summary, What Does NOT Work, Scenarios, Implementation Approach, Test Scenarios, Acceptance Criteria).

**CRITICAL**: Run issue-creator calls SEQUENTIALLY (one at a time), not in parallel. Parallel calls would explode context size.

Collect the generated title and body for each item.

---

STEP 3: Preview Table

Display a dry-run table showing all issues that will be created:

Issues to create (N total):

  # | Title                              | Sections
  --|------------------------------------|---------
  1 | feat: Project model system          | 6
  2 | feat: Recipe YAML configs           | 6
  3 | refactor: CLI argument parser       | 3
  ...

Create these N issues? Reply 'yes' to proceed, 'no' to cancel.

**REQUIRE** explicit user confirmation. Do NOT proceed without it.

---

STEP 4: Create Issues

For each confirmed item, use the Bash tool:

1. Write the issue body to a temp file (include `**Plugin Version**: $(python3 -c "import sys,os;next((sys.path.insert(0,p) for p in ('.claude/lib','plugins/autonomous-dev/lib',os.path.expanduser('~/.claude/lib')) if os.path.isdir(p)),None);from version_reader import get_plugin_version;print(get_plugin_version())" 2>/dev/null || echo unknown)` at the end of the body):

   cat > /tmp/plan_issue_N.md << 'ISSUE_EOF'
   <issue body content>
   ISSUE_EOF

2. Sanitize the title:

  • Strip backticks, semicolons, pipes, dollar signs
  • Limit to 256 characters
  • Escape double quotes

3. Before the first issue, create the command context file to allow gh issue create (Issue #599). **MUST be its OWN STANDALONE Bash tool call**, run BEFORE any `gh issue create` invocation:

   python3 -c "
   import json; from datetime import datetime, timezone
   with open('/tmp/autonomous_dev_cmd_context.json', 'w') as f:
       json.dump({'command': 'plan-to-issues', 'timestamp': datetime.now(timezone.utc).isoformat()}, f)
   "

**Prior-call ordering contract (Issue #1203)**: the PreToolUse hook evaluates each Bash inv

Read more
Ships withautonomous-dev

A harness that wraps Claude Code with enforcement, specialist agents, and alignment gates to deliver consistent, production-grade software engineering outcomes.

Get the whole plugin, auto-invoked
Stats
32
Stars
0
Views
5
Forks
Active
Maintenance
Python
Language
2h ago
Last commit
9mo ago
Created

Repo: akaszubski/autonomous-dev