Extension ID
tasks-to-project
Extension Name
Tasks to GitHub Project
Version
0.2.0
Description
Publish and synchronize Spec Kit tasks as cards on a GitHub Project (v2) kanban board, with priority and status sync between spec.md/tasks.md and the board.
Author
Alessandro Mancini (mancioshell)
Repository URL
https://github.com/mancioshell/spec-kit-tasks-to-project
Download URL
https://github.com/mancioshell/spec-kit-tasks-to-project/archive/refs/tags/v0.2.0.zip
License
MIT
Homepage (optional)
https://github.com/mancioshell/spec-kit-tasks-to-project
Documentation URL (optional)
https://github.com/mancioshell/spec-kit-tasks-to-project#readme
Changelog URL (optional)
No response
Required Spec Kit Version
=0.2.0
Required Tools (optional)
- gh CLI (>=2.0) - required, must be authenticated with the `project` scope
- python3 (>=3.8) - required (uses only PyYAML, already required by the bundled agent-context extension)
- git - required (origin remote must point to a GitHub repository)
Number of Commands
2
Number of Hooks (optional)
2
Tags
github, project, kanban, automation, tasks
Key Features
- One card per task parsed from the canonical Spec Kit checklist format
- [ ] T### [P?] [USx?] description.
- Two publication modes:
draft (Project v2 draft items) and issues (real GitHub issues linked to the project, with auto-created speckit:<usX>, speckit:phase:<slug> and speckit:<pN> labels).
- Priority field support: P1/P2/P3 priorities are parsed from user-story headings in
spec.md and applied to a configurable Project single-select field.
- Idempotent
sync command that creates missing cards, moves [x]-checked tasks to the "Done" column, re-applies priorities, and reports orphan cards without deleting them.
- Safety rails: refuses to publish when
origin is not a GitHub remote; only touches the project configured in tasks-to-project-config.yml.
- Optional hooks:
after_tasks -> publish, after_implement -> sync. Both opt-in.
- Filters:
only_stories: [...] to publish a single user-story slice (great for MVP-first delivery); skip_completed to ignore already-checked tasks.
- Ships with an offline test runner (
tests/run_offline_test.sh) covering parsing, label emission, priority resolution, only_stories filtering, dry-run publish and dry-run sync (21 assertions).
Testing Checklist
Submission Requirements
Testing Details
Tested on:
- Windows 11 with Git Bash, Python 3.14.5, gh CLI 2.x, Spec Kit 0.10.2
Test project:
mancioshell/board-game-organizer — a real monorepo where the extension is registered in .specify/extensions.yml under the after_tasks and after_implement hooks.
Automated test suite:
tests/run_offline_test.sh provisions a temporary git repository with a fake GitHub origin, a synthetic spec.md covering every supported priority-declaration style, and a tasks.md exercising completed ([x]), parallel ([P]), story-tagged ([USn]) and no-story tasks. It then runs publish --dry-run and sync --dry-run and asserts 21 expected outputs (parsing, label slugs, priority mapping, only_stories filter, skip_completed semantics in both publish and sync).
Result of the latest run: tasks-to-project: ALL CHECKS PASSED (21/21).
Manual test scenarios:
- Installed the extension via local dev (
specify extension add --dev).
- Ran
/speckit.tasks on a real feature; accepted the optional after_tasks hook → cards were created on the configured Project (v2) board in draft mode.
- Switched config to
mode: issues and reran publish → one GitHub issue per task was opened in the origin repo, labels speckit:us1, speckit:phase:setup, speckit:p1 were auto-created, and each issue was linked to the project.
- Marked some tasks as
[x] in tasks.md, ran /speckit.tasks-to-project.sync → the matching cards moved to the Done column; in-progress cards in other columns were left untouched.
- Changed a user story's priority from
P2 to P1 in spec.md, reran sync → priorities on the board were updated accordingly.
- Verified
--dry-run mode never makes any network call (script does not even invoke gh auth status when --dry-run is set).
Example Usage
### Install
specify extension add tasks-to-project \
--from https://github.com/mancioshell/spec-kit-tasks-to-project/archive/refs/tags/v0.2.0.zip
### Configure
Edit `.specify/extensions/tasks-to-project/tasks-to-project-config.yml`:
project:
owner: "" # auto-detected from origin if empty
number: 4 # the N in https://github.com/users/<owner>/projects/<N>
mode: "draft"
status_field: "Status"
default_status: "Todo"
done_status: "Done"
priority_field: "Priority"
add_labels: true
skip_completed: true
only_stories: []
Make sure `gh` is authenticated with the `project` scope:
gh auth login
gh auth refresh -s project
### Use it from the Spec Kit workflow
/speckit.specify "User can log in with email and password"
/speckit.plan
/speckit.tasks # generates specs/<feature>/tasks.md
/speckit.tasks-to-project.publish # offered as an optional after_tasks hook
# -> one card per task on the GitHub Project board
/speckit.implement # marks tasks [x] as they get done
/speckit.tasks-to-project.sync # offered as an optional after_implement hook
# -> moves [x] tasks to the Done column,
# re-applies priorities, creates missing cards
### Manual invocation (always safe with --dry-run)
.specify/extensions/tasks-to-project/scripts/bash/publish-tasks-to-project.sh --dry-run
.specify/extensions/tasks-to-project/scripts/bash/sync-tasks-to-project.sh --dry-run
Proposed Catalog Entry
{
"tasks-to-project": {
"name": "Tasks to GitHub Project",
"id": "tasks-to-project",
"description": "Publish and synchronize Spec Kit tasks as cards on a GitHub Project (v2) kanban board, with priority and status sync between spec.md/tasks.md and the board.",
"author": "Alessandro Mancini",
"version": "0.2.0",
"download_url": "https://github.com/mancioshell/spec-kit-tasks-to-project/archive/refs/tags/v0.2.0.zip",
"repository": "https://github.com/mancioshell/spec-kit-tasks-to-project",
"homepage": "https://github.com/mancioshell/spec-kit-tasks-to-project",
"documentation": "https://github.com/mancioshell/spec-kit-tasks-to-project/blob/main/README.md",
"changelog": "https://github.com/mancioshell/spec-kit-tasks-to-project/blob/main/CHANGELOG.md",
"license": "MIT",
"category": "integration",
"effect": "read-write",
"requires": {
"speckit_version": ">=0.2.0"
},
"provides": {
"commands": 2,
"hooks": 2
},
"tags": [
"github",
"project",
"kanban",
"automation",
"tasks"
],
"verified": false,
"downloads": 0,
"stars": 0,
"created_at": "2026-06-21T00:00:00Z",
"updated_at": "2026-06-21T00:00:00Z"
}
}
Additional Context
- Source repo: https://github.com/mancioshell/spec-kit-tasks-to-project
- The extension is non-destructive by design: it never deletes issues or cards. Orphan cards (no longer in
tasks.md) are listed in the summary so the user can decide manually.
- Subprocess calls to
gh and git always use argument-list form (no shell interpolation), .. and absolute paths in user-provided file names are rejected, no secrets are logged.
- Only Python dependency at runtime is PyYAML, which is the same dependency required by the bundled
agent-context extension.
Extension ID
tasks-to-project
Extension Name
Tasks to GitHub Project
Version
0.2.0
Description
Publish and synchronize Spec Kit tasks as cards on a GitHub Project (v2) kanban board, with priority and status sync between spec.md/tasks.md and the board.
Author
Alessandro Mancini (mancioshell)
Repository URL
https://github.com/mancioshell/spec-kit-tasks-to-project
Download URL
https://github.com/mancioshell/spec-kit-tasks-to-project/archive/refs/tags/v0.2.0.zip
License
MIT
Homepage (optional)
https://github.com/mancioshell/spec-kit-tasks-to-project
Documentation URL (optional)
https://github.com/mancioshell/spec-kit-tasks-to-project#readme
Changelog URL (optional)
No response
Required Spec Kit Version
Required Tools (optional)
Number of Commands
2
Number of Hooks (optional)
2
Tags
github, project, kanban, automation, tasks
Key Features
- [ ] T### [P?] [USx?] description.draft(Project v2 draft items) andissues(real GitHub issues linked to the project, with auto-createdspeckit:<usX>,speckit:phase:<slug>andspeckit:<pN>labels).spec.mdand applied to a configurable Project single-select field.synccommand that creates missing cards, moves[x]-checked tasks to the "Done" column, re-applies priorities, and reports orphan cards without deleting them.originis not a GitHub remote; only touches the project configured intasks-to-project-config.yml.after_tasks-> publish,after_implement-> sync. Both opt-in.only_stories: [...]to publish a single user-story slice (great for MVP-first delivery);skip_completedto ignore already-checked tasks.tests/run_offline_test.sh) covering parsing, label emission, priority resolution,only_storiesfiltering, dry-run publish and dry-run sync (21 assertions).Testing Checklist
Submission Requirements
extension.ymlmanifest includedTesting Details
Tested on:
Test project:
mancioshell/board-game-organizer — a real monorepo where the extension is registered in
.specify/extensions.ymlunder theafter_tasksandafter_implementhooks.Automated test suite:
tests/run_offline_test.shprovisions a temporary git repository with a fake GitHuborigin, a syntheticspec.mdcovering every supported priority-declaration style, and atasks.mdexercising completed ([x]), parallel ([P]), story-tagged ([USn]) and no-story tasks. It then runspublish --dry-runandsync --dry-runand asserts 21 expected outputs (parsing, label slugs, priority mapping,only_storiesfilter,skip_completedsemantics in both publish and sync).Result of the latest run:
tasks-to-project: ALL CHECKS PASSED(21/21).Manual test scenarios:
specify extension add --dev)./speckit.taskson a real feature; accepted the optionalafter_taskshook → cards were created on the configured Project (v2) board in draft mode.mode: issuesand reran publish → one GitHub issue per task was opened in theoriginrepo, labelsspeckit:us1,speckit:phase:setup,speckit:p1were auto-created, and each issue was linked to the project.[x]intasks.md, ran/speckit.tasks-to-project.sync→ the matching cards moved to theDonecolumn; in-progress cards in other columns were left untouched.P2toP1inspec.md, reran sync → priorities on the board were updated accordingly.--dry-runmode never makes any network call (script does not even invokegh auth statuswhen--dry-runis set).Example Usage
Proposed Catalog Entry
{ "tasks-to-project": { "name": "Tasks to GitHub Project", "id": "tasks-to-project", "description": "Publish and synchronize Spec Kit tasks as cards on a GitHub Project (v2) kanban board, with priority and status sync between spec.md/tasks.md and the board.", "author": "Alessandro Mancini", "version": "0.2.0", "download_url": "https://github.com/mancioshell/spec-kit-tasks-to-project/archive/refs/tags/v0.2.0.zip", "repository": "https://github.com/mancioshell/spec-kit-tasks-to-project", "homepage": "https://github.com/mancioshell/spec-kit-tasks-to-project", "documentation": "https://github.com/mancioshell/spec-kit-tasks-to-project/blob/main/README.md", "changelog": "https://github.com/mancioshell/spec-kit-tasks-to-project/blob/main/CHANGELOG.md", "license": "MIT", "category": "integration", "effect": "read-write", "requires": { "speckit_version": ">=0.2.0" }, "provides": { "commands": 2, "hooks": 2 }, "tags": [ "github", "project", "kanban", "automation", "tasks" ], "verified": false, "downloads": 0, "stars": 0, "created_at": "2026-06-21T00:00:00Z", "updated_at": "2026-06-21T00:00:00Z" } }Additional Context
tasks.md) are listed in the summary so the user can decide manually.ghandgitalways use argument-list form (no shell interpolation),..and absolute paths in user-provided file names are rejected, no secrets are logged.agent-contextextension.