@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.
- package/.opencode/commands/mugiwara-plan.md +4 -0
- package/README.md +320 -384
- package/content/skills/mugiwara-agent-security/SKILL.md +5 -0
- package/content/skills/mugiwara-api-and-interface-design/SKILL.md +5 -0
- package/content/skills/mugiwara-backend/SKILL.md +5 -0
- package/content/skills/mugiwara-brainstorm/SKILL.md +5 -0
- package/content/skills/mugiwara-checkpoint/SKILL.md +5 -0
- package/content/skills/mugiwara-context-engineering/SKILL.md +5 -0
- package/content/skills/mugiwara-deprecation/SKILL.md +5 -0
- package/content/skills/mugiwara-doubt-driven-development/SKILL.md +5 -0
- package/content/skills/mugiwara-dynamic-workflow/SKILL.md +5 -0
- package/content/skills/mugiwara-eval/SKILL.md +5 -0
- package/content/skills/mugiwara-execution/SKILL.md +5 -0
- package/content/skills/mugiwara-frontend/SKILL.md +12 -12
- package/content/skills/mugiwara-gates/SKILL.md +5 -0
- package/content/skills/mugiwara-git/SKILL.md +5 -0
- package/content/skills/mugiwara-git-worktrees/SKILL.md +5 -0
- package/content/skills/mugiwara-healing/SKILL.md +5 -0
- package/content/skills/mugiwara-lessons/SKILL.md +5 -0
- package/content/skills/mugiwara-mode/SKILL.md +5 -0
- package/content/skills/mugiwara-observability/SKILL.md +5 -0
- package/content/skills/mugiwara-orchestration/SKILL.md +13 -0
- package/content/skills/mugiwara-planning/SKILL.md +14 -13
- package/content/skills/mugiwara-pr/SKILL.md +5 -0
- package/content/skills/mugiwara-quality/SKILL.md +5 -0
- package/content/skills/mugiwara-resume/SKILL.md +5 -0
- package/content/skills/mugiwara-review/SKILL.md +5 -0
- package/content/skills/mugiwara-security/SKILL.md +17 -17
- package/content/skills/mugiwara-ship/SKILL.md +5 -0
- package/content/skills/mugiwara-systematic-debugging/SKILL.md +5 -0
- package/content/skills/mugiwara-test-driven-development/SKILL.md +5 -0
- package/content/skills/mugiwara-testcases/SKILL.md +5 -0
- package/content/skills/mugiwara-workflow/SKILL.md +6 -1
- package/content/skills/mugiwara-writing-skills/SKILL.md +5 -0
- package/dist/mugiwara.js +136 -28
- package/docs/adoption-guide.md +2 -2
- package/docs/comparison.md +166 -44
- package/docs/config.md +3 -0
- package/docs/developer-onboarding.md +17 -13
- package/docs/enforcement.md +38 -0
- package/docs/index.md +11 -5
- package/docs/lanes.md +40 -0
- package/docs/skill-anatomy.md +11 -6
- package/docs/troubleshooting.md +91 -0
- package/docs/workflow.md +15 -6
- package/evals/cases/adversarial-pressure-fake-pass.json +12 -0
- package/evals/cases/adversarial-pressure-skip-review.json +13 -0
- package/evals/cases/lane-exploratory-vague.json +12 -0
- package/evals/cases/lane-sensitivity-payment.json +12 -0
- package/evals/cases/negative-secrets-typo.json +12 -0
- package/evals/cases/negative-security-docs-change.json +12 -0
- package/evals/cases/positive-refactor-existing-tests.json +11 -0
- package/evals/cases/positive-resume-mid-mission.json +11 -0
- package/evals/cases/routing-auth-feature.json +13 -0
- package/evals/cases/routing-bug-one-file.json +13 -0
- package/evals/cases/routing-typo.json +13 -0
- package/package.json +2 -1
- package/src/args.ts +2 -1
- package/src/cli.ts +16 -20
- package/src/installer.ts +31 -3
- package/src/mission.ts +25 -0
- package/src/targets/claude.ts +4 -0
- package/src/targets/copilot.ts +4 -0
- package/src/targets/generic.ts +33 -1
- package/src/targets/kilo.ts +1 -0
- 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
|
|
4
|
+
import { existsSync as existsSync6, realpathSync, rmSync as rmSync3 } from "node:fs";
|
|
5
5
|
import { homedir as homedir2 } from "node:os";
|
|
6
|
-
import {
|
|
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 "
|
|
436
|
-
return
|
|
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" && !
|
|
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
|
-
|
|
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
|
|
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) {
|
package/docs/adoption-guide.md
CHANGED
|
@@ -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
|
|
47
|
-
|
|
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
|
package/docs/comparison.md
CHANGED
|
@@ -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
|
-
##
|
|
5
|
+
## The landscape
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
their
|
|
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
|
-
##
|
|
100
|
+
## What they all share
|
|
35
101
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
109
|
+
Measured against `content/` at the audit baseline (Aug 2026). Token figures are
|
|
110
|
+
estimates (chars ÷ 4); skill counts are exact.
|
|
46
111
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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 |
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
| Pipeline |
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
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/ #
|
|
22
|
-
├── 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
|
|
34
|
-
|
|
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
|
|
41
|
-
|
|
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 #
|
|
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
|
|
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. `
|
|
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.
|