@ionivetech/mugiwara 0.3.0 → 0.4.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.
Files changed (66) hide show
  1. package/.opencode/commands/mugiwara-plan.md +4 -0
  2. package/README.md +320 -384
  3. package/content/skills/mugiwara-agent-security/SKILL.md +5 -0
  4. package/content/skills/mugiwara-api-and-interface-design/SKILL.md +5 -0
  5. package/content/skills/mugiwara-backend/SKILL.md +5 -0
  6. package/content/skills/mugiwara-brainstorm/SKILL.md +5 -0
  7. package/content/skills/mugiwara-checkpoint/SKILL.md +5 -0
  8. package/content/skills/mugiwara-context-engineering/SKILL.md +5 -0
  9. package/content/skills/mugiwara-deprecation/SKILL.md +5 -0
  10. package/content/skills/mugiwara-doubt-driven-development/SKILL.md +5 -0
  11. package/content/skills/mugiwara-dynamic-workflow/SKILL.md +5 -0
  12. package/content/skills/mugiwara-eval/SKILL.md +5 -0
  13. package/content/skills/mugiwara-execution/SKILL.md +5 -0
  14. package/content/skills/mugiwara-frontend/SKILL.md +12 -12
  15. package/content/skills/mugiwara-gates/SKILL.md +5 -0
  16. package/content/skills/mugiwara-git/SKILL.md +5 -0
  17. package/content/skills/mugiwara-git-worktrees/SKILL.md +5 -0
  18. package/content/skills/mugiwara-healing/SKILL.md +5 -0
  19. package/content/skills/mugiwara-lessons/SKILL.md +5 -0
  20. package/content/skills/mugiwara-mode/SKILL.md +5 -0
  21. package/content/skills/mugiwara-observability/SKILL.md +5 -0
  22. package/content/skills/mugiwara-orchestration/SKILL.md +13 -0
  23. package/content/skills/mugiwara-planning/SKILL.md +14 -13
  24. package/content/skills/mugiwara-pr/SKILL.md +5 -0
  25. package/content/skills/mugiwara-quality/SKILL.md +5 -0
  26. package/content/skills/mugiwara-resume/SKILL.md +5 -0
  27. package/content/skills/mugiwara-review/SKILL.md +5 -0
  28. package/content/skills/mugiwara-security/SKILL.md +17 -17
  29. package/content/skills/mugiwara-ship/SKILL.md +5 -0
  30. package/content/skills/mugiwara-systematic-debugging/SKILL.md +5 -0
  31. package/content/skills/mugiwara-test-driven-development/SKILL.md +5 -0
  32. package/content/skills/mugiwara-testcases/SKILL.md +5 -0
  33. package/content/skills/mugiwara-workflow/SKILL.md +6 -1
  34. package/content/skills/mugiwara-writing-skills/SKILL.md +5 -0
  35. package/dist/mugiwara.js +136 -28
  36. package/docs/adoption-guide.md +2 -2
  37. package/docs/comparison.md +166 -44
  38. package/docs/config.md +3 -0
  39. package/docs/developer-onboarding.md +17 -13
  40. package/docs/enforcement.md +38 -0
  41. package/docs/index.md +11 -5
  42. package/docs/lanes.md +40 -0
  43. package/docs/skill-anatomy.md +11 -6
  44. package/docs/troubleshooting.md +91 -0
  45. package/docs/workflow.md +15 -6
  46. package/evals/cases/adversarial-pressure-fake-pass.json +12 -0
  47. package/evals/cases/adversarial-pressure-skip-review.json +13 -0
  48. package/evals/cases/lane-exploratory-vague.json +12 -0
  49. package/evals/cases/lane-sensitivity-payment.json +12 -0
  50. package/evals/cases/negative-secrets-typo.json +12 -0
  51. package/evals/cases/negative-security-docs-change.json +12 -0
  52. package/evals/cases/positive-refactor-existing-tests.json +11 -0
  53. package/evals/cases/positive-resume-mid-mission.json +11 -0
  54. package/evals/cases/routing-auth-feature.json +13 -0
  55. package/evals/cases/routing-bug-one-file.json +13 -0
  56. package/evals/cases/routing-typo.json +13 -0
  57. package/package.json +2 -1
  58. package/src/args.ts +2 -1
  59. package/src/cli.ts +16 -20
  60. package/src/installer.ts +31 -3
  61. package/src/mission.ts +25 -0
  62. package/src/targets/claude.ts +4 -0
  63. package/src/targets/copilot.ts +4 -0
  64. package/src/targets/generic.ts +33 -1
  65. package/src/targets/kilo.ts +1 -0
  66. package/src/targets/opencode.ts +4 -0
@@ -5,6 +5,11 @@ description: Use when authoring a new mugiwara skill or revising an existing one
5
5
 
6
6
  # Writing Mugiwara Skills
7
7
 
8
+ ## Skip when
9
+
10
+ - Not authoring or revising a mugiwara skill — plain application code change.
11
+ - Skill change is a one-line description fix with no anatomy impact.
12
+
8
13
  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
