Skip to content

feat: add pure-Python installer (pip install, no npm) - #2615

Draft
pb01ka wants to merge 1 commit into
bmad-code-org:mainfrom
pb01ka:py-install
Draft

feat: add pure-Python installer (pip install, no npm)#2615
pb01ka wants to merge 1 commit into
bmad-code-org:mainfrom
pb01ka:py-install

Conversation

@pb01ka

@pb01ka pb01ka commented Jul 22, 2026

Copy link
Copy Markdown

Perhaps just as a show of OSS good faith, create code based PR to the BMad repo of the Python based installer that you are proposing, based on the current and clear BMad MIT OSS licensing model as a start ( e.g see https://github.com/bmad-code-org/BMAD-METHOD/blob/main/LICENSE )?

As suggested in #2504 (comment). If I made any mistake please feel free to point out in the diff here. I will quickly correct it. If you need any clarification on the work here, please let me know, I will provide one.

Proof of concept (open to review)

Proof of concept for packaging BMAD for the Python ecosystem: a pure-Python installer so that pip install bmad-method gives a working bmad command that scaffolds BMAD into a project - with no npm / Node toolchain required.

AFAIK, BMAD's payload (skills, agents, modules, runtime scripts) is just data files (Markdown / YAML / Python); only the installer CLI was Node. Please correct me if I'm wrong.

This PR reimplements the install actions in Python and ships the payload as package data. The output is validated byte-for-byte against the existing Node installer.

Nothing in the existing Node tooling is touched.

How it works

Given bmad install --directory . --modules bmm --tools claude-code --yes:

  1. copy the module payload into _bmad/<module>/;
  2. resolve install answers and generate the central config (_bmad/config.toml, _bmad/config.user.toml), per-module config.yaml, and the manifests (_bmad/_config/*);
  3. copy each skill into the tool's skills dir (e.g. .claude/skills/<id>/);
  4. remove the now-redundant skill copies from _bmad/.

Design decisions

  • Pure-Python, not a Node wrapper. No nodejs runtime dependency. This is the actual value proposition of pip install, and it keeps the eventual conda recipe noarch: python with no nodejs run dep.
  • requires-python = ">=3.11". BMAD's bundled runtime scripts (resolve_config.py, resolve_customization.py) use stdlib tomllib (3.11+).
  • One dependency: PyYAML, used solely to parse module.yaml / SKILL.md frontmatter at install time.
  • Config files are hand-emitted (not via a TOML/YAML writer library) because Node's config.toml carries hand-authored comment headers a serializer can't reproduce, and the whole point is byte-identical output.

Try it / review locally

pip install -e .            # or: pip install .
bmad --help
bmad list-tools
bmad install --directory /tmp/bmad-demo --modules bmm --tools claude-code --yes
python -m pytest tests/python -q

Shell output on my mac

(py313) 23:50:16:~/bmad-method % pip install -e .
.
.
.
Successfully installed bmad-method-6.10.0
(py313) 23:50:20:~/bmad-method % bmad --help
usage: bmad [-h] [--version] <command> ...

BMAD Method - install BMAD skills, agents, and workflows into a project (no npm required).

positional arguments:
  <command>
    install   Install BMAD modules and configure IDE/tool integrations.
    list-tools
              List supported tool/IDE IDs and exit.

options:
  -h, --help  show this help message and exit
  --version   show program's version number and exit
(py313) 23:50:30:~/bmad-method % bmad list-tools
  adal                 -> .adal/skills
  amp                  -> .agents/skills
  antigravity          -> .agent/skills
  antigravity-cli      -> .agents/skills
  auggie               -> .agents/skills
  bob                  -> .bob/skills
  claude-code          -> .claude/skills
  cline                -> .cline/skills
  codebuddy            -> .codebuddy/skills
  codewhale            -> .codewhale/skills
  codex                -> .agents/skills
  command-code         -> .agents/skills
  cortex               -> .cortex/skills
  crush                -> .agents/skills
  cursor               -> .agents/skills
  droid                -> .factory/skills
  firebender           -> .firebender/skills
  gemini               -> .agents/skills
  github-copilot       -> .agents/skills
  goose                -> .agents/skills
  hermes               -> .agents/skills
  iflow                -> .iflow/skills
  junie                -> .junie/skills
  kilo                 -> .agents/skills
  kimi-code            -> .agents/skills
  kiro                 -> .kiro/skills
  kode                 -> .kode/skills
  mistral-vibe         -> .agents/skills
  mux                  -> .agents/skills
  neovate              -> .neovate/skills
  ona                  -> .ona/skills
  openclaw             -> .agents/skills
  opencode             -> .agents/skills
  openhands            -> .agents/skills
  pi                   -> .agents/skills
  pochi                -> .agents/skills
  qoder                -> .qoder/skills
  qwen                 -> .qwen/skills
  replit               -> .agents/skills
  roo                  -> .agents/skills
  rovo-dev             -> .agents/skills
  trae                 -> .trae/skills
  warp                 -> .agents/skills
  windsurf             -> .agents/skills
  zencoder             -> .zencoder/skills
(py313) 23:50:37:~/bmad-method % bmad install --directory /tmp/bmad-demo --modules bmm --tools claude-code --yes

  BMAD is ready to use!
    Modules:  core, bmm
    Installed to: /private/tmp/bmad-demo/_bmad
    claude-code: 47 skills -> .claude/skills

    Launch your AI agent from your project folder and invoke the bmad-help skill.
(py313) 23:50:44:~/bmad-method % python -m pytest tests/python -q
...............                                                                               [100%]
15 passed in 1.63s
(py313) 23:50:56:~/bmad-method % 

Trademark / redistribution gate

A PyPI package named bmad-method uses the BMad trademark - the redistribution / attribution question flagged in the proposal. This will stay a draft and must not be published to a real index under a bmad-* name until BMAD upstream rules on redistribution and states any required attribution. LICENSE and TRADEMARK.md are bundled in the package.

Port the minimal non-interactive install to a `bmad` console entry point; output is byte-identical to the Node installer.

Adds pyproject.toml (hatchling, payload bundled), CLI, and pytest coverage.
@bmadcode

Copy link
Copy Markdown
Collaborator

Hello again - I do not think we had a chance to chat in Discord, please ping me (bmadcode) int he discord and lets chat. Since all of our skills have standardized on using python scripts (and eventually all will use uv) we have discussed a few times replacing the current installer with python just to make it all a single dependency platform (barring any modules people may create for bmad in the future.

I do not want to support 2 installers long term, and do not need both. Either installer can set up the skills and configs in any environment. So any contribution to the open source or helping us is appreciated of course, but there are other planned changes to the installer, so it might make sense to just do the fresh rewrite in python to start with the improvements in mind from the beginning.

@pb01ka

pb01ka commented Jul 23, 2026

Copy link
Copy Markdown
Author

Hello again - I do not think we had a chance to chat in Discord, please ping me (bmadcode) int he discord and lets chat.

Hiii @bmadcode! TYSM for your reply. I will login and ping you in Discord.

we have discussed a few times replacing the current installer with python just to make it all a single dependency platform (barring any modules people may create for bmad in the future.
I do not want to support 2 installers long term, and do not need both. Either installer can set up the skills and configs in any environment.

Totally fair point. I wasn't aware that a Python rewrite of the installer was already something that has been discussed. Makes a lot of sense to not carry two installers in the long term, especially with everything else on skills standardizing on Python/uv anyway.

I'll find you on Discord so we can talk through what you have planned before I put more time into this. Meanwhile, happy to let this PR sit as more of a reference/PoC.

Personally, I'd also prefer to build the thing that the community actually wants.

Appreciate you taking the time to explain the context, talk to you soon (probably a ping by today EOD)!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants