wize-dev-kit 0.11.0 → 0.12.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/AGENTS.md +3 -3
- package/CHANGELOG.md +29 -0
- package/package.json +1 -1
- package/src/app-overlay/wize-app-release-channels/workflow.md +2 -0
- package/src/app-overlay/wize-app-scaffold/workflow.md +2 -0
- package/src/app-overlay/wize-app-store-listing/workflow.md +2 -0
- package/src/builder-skills/wize-create-agent/workflow.md +2 -0
- package/src/builder-skills/wize-create-skill/workflow.md +2 -0
- package/src/builder-skills/wize-create-workflow/workflow.md +2 -0
- package/src/core-skills/wize-advanced-elicitation/skill.md +2 -0
- package/src/core-skills/wize-brainstorming/skill.md +2 -0
- package/src/core-skills/wize-customize/skill.md +2 -0
- package/src/core-skills/wize-editorial-review-prose/skill.md +2 -0
- package/src/core-skills/wize-editorial-review-structure/skill.md +2 -0
- package/src/core-skills/wize-grill/skill.md +3 -1
- package/src/core-skills/wize-index-docs/skill.md +3 -1
- package/src/core-skills/wize-review-adversarial/skill.md +2 -0
- package/src/core-skills/wize-review-edge-case-hunter/skill.md +2 -0
- package/src/core-skills/wize-shard-doc/skill.md +2 -0
- package/src/core-skills/wize-spec/skill.md +2 -0
- package/src/method-skills/1-analysis/wize-agent-analyst/agent.yaml +3 -0
- package/src/method-skills/1-analysis/wize-document-project/workflow.md +2 -0
- package/src/method-skills/1-analysis/wize-domain-research/workflow.md +7 -0
- package/src/method-skills/1-analysis/wize-market-research/workflow.md +7 -0
- package/src/method-skills/1-analysis/wize-prfaq/workflow.md +2 -0
- package/src/method-skills/1-analysis/wize-product-brief/workflow.md +2 -0
- package/src/method-skills/1-analysis/wize-refresh-knowledge/workflow.md +3 -1
- package/src/method-skills/1-analysis/wize-research/workflow.md +24 -89
- package/src/method-skills/1-analysis/wize-technical-research/workflow.md +7 -0
- package/src/method-skills/1-analysis/wize-trigger-map/workflow.md +2 -0
- package/src/method-skills/2-plan-workflows/wize-create-prd/workflow.md +2 -0
- package/src/method-skills/2-plan-workflows/wize-edit-prd/workflow.md +3 -1
- package/src/method-skills/2-plan-workflows/wize-ux-design/workflow.md +2 -0
- package/src/method-skills/2-plan-workflows/wize-ux-scenarios/workflow.md +2 -0
- package/src/method-skills/2-plan-workflows/wize-validate-prd/workflow.md +2 -0
- package/src/method-skills/3-solutioning/wize-check-implementation-readiness/workflow.md +2 -0
- package/src/method-skills/3-solutioning/wize-create-architecture/steps/step-08-complete.md +1 -1
- package/src/method-skills/3-solutioning/wize-create-architecture/workflow.md +2 -0
- package/src/method-skills/3-solutioning/wize-create-epics-and-stories/workflow.md +2 -0
- package/src/method-skills/3-solutioning/wize-design-system/workflow.md +2 -0
- package/src/method-skills/3-solutioning/wize-nfr-principles/workflow.md +3 -1
- package/src/method-skills/3-solutioning/wize-project-context/workflow.md +3 -1
- package/src/method-skills/3-solutioning/wize-tech-vision/workflow.md +3 -1
- package/src/method-skills/4-implementation/wize-changelog/workflow.md +184 -0
- package/src/method-skills/4-implementation/wize-checkpoint-preview/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-code-review/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-correct-course/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-create-story/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-dev-story/workflow.md +3 -1
- package/src/method-skills/4-implementation/wize-investigate/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-quick-dev/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-release/workflow.md +162 -0
- package/src/method-skills/4-implementation/wize-retrospective/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-sprint-planning/workflow.md +2 -0
- package/src/method-skills/4-implementation/wize-sprint-status/workflow.md +2 -0
- package/src/method-skills/module.yaml +12 -3
- package/src/orchestrator-skills/module.yaml +4 -1
- package/src/orchestrator-skills/wize/skill.md +164 -0
- package/src/orchestrator-skills/wize-help/skill.md +126 -5
- package/src/orchestrator-skills/wize-onboarding/workflow.md +3 -1
- package/src/orchestrator-skills/wize-orchestrator/agent.yaml +1 -0
- package/src/orchestrator-skills/wize-orchestrator/persona.md +29 -4
- package/src/orchestrator-skills/wize-party-mode/workflow.md +2 -0
- package/src/security-overlay/_shared/scope-parser.js +27 -0
- package/src/security-overlay/agents/red-teamer/agent.yaml +2 -0
- package/src/security-overlay/agents/red-teamer/persona.md +6 -0
- package/src/security-overlay/skills/wize-sec-enumerate/skill.md +2 -0
- package/src/security-overlay/skills/wize-sec-pentest/scripts/run-pipeline.js +18 -1
- package/src/security-overlay/skills/wize-sec-pentest/skill.md +2 -0
- package/src/security-overlay/skills/wize-sec-recon/skill.md +2 -0
- package/src/security-overlay/skills/wize-sec-scope/scripts/generate-scope.js +106 -0
- package/src/security-overlay/skills/wize-sec-scope/skill.md +52 -0
- package/src/tea-skills/wize-qa-generate-e2e-tests/workflow.md +2 -0
- package/src/tea-skills/wize-tea-design/workflow.md +3 -0
- package/src/tea-skills/wize-tea-gate/workflow.md +3 -0
- package/src/tea-skills/wize-tea-nfr/workflow.md +3 -0
- package/src/tea-skills/wize-tea-review/workflow.md +3 -0
- package/src/tea-skills/wize-tea-risk/workflow.md +3 -0
- package/src/tea-skills/wize-tea-trace/workflow.md +3 -0
- package/src/web-overlay/wize-web-deploy/workflow.md +2 -0
- package/src/web-overlay/wize-web-scaffold/workflow.md +2 -0
- package/src/web-overlay/wize-web-seo-audit/workflow.md +2 -0
- package/tools/installer/commands/doctor.js +2 -2
- package/tools/installer/onboarding.js +14 -21
- package/tools/installer/render-shared.js +50 -28
- package/tools/installer/validators/run-all.js +3 -2
- package/tools/installer/wize-cli.js +323 -77
|
@@ -252,13 +252,13 @@ async function cmdDoctor({ kitRoot, projectRoot, opts = {} } = {}) {
|
|
|
252
252
|
const age = f.days == null ? 'no last_refreshed' : `${f.days}d ago`;
|
|
253
253
|
log(` ${f.name.padEnd(28)} ${age}`);
|
|
254
254
|
if (f.days != null && f.days > 60) {
|
|
255
|
-
suggestions.push({ level: 'warn', text: `\`${f.name}\` last refreshed ${f.days}d ago. Run
|
|
255
|
+
suggestions.push({ level: 'warn', text: `\`${f.name}\` last refreshed ${f.days}d ago. Run \`/wize-refresh-knowledge\` after current sprint.` });
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
if (knowledge.pendingLines > 0) {
|
|
259
259
|
log(` _pending.md: ${knowledge.pendingLines} inline note(s) waiting consolidation`);
|
|
260
260
|
if (knowledge.pendingLines >= 5) {
|
|
261
|
-
suggestions.push({ level: 'info', text: `${knowledge.pendingLines} notes piled up in _pending.md. Time to run
|
|
261
|
+
suggestions.push({ level: 'info', text: `${knowledge.pendingLines} notes piled up in _pending.md. Time to run \`/wize-refresh-knowledge\`.` });
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
264
|
const markerText = knowledge.toBeGeneratedMarkers > 0 ? `${knowledge.toBeGeneratedMarkers} marker(s)` : 'none';
|
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Onboarding handoff — Wizer-driven triage after install.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Returns a clean, minimal message (≤3 lines) that always ends with "→ /wize".
|
|
5
|
+
* The message adapts to brownfield detection and active profiles without
|
|
6
|
+
* turning into a wall of text.
|
|
6
7
|
*/
|
|
7
8
|
'use strict';
|
|
8
9
|
|
|
9
10
|
function compose(detection, profiles) {
|
|
10
|
-
const lines = [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
'
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
lines.push('
|
|
19
|
-
lines.push(' → /wize-document-project');
|
|
11
|
+
const lines = [];
|
|
12
|
+
const profileCodes = new Set(profiles.map(p => p.code));
|
|
13
|
+
|
|
14
|
+
if (detection && detection.brownfield) {
|
|
15
|
+
lines.push('Brownfield detected — baseline ready.');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (profileCodes.has('security-overlay')) {
|
|
19
|
+
lines.push('Security pentest available (/wize-sec-recon).');
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
lines.push('
|
|
23
|
-
lines.push(' → /wize-product-brief (Pepper)');
|
|
24
|
-
lines.push(' → /wize-create-prd (Maria Hill, if brief exists)');
|
|
25
|
-
lines.push(' → /wize-create-architecture (Tony, if PRD exists)');
|
|
26
|
-
lines.push(' → /wize-quick-dev (Shuri, for small fixes)');
|
|
27
|
-
if (profiles.find(p => p.code === 'web-overlay')) lines.push(' → /wize-web-scaffold (overlay)');
|
|
28
|
-
if (profiles.find(p => p.code === 'app-overlay')) lines.push(' → /wize-app-scaffold (overlay)');
|
|
29
|
-
if (profiles.find(p => p.code === 'security-overlay')) lines.push(' → /wize-sec-pentest (overlay)');
|
|
21
|
+
|
|
22
|
+
lines.push('→ /wize');
|
|
30
23
|
return lines.join('\n');
|
|
31
24
|
}
|
|
32
25
|
|
|
@@ -12,6 +12,32 @@ const fs = require('node:fs');
|
|
|
12
12
|
const path = require('node:path');
|
|
13
13
|
const { walkAgents, walkWorkflows, walkSkills } = require('./validators/walk.js');
|
|
14
14
|
|
|
15
|
+
// Shared block-scalar reader used by both readYamlField (agent.yaml) and
|
|
16
|
+
// readFrontmatter (skill.md / workflow.md). Returns { value, nextIndex }.
|
|
17
|
+
function readBlockScalar(lines, startIndex, folded) {
|
|
18
|
+
const collected = [];
|
|
19
|
+
let baseIndent = null;
|
|
20
|
+
let i = startIndex;
|
|
21
|
+
for (; i < lines.length; i++) {
|
|
22
|
+
const line = lines[i];
|
|
23
|
+
if (line.trim() === '') { collected.push(''); continue; }
|
|
24
|
+
const indent = line.match(/^(\s*)/)[1].length;
|
|
25
|
+
if (indent === 0) break; // dedent to a sibling top-level key ends the block
|
|
26
|
+
if (baseIndent === null) baseIndent = indent;
|
|
27
|
+
collected.push(line.slice(baseIndent));
|
|
28
|
+
}
|
|
29
|
+
while (collected.length && collected[collected.length - 1] === '') collected.pop();
|
|
30
|
+
if (folded) {
|
|
31
|
+
const value = collected.reduce((acc, ln, idx) => {
|
|
32
|
+
if (idx === 0) return ln;
|
|
33
|
+
if (ln === '' || collected[idx - 1] === '') return acc + '\n' + ln;
|
|
34
|
+
return acc + ' ' + ln;
|
|
35
|
+
}, '').trim();
|
|
36
|
+
return { value, nextIndex: i };
|
|
37
|
+
}
|
|
38
|
+
return { value: collected.join('\n').trim(), nextIndex: i };
|
|
39
|
+
}
|
|
40
|
+
|
|
15
41
|
function readYamlField(content, field) {
|
|
16
42
|
const lines = content.split('\n');
|
|
17
43
|
const keyRe = new RegExp('^' + field + ':\\s*(.*)$');
|
|
@@ -23,27 +49,7 @@ function readYamlField(content, field) {
|
|
|
23
49
|
// Block scalar (| literal, > folded) with optional chomp/indent indicator.
|
|
24
50
|
const block = inline.match(/^([|>])[+-]?\d*\s*$/);
|
|
25
51
|
if (block) {
|
|
26
|
-
|
|
27
|
-
const collected = [];
|
|
28
|
-
let baseIndent = null;
|
|
29
|
-
for (let j = i + 1; j < lines.length; j++) {
|
|
30
|
-
const line = lines[j];
|
|
31
|
-
if (line.trim() === '') { collected.push(''); continue; }
|
|
32
|
-
const indent = line.match(/^(\s*)/)[1].length;
|
|
33
|
-
if (indent === 0) break; // dedent to a sibling top-level key ends the block
|
|
34
|
-
if (baseIndent === null) baseIndent = indent;
|
|
35
|
-
collected.push(line.slice(baseIndent));
|
|
36
|
-
}
|
|
37
|
-
while (collected.length && collected[collected.length - 1] === '') collected.pop();
|
|
38
|
-
if (folded) {
|
|
39
|
-
// Folded: blank line -> newline, otherwise join lines with a space.
|
|
40
|
-
return collected.reduce((acc, ln, idx) => {
|
|
41
|
-
if (idx === 0) return ln;
|
|
42
|
-
if (ln === '' || collected[idx - 1] === '') return acc + '\n' + ln;
|
|
43
|
-
return acc + ' ' + ln;
|
|
44
|
-
}, '').trim();
|
|
45
|
-
}
|
|
46
|
-
return collected.join('\n').trim();
|
|
52
|
+
return readBlockScalar(lines, i + 1, block[1] === '>').value;
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
// Inline scalar: quoted or plain.
|
|
@@ -59,9 +65,25 @@ function readFrontmatter(content) {
|
|
|
59
65
|
if (end === -1) return {};
|
|
60
66
|
const lines = content.slice(3, end).split('\n');
|
|
61
67
|
const out = {};
|
|
62
|
-
for (
|
|
68
|
+
for (let i = 0; i < lines.length; i++) {
|
|
69
|
+
const line = lines[i];
|
|
63
70
|
const m = line.match(/^([a-zA-Z_][a-zA-Z0-9_-]*):\s*(.*?)\s*$/);
|
|
64
|
-
if (m)
|
|
71
|
+
if (!m) continue;
|
|
72
|
+
const key = m[1];
|
|
73
|
+
const inline = m[2].trim();
|
|
74
|
+
|
|
75
|
+
// Block scalar (| literal, > folded) with optional chomp/indent indicator.
|
|
76
|
+
const block = inline.match(/^([|>])[+-]?\d*\s*$/);
|
|
77
|
+
if (block) {
|
|
78
|
+
const result = readBlockScalar(lines, i + 1, block[1] === '>');
|
|
79
|
+
out[key] = result.value;
|
|
80
|
+
i = result.nextIndex - 1; // -1 because the for loop will increment
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Inline scalar: quoted or plain.
|
|
85
|
+
const q = inline.match(/^"([^"]*)"$/) || inline.match(/^'([^']*)'$/);
|
|
86
|
+
out[key] = (q ? q[1] : inline).trim();
|
|
65
87
|
}
|
|
66
88
|
return out;
|
|
67
89
|
}
|
|
@@ -154,7 +176,7 @@ function collectAssets(kitRoot, { profiles = ['core'] } = {}) {
|
|
|
154
176
|
code: fm.code,
|
|
155
177
|
name: fm.name || fm.code,
|
|
156
178
|
title: fm.phase || fm.gate || '',
|
|
157
|
-
description: `${fm.phase || fm.gate || 'workflow'}: ${fm.name || fm.code}`,
|
|
179
|
+
description: fm.description || `${fm.phase || fm.gate || 'workflow'}: ${fm.name || fm.code}`,
|
|
158
180
|
body: bodyAfterFrontmatter(content),
|
|
159
181
|
overlay: fm.overlay || null,
|
|
160
182
|
owner: fm.owner || null,
|
|
@@ -175,7 +197,7 @@ function collectAssets(kitRoot, { profiles = ['core'] } = {}) {
|
|
|
175
197
|
code: fm.code,
|
|
176
198
|
name: fm.name || fm.code,
|
|
177
199
|
title: fm.module || '',
|
|
178
|
-
description: fm.module ? `${fm.module} skill: ${fm.name || fm.code}` : (fm.name || fm.code),
|
|
200
|
+
description: fm.description || (fm.module ? `${fm.module} skill: ${fm.name || fm.code}` : (fm.name || fm.code)),
|
|
179
201
|
body: bodyAfterFrontmatter(content),
|
|
180
202
|
overlay: fm.overlay || null,
|
|
181
203
|
owner: fm.owner || null,
|
|
@@ -272,8 +294,8 @@ function renderAgentsMd(kitRoot, projectRoot, opts = {}) {
|
|
|
272
294
|
'instructions and persistent memory — not background reading. Read project state before',
|
|
273
295
|
'acting; write what you change back into `.wize/` so the next session inherits it.',
|
|
274
296
|
'',
|
|
275
|
-
'Before editing, classify the demand via `/wize-help
|
|
276
|
-
'
|
|
297
|
+
'Before editing, classify the demand via `/wize` (or `/wize-help`): **Quick Dev** (small, predictable,',
|
|
298
|
+
'trivially scoped, no new feature / architecture / UX / security) or **Full Lifecycle**. Never pick',
|
|
277
299
|
'Quick Dev just to skip artifacts.',
|
|
278
300
|
'',
|
|
279
301
|
'When a skill fans out to subagents, match the model tier to the task: a lightweight tier',
|
|
@@ -288,7 +310,7 @@ function renderAgentsMd(kitRoot, projectRoot, opts = {}) {
|
|
|
288
310
|
const optIn = a.code.startsWith('wize-sec-') ? ' _(security-overlay, opt-in)_' : '';
|
|
289
311
|
lines.push(`- **${a.name}** (\`${a.code}\`)${optIn} — ${a.title}. ${clipOneLine(a.description, 180)}`);
|
|
290
312
|
}
|
|
291
|
-
lines.push('', '## Where to start', '', 'Activate the orchestrator: `wize-
|
|
313
|
+
lines.push('', '## Where to start', '', 'Activate the orchestrator: `/wize` (or `/wize-help`). Wizer will guide you.', '');
|
|
292
314
|
|
|
293
315
|
if (opts.dryRun) return { written: ['[dry-run] AGENTS.md'], skipped: [] };
|
|
294
316
|
fs.writeFileSync(file, lines.join('\n'), 'utf-8');
|
|
@@ -13,7 +13,7 @@ const { walkAgents, walkWorkflows, walkSkills } = require('./walk.js');
|
|
|
13
13
|
function checkAgent(file) {
|
|
14
14
|
const content = fs.readFileSync(file, 'utf-8');
|
|
15
15
|
const errs = [];
|
|
16
|
-
if (!/^code:\s+wize
|
|
16
|
+
if (!/^code:\s+wize(-|$)/m.test(content)) errs.push('missing or invalid "code:" prefix');
|
|
17
17
|
if (!/^name:/m.test(content)) errs.push('missing "name:"');
|
|
18
18
|
if (!/^title:/m.test(content)) errs.push('missing "title:"');
|
|
19
19
|
if (!/^description:/m.test(content)) errs.push('missing "description:"');
|
|
@@ -24,9 +24,10 @@ function checkWorkflow(file) {
|
|
|
24
24
|
const content = fs.readFileSync(file, 'utf-8');
|
|
25
25
|
const errs = [];
|
|
26
26
|
if (!/^---\s*$/m.test(content)) errs.push('missing YAML frontmatter');
|
|
27
|
-
if (!/^code:\s+wize
|
|
27
|
+
if (!/^code:\s+wize(-|$)/m.test(content)) errs.push('missing or invalid "code:" prefix');
|
|
28
28
|
if (!/^name:/m.test(content)) errs.push('missing "name:"');
|
|
29
29
|
if (!/^owner:/m.test(content) && !/^module:/m.test(content)) errs.push('missing "owner:" or "module:"');
|
|
30
|
+
if (!/^description:/m.test(content)) errs.push('missing "description:"');
|
|
30
31
|
return errs;
|
|
31
32
|
}
|
|
32
33
|
|