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.
Files changed (87) hide show
  1. package/AGENTS.md +3 -3
  2. package/CHANGELOG.md +29 -0
  3. package/package.json +1 -1
  4. package/src/app-overlay/wize-app-release-channels/workflow.md +2 -0
  5. package/src/app-overlay/wize-app-scaffold/workflow.md +2 -0
  6. package/src/app-overlay/wize-app-store-listing/workflow.md +2 -0
  7. package/src/builder-skills/wize-create-agent/workflow.md +2 -0
  8. package/src/builder-skills/wize-create-skill/workflow.md +2 -0
  9. package/src/builder-skills/wize-create-workflow/workflow.md +2 -0
  10. package/src/core-skills/wize-advanced-elicitation/skill.md +2 -0
  11. package/src/core-skills/wize-brainstorming/skill.md +2 -0
  12. package/src/core-skills/wize-customize/skill.md +2 -0
  13. package/src/core-skills/wize-editorial-review-prose/skill.md +2 -0
  14. package/src/core-skills/wize-editorial-review-structure/skill.md +2 -0
  15. package/src/core-skills/wize-grill/skill.md +3 -1
  16. package/src/core-skills/wize-index-docs/skill.md +3 -1
  17. package/src/core-skills/wize-review-adversarial/skill.md +2 -0
  18. package/src/core-skills/wize-review-edge-case-hunter/skill.md +2 -0
  19. package/src/core-skills/wize-shard-doc/skill.md +2 -0
  20. package/src/core-skills/wize-spec/skill.md +2 -0
  21. package/src/method-skills/1-analysis/wize-agent-analyst/agent.yaml +3 -0
  22. package/src/method-skills/1-analysis/wize-document-project/workflow.md +2 -0
  23. package/src/method-skills/1-analysis/wize-domain-research/workflow.md +7 -0
  24. package/src/method-skills/1-analysis/wize-market-research/workflow.md +7 -0
  25. package/src/method-skills/1-analysis/wize-prfaq/workflow.md +2 -0
  26. package/src/method-skills/1-analysis/wize-product-brief/workflow.md +2 -0
  27. package/src/method-skills/1-analysis/wize-refresh-knowledge/workflow.md +3 -1
  28. package/src/method-skills/1-analysis/wize-research/workflow.md +24 -89
  29. package/src/method-skills/1-analysis/wize-technical-research/workflow.md +7 -0
  30. package/src/method-skills/1-analysis/wize-trigger-map/workflow.md +2 -0
  31. package/src/method-skills/2-plan-workflows/wize-create-prd/workflow.md +2 -0
  32. package/src/method-skills/2-plan-workflows/wize-edit-prd/workflow.md +3 -1
  33. package/src/method-skills/2-plan-workflows/wize-ux-design/workflow.md +2 -0
  34. package/src/method-skills/2-plan-workflows/wize-ux-scenarios/workflow.md +2 -0
  35. package/src/method-skills/2-plan-workflows/wize-validate-prd/workflow.md +2 -0
  36. package/src/method-skills/3-solutioning/wize-check-implementation-readiness/workflow.md +2 -0
  37. package/src/method-skills/3-solutioning/wize-create-architecture/steps/step-08-complete.md +1 -1
  38. package/src/method-skills/3-solutioning/wize-create-architecture/workflow.md +2 -0
  39. package/src/method-skills/3-solutioning/wize-create-epics-and-stories/workflow.md +2 -0
  40. package/src/method-skills/3-solutioning/wize-design-system/workflow.md +2 -0
  41. package/src/method-skills/3-solutioning/wize-nfr-principles/workflow.md +3 -1
  42. package/src/method-skills/3-solutioning/wize-project-context/workflow.md +3 -1
  43. package/src/method-skills/3-solutioning/wize-tech-vision/workflow.md +3 -1
  44. package/src/method-skills/4-implementation/wize-changelog/workflow.md +184 -0
  45. package/src/method-skills/4-implementation/wize-checkpoint-preview/workflow.md +2 -0
  46. package/src/method-skills/4-implementation/wize-code-review/workflow.md +2 -0
  47. package/src/method-skills/4-implementation/wize-correct-course/workflow.md +2 -0
  48. package/src/method-skills/4-implementation/wize-create-story/workflow.md +2 -0
  49. package/src/method-skills/4-implementation/wize-dev-story/workflow.md +3 -1
  50. package/src/method-skills/4-implementation/wize-investigate/workflow.md +2 -0
  51. package/src/method-skills/4-implementation/wize-quick-dev/workflow.md +2 -0
  52. package/src/method-skills/4-implementation/wize-release/workflow.md +162 -0
  53. package/src/method-skills/4-implementation/wize-retrospective/workflow.md +2 -0
  54. package/src/method-skills/4-implementation/wize-sprint-planning/workflow.md +2 -0
  55. package/src/method-skills/4-implementation/wize-sprint-status/workflow.md +2 -0
  56. package/src/method-skills/module.yaml +12 -3
  57. package/src/orchestrator-skills/module.yaml +4 -1
  58. package/src/orchestrator-skills/wize/skill.md +164 -0
  59. package/src/orchestrator-skills/wize-help/skill.md +126 -5
  60. package/src/orchestrator-skills/wize-onboarding/workflow.md +3 -1
  61. package/src/orchestrator-skills/wize-orchestrator/agent.yaml +1 -0
  62. package/src/orchestrator-skills/wize-orchestrator/persona.md +29 -4
  63. package/src/orchestrator-skills/wize-party-mode/workflow.md +2 -0
  64. package/src/security-overlay/_shared/scope-parser.js +27 -0
  65. package/src/security-overlay/agents/red-teamer/agent.yaml +2 -0
  66. package/src/security-overlay/agents/red-teamer/persona.md +6 -0
  67. package/src/security-overlay/skills/wize-sec-enumerate/skill.md +2 -0
  68. package/src/security-overlay/skills/wize-sec-pentest/scripts/run-pipeline.js +18 -1
  69. package/src/security-overlay/skills/wize-sec-pentest/skill.md +2 -0
  70. package/src/security-overlay/skills/wize-sec-recon/skill.md +2 -0
  71. package/src/security-overlay/skills/wize-sec-scope/scripts/generate-scope.js +106 -0
  72. package/src/security-overlay/skills/wize-sec-scope/skill.md +52 -0
  73. package/src/tea-skills/wize-qa-generate-e2e-tests/workflow.md +2 -0
  74. package/src/tea-skills/wize-tea-design/workflow.md +3 -0
  75. package/src/tea-skills/wize-tea-gate/workflow.md +3 -0
  76. package/src/tea-skills/wize-tea-nfr/workflow.md +3 -0
  77. package/src/tea-skills/wize-tea-review/workflow.md +3 -0
  78. package/src/tea-skills/wize-tea-risk/workflow.md +3 -0
  79. package/src/tea-skills/wize-tea-trace/workflow.md +3 -0
  80. package/src/web-overlay/wize-web-deploy/workflow.md +2 -0
  81. package/src/web-overlay/wize-web-scaffold/workflow.md +2 -0
  82. package/src/web-overlay/wize-web-seo-audit/workflow.md +2 -0
  83. package/tools/installer/commands/doctor.js +2 -2
  84. package/tools/installer/onboarding.js +14 -21
  85. package/tools/installer/render-shared.js +50 -28
  86. package/tools/installer/validators/run-all.js +3 -2
  87. package/tools/installer/wize-cli.js +323 -77
