Manage task documentation by syncing between local task directories and GitHub issues
Syncs local task files (SPEC, PLAN, TEST_PLAN, COMMIT_MESSAGE) with GitHub issues. Use when you need to push documentation updates to GitHub or pull the latest version from issues.
/plugin marketplace add edspencer/claude-agents/plugin install product-team@edspencer-agentsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
create-issue.shlib-repo-detect.shlog-entry.shpull-file.shpull.shpush-file.shpush.shread-issue-file.shSeamlessly manage task documentation by syncing between local task directories and GitHub issues. All task documentation (SPEC, PLAN, TEST_PLAN, COMMIT_MESSAGE) lives both locally and on GitHub, with easy push/pull synchronization.
This skill provides a complete workflow for managing tasks:
create-issue.shpush.sh or push-file.shpull.sh or pull-file.shread-issue-file.shlog-entry.sh (creates AI Work Log comment with timestamped entries)# Create a new GitHub issue and task directory
./create-issue.sh "Add dark mode toggle" "Implement dark/light theme switcher"
# Work on files locally (SPEC.md, PLAN.md, etc.)
# Push all files to GitHub
./push.sh 188 ./tasks/188-add-dark-mode-toggle
# Or pull the latest from GitHub (automatically creates task directory from issue title)
./pull.sh 188
There are 7 scripts in this skill:
Create a new GitHub issue and initialize a task directory. Can also convert existing task directories to GitHub issues. Automatically applies GitHub labels based on issue context.
Usage:
./create-issue.sh <title> [description] [existing-task-dir] [labels]
Arguments:
title - GitHub issue titledescription - Issue description (optional)existing-task-dir - Path to existing task directory to convert (optional)labels - Comma-separated labels to apply (optional, e.g., "UI,bug" or "CLI,feature")Available labels:
UI - User interface related issuesCLI - Command-line interface related issuesbug - Bug fixes and issue resolutionsfeature - New features and enhancementsExamples:
# Create new issue with title only
./create-issue.sh "Add dark mode toggle"
# Create new issue with title, description, and labels
./create-issue.sh "Add dark mode toggle" "Implement dark/light theme switcher in settings" "" "UI,feature"
# Convert existing task directory to GitHub issue with labels
./create-issue.sh "Fix login button styling" "" ./tasks/login-styling "UI,bug"
# Create issue with description and labels (no existing task dir)
./create-issue.sh "Add date filter to extract" "Filter commits by date range" "" "CLI,feature"
What it does:
{issue-number}-{title-slug}/Output:
Creating GitHub issue...
Applying labels: UI,feature
✓ GitHub issue created: https://github.com/<github-user>/<repo-name>/issues/189
✓ Created task directory: tasks/189-add-dark-mode-toggle
✅ Task setup complete!
Issue: https://github.com/<github-user>/<repo-name>/issues/189
Task Directory: tasks/189-add-dark-mode-toggle
Task Number: 189
Push all task documentation files (SPEC.md, PLAN.md, TEST_PLAN.md, COMMIT_MESSAGE.md) to a GitHub issue as collapsible comments.
Usage:
./push.sh <issue-url-or-number> [task-directory]
Arguments:
issue-url-or-number - Full GitHub URL or just the issue numbertask-directory - Directory containing task files (optional, defaults to current directory)Examples:
# Using issue number
./push.sh 188 ./tasks/188-account-deletion
# Using full URL
./push.sh https://github.com/<github-user>/<repo-name>/issues/188 ./tasks/188-account-deletion
# Using current directory
./push.sh 188
What it does:
<details> section that starts collapsedOutput:
📤 Syncing task files to GitHub issue #188 in <github-user>/<repo-name>
Processing SPEC.md...
+ Creating new comment...
✓ Created
Processing PLAN.md...
↻ Updating existing comment (ID: 123456789)...
✓ Updated
...
✅ Sync complete!
View the issue: https://github.com/<github-user>/<repo-name>/issues/188
Update a single task file comment on a GitHub issue with a status summary and file content.
Usage:
./push-file.sh <issue-url-or-number> <file-type> <status-file> <content-file>
Arguments:
issue-url-or-number - GitHub issue URL or issue numberfile-type - One of: SPEC, PLAN, TEST_PLAN, COMMIT_MESSAGEstatus-file - File containing status summary (2 paragraphs + optional bullets)content-file - File containing the full file contentExamples:
# Update SPEC with status and content
./push-file.sh 188 SPEC SPEC-STATUS.md SPEC.md
# Update PLAN after review
./push-file.sh 188 PLAN plan-status.txt PLAN.md
Status File Format: The status file should contain a 2-paragraph summary describing the document state:
**Status:** [Draft | Complete | Review Needed | etc.]
This is the first paragraph explaining the current state of the document.
It should describe what has been completed, what's pending, or any key status information.
This is the second paragraph providing additional context or details about the document state.
- Key point 1 (optional)
- Key point 2 (optional)
What it does:
Output:
↻ Updating SPEC comment on issue #188 (ID: 123456789)...
✓ Updated successfully
View the issue: https://github.com/<github-user>/<repo-name>/issues/188
Pull all task documentation files from a GitHub issue to a local task directory. Automatically determines the task directory name from the issue title.
Usage:
./pull.sh <issue-url-or-number>
Arguments:
issue-url-or-number - GitHub issue URL or issue numberExamples:
# Pull using issue number
./pull.sh 188
# Pull using full URL
./pull.sh https://github.com/<github-user>/<repo-name>/issues/188
What it does:
tasks/{issue-number}-{title-slug}/Output:
📥 Fetching issue #188 from <github-user>/<repo-name>...
📥 Pulling task files from GitHub issue #188: "Account deletion and data export"
📁 Task directory: tasks/188-account-deletion-and-data-export
Pulling SPEC.md...
✓ Pulled to SPEC.md
Pulling PLAN.md...
✓ Pulled to PLAN.md
...
✅ Pull complete!
Task directory: tasks/188-account-deletion-and-data-export
Pull a single task file from a GitHub issue to a local file.
Usage:
./pull-file.sh <issue-url-or-number> <file-type> [output-file]
Arguments:
issue-url-or-number - GitHub issue URL or issue numberfile-type - One of: SPEC, PLAN, TEST_PLAN, COMMIT_MESSAGEoutput-file - File to write to (default: {file-type}.md in current directory)Examples:
# Pull SPEC to SPEC.md
./pull-file.sh 188 SPEC
# Pull PLAN to specific file
./pull-file.sh 188 PLAN ./my-plan.md
# Pull and pipe to stdout
./pull-file.sh 188 SPEC | head -20
Output: Pure file content (great for piping or redirecting)
Read a task file from a GitHub issue and output to stdout. Useful for debugging, piping, or quick content inspection.
Usage:
./read-issue-file.sh <issue-url-or-number> <file-type>
Arguments:
issue-url-or-number - GitHub issue URL or issue numberfile-type - One of: SPEC, PLAN, TEST_PLAN, COMMIT_MESSAGEExamples:
# Read SPEC to stdout
./read-issue-file.sh 188 SPEC
# Pipe to file
./read-issue-file.sh 188 PLAN > my-plan.md
# View first 20 lines
./read-issue-file.sh 188 SPEC | head -20
Output: Pure file content sent to stdout
Add timestamped entries to a task's AI Work Log on a GitHub issue. Creates or updates a running log of work progress throughout the task lifecycle.
Usage:
./log-entry.sh <issue-url-or-number> <entry-text>
Arguments:
issue-url-or-number - GitHub issue URL or issue numberentry-text - Description of work being done (e.g., "Started writing spec")Examples:
# Log that spec writing started
./log-entry.sh 188 "Started writing spec"
# Log that plan writing finished
./log-entry.sh 188 "Finished writing plan"
# Use full URL
./log-entry.sh https://github.com/<github-user>/<repo-name>/issues/190 "Started implementation"
What it does:
- YYYY-MM-DD HH:MM:SS: entry-text)Output:
↻ Adding entry to work log on issue #188...
✓ Entry added
View the issue: https://github.com/<github-user>/<repo-name>/issues/188
When using create-issue.sh, directories are automatically named with the issue number:
tasks/
├── 188-account-deletion/
│ ├── SPEC.md (Specification)
│ ├── PLAN.md (Implementation plan)
│ ├── TEST_PLAN.md (Test scenarios)
│ └── COMMIT_MESSAGE.md (Git commit message)
├── 189-add-dark-mode/
│ └── [similar structure]
└── archive/
└── [completed tasks]
Naming Convention: {issue-number}-{task-name-slug}
The issue number in the directory name provides direct reference to the GitHub issue.
# 1. Create GitHub issue and task directory
./create-issue.sh "Add authentication" "Implement magic link authentication"
# 2. Log that work is starting
./log-entry.sh 190 "Started writing spec"
# 3. Work on files locally
# - Create SPEC.md
# - Create PLAN.md
# - Create TEST_PLAN.md
# - Create COMMIT_MESSAGE.md
# 4. Push files to GitHub
./push.sh 190 ./tasks/190-add-authentication
# 5. Log work progress
./log-entry.sh 190 "Finished writing spec"
./log-entry.sh 190 "Started writing plan"
# 6. Continue development...
# When you update files, push again
./push.sh 190 ./tasks/190-add-authentication
./log-entry.sh 190 "Finished writing plan"
./log-entry.sh 190 "Started implementation"
If you have an existing task directory without a GitHub issue:
# 1. Create GitHub issue from existing directory
./create-issue.sh "My feature" "Description" ./tasks/my-feature
# 2. Files are automatically synced to GitHub
# Task directory renamed to: tasks/191-my-feature
Push workflow (local → GitHub):
# Log that you're starting work
./log-entry.sh 188 "Started writing code"
# Update single file on GitHub with status
./push-file.sh 188 SPEC SPEC-STATUS.md SPEC.md
# Update all files on GitHub
./push.sh 188 ./tasks/188-account-deletion
# Log when work is complete
./log-entry.sh 188 "Finished writing code"
Pull workflow (GitHub → local):
# Pull all files from GitHub
./pull.sh 188 ./tasks/188-account-deletion
# Pull single file from GitHub
./pull-file.sh 188 PLAN
# Log that you pulled latest
./log-entry.sh 188 "Pulled latest files from GitHub"
When finishing a task (via /finish command):
push.sh one final time to sync latest versionstasks/ to tasks/archive/.gitignore)gh CLI installed and authenticatedWith /write-spec:
push-file.sh to sync status + content to GitHubWith /write-plan:
push-file.sh to sync to GitHubWith /finish:
push.sh to sync all files to GitHub as final stepThe scripts automatically detect the GitHub repository from your current git remote (origin). No configuration needed!
Repository Detection:
Auto-detect (recommended): Scripts automatically extract owner/repo from git remote get-url origin
https://github.com/owner/repo.gitgit@github.com:owner/repo.gitEnvironment variables (optional override):
export GITHUB_OWNER="myorg"
export GITHUB_REPO="myrepo"
Full URLs (always works):
# Use full URL instead of issue number to override auto-detection
./push.sh "https://github.com/otherorg/otherrepo/issues/42" ./tasks/42-myfeature
Error Handling: If you run scripts outside a git repository or without a GitHub remote, you'll see a helpful error:
Error: Not in a git repository
Please run this command from within a git repository, or set GITHUB_OWNER and GITHUB_REPO environment variables
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.