@ionivetech/mugiwara 0.2.0 → 0.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/.opencode/commands/mugiwara-execute.md +11 -0
- package/.opencode/commands/mugiwara-heal.md +11 -0
- package/.opencode/commands/mugiwara-mode.md +6 -0
- package/.opencode/commands/mugiwara-plan.md +11 -0
- package/.opencode/commands/mugiwara-review.md +11 -0
- package/.opencode/commands/mugiwara-security.md +11 -0
- package/.opencode/commands/mugiwara-ship.md +11 -0
- package/.opencode/commands/mugiwara.md +11 -0
- package/.opencode/plugins/mugiwara.mjs +126 -7
- package/README.md +252 -205
- package/content/agents/brook-healing.md +2 -2
- package/content/agents/luffy-orchestrator.md +3 -2
- package/content/agents/robin-reviewer.md +1 -1
- package/content/agents/skeptic-verifier.md +1 -1
- package/content/agents/using-mugiwara.md +5 -1
- package/content/agents/usopp-brainstorm.md +1 -1
- package/content/agents/zoro-execution.md +1 -1
- package/content/skills/mugiwara-api-and-interface-design/SKILL.md +87 -0
- package/content/skills/mugiwara-context-engineering/SKILL.md +59 -0
- package/content/skills/mugiwara-doubt-driven-development/SKILL.md +65 -0
- package/content/skills/mugiwara-execution/SKILL.md +4 -0
- package/content/skills/mugiwara-frontend/SKILL.md +58 -56
- package/content/skills/mugiwara-frontend/references/checklist.md +37 -0
- package/content/skills/mugiwara-gates/SKILL.md +4 -0
- package/content/skills/mugiwara-git-worktrees/SKILL.md +62 -0
- package/content/skills/mugiwara-healing/SKILL.md +12 -0
- package/content/skills/mugiwara-mode/SKILL.md +13 -4
- package/content/skills/mugiwara-orchestration/SKILL.md +19 -1
- package/content/skills/mugiwara-planning/SKILL.md +13 -15
- package/content/skills/mugiwara-pr/SKILL.md +17 -6
- package/content/skills/mugiwara-quality/SKILL.md +10 -0
- package/content/skills/mugiwara-security/SKILL.md +38 -1
- package/content/skills/mugiwara-ship/SKILL.md +24 -1
- package/content/skills/mugiwara-systematic-debugging/SKILL.md +77 -0
- package/content/skills/mugiwara-test-driven-development/SKILL.md +84 -0
- package/content/skills/mugiwara-workflow/SKILL.md +8 -2
- package/content/skills/mugiwara-writing-skills/SKILL.md +60 -0
- package/dist/mugiwara.js +42 -26
- package/docs/adoption-guide.md +1 -1
- package/docs/agents.md +2 -2
- package/docs/claude-setup.md +9 -4
- package/docs/codex-setup.md +3 -1
- package/docs/config.md +50 -0
- package/docs/copilot-setup.md +3 -1
- package/docs/cursor-setup.md +3 -1
- package/docs/developer-onboarding.md +1 -1
- package/docs/execution-model.md +33 -0
- package/docs/gemini-setup.md +4 -1
- package/docs/getting-started.md +16 -4
- package/docs/index.md +7 -2
- package/docs/modes.md +22 -12
- package/docs/opencode-setup.md +9 -2
- package/docs/pr-summary.md +54 -0
- package/docs/skill-anatomy.md +5 -0
- package/docs/skills.md +17 -5
- package/docs/windsurf-setup.md +3 -1
- package/hooks/hooks.json +15 -0
- package/hooks/session-start.ts +8 -0
- package/package.json +2 -1
- package/src/targets/claude.ts +18 -1
- package/src/targets/codex.ts +1 -1
- package/src/targets/gemini.ts +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mugiwara-writing-skills
|
|
3
|
+
description: Use when authoring a new mugiwara skill or revising an existing one. Enforces the skill anatomy (name/description 20-500 chars, when-to-use, process, rationalizations, red flags, verification), the 120-line body ceiling, and progressive disclosure of detail into a references/ file. Meta-skill: governs the other skills.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Writing Mugiwara Skills
|
|
7
|
+
|
|
8
|
+
A skill is a process workflow the agent runs on cue, not a reference guide. If it reads like a wiki page, it fails. The description decides when the skill loads; the body decides what happens next. Both must justify their size.
|
|
9
|
+
|
|
10
|
+
## Skill anatomy
|
|
11
|
+
|
|
12
|
+
Every skill is a single `SKILL.md` at `content/skills/<name>/`, plus an optional `references/` folder for pulled-out detail. The name is the directory name; the validator checks that exact match.
|
|
13
|
+
|
|
14
|
+
| Part | Requirement |
|
|
15
|
+
|------|-------------|
|
|
16
|
+
| name | equals the directory name, `mugiwara-<domain>` |
|
|
17
|
+
| description | one "Use when..." sentence, 20-500 chars, loads the right skill and rejects the wrong ones |
|
|
18
|
+
| body | `# title` + sections below, 120 lines max |
|
|
19
|
+
| references/ | overflow detail, linked from the body |
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
Use this skill the moment you start authoring a new skill file or restructuring an existing one. Skip it only for edits so small they cannot touch anatomy, limits, or wording.
|
|
24
|
+
|
|
25
|
+
## Process
|
|
26
|
+
|
|
27
|
+
1. **Confirm the niche.** Grep `content/skills/` for overlap; a new skill must not duplicate an existing one. Name it `mugiwara-<domain>`.
|
|
28
|
+
2. **Write the description first.** One "Use when..." sentence naming the trigger, the behavior, and the boundary of what the skill is not for. Target 60-120 chars; the 500-char cap is a ceiling, not a goal.
|
|
29
|
+
3. **Draft the body as a workflow.** Concrete numbered steps the agent executes, in order, with decisions and branches embedded. Name the skills it reads or dispatches. Use tables for excusable patterns and quick comparisons.
|
|
30
|
+
4. **Cut to the ceiling.** Body must end at 120 lines or fewer. Section-by-section trim: merge subsections, kill throat-clearing, convert prose to tables. `ponytail` and `caveman` instincts apply — the body is command output, not a report.
|
|
31
|
+
5. **Disclose progressively.** If a section exceeds roughly 15-20 lines, move it to `references/<topic>.md`, drop a one-line pointer in the body, and keep the pointer actionable (what to read and why).
|
|
32
|
+
6. **Check the anatomy list.** Each required section present, in order: title, When to use, Process, Rationalizations, Red flags, Verification.
|
|
33
|
+
7. **Validate.** Run `bun scripts/validate-content.ts --check content/skills/<name>/SKILL.md` and leave it exiting 0.
|
|
34
|
+
|
|
35
|
+
## Rationalizations
|
|
36
|
+
|
|
37
|
+
| Excuse | Rebuttal |
|
|
38
|
+
|--------|----------|
|
|
39
|
+
| "It's a guide, not a checklist" | A skill the agent cannot execute is decoration. Rewrite every paragraph as a step or a criterion. |
|
|
40
|
+
| "The detail is essential" | Then move it to `references/` and keep the body a decision tree, not a dump. |
|
|
41
|
+
| "More lines mean more coverage" | 120 lines enforce focus. Cover the decision, not the encyclopedia. |
|
|
42
|
+
| "Long description catches more triggers" | A description that matches everything loads on nothing specific and trains the agent to ignore the skill. |
|
|
43
|
+
| "Patterns are the same everywhere, I'll mirror another skill's text" | Wording must be original. Mirror the shape, never the sentences. |
|
|
44
|
+
| "It's fine for now, I'll validate later" | Validation is the last step of the write, not a follow-up task. |
|
|
45
|
+
|
|
46
|
+
## Red flags
|
|
47
|
+
|
|
48
|
+
- Body over 120 lines or a description outside 20-500 chars.
|
|
49
|
+
- No "Use when..." trigger sentence, or a description that names no boundary.
|
|
50
|
+
- A section that reads as a lecture instead of steps the agent can run.
|
|
51
|
+
- Required sections missing or out of order.
|
|
52
|
+
- Text copied from another skill, superpowers, or agent-skills.
|
|
53
|
+
- A `references/` file that is unreferenced, or a body so crammed it needed none.
|
|
54
|
+
- An unvalidated file reported as done.
|
|
55
|
+
|
|
56
|
+
Any of these: revise the skill, re-run validation, and confirm both before reporting.
|
|
57
|
+
|
|
58
|
+
## Verification
|
|
59
|
+
|
|
60
|
+
Evidence of a complete skill: the file passes `--check` with exit 0; `wc -l` on the body is at or under 120; the description triggers only its intended cases; every required section is present and original; and any overflow sits in a linked `references/` file.
|
package/dist/mugiwara.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
|
-
import { existsSync as
|
|
4
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4, readdirSync as readdirSync2, realpathSync, rmSync as rmSync2 } from "node:fs";
|
|
5
5
|
import { homedir as homedir2 } from "node:os";
|
|
6
6
|
import { join as join7, resolve } from "node:path";
|
|
7
7
|
import { pathToFileURL } from "node:url";
|
|
@@ -79,7 +79,9 @@ async function confirm(rl, question) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
// src/targets/claude.ts
|
|
82
|
-
import {
|
|
82
|
+
import { existsSync, mkdirSync, copyFileSync } from "node:fs";
|
|
83
|
+
import { dirname, join } from "node:path";
|
|
84
|
+
import { fileURLToPath } from "node:url";
|
|
83
85
|
|
|
84
86
|
// src/frontmatter.ts
|
|
85
87
|
function parseFrontmatter(text) {
|
|
@@ -107,6 +109,8 @@ ${body}`;
|
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
// src/targets/claude.ts
|
|
112
|
+
var here = dirname(fileURLToPath(import.meta.url));
|
|
113
|
+
var HOOK_SRC = join(here, "..", "..", "hooks", "session-start.ts");
|
|
110
114
|
var target = {
|
|
111
115
|
id: "claude",
|
|
112
116
|
label: "Claude Code",
|
|
@@ -126,6 +130,18 @@ var target = {
|
|
|
126
130
|
if (data.tools)
|
|
127
131
|
fm.tools = data.tools;
|
|
128
132
|
return { relPath: `${data.name}.md`, text: stringifyFrontmatter(fm, body) };
|
|
133
|
+
},
|
|
134
|
+
postInstall({ scope, projectDir, home, dryRun }) {
|
|
135
|
+
const root = scope === "global" ? join(home, ".claude") : join(projectDir, ".claude");
|
|
136
|
+
const hookFile = join(root, "hooks", "session-start.ts");
|
|
137
|
+
if (dryRun)
|
|
138
|
+
return { written: [], notes: [] };
|
|
139
|
+
if (existsSync(HOOK_SRC) && !existsSync(hookFile)) {
|
|
140
|
+
mkdirSync(dirname(hookFile), { recursive: true });
|
|
141
|
+
copyFileSync(HOOK_SRC, hookFile);
|
|
142
|
+
return { written: [hookFile], notes: [] };
|
|
143
|
+
}
|
|
144
|
+
return { written: [], notes: [] };
|
|
129
145
|
}
|
|
130
146
|
};
|
|
131
147
|
|
|
@@ -178,7 +194,7 @@ var target3 = {
|
|
|
178
194
|
};
|
|
179
195
|
|
|
180
196
|
// src/targets/generic.ts
|
|
181
|
-
import { existsSync, writeFileSync } from "node:fs";
|
|
197
|
+
import { existsSync as existsSync2, writeFileSync } from "node:fs";
|
|
182
198
|
import { join as join4 } from "node:path";
|
|
183
199
|
function makeGeneric(opts) {
|
|
184
200
|
const { id, label, rulesDir, bootstrapFile, bootstrapPointer } = opts;
|
|
@@ -214,7 +230,7 @@ ${body}` };
|
|
|
214
230
|
const notes = [];
|
|
215
231
|
const written = [];
|
|
216
232
|
const file = join4(projectDir, bootstrapFile);
|
|
217
|
-
if (!
|
|
233
|
+
if (!existsSync2(file)) {
|
|
218
234
|
if (!dryRun)
|
|
219
235
|
writeFileSync(file, `${bootstrapPointer}
|
|
220
236
|
`);
|
|
@@ -233,7 +249,7 @@ var target4 = makeGeneric({
|
|
|
233
249
|
label: "Gemini",
|
|
234
250
|
rulesDir: ".gemini/mugiwara",
|
|
235
251
|
bootstrapFile: "GEMINI.md",
|
|
236
|
-
bootstrapPointer: "Mugiwara crew installed in .gemini/mugiwara/ — read .gemini/mugiwara/mugiwara-workflow.md to run the pipeline."
|
|
252
|
+
bootstrapPointer: "Mugiwara crew installed in .gemini/mugiwara/ — read .gemini/mugiwara/mugiwara-workflow.md to run the pipeline inline in the main conversation."
|
|
237
253
|
});
|
|
238
254
|
|
|
239
255
|
// src/targets/codex.ts
|
|
@@ -242,7 +258,7 @@ var target5 = makeGeneric({
|
|
|
242
258
|
label: "Codex",
|
|
243
259
|
rulesDir: ".codex/mugiwara",
|
|
244
260
|
bootstrapFile: "AGENTS.md",
|
|
245
|
-
bootstrapPointer: "Mugiwara crew installed in .codex/mugiwara/ — read .codex/mugiwara/mugiwara-workflow.md to run the pipeline."
|
|
261
|
+
bootstrapPointer: "Mugiwara crew installed in .codex/mugiwara/ — read .codex/mugiwara/mugiwara-workflow.md to run the pipeline inline in the main conversation."
|
|
246
262
|
});
|
|
247
263
|
|
|
248
264
|
// src/targets/windsurf.ts
|
|
@@ -290,20 +306,20 @@ var targets = { claude: target, opencode: target2, copilot: target3, gemini: tar
|
|
|
290
306
|
var TARGET_IDS = Object.keys(targets);
|
|
291
307
|
|
|
292
308
|
// src/installer.ts
|
|
293
|
-
import { existsSync as
|
|
294
|
-
import { dirname, join as join5 } from "node:path";
|
|
309
|
+
import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync2, readdirSync, writeFileSync as writeFileSync2, copyFileSync as copyFileSync2, rmSync } from "node:fs";
|
|
310
|
+
import { dirname as dirname2, join as join5 } from "node:path";
|
|
295
311
|
import { homedir } from "node:os";
|
|
296
312
|
var CONTENT_DIR = join5(import.meta.dirname, "..", "content");
|
|
297
|
-
var pkg = JSON.parse(
|
|
313
|
+
var pkg = JSON.parse(readFileSync2(join5(import.meta.dirname, "..", "package.json"), "utf8"));
|
|
298
314
|
var VERSION = pkg.version;
|
|
299
315
|
function collectContent() {
|
|
300
316
|
const skillNames = readdirSync(join5(CONTENT_DIR, "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
|
|
301
317
|
const skills = skillNames.map((name) => {
|
|
302
|
-
const { data, body } = parseFrontmatter(
|
|
318
|
+
const { data, body } = parseFrontmatter(readFileSync2(join5(CONTENT_DIR, "skills", name, "SKILL.md"), "utf8"));
|
|
303
319
|
return { name, data, body };
|
|
304
320
|
});
|
|
305
321
|
const agents = readdirSync(join5(CONTENT_DIR, "agents")).filter((f) => f.endsWith(".md")).map((f) => {
|
|
306
|
-
const { data, body } = parseFrontmatter(
|
|
322
|
+
const { data, body } = parseFrontmatter(readFileSync2(join5(CONTENT_DIR, "agents", f), "utf8"));
|
|
307
323
|
return { name: f.replace(/\.md$/, ""), data, body };
|
|
308
324
|
});
|
|
309
325
|
return { skills, agents };
|
|
@@ -316,8 +332,8 @@ function installTo(target10, opts) {
|
|
|
316
332
|
const backupRoot = join5(scope === "global" ? home : projectDir, ".mugiwara");
|
|
317
333
|
const result = { written: [], skipped: [], backedUp: [], notes: [] };
|
|
318
334
|
const writeOne = (absPath, text) => {
|
|
319
|
-
if (
|
|
320
|
-
if (
|
|
335
|
+
if (existsSync3(absPath)) {
|
|
336
|
+
if (readFileSync2(absPath, "utf8") === text) {
|
|
321
337
|
result.skipped.push(absPath);
|
|
322
338
|
return;
|
|
323
339
|
}
|
|
@@ -329,13 +345,13 @@ function installTo(target10, opts) {
|
|
|
329
345
|
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
330
346
|
const backupFile = join5(backupRoot, "backup", ts, absPath.replace(/[^a-zA-Z0-9]+/g, "_"));
|
|
331
347
|
if (!dryRun) {
|
|
332
|
-
|
|
333
|
-
|
|
348
|
+
mkdirSync2(dirname2(backupFile), { recursive: true });
|
|
349
|
+
copyFileSync2(absPath, backupFile);
|
|
334
350
|
}
|
|
335
351
|
result.backedUp.push(absPath);
|
|
336
352
|
}
|
|
337
353
|
if (!dryRun) {
|
|
338
|
-
|
|
354
|
+
mkdirSync2(dirname2(absPath), { recursive: true });
|
|
339
355
|
writeFileSync2(absPath, text);
|
|
340
356
|
}
|
|
341
357
|
result.written.push(absPath);
|
|
@@ -360,7 +376,7 @@ function installTo(target10, opts) {
|
|
|
360
376
|
function removeInstalled(manifest, { dryRun = false } = {}) {
|
|
361
377
|
const removed = [];
|
|
362
378
|
for (const f of manifest.files) {
|
|
363
|
-
if (
|
|
379
|
+
if (existsSync3(f)) {
|
|
364
380
|
if (!dryRun)
|
|
365
381
|
rmSync(f);
|
|
366
382
|
removed.push(f);
|
|
@@ -368,10 +384,10 @@ function removeInstalled(manifest, { dryRun = false } = {}) {
|
|
|
368
384
|
}
|
|
369
385
|
if (!dryRun) {
|
|
370
386
|
for (const f of manifest.files) {
|
|
371
|
-
let d =
|
|
372
|
-
while (
|
|
387
|
+
let d = dirname2(f);
|
|
388
|
+
while (existsSync3(d) && readdirSync(d).length === 0) {
|
|
373
389
|
rmSync(d, { recursive: true });
|
|
374
|
-
const parent =
|
|
390
|
+
const parent = dirname2(d);
|
|
375
391
|
if (parent === d)
|
|
376
392
|
break;
|
|
377
393
|
d = parent;
|
|
@@ -382,16 +398,16 @@ function removeInstalled(manifest, { dryRun = false } = {}) {
|
|
|
382
398
|
}
|
|
383
399
|
|
|
384
400
|
// src/manifest.ts
|
|
385
|
-
import { existsSync as
|
|
386
|
-
import { dirname as
|
|
401
|
+
import { existsSync as existsSync4, mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync3 } from "node:fs";
|
|
402
|
+
import { dirname as dirname3, join as join6 } from "node:path";
|
|
387
403
|
function manifestPath({ scope, projectDir, home }) {
|
|
388
404
|
return scope === "global" ? join6(home, ".mugiwara", "manifest.json") : join6(projectDir, ".mugiwara", "manifest.json");
|
|
389
405
|
}
|
|
390
406
|
function readManifest(file) {
|
|
391
|
-
return
|
|
407
|
+
return existsSync4(file) ? JSON.parse(readFileSync3(file, "utf8")) : null;
|
|
392
408
|
}
|
|
393
409
|
function writeManifest(file, data) {
|
|
394
|
-
|
|
410
|
+
mkdirSync3(dirname3(file), { recursive: true });
|
|
395
411
|
writeFileSync3(file, JSON.stringify(data, null, 2) + `
|
|
396
412
|
`);
|
|
397
413
|
}
|
|
@@ -433,7 +449,7 @@ async function resolveOptions(flags) {
|
|
|
433
449
|
scope = await choose(rl, "Install scope?", ["global (user-wide)", "project (this repo)"]) === 0 ? "global" : "project";
|
|
434
450
|
}
|
|
435
451
|
const projectDir = resolve(str(flags.project) ?? process.cwd());
|
|
436
|
-
if (scope === "project" && !
|
|
452
|
+
if (scope === "project" && !existsSync5(projectDir))
|
|
437
453
|
throw new Error(`Project dir not found: ${projectDir}`);
|
|
438
454
|
let targetIds = str(flags.target)?.split(",").map((s) => s.trim()) ?? null;
|
|
439
455
|
if (targetIds && targetIds.includes("all"))
|
|
@@ -541,7 +557,7 @@ function skills() {
|
|
|
541
557
|
const dir = join7(CONTENT_DIR, "skills");
|
|
542
558
|
const names = readdirSync2(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
543
559
|
const rows = names.map((name) => {
|
|
544
|
-
const { data } = parseFrontmatter(
|
|
560
|
+
const { data } = parseFrontmatter(readFileSync4(join7(dir, name, "SKILL.md"), "utf8"));
|
|
545
561
|
return [name, data.description ?? ""];
|
|
546
562
|
});
|
|
547
563
|
const w = Math.max(...rows.map((r) => r[0].length)) + 2;
|
package/docs/adoption-guide.md
CHANGED
|
@@ -16,7 +16,7 @@ markdown rule files everywhere else.
|
|
|
16
16
|
|
|
17
17
|
Native targets (Claude Code, opencode, Copilot) register the 15 agents directly.
|
|
18
18
|
Rule-based targets (Gemini, Codex, Cursor, Windsurf, Cline, Kilo, Antigravity)
|
|
19
|
-
get the same
|
|
19
|
+
get the same 32 skills as markdown rules plus a bootstrap pointer, so the crew
|
|
20
20
|
is still steered even where subagents don't exist.
|
|
21
21
|
|
|
22
22
|
## Pick your mode
|
package/docs/agents.md
CHANGED
|
@@ -44,8 +44,8 @@ check-ins. The harness stays coherent either way.
|
|
|
44
44
|
|
|
45
45
|
## The crew ships whole
|
|
46
46
|
|
|
47
|
-
Every install gets all 15 agents and all
|
|
47
|
+
Every install gets all 15 agents and all 32 skills. No project-type selection —
|
|
48
48
|
the harness routes each task to the right specialist.
|
|
49
49
|
|
|
50
|
-
See [skills.md](skills.md) for the
|
|
50
|
+
See [skills.md](skills.md) for the 32 techniques, or
|
|
51
51
|
[workflow.md](workflow.md) for the pipeline.
|
package/docs/claude-setup.md
CHANGED
|
@@ -20,19 +20,24 @@ npx @ionivetech/mugiwara@latest --global --target claude --yes
|
|
|
20
20
|
npx @ionivetech/mugiwara@latest --project ./my-app --target claude --yes
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
**Update** — re-install from the marketplace (or `mugiwara update` via CLI).
|
|
24
|
+
|
|
25
|
+
**Uninstall** — `/plugin uninstall mugiwara`, or `mugiwara uninstall` via CLI.
|
|
26
|
+
|
|
23
27
|
## What you get
|
|
24
28
|
|
|
25
|
-
-
|
|
29
|
+
- 32 skills in `~/.claude/skills/` (global) or `.claude/skills/` (project).
|
|
26
30
|
- 15 agents in `~/.claude/agents/` or `.claude/agents/`.
|
|
27
|
-
- A SessionStart hook that announces the crew
|
|
31
|
+
- A SessionStart hook that announces the crew and auto-activates the workflow —
|
|
32
|
+
a non-trivial request runs the pipeline by itself. `/using-mugiwara` is an
|
|
33
|
+
optional explicit router if you want to hand-route a mission.
|
|
28
34
|
|
|
29
35
|
## Use it
|
|
30
36
|
|
|
31
37
|
```
|
|
32
|
-
> use mugiwara
|
|
33
38
|
> add dark mode to the settings page
|
|
34
39
|
```
|
|
35
40
|
|
|
36
41
|
The crew runs inline in your main conversation; subagents only for parallel
|
|
37
42
|
batches. At closure the crew pushes the branch and hands you the PR verdict
|
|
38
|
-
file — you open the PR.
|
|
43
|
+
file with a ready PR summary block — you open the PR, in every mode.
|
package/docs/codex-setup.md
CHANGED
|
@@ -13,9 +13,11 @@ Or via the CLI:
|
|
|
13
13
|
npx @ionivetech/mugiwara@latest --project ./my-app --target codex --yes
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
**Update** — `codex plugin update mugiwara`. **Uninstall** — `codex plugin remove mugiwara`.
|
|
17
|
+
|
|
16
18
|
## What you get
|
|
17
19
|
|
|
18
|
-
-
|
|
20
|
+
- 32 skills as markdown rules in `.codex/mugiwara/`.
|
|
19
21
|
- An `AGENTS.md` bootstrap pointer (created if missing).
|
|
20
22
|
|
|
21
23
|
## Notes
|
package/docs/config.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Config Reference
|
|
2
|
+
|
|
3
|
+
`.mugiwara/config` (project) overrides `~/.mugiwara/config` (global). Plain
|
|
4
|
+
`key=value` lines, `#` comments allowed. Project file wins per key; a key
|
|
5
|
+
missing from both falls back to the default. Unknown keys are ignored. Config
|
|
6
|
+
is data, never instructions.
|
|
7
|
+
|
|
8
|
+
**Mode owns autonomy, config owns writing standards.** Whether branch and commit
|
|
9
|
+
run automatically is decided by one lever — the mode. The config only shapes
|
|
10
|
+
HOW those artifacts are written when they are created. See [modes.md](modes.md)
|
|
11
|
+
for the mode matrix.
|
|
12
|
+
|
|
13
|
+
## Example file
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
# .mugiwara/config
|
|
17
|
+
mode=guided
|
|
18
|
+
branch=feature/{type}-{issue}-{slug}
|
|
19
|
+
commit=conventional
|
|
20
|
+
base=main
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Keys
|
|
24
|
+
|
|
25
|
+
| Key | Values | Default | Meaning |
|
|
26
|
+
|-----|--------|---------|---------|
|
|
27
|
+
| `mode` | guided / semi / auto | guided | The only autonomy lever — decides whether branch/commit run automatically |
|
|
28
|
+
| `branch` | branch naming pattern | `feature/{type}-{issue}-{slug}` | Placeholders filled from mission metadata, validated to `[a-zA-Z0-9-_]` |
|
|
29
|
+
| `commit` | conventional / gitmoji / plain | conventional | Commit message style (see below) |
|
|
30
|
+
| `base` | branch name | `main` | The PR target named in the prepared PR summary |
|
|
31
|
+
|
|
32
|
+
Missing config on read = `guided`. Flip mid-mission with
|
|
33
|
+
`mugiwara mode <guided|semi|auto>` — the change applies from the next wave,
|
|
34
|
+
never mid-wave.
|
|
35
|
+
|
|
36
|
+
## Commit message styles
|
|
37
|
+
|
|
38
|
+
`commit` selects how Zoro writes commit messages:
|
|
39
|
+
|
|
40
|
+
- **conventional** — `feat: ...`, `fix(scope): ...`, `refactor: ...`, per the
|
|
41
|
+
[Conventional Commits](https://www.conventionalcommits.org) spec. Type from
|
|
42
|
+
the task, optional scope in parens. The default.
|
|
43
|
+
- **gitmoji** — a leading emoji carries the intent, e.g. `✨ feat: ...`,
|
|
44
|
+
`🐛 fix: ...`. Signals the change type at a glance in log views that render
|
|
45
|
+
emoji; a bit noisy in plain terminals.
|
|
46
|
+
- **plain** — no prefix, just a short imperative sentence: `Fix export csv
|
|
47
|
+
encoding`. Clearest for repos that don't use any convention.
|
|
48
|
+
|
|
49
|
+
Switch freely per project — it only affects the message format, never the
|
|
50
|
+
one-logical-task-one-commit rule.
|
package/docs/copilot-setup.md
CHANGED
|
@@ -13,9 +13,11 @@ copilot plugin install mugiwara
|
|
|
13
13
|
npx @ionivetech/mugiwara@latest --project ./my-app --target copilot --yes
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
**Update** — `copilot plugin update mugiwara`. **Uninstall** — `copilot plugin uninstall mugiwara`.
|
|
17
|
+
|
|
16
18
|
## What you get
|
|
17
19
|
|
|
18
|
-
-
|
|
20
|
+
- 32 skills as `.instructions.md` files in `.github/` (project) or
|
|
19
21
|
`~/.copilot/` (global).
|
|
20
22
|
- Agents as markdown files in `instructions/` / `agents/`.
|
|
21
23
|
|
package/docs/cursor-setup.md
CHANGED
|
@@ -12,9 +12,11 @@ Or via the CLI:
|
|
|
12
12
|
npx @ionivetech/mugiwara@latest --project ./my-app --target cursor --yes
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
**Update** — re-run `/add-plugin mugiwara`. **Uninstall** — `/remove-plugin mugiwara`.
|
|
16
|
+
|
|
15
17
|
## What you get
|
|
16
18
|
|
|
17
|
-
-
|
|
19
|
+
- 32 skills as markdown rule files.
|
|
18
20
|
- The `.cursor-plugin/plugin.json` manifest.
|
|
19
21
|
|
|
20
22
|
## Notes
|
|
@@ -43,7 +43,7 @@ copies drift.
|
|
|
43
43
|
## Validation
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
bun run validate #
|
|
46
|
+
bun run validate # 32 skills + 15 agents: names, descriptions, line limits
|
|
47
47
|
bun run validate --check-sync # plugin copies match content/
|
|
48
48
|
bun run typecheck # tsc --noEmit
|
|
49
49
|
bun run test # vitest (43 tests)
|
package/docs/execution-model.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
Why the crew runs in your main conversation — and when subagents are actually
|
|
4
4
|
used.
|
|
5
5
|
|
|
6
|
+
## Auto-activation
|
|
7
|
+
|
|
8
|
+
The workflow **auto-activates.** At session start the crew is announced; when
|
|
9
|
+
you give a non-trivial request, the pipeline runs by itself — you do not need
|
|
10
|
+
to call `/using-mugiwara`. It remains an optional explicit router if you want
|
|
11
|
+
to hand-route a mission.
|
|
12
|
+
|
|
6
13
|
## Inline by default
|
|
7
14
|
|
|
8
15
|
The crew runs **inline**. The main thread embodies each crew role using that
|
|
@@ -50,6 +57,32 @@ linear.
|
|
|
50
57
|
- Sequential work never takes a subagent round-trip — no skipping, no hidden
|
|
51
58
|
reordering, plan order is plan order.
|
|
52
59
|
|
|
60
|
+
## Checkpoint reports
|
|
61
|
+
|
|
62
|
+
You see progress as **checkpoint reports**, not a firehose: a wave banner
|
|
63
|
+
(`## Wave N — <crew> (<skill>)`), one compact report per crew member at each
|
|
64
|
+
stage boundary (what ran / result / evidence pointer), a progress summary per
|
|
65
|
+
wave, and a pause when something fails or gets risky. Subagents are used only
|
|
66
|
+
where they genuinely help: independent `[PARALLEL]` task batches, Brook's
|
|
67
|
+
reviewer/security re-verification workers, and background checks.
|
|
68
|
+
|
|
69
|
+
## Manual stages
|
|
70
|
+
|
|
71
|
+
Prefer to drive the stages yourself? Every stage has a slash command that loads
|
|
72
|
+
the skill, runs the crew role inline, and bridges state from `.mugiwara/`:
|
|
73
|
+
|
|
74
|
+
| Command | Runs | Reads state from |
|
|
75
|
+
|---------|------|------------------|
|
|
76
|
+
| `/mugiwara-plan` | Nami | `.mugiwara/spec/` |
|
|
77
|
+
| `/mugiwara-execute` | Zoro | `.mugiwara/plans/` |
|
|
78
|
+
| `/mugiwara-review` | Robin | `.mugiwara/results/` + diff |
|
|
79
|
+
| `/mugiwara-security` | Jinbe | `.mugiwara/results/` + diff |
|
|
80
|
+
| `/mugiwara-heal` | Brook | `.mugiwara/issues/` |
|
|
81
|
+
| `/mugiwara-ship` | Luffy | plan + results |
|
|
82
|
+
|
|
83
|
+
You can jump into any stage — e.g. run `/mugiwara-plan` first, then
|
|
84
|
+
`/mugiwara-execute` later when you're ready.
|
|
85
|
+
|
|
53
86
|
## Trade-off
|
|
54
87
|
|
|
55
88
|
Inline execution grows the main-thread context over a long mission. The crew
|
package/docs/gemini-setup.md
CHANGED
|
@@ -12,9 +12,12 @@ Or via the CLI:
|
|
|
12
12
|
npx @ionivetech/mugiwara@latest --project ./my-app --target gemini --yes
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
**Update** — `gemini extensions update mugiwara`.
|
|
16
|
+
**Uninstall** — `gemini extensions remove mugiwara`.
|
|
17
|
+
|
|
15
18
|
## What you get
|
|
16
19
|
|
|
17
|
-
-
|
|
20
|
+
- 32 skills as markdown rules in `.gemini/mugiwara/`.
|
|
18
21
|
- A `GEMINI.md` bootstrap pointer (created if missing).
|
|
19
22
|
|
|
20
23
|
## Notes
|
package/docs/getting-started.md
CHANGED
|
@@ -32,7 +32,10 @@ Requires **Node.js >= 20.11**. Bun is optional (build-from-source only).
|
|
|
32
32
|
|
|
33
33
|
## 2. Start a mission
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
The workflow **auto-activates**: at session start the crew is announced, and
|
|
36
|
+
when you give a non-trivial request the pipeline runs by itself — no need to
|
|
37
|
+
call `/using-mugiwara`. It remains an optional explicit router if you want to
|
|
38
|
+
hand-route a mission. Just ask, no agent names to remember:
|
|
36
39
|
|
|
37
40
|
```
|
|
38
41
|
> add dark mode to the settings page
|
|
@@ -40,7 +43,9 @@ Once installed, just ask. No agent names to remember — say what you want built
|
|
|
40
43
|
|
|
41
44
|
`using-mugiwara` (the front door) routes your request, Luffy classifies it, and
|
|
42
45
|
the wave pipeline runs. Because the crew runs **inline** in your main
|
|
43
|
-
conversation, you watch every wave as it happens
|
|
46
|
+
conversation, you watch every wave as it happens — as compact **checkpoint
|
|
47
|
+
reports** (a wave banner, one report per crew member at each stage boundary,
|
|
48
|
+
and a pause when something fails):
|
|
44
49
|
|
|
45
50
|
```
|
|
46
51
|
Wave 0 Luffy triage → route: plan (requirements mostly clear)
|
|
@@ -51,6 +56,11 @@ conversation, you watch every wave as it happens:
|
|
|
51
56
|
Wave 9 Luffy closure→ report appended to plan, intermediate files cleaned
|
|
52
57
|
```
|
|
53
58
|
|
|
59
|
+
Prefer to drive the stages yourself? Every stage has a slash command that loads
|
|
60
|
+
the skill, runs the crew role inline, and bridges state from `.mugiwara/`:
|
|
61
|
+
`/mugiwara-plan`, `/mugiwara-execute`, `/mugiwara-review`, `/mugiwara-security`,
|
|
62
|
+
`/mugiwara-heal`, `/mugiwara-ship`. You can jump into any stage.
|
|
63
|
+
|
|
54
64
|
## 3. What you do during a mission
|
|
55
65
|
|
|
56
66
|
Almost nothing, in the default mode:
|
|
@@ -58,8 +68,9 @@ Almost nothing, in the default mode:
|
|
|
58
68
|
- Answer Nami's clarifying questions (one batched round before planning).
|
|
59
69
|
- Give the plan an explicit GO when presented (or switch to `semi`/`auto`).
|
|
60
70
|
- Review Brook's rollback note if a risky fix is proposed.
|
|
61
|
-
-
|
|
62
|
-
|
|
71
|
+
- In every mode, open the PR at the end — the crew pushes the branch and hands
|
|
72
|
+
you the verdict file with a ready PR summary block. The crew never merges,
|
|
73
|
+
deploys, or creates a PR itself.
|
|
63
74
|
|
|
64
75
|
## 4. The `.mugiwara/` workspace
|
|
65
76
|
|
|
@@ -81,4 +92,5 @@ Every mission writes to `.mugiwara/` at the repo root:
|
|
|
81
92
|
- Learn the [execution model](execution-model.md) — why everything is visible.
|
|
82
93
|
- Set your [mode](modes.md) — `guided` asks at every gate, `semi`/`auto`
|
|
83
94
|
self-answer.
|
|
95
|
+
- Read the [config reference](config.md) — branch/commit/PR writing standards.
|
|
84
96
|
- Meet the [crew](agents.md).
|
package/docs/index.md
CHANGED
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
The Straw Hat crew of AI agents and skills. These docs cover what the crew is,
|
|
4
4
|
how to adopt it, and how each harness installs it. The crew is pure markdown —
|
|
5
|
-
no runtime, no daemons, nothing to host.
|
|
5
|
+
no runtime, no daemons, nothing to host. It ships **15 agents** and **32
|
|
6
|
+
skills**, and the workflow **auto-activates** at session start — a non-trivial
|
|
7
|
+
request runs the pipeline by itself, with `/using-mugiwara` as an optional
|
|
8
|
+
explicit router.
|
|
6
9
|
|
|
7
10
|
## Start here
|
|
8
11
|
|
|
@@ -11,8 +14,10 @@ no runtime, no daemons, nothing to host.
|
|
|
11
14
|
| [Getting started](getting-started.md) | Install, first mission, what you see in the chat |
|
|
12
15
|
| [Adoption guide](adoption-guide.md) | Pick the harness, pick the mode, fit the crew to your workflow |
|
|
13
16
|
| [Modes](modes.md) | guided / semi / auto — the autonomy levels, what each asks you |
|
|
17
|
+
| [Config](config.md) | Full reference for `.mugiwara/config` keys and commit styles |
|
|
18
|
+
| [Auto-PR](pr-summary.md) | What the crew hands off at closure: push + a ready-to-paste PR summary (it never creates a PR) |
|
|
14
19
|
| [The crew](agents.md) | All 15 agents and when to summon each |
|
|
15
|
-
| [The techniques](skills.md) | All
|
|
20
|
+
| [The techniques](skills.md) | All 32 skills and what each enforces |
|
|
16
21
|
| [The wave pipeline](workflow.md) | How a mission flows Wave 0 → Wave 9 |
|
|
17
22
|
| [Execution model](execution-model.md) | Inline-by-default: why the crew runs in your main conversation |
|
|
18
23
|
| [Git discipline](git-strategy.md) | Commits, branches, save-points — and why the executor commits |
|
package/docs/modes.md
CHANGED
|
@@ -4,31 +4,39 @@ The crew's autonomy level. Read once per wave at dispatch; a flip applies from
|
|
|
4
4
|
the next wave, never mid-wave. Single source of truth: the `mugiwara-mode`
|
|
5
5
|
skill.
|
|
6
6
|
|
|
7
|
+
**Mode owns autonomy, config owns writing standards.** Whether branch and commit
|
|
8
|
+
run automatically is decided by one lever: the mode. The config only shapes HOW
|
|
9
|
+
those artifacts are written when they are created.
|
|
10
|
+
|
|
7
11
|
## The three levels
|
|
8
12
|
|
|
9
|
-
| Level | Plan GO | Branch
|
|
10
|
-
|
|
13
|
+
| Level | Plan GO | Branch/commit | Ambiguities | Check-ins |
|
|
14
|
+
|-------|---------|---------------|-------------|-----------|
|
|
11
15
|
| **guided** | ask the user | ask the user | ask the user | ask the user |
|
|
12
16
|
| **semi** | present plan for user GO | auto | self-answer + log | log, no pause |
|
|
13
17
|
| **auto** | gated auto-GO | auto | self-answer + log | log, no pause |
|
|
14
18
|
|
|
15
19
|
- **guided** — you steer everything: approve the plan, decide branch and
|
|
16
20
|
commit style, answer every ambiguity, get asked at every gate. The default.
|
|
17
|
-
- **semi** — the crew self-manages branch
|
|
18
|
-
|
|
19
|
-
- **auto** — hands-off, with
|
|
21
|
+
- **semi** — the crew self-manages branch and commits (logging each decision),
|
|
22
|
+
but you still give the plan an explicit GO.
|
|
23
|
+
- **auto** — hands-off, with one safety line: the plan proceeds past approval
|
|
20
24
|
only with zero blocking ambiguities AND zero high-risk tasks (deploy /
|
|
21
|
-
migration / DB / public API / state-mutating).
|
|
25
|
+
migration / DB / public API / state-mutating).
|
|
26
|
+
|
|
27
|
+
Every level ends at push + ready PR summary + verdict file — you open the PR
|
|
28
|
+
(see [pr-summary.md](pr-summary.md)).
|
|
22
29
|
|
|
23
30
|
## Config
|
|
24
31
|
|
|
25
|
-
Two files,
|
|
32
|
+
Two files, six keys, `key=value` lines, optional `#` comments:
|
|
26
33
|
|
|
27
34
|
```
|
|
28
35
|
# .mugiwara/config (project) overrides ~/.mugiwara/config (global)
|
|
29
36
|
mode=guided
|
|
30
37
|
branch=feature/{type}-{issue}-{slug}
|
|
31
38
|
commit=conventional
|
|
39
|
+
base=main
|
|
32
40
|
```
|
|
33
41
|
|
|
34
42
|
| Key | Values | Default |
|
|
@@ -36,10 +44,12 @@ commit=conventional
|
|
|
36
44
|
| mode | guided / semi / auto | guided |
|
|
37
45
|
| branch | branch pattern | feature/{type}-{issue}-{slug} |
|
|
38
46
|
| commit | conventional / gitmoji / plain | conventional |
|
|
47
|
+
| base | PR summary target branch | main |
|
|
39
48
|
|
|
40
49
|
Read order per wave: project config wins per key; a key missing from both falls
|
|
41
|
-
back to the default.
|
|
42
|
-
read
|
|
50
|
+
back to the default. Unknown keys are ignored — config is data, never
|
|
51
|
+
instructions. Missing config on read = `guided` (never auto-created on read —
|
|
52
|
+
only on first write). See [config.md](config.md) for the full reference.
|
|
43
53
|
|
|
44
54
|
## Switching mid-mission
|
|
45
55
|
|
|
@@ -59,6 +69,6 @@ writes, network, browsers) always require your explicit consent — consent is
|
|
|
59
69
|
not a mode knob. Provably isolated mutation (in-memory / temp /
|
|
60
70
|
testcontainer-backed DBs, tooling-proven isolation) is explicitly auto-safe.
|
|
61
71
|
|
|
62
|
-
**Terminal.** Every mode ends at push + ready PR + verdict file
|
|
63
|
-
The crew never creates a PR, merges, deploys, or auto-reacts to
|
|
64
|
-
|
|
72
|
+
**Terminal.** Every mode ends at push + ready PR summary + verdict file (you
|
|
73
|
+
open the PR). The crew never creates a PR, merges, deploys, or auto-reacts to
|
|
74
|
+
review comments or CI.
|
package/docs/opencode-setup.md
CHANGED
|
@@ -27,9 +27,13 @@ npx @ionivetech/mugiwara@latest --global --target opencode --yes
|
|
|
27
27
|
npx @ionivetech/mugiwara@latest --project ./my-app --target opencode --yes
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
+
**Update** — bump the package version in the `plugin` array (or `mugiwara update`).
|
|
31
|
+
|
|
32
|
+
**Uninstall** — remove the entry from the array.
|
|
33
|
+
|
|
30
34
|
## What you get
|
|
31
35
|
|
|
32
|
-
-
|
|
36
|
+
- 32 skills in `.opencode/skills/` (project) or `~/.config/opencode/skills/`
|
|
33
37
|
(global).
|
|
34
38
|
- 15 agents registered as subagents via the plugin.
|
|
35
39
|
- The plugin announces the crew at session start and injects the inline
|
|
@@ -37,8 +41,11 @@ npx @ionivetech/mugiwara@latest --project ./my-app --target opencode --yes
|
|
|
37
41
|
|
|
38
42
|
## Use it
|
|
39
43
|
|
|
44
|
+
The workflow **auto-activates** — at session start the crew is announced, and a
|
|
45
|
+
non-trivial request runs the pipeline by itself. `/using-mugiwara` is an
|
|
46
|
+
optional explicit router if you want to hand-route a mission:
|
|
47
|
+
|
|
40
48
|
```
|
|
41
|
-
> use mugiwara
|
|
42
49
|
> add dark mode to the settings page
|
|
43
50
|
```
|
|
44
51
|
|