@@ -1,5 +1,7 @@
1
1
  ---
2
+
2
3
  code: wize-web-seo-audit
4
+ description: "Use quando o projeto web estiver no ar e precisar de auditoria de SEO."
3
5
  name: Web SEO Audit
4
6
  overlay: web
5
7
  owner: wize-agent-pm # Maria Hill commissions; Mantis + Tony execute
@@ -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 \`wize-refresh-knowledge\` after current sprint.` });
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 \`wize-refresh-knowledge\`.` });
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
- * Stub: in v0.1 this just prints the first action Wizer would take.
5
- * In a real run this would be a workflow executed by the active IDE adapter.
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
- '╭─ Wizer ─────────────────────────────────────╮',
13
- '│ Welcome back. What are we working on? │',
14
- '╰─────────────────────────────────────────────╯'
15
- ];
16
- if (detection.brownfield) {
17
- lines.push('');
18
- lines.push('I see this repo already has code. I can ask Pepper and Peggy to baseline it before we plan.');
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
- lines.push('');
22
- lines.push('When ready, name the next step:');
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
- const folded = block[1] === '>';
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 (const line of lines) {
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) out[m[1]] = m[2].replace(/^"|"$/g, '').replace(/^'|'$/g, '');
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`: **Quick Dev** (small, predictable,',
276
- '~≤1h, no new feature / architecture / UX / security) or **Full Lifecycle**. Never pick',
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-orchestrator` (Wizer). Then ask `/wize-help`.', '');
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-/m.test(content)) errs.push('missing or invalid "code:" prefix');
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-/m.test(content)) errs.push('missing or invalid "code:" prefix');
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