Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,53 @@

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

# [0.15.1+adlc1] - 2026-08-02

### Added

- **Upstream merge (0.14.4 → 0.15.1)**: Continued adoption of upstream
`github/spec-kit` releases. Package version base reset to upstream `0.15.1`
with fork counter reset (`0.14.4+adlc1` → `0.15.1+adlc1`). Includes upstream
`0.15.0`/`0.15.1` fixes: tar archive support for installs (#3874), opt-in
`constitution-sync` preset (#3873), TOCTOU race elimination in file unlinks
(#3819), `verdict_input` gate binding (#3725), workflow step-metadata
escaping (#3863), non-object workflow cache rejection (#3860), non-UTF-8
manifest/VS Code settings normalization (#3862/#3833), `.NET` Framework-safe
PowerShell init-dir trim (#3872), Rich markup escaping in `workflow resolve`
output (#3879), and the `bundle update --force` mislead fix via
`refresh()` on `DefaultPrimitiveInstaller` (#3452).
- **Wheel asset path alignment**: Bundled preset `force-include` paths in
`pyproject.toml` remapped to `specify_cli/core_pack/presets/<id>` to match the
upstream `0.15.1` locator in `_locate_bundled_preset`.

### Changed

- **Command prefix**: `_cmd_prefix()` returns `"spec"` on the fork (vs
`"speckit"` upstream). Test assertions across `test_cli.py`,
`test_integration_{bob,copilot,droid,grok}.py`, `test_extensions.py`, and
`test_presets.py` use `_cmd_prefix()` or accept `spec-*` variants.
- **Fork alias-only mode**: `EXTENSION_ALIAS_PATTERN_ENABLED`
(`_core_fork.py:42`) skips primary command registration when aliases exist;
tests asserting command-mode primary+alias co-existence are guarded with
`pytest.skip("fork alias-only mode changes file layout")`.
- **Manifest disjoint checks**: `SHARED_INFRA_FILES = {".specify/events.py"}`
excluded from pairwise disjoint manifest checks in `test_registry.py`;
manifest paths normalized with `p.replace("\\", "/")` for Windows CI.
- **PowerShell feature scripts hardened**: `-Number` parameter typed as
`[string]` with explicit Int64 parsing to prevent parameter-binder crashes on
non-numeric/overflow inputs; empty `-Number ""` stripped from
`$PSBoundParameters` before delegation; `Get-NextBranchNumber` double-increment
removed (fixes `001` vs `002` off-by-one); numeric prefixes exceeding
`[long]::MaxValue` ignored; non-dry text mode prints persist hints to both
`stdout` and `stderr`. Applied to `scripts/powershell/create-new-feature.ps1`
and `extensions/git/scripts/powershell/create-new-feature-branch.ps1`.
- **Test suite alignment**: `test_authentication.py` synced to upstream `0.14.4`
with `gitlab` → `bitbucket` replacement for `test_unknown_provider_raises`;
`test_integration_catalog.py` mocks `_auth_http.open_url` instead of
`urllib.request.urlopen`; upstream #2948 behavior adopted for integration
upgrade (non-active integrations skip extension backfill). All platforms green.
- **Lint**: Ruff clean across `src/` and `tests/`.

# [0.14.4+adlc1] - 2026-07-30

### Added
Expand Down
1 change: 1 addition & 0 deletions FORK.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ When a fork release changes only bundled extension behavior, keep the CLI versio

| Version | Date | Base Upstream | Changes |
|---------|------|---------------|---------|
| 0.15.1+adlc1 | 2026-08-02 | 0.15.1 (`7f40c829`) | Upstream merge (0.14.4 → 0.15.1) with fork version base reset to `0.15.1`. Adopted upstream `0.15.0`/`0.15.1` fixes: tar archive installs (#3874), opt-in `constitution-sync` preset (#3873), TOCTOU unlink races (#3819), `verdict_input` gate binding (#3725), workflow step-metadata escaping (#3863), non-object workflow cache rejection (#3860), non-UTF-8 manifest/VS Code settings normalization (#3862/#3833), .NET-safe PowerShell init-dir trim (#3872), Rich markup escaping in `workflow resolve` (#3879), bundle-update-force-mislead fix via `refresh()` on `DefaultPrimitiveInstaller` (#3452). Wheel preset `force-include` paths remapped to `specify_cli/core_pack/presets/<id>` for upstream `0.15.1` `_locate_bundled_preset`. Fork `_cmd_prefix()` returns `"spec"` (upstream `"speckit"`); `EXTENSION_ALIAS_PATTERN_ENABLED` skips primary command registration when aliases exist; `SHARED_INFRA_FILES = {".specify/events.py"}` excluded from disjoint manifest checks; manifest path Windows normalization. PowerShell feature scripts hardened (`-Number [string]` + Int64 parse, empty `-Number` stripping, `Get-NextBranchNumber` double-increment fix, `[long]::MaxValue` bounds, dual-stream persist hints) in core and git-extension twins. Test suite synced to upstream `0.14.4` (`test_authentication` gitlab→bitbucket provider, `test_integration_catalog` `_auth_http.open_url` mock) and #2948 upgrade semantics adopted. Ruff clean across `src/` and `tests/`. git extension 1.8.0 → 1.8.1. |
| 0.14.4+adlc1 | 2026-07-30 | 0.14.4 (`f04a36a6`) | Upstream merge (232 commits, 13 releases 0.12.16–0.14.4). **`_hooks_fork.py` deleted** — replaced by upstream `events.py` (PR #3704, authored by fork maintainer). The upstream rework renames `runtime_hooks:` → `events:`, uses snake_case canonical names (`session_start`, `pre_tool_use`, …), folds adapters into integration class attributes (`CANONICAL_TO_NATIVE`/`events_config_file`/`events_format`), adds `specify event run` dispatcher. All 8 event-capable integrations (claude/codex/cursor-agent/devin/gemini/opencode/qwen/tabnine) now use upstream class attrs instead of fork `--hooks`. agent-context extension 1.2.0→1.3.0 (migrated `runtime_hooks: SessionStart` → `events: session_start` + `scripts:` frontmatter). `resolve_command_refs` signature extended with `prefix` param (upstream invocation-style: `/`,`$`,`/skill:`) alongside fork's `project_root` (preset alias resolution). `build_command_invocation` keeps fork convention (always `/` prefix, `COMMAND_PREFIX`). Extension update flow: fork's bundled path preserved alongside upstream's improved download path (bounded zip reads, atomic transaction, manifest validation). Preset system: upstream's single-active registration (#2948) + `register_enabled_presets_for_agent` adopted; fork's `_cleanup_replaced_commands` (replaces: feature) + `inject_model_invocation_flag` preserved. Upstream security: bounded HTTP reads (`_download_security.py`), Rich markup escaping, zip-bomb protection, TOCTOU fixes. New features: workflow overlays, `assess` extension, conventional commits, `build_python_invocation`/`select_script_variant`, `is_skills_mode()`. 42 conflicts resolved. 173 events/base tests pass; ~60 test mock updates deferred (download-security mocks). |
| 0.12.15+adlc9 | 2026-07-17 | 0.12.15 (`ad601e5d`) | Bug fixes in team-boot and team-discover model-invocation commands: (1) team-boot Step 2 used glob to find constitution — `{TEAM_AI_DIRECTIVES}` was treated as a search target, not a resolved value; added explicit definition after Step 1 and direct-read instruction in Step 2. (2) team-discover Step 2 had no plain-message fallback — expected `{REPO_ROOT}/specs/${SPECIFY_FEATURE}/context.md` which doesn't exist when invoked as a skill from team-boot; added fallback to extract feature context from user's message. (3) team-discover mode detection missing skill-invocation case — all 4 rules depended on `$ARGUMENTS`/env vars/hook context; added rule 5: skill invocation defaults to no-write mode with inline output. (4) team-discover Step 4 didn't surface external skills — `.skills.json` `external` map entries never matched against feature context; expanded matching to cover both `default` and `external` lists with category-based matching. (5) team-discover Step 1 `{TEAM_AI_DIRECTIVES}` undefined — same bare-variable pattern as team-boot; added clarifying note. team-ai-directives extension 4.3.2 → 4.3.3. |
| 0.12.15+adlc8 | 2026-07-17 | 0.12.15 (`ad601e5d`) | Canonical runtime event unification + 4 new hook-capable integrations. Extensions now use unified canonical event names (`PreToolUse`, `PostToolUse`, `Stop`, `SessionStart`, `SessionEnd`, `UserPromptSubmit`) in `runtime_hooks:`; each adapter translates to agent-native names via `CANONICAL_TO_NATIVE` mapping. New adapters: `QwenHookAdapter` (`.qwen/settings.json`), `GeminiHookAdapter` (`.gemini/settings.json`, `BeforeTool`/`AfterTool`), `DevinHookAdapter` (`.devin/hooks.v1.json`), `TabnineHookAdapter` (`.tabnine/agent/settings.json`). `validate_runtime_hooks()` rejects unknown event names. Adapters warn+skip unsupported events. `JSONHookAdapter` refactored with shared `_build_nested_fragment()` + `bridge_path_prefix`. Hook callout added to `TomlIntegration.setup()` + `YamlIntegration.setup()`. `--hooks` option added to gemini/qwen/devin/tabnine. 56 tests (22 new). |
Expand Down
36 changes: 36 additions & 0 deletions extensions/git/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,41 @@
# Changelog

## [1.8.1] - 2026-08-02

### Fixed

- PowerShell `-Number` parameter typed as `[string]` with explicit Int64 parsing to prevent parameter-binder crashes on non-numeric/overflow inputs.
- Empty `-Number ""` stripped from `$PSBoundParameters` before delegation so it is treated as omitted.
- `Get-NextBranchNumber` double-increment removed — branch numbering now returns the correct next number (`001`, `002`, …) instead of skipping one.
- Numeric prefixes exceeding `[long]::MaxValue` (e.g. `9223372036854775808-`) ignored by `Get-HighestNumberFromSpecs`/`Get-HighestNumberFromNames` instead of crashing.
- Non-dry text mode prints the `SPECIFY_FEATURE` persist hint to both stdout and stderr for cross-shell visibility.

## [1.8.0] - 2026-07-07

### Added

- Configurable Conventional Commit support (`commit_style: conventional`) in the auto-commit flow (#3390/#3413).
- Namespaced git feature branch templates (#3293) and Jira-style `{issue}` templates migrated onto upstream `branch_template`.

### Changed

- Jira branch templates migrated onto the upstream `branch_template` mechanism (fork no longer diverges on template handling).
- `{prefix}` placeholder expansion in `branch_template` now matches the bash twin's behavior.
- Branch validation honors configured feature branch templates when `branch_pattern.enabled: true`.

### Fixed

- PowerShell honors explicit `-Number 0` (#3412) and rejects negative `-Number` (#3538).
- PowerShell emits the `'# To persist'` `SPECIFY_FEATURE` hint for parity with bash (#3632).
- Trailing whitespace trimmed before stripping commit-message quotes (#3673).

## [1.7.0] - 2026-06-20

### Added

- `speckit.git.publish` command (aliased `git.publish`) — platform-neutral PR (GitHub `gh`) / MR (GitLab `glab`) creation.
- `speckit.git.commit` `--message` flag for explicit commit messages.

## [1.6.0] - 2026-06-19

### Added
Expand Down
2 changes: 1 addition & 1 deletion extensions/git/extension.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ schema_version: "1.0"
extension:
id: git
name: "Git Branching Workflow"
version: "1.8.0"
version: "1.8.1"
description: "Feature branch creation, numbering (sequential/timestamp), templating, validation, Git remote detection, multi-repo workspace submodule management, and feature-level worktree isolation"
author: spec-kit-core
repository: https://github.com/github/spec-kit
Expand Down
9 changes: 6 additions & 3 deletions presets/agentic-sdlc/commands/adlc.spec.clarify.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,9 +218,13 @@ Execution steps:

5. Sequential questioning loop (interactive):
- Present EXACTLY ONE question at a time.
- **CRITICAL**: You MUST output the actual question text BEFORE showing any options or recommendations.
- **Question writing quality (applies to every question, MC or short-answer):**
- Lead with `**Question:**` followed by a full interrogative that ends with `?`. The question text before the `?` must make sense on its own.
- NEVER use a topic label, section heading, or requirement id as the question itself. For example, `Acceptance device/runtime matrix (FR-023)` is INVALID — it is a label, not a question.
- After the `?`, the only permitted suffix is an optional parenthesized requirement/question id. Exact format: `**Question:** <interrogative>?` or `**Question:** <interrogative>? (FR-023)`. Never put the id before the `?`, and never use the id (alone or with a topic label) as the whole prompt.
- Immediately after the question line, add one plain-language "Why it matters" sentence (the stake for acceptance or shipping) before the recommendation/options.
- Use everyday wording; introduce jargon only if defined in the same sentence. Self-check: a reader who does not know Spec Kit must be able to answer from the Question line alone. Terse is fine; cryptic labels are not.
- For multiple‑choice questions:
- **First, clearly state the question** (e.g., "**Question**: How should the CLI authenticate with the API?")
- **Analyze all options** and determine the **most suitable option** based on:
- Best practices for the project type
- Common patterns in similar implementations
Expand All @@ -238,7 +242,6 @@ Execution steps:

- After the table, add: `You can reply with the option letter (e.g., "A"), accept the recommendation by saying "yes" or "recommended", or provide your own short answer.`
- For short‑answer style (no meaningful discrete options):
- **First, clearly state the question**
- Provide your **suggested answer** based on best practices and context: `**Suggested:** <your proposed answer> - <brief reasoning>`
- Then output: `Format: Short answer (<=5 words). You can accept the suggestion by saying "yes" or "suggested", or provide your own answer.`
- After the user answers:
Expand Down
43 changes: 27 additions & 16 deletions presets/agentic-sdlc/commands/adlc.spec.constitution.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
description: Create or update the project constitution from interactive or provided principle inputs, ensuring all dependent templates stay in sync.
description: Create or update the project constitution from interactive or provided principle inputs.
handoffs:
- label: Build Specification
agent: adlc.spec.specify
Expand Down Expand Up @@ -53,9 +53,28 @@ $ARGUMENTS

You **MUST** consider the user input before proceeding (if not empty).

## Scope Guard

This command's own work is limited to updating the project constitution itself. Dependent templates
and commands read the constitution at runtime and are not modified here.

- Classify every part of the user input as either constitution content or a separate,
non-governance intent.
- If the input includes feature implementation, code generation, refactoring, building, or
deployment requests, you **MUST NOT** execute them. Extract them as deferred intents instead.
- You **MUST NOT** create, modify, or delete application source files, feature routes,
components, tests, deployment files, or other artifacts unrelated to the constitution
workflow.
- If it is unclear whether an instruction is constitution content, ask for clarification before
making changes.
- After completing the constitution update, include a `Next Actions` section for each deferred
intent. List the original intent and suggest the appropriate follow-up Spec Kit command, such
as `adlc.spec.specify`, without invoking it.
- If there are no non-governance intents, omit the `Next Actions` section.

## Outline

You are updating the project constitution at `.specify/memory/constitution.md`. This file is a TEMPLATE containing placeholder tokens in square brackets (e.g. `[PROJECT_NAME]`, `[PRINCIPLE_1_NAME]`). Your job is to (a) collect/derive concrete values, (b) fill the template precisely, and (c) propagate any amendments across dependent artifacts.
You are updating the project constitution at `.specify/memory/constitution.md`. This file is a TEMPLATE containing placeholder tokens in square brackets (e.g. `[PROJECT_NAME]`, `[PRINCIPLE_1_NAME]`). Your job is to (a) collect/derive concrete values and (b) fill the template precisely.

**Note**: If `.specify/memory/constitution.md` does not exist yet, it should have been initialized from `.specify/templates/constitution-template.md` during project setup. If it's missing, copy the template first.

Expand All @@ -81,33 +100,26 @@ Follow this execution flow:
- Ensure each Principle section: succinct name line, paragraph (or bullet list) capturing non‑negotiable rules, explicit rationale if not obvious.
- Ensure Governance section lists amendment procedure, versioning policy, and compliance review expectations.

4. Consistency propagation checklist:
- Read `.specify/templates/plan-template.md` and ensure any "Constitution Check" or rules align with updated principles; convert prior checklist into active validations.
- Read `.specify/templates/spec-template.md` for scope/requirements alignment—update if constitution adds/removes mandatory sections or constraints.
- Read `.specify/templates/tasks-template.md` and ensure task categorization reflects new or removed principle-driven task types (e.g., observability, versioning, testing discipline).
- Read each installed Spec Kit command file for your agent (including this one) — named `spec.*` or `spec-*` (dot or hyphen depending on the agent; fork alias prefix), or laid out as `spec-<name>/SKILL.md` for skills-based integrations, e.g. in `.github/agents/`, `.github/skills/`, `.claude/skills/`, or your agent's equivalent commands directory — to verify no outdated references (CLAUDE-only or other agent-specific names) remain when generic guidance is required.
- Read any runtime guidance docs (e.g., `README.md`, `docs/quickstart.md`) or agent-specific guidance files if present. Update references to principles changed.

5. Produce a Sync Impact Report (prepend as an HTML comment at top of the constitution file after update):
4. Produce a Sync Impact Report (prepend as an HTML comment at top of the constitution file after update):
- Version change: old → new
- List of modified principles (old title → new title if renamed)
- Added sections
- Removed sections
- Templates requiring updates (✅ updated / ⚠ pending) with file paths
- Follow-up TODOs if any placeholders intentionally deferred.

6. Validation before final output:
5. Validation before final output:
- No remaining unexplained bracket tokens.
- Version line matches report.
- Dates ISO format YYYY-MM-DD.
- Principles are declarative, testable, and free of vague language ("should" → replace with MUST/SHOULD rationale where appropriate).

7. Write the completed constitution back to `.specify/memory/constitution.md` (overwrite).
6. Write the completed constitution back to `.specify/memory/constitution.md` (overwrite).

8. Output a final summary to the user with:
7. Output a final summary to the user with:
- New version and bump rationale.
- Any files flagged for manual follow-up.
- Any TODO placeholders or deferred items requiring manual follow-up.
- Suggested commit message (e.g., `docs: amend constitution to vX.Y.Z (principle additions + governance update)`).
- A `Next Actions` section for any deferred non-governance intents.

Formatting & Style Requirements:

Expand All @@ -125,7 +137,6 @@ Do not create a new template; always operate on the existing `.specify/memory/co
## Done When

- [ ] Constitution updated, versioned, and written to `.specify/memory/constitution.md`
- [ ] Dependent templates and guidance files reviewed for consistency
- [ ] Extension hooks dispatched or skipped according to the rules above
- [ ] Completion reported to user with version change and files flagged for follow-up

Expand Down
Loading