moicle 2.3.1 → 3.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/README.md +36 -49
- package/assets/commands/marketing.md +6 -6
- package/assets/skills/docs/sync/SKILL.md +195 -157
- package/assets/skills/feature/build/SKILL.md +891 -0
- package/assets/skills/feature/track/SKILL.md +8 -8
- package/assets/skills/fix/bug/SKILL.md +449 -0
- package/assets/skills/fix/incident/SKILL.md +6 -6
- package/assets/skills/marketing/brand/SKILL.md +304 -0
- package/assets/skills/marketing/content/SKILL.md +199 -141
- package/assets/skills/research/explore/SKILL.md +392 -0
- package/assets/skills/review/code/SKILL.md +622 -0
- package/dist/commands/install/usage.js +2 -2
- package/dist/commands/install/usage.js.map +1 -1
- package/package.json +1 -1
- package/assets/skills/docs/write/SKILL.md +0 -274
- package/assets/skills/feature/api/SKILL.md +0 -277
- package/assets/skills/feature/deprecate/SKILL.md +0 -276
- package/assets/skills/feature/new/SKILL.md +0 -273
- package/assets/skills/feature/refactor/SKILL.md +0 -269
- package/assets/skills/fix/hotfix/SKILL.md +0 -233
- package/assets/skills/fix/pr-comment/SKILL.md +0 -186
- package/assets/skills/fix/root-cause/SKILL.md +0 -276
- package/assets/skills/marketing/logo/SKILL.md +0 -252
- package/assets/skills/marketing/seo-blog/SKILL.md +0 -367
- package/assets/skills/marketing/video/SKILL.md +0 -258
- package/assets/skills/research/onboarding/SKILL.md +0 -225
- package/assets/skills/research/spike/SKILL.md +0 -228
- package/assets/skills/research/web/SKILL.md +0 -204
- package/assets/skills/review/architect/SKILL.md +0 -274
- package/assets/skills/review/branch/SKILL.md +0 -277
- package/assets/skills/review/pr/SKILL.md +0 -231
- package/assets/skills/review/tdd/SKILL.md +0 -245
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-code
|
|
3
|
+
description: Code review workflow with five modes — SELF (self-review local branch before push), PR (review someone's pull request + post to GitHub), ARCHITECT (deep DDD architecture audit with scoring), TDD (red-green-refactor test-first), ADDRESS (fix PR review comments). Stack-aware. Use when user says "review changes", "review branch", "check branch", "review my code", "review before pr", "review pr", "check pr", "review code", "pr review", "architect-review", "architecture review", "review ddd", "check architecture", "tdd", "test first", "test driven", "red green refactor", "fix pr comment", "fix review comment", "address pr feedback".
|
|
4
|
+
args: "[MODE] [ARG]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Code Review Workflow
|
|
8
|
+
|
|
9
|
+
One skill covering the full review surface. Pick the mode that matches your situation.
|
|
10
|
+
|
|
11
|
+
## Pick your mode
|
|
12
|
+
|
|
13
|
+
| Situation | Mode | Jump to |
|
|
14
|
+
|-----------|------|---------|
|
|
15
|
+
| Self-review your branch before pushing / opening a PR | **SELF** | [Mode SELF](#mode-self) |
|
|
16
|
+
| Reviewing someone else's PR + posting feedback to GitHub | **PR** | [Mode PR](#mode-pr) |
|
|
17
|
+
| Deep DDD architecture audit of a domain (with scoring) | **ARCHITECT** | [Mode ARCHITECT](#mode-architect) |
|
|
18
|
+
| Writing code test-first (red → green → refactor) | **TDD** | [Mode TDD](#mode-tdd) |
|
|
19
|
+
| Addressing review comments on your own PR | **ADDRESS** | [Mode ADDRESS](#mode-address) |
|
|
20
|
+
|
|
21
|
+
- ❌ Security-only sweep → use `@security-audit` agent
|
|
22
|
+
- ❌ Bug surfaced by review → use `/fix-bug`
|
|
23
|
+
|
|
24
|
+
## Read Architecture First (all modes)
|
|
25
|
+
|
|
26
|
+
Detect stack via `~/.claude/architecture/_shared/stack-detection.md`. Load `ddd-architecture.md` + the stack doc — extract forbidden imports + conventions before reviewing. Severity definitions: `~/.claude/architecture/_shared/severity-levels.md` (code severity table).
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# Mode SELF
|
|
32
|
+
|
|
33
|
+
Self-review your branch vs a base branch before pushing or opening a PR. Checks architecture compliance, stack conventions, and code quality — on **changed files only**, not the whole codebase.
|
|
34
|
+
|
|
35
|
+
**ARGUMENTS:** (optional) base branch. Default: `main` (fallback to `master`).
|
|
36
|
+
|
|
37
|
+
## Workflow
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
0 DETECT → 1 COLLECT → 2 BUILD+LINT → 3 ARCH → 4 CONVENTIONS → 5 QUALITY → 6 TESTS → 7 REPORT → 8 FIX
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Phase 0: DETECT
|
|
44
|
+
- [ ] Stack detected (ask user if ambiguous, e.g., monorepo)
|
|
45
|
+
- [ ] Architecture doc loaded
|
|
46
|
+
- [ ] Forbidden-imports list extracted
|
|
47
|
+
|
|
48
|
+
## Phase 1: COLLECT
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
BASE=${1:-main}
|
|
52
|
+
git rev-parse --verify "$BASE" >/dev/null 2>&1 || BASE=master
|
|
53
|
+
|
|
54
|
+
git log "$BASE"..HEAD --oneline
|
|
55
|
+
git diff "$BASE"...HEAD --stat
|
|
56
|
+
git diff "$BASE"...HEAD --name-only --diff-filter=ACMR
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Categorize changed files by layer:
|
|
60
|
+
|
|
61
|
+
| Layer | Typical paths |
|
|
62
|
+
|-------|---------------|
|
|
63
|
+
| Domain | `domain/`, `internal/domain/`, `src/domain/`, `lib/domain/` |
|
|
64
|
+
| Application | `application/`, `internal/application/`, `src/application/` |
|
|
65
|
+
| Infrastructure | `infrastructure/`, `internal/infrastructure/`, `src/infrastructure/` |
|
|
66
|
+
| Presentation / UI | `controllers/`, `pages/`, `components/`, `views/`, `ports/http/` |
|
|
67
|
+
| Persistence | `models/`, `entities/` (ORM), `prisma/`, `migrations/` |
|
|
68
|
+
| Config / Bootstrap | `config/`, `bootstrap/`, `cmd/`, `main.*` |
|
|
69
|
+
|
|
70
|
+
Read **all** changed files before reviewing — never skim.
|
|
71
|
+
|
|
72
|
+
## Phase 2: BUILD + LINT
|
|
73
|
+
|
|
74
|
+
Run the stack's build + typecheck + lint commands. If any fail → mark **CRITICAL** and stop further review until they pass.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Go: go build ./... && go vet ./...
|
|
78
|
+
# NestJS: pnpm typecheck && pnpm lint
|
|
79
|
+
# Laravel: composer dump-autoload && ./vendor/bin/phpstan analyse
|
|
80
|
+
# Flutter: dart analyze
|
|
81
|
+
# React/Remix: pnpm typecheck && pnpm lint
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Phase 3: ARCHITECTURE (changed files only)
|
|
85
|
+
|
|
86
|
+
### 3.1 Domain (if changed)
|
|
87
|
+
| # | Rule |
|
|
88
|
+
|---|------|
|
|
89
|
+
| D1 | Domain purity — no forbidden imports (ORM, HTTP, cache, queue, auth SDK) |
|
|
90
|
+
| D2 | No cross-domain imports (only shared kernel allowed) |
|
|
91
|
+
| D3 | No persistence-model imports in domain |
|
|
92
|
+
| D4 | Entities have behavior (not anemic data bags) |
|
|
93
|
+
| D5 | Entities raise events on state change (if architecture uses events) |
|
|
94
|
+
| D6 | Ports in `ports/` dir (not inline in usecases) |
|
|
95
|
+
| D7 | One port per file |
|
|
96
|
+
| D8 | Ports return domain types, not primitives |
|
|
97
|
+
| D9 | Value objects stdlib-only |
|
|
98
|
+
| D10 | Usecases have no infra imports |
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
CHANGED_DOMAIN=$(git diff "$BASE"...HEAD --name-only --diff-filter=ACMR \
|
|
102
|
+
| grep -E '^(src|internal|lib)/domain/')
|
|
103
|
+
[ -n "$CHANGED_DOMAIN" ] && echo "$CHANGED_DOMAIN" \
|
|
104
|
+
| xargs grep -lEn '<STACK_FORBIDDEN_REGEX>' 2>/dev/null \
|
|
105
|
+
&& echo FAIL || echo PASS
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3.2 Application (if changed)
|
|
109
|
+
| # | Rule |
|
|
110
|
+
|---|------|
|
|
111
|
+
| A1 | Handler is thin (parse → service → respond, no business logic) |
|
|
112
|
+
| A2 | Service justified only when ≥2 usecases orchestrated |
|
|
113
|
+
| A3 | Listener is side-effect only (no business logic) |
|
|
114
|
+
| A4 | Listener registered in event bus |
|
|
115
|
+
| A5 | Event name string matches registry |
|
|
116
|
+
| A6 | DTOs validated at boundary |
|
|
117
|
+
| A7 | Composition root only — no inline wiring in handlers |
|
|
118
|
+
|
|
119
|
+
### 3.3 Infrastructure (if changed)
|
|
120
|
+
| # | Rule |
|
|
121
|
+
|---|------|
|
|
122
|
+
| I1 | Repository has no business logic |
|
|
123
|
+
| I2 | Mappers exist (domain ↔ ORM model) |
|
|
124
|
+
| I3 | Implements port interface (returns domain types) |
|
|
125
|
+
| I4 | Context / transaction propagation correct |
|
|
126
|
+
|
|
127
|
+
### 3.4 Persistence models (if changed)
|
|
128
|
+
| # | Rule |
|
|
129
|
+
|---|------|
|
|
130
|
+
| M1 | ORM models in infrastructure, NOT domain |
|
|
131
|
+
| M2 | Schema change → matching migration |
|
|
132
|
+
| M3 | Nullable columns use nullable types |
|
|
133
|
+
|
|
134
|
+
## Phase 4: CONVENTIONS (cross-stack)
|
|
135
|
+
|
|
136
|
+
| # | Rule |
|
|
137
|
+
|---|------|
|
|
138
|
+
| G1 | No swallowed errors (no empty catch / `if err != nil {}`) |
|
|
139
|
+
| G2 | Async work uses background context, NOT request context |
|
|
140
|
+
| G3 | API-facing types have serialization tags (`json:`, decorators, etc.) |
|
|
141
|
+
| G4 | No hardcoded secrets / tokens / keys |
|
|
142
|
+
| G5 | Parameterized queries only — no string-interpolated SQL |
|
|
143
|
+
| G6 | Input validation at boundary before reaching domain |
|
|
144
|
+
|
|
145
|
+
Plus any stack-specific Hard Rules from the architecture doc.
|
|
146
|
+
|
|
147
|
+
## Phase 5: QUALITY (manual)
|
|
148
|
+
|
|
149
|
+
Read the diff. Look for:
|
|
150
|
+
|
|
151
|
+
| # | Area | What to look for |
|
|
152
|
+
|---|------|------------------|
|
|
153
|
+
| Q1 | Logic correctness | Off-by-one, nil deref, wrong condition, missed edge case |
|
|
154
|
+
| Q2 | Error handling | Errors propagated/wrapped, not silently ignored |
|
|
155
|
+
| Q3 | Concurrency | Race conditions, shared mutable state, async leaks |
|
|
156
|
+
| Q4 | Resource leaks | Unclosed connections, HTTP bodies, file handles |
|
|
157
|
+
| Q5 | Naming | Reveals intent (no `data`, `info`, `manager`, `helper`) |
|
|
158
|
+
| Q6 | Dead code | Unreachable, unused, commented-out |
|
|
159
|
+
| Q7 | Duplication | Real duplication across changed files (not coincidental) |
|
|
160
|
+
| Q8 | Breaking change | API contract change, removed field, behavior change |
|
|
161
|
+
| Q9 | Over-engineering | Abstraction not justified by the change |
|
|
162
|
+
| Q10 | Test coverage | New logic has tests; bug fixes have regression tests |
|
|
163
|
+
|
|
164
|
+
## Phase 6: TESTS
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
CHANGED_DOMAINS=$(git diff "$BASE"...HEAD --name-only --diff-filter=ACMR \
|
|
168
|
+
| grep -E '/(domain|modules|features)/' \
|
|
169
|
+
| sed -E 's|.*(domain\|modules\|features)/([^/]+)/.*|\2|' | sort -u)
|
|
170
|
+
|
|
171
|
+
for d in $CHANGED_DOMAINS; do
|
|
172
|
+
# Go: go test ./internal/domain/$d/... · NestJS: npx jest src/domain/$d
|
|
173
|
+
# Laravel: ./vendor/bin/phpunit --filter $d · Flutter: flutter test test/domain/$d
|
|
174
|
+
echo "Test $d"
|
|
175
|
+
done
|
|
176
|
+
|
|
177
|
+
{full_test_command}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Phase 7: REPORT
|
|
181
|
+
|
|
182
|
+
```markdown
|
|
183
|
+
## Code Review: {branch} → {base}
|
|
184
|
+
**Stack:** {stack} · **Commits:** {N} · **Files:** {N} (+{add} / -{del})
|
|
185
|
+
|
|
186
|
+
### Build / Lint / Types
|
|
187
|
+
| Check | Status | → Build / Lint / Types: PASS/FAIL
|
|
188
|
+
|
|
189
|
+
### Issues (sorted by severity)
|
|
190
|
+
| # | Severity | File:line | Issue | Suggested fix |
|
|
191
|
+
|---|----------|-----------|-------|---------------|
|
|
192
|
+
| 1 | CRITICAL | config/db.ts:42 | hardcoded token | move to env |
|
|
193
|
+
| 2 | HIGH | handlers/user.ts:88 | business logic in handler | extract to usecase |
|
|
194
|
+
|
|
195
|
+
### Verdict: {APPROVED / CHANGES REQUESTED}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Verdict rules
|
|
199
|
+
- **CRITICAL or HIGH found** → CHANGES REQUESTED
|
|
200
|
+
- **MEDIUM only** → CHANGES REQUESTED (should fix)
|
|
201
|
+
- **LOW only or nothing** → APPROVED (with suggestions if any)
|
|
202
|
+
|
|
203
|
+
## Phase 8: FIX (if user confirms)
|
|
204
|
+
1. Fix in order: CRITICAL → HIGH → MEDIUM → LOW
|
|
205
|
+
2. Re-run build + lint + tests after each batch
|
|
206
|
+
3. Re-run full review when all fixed
|
|
207
|
+
4. Report final status
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
# Mode PR
|
|
213
|
+
|
|
214
|
+
Review someone else's PR across 5 dimensions and post structured feedback to GitHub.
|
|
215
|
+
|
|
216
|
+
## When to use
|
|
217
|
+
- ✅ Reviewing someone else's open PR (`gh pr view <number>` accessible)
|
|
218
|
+
- ✅ Need to post structured feedback (APPROVE / REQUEST CHANGES / COMMENT)
|
|
219
|
+
- ❌ Self-review of own branch before push → **Mode SELF**
|
|
220
|
+
- ❌ Addressing comments on your own PR → **Mode ADDRESS**
|
|
221
|
+
|
|
222
|
+
## Workflow
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
FETCH → ANALYZE → REVIEW (5 dims) → FEEDBACK → POST
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Phase 1: FETCH
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
PR={number}
|
|
232
|
+
gh pr view $PR --json number,title,body,author,state,headRefName,baseRefName,commits,files
|
|
233
|
+
gh pr diff $PR
|
|
234
|
+
gh pr checks $PR
|
|
235
|
+
gh pr view $PR --comments
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Gate
|
|
239
|
+
- [ ] PR metadata + diff + CI status loaded
|
|
240
|
+
- [ ] PR description explains "what / why" — if missing, ask author before deep review
|
|
241
|
+
- [ ] CI status known (don't review red builds — ask author to fix first)
|
|
242
|
+
|
|
243
|
+
## Phase 2: ANALYZE
|
|
244
|
+
1. **Scope check**: does the diff match the PR title / description? Mixed-scope PRs → ask author to split.
|
|
245
|
+
2. **Risk profile**: domain logic, infra config, migrations, auth → high risk; UI tweak → low risk.
|
|
246
|
+
3. **Test delta**: are new tests in the diff? coverage % up or down?
|
|
247
|
+
4. **Reference module**: open 1 existing similar module to compare conventions.
|
|
248
|
+
|
|
249
|
+
### Gate
|
|
250
|
+
- [ ] PR scope is single-purpose (or split requested)
|
|
251
|
+
- [ ] Risk level identified · Test delta noted
|
|
252
|
+
|
|
253
|
+
## Phase 3: REVIEW — 5 dimensions
|
|
254
|
+
|
|
255
|
+
### 3.1 Architecture (CRITICAL / HIGH)
|
|
256
|
+
- Domain has zero framework imports; no cross-domain imports
|
|
257
|
+
- Business logic in usecases, not handlers / stores
|
|
258
|
+
- Ports in `ports/` dir; entities raise events on state changes
|
|
259
|
+
- Listeners use background context, not request context
|
|
260
|
+
- **For deep DDD audit:** switch to **Mode ARCHITECT** and link result.
|
|
261
|
+
|
|
262
|
+
### 3.2 Security (CRITICAL / HIGH)
|
|
263
|
+
- Input validation at trust boundary (handler / DTO)
|
|
264
|
+
- AuthN + AuthZ checked before sensitive ops
|
|
265
|
+
- No secrets / tokens in code or logs
|
|
266
|
+
- SQL via parameterized queries / ORM — no string concatenation
|
|
267
|
+
- File paths / shell commands sanitized
|
|
268
|
+
- Rate limiting + idempotency on state-mutating endpoints
|
|
269
|
+
- Crypto: standard library, no roll-your-own
|
|
270
|
+
|
|
271
|
+
### 3.3 Performance (HIGH / MEDIUM)
|
|
272
|
+
- No N+1 queries (eager-load relations the handler uses)
|
|
273
|
+
- Indexes match new query patterns (check `EXPLAIN`)
|
|
274
|
+
- Pagination on list endpoints (cursor preferred)
|
|
275
|
+
- Background work for slow operations (don't block request)
|
|
276
|
+
- Caching where appropriate, invalidation thought through
|
|
277
|
+
- Synchronous external API calls have timeouts
|
|
278
|
+
|
|
279
|
+
### 3.4 Testing (HIGH / MEDIUM)
|
|
280
|
+
- New business logic has unit tests (usecases, entities, value objects)
|
|
281
|
+
- New endpoints have at least 1 integration test (happy + error)
|
|
282
|
+
- Tests assert on behavior, not implementation
|
|
283
|
+
- Tests don't depend on order, time, or env
|
|
284
|
+
- Coverage didn't drop for touched files
|
|
285
|
+
|
|
286
|
+
### 3.5 Code quality (MEDIUM / LOW)
|
|
287
|
+
- Names reveal intent (no `data`, `info`, `manager`, `helper`)
|
|
288
|
+
- Functions do one thing; no dead branches or commented-out code
|
|
289
|
+
- DRY only where the duplication is real (not coincidental)
|
|
290
|
+
- Errors handled at boundary, not swallowed mid-flow
|
|
291
|
+
|
|
292
|
+
## Phase 4: FEEDBACK
|
|
293
|
+
|
|
294
|
+
| Decision | When |
|
|
295
|
+
|----------|------|
|
|
296
|
+
| **APPROVE** | 0 CRITICAL / HIGH; LOW only |
|
|
297
|
+
| **REQUEST CHANGES** | Any CRITICAL or HIGH; or multiple MEDIUM in same area |
|
|
298
|
+
| **COMMENT** | Only style / nit comments; or asking questions before final review |
|
|
299
|
+
|
|
300
|
+
### Inline comment format
|
|
301
|
+
Be specific. File + line + rationale + suggested fix:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
file: internal/wallet/usecases/withdraw.go:42
|
|
305
|
+
severity: HIGH
|
|
306
|
+
issue: Business logic in handler — `if wallet.Balance < amount` should live in
|
|
307
|
+
the Withdraw usecase, not here.
|
|
308
|
+
suggest:
|
|
309
|
+
result, err := s.WithdrawUsecase.Execute(ctx, req) // handler
|
|
310
|
+
// usecase: if !wallet.HasSufficientBalance(amount) { return ErrInsufficient }
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Summary comment (top of PR)
|
|
314
|
+
|
|
315
|
+
```markdown
|
|
316
|
+
## Review Summary
|
|
317
|
+
**Decision:** REQUEST CHANGES
|
|
318
|
+
|
|
319
|
+
**Must fix (HIGH):**
|
|
320
|
+
- [ ] `withdraw.go:42` — business logic moved out of handler
|
|
321
|
+
|
|
322
|
+
**Should fix (MEDIUM):**
|
|
323
|
+
- [ ] `withdraw_test.go` — only happy path tested, add insufficient-balance case
|
|
324
|
+
|
|
325
|
+
**Nits (LOW):**
|
|
326
|
+
- [ ] `helper.go:5` — rename `helper` to something specific
|
|
327
|
+
|
|
328
|
+
**What looked great:** Clean port interface, good test naming, clear PR description.
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Gate
|
|
332
|
+
- [ ] Decision matches severity rules
|
|
333
|
+
- [ ] Every HIGH+ has file:line + suggested fix
|
|
334
|
+
- [ ] Summary lists must-fix vs should-fix vs nits
|
|
335
|
+
- [ ] Acknowledged what's good (not just criticism)
|
|
336
|
+
|
|
337
|
+
## Phase 5: POST
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
gh pr review $PR --request-changes --body "$(cat summary.md)"
|
|
341
|
+
# or gh pr review $PR --approve --body "LGTM, see one nit"
|
|
342
|
+
# or gh pr review $PR --comment --body "Questions before final review"
|
|
343
|
+
gh pr edit $PR --add-label "needs-changes" # optional
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Gate
|
|
347
|
+
- [ ] Review posted to GitHub
|
|
348
|
+
- [ ] Author has clear next-step list
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
# Mode ARCHITECT
|
|
354
|
+
|
|
355
|
+
Audit a codebase (or a single domain) against DDD rules with automated checks, manual review, and a fix loop until score ≥ B.
|
|
356
|
+
|
|
357
|
+
**ARGUMENTS:** `<architecture> [domain]` — e.g. `go-backend wallet`, `react-frontend`. No arg → auto-detect stack. Aliases: `ddd → ddd-architecture`, `go → go-backend`, `react → react-frontend`, `flutter → flutter-mobile`, `laravel → laravel-backend`, `remix → remix-fullstack`, `nestjs → nodejs-nestjs`, `mono → monorepo`.
|
|
358
|
+
|
|
359
|
+
## Workflow
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
RESOLVE → LOAD RULES → AUTOMATED CHECKS → MANUAL REVIEW → REPORT → FIX LOOP
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## Phase 0: RESOLVE ARCHITECTURE
|
|
366
|
+
- **Arg provided:** normalize via alias table → search project (`.claude/architecture/{name}.md`) then global (`~/.claude/architecture/{name}.md`). Not found → reject with available list, STOP.
|
|
367
|
+
- **No arg:** detect stack → confirm with user. Not detected → list options, ask.
|
|
368
|
+
|
|
369
|
+
### Gate
|
|
370
|
+
- [ ] Architecture file loaded · Domain identified (if scoped)
|
|
371
|
+
|
|
372
|
+
## Phase 1: LOAD RULES
|
|
373
|
+
|
|
374
|
+
Read `ddd-architecture.md` (core) + the stack doc. Extract: DDD directory layout, layer import rules + forbidden imports, hard rules (HR1-HR15), stack-specific check scripts, wiring + test patterns.
|
|
375
|
+
|
|
376
|
+
## Phase 2: AUTOMATED CHECKS
|
|
377
|
+
|
|
378
|
+
```bash
|
|
379
|
+
echo "R1: Build" ; {build} && echo PASS || echo FAIL
|
|
380
|
+
echo "R2: Lint/Vet" ; {lint} && echo PASS || echo FAIL
|
|
381
|
+
echo "R3: Domain pure" ; {grep_forbidden in domain/} && echo FAIL || echo PASS
|
|
382
|
+
echo "R4: No cross-dom" ; {grep_domain_A in domain_B} && echo FAIL || echo PASS
|
|
383
|
+
echo "R5: No cycles" ; {cycle_check} && echo FAIL || echo PASS
|
|
384
|
+
echo "R6: Tests exist" ; {find_tests_in_domain} | wc -l
|
|
385
|
+
echo "R7: Tests pass" ; {test} && echo PASS || echo FAIL
|
|
386
|
+
echo "R8: Wiring reg" ; {check_routes_registered}
|
|
387
|
+
echo "R9: Event names" ; {check_event_consistency}
|
|
388
|
+
echo "R10: Async ctx" ; {check_no_request_context_in_goroutines}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
Record PASS/FAIL per check. Continue to Phase 3 either way — manual review catches what automated misses.
|
|
392
|
+
|
|
393
|
+
## Phase 3: MANUAL REVIEW
|
|
394
|
+
|
|
395
|
+
Focus on **architecture structure**, not business correctness. 10 areas:
|
|
396
|
+
|
|
397
|
+
- **D — Directory:** D1 `domain/{domain}/` proper subdirs · D2 has `entities/`,`ports/`,`usecases/` · D3 `valueobjects/` separate · D4 `events/` separate, 1/file · D5 app layer `ports/{transport}/`,`services/`,`listeners/` · D6 infra implements ports · D7 no legacy dirs
|
|
398
|
+
- **E — Entities:** E1 constructor · E2 behavior (not anemic) · E3 raises events · E4 no framework imports · E5 has mappers
|
|
399
|
+
- **VO — Value Objects:** VO1 in `valueobjects/` · VO2 stdlib only · VO3 immutable+behavior · VO4 used by entities+ports
|
|
400
|
+
- **P — Ports:** P1 `ports/` dir (no inline) · P2 one/file · P3 interface+DTOs · P4 domain types in sigs · P5 platform-agnostic naming · P6 no infra imports
|
|
401
|
+
- **EV — Events:** EV1 one/file · EV2 extends base · EV3 carries data · EV4 name matches registry
|
|
402
|
+
- **U — UseCases:** U1 uses ports · U2 split ≤200 lines · U3 business logic here · U4 no infra imports · U5 dispatches events after persistence · U6 no inline interfaces
|
|
403
|
+
- **SVC — Services:** SVC1 thin delegates · SVC2 no infra imports
|
|
404
|
+
- **H — Handlers:** H1 registration fn · H2 thin · H3 no business logic · H4 DTOs separate
|
|
405
|
+
- **L — Listeners:** L1 one/event · L2 side-effects only · L3 registered · L4 background context
|
|
406
|
+
- **I — Infrastructure:** I1 implements port · I2 mappers · I3 no business logic · I4 compile-time interface check
|
|
407
|
+
|
|
408
|
+
### Gate
|
|
409
|
+
- [ ] All 10 areas reviewed · Findings categorized by severity
|
|
410
|
+
|
|
411
|
+
## Phase 4: REPORT + SCORE
|
|
412
|
+
|
|
413
|
+
```markdown
|
|
414
|
+
## Architecture Review: {architecture} / {domain}
|
|
415
|
+
### Automated (R1-R10) | ### Manual review (D/E/VO/P/EV/U/SVC/H/L/I)
|
|
416
|
+
### Violations: [SEVERITY] code:file:line — description
|
|
417
|
+
### Overall Score: {A/B/C/D/F}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
| Score | Criteria |
|
|
421
|
+
|-------|----------|
|
|
422
|
+
| **A** | 0 violations, all R1-R10 PASS |
|
|
423
|
+
| **B** | 0 CRITICAL/HIGH, max 3 MEDIUM |
|
|
424
|
+
| **C** | 0 CRITICAL, max 2 HIGH |
|
|
425
|
+
| **D** | Has CRITICAL or 3+ HIGH |
|
|
426
|
+
| **F** | Multiple CRITICAL — architecture broken |
|
|
427
|
+
|
|
428
|
+
## Phase 5: FIX LOOP (if user confirms)
|
|
429
|
+
|
|
430
|
+
```
|
|
431
|
+
LOOP: 1. Fix all violations → 2. Re-run automated (Phase 2) → 3. Re-run manual (Phase 3)
|
|
432
|
+
4. IF violations ≥ MEDIUM → GOTO 1 · 5. IF only LOW/none → BREAK, final report
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
**Called from `/feature-build`:** skip Phase 0 (architecture known), skip user confirmation for fixes (auto-fix in loop), report final score back to caller.
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
# Mode TDD
|
|
441
|
+
|
|
442
|
+
Red-Green-Refactor cycle: write failing test → write minimal code to pass → refactor while green.
|
|
443
|
+
|
|
444
|
+
## When to use
|
|
445
|
+
- ✅ Logic with clear input → output behavior (parsers, validators, business rules, usecases)
|
|
446
|
+
- ✅ Fixing a bug — failing test first, then fix (regression guard)
|
|
447
|
+
- ✅ Refactoring critical code where you need a safety net
|
|
448
|
+
- ❌ UI prototyping / visual tweaks → manual is faster
|
|
449
|
+
- ❌ Exploratory spike → use `/research-explore` (SPIKE — throwaway, no tests)
|
|
450
|
+
|
|
451
|
+
## The TDD Cycle
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
┌──▶ RED (fail) ──▶ GREEN (minimal) ──▶ REFACTOR (cleanup) ──┐
|
|
455
|
+
└──────────────────── next requirement ────────────────────┘
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Phase 1: RED — failing test
|
|
459
|
+
1. Pick ONE small requirement (smallest verifiable behavior)
|
|
460
|
+
2. Name the test as a sentence describing behavior
|
|
461
|
+
3. Arrange (inputs + mocks) → Act (call method) → Assert (output / state / interaction)
|
|
462
|
+
4. Run — it MUST fail. If it passes, the test is wrong.
|
|
463
|
+
|
|
464
|
+
**Naming:** `should_<behavior>_when_<condition>` (Go/Python) · `it("returns X when Y")` (Jest) · `test_<behavior>_<condition>` (PHPUnit/Pest)
|
|
465
|
+
|
|
466
|
+
### Gate
|
|
467
|
+
- [ ] Test fails for the RIGHT reason (not a typo / missing import)
|
|
468
|
+
- [ ] Name describes behavior, not implementation · One behavior per test
|
|
469
|
+
|
|
470
|
+
## Phase 2: GREEN — minimal code to pass
|
|
471
|
+
- **Minimal** means: hardcode return values if the test allows; triangulate with more tests
|
|
472
|
+
- Don't add code not required by a test; don't add error handling unless a test requires it
|
|
473
|
+
- Don't generalize until 3+ tests force it
|
|
474
|
+
- If previous tests broke, you're not minimal — revert + try smaller
|
|
475
|
+
|
|
476
|
+
### Gate
|
|
477
|
+
- [ ] New test passes · All previous tests still pass · No untested behavior added
|
|
478
|
+
|
|
479
|
+
## Phase 3: REFACTOR — clean up while green
|
|
480
|
+
- Refactor: duplication, long methods, bad names, dead branches, coupling
|
|
481
|
+
- **Run tests after every change** — green is your safety net; one refactor at a time
|
|
482
|
+
- **No new behavior** — if a refactor needs a new test, go back to RED
|
|
483
|
+
- Don't refactor: flaky tests (fix flakiness first), under time pressure, code about to be deleted
|
|
484
|
+
|
|
485
|
+
### Gate
|
|
486
|
+
- [ ] All tests still green · No new public API added · Code easier to read
|
|
487
|
+
|
|
488
|
+
## Test patterns per layer (DDD)
|
|
489
|
+
|
|
490
|
+
| Layer | Test type | Dependencies |
|
|
491
|
+
|-------|-----------|--------------|
|
|
492
|
+
| Value Object / Entity | Unit (pure) | None |
|
|
493
|
+
| UseCase | Unit | Mock ports |
|
|
494
|
+
| Service | Unit | Mock usecase |
|
|
495
|
+
| Handler / Controller | Integration | Real router, mock service |
|
|
496
|
+
| Infrastructure | Integration | Real DB / testcontainers |
|
|
497
|
+
| Listener | Unit | Mock infra |
|
|
498
|
+
| API contract (cross-service) | Contract test | Real / sandboxed external |
|
|
499
|
+
|
|
500
|
+
**Stub vs fake vs mock:** stub returns canned values · fake = working in-memory impl · mock records+verifies calls. Prefer **fake** for repository tests; use **mock** only when call args are the assertion.
|
|
501
|
+
|
|
502
|
+
**Property-based testing** for pure logic with many edge cases (parsers, math, encoders): Go `gopter`, TS `fast-check`, Python `hypothesis`, Dart `glados`. Pattern: "for all valid input X, property P holds."
|
|
503
|
+
|
|
504
|
+
## Common Mistakes
|
|
505
|
+
| Mistake | Fix |
|
|
506
|
+
|---------|-----|
|
|
507
|
+
| Writing tests AFTER code | Always RED first |
|
|
508
|
+
| Testing implementation, not behavior | Assert outputs / observable state |
|
|
509
|
+
| One test, many behaviors | One behavior per test |
|
|
510
|
+
| Mocking value objects | Use real — they're pure |
|
|
511
|
+
| Skipping REFACTOR | It's a phase, not optional |
|
|
512
|
+
| Test depends on order | Each test sets up its own state |
|
|
513
|
+
| Slow tests (>1s each) | Move to integration tier; keep unit <100ms |
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
# Mode ADDRESS
|
|
519
|
+
|
|
520
|
+
Fetch all review comments on an open PR you authored, address each, push, and respond back to GitHub.
|
|
521
|
+
|
|
522
|
+
**ARGUMENTS:** `PR_NUMBER` — the PR you authored.
|
|
523
|
+
|
|
524
|
+
## Workflow
|
|
525
|
+
|
|
526
|
+
```
|
|
527
|
+
FETCH → ANALYZE → FIX → RESPOND
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
## Phase 1: FETCH
|
|
531
|
+
|
|
532
|
+
```bash
|
|
533
|
+
PR={number}
|
|
534
|
+
gh pr view $PR --json number,title,state,headRefName,baseRefName,author
|
|
535
|
+
gh pr diff $PR
|
|
536
|
+
gh api repos/{owner}/{repo}/pulls/$PR/comments \
|
|
537
|
+
--jq '.[] | {id, path, line, body, user: .user.login, created_at}'
|
|
538
|
+
gh api repos/{owner}/{repo}/pulls/$PR/reviews \
|
|
539
|
+
--jq '.[] | {id, user: .user.login, state, body}'
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
### Gate
|
|
543
|
+
- [ ] All comments fetched (line-level + review-level) · Current diff loaded
|
|
544
|
+
- [ ] PR is open (closed/merged → ask if user really wants to revisit)
|
|
545
|
+
|
|
546
|
+
## Phase 2: ANALYZE — classify each comment
|
|
547
|
+
|
|
548
|
+
| Category | Action |
|
|
549
|
+
|----------|--------|
|
|
550
|
+
| **Must-fix** (bug, security, broken test, arch violation) | Fix in this round |
|
|
551
|
+
| **Should-fix** (style, naming, missing test for new code) | Fix unless explicit reason not to |
|
|
552
|
+
| **Discussion** (asking a question, proposing alternative) | Reply with reasoning before fixing |
|
|
553
|
+
| **Nit / preference** (subjective) | Acknowledge + decide; OK to push back politely |
|
|
554
|
+
| **Outdated** (code already changed) | Reply "resolved by {commit}" and resolve thread |
|
|
555
|
+
|
|
556
|
+
Ambiguous comment ("this feels off")? Ask the reviewer for specifics before guessing. Build a triage table (`# | File:line | Author | Category | Plan`).
|
|
557
|
+
|
|
558
|
+
### Gate
|
|
559
|
+
- [ ] Every comment classified · Plan written per comment · Ambiguous → questions queued
|
|
560
|
+
|
|
561
|
+
## Phase 3: FIX
|
|
562
|
+
- Fix in order: must-fix → should-fix → discussion outcomes
|
|
563
|
+
- One concern per commit (`fix(handler): validate input in DTO per #pr-comment-1`)
|
|
564
|
+
- After each batch: run build + lint + tests locally
|
|
565
|
+
- Re-run **Mode SELF** before pushing
|
|
566
|
+
- **Structural change requested** (move logic between layers, add a port) → use `/feature-build` (REFACTOR mode) for that subtree, then come back to respond
|
|
567
|
+
|
|
568
|
+
### Gate
|
|
569
|
+
- [ ] All must-fix items addressed · Build + lint + tests green · Self-review clean
|
|
570
|
+
|
|
571
|
+
## Phase 4: RESPOND
|
|
572
|
+
|
|
573
|
+
```bash
|
|
574
|
+
git push
|
|
575
|
+
gh api repos/{owner}/{repo}/pulls/$PR/comments/{comment_id}/replies -f body="..."
|
|
576
|
+
# or single summary: gh pr review $PR --comment --body "$(cat reply.md)"
|
|
577
|
+
gh pr edit $PR --add-reviewer {original_reviewer} # re-request review
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
**Reply patterns:** Fixed → "Fixed in {sha}. {what changed}." · Push back → "Keeping current approach because {reason}. Happy to revisit." · Ask back → "Could you clarify what you mean by …?" · Resolved → "Resolved by {sha} earlier in the chain."
|
|
581
|
+
|
|
582
|
+
After replying, mark threads resolved. Don't leave dangling threads.
|
|
583
|
+
|
|
584
|
+
### Gate
|
|
585
|
+
- [ ] Every comment has a reply · Threads resolved · Commits pushed · Reviewer re-requested
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
## Hard Rules (all modes)
|
|
591
|
+
|
|
592
|
+
- **Changed files / PR scope only** — don't expand to drive-by reviews.
|
|
593
|
+
- **Stop on CRITICAL** — fix build / lint / type errors before everything else; don't review red CI.
|
|
594
|
+
- **File:line for every issue / HIGH+** — no vague "somewhere in handlers".
|
|
595
|
+
- **Match severity honestly** — don't grade-inflate to push for a fix; one severity per finding.
|
|
596
|
+
- **Always include "what went well"** in PR reviews — pure-criticism reviews demoralize.
|
|
597
|
+
- **Don't bikeshed style** when the team has a linter — let the tool flag it.
|
|
598
|
+
- **ARCHITECT:** all CRITICAL/HIGH fixed before merge; MEDIUM allowed with explicit waiver; don't skip manual review.
|
|
599
|
+
- **TDD:** RED first always; minimal GREEN; REFACTOR is a phase, not optional; test behavior not implementation; unit tests <100ms.
|
|
600
|
+
- **ADDRESS:** reply to every comment; push back politely with a real reason; one concern per commit.
|
|
601
|
+
|
|
602
|
+
## Related Skills
|
|
603
|
+
|
|
604
|
+
| When | Use |
|
|
605
|
+
|------|-----|
|
|
606
|
+
| Refactor to fix violations | `/feature-build` (REFACTOR mode) |
|
|
607
|
+
| Bug surfaced by review | `/fix-bug` |
|
|
608
|
+
| Research how others solved it | `/research-explore` (WEB mode) |
|
|
609
|
+
| Document the reviewed API | `/docs-sync` |
|
|
610
|
+
|
|
611
|
+
## Recommended Agents
|
|
612
|
+
|
|
613
|
+
| Mode / Phase | Agent | Purpose |
|
|
614
|
+
|--------------|-------|---------|
|
|
615
|
+
| SELF/PR Architecture | `@clean-architect` | DDD compliance |
|
|
616
|
+
| SELF/PR Security | `@security-audit` | Vulnerability sweep |
|
|
617
|
+
| PR Performance | `@perf-optimizer` | N+1, indexes, slow paths |
|
|
618
|
+
| Quality | `@code-reviewer` | Code smells |
|
|
619
|
+
| Tests / TDD RED | `@test-writer` | Coverage + failing tests first |
|
|
620
|
+
| ARCHITECT automated | `@devops` | Build / lint / test scripts |
|
|
621
|
+
| TDD REFACTOR | `@refactor` | Patterns + cleanup |
|
|
622
|
+
| Fix | Stack-specific dev agent | Apply fixes |
|
|
@@ -36,7 +36,7 @@ const printSkillEditorUsage = (target) => {
|
|
|
36
36
|
const home = target === 'codex' ? '~/.codex' : '~/.gemini';
|
|
37
37
|
const local = target === 'codex' ? './.codex' : './.gemini';
|
|
38
38
|
console.log(chalk.bold(` ${name}:`));
|
|
39
|
-
console.log(chalk.gray(` MoiCle's 16 agents, 4 commands &
|
|
39
|
+
console.log(chalk.gray(` MoiCle's 16 agents, 4 commands & 9 skills installed as SKILL.md files`));
|
|
40
40
|
console.log(chalk.gray(` Skills under ${home}/skills or ${local}/skills`));
|
|
41
41
|
console.log(chalk.gray(` Architecture docs under ${home}/architecture or ${local}/architecture`));
|
|
42
42
|
if (target === 'codex') {
|
|
@@ -48,7 +48,7 @@ const printCursorUsage = () => {
|
|
|
48
48
|
console.log(chalk.bold(' Cursor:'));
|
|
49
49
|
console.log(chalk.gray(' Rules (16 agents) ~/.cursor/rules/ or ./.cursor/rules/'));
|
|
50
50
|
console.log(chalk.gray(' Commands (4) ~/.cursor/commands/ or ./.cursor/commands/'));
|
|
51
|
-
console.log(chalk.gray(' Skills (
|
|
51
|
+
console.log(chalk.gray(' Skills (9) ~/.cursor/skills/ or ./.cursor/skills/'));
|
|
52
52
|
console.log(chalk.gray(' Architecture (11) ~/.cursor/architecture/ or ./.cursor/architecture/'));
|
|
53
53
|
console.log(chalk.gray(' Use @agent-name in chat or slash commands from the command palette'));
|
|
54
54
|
console.log('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/commands/install/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;GAGG;AAEH,MAAM,gBAAgB,GAAG,GAAS,EAAE;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,qBAAqB,GAAG,CAAC,MAA+B,EAAQ,EAAE;IACtE,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/commands/install/usage.ts"],"names":[],"mappings":"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"}
|