Skip to content

Commit 7b6e84b

Browse files
authored
Merge branch 'main' into add-status-extension
2 parents 2c7b8dd + 9c0c144 commit 7b6e84b

File tree

10 files changed

+269
-83
lines changed

10 files changed

+269
-83
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ See Spec-Driven Development in action across different scenarios with these comm
158158

159159
- **[Brownfield Java runtime extension](https://github.com/mnriem/spec-kit-java-brownfield-demo)** — Extends an existing open-source Jakarta EE runtime (Piranha, ~420,000 lines of Java, XML, JSP, HTML, and config files across 180 Maven modules) with a password-protected Server Admin Console, demonstrating spec-kit on a large multi-module Java project with no prior specs or constitution.
160160

161+
- **[Brownfield Go / React dashboard demo](https://github.com/mnriem/spec-kit-go-brownfield-demo)** — Demonstrates spec-kit driven entirely from the **terminal using GitHub Copilot CLI**. Extends NASA's open-source Hermes ground support system (Go) with a lightweight React-based web telemetry dashboard, showing that the full constitution → specify → plan → tasks → implement workflow works from the terminal.
162+
161163
## 🤖 Supported AI Agents
162164

163165
| Agent | Support | Notes |

extensions/README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,17 @@ The following community-contributed extensions are available in [`catalog.commun
7272

7373
| Extension | Purpose | URL |
7474
|-----------|---------|-----|
75+
| Archive Extension | Archive merged features into main project memory. | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
7576
| Azure DevOps Integration | Sync user stories and tasks to Azure DevOps work items using OAuth authentication | [spec-kit-azure-devops](https://github.com/pragya247/spec-kit-azure-devops) |
7677
| Cleanup Extension | Post-implementation quality gate that reviews changes, fixes small issues (scout rule), creates tasks for medium issues, and generates analysis for large issues | [spec-kit-cleanup](https://github.com/dsrednicki/spec-kit-cleanup) |
77-
| DocGuard — CDD Enforcement | Canonical-Driven Development enforcement. Generates, validates, scores, and traces project documentation against 92 automated checks with config-aware traceability, quality labels, and AI-ready fix prompts. Zero dependencies. | [spec-kit-docguard](https://github.com/raccioly/docguard) |
78+
| Cognitive Squad | 19-function cognitive agent squad for autonomous pre-code analysis — 7 core agents, 7 specialists, 4 learning functions with feedback loop | [cognitive-squad](https://github.com/Testimonial/cognitive-squad) |
79+
| DocGuard — CDD Enforcement | Canonical-Driven Development enforcement. Validates, scores, and traces project documentation with automated checks, AI-driven workflows, and spec-kit hooks. Zero dependencies. | [spec-kit-docguard](https://github.com/raccioly/docguard) |
7880
| Fleet Orchestrator | Orchestrate a full feature lifecycle with human-in-the-loop gates across all SpecKit phases | [spec-kit-fleet](https://github.com/sharathsatish/spec-kit-fleet) |
7981
| Jira Integration | Create Jira Epics, Stories, and Issues from spec-kit specifications and task breakdowns with configurable hierarchy and custom field support | [spec-kit-jira](https://github.com/mbachorik/spec-kit-jira) |
8082
| Project Health Check | Diagnose a Spec Kit project and report health issues across structure, agents, features, scripts, extensions, and git | [spec-kit-doctor](https://github.com/KhawarHabibKhan/spec-kit-doctor) |
83+
| Project Status | Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary | [spec-kit-status](https://github.com/KhawarHabibKhan/spec-kit-status) |
8184
| Ralph Loop | Autonomous implementation loop using AI agent CLI | [spec-kit-ralph](https://github.com/Rubiss/spec-kit-ralph) |
85+
| Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) |
8286
| Retrospective Extension | Post-implementation retrospective with spec adherence scoring, drift analysis, and human-gated spec updates | [spec-kit-retrospective](https://github.com/emi-dm/spec-kit-retrospective) |
8387
| Review Extension | Post-implementation comprehensive code review with specialized agents for code quality, comments, tests, error handling, type design, and simplification | [spec-kit-review](https://github.com/ismaelJimenez/spec-kit-review) |
8488
| Project Status | Display project status, feature progress, and recommended next actions across the spec-driven development workflow | [spec-kit-status](https://github.com/Open-Agent-Tools/spec-kit-status) |

extensions/catalog.community.json

Lines changed: 147 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,39 @@
11
{
22
"schema_version": "1.0",
3-
"updated_at": "2026-03-15T00:00:00Z",
3+
"updated_at": "2026-03-16T00:00:00Z",
44
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
55
"extensions": {
6+
"archive": {
7+
"name": "Archive Extension",
8+
"id": "archive",
9+
"description": "Archive merged features into main project memory, resolving gaps and conflicts.",
10+
"author": "Stanislav Deviatov",
11+
"version": "1.0.0",
12+
"download_url": "https://github.com/stn1slv/spec-kit-archive/archive/refs/tags/v1.0.0.zip",
13+
"repository": "https://github.com/stn1slv/spec-kit-archive",
14+
"homepage": "https://github.com/stn1slv/spec-kit-archive",
15+
"documentation": "https://github.com/stn1slv/spec-kit-archive/blob/main/README.md",
16+
"changelog": "https://github.com/stn1slv/spec-kit-archive/blob/main/CHANGELOG.md",
17+
"license": "MIT",
18+
"requires": {
19+
"speckit_version": ">=0.1.0"
20+
},
21+
"provides": {
22+
"commands": 1,
23+
"hooks": 0
24+
},
25+
"tags": [
26+
"archive",
27+
"memory",
28+
"merge",
29+
"changelog"
30+
],
31+
"verified": false,
32+
"downloads": 0,
33+
"stars": 0,
34+
"created_at": "2026-03-14T00:00:00Z",
35+
"updated_at": "2026-03-14T00:00:00Z"
36+
},
637
"azure-devops": {
738
"name": "Azure DevOps Integration",
839
"id": "azure-devops",
@@ -74,13 +105,57 @@
74105
"created_at": "2026-02-22T00:00:00Z",
75106
"updated_at": "2026-02-22T00:00:00Z"
76107
},
108+
"cognitive-squad": {
109+
"name": "Cognitive Squad",
110+
"id": "cognitive-squad",
111+
"description": "19-function cognitive agent squad for autonomous pre-code analysis — 7 core agents, 7 specialists, 4 learning functions with feedback loop",
112+
"author": "Testimonial",
113+
"version": "0.1.0",
114+
"download_url": "https://github.com/Testimonial/cognitive-squad/archive/refs/tags/v0.1.0.zip",
115+
"repository": "https://github.com/Testimonial/cognitive-squad",
116+
"homepage": "https://github.com/Testimonial/cognitive-squad",
117+
"documentation": "https://github.com/Testimonial/cognitive-squad/blob/main/README.md",
118+
"changelog": "https://github.com/Testimonial/cognitive-squad/blob/main/CHANGELOG.md",
119+
"license": "MIT",
120+
"requires": {
121+
"speckit_version": ">=0.3.0",
122+
"tools": [
123+
{
124+
"name": "understanding",
125+
"version": ">=3.4.0",
126+
"required": false
127+
},
128+
{
129+
"name": "spec-kit-reverse-eng",
130+
"version": ">=1.0.0",
131+
"required": false
132+
}
133+
]
134+
},
135+
"provides": {
136+
"commands": 7,
137+
"hooks": 1
138+
},
139+
"tags": [
140+
"ai-agents",
141+
"cognitive",
142+
"pre-code",
143+
"analysis",
144+
"multi-agent"
145+
],
146+
"verified": false,
147+
"downloads": 0,
148+
"stars": 0,
149+
"created_at": "2026-03-16T00:00:00Z",
150+
"updated_at": "2026-03-16T00:00:00Z"
151+
},
77152
"docguard": {
78-
"name": "DocGuard CDD Enforcement",
153+
"name": "DocGuard \u2014 CDD Enforcement",
79154
"id": "docguard",
80-
"description": "Canonical-Driven Development enforcement. Generates, validates, scores, and traces project documentation against 92 automated checks. Zero dependencies.",
155+
"description": "Canonical-Driven Development enforcement. Validates, scores, and traces project documentation with automated checks, AI-driven workflows, and spec-kit hooks. Zero dependencies.",
81156
"author": "raccioly",
82-
"version": "0.8.0",
83-
"download_url": "https://github.com/raccioly/docguard/releases/download/v0.8.0/spec-kit-docguard-v0.8.0.zip",
157+
"version": "0.9.8",
158+
"download_url": "https://github.com/raccioly/docguard/releases/download/v0.9.8/spec-kit-docguard-v0.9.8.zip",
84159
"repository": "https://github.com/raccioly/docguard",
85160
"homepage": "https://www.npmjs.com/package/docguard-cli",
86161
"documentation": "https://github.com/raccioly/docguard/blob/main/extensions/spec-kit-docguard/README.md",
@@ -98,7 +173,7 @@
98173
},
99174
"provides": {
100175
"commands": 6,
101-
"hooks": 1
176+
"hooks": 3
102177
},
103178
"tags": [
104179
"documentation",
@@ -108,13 +183,13 @@
108183
"traceability",
109184
"ai-agents",
110185
"enforcement",
111-
"scoring"
186+
"spec-kit"
112187
],
113188
"verified": false,
114189
"downloads": 0,
115190
"stars": 0,
116191
"created_at": "2026-03-13T00:00:00Z",
117-
"updated_at": "2026-03-13T00:00:00Z"
192+
"updated_at": "2026-03-15T20:00:00Z"
118193
},
119194
"doctor": {
120195
"name": "Project Health Check",
@@ -250,6 +325,37 @@
250325
"created_at": "2026-03-09T00:00:00Z",
251326
"updated_at": "2026-03-09T00:00:00Z"
252327
},
328+
"reconcile": {
329+
"name": "Reconcile Extension",
330+
"id": "reconcile",
331+
"description": "Reconcile implementation drift by surgically updating the feature's own spec, plan, and tasks.",
332+
"author": "Stanislav Deviatov",
333+
"version": "1.0.0",
334+
"download_url": "https://github.com/stn1slv/spec-kit-reconcile/archive/refs/tags/v1.0.0.zip",
335+
"repository": "https://github.com/stn1slv/spec-kit-reconcile",
336+
"homepage": "https://github.com/stn1slv/spec-kit-reconcile",
337+
"documentation": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/README.md",
338+
"changelog": "https://github.com/stn1slv/spec-kit-reconcile/blob/main/CHANGELOG.md",
339+
"license": "MIT",
340+
"requires": {
341+
"speckit_version": ">=0.1.0"
342+
},
343+
"provides": {
344+
"commands": 1,
345+
"hooks": 0
346+
},
347+
"tags": [
348+
"reconcile",
349+
"drift",
350+
"tasks",
351+
"remediation"
352+
],
353+
"verified": false,
354+
"downloads": 0,
355+
"stars": 0,
356+
"created_at": "2026-03-14T00:00:00Z",
357+
"updated_at": "2026-03-14T00:00:00Z"
358+
},
253359
"retrospective": {
254360
"name": "Retrospective Extension",
255361
"id": "retrospective",
@@ -382,7 +488,7 @@
382488
"understanding": {
383489
"name": "Understanding",
384490
"id": "understanding",
385-
"description": "Automated requirements quality analysis validates specs against IEEE/ISO standards using 31 deterministic metrics. Catches ambiguity, missing testability, and structural issues before they reach implementation. Includes experimental energy-based ambiguity detection using local LM token perplexity.",
491+
"description": "Automated requirements quality analysis \u2014 validates specs against IEEE/ISO standards using 31 deterministic metrics. Catches ambiguity, missing testability, and structural issues before they reach implementation. Includes experimental energy-based ambiguity detection using local LM token perplexity.",
386492
"author": "Ladislav Bihari",
387493
"version": "3.4.0",
388494
"download_url": "https://github.com/Testimonial/understanding/archive/refs/tags/v3.4.0.zip",
@@ -420,6 +526,38 @@
420526
"created_at": "2026-03-07T00:00:00Z",
421527
"updated_at": "2026-03-07T00:00:00Z"
422528
},
529+
"status": {
530+
"name": "Project Status",
531+
"id": "status",
532+
"description": "Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary.",
533+
"author": "KhawarHabibKhan",
534+
"version": "1.0.0",
535+
"download_url": "https://github.com/KhawarHabibKhan/spec-kit-status/archive/refs/tags/v1.0.0.zip",
536+
"repository": "https://github.com/KhawarHabibKhan/spec-kit-status",
537+
"homepage": "https://github.com/KhawarHabibKhan/spec-kit-status",
538+
"documentation": "https://github.com/KhawarHabibKhan/spec-kit-status/blob/main/README.md",
539+
"changelog": "https://github.com/KhawarHabibKhan/spec-kit-status/blob/main/CHANGELOG.md",
540+
"license": "MIT",
541+
"requires": {
542+
"speckit_version": ">=0.1.0"
543+
},
544+
"provides": {
545+
"commands": 1,
546+
"hooks": 0
547+
},
548+
"tags": [
549+
"status",
550+
"workflow",
551+
"progress",
552+
"feature-tracking",
553+
"task-progress"
554+
],
555+
"verified": false,
556+
"downloads": 0,
557+
"stars": 0,
558+
"created_at": "2026-03-16T00:00:00Z",
559+
"updated_at": "2026-03-16T00:00:00Z"
560+
},
423561
"v-model": {
424562
"name": "V-Model Extension Pack",
425563
"id": "v-model",

scripts/bash/check-prerequisites.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ if $JSON_MODE; then
168168
if [[ ${#docs[@]} -eq 0 ]]; then
169169
json_docs="[]"
170170
else
171-
json_docs=$(printf '"%s",' "${docs[@]}")
171+
json_docs=$(for d in "${docs[@]}"; do printf '"%s",' "$(json_escape "$d")"; done)
172172
json_docs="[${json_docs%,}]"
173173
fi
174174
printf '{"FEATURE_DIR":"%s","AVAILABLE_DOCS":%s}\n' "$(json_escape "$FEATURE_DIR")" "$json_docs"

scripts/bash/common.sh

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,18 @@ has_jq() {
161161
}
162162

163163
# Escape a string for safe embedding in a JSON value (fallback when jq is unavailable).
164-
# Handles backslash, double-quote, and control characters (newline, tab, carriage return).
164+
# Handles backslash, double-quote, and JSON-required control character escapes (RFC 8259).
165165
json_escape() {
166166
local s="$1"
167167
s="${s//\\/\\\\}"
168168
s="${s//\"/\\\"}"
169169
s="${s//$'\n'/\\n}"
170170
s="${s//$'\t'/\\t}"
171171
s="${s//$'\r'/\\r}"
172+
s="${s//$'\b'/\\b}"
173+
s="${s//$'\f'/\\f}"
174+
# Strip remaining control characters (U+0000–U+001F) not individually escaped above
175+
s=$(printf '%s' "$s" | tr -d '\000-\007\013\016-\037')
172176
printf '%s' "$s"
173177
}
174178

@@ -194,9 +198,11 @@ resolve_template() {
194198
if [ -d "$presets_dir" ]; then
195199
local registry_file="$presets_dir/.registry"
196200
if [ -f "$registry_file" ] && command -v python3 >/dev/null 2>&1; then
197-
# Read preset IDs sorted by priority (lower number = higher precedence)
198-
local sorted_presets
199-
sorted_presets=$(SPECKIT_REGISTRY="$registry_file" python3 -c "
201+
# Read preset IDs sorted by priority (lower number = higher precedence).
202+
# The python3 call is wrapped in an if-condition so that set -e does not
203+
# abort the function when python3 exits non-zero (e.g. invalid JSON).
204+
local sorted_presets=""
205+
if sorted_presets=$(SPECKIT_REGISTRY="$registry_file" python3 -c "
200206
import json, sys, os
201207
try:
202208
with open(os.environ['SPECKIT_REGISTRY']) as f:
@@ -206,14 +212,17 @@ try:
206212
print(pid)
207213
except Exception:
208214
sys.exit(1)
209-
" 2>/dev/null)
210-
if [ $? -eq 0 ] && [ -n "$sorted_presets" ]; then
211-
while IFS= read -r preset_id; do
212-
local candidate="$presets_dir/$preset_id/templates/${template_name}.md"
213-
[ -f "$candidate" ] && echo "$candidate" && return 0
214-
done <<< "$sorted_presets"
215+
" 2>/dev/null); then
216+
if [ -n "$sorted_presets" ]; then
217+
# python3 succeeded and returned preset IDs — search in priority order
218+
while IFS= read -r preset_id; do
219+
local candidate="$presets_dir/$preset_id/templates/${template_name}.md"
220+
[ -f "$candidate" ] && echo "$candidate" && return 0
221+
done <<< "$sorted_presets"
222+
fi
223+
# python3 succeeded but registry has no presets — nothing to search
215224
else
216-
# python3 returned empty list — fall through to directory scan
225+
# python3 failed (missing, or registry parse error) — fall back to unordered directory scan
217226
for preset in "$presets_dir"/*/; do
218227
[ -d "$preset" ] || continue
219228
local candidate="$preset/templates/${template_name}.md"
@@ -246,8 +255,9 @@ except Exception:
246255
local core="$base/${template_name}.md"
247256
[ -f "$core" ] && echo "$core" && return 0
248257

249-
# Return success with empty output so callers using set -e don't abort;
250-
# callers check [ -n "$TEMPLATE" ] to detect "not found".
251-
return 0
258+
# Template not found in any location.
259+
# Return 1 so callers can distinguish "not found" from "found".
260+
# Callers running under set -e should use: TEMPLATE=$(resolve_template ...) || true
261+
return 1
252262
}
253263

scripts/bash/create-new-feature.sh

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,6 @@ clean_branch_name() {
162162
echo "$name" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/^-//' | sed 's/-$//'
163163
}
164164

165-
# Escape a string for safe embedding in a JSON value (fallback when jq is unavailable).
166-
json_escape() {
167-
local s="$1"
168-
s="${s//\\/\\\\}"
169-
s="${s//\"/\\\"}"
170-
s="${s//$'\n'/\\n}"
171-
s="${s//$'\t'/\\t}"
172-
s="${s//$'\r'/\\r}"
173-
printf '%s' "$s"
174-
}
175-
176165
# Resolve repository root. Prefer git information when available, but fall back
177166
# to searching for repository markers so the workflow still functions in repositories that
178167
# were initialised with --no-git.
@@ -308,9 +297,14 @@ fi
308297
FEATURE_DIR="$SPECS_DIR/$BRANCH_NAME"
309298
mkdir -p "$FEATURE_DIR"
310299

311-
TEMPLATE=$(resolve_template "spec-template" "$REPO_ROOT")
300+
TEMPLATE=$(resolve_template "spec-template" "$REPO_ROOT") || true
312301
SPEC_FILE="$FEATURE_DIR/spec.md"
313-
if [ -n "$TEMPLATE" ] && [ -f "$TEMPLATE" ]; then cp "$TEMPLATE" "$SPEC_FILE"; else touch "$SPEC_FILE"; fi
302+
if [ -n "$TEMPLATE" ] && [ -f "$TEMPLATE" ]; then
303+
cp "$TEMPLATE" "$SPEC_FILE"
304+
else
305+
echo "Warning: Spec template not found; created empty spec file" >&2
306+
touch "$SPEC_FILE"
307+
fi
314308

315309
# Inform the user how to persist the feature variable in their own shell
316310
printf '# To persist: export SPECIFY_FEATURE=%q\n' "$BRANCH_NAME" >&2

scripts/bash/setup-plan.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ check_feature_branch "$CURRENT_BRANCH" "$HAS_GIT" || exit 1
3939
mkdir -p "$FEATURE_DIR"
4040

4141
# Copy plan template if it exists
42-
TEMPLATE=$(resolve_template "plan-template" "$REPO_ROOT")
42+
TEMPLATE=$(resolve_template "plan-template" "$REPO_ROOT") || true
4343
if [[ -n "$TEMPLATE" ]] && [[ -f "$TEMPLATE" ]]; then
4444
cp "$TEMPLATE" "$IMPL_PLAN"
4545
echo "Copied plan template to $IMPL_PLAN"

0 commit comments

Comments
 (0)