specky-sdd 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.apm/hooks/scripts/ears-validator.sh +56 -17
- package/.apm/prompts/specky-api.prompt.md +1 -1
- package/.apm/prompts/specky-research.prompt.md +2 -2
- package/.apm/skills/research-analyst/SKILL.md +2 -2
- package/.apm/skills/specky-onboarding/SKILL.md +6 -4
- package/CHANGELOG.md +52 -0
- package/README.md +44 -8
- package/SECURITY.md +19 -9
- package/apm.yml +1 -1
- package/config.yml +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +5 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/index.js +32 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/update-check.d.ts +36 -0
- package/dist/cli/lib/update-check.d.ts.map +1 -0
- package/dist/cli/lib/update-check.js +165 -0
- package/dist/cli/lib/update-check.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/services/diagram-generator.d.ts +53 -4
- package/dist/services/diagram-generator.d.ts.map +1 -1
- package/dist/services/diagram-generator.js +565 -178
- package/dist/services/diagram-generator.js.map +1 -1
- package/dist/services/doc-generator.d.ts +44 -0
- package/dist/services/doc-generator.d.ts.map +1 -1
- package/dist/services/doc-generator.js +352 -50
- package/dist/services/doc-generator.js.map +1 -1
- package/dist/services/document-converter.d.ts +10 -7
- package/dist/services/document-converter.d.ts.map +1 -1
- package/dist/services/document-converter.js +113 -38
- package/dist/services/document-converter.js.map +1 -1
- package/dist/services/iac-generator.d.ts +31 -3
- package/dist/services/iac-generator.d.ts.map +1 -1
- package/dist/services/iac-generator.js +509 -41
- package/dist/services/iac-generator.js.map +1 -1
- package/dist/services/pbt-generator.d.ts +12 -0
- package/dist/services/pbt-generator.d.ts.map +1 -1
- package/dist/services/pbt-generator.js +296 -145
- package/dist/services/pbt-generator.js.map +1 -1
- package/dist/services/state-machine.d.ts +15 -1
- package/dist/services/state-machine.d.ts.map +1 -1
- package/dist/services/state-machine.js +21 -3
- package/dist/services/state-machine.js.map +1 -1
- package/dist/services/test-generator.d.ts +8 -0
- package/dist/services/test-generator.d.ts.map +1 -1
- package/dist/services/test-generator.js +134 -33
- package/dist/services/test-generator.js.map +1 -1
- package/dist/services/test-traceability-mapper.d.ts.map +1 -1
- package/dist/services/test-traceability-mapper.js +8 -3
- package/dist/services/test-traceability-mapper.js.map +1 -1
- package/dist/services/work-item-exporter.d.ts +70 -9
- package/dist/services/work-item-exporter.d.ts.map +1 -1
- package/dist/services/work-item-exporter.js +115 -53
- package/dist/services/work-item-exporter.js.map +1 -1
- package/dist/templates/checklist.md +2 -3
- package/dist/templates/cross-analysis.md +2 -4
- package/dist/tools/documentation.d.ts.map +1 -1
- package/dist/tools/documentation.js +9 -3
- package/dist/tools/documentation.js.map +1 -1
- package/dist/tools/environment.d.ts.map +1 -1
- package/dist/tools/environment.js +75 -12
- package/dist/tools/environment.js.map +1 -1
- package/dist/tools/infrastructure.d.ts.map +1 -1
- package/dist/tools/infrastructure.js +7 -39
- package/dist/tools/infrastructure.js.map +1 -1
- package/dist/tools/input.js +4 -4
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/integration.js +4 -4
- package/dist/tools/integration.js.map +1 -1
- package/dist/tools/pipeline.d.ts.map +1 -1
- package/dist/tools/pipeline.js +42 -4
- package/dist/tools/pipeline.js.map +1 -1
- package/dist/tools/quality.d.ts.map +1 -1
- package/dist/tools/quality.js +36 -9
- package/dist/tools/quality.js.map +1 -1
- package/dist/tools/testing.d.ts +10 -0
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/testing.js +66 -13
- package/dist/tools/testing.js.map +1 -1
- package/dist/tools/transcript.d.ts.map +1 -1
- package/dist/tools/transcript.js +66 -41
- package/dist/tools/transcript.js.map +1 -1
- package/dist/tools/utility.d.ts.map +1 -1
- package/dist/tools/utility.js +22 -12
- package/dist/tools/utility.js.map +1 -1
- package/dist/tools/visualization.d.ts +21 -0
- package/dist/tools/visualization.d.ts.map +1 -1
- package/dist/tools/visualization.js +130 -29
- package/dist/tools/visualization.js.map +1 -1
- package/package.json +5 -2
- package/templates/checklist.md +2 -3
- package/templates/cross-analysis.md +2 -4
|
@@ -3,36 +3,75 @@
|
|
|
3
3
|
# Target: Claude Code (.claude/hooks/)
|
|
4
4
|
# Type: Advisory | Trigger: PostToolUse | Phase: 2,3
|
|
5
5
|
# Paper: arXiv:2601.03878 — EARS quality
|
|
6
|
+
#
|
|
7
|
+
# Advisory hook: missing EARS pattern types WARN but exit 0 — exit 1 is
|
|
8
|
+
# reserved for real failures (SPECIFICATION.md missing or unreadable).
|
|
9
|
+
# Body is POSIX-sh compatible (runs under dash/sh as well as bash), so
|
|
10
|
+
# plain `set -eu` instead of bash-only `set -o pipefail`.
|
|
6
11
|
|
|
7
|
-
set -
|
|
12
|
+
set -eu
|
|
8
13
|
|
|
9
14
|
LATEST=$(ls -td .specs/*/ 2>/dev/null | head -1 || true)
|
|
10
15
|
[ -z "$LATEST" ] && exit 0
|
|
11
16
|
SPEC="$LATEST/SPECIFICATION.md"
|
|
12
|
-
|
|
17
|
+
|
|
18
|
+
if [ ! -f "$SPEC" ] || [ ! -r "$SPEC" ]; then
|
|
19
|
+
echo "❌ EARS Validation: $SPEC is missing or unreadable."
|
|
20
|
+
echo " sdd_write_spec should have produced it — re-run the Specify phase."
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
13
23
|
|
|
14
24
|
echo "🔍 EARS Validation: $SPEC"
|
|
15
25
|
|
|
16
|
-
# Count
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
# Count one EARS pattern (POSIX ERE for macOS/Linux portability).
|
|
27
|
+
# grep -c prints the count but exits 1 when the count is 0; the old
|
|
28
|
+
# `|| echo "0"` appended a SECOND "0" line to the captured value, which
|
|
29
|
+
# broke the arithmetic below (and the whole hook, under set -e) for any
|
|
30
|
+
# spec missing even one pattern type. Capture the count and swallow the
|
|
31
|
+
# exit status instead.
|
|
32
|
+
count_pattern() {
|
|
33
|
+
_count=$(grep -cE "$1" "$SPEC" 2>/dev/null) || _count="${_count:-0}"
|
|
34
|
+
printf '%s' "${_count:-0}"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
UBIQ=$(count_pattern 'The system shall')
|
|
38
|
+
EVENT=$(count_pattern 'When .*, the system shall')
|
|
39
|
+
STATE=$(count_pattern 'While .*, the system shall')
|
|
40
|
+
OPTION=$(count_pattern 'Where .*, the system shall')
|
|
41
|
+
UNWANTED=$(count_pattern 'If .*, then the system shall')
|
|
42
|
+
COMPLEX=$(count_pattern 'While .*, when .*, the system shall')
|
|
23
43
|
|
|
24
44
|
TOTAL=$((UBIQ + EVENT + STATE + OPTION + UNWANTED + COMPLEX))
|
|
25
|
-
REQS=$(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
echo "
|
|
45
|
+
REQS=$(count_pattern 'REQ-[A-Z]+-[0-9]+')
|
|
46
|
+
|
|
47
|
+
# Per-pattern coverage report
|
|
48
|
+
PRESENT=0
|
|
49
|
+
MISSING=""
|
|
50
|
+
report_pattern() {
|
|
51
|
+
# $1 = padded label, $2 = count, $3 = pattern name for the warning line
|
|
52
|
+
echo " $1 $2"
|
|
53
|
+
if [ "$2" -gt 0 ]; then
|
|
54
|
+
PRESENT=$((PRESENT + 1))
|
|
55
|
+
else
|
|
56
|
+
MISSING="$MISSING $3"
|
|
57
|
+
fi
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
report_pattern "Ubiquitous: " "$UBIQ" "ubiquitous"
|
|
61
|
+
report_pattern "Event-driven:" "$EVENT" "event-driven"
|
|
62
|
+
report_pattern "State-driven:" "$STATE" "state-driven"
|
|
63
|
+
report_pattern "Optional: " "$OPTION" "optional"
|
|
64
|
+
report_pattern "Unwanted: " "$UNWANTED" "unwanted-behavior"
|
|
65
|
+
report_pattern "Complex: " "$COMPLEX" "complex"
|
|
33
66
|
echo " ─────────────"
|
|
67
|
+
echo " Pattern coverage: $PRESENT/6 EARS pattern types present"
|
|
34
68
|
echo " EARS total: $TOTAL / $REQS requirements"
|
|
35
69
|
|
|
70
|
+
if [ -n "$MISSING" ]; then
|
|
71
|
+
echo "⚠️ Pattern types with zero requirements:$MISSING"
|
|
72
|
+
echo " Not every spec needs all 6 EARS patterns — advisory only."
|
|
73
|
+
fi
|
|
74
|
+
|
|
36
75
|
if [ "$TOTAL" -lt "$REQS" ]; then
|
|
37
76
|
echo "⚠️ $((REQS - TOTAL)) requirements may not follow EARS notation."
|
|
38
77
|
echo " Run sdd_validate_ears for detailed analysis."
|
|
@@ -12,4 +12,4 @@ Design an API using the Specky SDD pipeline.
|
|
|
12
12
|
Please:
|
|
13
13
|
1. Call @requirements-engineer to produce FRD + NFRD for the API
|
|
14
14
|
2. Call @sdd-init with project_type=api
|
|
15
|
-
3. Proceed through
|
|
15
|
+
3. Proceed through discover → specify → design phases
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Run SDD
|
|
2
|
+
description: Run SDD Discover phase (research)
|
|
3
3
|
---
|
|
4
|
-
Run the SDD
|
|
4
|
+
Run the SDD Discover phase (research) for feature [FEATURE NUMBER].
|
|
5
5
|
|
|
6
6
|
@research-analyst — scan the codebase, import relevant documents, run discovery questions, and produce RESEARCH.md.
|
|
@@ -214,10 +214,10 @@ Generate dependency graph and assess risk of each integration.
|
|
|
214
214
|
Structure the research artifact as:
|
|
215
215
|
|
|
216
216
|
```markdown
|
|
217
|
-
#
|
|
217
|
+
# Discovery Phase Report
|
|
218
218
|
**Project:** [name]
|
|
219
219
|
**Date:** [YYYY-MM-DD]
|
|
220
|
-
**Phase:** 1 -
|
|
220
|
+
**Phase:** 1 - Discover
|
|
221
221
|
**Status:** Complete
|
|
222
222
|
|
|
223
223
|
## Executive Summary
|
|
@@ -130,9 +130,9 @@ Check for:
|
|
|
130
130
|
|
|
131
131
|
**Utility (8):** sdd_get_status, sdd_get_template, sdd_write_bugfix, sdd_scan_codebase, sdd_amend, sdd_check_ecosystem, sdd_check_sync, sdd_metrics
|
|
132
132
|
|
|
133
|
-
**Governance (
|
|
133
|
+
**Governance (4):** sdd_model_routing, sdd_context_status, sdd_check_access, sdd_verify_audit
|
|
134
134
|
|
|
135
|
-
##
|
|
135
|
+
## 16 Hook Scripts
|
|
136
136
|
|
|
137
137
|
**Blocking (exit 2 = halt):**
|
|
138
138
|
- artifact-validator.sh — Prerequisite .md files exist
|
|
@@ -142,9 +142,11 @@ Check for:
|
|
|
142
142
|
|
|
143
143
|
**Advisory (exit 0 = warn):**
|
|
144
144
|
- branch-validator.sh — Branch matches phase expectations
|
|
145
|
-
-
|
|
146
|
-
-
|
|
145
|
+
- pipeline-guard.sh — Pipeline ordering / phase-skip guard
|
|
146
|
+
- lgtm-gate.sh — Human review reminder at Phases 2/4/5
|
|
147
|
+
- session-banner.sh — Session start pipeline-status banner
|
|
147
148
|
- spec-sync.sh — Detect spec-code drift
|
|
149
|
+
- auto-checkpoint.sh — Suggest checkpoint after writes
|
|
148
150
|
- spec-quality.sh — Specification quality metrics
|
|
149
151
|
- ears-validator.sh — EARS pattern compliance
|
|
150
152
|
- task-tracer.sh — Task dependency graph
|
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.7.0] - 2026-07-03
|
|
11
|
+
|
|
12
|
+
Update awareness: users of old versions now find out — without the server ever
|
|
13
|
+
phoning home.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Version-drift advisory (always on, zero network).** `specky doctor`, `specky status`, and the MCP server at startup compare the workspace's installed assets version (`.specky/install.json`) against the running CLI/server version and suggest `specky upgrade` when they differ — the common "updated the global CLI but the project still runs the old pinned server" case. Local file comparison only; stderr only; never blocks startup.
|
|
18
|
+
- **Once-daily update banner (CLI only, opt-out).** After `install`/`init`, `doctor`, `status`, `upgrade`, and `--version`, the CLI checks `https://registry.npmjs.org/specky-sdd/latest` (24h cache in `~/.specky/update-check.json`, 2s timeout, fail-silent offline) and prints `Update available: specky-sdd vX → vY → npm install -g specky-sdd@latest && specky upgrade`. **Never runs in `specky serve`** — the MCP server keeps making zero outbound calls. Disabled automatically in CI (`CI=true`); opt out with `SPECKY_NO_UPDATE_CHECK=1` or `update_check: false` in `.specky/config.yml` (not flipped by the enterprise profile). No telemetry — nothing is sent beyond the GET itself.
|
|
19
|
+
- `compareSemver`/`checkForUpdate` utilities with 37 dependency-injected tests (semver matrix incl. prereleases, cache TTL, opt-outs, offline/timeout, unwritable cache).
|
|
20
|
+
- Docs: README "Staying up to date" (banner, one-command upgrade, Renovate/Dependabot for per-project pins, GitHub Watch → Releases), CLI.md update-notifications section + `SPECKY_NO_UPDATE_CHECK`, INSTALL.md upgrading guidance, SECURITY.md precise network disclosure (server: zero outbound; CLI: the single optional registry GET).
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- `specky status` no longer crashes on a corrupt `.specky/install.json` (reports "metadata unreadable" instead).
|
|
25
|
+
|
|
26
|
+
## [3.6.0] - 2026-07-03
|
|
27
|
+
|
|
28
|
+
Delivery-honesty release. A black-box audit executed all 65 public product
|
|
29
|
+
promises against the real 3.5.0 server (`docs/AUDIT-DELIVERY-3.5.md` is the
|
|
30
|
+
full record: 30 delivered / 29 partial / 6 not delivered). This release fixes
|
|
31
|
+
every finding.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- **`sdd_auto_pipeline` fabricated its quality gate** (hard-coded `APPROVE`/100% — the same defect fixed for other paths in 3.4.0 had survived here). It now runs the shared `AnalysisEngine`: real decision, real coverage, requirement-level traceability matrix in `ANALYSIS.md`. Auto-generated packages honestly report `CHANGES_NEEDED` until traceability is complete.
|
|
36
|
+
- **`sdd_get_status` reported a stale phase** (it preferred a per-feature state file no pipeline tool writes and fell back to a fresh default). Headline fields (current phase, progress, gate decision, next action) now reflect the state the pipeline actually persists.
|
|
37
|
+
- **Phase-skip loophole**: with no registered feature, `sdd_advance_phase` skipped every artifact check and could walk six phases with zero artifacts. Advancing past init now requires a registered feature.
|
|
38
|
+
- **Generated tests now compile/run**: pytest output was a Python syntax error (JS-style header); junit class names didn't match filenames and had duplicate methods; xunit had duplicate members; vitest/jest/playwright emitted markdown ToC noise as tests, traced to a nonexistent `REQ-000`, and truncated the `REQ-` prefix. All fixed, with structural (and where possible compile) tests.
|
|
39
|
+
- **PBT generators produce runnable property tests**: valid `fast-check` import, self-contained bodies (no undefined helpers), meaningful assertions, and real REQ IDs (never fabricated `REQ-GEN-00N` — untraceable items are skipped or explicitly labeled `UNTRACED-`).
|
|
40
|
+
- **`sdd_verify_tests` coverage scanned the wrong directories** (always 0%): it now scans where `sdd_generate_tests` writes (via a generated-tests manifest), so the REQ→test mapping and `next_steps` use real numbers.
|
|
41
|
+
- **Doc generators derive real content**: the "first 15 lines" summarizer (which captured only frontmatter + ToC) was replaced with requirement-aware extraction — generated docs now contain the actual EARS requirements; the runbook is derived from `DESIGN.md` (was 100% static template); onboarding explains the feature; API docs extract request/response examples from the design contracts (were always `{}`) and no longer duplicate endpoints from mermaid blocks; the journey doc joined the parallel batch and failures surface in the response.
|
|
42
|
+
- **Diagrams**: `er`/`dfd` emitted invalid Mermaid (unsanitized ids) — fixed; `class`/`state`/`c4_code` were byte-identical stubs regardless of input — now derived from the artifacts; `pie` fabricated numbers — now computed; `gantt` was header-only from spec/design and used a date syntax real Mermaid rejects — fixed; `sequence` derivation is readable (`Client->>System` per requirement). `sdd_generate_all_diagrams` now **writes `DIAGRAMS.md`** (it returned diagrams but wrote nothing) and covers c4_context + state (18 diagrams). ToC headings are no longer treated as architecture components; `sdd_figma_diagram` types differ structurally with meaningful edge labels.
|
|
43
|
+
- **Binary document imports fail honestly**: real (compressed) PDF/DOCX/PPTX used to import as gibberish flagged "success". Unsupported binaries now return a clear error pointing to md/txt conversion or the MarkItDown MCP; `sdd_batch_import` counts them as failed.
|
|
44
|
+
- **`sdd_export_work_items` payloads are target-specific** (GitHub `{title, body, labels}` / Jira `{fields: {project.key, issuetype…}}` / Azure Boards `System.*` fields + `area_path`/`iteration_path`) and honor the documented inputs that were silently discarded (`project_key`, `include_subtasks`, …).
|
|
45
|
+
- **Persisted `[TODO:]` placeholders**: `CHECKLIST.md` and `CROSS_ANALYSIS.md` now render the real items/alignment tables and recommendation (the data existed only in the JSON response).
|
|
46
|
+
- **Terraform generation emits real resources** parsed from the `DESIGN.md` tech stack (was a provider-only skeleton with four generic modules); devcontainer/local-env/codespaces honor the documented DESIGN.md fallback detection (`additional_services` is no longer always empty); the Codespaces payload no longer references a nonexistent `create_codespace` MCP tool.
|
|
47
|
+
- **`ears-validator.sh` hook** no longer fails (exit 1) whenever a spec lacks one of the 6 EARS pattern types — it reports per-pattern coverage as an advisory.
|
|
48
|
+
- **`sdd_figma_to_spec`** payload referenced nonexistent tool names (`sdd_gen_spec` → `sdd_write_spec` etc.).
|
|
49
|
+
- Cognitive-debt gate instrumentation resolved artifact paths against the process cwd instead of the workspace root, silently degrading in hosted (HTTP) mode.
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
|
|
53
|
+
- **Opt-in server-side LGTM**: `pipeline.require_lgtm: true` in `.specky/config.yml` makes `sdd_advance_phase` refuse to pass the Specify/Design/Tasks gates without an explicit `lgtm: true` input. Default off; not flipped by the enterprise profile (human-review gating is a workflow choice, not a security control). Gate history records LGTM presence.
|
|
54
|
+
- **`docs/AUDIT-DELIVERY-3.5.md`** — the full promise-delivery audit as a public record.
|
|
55
|
+
- 6 new test suites (~112 new tests, 299 total) locking generated-content quality: compilable test output, valid Mermaid structure, target-specific export payloads, honest import failures, requirement-bearing docs, pipeline-state truthfulness.
|
|
56
|
+
|
|
57
|
+
### Container publishing docs
|
|
58
|
+
|
|
59
|
+
- Expanded GHCR/container documentation across README, install, enterprise deployment, and publishing guidance.
|
|
60
|
+
- Updated GHCR publish automation to preserve multi-arch `linux/amd64` + `linux/arm64` images.
|
|
61
|
+
|
|
10
62
|
## [3.5.0] - 2026-07-02
|
|
11
63
|
|
|
12
64
|
Enterprise mode — an **opt-in configuration profile** of the same 100%
|
package/README.md
CHANGED
|
@@ -51,13 +51,14 @@
|
|
|
51
51
|
| | [Where Specifications Live](#where-specifications-live) | File structure and naming conventions |
|
|
52
52
|
| | [Input Methods](#input-methods-6-ways-to-start) | 6 ways to feed Specky |
|
|
53
53
|
| | [Three Project Types](#three-project-types-one-pipeline) | Greenfield, Brownfield, Modernization |
|
|
54
|
+
| | [Staying up to date](#staying-up-to-date) | Update notifications and one-command upgrade |
|
|
54
55
|
| **Pipeline** | [Pipeline and LGTM Gates](#pipeline-and-lgtm-gates) | 10 phases with human review gates |
|
|
55
56
|
| | [All 58 Tools](#all-58-tools) | Complete tool reference by category |
|
|
56
57
|
| | [EARS Notation](#ears-notation) | The 6 requirement patterns |
|
|
57
58
|
| **Enterprise** | [Compliance Frameworks](#compliance-frameworks) | HIPAA, SOC2, GDPR, PCI-DSS, ISO 27001 |
|
|
58
59
|
| | [Enterprise Ready](#enterprise-ready) | Security, audit trail, quality gates |
|
|
59
60
|
| **Platform** | [The SDD Platform](#the-spec-driven-development-platform) | Built on Spec-Kit, everything included |
|
|
60
|
-
| | [Roadmap](#roadmap) | v3.
|
|
61
|
+
| | [Roadmap](#roadmap) | v3.7 current, v3.8+ planned |
|
|
61
62
|
|
|
62
63
|
|
|
63
64
|
## What is Specky?
|
|
@@ -173,7 +174,7 @@ Specky adds a **deterministic engine** between your intent and your code:
|
|
|
173
174
|
| Gitflow-SDD branching | spec/NNN → develop → stage → main |
|
|
174
175
|
| Unified CLI distribution | `npm install -g specky-sdd && specky install --ide=copilot` — one binary, multi-OS (macOS/Linux/Windows/WSL) |
|
|
175
176
|
| Works in any MCP host | VS Code + Copilot, Claude Code, Cursor, Windsurf, or any MCP client |
|
|
176
|
-
| Zero outbound
|
|
177
|
+
| Zero outbound calls from the MCP server | Air-gap friendly; code never leaves your machine. The CLI's once-daily update check is [opt-out](#staying-up-to-date) |
|
|
177
178
|
| MIT open source | Fork it, extend it, audit it. No vendor lock, no seat pricing |
|
|
178
179
|
|
|
179
180
|
|
|
@@ -352,7 +353,7 @@ The AI calls `sdd_import_document` → converts to Markdown, extracts sections,
|
|
|
352
353
|
|
|
353
354
|
The AI calls `sdd_batch_import` → processes every supported file in the directory.
|
|
354
355
|
|
|
355
|
-
> **
|
|
356
|
+
> **Honest note on binary formats:** the built-in extractor fully handles `md`/`txt` and simple uncompressed files. Real-world (compressed) PDF/DOCX/PPTX need one of: the optional `mammoth`/`pdfjs-dist` packages, or the recommended **MarkItDown MCP** integration. Since 3.6, unsupported binaries **fail with clear guidance** instead of silently importing garbage.
|
|
356
357
|
|
|
357
358
|
### 4. Figma Design (design-to-spec)
|
|
358
359
|
|
|
@@ -892,14 +893,38 @@ templates_path: ./my-templates # Override built-in templates
|
|
|
892
893
|
default_framework: vitest # Default test framework
|
|
893
894
|
compliance_frameworks: [hipaa, soc2] # Frameworks to check
|
|
894
895
|
audit_enabled: true # Enable audit trail
|
|
896
|
+
update_check: true # Once-daily CLI update check (set false to disable)
|
|
895
897
|
rbac:
|
|
896
898
|
enabled: false # Role checks (viewer/contributor/admin)
|
|
897
899
|
default_role: contributor
|
|
898
900
|
rate_limit:
|
|
899
901
|
enabled: false # HTTP token bucket (60 rpm, burst 10)
|
|
902
|
+
pipeline:
|
|
903
|
+
require_lgtm: false # Server-side LGTM: sdd_advance_phase refuses to pass
|
|
904
|
+
# the Specify/Design/Tasks gates unless lgtm: true
|
|
900
905
|
```
|
|
901
906
|
|
|
902
|
-
When `templates_path` is set, Specky uses your custom templates instead of the built-in ones. When `audit_enabled` is true, tool invocations are logged locally. `profile: enterprise` turns audit, RBAC, rate limiting, and fail-closed auditing on by default (explicit values win) — see [docs/ENTERPRISE-DEPLOYMENT.md](docs/ENTERPRISE-DEPLOYMENT.md).
|
|
907
|
+
When `templates_path` is set, Specky uses your custom templates instead of the built-in ones. When `audit_enabled` is true, tool invocations are logged locally. `profile: enterprise` turns audit, RBAC, rate limiting, and fail-closed auditing on by default (explicit values win) — see [docs/ENTERPRISE-DEPLOYMENT.md](docs/ENTERPRISE-DEPLOYMENT.md). With `pipeline.require_lgtm: true`, the LGTM quality gates become server-enforced instead of an agent convention: advancing past Specify/Design/Tasks requires the explicit `lgtm: true` input on `sdd_advance_phase`.
|
|
908
|
+
|
|
909
|
+
|
|
910
|
+
## Staying up to date
|
|
911
|
+
|
|
912
|
+
Specky tells you about new versions in two ways:
|
|
913
|
+
|
|
914
|
+
- **Version drift warning (always on, zero network):** `specky doctor` and `specky status` warn when the assets installed in your project differ from the version of the CLI running them, and suggest `specky upgrade`. The MCP server prints the same warning at startup. This is a local file comparison — no network involved.
|
|
915
|
+
- **Update banner (once daily):** after `install`, `doctor`, `status`, `upgrade`, or `--version`, the CLI checks the npm registry at most once per day and prints `Update available: vX → vY` when a newer release exists. This is a single GET to `registry.npmjs.org` — no telemetry, nothing sent beyond the request itself. It fails silently offline, is disabled in CI (`CI=true`), and **never runs in `specky serve`** — the MCP server itself never phones home.
|
|
916
|
+
|
|
917
|
+
Upgrading is one command:
|
|
918
|
+
|
|
919
|
+
```bash
|
|
920
|
+
npm install -g specky-sdd@latest && specky upgrade
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
`specky upgrade` matters: it refreshes the installed agents, prompts, skills, and hooks **and re-pins `.mcp.json` / `.vscode/mcp.json` to the new version** — updating the npm package alone leaves the MCP registration pointing at the old pinned server.
|
|
924
|
+
|
|
925
|
+
Teams pinning per-project (`npm install --save-dev specky-sdd`) should let [Renovate](https://docs.renovatebot.com/) or [Dependabot](https://docs.github.com/en/code-security/dependabot) propose the `package.json` bump. For release emails, use **Watch → Custom → Releases** on the [GitHub repo](https://github.com/paulasilvatech/specky).
|
|
926
|
+
|
|
927
|
+
**Opt out** of the registry check with `SPECKY_NO_UPDATE_CHECK=1` in the environment or `update_check: false` in `.specky/config.yml`. The drift warning stays on — it never touches the network.
|
|
903
928
|
|
|
904
929
|
|
|
905
930
|
## MCP Integration Architecture
|
|
@@ -997,7 +1022,7 @@ Specky is 100% open source (MIT) — enterprise mode is just an opt-in configura
|
|
|
997
1022
|
### Security Posture
|
|
998
1023
|
|
|
999
1024
|
- **3 runtime dependencies** — minimal attack surface (`@modelcontextprotocol/sdk`, `zod`, `yaml`)
|
|
1000
|
-
- **Zero outbound network requests** — all data stays local
|
|
1025
|
+
- **Zero outbound network requests from the MCP server** — all data stays local; the CLI's optional once-daily update check is the only network touch ([opt-out](#staying-up-to-date))
|
|
1001
1026
|
- **No `eval()` or dynamic code execution** — template rendering is string replacement only
|
|
1002
1027
|
- **Path traversal prevention**: FileManager sanitizes all paths, blocks `..` sequences
|
|
1003
1028
|
- **Zod `.strict()` validation** — every tool input is schema-validated; unknown fields rejected
|
|
@@ -1090,16 +1115,26 @@ npm run dev
|
|
|
1090
1115
|
# Verify MCP handshake (quick smoke test)
|
|
1091
1116
|
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | node dist/index.js 2>/dev/null
|
|
1092
1117
|
|
|
1093
|
-
#
|
|
1118
|
+
# Run the published image from GHCR (multi-arch: linux/amd64 + linux/arm64)
|
|
1119
|
+
docker pull ghcr.io/paulasilvatech/specky:latest # or pin a release: :3.6.0
|
|
1120
|
+
docker run --rm -p 3200:3200 ghcr.io/paulasilvatech/specky:latest
|
|
1121
|
+
curl http://localhost:3200/health # -> {"status":"ok","version":"3.6.0"}
|
|
1122
|
+
|
|
1123
|
+
# Or build and run locally from source
|
|
1094
1124
|
docker build -t specky-sdd:dev .
|
|
1095
1125
|
docker run -p 3200:3200 -v $(pwd):/workspace specky-sdd:dev
|
|
1096
1126
|
curl http://localhost:3200/health
|
|
1097
1127
|
```
|
|
1098
1128
|
|
|
1129
|
+
The published image binds `0.0.0.0:3200` inside the container (so `-p` works)
|
|
1130
|
+
and serves an unauthenticated `GET /health`. For hardened/authenticated
|
|
1131
|
+
deployments (enterprise profile, token auth, TLS proxy, private packages) see
|
|
1132
|
+
[docs/ENTERPRISE-DEPLOYMENT.md](docs/ENTERPRISE-DEPLOYMENT.md).
|
|
1133
|
+
|
|
1099
1134
|
|
|
1100
1135
|
## Roadmap
|
|
1101
1136
|
|
|
1102
|
-
### v3.
|
|
1137
|
+
### v3.7 (current)
|
|
1103
1138
|
|
|
1104
1139
|
| Capability | Status |
|
|
1105
1140
|
|------------|--------|
|
|
@@ -1134,8 +1169,9 @@ curl http://localhost:3200/health
|
|
|
1134
1169
|
| Enterprise profile (`profile: enterprise` — audit/RBAC/rate-limit defaults ON, opt-in) | Stable |
|
|
1135
1170
|
| Identity-based RBAC over HTTP (`SDD_HTTP_TOKENS_FILE`: token → principal + role) | Stable |
|
|
1136
1171
|
| Tamper-evident audit trail (HMAC-signed entries, fail-closed mode, `sdd_verify_audit`) | Stable |
|
|
1172
|
+
| Server-enforced LGTM gates (opt-in `pipeline.require_lgtm`) | Stable |
|
|
1137
1173
|
|
|
1138
|
-
### v3.
|
|
1174
|
+
### v3.8+ (planned)
|
|
1139
1175
|
|
|
1140
1176
|
| Feature | Description |
|
|
1141
1177
|
|---------|-------------|
|
package/SECURITY.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Supported |
|
|
6
6
|
| --- | --- |
|
|
7
|
-
| 3.
|
|
8
|
-
| 3.
|
|
9
|
-
| 3.0.x–3.
|
|
7
|
+
| 3.7.x | ✅ Active |
|
|
8
|
+
| 3.6.x | ✅ Security fixes only |
|
|
9
|
+
| 3.0.x–3.5.x | ❌ End of life |
|
|
10
10
|
| 2.x | ❌ End of life |
|
|
11
11
|
| 1.0.x | ❌ End of life |
|
|
12
12
|
|
|
@@ -46,9 +46,18 @@ AI Client → JSON-RPC → Zod .strict() validation → Service layer
|
|
|
46
46
|
|
|
47
47
|
Specky does **not** use `eval()`, `Function()`, `vm.runInNewContext()`, or any dynamic code execution. Template rendering uses string replacement only — no template engines that execute code.
|
|
48
48
|
|
|
49
|
-
###
|
|
49
|
+
### Network Calls
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
The **MCP server makes zero outbound network calls**. All data stays on the user's machine. It communicates only via stdio (JSON-RPC over stdin/stdout) or optional HTTP transport on localhost, and this holds unconditionally — `specky serve` never performs the update check described below.
|
|
52
|
+
|
|
53
|
+
The **CLI performs exactly one optional outbound call**: a once-daily `GET https://registry.npmjs.org/specky-sdd/latest` to detect new releases, run after `install`/`doctor`/`status`/`upgrade`/`--version` and shown as an `Update available: vX → vY` banner. This is not telemetry — nothing is sent beyond the HTTP request itself: no identifiers, no usage data, no payload. The check fails silently when offline and is disabled automatically in CI (`CI=true`).
|
|
54
|
+
|
|
55
|
+
Opt out with either:
|
|
56
|
+
|
|
57
|
+
- `SPECKY_NO_UPDATE_CHECK=1` in the environment, or
|
|
58
|
+
- `update_check: false` in `.specky/config.yml`
|
|
59
|
+
|
|
60
|
+
The local version-drift warning printed by `specky doctor`/`specky status` and at MCP server startup compares installed assets against the running version on disk — it involves no network at all.
|
|
52
61
|
|
|
53
62
|
### Dependency Minimalism
|
|
54
63
|
|
|
@@ -81,7 +90,7 @@ Runtime dependencies are kept intentionally small and are audited in CI.
|
|
|
81
90
|
| A07 Authentication Failures | stdio mode is process-isolated (no network). HTTP mode binds to `127.0.0.1` by default and supports optional bearer-token auth — a shared token (`SDD_HTTP_TOKEN`) or a named token table (`SDD_HTTP_TOKENS_FILE`, principal + RBAC role per token, sha256 storage supported) — all constant-time compared, plus DNS-rebinding protection |
|
|
82
91
|
| A08 Data Integrity Failures | Atomic file writes via FileManager; Zod schema enforcement |
|
|
83
92
|
| A09 Logging Failures | Structured stderr logging; no stdout pollution |
|
|
84
|
-
| A10 SSRF | Zero outbound
|
|
93
|
+
| A10 SSRF | Zero outbound requests from the MCP server; the CLI's once-daily update check fetches a fixed registry URL only — no user-controlled URLs |
|
|
85
94
|
|
|
86
95
|
## Dependency Auditing
|
|
87
96
|
|
|
@@ -106,6 +115,7 @@ We run `npm audit` in CI on every pull request. Any `high` or `critical` vulnera
|
|
|
106
115
|
| `SDD_HTTP_TOKENS_FILE` | Named token table → principal + RBAC role (identity-based auth) | unset |
|
|
107
116
|
| `SDD_AUDIT_HMAC_KEY` / `SDD_AUDIT_HMAC_KEY_FILE` | Sign audit entries (tamper evidence); keep the key outside the workspace | unset (chain only) |
|
|
108
117
|
| `SDD_ROLE` | Local RBAC role for stdio use — ignored on authenticated HTTP requests | `rbac.default_role` |
|
|
118
|
+
| `SPECKY_NO_UPDATE_CHECK` | Set to `1` to disable the CLI's once-daily update check — the package's only outbound call (see [Network Calls](#network-calls)) | unset (check enabled) |
|
|
109
119
|
|
|
110
120
|
HTTP transport (`--http`) binds to `127.0.0.1` by default. Binding to a non-loopback address requires an explicit `--host` and prints a warning. Set `SDD_HTTP_TOKEN` (shared token) or `SDD_HTTP_TOKENS_FILE` (named tokens mapping to principal + role) to require an `Authorization: Bearer <token>` header on every `/mcp` request (the `/health` probe stays open). Even so, do not expose Specky to public networks without a TLS-terminating reverse proxy. Hosted, air-gapped, and container deployment patterns: [docs/ENTERPRISE-DEPLOYMENT.md](docs/ENTERPRISE-DEPLOYMENT.md).
|
|
111
121
|
|
|
@@ -185,7 +195,7 @@ server {
|
|
|
185
195
|
|
|
186
196
|
These guarantees describe the intended product boundary. Known implementation gaps are tracked in [docs/DETERMINISM.md](docs/DETERMINISM.md) and [docs/ENTERPRISE-CONTROLS.md](docs/ENTERPRISE-CONTROLS.md).
|
|
187
197
|
|
|
188
|
-
- **No outbound network calls from core MCP tools** — optional external MCP integrations are returned as routing payloads for the AI client to execute.
|
|
198
|
+
- **No outbound network calls from core MCP tools** — optional external MCP integrations are returned as routing payloads for the AI client to execute. The CLI's once-daily update check (see [Network Calls](#network-calls)) is the package's only outbound call; it is opt-out and never runs in `specky serve`.
|
|
189
199
|
- **No dynamic code execution** — no `eval()`, `Function()`, or `vm.runInNewContext()` in the Specky core.
|
|
190
200
|
- **No credential storage by design** — no API keys, tokens, or passwords are intentionally stored by Specky.
|
|
191
201
|
- **Workspace-scoped I/O is the target boundary** — `FileManager.sanitizePath()` enforces this for core file operations; document import hardening is tracked as an enterprise remediation item.
|
|
@@ -212,7 +222,7 @@ Running `npx -y specky-sdd@latest` without a pinned version downloads the latest
|
|
|
212
222
|
|
|
213
223
|
```bash
|
|
214
224
|
# Install into a local vendor directory — no global write permissions needed
|
|
215
|
-
npm install specky-sdd@3.
|
|
225
|
+
npm install specky-sdd@3.6.0 --prefix ./vendor --ignore-scripts
|
|
216
226
|
./vendor/node_modules/.bin/specky install
|
|
217
227
|
./vendor/node_modules/.bin/specky doctor # integrity check
|
|
218
228
|
```
|
|
@@ -255,7 +265,7 @@ Specky addresses the 12 threat categories from the CoSAI MCP Security White Pape
|
|
|
255
265
|
| --- | --- | --- |
|
|
256
266
|
| M1 | Prompt Injection | No dynamic content in tool descriptions; outputs are structured JSON |
|
|
257
267
|
| M2 | Insecure Tool Design | Thin Tools / Fat Services — tools are pure input/output wrappers |
|
|
258
|
-
| M3 | Excessive Agency | No shell execution, no outbound network, no code eval |
|
|
268
|
+
| M3 | Excessive Agency | No shell execution, no outbound network from the MCP server, no code eval |
|
|
259
269
|
| M4 | Insufficient Authentication | HTTP mode delegates to reverse proxy; stdio is process-isolated |
|
|
260
270
|
| M5 | Broken Object-Level Authorization | RBAC engine enforces per-tool access by role (opt-in) |
|
|
261
271
|
| M6 | Sensitive Data Exposure | FileManager path boundary; no credential logging; workspace-scoped I/O |
|
package/apm.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: specky-sdd
|
|
2
|
-
version: 3.
|
|
2
|
+
version: 3.7.0
|
|
3
3
|
description: "Agentic Spec-Driven Development — 10-phase pipeline with 58 MCP tools, 13 agents, 22 prompts, 8 skills, 16 hooks, EARS notation, model routing, and enterprise security"
|
|
4
4
|
author: Paula Silva
|
|
5
5
|
license: MIT
|
package/config.yml
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoND,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkEpE"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
11
11
|
import { resolve } from "node:path";
|
|
12
|
+
import { VERSION } from "../../constants.js";
|
|
12
13
|
import { hashFile } from "../lib/asset-copier.js";
|
|
13
14
|
import { detectIde } from "../lib/ide-detect.js";
|
|
14
15
|
import { targetPaths } from "../lib/paths.js";
|
|
@@ -181,6 +182,10 @@ export async function runDoctor(opts) {
|
|
|
181
182
|
console.log(`[specky doctor] Lock version: ${lock.version} (generated ${lock.generated_at})`);
|
|
182
183
|
console.log(`[specky doctor] Files tracked: ${Object.keys(lock.files).length}`);
|
|
183
184
|
console.log(`[specky doctor] IDE scope: ${resolvedIde.ide} (${resolvedIde.detail})`);
|
|
185
|
+
// Version-drift advisory (zero network): installed assets vs running CLI.
|
|
186
|
+
if (installMeta?.version && installMeta.version !== VERSION) {
|
|
187
|
+
console.log(`[specky doctor] ⚠️ Version drift: installed assets are v${installMeta.version} but this CLI is v${VERSION} — run \`specky upgrade\` to refresh.`);
|
|
188
|
+
}
|
|
184
189
|
const integrity = verifyIntegrity(lock, targets.shared.specky);
|
|
185
190
|
printIntegrity(integrity, opts.verbose);
|
|
186
191
|
const checks = runConfigChecks(targets, workspace, resolvedIde.ide);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGpE"}
|
|
@@ -11,11 +11,26 @@ export async function runStatus(opts) {
|
|
|
11
11
|
console.log(`Specky v${VERSION}`);
|
|
12
12
|
console.log(`Workspace: ${workspace}`);
|
|
13
13
|
console.log("");
|
|
14
|
-
// Install info
|
|
14
|
+
// Install info (read defensively — a corrupt install.json must not crash status)
|
|
15
15
|
const installJson = resolve(t.shared.specky, "install.json");
|
|
16
|
+
let meta = null;
|
|
16
17
|
if (existsSync(installJson)) {
|
|
17
|
-
|
|
18
|
+
try {
|
|
19
|
+
meta = JSON.parse(readFileSync(installJson, "utf8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
meta = null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (meta) {
|
|
18
26
|
console.log(`Install: v${meta.version}, ide=${meta.ide}, at=${meta.installed_at}`);
|
|
27
|
+
// Version-drift advisory (zero network): installed assets vs running CLI.
|
|
28
|
+
if (meta.version && meta.version !== VERSION) {
|
|
29
|
+
console.log(`⚠️ Installed assets are v${meta.version} but this CLI is v${VERSION} — run \`specky upgrade\` to refresh.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (existsSync(installJson)) {
|
|
33
|
+
console.log("Install: metadata unreadable — run `npx specky doctor`");
|
|
19
34
|
}
|
|
20
35
|
else {
|
|
21
36
|
console.log("Install: NOT DETECTED — run `npx specky init`");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,iFAAiF;IACjF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7D,IAAI,IAAI,GAAqE,IAAI,CAAC;IAClF,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAIlD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACnF,0EAA0E;QAC1E,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,6BAA6B,IAAI,CAAC,OAAO,qBAAqB,OAAO,uCAAuC,CAC7G,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,cAAc,QAAQ,YAAY,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC1G,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,aAAa,OAAO,YAAY,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACrC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAMvD,CAAC;YACF,2EAA2E;YAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;YAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM;gBAC5B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;gBAC7E,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -139,6 +139,37 @@ async function dispatch(command, rest) {
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Commands after which the once-daily update banner may print. `serve` (and
|
|
144
|
+
* the legacy serve routing) is deliberately absent — the MCP server makes
|
|
145
|
+
* zero outbound calls, ever.
|
|
146
|
+
*/
|
|
147
|
+
const UPDATE_BANNER_COMMANDS = new Set([
|
|
148
|
+
"install", "init", "doctor", "status", "upgrade", "--version", "-v",
|
|
149
|
+
]);
|
|
150
|
+
/**
|
|
151
|
+
* Best-effort update banner (Layer 2 of update awareness). Runs AFTER the
|
|
152
|
+
* command so it can never delay or corrupt command output, prints to stderr
|
|
153
|
+
* only, and swallows every failure — the command's exit code is untouched.
|
|
154
|
+
*/
|
|
155
|
+
async function maybePrintUpdateBanner(command) {
|
|
156
|
+
if (!UPDATE_BANNER_COMMANDS.has(command))
|
|
157
|
+
return;
|
|
158
|
+
try {
|
|
159
|
+
const { loadConfig } = await import("../config.js");
|
|
160
|
+
// Workspace-level hard disable (.specky/config.yml). Absent file → default true.
|
|
161
|
+
if (!loadConfig(process.cwd()).update_check)
|
|
162
|
+
return;
|
|
163
|
+
const { checkForUpdate } = await import("./lib/update-check.js");
|
|
164
|
+
const latest = await checkForUpdate({});
|
|
165
|
+
if (latest) {
|
|
166
|
+
console.error(`Update available: specky-sdd v${VERSION} → v${latest} → npm install -g specky-sdd@latest && specky upgrade`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Never let the update check affect the command outcome.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
142
173
|
async function main() {
|
|
143
174
|
const binName = basename(process.argv[1] ?? "specky");
|
|
144
175
|
const args = process.argv.slice(2);
|
|
@@ -172,6 +203,7 @@ async function main() {
|
|
|
172
203
|
try {
|
|
173
204
|
const code = await dispatch(command, rest);
|
|
174
205
|
if (typeof code === "number" && command !== "serve") {
|
|
206
|
+
await maybePrintUpdateBanner(command);
|
|
175
207
|
process.exit(code);
|
|
176
208
|
}
|
|
177
209
|
}
|