@dzhechkov/skills-feature-adr 1.1.0 → 1.3.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/README.md +55 -5
- package/package.json +6 -3
- package/src/cli.js +19 -7
- package/src/commands/init.js +97 -8
- package/src/utils.js +52 -1
- package/templates/.claude/skills/explore/SKILL.md +218 -0
- package/templates/.claude/skills/explore/references/questioning-techniques.md +151 -0
- package/templates/.claude/skills/explore/references/task-brief-templates.md +355 -0
- package/templates/.claude/skills/feature-adr/SKILL.md +24 -0
- package/templates/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/templates/.claude/skills/frontend-design/SKILL.md +45 -0
- package/templates/.claude/skills/problem-solver-enhanced/SKILL.md +565 -0
package/README.md
CHANGED
|
@@ -9,14 +9,17 @@
|
|
|
9
9
|
## Quick Start
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
#
|
|
13
|
-
npx @dzhechkov/skills-feature-adr
|
|
12
|
+
# Core install (feature-adr pipeline only)
|
|
13
|
+
npx @dzhechkov/skills-feature-adr init
|
|
14
|
+
|
|
15
|
+
# Full install with learning + knowledge extraction
|
|
16
|
+
npx @dzhechkov/skills-feature-adr init --with-learning --knowledge-extractor
|
|
14
17
|
|
|
15
18
|
# Or install globally
|
|
16
19
|
npm install -g @dzhechkov/skills-feature-adr
|
|
17
|
-
skills-feature-adr init
|
|
20
|
+
skills-feature-adr init --with-learning --knowledge-extractor
|
|
18
21
|
|
|
19
|
-
#
|
|
22
|
+
# Already have @dzhechkov/keysarium? Just install core (learning & harvest included)
|
|
20
23
|
npx @dzhechkov/skills-feature-adr init
|
|
21
24
|
```
|
|
22
25
|
|
|
@@ -44,7 +47,10 @@ Everything is installed into your project's `.claude/` directory and works nativ
|
|
|
44
47
|
|
|
45
48
|
```bash
|
|
46
49
|
npx @dzhechkov/skills-feature-adr # Full install (same as init)
|
|
47
|
-
npx @dzhechkov/skills-feature-adr init # Install
|
|
50
|
+
npx @dzhechkov/skills-feature-adr init # Install core components
|
|
51
|
+
npx @dzhechkov/skills-feature-adr init --with-learning # + reward learning
|
|
52
|
+
npx @dzhechkov/skills-feature-adr init --knowledge-extractor # + knowledge extractor
|
|
53
|
+
npx @dzhechkov/skills-feature-adr init --with-learning --knowledge-extractor # + both
|
|
48
54
|
npx @dzhechkov/skills-feature-adr init --force # Overwrite existing files
|
|
49
55
|
npx @dzhechkov/skills-feature-adr init --dry-run # Preview without making changes
|
|
50
56
|
npx @dzhechkov/skills-feature-adr update # Update to latest version
|
|
@@ -209,6 +215,50 @@ After installation, feature-adr auto-detects agentic-qe when you use the `--full
|
|
|
209
215
|
|
|
210
216
|
---
|
|
211
217
|
|
|
218
|
+
## Optional Features: Learning & Knowledge Extraction
|
|
219
|
+
|
|
220
|
+
Feature ADR can be extended with reward learning and knowledge extraction — no additional packages required.
|
|
221
|
+
|
|
222
|
+
### `--with-learning` — Reward Learning
|
|
223
|
+
|
|
224
|
+
Adds the Memory Protocol and Reward Tracker. The pipeline **learns from your feedback** at every checkpoint:
|
|
225
|
+
- Stores reward scores based on your responses (immediate approval = 1.0, minor adjustments = 0.7, rework = 0.3)
|
|
226
|
+
- Loads historical patterns at the start of each step
|
|
227
|
+
- Detects domain-specific bottlenecks and skill effectiveness trends
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
npx @dzhechkov/skills-feature-adr init --with-learning
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Installs:** `lib/memory-protocol.md`, `lib/reward-tracker.md`, `.claude/rules/reward-learning.md`
|
|
234
|
+
|
|
235
|
+
### `--knowledge-extractor` — Knowledge Harvesting
|
|
236
|
+
|
|
237
|
+
Adds the Knowledge Extractor skill with the `/harvest` command. After completing a feature, extract reusable patterns:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
npx @dzhechkov/skills-feature-adr init --knowledge-extractor
|
|
241
|
+
|
|
242
|
+
# After completing a feature:
|
|
243
|
+
/harvest features/<feature-slug>/
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Installs:** `.claude/skills/knowledge-extractor/` (5 agents, 7 categories, 8 quality gates), `.claude/commands/harvest.md`
|
|
247
|
+
|
|
248
|
+
### Both at once
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
npx @dzhechkov/skills-feature-adr init --with-learning --knowledge-extractor
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Already using `@dzhechkov/keysarium`?
|
|
255
|
+
|
|
256
|
+
> **If you have `@dzhechkov/keysarium` installed, these flags are not needed.**
|
|
257
|
+
> Keysarium already includes reward learning, knowledge extraction, and more.
|
|
258
|
+
> The installer auto-detects keysarium and skips optional components to avoid duplication.
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
212
262
|
## Shared Skills
|
|
213
263
|
|
|
214
264
|
Feature ADR uses these skills from `@dzhechkov/keysarium` (if installed):
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/skills-feature-adr",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Adaptive Feature Development skill pack for Claude Code — 11-step pipeline with Complexity Router (S/M/L/XL), ADR-driven architecture, 15 agentic-qe skills,
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "Adaptive Feature Development skill pack for Claude Code — 11-step pipeline with Complexity Router (S/M/L/XL), ADR-driven architecture, 15 agentic-qe skills, multi-agent fleet QE. Supports --full-qe, --full-qe-extended, --with-learning, and --knowledge-extractor modes.",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"skills-feature-adr": "./bin/cli.js"
|
|
@@ -30,7 +30,10 @@
|
|
|
30
30
|
"quality-engineering",
|
|
31
31
|
"agentic-qe",
|
|
32
32
|
"shift-left",
|
|
33
|
-
"fleet-qe"
|
|
33
|
+
"fleet-qe",
|
|
34
|
+
"reward-learning",
|
|
35
|
+
"knowledge-extractor",
|
|
36
|
+
"harvest"
|
|
34
37
|
],
|
|
35
38
|
"author": "dzhechko",
|
|
36
39
|
"license": "MIT",
|
package/src/cli.js
CHANGED
|
@@ -10,7 +10,7 @@ function showBanner() {
|
|
|
10
10
|
console.log('');
|
|
11
11
|
console.log(cyan('\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557'));
|
|
12
12
|
console.log(cyan('\u2551') + bold(' FEATURE-ADR \u2014 Adaptive Feature Development ') + cyan('\u2551'));
|
|
13
|
-
console.log(cyan('\u2551') + '
|
|
13
|
+
console.log(cyan('\u2551') + ' 11-step pipeline with Complexity Router (S/M/L/XL) ' + cyan('\u2551'));
|
|
14
14
|
console.log(cyan('\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D'));
|
|
15
15
|
console.log('');
|
|
16
16
|
}
|
|
@@ -37,20 +37,24 @@ function showHelp() {
|
|
|
37
37
|
console.log(' ' + green('doctor') + ' Check Feature ADR installation health');
|
|
38
38
|
console.log('');
|
|
39
39
|
console.log(bold('Options:'));
|
|
40
|
-
console.log(' ' + yellow('--force') + '
|
|
41
|
-
console.log(' ' + yellow('--dry-run') + '
|
|
42
|
-
console.log(' ' + yellow('--
|
|
43
|
-
console.log(' ' + yellow('--
|
|
40
|
+
console.log(' ' + yellow('--force') + ' Overwrite existing files without prompting');
|
|
41
|
+
console.log(' ' + yellow('--dry-run') + ' Show what would be done without making changes');
|
|
42
|
+
console.log(' ' + yellow('--with-learning') + ' Add reward learning (memory protocol + reward tracker)');
|
|
43
|
+
console.log(' ' + yellow('--knowledge-extractor') + ' Add knowledge extractor skill (/harvest)');
|
|
44
|
+
console.log(' ' + yellow('--help, -h') + ' Show this help message');
|
|
45
|
+
console.log(' ' + yellow('--version, -v') + ' Show version number');
|
|
44
46
|
console.log('');
|
|
45
47
|
console.log(bold('Examples:'));
|
|
46
48
|
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr init');
|
|
49
|
+
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr init --with-learning');
|
|
50
|
+
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr init --with-learning --knowledge-extractor');
|
|
47
51
|
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr init --force');
|
|
48
|
-
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr update --dry-run');
|
|
49
52
|
console.log(dim(' $ ') + 'npx @dzhechkov/skills-feature-adr doctor');
|
|
50
53
|
console.log('');
|
|
51
54
|
console.log(bold('Integration:'));
|
|
52
55
|
console.log(' Works alongside @dzhechkov/keysarium and @dzhechkov/skills-bto.');
|
|
53
|
-
console.log('
|
|
56
|
+
console.log(' If @dzhechkov/keysarium is already installed, --with-learning and');
|
|
57
|
+
console.log(' --knowledge-extractor are not needed (already included in keysarium).');
|
|
54
58
|
console.log('');
|
|
55
59
|
}
|
|
56
60
|
|
|
@@ -63,6 +67,8 @@ function parseArgs(argv) {
|
|
|
63
67
|
const flags = {
|
|
64
68
|
force: false,
|
|
65
69
|
dryRun: false,
|
|
70
|
+
withLearning: false,
|
|
71
|
+
knowledgeExtractor: false,
|
|
66
72
|
targetDir: process.cwd(),
|
|
67
73
|
};
|
|
68
74
|
|
|
@@ -76,6 +82,12 @@ function parseArgs(argv) {
|
|
|
76
82
|
case '--dry-run':
|
|
77
83
|
flags.dryRun = true;
|
|
78
84
|
break;
|
|
85
|
+
case '--with-learning':
|
|
86
|
+
flags.withLearning = true;
|
|
87
|
+
break;
|
|
88
|
+
case '--knowledge-extractor':
|
|
89
|
+
flags.knowledgeExtractor = true;
|
|
90
|
+
break;
|
|
79
91
|
case '--help':
|
|
80
92
|
case '-h':
|
|
81
93
|
command = 'help';
|
package/src/commands/init.js
CHANGED
|
@@ -8,7 +8,7 @@ const {
|
|
|
8
8
|
copyDirRecursive, copyDirFiltered, fileExists, readJSON,
|
|
9
9
|
ensureDir, getRelativePaths, getRelativePathsFiltered,
|
|
10
10
|
createManifest, writeManifest, getTemplatesDir,
|
|
11
|
-
COMPONENTS, MANIFEST_FILE, getComponentFilter,
|
|
11
|
+
COMPONENTS, OPTIONAL_COMPONENTS, MANIFEST_FILE, getComponentFilter,
|
|
12
12
|
} = require('../utils');
|
|
13
13
|
|
|
14
14
|
// ---------------------------------------------------------------------------
|
|
@@ -47,6 +47,13 @@ function installComponent(key, comp, templatesDir, targetDir) {
|
|
|
47
47
|
return [];
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// Single file copy (for isFile components)
|
|
51
|
+
if (comp.isFile) {
|
|
52
|
+
ensureDir(path.dirname(dest));
|
|
53
|
+
fs.copyFileSync(src, dest);
|
|
54
|
+
return [comp.src];
|
|
55
|
+
}
|
|
56
|
+
|
|
50
57
|
const filterFn = getComponentFilter(comp);
|
|
51
58
|
|
|
52
59
|
if (filterFn) {
|
|
@@ -58,12 +65,33 @@ function installComponent(key, comp, templatesDir, targetDir) {
|
|
|
58
65
|
return getRelativePaths(dest).map((rel) => path.join(comp.src, rel));
|
|
59
66
|
}
|
|
60
67
|
|
|
68
|
+
// Resolve which optional component keys to install based on flags
|
|
69
|
+
function getOptionalKeys(flags, keysariumDetected) {
|
|
70
|
+
if (keysariumDetected) return []; // keysarium already provides these
|
|
71
|
+
|
|
72
|
+
const keys = [];
|
|
73
|
+
|
|
74
|
+
if (flags.withLearning) {
|
|
75
|
+
for (const [key, comp] of Object.entries(OPTIONAL_COMPONENTS)) {
|
|
76
|
+
if (comp.group === 'learning') keys.push(key);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (flags.knowledgeExtractor) {
|
|
81
|
+
for (const [key, comp] of Object.entries(OPTIONAL_COMPONENTS)) {
|
|
82
|
+
if (comp.group === 'knowledge-extractor') keys.push(key);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return keys;
|
|
87
|
+
}
|
|
88
|
+
|
|
61
89
|
// ---------------------------------------------------------------------------
|
|
62
90
|
// Main command
|
|
63
91
|
// ---------------------------------------------------------------------------
|
|
64
92
|
|
|
65
93
|
async function run(options) {
|
|
66
|
-
const { force, dryRun, targetDir } = options;
|
|
94
|
+
const { force, dryRun, targetDir, withLearning, knowledgeExtractor } = options;
|
|
67
95
|
const manifestPath = path.join(targetDir, MANIFEST_FILE);
|
|
68
96
|
|
|
69
97
|
// ── a) Check for existing installation ─────────────────────────────────
|
|
@@ -78,12 +106,23 @@ async function run(options) {
|
|
|
78
106
|
|
|
79
107
|
// ── b) Detect keysarium integration ────────────────────────────────────
|
|
80
108
|
const keysariumManifest = detectKeysarium(targetDir);
|
|
109
|
+
const keysariumDetected = !!keysariumManifest;
|
|
110
|
+
|
|
81
111
|
if (keysariumManifest) {
|
|
82
112
|
showKeysariumIntegration(keysariumManifest);
|
|
83
113
|
}
|
|
84
114
|
|
|
115
|
+
// Warn if flags used but keysarium already provides these
|
|
116
|
+
if (keysariumDetected && (withLearning || knowledgeExtractor)) {
|
|
117
|
+
console.log('');
|
|
118
|
+
warn('Keysarium is already installed \u2014 it includes learning and knowledge extraction.');
|
|
119
|
+
info('Flags --with-learning and --knowledge-extractor are not needed. Skipping optional components.');
|
|
120
|
+
console.log('');
|
|
121
|
+
}
|
|
122
|
+
|
|
85
123
|
// ── c) Determine components ────────────────────────────────────────────
|
|
86
124
|
const componentKeys = Object.keys(COMPONENTS);
|
|
125
|
+
const optionalKeys = getOptionalKeys(options, keysariumDetected);
|
|
87
126
|
const templatesDir = getTemplatesDir();
|
|
88
127
|
|
|
89
128
|
// ── d) Show plan ───────────────────────────────────────────────────────
|
|
@@ -97,6 +136,16 @@ async function run(options) {
|
|
|
97
136
|
console.log(` ${green('+')} ${comp.label}${filterNote}`);
|
|
98
137
|
}
|
|
99
138
|
|
|
139
|
+
if (optionalKeys.length > 0) {
|
|
140
|
+
console.log('');
|
|
141
|
+
info(bold('Optional components:'));
|
|
142
|
+
console.log('');
|
|
143
|
+
for (const key of optionalKeys) {
|
|
144
|
+
const comp = OPTIONAL_COMPONENTS[key];
|
|
145
|
+
console.log(` ${yellow('+')} ${comp.label}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
100
149
|
console.log('');
|
|
101
150
|
|
|
102
151
|
if (dryRun) {
|
|
@@ -104,14 +153,25 @@ async function run(options) {
|
|
|
104
153
|
process.exit(0);
|
|
105
154
|
}
|
|
106
155
|
|
|
107
|
-
// ── e) Install components
|
|
108
|
-
const totalComponents = componentKeys.length;
|
|
156
|
+
// ── e) Install core components ─────────────────────────────────────────
|
|
157
|
+
const totalComponents = componentKeys.length + optionalKeys.length;
|
|
109
158
|
const installedFiles = [];
|
|
159
|
+
let stepNum = 0;
|
|
110
160
|
|
|
111
|
-
for (
|
|
112
|
-
|
|
161
|
+
for (const key of componentKeys) {
|
|
162
|
+
stepNum++;
|
|
113
163
|
const comp = COMPONENTS[key];
|
|
114
|
-
step(
|
|
164
|
+
step(stepNum, totalComponents, `Installing ${comp.label}...`);
|
|
165
|
+
|
|
166
|
+
const files = installComponent(key, comp, templatesDir, targetDir);
|
|
167
|
+
installedFiles.push(...files);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ── e2) Install optional components ────────────────────────────────────
|
|
171
|
+
for (const key of optionalKeys) {
|
|
172
|
+
stepNum++;
|
|
173
|
+
const comp = OPTIONAL_COMPONENTS[key];
|
|
174
|
+
step(stepNum, totalComponents, `Installing ${comp.label}...`);
|
|
115
175
|
|
|
116
176
|
const files = installComponent(key, comp, templatesDir, targetDir);
|
|
117
177
|
installedFiles.push(...files);
|
|
@@ -122,7 +182,15 @@ async function run(options) {
|
|
|
122
182
|
const pkg = readJSON(pkgPath);
|
|
123
183
|
const version = pkg ? pkg.version : '0.0.0';
|
|
124
184
|
|
|
125
|
-
const
|
|
185
|
+
const allKeys = [...componentKeys, ...optionalKeys];
|
|
186
|
+
const manifest = createManifest(version, allKeys, installedFiles.sort());
|
|
187
|
+
|
|
188
|
+
// Track optional features in manifest
|
|
189
|
+
manifest.optional = {
|
|
190
|
+
withLearning: optionalKeys.some((k) => OPTIONAL_COMPONENTS[k]?.group === 'learning'),
|
|
191
|
+
knowledgeExtractor: optionalKeys.some((k) => OPTIONAL_COMPONENTS[k]?.group === 'knowledge-extractor'),
|
|
192
|
+
};
|
|
193
|
+
|
|
126
194
|
writeManifest(targetDir, manifest);
|
|
127
195
|
info(`Created ${MANIFEST_FILE} manifest`);
|
|
128
196
|
|
|
@@ -136,6 +204,10 @@ async function run(options) {
|
|
|
136
204
|
const comp = COMPONENTS[key];
|
|
137
205
|
console.log(` ${green('\u2713')} ${comp.label}`);
|
|
138
206
|
}
|
|
207
|
+
for (const key of optionalKeys) {
|
|
208
|
+
const comp = OPTIONAL_COMPONENTS[key];
|
|
209
|
+
console.log(` ${green('\u2713')} ${comp.label} ${yellow('[optional]')}`);
|
|
210
|
+
}
|
|
139
211
|
|
|
140
212
|
console.log('');
|
|
141
213
|
console.log(bold('Next steps:'));
|
|
@@ -143,6 +215,14 @@ async function run(options) {
|
|
|
143
215
|
console.log(` 2. Run ${cyan('/feature-adr [description]')} to start the pipeline`);
|
|
144
216
|
console.log(` 3. The Complexity Router will classify your feature as S/M/L/XL`);
|
|
145
217
|
console.log(` 4. Then the pipeline adapts: fewer steps for S, full DAG for XL`);
|
|
218
|
+
|
|
219
|
+
if (manifest.optional.withLearning) {
|
|
220
|
+
console.log(` 5. Reward learning is active \u2014 pipeline improves from your feedback`);
|
|
221
|
+
}
|
|
222
|
+
if (manifest.optional.knowledgeExtractor) {
|
|
223
|
+
console.log(` ${manifest.optional.withLearning ? '6' : '5'}. Run ${cyan('/harvest features/<slug>/')} after completing a feature to extract knowledge`);
|
|
224
|
+
}
|
|
225
|
+
|
|
146
226
|
console.log('');
|
|
147
227
|
|
|
148
228
|
console.log(bold('Complexity Tiers:'));
|
|
@@ -152,10 +232,19 @@ async function run(options) {
|
|
|
152
232
|
console.log(` ${bold('XL')} ${dim('\u2014 30+ files, ~4h+ (Full DAG + multi-agent swarm)')}`);
|
|
153
233
|
console.log('');
|
|
154
234
|
|
|
235
|
+
if (!withLearning && !knowledgeExtractor && !keysariumDetected) {
|
|
236
|
+
console.log(bold('Optional features:'));
|
|
237
|
+
console.log(` ${dim('Add reward learning:')} npx @dzhechkov/skills-feature-adr init --with-learning --force`);
|
|
238
|
+
console.log(` ${dim('Add knowledge extractor:')} npx @dzhechkov/skills-feature-adr init --knowledge-extractor --force`);
|
|
239
|
+
console.log(` ${dim('Add both:')} npx @dzhechkov/skills-feature-adr init --with-learning --knowledge-extractor --force`);
|
|
240
|
+
console.log('');
|
|
241
|
+
}
|
|
242
|
+
|
|
155
243
|
if (keysariumManifest) {
|
|
156
244
|
console.log(bold('Integration:'));
|
|
157
245
|
console.log(` Feature ADR is available alongside your Keysarium pipeline.`);
|
|
158
246
|
console.log(` Use ${cyan('/casarium')} for research, ${cyan('/feature-adr')} for feature development.`);
|
|
247
|
+
console.log(` Learning and knowledge extraction are provided by Keysarium.`);
|
|
159
248
|
console.log('');
|
|
160
249
|
}
|
|
161
250
|
|
package/src/utils.js
CHANGED
|
@@ -247,9 +247,24 @@ function getTemplatesDir() {
|
|
|
247
247
|
const COMPONENTS = {
|
|
248
248
|
skill: {
|
|
249
249
|
src: '.claude/skills/feature-adr',
|
|
250
|
-
label: 'Feature ADR Skill (
|
|
250
|
+
label: 'Feature ADR Skill (11 modules + references + agentic-qe)',
|
|
251
251
|
group: 'core',
|
|
252
252
|
},
|
|
253
|
+
skill_explore: {
|
|
254
|
+
src: '.claude/skills/explore',
|
|
255
|
+
label: 'Explore Skill (task clarification)',
|
|
256
|
+
group: 'deps',
|
|
257
|
+
},
|
|
258
|
+
skill_solver: {
|
|
259
|
+
src: '.claude/skills/problem-solver-enhanced',
|
|
260
|
+
label: 'Problem Solver Enhanced (TRIZ + Game Theory)',
|
|
261
|
+
group: 'deps',
|
|
262
|
+
},
|
|
263
|
+
skill_frontend: {
|
|
264
|
+
src: '.claude/skills/frontend-design',
|
|
265
|
+
label: 'Frontend Design Skill (UI implementation)',
|
|
266
|
+
group: 'deps',
|
|
267
|
+
},
|
|
253
268
|
commands: {
|
|
254
269
|
src: '.claude/commands',
|
|
255
270
|
label: 'Feature ADR Command (1 command)',
|
|
@@ -270,6 +285,41 @@ const COMPONENTS = {
|
|
|
270
285
|
},
|
|
271
286
|
};
|
|
272
287
|
|
|
288
|
+
// Optional components — installed only with explicit flags
|
|
289
|
+
const OPTIONAL_COMPONENTS = {
|
|
290
|
+
// --with-learning
|
|
291
|
+
learning_lib_memory: {
|
|
292
|
+
src: 'lib/memory-protocol.md',
|
|
293
|
+
label: 'Memory Protocol (reward-calibrated learning)',
|
|
294
|
+
group: 'learning',
|
|
295
|
+
isFile: true,
|
|
296
|
+
},
|
|
297
|
+
learning_lib_reward: {
|
|
298
|
+
src: 'lib/reward-tracker.md',
|
|
299
|
+
label: 'Reward Tracker (analytics & pattern detection)',
|
|
300
|
+
group: 'learning',
|
|
301
|
+
isFile: true,
|
|
302
|
+
},
|
|
303
|
+
learning_rule: {
|
|
304
|
+
src: '.claude/rules/reward-learning.md',
|
|
305
|
+
label: 'Reward Learning Rules',
|
|
306
|
+
group: 'learning',
|
|
307
|
+
isFile: true,
|
|
308
|
+
},
|
|
309
|
+
// --knowledge-extractor
|
|
310
|
+
knowledge_extractor_skill: {
|
|
311
|
+
src: '.claude/skills/knowledge-extractor',
|
|
312
|
+
label: 'Knowledge Extractor Skill (5 agents, 7 categories, 8 gates)',
|
|
313
|
+
group: 'knowledge-extractor',
|
|
314
|
+
},
|
|
315
|
+
knowledge_extractor_command: {
|
|
316
|
+
src: '.claude/commands',
|
|
317
|
+
label: 'Harvest Command (/harvest)',
|
|
318
|
+
group: 'knowledge-extractor',
|
|
319
|
+
filter: 'harvest',
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
|
|
273
323
|
// ===========================================================================
|
|
274
324
|
// Filter helpers
|
|
275
325
|
// ===========================================================================
|
|
@@ -328,6 +378,7 @@ module.exports = {
|
|
|
328
378
|
|
|
329
379
|
// Components
|
|
330
380
|
COMPONENTS,
|
|
381
|
+
OPTIONAL_COMPONENTS,
|
|
331
382
|
|
|
332
383
|
// Filters
|
|
333
384
|
getComponentFilter,
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: explore
|
|
3
|
+
description: >
|
|
4
|
+
Adaptive task exploration and clarification skill for transforming vague
|
|
5
|
+
requests into actionable specifications. Use when a user presents any task,
|
|
6
|
+
problem, or goal that requires clarification before execution. Triggers on
|
|
7
|
+
ambiguous requests, complex multi-part tasks, "I want to...", "help me with...",
|
|
8
|
+
strategic decisions, product ideas, creative briefs, and any situation where
|
|
9
|
+
understanding the real need is essential before proposing solutions. Does NOT
|
|
10
|
+
provide solutions until task is fully explored.
|
|
11
|
+
trust_tier: 1
|
|
12
|
+
trust_tier_label: "Structured"
|
|
13
|
+
trust_tier_path: "Run /bto-test to promote to Tier 2"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Explore: Adaptive Task Clarification
|
|
17
|
+
|
|
18
|
+
Transform vague requests into crystal-clear, actionable task specifications through systematic Socratic questioning.
|
|
19
|
+
|
|
20
|
+
## Core Philosophy
|
|
21
|
+
|
|
22
|
+
**Never solve before you understand.** Most failed solutions solve the wrong problem. This skill ensures the real problem is understood before any solution is proposed.
|
|
23
|
+
|
|
24
|
+
Key principles:
|
|
25
|
+
- Questions unlock understanding; answers often hide assumptions
|
|
26
|
+
- The stated goal is rarely the real goal
|
|
27
|
+
- Constraints reveal opportunities
|
|
28
|
+
- Success criteria prevent scope creep
|
|
29
|
+
|
|
30
|
+
## Task Classification
|
|
31
|
+
|
|
32
|
+
Before asking questions, classify the task type to select appropriate exploration dimensions:
|
|
33
|
+
|
|
34
|
+
| Task Type | Indicators | Primary Dimensions |
|
|
35
|
+
|-----------|------------|-------------------|
|
|
36
|
+
| **Product/Feature** | "build", "create app", "develop" | Outcome, Users, Constraints, Success |
|
|
37
|
+
| **Problem Solving** | "fix", "solve", "issue with" | Root Cause, Constraints, Attempted Solutions |
|
|
38
|
+
| **Decision Making** | "should I", "choose between", "evaluate" | Criteria, Tradeoffs, Timeline, Reversibility |
|
|
39
|
+
| **Creative** | "write", "design", "make content" | Audience, Tone, Format, Examples |
|
|
40
|
+
| **Research** | "find out", "analyze", "understand" | Scope, Depth, Sources, Deliverable |
|
|
41
|
+
| **Process/Workflow** | "how to", "improve process" | Current State, Desired State, Blockers |
|
|
42
|
+
|
|
43
|
+
## Exploration Dimensions
|
|
44
|
+
|
|
45
|
+
Select 3-5 dimensions based on task type. Each dimension has multiple question variants—choose the most natural for context.
|
|
46
|
+
|
|
47
|
+
### 1. The Real Objective
|
|
48
|
+
Uncover what success truly looks like, beyond the stated request.
|
|
49
|
+
|
|
50
|
+
**Questions:**
|
|
51
|
+
- "If this worked perfectly, what would be different in your [work/life/business]?"
|
|
52
|
+
- "What outcome would make you say 'this was absolutely worth it'?"
|
|
53
|
+
- "Is this goal a means to something else, or the end itself?"
|
|
54
|
+
- "If you could wave a magic wand and have any result, what would you choose?"
|
|
55
|
+
|
|
56
|
+
**Red flags to probe:** Generic goals ("make it better"), proxy metrics, solutions presented as requirements.
|
|
57
|
+
|
|
58
|
+
### 2. Constraints & Boundaries
|
|
59
|
+
Identify hard limits that shape the solution space.
|
|
60
|
+
|
|
61
|
+
**Questions:**
|
|
62
|
+
- "What's absolutely off the table—budget, time, technology, or approach-wise?"
|
|
63
|
+
- "What existing systems, processes, or decisions must this work with?"
|
|
64
|
+
- "Who needs to approve this, and what are their non-negotiables?"
|
|
65
|
+
- "What would disqualify a solution, even if it technically works?"
|
|
66
|
+
|
|
67
|
+
**Red flags to probe:** No constraints mentioned (usually means hidden ones), unrealistic expectations.
|
|
68
|
+
|
|
69
|
+
### 3. Available Resources
|
|
70
|
+
Understand leverage points and existing assets.
|
|
71
|
+
|
|
72
|
+
**Questions:**
|
|
73
|
+
- "What do you already have that we could build on—data, tools, people, prior work?"
|
|
74
|
+
- "Who else is involved, and what can they contribute?"
|
|
75
|
+
- "What similar problems have you solved before, and what worked?"
|
|
76
|
+
- "What's your actual capacity to implement this?"
|
|
77
|
+
|
|
78
|
+
**Red flags to probe:** Overestimated capabilities, unacknowledged dependencies.
|
|
79
|
+
|
|
80
|
+
### 4. Timeline & Urgency
|
|
81
|
+
Distinguish real deadlines from arbitrary ones.
|
|
82
|
+
|
|
83
|
+
**Questions:**
|
|
84
|
+
- "What happens if this takes 2x longer than expected?"
|
|
85
|
+
- "Is there a hard deadline, and what's driving it?"
|
|
86
|
+
- "Would you prefer a quick 80% solution or a slower 100% solution?"
|
|
87
|
+
- "What's the cost of delay vs. the cost of getting it wrong?"
|
|
88
|
+
|
|
89
|
+
**Red flags to probe:** Artificial urgency, no clear driver for deadline.
|
|
90
|
+
|
|
91
|
+
### 5. Success Criteria
|
|
92
|
+
Define what "done" actually means.
|
|
93
|
+
|
|
94
|
+
**Questions:**
|
|
95
|
+
- "How will you know this is successful? What will you measure?"
|
|
96
|
+
- "Who decides if this is good enough, and what will they look for?"
|
|
97
|
+
- "What's the minimum viable outcome that would still be valuable?"
|
|
98
|
+
- "In 6 months, what would make you regret the approach we took?"
|
|
99
|
+
|
|
100
|
+
**Red flags to probe:** Vague criteria ("stakeholders will be happy"), moving targets.
|
|
101
|
+
|
|
102
|
+
### 6. Attempted Solutions (for problems)
|
|
103
|
+
Learn from what hasn't worked.
|
|
104
|
+
|
|
105
|
+
**Questions:**
|
|
106
|
+
- "What have you already tried, and why didn't it work?"
|
|
107
|
+
- "What solutions have you considered but rejected?"
|
|
108
|
+
- "What would the obvious solution be, and why isn't that good enough?"
|
|
109
|
+
|
|
110
|
+
### 7. Audience & Stakeholders (for products/content)
|
|
111
|
+
Understand who this serves.
|
|
112
|
+
|
|
113
|
+
**Questions:**
|
|
114
|
+
- "Who specifically will use this, and what's their context when they do?"
|
|
115
|
+
- "What does your audience already know or believe about this?"
|
|
116
|
+
- "Who might be negatively affected, and does that matter?"
|
|
117
|
+
|
|
118
|
+
## Execution Protocol
|
|
119
|
+
|
|
120
|
+
### Phase 1: Initial Assessment (1 turn)
|
|
121
|
+
|
|
122
|
+
1. Parse the user's request
|
|
123
|
+
2. Identify what's already clear from context
|
|
124
|
+
3. Classify task type
|
|
125
|
+
4. Select 3-5 most critical dimensions
|
|
126
|
+
5. Note any immediate red flags or assumptions
|
|
127
|
+
|
|
128
|
+
### Phase 2: Adaptive Questioning (3-7 turns)
|
|
129
|
+
|
|
130
|
+
**Rules:**
|
|
131
|
+
- Ask ONE question at a time
|
|
132
|
+
- Make questions specific and decision-shaping, not generic
|
|
133
|
+
- Challenge vague answers: "Can you be more specific about...?"
|
|
134
|
+
- Acknowledge answers before next question
|
|
135
|
+
- Skip dimensions already clarified
|
|
136
|
+
- Stop when you have enough to create a clear brief
|
|
137
|
+
|
|
138
|
+
**Question Sequencing:**
|
|
139
|
+
1. Start with Real Objective (reveals the most)
|
|
140
|
+
2. Follow with Constraints (narrows solution space)
|
|
141
|
+
3. Then Success Criteria (defines done)
|
|
142
|
+
4. Fill gaps with other dimensions as needed
|
|
143
|
+
|
|
144
|
+
**Adaptive behavior:**
|
|
145
|
+
- If user gives detailed answer → compress follow-ups
|
|
146
|
+
- If user seems frustrated → summarize and ask if they want to continue
|
|
147
|
+
- If contradiction detected → gently probe: "Earlier you mentioned X, but now Y—help me understand?"
|
|
148
|
+
|
|
149
|
+
### Phase 3: Task Brief Synthesis (1 turn)
|
|
150
|
+
|
|
151
|
+
After sufficient exploration, synthesize into a **Task Brief**:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
## Task Brief
|
|
155
|
+
|
|
156
|
+
**Objective:** [Clear statement of what we're actually solving]
|
|
157
|
+
|
|
158
|
+
**Context:** [Relevant background and constraints]
|
|
159
|
+
|
|
160
|
+
**Success Criteria:**
|
|
161
|
+
- [Measurable criterion 1]
|
|
162
|
+
- [Measurable criterion 2]
|
|
163
|
+
|
|
164
|
+
**Constraints:**
|
|
165
|
+
- [Hard constraint 1]
|
|
166
|
+
- [Hard constraint 2]
|
|
167
|
+
|
|
168
|
+
**Resources Available:** [What we can leverage]
|
|
169
|
+
|
|
170
|
+
**Timeline:** [Deadline and urgency level]
|
|
171
|
+
|
|
172
|
+
**Key Assumptions:** [Things we're assuming that could change the approach]
|
|
173
|
+
|
|
174
|
+
**Out of Scope:** [Explicitly excluded items]
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Ask user: "Does this capture what you need? Anything to add or correct?"
|
|
178
|
+
|
|
179
|
+
### Phase 4: Handoff
|
|
180
|
+
|
|
181
|
+
Once validated, either:
|
|
182
|
+
- Proceed to solution (if user wants immediate help)
|
|
183
|
+
- Export brief for later use
|
|
184
|
+
- Suggest appropriate next steps/skills
|
|
185
|
+
|
|
186
|
+
## Anti-Patterns to Avoid
|
|
187
|
+
|
|
188
|
+
❌ **Interrogation mode:** Don't fire questions robotically
|
|
189
|
+
❌ **Assuming context:** Don't skip clarification because you "think" you understand
|
|
190
|
+
❌ **Premature solutions:** Don't hint at solutions before exploration is complete
|
|
191
|
+
❌ **Over-questioning:** Stop when you have enough clarity
|
|
192
|
+
❌ **Generic questions:** Each question should be tailored to this specific task
|
|
193
|
+
❌ **Ignoring signals:** If user provides info proactively, don't re-ask
|
|
194
|
+
|
|
195
|
+
## Example Flow
|
|
196
|
+
|
|
197
|
+
**User:** "I want to create a dashboard for my team"
|
|
198
|
+
|
|
199
|
+
**Claude (Phase 1 assessment):**
|
|
200
|
+
- Task type: Product/Feature
|
|
201
|
+
- Unclear: Who uses it, what data, what decisions it enables, timeline
|
|
202
|
+
- Dimensions needed: Real Objective, Audience, Constraints, Success Criteria
|
|
203
|
+
|
|
204
|
+
**Claude:** "Before we dive in—what decisions will your team make differently once they have this dashboard? What's the main insight they're missing today?"
|
|
205
|
+
|
|
206
|
+
*[User answers about tracking project delays]*
|
|
207
|
+
|
|
208
|
+
**Claude:** "Got it—so the core need is visibility into project health to catch delays early. How do you know a project is delayed today? What's the current process for catching these issues?"
|
|
209
|
+
|
|
210
|
+
*[Continues adaptively based on answers...]*
|
|
211
|
+
|
|
212
|
+
## Integration Notes
|
|
213
|
+
|
|
214
|
+
After exploration, this skill can hand off to:
|
|
215
|
+
- problem-solver-enhanced (for complex problems)
|
|
216
|
+
- goap-research (for research tasks)
|
|
217
|
+
- frontend-design (for UI/product tasks)
|
|
218
|
+
- Any implementation skill with the structured Task Brief
|