specweave 0.23.16 → 0.23.18
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/.claude-plugin/marketplace.json +11 -0
- package/CLAUDE.md +22 -7
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +57 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/progress/progress-tracker.d.ts +4 -1
- package/dist/src/core/progress/progress-tracker.d.ts.map +1 -1
- package/dist/src/core/progress/progress-tracker.js +33 -4
- package/dist/src/core/progress/progress-tracker.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-dependency-loader.js +39 -7
- package/dist/src/integrations/ado/ado-dependency-loader.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/lib/migrate-increment-work.sh +1 -1
- package/plugins/specweave/hooks/lib/migrate-increment-work.sh.bak +245 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/lib/sync-spec-content.sh.bak +149 -0
- package/plugins/specweave/hooks/lib/update-status-line.sh +34 -4
- package/plugins/specweave/hooks/lib/validate-spec-status.sh +1 -1
- package/plugins/specweave/hooks/lib/validate-spec-status.sh.bak +163 -0
- package/plugins/specweave/hooks/post-first-increment.sh +1 -1
- package/plugins/specweave/hooks/post-first-increment.sh.bak +61 -0
- package/plugins/specweave/hooks/post-spec-update.sh +1 -1
- package/plugins/specweave/hooks/post-spec-update.sh.bak +158 -0
- package/plugins/specweave/hooks/post-user-story-complete.sh +1 -1
- package/plugins/specweave/hooks/post-user-story-complete.sh.bak +179 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +1 -1
- package/plugins/specweave/hooks/pre-command-deduplication.sh.bak +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/hooks/user-prompt-submit.sh.bak +386 -0
- package/plugins/specweave/skills/specweave-framework/SKILL.md +1 -1
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +23 -0
- package/plugins/specweave-ado/agents/ado-multi-project-mapper/AGENT.md +23 -0
- package/plugins/specweave-ado/agents/ado-sync-judge/AGENT.md +23 -0
- package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +23 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +23 -0
- package/plugins/specweave-diagrams/agents/diagrams-architect/AGENT.md +23 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +23 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +25 -0
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +25 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +49 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +67 -0
- package/plugins/specweave-infrastructure/agents/devops/AGENT.md +26 -0
- package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +26 -0
- package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +26 -0
- package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +26 -0
- package/plugins/specweave-infrastructure/agents/sre/AGENT.md +26 -0
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +26 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +26 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +26 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +26 -0
- package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +26 -0
- package/plugins/specweave-ml/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave-ml/agents/data-scientist/AGENT.md +26 -0
- package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +26 -0
- package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +26 -0
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +26 -0
- package/plugins/specweave-payments/agents/payment-integration/AGENT.md +26 -0
- package/plugins/specweave-plugin-dev/.claude-plugin/plugin.json +19 -0
- package/plugins/specweave-plugin-dev/skills/plugin-expert/SKILL.md +1231 -0
- package/plugins/specweave-release/agents/release-manager/AGENT.md +27 -0
- package/plugins/specweave/skills/plugin-expert/SKILL.md +0 -340
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# SpecWeave UserPromptSubmit Hook
|
|
4
|
+
# Fires BEFORE user's command executes (prompt-based hook)
|
|
5
|
+
# Purpose: Discipline validation, context injection, command suggestions
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
# Read input JSON from stdin
|
|
10
|
+
INPUT=$(cat)
|
|
11
|
+
|
|
12
|
+
# Extract prompt from JSON
|
|
13
|
+
PROMPT=$(echo "$INPUT" | node -e "
|
|
14
|
+
const input = JSON.parse(require('fs').readFileSync(0, 'utf-8'));
|
|
15
|
+
console.log(input.prompt || '');
|
|
16
|
+
")
|
|
17
|
+
|
|
18
|
+
# ==============================================================================
|
|
19
|
+
# DISCIPLINE VALIDATION: Block /specweave:increment if incomplete increments exist
|
|
20
|
+
# ==============================================================================
|
|
21
|
+
|
|
22
|
+
if echo "$PROMPT" | grep -q "/specweave:increment"; then
|
|
23
|
+
# Check increment discipline using check-discipline CLI command
|
|
24
|
+
# This enforces WIP limits (max 1 active, hard cap 2)
|
|
25
|
+
SPECWEAVE_DIR=".specweave"
|
|
26
|
+
|
|
27
|
+
if [[ -d "$SPECWEAVE_DIR/increments" ]]; then
|
|
28
|
+
# Run discipline check (exit code: 0=pass, 1=violations, 2=error)
|
|
29
|
+
if command -v node >/dev/null 2>&1 && [[ -f "dist/src/core/increment/metadata-manager.js" ]]; then
|
|
30
|
+
# Check active increments using MetadataManager
|
|
31
|
+
ACTIVE_COUNT=$(node -e "
|
|
32
|
+
try {
|
|
33
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
34
|
+
const active = MetadataManager.getActive();
|
|
35
|
+
console.log(active.length);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
console.error('Error checking active increments:', e.message);
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
" 2>/dev/null || echo "0")
|
|
41
|
+
|
|
42
|
+
# Hard cap: never >2 active
|
|
43
|
+
if [[ "$ACTIVE_COUNT" -ge 2 ]]; then
|
|
44
|
+
# Get list of active increments for error message
|
|
45
|
+
ACTIVE_LIST=$(node -e "
|
|
46
|
+
try {
|
|
47
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
48
|
+
const active = MetadataManager.getActive();
|
|
49
|
+
active.forEach(inc => console.log(' - ' + inc.id + ' [' + inc.type + ']'));
|
|
50
|
+
} catch (e) {}
|
|
51
|
+
" 2>/dev/null || echo "")
|
|
52
|
+
|
|
53
|
+
cat <<EOF
|
|
54
|
+
{
|
|
55
|
+
"decision": "block",
|
|
56
|
+
"reason": "❌ HARD CAP REACHED\n\nYou have $ACTIVE_COUNT active increments (absolute maximum: 2)\n\nActive increments:\n$ACTIVE_LIST\n\n💡 You MUST complete or pause existing work first:\n\n1️⃣ Complete an increment:\n /specweave:done <id>\n\n2️⃣ Pause an increment:\n /specweave:pause <id> --reason=\"...\"\n\n3️⃣ Check status:\n /specweave:status\n\n📝 Multiple hotfixes? Combine them into ONE increment!\n Example: 0009-security-fixes (SQL + XSS + CSRF)\n\n⛔ This limit is enforced for your productivity.\nResearch: 3+ concurrent tasks = 40% slower + more bugs"
|
|
57
|
+
}
|
|
58
|
+
EOF
|
|
59
|
+
exit 0
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# Soft warning: 1 active (recommended limit)
|
|
63
|
+
if [[ "$ACTIVE_COUNT" -ge 1 ]]; then
|
|
64
|
+
# Get list of active increments for warning
|
|
65
|
+
ACTIVE_LIST=$(node -e "
|
|
66
|
+
try {
|
|
67
|
+
const { MetadataManager } = require('./dist/src/core/increment/metadata-manager.js');
|
|
68
|
+
const active = MetadataManager.getActive();
|
|
69
|
+
active.forEach(inc => console.log(' - ' + inc.id + ' [' + inc.type + ']'));
|
|
70
|
+
} catch (e) {}
|
|
71
|
+
" 2>/dev/null || echo "")
|
|
72
|
+
|
|
73
|
+
# Just warn, don't block (user can choose to continue)
|
|
74
|
+
cat <<EOF
|
|
75
|
+
{
|
|
76
|
+
"decision": "approve",
|
|
77
|
+
"systemMessage": "⚠️ WIP LIMIT REACHED\n\nYou have $ACTIVE_COUNT active increment (recommended limit: 1)\n\nActive increments:\n$ACTIVE_LIST\n\n🧠 Focus Principle: ONE active increment = maximum productivity\nStarting a 2nd increment reduces focus and velocity.\n\n💡 Consider:\n 1️⃣ Complete current work (recommended)\n 2️⃣ Pause current work (/specweave:pause)\n 3️⃣ Continue anyway (accept 20% productivity cost)\n\n⚠️ Emergency hotfix/bug? Use --type=hotfix or --type=bug to bypass this warning."
|
|
78
|
+
}
|
|
79
|
+
EOF
|
|
80
|
+
exit 0
|
|
81
|
+
fi
|
|
82
|
+
else
|
|
83
|
+
# Fallback: check for active/planning status manually
|
|
84
|
+
INCOMPLETE_INCREMENTS=$(find "$SPECWEAVE_DIR/increments" -mindepth 1 -maxdepth 1 -type d | while read increment_dir; do
|
|
85
|
+
metadata="$increment_dir/metadata.json"
|
|
86
|
+
if [[ -f "$metadata" ]]; then
|
|
87
|
+
status=$(node -e "
|
|
88
|
+
try {
|
|
89
|
+
const data = JSON.parse(require('fs').readFileSync('$metadata', 'utf-8'));
|
|
90
|
+
console.log(data.status || 'unknown');
|
|
91
|
+
} catch (e) {
|
|
92
|
+
console.log('unknown');
|
|
93
|
+
}
|
|
94
|
+
")
|
|
95
|
+
|
|
96
|
+
if [[ "$status" == "active" || "$status" == "planning" ]]; then
|
|
97
|
+
echo "$(basename "$increment_dir")"
|
|
98
|
+
fi
|
|
99
|
+
fi
|
|
100
|
+
done)
|
|
101
|
+
|
|
102
|
+
if [[ -n "$INCOMPLETE_INCREMENTS" ]]; then
|
|
103
|
+
COUNT=$(echo "$INCOMPLETE_INCREMENTS" | wc -l | xargs)
|
|
104
|
+
|
|
105
|
+
# Get incomplete task count for migration guidance
|
|
106
|
+
MIGRATION_SCRIPT="$(dirname "${BASH_SOURCE[0]}")/lib/migrate-increment-work.sh"
|
|
107
|
+
INCOMPLETE_TASKS=""
|
|
108
|
+
|
|
109
|
+
for increment in $INCOMPLETE_INCREMENTS; do
|
|
110
|
+
if [[ -x "$MIGRATION_SCRIPT" ]]; then
|
|
111
|
+
TASK_COUNT=$("$MIGRATION_SCRIPT" count-incomplete "$increment" 2>/dev/null || echo "?")
|
|
112
|
+
INCOMPLETE_TASKS="${INCOMPLETE_TASKS}\n - $increment ($TASK_COUNT incomplete tasks)"
|
|
113
|
+
else
|
|
114
|
+
INCOMPLETE_TASKS="${INCOMPLETE_TASKS}\n - $increment"
|
|
115
|
+
fi
|
|
116
|
+
done
|
|
117
|
+
|
|
118
|
+
cat <<EOF
|
|
119
|
+
{
|
|
120
|
+
"decision": "block",
|
|
121
|
+
"reason": "❌ Cannot create new increment! You have $COUNT incomplete increment(s):$INCOMPLETE_TASKS\n\n💡 **SMART MIGRATION OPTIONS:**\n\n1️⃣ **Transfer Work** (Recommended)\n Move incomplete tasks to new increment:\n \`\`\`bash\n # After creating new increment, run:\n bash plugins/specweave/hooks/lib/migrate-increment-work.sh transfer <old-id> <new-id>\n \`\`\`\n ✅ Clean closure + work continues\n\n2️⃣ **Adjust WIP Limit** (Emergency Only)\n Temporarily allow 3 active increments:\n \`\`\`bash\n bash plugins/specweave/hooks/lib/migrate-increment-work.sh adjust-wip 3\n \`\`\`\n ⚠️ 20% productivity cost, revert ASAP\n\n3️⃣ **Force-Close** (Quick Fix)\n Mark increment as complete (work lost):\n \`\`\`bash\n bash plugins/specweave/hooks/lib/migrate-increment-work.sh force-close <increment-id>\n \`\`\`\n ⚠️ Incomplete work NOT transferred!\n\n📝 **Traditional Options:**\n - /specweave:done <id> # Complete properly\n - /specweave:pause <id> # Pause for later\n - /specweave:abandon <id> # Abandon if obsolete\n\nℹ️ The discipline exists for a reason:\n ✓ Prevents scope creep\n ✓ Ensures completions are tracked\n ✓ Maintains living docs accuracy\n ✓ Keeps work focused"
|
|
122
|
+
}
|
|
123
|
+
EOF
|
|
124
|
+
exit 0
|
|
125
|
+
fi
|
|
126
|
+
fi
|
|
127
|
+
fi
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
# ==============================================================================
|
|
131
|
+
# PRE-FLIGHT SYNC CHECK: Ensure living docs are fresh before operations
|
|
132
|
+
# ==============================================================================
|
|
133
|
+
|
|
134
|
+
# Detect increment operations that need fresh data
|
|
135
|
+
if echo "$PROMPT" | grep -qE "/(specweave:)?(done|validate|progress|do)"; then
|
|
136
|
+
# Extract increment ID from prompt (if provided)
|
|
137
|
+
INCREMENT_ID=$(echo "$PROMPT" | grep -oE "[0-9]{4}[a-z0-9-]*" | head -1)
|
|
138
|
+
|
|
139
|
+
# If no ID in prompt, try to find active increment
|
|
140
|
+
if [[ -z "$INCREMENT_ID" ]] && [[ -d ".specweave/increments" ]]; then
|
|
141
|
+
INCREMENT_ID=$(find .specweave/increments -mindepth 1 -maxdepth 1 -type d | while read increment_dir; do
|
|
142
|
+
metadata="$increment_dir/metadata.json"
|
|
143
|
+
if [[ -f "$metadata" ]]; then
|
|
144
|
+
status=$(node -e "
|
|
145
|
+
try {
|
|
146
|
+
const data = JSON.parse(require('fs').readFileSync('$metadata', 'utf-8'));
|
|
147
|
+
if (data.status === 'active') {
|
|
148
|
+
console.log('$(basename "$increment_dir")');
|
|
149
|
+
}
|
|
150
|
+
} catch (e) {}
|
|
151
|
+
" 2>/dev/null)
|
|
152
|
+
|
|
153
|
+
if [[ -n "$status" ]]; then
|
|
154
|
+
echo "$status"
|
|
155
|
+
break
|
|
156
|
+
fi
|
|
157
|
+
fi
|
|
158
|
+
done)
|
|
159
|
+
fi
|
|
160
|
+
|
|
161
|
+
# If we have an increment ID, check freshness
|
|
162
|
+
if [[ -n "$INCREMENT_ID" ]]; then
|
|
163
|
+
INCREMENT_SPEC=".specweave/increments/$INCREMENT_ID/spec.md"
|
|
164
|
+
LIVING_DOCS_SPEC=".specweave/docs/internal/specs/spec-$INCREMENT_ID.md"
|
|
165
|
+
|
|
166
|
+
# Check if increment spec exists
|
|
167
|
+
if [[ -f "$INCREMENT_SPEC" ]]; then
|
|
168
|
+
# Get modification times
|
|
169
|
+
if [[ "$(uname)" == "Darwin" ]]; then
|
|
170
|
+
# macOS
|
|
171
|
+
INCREMENT_MTIME=$(stat -f %m "$INCREMENT_SPEC" 2>/dev/null || echo 0)
|
|
172
|
+
LIVING_DOCS_MTIME=$(stat -f %m "$LIVING_DOCS_SPEC" 2>/dev/null || echo 0)
|
|
173
|
+
else
|
|
174
|
+
# Linux
|
|
175
|
+
INCREMENT_MTIME=$(stat -c %Y "$INCREMENT_SPEC" 2>/dev/null || echo 0)
|
|
176
|
+
LIVING_DOCS_MTIME=$(stat -c %Y "$LIVING_DOCS_SPEC" 2>/dev/null || echo 0)
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
# Check if increment is newer than living docs (or living docs doesn't exist)
|
|
180
|
+
if [[ "$INCREMENT_MTIME" -gt "$LIVING_DOCS_MTIME" ]]; then
|
|
181
|
+
# Sync needed - run sync-living-docs
|
|
182
|
+
PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
183
|
+
SYNC_SCRIPT="$PLUGIN_ROOT/lib/hooks/sync-living-docs.js"
|
|
184
|
+
|
|
185
|
+
if [[ -f "$SYNC_SCRIPT" ]]; then
|
|
186
|
+
# Run sync (capture output but don't block on errors)
|
|
187
|
+
if node "$SYNC_SCRIPT" "$INCREMENT_ID" >/dev/null 2>&1; then
|
|
188
|
+
# Success - sync completed
|
|
189
|
+
:
|
|
190
|
+
else
|
|
191
|
+
# Sync failed - log but continue
|
|
192
|
+
echo "[WARNING] Pre-flight sync failed for $INCREMENT_ID" >&2
|
|
193
|
+
fi
|
|
194
|
+
fi
|
|
195
|
+
fi
|
|
196
|
+
fi
|
|
197
|
+
fi
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
# ==============================================================================
|
|
201
|
+
# SPEC SYNC CHECK: Detect spec.md changes and warn about sync needed
|
|
202
|
+
# ==============================================================================
|
|
203
|
+
|
|
204
|
+
# Check if spec.md was modified after plan.md (requires sync)
|
|
205
|
+
if [[ -d ".specweave/increments" ]]; then
|
|
206
|
+
# Find active increment
|
|
207
|
+
ACTIVE_INCREMENT_FOR_SYNC=$(find .specweave/increments -mindepth 1 -maxdepth 1 -type d | while read increment_dir; do
|
|
208
|
+
metadata="$increment_dir/metadata.json"
|
|
209
|
+
if [[ -f "$metadata" ]]; then
|
|
210
|
+
status=$(node -e "
|
|
211
|
+
try {
|
|
212
|
+
const data = JSON.parse(require('fs').readFileSync('$metadata', 'utf-8'));
|
|
213
|
+
if (data.status === 'active') {
|
|
214
|
+
console.log('$(basename "$increment_dir")');
|
|
215
|
+
}
|
|
216
|
+
} catch (e) {}
|
|
217
|
+
" 2>/dev/null)
|
|
218
|
+
|
|
219
|
+
if [[ -n "$status" ]]; then
|
|
220
|
+
echo "$status"
|
|
221
|
+
break
|
|
222
|
+
fi
|
|
223
|
+
fi
|
|
224
|
+
done)
|
|
225
|
+
|
|
226
|
+
if [[ -n "$ACTIVE_INCREMENT_FOR_SYNC" ]]; then
|
|
227
|
+
# Check if SpecSyncManager detects changes
|
|
228
|
+
if command -v node >/dev/null 2>&1 && [[ -f "dist/src/core/increment/spec-sync-manager.js" ]]; then
|
|
229
|
+
SYNC_CHECK=$(node -e "
|
|
230
|
+
try {
|
|
231
|
+
const { SpecSyncManager } = require('./dist/src/core/increment/spec-sync-manager.js');
|
|
232
|
+
const manager = new SpecSyncManager(process.cwd());
|
|
233
|
+
const detection = manager.detectSpecChange('$ACTIVE_INCREMENT_FOR_SYNC');
|
|
234
|
+
|
|
235
|
+
if (detection.specChanged) {
|
|
236
|
+
const message = manager.formatSyncMessage(detection);
|
|
237
|
+
console.log(JSON.stringify({ needsSync: true, message }));
|
|
238
|
+
} else {
|
|
239
|
+
console.log(JSON.stringify({ needsSync: false }));
|
|
240
|
+
}
|
|
241
|
+
} catch (e) {
|
|
242
|
+
console.log(JSON.stringify({ needsSync: false, error: e.message }));
|
|
243
|
+
}
|
|
244
|
+
" 2>/dev/null || echo '{"needsSync":false}')
|
|
245
|
+
|
|
246
|
+
NEEDS_SYNC=$(echo "$SYNC_CHECK" | node -e "
|
|
247
|
+
try {
|
|
248
|
+
const data = JSON.parse(require('fs').readFileSync(0, 'utf-8'));
|
|
249
|
+
console.log(data.needsSync || false);
|
|
250
|
+
} catch (e) {
|
|
251
|
+
console.log(false);
|
|
252
|
+
}
|
|
253
|
+
")
|
|
254
|
+
|
|
255
|
+
if [[ "$NEEDS_SYNC" == "true" ]]; then
|
|
256
|
+
SYNC_MESSAGE=$(echo "$SYNC_CHECK" | node -e "
|
|
257
|
+
try {
|
|
258
|
+
const data = JSON.parse(require('fs').readFileSync(0, 'utf-8'));
|
|
259
|
+
console.log(data.message || '');
|
|
260
|
+
} catch (e) {
|
|
261
|
+
console.log('');
|
|
262
|
+
}
|
|
263
|
+
")
|
|
264
|
+
|
|
265
|
+
# Show sync warning (don't block, just warn)
|
|
266
|
+
cat <<EOF
|
|
267
|
+
{
|
|
268
|
+
"decision": "approve",
|
|
269
|
+
"systemMessage": "$SYNC_MESSAGE"
|
|
270
|
+
}
|
|
271
|
+
EOF
|
|
272
|
+
exit 0
|
|
273
|
+
fi
|
|
274
|
+
fi
|
|
275
|
+
fi
|
|
276
|
+
fi
|
|
277
|
+
|
|
278
|
+
# ==============================================================================
|
|
279
|
+
# CONTEXT INJECTION: Add current increment status
|
|
280
|
+
# ==============================================================================
|
|
281
|
+
|
|
282
|
+
CONTEXT=""
|
|
283
|
+
|
|
284
|
+
# Find active increment
|
|
285
|
+
if [[ -d ".specweave/increments" ]]; then
|
|
286
|
+
ACTIVE_INCREMENT=$(find .specweave/increments -mindepth 1 -maxdepth 1 -type d | while read increment_dir; do
|
|
287
|
+
metadata="$increment_dir/metadata.json"
|
|
288
|
+
if [[ -f "$metadata" ]]; then
|
|
289
|
+
status=$(node -e "
|
|
290
|
+
try {
|
|
291
|
+
const data = JSON.parse(require('fs').readFileSync('$metadata', 'utf-8'));
|
|
292
|
+
if (data.status === 'active') {
|
|
293
|
+
console.log('$(basename "$increment_dir")');
|
|
294
|
+
}
|
|
295
|
+
} catch (e) {}
|
|
296
|
+
")
|
|
297
|
+
|
|
298
|
+
if [[ -n "$status" ]]; then
|
|
299
|
+
echo "$status"
|
|
300
|
+
break
|
|
301
|
+
fi
|
|
302
|
+
fi
|
|
303
|
+
done)
|
|
304
|
+
|
|
305
|
+
if [[ -n "$ACTIVE_INCREMENT" ]]; then
|
|
306
|
+
# Simple status: parse tasks.md for completion
|
|
307
|
+
TASKS_FILE=".specweave/increments/$ACTIVE_INCREMENT/tasks.md"
|
|
308
|
+
if [[ -f "$TASKS_FILE" ]]; then
|
|
309
|
+
# Count tasks (headers with T-NNN format - both ### and ####)
|
|
310
|
+
TOTAL_TASKS=$(grep -cE '^#{3,4}\s*T-[0-9]' "$TASKS_FILE" 2>/dev/null | tr -d '\n' || echo "0")
|
|
311
|
+
# Count completed (various formats)
|
|
312
|
+
COMPLETED_TASKS=$(grep -cE '(✅ COMPLETE|\[COMPLETED\]|\[x\] Completed)' "$TASKS_FILE" 2>/dev/null | tr -d '\n' || echo "0")
|
|
313
|
+
|
|
314
|
+
# Ensure valid numbers
|
|
315
|
+
TOTAL_TASKS=${TOTAL_TASKS:-0}
|
|
316
|
+
COMPLETED_TASKS=${COMPLETED_TASKS:-0}
|
|
317
|
+
|
|
318
|
+
if [[ "$TOTAL_TASKS" -gt 0 ]] 2>/dev/null; then
|
|
319
|
+
PERCENTAGE=$(( COMPLETED_TASKS * 100 / TOTAL_TASKS ))
|
|
320
|
+
CONTEXT="✓ Active: $ACTIVE_INCREMENT ($COMPLETED_TASKS/$TOTAL_TASKS tasks, $PERCENTAGE%)"
|
|
321
|
+
else
|
|
322
|
+
CONTEXT="✓ Active: $ACTIVE_INCREMENT"
|
|
323
|
+
fi
|
|
324
|
+
else
|
|
325
|
+
CONTEXT="✓ Active: $ACTIVE_INCREMENT"
|
|
326
|
+
fi
|
|
327
|
+
fi
|
|
328
|
+
fi
|
|
329
|
+
|
|
330
|
+
# ==============================================================================
|
|
331
|
+
# COMMAND SUGGESTIONS: Guide users to structured workflow
|
|
332
|
+
# ==============================================================================
|
|
333
|
+
|
|
334
|
+
if echo "$PROMPT" | grep -qiE "(add|create|implement|build|develop)" && ! echo "$PROMPT" | grep -q "/specweave:"; then
|
|
335
|
+
if [[ -n "$CONTEXT" ]]; then
|
|
336
|
+
CONTEXT="$CONTEXT
|
|
337
|
+
|
|
338
|
+
💡 TIP: Consider using SpecWeave commands for structured development:
|
|
339
|
+
- /specweave:increment \"feature name\" # Plan new increment
|
|
340
|
+
- /specweave:do # Execute current tasks
|
|
341
|
+
- /specweave:progress # Check progress"
|
|
342
|
+
fi
|
|
343
|
+
fi
|
|
344
|
+
|
|
345
|
+
# ==============================================================================
|
|
346
|
+
# STATUS LINE REFRESH: Ensure cache is fresh before showing context
|
|
347
|
+
# ==============================================================================
|
|
348
|
+
# Performance: ~50-100ms (acceptable for UX)
|
|
349
|
+
# Frequency: Every user prompt (high coverage)
|
|
350
|
+
# Benefit: Catches ALL edge cases (manual edits, resume, direct changes)
|
|
351
|
+
#
|
|
352
|
+
# Why here? This hook runs on EVERY user prompt, ensuring status line
|
|
353
|
+
# is ALWAYS up-to-date before showing context to the user.
|
|
354
|
+
#
|
|
355
|
+
# Prevents desync scenarios:
|
|
356
|
+
# - Manual spec.md edits (status: planning → active)
|
|
357
|
+
# - /specweave:resume (status: paused → active)
|
|
358
|
+
# - Direct metadata changes (without hook triggers)
|
|
359
|
+
# - File system operations bypassing hooks
|
|
360
|
+
#
|
|
361
|
+
# Background execution: Runs async, doesn't block user prompt
|
|
362
|
+
|
|
363
|
+
HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
364
|
+
bash "$HOOK_DIR/lib/update-status-line.sh" 2>/dev/null || true
|
|
365
|
+
|
|
366
|
+
# ==============================================================================
|
|
367
|
+
# OUTPUT: Approve with context or no context
|
|
368
|
+
# ==============================================================================
|
|
369
|
+
|
|
370
|
+
if [[ -n "$CONTEXT" ]]; then
|
|
371
|
+
cat <<EOF
|
|
372
|
+
{
|
|
373
|
+
"decision": "approve",
|
|
374
|
+
"systemMessage": "$CONTEXT"
|
|
375
|
+
}
|
|
376
|
+
EOF
|
|
377
|
+
else
|
|
378
|
+
# Just approve, no extra context
|
|
379
|
+
cat <<EOF
|
|
380
|
+
{
|
|
381
|
+
"decision": "approve"
|
|
382
|
+
}
|
|
383
|
+
EOF
|
|
384
|
+
fi
|
|
385
|
+
|
|
386
|
+
exit 0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: specweave-framework
|
|
3
|
-
description: Expert knowledge of SpecWeave framework structure, rules, conventions, and increment lifecycle. Deep understanding of source-of-truth discipline, increment naming,
|
|
3
|
+
description: Expert knowledge of SpecWeave framework structure, rules, conventions, and increment lifecycle. Deep understanding of source-of-truth discipline, increment naming, living docs sync. Covers SpecWeave-specific hooks (post-task-completion), and increment discipline. Activates for specweave rules, increment lifecycle, source of truth, increment naming, tasks.md format, spec.md structure, living docs sync, specweave hooks, where do files go, how to use specweave, specweave best practices, specweave conventions.
|
|
4
4
|
allowed-tools: Read, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -12,6 +12,29 @@ context: |
|
|
|
12
12
|
- Optimize sync performance and rate limiting
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
## 🚀 How to Invoke This Agent
|
|
16
|
+
|
|
17
|
+
**Subagent Type**: `specweave-ado:ado-manager:ado-manager`
|
|
18
|
+
|
|
19
|
+
**Usage Example**:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
Task({
|
|
23
|
+
subagent_type: "specweave-ado:ado-manager:ado-manager",
|
|
24
|
+
prompt: "Your task description here",
|
|
25
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
30
|
+
- **Plugin**: specweave-ado
|
|
31
|
+
- **Directory**: ado-manager
|
|
32
|
+
- **YAML Name**: ado-manager
|
|
33
|
+
|
|
34
|
+
**When to Use**:
|
|
35
|
+
- [TODO: Describe specific use cases for this agent]
|
|
36
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
37
|
+
- [TODO: What problems does this agent solve?]
|
|
15
38
|
# ADO Manager Agent
|
|
16
39
|
|
|
17
40
|
**Role**: Azure DevOps Integration Specialist
|
|
@@ -5,6 +5,29 @@ tools: Read, Write, Edit, Bash, Glob
|
|
|
5
5
|
model: claude-sonnet-4-5-20250929
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## 🚀 How to Invoke This Agent
|
|
9
|
+
|
|
10
|
+
**Subagent Type**: `specweave-ado:ado-multi-project-mapper:ado-multi-project-mapper`
|
|
11
|
+
|
|
12
|
+
**Usage Example**:
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
Task({
|
|
16
|
+
subagent_type: "specweave-ado:ado-multi-project-mapper:ado-multi-project-mapper",
|
|
17
|
+
prompt: "Your task description here",
|
|
18
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
23
|
+
- **Plugin**: specweave-ado
|
|
24
|
+
- **Directory**: ado-multi-project-mapper
|
|
25
|
+
- **YAML Name**: ado-multi-project-mapper
|
|
26
|
+
|
|
27
|
+
**When to Use**:
|
|
28
|
+
- [TODO: Describe specific use cases for this agent]
|
|
29
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
30
|
+
- [TODO: What problems does this agent solve?]
|
|
8
31
|
# Azure DevOps Multi-Project Mapper Agent
|
|
9
32
|
|
|
10
33
|
You are an expert in mapping SpecWeave specifications to multiple Azure DevOps projects with intelligent detection and coordination.
|
|
@@ -5,6 +5,29 @@ tools: Read, Grep, Bash
|
|
|
5
5
|
model: claude-sonnet-4-5-20250929
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
+
## 🚀 How to Invoke This Agent
|
|
9
|
+
|
|
10
|
+
**Subagent Type**: `specweave-ado:ado-sync-judge:ado-sync-judge`
|
|
11
|
+
|
|
12
|
+
**Usage Example**:
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
Task({
|
|
16
|
+
subagent_type: "specweave-ado:ado-sync-judge:ado-sync-judge",
|
|
17
|
+
prompt: "Your task description here",
|
|
18
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
23
|
+
- **Plugin**: specweave-ado
|
|
24
|
+
- **Directory**: ado-sync-judge
|
|
25
|
+
- **YAML Name**: ado-sync-judge
|
|
26
|
+
|
|
27
|
+
**When to Use**:
|
|
28
|
+
- [TODO: Describe specific use cases for this agent]
|
|
29
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
30
|
+
- [TODO: What problems does this agent solve?]
|
|
8
31
|
# Azure DevOps Sync Judge Agent
|
|
9
32
|
|
|
10
33
|
You are an expert judge for verifying the correctness of Azure DevOps synchronization with SpecWeave living docs. Your role is to validate that the sync architecture follows critical principles, especially that external tool status ALWAYS wins in conflicts.
|
|
@@ -7,6 +7,29 @@ cost_profile: planning
|
|
|
7
7
|
fallback_behavior: strict
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## 🚀 How to Invoke This Agent
|
|
11
|
+
|
|
12
|
+
**Subagent Type**: `specweave-backend:database-optimizer:database-optimizer`
|
|
13
|
+
|
|
14
|
+
**Usage Example**:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
Task({
|
|
18
|
+
subagent_type: "specweave-backend:database-optimizer:database-optimizer",
|
|
19
|
+
prompt: "Your task description here",
|
|
20
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
25
|
+
- **Plugin**: specweave-backend
|
|
26
|
+
- **Directory**: database-optimizer
|
|
27
|
+
- **YAML Name**: database-optimizer
|
|
28
|
+
|
|
29
|
+
**When to Use**:
|
|
30
|
+
- [TODO: Describe specific use cases for this agent]
|
|
31
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
32
|
+
- [TODO: What problems does this agent solve?]
|
|
10
33
|
You are a database optimization expert specializing in modern performance tuning, query optimization, and scalable database architectures.
|
|
11
34
|
|
|
12
35
|
## Purpose
|
|
@@ -3,6 +3,29 @@ name: confluent-architect
|
|
|
3
3
|
description: Confluent Cloud architecture specialist. Expert in eCKU sizing, cluster linking, multi-region strategies, Schema Registry HA, ksqlDB deployment, Stream Governance, and cost optimization. Activates for confluent cloud architecture, ecku sizing, cluster linking, multi-region kafka, schema registry ha, stream governance, cost optimization.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
## 🚀 How to Invoke This Agent
|
|
7
|
+
|
|
8
|
+
**Subagent Type**: `specweave-confluent:confluent-architect:confluent-architect`
|
|
9
|
+
|
|
10
|
+
**Usage Example**:
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
Task({
|
|
14
|
+
subagent_type: "specweave-confluent:confluent-architect:confluent-architect",
|
|
15
|
+
prompt: "Your task description here",
|
|
16
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
21
|
+
- **Plugin**: specweave-confluent
|
|
22
|
+
- **Directory**: confluent-architect
|
|
23
|
+
- **YAML Name**: confluent-architect
|
|
24
|
+
|
|
25
|
+
**When to Use**:
|
|
26
|
+
- [TODO: Describe specific use cases for this agent]
|
|
27
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
28
|
+
- [TODO: What problems does this agent solve?]
|
|
6
29
|
# Confluent Architect Agent
|
|
7
30
|
|
|
8
31
|
I'm a specialized architecture agent with deep expertise in designing scalable, reliable Confluent Cloud systems.
|
|
@@ -8,6 +8,29 @@ cost_profile: hybrid
|
|
|
8
8
|
fallback_behavior: auto
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 🚀 How to Invoke This Agent
|
|
12
|
+
|
|
13
|
+
**Subagent Type**: `specweave-diagrams:diagrams-architect:diagrams-architect`
|
|
14
|
+
|
|
15
|
+
**Usage Example**:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
Task({
|
|
19
|
+
subagent_type: "specweave-diagrams:diagrams-architect:diagrams-architect",
|
|
20
|
+
prompt: "Your task description here",
|
|
21
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
22
|
+
});
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
26
|
+
- **Plugin**: specweave-diagrams
|
|
27
|
+
- **Directory**: diagrams-architect
|
|
28
|
+
- **YAML Name**: diagrams-architect
|
|
29
|
+
|
|
30
|
+
**When to Use**:
|
|
31
|
+
- [TODO: Describe specific use cases for this agent]
|
|
32
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
33
|
+
- [TODO: What problems does this agent solve?]
|
|
11
34
|
# Diagrams Architect Agent
|
|
12
35
|
|
|
13
36
|
You are an expert diagram architect specializing in creating production-quality Mermaid diagrams following the C4 Model and SpecWeave conventions.
|
|
@@ -42,6 +42,29 @@ GitHub issues MUST use living docs format:
|
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
+
## 🚀 How to Invoke This Agent
|
|
46
|
+
|
|
47
|
+
**Subagent Type**: `specweave-github:github-manager:SpecWeave Sync`
|
|
48
|
+
|
|
49
|
+
**Usage Example**:
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
Task({
|
|
53
|
+
subagent_type: "specweave-github:github-manager:SpecWeave Sync",
|
|
54
|
+
prompt: "Your task description here",
|
|
55
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name}`
|
|
60
|
+
- **Plugin**: specweave-github
|
|
61
|
+
- **Directory**: github-manager
|
|
62
|
+
- **YAML Name**: SpecWeave Sync
|
|
63
|
+
|
|
64
|
+
**When to Use**:
|
|
65
|
+
- [TODO: Describe specific use cases for this agent]
|
|
66
|
+
- [TODO: When should this agent be invoked instead of others?]
|
|
67
|
+
- [TODO: What problems does this agent solve?]
|
|
45
68
|
## Capabilities
|
|
46
69
|
|
|
47
70
|
As the GitHub Manager agent, I specialize in:
|
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
Expert agent for splitting SpecWeave tasks across multiple GitHub repositories based on architecture patterns.
|
|
4
4
|
|
|
5
|
+
## 🚀 How to Invoke This Agent
|
|
6
|
+
|
|
7
|
+
**Subagent Type**: `specweave-github:github-task-splitter:github-task-splitter`
|
|
8
|
+
|
|
9
|
+
**Usage Example**:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
Task({
|
|
13
|
+
subagent_type: "specweave-github:github-task-splitter:github-task-splitter",
|
|
14
|
+
prompt: "Split tasks for increment 0015-shopping-cart across frontend, backend, and shared repositories",
|
|
15
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name-or-directory-name}`
|
|
20
|
+
- **Plugin**: specweave-github
|
|
21
|
+
- **Directory**: github-task-splitter
|
|
22
|
+
- **Agent Name**: github-task-splitter
|
|
23
|
+
|
|
24
|
+
**When to Use**:
|
|
25
|
+
- You need to distribute SpecWeave tasks across multiple GitHub repositories based on technology stack
|
|
26
|
+
- You want to analyze task dependencies across different services
|
|
27
|
+
- You need to create tracking issues in multiple repositories for a single increment
|
|
28
|
+
- You're managing a multi-repo architecture (monorepo, microservices, etc.) and need intelligent task distribution
|
|
29
|
+
|
|
5
30
|
## Role
|
|
6
31
|
I analyze SpecWeave increments and intelligently distribute tasks across multiple repositories based on:
|
|
7
32
|
- Repository architecture (single, multi-repo, monorepo, parent)
|
|
@@ -7,6 +7,31 @@ description: Updates GitHub issues for user stories with proper ACs and tasks. A
|
|
|
7
7
|
|
|
8
8
|
**Role**: Updates GitHub issues for individual user stories to include checkable acceptance criteria and task connections.
|
|
9
9
|
|
|
10
|
+
## 🚀 How to Invoke This Agent
|
|
11
|
+
|
|
12
|
+
**Subagent Type**: `specweave-github:user-story-updater:user-story-updater`
|
|
13
|
+
|
|
14
|
+
**Usage Example**:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
Task({
|
|
18
|
+
subagent_type: "specweave-github:user-story-updater:user-story-updater",
|
|
19
|
+
prompt: "Update GitHub issue #501 for user story FS-031/US-004 with checkable ACs and task connections",
|
|
20
|
+
model: "haiku" // optional: haiku, sonnet, opus
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Naming Convention**: `{plugin}:{directory}:{yaml-name-or-directory-name}`
|
|
25
|
+
- **Plugin**: specweave-github
|
|
26
|
+
- **Directory**: user-story-updater
|
|
27
|
+
- **Agent Name**: user-story-updater
|
|
28
|
+
|
|
29
|
+
**When to Use**:
|
|
30
|
+
- You need to sync user story details from SpecWeave to GitHub issues
|
|
31
|
+
- You want to add checkable acceptance criteria checkboxes to GitHub issues
|
|
32
|
+
- You need to link tasks in SpecWeave tasks.md to GitHub issues
|
|
33
|
+
- You're updating GitHub issue content with the latest user story information and progress
|
|
34
|
+
|
|
10
35
|
**Activates For**:
|
|
11
36
|
- "Update user story issue"
|
|
12
37
|
- "Fix GitHub issue format for US-004"
|