@brunosps00/dev-workflow 1.1.3 → 1.2.1

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 (62) hide show
  1. package/README.md +22 -15
  2. package/bin/dev-workflow.js +1 -1
  3. package/lib/constants.js +6 -2
  4. package/lib/doctor.js +3 -1
  5. package/lib/install-deps.js +3 -3
  6. package/lib/setup-wsl-browser.js +2 -2
  7. package/lib/skill-registry.js +47 -0
  8. package/package.json +1 -1
  9. package/scaffold/en/agent-instructions.md +5 -2
  10. package/scaffold/en/commands/dw-analyze-project.md +1 -1
  11. package/scaffold/en/commands/dw-brainstorm.md +4 -1
  12. package/scaffold/en/commands/dw-functional-doc.md +3 -3
  13. package/scaffold/en/commands/dw-harness-audit.md +4 -2
  14. package/scaffold/en/commands/dw-help.md +12 -7
  15. package/scaffold/en/commands/dw-opportunities.md +131 -0
  16. package/scaffold/en/commands/dw-refactor.md +54 -0
  17. package/scaffold/en/commands/dw-review.md +1 -1
  18. package/scaffold/en/commands/dw-skill-health.md +11 -3
  19. package/scaffold/en/references/refactoring-catalog.md +1 -1
  20. package/scaffold/en/templates/constitution-template.md +1 -1
  21. package/scaffold/pt-br/agent-instructions.md +5 -2
  22. package/scaffold/pt-br/commands/dw-analyze-project.md +1 -1
  23. package/scaffold/pt-br/commands/dw-brainstorm.md +4 -1
  24. package/scaffold/pt-br/commands/dw-functional-doc.md +3 -3
  25. package/scaffold/pt-br/commands/dw-harness-audit.md +4 -2
  26. package/scaffold/pt-br/commands/dw-help.md +14 -7
  27. package/scaffold/pt-br/commands/dw-opportunities.md +131 -0
  28. package/scaffold/pt-br/commands/dw-refactor.md +54 -0
  29. package/scaffold/pt-br/commands/dw-review.md +1 -1
  30. package/scaffold/pt-br/commands/dw-skill-health.md +11 -3
  31. package/scaffold/pt-br/references/refactoring-catalog.md +1 -1
  32. package/scaffold/pt-br/templates/constitution-template.md +1 -1
  33. package/scaffold/scripts/functional-doc/run-playwright-flow.mjs +55 -24
  34. package/scaffold/scripts/lib/capture-screenshots.mjs +56 -17
  35. package/scaffold/scripts/lib/resolve-browser.mjs +43 -40
  36. package/scaffold/skill-registry.json +1 -12
  37. package/scaffold/skills/api-testing-recipes/SKILL.md +12 -0
  38. package/scaffold/skills/docker-compose-recipes/SKILL.md +12 -0
  39. package/scaffold/skills/dw-codebase-intel/SKILL.md +13 -1
  40. package/scaffold/skills/dw-council/SKILL.md +12 -0
  41. package/scaffold/skills/dw-debug-protocol/SKILL.md +12 -0
  42. package/scaffold/skills/dw-execute-phase/SKILL.md +12 -0
  43. package/scaffold/skills/dw-git-discipline/SKILL.md +12 -0
  44. package/scaffold/skills/dw-incident-response/SKILL.md +12 -0
  45. package/scaffold/skills/dw-llm-eval/SKILL.md +12 -0
  46. package/scaffold/skills/dw-memory/SKILL.md +12 -0
  47. package/scaffold/skills/dw-review-rigor/SKILL.md +14 -2
  48. package/scaffold/skills/dw-search-first/SKILL.md +12 -0
  49. package/scaffold/skills/dw-silent-failure/SKILL.md +12 -0
  50. package/scaffold/skills/dw-simplification/SKILL.md +18 -6
  51. package/scaffold/skills/dw-simplification/references/deep-modules.md +1 -1
  52. package/scaffold/skills/dw-source-grounding/SKILL.md +12 -0
  53. package/scaffold/skills/dw-testing-discipline/SKILL.md +12 -0
  54. package/scaffold/skills/dw-testing-discipline/references/playwright-recipes.md +15 -16
  55. package/scaffold/skills/dw-ui-discipline/SKILL.md +12 -0
  56. package/scaffold/skills/dw-verify/SKILL.md +10 -0
  57. package/scaffold/skills/humanizer/SKILL.md +12 -0
  58. package/scaffold/skills/remotion-best-practices/SKILL.md +12 -0
  59. package/scaffold/skills/security-review/SKILL.md +12 -0
  60. package/scaffold/skills/vercel-react-best-practices/SKILL.md +12 -0
  61. package/scaffold/skills/vercel-react-best-practices/references/perf-discipline.md +1 -1
  62. package/scaffold/skills/dw-context-budget/SKILL.md +0 -45
@@ -10,8 +10,10 @@ Voce e o auditor de saude de skills e agentes do dev-workflow.
10
10
  1. Leia `scaffold/skill-registry.json` ao auditar o repo dev-workflow, ou `.dw/skill-registry.json` + `.agents/skills/` em projetos consumidores.
11
11
  2. Agrupe skills por `kind`: `protocol`, `domain-pack`, `recipe-pack`, `asset-pack`.
12
12
  3. Valide que toda skill tem trigger, output esperado, owner, load policy e limite de contexto.
13
- 4. Aponte nomes duplicados, `SKILL.md` ausente, frontmatter ausente, `SKILL.md` grande demais, e references/assets lidos sem trigger especifico.
14
- 5. Recomende manter, compactar entrypoint, mesclar, reclassificar, ou remover da visibilidade core.
13
+ 4. Valide que todo `SKILL.md` bundled tem contrato `## Structured Return` com `Status`, `Scope`, `Evidence`, `Artifacts`, `Decisions`, `Risks` e `Next Step`.
14
+ 5. Confirme que o vocabulario de `Status` esta explicito: `PASS`, `FINDINGS`, `BLOCKED`, `NOT_APPLICABLE`.
15
+ 6. Aponte nomes duplicados, `SKILL.md` ausente, frontmatter ausente, `SKILL.md` grande demais, metadata de output esperado desatualizada, e references/assets lidos sem trigger especifico.
16
+ 7. Recomende manter, compactar entrypoint, mesclar, reclassificar, adicionar retorno estruturado, ou remover da visibilidade core.
15
17
 
16
18
  ## Taxonomia
17
19
 
@@ -23,7 +25,13 @@ Voce e o auditor de saude de skills e agentes do dev-workflow.
23
25
  `SKILL.md` deve ser um roteador/protocolo curto. Regras longas, exemplos, paletas, receitas, services e assets ficam em references/assets/rules/recipes e sao carregados sob demanda.
24
26
 
25
27
  ## Saida
26
- Retorne um relatorio conciso. Nao delete arquivos.
28
+ Retorne um relatorio conciso com uma secao de retorno estruturado. Nao delete arquivos.
29
+
30
+ Inclua:
31
+ - Status geral: `PASS`, `FINDINGS` ou `BLOCKED`.
32
+ - Issues de registry/schema.
33
+ - Cobertura de retorno estruturado, incluindo qualquer skill sem contrato ou vocabulario de status.
34
+ - Top 3 fixes.
27
35
 
28
36
  Marcador final: `## SKILL-HEALTH COMPLETE`
29
37
  </system_instructions>
@@ -1,6 +1,6 @@
1
1
  # Catálogo de Refatoração — Exemplos Antes/Depois
2
2
 
3
- Referência para `/dw-brainstorm --refactor`. Baseado no catálogo de Fowler.
3
+ Referência para `/dw-refactor` e `/dw-brainstorm --mode=refactor-audit`. Baseado no catálogo de Fowler.
4
4
 
5
5
  ## 1. Função Longa → Extract Function
6
6
 
@@ -71,7 +71,7 @@ mode: defaults | custom
71
71
  **P-008 — Queries N+1 são flagueadas em code review** (severity: info)
72
72
  **Regra:** Loops ou operações em lista que disparam chamadas DB/HTTP por item devem batchar (ex: `IN (...)`, `findMany`, DataLoader) ou ser explicitamente justificadas.
73
73
  **Why:** Padrões N+1 escalam linearmente com tamanho dos dados e silenciosamente degradam até que a carga de produção revele.
74
- **Enforcement:** `dw-code-review` e `dw-refactoring-analysis` detectam padrões await-em-loop contra módulos de repository / API client.
74
+ **Enforcement:** `/dw-review` e `/dw-refactor` detectam padrões await-em-loop contra módulos de repository / API client.
75
75
 
76
76
  ---
77
77
 
@@ -6,10 +6,9 @@
6
6
  // which is the only mechanism that works over connectOverCDP (recordVideo does not).
7
7
  // Driving directly also removes the dependency on the project's playwright.config.*.
8
8
  //
9
- // Browser selection is delegated to ../lib/resolve-browser.mjs (WSL-resilient): a Windows
10
- // browser over CDP when reachable, otherwise the full headless Chromium (desktop-faithful,
11
- // no WSLg). The flow module is plain .mjs exporting `async function flow({ page, context,
12
- // expect, baseURL, step, shot })`.
9
+ // Browser selection is delegated to ../lib/resolve-browser.mjs (WSL-resilient): Playwright
10
+ // Chromium is primary, with a configured Windows/CDP target only as fallback. The flow module
11
+ // is plain .mjs exporting `async function flow({ page, context, expect, baseURL, step, shot })`.
13
12
 
14
13
  import fs from "node:fs";
15
14
  import path from "node:path";
@@ -79,22 +78,51 @@ async function importPlaywright() {
79
78
  }
80
79
  }
81
80
 
