Skip to content

Commit 9dda69a

Browse files
committed
fix: converge prefix, Firebender expected_files, PS null featureDir, setup-plan env var
Merge upstream/main (2 commits: bundle submission + converge docs) and fix 6 CI test failures: - converge command keeps speckit. prefix (like taskstoissues) in command_filename() — no fork preset alias exists for it - Firebender _expected_files: accept project kwarg, pass to super() for fork-aware scanning, dedup with set() after .md->.mdc remap - setup-plan test: use SPECIFY_FEATURE_DIRECTORY (full path) instead of SPECIFY_FEATURE (name only) to match get_feature_paths() resolution - PS create-new-feature.ps1: move featureDir assignment before the already-exists check to prevent null Test-Path error - PS test_branch_pattern_with_issue: reference create-new-feature-branch.ps1 (extension script) not create-new-feature.ps1 (core script) Version: 0.11.9+adlc3 Assisted-by: opencode (model: glm-5.2, autonomous)
2 parents 625d3de + b7e67f5 commit 9dda69a

12 files changed

Lines changed: 40 additions & 16 deletions

CHANGELOG.md

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

33
All notable changes to the Specify CLI and templates are documented here.
44

5+
# [0.11.9+adlc3] - 2026-06-29
6+
7+
### Fixed
8+
9+
- **converge command prefix**: Treated `converge` like `taskstoissues` — keeps `speckit.` prefix instead of fork `spec.` prefix in `command_filename()`, since `converge` is a new upstream command without a fork preset alias. Updated all three integration test base classes (Markdown, TOML, YAML) to include `converge` in the exception tuple.
10+
- **Firebender `_expected_files`**: Fixed signature to accept `project` kwarg and pass it to `super()`, enabling fork-aware project scanning. Added `set()` dedup to prevent duplicate `.mdc` entries after remapping.
11+
- **setup-plan.sh test**: Fixed `test_setup_plan_outputs_context_paths` to set `SPECIFY_FEATURE_DIRECTORY` (full path) instead of `SPECIFY_FEATURE` (feature name only), matching `get_feature_paths()` resolution logic.
12+
- **PowerShell `create-new-feature.ps1`**: Moved `$featureDir = Join-Path $specsDir $branchName` before the "already exists" check to prevent null `$featureDir` error in non-dry-run mode.
13+
- **PowerShell test script path**: Fixed `test_branch_pattern_with_issue` to reference `create-new-feature-branch.ps1` (extension script) instead of `create-new-feature.ps1` (core script).
14+
15+
### Changed
16+
17+
- **Align fork docs with upstream**: Merged upstream commits b7e67f55 (Add community bundle submission path) and 3e97b106 (Docs: Document /speckit.converge command). All docs files were already identical; only README.md needed merge resolution. Added a new **Community Bundles** section to the README with contribution link from upstream. Upstream's `/speckit.converge` docs are already present in fork with `spec.` prefix branding.
18+
519
# [0.11.9+adlc2] - 2026-06-29
620

721
### Added

FORK.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,17 @@ Examples:
5858

5959
### Tag Format
6060
Use `agentic-sdlc-v<version>` with plus:
61-
- Version: `0.11.9+adlc1`
61+
- Version: `0.11.9+adlc3`
6262

63-
- Tag: `agentic-sdlc-v0.11.9+adlc1`
63+
- Tag: `agentic-sdlc-v0.11.9+adlc3`
6464
When a fork release changes only bundled extension behavior, keep the CLI version on the upstream base (for example `0.10.0+adlc3`) and bump the affected extension manifest version independently (for example `extensions/git/extension.yml` to `1.5.0`).
6565

6666
### Version History
6767

