dw-kit 1.3.6 → 1.6.0-rc.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 (52) hide show
  1. package/.claude/agents/executor.md +80 -80
  2. package/.claude/hooks/pre-commit-gate.sh +59 -0
  3. package/.claude/hooks/stop-check.sh +111 -31
  4. package/.claude/rules/commit-standards.md +48 -37
  5. package/.claude/rules/dw.md +47 -11
  6. package/.claude/skills/dw-archive/SKILL.md +14 -0
  7. package/.claude/skills/dw-commit/SKILL.md +7 -4
  8. package/.claude/skills/dw-decision/SKILL.md +5 -4
  9. package/.claude/skills/dw-execute/SKILL.md +18 -5
  10. package/.claude/skills/dw-handoff/SKILL.md +8 -3
  11. package/.claude/skills/dw-plan/SKILL.md +15 -2
  12. package/.claude/skills/dw-research/SKILL.md +7 -5
  13. package/.claude/skills/dw-retroactive/SKILL.md +75 -63
  14. package/.claude/skills/dw-review/SKILL.md +33 -2
  15. package/.claude/skills/dw-task-init/SKILL.md +40 -35
  16. package/.dw/adapters/generic/AGENT.md +171 -169
  17. package/.dw/config/config.schema.json +149 -121
  18. package/.dw/config/dw.config.yml +14 -0
  19. package/.dw/core/WORKFLOW.md +450 -450
  20. package/.dw/core/schemas/agent-claim.schema.json +127 -0
  21. package/.dw/core/schemas/agent-report.schema.json +72 -0
  22. package/.dw/core/schemas/task-frontmatter.schema.json +78 -0
  23. package/.dw/core/templates/v3/task.md +188 -0
  24. package/CLAUDE.md +2 -2
  25. package/MIGRATION-v1.5.md +330 -0
  26. package/README.md +18 -0
  27. package/package.json +4 -2
  28. package/src/cli.mjs +176 -0
  29. package/src/commands/agent-claim.mjs +235 -0
  30. package/src/commands/agent-inspect.mjs +123 -0
  31. package/src/commands/doctor.mjs +105 -1
  32. package/src/commands/lint-task.mjs +112 -0
  33. package/src/commands/review-render.mjs +255 -0
  34. package/src/commands/task-migrate.mjs +366 -0
  35. package/src/commands/task-new.mjs +90 -0
  36. package/src/commands/task-render.mjs +235 -0
  37. package/src/commands/task-rotate.mjs +168 -0
  38. package/src/commands/task-show.mjs +137 -0
  39. package/src/commands/task-view.mjs +386 -0
  40. package/src/commands/task-watch.mjs +223 -0
  41. package/src/lib/active-index.mjs +19 -1
  42. package/src/lib/agent-claim.mjs +173 -0
  43. package/src/lib/agent-conflict.mjs +137 -0
  44. package/src/lib/agent-events.mjs +43 -0
  45. package/src/lib/agent-report.mjs +96 -0
  46. package/src/lib/config.mjs +120 -104
  47. package/src/lib/frontmatter.mjs +72 -0
  48. package/src/lib/lint-rules.mjs +149 -0
  49. package/src/lib/review/manifest-schema.json +149 -0
  50. package/src/lib/review/manifest-validator.mjs +93 -0
  51. package/src/lib/review/scope-slug.mjs +68 -0
  52. package/src/lib/timeline-parser.mjs +80 -0
