[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71PHQFZ4AWQDPTFEX0B5988":3,"skill-same:01M71PHQFZ4AWQDPTFEX0B5988":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M71PHQFZ4AWQDPTFEX0B5988","bmad-customize",null,"Authors and updates customization overrides for installed BMad skills. Use when the user says 'customize bmad', 'override a skill', 'change agent behavior', or 'customize a workflow'.","jsacko\u002FOpenDFIR","jsacko","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F63580474?v=4","01M71PG17HH9PJ0ME3103K2MF5","Julien Sacko","01M71PG188SHJ0DBAYX85237WG",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbmad-customize\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37],"bmad customize","bmad","customize","for","use","when","updates","workflow","overrides","change","behavior","customization","a skill","user","2026-11-10 13:02:02",false,"---\nname: bmad-customize\ndescription: Authors and updates customization overrides for installed BMad skills. Use when the user says 'customize bmad', 'override a skill', 'change agent behavior', or 'customize a workflow'.\n---\n\n# BMad Customize\n\nTranslate the user's intent into a correctly-placed TOML override file under `{project-root}\u002F_bmad\u002Fcustom\u002F` for a customizable agent or workflow skill. Discover, route, author, write, verify.\n\nScope v1: per-skill `[agent]` overrides (`bmad-agent-\u003Crole>.toml` \u002F `.user.toml`) and per-skill `[workflow]` overrides (`bmad-\u003Cworkflow>.toml` \u002F `.user.toml`). Central config (`{project-root}\u002F_bmad\u002Fcustom\u002Fconfig.toml`) is out of scope — point users at the [How to Customize BMad guide](https:\u002F\u002Fdocs.bmad-method.org\u002Fhow-to\u002Fcustomize-bmad\u002F).\n\nWhen the target's `customize.toml` doesn't expose what the user wants, say so plainly. Don't invent fields.\n\n## Preflight\n\n- No `{project-root}\u002F_bmad\u002F` → BMad isn't installed. Say so, stop.\n- `{project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py` missing → continue, but Step 6 verify falls back to manual merge.\n- Both present → proceed.\n\n## Activation\n\nLoad `_bmad\u002Fconfig.toml` and `_bmad\u002Fconfig.user.toml` from `{project-root}` for `user_name` (default `BMad`) and `communication_language` (default `English`). Greet. If the user's invocation already names a target skill AND a specific change, jump to Step 3.\n\n## Step 1: Classify intent\n\n- **Directed** — specific skill + specific change → Step 3.\n- **Exploratory** — \"what can I customize?\" → Step 2.\n- **Audit\u002Fiterate** — wants to review or change something already customized → Step 2, lead with skills that have existing overrides; read the existing override in Step 3 before composing.\n- **Cross-cutting** — could live on multiple surfaces → Step 3, choose agent vs workflow explicitly with the user.\n\n## Step 2: Discovery\n\n```\npython3 {skill-root}\u002Fscripts\u002Flist_customizable_skills.py --project-root {project-root}\n```\n\nUse `--extra-root \u003Cpath>` (repeatable) if the user has skills installed in additional locations.\n\nGroup the returned `agents` and `workflows` for the user; for each show name, description, whether `has_team_override` or `has_user_override` is true. Surface any `errors[]`. For audit\u002Fiterate intents, lead with already-overridden entries.\n\nEmpty list: show `scanned_roots`, ask whether skills live elsewhere (offer `--extra-root`); otherwise stop.\n\n## Step 3: Determine the right surface\n\nRead the target's `customize.toml`. Top-level `[agent]` or `[workflow]` block defines the surface.\n\nIf a team or user override already exists, read it first and summarize what's already overridden before composing.\n\n**Cross-cutting intent — walk both surfaces with the user:**\n- Every workflow a given agent runs → agent surface (e.g. `bmad-agent-pm.toml` with `persistent_facts`, `principles`).\n- One workflow only → workflow surface (e.g. `bmad-create-prd.toml` with `activation_steps_prepend`).\n- Several specific workflows → multiple workflow overrides in sequence, not an agent override.\n\n**Single-surface heuristic:**\n- Workflow-level: template swap, output path, step-specific behavior, or a named scalar already exposed (`*_template`, `on_complete`). Surgical, reliable.\n- Agent-level: persona, communication style, org-wide facts, menu changes, behavior that should apply to every workflow the agent dispatches.\n\nWhen ambiguous, present both with tradeoff, recommend one, let the user decide.\n\nIntent outside the exposed surface (step logic, ordering, anything not in `customize.toml`): say so; offer `activation_steps_prepend`\u002F`append` or `persistent_facts` as approximations, or recommend `bmad-builder` to create a custom skill.\n\n## Step 4: Compose the override\n\nTranslate plain-English into TOML against the target's `customize.toml` fields. If an existing override was read, frame the change as additive.\n\nMerge semantics:\n- **Scalars** (`icon`, `role`, `*_template`, `on_complete`) — override wins.\n- **Append arrays** (`persistent_facts`, `activation_steps_prepend`\u002F`append`, `principles`) — team\u002Fuser entries append in order.\n- **Keyed arrays of tables** (menu items with `code` or `id`) — matching keys replace, new keys append.\n\nOverrides are sparse: only the fields being changed. Never copy the whole `customize.toml`.\n\n**Template swap** (`*_template` scalar): offer to copy the default template to `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}-{purpose}-template.md`, point the override at the new path, offer to help edit it.\n\n## Step 5: Team or user placement\n\nUnder `{project-root}\u002F_bmad\u002Fcustom\u002F`:\n- `{skill-name}.toml` — team, committed. Policies, org conventions, compliance.\n- `{skill-name}.user.toml` — user, gitignored. Personal tone, private facts, shortcuts.\n\nDefault by character (policy → team, personal → user), confirm before writing.\n\n## Step 6: Show, confirm, write, verify\n\n1. Show the full TOML. If the file exists, show a diff. Never silently overwrite.\n2. Wait for explicit yes.\n3. Write. Create `{project-root}\u002F_bmad\u002Fcustom\u002F` if needed.\n4. Verify:\n   ```\n   python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill \u003Cinstall-path> --key \u003Cagent-or-workflow>\n   ```\n   Show the merged output, point out the changed fields.\n\n   **Resolver missing or fails:** read whichever layers exist — `\u003Cinstall-path>\u002Fcustomize.toml` (base), `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` (team), `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` (user) — apply base → team → user with the same merge rules (scalars override, tables deep-merge, `code`\u002F`id`-keyed arrays merge by key, all other arrays append), describe how the changed fields resolve.\n\n   **Verify shows override didn't land** (field unchanged, merge conflict, file not picked up): re-enter Step 4 with the verify output as context. Usually wrong field name, wrong merge mode (scalar vs array), or wrong scope.\n5. Summarize what changed, where the file lives, how to iterate. Remind the user to commit team overrides.\n\n## Complete when\n\n- Override file written (or user explicitly aborted).\n- User has seen resolver output (or manual fallback merge summary).\n- User has acknowledged the summary.\n\nOtherwise the skill isn't done — finish or tell the user they're exiting incomplete.\n\n## When this skill can't help\n\n- **Central config** (`{project-root}\u002F_bmad\u002Fcustom\u002Fconfig.toml`) — see the [How to Customize BMad guide](https:\u002F\u002Fdocs.bmad-method.org\u002Fhow-to\u002Fcustomize-bmad\u002F).\n- **Step logic, ordering, behavior not in `customize.toml`** — open a feature request, or use `bmad-builder` to create a custom skill. Offer to help with either.\n- **Skills without a `customize.toml`** — not customizable.\n","# BMad Customize\n\nTranslate the user's intent into a correctly-placed TOML override file under `{project-root}\u002F_bmad\u002Fcustom\u002F` for a customizable agent or workflow skill. Discover, route, author, write, verify.\n\nScope v1: per-skill `[agent]` overrides (`bmad-agent-\u003Crole>.toml` \u002F `.user.toml`) and per-skill `[workflow]` overrides (`bmad-\u003Cworkflow>.toml` \u002F `.user.toml`). Central config (`{project-root}\u002F_bmad\u002Fcustom\u002Fconfig.toml`) is out of scope — point users at the [How to Customize BMad guide](https:\u002F\u002Fdocs.bmad-method.org\u002Fhow-to\u002Fcustomize-bmad\u002F).\n\nWhen the target's `customize.toml` doesn't expose what the user wants, say so plainly. Don't invent fields.\n\n## Preflight\n\n- No `{project-root}\u002F_bmad\u002F` → BMad isn't installed. Say so, stop.\n- `{project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py` missing → continue, but Step 6 verify falls back to manual merge.\n- Both present → proceed.\n\n## Activation\n\nLoad `_bmad\u002Fconfig.toml` and `_bmad\u002Fconfig.user.toml` from `{project-root}` for `user_name` (default `BMad`) and `communication_language` (default `English`). Greet. If the user's invocation already names a target skill AND a specific change, jump to Step 3.\n\n## Step 1: Classify intent\n\n- **Directed** — specific skill + specific change → Step 3.\n- **Exploratory** — \"what can I customize?\" → Step 2.\n- **Audit\u002Fiterate** — wants to review or change something already customized → Step 2, lead with skills that have existing overrides; read the existing override in Step 3 before composing.\n- **Cross-cutting** — could live on multiple surfaces → Step 3, choose agent vs workflow explicitly with the user.\n\n## Step 2: Discovery\n\n```\npython3 {skill-root}\u002Fscripts\u002Flist_customizable_skills.py --project-root {project-root}\n```\n\nUse `--extra-root \u003Cpath>` (repeatable) if the user has skills installed in additional locations.\n\nGroup the returned `agents` and `workflows` for the user; for each show name, description, whether `has_team_override` or `has_user_override` is true. Surface any `errors[]`. For audit\u002Fiterate intents, lead with already-overridden entries.\n\nEmpty list: show `scanned_roots`, ask whether skills live elsewhere (offer `--extra-root`); otherwise stop.\n\n## Step 3: Determine the right surface\n\nRead the target's `customize.toml`. Top-level `[agent]` or `[workflow]` block defines the surface.\n\nIf a team or user override already exists, read it first and summarize what's already overridden before composing.\n\n**Cross-cutting intent — walk both surfaces with the user:**\n- Every workflow a given agent runs → agent surface (e.g. `bmad-agent-pm.toml` with `persistent_facts`, `principles`).\n- One workflow only → workflow surface (e.g. `bmad-create-prd.toml` with `activation_steps_prepend`).\n- Several specific workflows → multiple workflow overrides in sequence, not an agent override.\n\n**Single-surface heuristic:**\n- Workflow-level: template swap, output path, step-specific behavior, or a named scalar already exposed (`*_template`, `on_complete`). Surgical, reliable.\n- Agent-level: persona, communication style, org-wide facts, menu changes, behavior that should apply to every workflow the agent dispatches.\n\nWhen ambiguous, present both with tradeoff, recommend one, let the user decide.\n\nIntent outside the exposed surface (step logic, ordering, anything not in `customize.toml`): say so; offer `activation_steps_prepend`\u002F`append` or `persistent_facts` as approximations, or recommend `bmad-builder` to create a custom skill.\n\n## Step 4: Compose the override\n\nTranslate plain-English into TOML against the target's `customize.toml` fields. If an existing override was read, frame the change as additive.\n\nMerge semantics:\n- **Scalars** (`icon`, `role`, `*_template`, `on_complete`) — override wins.\n- **Append arrays** (`persistent_facts`, `activation_steps_prepend`\u002F`append`, `principles`) — team\u002Fuser entries append in order.\n- **Keyed arrays of tables** (menu items with `code` or `id`) — matching keys replace, new keys append.\n\nOverrides are sparse: only the fields being changed. Never copy the whole `customize.toml`.\n\n**Template swap** (`*_template` scalar): offer to copy the default template to `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}-{purpose}-template.md`, point the override at the new path, offer to help edit it.\n\n## Step 5: Team or user placement\n\nUnder `{project-root}\u002F_bmad\u002Fcustom\u002F`:\n- `{skill-name}.toml` — team, committed. Policies, org conventions, compliance.\n- `{skill-name}.user.toml` — user, gitignored. Personal tone, private facts, shortcuts.\n\nDefault by character (policy → team, personal → user), confirm before writing.\n\n## Step 6: Show, confirm, write, verify\n\n1. Show the full TOML. If the file exists, show a diff. Never silently overwrite.\n2. Wait for explicit yes.\n3. Write. Create `{project-root}\u002F_bmad\u002Fcustom\u002F` if needed.\n4. Verify:\n   ```\n   python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill \u003Cinstall-path> --key \u003Cagent-or-workflow>\n   ```\n   Show the merged output, point out the changed fields.\n\n   **Resolver missing or fails:** read whichever layers exist — `\u003Cinstall-path>\u002Fcustomize.toml` (base), `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` (team), `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` (user) — apply base → team → user with the same merge rules (scalars override, tables deep-merge, `code`\u002F`id`-keyed arrays merge by key, all other arrays append), describe how the changed fields resolve.\n\n   **Verify shows override didn't land** (field unchanged, merge conflict, file not picked up): re-enter Step 4 with the verify output as context. Usually wrong field name, wrong merge mode (scalar vs array), or wrong scope.\n5. Summarize what changed, where the file lives, how to iterate. Remind the user to commit team overrides.\n\n## Complete when\n\n- Override file written (or user explicitly aborted).\n- User has seen resolver output (or manual fallback merge summary).\n- User has acknowledged the summary.\n\nOtherwise the skill isn't done — finish or tell the user they're exiting incomplete.\n\n## When this skill can't help\n\n- **Central config** (`{project-root}\u002F_bmad\u002Fcustom\u002Fconfig.toml`) — see the [How to Customize BMad guide](https:\u002F\u002Fdocs.bmad-method.org\u002Fhow-to\u002Fcustomize-bmad\u002F).\n- **Step logic, ordering, behavior not in `customize.toml`** — open a feature request, or use `bmad-builder` to create a custom skill. Offer to help with either.\n- **Skills without a `customize.toml`** — not customizable.\n",{"name":5,"description":7},"main","6a38430d5c23377d52d12343bfc156063f577e1d",".agents\u002Fskills\u002Fbmad-customize","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR","https:\u002F\u002Fgithub.com\u002Fjsacko","2026-06-22 14:57:27",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add jsacko\u002FOpenDFIR --skill bmad-customize",{"tool":55,"command":56},"bunx","bunx skills add jsacko\u002FOpenDFIR --skill bmad-customize",{"tool":58,"command":59},"pnpm","pnpm dlx skills add jsacko\u002FOpenDFIR --skill bmad-customize","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbmad-customize\u002FSKILL.md",true,[63,69],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"scripts\u002Flist_customizable_skills.py","SCRIPT","脚本",8061,"https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbmad-customize\u002Fscripts\u002Flist_customizable_skills.py",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"scripts\u002Ftests\u002Ftest_list_customizable_skills.py",9245,"https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fbmad-customize\u002Fscripts\u002Ftests\u002Ftest_list_customizable_skills.py",[74,100,119,138,159,172],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":81,"publishedAt":38},"01M71PW68SHKJ6357YZJH4ES0E","agent-tonin","Pressure-tests incident response product design against real SOC and DFIR constraints. Use when the user asks to talk to Tonin, requests the Incident Response Strategist, or needs a senior security design partner to challenge incident response automation ideas.","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002Fskills\u002Fagent-tonin\u002FSKILL.md",[80],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[82,83,84,85,86,87,88,89,28,29,90,91,92,93,94,95,96,97,98,99],"agent tonin","ideas","senior security","dfir","incident","challenge","tests","design","product design","automation","incident response","soc","design partner","requests","product","senior","strategist","security",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":107,"publishedAt":38},"01M71PW3BV6P3JK7MFN31TA61D","bmad-workflow-builder","Builds, converts, and analyzes workflows and skills. Use when the user requests to \"build a workflow\", \"modify a workflow\", \"quality check workflow\", \"analyze skill\", or \"convert a skill\".","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-workflow-builder\u002FSKILL.md",[106],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[108,31,109,25,110,95,37,36,111,112,113,114,115,29,116,28,117,118],"builder","workflow builder","bmad workflow builder","quality","build","analyze","check","convert","workflows","quality check","modify",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":130,"publishedAt":38},"01M71PW0ETTF8DA2C6HB77FPNX","bmad-validate-prd","Validate a PRD against standards. Use when the user says \"validate this PRD\" or \"run PRD validation\"","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-validate-prd\u002FSKILL.md",[125],{"categoryNo":126,"categoryName":127,"taxonomyType":128,"taxonomyTypeDesc":129},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[131,132,25,133,134,135,28,29,136,137,37],"validate","bmad validate prd","prd","validate prd","standards","run","validation",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":147,"publishedAt":38},"01M71PVY254CKN2PNAEX41CRR9","bmad-technical-research","Conduct technical research on technologies and architecture. Use when the user says they would like to do or produce a technical research report","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-technical-research\u002FSKILL.md",[144],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[148,149,150,25,151,152,153,154,28,29,155,156,157,158,37],"technical research","bmad technical research","technical","research","conduct","do","produce","architecture","to do","research report","report",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":38},"01M71PVWCA63WBH08JHVV6WV75","bmad-sprint-status","Summarize sprint status and surface risks. Use when the user says \"check sprint status\" or \"show sprint status\"","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-status\u002FSKILL.md",[],[166,25,167,168,169,37,114,170,29,28,171],"status","bmad sprint status","sprint","sprint status","summarize","show",{"skillNo":173,"name":174,"nameZh":6,"description":175,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":38},"01M71PVT03ZW4PQVV5TZDNPBXH","bmad-sprint-planning","Generate sprint status tracking from epics. Use when the user says \"run sprint planning\" or \"generate sprint plan\"","https:\u002F\u002Fgithub.com\u002Fjsacko\u002FOpenDFIR\u002Fblob\u002Fmain\u002F.continue\u002Fskills\u002Fbmad-sprint-planning\u002FSKILL.md",[],[168,179,180,25,181,166,37,182,183,136,184,169,185,29,28],"bmad sprint planning","planning","sprint planning","sprint plan","tracking","generate","plan"]