6868
| Version | Date | Base Upstream | Changes |
6969
|---------|------|---------------|---------|
70+
| 0.11.9+adlc3 | 2026-06-29 | 0.11.9 | Merge upstream 2 new commits: community bundle submission issue template + docs (#3162), docs for /speckit.converge (#3181). All doc files already identical; only README.md required merge. Added new **Community Bundles** section to README with contribution link. Fixed 6 CI test failures: converge command keeps `speckit.` prefix (like taskstoissues); Firebender `_expected_files` accepts `project` kwarg + dedup; setup-plan test uses `SPECIFY_FEATURE_DIRECTORY`; PS `create-new-feature.ps1` null `$featureDir` fix; PS test uses correct extension script path. |
71+
| 0.11.9+adlc2 | 2026-06-29 | 0.11.9 | Re-added `specify preset update` CLI command (registration lost during upstream merge). Fixed `test_e2e_branch_pattern_with_issue_config` to source `git-common.sh` (core `common.sh` no longer has `check_feature_branch`). |
7072
| 0.11.9+adlc1 | 2026-06-28 | 0.11.9 | Merge upstream 0.11.9 (15 commits): mandatory hook invocation enforcement (#2901), PowerShell branch-name acronym case-sensitivity fix (#3129), GHES private release asset resolution (#3157), community bundle submission path (#3162), docs for --force and --refresh-shared-infra (#3179). Fork fixes: relative imports in extensions/ and presets/ __init__.py, registered.append guard in agents.py, bundled extension update uses install_from_directory not catalog download. |
7173
| 0.11.8+adlc1 | 2026-06-28 | 0.11.8 | Merge upstream 0.11.8 (19 commits): standardized EXECUTE_COMMAND hook format across all core command templates; git extension aligned to upstream opt-in (removed --no-git flag); forked core and preset commands split their hook strategies (upstream's EXECUTE_COMMAND for core, fork's manifest-lookup dispatcher for presets); script delegation paths fixed (core -> git extension); workflow tests adapted to fork's run_and_tee streaming; bundled-extension update checks bundled version first. |
7274
| 0.10.0+adlc33 | 2026-06-22 | 0.10.0 | Orange accent theming sweep: replaced all 54 `[green]` Rich markup references with `accent()` across 8 files — every success message, checkmark symbol, and status indicator now uses `#f47721` orange instead of green. Affects `__init__.py`, `_init_fork.py`, `_version.py`, `_utils.py`, `_console.py`, `commands/init.py`, integrations/_install_commands.py, integrations/_migrate_commands.py, integrations/_query_commands.py. |

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ This fork represents the evolution from a development process to a complete orga
5252
- [🧩 Community Extensions](#-community-extensions)
5353
- [🎨 Community Presets](#-community-presets)
5454
- [🚶 Community Walkthroughs](#-community-walkthroughs)
55+
- [📦 Community Bundles](#-community-bundles)
5556
- [🎯 Core Features](#-core-features)
5657
- [📦 Bundled Extensions](#-bundled-extensions)
5758
- [🔧 Team AI Directives Integration](#-team-ai-directives-integration)
@@ -239,6 +240,12 @@ To submit your own preset, see the [Presets Publishing Guide](presets/PUBLISHING
239240

240241
See Spec-Driven Development in action across different scenarios with community-contributed walkthroughs; find the full list on the [Community Walkthroughs](https://github.github.io/spec-kit/community/walkthroughs.html) page.
241242

243+
## 📦 Community Bundles
244+
245+
Community-contributed bundles package extensions, presets, workflows, and steps into a single role-oriented setup. See the [Community Bundles](https://github.github.io/spec-kit/community/bundles.html) page.
246+
247+
Want to contribute? See the [Extension Publishing Guide](extensions/EXTENSION-PUBLISHING-GUIDE.md), the [Presets Publishing Guide](presets/PUBLISHING.md), or the [Community Bundles guide](docs/community/bundles.md).
248+
242249
## 🎯 Core Features
243250

244251
This fork provides additional features beyond the upstream Spec Kit:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "agentic-sdlc-specify-cli"
3-
version = "0.11.9+adlc2"
3+
version = "0.11.9+adlc3"
44
description = "Specify CLI (tikalk fork). Agentic SDLC toolkit for Spec-Driven Development with pre-installed extensions and AI integrations."
55
readme = "README.md"
66
requires-python = ">=3.11"

scripts/powershell/create-new-feature.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ if ($branchName.Length -gt $maxBranchLength) {
269269
Write-Warning "[specify] Truncated to: $branchName ($($branchName.Length) bytes)"
270270
}
271271

272+
$featureDir = Join-Path $specsDir $branchName
272273
if (-not $DryRun) {
273274
if ((Test-Path -LiteralPath $featureDir -PathType Container) -and -not $AllowExistingBranch) {
274275
if ($Timestamp) {
@@ -280,7 +281,6 @@ if (-not $DryRun) {
280281
}
281282
}
282283

283-
$featureDir = Join-Path $specsDir $branchName
284284
if (-not $DryRun) {
285285
New-Item -ItemType Directory -Path $featureDir -Force | Out-Null
286286
}

src/specify_cli/integrations/base.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,11 @@ def command_filename(self, template_name: str) -> str:
453453
454454
*template_name* is the stem of the source file (e.g. ``"plan"``).
455455
Default: ``spec.{template_name}.md`` (fork uses "spec" prefix).
456-
Exception: ``taskstoissues`` keeps ``speckit.`` prefix for backwards compatibility.
456+
Exceptions: ``taskstoissues`` and ``converge`` keep ``speckit.`` prefix
457+
for backwards/upstream compatibility.
457458
Subclasses override to change the extension or naming convention.
458459
"""
459-
if template_name == "taskstoissues":
460+
if template_name in ("taskstoissues", "converge"):
460461
return f"speckit.{template_name}.md"
461462
return f"spec.{template_name}.md"
462463

tests/integrations/test_integration_base_markdown.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def _expected_files(self, script_variant: str, project=None) -> list[str]:
275275
pfx = _cmd_prefix()
276276
for stem in self.COMMAND_STEMS:
277277
# taskstoissues and agent-context.update keep the speckit prefix
278-
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update") else pfx
278+
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update", "converge") else pfx
279279
files.append(f"{cmd_dir}/{stem_pfx}.{stem}.md")
280280

281281
# Framework files

tests/integrations/test_integration_base_toml.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ def _expected_files(self, script_variant: str, project=None) -> list[str]:
508508
from tests.conftest import _cmd_prefix
509509
pfx = _cmd_prefix()
510510
for stem in self.COMMAND_STEMS:
511-
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update") else pfx
511+
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update", "converge") else pfx
512512
files.append(f"{cmd_dir}/{stem_pfx}.{stem}.toml")
513513

514514
# Framework files

tests/integrations/test_integration_base_yaml.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ def _expected_files(self, script_variant: str, project=None) -> list[str]:
397397

398398
# Command files (.yaml)
399399
for stem in self.COMMAND_STEMS:
400-
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update") else pfx
400+
stem_pfx = "speckit" if stem in ("taskstoissues", "agent-context.update", "converge") else pfx
401401
files.append(f"{cmd_dir}/{stem_pfx}.{stem}.yaml")
402402

403403
# Framework files

tests/integrations/test_integration_firebender.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ def test_setup_creates_files(self, tmp_path):
3434
assert f.name.startswith("speckit.")
3535
assert f.name.endswith(".mdc")
3636

37-
def _expected_files(self, script_variant: str) -> list[str]:
37+
def _expected_files(self, script_variant: str, project=None) -> list[str]:
3838
# Firebender emits ``.mdc`` command files, so remap the base mixin's
3939
# ``.md`` expectations for files under this integration's command dir.
4040
cmd_dir = get_integration(self.KEY).registrar_config["dir"]
4141
prefix = cmd_dir + "/"
42-
return sorted(
42+
return sorted(set(
4343
f[:-3] + ".mdc" if f.startswith(prefix) and f.endswith(".md") else f
44-
for f in super()._expected_files(script_variant)
45-
)
44+
for f in super()._expected_files(script_variant, project=project)
45+
))

0 commit comments

Comments
 (0)