specweave 1.0.567 → 1.0.569

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "1.0.567",
3
+ "version": "1.0.569",
4
4
  "description": "100+ domain-expert AI skills — PM, Architect, Frontend, QA, Security and more. Skills learn your team's patterns permanently. Spec-first planning, autonomous execution, multi-agent teams, synced to GitHub/JIRA. Claude Code, Cursor, Copilot & more.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,7 +12,7 @@ argument-hint: "[INCREMENT_IDS...] [OPTIONS]"
12
12
 
13
13
  ## Project Context
14
14
 
15
- !`.specweave/scripts/skill-context.sh auto 2>/dev/null || true`
15
+ **Project Context**: If `.specweave/config.json` exists, read it for testing mode, TDD enforcement, and multi-project settings. Check for active increments in `.specweave/increments/*/metadata.json`.
16
16
 
17
17
  **Start autonomous execution session using Claude Code's Stop Hook.**
18
18
 
@@ -11,7 +11,7 @@ argument-hint: "<increment-id>"
11
11
 
12
12
  ## Project Context
13
13
 
14
- !`.specweave/scripts/skill-context.sh do 2>/dev/null || true`
14
+ **Project Context**: If `.specweave/config.json` exists, read it for testing mode, TDD enforcement, and multi-project settings. Check for active increments in `.specweave/increments/*/metadata.json`.
15
15
 
16
16
  Execute a SpecWeave increment by running tasks from tasks.md with automatic AC-sync after every task completion.
17
17
 
@@ -22,7 +22,7 @@ Increment planning produces specs, plans, and task breakdowns that require user
22
22
 
23
23
  ## Project Context
24
24
 
25
- !`.specweave/scripts/skill-context.sh increment 2>/dev/null || true`
25
+ **Project Context**: If `.specweave/config.json` exists, read it for testing mode, TDD enforcement, and multi-project settings. Check for active increments in `.specweave/increments/*/metadata.json`.
26
26
 
27
27
  **Self-contained increment planning for ANY user project after `specweave init`.**
28
28
 
@@ -11,7 +11,7 @@ argument-hint: "[increment-id]"
11
11
 
12
12
  ## Project Context
13
13
 
14
- !`.specweave/scripts/skill-context.sh validate 2>/dev/null || true`
14
+ **Project Context**: If `.specweave/config.json` exists, read it for testing mode, TDD enforcement, and multi-project settings. Check for active increments in `.specweave/increments/*/metadata.json`.
15
15
 
16
16
  You are helping the user validate a SpecWeave increment with optional AI-powered quality assessment.
17
17
 