14
 
10
15
  ## Skill anatomy
package/dist/mugiwara.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/cli.ts
4
- import { existsSync as existsSync5, readFileSync as readFileSync4, readdirSync as readdirSync2, realpathSync, rmSync as rmSync2 } from "node:fs";
4
+ import { existsSync as existsSync6, realpathSync, rmSync as rmSync3 } from "node:fs";
5
5
  import { homedir as homedir2 } from "node:os";
6
- import { join as join7, resolve } from "node:path";
6
+ import { resolve } from "node:path";
7
7
  import { pathToFileURL } from "node:url";
8
8
 
9
9
  // src/args.ts
@@ -14,6 +14,7 @@ var BOOL_FLAGS = {
14
14
  "-y": "yes",
15
15
  "--force": "force",
16
16
  "--dry-run": "dryRun",
17
+ "--keep-logs": "keepLogs",
17
18
  "--help": "help",
18
19
  "-h": "help",
19
20
  "--version": "version",
@@ -131,6 +132,10 @@ var target = {
131
132
  fm.tools = data.tools;
132
133
  return { relPath: `${data.name}.md`, text: stringifyFrontmatter(fm, body) };
133
134
  },
135
+ refsDir({ scope, projectDir, home }, skillName) {
136
+ const root = scope === "global" ? join(home, ".claude") : join(projectDir, ".claude");
137
+ return join(root, "skills", skillName, "references");
138
+ },
134
139
  postInstall({ scope, projectDir, home, dryRun }) {
135
140
  const root = scope === "global" ? join(home, ".claude") : join(projectDir, ".claude");
136
141
  const hookFile = join(root, "hooks", "session-start.ts");
@@ -166,6 +171,10 @@ var target2 = {
166
171
  if (data.tools)
167
172
  fm.tools = data.tools;
168
173
  return { relPath: `${data.name}.md`, text: stringifyFrontmatter(fm, body) };
174
+ },
175
+ refsDir({ scope, projectDir, home }, skillName) {
176
+ const root = scope === "global" ? join2(home, ".config", "opencode") : join2(projectDir, ".opencode");
177
+ return join2(root, "skills", skillName, "references");
169
178
  }
170
179
  };
171
180
 
@@ -190,6 +199,9 @@ var target3 = {
190
199
  relPath: `${data.name}.md`,
191
200
  text: stringifyFrontmatter({ name: data.name, description: data.description }, body)
192
201
  };
202
+ },
203
+ refsDir(_opts, skillName) {
204
+ return join3(_opts.projectDir, ".mugiwara", "refs", skillName);
193
205
  }
194
206
  };
195
207
 
