-
Notifications
You must be signed in to change notification settings - Fork 3
Rename the toolbox plugin to core-tools #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| module = "toolbox" | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-toolbox" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| module = "toolbox" | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-toolbox" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| module = "toolbox" | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-toolbox" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,4 +1,4 @@ | ||
| module = "toolbox" | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-toolbox" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module = "core-tools" | ||
| version = "6.13.0-next" | ||
| update_source = "plugin:bmad-core-tools" | ||
| knowledge = "`references/help.md` in the `bmad` skill" |
This file was deleted.
This file was deleted.
This file was deleted.
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,10 +10,16 @@ | |
|
|
||
| Routing: SOURCES maps each source repo to the modules it ships, and a skill's | ||
| `module` key names the plugin directory it ships in, so a module comes | ||
| entirely from the one source that declares it. Each manifest must carry | ||
| exactly the keys module, version, update_source, and knowledge -- | ||
| update_source naming its own source repo, and version and knowledge each | ||
| identical across every skill in its module, whatever they say. | ||
| entirely from the one source that declares it. Each manifest must carry the | ||
| keys module, version, update_source and knowledge -- update_source naming its | ||
| own source repo, and version identical across every skill in its module, | ||
| whatever it says. Any other key is the skill's own business: the runtime | ||
| ignores keys it does not know, so this script does too. | ||
|
|
||
| knowledge lists documents inside the skill that names them, requires is what | ||
| that skill cannot work without, and recommends is what it works better with. | ||
| All three belong to the skill rather than the module, so skills of one module | ||
| may differ on any of them. All three are copied through untouched. | ||
|
|
||
| A version belongs to a module, not to a release of this repo: what a plugin | ||
| ships as is its own module's version, and two modules need not agree, whether | ||
|
|
@@ -39,7 +45,7 @@ | |
| # Source repo -> the modules it ships. A module name is both the plugin | ||
| # directory (plugins/<module>) and the plugin itself (bmad-<module>). | ||
| SOURCES = { | ||
| "bmad-code-org/BMAD-METHOD": ("method", "toolbox"), | ||
| "bmad-code-org/BMAD-METHOD": ("method", "core-tools"), | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift 🔎 Supported by static analysis🏁 Script executed: #!/bin/bash
set -o pipefail
printf '%s\n' '--- release.py outline ---'
ast-grep outline release.py 2>/dev/null || true
printf '%s\n' '--- relevant release.py symbols and references ---'
rg -n -C 8 'SOURCES|collect_skills|core-tools|BMAD-METHOD|knowledge|module' release.py
printf '%s\n' '--- repository references to BMAD-METHOD/core-tools ---'
rg -n -C 3 'BMAD-METHOD|core-tools|collect_skills|knowledge' --glob '!release.py' . | head -n 300
printf '%s\n' '--- repository files likely to define release inputs ---'
git ls-files | rg '(^|/)(README|CHANGELOG|release|pyproject|requirements|package|manifest|config|sources?)' | head -n 200Repository: bmad-code-org/bmad-plugins Length of output: 40372 🏁 Script executed: #!/bin/bash
set -o pipefail
python3 - <<'PY'
import json
import urllib.request
base = "https://api.github.com/repos/bmad-code-org/BMAD-METHOD"
headers = {"Accept": "application/vnd.github+json", "User-Agent": "CodeRabbit-review"}
def get(path):
req = urllib.request.Request(base + path, headers=headers)
with urllib.request.urlopen(req, timeout=15) as response:
return json.load(response)
repo = get("")
branch = repo["default_branch"]
print("default_branch:", branch)
tree = get(f"/git/trees/{branch}?recursive=1")
paths = [item["path"] for item in tree.get("tree", []) if item.get("type") == "blob"]
manifests = [p for p in paths if p.endswith("module-manifest.toml")]
print("manifest_count:", len(manifests))
for path in manifests:
if "/skills/" in path:
print("manifest:", path)
if path.split("/")[1:2] == ["skills"] or "/core-tools/" in path or "/core-tools" in path:
pass
core = [p for p in manifests if "core-tools" in p]
print("core_tools_manifest_count:", len(core))
for path in core[:20]:
print("core_tools_manifest:", path)
data = get("/contents/" + path + "?ref=" + urllib.parse.quote(branch, safe=""))
import base64
text = base64.b64decode(data["content"]).decode()
print(text[:1000].rstrip())
PYRepository: bmad-code-org/bmad-plugins Length of output: 2484 🌐 Web query:
💡 Result: <search_synthesis> <source_evidence> Citations:
Align the upstream release contract before merge.
🤖 Prompt for AI Agents |
||
| } | ||
| PLUGINS = tuple(module for modules in SOURCES.values() for module in modules) | ||
| MANIFEST_KEYS = frozenset({"module", "version", "update_source", "knowledge"}) | ||
|
|
@@ -69,15 +75,24 @@ def read_manifest(skill_dir, slug): | |
| manifest = tomllib.load(f) | ||
| except tomllib.TOMLDecodeError as e: | ||
| fail(f"{slug}/{skill_dir.name}: {e}") | ||
| if set(manifest) != MANIFEST_KEYS: | ||
| fail( | ||
| f"{slug}/{skill_dir.name}: keys must be exactly {', '.join(sorted(MANIFEST_KEYS))}; " | ||
| f"found {', '.join(sorted(manifest)) or 'none'}" | ||
| ) | ||
| # The runtime ignores keys it does not know, so a build must not refuse them. | ||
| missing = MANIFEST_KEYS - set(manifest) | ||
| if missing: | ||
| fail(f"{slug}/{skill_dir.name}: manifest is missing {', '.join(sorted(missing))}") | ||
| if manifest["update_source"] != update_source(slug): | ||
| fail(f"{slug}/{skill_dir.name}: update_source must be exactly {update_source(slug)!r}") | ||
| if not isinstance(manifest["knowledge"], str) or not manifest["knowledge"].strip(): | ||
| fail(f"{slug}/{skill_dir.name}: knowledge must be a non-empty string") | ||
| knowledge = manifest["knowledge"] | ||
| if not isinstance(knowledge, list) or not knowledge: | ||
| fail(f"{slug}/{skill_dir.name}: knowledge must be a non-empty list of paths inside the skill") | ||
| for entry in knowledge: | ||
| if not isinstance(entry, str) or not entry: | ||
| fail(f"{slug}/{skill_dir.name}: knowledge has invalid value {entry!r}") | ||
| # The plugin ships a copy of the skill, so a document must live inside it. | ||
| parts = entry.split("/") | ||
| if entry.startswith("/") or "://" in entry or "\\" in entry or ":" in entry or ".." in parts: | ||
| fail(f"{slug}/{skill_dir.name}: knowledge has unsafe value {entry!r}") | ||
| if not (skill_dir / entry).is_file(): | ||
| fail(f"{slug}/{skill_dir.name}: knowledge names {entry!r}, which the skill does not ship") | ||
| return manifest | ||
|
|
||
|
|
||
|
|
@@ -100,14 +115,14 @@ def collect_skills(skills_root, slug, modules): | |
| for module, entries in found.items(): | ||
| if not entries: | ||
| fail(f"{slug} ships no skills for module `{module}`") | ||
| # A module speaks for itself, so these values are whatever it says -- | ||
| # but every skill in one module must say the same thing. Modules need | ||
| # not agree with each other, even within one source repo. | ||
| for key in ("version", "knowledge"): | ||
| values = {skill_dir.name: manifest[key] for skill_dir, manifest in entries} | ||
| if len(set(values.values())) > 1: | ||
| detail = ", ".join(f"{name}={value!r}" for name, value in sorted(values.items())) | ||
| fail(f"module `{module}` skills disagree on {key}: {detail}") | ||
| # A module speaks for itself, so its version is whatever it says -- but | ||
| # every skill in one module must agree, because the plugin ships as one | ||
| # version. Modules need not agree with each other, even within one | ||
| # source repo. knowledge, requires and recommends are per-skill. | ||
| versions = {skill_dir.name: manifest["version"] for skill_dir, manifest in entries} | ||
| if len(set(versions.values())) > 1: | ||
| detail = ", ".join(f"{name}={value!r}" for name, value in sorted(versions.items())) | ||
| fail(f"module `{module}` skills disagree on version: {detail}") | ||
| collected[module] = ([skill_dir for skill_dir, _ in entries], entries[0][1]["version"]) | ||
| return collected | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
Repository: bmad-code-org/bmad-plugins
Length of output: 50382
🏁 Script executed:
Repository: bmad-code-org/bmad-plugins
Length of output: 7317
🏁 Script executed:
Repository: bmad-code-org/bmad-plugins
Length of output: 18018
Align the
knowledgeschema across release and packaged-manifest consumers.release.pyrejects the current string in all eight manifests. Do not only change the values to["references/help.md"]:setup.pycurrently requiresknowledgeto remain a non-empty string, and seven affected skills do not ship that path. Update both consumers and each manifest to use one consistent schema with paths that exist inside the owning skill.📍 Affects 8 files
plugins/core-tools/skills/bmad-forge-idea/module-manifest.toml#L4-L4(this comment)plugins/core-tools/skills/bmad-advanced-elicitation/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad-brainstorming/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad-customize/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad-deep-recon/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad-party-mode/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad-review/module-manifest.toml#L4-L4plugins/core-tools/skills/bmad/module-manifest.toml#L4-L4🤖 Prompt for AI Agents