Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/quality.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Quality & Validation

# Runs the module's own gates on every PR:
# - every skill test suite (uv run, PEP 723; ffmpeg and chromium installed
# so the render and HTML-graphics suites exercise instead of skip)
# - the genericity release gate (nothing user-, brand-, or show-specific ships)

"on":
pull_request:
branches: ["**"]
workflow_dispatch:

jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Install ffmpeg and rsvg
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg librsvg2-bin

- name: Install chromium for the HTML graphics lane
run: uv run skills/mc-graphics/scripts/html_to_png.py --install-chromium
continue-on-error: true

- name: Run all skill test suites
run: |
set -e
fail=0
for t in $(find skills -path "*/tests/test-*.py" | sort); do
echo "=== $t"
if ! uv run "$t"; then
echo "FAIL: $t"
fail=1
fi
done
exit $fail

- name: Genericity release gate
run: uv run skills/mc-setup/scripts/lint_genericity.py skills/ docs/ README.md CHANGELOG.md
132 changes: 132 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: Release

# Manual release: bumps the version in .claude-plugin/marketplace.json,
# commits, tags vX.Y.Z, keyless-signs the tag SHA with cosign, and creates
# the GitHub Release with the matching CHANGELOG section as notes.
# Run from main only. The quality gates run first; a red gate stops the release.

on:
workflow_dispatch:
inputs:
bump:
description: "Version bump type"
required: true
default: "patch"
type: choice
options:
- patch
- minor
- major

concurrency:
group: release
cancel-in-progress: false

permissions:
id-token: write
contents: write

jobs:
release:
if: github.repository == 'bmad-code-org/bmad-manticore' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Install ffmpeg and rsvg
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg librsvg2-bin

- name: Run all skill test suites
run: |
set -e
fail=0
for t in $(find skills -path "*/tests/test-*.py" | sort); do
uv run "$t" || { echo "FAIL: $t"; fail=1; }
done
exit $fail

- name: Genericity release gate
run: uv run skills/mc-setup/scripts/lint_genericity.py skills/ docs/ README.md CHANGELOG.md

- name: Configure git user
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"

- name: Bump version in marketplace.json
id: version
run: |
python3 - "${{ inputs.bump }}" <<'EOF'
import json, sys
bump = sys.argv[1]
path = ".claude-plugin/marketplace.json"
data = json.load(open(path))
plugin = data["plugins"][0]
major, minor, patch = (int(x) for x in plugin["version"].split("."))
if bump == "major":
major, minor, patch = major + 1, 0, 0
elif bump == "minor":
minor, patch = minor + 1, 0
else:
patch += 1
plugin["version"] = f"{major}.{minor}.{patch}"
with open(path, "w") as f:
json.dump(data, f, indent=2)
f.write("\n")
print(plugin["version"])
EOF
VERSION=$(python3 -c "import json; print(json.load(open('.claude-plugin/marketplace.json'))['plugins'][0]['version'])")
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "tag=v${VERSION}" >> "$GITHUB_OUTPUT"

- name: Commit, tag, and push
run: |
TAG="${{ steps.version.outputs.tag }}"
git add .claude-plugin/marketplace.json
git commit -m "chore(release): ${TAG} [skip ci]"
git tag -a "${TAG}" -m "BMad Manticore ${{ steps.version.outputs.version }}"
git push origin main --follow-tags

- name: Install cosign
uses: sigstore/cosign-installer@v3

- name: Sign tag SHA with cosign (keyless)
run: |
TAG="${{ steps.version.outputs.tag }}"
SHA=$(git rev-parse "${TAG}")
printf '%s' "${SHA}" > "${TAG}.sha"
cosign sign-blob --yes \
--output-signature "${TAG}.sig" \
--output-certificate "${TAG}.pem" \
"${TAG}.sha"

- name: Extract CHANGELOG section
run: |
VERSION="${{ steps.version.outputs.version }}"
awk -v ver="$VERSION" '
$0 ~ "^## " ver { on=1; next }
on && /^## / { exit }
on { print }
' CHANGELOG.md > release-notes.md
if [ ! -s release-notes.md ]; then
echo "No CHANGELOG section for ${VERSION}; using a pointer." > release-notes.md
echo "See CHANGELOG.md." >> release-notes.md
fi

