Skip to content

Commit b34dae5

Browse files
mnriemCopilot
andcommitted
Merge remote-tracking branch 'upstream/main' into add-specjudge-extension-ff988b9c677ca8cc
Resolve catalog updated_at conflict by taking main's 2026-08-13 timestamp. Assisted-by: GitHub Copilot (model: Claude Opus 4.8, autonomous) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2 parents fb66883 + bfabf4c commit b34dae5

20 files changed

Lines changed: 1108 additions & 151 deletions

File tree

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@
22

33
<!-- insert new changelog below this comment -->
44

5+
## [0.16.3] - 2026-08-13
6+
7+
### Changed
8+
9+
- fix: narrow bare except Exception in VS Code settings merge (#3844)
10+
- feat(presets): list presets in resolution/precedence order (#4086) (#4104)
11+
- Fix: scaffold self-contained namespaced preset commands (#4076) (#4082)
12+
- Update Cross-Platform Governance preset to v0.2.2 (#4080)
13+
- fix(bundler): treat a blank active integration as indeterminate in FR-019 (#3886)
14+
- Integrate Junie with dot-to-hyphen behavior and command formatting (#4073)
15+
- Update A11Y Governance preset to v0.4.3 (#4074)
16+
- Fix Alquimia argument hints after folded descriptions (#4063)
17+
- fix: use bounded read for bundle download HTTP responses (#3764)
18+
- Update iSAQB Architecture Governance preset to v0.2.2 (#4056)
19+
- fix(claude): make argument-hint injection fold-aware for long descriptions (#4045)
20+
- Add SpecKit Grill Me extension to community catalog (#4052)
21+
- Update Architecture Governance preset to v0.5.2 (#4050)
22+
- Remove auto-assign from catalog submission workflow (#4054)
23+
- docs: clarify example spec guidance (#4048)
24+
- Clarify custom checklist ownership and lifecycle (#4028)
25+
- Update Archive Extension to v1.2.2 (#4053)
26+
- Update Security Governance preset to v0.6.2 (#4040)
27+
- docs: clarify maintainer applies submission label during triage (#4041)
28+
- chore: release 0.16.2, begin 0.16.3.dev0 development (#4038)
29+
530
## [0.16.2] - 2026-08-10
631

732
### Changed

docs/community/extensions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ The following community-contributed extensions are available in [`catalog.commun
3535
| Architecture Guard | Framework-agnostic architecture review extension for validating implementation against governance and architecture constitutions, detecting architectural drift, and generating non-blocking refactor tasks | `process` | Read+Write | [spec-kit-architecture-guard](https://github.com/DyanGalih/spec-kit-architecture-guard) |
3636
| Architecture Workflow | Generate or reverse project-level 4+1 architecture views with per-view and full-workflow commands | `docs` | Read+Write | [spec-kit-arch](https://github.com/bigsmartben/spec-kit-arch) |
3737
| Archive Extension | Archive merged features into main project memory, resolving gaps and conflicts. | `docs` | Read+Write | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
38+
| spec-kit-atlas | Synthesize spec-kit specs into faithful, interactive architecture storybooks & doc portals. | `docs` | Read-only | [spec-kit-atlas](https://github.com/ashbrener/spec-kit-atlas) |
3839
| Azure DevOps Integration | Sync user stories and tasks to Azure DevOps work items using OAuth authentication | `integration` | Read+Write | [spec-kit-azure-devops](https://github.com/pragya247/spec-kit-azure-devops) |
3940
| Blueprint | Stay code-literate in AI-driven development: review a complete code blueprint for every task from spec artifacts before /speckit.implement runs | `docs` | Read+Write | [spec-kit-blueprint](https://github.com/chordpli/spec-kit-blueprint) |
4041
| Blueprint Index — Living Architecture Map | A living architecture map for spec-driven projects, kept honest by a deterministic, low-friction, machine-first CI gate (JSON, self-healable) that blocks only when the map contradicts the specs or code. Brownfield or greenfield. | `process` | Read+Write | [spec-kit-blueprint](https://github.com/ogil109/spec-kit-blueprint) |

docs/community/presets.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
1515
| Canon Core | Adapts original Spec Kit workflow to work together with Canon extension | 2 templates, 8 commands || [spec-kit-canon](https://github.com/maximiliamus/spec-kit-canon) |
1616
| Claude AskUserQuestion | Upgrades `/speckit.clarify` and `/speckit.checklist` on Claude Code from Markdown-table prompts to the native AskUserQuestion picker, with a recommended option and reasoning on every question | 2 commands || [spec-kit-preset-claude-ask-questions](https://github.com/0xrafasec/spec-kit-preset-claude-ask-questions) |
1717
| Command Density | Compacts the nine core Spec Kit command prompts while preserving scripts, handoffs, placeholders, hook output blocks, and rule structure | 9 commands || [spec-kit-preset-command-density](https://github.com/Xopoko/spec-kit-preset-command-density) |
18-
| Cross-Platform Governance | Adds Bash/PowerShell and read-only check parity, root-path and native-override review, Unix man pages, bilingual help, Verb-Noun discipline, and audit-ready evidence. | 8 templates, 3 commands || [spec-kit-preset-cross-platform-governance](https://github.com/hindermath/spec-kit-preset-cross-platform-governance) |
18+
| Cross-Platform Governance | Adds Bash/PowerShell parity, read-only checks, path and native-override review, Unix man pages, bilingual PowerShell help, and provider-neutral model routing. | 9 templates, 3 commands || [spec-kit-preset-cross-platform-governance](https://github.com/hindermath/spec-kit-preset-cross-platform-governance) |
1919
| Explicit Task Dependencies | Adds explicit `(depends on T###)` dependency declarations and an Execution Wave DAG to tasks.md for parallel scheduling | 1 template, 1 command || [spec-kit-preset-explicit-task-dependencies](https://github.com/Quratulain-bilal/spec-kit-preset-explicit-task-dependencies) |
2020
| Fiction Book Writing | It adapts the Spec-Driven Development workflow for storytelling to create books or audiobooks (with annotations) in 12 languages: features become story elements, specs become story briefs, plans become story structures, and tasks become scene-by-scene writing tasks. Supports single and multi-POV, all major plot structure frameworks, and two style modes: an author voice sample or humanized AI prose principles. Supports interactive elements like brainstorming, interview, roleplay, and extras like statistics, cover builder, illustration builder, and bio command. Export with templates for KDP, D2D, etc. | 26 templates, 34 commands, 2 scripts || [speckit-preset-fiction-book-writing](https://github.com/adaumann/speckit-preset-fiction-book-writing) |
2121
| Game Narrative Writing | Preset for game narrative design and interactive storytelling. It adapts the Spec-Driven Development workflow for game narratives: features become story mechanics, specs become narrative briefs, plans become story maps, and tasks become dialogue and scene-writing tasks. Supports branching narratives, player agency systems, state machines, and interactive dialogue trees. | 37 templates, 34 commands, 5 scripts || [speckit-preset-game-narrative-writing](https://github.com/adaumann/speckit-preset-game-narrative-writing) |

docs/reference/presets.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ specify preset list
4747

4848
Lists installed presets with their versions, descriptions, template counts, and current status.
4949

50+
Presets are printed in **resolution/precedence order**: the highest-precedence preset (lowest priority number) is listed first, and ties on priority are broken alphabetically by preset id. This matches the order used when composing commands and resolving templates, so the top entry is the one that wins for overlapping files.
51+
5052
## Preset Info
5153

5254
```bash

extensions/catalog.community.json

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_version": "1.0",
3-
"updated_at": "2026-08-12T00:00:00Z",
3+
"updated_at": "2026-08-13T00:00:00Z",
44
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
55
"extensions": {
66
"adrkit": {
@@ -390,6 +390,44 @@
390390
"created_at": "2026-03-14T00:00:00Z",
391391
"updated_at": "2026-08-11T00:00:00Z"
392392
},
393+
"atlas": {
394+
"name": "spec-kit-atlas",
395+
"id": "atlas",
396+
"description": "Synthesize spec-kit specs into faithful, interactive architecture storybooks & doc portals.",
397+
"author": "Ash Brener",
398+
"version": "0.1.0",
399+
"download_url": "https://github.com/ashbrener/spec-kit-atlas/archive/refs/tags/v0.1.0.zip",
400+
"repository": "https://github.com/ashbrener/spec-kit-atlas",
401+
"homepage": "https://github.com/ashbrener/spec-kit-atlas",
402+
"documentation": "https://github.com/ashbrener/spec-kit-atlas/blob/main/README.md",
403+
"changelog": "https://github.com/ashbrener/spec-kit-atlas/blob/main/CHANGELOG.md",
404+
"license": "MIT",
405+
"category": "docs",
406+
"effect": "read-only",
407+
"requires": {
408+
"speckit_version": ">=0.1.0",
409+
"tools": [
410+
{ "name": "python", "version": ">=3.11", "required": true },
411+
{ "name": "uv", "required": true }
412+
]
413+
},
414+
"provides": {
415+
"commands": 2,
416+
"hooks": 0
417+
},
418+
"tags": [
419+
"documentation",
420+
"architecture",
421+
"storybook",
422+
"traceability",
423+
"atlas"
424+
],
425+
"verified": false,
426+
"downloads": 0,
427+
"stars": 0,
428+
"created_at": "2026-08-13T00:00:00Z",
429+
"updated_at": "2026-08-13T00:00:00Z"
430+
},
393431
"azure-devops": {
394432
"name": "Azure DevOps Integration",
395433
"id": "azure-devops",

presets/catalog.community.json

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,35 +228,30 @@
228228
"cross-platform-governance": {
229229
"name": "Cross-Platform Governance",
230230
"id": "cross-platform-governance",
231-
"version": "0.2.1",
232-
"description": "Adds Bash/PowerShell and read-only check parity, root-path and native-override review, Unix man pages, bilingual help, Verb-Noun discipline, and audit-ready evidence.",
231+
"version": "0.2.2",
232+
"description": "Adds Bash/PowerShell parity, read-only checks, path and native-override review, Unix man pages, bilingual PowerShell help, and provider-neutral model routing.",
233233
"author": "Thorsten Hindermann",
234234
"repository": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance",
235-
"download_url": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance/archive/refs/tags/v0.2.1.zip",
235+
"download_url": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance/archive/refs/tags/v0.2.2.zip",
236236
"homepage": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance",
237-
"documentation": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance/blob/v0.2.1/README.md",
237+
"documentation": "https://github.com/hindermath/spec-kit-preset-cross-platform-governance/blob/v0.2.2/README.md",
238238
"license": "MIT",
239239
"requires": {
240240
"speckit_version": ">=0.8.0"
241241
},
242242
"provides": {
243-
"templates": 8,
243+
"templates": 9,
244244
"commands": 3
245245
},
246246
"tags": [
247247
"cross-platform",
248248
"governance",
249249
"bash",
250250
"powershell",
251-
"man-page",
252-
"cmdlet",
253-
"verb-noun",
254-
"windows",
255-
"macos",
256-
"linux"
251+
"model-routing"
257252
],
258253
"created_at": "2026-04-27T00:00:00Z",
259-
"updated_at": "2026-07-23T00:00:00Z"
254+
"updated_at": "2026-08-12T00:00:00Z"
260255
},
261256
"explicit-task-dependencies": {
262257
"name": "Explicit Task Dependencies",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "specify-cli"
3-
version = "0.16.3.dev0"
3+
version = "0.16.4.dev0"
44
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
55
readme = "README.md"
66
requires-python = ">=3.11"

src/specify_cli/_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ def atomic_write_json(target_file: Path, payload: dict[str, Any]) -> None:
213213
shutil.copy2(sub_item, dest_file)
214214
log("Copied (no existing settings.json):", "blue")
215215

216-
except Exception as e:
216+
except (OSError, ValueError, KeyError) as e:
217217
log(f"Warning: Could not merge settings: {e}", "yellow")
218218
if not dest_file.exists():
219219
shutil.copy2(sub_item, dest_file)

src/specify_cli/authentication/config.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import os
1212
import stat
1313
from dataclasses import dataclass
14-
from fnmatch import fnmatch
1514
from pathlib import Path
1615
from typing import Any
1716
from urllib.parse import urlparse
@@ -48,10 +47,21 @@ def _is_valid_host_pattern(pattern: str) -> bool:
4847
* ``*.example.com`` — leading ``*.`` wildcard; matches subdomains
4948
such as ``myorg.example.com`` but not ``example.com`` itself
5049
"""
50+
if any(char in pattern for char in "?[]"):
51+
return False
5152
if "*" not in pattern:
5253
return True # exact hostname — already validated as non-empty
5354
# Only *.suffix is allowed; no other wildcard positions
54-
return pattern.startswith("*.") and "*" not in pattern[2:]
55+
return pattern.startswith("*.") and len(pattern) > 2 and "*" not in pattern[2:]
56+
57+
58+
def _host_matches_pattern(hostname: str, pattern: str) -> bool:
59+
"""Match a hostname against an exact host or leading ``*.`` wildcard."""
60+
hostname = hostname.lower()
61+
pattern = pattern.lower()
62+
if pattern.startswith("*.") and _is_valid_host_pattern(pattern):
63+
return hostname.endswith(pattern[1:])
64+
return hostname == pattern
5565

5666

5767
def _norm(value: Any) -> Any:
@@ -224,8 +234,5 @@ def find_entries_for_url(
224234
return [
225235
e
226236
for e in entries
227-
if any(
228-
pattern == hostname or fnmatch(hostname, pattern)
229-
for pattern in e.hosts
230-
)
237+
if any(_host_matches_pattern(hostname, pattern) for pattern in e.hosts)
231238
]

src/specify_cli/authentication/http.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@
1313

1414
import urllib.error
1515
import urllib.request
16-
from fnmatch import fnmatch
1716
from typing import Callable
1817
from urllib.parse import urlparse
1918

2019
from .._download_security import is_safe_download_redirect
2120
from . import get_provider
22-
from .config import AuthConfigEntry, _default_config_path, find_entries_for_url, load_auth_config
21+
from .config import (
22+
AuthConfigEntry,
23+
_default_config_path,
24+
_host_matches_pattern,
25+
find_entries_for_url,
26+
load_auth_config,
27+
)
2328

2429

2530
_config_override: list[AuthConfigEntry] | None = None
@@ -54,8 +59,7 @@ def _load_config() -> list[AuthConfigEntry]:
5459

5560
def _hostname_in_hosts(hostname: str, hosts: tuple[str, ...]) -> bool:
5661
"""Return True if *hostname* matches any pattern in *hosts*."""
57-
hostname = hostname.lower()
58-
return any(p == hostname or fnmatch(hostname, p) for p in hosts)
62+
return any(_host_matches_pattern(hostname, pattern) for pattern in hosts)
5963

6064

6165
RedirectValidator = Callable[[str, str], None]

0 commit comments

Comments
 (0)