feat(skills): add TOML-based skill customization system#28
feat(skills): add TOML-based skill customization system#28
Conversation
Add customize.toml to all 10 skills (6 agents with full persona + metadata, 4 workflows with stock fields). Include resolve-customization.py script in each skill's scripts/ directory. Add customization resolve and inject points to all workflow SKILL.md files.
|
Warning Rate limit exceeded
Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 59 minutes and 59 seconds. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (30)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 Augment PR SummarySummary: This PR introduces a TOML-driven customization layer for CIS skills so teams and individuals can override default skill metadata/personas and workflow inject points. Changes:
Technical Notes: Resolver searches for the project root by walking up to a directory containing 🤖 Was this summary useful? React with 👍 or 👎 |
| with open(path, "rb") as f: | ||
| return tomllib.load(f) | ||
| except Exception as exc: | ||
| print(f"warning: failed to parse {path}: {exc}", file=sys.stderr) |
There was a problem hiding this comment.
load_toml() returns {} on parse errors (and on missing files), so a malformed override (or an unexpectedly missing defaults file) can silently produce “valid” merged JSON while exiting 0. Consider failing fast (non-zero exit) for these cases so customization mistakes don’t get silently ignored.
Severity: medium
Other Locations
src/skills/bmad-cis-agent-creative-problem-solver/scripts/resolve-customization.py:51src/skills/bmad-cis-agent-design-thinking-coach/scripts/resolve-customization.py:51src/skills/bmad-cis-agent-innovation-strategist/scripts/resolve-customization.py:51src/skills/bmad-cis-agent-presentation-master/scripts/resolve-customization.py:51src/skills/bmad-cis-agent-storyteller/scripts/resolve-customization.py:51src/skills/bmad-cis-design-thinking/scripts/resolve-customization.py:51src/skills/bmad-cis-innovation-strategy/scripts/resolve-customization.py:51src/skills/bmad-cis-problem-solving/scripts/resolve-customization.py:51src/skills/bmad-cis-storytelling/scripts/resolve-customization.py:51
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
|
|
||
| def merge_menu(base: list[dict], override: list[dict]) -> list[dict]: | ||
| """Merge-by-code: matching codes replace; new codes append.""" | ||
| result_by_code: dict[str, dict] = {item["code"]: dict(item) for item in base} |
There was a problem hiding this comment.
_is_menu_array() only checks the first element for a code key, but merge_menu() assumes every element has item["code"], which can raise KeyError and crash on partially malformed [[menu]] arrays. Consider validating all items (or handling missing code) to make the merge behavior robust.
Severity: low
Other Locations
src/skills/bmad-cis-agent-creative-problem-solver/scripts/resolve-customization.py:71src/skills/bmad-cis-agent-design-thinking-coach/scripts/resolve-customization.py:71src/skills/bmad-cis-agent-innovation-strategist/scripts/resolve-customization.py:71src/skills/bmad-cis-agent-presentation-master/scripts/resolve-customization.py:71src/skills/bmad-cis-agent-storyteller/scripts/resolve-customization.py:71src/skills/bmad-cis-design-thinking/scripts/resolve-customization.py:71src/skills/bmad-cis-innovation-strategy/scripts/resolve-customization.py:71src/skills/bmad-cis-problem-solving/scripts/resolve-customization.py:71src/skills/bmad-cis-storytelling/scripts/resolve-customization.py:71
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.
Change except Exception to except (tomllib.TOMLDecodeError, OSError) for clearer failure signaling in user-facing tooling.
Refactor all 6 CIS agent SKILL.md files to resolve persona, inject, additional_resources, and menu from customize.toml at activation. Remove hardcoded Identity, Communication Style, and Principles sections.
- Drop ./ prefix from script paths (use scripts/ not ./scripts/) - Use python3 instead of python for explicitness - Add Available Scripts listing to all SKILL.md files
- Fix merge_menu KeyError crash when menu items missing 'code' key - Fix _is_menu_array to check ALL elements, not just first - Remove unused import os from resolve-customization.py - Remove inject.after from agent activation and customize.toml
- Add type: ignore[arg-type] to merge_menu call (Pylance narrowing limitation) - Reword inject.before in workflows: "prepend to active instructions and follow it" - Reword inject.after in workflows: "append to active instructions and follow it" - Make additional_resources lazy: note list but don't eagerly load
|
Closing - skill customization consolidating to bmad-bmm only |
Summary
customize.tomlto all 10 skills: 6 agents with full persona + metadata sections, 4 workflows with stock fieldsresolve-customization.pyscript in each skill'sscripts/directory for three-layer TOML merge (user > team > defaults)Part of the cross-module skill customization initiative. See bmad-code-org/BMAD-METHOD#2262 for the core implementation.
Test plan
🤖 Generated with Claude Code