@@ -1,169 +1,171 @@
1
- # dw-kit Workflow — Generic Agent Instructions
2
-
3
- > **For**: Cursor, Windsurf, Copilot Chat, or any AI coding assistant
4
- > **Note**: This is a methodology reference. It cannot replicate Claude Code-specific features
5
- > (agent delegation with tool constraints, hooks, MCP integration). For full capabilities, use the Claude CLI adapter.
6
-
7
- ---
8
-
9
- ## Setup
10
-
11
- 1. Copy this file to your project root as `AGENT.md` (or paste into your AI assistant's context)
12
- 2. Copy `.dw/config/dw.config.yml` to your project and fill in your settings
13
- 3. Create `.dw/tasks/` directory for task documentation
14
-
15
- ---
16
-
17
- ## Configuration
18
-
19
- Read `.dw/config/dw.config.yml` for:
20
- - `workflow.default_depth` — quick | standard | thorough
21
- - `team.roles` — available team roles
22
- - `quality.test_command`, `quality.lint_command` — quality gates
23
- - `paths.tasks` — where task docs are stored
24
-
25
- ---
26
-
27
- ## Depth Routing
28
-
29
- | Scope | Depth | Workflow |
30
- |-------|-------|---------|
31
- | ≤2 files, hotfix | quick | Understand → Execute → Close |
32
- | 3-5 files | standard | All 6 phases |
33
- | 6+ files, API/DB changes | thorough | All phases + arch review |
34
-
35
- ---
36
-
37
- ## Workflow Phases
38
-
39
- ### Phase 1: Initialize
40
-
41
- Create task documentation at `{paths.tasks}/[task-name]/`:
42
- ```
43
- [name]-context.md # Research findings
44
- [name]-plan.md # Implementation plan
45
- [name]-progress.md # Progress tracking
46
- ```
47
-
48
- **Before proceeding**: Task name defined, scope assessed, depth chosen.
49
-
50
- ### Phase 2: Understand (Research)
51
-
52
- Explore the codebase:
53
- - Find all files related to the task
54
- - Map dependencies (upstream and downstream)
55
- - Identify current patterns and conventions
56
- - Check test coverage
57
- - Note git history for recent changes in the area
58
- - Document what is unclear
59
-
60
- Fill in `[name]-context.md` with findings.
61
-
62
- **Before proceeding**: All files identified, no critical unknowns.
63
-
64
- ### Phase 3: Plan
65
-
66
- Design solution before writing any code:
67
- - Consider ≥2 approaches with trade-offs
68
- - Apply devil's advocate: strongest reason NOT to choose your preferred approach
69
- - Break into subtasks (each ≤3 files, ≤4 hours, independent commit)
70
- - Order: schema → service → API → tests → docs
71
-
72
- Fill in `[name]-plan.md`.
73
-
74
- **STOP**: Wait for human approval before executing.
75
- If team has TL: TL must review architecture decisions.
76
-
77
- ### Phase 4: Execute
78
-
79
- For each subtask:
80
- 1. Read acceptance criteria
81
- 2. Write tests first (failing) — RED
82
- 3. Implement to make tests pass — GREEN
83
- 4. Refactor if needed — REFACTOR
84
- 5. Update progress file
85
- 6. Commit: `type(scope): description`
86
-
87
- **Rules**:
88
- - Only work within subtask scope
89
- - If ambiguous → stop and ask (don't guess for large changes)
90
- - If scope changes → update plan, ask human
91
-
92
- ### Phase 5: Verify
93
-
94
- **Self-review** (always):
95
- - Logic correct? Edge cases handled?
96
- - No debug code (console.log, debugger, etc.)
97
- - No sensitive data (passwords, tokens, keys)
98
-
99
- **Automated** (if configured):
100
- ```bash
101
- {quality.test_command}
102
- {quality.lint_command}
103
- ```
104
-
105
- **Peer/TL review** (standard+):
106
- - Architecture decisions reviewed
107
- - Code review with checklist (see `.dw/core/QUALITY.md`)
108
-
109
- **QA** (thorough + qc role):
110
- - QA reviews against test plan
111
- - Explicit sign-off required
112
-
113
- ### Phase 6: Close
114
-
115
- Commit format:
116
- ```
117
- <type>(<scope>): <description ≤72 chars>
118
-
119
- Co-Authored-By: [AI assistant name]
120
- ```
121
-
122
- Update progress file: status Done.
123
- If handing off: write handoff notes (done/in-progress/blocked, next steps).
124
-
125
- ---
126
-
127
- ## Standalone: Debug
128
-
129
- When encountering a bug:
130
- 1. **Investigate**: Reproduce exactly. Gather evidence (error, stack trace, file:line).
131
- 2. **Diagnose**: Form hypothesis. Verify. Find root cause (not symptom).
132
- 3. **Fix**: Fix root cause. Test the fix. Check for regressions. Commit.
133
-
134
- ---
135
-
136
- ## Quality Principles
137
-
138
- Full quality strategy: `.dw/core/QUALITY.md`
139
-
140
- Key principles:
141
- - Write tests before implementation (TDD)
142
- - Each subtask = one commit
143
- - Review checklist: correctness, security, performance, maintainability, tests
144
- - CRITICAL issues must be fixed before merge
145
-
146
- ---
147
-
148
- ## Limitations of This Adapter
149
-
150
- This generic adapter provides the **methodology** but cannot provide:
151
-
152
- | Feature | Claude CLI Adapter | Generic Adapter |
153
- |---------|-------------------|-----------------|
154
- | Agent delegation (researcher/planner/reviewer) | | |
155
- | Tool constraints (read-only research agent) | ✅ | ❌ |
156
- | Pre-commit hooks (safety-guard, quality gates) | ✅ | ❌ |
157
- | MCP server integration | ✅ | ❌ |
158
- | Automatic progress tracking | ✅ | Manual |
159
-
160
- For full capabilities, use Claude Code with the Claude CLI adapter.
161
-
162
- ---
163
-
164
- ## Full Methodology Reference
165
-
166
- - Workflow phases: `.dw/core/WORKFLOW.md`
167
- - Thinking framework: `.dw/core/THINKING.md`
168
- - Quality strategy: `.dw/core/QUALITY.md`
169
- - Role definitions: `.dw/core/ROLES.md`
1
+ # dw-kit Workflow — Generic Agent Instructions
2
+
3
+ > **For**: Cursor, Windsurf, Copilot Chat, or any AI coding assistant
4
+ > **Note**: This is a methodology reference. It cannot replicate Claude Code-specific features
5
+ > (agent delegation with tool constraints, hooks, MCP integration). For full capabilities, use the Claude CLI adapter.
6
+
7
+ ---
8
+
9
+ ## Setup
10
+
11
+ 1. Copy this file to your project root as `AGENT.md` (or paste into your AI assistant's context)
12
+ 2. Copy `.dw/config/dw.config.yml` to your project and fill in your settings
13
+ 3. Create `.dw/tasks/` directory for task documentation
14
+
15
+ ---
16
+
17
+ ## Configuration
18
+
19
+ Read `.dw/config/dw.config.yml` for:
20
+ - `workflow.default_depth` — quick | standard | thorough
21
+ - `team.roles` — available team roles
22
+ - `quality.test_command`, `quality.lint_command` — quality gates
23
+ - `paths.tasks` — where task docs are stored
24
+
25
+ ---
26
+
27
+ ## Depth Routing
28
+
29
+ | Scope | Depth | Workflow |
30
+ |-------|-------|---------|
31
+ | ≤2 files, hotfix | quick | Understand → Execute → Close |
32
+ | 3-5 files | standard | All 6 phases |
33
+ | 6+ files, API/DB changes | thorough | All phases + arch review |
34
+
35
+ ---
36
+
37
+ ## Workflow Phases
38
+
39
+ ### Phase 1: Initialize
40
+
41
+ Create task documentation at `{paths.tasks}/[task-name]/`:
42
+ ```
43
+ [name]-context.md # Research findings
44
+ [name]-plan.md # Implementation plan
45
+ [name]-progress.md # Progress tracking
46
+ ```
47
+
48
+ **Before proceeding**: Task name defined, scope assessed, depth chosen.
49
+
50
+ ### Phase 2: Understand (Research)
51
+
52
+ Explore the codebase:
53
+ - Find all files related to the task
54
+ - Map dependencies (upstream and downstream)
55
+ - Identify current patterns and conventions
56
+ - Check test coverage
57
+ - Note git history for recent changes in the area
58
+ - Document what is unclear
59
+
60
+ Fill in `[name]-context.md` with findings.
61
+
62
+ **Before proceeding**: All files identified, no critical unknowns.
63
+
64
+ ### Phase 3: Plan
65
+
66
+ Design solution before writing any code:
67
+ - Consider ≥2 approaches with trade-offs
68
+ - Apply devil's advocate: strongest reason NOT to choose your preferred approach
69
+ - Break into subtasks (each ≤3 files, ≤4 hours, independent commit)
70
+ - Order: schema → service → API → tests → docs
71
+
72
+ Fill in `[name]-plan.md`.
73
+
74
+ **STOP**: Wait for human approval before executing.
75
+ If team has TL: TL must review architecture decisions.
76
+
77
+ ### Phase 4: Execute
78
+
79
+ For each subtask:
80
+ 1. Read acceptance criteria
81
+ 2. Write tests first (failing) — RED
82
+ 3. Implement to make tests pass — GREEN
83
+ 4. Refactor if needed — REFACTOR
84
+ 5. Update progress file
85
+ 6. Commit: `type(scope): description`
86
+
87
+ **Rules**:
88
+ - Only work within subtask scope
89
+ - If ambiguous → stop and ask (don't guess for large changes)
90
+ - If scope changes → update plan, ask human
91
+
92
+ ### Phase 5: Verify
93
+
94
+ **Self-review** (always):
95
+ - Logic correct? Edge cases handled?
96
+ - No debug code (console.log, debugger, etc.)
97
+ - No sensitive data (passwords, tokens, keys)
98
+
99
+ **Automated** (if configured):
100
+ ```bash
101
+ {quality.test_command}
102
+ {quality.lint_command}
103
+ ```
104
+
105
+ **Peer/TL review** (standard+):
106
+ - Architecture decisions reviewed
107
+ - Code review with checklist (see `.dw/core/QUALITY.md`)
108
+
109
+ **QA** (thorough + qc role):
110
+ - QA reviews against test plan
111
+ - Explicit sign-off required
112
+
113
+ ### Phase 6: Close
114
+
115
+ Commit format:
116
+ ```
117
+ <type>(<scope>): <imperative English subject ≤72 chars>
118
+
119
+ [Optional body — explain WHY, wrap at 72]
120
+ ```
121
+
122
+ English imperative mood. Do not append `Co-Authored-By` AI signatures. Full rules: `.claude/rules/commit-standards.md`.
123
+
124
+ Update progress file: status → Done.
125
+ If handing off: write handoff notes (done/in-progress/blocked, next steps).
126
+
127
+ ---
128
+
129
+ ## Standalone: Debug
130
+
131
+ When encountering a bug:
132
+ 1. **Investigate**: Reproduce exactly. Gather evidence (error, stack trace, file:line).
133
+ 2. **Diagnose**: Form hypothesis. Verify. Find root cause (not symptom).
134
+ 3. **Fix**: Fix root cause. Test the fix. Check for regressions. Commit.
135
+
136
+ ---
137
+
138
+ ## Quality Principles
139
+
140
+ Full quality strategy: `.dw/core/QUALITY.md`
141
+
142
+ Key principles:
143
+ - Write tests before implementation (TDD)
144
+ - Each subtask = one commit
145
+ - Review checklist: correctness, security, performance, maintainability, tests
146
+ - CRITICAL issues must be fixed before merge
147
+
148
+ ---
149
+
150
+ ## Limitations of This Adapter
151
+
152
+ This generic adapter provides the **methodology** but cannot provide:
153
+
154
+ | Feature | Claude CLI Adapter | Generic Adapter |
155
+ |---------|-------------------|-----------------|
156
+ | Agent delegation (researcher/planner/reviewer) | ✅ | ❌ |
157
+ | Tool constraints (read-only research agent) | ✅ | ❌ |
158
+ | Pre-commit hooks (safety-guard, quality gates) | ✅ | |
159
+ | MCP server integration | ✅ | ❌ |
160
+ | Automatic progress tracking | | Manual |
161
+
162
+ For full capabilities, use Claude Code with the Claude CLI adapter.
163
+
164
+ ---
165
+
166
+ ## Full Methodology Reference
167
+
168
+ - Workflow phases: `.dw/core/WORKFLOW.md`
169
+ - Thinking framework: `.dw/core/THINKING.md`
170
+ - Quality strategy: `.dw/core/QUALITY.md`
171
+ - Role definitions: `.dw/core/ROLES.md`
@@ -1,121 +1,149 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "title": "dw-kit Configuration Schema",
4
- "description": "Schema for config/dw.config.yml",
5
- "type": "object",
6
- "additionalProperties": false,
7
- "properties": {
8
- "project": {
9
- "type": "object",
10
- "additionalProperties": false,
11
- "required": ["name"],
12
- "properties": {
13
- "name": { "type": "string", "minLength": 1 },
14
- "language": { "type": "string", "enum": ["vi", "en"], "default": "vi" }
15
- }
16
- },
17
- "workflow": {
18
- "type": "object",
19
- "additionalProperties": false,
20
- "properties": {
21
- "default_depth": {
22
- "type": "string",
23
- "enum": ["quick", "standard", "thorough"],
24
- "default": "standard"
25
- }
26
- }
27
- },
28
- "team": {
29
- "type": "object",
30
- "additionalProperties": false,
31
- "properties": {
32
- "roles": {
33
- "type": "array",
34
- "items": {
35
- "type": "string",
36
- "enum": ["dev", "techlead", "ba", "qc", "pm"]
37
- },
38
- "minItems": 1,
39
- "contains": { "const": "dev" },
40
- "description": "dev is always required"
41
- }
42
- }
43
- },
44
- "quality": {
45
- "type": "object",
46
- "additionalProperties": false,
47
- "properties": {
48
- "test_command": { "type": "string", "default": "" },
49
- "lint_command": { "type": "string", "default": "" },
50
- "block_on_fail": { "type": "boolean", "default": false }
51
- }
52
- },
53
- "tracking": {
54
- "type": "object",
55
- "additionalProperties": false,
56
- "properties": {
57
- "estimation": { "type": "boolean", "default": false },
58
- "log_work": { "type": "boolean", "default": false },
59
- "estimation_unit": {
60
- "type": "string",
61
- "enum": ["hours", "story-points", "t-shirt"],
62
- "default": "hours"
63
- }
64
- }
65
- },
66
- "paths": {
67
- "type": "object",
68
- "additionalProperties": false,
69
- "properties": {
70
- "tasks": { "type": "string", "default": ".dw/tasks" },
71
- "docs": { "type": "string", "default": ".dw/docs" }
72
- }
73
- },
74
- "claude": {
75
- "type": "object",
76
- "additionalProperties": false,
77
- "properties": {
78
- "models": {
79
- "type": "object",
80
- "additionalProperties": false,
81
- "properties": {
82
- "plan": { "type": "string", "default": "" },
83
- "execute": { "type": "string", "default": "" },
84
- "review": { "type": "string", "default": "" }
85
- }
86
- },
87
- "structured_output": { "type": "boolean", "default": true },
88
- "worktree_execution": { "type": "boolean", "default": false },
89
- "mcp": {
90
- "type": "array",
91
- "items": {
92
- "type": "object",
93
- "required": ["name", "command"],
94
- "additionalProperties": false,
95
- "properties": {
96
- "name": { "type": "string" },
97
- "command": { "type": "string" },
98
- "args": { "type": "array", "items": { "type": "string" } },
99
- "env": {
100
- "type": "object",
101
- "additionalProperties": { "type": "string" }
102
- }
103
- }
104
- }
105
- }
106
- }
107
- },
108
- "_toolkit": {
109
- "type": "object",
110
- "additionalProperties": true,
111
- "properties": {
112
- "core_version": { "type": "string" },
113
- "platform_version": { "type": "string" },
114
- "capability_version": { "type": "string" },
115
- "installed": { "type": "string" },
116
- "last_upgrade": { "type": "string" },
117
- "migrated_from": { "type": "string" }
118
- }
119
- }
120
- }
121
- }
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "dw-kit Configuration Schema",
4
+ "description": "Schema for config/dw.config.yml",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "project": {
9
+ "type": "object",
10
+ "additionalProperties": false,
11
+ "required": ["name"],
12
+ "properties": {
13
+ "name": { "type": "string", "minLength": 1 },
14
+ "language": { "type": "string", "enum": ["vi", "en"], "default": "vi" }
15
+ }
16
+ },
17
+ "workflow": {
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "properties": {
21
+ "default_depth": {
22
+ "type": "string",
23
+ "enum": ["quick", "standard", "thorough"],
24
+ "default": "standard"
25
+ }
26
+ }
27
+ },
28
+ "team": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "roles": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "string",
36
+ "enum": ["dev", "techlead", "ba", "qc", "pm"]
37
+ },
38
+ "minItems": 1,
39
+ "contains": { "const": "dev" },
40
+ "description": "dev is always required"
41
+ }
42
+ }
43
+ },
44
+ "quality": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "properties": {
48
+ "test_command": { "type": "string", "default": "" },
49
+ "lint_command": { "type": "string", "default": "" },
50
+ "block_on_fail": { "type": "boolean", "default": false }
51
+ }
52
+ },
53
+ "tracking": {
54
+ "type": "object",
55
+ "additionalProperties": false,
56
+ "properties": {
57
+ "estimation": { "type": "boolean", "default": false },
58
+ "log_work": { "type": "boolean", "default": false },
59
+ "estimation_unit": {
60
+ "type": "string",
61
+ "enum": ["hours", "story-points", "t-shirt"],
62
+ "default": "hours"
63
+ }
64
+ }
65
+ },
66
+ "paths": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "properties": {
70
+ "tasks": { "type": "string", "default": ".dw/tasks" },
71
+ "docs": { "type": "string", "default": ".dw/docs" }
72
+ }
73
+ },
74
+ "claude": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "properties": {
78
+ "models": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "properties": {
82
+ "plan": { "type": "string", "default": "" },
83
+ "execute": { "type": "string", "default": "" },
84
+ "review": { "type": "string", "default": "" }
85
+ }
86
+ },
87
+ "structured_output": { "type": "boolean", "default": true },
88
+ "worktree_execution": { "type": "boolean", "default": false },
89
+ "review": {
90
+ "type": "object",
91
+ "additionalProperties": false,
92
+ "description": "Review render pipeline (ADR-0007).",
93
+ "properties": {
94
+ "renderer": {
95
+ "type": "object",
96
+ "additionalProperties": false,
97
+ "properties": {
98
+ "strategy": {
99
+ "type": "string",
100
+ "enum": ["auto", "plugin", "markdown-only"],
101
+ "default": "auto"
102
+ },
103
+ "theme": { "type": "string", "default": "github-dark" },
104
+ "font": { "type": "string", "default": "JetBrains Mono" },
105
+ "formats": {
106
+ "type": "array",
107
+ "items": { "type": "string", "enum": ["svg", "png"] },
108
+ "minItems": 1,
109
+ "uniqueItems": true,
110
+ "default": ["svg", "png"]
111
+ },
112
+ "output_dir": { "type": "string", "default": ".dw/reviews" }
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "mcp": {
118
+ "type": "array",
119
+ "items": {
120
+ "type": "object",
121
+ "required": ["name", "command"],
122
+ "additionalProperties": false,
123
+ "properties": {
124
+ "name": { "type": "string" },
125
+ "command": { "type": "string" },
126
+ "args": { "type": "array", "items": { "type": "string" } },
127
+ "env": {
128
+ "type": "object",
129
+ "additionalProperties": { "type": "string" }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ },
136
+ "_toolkit": {
137
+ "type": "object",
138
+ "additionalProperties": true,
139
+ "properties": {
140
+ "core_version": { "type": "string" },
141
+ "platform_version": { "type": "string" },
142
+ "capability_version": { "type": "string" },
143
+ "installed": { "type": "string" },
144
+ "last_upgrade": { "type": "string" },
145
+ "migrated_from": { "type": "string" }
146
+ }
147
+ }
148
+ }
149
+ }
@@ -59,6 +59,20 @@ claude:
59
59
  # Isolate execution trong git worktree (cho risky refactors)
60
60
  worktree_execution: false
61
61
 
62
+ # --- Review render pipeline (ADR-0007) ------------------------------------
63
+ # /dw:review --visual produces a manifest.json then invokes `dw review render`.
64
+ # Output goes to .dw/reviews/{scope-slug}/ — see ADR-0007.
65
+ review:
66
+ renderer:
67
+ # auto: try dw-kit-render package, fall back to markdown summary if missing
68
+ # plugin: require dw-kit-render to be installed (fail if missing)
69
+ # markdown-only: never invoke a renderer, emit markdown summary only
70
+ strategy: "auto"
71
+ theme: "github-dark" # any shiki theme name
72
+ font: "JetBrains Mono" # font family for code in SVG
73
+ formats: ["svg", "png"] # outputs produced per finding
74
+ output_dir: ".dw/reviews"
75
+
62
76
  # MCP servers — Claude Code sẽ load các servers này
63
77
  mcp: []
64
78
  # Ví dụ: