@brunosps00/dev-workflow 1.1.3 → 1.2.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 +22 -15
- package/bin/dev-workflow.js +1 -1
- package/lib/constants.js +6 -2
- package/lib/doctor.js +3 -1
- package/lib/install-deps.js +3 -3
- package/lib/setup-wsl-browser.js +2 -2
- package/lib/skill-registry.js +41 -0
- package/package.json +1 -1
- package/scaffold/en/agent-instructions.md +5 -2
- package/scaffold/en/commands/dw-analyze-project.md +1 -1
- package/scaffold/en/commands/dw-brainstorm.md +4 -1
- package/scaffold/en/commands/dw-functional-doc.md +3 -3
- package/scaffold/en/commands/dw-harness-audit.md +4 -2
- package/scaffold/en/commands/dw-help.md +12 -7
- package/scaffold/en/commands/dw-opportunities.md +131 -0
- package/scaffold/en/commands/dw-refactor.md +54 -0
- package/scaffold/en/commands/dw-review.md +1 -1
- package/scaffold/en/commands/dw-skill-health.md +11 -3
- package/scaffold/en/references/refactoring-catalog.md +1 -1
- package/scaffold/en/templates/constitution-template.md +1 -1
- package/scaffold/pt-br/agent-instructions.md +5 -2
- package/scaffold/pt-br/commands/dw-analyze-project.md +1 -1
- package/scaffold/pt-br/commands/dw-brainstorm.md +4 -1
- package/scaffold/pt-br/commands/dw-functional-doc.md +3 -3
- package/scaffold/pt-br/commands/dw-harness-audit.md +4 -2
- package/scaffold/pt-br/commands/dw-help.md +14 -7
- package/scaffold/pt-br/commands/dw-opportunities.md +131 -0
- package/scaffold/pt-br/commands/dw-refactor.md +54 -0
- package/scaffold/pt-br/commands/dw-review.md +1 -1
- package/scaffold/pt-br/commands/dw-skill-health.md +11 -3
- package/scaffold/pt-br/references/refactoring-catalog.md +1 -1
- package/scaffold/pt-br/templates/constitution-template.md +1 -1
- package/scaffold/scripts/functional-doc/run-playwright-flow.mjs +55 -24
- package/scaffold/scripts/lib/capture-screenshots.mjs +56 -17
- package/scaffold/scripts/lib/resolve-browser.mjs +43 -40
- package/scaffold/skill-registry.json +1 -1
- package/scaffold/skills/api-testing-recipes/SKILL.md +12 -0
- package/scaffold/skills/docker-compose-recipes/SKILL.md +12 -0
- package/scaffold/skills/dw-codebase-intel/SKILL.md +13 -1
- package/scaffold/skills/dw-context-budget/SKILL.md +12 -0
- package/scaffold/skills/dw-council/SKILL.md +12 -0
- package/scaffold/skills/dw-debug-protocol/SKILL.md +12 -0
- package/scaffold/skills/dw-execute-phase/SKILL.md +12 -0
- package/scaffold/skills/dw-git-discipline/SKILL.md +12 -0
- package/scaffold/skills/dw-incident-response/SKILL.md +12 -0
- package/scaffold/skills/dw-llm-eval/SKILL.md +12 -0
- package/scaffold/skills/dw-memory/SKILL.md +12 -0
- package/scaffold/skills/dw-review-rigor/SKILL.md +14 -2
- package/scaffold/skills/dw-search-first/SKILL.md +12 -0
- package/scaffold/skills/dw-silent-failure/SKILL.md +12 -0
- package/scaffold/skills/dw-simplification/SKILL.md +18 -6
- package/scaffold/skills/dw-simplification/references/deep-modules.md +1 -1
- package/scaffold/skills/dw-source-grounding/SKILL.md +12 -0
- package/scaffold/skills/dw-testing-discipline/SKILL.md +12 -0
- package/scaffold/skills/dw-testing-discipline/references/playwright-recipes.md +15 -16
- package/scaffold/skills/dw-ui-discipline/SKILL.md +12 -0
- package/scaffold/skills/dw-verify/SKILL.md +10 -0
- package/scaffold/skills/humanizer/SKILL.md +12 -0
- package/scaffold/skills/remotion-best-practices/SKILL.md +12 -0
- package/scaffold/skills/security-review/SKILL.md +12 -0
- package/scaffold/skills/vercel-react-best-practices/SKILL.md +12 -0
- package/scaffold/skills/vercel-react-best-practices/references/perf-discipline.md +1 -1
|
@@ -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.
|
|
14
|
-
5.
|
|
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:**
|
|
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):
|
|
10
|
-
//
|
|
11
|
-
//
|
|
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
|
-
|
|
85
|
-
|
|
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(
|
|
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,
|
|
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 (
|
|
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:
|
|
267
|
-
browserSource:
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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:
|
|
7
|
-
//
|
|
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: "
|
|
13
|
-
// { mode: "
|
|
10
|
+
// { mode: "launch", launchOptions, source, fallback?, openFallback? } // let Playwright launch first
|
|
11
|
+
// { mode: "cdp", endpoint, source, cleanup } // resolved fallback descriptor
|
|
14
12
|
//
|
|
15
|
-
// DEFAULT
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
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 = "
|
|
549
|
+
function bundledDescriptor(headless, source = "playwright-default") {
|
|
552
550
|
return { mode: "launch", launchOptions: { ...BUNDLED_LAUNCH, headless }, source };
|
|
553
551
|
}
|
|
554
552
|
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -240,7 +240,7 @@
|
|
|
240
240
|
"trigger": "Security review, sensitive code, OWASP checks, auth/payment/input surfaces",
|
|
241
241
|
"expected_output": "High-confidence security findings or explicit pass.",
|
|
242
242
|
"load_policy": "lazy-references",
|
|
243
|
-
"context_limit":
|
|
243
|
+
"context_limit": 14000,
|
|
244
244
|
"bundled": true
|
|
245
245
|
},
|
|
246
246
|
{
|
|
@@ -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-
|
|
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.
|
|
@@ -43,3 +43,15 @@ Return:
|
|
|
43
43
|
5. What must remain loaded because commands depend on it.
|
|
44
44
|
|
|
45
45
|
Inspired by ECC's `context-budget` and `strategic-compact` patterns; adapted for dev-workflow's `.dw/` scaffold and cross-platform wrappers.
|
|
46
|
+
|
|
47
|
+
## Structured Return
|
|
48
|
+
|
|
49
|
+
When invoked directly or by a harness, return or merge this block:
|
|
50
|
+
|
|
51
|
+
- **Status:** `PASS` when the budget is acceptable, `FINDINGS` when concrete savings exist, `BLOCKED` when files cannot be measured, `NOT_APPLICABLE` when context budget is not relevant.
|
|
52
|
+
- **Scope:** commands, skills, agents, MCPs, and instruction files measured.
|
|
53
|
+
- **Evidence:** largest files, duplicate content, loaded references, and approximate byte/token cost.
|
|
54
|
+
- **Artifacts:** report path or inline budget table.
|
|
55
|
+
- **Decisions:** what stays loaded, what moves behind lazy references, and what can merge/remove.
|
|
56
|
+
- **Risks:** losing trigger clarity, hiding required instructions, or creating stale references.
|
|
57
|
+
- **Next Step:** top compaction action with expected savings.
|
|
@@ -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-
|
|
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.
|