@@ -1,160 +0,0 @@
1
- #!/bin/sh
2
- # skill-context.sh — Project context loader for DCI blocks
3
- #
4
- # Usage: .specweave/scripts/skill-context.sh [skill-name]
5
- # Output: Key-value pairs grouped by section ([config], [project], [increment])
6
- # Exit: Always 0 (graceful degradation)
7
- #
8
- # Performance: <100ms target. Single jq call for config, grep for metadata.
9
- # Skill name argument is reserved for future skill-specific filtering.
10
-
11
- CONFIG=".specweave/config.json"
12
- HAS_JQ=false
13
- command -v jq >/dev/null 2>&1 && HAS_JQ=true
14
-
15
- # --- Parse all config values in ONE jq call ---
16
- # ASSUMPTION: No config value contains literal '|' (pipe).
17
- # If this changes, switch to per-field jq calls (~120ms slower).
18
- _test_mode="" _test_enforce="" _deep_interview="" _auto_max=""
19
- _multi_project="" _org=""
20
-
21
- if [ -f "$CONFIG" ]; then
22
- if $HAS_JQ; then
23
- _raw=$(jq -r '
24
- def v: if . == null then "" else tostring end;
25
- [
26
- (.testing.defaultTestMode | v),
27
- (.testing.tddEnforcement | v),
28
- (.planning.deepInterview.enabled | v),
29
- (.auto.maxRetries | v),
30
- (.multiProject.enabled | v),
31
- (.sync.github.owner | v)
32
- ] | join("|")
33
- ' "$CONFIG" 2>/dev/null) || _raw=""
34
-
35
- IFS='|' read -r _test_mode _test_enforce _deep_interview _auto_max _multi_project _org <<EOF
36
- $_raw
37
- EOF
38
- else
39
- # grep fallback (best-effort, no jq available)
40
- # sed strips key prefix, quotes, and whitespace to extract raw value
41
- _test_mode=$(grep -o '"defaultTestMode"[^,}]*' "$CONFIG" 2>/dev/null | head -1 | sed 's/[^:]*:[[:space:]]*//;s/^"//;s/"$//')
42
- _test_enforce=$(grep -o '"tddEnforcement"[^,}]*' "$CONFIG" 2>/dev/null | head -1 | sed 's/[^:]*:[[:space:]]*//;s/^"//;s/"$//')
43
- _auto_max=$(grep -o '"maxRetries"[^,}]*' "$CONFIG" 2>/dev/null | head -1 | sed 's/[^:]*:[[:space:]]*//;s/[^0-9]//g')
44
- _org=$(grep -o '"owner"[^,}]*' "$CONFIG" 2>/dev/null | head -1 | sed 's/[^:]*:[[:space:]]*//;s/^"//;s/"$//')
45
- fi
46
- fi
47
-
48
- # --- [config] section ---
49
- emit_config() {
50
- [ -f "$CONFIG" ] || return 0
51
-
52
- # Only emit header if at least one field has a value
53
- [ -n "$_test_mode" ] || [ -n "$_test_enforce" ] || \
54
- [ -n "$_deep_interview" ] || [ -n "$_auto_max" ] || return 0
55
-
56
- echo "[config]"
57
- [ -n "$_test_mode" ] && echo "testing.mode=$_test_mode"
58
- [ -n "$_test_enforce" ] && echo "testing.enforcement=$_test_enforce"
59
- [ -n "$_deep_interview" ] && echo "planning.deepInterview=$_deep_interview"
60
- [ -n "$_auto_max" ] && echo "auto.maxIterations=$_auto_max"
61
-
62
- return 0
63
- }
64
-
65
- # --- [project] section ---
66
- emit_project() {
67
- tech=""
68
-
69
- # Detect from filesystem markers (builtins only, no subprocesses)
70
- [ -f "package.json" ] && tech="${tech}node,"
71
- [ -f "tsconfig.json" ] && tech="${tech}typescript,"
72
- { [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; } && tech="${tech}python,"
73
- [ -f "go.mod" ] && tech="${tech}go,"
74
- [ -f "Cargo.toml" ] && tech="${tech}rust,"
75
- { [ -f "pom.xml" ] || [ -f "build.gradle" ]; } && tech="${tech}java,"
76
-
77
- # Shell glob for C# — no subprocess needed
78
- _saved="$1"
79
- _found_cs=false
80
- set -- *.csproj
81
- [ -e "$1" ] && _found_cs=true
82
- set -- *.sln
83
- [ -e "$1" ] && _found_cs=true
84
- $_found_cs && tech="${tech}csharp,"
85
- set -- "$_saved"
86
-
87
- # Detect React/Next/Vue from package.json (one grep each, fast)
88
- if [ -f "package.json" ]; then
89
- grep -q '"react"' package.json 2>/dev/null && tech="${tech}react,"
90
- grep -q '"next"' package.json 2>/dev/null && tech="${tech}nextjs,"
91
- grep -q '"vue"' package.json 2>/dev/null && tech="${tech}vue,"
92
- fi
93
-
94
- # Strip trailing comma
95
- tech="${tech%,}"
96
-
97
- # Use pre-parsed config values (no extra subprocess)
98
- multi="false"
99
- [ "$_multi_project" = "true" ] && multi="true"
100
-
101
- [ -z "$tech" ] && [ "$multi" = "false" ] && [ -z "$_org" ] && return 0
102
-
103
- echo "[project]"
104
- [ -n "$tech" ] && echo "tech=$tech"
105
- echo "multi-repo=$multi"
106
- [ -n "$_org" ] && echo "org=$_org"
107
-
108
- return 0
109
- }
110
-
111
- # --- [increment] section ---
112
- emit_increment() {
113
- inc_dir=".specweave/increments"
114
- [ -d "$inc_dir" ] || return 0
115
-
116
- # Find active increment. Fast grep pre-filter eliminates non-candidates,
117
- # then jq verifies precisely (handles single-line JSON, avoids false
118
- # matches on previousStatus). Without jq, grep alone is best-effort.
119
- active=""
120
- for meta in "$inc_dir"/*/metadata.json; do
121
- [ -f "$meta" ] || continue
122
- # Fast pre-filter: skip files that don't mention in-progress at all
123
- grep -q '"in-progress"' "$meta" 2>/dev/null || continue
124
- # Precise check: jq validates the status field specifically
125
- if $HAS_JQ; then
126
- jq -e '.status == "in-progress"' "$meta" >/dev/null 2>&1 || continue
127
- fi
128
- active=$(basename "$(dirname "$meta")")
129
- break
130
- done
131
-
132
- [ -z "$active" ] && return 0
133
-
134
- # Calculate completion from tasks.md
135
- completion=""
136
- tasks_file="$inc_dir/$active/tasks.md"
137
- if [ -f "$tasks_file" ]; then
138
- total=$(grep -c '^\- \[' "$tasks_file" 2>/dev/null) || true
139
- done_count=$(grep -c '^\- \[x\]' "$tasks_file" 2>/dev/null) || true
140
- total=${total:-0}
141
- done_count=${done_count:-0}
142
- if [ "$total" -gt 0 ] 2>/dev/null; then
143
- completion=$((done_count * 100 / total))
144
- fi
145
- fi
146
-
147
- echo "[increment]"
148
- echo "active=$active"
149
- echo "status=in-progress"
150
- [ -n "$completion" ] && echo "completion=${completion}%"
151
-
152
- return 0
153
- }
154
-
155
- # --- Main ---
156
- emit_config
157
- emit_project
158
- emit_increment
159
-
160
- exit 0