@@ -197,11 +209,13 @@ var target3 = {
197
209
  import { existsSync as existsSync2, writeFileSync } from "node:fs";
198
210
  import { join as join4 } from "node:path";
199
211
  function makeGeneric(opts) {
200
- const { id, label, rulesDir, bootstrapFile, bootstrapPointer } = opts;
212
+ const { id, label, rulesDir, bootstrapFile, bootstrapPointer, tier = bootstrapPointer ? 2 : 3 } = opts;
213
+ const stubOnly = tier === 3;
201
214
  return {
202
215
  id,
203
216
  label,
204
217
  native: false,
218
+ tier,
205
219
  paths({ scope, projectDir }) {
206
220
  if (scope === "global")
207
221
  throw new Error(`${label} supports project scope only`);
@@ -209,6 +223,27 @@ function makeGeneric(opts) {
209
223
  return { skillsDir: dir, agentsDir: dir };
210
224
  },
211
225
  transformSkill(data, body) {
226
+ if (stubOnly) {
227
+ return {
228
+ relPath: `${data.name}.md`,
229
+ text: `# ${data.name}
230
+
231
+ > ${data.description}
232
+
233
+ ## Skip when
234
+
235
+ Full skill: \`${data.name}\` — read \`.mugiwara/refs/${data.name}.md\` when the crew invokes this role.`
236
+ };
237
+ }
238
+ return { relPath: `${data.name}.md`, text: `# ${data.name}
239
+
240
+ > ${data.description}
241
+
242
+ ${body}` };
243
+ },
244
+ transformSkillFull(data, body) {
245
+ if (!stubOnly)
246
+ return null;
212
247
  return { relPath: `${data.name}.md`, text: `# ${data.name}
213
248
 
214
249
  > ${data.description}
@@ -216,6 +251,16 @@ function makeGeneric(opts) {
216
251
  ${body}` };
217
252
  },
218
253
  transformAgent(data, body) {
254
+ if (stubOnly) {
255
+ return {
256
+ relPath: `agent-${data.name}.md`,
257
+ text: `# Agent: ${data.name}
258
+
259
+ > ${data.description}
260
+
261
+ Skills: ${data.skills ?? ""}. Read \`.mugiwara/refs/${data.name}.md\` when embodying this role.`
262
+ };
263
+ }
219
264
  return { relPath: `agent-${data.name}.md`, text: `# Agent: ${data.name}
220
265
 
221
266
  > ${data.description}
@@ -224,6 +269,20 @@ Skills used: ${data.skills ?? ""}
224
269
 
225
270
  ${body}` };
226
271
  },
272
+ transformAgentFull(data, body) {
273
+ if (!stubOnly)
274
+ return null;
275
+ return { relPath: `${data.name}.md`, text: `# Agent: ${data.name}
276
+
277
+ > ${data.description}
278
+
279
+ Skills used: ${data.skills ?? ""}
280
+
281
+ ${body}` };
282
+ },
283
+ refsDir({ projectDir }) {
284
+ return join4(projectDir, ".mugiwara", "refs");
285
+ },
227
286
  postInstall({ projectDir, dryRun }) {
228
287
  if (!bootstrapFile)
229
288
  return { written: [], notes: [] };
@@ -289,7 +348,8 @@ var target8 = makeGeneric({
289
348
  "instructions": [
290
349
  ".kilo/rules/*.md"
291
350
  ]
292
- }`
351
+ }`,
352
+ tier: 3
293
353
  });
294
354
 
295
355
  // src/targets/antigravity.ts
@@ -316,14 +376,20 @@ function collectContent() {
316
376
  const skillNames = readdirSync(join5(CONTENT_DIR, "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
317
377
  const skills = skillNames.map((name) => {
318
378
  const { data, body } = parseFrontmatter(readFileSync2(join5(CONTENT_DIR, "skills", name, "SKILL.md"), "utf8"));
319
- return { name, data, body };
379
+ return { name, data, body, refs: collectRefs(join5(CONTENT_DIR, "skills", name)) };
320
380
  });
321
381
  const agents = readdirSync(join5(CONTENT_DIR, "agents")).filter((f) => f.endsWith(".md")).map((f) => {
322
382
  const { data, body } = parseFrontmatter(readFileSync2(join5(CONTENT_DIR, "agents", f), "utf8"));
323
- return { name: f.replace(/\.md$/, ""), data, body };
383
+ return { name: f.replace(/\.md$/, ""), data, body, refs: [] };
324
384
  });
325
385
  return { skills, agents };
326
386
  }
387
+ function collectRefs(skillDir) {
388
+ const refsDir = join5(skillDir, "references");
389
+ if (!existsSync3(refsDir))
390
+ return [];
391
+ return readdirSync(refsDir, { recursive: true }).map((f) => String(f)).filter((f) => f.endsWith(".md")).map((rel) => ({ relPath: rel, text: readFileSync2(join5(refsDir, rel), "utf8") }));
392
+ }
327
393
  function installTo(target10, opts) {
328
394
  const { scope, projectDir, dryRun = false, force = false } = opts;
329
395
  const home = opts.home ?? homedir();
@@ -360,11 +426,26 @@ function installTo(target10, opts) {
360
426
  const out = target10.transformSkill(s.data, s.body);
361
427
  if (out)
362
428
  writeOne(join5(dirs.skillsDir, out.relPath), out.text);
429
+ if (target10.transformSkillFull) {
430
+ const full = target10.transformSkillFull(s.data, s.body);
431
+ if (full && target10.refsDir)
432
+ writeOne(join5(target10.refsDir({ scope, projectDir, home }, s.name), full.relPath), full.text);
433
+ }
434
+ if (s.refs.length && target10.refsDir) {
435
+ const refsRoot = target10.refsDir({ scope, projectDir, home }, s.name);
436
+ for (const r of s.refs)
437
+ writeOne(join5(refsRoot, r.relPath), r.text);
438
+ }
363
439
  }
364
440
  for (const a of agents) {
365
441
  const out = target10.transformAgent(a.data, a.body);
366
442
  if (out)
367
443
  writeOne(join5(dirs.agentsDir, out.relPath), out.text);
444
+ if (target10.transformAgentFull) {
445
+ const full = target10.transformAgentFull(a.data, a.body);
446
+ if (full && target10.refsDir)
447
+ writeOne(join5(target10.refsDir({ scope, projectDir, home }, a.name), full.relPath), full.text);
448
+ }
368
449
  }
369
450
  if (target10.postInstall) {
370
451
  const post = target10.postInstall({ scope, projectDir, home, dryRun, files: result.written });
@@ -412,6 +493,38 @@ function writeManifest(file, data) {
412
493
  `);
413
494
  }
414
495
 
496
+ // src/mission.ts
497
+ import { existsSync as existsSync5, rmSync as rmSync2 } from "node:fs";
498
+ import { join as join7 } from "node:path";
499
+ function resetMission(projectDir, keepLogs) {
500
+ const root = join7(projectDir, ".mugiwara");
501
+ if (!existsSync5(root))
502
+ return { removed: [], kept: [] };
503
+ const removed = [];
504
+ const kept = [];
505
+ for (const dir of ["spec", "plans", "results", "review", "issues"]) {
506
+ const p = join7(root, dir);
507
+ if (existsSync5(p)) {
508
+ rmSync2(p, { recursive: true, force: true });
509
+ removed.push(dir);
510
+ }
511
+ }
512
+ if (!keepLogs) {
513
+ const p = join7(root, "logs");
514
+ if (existsSync5(p)) {
515
+ rmSync2(p, { recursive: true, force: true });
516
+ removed.push("logs");
517
+ }
518
+ } else if (existsSync5(join7(root, "logs"))) {
519
+ kept.push("logs");
520
+ }
521
+ for (const f of ["config", "manifest.json", "backup"]) {
522
+ if (existsSync5(join7(root, f)))
523
+ kept.push(f);
524
+ }
525
+ return { removed, kept };
526
+ }
527
+
415
528
  // src/cli.ts
416
529
  var str = (v) => typeof v === "string" ? v : undefined;
417
530
  var flag = (v) => v === true;
@@ -432,12 +545,22 @@ async function run(argv) {
432
545
  return uninstall(flags);
433
546
  case "list":
434
547
  return list(flags);
435
- case "skills":
436
- return skills();
548
+ case "reset":
549
+ return resetCmd(flags);
437
550
  default:
438
551
  throw new Error(`Unknown command: ${command}`);
439
552
  }
440
553
  }
554
+ function resetCmd(flags) {
555
+ const projectDir = resolve(str(flags.project) ?? process.cwd());
556
+ const { removed, kept } = resetMission(projectDir, flag(flags.keepLogs));
557
+ if (removed.length)
558
+ console.log(`removed: ${removed.join(", ")}`);
559
+ else
560
+ console.log("nothing to remove.");
561
+ if (kept.length)
562
+ console.log(`kept: ${kept.join(", ")}`);
563
+ }
441
564
  async function resolveOptions(flags) {
442
565
  const interactive = !flag(flags.yes);
443
566
  const rl = interactive ? createRl() : null;
@@ -449,7 +572,7 @@ async function resolveOptions(flags) {
449
572
  scope = await choose(rl, "Install scope?", ["global (user-wide)", "project (this repo)"]) === 0 ? "global" : "project";
450
573
  }
451
574
  const projectDir = resolve(str(flags.project) ?? process.cwd());
452
- if (scope === "project" && !existsSync5(projectDir))
575
+ if (scope === "project" && !existsSync6(projectDir))
453
576
  throw new Error(`Project dir not found: ${projectDir}`);
454
577
  let targetIds = str(flags.target)?.split(",").map((s) => s.trim()) ?? null;
455
578
  if (targetIds && targetIds.includes("all"))
@@ -533,7 +656,7 @@ async function uninstall(flags) {
533
656
  }
534
657
  const removed = removeInstalled(manifest, { dryRun: flag(flags.dryRun) });
535
658
  if (!flag(flags.dryRun))
536
- rmSync2(file);
659
+ rmSync3(file);
537
660
  console.log(`OK removed ${removed.length} files`);
538
661
  }
539
662
  function list(flags) {
@@ -553,22 +676,6 @@ function list(flags) {
553
676
  if (!found)
554
677
  console.log("No mugiwara installation found.");
555
678
  }
556
- function skills() {
557
- const dir = join7(CONTENT_DIR, "skills");
558
- const names = readdirSync2(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
559
- const rows = names.map((name) => {
560
- const { data } = parseFrontmatter(readFileSync4(join7(dir, name, "SKILL.md"), "utf8"));
561
- return [name, data.description ?? ""];
562
- });
563
- const w = Math.max(...rows.map((r) => r[0].length)) + 2;
564
- console.log(`mugiwara ${VERSION} — ${rows.length} skills (agentskills.io format):
565
- `);
566
- for (const [name, description] of rows)
567
- console.log(` ${name.padEnd(w)}${description}`);
568
- console.log(`
569
- Install skills into any agent via skills.sh:
570
- npx skills add ionivetech/mugiwara`);
571
- }
572
679
  function help() {
573
680
  console.log(`mugiwara ${VERSION} — the Straw Hat crew for AI agents
574
681
 
@@ -577,7 +684,7 @@ Usage:
577
684
  mugiwara update replace existing files (backs up differences first)
578
685
  mugiwara uninstall remove installed files via manifest
579
686
  mugiwara list show installations
580
- mugiwara skills list installable skills (agentskills.io)
687
+ mugiwara reset wipe mission state (spec/plans/results/review/issues[/logs])
581
688
  mugiwara --help this help
582
689
  mugiwara --version print version
583
690
 
@@ -587,7 +694,8 @@ Flags:
587
694
  --target <ids|all> comma-separated: ${TARGET_IDS.join(", ")}
588
695
  --yes, -y non-interactive (needs --global/--project, --target)
589
696
  --force overwrite differing files (with backup)
590
- --dry-run print actions without writing`);
697
+ --dry-run print actions without writing
698
+ --keep-logs with reset: keep .mugiwara/logs (lessons ledger survives)`);
591
699
  }
592
700
  var entry = process.argv[1] !== undefined ? resolve(process.argv[1]) : undefined;
593
701
  if (entry !== undefined) {
@@ -43,8 +43,8 @@ mid-wave.
43
43
 
44
44
  ## Fit the crew to your workflow
45
45
 
46
- - **Trivial one-liners** don't need the crew — Luffy routes them straight to
47
- execution.
46
+ - **Trivial one-liners** don't need the crew's full pipeline — Luffy routes them
47
+ to Lane 0 and they run with zero waves. The process scales to the work.
48
48
  - **Medium features** run the standard pipeline: triage → plan → execute →
49
49
  checkpoint → quality → gates → review → closure.
50
50
  - **High-stakes work** (money, security, data, public API) always gets the full
@@ -1,63 +1,185 @@
1
1
  # Comparison
2
2
 
3
- How mugiwara fits against the alternatives.
3
+ How mugiwara fits against the alternatives — and an honest benchmark.
4
4
 
5
- ## Mugiwara vs. plain skills (agent-skills / skills.sh)
5
+ ## The landscape
6
6
 
7
- The [agent-skills](https://github.com/addyosmani/agent-skills) ecosystem ships
8
- standalone skills that an agent picks up on demand. Mugiwara ships the same
9
- portable `SKILL.md` format and also ships:
7
+ | Tool | What it is | Harnesses |
8
+ |------|-----------|-----------|
9
+ | **mugiwara** | Crew (15 agents) + pipeline (9 waves, gated) + 32 skills + lane sizing | 12 harnesses + 70+ via skills.sh |
10
+ | **superpowers** | Skills-only methodology with auto-trigger + subagent-driven development | 11 harnesses |
11
+ | **agent-skills** (addyosmani) | 24 skills + 8 slash commands + 4 personas, Google engineering culture | 70+ via skills.sh |
12
+ | **anthropics/skills** | Official demo skills — creative/docs/document skills, not a dev pipeline | Claude Code |
13
+ | **mattpocock/skills** | Small composable engineering skills, mostly user-invoked | Claude Code + Codex + any |
14
+ | **agent frameworks** (LangGraph, CrewAI, …) | Code: graphs, nodes, runtimes to host | one per framework |
15
+ | **mega-prompt** | One big instruction | any |
10
16
 
11
- - **A named crew** personas (Luffy, Nami, Zoro, …) on top of the skills, so
12
- the pipeline has a defined owner per wave instead of "whichever skill fires."
13
- - **A pipeline, not a pile** — ordered waves (triage → plan → execute →
14
- checkpoint → quality → gates → review → heal → closure) with gates between.
15
- - **Evidence discipline** — no wave passes on a claim; the owning role runs the
16
- checks and shows output.
17
- - **A workspace contract** — `.mugiwara/` holds plan, results, ledger, and
18
- logs, so a mission survives context loss.
17
+ ## Mugiwara vs. skills packs (superpowers, agent-skills)
19
18
 
20
- You can still install just the skills (`npx skills add ionivetech/mugiwara`).
19
+ Both are markdown skills an agent picks up on demand. Mugiwara ships the same
20
+ portable `SKILL.md` format — and adds what a pile of skills cannot:
21
+
22
+ - **A named crew, not a pile.** 15 personas (Luffy, Nami, Zoro, …) each own a
23
+ wave, so the pipeline has a defined owner and handoff instead of "whichever
24
+ skill fires first."
25
+ - **A gated pipeline, not loose triggers.** Ordered waves
26
+ (triage → plan → execute → checkpoint → quality → gates → review → heal →
27
+ closure) with a verify-everything gate between and a bounded heal loop.
28
+ Superpowers has a gated workflow too (`spec → plan → build → verify →
29
+ review`); agent-skills exposes gates as slash commands but does not chain
30
+ them into one pipeline.
31
+ - **Sizing (lane routing).** Work is sized before it runs: a one-file typo runs
32
+ zero waves, an auth change always runs all nine. No other pack scales the
33
+ process to the work — they run the same ceremony (or lack of it) for every
34
+ task. Mugiwara's auto-lane also means **trivial fixes are handled natively**,
35
+ not "don't use it for small stuff."
36
+ - **Skip gates.** Every mugiwara skill declares when it does *not* apply, so a
37
+ docs-only change skips Jinbe's security audit instead of burning a wave.
38
+ - **Workspace + resume.** `.mugiwara/` holds plan, results, ledger, and logs,
39
+ so a mission survives context loss and resumes instead of restarting.
40
+ - **A single source of truth.** `content/` is the only physical copy; every
41
+ harness reads the same files (symlinks), so there is no drift between
42
+ "Claude version" and "Cursor version."
43
+
44
+ ### Against superpowers specifically
45
+
46
+ Superpowers is excellent at deep autonomous work: its subagent-driven
47
+ development dispatches a fresh subagent per task with two-stage review, and
48
+ runs for hours. Differences:
49
+
50
+ - **Visibility.** Mugiwara runs inline by default — you watch every wave in the
51
+ main conversation. Superpowers hides work behind subagent dispatch.
52
+ - **Crew depth.** Mugiwara ships 15 agents (auditor, security, gates, healing,
53
+ memory) vs. superpowers' review-first model. A standalone security wave with
54
+ STRIDE + OWASP and a dedicated healer are mugiwara-specific.
55
+ - **Wider surface.** Mugiwara adds domain skills (frontend anti-slop, backend,
56
+ agent-security) and meta-controls (mode, resume, lessons) beyond the
57
+ build-loop superpowers centers on.
58
+
59
+ ### Against agent-skills specifically
60
+
61
+ agent-skills has the strongest SDLC breadth (19/21 categories in the audit
62
+ baseline) and carries Google's engineering culture (Hyrum's Law, test pyramid,
63
+ Chesterton's Fence). Differences:
64
+
65
+ - **Pipeline vs. commands.** agent-skills gates are per-skill; the agent must
66
+ chain them by hand. Mugiwara chains them into one auto-running pipeline.
67
+ - **Healing.** agent-skills reports; mugiwara's Brook reads the failure ledger
68
+ and fixes root causes in a bounded loop — the loop agent-skills lacks.
69
+ - **Sizing.** agent-skills runs its full process on any change; mugiwara routes
70
+ to a lane first.
21
71
 
22
72
  ## Mugiwara vs. agent frameworks (LangGraph, CrewAI, …)
23
73
 
24
74
  Framework crews are code: graphs, nodes, runtimes to host. Mugiwara is:
25
75
 
26
- - **Zero runtime** pure markdown; your existing agent's own subagent
27
- machinery does the work. Nothing to deploy, nothing to keep updated.
28
- - **Harness-native** installs into Claude Code, opencode, Copilot, Gemini,
29
- Codex, Cursor, and 70+ tools rather than forcing one runtime.
30
- - **Inline** — the pipeline runs in your main conversation (see
31
- [execution-model.md](execution-model.md)); frameworks hide the work behind
32
- their own execution graph.
76
+ - **Zero runtime.** Pure markdown; your existing agent's own machinery does the
77
+ work. A tiny Node CLI exists only to install and uninstall. Nothing to
78
+ deploy, nothing to keep updated.
79
+ - **Harness-native.** The same crew installs into 12 harnesses instead of
80
+ forcing one runtime.
81
+ - **Inline.** The pipeline runs in your main conversation; frameworks hide the
82
+ work behind their execution graph.
83
+
84
+ Frameworks win when you need API-driven crews, deployable graphs, or
85
+ deterministic orchestration in code. If your team runs agents as a service,
86
+ pick a framework; if you want your existing coding agent to work *better*, pick
87
+ mugiwara.
88
+
89
+ ## Mugiwara vs. a mega-prompt
90
+
91
+ A mega-prompt is one big instruction. Mugiwara:
92
+
93
+ - **Splits by specialization** — 32 focused skills + 15 personas instead of one
94
+ document trying to be everything.
95
+ - **Sizes** — lanes mean small tasks skip the pipeline instead of paying the
96
+ mega-prompt's full cost every time.
97
+ - **Gates + heals** — verifiable gates catch drift; a bounded heal loop fixes
98
+ root causes instead of re-running the same prompt.
33
99
 
34
- ## Mugiwara vs. a single mega-prompt
100
+ ## What they all share
35
101
 
36
- A mega-prompt gives you one big instruction. Mugiwara:
102
+ Every option above including mugiwara is **prose an agent chooses to
103
+ follow**. Markdown cannot force a model to comply. What differs is how much
104
+ structure the prose builds to catch drift: mugiwara's answer is the wave gates,
105
+ the skip gates, the lane sizing, and the workspace contract.
37
106
 
38
- - **Splits by specialization** — 25 focused skills + 15 personas instead of one
39
- document that tries to be everything, so each phase has a tight contract.
40
- - **Is gated** — every wave has a verifiable gate and a recorded reason, so
41
- drift is caught early.
42
- - **Heals** — a bounded 3-cycle heal loop reads the failure ledger and fixes
43
- root causes, instead of re-running the same mega-prompt.
107
+ ## Benchmark
44
108
 
45
- ## When NOT to use mugiwara
109
+ Measured against `content/` at the audit baseline (Aug 2026). Token figures are
110
+ estimates (chars ÷ 4); skill counts are exact.
46
111
 
47
- - **One-line fixes** — Luffy routes trivia straight to execution; you don't
48
- need the crew for a typo.
49
- - **You want a framework runtime** if you need orchestration in code,
50
- deployable graphs, or API-driven crews, a framework is the right tool.
51
- - **You want the crew to merge/deploy** mugiwara deliberately stops at push +
52
- PR. Human review is the terminal gate.
112
+ ### Size & density
113
+
114
+ | Metric | mugiwara | superpowers | agent-skills |
115
+ |--------|:--------:|:-----------:|:------------:|
116
+ | Skills | **32** | 14 | 24 |
117
+ | Index size (all descriptions loaded) | ~2.0k tok | ~0.5k tok | ~1.7k tok |
118
+ | Avg skill size | **~1.2k tok** | ~2.3k tok | ~3.1k tok |
119
+ | Avg skill length | **~80 lines** | ~227 lines | ~305 lines |
120
+ | Skills with a skip gate | **32/32** | 0/14 | 11/24 |
121
+
122
+ Mugiwara ships the most skills with the smallest average footprint — the
123
+ biggest pack with the densest per-skill content.
124
+
125
+ ### Process & capability
126
+
127
+ | Dimension | mugiwara | superpowers | agent-skills |
128
+ |-----------|:--------:|:-----------:|:------------:|
129
+ | Ordered pipeline | ✅ 9 waves + gates | ✅ spec→plan→build→verify | ⚠️ per-command |
130
+ | Lane sizing (work scales process) | ✅ 0–4 | ❌ | ❌ |
131
+ | Named crew / agents | ✅ 15 | ❌ | ⚠️ 4 personas |
132
+ | Auto-activation | ✅ | ✅ | ⚠️ per-command |
133
+ | Evidence gates on every wave | ✅ | ✅ | ✅ |
134
+ | Skip gates per skill | ✅ 32/32 | ❌ | ⚠️ 11/24 |
135
+ | Self-healing loop | ✅ bounded 3-cycle | ⚠️ review-block | ❌ |
136
+ | Session resume from disk | ✅ | ⚠️ worktree-based | ❌ |
137
+ | Cross-mission memory (lessons) | ✅ | ❌ | ❌ |
138
+ | Security review as a first-class wave | ✅ STRIDE+OWASP | ⚠️ via review | ⚠️ security skill |
139
+ | Workspace contract | ✅ `.mugiwara/` | ⚠️ worktrees | ❌ |
140
+ | Slash commands (manual stages) | ✅ 6 | ✅ | ✅ 8 |
141
+ | Agent-layer security skill | ✅ | ❌ | ❌ |
142
+
143
+ ### Harness / portability
144
+
145
+ | Metric | mugiwara | superpowers | agent-skills |
146
+ |--------|:--------:|:-----------:|:------------:|
147
+ | Native install targets | 12 | 11 | ~15 |
148
+ | Skills-only via skills.sh | ✅ 70+ | ✅ | ✅ |
149
+ | Tiered emission (stub for glob-loading harnesses) | ✅ | ❌ | ❌ |
150
+ | Static token load on rules-dir harnesses | **~4.8k** (stubs) | n/a | n/a |
151
+
152
+ ### Where mugiwara is *not* the best fit
153
+
154
+ - **Deep autonomous marathon runs.** If you want an agent to disappear for
155
+ hours on a subagent-driven build with minimal visibility, superpowers'
156
+ `subagent-driven-development` is built for exactly that.
157
+ - **Google-culture reference depth.** agent-skills' source-cited engineering
158
+ practices (Hyrum's Law, test pyramid, review norms) are richer per skill.
159
+ - **A runtime service.** If you need API-driven, deployable agent crews, use a
160
+ framework.
53
161
 
54
162
  ## Summary
55
163
 
56
- | | Mugiwara | Plain skills | Framework crews | Mega-prompt |
57
- |---|----------|--------------|-----------------|-------------|
58
- | Runtime | none | none | yes | none |
59
- | Pipeline | ordered waves + gates | on-demand | graph | linear |
60
- | Visibility | inline in your chat | inline | behind the graph | inline |
61
- | Evidence gates | yes | no | configurable | no |
62
- | Self-healing | yes (3-cycle loop) | no | configurable | no |
63
- | Harnesses | 12+ | 70+ | one per framework | any |
164
+ | | Mugiwara | Superpowers | Agent-skills | Frameworks | Mega-prompt |
165
+ |---|----------|-------------|--------------|------------|-------------|
166
+ | Skills | 32 | 14 | 24 | | 1 |
167
+ | Pipeline | 9 waves + gates | gated workflow | per-command | graph | linear |
168
+ | Lane sizing | | | | | |
169
+ | Named crew | 15 | | 4 personas | code | — |
170
+ | Skip gates | 32/32 | 0/14 | 11/24 | | |
171
+ | Self-healing | | ⚠️ | | configurable | |
172
+ | Session resume | ✅ | ⚠️ | ❌ | — | ❌ |
173
+ | Lessons memory | ✅ | ❌ | ❌ | — | ❌ |
174
+ | Visibility | inline | subagent-heavy | inline | behind graph | inline |
175
+ | Runtime | none | none | none | yes | none |
176
+ | Harnesses | 12+ / 70+ | 11 | 70+ | 1 | any |
177
+
178
+ **Bottom line.** Mugiwara is the only option that scales the process to the
179
+ work (lane routing), ships a named gated crew with a bounded heal loop, and
180
+ keeps the full pipeline visible inline — while carrying the most skills at the
181
+ lowest average cost. Where it trades ground: marathon subagent autonomy
182
+ (superpowers) and per-skill reference depth (agent-skills).
183
+
184
+ *Benchmark figures are estimates from the audit baseline (Aug 2026); mugiwara
185
+ skill counts are exact, competitor counts from their READMEs.*
package/docs/config.md CHANGED
@@ -29,6 +29,9 @@ base=main
29
29
  | `commit` | conventional / gitmoji / plain | conventional | Commit message style (see below) |
30
30
  | `base` | branch name | `main` | The PR target named in the prepared PR summary |
31
31
 
32
+ The mission **lane** (how many waves run) is decided by Luffy at triage — see
33
+ [lanes.md](lanes.md). Config holds autonomy and writing standards only.
34
+
32
35
  Missing config on read = `guided`. Flip mid-mission with
33
36
  `mugiwara mode <guided|semi|auto>` — the change applies from the next wave,
34
37
  never mid-wave.
@@ -18,35 +18,39 @@ bun install
18
18
  ```
19
19
  mugiwara/
20
20
  ├── content/ # single source of truth: skills/ + agents/ markdown
21
- ├── agents/ # synced copy of content/agents (plugin copies at repo root)
22
- ├── skills/ # synced copy of content/skills
21
+ ├── agents/ # symlink content/agents (Claude Code plugin reads plugin root)
22
+ ├── skills/ # symlink content/skills
23
23
  ├── src/ # CLI, installer, targets, frontmatter parser
24
24
  ├── scripts/ # validate-content, sync-version, run-evals, install scripts
25
25
  ├── test/ # vitest suite
26
26
  ├── .opencode/plugins/ # opencode plugin (registers crew at config load)
27
- ├── .claude-plugin/ # Claude Code marketplace + sync.sh
27
+ ├── .claude-plugin/ # Claude Code marketplace + sync.sh (symlink guard)
28
28
  └── docs/ # these docs
29
29
  ```
30
30
 
31
31
  ## The source of truth
32
32
 
33
- `content/` is canonical. The repo-root `agents/` and `skills/` copies are
34
- generated for harnesses that read the repo directly:
33
+ `content/` is the only physical source. The repo-root `agents/` and `skills/`
34
+ are **symlinks** into it, so harnesses that read the plugin root (Claude Code
35
+ marketplace) see the same files — there is no copy to drift. On a fresh clone
36
+ where the symlinks are missing, recreate them:
35
37
 
36
38
  ```bash
37
39
  sh .claude-plugin/sync.sh
38
40
  ```
39
41
 
40
- Always edit `content/`, then sync. `bun run validate --check-sync` fails if the
41
- copies drift.
42
+ Always edit `content/`. `bun run validate --check-sync` verifies the symlinks
43
+ resolve to `content/` and never diverge.
42
44
 
43
45
  ## Validation
44
46
 
45
47
  ```bash
46
- bun run validate # 32 skills + 15 agents: names, descriptions, line limits
47
- bun run validate --check-sync # plugin copies match content/
48
+ bun run validate # 32 skills + 15 agents: names, descriptions, skip gates, line limits
49
+ bun run validate --check-sync # symlinks resolve to content/, never diverge
48
50
  bun run typecheck # tsc --noEmit
49
- bun run test # vitest (43 tests)
51
+ bun run test # vitest
52
+ bun run evals # eval suite valid (structure + coverage gates)
53
+ bun run evals --run # optional: execute cases against a model CLI (MUGIWARA_EVAL_CMD)
50
54
  ```
51
55
 
52
56
  ## Editing a skill or agent
@@ -55,8 +59,7 @@ bun run test # vitest (43 tests)
55
59
  2. Respect the house style (see [skill-anatomy.md](skill-anatomy.md) and
56
60
  [agent-anatomy.md](agent-anatomy.md)): evidence over claims, exact commands,
57
61
  red flags, ≤120-line skill bodies.
58
- 3. `sh .claude-plugin/sync.sh`
59
- 4. `bun run validate && bun run typecheck && bun run test`
62
+ 3. `bun run validate && bun run typecheck && bun run test`
60
63
 
61
64
  ## Adding a new skill or agent
62
65
 
@@ -64,7 +67,8 @@ bun run test # vitest (43 tests)
64
67
  2. If it's an agent, list its held skills in frontmatter; give it a
65
68
  `description` ≥20 chars.
66
69
  3. If it's a skill, pick a folder name that matches `name`; description 20–500
67
- chars; body ≤120 lines.
70
+ chars; body ≤120 lines; include a `## Skip when` block (1–4 bullets, numeric
71
+ thresholds) so the skill knows when it does not apply.
68
72
  4. Update the crew/technique tables in `README.md` and the docs (`agents.md`,
69
73
  `skills.md`).
70
74
  5. Sync + validate + test.