82
- async function openBrowser(chromium, descriptor) {
81
+ async function openBrowser(chromium, descriptor, log) {
83
82
  if (descriptor.mode === "cdp") {
84
- const browser = await chromium.connectOverCDP(descriptor.endpoint);
85
- return { browser, cleanup: descriptor.cleanup ?? (async () => {}) };
83
+ let browser;
84
+ try {
85
+ browser = await chromium.connectOverCDP(descriptor.endpoint);
86
+ } catch (error) {
87
+ await (descriptor.cleanup ?? (async () => {}))();
88
+ throw error;
89
+ }
90
+ return { browser, descriptor, cleanup: descriptor.cleanup ?? (async () => {}) };
91
+ }
92
+ try {
93
+ const browser = await chromium.launch(descriptor.launchOptions);
94
+ return {
95
+ browser,
96
+ descriptor,
97
+ cleanup: async () => {
98
+ try {
99
+ await browser.close();
100
+ } catch {
101
+ // ignore
102
+ }
103
+ },
104
+ };
105
+ } catch (primaryError) {
106
+ if (typeof descriptor.openFallback !== "function") {
107
+ throw primaryError;
108
+ }
109
+ log(`browser launch failed (${primaryError.message}); trying CDP fallback from ${descriptor.fallback?.source ?? "config"}.`);
110
+ let fallbackDescriptor;
111
+ try {
112
+ fallbackDescriptor = await descriptor.openFallback();
113
+ } catch (fallbackError) {
114
+ throw new Error(`Playwright Chromium launch failed: ${primaryError.message}; CDP fallback failed: ${fallbackError.message}`);
115
+ }
116
+ let browser;
117
+ try {
118
+ browser = await chromium.connectOverCDP(fallbackDescriptor.endpoint);
119
+ } catch (error) {
120
+ await (fallbackDescriptor.cleanup ?? (async () => {}))();
121
+ throw new Error(`Playwright Chromium launch failed: ${primaryError.message}; CDP fallback failed: ${error.message}`);
122
+ }
123
+ log(`browser fallback: mode=${fallbackDescriptor.mode} source=${fallbackDescriptor.source}`);
124
+ return { browser, descriptor: fallbackDescriptor, cleanup: fallbackDescriptor.cleanup ?? (async () => {}) };
86
125
  }
87
- const browser = await chromium.launch(descriptor.launchOptions);
88
- return {
89
- browser,
90
- cleanup: async () => {
91
- try {
92
- await browser.close();
93
- } catch {
94
- // ignore
95
- }
96
- },
97
- };
98
126
  }
99
127
 
100
128
  async function openContext(browser, descriptor, { resolution, baseURL }) {
@@ -168,15 +196,18 @@ async function main() {
168
196
  };
169
197
 
170
198
  const descriptor = await resolveBrowser({ projectRoot, headless: true });
171
- log(`browser: mode=${descriptor.mode} source=${descriptor.source}`);
199
+ log(
200
+ `browser: mode=${descriptor.mode} source=${descriptor.source}` +
201
+ (descriptor.fallback ? ` fallback=${descriptor.fallback.source}` : ""),
202
+ );
172
203
  if (args.browserName && args.browserName !== "chromium") {
173
204
  log(`note: --browser-name=${args.browserName} ignored; screencast/CDP require Chromium.`);
174
205
  }
175
206
 
176
- const { browser, cleanup: cleanupBrowser } = await openBrowser(chromium, descriptor);
177
- const { context, owns: ownsContext } = await openContext(browser, descriptor, { resolution, baseURL });
207
+ const { browser, descriptor: activeDescriptor, cleanup: cleanupBrowser } = await openBrowser(chromium, descriptor, log);
208
+ const { context, owns: ownsContext } = await openContext(browser, activeDescriptor, { resolution, baseURL });
178
209
  const page = await context.newPage();
179
- if (descriptor.mode === "cdp") {
210
+ if (activeDescriptor.mode === "cdp") {
180
211
  try {
181
212
  await page.setViewportSize({ width: resolution.width, height: resolution.height });
182
213
  } catch {
@@ -263,8 +294,8 @@ async function main() {
263
294
 
264
295
  updateManifest(manifestPath, {
265
296
  status,
266
- browserMode: descriptor.mode,
267
- browserSource: descriptor.source,
297
+ browserMode: activeDescriptor.mode,
298
+ browserSource: activeDescriptor.source,
268
299
  recording,
269
300
  videoResolution: resolution.label,
270
301
  video: videoExists ? videoPath : null,
@@ -62,6 +62,55 @@ function slugify(value) {
62
62
  );
63
63
  }
64
64
 
65
+ async function openBrowser(chromium, descriptor) {
66
+ if (descriptor.mode === "cdp") {
67
+ let browser;
68
+ try {
69
+ browser = await chromium.connectOverCDP(descriptor.endpoint);
70
+ } catch (error) {
71
+ await (descriptor.cleanup ?? (async () => {}))();
72
+ throw error;
73
+ }
74
+ return { browser, descriptor, cleanup: descriptor.cleanup ?? (async () => {}) };
75
+ }
76
+ try {
77
+ const browser = await chromium.launch(descriptor.launchOptions);
78
+ return {
79
+ browser,
80
+ descriptor,
81
+ cleanup: async () => {
82
+ try {
83
+ await browser.close();
84
+ } catch {
85
+ // ignore
86
+ }
87
+ },
88
+ };
89
+ } catch (primaryError) {
90
+ if (typeof descriptor.openFallback !== "function") {
91
+ throw primaryError;
92
+ }
93
+ process.stderr.write(
94
+ `browser launch failed (${primaryError.message}); trying CDP fallback from ${descriptor.fallback?.source ?? "config"}.\n`,
95
+ );
96
+ let fallbackDescriptor;
97
+ try {
98
+ fallbackDescriptor = await descriptor.openFallback();
99
+ } catch (fallbackError) {
100
+ throw new Error(`Playwright Chromium launch failed: ${primaryError.message}; CDP fallback failed: ${fallbackError.message}`);
101
+ }
102
+ let browser;
103
+ try {
104
+ browser = await chromium.connectOverCDP(fallbackDescriptor.endpoint);
105
+ } catch (error) {
106
+ await (fallbackDescriptor.cleanup ?? (async () => {}))();
107
+ throw new Error(`Playwright Chromium launch failed: ${primaryError.message}; CDP fallback failed: ${error.message}`);
108
+ }
109
+ process.stderr.write(`browser fallback: mode=${fallbackDescriptor.mode} source=${fallbackDescriptor.source}\n`);
110
+ return { browser, descriptor: fallbackDescriptor, cleanup: fallbackDescriptor.cleanup ?? (async () => {}) };
111
+ }
112
+ }
113
+
65
114
  async function main() {
66
115
  const args = parseArgs(process.argv.slice(2));
67
116
  if (!args.url) {
@@ -85,27 +134,17 @@ async function main() {
85
134
 
86
135
  fs.mkdirSync(outDir, { recursive: true });
87
136
  const descriptor = await resolveBrowser({ projectRoot: process.cwd(), headless: true });
88
- process.stderr.write(`browser: mode=${descriptor.mode} source=${descriptor.source}\n`);
137
+ process.stderr.write(
138
+ `browser: mode=${descriptor.mode} source=${descriptor.source}` +
139
+ (descriptor.fallback ? ` fallback=${descriptor.fallback.source}` : "") +
140
+ "\n",
141
+ );
89
142
 
90
- let browser;
91
- let cleanup = async () => {};
92
- if (descriptor.mode === "cdp") {
93
- browser = await chromium.connectOverCDP(descriptor.endpoint);
94
- cleanup = descriptor.cleanup ?? (async () => {});
95
- } else {
96
- browser = await chromium.launch(descriptor.launchOptions);
97
- cleanup = async () => {
98
- try {
99
- await browser.close();
100
- } catch {
101
- // ignore
102
- }
103
- };
104
- }
143
+ const { browser, descriptor: activeDescriptor, cleanup } = await openBrowser(chromium, descriptor);
105
144
 
106
145
  const shots = [];
107
146
  try {
108
- const existing = descriptor.mode === "cdp" ? browser.contexts()[0] : null;
147
+ const existing = activeDescriptor.mode === "cdp" ? browser.contexts()[0] : null;
109
148
  const context = existing ?? (await browser.newContext());
110
149
  const ownsContext = !existing;
111
150
  const page = await context.newPage();
@@ -3,19 +3,17 @@
3
3
  // Resolves which browser to drive for dev-workflow's browser-automation flows
4
4
  // (dw-qa, dw-functional-doc, dw-redesign-ui), with WSL resilience.
5
5
  //
6
- // Resolution order: env BROWSER_TEST -> .dw/config.json (browserTest) -> auto-detect.
7
- // On WSL with no explicit config, auto-detects a Windows browser (Edge first, then
8
- // Chrome) and launches it in remote-debugging mode so flows connect over CDP instead
9
- // of opening WSLg / losing layout fidelity in the bundled Linux Chromium.
6
+ // Resolution order: Playwright Chromium primary -> optional CDP fallback from env
7
+ // BROWSER_TEST or .dw/config.json (browserTest).
10
8
  //
11
9
  // Returns one of:
12
- // { mode: "cdp", endpoint, source, cleanup } // connect over CDP (browser ready)
13
- // { mode: "launch", launchOptions, source } // let Playwright launch the browser
10
+ // { mode: "launch", launchOptions, source, fallback?, openFallback? } // let Playwright launch first
11
+ // { mode: "cdp", endpoint, source, cleanup } // resolved fallback descriptor
14
12
  //
15
- // DEFAULT (no BROWSER_TEST): the full Playwright Chromium in headless via
16
- // channel:"chromium", which uses the new headless mode (desktop-faithful rendering,
17
- // not the lighter headless-shell) and never opens WSLg. This is the robust default on
18
- // WSL. Set BROWSER_TEST to opt into a Windows browser.
13
+ // DEFAULT: full Playwright Chromium in headless via channel:"chromium", which uses the
14
+ // new headless mode (desktop-faithful rendering, not the lighter headless-shell) and
15
+ // never opens WSLg. BROWSER_TEST can provide a CDP/Windows-browser fallback when the
16
+ // primary Playwright launch fails.
19
17
  //
20
18
  // NOTE on WSL networking: the Chromium debug port binds Windows loopback only. In mirrored
21
19
  // networking mode WSL shares that loopback, so 127.0.0.1 connects directly. In NAT mode the
@@ -548,21 +546,45 @@ async function launchWindowsBrowser(exePath, { headless, projectRoot }) {
548
546
 
549
547
  const noopCleanup = async () => {};
550
548
 
551
- function bundledDescriptor(headless, source = "bundled") {
549
+ function bundledDescriptor(headless, source = "playwright-default") {
552
550
  return { mode: "launch", launchOptions: { ...BUNDLED_LAUNCH, headless }, source };
553
551
  }
554
552
 
555
- // When an explicit BROWSER_TEST cannot be honored, degrade to the headless default
556
- // (resilient) unless allowFallback is false (then throw, e.g. for diagnostics).
557
- function degradeOrThrow(message, { headless, allowFallback }) {
558
- if (allowFallback) {
559
- process.stderr.write(`resolve-browser: ${message} Falling back to headless Chromium.\n`);
560
- return bundledDescriptor(headless, "fallback");
553
+ function cdpFallbackInfo({ kind, source, value }) {
554
+ return { mode: "cdp", kind, source, value };
555
+ }
556
+
557
+ async function resolveCdpFallback({ kind, value, source, projectRoot, headless }) {
558
+ if (kind === "cdp") {
559
+ const url = new URL(value.replace(/^cdp:\/\//i, "http://"));
560
+ const port = Number(url.port) || 9222;
561
+ const found = await findReachableCdp(port, [url.hostname]);
562
+ if (!found) {
563
+ throw new Error(`CDP fallback '${value}' is not reachable (start the browser with --remote-debugging-port=${port}).`);
564
+ }
565
+ return { mode: "cdp", endpoint: found.base, source: `fallback:${source}`, cleanup: noopCleanup };
561
566
  }
562
- throw new Error(message);
567
+
568
+ if (kind === "exe") {
569
+ if (!fs.existsSync(value)) {
570
+ throw new Error(`CDP fallback points to '${value}', but that file does not exist.`);
571
+ }
572
+ const descriptor = await launchWindowsBrowser(value, { headless, projectRoot });
573
+ return { ...descriptor, source: `fallback:${descriptor.source}` };
574
+ }
575
+
576
+ throw new Error(`Unsupported CDP fallback kind '${kind}'.`);
563
577
  }
564
578
 
565
- export async function resolveBrowser({ projectRoot, headless = true, allowFallback = true } = {}) {
579
+ function withCdpFallback(primary, fallbackArgs) {
580
+ return {
581
+ ...primary,
582
+ fallback: cdpFallbackInfo(fallbackArgs),
583
+ openFallback: () => resolveCdpFallback(fallbackArgs),
584
+ };
585
+ }
586
+
587
+ export async function resolveBrowser({ projectRoot, headless = true } = {}) {
566
588
  const { value, source } = readConfigValue(projectRoot);
567
589
 
568
590
  if (!value) {
@@ -572,30 +594,11 @@ export async function resolveBrowser({ projectRoot, headless = true, allowFallba
572
594
  const kind = classifyValue(value);
573
595
 
574
596
  if (kind === "cdp") {
575
- const url = new URL(value.replace(/^cdp:\/\//i, "http://"));
576
- const port = Number(url.port) || 9222;
577
- const found = await findReachableCdp(port, [url.hostname]);
578
- if (!found) {
579
- return degradeOrThrow(
580
- `BROWSER_TEST endpoint '${value}' is not reachable (start the browser with --remote-debugging-port=${port}).`,
581
- { headless, allowFallback },
582
- );
583
- }
584
- return { mode: "cdp", endpoint: found.base, source, cleanup: noopCleanup };
597
+ return withCdpFallback(bundledDescriptor(headless), { kind, value, source, projectRoot, headless });
585
598
  }
586
599
 
587
600
  if (kind === "exe") {
588
- if (!fs.existsSync(value)) {
589
- return degradeOrThrow(`BROWSER_TEST points to '${value}', but that file does not exist.`, {
590
- headless,
591
- allowFallback,
592
- });
593
- }
594
- try {
595
- return await launchWindowsBrowser(value, { headless, projectRoot });
596
- } catch (error) {
597
- return degradeOrThrow(error.message, { headless, allowFallback });
598
- }
601
+ return withCdpFallback(bundledDescriptor(headless), { kind, value, source, projectRoot, headless });
599
602
  }
600
603
 
601
604
  // channel: chrome | msedge | chromium
@@ -34,17 +34,6 @@
34
34
  "context_limit": 12000,
35
35
  "bundled": true
36
36
  },
37
- {
38
- "name": "dw-context-budget",
39
- "kind": "protocol",
40
- "tier": "core",
41
- "owner": "dw-context-budget",
42
- "trigger": "Context overhead, slow sessions, many agents/skills/MCPs",
43
- "expected_output": "A context budget report with concrete savings.",
44
- "load_policy": "always-small",
45
- "context_limit": 6000,
46
- "bundled": true
47
- },
48
37
  {
49
38
  "name": "dw-council",
50
39
  "kind": "protocol",
@@ -240,7 +229,7 @@
240
229
  "trigger": "Security review, sensitive code, OWASP checks, auth/payment/input surfaces",
241
230
  "expected_output": "High-confidence security findings or explicit pass.",
242
231
  "load_policy": "lazy-references",
243
- "context_limit": 12000,
232
+ "context_limit": 14000,
244
233
  "bundled": true
245
234
  },
246
235
  {
@@ -102,3 +102,15 @@ Per-recipe details in `references/auth-patterns.md`.
102
102
  ## Inspired by
103
103
 
104
104
  Hand-curated by dev-workflow. `.http` syntax follows the JetBrains HTTP Client / VSCode REST Client conventions. Per-stack recipes adapt patterns from each ecosystem's official testing docs (FastAPI testing tutorial, NestJS testing recipes, Microsoft.AspNetCore.Mvc.Testing docs, Axum testing examples).
105
+
106
+ ## Structured Return
107
+
108
+ When invoked directly or by a harness, return or merge this block:
109
+
110
+ - **Status:** `PASS` when a recipe and evidence path are selected, `FINDINGS` when API test gaps remain, `BLOCKED` when the stack or auth flow is unknown, `NOT_APPLICABLE` when no HTTP/API surface is in scope.
111
+ - **Scope:** API surface, requirement/RF, auth mode, and selected recipe.
112
+ - **Evidence:** route/schema/source files read and request/response logs or planned log path.
113
+ - **Artifacts:** `.http` file, test file, matrix, or log path to create/update.
114
+ - **Decisions:** why this recipe fits the stack and why alternatives were rejected.
115
+ - **Risks:** credentials, environment dependencies, flaky external calls, or uncovered negative cases.
116
+ - **Next Step:** exact command or file edit needed to execute the recipe.
@@ -82,3 +82,15 @@ Each row points to `services/<name>.yml`.
82
82
  ## Inspired by
83
83
 
84
84
  Hand-curated by dev-workflow. Service defaults follow upstream documentation (Docker Hub `postgres`, `redis`, `mailhog/mailhog`, `minio/minio`, `getmeili/meilisearch`, `jaegertracing/all-in-one`, `traefik`). Healthcheck patterns adapted from `docker-library/healthcheck` and the official compose docs.
85
+
86
+ ## Structured Return
87
+
88
+ When invoked directly or by a harness, return or merge this block:
89
+
90
+ - **Status:** `PASS` when service recipes and compose guidance are selected, `FINDINGS` when compose gaps remain, `BLOCKED` when required ports/secrets/envs are unknown, `NOT_APPLICABLE` when no local infrastructure service is in scope.
91
+ - **Scope:** services, project mode (`dev`/`prod`), ports, volumes, and env files touched.
92
+ - **Evidence:** existing compose files, service references, healthcheck needs, and conflicting ports.
93
+ - **Artifacts:** compose snippets/files, `.env` keys, healthchecks, and follow-up reference files.
94
+ - **Decisions:** selected service recipe, image tag policy, and any prod/dev transform.
95
+ - **Risks:** secret leakage, readiness ambiguity, data persistence, mail routing, or destructive defaults.
96
+ - **Next Step:** exact compose edit and validation command.
@@ -11,7 +11,7 @@ allowed-tools:
11
11
 
12
12
  # dw-codebase-intel
13
13
 
14
- Bundled skill that gives dev-workflow native **codebase intelligence** — a queryable knowledge base of the project's stack, file graph, API surface, dependencies, and architecture. Other commands (`/dw-plan prd`, `/dw-plan techspec`, `/dw-review --code-only`, `/dw-brainstorm --refactor`, `/dw-brainstorm`, etc.) read from this index instead of re-exploring the codebase on every invocation.
14
+ Bundled skill that gives dev-workflow native **codebase intelligence** — a queryable knowledge base of the project's stack, file graph, API surface, dependencies, and architecture. Other commands (`/dw-plan prd`, `/dw-plan techspec`, `/dw-review --code-only`, `/dw-opportunities`, `/dw-refactor`, `/dw-brainstorm`, etc.) read from this index instead of re-exploring the codebase on every invocation.
15
15
 
16
16
  ## Why a skill (not inline)
17
17
 
@@ -111,3 +111,15 @@ If no `.dw/intel/` exists at all, `/dw-intel` falls back to `.dw/rules/` (seeded
111
111
  Adapted from [`get-shit-done-cc`](https://github.com/gsd-build/get-shit-done) (`gsd-intel-updater`) by gsd-build (MIT license). Core schemas (`files.json`, `apis.json`, `deps.json`, `stack.json`, `arch.md`) and incremental update protocol preserved. Path conventions changed from `.planning/intel/` to `.dw/intel/`. CLI tooling (`gsd-sdk query intel.*`) replaced by agent-driven inline operations (no separate runtime). The companion `gsd-codebase-mapper` agent (human-readable analysis docs) was NOT ported — its scope overlaps with the existing `/dw-analyze-project` command which writes to `.dw/rules/`.
112
112
 
113
113
  The `bugfixes.json` index and the `bugfix-history` / `risk-area` query shapes (see `references/query-patterns.md`) were added in v1.0.2 to enable cross-skill awareness of `.dw/bugfixes/` — adapted from the operational-memory pattern in [`tech-leads-club/agent-skills/tlc-spec-driven`](https://github.com/tech-leads-club/agent-skills/tree/main/packages/skills-catalog/skills/(development)/tlc-spec-driven) (CC-BY-4.0, Felipe Rodrigues). The original skill maintains a single `STATE.md`; dev-workflow splits this into project-level `.dw/STATE.md` (session continuity) and a queryable `bugfixes.json` (historical fixes), which compose with the existing per-PRD `MEMORY.md`.
114
+
115
+ ## Structured Return
116
+
117
+ When invoked directly or by a harness, return or merge this block:
118
+
119
+ - **Status:** `PASS` when indexes are updated or the query answer is cited, `FINDINGS` when intel is stale/incomplete, `BLOCKED` when required project files cannot be read, `NOT_APPLICABLE` when the task does not need codebase intel.
120
+ - **Scope:** index files, query type, module, and paths inspected.
121
+ - **Evidence:** cited `.dw/intel/*` entries, source files, timestamps, or stale-index indicators.
122
+ - **Artifacts:** updated index files, query answer, codemap, or bugfix index path.
123
+ - **Decisions:** whether to rebuild, incrementally update, or answer from existing intel.
124
+ - **Risks:** stale docs, missing generated files, broad reads, or uncited conclusions.
125
+ - **Next Step:** exact index update, query refinement, or source read required.
@@ -180,3 +180,15 @@ Adaptations for dev-workflow:
180
180
  - Integration points map to dev-workflow commands (`dw-brainstorm`, `dw-create-techspec`) instead of Compozy's idea-factory pipeline
181
181
 
182
182
  Credit: Compozy project (https://github.com/compozy/compozy).
183
+
184
+ ## Structured Return
185
+
186
+ When invoked directly or by a harness, return or merge this block:
187
+
188
+ - **Status:** `PASS` when advisor positions and a recommendation are complete, `FINDINGS` when unresolved tensions remain, `BLOCKED` when inputs or constraints are missing, `NOT_APPLICABLE` when no high-impact tradeoff exists.
189
+ - **Scope:** decision, constraints, advisors consulted, and artifact path.
190
+ - **Evidence:** each advisor's cited position and the facts they used.
191
+ - **Artifacts:** council report, debate notes, or decision summary path.
192
+ - **Decisions:** recommended path, rejected alternatives, and what would change the call.
193
+ - **Risks:** unresolved disagreement, missing stakeholder data, or unvalidated assumptions.
194
+ - **Next Step:** concrete follow-up: accept, run experiment, gather data, or escalate.
@@ -106,3 +106,15 @@ After 60 minutes stuck at step 2 (localize) or step 4 (root cause), surface the
106
106
  - Don't silently spin. Fresh eyes find what stuck eyes miss.
107
107
 
108
108
  This is not failure — it's protocol. Stuck > 1 hour is a signal, not a flaw.
109
+
110
+ ## Structured Return
111
+
112
+ When invoked directly or by a harness, return or merge this block:
113
+
114
+ - **Status:** `PASS` when the bug is reproduced, root-caused, guarded, and verified, `FINDINGS` when a confirmed defect remains, `BLOCKED` when reproduction/localization is impossible, `NOT_APPLICABLE` when the task is not bug-shaped.
115
+ - **Scope:** symptom, affected surface, environment, and triage step reached.
116
+ - **Evidence:** reproduction command, failing output, localized files, and root-cause proof.
117
+ - **Artifacts:** bugfix task/report, regression test, logs, or verification output.
118
+ - **Decisions:** chosen fix path and rejected hypotheses.
119
+ - **Risks:** non-reproducibility, partial guard coverage, rollback gaps, or hidden adjacent defects.
120
+ - **Next Step:** next triage step or verification command.
@@ -131,3 +131,15 @@ If the executor exhausts its context budget mid-phase OR the user signals stop:
131
131
  ## Inspired by
132
132
 
133
133
  Adapted from [`get-shit-done-cc`](https://github.com/gsd-build/get-shit-done) (`gsd-executor`, `gsd-plan-checker`) by gsd-build (MIT license). Core protocols (goal-backward verification, atomic commits, deviation handling, checkpoint resume) preserved. Path conventions changed from `.planning/<phase>/` to `.dw/spec/prd-<slug>/`. SDK CLI calls (`gsd-sdk query init.execute-phase`) replaced by inline operations. The companion `gsd-debugger` agent (1452 lines) was NOT ported — its scope overlaps with the existing `/dw-bugfix` and `/dw-qa --fix` commands.
134
+
135
+ ## Structured Return
136
+
137
+ When invoked directly or by a harness, return or merge this block:
138
+
139
+ - **Status:** `PASS` when plan-check and execution wave complete, `FINDINGS` when deviations or failed tasks remain, `BLOCKED` when plan-check returns `REVISE`/`BLOCK`, `NOT_APPLICABLE` when no task execution is in scope.
140
+ - **Scope:** PRD/spec slug, wave, tasks, dependencies, and agent roles.
141
+ - **Evidence:** plan-check verdict, task files read, command outputs, and deviation notes.
142
+ - **Artifacts:** changed files, task memory, checkpoint, deviations report, or commits.
143
+ - **Decisions:** wave ordering, task split, and accepted deviations.
144
+ - **Risks:** dependency drift, uncommitted work, skipped verification, or partial checkpoint.
145
+ - **Next Step:** next task, commit, checkpoint, or revision needed.
@@ -121,3 +121,15 @@ Real-world software can't always be perfect:
121
121
  - [ ] No `--no-verify`
122
122
  - [ ] No amend of pushed commit
123
123
  - [ ] Branch name follows convention
124
+
125
+ ## Structured Return
126
+
127
+ When invoked directly or by a harness, return or merge this block:
128
+
129
+ - **Status:** `PASS` when the commit/PR plan is atomic and verified, `FINDINGS` when git hygiene gaps remain, `BLOCKED` when repository state is ambiguous, `NOT_APPLICABLE` when no git action is in scope.
130
+ - **Scope:** branch, staged/unstaged files, intended commit/PR, and remote state.
131
+ - **Evidence:** `git status`, diff summary, verification commands, and branch checks.
132
+ - **Artifacts:** commit plan, commit hash, PR body, or branch hygiene report.
133
+ - **Decisions:** commit split, message type/scope, and files intentionally excluded.
134
+ - **Risks:** unrelated dirty files, skipped checks, pushed-history rewrite, or mixed intent.
135
+ - **Next Step:** exact stage/commit/push/PR command or cleanup action.
@@ -166,3 +166,15 @@ Files are committed to the repo alongside code — incidents are part of the pro
166
166
  ## Why this skill exists
167
167
 
168
168
  dev-workflow's existing surface is "build feature → ship." Nothing covered "production broke, what now?" Teams improvised postmortems, action items got lost, and the same bug recurred. This skill closes that loop: structured response in the moment, blameless reflection after, and cross-incident learning that feeds back into the project's constitution.
169
+
170
+ ## Structured Return
171
+
172
+ When invoked directly or by a harness, return or merge this block:
173
+
174
+ - **Status:** `PASS` when incident triage, resolution, comms, and follow-up are complete, `FINDINGS` when incident work remains, `BLOCKED` when severity/ownership/evidence is missing, `NOT_APPLICABLE` when no incident workflow is in scope.
175
+ - **Scope:** incident id, severity, service, timeline window, and owner.
176
+ - **Evidence:** symptoms, customer impact, logs/metrics, mitigation, and verification.
177
+ - **Artifacts:** incident files, communication draft, action items, or postmortem path.
178
+ - **Decisions:** severity, mitigation path, rollback/fix choice, and communication cadence.
179
+ - **Risks:** recurring cause, incomplete customer notice, weak action items, or missing monitoring.
180
+ - **Next Step:** next incident phase or postmortem/action-item owner.
@@ -148,3 +148,15 @@ The oracle ladder fixes both: forces measurement, forces ANCHORED measurement (l
148
148
  ## Bottom line
149
149
 
150
150
  > An AI feature without an eval suite is a feature you can't ship safely. An eval suite without calibration is a number you can't trust. Build the dataset from real failures, climb the ladder from cheap to expensive, calibrate the judge against humans, and re-run before every model swap. The discipline is small; the absence of it is one of the largest sources of "we shipped and don't know if it's worse" experiences in the industry.
151
+
152
+ ## Structured Return
153
+
154
+ When invoked directly or by a harness, return or merge this block:
155
+
156
+ - **Status:** `PASS` when eval strategy/results meet the feature gate, `FINDINGS` when eval gaps or regressions remain, `BLOCKED` when dataset/rubric/calibration is missing, `NOT_APPLICABLE` when no LLM/AI behavior is in scope.
157
+ - **Scope:** feature, model path, dataset, oracle rungs, and command mode.
158
+ - **Evidence:** dataset provenance, metrics, judge calibration, run logs, and failure cases.
159
+ - **Artifacts:** eval plan, cases.jsonl, run JSONL, rubric, or QA log path.
160
+ - **Decisions:** oracle rung selection, metric thresholds, and accepted deviations.
161
+ - **Risks:** judge drift, synthetic-only cases, same-model judging, hallucination, or uncovered trajectories.
162
+ - **Next Step:** add dataset case, run eval, calibrate judge, or block release.
@@ -193,3 +193,15 @@ Ported from Compozy's `cy-workflow-memory` skill (`/tmp/compozy/.agents/skills/c
193
193
  Credit: Compozy project (https://github.com/compozy/compozy).
194
194
 
195
195
  The Context Budget section adapts the context-loading discipline from [`tech-leads-club/agent-skills/tlc-spec-driven`](https://github.com/tech-leads-club/agent-skills/tree/main/packages/skills-catalog/skills/(development)/tlc-spec-driven) (CC-BY-4.0, Felipe Rodrigues). The target, the anti-co-load rules, and the "monitoring signal" framing come from there; the integration with two-tier memory and the specific file ceilings are dev-workflow-specific.
196
+
197
+ ## Structured Return
198
+
199
+ When invoked directly or by a harness, return or merge this block:
200
+
201
+ - **Status:** `PASS` when memory is current and scoped correctly, `FINDINGS` when memory is stale/overloaded, `BLOCKED` when required task/project context is missing, `NOT_APPLICABLE` when no session memory is needed.
202
+ - **Scope:** project memory, task memory, checkpoint, and files considered.
203
+ - **Evidence:** memory entries read/written, stale facts removed, and promotion decision.
204
+ - **Artifacts:** `.dw/STATE.md`, task `MEMORY.md`, checkpoint, or compaction note.
205
+ - **Decisions:** promote, keep local, discard, or compact.
206
+ - **Risks:** stale instructions, duplicated facts, leaked task-local context, or oversized memory.
207
+ - **Next Step:** exact memory write, compaction, or checkpoint action.
@@ -14,7 +14,7 @@ A set of rules the caller applies while producing a review report. This skill do
14
14
 
15
15
  ## When Invoked
16
16
 
17
- By `/dw-review --code-only`, `/dw-review --coverage-only`, `/dw-brainstorm --refactor`. The caller has already identified a scope (files, a PR, a codebase area). This skill governs how findings are selected, deduplicated, ordered, and phrased.
17
+ By `/dw-review --code-only`, `/dw-review --coverage-only`, `/dw-refactor`, and `/dw-brainstorm --mode=refactor-audit`. The caller has already identified a scope (files, a PR, a codebase area). This skill governs how findings are selected, deduplicated, ordered, and phrased.
18
18
 
19
19
  ## Required Inputs
20
20
 
@@ -124,7 +124,7 @@ The caller emits:
124
124
 
125
125
  - `/dw-review --code-only` — applies all five rules to its Level-3 review output; uses prior reports in `.dw/spec/*/reviews/` to dedupe across rounds.
126
126
  - `/dw-review --coverage-only` — applies de-dup + severity-ordering when listing gaps between PRD requirements and code.
127
- - `/dw-brainstorm --refactor` — applies rules 1, 2, 4, 5 when cataloging code smells (rule 3 adapts: a "smell" with a justifying ADR becomes a `low` finding at most).
127
+ - `/dw-refactor` — applies rules 1, 2, 4, 5 when cataloging code smells (rule 3 adapts: a "smell" with a justifying ADR becomes a `low` finding at most).
128
128
 
129
129
  Callers should mention this skill in their "Skills Complementares" section.
130
130
 
@@ -137,3 +137,15 @@ Ported from Compozy's `cy-review-round` skill (`/tmp/compozy/.agents/skills/cy-r
137
137
  - No issue-file frontmatter (Compozy uses it to interoperate with its remediation engine; dev-workflow's remediation is manual or via `/dw-qa --fix`).
138
138
 
139
139
  Credit: Compozy project (https://github.com/compozy/compozy).
140
+
141
+ ## Structured Return
142
+
143
+ When invoked directly or by a harness, return or merge this block:
144
+
145
+ - **Status:** `PASS` when no defensible findings remain, `FINDINGS` when review findings exist, `BLOCKED` when diff/context is insufficient, `NOT_APPLICABLE` when no review is in scope.
146
+ - **Scope:** diff range, files reviewed, prior rounds, and review mode.
147
+ - **Evidence:** file/line references, behavior impact, and prior-round disposition.
148
+ - **Artifacts:** review report, inline findings, or consolidation notes.
149
+ - **Decisions:** finding severity/order, duplicate suppression, and false-positive rejection.
150
+ - **Risks:** missing tests, unreviewed generated files, stale base branch, or non-defensible claims.
151
+ - **Next Step:** exact fix, verification, or approval/block marker.
@@ -29,3 +29,15 @@ Use before writing custom infrastructure, adding an integration, choosing a depe
29
29
  - Build custom only after search channels were checked or explicitly unavailable.
30
30
 
31
31
  Inspired by ECC's `search-first`; adapted to compose with `dw-source-grounding`, `/dw-plan`, and `/dw-find-skills`.
32
+
33
+ ## Structured Return
34
+
35
+ When invoked directly or by a harness, return or merge this block:
36
+
37
+ - **Status:** `PASS` when an `ADOPT`/`WRAP`/`COMPOSE`/`BUILD` decision is justified, `FINDINGS` when search gaps remain, `BLOCKED` when required search channels are unavailable, `NOT_APPLICABLE` when no new capability/dependency is being chosen.
38
+ - **Scope:** capability, constraints, project area, and checked channels.
39
+ - **Evidence:** repo hits, installed skills, `.dw/intel/`, package/docs links, or explicit unavailable-channel note.
40
+ - **Artifacts:** TechSpec/ADR decision entry or dependency/reuse note.
41
+ - **Decisions:** `ADOPT`, `WRAP`, `COMPOSE`, or `BUILD`, with rejected alternatives.
42
+ - **Risks:** license, maintenance, dependency weight, version drift, or local reinvention.
43
+ - **Next Step:** install/adapt/write decision record or ask for missing constraint.