@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.
Files changed (62) hide show
  1. package/.opencode/commands/mugiwara-execute.md +11 -0
  2. package/.opencode/commands/mugiwara-heal.md +11 -0
  3. package/.opencode/commands/mugiwara-mode.md +6 -0
  4. package/.opencode/commands/mugiwara-plan.md +11 -0
  5. package/.opencode/commands/mugiwara-review.md +11 -0
  6. package/.opencode/commands/mugiwara-security.md +11 -0
  7. package/.opencode/commands/mugiwara-ship.md +11 -0
  8. package/.opencode/commands/mugiwara.md +11 -0
  9. package/.opencode/plugins/mugiwara.mjs +126 -7
  10. package/README.md +252 -205
  11. package/content/agents/brook-healing.md +2 -2
  12. package/content/agents/luffy-orchestrator.md +3 -2
  13. package/content/agents/robin-reviewer.md +1 -1
  14. package/content/agents/skeptic-verifier.md +1 -1
  15. package/content/agents/using-mugiwara.md +5 -1
  16. package/content/agents/usopp-brainstorm.md +1 -1
  17. package/content/agents/zoro-execution.md +1 -1
  18. package/content/skills/mugiwara-api-and-interface-design/SKILL.md +87 -0
  19. package/content/skills/mugiwara-context-engineering/SKILL.md +59 -0
  20. package/content/skills/mugiwara-doubt-driven-development/SKILL.md +65 -0
  21. package/content/skills/mugiwara-execution/SKILL.md +4 -0
  22. package/content/skills/mugiwara-frontend/SKILL.md +58 -56
  23. package/content/skills/mugiwara-frontend/references/checklist.md +37 -0
  24. package/content/skills/mugiwara-gates/SKILL.md +4 -0
  25. package/content/skills/mugiwara-git-worktrees/SKILL.md +62 -0
  26. package/content/skills/mugiwara-healing/SKILL.md +12 -0
  27. package/content/skills/mugiwara-mode/SKILL.md +13 -4
  28. package/content/skills/mugiwara-orchestration/SKILL.md +19 -1
  29. package/content/skills/mugiwara-planning/SKILL.md +13 -15
  30. package/content/skills/mugiwara-pr/SKILL.md +17 -6
  31. package/content/skills/mugiwara-quality/SKILL.md +10 -0
  32. package/content/skills/mugiwara-security/SKILL.md +38 -1
  33. package/content/skills/mugiwara-ship/SKILL.md +24 -1
  34. package/content/skills/mugiwara-systematic-debugging/SKILL.md +77 -0
  35. package/content/skills/mugiwara-test-driven-development/SKILL.md +84 -0
  36. package/content/skills/mugiwara-workflow/SKILL.md +8 -2
  37. package/content/skills/mugiwara-writing-skills/SKILL.md +60 -0
  38. package/dist/mugiwara.js +42 -26
  39. package/docs/adoption-guide.md +1 -1
  40. package/docs/agents.md +2 -2
  41. package/docs/claude-setup.md +9 -4
  42. package/docs/codex-setup.md +3 -1
  43. package/docs/config.md +50 -0
  44. package/docs/copilot-setup.md +3 -1
  45. package/docs/cursor-setup.md +3 -1
  46. package/docs/developer-onboarding.md +1 -1
  47. package/docs/execution-model.md +33 -0
  48. package/docs/gemini-setup.md +4 -1
  49. package/docs/getting-started.md +16 -4
  50. package/docs/index.md +7 -2
  51. package/docs/modes.md +22 -12
  52. package/docs/opencode-setup.md +9 -2
  53. package/docs/pr-summary.md +54 -0
  54. package/docs/skill-anatomy.md +5 -0
  55. package/docs/skills.md +17 -5
  56. package/docs/windsurf-setup.md +3 -1
  57. package/hooks/hooks.json +15 -0
  58. package/hooks/session-start.ts +8 -0
  59. package/package.json +2 -1
  60. package/src/targets/claude.ts +18 -1
  61. package/src/targets/codex.ts +1 -1
  62. 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 existsSync4, readFileSync as readFileSync3, readdirSync as readdirSync2, realpathSync, rmSync as rmSync2 } from "node:fs";
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 { join } from "node:path";
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 (!existsSync(file)) {
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 existsSync2, mkdirSync, readFileSync, readdirSync, writeFileSync as writeFileSync2, copyFileSync, rmSync } from "node:fs";
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(readFileSync(join5(import.meta.dirname, "..", "package.json"), "utf8"));
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(readFileSync(join5(CONTENT_DIR, "skills", name, "SKILL.md"), "utf8"));
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(readFileSync(join5(CONTENT_DIR, "agents", f), "utf8"));
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 (existsSync2(absPath)) {
320
- if (readFileSync(absPath, "utf8") === text) {
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
- mkdirSync(dirname(backupFile), { recursive: true });
333
- copyFileSync(absPath, backupFile);
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
- mkdirSync(dirname(absPath), { recursive: true });
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 (existsSync2(f)) {
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 = dirname(f);
372
- while (existsSync2(d) && readdirSync(d).length === 0) {
387
+ let d = dirname2(f);
388
+ while (existsSync3(d) && readdirSync(d).length === 0) {
373
389
  rmSync(d, { recursive: true });
374
- const parent = dirname(d);
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 existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync3 } from "node:fs";
386
- import { dirname as dirname2, join as join6 } from "node:path";
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 existsSync3(file) ? JSON.parse(readFileSync2(file, "utf8")) : null;
407
+ return existsSync4(file) ? JSON.parse(readFileSync3(file, "utf8")) : null;
392
408
  }
393
409
  function writeManifest(file, data) {
394
- mkdirSync2(dirname2(file), { recursive: true });
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" && !existsSync4(projectDir))
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(readFileSync3(join7(dir, name, "SKILL.md"), "utf8"));
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;
@@ -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 25 skills as markdown rules plus a bootstrap pointer, so the crew
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 25 skills. No project-type selection —
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 25 techniques, or
50
+ See [skills.md](skills.md) for the 32 techniques, or
51
51
  [workflow.md](workflow.md) for the pipeline.
@@ -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
- - 25 skills in `~/.claude/skills/` (global) or `.claude/skills/` (project).
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.
@@ -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
- - 25 skills as markdown rules in `.codex/mugiwara/`.
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.
@@ -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
- - 25 skills as `.instructions.md` files in `.github/` (project) or
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
 
@@ -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
- - 25 skills as markdown rule files.
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 # 25 skills + 15 agents: names, descriptions, line limits
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)
@@ -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
@@ -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
- - 25 skills as markdown rules in `.gemini/mugiwara/`.
20
+ - 32 skills as markdown rules in `.gemini/mugiwara/`.
18
21
  - A `GEMINI.md` bootstrap pointer (created if missing).
19
22
 
20
23
  ## Notes
@@ -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
- Once installed, just ask. No agent names to remember say what you want built:
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
- - Open the PR at the end — the crew pushes the branch and hands you the verdict
62
- file; the crew never merges or deploys.
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 25 skills and what each enforces |
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 / commits | Ambiguities | Check-ins |
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, commits, and ambiguities (logging
18
- each decision), but you still give the plan an explicit GO.
19
- - **auto** — hands-off, with a safety line: the plan proceeds past approval
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). Otherwise it stops for you.
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, three keys, `key=value` lines, optional `#` comments:
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. Missing config on read = `guided` (never auto-created on
42
- read only on first write).
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 handed to you.
63
- The crew never creates a PR, merges, deploys, or auto-reacts to review comments
64
- or CI. PR review is the terminal gate.
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.
@@ -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
- - 25 skills in `.opencode/skills/` (project) or `~/.config/opencode/skills/`
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