Skip to content

Commit 6aa53d6

Browse files
committed
fix(offline): remove dead --from-github flag, fix typer.Exit handling, add page templates validation
- Remove unused --from-github CLI option and docstring example - Add (typer.Exit, SystemExit) re-raise before broad except Exception to prevent duplicate error panel on offline scaffold failure - Validate page templates directory exists in scaffold_from_core_pack() to fail fast on incomplete wheel installs - Fix ruff lint: remove unused shutil import, remove f-prefix on strings without placeholders in test_core_pack_scaffold.py
1 parent addb3f8 commit 6aa53d6

File tree

6 files changed

+53
-75
lines changed

6 files changed

+53
-75
lines changed

CHANGELOG.md

Lines changed: 14 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Changes
66

7+
- chore: bump version to 0.3.2
78
- Add conduct extension to community catalog (#1908)
89
- feat(extensions): add verify-tasks extension to community catalog (#1871)
910
- feat(presets): add enable/disable toggle and update semantics (#1891)
@@ -20,13 +21,13 @@
2021
- Feature/spec kit add pi coding agent pullrequest (#1853)
2122
- feat: register spec-kit-learn extension (#1883)
2223

23-
2424
## [0.3.1] - 2026-03-17
2525

2626
### Changed
2727

28+
- chore: bump version to 0.3.1
2829
- docs: add greenfield Spring Boot pirate-speak preset demo to README (#1878)
29-
- fix(ai-skills): exclude non-speckit copilot agent markdown from skills (#1867)
30+
- fix(ai-skills): exclude non-speckit copilot agent markdown from skill… (#1867)
3031
- feat: add Trae IDE support as a new agent (#1817)
3132
- feat(cli): polite deep merge for settings.json and support JSONC (#1874)
3233
- feat(extensions,presets): add priority-based resolution ordering (#1855)
@@ -40,52 +41,21 @@
4041
- feat(extensions): add Archive and Reconcile extensions to community catalog (#1844)
4142
- feat: Add DocGuard CDD enforcement extension to community catalog (#1838)
4243

43-
4444
## [0.3.0] - 2026-03-13
4545

4646
### Changed
4747

48-
- No changes have been documented for this release yet.
49-
50-
<!-- Entries for 0.2.x and earlier releases are documented in their respective sections below. -->
51-
- make c ignores consistent with c++ (#1747)
52-
- chore: bump version to 0.1.13 (#1746)
53-
- feat: add kiro-cli and AGENT_CONFIG consistency coverage (#1690)
54-
- feat: add verify extension to community catalog (#1726)
55-
- Add Retrospective Extension to community catalog README table (#1741)
56-
- fix(scripts): add empty description validation and branch checkout error handling (#1559)
57-
- fix: correct Copilot extension command registration (#1724)
58-
- fix(implement): remove Makefile from C ignore patterns (#1558)
59-
- Add sync extension to community catalog (#1728)
60-
- fix(checklist): clarify file handling behavior for append vs create (#1556)
61-
- fix(clarify): correct conflicting question limit from 10 to 5 (#1557)
62-
- chore: bump version to 0.1.12 (#1737)
63-
- fix: use RELEASE_PAT so tag push triggers release workflow (#1736)
64-
- fix: release-trigger uses release branch + PR instead of direct push to main (#1733)
65-
- fix: Split release process to sync pyproject.toml version with git tags (#1732)
66-
67-
68-
## [Unreleased]
69-
70-
### Added
71-
72-
- feat(cli): polite deep merge for VSCode settings.json with JSONC support via `json5` and zero-data-loss fallbacks
73-
- feat(presets): Pluggable preset system with preset catalog and template resolver
74-
- Preset manifest (`preset.yml`) with validation for artifact, command, and script types
75-
- `PresetManifest`, `PresetRegistry`, `PresetManager`, `PresetCatalog`, `PresetResolver` classes in `src/specify_cli/presets.py`
76-
- CLI commands: `specify preset search`, `specify preset add`, `specify preset list`, `specify preset remove`, `specify preset resolve`, `specify preset info`
77-
- CLI commands: `specify preset catalog list`, `specify preset catalog add`, `specify preset catalog remove` for multi-catalog management
78-
- `PresetCatalogEntry` dataclass and multi-catalog support mirroring the extension catalog system
79-
- `--preset` option for `specify init` to install presets during initialization
80-
- Priority-based preset resolution: presets with lower priority number win (`--priority` flag)
81-
- `resolve_template()` / `Resolve-Template` helpers in bash and PowerShell common scripts
82-
- Template resolution priority stack: overrides → presets → extensions → core
83-
- Preset catalog files (`presets/catalog.json`, `presets/catalog.community.json`)
84-
- Preset scaffold directory (`presets/scaffold/`)
85-
- Scripts updated to use template resolution instead of hardcoded paths
86-
- feat(presets): Preset command overrides now propagate to agent skills when `--ai-skills` was used during init
87-
- feat: `specify init` persists CLI options to `.specify/init-options.json` for downstream operations
88-
- feat(extensions): support `.extensionignore` to exclude files/folders during `specify extension add` (#1781)
48+
- chore: bump version to 0.3.0
49+
- feat(presets): Pluggable preset system with catalog, resolver, and skills propagation (#1787)
50+
- fix: match 'Last updated' timestamp with or without bold markers (#1836)
51+
- Add specify doctor command for project health diagnostics (#1828)
52+
- fix: harden bash scripts against shell injection and improve robustness (#1809)
53+
- fix: clean up command templates (specify, analyze) (#1810)
54+
- fix: migrate Qwen Code CLI from TOML to Markdown format (#1589) (#1730)
55+
- fix(cli): deprecate explicit command support for agy (#1798) (#1808)
56+
- Add /selftest.extension core extension to test other extensions (#1758)
57+
- feat(extensions): Quality of life improvements for RFC-aligned catalog integration (#1776)
58+
- Add Java brownfield walkthrough to community walkthroughs (#1820)
8959

9060
## [0.2.1] - 2026-03-11
9161

@@ -316,8 +286,3 @@
316286
## [0.0.99] - 2026-02-19
317287

318288
- Feat/ai skills (#1632)
319-
320-
## [0.0.98] - 2026-02-19
321-
322-
- chore(deps): bump actions/stale from 9 to 10 (#1623)
323-
- feat: add dependabot configuration for pip and GitHub Actions updates (#1622)

README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,13 @@ Choose your preferred installation method:
4949

5050
#### Option 1: Persistent Installation (Recommended)
5151

52-
Install once and use everywhere:
52+
Install once and use everywhere. Pin a specific release tag for stability (check [Releases](https://github.com/github/spec-kit/releases) for the latest):
5353

5454
```bash
55+
# Install a specific stable release (recommended — replace vX.Y.Z with the latest tag)
56+
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z
57+
58+
# Or install latest from main (may include unreleased changes)
5559
uv tool install specify-cli --from git+https://github.com/github/spec-kit.git
5660
```
5761

@@ -73,21 +77,21 @@ specify check
7377
To upgrade Specify, see the [Upgrade Guide](./docs/upgrade.md) for detailed instructions. Quick upgrade:
7478

7579
```bash
76-
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git
80+
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@vX.Y.Z
7781
```
7882

7983
#### Option 2: One-time Usage
8084

8185
Run directly without installing:
8286

8387
```bash
84-
# Create new project
85-
uvx --from git+https://github.com/github/spec-kit.git specify init <PROJECT_NAME>
88+
# Create new project (pinned to a stable release — replace vX.Y.Z with the latest tag)
89+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <PROJECT_NAME>
8690

8791
# Or initialize in existing project
88-
uvx --from git+https://github.com/github/spec-kit.git specify init . --ai claude
92+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init . --ai claude
8993
# or
90-
uvx --from git+https://github.com/github/spec-kit.git specify init --here --ai claude
94+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init --here --ai claude
9195
```
9296

9397
**Benefits of persistent installation:**

docs/installation.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,34 @@
1212

1313
### Initialize a New Project
1414

15-
The easiest way to get started is to initialize a new project:
15+
The easiest way to get started is to initialize a new project. Pin a specific release tag for stability (check [Releases](https://github.com/github/spec-kit/releases) for the latest):
1616

1717
```bash
18+
# Install from a specific stable release (recommended — replace vX.Y.Z with the latest tag)
19+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <PROJECT_NAME>
20+
21+
# Or install latest from main (may include unreleased changes)
1822
uvx --from git+https://github.com/github/spec-kit.git specify init <PROJECT_NAME>
1923
```
2024

2125
Or initialize in the current directory:
2226

2327
```bash
24-
uvx --from git+https://github.com/github/spec-kit.git specify init .
28+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init .
2529
# or use the --here flag
26-
uvx --from git+https://github.com/github/spec-kit.git specify init --here
30+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init --here
2731
```
2832

2933
### Specify AI Agent
3034

3135
You can proactively specify your AI agent during initialization:
3236

3337
```bash
34-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai claude
35-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai gemini
36-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai copilot
37-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai codebuddy
38-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai pi
38+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai claude
39+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai gemini
40+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai copilot
41+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai codebuddy
42+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai pi
3943
```
4044

4145
### Specify Script Type (Shell vs PowerShell)
@@ -51,16 +55,16 @@ Auto behavior:
5155
Force a specific script type:
5256

5357
```bash
54-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --script sh
55-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --script ps
58+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --script sh
59+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --script ps
5660
```
5761

5862
### Ignore Agent Tools Check
5963

6064
If you prefer to get the templates without checking for the right tools:
6165

6266
```bash
63-
uvx --from git+https://github.com/github/spec-kit.git specify init <project_name> --ai claude --ignore-agent-tools
67+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init <project_name> --ai claude --ignore-agent-tools
6468
```
6569

6670
## Verification

docs/upgrade.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
| What to Upgrade | Command | When to Use |
1010
|----------------|---------|-------------|
11-
| **CLI Tool Only** | `uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git` | Get latest CLI features without touching project files |
11+
| **CLI Tool Only** | `uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@vX.Y.Z` | Get latest CLI features without touching project files |
1212
| **Project Files** | `specify init --here --force --ai <your-agent>` | Update slash commands, templates, and scripts in your project |
1313
| **Both** | Run CLI upgrade, then project update | Recommended for major version updates |
1414

@@ -20,16 +20,18 @@ The CLI tool (`specify`) is separate from your project files. Upgrade it to get
2020

2121
### If you installed with `uv tool install`
2222

23+
Upgrade to a specific release (check [Releases](https://github.com/github/spec-kit/releases) for the latest tag):
24+
2325
```bash
24-
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git
26+
uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@vX.Y.Z
2527
```
2628

2729
### If you use one-shot `uvx` commands
2830

29-
No upgrade needed—`uvx` always fetches the latest version. Just run your commands as normal:
31+
Specify the desired release tag:
3032

3133
```bash
32-
uvx --from git+https://github.com/github/spec-kit.git specify init --here --ai copilot
34+
uvx --from git+https://github.com/github/spec-kit.git@vX.Y.Z specify init --here --ai copilot
3335
```
3436

3537
### Verify the upgrade

src/specify_cli/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,10 @@ def scaffold_from_core_pack(
11991199
else:
12001200
repo_root = Path(__file__).parent.parent.parent
12011201
templates_dir = repo_root / "templates"
1202+
if not templates_dir.is_dir():
1203+
if tracker:
1204+
tracker.error("scaffold", "page templates not found")
1205+
return False
12021206

12031207
# Release script
12041208
try:
@@ -1709,7 +1713,6 @@ def init(
17091713
offline: bool = typer.Option(False, "--offline", help="Use assets bundled in the specify-cli package instead of downloading from GitHub (no network access required)"),
17101714
preset: str = typer.Option(None, "--preset", help="Install a preset during initialization (by preset ID)"),
17111715
branch_numbering: str = typer.Option(None, "--branch-numbering", help="Branch numbering strategy: 'sequential' (001, 002, ...) or 'timestamp' (YYYYMMDD-HHMMSS)"),
1712-
from_github: bool = typer.Option(False, "--from-github", help="Download the latest template release from GitHub instead of using bundled assets (requires network access to api.github.com)"),
17131716
):
17141717
"""
17151718
Initialize a new Specify project.
@@ -1744,7 +1747,6 @@ def init(
17441747
specify init my-project --ai generic --ai-commands-dir .myagent/commands/ # Unsupported agent
17451748
specify init my-project --offline # Use bundled assets (no network access)
17461749
specify init my-project --ai claude --preset healthcare-compliance # With preset
1747-
specify init my-project --from-github # Force download from GitHub releases
17481750
"""
17491751

17501752
show_banner()
@@ -2102,6 +2104,8 @@ def init(
21022104
tracker.skip("cleanup", "not needed (no download)")
21032105

21042106
tracker.complete("final", "project ready")
2107+
except (typer.Exit, SystemExit):
2108+
raise
21052109
except Exception as e:
21062110
tracker.error("final", str(e))
21072111
console.print(Panel(f"Initialization failed: {e}", title="Failure", border_style="red"))

tests/test_core_pack_scaffold.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131

3232
import os
3333
import re
34-
import shutil
3534
import subprocess
3635
import zipfile
3736
from pathlib import Path
@@ -567,7 +566,7 @@ def test_pyproject_force_include_covers_all_templates():
567566
if f"templates/{name}" not in pyproject_text
568567
]
569568
assert not missing, (
570-
f"Template files not listed in pyproject.toml force-include "
571-
f"(offline scaffolding will miss them):\n "
569+
"Template files not listed in pyproject.toml force-include "
570+
"(offline scaffolding will miss them):\n "
572571
+ "\n ".join(missing)
573572
)

0 commit comments

Comments
 (0)