| description | Convert existing tasks into actionable, dependency-ordered GitHub issues for the feature based on available design artifacts. | ||||
|---|---|---|---|---|---|
| tools |
|
||||
| scripts |
|
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Check for extension hooks (before tasks-to-issues conversion):
- Check if
.specify/extensions.ymlexists in the project root. - If it exists, read it and look for entries under the
hooks.before_taskstoissueskey - If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
- Filter out hooks where
enabledis explicitlyfalse. Treat hooks without anenabledfield as enabled by default. - For each remaining hook, do not attempt to interpret or evaluate hook
conditionexpressions:- If the hook has no
conditionfield, or it is null/empty, treat the hook as executable - If the hook defines a non-empty
condition, skip the hook and leave condition evaluation to the HookExecutor implementation
- If the hook has no
- For each executable hook, output the following based on its
optionalflag:- Optional hook (
optional: true):## Extension Hooks **Optional Pre-Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` - Mandatory hook (
optional: false):## Extension Hooks **Automatic Pre-Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command} Wait for the result of the hook command before proceeding to the Outline.
- Optional hook (
- If no hooks are registered or
.specify/extensions.ymldoes not exist, skip silently
- Run
{SCRIPT}from repo root and parse FEATURE_DIR and AVAILABLE_DOCS list. All paths must be absolute. For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'''m Groot' (or double-quote if possible: "I'm Groot"). - IF EXISTS: Load
/memory/constitution.mdfor project principles and governance constraints. - From the executed script, extract the path to tasks.
- Get the Git remote by running:
git config --get remote.origin.urlCaution
ONLY PROCEED TO NEXT STEPS IF THE REMOTE IS A GITHUB URL
- Fetch existing issues for deduplication: Before creating anything, use the GitHub MCP server's
list_issuestool to list the repository's issues with stateall, so both open and closed issues are covered. Build a set of task IDs that already have an issue by extracting the leading task ID (e.g.T001) from each issue title. This prevents duplicate issues when the command is re-run aftertasks.mdis regenerated or the skill is re-invoked. - For each task in the list, use the GitHub MCP server to create a new issue in the repository that is representative of the Git remote. Prefix the issue title with the task ID so it can be matched on later runs (for example,
T001: Create project structure).- Skip any task whose ID is already present in the set of existing issues from the previous step, and report it (for example,
T001 already has issue #42 — skipping). - Only create issues for tasks that do not yet have a matching issue.
- Skip any task whose ID is already present in the set of existing issues from the previous step, and report it (for example,
Caution
UNDER NO CIRCUMSTANCES EVER CREATE ISSUES IN REPOSITORIES THAT DO NOT MATCH THE REMOTE URL
Check for extension hooks (after tasks-to-issues conversion):
Check if .specify/extensions.yml exists in the project root.
- If it exists, read it and look for entries under the
hooks.after_taskstoissueskey - If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
- Filter out hooks where
enabledis explicitlyfalse. Treat hooks without anenabledfield as enabled by default. - For each remaining hook, do not attempt to interpret or evaluate hook
conditionexpressions:- If the hook has no
conditionfield, or it is null/empty, treat the hook as executable - If the hook defines a non-empty
condition, skip the hook and leave condition evaluation to the HookExecutor implementation
- If the hook has no
- For each executable hook, output the following based on its
optionalflag:- Optional hook (
optional: true):## Extension Hooks **Optional Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` - Mandatory hook (
optional: false):## Extension Hooks **Automatic Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command}
- Optional hook (
- If no hooks are registered or
.specify/extensions.ymldoes not exist, skip silently