@eltonssouza/development-utility-kit 1.0.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/.claude/agents/analyst.md +198 -0
- package/.claude/agents/backend-developer.md +126 -0
- package/.claude/agents/brain-keeper.md +229 -0
- package/.claude/agents/code-reviewer.md +181 -0
- package/.claude/agents/database-engineer.md +94 -0
- package/.claude/agents/devops-engineer.md +141 -0
- package/.claude/agents/frontend-developer.md +97 -0
- package/.claude/agents/gate-keeper.md +118 -0
- package/.claude/agents/migrator.md +291 -0
- package/.claude/agents/mobile-developer.md +80 -0
- package/.claude/agents/n8n-specialist.md +94 -0
- package/.claude/agents/product-owner.md +115 -0
- package/.claude/agents/qa-engineer.md +232 -0
- package/.claude/agents/release-engineer.md +204 -0
- package/.claude/agents/scaffold.md +87 -0
- package/.claude/agents/security-engineer.md +199 -0
- package/.claude/agents/sprint-runner.md +44 -0
- package/.claude/agents/stack-resolver.md +84 -0
- package/.claude/agents/tech-lead.md +182 -0
- package/.claude/agents/update-template.md +54 -0
- package/.claude/agents/ux-designer.md +118 -0
- package/.claude/settings.json +44 -0
- package/.claude/skills/README.md +332 -0
- package/.claude/skills/active-project/SKILL.md +129 -0
- package/.claude/skills/api-integration-test/SKILL.md +64 -0
- package/.claude/skills/auto-test-guard/SKILL.md +237 -0
- package/.claude/skills/auto-test-guard/resources/backend-tests.md +20 -0
- package/.claude/skills/auto-test-guard/resources/e2e-tests.md +24 -0
- package/.claude/skills/auto-test-guard/resources/execution-report.md +49 -0
- package/.claude/skills/auto-test-guard/resources/frontend-tests.md +18 -0
- package/.claude/skills/auto-test-guard/resources/initial-setup.md +108 -0
- package/.claude/skills/auto-test-guard/resources/run-suite.md +48 -0
- package/.claude/skills/auto-test-guard/resources/senior-gate.md +19 -0
- package/.claude/skills/brain-keeper/SKILL.md +60 -0
- package/.claude/skills/brain-keeper/obsidian/app.json +9 -0
- package/.claude/skills/brain-keeper/obsidian/appearance.json +4 -0
- package/.claude/skills/brain-keeper/obsidian/core-plugins.json +20 -0
- package/.claude/skills/brain-keeper/obsidian/daily-notes.json +5 -0
- package/.claude/skills/brain-keeper/obsidian/graph.json +32 -0
- package/.claude/skills/brain-keeper/obsidian/snippets/folder-colors.css +90 -0
- package/.claude/skills/brain-keeper/obsidian/templates.json +5 -0
- package/.claude/skills/brain-keeper/templates/README.md +51 -0
- package/.claude/skills/brain-keeper/templates/adr.md +40 -0
- package/.claude/skills/brain-keeper/templates/bug.md +35 -0
- package/.claude/skills/brain-keeper/templates/daily.md +38 -0
- package/.claude/skills/brain-keeper/templates/feature.md +62 -0
- package/.claude/skills/brain-keeper/templates/meeting.md +34 -0
- package/.claude/skills/brain-keeper/templates/tech-debt.md +21 -0
- package/.claude/skills/caveman/SKILL.md +187 -0
- package/.claude/skills/create-stack-pack/SKILL.md +281 -0
- package/.claude/skills/grill-me/SKILL.md +79 -0
- package/.claude/skills/honcho-memory/SKILL.md +207 -0
- package/.claude/skills/honcho-memory/docs/api-endpoints-verified.md +75 -0
- package/.claude/skills/honcho-memory/hooks/on-prompt-submit.js +221 -0
- package/.claude/skills/honcho-memory/hooks/on-stop.js +193 -0
- package/.claude/skills/honcho-memory/lib/honcho-client.js +363 -0
- package/.claude/skills/honcho-memory/lib/memory-injector.js +93 -0
- package/.claude/skills/honcho-memory/package.json +32 -0
- package/.claude/skills/honcho-memory/scripts/cli.js +370 -0
- package/.claude/skills/honcho-memory/scripts/setup.js +109 -0
- package/.claude/skills/honcho-memory/tests/t001-api-endpoints-verified.test.js +89 -0
- package/.claude/skills/honcho-memory/tests/t002-structure.test.js +97 -0
- package/.claude/skills/honcho-memory/tests/t003-honcho-client.test.js +162 -0
- package/.claude/skills/honcho-memory/tests/t004-soft-delete.test.js +259 -0
- package/.claude/skills/honcho-memory/tests/t005-memory-injector.test.js +175 -0
- package/.claude/skills/honcho-memory/tests/t006-on-prompt-submit.test.js +215 -0
- package/.claude/skills/honcho-memory/tests/t007-on-stop.test.js +165 -0
- package/.claude/skills/honcho-memory/tests/t008-cli.test.js +214 -0
- package/.claude/skills/honcho-memory/tests/t009-setup.test.js +232 -0
- package/.claude/skills/honcho-memory/tests/t010-skill-md.test.js +114 -0
- package/.claude/skills/honcho-memory/tests/t011-settings-hooks.test.js +105 -0
- package/.claude/skills/honcho-memory/tests/t012-docs-update.test.js +106 -0
- package/.claude/skills/honcho-memory/tests/t013-smoke-e2e.test.js +90 -0
- package/.claude/skills/pair-debug/SKILL.md +288 -0
- package/.claude/skills/prd-ready-check/SKILL.md +58 -0
- package/.claude/skills/project-manager/SKILL.md +167 -0
- package/.claude/skills/quality-standards/SKILL.md +201 -0
- package/.claude/skills/quick-feature/SKILL.md +264 -0
- package/.claude/skills/run-sprint/SKILL.md +342 -0
- package/.claude/skills/scaffold/SKILL.md +58 -0
- package/.claude/skills/stack-discovery/SKILL.md +159 -0
- package/.claude/skills/test-coverage-auditor/SKILL.md +59 -0
- package/.claude/skills/to-issues/SKILL.md +163 -0
- package/.claude/skills/to-prd/SKILL.md +130 -0
- package/.claude/skills/update-template/SKILL.md +254 -0
- package/.claude/stacks/CODEOWNERS +30 -0
- package/.claude/stacks/README.md +88 -0
- package/.claude/stacks/_template.md +116 -0
- package/.claude/stacks/java/spring-boot-3.md +376 -0
- package/.claude/stacks/java/spring-boot-4.md +438 -0
- package/.claude/stacks/typescript/angular-18.md +420 -0
- package/.claude/stacks/typescript/angular-19.md +397 -0
- package/.claude/stacks/typescript/angular-21.md +494 -0
- package/CLAUDE.md +453 -0
- package/README.md +391 -0
- package/bin/cli.js +773 -0
- package/bin/lib/backup.js +62 -0
- package/bin/lib/detect-stack.js +476 -0
- package/bin/lib/help.js +233 -0
- package/bin/lib/identity.js +108 -0
- package/bin/lib/local-dir.js +69 -0
- package/bin/lib/manifest.js +236 -0
- package/bin/lib/sync-all.js +394 -0
- package/bin/lib/version-check.js +398 -0
- package/dashboard/db.js +199 -0
- package/dashboard/package.json +22 -0
- package/dashboard/public/app.js +709 -0
- package/dashboard/public/content/docs/agents-reference.en.md +911 -0
- package/dashboard/public/content/docs/architecture-overview.en.md +260 -0
- package/dashboard/public/content/docs/autonomy-matrix.en.md +186 -0
- package/dashboard/public/content/docs/git-flow.en.md +525 -0
- package/dashboard/public/content/docs/honcho-memory.en.md +394 -0
- package/dashboard/public/content/docs/hooks-reference.en.md +420 -0
- package/dashboard/public/content/docs/pipeline.en.md +400 -0
- package/dashboard/public/content/docs/quality-gate.en.md +315 -0
- package/dashboard/public/content/docs/skills-reference.en.md +500 -0
- package/dashboard/public/content/docs/stack-rules.en.md +362 -0
- package/dashboard/public/content/docs/troubleshooting.en.md +637 -0
- package/dashboard/public/content/manifest.json +102 -0
- package/dashboard/public/content/manual/backend.en.md +1138 -0
- package/dashboard/public/content/manual/existing-project.en.md +831 -0
- package/dashboard/public/content/manual/frontend.en.md +1065 -0
- package/dashboard/public/content/manual/fullstack.en.md +1508 -0
- package/dashboard/public/content/manual/mobile.en.md +866 -0
- package/dashboard/public/index.html +108 -0
- package/dashboard/public/style.css +610 -0
- package/dashboard/public/vendor/marked.min.js +69 -0
- package/dashboard/rtk.js +143 -0
- package/dashboard/server-app.js +403 -0
- package/dashboard/server.js +104 -0
- package/dashboard/test/sprint1.test.js +406 -0
- package/dashboard/test/sprint2.test.js +571 -0
- package/dashboard/test/sprint3.test.js +560 -0
- package/package.json +33 -0
- package/scripts/hooks/subagent-telemetry.sh +14 -0
- package/scripts/hooks/telemetry-writer.js +250 -0
- package/scripts/latest-versions.json +56 -0
|
@@ -0,0 +1,1065 @@
|
|
|
1
|
+
# Frontend Manual — development-utility-kit
|
|
2
|
+
|
|
3
|
+
> Definitive manual for **Angular 21** frontend developers working with the `development-utility-kit` harness. Covers everything from `duk install` to your first merged PR, with exact prompts, step-by-step workflows, and non-negotiable rules.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Introduction
|
|
8
|
+
|
|
9
|
+
### Who this manual is for
|
|
10
|
+
|
|
11
|
+
You are a frontend developer building screens with **Angular 21** (standalone, Signals, OnPush, lazy loading, Signal Forms) using the harness. It doesn't matter if you've never opened Cowork — this manual takes you from zero to first component in production.
|
|
12
|
+
|
|
13
|
+
### What's covered
|
|
14
|
+
|
|
15
|
+
- 5-minute onboarding
|
|
16
|
+
- The **non-negotiable** 3-file rule (`.ts` / `.html` / `.scss`)
|
|
17
|
+
- Frontend-applicable harness skills
|
|
18
|
+
- External **Impeccable** skill (visual refinement)
|
|
19
|
+
- Complete workflows with real prompts (feature from scratch, visual polish, debugging, mobile)
|
|
20
|
+
- Intent-based trigger cheat sheet
|
|
21
|
+
- Antipatterns and troubleshooting
|
|
22
|
+
|
|
23
|
+
### Prerequisites
|
|
24
|
+
|
|
25
|
+
- **Node.js 22+** (`node --version`)
|
|
26
|
+
- **npm 10+** (`npm --version`)
|
|
27
|
+
- **Angular CLI 21+** (`npx @angular/cli@latest version`)
|
|
28
|
+
- **Git** in PATH
|
|
29
|
+
- **Cowork** OR **Claude Code** installed and authenticated
|
|
30
|
+
- Editor with TypeScript support (VS Code recommended)
|
|
31
|
+
|
|
32
|
+
### What's NOT here
|
|
33
|
+
|
|
34
|
+
- Spring Boot backend setup → see `[Backend](backend)`
|
|
35
|
+
- Fullstack monorepo → see `[Fullstack](fullstack)`
|
|
36
|
+
- React Native / Expo → see `[Mobile](mobile)`
|
|
37
|
+
- Legacy project adoption → see `[Existing Project](existing-project)`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. 5-minute onboarding
|
|
42
|
+
|
|
43
|
+
### Step 1 — Install the harness
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Default path (Windows: C:\development\tools\development-utility-kit)
|
|
47
|
+
npx @eltonssouza/development-utility-kit install
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Idempotent: runs `git pull` if the repository already exists.
|
|
51
|
+
|
|
52
|
+
### Step 2 — Create (or enter) the frontend project
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Create from scratch
|
|
56
|
+
mkdir C:\development\source\projects\my-front
|
|
57
|
+
cd C:\development\source\projects\my-front
|
|
58
|
+
git init
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Step 3 — Install harness in the project
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
duk install
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Creates `.claude/`, `CLAUDE.md`, `.cursorrules`, Git hooks, scripts. Idempotent.
|
|
68
|
+
|
|
69
|
+
### Step 4 — Edit `CLAUDE.md` → Project Identity
|
|
70
|
+
|
|
71
|
+
Open `CLAUDE.md` and edit **ONLY** the `Project Identity` section:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
## Project Identity
|
|
75
|
+
|
|
76
|
+
- **Project name**: `my-front`
|
|
77
|
+
- **Project type**: `frontend`
|
|
78
|
+
- **Primary stack**: `Angular 21`
|
|
79
|
+
- **Frontend stack**: `angular`
|
|
80
|
+
- **Database**: `n/a`
|
|
81
|
+
- **Domain**: `e-commerce`
|
|
82
|
+
- **Team size**: `2 frontend`
|
|
83
|
+
- **Additional rules**:
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> **Attention**: The `Frontend stack` field is read by the `bootstrap-frontend` skill to choose between `angular` and `vite-vanilla`. Without it, the skill won't trigger.
|
|
87
|
+
|
|
88
|
+
### Step 5 — Open Cowork or Claude Code
|
|
89
|
+
|
|
90
|
+
Open the Cowork terminal (or `claude` CLI) at the project root.
|
|
91
|
+
|
|
92
|
+
### Step 6 — First conversation
|
|
93
|
+
|
|
94
|
+
Type in chat:
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
scaffold the frontend
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The `bootstrap-frontend` skill triggers, runs Angular CLI 21, configures standalone + OnPush + lazy loading + Jest + jest-axe + ng-bootstrap + Playwright. Expected output:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
frontend/
|
|
104
|
+
├── src/app/
|
|
105
|
+
│ ├── core/
|
|
106
|
+
│ ├── shared/
|
|
107
|
+
│ ├── features/
|
|
108
|
+
│ └── app.routes.ts
|
|
109
|
+
├── angular.json
|
|
110
|
+
├── package.json
|
|
111
|
+
├── jest.config.js
|
|
112
|
+
├── playwright.config.ts
|
|
113
|
+
└── tsconfig.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Step 7 — Launch dashboard (optional)
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
duk dashboard
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Opens `http://localhost:4242` with manual, skills, agents, ADRs, hooks.
|
|
123
|
+
|
|
124
|
+
Done. You're on the harness. Next stop: the 3-file rule.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 3. NON-NEGOTIABLE RULE — 3 separate files in every Angular component
|
|
129
|
+
|
|
130
|
+
> **HARD BLOCK.** `tech-lead` and `code-reviewer` refuse merge if you violate. **No exceptions. No size threshold. No "small component" carve-out.** This `CLAUDE.md` rule overrides the threshold-based policy of ADR-008.
|
|
131
|
+
|
|
132
|
+
### The rule
|
|
133
|
+
|
|
134
|
+
Every component, directive, or pipe **with a template** uses exactly **three physical files**:
|
|
135
|
+
|
|
136
|
+
| File | Content |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `<name>.ts` | Component logic. Decorator with `templateUrl` + `styleUrl` (or `styleUrls`). |
|
|
139
|
+
| `<name>.html` | Full HTML template. |
|
|
140
|
+
| `<name>.scss` | SCSS styles. |
|
|
141
|
+
|
|
142
|
+
**NEVER** use `template: \`...\`` or `styles: [\`...\`]` or `styleUrls: ['...inline...']` inside the `.ts`. No kidding.
|
|
143
|
+
|
|
144
|
+
### CORRECT example
|
|
145
|
+
|
|
146
|
+
`product-list.component.ts`
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
150
|
+
import { CommonModule } from '@angular/common';
|
|
151
|
+
import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap';
|
|
152
|
+
|
|
153
|
+
@Component({
|
|
154
|
+
selector: 'app-product-list',
|
|
155
|
+
standalone: true,
|
|
156
|
+
imports: [CommonModule, NgbPaginationModule],
|
|
157
|
+
templateUrl: './product-list.component.html',
|
|
158
|
+
styleUrl: './product-list.component.scss',
|
|
159
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
160
|
+
})
|
|
161
|
+
export class ProductListComponent {
|
|
162
|
+
readonly products = signal<readonly Product[]>([]);
|
|
163
|
+
readonly page = signal(1);
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`product-list.component.html`
|
|
168
|
+
|
|
169
|
+
```html
|
|
170
|
+
<section class="product-list" data-testid="product-list">
|
|
171
|
+
<ul>
|
|
172
|
+
@for (product of products(); track product.id) {
|
|
173
|
+
<li>{{ product.name }}</li>
|
|
174
|
+
}
|
|
175
|
+
</ul>
|
|
176
|
+
<ngb-pagination [collectionSize]="total()" [(page)]="page" />
|
|
177
|
+
</section>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`product-list.component.scss`
|
|
181
|
+
|
|
182
|
+
```scss
|
|
183
|
+
.product-list {
|
|
184
|
+
display: grid;
|
|
185
|
+
gap: var(--spacing-md);
|
|
186
|
+
padding: var(--spacing-lg);
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### FORBIDDEN example
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
// ❌ HARD BLOCK — code-reviewer / tech-lead refuse merge
|
|
194
|
+
@Component({
|
|
195
|
+
selector: 'app-product-list',
|
|
196
|
+
standalone: true,
|
|
197
|
+
template: `
|
|
198
|
+
<ul>
|
|
199
|
+
@for (p of products(); track p.id) { <li>{{ p.name }}</li> }
|
|
200
|
+
</ul>
|
|
201
|
+
`,
|
|
202
|
+
styles: [`.product-list { display: grid; }`],
|
|
203
|
+
})
|
|
204
|
+
export class ProductListComponent {}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Why so strict?
|
|
208
|
+
|
|
209
|
+
- Readable PR diff (each layer isolated)
|
|
210
|
+
- HTML/SCSS linting and formatting work correctly
|
|
211
|
+
- `code-reviewer` audits HTML separately from TS
|
|
212
|
+
- Designers/UX can review HTML/SCSS without touching TS
|
|
213
|
+
- Enables Storybook extraction without refactoring
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 4. Frontend-applicable skills
|
|
218
|
+
|
|
219
|
+
The harness exposes skills that trigger by **keyword** in Claude Code/Cowork conversations. There is **NO** `duk bootstrap-frontend` or `duk grill-me` — you type in chat.
|
|
220
|
+
|
|
221
|
+
### Master table
|
|
222
|
+
|
|
223
|
+
| Skill | When to use | Exact trigger |
|
|
224
|
+
|---|---|---|
|
|
225
|
+
| `bootstrap-frontend` | Initial project scaffold | `scaffold the frontend`, `create Angular frontend`, `build the front skeleton`, `set up Angular` |
|
|
226
|
+
| `grill-me` | Discovery (interview before PRD) | `grill me on <X>`, `interview me about <X>`, `stress-test the plan` |
|
|
227
|
+
| `to-prd` | Generate PRD from discovery | `generate PRD`, `create PRD` |
|
|
228
|
+
| `to-issues` | Break PRD into GitHub issues | `break into issues`, `generate issues` |
|
|
229
|
+
| `run-sprint` | Execute a PLAN sprint | `run sprint <N>`, `execute the sprint`, `let's code this sprint` |
|
|
230
|
+
| `auto-test-guard` | Generate tests + run senior+ gate | `run tests`, `generate tests`, `test everything`, `full suite` |
|
|
231
|
+
| `api-integration-test` | Smoke test front+back integration | `test integration`, `smoke test` |
|
|
232
|
+
| `pair-debug` | Hypothesis-driven debugging | `let's debug <X>`, `investigate this bug`, `find root cause` |
|
|
233
|
+
| `prd-ready-check` | GO/NO-GO for production | `is it production ready?`, `DoD` |
|
|
234
|
+
| `brain-keeper` | Record history in Obsidian | `record in brain`, `update brain` |
|
|
235
|
+
| `honcho-memory` | Cross-session memory | `remember that <X>`, `/honcho save`, `/honcho list` |
|
|
236
|
+
| `caveman` | Telegraphic mode (default ON) | `caveman lite/full/ultra`, `stop caveman` |
|
|
237
|
+
| `project-manager` | Catch-all (default) | Any prompt without a specific skill |
|
|
238
|
+
|
|
239
|
+
### Detailed cards
|
|
240
|
+
|
|
241
|
+
#### `bootstrap-frontend`
|
|
242
|
+
|
|
243
|
+
- **When**: new project, `CLAUDE.md` configured with `Project type: frontend`.
|
|
244
|
+
- **Trigger**: `scaffold the frontend`
|
|
245
|
+
- **Prerequisite**: `Frontend stack: angular` (or `vite-vanilla`) field filled.
|
|
246
|
+
- **Output**: `frontend/` folder with Angular CLI 21, standalone, OnPush, lazy loading, Jest, jest-axe, Playwright, ng-bootstrap, ESLint, Prettier, design tokens in `src/styles/_tokens.scss`.
|
|
247
|
+
- **Next step**: `grill me on <first screen>`.
|
|
248
|
+
|
|
249
|
+
#### `grill-me` (opt-in)
|
|
250
|
+
|
|
251
|
+
- **When**: starting a new feature/screen. **Mandatory** before `to-prd` on the human path.
|
|
252
|
+
- **Trigger**: `grill me on <X>`
|
|
253
|
+
- **Output**: `docs/discovery/DISCOVERY_<feature>.md` with pains, personas, flows, constraints, technical decisions, risks. In some cases also produces `Proposed ADR` for tech choices.
|
|
254
|
+
- **Next step**: `generate PRD`.
|
|
255
|
+
|
|
256
|
+
#### `to-prd` (opt-in)
|
|
257
|
+
|
|
258
|
+
- **When**: after `grill-me`.
|
|
259
|
+
- **Trigger**: `generate PRD`
|
|
260
|
+
- **Output**: `docs/prd/PRD_<feature>.md` (Overview, Goals, User Stories, Functional Requirements, Non-functional, Out of scope).
|
|
261
|
+
- **Next step**: `analyst generates plan` → `PLAN_*.md`.
|
|
262
|
+
|
|
263
|
+
#### `run-sprint`
|
|
264
|
+
|
|
265
|
+
- **When**: PLAN approved.
|
|
266
|
+
- **Trigger**: `run sprint 1 of PLAN_<feature>.md`
|
|
267
|
+
- **Output**: sprint executed with `qa-engineer` (failing tests) → `frontend-developer` (3 green files) → `gate-keeper` (senior+ gate).
|
|
268
|
+
- **Next step**: `/impeccable polish` for visual refinement.
|
|
269
|
+
|
|
270
|
+
#### `auto-test-guard`
|
|
271
|
+
|
|
272
|
+
- **When**: end of any task; or explicitly when you want to run the suite.
|
|
273
|
+
- **Trigger**: `run tests`
|
|
274
|
+
- **Output**: full senior+ gate (coverage, mutation, jest-axe, Lighthouse, Playwright, pyramid ratio). Blocks if it fails.
|
|
275
|
+
|
|
276
|
+
#### `api-integration-test`
|
|
277
|
+
|
|
278
|
+
- **When**: after the sprint, before PRD-ready.
|
|
279
|
+
- **Trigger**: `test integration`
|
|
280
|
+
- **Output**: spins up backend + frontend, runs real `curl` on endpoints, opens Chrome MCP on critical flows, validates clean console.
|
|
281
|
+
|
|
282
|
+
#### `pair-debug`
|
|
283
|
+
|
|
284
|
+
- **When**: non-obvious bug (don't "run and see").
|
|
285
|
+
- **Trigger**: `let's debug <X>`
|
|
286
|
+
- **Flow**: hypothesis (with confidence %) → probe → confirm → fix → regression test.
|
|
287
|
+
|
|
288
|
+
#### `prd-ready-check`
|
|
289
|
+
|
|
290
|
+
- **When**: before calling a PR "ready for prod".
|
|
291
|
+
- **Trigger**: `is it production ready?`
|
|
292
|
+
- **Output**: GO / NO-GO with listed gaps.
|
|
293
|
+
|
|
294
|
+
#### `brain-keeper`
|
|
295
|
+
|
|
296
|
+
- **When**: at the end of each PLAN.
|
|
297
|
+
- **Trigger**: `record in brain`
|
|
298
|
+
- **Output**: `docs/brain/daily/<date>.md`, `docs/brain/features/<feature>.md`, ADRs, MOC updated.
|
|
299
|
+
|
|
300
|
+
#### `honcho-memory`
|
|
301
|
+
|
|
302
|
+
- **When**: you want Claude to remember something across sessions.
|
|
303
|
+
- **Trigger**: `remember that <preference>` or commands `/honcho save`, `/honcho list`, `/honcho forget`, `/honcho status`.
|
|
304
|
+
- **Output**: `[HONCHO MEMORY]` block injected into every future prompt.
|
|
305
|
+
|
|
306
|
+
#### `caveman`
|
|
307
|
+
|
|
308
|
+
- **When**: already ON by default. You only tune intensity.
|
|
309
|
+
- **Trigger**: `caveman lite/full/ultra` or `stop caveman`.
|
|
310
|
+
- **Effect**: responses ~65-75% shorter.
|
|
311
|
+
|
|
312
|
+
#### `project-manager` (catch-all)
|
|
313
|
+
|
|
314
|
+
- **When**: any prompt that doesn't match a specific skill.
|
|
315
|
+
- **Output**: routes to ONE specialist agent via Task tool (`frontend-developer`, `ux-designer`, `qa-engineer`, etc.).
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 5. External **Impeccable** skill — visual refinement
|
|
320
|
+
|
|
321
|
+
> Impeccable does not ship with `development-utility-kit`. It's an independent skill by Paul Bakaus. **For frontend it is highly recommended.**
|
|
322
|
+
|
|
323
|
+
### Origin
|
|
324
|
+
|
|
325
|
+
- Author: Paul Bakaus
|
|
326
|
+
- Repo: `github.com/pbakaus/impeccable`
|
|
327
|
+
|
|
328
|
+
### Installation
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
npx skills add pbakaus/impeccable
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Installs as an additional Claude Code skill. The `/impeccable *` commands become available in chat.
|
|
335
|
+
|
|
336
|
+
### Available commands
|
|
337
|
+
|
|
338
|
+
| Command | What it does |
|
|
339
|
+
|---|---|
|
|
340
|
+
| `/impeccable polish` | Refines fine details: spacing, alignment, visual hierarchy, microinteractions. |
|
|
341
|
+
| `/impeccable harden` | Hardens visual robustness against edge cases: overflow, long text, RTL, 200% zoom, dark mode. |
|
|
342
|
+
| `/impeccable audit` | Full scan: typography, color, layout, WCAG contrast, hierarchy. Produces report. |
|
|
343
|
+
| `/impeccable typeset` | Refines typography (scale, line-height, tracking, leading). |
|
|
344
|
+
| `/impeccable colorize` | Refines palette and ensures WCAG AA/AAA contrast. |
|
|
345
|
+
| `/impeccable layout` | Reviews hierarchy, spacing, density, grid alignment. |
|
|
346
|
+
|
|
347
|
+
### When to use
|
|
348
|
+
|
|
349
|
+
- **After** `frontend-developer` implements a screen.
|
|
350
|
+
- **Before** `prd-ready-check`.
|
|
351
|
+
- In short cycle: `polish` → re-run `jest-axe` → `harden` → re-run Lighthouse → `audit`.
|
|
352
|
+
|
|
353
|
+
### When **NOT** to use Impeccable
|
|
354
|
+
|
|
355
|
+
- Before the component is functional (markup needs to be stable).
|
|
356
|
+
- To decide the brand palette → that's `ux-designer` + `product-owner` (ADR-010).
|
|
357
|
+
- As a substitute for `jest-axe` or Lighthouse → complementary, not redundant.
|
|
358
|
+
|
|
359
|
+
### Authority
|
|
360
|
+
|
|
361
|
+
`ux-designer` + `product-owner` decide visual identity. **Impeccable is a tool, not an authority.** ADR-010 makes it clear: refinement yes, design decision no.
|
|
362
|
+
|
|
363
|
+
### Gate
|
|
364
|
+
|
|
365
|
+
`scripts/impeccable-gate.mjs` runs in **WARN-only** mode. Does not block merge (yet). Runs automatically in the pipeline to record visual drift.
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## 6. Workflow 1 — Feature from scratch with exact prompts
|
|
370
|
+
|
|
371
|
+
> Real example: **product list with server-side pagination, full-text search, and full WCAG AA a11y**.
|
|
372
|
+
|
|
373
|
+
### Turn 1 — Discovery
|
|
374
|
+
|
|
375
|
+
You:
|
|
376
|
+
|
|
377
|
+
```text
|
|
378
|
+
grill me on building a product list screen with pagination and search
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Claude (`grill-me`):
|
|
382
|
+
|
|
383
|
+
```text
|
|
384
|
+
> Let's understand. How many products expected in the database?
|
|
385
|
+
> I recommend server-side pagination via NgbPagination + Spring endpoint with
|
|
386
|
+
> Pageable. OK?
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Turn 2
|
|
390
|
+
|
|
391
|
+
You:
|
|
392
|
+
|
|
393
|
+
```text
|
|
394
|
+
ok server-side, expect ~50k products
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
Claude:
|
|
398
|
+
|
|
399
|
+
```text
|
|
400
|
+
> Search: case-insensitive? Substring or prefix?
|
|
401
|
+
> I recommend PostgreSQL full-text with tsvector + GIN index. database-engineer
|
|
402
|
+
> will model later. OK with you?
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Turn 3
|
|
406
|
+
|
|
407
|
+
You:
|
|
408
|
+
|
|
409
|
+
```text
|
|
410
|
+
yes, case-insensitive substring. Filter by category too.
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
Claude:
|
|
414
|
+
|
|
415
|
+
```text
|
|
416
|
+
> Category: single dropdown or multi-select? Hierarchical?
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Turn 4
|
|
420
|
+
|
|
421
|
+
You:
|
|
422
|
+
|
|
423
|
+
```text
|
|
424
|
+
multi-select, flat (no hierarchy for now)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
Claude continues asking about: sorting, list density (table vs cards), mobile-first, empty state, error state, loading skeleton, filter persistence (URL? localStorage?).
|
|
428
|
+
|
|
429
|
+
### Turn 10 — Discovery closes
|
|
430
|
+
|
|
431
|
+
Claude:
|
|
432
|
+
|
|
433
|
+
```text
|
|
434
|
+
> Discovery complete. Persisted to docs/discovery/DISCOVERY_product-list.md.
|
|
435
|
+
> Next step: type "generate PRD" for Claude to turn into a formal PRD.
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Turn 11 — PRD
|
|
439
|
+
|
|
440
|
+
You:
|
|
441
|
+
|
|
442
|
+
```text
|
|
443
|
+
generate PRD
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Claude (`to-prd`):
|
|
447
|
+
|
|
448
|
+
```text
|
|
449
|
+
> Created docs/prd/PRD_product-list.md with:
|
|
450
|
+
> - Overview
|
|
451
|
+
> - Goals (3)
|
|
452
|
+
> - User Stories (5)
|
|
453
|
+
> - Functional Requirements (12)
|
|
454
|
+
> - Non-functional (a11y AA, LCP <2.5s, mobile-first)
|
|
455
|
+
> - Out of scope (CSV export, bulk actions)
|
|
456
|
+
> Next: "analyst generates plan".
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Turn 12 — Technical plan
|
|
460
|
+
|
|
461
|
+
You:
|
|
462
|
+
|
|
463
|
+
```text
|
|
464
|
+
analyst generates technical plan from PRD_product-list.md
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Claude (`analyst`):
|
|
468
|
+
|
|
469
|
+
```text
|
|
470
|
+
> Created docs/plans/PLAN_product-list.md:
|
|
471
|
+
> Sprint 1 (4 tasks):
|
|
472
|
+
> 1.1 Backend: GET /api/v1/products?page&size&q&category[]
|
|
473
|
+
> 1.2 DB: GIN index on tsvector + Flyway migration
|
|
474
|
+
> 1.3 Frontend: ProductListComponent (3 files, OnPush, Signal)
|
|
475
|
+
> 1.4 E2E: Playwright flow search + pagination + filter
|
|
476
|
+
> Goal-ready DoD with measurable criteria.
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Turn 13 — Execute sprint
|
|
480
|
+
|
|
481
|
+
You:
|
|
482
|
+
|
|
483
|
+
```text
|
|
484
|
+
run sprint 1 of PLAN_product-list.md
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Claude (`run-sprint`):
|
|
488
|
+
|
|
489
|
+
```text
|
|
490
|
+
> [Task 1.1] backend-developer implements ProductController...
|
|
491
|
+
> [Task 1.2] database-engineer creates V20260527__product_search_index.sql...
|
|
492
|
+
> [Task 1.3] qa-engineer writes product-list.component.spec.ts (red) ✓
|
|
493
|
+
> [Task 1.3] frontend-developer implements 3 files:
|
|
494
|
+
> - frontend/src/app/features/products/product-list.component.ts
|
|
495
|
+
> - frontend/src/app/features/products/product-list.component.html
|
|
496
|
+
> - frontend/src/app/features/products/product-list.component.scss
|
|
497
|
+
> [Task 1.3] gate-keeper runs senior+ gate:
|
|
498
|
+
> - Jest coverage: 87% statements / 81% branches ✓
|
|
499
|
+
> - Mutation score (domain): 73% ✓
|
|
500
|
+
> - jest-axe: 0 critical, 0 serious ✓
|
|
501
|
+
> - Playwright E2E: 4/4 green ✓
|
|
502
|
+
> - Lighthouse (median 3 runs): 0.84 ✓
|
|
503
|
+
> - LCP 2200ms ✓ | CLS 0.05 ✓ | TBT 220ms ✓
|
|
504
|
+
> - Pyramid: E2E 18% of total ✓
|
|
505
|
+
> - Initial bundle: 412KB gzip ✓
|
|
506
|
+
> - GREEN ✓
|
|
507
|
+
> [Task 1.4] E2E complete.
|
|
508
|
+
> Sprint 1 done.
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Turn 14 — Visual refinement
|
|
512
|
+
|
|
513
|
+
You:
|
|
514
|
+
|
|
515
|
+
```text
|
|
516
|
+
/impeccable polish
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
Claude (Impeccable):
|
|
520
|
+
|
|
521
|
+
```text
|
|
522
|
+
> Polish analysis on ProductListComponent:
|
|
523
|
+
> 1. "Next page" button without legible aria-label ("›" as label)
|
|
524
|
+
> → added aria-label="Next page"
|
|
525
|
+
> 2. Inconsistent spacing between cards (16px and 20px mixed)
|
|
526
|
+
> → standardized to var(--spacing-md) (16px)
|
|
527
|
+
> 3. Focus ring missing on internal card links
|
|
528
|
+
> → outline: 2px solid var(--focus-ring); offset 2px
|
|
529
|
+
> 4. Loading skeleton without reduced animation for prefers-reduced-motion
|
|
530
|
+
> → media query added
|
|
531
|
+
> Diff applied to 4 files. Recommend re-running jest-axe and Lighthouse.
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Turn 15 — Re-validate
|
|
535
|
+
|
|
536
|
+
You:
|
|
537
|
+
|
|
538
|
+
```text
|
|
539
|
+
run jest-axe and lighthouse
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Claude:
|
|
543
|
+
|
|
544
|
+
```text
|
|
545
|
+
> jest-axe: 0 violations ✓
|
|
546
|
+
> Lighthouse: 0.88 (LCP 2100ms, CLS 0.04, TBT 210ms) ✓
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### Turn 16 — Smoke test
|
|
550
|
+
|
|
551
|
+
You:
|
|
552
|
+
|
|
553
|
+
```text
|
|
554
|
+
test integration
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
Claude (`api-integration-test`):
|
|
558
|
+
|
|
559
|
+
```text
|
|
560
|
+
> Spinning up backend (port 8080) + frontend (port 4200)...
|
|
561
|
+
> GET /api/v1/products?page=0&size=20 → 200 (147ms) ✓
|
|
562
|
+
> GET /api/v1/products?q=notebook → 200 (89ms) ✓
|
|
563
|
+
> Chrome MCP opens http://localhost:4200/products
|
|
564
|
+
> - Search "notebook" → 12 results ✓
|
|
565
|
+
> - Pagination page 2 → ✓
|
|
566
|
+
> - Filter category "electronics" → ✓
|
|
567
|
+
> - Console: 0 errors ✓
|
|
568
|
+
> Smoke GREEN.
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### Turn 17 — Final gate
|
|
572
|
+
|
|
573
|
+
You:
|
|
574
|
+
|
|
575
|
+
```text
|
|
576
|
+
is it production ready?
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
Claude (`prd-ready-check`):
|
|
580
|
+
|
|
581
|
+
```text
|
|
582
|
+
> PRD-ready checklist:
|
|
583
|
+
> ✓ Backend coverage 87% / branches 82%
|
|
584
|
+
> ✓ Frontend coverage 88% / branches 83%
|
|
585
|
+
> ✓ Mutation domain 73%
|
|
586
|
+
> ✓ A11y 0 critical/serious (component + E2E)
|
|
587
|
+
> ✓ Lighthouse 0.88 ≥ 0.80
|
|
588
|
+
> ✓ Pyramid E2E 18% ≤ 30%
|
|
589
|
+
> ✓ Initial bundle 412KB gzip
|
|
590
|
+
> ✓ Playwright E2E 4/4
|
|
591
|
+
> ✓ Clean console in smoke
|
|
592
|
+
> ✓ ProblemDetail (RFC 9457) on all errors
|
|
593
|
+
> ✓ No TODO, no any, no inline template/styles
|
|
594
|
+
> GO ✓
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
### Turn 18 — Record history
|
|
598
|
+
|
|
599
|
+
You:
|
|
600
|
+
|
|
601
|
+
```text
|
|
602
|
+
record in brain
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
Claude (`brain-keeper`):
|
|
606
|
+
|
|
607
|
+
```text
|
|
608
|
+
> Updated:
|
|
609
|
+
> - docs/brain/daily/2026-05-27.md
|
|
610
|
+
> - docs/brain/features/product-list.md
|
|
611
|
+
> - docs/brain/MOC.md (link added)
|
|
612
|
+
> Next: commit + PR to develop.
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Turn 19 — Commit
|
|
616
|
+
|
|
617
|
+
You:
|
|
618
|
+
|
|
619
|
+
```text
|
|
620
|
+
commit and open PR
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
Claude:
|
|
624
|
+
|
|
625
|
+
```text
|
|
626
|
+
> Commits created (Conventional Commits, NO AI references):
|
|
627
|
+
> feat(products): add product list with server-side pagination
|
|
628
|
+
> feat(products): add full-text search with tsvector
|
|
629
|
+
> test(products): add jest-axe and Playwright e2e coverage
|
|
630
|
+
> docs(products): record discovery, PRD and plan
|
|
631
|
+
> PR opened: feature/product-list → develop
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
Done. Feature from scratch in ~19 conversational turns, without ever opening an IDE to write boilerplate.
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## 7. Workflow 2 — Refine visuals with Impeccable
|
|
639
|
+
|
|
640
|
+
Scenario: component already functional, senior+ gate passed, but visuals need care before final PR.
|
|
641
|
+
|
|
642
|
+
### Recommended cycle: `polish` → `harden` → `audit`
|
|
643
|
+
|
|
644
|
+
You:
|
|
645
|
+
|
|
646
|
+
```text
|
|
647
|
+
/impeccable polish
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
Claude:
|
|
651
|
+
|
|
652
|
+
```text
|
|
653
|
+
> 7 fine adjustments applied:
|
|
654
|
+
> - Input spacing unified to var(--spacing-sm)
|
|
655
|
+
> - Header typography hierarchy (h1 → 1.875rem, h2 → 1.5rem)
|
|
656
|
+
> - :hover and :focus states with 150ms ease-out transition
|
|
657
|
+
> - Border-radius standardized to var(--radius-md) (6px)
|
|
658
|
+
> - Tokenized shadows (--shadow-sm, --shadow-md)
|
|
659
|
+
> - Icons with consistent height (1em)
|
|
660
|
+
> - Primary button with 12px 20px padding
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
You:
|
|
664
|
+
|
|
665
|
+
```text
|
|
666
|
+
/impeccable harden
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
Claude:
|
|
670
|
+
|
|
671
|
+
```text
|
|
672
|
+
> 5 robustness reinforcements:
|
|
673
|
+
> - Long text: text-overflow ellipsis + title on short columns
|
|
674
|
+
> - Horizontal overflow on tables: touch scroll + gradient shadow
|
|
675
|
+
> - RTL support: dir="auto" on text fields, icon mirroring
|
|
676
|
+
> - 200% zoom: layout intact, no cutoff
|
|
677
|
+
> - prefers-reduced-motion: animations respected
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
You:
|
|
681
|
+
|
|
682
|
+
```text
|
|
683
|
+
/impeccable audit
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
Claude:
|
|
687
|
+
|
|
688
|
+
```text
|
|
689
|
+
> Audit report:
|
|
690
|
+
> Typography: ✓ (1.250 scale, 1.5 line-height in body)
|
|
691
|
+
> Color: ✓ (15 tokens, no direct hex)
|
|
692
|
+
> Contrast: ✓ (minimum 4.7:1, AA guaranteed)
|
|
693
|
+
> Layout: ✓ (12-column grid, breakpoints sm/md/lg/xl)
|
|
694
|
+
> Hierarchy: ✓ (h1-h4, no h5/h6)
|
|
695
|
+
> Density: ✓ (compact in tables, comfortable in forms)
|
|
696
|
+
> Microinteractions: ✓ (consistent transitions)
|
|
697
|
+
> Impeccable score: 9.2/10
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
### When NOT to use Impeccable
|
|
701
|
+
|
|
702
|
+
- **Before** the component works: markup must be stable; refining code that will change = waste.
|
|
703
|
+
- **To decide brand palette**: `ux-designer` + `product-owner` decide that. Impeccable refines within already-established tokens.
|
|
704
|
+
- **Replacing jest-axe or Lighthouse**: Impeccable doesn't run screen reader or performance audit. They're complementary.
|
|
705
|
+
|
|
706
|
+
---
|
|
707
|
+
|
|
708
|
+
## 8. Workflow 3 — Angular debug with `pair-debug`
|
|
709
|
+
|
|
710
|
+
Scenario: `ProductListComponent` is `OnPush` and doesn't re-render after `search()` changes.
|
|
711
|
+
|
|
712
|
+
### Turn 1
|
|
713
|
+
|
|
714
|
+
You:
|
|
715
|
+
|
|
716
|
+
```text
|
|
717
|
+
let's debug — ProductListComponent doesn't update after search
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
Claude (`pair-debug`):
|
|
721
|
+
|
|
722
|
+
```text
|
|
723
|
+
> Symptom: list doesn't re-render despite signal visibly changing in debug.
|
|
724
|
+
> Hypothesis 1 (confidence 80%): you're mutating the array instead of creating
|
|
725
|
+
> a new one (this.resources().push() instead of this.resources.set([...])).
|
|
726
|
+
> Probe: grep ".push(" + ".pop(" + "splice(" + ".sort(" in product-list/.
|
|
727
|
+
> Confirm probe?
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
### Turn 2
|
|
731
|
+
|
|
732
|
+
You:
|
|
733
|
+
|
|
734
|
+
```text
|
|
735
|
+
yes
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
Claude:
|
|
739
|
+
|
|
740
|
+
```text
|
|
741
|
+
> Found in product-list.service.ts:42:
|
|
742
|
+
> this.resources().push(item);
|
|
743
|
+
> Hypothesis 1 CONFIRMED.
|
|
744
|
+
> Fix: this.resources.update(arr => [...arr, item]);
|
|
745
|
+
> Dispatching frontend-developer to apply + qa-engineer for regression test.
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
### Turn 3
|
|
749
|
+
|
|
750
|
+
You:
|
|
751
|
+
|
|
752
|
+
```text
|
|
753
|
+
go
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
Claude:
|
|
757
|
+
|
|
758
|
+
```text
|
|
759
|
+
> [frontend-developer] Fix applied to product-list.service.ts.
|
|
760
|
+
> [qa-engineer] Regression test add-product-updates-list.spec.ts:
|
|
761
|
+
> - Before: ❌ red (mutation doesn't trigger CD)
|
|
762
|
+
> - After: ✓ green (immutable update triggers CD)
|
|
763
|
+
> [gate-keeper] Full suite: GREEN ✓
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
### Other common hypotheses `pair-debug` raises
|
|
767
|
+
|
|
768
|
+
- Signal not being read in template (use `()` to call).
|
|
769
|
+
- `ChangeDetectorRef.markForCheck()` missed in external async callback.
|
|
770
|
+
- `trackBy` changing item identity between renders.
|
|
771
|
+
- Child component with non-signal input receiving signal without `.()`.
|
|
772
|
+
|
|
773
|
+
---
|
|
774
|
+
|
|
775
|
+
## 9. Workflow 4 — Angular → Mobile conversion
|
|
776
|
+
|
|
777
|
+
When you need to port an Angular screen to React Native, the `mobile-developer` agent covers it.
|
|
778
|
+
|
|
779
|
+
```text
|
|
780
|
+
I want to convert ProductListComponent to mobile RN
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
`project-manager` → `mobile-developer` dispatches conversion preserving domain logic.
|
|
784
|
+
|
|
785
|
+
Full details in `[Mobile](mobile)`.
|
|
786
|
+
|
|
787
|
+
---
|
|
788
|
+
|
|
789
|
+
## 10. Cheat sheet — Intent-based triggers (frontend)
|
|
790
|
+
|
|
791
|
+
| I want to... | Type |
|
|
792
|
+
|---|---|
|
|
793
|
+
| Start frontend project | `scaffold the frontend` |
|
|
794
|
+
| Feature discovery | `grill me on <X>` |
|
|
795
|
+
| Generate PRD | `generate PRD` |
|
|
796
|
+
| Break into GitHub issues | `break into issues` |
|
|
797
|
+
| Technical plan | `analyst generates technical plan` |
|
|
798
|
+
| Execute sprint | `run sprint <N>` |
|
|
799
|
+
| Run tests / gate | `run tests` |
|
|
800
|
+
| Polish visuals | `/impeccable polish` |
|
|
801
|
+
| Harden visual edge cases | `/impeccable harden` |
|
|
802
|
+
| Full visual audit | `/impeccable audit` |
|
|
803
|
+
| Refine typography | `/impeccable typeset` |
|
|
804
|
+
| Refine palette | `/impeccable colorize` |
|
|
805
|
+
| Review layout/grid | `/impeccable layout` |
|
|
806
|
+
| Smoke E2E backend+frontend | `test integration` |
|
|
807
|
+
| Final gate | `is it production ready?` |
|
|
808
|
+
| Obscure debug | `let's debug <X>` |
|
|
809
|
+
| Wireframe / screen flow | `wireframe for <screen>` |
|
|
810
|
+
| Refactor component | `refactor <ComponentName>` |
|
|
811
|
+
| Standalone a11y audit | `accessibility audit on <feature>` |
|
|
812
|
+
| Macro ADR (signal vs RxJS, etc.) | `architect proposes ADR for <decision>` |
|
|
813
|
+
| Remember preference | `remember that <X>` |
|
|
814
|
+
| List memories | `/honcho list` |
|
|
815
|
+
| Forget | `/honcho forget <id>` |
|
|
816
|
+
| Record history | `record in brain` |
|
|
817
|
+
| Stop caveman | `stop caveman` |
|
|
818
|
+
| Back to caveman | `caveman full` |
|
|
819
|
+
|
|
820
|
+
---
|
|
821
|
+
|
|
822
|
+
## 11. Decision tree — Which skill when?
|
|
823
|
+
|
|
824
|
+
```text
|
|
825
|
+
New project, empty frontend → scaffold the frontend
|
|
826
|
+
New feature, scope still fuzzy → grill me on <X>
|
|
827
|
+
Discovery done, no docs yet → generate PRD
|
|
828
|
+
PRD done, no plan → analyst generates plan
|
|
829
|
+
Plan done, time to code → run sprint <N>
|
|
830
|
+
Component done, visuals raw → /impeccable polish
|
|
831
|
+
Visuals polished, robustness missing → /impeccable harden
|
|
832
|
+
Everything applied, want report → /impeccable audit
|
|
833
|
+
Obvious bug → frontend-developer (project-manager)
|
|
834
|
+
Obscure bug, no hypothesis → let's debug <X>
|
|
835
|
+
Poor performance → /impeccable audit + Lighthouse audit
|
|
836
|
+
Refactor legacy → refactor <X> (project-manager)
|
|
837
|
+
Mobile from Angular → I want to convert <X> to mobile
|
|
838
|
+
A11y before PR → accessibility audit
|
|
839
|
+
Before asking for merge → is it production ready?
|
|
840
|
+
Post-feature, before leaving → record in brain
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
---
|
|
844
|
+
|
|
845
|
+
## 12. `CLAUDE.md` Project Identity configuration (frontend)
|
|
846
|
+
|
|
847
|
+
Edit **only** the `Project Identity` section in `CLAUDE.md`:
|
|
848
|
+
|
|
849
|
+
```markdown
|
|
850
|
+
## Project Identity
|
|
851
|
+
|
|
852
|
+
- **Project name**: `my-frontend`
|
|
853
|
+
- **Project type**: `frontend`
|
|
854
|
+
- **Primary stack**: `Angular 21`
|
|
855
|
+
- **Frontend stack**: `angular`
|
|
856
|
+
- **Database**: `n/a`
|
|
857
|
+
- **Domain**: `e-commerce`
|
|
858
|
+
- **Team size**: `2 frontend`
|
|
859
|
+
- **Additional rules**:
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
Vite Vanilla alternative:
|
|
863
|
+
|
|
864
|
+
```markdown
|
|
865
|
+
- **Frontend stack**: `vite-vanilla`
|
|
866
|
+
```
|
|
867
|
+
|
|
868
|
+
> Without `Frontend stack`, the `bootstrap-frontend` skill aborts.
|
|
869
|
+
|
|
870
|
+
---
|
|
871
|
+
|
|
872
|
+
## 13. Antipatterns
|
|
873
|
+
|
|
874
|
+
| ❌ Anti | Why it hurts |
|
|
875
|
+
|---|---|
|
|
876
|
+
| Inline `template:` or `styles:` in `@Component` | Hard block. `code-reviewer` / `tech-lead` refuse merge. |
|
|
877
|
+
| Using `any` in TypeScript | Kills type safety. `tsconfig` strict + ESLint block it. |
|
|
878
|
+
| Mutating array inside signal (`signal().push(...)`) | OnPush doesn't detect. Use `update(arr => [...arr, item])`. |
|
|
879
|
+
| Forgetting `ChangeDetectionStrategy.OnPush` | Performance degrades exponentially in large trees. |
|
|
880
|
+
| HttpClient without typed error interceptor | Errors become `any`, ProblemDetail lost. |
|
|
881
|
+
| Component without `data-testid` on interactive elements | Playwright becomes fragile with CSS selectors. |
|
|
882
|
+
| Commit with `Co-Authored-By: Claude` | Hard block. NEVER mention AI/Claude/Anthropic in commits. |
|
|
883
|
+
| Trying `duk project-manager "X"` | Doesn't exist. Skills are keyword, not CLI. |
|
|
884
|
+
| Running `to-prd` without `grill-me` first | `analyst` refuses input without `DISCOVERY_*.md`. |
|
|
885
|
+
| Skipping `gate-keeper` "because in a hurry" | Gate is non-negotiable. |
|
|
886
|
+
| Mixing Reactive Forms and Signal Forms | Pick one model per feature; preference: Signal Forms. |
|
|
887
|
+
| `any` in HttpClient response | Use `HttpClient.get<Resource>(...)` always typed. |
|
|
888
|
+
| Giant "smart" components (>200 lines TS) | Split into sub-components or facade service. |
|
|
889
|
+
| Forgetting `@if` / `@for` (new template syntax) | Angular 21 uses new control flow; `*ngIf` is legacy. |
|
|
890
|
+
| Lazy loading only on root route | Lazy on features too — bundle splitting. |
|
|
891
|
+
| `console.log` left in code | ESLint blocks. Use injectable `LoggerService`. |
|
|
892
|
+
|
|
893
|
+
---
|
|
894
|
+
|
|
895
|
+
## 14. Frontend-specific troubleshooting
|
|
896
|
+
|
|
897
|
+
### HMR not updating after edit
|
|
898
|
+
|
|
899
|
+
- Kill the server (`Ctrl+C`) and restart with `ng serve`.
|
|
900
|
+
- Verify you edited the correct `.ts`/`.html`/`.scss` file (no cache).
|
|
901
|
+
- Lower `--poll` if you're on WSL/mounted volume.
|
|
902
|
+
|
|
903
|
+
### "Stale" signal in template
|
|
904
|
+
|
|
905
|
+
- Confirm you're calling `()`: `{{ products() }}` not `{{ products }}`.
|
|
906
|
+
- For external async callback (non-Angular), wrap in `NgZone.run()` or inject `ChangeDetectorRef`.
|
|
907
|
+
|
|
908
|
+
### `ChangeDetectorRef.markForCheck()` needed?
|
|
909
|
+
|
|
910
|
+
- In 99% of Signal cases, **no**. Signals already notify.
|
|
911
|
+
- Only needed when the trigger comes from outside the zone (e.g., native WebSocket, `setTimeout` in external libs, SDK callback).
|
|
912
|
+
|
|
913
|
+
### Initial bundle > 500KB
|
|
914
|
+
|
|
915
|
+
- Audit with `ng build --stats-json` + `webpack-bundle-analyzer`.
|
|
916
|
+
- Lazy loading on feature routes.
|
|
917
|
+
- Tree-shake imports (`import { x } from 'lib'` not `import 'lib'`).
|
|
918
|
+
- Move heavy libs (charts, editor) into lazy chunks.
|
|
919
|
+
|
|
920
|
+
### Playwright E2E timeout
|
|
921
|
+
|
|
922
|
+
- Increase timeout only on flows with real external calls.
|
|
923
|
+
- Prefer `page.waitForLoadState('networkidle')` over `waitForTimeout`.
|
|
924
|
+
- Use `data-testid` instead of fragile CSS/XPath selectors.
|
|
925
|
+
|
|
926
|
+
### `bootstrap-frontend` doesn't trigger
|
|
927
|
+
|
|
928
|
+
- `CLAUDE.md` without `Frontend stack`. Add `Frontend stack: angular`.
|
|
929
|
+
- Cowork/Claude Code must be at project root.
|
|
930
|
+
- Confirm `duk install` ran without error.
|
|
931
|
+
|
|
932
|
+
### `jest-axe` fails on "color-contrast"
|
|
933
|
+
|
|
934
|
+
- You have direct hex in SCSS? Move to token.
|
|
935
|
+
- Check contrast on `var(--text-primary)` vs `var(--surface-base)`.
|
|
936
|
+
- Minimum AA = 4.5:1 (normal text), 3:1 (large text).
|
|
937
|
+
|
|
938
|
+
### Lighthouse score < 0.80
|
|
939
|
+
|
|
940
|
+
- High LCP → preload critical, optimize hero image, server push.
|
|
941
|
+
- High CLS → reserve space (`aspect-ratio`, `width`/`height` on img).
|
|
942
|
+
- High TBT → split chunks, defer scripts, web worker for CPU.
|
|
943
|
+
- Heavy bundle → aggressive lazy loading.
|
|
944
|
+
|
|
945
|
+
### Pyramid ratio E2E > 30%
|
|
946
|
+
|
|
947
|
+
- Testing business rules in E2E? Move to Jest unit.
|
|
948
|
+
- E2E should test **flow**, not **logic**.
|
|
949
|
+
- Mock API in Jest, leave E2E only for critical end-to-end flows.
|
|
950
|
+
|
|
951
|
+
### `duk dashboard` doesn't open
|
|
952
|
+
|
|
953
|
+
- Port 4242 in use? `duk dashboard --port 5252`.
|
|
954
|
+
- Firewall blocking localhost? Allow Node.
|
|
955
|
+
- Logs in `~/.duk/dashboard.log`.
|
|
956
|
+
|
|
957
|
+
### Skills don't trigger (general)
|
|
958
|
+
|
|
959
|
+
- Check Cowork/Claude Code has `.claude/skills/` loaded.
|
|
960
|
+
- Restart the session.
|
|
961
|
+
- Confirm exact keyword — `scaffold the front` ≠ `scaffold the frontend`.
|
|
962
|
+
|
|
963
|
+
---
|
|
964
|
+
|
|
965
|
+
## 15. Honcho memory in practice (frontend)
|
|
966
|
+
|
|
967
|
+
Honcho injects a `[HONCHO MEMORY]` block into every prompt. Useful frontend preferences to record:
|
|
968
|
+
|
|
969
|
+
```text
|
|
970
|
+
remember that I always use 3 separate files in Angular components
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
```text
|
|
974
|
+
remember that I prefer Signal Forms over Reactive Forms
|
|
975
|
+
```
|
|
976
|
+
|
|
977
|
+
```text
|
|
978
|
+
remember that I never use any in TypeScript
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
```text
|
|
982
|
+
remember that every interactive element needs data-testid
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
```text
|
|
986
|
+
remember that I prefer OnPush + Signal in every new component
|
|
987
|
+
```
|
|
988
|
+
|
|
989
|
+
```text
|
|
990
|
+
remember that brand palette is #1a73e8 primary, #0f5fc7 hover, #e8f0fe surface
|
|
991
|
+
```
|
|
992
|
+
|
|
993
|
+
```text
|
|
994
|
+
remember mobile-first on all breakpoints
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
Direct commands:
|
|
998
|
+
|
|
999
|
+
```text
|
|
1000
|
+
/honcho save always commit with Conventional Commits
|
|
1001
|
+
/honcho list
|
|
1002
|
+
/honcho forget abc123
|
|
1003
|
+
/honcho status
|
|
1004
|
+
/honcho setup
|
|
1005
|
+
```
|
|
1006
|
+
|
|
1007
|
+
Details: `[Honcho memory](../docs/honcho-memory)`.
|
|
1008
|
+
|
|
1009
|
+
---
|
|
1010
|
+
|
|
1011
|
+
## 16. Active hooks
|
|
1012
|
+
|
|
1013
|
+
The harness installs Git hooks that run automatically:
|
|
1014
|
+
|
|
1015
|
+
- `pre-commit`: lint, formatting, type check, jest-axe smoke
|
|
1016
|
+
- `commit-msg`: validates Conventional Commits + blocks AI/Claude mentions
|
|
1017
|
+
- `pre-push`: runs full unit suite
|
|
1018
|
+
- `post-merge`: suggests `duk install` if `.claude/` changed
|
|
1019
|
+
|
|
1020
|
+
Full reference: `[Hooks reference](../docs/hooks-reference)`.
|
|
1021
|
+
|
|
1022
|
+
---
|
|
1023
|
+
|
|
1024
|
+
## 17. Quick glossary
|
|
1025
|
+
|
|
1026
|
+
| Term | Definition |
|
|
1027
|
+
|---|---|
|
|
1028
|
+
| **Skill** | Harness entry layer. Triggers by keyword in chat. |
|
|
1029
|
+
| **Agent** | Specialist executor. Invoked by skill via Task tool. |
|
|
1030
|
+
| **Task tool** | Claude mechanism to invoke sub-agent in parallel/sequence. |
|
|
1031
|
+
| **PLAN** | `docs/plans/PLAN_*.md` — technical plan with sprints and DoD. |
|
|
1032
|
+
| **PRD** | `docs/prd/PRD_*.md` — Product Requirements Document. |
|
|
1033
|
+
| **DISCOVERY** | `docs/discovery/DISCOVERY_*.md` — `grill-me` output. |
|
|
1034
|
+
| **ADR** | Architecture Decision Record. Macro architectural decisions. |
|
|
1035
|
+
| **Goal-ready DoD** | Definition of Done with measurable criteria (not vague). |
|
|
1036
|
+
| **Senior+ gate** | Set of non-negotiable thresholds (coverage, mutation, a11y, Lighthouse, pyramid). |
|
|
1037
|
+
| **Signal** | Angular 21 reactive primitive (`signal()`, `computed()`, `effect()`). |
|
|
1038
|
+
| **OnPush** | Change detection strategy that only updates on input/signal change. |
|
|
1039
|
+
| **Standalone** | Component without NgModule. Default in Angular 21. |
|
|
1040
|
+
| **ng-bootstrap** | UI lib (modal, datepicker, pagination, etc.). Harness default. |
|
|
1041
|
+
| **Impeccable** | External visual refinement skill (Paul Bakaus). |
|
|
1042
|
+
| **jest-axe** | Jest plugin that runs axe-core for a11y in component tests. |
|
|
1043
|
+
| **Lighthouse** | Automated performance/a11y/best-practices/SEO audit. |
|
|
1044
|
+
| **Honcho** | Cross-session persistent memory system (v3 self-hosted). |
|
|
1045
|
+
| **Caveman** | Telegraphic response mode (default ON, ~65-75% fewer tokens). |
|
|
1046
|
+
| **Pyramid ratio** | % of E2E vs total tests. Limit: ≤30%, ideal ≤15%. |
|
|
1047
|
+
|
|
1048
|
+
---
|
|
1049
|
+
|
|
1050
|
+
## 18. Cross-references
|
|
1051
|
+
|
|
1052
|
+
- `[Architecture](../docs/architecture-overview)` — harness macro view
|
|
1053
|
+
- `[Agents reference](../docs/agents-reference)` — full agent list
|
|
1054
|
+
- `[Skills reference](../docs/skills-reference)` — full skill list
|
|
1055
|
+
- `[Pipeline](../docs/pipeline)` — PO → analyst → architect → run-sprint → gate-keeper flow
|
|
1056
|
+
- `[Quality gate](../docs/quality-gate)` — detailed senior+ thresholds
|
|
1057
|
+
- `[Stack rules](../docs/stack-rules)` — Angular/Spring/etc. conventions
|
|
1058
|
+
- `[Hooks reference](../docs/hooks-reference)` — active Git hooks
|
|
1059
|
+
- `[Honcho memory](../docs/honcho-memory)` — cross-session memory
|
|
1060
|
+
- `[Git Flow](../docs/git-flow)` — standard Git flow
|
|
1061
|
+
- `[Troubleshooting](../docs/troubleshooting)` — general common issues
|
|
1062
|
+
- `[Backend](backend)` — Spring Boot backend manual
|
|
1063
|
+
- `[Fullstack](fullstack)` — monorepo manual
|
|
1064
|
+
- `[Mobile](mobile)` — React Native manual
|
|
1065
|
+
- `[Existing project](existing-project)` — legacy adoption
|