Skip to content

Commit 09bed00

Browse files
committed
feat: add /speckit.repo-story command and bump to v1.5.0
- New /speckit.repo-story command: evidence-based repository narrative generation for business and technical audiences - Paired repo-story-context.sh and repo-story-context.ps1 scripts with commit-audit-ready JSON schema (anonymized roles, velocity metrics, quality signals, governance maturity) - Branding sweep: consistent Spec Kit Spark / ASLCD messaging across all docs, CLI, and release generators - README roadmap synced from stale v0.0.25 to v1.5.0 - CHANGELOG and release_notes.md updated for v1.5.0
1 parent bf4592f commit 09bed00

20 files changed

Lines changed: 1336 additions & 99 deletions

.documentation/critic-usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,5 +480,5 @@ If you encounter issues:
480480

481481
---
482482

483-
*Part of the Spec Kit - Spec-Driven Development Toolkit*
483+
*Part of Spec Kit Spark - Adaptive System Life Cycle Development (ASLCD) Toolkit*
484484
*For more information: <https://github.com/MarkHazleton/spec-kit>*

.documentation/harvest-usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,5 +339,5 @@ If you encounter issues:
339339

340340
---
341341

342-
*Part of the Spec Kit - Spec-Driven Development Toolkit*
342+
*Part of Spec Kit Spark - Adaptive System Life Cycle Development (ASLCD) Toolkit*
343343
*For more information: <https://github.com/MarkHazleton/spec-kit>*

.documentation/pr-review-usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,5 +616,5 @@ If you encounter issues or have questions:
616616

617617
---
618618

619-
*Part of the Spec Kit - Spec-Driven Development Toolkit*
619+
*Part of Spec Kit Spark - Adaptive System Life Cycle Development (ASLCD) Toolkit*
620620
*For more information: <https://github.com/MarkHazleton/spec-kit>*

.documentation/site-audit-usage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,5 +401,5 @@ If you encounter issues:
401401

402402
---
403403

404-
*Part of the Spec Kit - Spec-Driven Development Toolkit*
404+
*Part of Spec Kit Spark - Adaptive System Life Cycle Development (ASLCD) Toolkit*
405405
*For more information: <https://github.com/MarkHazleton/spec-kit>*

.documentation/spec-driven-development.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,4 @@ Software development needs better tools for maintaining alignment between intent
238238

239239
---
240240

241-
> Part of the Spec Kit - Spec-Driven Development Toolkit
241+
> Part of Spec Kit Spark - Adaptive System Life Cycle Development (ASLCD) Toolkit

.github/workflows/release.yml

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ jobs:
3232
run: |
3333
chmod +x .github/workflows/scripts/get-next-version.sh
3434
.github/workflows/scripts/get-next-version.sh "${{ github.event.inputs.release_version || '' }}"
35+
- name: Validate release version matches pyproject.toml
36+
run: |
37+
pyproject_version=$(grep -oE '^[[:space:]]*version[[:space:]]*=[[:space:]]*"[0-9]+\.[0-9]+\.[0-9]+"' pyproject.toml | head -n1 | sed -E 's/.*"([0-9]+\.[0-9]+\.[0-9]+)"/\1/')
38+
if [ -z "$pyproject_version" ]; then
39+
echo "Unable to read version from pyproject.toml"
40+
exit 1
41+
fi
42+
43+
release_version="${{ steps.get_tag.outputs.new_version }}"
44+
release_version="${release_version#v}"
45+
46+
if [ "$pyproject_version" != "$release_version" ]; then
47+
echo "Version mismatch: pyproject.toml=$pyproject_version release=$release_version"
48+
echo "Update pyproject.toml before creating a release to keep Spec Kit Spark and Specify CLI in sync."
49+
exit 1
50+
fi
51+
52+
echo "Version parity check passed: $release_version"
3553
- name: Check if release already exists
3654
id: check_release
3755
run: |
@@ -57,9 +75,4 @@ jobs:
5775
.github/workflows/scripts/create-github-release.sh ${{ steps.get_tag.outputs.new_version }}
5876
env:
5977
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
60-
- name: Update version in pyproject.toml (for release artifacts only)
61-
if: steps.check_release.outputs.exists == 'false'
62-
run: |
63-
chmod +x .github/workflows/scripts/update-version.sh
64-
.github/workflows/scripts/update-version.sh ${{ steps.get_tag.outputs.new_version }}
6578

