Skip to content

[Extension]: Add Tasks to GitHub Project #3082

Description

@mancioshell

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

  • Extension installs successfully via download URL
  • All commands execute without errors
  • Documentation is complete and accurate
  • No security vulnerabilities identified
  • Tested on at least one real project

Submission Requirements

  • Valid extension.yml manifest included
  • README.md with installation and usage instructions
  • LICENSE file included
  • GitHub release created with version tag
  • All command files exist and are properly formatted
  • Extension ID follows naming conventions (lowercase-with-hyphens)

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:

  1. Installed the extension via local dev (specify extension add --dev).
  2. 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.
  3. 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.
  4. 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.
  5. Changed a user story's priority from P2 to P1 in spec.md, reran sync → priorities on the board were updated accordingly.
  6. 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.

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions