Skip to content

Commit fa4b81d

Browse files
rohanzclaude
andauthored
Deprecate the core taskstoissues command (#4879)
* feat(commands): deprecate the core taskstoissues command The bundled `github` extension has shipped `speckit.github.taskstoissues` since 1.0.13, and the documented one-release transition window has elapsed. Mark the core `/speckit.taskstoissues` command deprecated: the template now prefixes its description with "Deprecated:" and adds a Deprecation Notice, placed before User Input and Pre-Execution Checks, that tells the agent to display a concise migration warning first and then continue the existing workflow unchanged. The warning points to `specify extension add github` and the replacement command using the portable command-reference tokens so each integration renders its own invocation syntax. The command does not install or enable the extension, stop, or run the replacement automatically. Prefix the `SKILL_DESCRIPTIONS` fallback for taskstoissues with "Deprecated:" so skills-mode descriptions match the template. Update the installation, SDD reference, extensions, integrations, and github extension README documentation to describe the current migration stage: the core command warns on invocation, remains available during migration, and will be removed in a future minor release. Add tests covering the notice text, its ordering, continuation, frontmatter metadata, and rendered warnings for dot- and hyphen-style integrations, and adapt the core/extension parity test to allow only the intentional deprecation differences. The new tests fail on main and pass with this change. Closes #4422 Assisted-by: Codex CLI (model: GPT-6.1 Sol, autonomous) Assisted-by: Claude Code (model: Claude Fable 5.1, autonomous) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * docs(commands): tighten the taskstoissues deprecation wording and tests Follow-up to the core `/speckit.taskstoissues` deprecation, addressing three review nits: - docs/installation.md described the move to the bundled `github` extension as still in progress ("moving to"); every other document treats it as completed. Say the core command is replaced by the extension's `/speckit.github.taskstoissues`. - The Deprecation Notice told the agent to warn "before doing anything else, including considering user input", which sat awkwardly next to the shared User Input section's own MUST. State the ordering directly: display the warning first, before the User Input and Pre-Execution Checks sections. The warning text and the warn-and-continue contract are unchanged. - The rendered-warning test asserted that `integration.setup()` had not installed the extension, which that code path can never do. Replace the vacuous assertion with checks that the rendered notice still carries the continuation contract after placeholder substitution, and update the notice phrase the text-contract test looks for. Assisted-by: Codex CLI (model: GPT-6.1 Sol, autonomous) Assisted-by: Claude Code (model: Claude Fable 5.1, autonomous) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix: bump github extension to 1.0.2 for update delivery Keep the bundled catalog and manifest aligned so installed extensions receive the changes and the version guard passes. Assisted-by: Codex (model: GPT-6.1 Sol, autonomous) * docs: clarify taskstoissues invocation and author migration List agent-specific command prefixes and explain migration of preset overrides, command references, dependency declarations, and unchanged hook keys. Assisted-by: Codex (model: GPT-6.1 Sol, autonomous) * docs: explain refreshing installed core commands during migration Assisted-by: Codex (model: GPT-6.1 Sol, autonomous) --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 458d678 commit fa4b81d

11 files changed

Lines changed: 207 additions & 31 deletions

File tree

‎docs/installation.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,15 @@ After initialization, you should see the following commands available in your co
147147
- `/speckit.checklist` - Generate quality checklists
148148
- `/speckit.constitution` - Create or update project principles
149149
- `/speckit.converge` - Assess codebase against artifacts and append remaining tasks
150-
- `/speckit.taskstoissues` - Convert tasks to issues (moving to the bundled `github` extension as
150+
- `/speckit.taskstoissues` - Convert tasks to issues (deprecated; warns on invocation; replaced by the bundled `github` extension's
151151
`/speckit.github.taskstoissues`; install it with `specify extension add github`)
152152

153153
The `generic` integration also registers extension commands in its configured
154154
`--commands-dir`. Installing `github` makes `/speckit.github.taskstoissues`
155155
available there as a command file, or as `/speckit-github-taskstoissues` when
156156
`--skills` is enabled. The core `/speckit.taskstoissues` (or
157-
`/speckit-taskstoissues` with `--skills`) remains available.
157+
`/speckit-taskstoissues` with `--skills`) remains available during migration, warns on invocation,
158+
and will be removed in a future minor release.
158159
See the [GitHub extension's installation notes](https://github.com/github/spec-kit/blob/main/extensions/github/README.md#installation).
159160

160161
Scripts are installed into a variant subdirectory matching the chosen script type:

‎docs/reference/agentic-sdd.md‎

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ skills by default.
3030
| `/speckit.tasks` | `speckit-tasks` | Break the plan into actionable tasks |
3131
| `/speckit.implement` | `speckit-implement` | Execute the tasks |
3232
| `/speckit.converge` | `speckit-converge` | Assess implementation against the artifacts and append remaining work |
33-
| `/speckit.taskstoissues` | `speckit-taskstoissues` | Optionally convert tasks into GitHub issues |
33+
| `/speckit.taskstoissues` | `speckit-taskstoissues` | **Deprecated core command**; use the `github` extension for GitHub issues |
3434
| `/speckit.clarify` | `speckit-clarify` | Resolve ambiguity before planning (optional quality gate; formerly `/quizme`) |
3535
| `/speckit.analyze` | `speckit-analyze` | Check artifact consistency after tasks and before implementation (optional quality gate) |
3636
| `/speckit.checklist` | `speckit-checklist` | Generate requirements-quality checklists (optional quality gate) |
@@ -158,13 +158,24 @@ It first prints a severity-graded findings summary, then resolves to one of two
158158
- **Converged** — no gaps found. `tasks.md` is left byte-for-byte unchanged and you'll see a clean result like `✅ Converged — the implementation satisfies the spec, plan, and tasks.` You're done; proceed to review or open a PR.
159159
- **Tasks appended** — gaps found. Converge appends them as new tasks under a Convergence section in `tasks.md` and tells you how many. Run `/speckit.implement` again to complete them, then `/speckit.converge` once more. Each pass finds fewer items; repeat until it reports converged.
160160

161-
## `/speckit.taskstoissues`
161+
## `/speckit.taskstoissues` (deprecated core command)
162162

163-
Optionally converts an existing `tasks.md` into actionable GitHub issues. Run it
164-
after generating tasks when you want to track execution in GitHub:
163+
The core command is deprecated and will be removed in a future minor release.
164+
It warns when invoked, then continues its existing workflow without installing
165+
or enabling the extension automatically.
166+
167+
The recommended extension command optionally converts an existing `tasks.md`
168+
into actionable GitHub issues. Install the extension from your project root:
169+
170+
```bash
171+
specify extension add github
172+
```
173+
174+
Then invoke it in your agent after generating tasks when you want to track
175+
execution in GitHub:
165176

166177
```text
167-
/speckit.taskstoissues
178+
/speckit.github.taskstoissues
168179
```
169180

170181
This command requires a GitHub `origin` remote and access to the GitHub MCP tools
@@ -173,4 +184,4 @@ identified by that remote and checks existing task IDs to avoid duplicates.
173184
It is not required to implement tasks or converge on a feature.
174185

175186
> [!NOTE]
176-
> GitHub issue tracking is moving out of core into the bundled, opt-in [`github` extension](https://github.com/github/spec-kit/blob/main/extensions/github/README.md). `/speckit.taskstoissues` still works and is unchanged. Install its namespaced replacement with `specify extension add github`; the `generic` integration registers it under its configured command directory in commands or skills mode. See the [installation and migration notes](https://github.com/github/spec-kit/blob/main/extensions/github/README.md#installation).
187+
> GitHub issue tracking uses the bundled, opt-in [`github` extension](https://github.com/github/spec-kit/blob/main/extensions/github/README.md). Its recommended command is `/speckit.github.taskstoissues` (slash-hyphen integrations: `/speckit-github-taskstoissues`; Codex, ZCode, and Command Code skills: `$speckit-github-taskstoissues`; Kimi: `/skill:speckit-github-taskstoissues`); the deprecated core `/speckit.taskstoissues` remains available during migration. The `generic` integration registers the extension under its configured command directory in commands or skills mode. See the [installation and migration notes](https://github.com/github/spec-kit/blob/main/extensions/github/README.md#installation) for all integration-specific invocation syntaxes.

‎docs/reference/extensions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ specify extension add <name>
3030
| `--force` | Overwrite if the extension is already installed |
3131
| `--priority <N>`| Resolution priority (default: 10; lower = higher precedence) |
3232

33-
Installs an extension from the catalog, a URL, or a local directory. Extension commands are registered with the active AI coding agent integration. For `generic`, invocations use the configured `--commands-dir`: flat command files by default, or `speckit-<name>/SKILL.md` with `--skills`. The core `speckit.taskstoissues` command remains available alongside the GitHub extension's namespaced replacement during migration.
33+
Installs an extension from the catalog, a URL, or a local directory. Extension commands are registered with the active AI coding agent integration. For `generic`, invocations use the configured `--commands-dir`: flat command files by default, or `speckit-<name>/SKILL.md` with `--skills`. The deprecated core `speckit.taskstoissues` command remains available during migration and will be removed in a future minor release. It warns on invocation and continues its existing workflow without installing or enabling the extension automatically. For GitHub issue tracking, run `specify extension add github` and use the recommended `/speckit.github.taskstoissues` command (slash-hyphen integrations: `/speckit-github-taskstoissues`; Codex, ZCode, and Command Code skills: `$speckit-github-taskstoissues`; Kimi: `/skill:speckit-github-taskstoissues`).
3434

3535
If a generic integration refresh cannot produce every extension invocation (for example, because a command or skill is user-modified or its source is missing), it warns and restores that extension's prior registered artifacts. Other extensions can still refresh.
3636

‎docs/reference/integrations.md‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,14 @@ Once `generic` is the active integration, `specify extension add` registers
336336
extension commands in its configured `--commands-dir` (as command files or
337337
skills according to `--skills`). `specify extension remove` removes unchanged
338338
extension-owned artifacts while leaving core commands, user files, and edited
339-
extension files intact. The core `speckit.taskstoissues` command remains
340-
available; installing the GitHub extension adds the namespaced replacement
341-
without deprecating or removing the core command.
339+
extension files intact. The deprecated core `speckit.taskstoissues` command
340+
remains available, warns on invocation, and will be removed in a future minor
341+
release. To migrate, run `specify extension add github` and use the recommended
342+
`/speckit.github.taskstoissues` command for dot-command integrations. Slash-hyphen
343+
integrations use `/speckit-github-taskstoissues`; Codex, ZCode, and Command Code
344+
skills use `$speckit-github-taskstoissues`; Kimi uses
345+
`/skill:speckit-github-taskstoissues`. The core command continues its existing
346+
workflow and does not install or enable the extension automatically.
342347

343348
## Scaffold a New Integration
344349

‎extensions/catalog.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
"github": {
6767
"name": "GitHub Integration",
6868
"id": "github",
69-
"version": "1.0.1",
69+
"version": "1.0.2",
7070
"description": "GitHub platform integration for Spec Kit - create GitHub issues from a feature's task list",
7171
"author": "spec-kit-core",
7272
"repository": "https://github.com/github/spec-kit",

‎extensions/github/README.md‎

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ The `generic` (bring your own agent) integration registers this command under
2424
its configured `--commands-dir` in both commands and skills layouts. Installing
2525
`github` creates `speckit.github.taskstoissues.md` in commands mode or
2626
`speckit-github-taskstoissues/SKILL.md` in skills mode. The core
27-
`speckit.taskstoissues` command remains available and unchanged. See
27+
`speckit.taskstoissues` command is deprecated but remains available during migration.
28+
Use this extension's recommended command instead. See
2829
[integration-specific options](../../docs/reference/integrations.md#integration-specific-options).
2930

3031
## Removal
@@ -37,9 +38,9 @@ specify extension remove github
3738

3839
| Command | Description |
3940
| ------------------------------ | -------------------------------------------------------------------- |
40-
| `speckit.github.taskstoissues` | Convert tasks from `tasks.md` into dependency-ordered GitHub issues. |
41+
| `speckit.github.taskstoissues` | Recommended: convert tasks from `tasks.md` into dependency-ordered GitHub issues. |
4142

42-
> NOTE: The command ID above is canonical. Invoke it using the syntax for your integration: `/speckit.github.taskstoissues` for dot-command integrations; `/speckit-github-taskstoissues` for hyphen/skills integrations (including Forge and Cline); `$speckit-github-taskstoissues` for Codex, ZCode, or Command Code in skills mode; or `/skill:speckit-github-taskstoissues` for Kimi.
43+
> NOTE: The command ID above is canonical. Invoke it using the syntax for your integration: `/speckit.github.taskstoissues` for dot-command integrations; `/speckit-github-taskstoissues` for slash-hyphen integrations (including Forge and Cline); `$speckit-github-taskstoissues` for Codex, ZCode, or Command Code in skills mode; or `/skill:speckit-github-taskstoissues` for Kimi.
4344
4445
### What the command does
4546

@@ -81,9 +82,21 @@ Prerequisite errors name the Spec Kit command without assuming an integration's
8182

8283
Spec Kit is moving GitHub issue tracking out of core in three stages:
8384

84-
1. **Now** — this extension is available, and the core `/speckit.taskstoissues` command remains available and unchanged. Nothing breaks if you do nothing.
85-
2. **Next** — the core command is deprecated once the replacement has been available for a release.
86-
3. **Later** — the core command is removed in a minor release.
85+
1. **Initial stage (completed)** — this extension shipped with the core `/speckit.taskstoissues` command still available.
86+
2. **Next (current stage)** — the replacement has been available for at least one release, so the core command is now deprecated. It displays a migration warning and continues its existing workflow. It does not install or enable the extension automatically or run the replacement command.
87+
3. **Later** — the core command will be removed in a future minor release.
88+
89+
For existing projects, upgrading the CLI alone does not refresh the generated
90+
core command files. After upgrading the CLI, run this from the project root:
91+
92+
```bash
93+
specify integration upgrade <key>
94+
```
95+
96+
Replace `<key>` with the installed integration key, or omit it to upgrade the
97+
default integration. This refreshes the core command with the deprecation
98+
warning. If locally modified files block the upgrade, inspect those changes
99+
before deciding whether to overwrite them. See [Upgrade an Integration](../../docs/reference/integrations.md#upgrade-an-integration).
87100

88101
To migrate, install the extension and use the namespaced command instead:
89102

@@ -93,10 +106,42 @@ specify extension add github
93106

94107
The `generic` integration supports this migration in both commands and skills
95108
layouts under its configured `--commands-dir`. The core command remains
96-
available until a separate deprecation and removal decision.
109+
available during this deprecation period until the removal stage.
97110

98-
| Before | After |
111+
| Deprecated core command | Recommended extension command |
99112
| ------------------------- | --------------------------------- |
100113
| `/speckit.taskstoissues` | `/speckit.github.taskstoissues` |
101114

102-
Behavior is unchanged: the same feature resolution, the same `plan.md` and `tasks.md` prerequisites, the same remote validation, the same deduplication across open and closed issues, the same issue titles, and the same hook contract. This extension does **not** register `speckit.taskstoissues` as an alias, so the two commands coexist without shadowing each other while the core command still exists.
115+
Apart from the core command's deprecation warning, conversion behavior is unchanged: the same feature resolution, the same `plan.md` and `tasks.md` prerequisites, the same remote validation, the same deduplication across open and closed issues, the same issue titles, and the same hook contract. This extension does **not** register `speckit.taskstoissues` as an alias, so the two commands coexist without shadowing each other while the core command still exists.
116+
117+
### Presets and dependent extensions
118+
119+
Before the core command is removed, audit references to `speckit.taskstoissues`
120+
in presets, extension prompts, workflow steps, handoffs, and project automation.
121+
For GitHub issue conversion, use the canonical `speckit.github.taskstoissues`
122+
command ID and render it with the agent-specific syntax under [Commands](#commands).
123+
Replace `__SPECKIT_COMMAND_TASKSTOISSUES__` cross-command references with
124+
`__SPECKIT_COMMAND_GITHUB_TASKSTOISSUES__` where template rendering is supported.
125+
Document `specify extension add github` as a setup prerequisite; the deprecation
126+
warning does not install this dependency.
127+
128+
If an extension proposal or external dependency declaration uses
129+
`requires.commands: [speckit.taskstoissues]`, update its target to
130+
`speckit.github.taskstoissues`. `requires.commands` is not an enforced dependency
131+
field in the current extension manifest API, so do not rely on that declaration
132+
to install or check the GitHub extension. Follow the supported requirements in
133+
the [extension API reference](../EXTENSION-API-REFERENCE.md#extension-manifest).
134+
135+
Preset command overrides are separate from command references: an override of
136+
`speckit.taskstoissues` does not automatically customize the namespaced GitHub
137+
command. Review and port any needed customization, then verify the installed
138+
command in a sample project before retiring the old override. A preset that
139+
uses another issue tracker should retain its own provider-specific workflow
140+
rather than redirecting it to the GitHub command. Existing overrides may also
141+
hide the core deprecation warning, so communicate the migration to their users.
142+
143+
Keep the `before_taskstoissues` and `after_taskstoissues` hook keys unchanged;
144+
both commands consume them. Only update a hook's command reference if it invokes
145+
the deprecated command. Do not invoke both core and replacement commands for
146+
the same conversion, since that also runs their hooks twice. Publish and test
147+
updated preset/extension versions before the later core-removal release.

‎extensions/github/extension.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ schema_version: "1.0"
33
extension:
44
id: github
55
name: "GitHub Integration"
6-
version: "1.0.1"
6+
version: "1.0.2"
77
description: "GitHub platform integration for Spec Kit - create GitHub issues from a feature's task list"
88
author: spec-kit-core
99
repository: https://github.com/github/spec-kit

‎src/specify_cli/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ def _print_cli_warning(
380380
"clarify": "Structured clarification workflow for underspecified requirements.",
381381
"constitution": "Create or update project governing principles and development guidelines.",
382382
"checklist": "Generate custom quality checklists for validating requirements completeness and clarity.",
383-
"taskstoissues": "Convert tasks from tasks.md into GitHub issues.",
383+
"taskstoissues": "Deprecated: Convert tasks from tasks.md into GitHub issues.",
384384
}
385385

386386

‎templates/commands/taskstoissues.md‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
---
2-
description: Convert existing tasks into actionable, dependency-ordered GitHub issues for the feature based on available design artifacts.
2+
description: "Deprecated: Convert existing tasks into actionable, dependency-ordered GitHub issues for the feature based on available design artifacts."
33
tools: ['github/github-mcp-server/list_issues', 'github/github-mcp-server/issue_write']
44
scripts:
55
sh: scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks
66
ps: scripts/powershell/check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks
77
py: scripts/python/check_prerequisites.py --json --require-tasks --include-tasks
88
---
99

10+
## Deprecation Notice
11+
12+
You **MUST display the following concise warning first**, as the first step of this command and before the User Input and Pre-Execution Checks sections below:
13+
14+
> ⚠️ `__SPECKIT_COMMAND_TASKSTOISSUES__` is deprecated and will be removed in a future minor release. Use the bundled `github` extension instead: run `specify extension add github`, then invoke `__SPECKIT_COMMAND_GITHUB_TASKSTOISSUES__`.
15+
16+
Continue with the existing workflow unchanged. Do not install or enable the extension automatically, do not stop, and do not run the replacement command.
17+
1018
## User Input
1119

1220
```text

‎tests/extensions/github/test_github_extension.py‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def test_manifest_validates(self):
158158

159159
m = ExtensionManifest(EXT_DIR / "extension.yml")
160160
assert m.id == "github"
161-
assert m.version == "1.0.1"
161+
assert m.version == "1.0.2"
162162
assert [c["name"] for c in m.commands] == [COMMAND_NAME]
163163

164164
def test_manifest_command_files_exist(self):
@@ -598,17 +598,24 @@ def test_preserves_deduplication_and_pagination(self):
598598
# Four-digit and longer task IDs must still match.
599599
assert r"\bT\d{3,}\b" in body
600600

601-
def test_body_differs_from_core_only_in_the_script_invocation(self):
601+
def test_body_differs_from_core_only_in_deprecation_and_script_invocation(self):
602602
"""Behaviour parity, enforced as a diff rather than as spot checks.
603603
604-
Everything except the ``scripts:`` frontmatter and the two lines that
605-
read the new ``TASKS`` value must match the core command verbatim, so
606-
the two cannot silently drift while both exist.
604+
Apart from core-only deprecation metadata and notice, everything except
605+
the ``scripts:`` frontmatter and the two lines that read the new ``TASKS``
606+
value must match verbatim, so the two cannot silently drift while both exist.
607607
"""
608608
import difflib
609609

610-
core = CORE_COMMAND.read_text(encoding="utf-8").splitlines()
610+
core_text = CORE_COMMAND.read_text(encoding="utf-8")
611+
before_notice, notice_and_workflow = core_text.split("## Deprecation Notice\n", 1)
612+
_, workflow = notice_and_workflow.split("## User Input", 1)
613+
core = (before_notice + "## User Input" + workflow).splitlines()
611614
ext = COMMAND_FILE.read_text(encoding="utf-8").splitlines()
615+
core_description = yaml.safe_load(core[1])["description"]
616+
ext_description = yaml.safe_load(ext[1])["description"]
617+
assert core_description == "Deprecated: " + ext_description
618+
core[1] = ext[1]
612619
changed = [
613620
line
614621
for line in difflib.unified_diff(core, ext, n=0)

0 commit comments

Comments
 (0)