.github/workflows/scripts/README.md

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ This directory contains PowerShell versions of the GitHub Actions workflow scrip
1616
| `generate-release-notes.ps1` | Generate release notes from commits | `-NewVersion`, `-LastTag` |
1717
| `check-release-exists.ps1` | Check if release exists on GitHub | `-Version` |
1818
| `create-github-release.ps1` | Create GitHub release with packages | `-Version` |
19-
| `update-version.ps1` | Update pyproject.toml version | `-Version` |
2019
| `create-release-packages.ps1` | Create all agent template packages | `-Version` |
2120

2221
## Testing the Release Process Locally
@@ -61,16 +60,7 @@ This creates `release_notes.md` with your fork-specific branding.
6160

6261
This creates all agent-specific ZIP packages in `.genreleases/` directory.
6362

64-
### 5. Update pyproject.toml Version
65-
66-
```powershell
67-
.\.github\workflows\scripts\update-version.ps1 `
68-
-Version "v1.0.0"
69-
```
70-
71-
**Note:** This is typically only needed for PyPI releases.
72-
73-
### 6. Create GitHub Release (Requires `gh` CLI)
63+
### 5. Create GitHub Release (Requires `gh` CLI)
7464

7565
```powershell
7666
# Ensure you're authenticated with gh CLI
@@ -114,6 +104,8 @@ Write-Host ".\.github\workflows\scripts\create-github-release.ps1 -Version $vers
114104
- **GitHub Actions uses bash scripts** (`.sh` files) on `ubuntu-latest` runners
115105
- **PowerShell scripts** (`.ps1` files) are for local Windows testing only
116106
- Both versions are kept in sync for the same functionality
107+
- `pyproject.toml` is the single source of truth for release versioning
108+
- Explicit release versions must match `pyproject.toml` or the workflow will fail
117109
- Uses standard semantic versioning (vMAJOR.MINOR.PATCH)
118110

119111
## Differences from GitHub Actions

.github/workflows/scripts/generate-release-notes.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ if ($LastTag -eq "v0.0.0") {
4444
$releaseNotes = @"
4545
# Spec Kit Spark
4646
47-
A community extension of GitHub Spec Kit with constitution-powered commands for enhanced development workflows. Part of the WebSpark demonstration suite.
47+
Spec Kit Spark is an Adaptive System Life Cycle Development (ASLCD) toolkit with constitution-powered commands and right-sized workflows. Part of the WebSpark demonstration suite.
4848
4949
## Spark-Specific Features
5050
@@ -64,7 +64,7 @@ $commits
6464
6565
---
6666
67-
*Based on upstream GitHub Spec Kit. Spec Kit Spark is a community extension that may contain features not yet available in the upstream project.*
67+
*Maintained as a fork of github/spec-kit. Spec Kit Spark is independently evolved and may contain Spark-specific capabilities not present upstream.*
6868
"@
6969

7070
# Write to file

.github/workflows/scripts/generate-release-notes.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ fi
3030
cat > release_notes.md << EOF
3131
# Spec Kit Spark
3232
33-
A community extension of GitHub Spec Kit with constitution-powered commands for enhanced development workflows. Part of the WebSpark demonstration suite.
33+
Spec Kit Spark is an Adaptive System Life Cycle Development (ASLCD) toolkit with constitution-powered commands and right-sized workflows. Part of the WebSpark demonstration suite.
3434
3535
## Spark-Specific Features
3636
@@ -50,7 +50,7 @@ $COMMITS
5050
5151
---
5252
53-
*Based on upstream GitHub Spec Kit. Spec Kit Spark is a community extension that may contain features not yet available in the upstream project.*
53+
*Maintained as a fork of github/spec-kit. Spec Kit Spark is independently evolved and may contain Spark-specific capabilities not present upstream.*
5454
5555
EOF
5656

.github/workflows/scripts/get-next-version.ps1

Lines changed: 90 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,70 @@
22
#requires -Version 7.0
33
<#
44
.SYNOPSIS
5-
Calculate the next version based on the latest git tag
5+
Calculate the next release version
66
.DESCRIPTION
7-
Get-next-version.ps1 - Calculate the next version and output GitHub Actions variables
7+
Get-next-version.ps1 - Calculate the next version and output GitHub Actions variables.
8+
Behavior mirrors the bash workflow script:
9+
1. Explicit input version wins (and must match pyproject.toml when present)
10+
2. Otherwise, prefer pyproject.toml version when not already tagged
11+
3. Otherwise, increment the latest tag patch version
812
Uses standard semantic versioning (MAJOR.MINOR.PATCH)
13+
.PARAMETER ExplicitVersion
14+
Optional explicit version (e.g., 1.4.6 or v1.4.6)
915
.EXAMPLE
1016
.\get-next-version.ps1
17+
.EXAMPLE
18+
.\get-next-version.ps1 -ExplicitVersion "v1.4.6"
1119
#>
1220

21+
param(
22+
[string]$ExplicitVersion = ""
23+
)
24+
1325
$ErrorActionPreference = 'Stop'
1426

27+
function Normalize-Version {
28+
param([string]$Raw)
29+
30+
if (-not $Raw) {
31+
return $null
32+
}
33+
34+
$trimmed = $Raw -replace '^v', ''
35+
if ($trimmed -match '^\d+\.\d+\.\d+$') {
36+
return "v$trimmed"
37+
}
38+
39+
return $null
40+
}
41+
42+
function Get-PyprojectVersion {
43+
$pyprojectPath = "pyproject.toml"
44+
if (-not (Test-Path $pyprojectPath)) {
45+
return $null
46+
}
47+
48+
$match = Select-String -Path $pyprojectPath -Pattern '^\s*version\s*=\s*"(\d+\.\d+\.\d+)"' | Select-Object -First 1
49+
if ($match) {
50+
return "v$($match.Matches[0].Groups[1].Value)"
51+
}
52+
53+
return $null
54+
}
55+
56+
function Increment-PatchVersion {
57+
param([string]$Tag)
58+
59+
if ($Tag -match '^v(\d+)\.(\d+)\.(\d+)$') {
60+
$major = [int]$matches[1]
61+
$minor = [int]$matches[2]
62+
$patch = [int]$matches[3] + 1
63+
return "v$major.$minor.$patch"
64+
}
65+
66+
return "v1.0.0"
67+
}
68+
1569
# Get the latest tag, or use v0.0.0 if no tags exist
1670
try {
1771
$latestTag = git describe --tags --abbrev=0 2>$null
@@ -25,20 +79,42 @@ if ($env:GITHUB_OUTPUT) {
2579
}
2680
Write-Host "Latest tag: $latestTag"
2781

28-
# Parse semantic version
29-
if ($latestTag -match '^v(\d+)\.(\d+)\.(\d+)') {
30-
# Increment patch version
31-
$major = [int]$matches[1]
32-
$minor = [int]$matches[2]
33-
$patch = [int]$matches[3]
34-
$patch++
35-
$newVersion = "v$major.$minor.$patch"
36-
} else {
37-
# First release - start with v1.0.0
38-
$newVersion = "v1.0.0"
82+
# 1) Explicit manual input wins
83+
if ($ExplicitVersion) {
84+
$newVersion = Normalize-Version $ExplicitVersion
85+
if (-not $newVersion) {
86+
throw "Invalid explicit version '$ExplicitVersion'. Use MAJOR.MINOR.PATCH (optionally prefixed with v)."
87+
}
88+
89+
$pyprojectVersion = Get-PyprojectVersion
90+
if ($pyprojectVersion -and $newVersion -ne $pyprojectVersion) {
91+
throw "Explicit version '$newVersion' does not match pyproject.toml version '$pyprojectVersion'. Update pyproject.toml first to keep Spec Kit Spark and Specify CLI versions in sync."
92+
}
93+
94+
if ($env:GITHUB_OUTPUT) {
95+
"new_version=$newVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
96+
}
97+
Write-Host "New version will be: $newVersion (source: explicit input)"
98+
exit 0
3999
}
40100

101+
# 2) Prefer pyproject.toml version when present and not already tagged
102+
$pyprojectVersion = Get-PyprojectVersion
103+
if ($pyprojectVersion) {
104+
$tagExists = (& git rev-parse -q --verify "refs/tags/$pyprojectVersion" 2>$null)
105+
if (-not $tagExists) {
106+
if ($env:GITHUB_OUTPUT) {
107+
"new_version=$pyprojectVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
108+
}
109+
Write-Host "New version will be: $pyprojectVersion (source: pyproject.toml)"
110+
exit 0
111+
}
112+
}
113+
114+
# 3) Fallback: increment latest tag
115+
$newVersion = Increment-PatchVersion $latestTag
116+
41117
if ($env:GITHUB_OUTPUT) {
42118
"new_version=$newVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8
43119
}
44-
Write-Host "New version will be: $newVersion"
120+
Write-Host "New version will be: $newVersion (source: latest tag increment)"

0 commit comments

Comments
 (0)