- name: Create GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG="${{ steps.version.outputs.tag }}"
gh release create "${TAG}" \
--title "BMad Manticore ${{ steps.version.outputs.version }}" \
--notes-file release-notes.md \
"${TAG}.sha" "${TAG}.sig" "${TAG}.pem"
77 changes: 77 additions & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BMad Manticore — the guides</title>
<style>
:root{
--ink:#1A1310; --strip:#241B15; --frame:#2B211A; --line:#3B2C20;
--accent:#E0522F; --amber:#E89A3C; --gold:#F2C36B;
--cream:#F5EBDC; --cream-dim:#B39B7F;
}
*{ margin:0; padding:0; box-sizing:border-box; }
body{
background:var(--ink); color:var(--cream);
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
min-height:100vh; display:flex; flex-direction:column; align-items:center;
}
.sprockets{
width:100%; height:26px; background:var(--strip); position:relative; overflow:hidden;
background-image:radial-gradient(rect, transparent 0, transparent 0);
}
.sprockets::before{
content:""; position:absolute; inset:0;
background-image:repeating-linear-gradient(90deg, transparent 0 14px, var(--ink) 14px 26px, transparent 26px 40px);
opacity:.9;
}
main{ max-width:880px; width:100%; padding:40px 24px 56px; }
.hero{
border:1px solid var(--line); border-radius:12px; overflow:hidden; background:var(--frame);
}
.hero img{ width:100%; display:block; max-height:340px; object-fit:cover; }
h1{ font-size:30px; margin:28px 0 6px; letter-spacing:.01em; }
h1 .accent{ color:var(--amber); }
p.sub{ color:var(--cream-dim); font-size:15.5px; line-height:1.55; max-width:64ch; }
.cards{ display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:16px; margin-top:28px; }
a.card{
display:block; background:var(--frame); border:1px solid var(--line); border-radius:10px;
padding:20px 18px; text-decoration:none; color:var(--cream); transition:border-color .15s;
}
a.card:hover{ border-color:var(--amber); }
a.card h2{ font-size:17px; margin-bottom:8px; }
a.card h2 span{ color:var(--accent); margin-right:8px; }
a.card p{ color:var(--cream-dim); font-size:13.5px; line-height:1.5; }
footer{ color:var(--cream-dim); font-size:12.5px; padding:0 24px 34px; text-align:center; }
footer a{ color:var(--gold); text-decoration:none; }
</style>
</head>
<body>
<div class="sprockets"></div>
<main>
<div class="hero">
<img src="assets/manny/banner-03-headon-lensflare.jpg" alt="Manny the Manticore, wings spread, diving head-on over a waterfall at red sunset">
</div>
<h1>BMad Manticore <span class="accent">· the guides</span></h1>
<p class="sub">An AI video production pipeline as skills: brain dump to a rough cut sitting in your editor, in your own words, with approval gates at every taste decision. Manny the Manticore runs the studio; these guides show you around it.</p>
<div class="cards">
<a class="card" href="manny-scenarios.html">
<h2><span>▸</span>Working with Manny</h2>
<p>Nine scenarios, from a fresh install to a published video: what you say, what Manny does, what you approve, and what you get.</p>
</a>
<a class="card" href="manny-under-the-hood.html">
<h2><span>▸</span>Manny, under the hood</h2>
<p>The technical deck: the tools and models behind every lane, the render pipeline, the graphics engines, and the film-strip flow diagrams.</p>
</a>
<a class="card" href="https://github.com/bmad-code-org/bmad-manticore/blob/main/docs/user-guide.md">
<h2><span>▸</span>Configure your studio</h2>
<p>The written walkthrough: install, the setup interview, your brand folder, formats, and your first video.</p>
</a>
</div>
</main>
<footer>
<a href="https://github.com/bmad-code-org/bmad-manticore">bmad-manticore on GitHub</a> · part of the BMad Method ecosystem
</footer>
<div class="sprockets"></div>
</body>
</html>
Loading