https://github.com/kazuph/yunomi
Human-in-the-loop review interface for AI coding workflows
https://github.com/kazuph/yunomi
ai-agents claude-code code-review developer-tools human-in-the-loop moonbit
Last synced: 6 days ago
JSON representation
Human-in-the-loop review interface for AI coding workflows
- Host: GitHub
- URL: https://github.com/kazuph/yunomi
- Owner: kazuph
- License: mit
- Created: 2025-11-26T07:24:33.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2026-07-04T00:40:00.000Z (12 days ago)
- Last Synced: 2026-07-04T02:22:51.143Z (12 days ago)
- Topics: ai-agents, claude-code, code-review, developer-tools, human-in-the-loop, moonbit
- Language: MoonBit
- Homepage: https://www.npmjs.com/package/yunomi
- Size: 59 MB
- Stars: 18
- Watchers: 0
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.ja.md
- License: LICENSE
Awesome Lists containing this project
README
ã©ãã ðµ
ã¬ãã¥ãŒãããè¶ã®ããã«å·®ãåºãã
yunomiïŒæ¹¯ã®ã¿ïŒâ AIã³ãŒãã£ã³ã°ã¯ãŒã¯ãããŒã®ããã®Human-in-the-loopæ¿èªã²ãŒã
---
> **ã€ã³ã¹ããŒã«æé ã¯ãããŸããã** AIã« *ã`npx yunomi` ãå®è¡ããŠãã* ãšèšãã ããããšã¯AIãåãã£ãŠãããŸãã
**yunomi**ïŒæ¹¯ã®ã¿ïŒã¯ãæ¥æ¬ã®æ®ããã®ãªãã®ãã®åšãåã£æãåãç¿ããªããäž¡æã§å
ããšæž©ãããæ¹¯ã®ã¿ã®ãè¶ã¯ãã€ãåãåºããæ¹ãããŸãââãã£ãšç®ã®åã«çœ®ãããŠãå°ããªäŒéãšãã²ãšããšââãã©ãããã
## ã¹ããŒãªãŒ
yunomiã¯ã人éãããã£ããã®ãèŠããããšèŠæ±ããããã®ããŒã«ã§ã¯ãããŸããã
ãã®**éã®æäœ**ã®ããã®ããŒã«ã§ãã
AIãšãŒãžã§ã³ãã¯ä»äºãçµãããšãããã ãã§ããŸããããšèšãã¹ãã§ã¯ãããŸããã
å ±åæžãæ·¹ããã¹ãã§ãââäœãå€ããã®ãããªããããšããã³ã¹ãšãã¹ãçµæââãããæ¹¯ã®ã¿ã«æ³šãã§ãããªãã®åã«ãã£ãšçœ®ã:
```bash
npx yunomi REPORT.md
```
ãã©ããðµã
ãã©ãŠã¶ãéããŸããããªãã¯èªåã®ããŒã¹ã§èªã¿ãã³ã¡ã³ããæ®ããæ¿èªããããçªãè¿ããæ±ºããŸãããšãŒãžã§ã³ãã¯è¯ã絊ä»ãããããããã«ãéãã«åŸ
ã¡ãŸãââããªããæ±ºãããŸã§ãSubmitãããšyunomiã¯çµäºããããªãã®å€æãæ§é åYAMLãšããŠãšãŒãžã§ã³ããžè¿ããŸããæ¿èªãåºããŸã§ããã®ã«ãŒããç¶ããŸãã
vibe codingã®æä»£ã人éã¯ãããã¹ãŠã®diffãèªã¿ãŸãããèªãã®ã¯ä»äºãã®ãã®ââ**æå³ã»å€æŽã»èšŒæ **ã§ããyunomiã¯ãAIã®ä»äºãšäººéã®å€æã®ããã ã®åãæž¡ãã®ç¬éãæ¯åãç€Œåæ£ããå·®ãåºãããŸãã
## ããŒãããã: The Review Loop ð
äžæ¯ã§äŒè©±ã¯çµãããŸãããyunomiã®æ¬¡ã®ã¡ãžã£ãŒé²åã¯ã1åã®ã¬ãã¥ãŒã**å€ã©ãŠã³ãã®ã«ãŒã**ãžå€ããããšââAIãã€ãã£ãã¬ãã¥ãŒããŒã«ãå®çŸ©ããã¯ãŒã¯ãããŒã§ãïŒ
- **ã©ãŠã³ã** â ä¿®æ£äŸé Œã®ããšããšãŒãžã§ã³ããçŽã㊠`yunomi go` ãå®è¡ãããšããã©ãŠã¶ã«æ°ããã©ãŠã³ããéãã**ã³ã¡ã³ã以éã«å®éã«äœãå€ãã£ããã®diff**ã衚瀺ããã
- **æ¶ããªãã¹ã¬ãã** â ã³ã¡ã³ãã¯ã©ãŠã³ããè·šãã§è¡ã«åŒµãä»ãç¶ãã**ããªãã解決ãããŸã§æªè§£æ±ºã®ãŸãŸ**ããçŽããã€ãããã§ãã£ãŒãããã¯ãéã«æ¶ããããšã¯ããã§ããªã
- **ã¬ãã¥ãŒãã¡ã€ã«** â å€å®ã¯ `.yunomi/reviews/` ã«ãã©ã³ãåäœã§æ°žç¶åãã¿ãŒããã«ãæ¶ããŠããã©ã®ãšãŒãžã§ã³ãïŒClaude Code / Codex / Cursor / OpenCodeâŠïŒã§ãç¿æ¥ã«ãŒããåéã§ãã
- **ã©ã€ãã¢ããªã¬ãã¥ãŒ** â `yunomi live http://localhost:3000` ãdevãµãŒããŒããããã·ããåããŠããã¢ããªã®**DOMèŠçŽ ã«çŽæ¥ãã³ã³ã¡ã³ã**ã§ãã
- **ã¬ãã¥ãŒäžã«è©±ãããã** â èªã¿é²ããªããã³ã¡ã³ã1ä»¶ã ãããšãŒãžã§ã³ããžå³éä¿¡ããè¿ä¿¡ãã¹ã¬ããã«å±ãã®ãçºãããã
- **`yunomi install `** / **`yunomi mcp`** â å
šãšãŒãžã§ã³ãç°å¢ãžã®ã¯ã³ã³ãã³ãskillé
åžãšãMCPãµãŒããŒã¢ãŒã
[crit](https://crit.md/) ãªã©ãšã®ã®ã£ããåæãå«ãæ©èœåäœã®å®å
šãªèšç»ã¯ [PLAN.md](./PLAN.md) ã«ãããŸããäžå¿ã«ããã®ã¯å€ãããEvidence-firstã®å ±åæåââyunomiã¯ããããã**diffã§ã¯ãªããä»äºãã®ãã®**ãã¬ãã¥ãŒããŸãã
## ã¯ããããïŒæé ã¯ããã ãïŒ
AIãšãŒãžã§ã³ãã«ããèšã£ãŠãã ãã:
> ããããããä»äºãçµãã£ãã `npx yunomi` ãå®è¡ããŠãã
以äžã§ãããšãŒãžã§ã³ããåŒæ°ãªãã§ `npx yunomi` ãå®è¡ãããšãã¹ãã«ææžãåºåããããšãŒãžã§ã³ãã¯ãã¹ãŠãçè§£ããŸãââè¯ãå ±åæžã®æžãæ¹ãå·®ãåºãæ¹ãããªãã®å€æã®åãåãæ¹ãæ¿èªãŸã§ç¶ãã«ãŒãã®åãæ¹ãç¶ããŠãšãŒãžã§ã³ãããyunomiãæ°žç¶ã¹ãã«ãšããŠã€ã³ã¹ããŒã«ããŸããïŒããšææ¡ããã®ã§ãäžåºŠYESãšçããã°ã以éã¯äºåºŠãšèšãå¿
èŠã¯ãããŸããã
ã°ããŒãã«ã€ã³ã¹ããŒã«äžèŠããã©ã°ã€ã³èšå®äžèŠãèšå®ãã¡ã€ã«äžèŠã**ãè¶ã¯åæã«åºãŠããŸãã**
---
yunomiïŒæ§å **reviw**ïŒã¯ãMarkdownå ±åæžã»è¡šåœ¢åŒããŒã¿ã»ããã¹ãã»diffãã¡ã€ã«ãã¬ãã¥ãŒã»æ³šéããããã®è»œéãã©ãŠã¶ããŒã¹ããŒã«ã[MoonBit](https://www.moonbitlang.com/)ã§æžãããŠãããææžãJavaScriptã¯ãŒããCSVãTSVããã¬ãŒã³ããã¹ããMarkdownãunified diff圢åŒããµããŒããã³ã¡ã³ãã¯YAML圢åŒã§æšæºåºåã«åºåãããŸãã
## æ©èœ
### ãã¡ã€ã«åœ¢åŒãµããŒã
- **CSV/TSV**: ã¹ãã£ãããŒããããŒãã«ã©ã åºå®ããã£ã«ã¿ãªã³ã°ãã«ã©ã ãªãµã€ãºä»ãã§è¡šåœ¢åŒããŒã¿ã衚瀺
- **Markdown**: åæã¹ã¯ããŒã«ä»ããµã€ããã€ãµã€ããã¬ãã¥ãŒããã¬ãã¥ãŒããã¯ãªãã¯ã§ã³ã¡ã³ã
- **Diff/Patch**: ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãä»ãGitHubã¹ã¿ã€ã«diffãã¥ãŒã500è¡ä»¥äžã®å€§ããªãã¡ã€ã«ã¯æãããã¿å¯èœããã€ããªãã¡ã€ã«ã¯æ«å°Ÿã«ãœãŒã
- **ããã¹ã**: ãã¬ãŒã³ããã¹ããã¡ã€ã«ã®è¡ããšã³ã¡ã³ã
### Mermaid.jsãã€ã¢ã°ã©ã
- Markdownãã¡ã€ã«ã®Mermaidãã€ã¢ã°ã©ã ãèªåæ€åºã»ã¬ã³ããªã³ã°
- ãã€ã¢ã°ã©ã ãã¯ãªãã¯ã§ãããããä»ããã«ã¹ã¯ãªãŒã³ãã¥ãŒã¢ãéã
- ããŠã¹ãã€ãŒã«ã§ãºãŒã ïŒã«ãŒãœã«äœçœ®ãäžå¿ã«ãæå€§10åïŒ
- ããŠã¹ãã©ãã°ã§ãã³
- ãã©ãã¯ãããã®ãã³ããºãŒã ã»ã¿ãããžã§ã¹ãã£ãŒå¯Ÿå¿
- WindowsåãShift+ã¹ã¯ããŒã«ãºãŒã 察å¿
- ããŒã¯ã¢ãŒãã§ã®ãµã ãã€ã«è¡šç€ºå¯Ÿå¿
- ãã«ã¹ã¯ãªãŒã³çµäºæã«ãœãŒã¹è¡ããã€ã©ã€ã
- æ§æãšã©ãŒã¯ããŒã¹ãéç¥ã§è¡šç€º
### ã¡ãã£ã¢ãµã€ãããŒ
- å·Šãµã€ãããŒã«ç»åã»åç»ã®ãµã ãã€ã«ã®ã£ã©ãªãŒã衚瀺
- ãµã ãã€ã«ã¯ãªãã¯ã§å¯Ÿå¿ããã¡ãã£ã¢ã«ã¹ã¯ããŒã«ïŒãã€ã©ã€ã
- ââããŒã§ååŸã®ã¡ãã£ã¢ãžãžã£ã³ããEscapeã§éžæè§£é€
- çªå·ãããžä»ãã§çŽ æ©ãèå¥
### ã¡ãã£ã¢åã蟌ã¿èŠåŸãã§ãã¯ïŒAIãã¬ã³ããªãŒïŒ
- ã¡ãã£ã¢ãã¡ã€ã«ã `` åã蟌ã¿ã§ã¯ãªã `[text](path)` ãªã³ã¯ã§æžãããŠããå Žåã`yunomi file.md` ã¯ãšã©ãŒïŒexit 1ïŒã§èµ·åãæåŠ
- è¡çªå·ãšãã®ãŸãŸé©çšã§ããä¿®æ£æ¡ãå
šä»¶è¡šç€ºããã®ã§ãAIãšãŒãžã§ã³ããèªåä¿®æ£ããŠãªãã©ã€ã§ãã
### ã¡ãã£ã¢ãã«ã¹ã¯ãªãŒã³
- Markdownãã¬ãã¥ãŒã®ç»åãã¯ãªãã¯ã§ãã«ã¹ã¯ãªãŒã³ãã¥ãŒã¢ãéã
- åç»ãã¯ãªãã¯ã§YouTube颚ããŒããŒãã·ã§ãŒãã«ããä»ããã«ã¹ã¯ãªãŒã³åçïŒSpace/KãJ/Lãç¢å°ããŒã0-9ïŒ
- ç»å/åç»èªäœãå«ãä»»æã®å Žæãã¯ãªãã¯ã§ãã«ã¹ã¯ãªãŒã³ãªãŒããŒã¬ã€ãéãã
- ã¡ãã£ã¢ãã¯ãªãã¯ãããšMarkdownããã«ã®å¯Ÿå¿ãããœãŒã¹è¡ãèªåãã€ã©ã€ã
- åç»ã¿ã€ã ã©ã€ã³èšå®ïŒã·ãŒã³æ€åºæåºŠã®èª¿æŽïŒ
### UIæ©èœ
- **ããŒãåãæ¿ã**: ã©ã€ã/ããŒã¯ã¢ãŒãã®åãæ¿ã
- **ãã¬ãã¥ãŒãªã³ãªãŒã¢ãŒã**: ãœãŒã¹ããã«ãé衚瀺ã«ããŠãã¬ãã¥ãŒãã¯ã€ã衚瀺
- **èŠåºãæãããã¿**: èŠåºãã®âŒãã¯ãªãã¯ã§ã»ã¯ã·ã§ã³ãæãããã¿/å±é
- **è€æ°ãã¡ã€ã«ãµããŒã**: è€æ°ãã¡ã€ã«ãå¥ã
ã®ããŒãã§åæã«éã
- **ãã©ãã°éžæ**: ç©åœ¢é åãŸãã¯è€æ°è¡ãéžæããŠãããã³ã¡ã³ã
- **ãªã¢ã«ã¿ã€ã æŽæ°**: SSEçµç±ã§ãã¡ã€ã«å€æŽæã«ããããªããŒã
- **ã³ã¡ã³ãæ°žç¶å**: localStorageã«ã³ã¡ã³ããèªåä¿åããªã«ããªãŒã¢ãŒãã«ä»ã
- **ç»åæ·»ä»**: ã³ã¡ã³ããã€ã¢ãã°ãšSubmitã¢ãŒãã«ã§ç»åæ·»ä»ïŒCmd/Ctrl+Vã§è²Œãä»ãïŒ
- **éžæè¡ã³ããŒ**: ã³ã¡ã³ããã€ã¢ãã°ã®ðãã¿ã³ã§éžæè¡ããã¹ããã³ããŒ
- **ããŒããŒãã·ã§ãŒãã«ãã**: Cmd/Ctrl+Enterã§éä¿¡ã¢ãŒãã«ãéã
- **ãã«ãã¿ãåæ**: 1ã€ã®ã¿ãã§Submitãããšåããã¡ã€ã«ã®ä»ã®ã¿ããé£åããŠéãã
- **ãµãŒããŒæ€åº**: æ¢åãµãŒããŒãåå©çšïŒããã¯ãã¡ã€ã«ã§ç®¡çïŒ
- **ã¿ãã¢ã¯ãã£ããŒã·ã§ã³ïŒmacOSïŒ**: AppleScriptçµç±ã§æ¢åãã©ãŠã¶ã¿ããèªåã¢ã¯ãã£ãå
- **ã¬ãã¥ãŒå±¥æŽ**: ãã¡ã€ã«ããŒã¹ã®æ°žç¶çãªã¬ãã¥ãŒå±¥æŽ
- **details/summary察å¿**: HTML details/summaryã¿ã°ãæãããã¿ã»ã¯ã·ã§ã³ãšããŠè¡šç€º
### åºå
- fileãmodeãrowãcolãvalueãã³ã¡ã³ãããã¹ããå«ãYAML圢åŒ
- ã¬ãã¥ãŒããŒãçšã®ãµããªãŒãã£ãŒã«ã
- ç»åæ·»ä»ã¯base64ããŒã¿ãšããŠå«ã
## ã€ã³ã¹ããŒã«
åºæ¬çã«äžèŠã§ãââ[ã¯ãããã](#ã¯ããããæé ã¯ããã ã)ãèŠãŠãã ãããã°ããŒãã«ã³ãã³ããæ¬²ããå Žåã¯:
```bash
npm install -g yunomi
```
ãŸãã¯npxã§çŽæ¥å®è¡:
```bash
npx yunomi
```
## äœ¿ãæ¹
```bash
# åŒæ°ãªã: AIãšãŒãžã§ã³ãåãã¹ãã«ææžãåºå
yunomi
# åäžãã¡ã€ã«
yunomi [--port 4989] [--encoding utf8|shift_jis|...]
# è€æ°ãã¡ã€ã«ïŒåãã¡ã€ã«ã¯é£ç¶ããããŒãã§éãïŒ
yunomi file1.csv file2.md file3.tsv --port 4989
# æšæºå
¥åããã®diff
git diff HEAD | yunomi
# diffãã¡ã€ã«
yunomi changes.diff
```
### ãªãã·ã§ã³
- `--port `: éå§ããŒããæå®ïŒããã©ã«ã: 4989ïŒ
- `--encoding `: ãšã³ã³ãŒãã£ã³ã°ãåŒ·å¶æå®ïŒããã©ã«ãã¯èªåæ€åºïŒ
- `--no-open`: ãã©ãŠã¶ã®èªåèµ·åãç¡å¹å
- `--skill`: AIãšãŒãžã§ã³ãåãã¹ãã«ææžãåºå
- `--help, -h`: ãã«ãã¡ãã»ãŒãžã衚瀺
- `--version, -v`: ããŒãžã§ã³çªå·ã衚瀺
### ã¯ãŒã¯ãããŒ
1. ãã©ãŠã¶ãèªåçã«éãïŒmacOS: `open` / Linux: `xdg-open` / Windows: `start`ïŒ
2. ã»ã«/è¡ãã¯ãªãã¯ããŠã³ã¡ã³ã远å ããŸãã¯ãã©ãã°ã§è€æ°éžæ
3. Cmd/Ctrl+EnterãŸãã¯ãSubmit & Exitãã¯ãªãã¯ã§ã³ã¡ã³ããåºå
4. ã³ã¡ã³ãã¯YAML圢åŒã§æšæºåºåã«åºå
## ã¹ã¯ãªãŒã³ã·ã§ãã
### Markdownãã¥ãŒïŒã¡ãã£ã¢ãµã€ãããŒä»ãïŒ

### ãã¬ãã¥ãŒãªã³ãªãŒã¢ãŒã

### èŠåºãæãããã¿

### ã³ã¡ã³ããã€ã¢ãã°ïŒç»åæ·»ä»å¯Ÿå¿ïŒ

### åç»ãã«ã¹ã¯ãªãŒã³ïŒã¿ã€ã ã©ã€ã³ãµã ãã€ã«ä»ãïŒ

### Mermaidãã«ã¹ã¯ãªãŒã³ïŒãããããä»ãïŒ

### ã¬ãã¥ãŒéä¿¡ãã€ã¢ãã°ïŒç»åæ·»ä»å¯Ÿå¿ïŒ

### CSVãã¥ãŒ

### Diffãã¥ãŒ

## åºåäŸ
```yaml
file: data.csv
mode: csv
reason: button
at: '2025-11-26T12:00:00.000Z'
comments:
- row: 2
col: 3
text: This value needs review
value: '150'
summary: Overall the data looks good, minor issues noted above.
```
## Claude Codeãã©ã°ã€ã³
ãã®ãªããžããªã¯Claude Codeãã©ã°ã€ã³ããŒã±ãããã¬ã€ã¹ãšããŠãæ©èœããŸãããã©ã°ã€ã³ã¯ã¿ã¹ã¯ç®¡çãšã¬ãã¥ãŒèªååã§yunomiãClaude Codeã¯ãŒã¯ãããŒã«çµ±åããŸãã
> 泚: ãã©ã°ã€ã³ã¯ v2.0.0 ã§ `reviw-plugin` ãã `yunomi-plugin` ã«æ¹åãããŸãããæ§ãã©ã°ã€ã³ãå
¥ããŠããå Žåã¯åé€ã®ãã `yunomi-plugin@yunomi-plugins` ãå
¥ãçŽããŠãã ããã
### ã€ã³ã¹ããŒã«
```bash
# Claude Codeã§
/plugin marketplace add kazuph/yunomi
/plugin install yunomi-plugin@yunomi-plugins
```
### `npx skills` ã§ã¹ãã«ãå
¥ãã
CodexãOpenCodeãCursor ãªã©ã`npx skills` 察å¿ãšãŒãžã§ã³ãã§ yunomi ã®ã¿ã¹ã¯ã¹ãã«ã䜿ãããå Žåã¯ãã¡ãã䜿ããŸããClaude Code ã¯äžã®ãã©ã°ã€ã³å°ç·ã䜿ã£ãŠãã ããã
```bash
# ãŸãæ€åºãããã¹ãã«ã確èª
npx skills add https://github.com/kazuph/yunomi --list
# Codex åãã«å
šã¹ãã«ãã°ããŒãã«ã€ã³ã¹ããŒã«
npx skills add https://github.com/kazuph/yunomi -g -a codex -s '*' --copy -y
# Codex ãš OpenCode ãžãŸãšããŠã°ããŒãã«ã€ã³ã¹ããŒã«
npx skills add https://github.com/kazuph/yunomi -g -a codex -a opencode -s '*' --copy -y
```
`npx skills` ãé
ãã®ã¯ `plugin/skills/` é
äžã®ã¹ãã«çŸ€ã§ãã`-a codex -g --copy` ãä»ãããšãCodex ã®ã°ããŒãã«ã¹ãã«çœ®ãå Žã§ãã `~/.agents/skills/` ã«ã³ããŒãããŸãã`~/.agents/skills` ã symlink ã®å Žåã¯ããã®ãªã³ã¯å
ã«å®äœã眮ãããŸãã
Claude Code ã®ãã©ã°ã€ã³ command ã hooks ã¯ãã®çµè·¯ã§ã¯å
¥ãããäžã® Claude Code ãã©ã°ã€ã³å°ç·ã§ã€ã³ã¹ããŒã«ããŸãã
### ãã©ã°ã€ã³ãã£ã¬ã¯ããªæ§æ
```
plugin/
âââ .claude-plugin/
â âââ plugin.json # ãã©ã°ã€ã³ã¡ã¿ããŒã¿ïŒååãããŒãžã§ã³ã説æïŒ
âââ agents/
â âââ report-builder.md # ã¬ããŒãçæãšãŒãžã§ã³ã
â âââ e2e-health-reviewer.md # E2Eãã¹ãå¥å
šæ§ãã§ãã¯
â âââ review-code-quality.md # ã³ãŒãå質ã¬ãã¥ãŒ
â âââ review-security.md # ã»ãã¥ãªãã£ç£æ»
â âââ review-a11y-ux.md # ã¢ã¯ã»ã·ããªã㣠& UX
â âââ review-figma-fidelity.md # ãã¶ã€ã³å¿ å®åºŠ
â âââ review-copy-consistency.md # ããã¹ãæŽåæ§
â âââ review-e2e-integrity.md # E2Eãã¹ãæŽåæ§
âââ skills/
â âââ ask/
â â âââ SKILL.md # èŠä»¶ãã¢ãªã³ã°ã¹ãã«
â âââ bucho/
â â âââ SKILL.md # éšé·ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã¹ãã«
â âââ do/
â â âââ SKILL.md # ã¿ã¹ã¯éå§ã¹ãã«
â âââ done/
â â âââ SKILL.md # ã¿ã¹ã¯å®äºã¹ãã«
â âââ exit-notifier/
â â âââ SKILL.md # background task çµäºéç¥ã¹ãã«
â â âââ scripts/
â â âââ watch-exit-notify.sh
â âââ tiny-do/
â â âââ SKILL.md # 軜éã¿ã¹ã¯éå§ã¹ãã«
â âââ tiny-done/
â â âââ SKILL.md # 軜éã¿ã¹ã¯å®äºã¹ãã«
â âââ validate-report/
â â âââ SKILL.md # REPORT.mdæ€èšŒã®å
éš helper
â âââ artifact-proof/
â â âââ SKILL.md # ãšããã³ã¹åéã¹ãã«
â âââ webapp-testing/
â âââ SKILL.md # Webãã¹ãã¹ãã«
â âââ scripts/ # ãã«ããŒã¹ã¯ãªãã
â âââ examples/ # 䜿çšäŸ
âââ hooks/
â âââ hooks.json # ããã¯å®çŸ©
âââ hooks-handlers/
â âââ completion-checklist.sh # UserPromptSubmitãã³ãã©
âââ README.md
```
### ã³ã³ããŒãã³ãæŠèŠ
| çš®é¡ | åå | 説æ |
|------|------|------|
| **ã¿ã¹ã¯ã¹ãã«** | `/yunomi:do` | ã¿ã¹ã¯éå§ - git wtã§worktreeäœæãèšç»ãtodoç»é² |
| **ã¿ã¹ã¯ã¹ãã«** | `/yunomi:done` | å®äºãã§ãã¯ãªã¹ã - 7ã¬ãã¥ãŒãšãŒãžã§ã³ãå®è¡ããšããã³ã¹åéãã¬ãã¥ãŒéå§ |
| **ã¿ã¹ã¯ã¹ãã«** | `/yunomi:tiny-do` | å°ã¿ã¹ã¯åãã®è»œééå§ãã㌠|
| **ã¿ã¹ã¯ã¹ãã«** | `/yunomi:tiny-done` | å°ã¿ã¹ã¯åãã®è»œéå®äºãã㌠|
| **ã¿ã¹ã¯ã¹ãã«** | `/yunomi:bucho` | Claude Code ãš Codex ãæããéšé·ã¢ãŒã |
| **ãšãŒãžã§ã³ã** | `report-builder` | ãŠãŒã¶ãŒã¬ãã¥ãŒçšã¬ããŒãæºå |
| **ãšãŒãžã§ã³ã** | `review-code-quality` | ã³ãŒãå質: å¯èªæ§ãDRYãåå®å
šæ§ããšã©ãŒãã³ããªã³ã° |
| **ãšãŒãžã§ã³ã** | `review-security` | ã»ãã¥ãªãã£: XSSãã€ã³ãžã§ã¯ã·ã§ã³ãOWASP Top 10ãç§å¯æ
å ±æ€åº |
| **ãšãŒãžã§ã³ã** | `review-a11y-ux` | ã¢ã¯ã»ã·ããªãã£: WCAG 2.2 AAãããŒããŒãæäœãUXãã㌠|
| **ãšãŒãžã§ã³ã** | `review-figma-fidelity` | ãã¶ã€ã³: ããŒã¯ã³æºæ ãèŠèŠçäžè²«æ§ |
| **ãšãŒãžã§ã³ã** | `review-copy-consistency` | ã³ããŒ: ããã¹ãæŽåæ§ãããŒã³&ãããŒãi18n |
| **ãšãŒãžã§ã³ã** | `review-e2e-integrity` | E2E: ãŠãŒã¶ãŒãããŒåçŸãã¢ãã¯æ±ææ€åº |
| **ãšãŒãžã§ã³ã** | `e2e-health-reviewer` | E2E: gotoå¶éãã¬ã³ãŒãã¢ãµãŒã·ã§ã³ãããŒãã³ãŒãæ€åº |
| **ã¹ãã«** | `artifact-proof` | ãšããã³ã¹åéïŒã¹ã¯ãªãŒã³ã·ã§ãããåç»ããã°ïŒ |
| **ã¹ãã«** | `exit-notifier` | background task ã®çµäºãš stdout/stderr ãçŸåšã® tmux / Herdr pane ã«éç¥ |
| **ã¹ãã«** | `webapp-testing` | Playwrightã«ãããã©ãŠã¶èªååãšæ€èšŒ |
| **ããã¯** | PreToolUse | git commit/pushåã«ã¬ãã¥ãŒãä¿ããªãã€ã³ã㌠|
| **ããã¯** | UserPromptSubmit | AI ã³ã³ããã¹ãã«å®äºãã§ãã¯ãªã¹ããæ³šå
¥ |
---
### ã¿ã¹ã¯ã¹ãã«
#### 忢±ã¿ã¹ã¯ã¹ãã«äžèЧ
| ã¹ãã« | çšé |
|------|------|
| `ask` | å®è£
åã«èŠæ±ã»ã¹ã³ãŒãã»å¶çŽã»æåæ¡ä»¶ãæç¢ºåãã |
| `bucho` | Claude Code ãš Codex ã tmux çµç±ã§æããŠããŒã éçºãããŒãåã |
| `check-yourself` | æšæž¬ãçŠæ¢ããå®éã®æ€èšŒã匷å¶ãã |
| `commit-and-push` | ã³ãããã¡ãã»ãŒãžçæãcommitãpushãæçµç¶æ
確èªãŸã§å®è¡ãã |
| `do` | worktree äœæãèšç»çå®ãã¬ãã¥ãŒæºåãå«ããã«ã®éå§ãããŒãå®è¡ãã |
| `done` | ãšããã³ã¹åéãš yunomi ã¬ãã¥ãŒãå«ããã«ã®å®äºãããŒãå®è¡ãã |
| `exit-notifier` | background task ã®çµäºçµæãš stdout/stderr ãçŸåšã® tmux / Herdr pane ã«è¿ã |
| `open` | ãã¡ã€ã«ãææç©ãURL ã macOS ã® `open` ã§éã |
| `tiny-do` | å°ããªã¿ã¹ã¯åãã®è»œééå§ãããŒã§å®è£
ãžå
¥ã |
| `tiny-done` | å°ããªã¿ã¹ã¯åãã®è»œéå®äºãããŒã§æ€èšŒãšç¢ºèªãè¡ã |
| `validate-report` | `done` ããåŒã°ããå
éš helper ãšã㊠`REPORT.md` ãæ€èšŒãã |
#### `/yunomi:do <ã¿ã¹ã¯èª¬æ>`
é©åãªç°å¢ã»ããã¢ããã§æ°ããã¿ã¹ã¯ãéå§ããŸãã
**åŠçå
容:**
1. git wtã䜿çšããŠåé¢éçºçšã®git worktreeãäœæïŒ`feature/`ã`fix/`ãªã©ïŒ
2. ãšããã³ã¹çšã®`.artifacts//`ãã£ã¬ã¯ããªãã»ããã¢ãã
3. èšç»ãšTODOãã§ãã¯ãªã¹ãä»ãã®`REPORT.md`ãäœæ
4. é²æè¿œè·¡çšã«TodoWriteã«todoãç»é²
**äœæããããã£ã¬ã¯ããªæ§æ:**
```
/ # äŸ: .worktree/feature-auth/
âââ .artifacts/
âââ / # äŸ: authïŒfeature/authããïŒ
âââ REPORT.md # èšç»ã鲿ããšããã³ã¹ãªã³ã¯
âââ images/ # ã¹ã¯ãªãŒã³ã·ã§ãã
âââ videos/ # åç»é²ç»
```
**ã¿ã¹ã¯åé:** ã»ãã·ã§ã³éå§æãŸãã¯ã³ã³ããã¹ãå§çž®åŸãã¹ãã«ã¯æ¢åã®worktreeã確èªïŒ`git wt`ïŒãã`REPORT.md`ããåéããŸãã
#### `/yunomi:done`
ã¿ã¹ã¯å®äºãèš±å¯ããåã«å®äºåºæºãæ€èšŒããŸãã
**é©çšããããã§ãã¯ãªã¹ã:**
- [ ] ãã«ãæåïŒå/lintãšã©ãŒãªãïŒ
- [ ] éçºãµãŒããŒèµ·åã»åäœ
- [ ] `webapp-testing`ã¹ãã«ã§æ€èšŒ
- [ ] `.artifacts//`ã«ãšããã³ã¹åé
- [ ] `artifact-proof`ã¹ãã«ã§ã¬ããŒãäœæ
- [ ] yunomiã§ã¬ãã¥ãŒïŒãã©ã¢ã°ã©ãŠã³ãã¢ãŒãïŒ
- [ ] ãŠãŒã¶ãŒæ¿èªååŸ
**çŠæ¢äºé
:**
- æ€èšŒãªãã«ãå®è£
å®äºããšèšã
- yunomiã¬ãã¥ãŒåã«ã³ããã/ããã·ã¥
- ãšããã³ã¹ãªãã®ã¬ããŒã
---
### ãšãŒãžã§ã³ã
#### `report-builder`
ã¬ãã¥ãŒè³ææºåå°éãšãŒãžã§ã³ãã
**圹å²:**
- å®è£
ãæ§é åã¬ããŒãã«æŽç
- ãšããã³ã¹ïŒã¹ã¯ãªãŒã³ã·ã§ãããåç»ïŒãåéã»é
眮
- yunomiã¬ãã¥ãŒçšã«`REPORT.md`ãæºå
- yunomiãã£ãŒãããã¯ãè§£æããŠtodoã«ç»é²
**åŒã³åºã:**
```
Task tool with subagent_type: "report-builder"
```
**èªåèªã¿èŸŒã¿ã¹ãã«:** `artifact-proof`
---
### ã¹ãã«
#### `artifact-proof`
ããžã¥ã¢ã«ãªã°ã¬ãã·ã§ã³ãšPRããã¥ã¡ã³ãçšã®ãšããã³ã¹åéã管çã
**æ©èœ:**
- `.artifacts//`é
äžã«ã¹ã¯ãªãŒã³ã·ã§ãããšåç»
- èªåãã£ããã£çšPlaywrightçµ±å
- åç»ãã¡ã€ã«çšGit LFSã»ããã¢ãã
- ã³ãããããã·ã¥ä»ãPRç»åURLïŒãã©ã³ãåé€åŸãæ°žç¶ïŒ
**yunomiçµ±å:**
```bash
# yunomiã§ã¬ããŒããéãïŒãã©ã¢ã°ã©ãŠã³ãå¿
é ïŒ
npx yunomi .artifacts//REPORT.md
# åç»ãã¬ãã¥ãŒä»ã
open .artifacts//videos/demo.webm
npx yunomi .artifacts//REPORT.md
```
#### `webapp-testing`
Playwrightã䜿çšãããã©ãŠã¶èªååããŒã«ãããã
**æ©èœ:**
- TypeScript Playwright Test (`@playwright/test`)
- webServerãµããŒãä»ãPlaywrightèšå®
- ã¹ã¯ãªãŒã³ã·ã§ãããšåç»ãã£ããã£
- ã³ã³ãœãŒã«ãã°ãšãããã¯ãŒã¯ãªã¯ãšã¹ãç£èŠ
- é«åºŠãªãããã°çšCDPçµ±å
**ã¯ã€ãã¯æ€èšŒ:**
```bash
node -e "const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('http://localhost:3000', { waitUntil: 'networkidle' });
await page.screenshot({ path: '/tmp/webapp.png', fullPage: true });
await browser.close();
})();"
```
---
### ããã¯
#### PreToolUseïŒBashãããã£ãŒïŒ
`git commit`ãŸãã¯`git push`æ€åºæã«ããªã¬ãŒã
**ã¡ãã»ãŒãž:** ã³ãããåã«`/yunomi:done`ãå®è¡ããŠyunomiã§ã¬ãã¥ãŒããããä¿ãã
#### UserPromptSubmit
ãã¹ãŠã®AIå¿çã³ã³ããã¹ãã«å®äºãã§ãã¯ãªã¹ããæ³šå
¥ã
**ç®ç:** é©åãªæ€èšŒãªãã®ãå®è£
å®äºã䞻匵ã鲿¢ããã§ãã¯ãªã¹ãã¯åžžã«AIã«èŠããå®äºåºæºã®äžè²«ããé©çšãä¿èšŒã
---
### ã¯ãŒã¯ãããŒ
```
/yunomi:do <ã¿ã¹ã¯èª¬æ>
â
Worktreeäœæ + èšç» + TodoWrite
â
å®è£
ïŒãµããšãŒãžã§ã³ãçµç±ïŒ
â
ãã«ã & æ€èšŒïŒwebapp-testingïŒ
â
/yunomi:done
â
ãšããã³ã¹åéïŒartifact-proofïŒ
â
npx yunomiã§ã¬ããŒããéãïŒãã©ã¢ã°ã©ãŠã³ãïŒ
â
ãŠãŒã¶ãŒã³ã¡ã³ã â Submit & Exit
â
ãã£ãŒãããã¯ãTodoã«ç»é²
â
ä¿®æ£ â æ¿èªãŸã§åã¬ãã¥ãŒ
â
ã³ããã & PRïŒæ¿èªåŸã®ã¿ïŒ
```
### å®äºåºæº
| ã¹ããŒãž | å
容 | ã¹ããŒã¿ã¹ |
|----------|------|----------|
| 1/3 | å®è£
å®äº | ãŸã å ±åããªã |
| 2/3 | ãã«ããèµ·åãæ€èšŒå®äº | ãŸã å ±åããªã |
| 3/3 | yunomiã§ã¬ãã¥ãŒ â ãŠãŒã¶ãŒæ¿èª | å®äº |
### èšèšææ³
ãã©ã°ã€ã³ã¯**Human-in-the-loop**éçºã匷å¶ããŸã:
1. **ã·ã§ãŒãã«ãããªã:** ã¢ãã¯ããã€ãã¹ãæ€èšŒã¹ãããã¯çŠæ¢
2. **ãšããã³ã¹å¿
é :** ãã¹ãŠã®å®äºäž»åŒµã«ã¯ã¹ã¯ãªãŒã³ã·ã§ãã/åç»ãå¿
èŠ
3. **ãŠãŒã¶ãŒæ¿èª:** ãŠãŒã¶ãŒã®ã¿ãã¿ã¹ã¯ãå®äºãšããŠããŒã¯ã§ãã
4. **ã³ã³ããã¹ãä¿æ:** éãæäœã¯ãµããšãŒãžã§ã³ãã§å®è¡ããŠã³ã³ããã¹ãæ¯æžã鲿¢
### `.artifacts`ãã£ã¬ã¯ããªããªã·ãŒ
`.artifacts/`ãã£ã¬ã¯ããªã¯éçºäžã«çæãããã¹ã¯ãªãŒã³ã·ã§ãããåç»ãã¬ããŒããä¿åããŸãã**ããã©ã«ãã§ã¯ããã®ãã£ã¬ã¯ããªã¯`.gitignore`ã«è¿œå ãã¹ãã§ã**ã倧ããªã¡ãã£ã¢ãã¡ã€ã«ã«ãããªããžããªè¥å€§åãé²ããŸãã
```bash
# .gitignoreã«è¿œå ïŒæšå¥šïŒ
echo ".artifacts" >> .gitignore
```
**ããã©ã«ãã§é€å€ããçç±:**
- ã¹ã¯ãªãŒã³ã·ã§ãããšåç»ã¯å€§ãããªãå¯èœæ§ãããïŒç¹ã«ç»é¢é²ç»ïŒ
- ãšããã³ã¹ã¯äž»ã«ã¬ãã¥ãŒããã»ã¹çšã§ãæ°žç¶çãªããã¥ã¡ã³ãã§ã¯ãªã
- ãªããžããªãµã€ãºã管çå¯èœã«ä¿ã€
**ç¹å®ã®ãšããã³ã¹ãã³ããããããå Žå:**
`git add --force`ã§æç€ºçã«ãã¡ã€ã«ã远å :
```bash
# ç¹å®ã®ãšããã³ã¹ãã¡ã€ã«ã匷å¶è¿œå
git add --force .artifacts/feature/images/final-screenshot.png
git add --force .artifacts/feature/REPORT.md
# ãŸãã¯æ©èœå
šäœã®ãšããã³ã¹ã匷å¶è¿œå
git add --force .artifacts/feature/
```
**åç»ãã¡ã€ã«**ã®å Žåããªããžããªè¥å€§åãé¿ããããGit LFSã䜿çš:
```bash
git lfs track "*.mp4" "*.webm" "*.mov"
git add .gitattributes
git add --force .artifacts/feature/videos/demo.mp4
```
ãã®ã¢ãããŒãã§å®å
šãªã³ã³ãããŒã«ãå¯èœ: ããã©ã«ãã§é€å€ãå¿
èŠãªãã®ã ããã³ãããã
## éçº
yunomiã¯[MoonBit](https://www.moonbitlang.com/)ã§æžãããŠãããJavaScriptã«ã³ã³ãã€ã«ãããŸãã
```bash
# ãã«ã
cd v2 && moon build --target js --release
# ãã¹ãå®è¡
cd v2 && moon test --target js
# npmããã±ãŒãžã³ã°ïŒMoonBitãã«ã + dist/ã«ã³ããŒïŒ
npm run prepack
```
- ãœãŒã¹: `v2/src/`ïŒMoonBitïŒ
- ãã«ãåºå: `dist/server/server.js`ã`dist/ui/ui.js`
- ãã©ã°ã€ã³: `plugin/`ãã£ã¬ã¯ããª
## ã©ã€ã»ã³ã¹
MIT