@walwal-harness/cli 1.2.0 → 1.3.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 +11 -0
- package/assets/templates/config.json +27 -0
- package/bin/init.js +56 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -170,6 +170,17 @@ your-project/
|
|
|
170
170
|
| Unit Testing | Jest (BE) + Vitest (FE) |
|
|
171
171
|
| Database | PostgreSQL / SQLite |
|
|
172
172
|
|
|
173
|
+
## 권장 외부 스킬
|
|
174
|
+
|
|
175
|
+
하네스는 자체 reference 파일로 기본 가이드를 제공하지만, 아래 외부 스킬을 설치하면 품질이 향상됩니다. 초기화 시 자동으로 설치 여부를 체크하고 안내합니다.
|
|
176
|
+
|
|
177
|
+
| 스킬 | 설명 | 사용 에이전트 |
|
|
178
|
+
|------|------|-------------|
|
|
179
|
+
| **vercel** | Vercel/Next.js 배포, 성능 최적화, AI SDK | Generator-FE |
|
|
180
|
+
| **web-design-guidelines** | UI/UX 접근성, Web Interface Guidelines | Evaluator-Visual, Generator-FE |
|
|
181
|
+
| **taste-skill** | AI 생성 UI 디자인 품질, AI슬롭 감지 | Evaluator-Visual, Generator-FE |
|
|
182
|
+
| **supanova-design-skill** | 디자인 시스템 규칙, 시각적 일관성 | Evaluator-Visual, Generator-FE |
|
|
183
|
+
|
|
173
184
|
## Playwright MCP 설정
|
|
174
185
|
|
|
175
186
|
Evaluator가 브라우저 테스트를 수행하려면 Playwright MCP가 필요합니다. `~/.mcp.json`에 추가:
|
|
@@ -84,6 +84,33 @@
|
|
|
84
84
|
"gotchas": ".harness/gotchas",
|
|
85
85
|
"progress": ".harness/progress.txt"
|
|
86
86
|
},
|
|
87
|
+
"recommended_skills": {
|
|
88
|
+
"comment": "Claude Code에 설치하면 하네스 품질이 향상되는 외부 스킬 목록",
|
|
89
|
+
"vercel": {
|
|
90
|
+
"description": "Vercel/Next.js 배포, 성능 최적화, AI SDK 가이드",
|
|
91
|
+
"used_by": ["generator-frontend"],
|
|
92
|
+
"install": "claude skill install vercel",
|
|
93
|
+
"check_path": ".claude/skills/vercel"
|
|
94
|
+
},
|
|
95
|
+
"web-design-guidelines": {
|
|
96
|
+
"description": "UI/UX 접근성, 디자인 리뷰, Web Interface Guidelines",
|
|
97
|
+
"used_by": ["evaluator-visual", "generator-frontend"],
|
|
98
|
+
"install": "claude skill install web-design-guidelines",
|
|
99
|
+
"check_path": ".claude/skills/web-design-guidelines"
|
|
100
|
+
},
|
|
101
|
+
"taste-skill": {
|
|
102
|
+
"description": "AI 생성 UI의 디자인 품질 검증, AI슬롭 패턴 감지",
|
|
103
|
+
"used_by": ["evaluator-visual", "generator-frontend"],
|
|
104
|
+
"install": "npx claude-skill install leonxlnx/taste-skill",
|
|
105
|
+
"check_path": ".claude/skills/taste-skill"
|
|
106
|
+
},
|
|
107
|
+
"supanova-design-skill": {
|
|
108
|
+
"description": "디자인 시스템 규칙, 컴포넌트 패턴, 시각적 일관성",
|
|
109
|
+
"used_by": ["evaluator-visual", "generator-frontend"],
|
|
110
|
+
"install": "npx claude-skill install uxjoseph/supanova-design-skill",
|
|
111
|
+
"check_path": ".claude/skills/supanova-design-skill"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
87
114
|
"tech_stack": {
|
|
88
115
|
"backend": {
|
|
89
116
|
"framework": "NestJS (TypeScript)",
|
package/bin/init.js
CHANGED
|
@@ -283,6 +283,60 @@ function checkPlaywrightMcp() {
|
|
|
283
283
|
log('');
|
|
284
284
|
}
|
|
285
285
|
|
|
286
|
+
// ─────────────────────────────────────────
|
|
287
|
+
// 6. Recommended skills check
|
|
288
|
+
// ─────────────────────────────────────────
|
|
289
|
+
function checkRecommendedSkills() {
|
|
290
|
+
const configPath = path.join(HARNESS_DIR, 'config.json');
|
|
291
|
+
if (!fileExists(configPath)) return;
|
|
292
|
+
|
|
293
|
+
let config;
|
|
294
|
+
try {
|
|
295
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
296
|
+
} catch (e) { return; }
|
|
297
|
+
|
|
298
|
+
const skills = config.recommended_skills;
|
|
299
|
+
if (!skills) return;
|
|
300
|
+
|
|
301
|
+
const missing = [];
|
|
302
|
+
const found = [];
|
|
303
|
+
|
|
304
|
+
for (const [name, info] of Object.entries(skills)) {
|
|
305
|
+
if (name === 'comment') continue;
|
|
306
|
+
const checkPath = path.join(PROJECT_ROOT, info.check_path);
|
|
307
|
+
if (fileExists(checkPath)) {
|
|
308
|
+
found.push(name);
|
|
309
|
+
} else {
|
|
310
|
+
missing.push({ name, ...info });
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (found.length > 0) {
|
|
315
|
+
log(`Recommended skills installed: ${found.join(', ')}`);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (missing.length > 0) {
|
|
319
|
+
console.log('');
|
|
320
|
+
log('╔═══════════════════════════════════════════════════════════╗');
|
|
321
|
+
log('║ Recommended skills (not installed) ║');
|
|
322
|
+
log('╠═══════════════════════════════════════════════════════════╣');
|
|
323
|
+
for (const skill of missing) {
|
|
324
|
+
const agents = skill.used_by.join(', ');
|
|
325
|
+
log(`║ ${skill.name}`);
|
|
326
|
+
log(`║ ${skill.description}`);
|
|
327
|
+
log(`║ Used by: ${agents}`);
|
|
328
|
+
log(`║ Install: ${skill.install}`);
|
|
329
|
+
log('║');
|
|
330
|
+
}
|
|
331
|
+
log('║ These skills are optional but improve output quality. ║');
|
|
332
|
+
log('║ Harness reference files provide baseline guidance ║');
|
|
333
|
+
log('║ even without these skills installed. ║');
|
|
334
|
+
log('╚═══════════════════════════════════════════════════════════╝');
|
|
335
|
+
} else if (found.length > 0) {
|
|
336
|
+
log('All recommended skills are installed!');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
286
340
|
// ─────────────────────────────────────────
|
|
287
341
|
// Help
|
|
288
342
|
// ─────────────────────────────────────────
|
|
@@ -305,6 +359,7 @@ What it does:
|
|
|
305
359
|
3. Copies helper scripts to scripts/
|
|
306
360
|
4. Creates AGENTS.md + CLAUDE.md symlink
|
|
307
361
|
5. Checks Playwright MCP configuration
|
|
362
|
+
6. Checks recommended external skills (Vercel, design skills)
|
|
308
363
|
|
|
309
364
|
After init:
|
|
310
365
|
1. Restart Claude Code session (exit and re-enter) for skills to load
|
|
@@ -337,6 +392,7 @@ function main() {
|
|
|
337
392
|
installScripts();
|
|
338
393
|
setupAgentsMd();
|
|
339
394
|
checkPlaywrightMcp();
|
|
395
|
+
checkRecommendedSkills();
|
|
340
396
|
|
|
341
397
|
console.log('');
|
|
342
398
|
log('═══ Initialization Complete ═══');
|
package/package.json
CHANGED