Skip to content

Commit c3e368a

Browse files
authored
Merge branch 'github:main' into fix/copilot-ai-skills-filter
2 parents 8ac1cb2 + 9c0c144 commit c3e368a

8 files changed

Lines changed: 178 additions & 83 deletions

File tree

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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,12 @@ The following community-contributed extensions are available in [`catalog.commun
7575
| Archive Extension | Archive merged features into main project memory. | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
7676
| 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) |
7777
| 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) |
78-
| 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) |
7980
| 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) |
8081
| 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) |
8182
| 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) |
8284
| Ralph Loop | Autonomous implementation loop using AI agent CLI | [spec-kit-ralph](https://github.com/Rubiss/spec-kit-ralph) |
8385
| Reconcile Extension | Reconcile implementation drift by surgically updating feature artifacts. | [spec-kit-reconcile](https://github.com/stn1slv/spec-kit-reconcile) |
8486
| 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) |

extensions/catalog.community.json

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_version": "1.0",
3-
"updated_at": "2026-03-14T00: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": {
66
"archive": {
@@ -105,13 +105,57 @@
105105
"created_at": "2026-02-22T00:00:00Z",
106106
"updated_at": "2026-02-22T00:00:00Z"
107107
},
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+
},
108152
"docguard": {
109-
"name": "DocGuard CDD Enforcement",
153+
"name": "DocGuard \u2014 CDD Enforcement",
110154
"id": "docguard",
111-
"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.",
112156
"author": "raccioly",
113-
"version": "0.8.0",
114-
"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",
115159
"repository": "https://github.com/raccioly/docguard",
116160
"homepage": "https://www.npmjs.com/package/docguard-cli",
117161
"documentation": "https://github.com/raccioly/docguard/blob/main/extensions/spec-kit-docguard/README.md",
@@ -129,7 +173,7 @@
129173
},
130174
"provides": {
131175
"commands": 6,
132-
"hooks": 1
176+
"hooks": 3
133177
},
134178
"tags": [
135179
"documentation",
@@ -139,13 +183,13 @@
139183
"traceability",
140184
"ai-agents",
141185
"enforcement",
142-
"scoring"
186+
"spec-kit"
143187
],
144188
"verified": false,
145189
"downloads": 0,
146190
"stars": 0,
147191
"created_at": "2026-03-13T00:00:00Z",
148-
"updated_at": "2026-03-13T00:00:00Z"
192+
"updated_at": "2026-03-15T20:00:00Z"
149193
},
150194
"doctor": {
151195
"name": "Project Health Check",
@@ -413,7 +457,7 @@
413457
"understanding": {
414458
"name": "Understanding",
415459
"id": "understanding",
416-
"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.",
460+
"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.",
417461
"author": "Ladislav Bihari",
418462
"version": "3.4.0",
419463
"download_url": "https://github.com/Testimonial/understanding/archive/refs/tags/v3.4.0.zip",
@@ -451,6 +495,38 @@
451495
"created_at": "2026-03-07T00:00:00Z",
452496
"updated_at": "2026-03-07T00:00:00Z"
453497
},
498+
"status": {
499+
"name": "Project Status",
500+
"id": "status",
501+
"description": "Show current SDD workflow progress — active feature, artifact status, task completion, workflow phase, and extensions summary.",
502+
"author": "KhawarHabibKhan",
503+
"version": "1.0.0",
504+
"download_url": "https://github.com/KhawarHabibKhan/spec-kit-status/archive/refs/tags/v1.0.0.zip",
505+
"repository": "https://github.com/KhawarHabibKhan/spec-kit-status",
506+
"homepage": "https://github.com/KhawarHabibKhan/spec-kit-status",
507+
"documentation": "https://github.com/KhawarHabibKhan/spec-kit-status/blob/main/README.md",
508+
"changelog": "https://github.com/KhawarHabibKhan/spec-kit-status/blob/main/CHANGELOG.md",
509+
"license": "MIT",
510+
"requires": {
511+
"speckit_version": ">=0.1.0"
512+
},
513+
"provides": {
514+
"commands": 1,
515+
"hooks": 0
516+
},
517+
"tags": [
518+
"status",
519+
"workflow",
520+
"progress",
521+
"feature-tracking",
522+
"task-progress"
523+
],
524+
"verified": false,
525+
"downloads": 0,
526+
"stars": 0,
527+
"created_at": "2026-03-16T00:00:00Z",
528+
"updated_at": "2026-03-16T00:00:00Z"
529+
},
454530
"v-model": {
455531
"name": "V-Model Extension Pack",
456532
"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)