specweave 0.26.11 → 0.26.14
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/dist/plugins/specweave-github/lib/completion-calculator.d.ts +4 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.js +49 -29
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js.map +1 -1
- package/dist/src/cli/commands/import-docs.js +2 -2
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init.js +8 -8
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/install.js +2 -2
- package/dist/src/cli/commands/install.js.map +1 -1
- package/dist/src/cli/helpers/ado-area-path-mapper.js +3 -3
- package/dist/src/cli/helpers/ado-area-path-mapper.js.map +1 -1
- package/dist/src/cli/helpers/github/profile-manager.js +1 -1
- package/dist/src/cli/helpers/github/profile-manager.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.js +3 -3
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -1
- package/dist/src/cli/helpers/import-strategy-prompter.js +1 -1
- package/dist/src/cli/helpers/import-strategy-prompter.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github.js +3 -3
- package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js +1 -1
- package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -1
- package/dist/src/cli/helpers/smart-filter.js +1 -1
- package/dist/src/cli/helpers/smart-filter.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +3 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +35 -4
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +5 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +66 -18
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.js +2 -2
- package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +10 -10
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/sync/bidirectional-engine.js +1 -1
- package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
- package/dist/src/init/InitFlow.js +1 -1
- package/dist/src/init/InitFlow.js.map +1 -1
- package/dist/src/integrations/ado/area-path-mapper.js +1 -1
- package/dist/src/integrations/ado/area-path-mapper.js.map +1 -1
- package/dist/src/utils/external-resource-validator.js +4 -4
- package/dist/src/utils/external-resource-validator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/PLUGINS-INDEX.md +120 -0
- package/plugins/specweave/commands/specweave-archive.md +10 -1
- package/plugins/specweave/commands/specweave-increment.md +1 -1
- package/plugins/specweave/commands/specweave-update-scope.md +2 -2
- package/plugins/specweave/hooks/hooks.json +10 -0
- package/plugins/specweave/hooks/lib/update-active-increment.sh +96 -0
- package/plugins/specweave/hooks/lib/update-status-line.sh +153 -189
- package/plugins/specweave/hooks/post-edit-write-consolidated.sh +6 -0
- package/plugins/specweave/hooks/post-metadata-change.sh +9 -0
- package/plugins/specweave/hooks/post-task-completion.sh +8 -0
- package/plugins/specweave/hooks/post-task-edit.sh +37 -0
- package/plugins/specweave/hooks/post-user-story-complete.sh +86 -35
- package/plugins/specweave/hooks/pre-command-deduplication.sh +43 -53
- package/plugins/specweave/hooks/pre-tool-use.sh +5 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +143 -289
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.js +62 -1
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.ts +106 -3
- package/plugins/specweave/skills/SKILLS-INDEX.md +69 -225
- package/plugins/specweave-ado/commands/specweave-ado-import-projects.md +1 -1
- package/plugins/specweave-ado/lib/project-selector.js +1 -1
- package/plugins/specweave-ado/lib/project-selector.ts +1 -1
- package/plugins/specweave-ado/skills/ado-resource-validator/SKILL.md +1 -1
- package/plugins/specweave-github/lib/completion-calculator.js +34 -16
- package/plugins/specweave-github/lib/completion-calculator.ts +54 -32
- package/plugins/specweave-github/lib/repo-selector.js +1 -1
- package/plugins/specweave-github/lib/repo-selector.ts +1 -1
- package/plugins/specweave-jira/lib/project-selector.js +1 -1
- package/plugins/specweave-jira/lib/project-selector.ts +1 -1
- package/plugins/specweave-jira/lib/setup-wizard.js +1 -1
- package/plugins/specweave-jira/lib/setup-wizard.ts +1 -1
- package/src/templates/AGENTS.md.template +301 -2452
- package/src/templates/CLAUDE.md.template +99 -667
|
@@ -3,6 +3,59 @@ import { USCompletionDetector } from "../../../../dist/src/core/us-completion-de
|
|
|
3
3
|
import { LivingDocsSync } from "../../../../dist/src/core/living-docs/living-docs-sync.js";
|
|
4
4
|
import { USSyncThrottle } from "../../../../dist/src/core/us-sync-throttle.js";
|
|
5
5
|
import { consoleLogger } from "../vendor/utils/logger.js";
|
|
6
|
+
import { spawn } from "child_process";
|
|
7
|
+
import { existsSync } from "fs";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
async function triggerUserStoryCompleteHook(incrementId, usId, projectRoot) {
|
|
10
|
+
const hookPaths = [
|
|
11
|
+
path.join(projectRoot, "plugins/specweave/hooks/post-user-story-complete.sh"),
|
|
12
|
+
path.join(projectRoot, ".claude/hooks/post-user-story-complete.sh")
|
|
13
|
+
];
|
|
14
|
+
let hookPath = null;
|
|
15
|
+
for (const p of hookPaths) {
|
|
16
|
+
if (existsSync(p)) {
|
|
17
|
+
hookPath = p;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!hookPath) {
|
|
22
|
+
console.log(` \u2139\uFE0F post-user-story-complete.sh hook not found (skipping external sync)`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const hookProcess = spawn("bash", [hookPath, incrementId, usId], {
|
|
27
|
+
cwd: projectRoot,
|
|
28
|
+
env: {
|
|
29
|
+
...process.env,
|
|
30
|
+
SPECWEAVE_INCREMENT_ID: incrementId,
|
|
31
|
+
SPECWEAVE_USER_STORY_ID: usId
|
|
32
|
+
},
|
|
33
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
34
|
+
});
|
|
35
|
+
let stdout = "";
|
|
36
|
+
let stderr = "";
|
|
37
|
+
hookProcess.stdout.on("data", (data) => {
|
|
38
|
+
stdout += data.toString();
|
|
39
|
+
});
|
|
40
|
+
hookProcess.stderr.on("data", (data) => {
|
|
41
|
+
stderr += data.toString();
|
|
42
|
+
});
|
|
43
|
+
hookProcess.on("close", (code) => {
|
|
44
|
+
if (code === 0) {
|
|
45
|
+
resolve();
|
|
46
|
+
} else {
|
|
47
|
+
reject(new Error(`Hook exited with code ${code}: ${stderr || stdout}`));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
hookProcess.on("error", (error) => {
|
|
51
|
+
reject(new Error(`Hook spawn failed: ${error.message}`));
|
|
52
|
+
});
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
hookProcess.kill("SIGTERM");
|
|
55
|
+
reject(new Error("Hook timed out after 30s"));
|
|
56
|
+
}, 3e4);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
6
59
|
async function syncCompletedUserStories(incrementId) {
|
|
7
60
|
try {
|
|
8
61
|
console.log(`
|
|
@@ -52,7 +105,15 @@ async function syncCompletedUserStories(incrementId) {
|
|
|
52
105
|
console.log(` Feature: ${syncResult.featureId}`);
|
|
53
106
|
console.log(` Files updated: ${syncResult.filesCreated.length + syncResult.filesUpdated.length}`);
|
|
54
107
|
console.log(`
|
|
55
|
-
\u{1F4E1}
|
|
108
|
+
\u{1F4E1} Triggering external tool updates for ${newlyCompleted.length} completed user stories...`);
|
|
109
|
+
for (const us of newlyCompleted) {
|
|
110
|
+
try {
|
|
111
|
+
await triggerUserStoryCompleteHook(incrementId, us.usId, projectRoot);
|
|
112
|
+
console.log(` \u2705 ${us.usId}: External tool updated`);
|
|
113
|
+
} catch (hookError) {
|
|
114
|
+
console.warn(` \u26A0\uFE0F ${us.usId}: Hook failed (${hookError.message})`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
56
117
|
throttle.recordSync(incrementId);
|
|
57
118
|
console.log(` \u23F1\uFE0F Throttle recorded (next sync allowed in 60s)`);
|
|
58
119
|
} else {
|
|
@@ -39,6 +39,88 @@ import { USCompletionDetector } from '../../../../dist/src/core/us-completion-de
|
|
|
39
39
|
import { LivingDocsSync } from '../../../../dist/src/core/living-docs/living-docs-sync.js';
|
|
40
40
|
import { USSyncThrottle } from '../../../../dist/src/core/us-sync-throttle.js';
|
|
41
41
|
import { consoleLogger } from '../vendor/utils/logger.js';
|
|
42
|
+
import { spawn } from 'child_process';
|
|
43
|
+
import { existsSync } from 'fs';
|
|
44
|
+
import * as path from 'path';
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Trigger post-user-story-complete hook for external tool updates
|
|
48
|
+
*
|
|
49
|
+
* This bridges the orchestrator to the shell hook that handles:
|
|
50
|
+
* - GitHub issue closure with completion comment
|
|
51
|
+
* - JIRA story transition (if implemented)
|
|
52
|
+
* - ADO work item completion (if implemented)
|
|
53
|
+
*
|
|
54
|
+
* @param incrementId - Increment ID (e.g., "0059-context-optimization")
|
|
55
|
+
* @param usId - User story ID (e.g., "US-003")
|
|
56
|
+
* @param projectRoot - Project root path
|
|
57
|
+
*/
|
|
58
|
+
async function triggerUserStoryCompleteHook(
|
|
59
|
+
incrementId: string,
|
|
60
|
+
usId: string,
|
|
61
|
+
projectRoot: string
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
// Find the hook in multiple possible locations
|
|
64
|
+
const hookPaths = [
|
|
65
|
+
path.join(projectRoot, 'plugins/specweave/hooks/post-user-story-complete.sh'),
|
|
66
|
+
path.join(projectRoot, '.claude/hooks/post-user-story-complete.sh'),
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
let hookPath: string | null = null;
|
|
70
|
+
for (const p of hookPaths) {
|
|
71
|
+
if (existsSync(p)) {
|
|
72
|
+
hookPath = p;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!hookPath) {
|
|
78
|
+
console.log(` ℹ️ post-user-story-complete.sh hook not found (skipping external sync)`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
// Call hook with spec-id and user-story-id as arguments
|
|
84
|
+
const hookProcess = spawn('bash', [hookPath, incrementId, usId], {
|
|
85
|
+
cwd: projectRoot,
|
|
86
|
+
env: {
|
|
87
|
+
...process.env,
|
|
88
|
+
SPECWEAVE_INCREMENT_ID: incrementId,
|
|
89
|
+
SPECWEAVE_USER_STORY_ID: usId,
|
|
90
|
+
},
|
|
91
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
let stdout = '';
|
|
95
|
+
let stderr = '';
|
|
96
|
+
|
|
97
|
+
hookProcess.stdout.on('data', (data) => {
|
|
98
|
+
stdout += data.toString();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
hookProcess.stderr.on('data', (data) => {
|
|
102
|
+
stderr += data.toString();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
hookProcess.on('close', (code) => {
|
|
106
|
+
if (code === 0) {
|
|
107
|
+
resolve();
|
|
108
|
+
} else {
|
|
109
|
+
reject(new Error(`Hook exited with code ${code}: ${stderr || stdout}`));
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
hookProcess.on('error', (error) => {
|
|
114
|
+
reject(new Error(`Hook spawn failed: ${error.message}`));
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Timeout after 30 seconds
|
|
118
|
+
setTimeout(() => {
|
|
119
|
+
hookProcess.kill('SIGTERM');
|
|
120
|
+
reject(new Error('Hook timed out after 30s'));
|
|
121
|
+
}, 30000);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
42
124
|
|
|
43
125
|
export interface USSyncResult {
|
|
44
126
|
success: boolean;
|
|
@@ -146,9 +228,30 @@ export async function syncCompletedUserStories(incrementId: string): Promise<USS
|
|
|
146
228
|
console.log(` Feature: ${syncResult.featureId}`);
|
|
147
229
|
console.log(` Files updated: ${syncResult.filesCreated.length + syncResult.filesUpdated.length}`);
|
|
148
230
|
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
|
|
231
|
+
// ========================================================================
|
|
232
|
+
// EXTERNAL TOOL SYNC: Close issues for completed user stories (v0.26.15)
|
|
233
|
+
// ========================================================================
|
|
234
|
+
// livingDocsSync.syncIncrement() updates CONTENT but doesn't CLOSE issues.
|
|
235
|
+
// We need to explicitly trigger post-user-story-complete hook for each US.
|
|
236
|
+
//
|
|
237
|
+
// Flow:
|
|
238
|
+
// 1. For each newly completed US
|
|
239
|
+
// 2. Call post-user-story-complete.sh with spec-id and us-id
|
|
240
|
+
// 3. Hook handles: find issue, add completion comment, close issue
|
|
241
|
+
//
|
|
242
|
+
// Gate checks happen inside the hook based on config flags.
|
|
243
|
+
|
|
244
|
+
console.log(`\n📡 Triggering external tool updates for ${newlyCompleted.length} completed user stories...`);
|
|
245
|
+
|
|
246
|
+
for (const us of newlyCompleted) {
|
|
247
|
+
try {
|
|
248
|
+
await triggerUserStoryCompleteHook(incrementId, us.usId, projectRoot);
|
|
249
|
+
console.log(` ✅ ${us.usId}: External tool updated`);
|
|
250
|
+
} catch (hookError: any) {
|
|
251
|
+
// Non-blocking: Log but continue with next US
|
|
252
|
+
console.warn(` ⚠️ ${us.usId}: Hook failed (${hookError.message})`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
152
255
|
|
|
153
256
|
// Record successful sync for throttling
|
|
154
257
|
throttle.recordSync(incrementId);
|
|
@@ -1,256 +1,100 @@
|
|
|
1
1
|
# SpecWeave Skills Index
|
|
2
2
|
|
|
3
|
-
**Purpose**:
|
|
3
|
+
**Purpose**: Lightweight skill manifest for lazy loading. Load SKILL.md only when triggers match.
|
|
4
4
|
|
|
5
|
-
**Last Updated**: 2025-11-
|
|
6
|
-
|
|
7
|
-
**Total Skills**: 19
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 🚀 Quick Start (Progressive Disclosure)
|
|
12
|
-
|
|
13
|
-
**MANDATORY**: Skills are your expert manuals. Always check for relevant skills BEFORE starting implementation.
|
|
14
|
-
|
|
15
|
-
### Progressive Disclosure Pattern
|
|
16
|
-
|
|
17
|
-
1. **Scan this index** to find skills matching your task
|
|
18
|
-
2. **Match activation keywords** to your current request
|
|
19
|
-
3. **Load full SKILL.md** for matching skills
|
|
20
|
-
4. **Follow the workflow** in SKILL.md precisely
|
|
21
|
-
|
|
22
|
-
### Example Workflow
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
User asks: "Plan a new feature for user authentication"
|
|
26
|
-
|
|
27
|
-
Step 1: Scan this index → Find "increment-planner" skill
|
|
28
|
-
Step 2: Check keywords → Matches "feature planning", "create increment"
|
|
29
|
-
Step 3: Load skill → cat .claude/skills/increment-planner/SKILL.md
|
|
30
|
-
Step 4: Execute → Follow the increment planning workflow
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 📚 All Available Skills
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
### Framework Core
|
|
39
|
-
|
|
40
|
-
#### plugin-expert
|
|
41
|
-
|
|
42
|
-
**Description**: Expert knowledge of Claude Code's plugin system, marketplace management, and installation commands. Activates for plugin installation, marketplace setup, plugin troubleshooting, plugin commands. Keywords plugin install, plugin marketplace, claude code plugins, plugin management, plugin errors, marketplace add, plugin list.
|
|
43
|
-
|
|
44
|
-
**Activates for**: plugin installation, marketplace setup, plugin troubleshooting, plugin commands, plugin install, plugin marketplace
|
|
45
|
-
|
|
46
|
-
**Location**: `.claude/skills/plugin-expert/SKILL.md`
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
#### context-loader
|
|
51
|
-
|
|
52
|
-
**Description**: Explains how SpecWeave achieves context efficiency through Claude's native progressive disclosure mechanism and sub-agent parallelization. Skills load only when relevant, sub-agents isolate context. Activates when users ask about context loading, token usage, or how SpecWeave scales. Keywords: context loading, progressive disclosure, token efficiency, sub-agents, context management.
|
|
53
|
-
|
|
54
|
-
**Location**: `.claude/skills/context-loader/SKILL.md`
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
#### context-optimizer
|
|
59
|
-
|
|
60
|
-
**Description**: Second-pass context optimization that analyzes user prompts and removes irrelevant specs, agents, and skills from loaded context. Achieves 80%+ token reduction through smart cleanup. Activates for optimize context, reduce tokens, clean context, smart context, precision loading.
|
|
61
|
-
|
|
62
|
-
**Location**: `.claude/skills/context-optimizer/SKILL.md`
|
|
63
|
-
|
|
64
|
-
**Allowed tools**: Read, Grep, Glob
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
#### increment-planner
|
|
69
|
-
|
|
70
|
-
**Description**: Creates comprehensive implementation plans for SpecWeave increments (aka features - both terms are interchangeable). This skill should be used when planning new increments/features, creating specifications, or organizing implementation work. Activates for: increment planning, feature planning, implementation plan, create increment, create feature, plan increment, plan feature, organize work, break down increment, break down feature, new product, build project, MVP, SaaS, app development, product description, tech stack planning, feature list.
|
|
71
|
-
|
|
72
|
-
**Activates for**: increment planning, feature planning, implementation plan, create increment, create feature, plan increment, plan feature, organize work, break down increment, break down feature, new product, build project, MVP, SaaS, app development, product description, tech stack planning, feature list
|
|
73
|
-
|
|
74
|
-
**Location**: `.claude/skills/increment-planner/SKILL.md`
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
#### specweave-detector
|
|
79
|
-
|
|
80
|
-
**Description**: Detects SpecWeave context (.specweave/ directory exists) and provides workflow documentation. Explains available slash commands and workflow. Keywords slash commands, /specweave:increment, /increment, /specweave:do, /specweave:progress, /specweave:validate, /specweave:done, specweave commands, workflow help, specweave folder.
|
|
81
|
-
|
|
82
|
-
**Note**: Auto-detection of product descriptions is handled by the `project-kickstarter` skill.
|
|
83
|
-
|
|
84
|
-
**Location**: `.claude/skills/specweave-detector/SKILL.md`
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
#### specweave-framework
|
|
89
|
-
|
|
90
|
-
**Description**: Expert knowledge of SpecWeave framework structure, rules, conventions, and increment lifecycle. Deep understanding of source-of-truth discipline, increment naming, hook system, and plugin architecture. Activates for: specweave rules, how does specweave work, framework structure, increment lifecycle, what is specweave, specweave conventions, specweave discipline, specweave architecture, where do files go, source of truth, increment naming, tasks.md format, spec.md structure, living docs sync, hook system, plugin architecture, how to use specweave, specweave best practices.
|
|
91
|
-
|
|
92
|
-
**Activates for**: specweave rules, how does specweave work, framework structure, increment lifecycle, what is specweave, specweave conventions, specweave discipline, specweave architecture, where do files go, source of truth, increment naming, tasks
|
|
93
|
-
|
|
94
|
-
**Location**: `.claude/skills/specweave-framework/SKILL.md`
|
|
95
|
-
|
|
96
|
-
**Allowed tools**: Read, Grep, Glob
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
### Orchestration & Planning
|
|
102
|
-
|
|
103
|
-
#### role-orchestrator
|
|
104
|
-
|
|
105
|
-
**Description**: Multi-agent orchestration system that coordinates specialized agents (PM, Architect, DevOps, QA, Tech Lead, Security) to work together on complex tasks. Implements hierarchical orchestrator-worker pattern. Activates for complex multi-step requests requiring multiple roles/skills. Keywords: build product, create SaaS, full implementation, end-to-end, multi-agent, orchestrate, coordinate roles, complex project.
|
|
106
|
-
|
|
107
|
-
**Location**: `.claude/skills/role-orchestrator/SKILL.md`
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
### Quality & Testing
|
|
113
|
-
|
|
114
|
-
#### increment-quality-judge-v2
|
|
115
|
-
|
|
116
|
-
**Description**: Enhanced AI-powered quality assessment with RISK SCORING (Probability × Impact method) and quality gate decisions. Evaluates specifications, plans, and tests for clarity, testability, completeness, feasibility, maintainability, edge cases, and RISKS. Provides PASS/CONCERNS/FAIL decisions. Activates for validate quality, quality check, assess spec, evaluate increment, spec review, quality score, risk assessment, qa check, quality gate, /specweave:qa command.
|
|
117
|
-
|
|
118
|
-
**Activates for**: validate quality, quality check, assess spec, evaluate increment, spec review, quality score, risk assessment, qa check, quality gate
|
|
119
|
-
|
|
120
|
-
**Location**: `.claude/skills/increment-quality-judge-v2/SKILL.md`
|
|
121
|
-
|
|
122
|
-
**Allowed tools**: Read, Grep, Glob
|
|
123
|
-
|
|
124
|
-
**Special Note**: This exists as BOTH a skill and an agent:
|
|
125
|
-
- **Skill** (this file) → Provides documentation and reference material
|
|
126
|
-
- **Agent** (`plugins/specweave/agents/increment-quality-judge-v2/AGENT.md`) → Provides execution via Task tool
|
|
127
|
-
|
|
128
|
-
Use **Skill tool** or **/specweave:qa** slash command for quality assessments.
|
|
129
|
-
Use **Task tool** only when programmatically invoking from code (rare).
|
|
130
|
-
|
|
131
|
-
**Related**: `/specweave:qa` command, `qa-lead` agent
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
### Documentation
|
|
137
|
-
|
|
138
|
-
#### brownfield-analyzer
|
|
139
|
-
|
|
140
|
-
**Description**: Analyzes existing brownfield projects to map documentation structure to SpecWeave's PRD/HLD/Spec/Runbook pattern. Scans folders, classifies documents, detects external tools (Jira, ADO, GitHub), and generates migration plan. Activates for brownfield, existing project, migrate, analyze structure, legacy documentation.
|
|
141
|
-
|
|
142
|
-
**Location**: `.claude/skills/brownfield-analyzer/SKILL.md`
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
#### translator
|
|
147
|
-
|
|
148
|
-
**Description**: LLM-native translation skill for SpecWeave content. Activates when translation is needed for CLI messages, templates, documentation, or living docs. Uses the current LLM session for zero-cost translation. Keywords: translate, translation, language, multilingual, i18n, internationalization, Russian, Spanish, Chinese, German, French, localization, translate to.
|
|
149
|
-
|
|
150
|
-
**Location**: `.claude/skills/translator/SKILL.md`
|
|
151
|
-
|
|
152
|
-
**Allowed tools**: Read, Write, Edit, Grep, Glob
|
|
5
|
+
**Total Skills**: 27 | **Last Updated**: 2025-11-24
|
|
153
6
|
|
|
154
7
|
---
|
|
155
8
|
|
|
9
|
+
## Lazy Loading Pattern
|
|
156
10
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
**Description**: Intelligently onboards brownfield projects by merging existing CLAUDE.md backups into SpecWeave structure. Extracts project-specific knowledge, domain context, team conventions, and technical details from backup CLAUDE.md files, then distributes content to appropriate SpecWeave folders without bloating CLAUDE.md. Activates for: merge docs, merge claude, onboard brownfield, import existing docs, claude backup, specweave merge-docs.
|
|
162
|
-
|
|
163
|
-
**Activates for**: merge docs, merge claude, onboard brownfield, import existing docs, claude backup, specweave merge-docs
|
|
164
|
-
|
|
165
|
-
**Location**: `.claude/skills/brownfield-onboarder/SKILL.md`
|
|
11
|
+
1. **Match triggers** below to user intent
|
|
12
|
+
2. **Load SKILL.md** only for matched skill
|
|
13
|
+
3. **Follow workflow** in loaded skill
|
|
166
14
|
|
|
167
15
|
---
|
|
168
16
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
**Description**: Proactively detects product/project descriptions and guides users through SpecWeave increment planning. Activates when user provides product name, features, tech stack, timeline, or problem description. Keywords: project, product, SaaS, app, MVP, build, new project, features, tech stack, core functionality, monetization, timeline, I want to build, let's build, quick build, core features.
|
|
172
|
-
|
|
173
|
-
**Location**: `.claude/skills/project-kickstarter/SKILL.md`
|
|
17
|
+
## Skills by Category
|
|
174
18
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
#### tdd-workflow
|
|
19
|
+
### Planning & Workflow
|
|
178
20
|
|
|
179
|
-
|
|
21
|
+
| Skill | Triggers | Location |
|
|
22
|
+
|-------|----------|----------|
|
|
23
|
+
| **increment-planner** | increment, feature, plan, create increment, new feature, organize work, MVP, SaaS, product, build project, tech stack | `skills/increment-planner/SKILL.md` |
|
|
24
|
+
| **increment-work-router** | implement, complete, build, develop, work on, continue, resume, finish, fix, resolve, let's implement, start working | `skills/increment-work-router/SKILL.md` |
|
|
25
|
+
| **spec-generator** | specification, spec.md, plan.md, tasks.md, generate spec, create tasks, requirements, acceptance criteria | `skills/spec-generator/SKILL.md` |
|
|
26
|
+
| **project-kickstarter** | project, product, SaaS, app, MVP, build, new project, features, I want to build, let's build, quick build | `skills/project-kickstarter/SKILL.md` |
|
|
27
|
+
| **roadmap-planner** | roadmap, prioritization, RICE, MoSCoW, Kano, product planning, feature ranking, KPIs, Q1 Q2 Q3 Q4, release planning | `skills/roadmap-planner/SKILL.md` |
|
|
28
|
+
| **role-orchestrator** | multi-agent, orchestrate, coordinate roles, complex project, end-to-end, full implementation, build product | `skills/role-orchestrator/SKILL.md` |
|
|
180
29
|
|
|
181
|
-
|
|
30
|
+
### Quality & Validation
|
|
182
31
|
|
|
183
|
-
|
|
32
|
+
| Skill | Triggers | Location |
|
|
33
|
+
|-------|----------|----------|
|
|
34
|
+
| **increment-quality-judge-v2** | quality check, assess spec, risk assessment, qa check, quality gate, /specweave:qa, validate quality, evaluate increment | `skills/increment-quality-judge-v2/SKILL.md` |
|
|
35
|
+
| **pm-closure-validation** | /done, close increment, validate increment, completion check, quality gate, PM approval, ready to close, scope creep | `skills/pm-closure-validation/SKILL.md` |
|
|
36
|
+
| **code-reviewer** | code review, security vulnerabilities, performance optimization, static analysis, code quality, pull request review | `skills/code-reviewer/SKILL.md` |
|
|
37
|
+
| **code-standards-analyzer** | coding standards, conventions, code style, naming conventions, linting rules, best practices, standards audit, anti-patterns | `skills/code-standards-analyzer/SKILL.md` |
|
|
38
|
+
| **tdd-workflow** | TDD, test-driven, red-green-refactor, write tests first, test-first, Kent Beck, TDD cycle | `skills/tdd-workflow/SKILL.md` |
|
|
184
39
|
|
|
40
|
+
### Synchronization
|
|
185
41
|
|
|
186
|
-
|
|
42
|
+
| Skill | Triggers | Location |
|
|
43
|
+
|-------|----------|----------|
|
|
44
|
+
| **external-sync-wizard** | GitHub sync, Jira integration, Azure DevOps, ADO, issue tracking sync, bidirectional sync, import issues, export increments | `skills/external-sync-wizard/SKILL.md` |
|
|
45
|
+
| **progress-sync** | sync progress, update progress, sync everything, sync all systems, sync to GitHub, sync to JIRA, /specweave:sync-progress | `skills/progress-sync/SKILL.md` |
|
|
46
|
+
| **multi-project-spec-mapper** | multi-project, project mapping, spec splitting, JIRA projects, multiple projects, microservices, FE/BE/MOBILE split | `skills/multi-project-spec-mapper/SKILL.md` |
|
|
187
47
|
|
|
188
|
-
|
|
189
|
-
- Scan activation keywords
|
|
190
|
-
- Match to your current task
|
|
191
|
-
- Identify 1-3 relevant skills
|
|
48
|
+
### Framework & Context
|
|
192
49
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
-
|
|
50
|
+
| Skill | Triggers | Location |
|
|
51
|
+
|-------|----------|----------|
|
|
52
|
+
| **specweave-detector** | slash commands, /specweave:increment, /specweave:do, /specweave:progress, /specweave:done, specweave commands, workflow help | `skills/specweave-detector/SKILL.md` |
|
|
53
|
+
| **specweave-framework** | specweave rules, how does specweave work, framework structure, increment lifecycle, source of truth, tasks.md format | `skills/specweave-framework/SKILL.md` |
|
|
54
|
+
| **context-loader** | context loading, progressive disclosure, token efficiency, sub-agents, context management, how SpecWeave scales | `skills/context-loader/SKILL.md` |
|
|
55
|
+
| **context-optimizer** | optimize context, reduce tokens, clean context, smart context, precision loading, 80% reduction | `skills/context-optimizer/SKILL.md` |
|
|
56
|
+
| **plugin-validator** | plugin validation, validate plugins, check plugins, specweave init, fresh setup, marketplace registration | `skills/plugin-validator/SKILL.md` |
|
|
197
57
|
|
|
198
|
-
|
|
199
|
-
- Apply skill's instructions
|
|
200
|
-
- Use recommended tools
|
|
201
|
-
- Follow SpecWeave best practices
|
|
58
|
+
### Maintenance & Migration
|
|
202
59
|
|
|
203
|
-
|
|
60
|
+
| Skill | Triggers | Location |
|
|
61
|
+
|-------|----------|----------|
|
|
62
|
+
| **archive-increments** | archive, clean workspace, too many increments, archive old, archive completed, _archive folder, preserve history | `skills/archive-increments/SKILL.md` |
|
|
63
|
+
| **smart-reopen-detector** | not working, broken, bug, issue, problem, failing, error, crash, regression, still broken, incorrect, missing | `skills/smart-reopen-detector/SKILL.md` |
|
|
64
|
+
| **brownfield-analyzer** | brownfield, existing project, migrate, analyze structure, legacy documentation, PRD/HLD mapping | `skills/brownfield-analyzer/SKILL.md` |
|
|
65
|
+
| **brownfield-onboarder** | merge docs, merge claude, onboard brownfield, import existing docs, claude backup, CLAUDE.md merge | `skills/brownfield-onboarder/SKILL.md` |
|
|
66
|
+
| **translator** | translate, translation, language, multilingual, i18n, internationalization, Russian, Spanish, Chinese, localization | `skills/translator/SKILL.md` |
|
|
204
67
|
|
|
205
|
-
|
|
68
|
+
### Infrastructure & Compliance
|
|
206
69
|
|
|
207
|
-
|
|
|
208
|
-
|
|
209
|
-
|
|
|
210
|
-
|
|
|
211
|
-
| "Sync to JIRA" | `jira-sync` | "JIRA sync", "create JIRA issue" |
|
|
212
|
-
| "Create diagram" | `diagrams-architect` | "architecture diagram", "C4 diagram" |
|
|
213
|
-
| "Build React UI" | `frontend` | "React", "components", "UI" |
|
|
214
|
-
| "Deploy to cloud" | `hetzner-provisioner` | "deploy", "infrastructure" |
|
|
215
|
-
| "Quality check" | `increment-quality-judge-v2` | "quality check", "assess spec", "risk assessment" |
|
|
216
|
-
| "E2E testing" | `e2e-playwright` | "E2E test", "browser test" |
|
|
217
|
-
| "Generate docs site" | `docusaurus` | "documentation site", "docs" |
|
|
70
|
+
| Skill | Triggers | Location |
|
|
71
|
+
|-------|----------|----------|
|
|
72
|
+
| **serverless-recommender** | serverless, AWS Lambda, Azure Functions, GCP Cloud Functions, Firebase, Supabase, which platform, serverless cost | `skills/serverless-recommender/SKILL.md` |
|
|
73
|
+
| **compliance-architecture** | compliance, HIPAA, SOC2, SOC 2, GDPR, PCI-DSS, regulatory, healthcare data, payment card, audit, security standards | `skills/compliance-architecture/SKILL.md` |
|
|
218
74
|
|
|
219
75
|
---
|
|
220
76
|
|
|
221
|
-
##
|
|
222
|
-
|
|
223
|
-
**Without skills**:
|
|
224
|
-
- ❌ Reinvent workflows every session
|
|
225
|
-
- ❌ Inconsistent increment structure
|
|
226
|
-
- ❌ Miss SpecWeave conventions
|
|
227
|
-
- ❌ Waste tokens on irrelevant docs
|
|
77
|
+
## Quick Lookup Table
|
|
228
78
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
79
|
+
| User Intent | Best Skill |
|
|
80
|
+
|-------------|-----------|
|
|
81
|
+
| "Plan a new feature" | `increment-planner` |
|
|
82
|
+
| "Implement X" / "Build Y" | `increment-work-router` |
|
|
83
|
+
| "Quality check" / "Review spec" | `increment-quality-judge-v2` |
|
|
84
|
+
| "Close increment" / "/done" | `pm-closure-validation` |
|
|
85
|
+
| "Sync to GitHub/JIRA" | `external-sync-wizard` |
|
|
86
|
+
| "Archive old increments" | `archive-increments` |
|
|
87
|
+
| "Bug/issue/broken" | `smart-reopen-detector` |
|
|
88
|
+
| "AWS vs Azure vs GCP" | `serverless-recommender` |
|
|
89
|
+
| "SOC2/HIPAA compliance" | `compliance-architecture` |
|
|
90
|
+
| "Review my code" | `code-reviewer` |
|
|
234
91
|
|
|
235
92
|
---
|
|
236
93
|
|
|
237
|
-
##
|
|
238
|
-
|
|
239
|
-
This index simulates Claude Code's native progressive disclosure:
|
|
240
|
-
- Claude pre-loads skill metadata at startup (name + description)
|
|
241
|
-
- Other tools read this index file for same benefit
|
|
242
|
-
- Single file read replaces 12 individual file scans
|
|
243
|
-
- Token savings: ~97% (1 file vs 12 files)
|
|
244
|
-
|
|
245
|
-
**How to use in your AI tool**:
|
|
246
|
-
1. Load this file at session start
|
|
247
|
-
2. Parse activation keywords
|
|
248
|
-
3. Match user requests to keywords
|
|
249
|
-
4. Load full SKILL.md when matched
|
|
250
|
-
5. Execute skill workflow
|
|
251
|
-
|
|
252
|
-
---
|
|
94
|
+
## Token Efficiency
|
|
253
95
|
|
|
254
|
-
**
|
|
96
|
+
- **This index**: ~200 lines (~4KB)
|
|
97
|
+
- **All skills loaded**: ~2,500 lines (~50KB)
|
|
98
|
+
- **Savings**: ~92% by loading skills on-demand
|
|
255
99
|
|
|
256
|
-
**
|
|
100
|
+
**Pattern**: Load this index → Match triggers → Load only matched SKILL.md
|
|
@@ -100,7 +100,7 @@ const allProjects = result.projects;
|
|
|
100
100
|
import { AreaPathMapper } from '../../../src/integrations/ado/area-path-mapper.js';
|
|
101
101
|
|
|
102
102
|
const { selectedProject } = await inquirer.prompt([{
|
|
103
|
-
type: '
|
|
103
|
+
type: 'select',
|
|
104
104
|
name: 'selectedProject',
|
|
105
105
|
message: 'Select ADO project to import area paths from:',
|
|
106
106
|
choices: allProjects.map(p => ({ name: p.name, value: p.name }))
|
|
@@ -103,7 +103,7 @@ export async function selectAdoProjects(
|
|
|
103
103
|
// Decide selection method
|
|
104
104
|
const { selectionMethod } = await inquirer.prompt([
|
|
105
105
|
{
|
|
106
|
-
type: '
|
|
106
|
+
type: 'select',
|
|
107
107
|
name: 'selectionMethod',
|
|
108
108
|
message: 'How would you like to select projects?',
|
|
109
109
|
choices: [
|
|
@@ -428,7 +428,7 @@ export async function validateAzureDevOpsResources(
|
|
|
428
428
|
```typescript
|
|
429
429
|
const { action } = await inquirer.prompt([
|
|
430
430
|
{
|
|
431
|
-
type: '
|
|
431
|
+
type: 'select',
|
|
432
432
|
name: 'action',
|
|
433
433
|
message: `Project "${projectName}" not found. What would you like to do?`,
|
|
434
434
|
choices: [
|
|
@@ -99,8 +99,11 @@ class CompletionCalculator {
|
|
|
99
99
|
* Process:
|
|
100
100
|
* 1. Find increment link in user story's "Implementation" section
|
|
101
101
|
* 2. Read increment's tasks.md
|
|
102
|
-
* 3. Filter tasks that reference this user story
|
|
102
|
+
* 3. Filter tasks that reference this user story (via **User Story** field OR AC-IDs)
|
|
103
103
|
* 4. Extract completion status from **Status**: [x] or [ ]
|
|
104
|
+
*
|
|
105
|
+
* IMPORTANT: Checks **User Story** field FIRST (handles multi-story tasks like "US-001, US-002"),
|
|
106
|
+
* then falls back to AC-based filtering. Also handles "Satisfies ACs: All" correctly.
|
|
104
107
|
*/
|
|
105
108
|
async extractTasks(userStoryContent, userStoryId) {
|
|
106
109
|
const tasks = [];
|
|
@@ -125,33 +128,48 @@ class CompletionCalculator {
|
|
|
125
128
|
return tasks;
|
|
126
129
|
}
|
|
127
130
|
const tasksContent = await readFile(tasksPath, "utf-8");
|
|
131
|
+
const normalizeUsId = (id) => {
|
|
132
|
+
const num = id.replace(/^US-?0*/, "");
|
|
133
|
+
return `US-${num.padStart(3, "0")}`;
|
|
134
|
+
};
|
|
135
|
+
const normalizedCurrentUs = normalizeUsId(userStoryId);
|
|
128
136
|
const taskPattern = /###?\s+(T-\d+):\s*([^\n]+)\n([\s\S]*?)(?=\n###?\s+T-\d+:|$)/g;
|
|
129
137
|
let match;
|
|
130
138
|
while ((match = taskPattern.exec(tasksContent)) !== null) {
|
|
131
139
|
const taskId = match[1];
|
|
132
140
|
const taskTitle = match[2].trim();
|
|
133
141
|
const taskBody = match[3];
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
const userStoryFieldMatch = taskBody.match(/\*\*User Story\*\*:\s*([^\n]+)/);
|
|
143
|
+
let belongsToThisUS = false;
|
|
144
|
+
if (userStoryFieldMatch) {
|
|
145
|
+
const userStoryList = userStoryFieldMatch[1].trim();
|
|
146
|
+
const userStoryIds = userStoryList.split(",").map((us) => us.trim());
|
|
147
|
+
belongsToThisUS = userStoryIds.some((usId) => {
|
|
148
|
+
return normalizeUsId(usId) === normalizedCurrentUs;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (!belongsToThisUS) {
|
|
152
|
+
const acMatch2 = taskBody.match(/\*\*(?:Satisfies ACs?|AC)\*\*:\s*([^\n]+)/);
|
|
153
|
+
if (acMatch2) {
|
|
154
|
+
const acList = acMatch2[1].trim();
|
|
155
|
+
if (acList.toLowerCase() !== "all") {
|
|
156
|
+
const acIds2 = acList.split(",").map((ac) => ac.trim());
|
|
157
|
+
belongsToThisUS = acIds2.some((acId) => {
|
|
158
|
+
const usMatch = acId.match(/AC-([A-Z]+\d+)-/);
|
|
159
|
+
if (!usMatch) return false;
|
|
160
|
+
const extractedUsId = usMatch[1];
|
|
161
|
+
return normalizeUsId(extractedUsId) === normalizedCurrentUs;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
137
165
|
}
|
|
138
|
-
const acList = acMatch[1].trim();
|
|
139
|
-
const acIds = acList.split(",").map((ac) => ac.trim());
|
|
140
|
-
const belongsToThisUS = acIds.some((acId) => {
|
|
141
|
-
const usMatch = acId.match(/AC-([A-Z]+\d+)-/);
|
|
142
|
-
if (!usMatch) return false;
|
|
143
|
-
const extractedUsId = usMatch[1];
|
|
144
|
-
const extractedNum = extractedUsId.replace(/^US/, "");
|
|
145
|
-
const normalizedExtracted = `US-${extractedNum.padStart(3, "0")}`;
|
|
146
|
-
const currentNum = userStoryId.replace(/^US-?/, "");
|
|
147
|
-
const normalizedCurrent = `US-${currentNum.padStart(3, "0")}`;
|
|
148
|
-
return normalizedExtracted === normalizedCurrent;
|
|
149
|
-
});
|
|
150
166
|
if (!belongsToThisUS) {
|
|
151
167
|
continue;
|
|
152
168
|
}
|
|
153
169
|
const statusMatch = taskBody.match(/\*\*Status\*\*:\s*\[([x ])\]/);
|
|
154
170
|
const completed = statusMatch ? statusMatch[1] === "x" : false;
|
|
171
|
+
const acMatch = taskBody.match(/\*\*(?:Satisfies ACs?|AC)\*\*:\s*([^\n]+)/);
|
|
172
|
+
const acIds = acMatch ? acMatch[1].trim().split(",").map((ac) => ac.trim()) : [];
|
|
155
173
|
tasks.push({
|
|
156
174
|
id: taskId,
|
|
157
175
|
title: taskTitle,
|