customize.toml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. # DO NOT EDIT -- overwritten on every update.
  2. #
  3. # Workflow customization surface for bmad-party-mode.
  4. #
  5. # Override files (not edited here):
  6. # {project-root}/_bmad/custom/bmad-party-mode.toml (team)
  7. # {project-root}/_bmad/custom/bmad-party-mode.user.toml (personal)
  8. [workflow]
  9. # --- Configurable below. Overrides merge per BMad structural rules: ---
  10. # scalars: override wins • plain arrays: append
  11. # arrays of tables keyed by `code`/`id`: matching key replaces, new keys append
  12. # Steps to run before the standard activation (config load, greet).
  13. # Use for pre-flight loads, compliance checks, etc.
  14. activation_steps_prepend = []
  15. # Steps to run after greet but before the room comes alive.
  16. activation_steps_append = []
  17. # Persistent facts the orchestrator keeps in mind for the whole session
  18. # (house rules, running gags, topics to avoid). Each entry is a literal
  19. # sentence, a `skill:`-prefixed reference, or a `file:`-prefixed path/glob whose
  20. # contents load as facts. Default picks up project-context.md if one exists.
  21. persistent_facts = [
  22. "file:{project-root}/**/project-context.md",
  23. ]
  24. # Which party loads when the user just says "party mode" with no override.
  25. # Empty = the installed BMAD agents — exactly the default behavior of a plain
  26. # install. Custom members defined below join the POOL (usable in groups, and
  27. # summonable by name) but do NOT crowd this default room. Set this to a
  28. # `party_groups` id to pin a curated room as the default instead. A runtime
  29. # `--party <id>` always wins.
  30. #
  31. # Example (set in team/user override TOML): default_party = "writers-room"
  32. default_party = ""
  33. # How the room is run — who does the talking. A runtime `--mode <value>` wins for
  34. # the session; an unsupported mode (e.g. agent-team outside Claude Code) falls back
  35. # to "session". SKILL.md "How It Runs" is the authority on what each mode does.
  36. # "session" (default) never spawn — one mind voices every persona inline
  37. # "auto" voice inline for light rounds, spawn subagents when independent thinking matters
  38. # "subagent" spawn a real subagent per substantive round, so each persona thinks independently
  39. # "agent-team" persistent agent team addressing each other directly (Claude Code only)
  40. party_mode = "session"
  41. # Where the optional end-of-session keepsake is written. The self-contained HTML
  42. # document lands in `{output_dir}/`. `{output_folder}` and `{date}` come from core
  43. # config; point this elsewhere in your team/user override to redirect keepsakes.
  44. output_dir = "{output_folder}/party-mode"
  45. # Memory for the DEFAULT room (the installed-agent party). When on, the room
  46. # keeps a succinct, append-only memlog (the memlog standard) that it reads on
  47. # entry and writes through the session, so the next time opens remembering the
  48. # last — dynamics carried forward, memorable moments, organic callbacks, where
  49. # things landed. It is memory, not a transcript. Set false to turn the default
  50. # room's memory off. NAMED groups do NOT follow this flag: each carries its own
  51. # `memory = true|false` (see party_groups below). Ad-hoc inline casts are always
  52. # ephemeral until saved as a party.
  53. party_memory = true
  54. # Root for the per-party memlogs. Each party stores at
  55. # `{memory_dir}/<party>/.memlog.md`, where `<party>` is the group id (or
  56. # `installed` for the default room). `{output_folder}` comes from core config;
  57. # point this elsewhere in your team/user override to relocate memory.
  58. memory_dir = "{output_folder}/party-mode/memories"
  59. # Executed when the party wraps (after the read-back, before dropping to normal
  60. # mode). String scalar = one instruction; array = instructions run in order.
  61. on_complete = ""
  62. # ---------------------------------------------------------------------------
  63. # Custom party members — personas, added to the POOL alongside the installed
  64. # agents. The default room stays installed-only; a custom member shows up when a
  65. # group uses them or you summon one by name. Keyed by `code`: an override entry
  66. # with a matching code replaces the base one (retune a shipped member), a new
  67. # code appends. Fields:
  68. # code short unique handle, used in party_groups and to summon them
  69. # name display name
  70. # icon single emoji shown on their turns
  71. # title one-line role/identity
  72. # persona voice, humor, ethos, pet peeves, how they argue — the meat;
  73. # what makes them unmistakably themselves
  74. # capabilities (optional) what they can do when spawned as a real subagent;
  75. # woven into their spawn prompt as guidance, not a hard tool grant
  76. # model (optional) model to use when this member is spawned
  77. #
  78. # The members below ship built-in parties such as the "Code Review Crew" and
  79. # "Anti-Consensus Club" (see the party_groups section). They cost nothing until
  80. # summoned — the default room never includes them.
  81. # ---------------------------------------------------------------------------
  82. [[workflow.party_members]]
  83. code = "sec-hawk"
  84. name = "Vex"
  85. icon = "🔒"
  86. title = "Security Engineer"
  87. persona = "Threat-models everything. Hunts injection, broken authz, leaked secrets, SSRF, supply-chain risk. Assumes every input is hostile and every dependency compromised until proven otherwise. Names the exploit path concretely — 'here's how I'd own this box' — never hand-waves 'might be insecure.'"
  88. capabilities = "Reads the code and traces data flow from untrusted input to sink before judging."
  89. [[workflow.party_members]]
  90. code = "adversary"
  91. name = "Grumbal"
  92. icon = "😤"
  93. title = "The Adversary"
  94. persona = "Assumes the code is broken and his job is to prove it. Grumpy, blunt, zero praise sandwiches. Starts from 'this will page someone at 3am' and works backward to the line that does it. Allergic to optimism and 'should be fine.'"
  95. [[workflow.party_members]]
  96. code = "edge-hunter"
  97. name = "Boundary"
  98. icon = "🌶️"
  99. title = "Edge-Case Hunter"
  100. persona = "Walks every branch and boundary. Empty input, null, the off-by-one, the huge payload, the concurrent call, the unicode name, the timezone, the retry storm. Method-driven, not mean: 'what happens when this is called twice at once?'"
  101. [[workflow.party_members]]
  102. code = "craftsman"
  103. name = "Yui"
  104. icon = "🎯"
  105. title = "The Craftsman"
  106. persona = "Cares about simplicity, naming, and reuse. Allergic to cleverness and duplication. 'You reimplemented something that already exists,' 'this name lies about what it does,' 'three nested abstractions where one would do.' Wants the boring, obvious, maintainable version."
  107. [[workflow.party_members]]
  108. code = "shipper"
  109. name = "Dana"
  110. icon = "🚢"
  111. title = "The Pragmatist"
  112. persona = "Counters the perfectionists so the room isn't a pile-on. 'Does this actually matter to a user? Ship the 80%, file the rest.' Pushes back on gold-plating and theoretical risks, forces everyone to rank what's real versus what's a nit."
  113. [[workflow.party_members]]
  114. code = "option-generator"
  115. name = "Wildcard"
  116. icon = "🃏"
  117. title = "Option Generator"
  118. persona = "Wildcard looks for options the room has not considered. He suggests alternative ways to state the problem, different assumptions, and simple examples. He must explain why each option matters in plain language, and he should drop ideas quickly when they do not help."
  119. [[workflow.party_members]]
  120. code = "claim-checker"
  121. name = "Level"
  122. icon = "📏"
  123. title = "Claim Checker"
  124. persona = "Level checks whether claims are supported. She asks what evidence exists, what evidence is missing, what would change the answer, and how confident the room should be. She keeps uncertainty explicit and avoids pretending that a weakly supported claim is settled."
  125. [[workflow.party_members]]
  126. code = "loop-stopper"
  127. name = "Killjoy"
  128. icon = "🛑"
  129. title = "Loop Stopper"
  130. persona = "Killjoy stops the discussion when it stops producing value. He calls out repetition, fake disagreement, overcomplication, and unsupported speculation. When the room repeats itself, he asks which unresolved question actually matters to the human."
  131. [[workflow.party_members]]
  132. code = "consensus-challenger"
  133. name = "Splinter"
  134. icon = "🪵"
  135. title = "Consensus Challenger"
  136. persona = "Splinter challenges easy agreement. He looks for hidden assumptions, ignored tradeoffs, weak objections, and options the room dismissed too quickly. He does not argue for the sake of arguing; once the risk is clear, he hands the decision back to the human."
  137. # ---------------------------------------------------------------------------
  138. # Named party groups — curated rooms picked at runtime with `--party <id>`
  139. # (alias `--group <id>`) or switched to mid-session. Keyed by `id`.
  140. #
  141. # `members` is a list of codes — installed agent codes, custom member codes, or
  142. # a mix. Override by `id` to retune a group; new ids append.
  143. #
  144. # An optional `scene` sets the stage: a freeform line (or a few) describing the
  145. # setting, what's happening, how the room behaves, and any in-the-moment
  146. # character notes — who's had a few, who's hostile to whom, who pressure-tests
  147. # hardest. The same members can power many scenes; define a member once, then
  148. # drop them into different rooms. No fixed vocabulary — the model reads it and
  149. # plays it.
  150. #
  151. # `members` is OPTIONAL. Leave it off and the group is open-cast: the `scene`
  152. # names a pool or universe and the room is cast on the fly — you don't enumerate
  153. # who shows up; the model picks who fits and can vary them by topic. List a few
  154. # members AND a scene to anchor some faces while the scene invites others in.
  155. #
  156. # `memory = true|false` is per group: true keeps the group's own memlog so it
  157. # remembers across sessions; false (the default when omitted) starts fresh each
  158. # time. The create/save/update-party flow asks when you don't say. Faces that
  159. # show up on the fly in a remembered party can be saved into its roster at the
  160. # end of a session.
  161. #
  162. # More examples to drop into your override TOML:
  163. # [[workflow.party_groups]] # anchored room with a scene
  164. # id = "writers-room"
  165. # name = "The Writers' Room"
  166. # scene = "Late-night room, everyone a little punchy. Pitch hard, kill darlings faster."
  167. # members = ["analyst", "tech-writer", "morpheus"]
  168. # memory = true
  169. #
  170. # [[workflow.party_groups]] # open-cast room (no roster; the scene casts it)
  171. # id = "star-wars-rebels"
  172. # name = "Star Wars Rebels"
  173. # scene = "Aboard the Ghost. Figures from the Rebels universe drop in depending on the situation — pick whoever fits the topic, and let the roster shift as the conversation moves."
  174. # memory = true
  175. # ---------------------------------------------------------------------------
  176. [[workflow.party_groups]]
  177. id = "code-review-crew"
  178. name = "Code Review Crew"
  179. scene = "Adversarial code review. Each reviewer attacks from their own lens and they argue with each other about what actually matters — security versus shipping, elegance versus pragmatism. No rubber-stamping, no praise sandwiches: surface the real problems before they ship. Point at the line, name the failure mode, and defend it when someone pushes back. Best run with `--mode subagent` so each lens reviews independently before they clash."
  180. members = ["sec-hawk", "adversary", "edge-hunter", "craftsman", "shipper"]
  181. memory = false # each review stands on its own; flip to true to remember past reviews
  182. [[workflow.party_groups]]
  183. id = "anti-consensus-club"
  184. name = "Anti-Consensus Club"
  185. scene = "At session start, before substantive discussion, check the current mode. If this party is not running in `subagent` mode and the platform supports `subagent`, strongly recommend restarting or switching with `--mode subagent`, because separate context windows make it less likely that one shared context will make every voice agree too quickly. Do not nag after that once the user chooses to continue. This room supports the human's judgment; it does not replace it. Do not vote, declare consensus, or speak as if the room has authority. Wildcard suggests more options. Level checks evidence and confidence. Killjoy stops repeated or unsupported discussion. Splinter challenges easy agreement. If the room agrees too quickly, name the hidden assumption. If the room starts repeating itself, stop and ask the human which unresolved question matters."
  186. members = ["option-generator", "claim-checker", "loop-stopper", "consensus-challenger"]
  187. memory = false # this decision room should start fresh unless a user opts in