manimvox 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- manimvox-0.1.0/.claude-plugin/marketplace.json +15 -0
- manimvox-0.1.0/.claude-plugin/plugin.json +19 -0
- manimvox-0.1.0/.codex-plugin/plugin.json +6 -0
- manimvox-0.1.0/.cursor-plugin/plugin.json +5 -0
- manimvox-0.1.0/.gitattributes +1 -0
- manimvox-0.1.0/.github/scripts/report.sh +15 -0
- manimvox-0.1.0/.github/workflows/ci.yml +98 -0
- manimvox-0.1.0/.github/workflows/release.yml +40 -0
- manimvox-0.1.0/.gitignore +8 -0
- manimvox-0.1.0/AGENTS.md +78 -0
- manimvox-0.1.0/CLAUDE.md +1 -0
- manimvox-0.1.0/LICENSE +21 -0
- manimvox-0.1.0/PKG-INFO +570 -0
- manimvox-0.1.0/README.md +493 -0
- manimvox-0.1.0/blocks/bar-ranking/block.json +18 -0
- manimvox-0.1.0/blocks/bar-ranking/block.py +44 -0
- manimvox-0.1.0/blocks/bar-ranking/demo.py +18 -0
- manimvox-0.1.0/blocks/bar-ranking/preview.png +0 -0
- manimvox-0.1.0/blocks/bug-grid/block.json +16 -0
- manimvox-0.1.0/blocks/bug-grid/block.py +18 -0
- manimvox-0.1.0/blocks/bug-grid/demo.py +14 -0
- manimvox-0.1.0/blocks/bug-grid/preview.png +0 -0
- manimvox-0.1.0/blocks/code-diff/block.json +16 -0
- manimvox-0.1.0/blocks/code-diff/block.py +51 -0
- manimvox-0.1.0/blocks/code-diff/demo.py +26 -0
- manimvox-0.1.0/blocks/code-diff/preview.png +0 -0
- manimvox-0.1.0/blocks/line-by-level/block.json +17 -0
- manimvox-0.1.0/blocks/line-by-level/block.py +51 -0
- manimvox-0.1.0/blocks/line-by-level/demo.py +17 -0
- manimvox-0.1.0/blocks/line-by-level/preview.png +0 -0
- manimvox-0.1.0/blocks/log-scatter/block.json +18 -0
- manimvox-0.1.0/blocks/log-scatter/block.py +49 -0
- manimvox-0.1.0/blocks/log-scatter/demo.py +18 -0
- manimvox-0.1.0/blocks/log-scatter/preview.png +0 -0
- manimvox-0.1.0/blocks/mesh-model/block.json +16 -0
- manimvox-0.1.0/blocks/mesh-model/block.py +48 -0
- manimvox-0.1.0/blocks/mesh-model/demo.py +32 -0
- manimvox-0.1.0/blocks/mesh-model/preview.png +0 -0
- manimvox-0.1.0/blocks/request-flow/block.json +16 -0
- manimvox-0.1.0/blocks/request-flow/block.py +24 -0
- manimvox-0.1.0/blocks/request-flow/demo.py +17 -0
- manimvox-0.1.0/blocks/request-flow/preview.png +0 -0
- manimvox-0.1.0/blocks/sequence-diagram/block.json +17 -0
- manimvox-0.1.0/blocks/sequence-diagram/block.py +31 -0
- manimvox-0.1.0/blocks/sequence-diagram/demo.py +15 -0
- manimvox-0.1.0/blocks/sequence-diagram/preview.png +0 -0
- manimvox-0.1.0/blocks/surface-plot/block.json +18 -0
- manimvox-0.1.0/blocks/surface-plot/block.py +68 -0
- manimvox-0.1.0/blocks/surface-plot/demo.py +23 -0
- manimvox-0.1.0/blocks/surface-plot/preview.png +0 -0
- manimvox-0.1.0/blocks/token-panel/block.json +14 -0
- manimvox-0.1.0/blocks/token-panel/block.py +29 -0
- manimvox-0.1.0/blocks/token-panel/demo.py +15 -0
- manimvox-0.1.0/blocks/token-panel/preview.png +0 -0
- manimvox-0.1.0/blocks/venn/block.json +17 -0
- manimvox-0.1.0/blocks/venn/block.py +21 -0
- manimvox-0.1.0/blocks/venn/demo.py +14 -0
- manimvox-0.1.0/blocks/venn/preview.png +0 -0
- manimvox-0.1.0/examples/agents/README.md +20 -0
- manimvox-0.1.0/examples/agents/adk_agent.py +40 -0
- manimvox-0.1.0/examples/agents/agno_agent.py +32 -0
- manimvox-0.1.0/examples/agents/crewai_agent.py +35 -0
- manimvox-0.1.0/examples/agents/deep_agent.py +25 -0
- manimvox-0.1.0/examples/agents/haystack_agent.py +28 -0
- manimvox-0.1.0/examples/agents/llamaindex_agent.py +33 -0
- manimvox-0.1.0/examples/agents/openai_agent.py +26 -0
- manimvox-0.1.0/examples/agents/pydantic_ai_agent.py +30 -0
- manimvox-0.1.0/gemini-extension.json +5 -0
- manimvox-0.1.0/plugin.json +20 -0
- manimvox-0.1.0/pyproject.toml +95 -0
- manimvox-0.1.0/skills/manimvox/SKILL.md +61 -0
- manimvox-0.1.0/skills/manimvox-animation/SKILL.md +40 -0
- manimvox-0.1.0/skills/manimvox-animation/references/adapters.md +89 -0
- manimvox-0.1.0/skills/manimvox-animation/references/patterns.md +236 -0
- manimvox-0.1.0/skills/manimvox-animation/references/three-d.md +111 -0
- manimvox-0.1.0/skills/manimvox-blocks/SKILL.md +53 -0
- manimvox-0.1.0/skills/manimvox-blocks/references/writing-a-block.md +41 -0
- manimvox-0.1.0/skills/manimvox-cli/SKILL.md +142 -0
- manimvox-0.1.0/skills/manimvox-concept/SKILL.md +89 -0
- manimvox-0.1.0/skills/manimvox-core/SKILL.md +76 -0
- manimvox-0.1.0/skills/manimvox-core/references/author-guide.md +121 -0
- manimvox-0.1.0/skills/manimvox-creative/SKILL.md +31 -0
- manimvox-0.1.0/skills/manimvox-creative/references/facts.md +32 -0
- manimvox-0.1.0/skills/manimvox-creative/references/narration.md +27 -0
- manimvox-0.1.0/skills/manimvox-creative/references/script.md +119 -0
- manimvox-0.1.0/skills/manimvox-creative/references/story.md +78 -0
- manimvox-0.1.0/skills/manimvox-creative/references/theming.md +98 -0
- manimvox-0.1.0/skills/manimvox-paper/SKILL.md +97 -0
- manimvox-0.1.0/skills/manimvox-playlist/SKILL.md +77 -0
- manimvox-0.1.0/skills/manimvox-playlist/references/series-design.md +48 -0
- manimvox-0.1.0/skills/manimvox-playlist/sub-agents/episode-author.md +42 -0
- manimvox-0.1.0/skills/manimvox-pr/SKILL.md +96 -0
- manimvox-0.1.0/skills/manimvox-voice/SKILL.md +135 -0
- manimvox-0.1.0/skills-manifest.json +49 -0
- manimvox-0.1.0/src/manimvox/__init__.py +11 -0
- manimvox-0.1.0/src/manimvox/_cairo.py +45 -0
- manimvox-0.1.0/src/manimvox/blocks.py +191 -0
- manimvox-0.1.0/src/manimvox/checks/__init__.py +15 -0
- manimvox-0.1.0/src/manimvox/checks/audio.py +86 -0
- manimvox-0.1.0/src/manimvox/checks/layout.py +70 -0
- manimvox-0.1.0/src/manimvox/checks/sheets.py +52 -0
- manimvox-0.1.0/src/manimvox/checks/theme.py +77 -0
- manimvox-0.1.0/src/manimvox/cli.py +430 -0
- manimvox-0.1.0/src/manimvox/confirm.py +15 -0
- manimvox-0.1.0/src/manimvox/integrations/__init__.py +5 -0
- manimvox-0.1.0/src/manimvox/integrations/agno.py +30 -0
- manimvox-0.1.0/src/manimvox/integrations/common.py +280 -0
- manimvox-0.1.0/src/manimvox/integrations/crewai.py +30 -0
- manimvox-0.1.0/src/manimvox/integrations/google_adk.py +58 -0
- manimvox-0.1.0/src/manimvox/integrations/haystack.py +42 -0
- manimvox-0.1.0/src/manimvox/integrations/langchain.py +53 -0
- manimvox-0.1.0/src/manimvox/integrations/llamaindex.py +28 -0
- manimvox-0.1.0/src/manimvox/integrations/openai_agents.py +30 -0
- manimvox-0.1.0/src/manimvox/integrations/pydantic_ai.py +28 -0
- manimvox-0.1.0/src/manimvox/kit/__init__.py +59 -0
- manimvox-0.1.0/src/manimvox/kit/_context.py +30 -0
- manimvox-0.1.0/src/manimvox/kit/colours.py +37 -0
- manimvox-0.1.0/src/manimvox/kit/components.py +259 -0
- manimvox-0.1.0/src/manimvox/kit/episode.py +411 -0
- manimvox-0.1.0/src/manimvox/kit/icons.py +85 -0
- manimvox-0.1.0/src/manimvox/kit/mesh.py +138 -0
- manimvox-0.1.0/src/manimvox/kit/text.py +78 -0
- manimvox-0.1.0/src/manimvox/kit/theme.py +73 -0
- manimvox-0.1.0/src/manimvox/playlist.py +210 -0
- manimvox-0.1.0/src/manimvox/post/__init__.py +2 -0
- manimvox-0.1.0/src/manimvox/post/audio.py +70 -0
- manimvox-0.1.0/src/manimvox/post/draw.py +111 -0
- manimvox-0.1.0/src/manimvox/post/encode.py +124 -0
- manimvox-0.1.0/src/manimvox/post/finish.py +109 -0
- manimvox-0.1.0/src/manimvox/post/options.py +68 -0
- manimvox-0.1.0/src/manimvox/project.py +174 -0
- manimvox-0.1.0/src/manimvox/runner.py +51 -0
- manimvox-0.1.0/src/manimvox/scaffold.py +58 -0
- manimvox-0.1.0/src/manimvox/scenes/__init__.py +10 -0
- manimvox-0.1.0/src/manimvox/scenes/charts.py +142 -0
- manimvox-0.1.0/src/manimvox/scenes/clip.py +112 -0
- manimvox-0.1.0/src/manimvox/scenes/model.py +161 -0
- manimvox-0.1.0/src/manimvox/scenes/raster.py +42 -0
- manimvox-0.1.0/src/manimvox/skills.py +143 -0
- manimvox-0.1.0/src/manimvox/skills_admin.py +251 -0
- manimvox-0.1.0/src/manimvox/templates/FACTS.md +17 -0
- manimvox-0.1.0/src/manimvox/templates/SERIES.md +55 -0
- manimvox-0.1.0/src/manimvox/templates/__init__.py +0 -0
- manimvox-0.1.0/src/manimvox/templates/gitignore +6 -0
- manimvox-0.1.0/src/manimvox/tools.py +619 -0
- manimvox-0.1.0/src/manimvox/voice/__init__.py +79 -0
- manimvox-0.1.0/src/manimvox/voice/base.py +114 -0
- manimvox-0.1.0/src/manimvox/voice/cache.py +30 -0
- manimvox-0.1.0/src/manimvox/voice/convert.py +42 -0
- manimvox-0.1.0/src/manimvox/voice/download.py +114 -0
- manimvox-0.1.0/src/manimvox/voice/engines/__init__.py +1 -0
- manimvox-0.1.0/src/manimvox/voice/engines/edge.py +80 -0
- manimvox-0.1.0/src/manimvox/voice/engines/elevenlabs.py +134 -0
- manimvox-0.1.0/src/manimvox/voice/engines/f5.py +117 -0
- manimvox-0.1.0/src/manimvox/voice/engines/fake.py +39 -0
- manimvox-0.1.0/src/manimvox/voice/engines/kokoro.py +92 -0
- manimvox-0.1.0/src/manimvox/voice/engines/openai.py +94 -0
- manimvox-0.1.0/src/manimvox/voice/engines/piper.py +128 -0
- manimvox-0.1.0/src/manimvox/voice/engines/say.py +78 -0
- manimvox-0.1.0/src/manimvox/voice/engines/xtts.py +112 -0
- manimvox-0.1.0/src/manimvox/voice/http.py +99 -0
- manimvox-0.1.0/src/manimvox/voice/pron.py +55 -0
- manimvox-0.1.0/src/manimvox/voice/registry.py +26 -0
- manimvox-0.1.0/tests/__init__.py +0 -0
- manimvox-0.1.0/tests/conftest.py +6 -0
- manimvox-0.1.0/tests/fixtures/hello/episodes/ep01_hello.py +15 -0
- manimvox-0.1.0/tests/fixtures/hello/series.json +9 -0
- manimvox-0.1.0/tests/http_fakes.py +39 -0
- manimvox-0.1.0/tests/media.py +81 -0
- manimvox-0.1.0/tests/test_audio.py +64 -0
- manimvox-0.1.0/tests/test_blocks.py +371 -0
- manimvox-0.1.0/tests/test_charts.py +189 -0
- manimvox-0.1.0/tests/test_cli.py +16 -0
- manimvox-0.1.0/tests/test_cli_commands.py +225 -0
- manimvox-0.1.0/tests/test_cli_post.py +199 -0
- manimvox-0.1.0/tests/test_convert.py +37 -0
- manimvox-0.1.0/tests/test_download.py +74 -0
- manimvox-0.1.0/tests/test_edge.py +96 -0
- manimvox-0.1.0/tests/test_elevenlabs.py +152 -0
- manimvox-0.1.0/tests/test_f5.py +206 -0
- manimvox-0.1.0/tests/test_frameworks.py +156 -0
- manimvox-0.1.0/tests/test_http.py +107 -0
- manimvox-0.1.0/tests/test_integrations.py +228 -0
- manimvox-0.1.0/tests/test_integrations_common.py +301 -0
- manimvox-0.1.0/tests/test_kit.py +318 -0
- manimvox-0.1.0/tests/test_kokoro.py +86 -0
- manimvox-0.1.0/tests/test_layout.py +37 -0
- manimvox-0.1.0/tests/test_manifests.py +49 -0
- manimvox-0.1.0/tests/test_mesh.py +102 -0
- manimvox-0.1.0/tests/test_model.py +169 -0
- manimvox-0.1.0/tests/test_openai.py +97 -0
- manimvox-0.1.0/tests/test_piper.py +172 -0
- manimvox-0.1.0/tests/test_playlist.py +121 -0
- manimvox-0.1.0/tests/test_post_audio.py +116 -0
- manimvox-0.1.0/tests/test_post_video.py +169 -0
- manimvox-0.1.0/tests/test_project.py +199 -0
- manimvox-0.1.0/tests/test_pron.py +25 -0
- manimvox-0.1.0/tests/test_runner.py +95 -0
- manimvox-0.1.0/tests/test_say.py +75 -0
- manimvox-0.1.0/tests/test_scaffold.py +104 -0
- manimvox-0.1.0/tests/test_scenes.py +148 -0
- manimvox-0.1.0/tests/test_sheets.py +28 -0
- manimvox-0.1.0/tests/test_skills_admin.py +501 -0
- manimvox-0.1.0/tests/test_skills_lint.py +117 -0
- manimvox-0.1.0/tests/test_skills_pkg.py +157 -0
- manimvox-0.1.0/tests/test_theme.py +95 -0
- manimvox-0.1.0/tests/test_tools.py +200 -0
- manimvox-0.1.0/tests/test_tools_render.py +171 -0
- manimvox-0.1.0/tests/test_voice.py +139 -0
- manimvox-0.1.0/tests/test_xtts.py +176 -0
- manimvox-0.1.0/uv.lock +10992 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "manimvox",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "LaplacianAI"
|
|
5
|
+
},
|
|
6
|
+
"description": "Narrated, animated explainer videos with Manim and pluggable voices, driven by agent skills.",
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "manimvox",
|
|
10
|
+
"source": ".",
|
|
11
|
+
"description": "Narrated, animated explainer videos with Manim and pluggable voices, driven by agent skills.",
|
|
12
|
+
"version": "0.1.0"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "manimvox",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Narrated, animated explainer videos with Manim and pluggable voices, driven by agent skills.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "LaplacianAI"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/LaplacianAI/manimvox",
|
|
9
|
+
"repository": "https://github.com/LaplacianAI/manimvox",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"manim",
|
|
13
|
+
"video",
|
|
14
|
+
"explainer",
|
|
15
|
+
"tts",
|
|
16
|
+
"animation",
|
|
17
|
+
"skills"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.sh text eol=lf
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Run a command; if it fails, repeat the lines that say why as an annotation, which anyone can read
|
|
3
|
+
# (a run's logs need a GitHub login, its annotations do not).
|
|
4
|
+
set -o pipefail
|
|
5
|
+
log=$(mktemp)
|
|
6
|
+
"$@" 2>&1 | tee "$log"
|
|
7
|
+
code=${PIPESTATUS[0]}
|
|
8
|
+
if [ "$code" -ne 0 ]; then
|
|
9
|
+
why=$(grep -E "FAILED|ERROR|Error|error:|failed|No solution|not found" "$log" | tail -n 25)
|
|
10
|
+
[ -z "$why" ] && why=$(tail -n 25 "$log")
|
|
11
|
+
why=$(printf '%s\n--- last lines ---\n%s' "$why" "$(tail -n 12 "$log")")
|
|
12
|
+
# an annotation is one line: GitHub turns %0A back into newlines
|
|
13
|
+
echo "::error title=$1 failed::$(printf '%s\n' "$why" | awk 'BEGIN{ORS="%0A"} {gsub(/\r/, ""); gsub(/%/, "%25"); print}')"
|
|
14
|
+
fi
|
|
15
|
+
exit "$code"
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push: # every branch, so a branch is checked before its pull request exists
|
|
5
|
+
pull_request:
|
|
6
|
+
branches: [main]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ci-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
env:
|
|
14
|
+
# tests that need real voice engines or downloaded models are opt-in markers; see pyproject.toml
|
|
15
|
+
FAST: "not slow and not kokoro and not piper"
|
|
16
|
+
PYTHONUTF8: "1"
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
lint:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v5
|
|
23
|
+
- uses: astral-sh/setup-uv@v7
|
|
24
|
+
- run: bash .github/scripts/report.sh uv run --no-project --with "ruff>=0.6" ruff check src tests examples
|
|
25
|
+
|
|
26
|
+
test:
|
|
27
|
+
name: test (${{ matrix.os }}, py${{ matrix.python }})
|
|
28
|
+
strategy:
|
|
29
|
+
fail-fast: false
|
|
30
|
+
matrix:
|
|
31
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
32
|
+
python: ["3.11", "3.13"]
|
|
33
|
+
runs-on: ${{ matrix.os }}
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v5
|
|
36
|
+
- uses: astral-sh/setup-uv@v7
|
|
37
|
+
with:
|
|
38
|
+
python-version: ${{ matrix.python }}
|
|
39
|
+
- name: System libraries (Linux; EGL and OSMesa let VTK render with no display)
|
|
40
|
+
if: runner.os == 'Linux'
|
|
41
|
+
run: >-
|
|
42
|
+
sudo apt-get update && sudo apt-get install -y libcairo2-dev libpango1.0-dev pkg-config python3-dev
|
|
43
|
+
libegl1 libosmesa6
|
|
44
|
+
- name: System libraries (macOS)
|
|
45
|
+
if: runner.os == 'macOS'
|
|
46
|
+
run: brew install cairo pkg-config
|
|
47
|
+
- name: Software OpenGL (Windows runners have no GPU; Windows' own OpenGL is too old for VTK)
|
|
48
|
+
if: runner.os == 'Windows'
|
|
49
|
+
uses: pyvista/setup-headless-display-action@v4
|
|
50
|
+
- run: bash .github/scripts/report.sh uv sync --extra dev --extra kokoro --extra pyvista
|
|
51
|
+
shell: bash
|
|
52
|
+
- run: bash .github/scripts/report.sh uv run pytest -m "$FAST" -q -rs
|
|
53
|
+
shell: bash
|
|
54
|
+
- name: Manifests are current
|
|
55
|
+
run: bash .github/scripts/report.sh uv run python -m manimvox.skills manifest --check
|
|
56
|
+
shell: bash
|
|
57
|
+
|
|
58
|
+
render:
|
|
59
|
+
name: render (${{ matrix.os }})
|
|
60
|
+
strategy:
|
|
61
|
+
fail-fast: false
|
|
62
|
+
matrix:
|
|
63
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
64
|
+
runs-on: ${{ matrix.os }}
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v5
|
|
67
|
+
- uses: astral-sh/setup-uv@v7
|
|
68
|
+
with:
|
|
69
|
+
python-version: "3.12"
|
|
70
|
+
- name: System libraries (Linux)
|
|
71
|
+
if: runner.os == 'Linux'
|
|
72
|
+
run: sudo apt-get update && sudo apt-get install -y libcairo2-dev libpango1.0-dev pkg-config python3-dev
|
|
73
|
+
- name: System libraries (macOS)
|
|
74
|
+
if: runner.os == 'macOS'
|
|
75
|
+
run: brew install cairo pkg-config
|
|
76
|
+
- run: bash .github/scripts/report.sh uv sync --extra dev --extra kokoro
|
|
77
|
+
shell: bash
|
|
78
|
+
- name: Render tests (include every block's demo against its preview)
|
|
79
|
+
run: bash .github/scripts/report.sh uv run pytest -m slow -q -rs
|
|
80
|
+
shell: bash
|
|
81
|
+
|
|
82
|
+
integrations:
|
|
83
|
+
runs-on: ubuntu-latest
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v5
|
|
86
|
+
- uses: astral-sh/setup-uv@v7
|
|
87
|
+
with:
|
|
88
|
+
python-version: "3.12"
|
|
89
|
+
- run: sudo apt-get update && sudo apt-get install -y libcairo2-dev libpango1.0-dev pkg-config python3-dev
|
|
90
|
+
- name: Framework adapters
|
|
91
|
+
run: >-
|
|
92
|
+
bash .github/scripts/report.sh uv run --extra dev --extra agno --extra langchain --extra pydantic-ai --extra openai-agents
|
|
93
|
+
--extra llamaindex --extra haystack --extra google-adk
|
|
94
|
+
pytest tests/test_integrations.py tests/test_integrations_common.py tests/test_frameworks.py -q -rs
|
|
95
|
+
- name: CrewAI (conflicts with the OpenAI Agents SDK, so in its own environment)
|
|
96
|
+
run: >-
|
|
97
|
+
bash .github/scripts/report.sh uv run --extra dev --extra crewai
|
|
98
|
+
pytest tests/test_integrations.py tests/test_frameworks.py -q -rs -k "crewai or missing or every_framework"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Push a tag vX.Y.Z equal to manimvox.__version__ to build and publish to PyPI.
|
|
4
|
+
# PyPI trusts this workflow through trusted publishing: no token is stored in GitHub.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v5
|
|
15
|
+
- uses: astral-sh/setup-uv@v7
|
|
16
|
+
- name: The tag matches the version
|
|
17
|
+
run: |
|
|
18
|
+
version=$(sed -n 's/^__version__ = "\(.*\)"/\1/p' src/manimvox/__init__.py)
|
|
19
|
+
test "v$version" = "$GITHUB_REF_NAME" || { echo "tag $GITHUB_REF_NAME but __version__ is $version"; exit 1; }
|
|
20
|
+
- run: uv build
|
|
21
|
+
- run: uvx twine check dist/*
|
|
22
|
+
- uses: actions/upload-artifact@v4
|
|
23
|
+
with:
|
|
24
|
+
name: dist
|
|
25
|
+
path: dist/
|
|
26
|
+
|
|
27
|
+
publish:
|
|
28
|
+
needs: build
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
environment:
|
|
31
|
+
name: pypi
|
|
32
|
+
url: https://pypi.org/project/manimvox/
|
|
33
|
+
permissions:
|
|
34
|
+
id-token: write # trusted publishing
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/download-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: dist
|
|
39
|
+
path: dist/
|
|
40
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
manimvox-0.1.0/AGENTS.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
Guide for agents working on this repository. To use manimvox, load the `manimvox` skill instead.
|
|
4
|
+
|
|
5
|
+
manimvox renders narrated, animated explainer videos with Manim and a text-to-speech voice. It is a Python package (MIT) with a `manimvox` command, and it ships agent skills in `skills/`.
|
|
6
|
+
|
|
7
|
+
## Layout
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
src/manimvox/
|
|
11
|
+
cli.py the manimvox command
|
|
12
|
+
tools.py typed tools mirroring the CLI, for agents with no shell
|
|
13
|
+
integrations/ adapters for eight agent frameworks
|
|
14
|
+
confirm.py when a download may go ahead without asking
|
|
15
|
+
playlist.py index page and share packages
|
|
16
|
+
project.py series.json loading and validation
|
|
17
|
+
scaffold.py manimvox new
|
|
18
|
+
runner.py runs Manim in a subprocess
|
|
19
|
+
skills.py skill discovery, manifest generation
|
|
20
|
+
skills_admin.py manimvox skills install, check, update, remove
|
|
21
|
+
templates/ files manimvox new writes
|
|
22
|
+
kit/ Episode, components, theme, text (what episodes import)
|
|
23
|
+
scenes/ clips from Pillow, Cairo, Matplotlib, Plotly
|
|
24
|
+
post/ music bed, captions, cards, join
|
|
25
|
+
blocks.py block registry, manimvox add, the preview tool
|
|
26
|
+
_cairo.py pycairo helpers shared by scenes and post
|
|
27
|
+
checks/ theme, layout, audio, contact sheets
|
|
28
|
+
voice/ the voice interface, cache, downloads, HTTP, audio conversion
|
|
29
|
+
voice/engines/ one module per text-to-speech engine
|
|
30
|
+
examples/agents/ one script per framework
|
|
31
|
+
blocks/<name>/ block code, demo, block.json, preview.png
|
|
32
|
+
skills/<name>/ agent skills: SKILL.md plus references/
|
|
33
|
+
skills-manifest.json generated list of the skills
|
|
34
|
+
tests/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Commands
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
uv sync --extra dev --extra kokoro
|
|
41
|
+
uv run pytest
|
|
42
|
+
uv run ruff check src tests examples
|
|
43
|
+
# framework adapters; CrewAI conflicts with the OpenAI Agents SDK, so it runs in its own environment
|
|
44
|
+
uv run --extra dev --extra agno --extra langchain --extra pydantic-ai --extra openai-agents --extra llamaindex --extra haystack --extra google-adk pytest tests/test_integrations.py tests/test_integrations_common.py tests/test_frameworks.py -q -rs
|
|
45
|
+
uv run --extra dev --extra crewai pytest tests/test_integrations.py tests/test_frameworks.py -q -rs -k "crewai or missing or every_framework"
|
|
46
|
+
uv run python -m manimvox.skills manifest --write # after any skill edit
|
|
47
|
+
uv run manimvox skills install|check|update|remove # skills in your coding agents
|
|
48
|
+
uv run python -m manimvox.blocks preview --write|--check [NAME] # after any block edit
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Tests that render with Manim are marked `slow`; tests needing real engines are opt-in markers.
|
|
52
|
+
|
|
53
|
+
## Rules
|
|
54
|
+
|
|
55
|
+
- Never commit `docs/specs` or `docs/plans`. They stay local.
|
|
56
|
+
- Skills stay harness-neutral: shell commands and reading files only, no harness tool names, no private or competitor names. `tests/test_skills_lint.py` enforces this with its BANNED list.
|
|
57
|
+
- Where a capability may be missing, a skill gives the plain fallback: helpers one after another; no way to ask means state the choice and continue; no image viewing means `manimvox check layout`.
|
|
58
|
+
- Consent rules live in the skills: ask before installing, downloading a model, fetching from the web or using an online voice; with no way to ask, the answer is no.
|
|
59
|
+
- A new CLI command gets a tool in `manimvox.tools` with the same behaviour, an entry in `COMMANDS`, and a row in the manimvox-cli Tool column; `tests/test_skills_lint.py` and `tests/test_tools.py` enforce this.
|
|
60
|
+
- Every version in the manifests equals `manimvox.__version__`.
|
|
61
|
+
- `npx` installs run the pinned `SKILLS_CLI` in `skills_admin.py`; bump it deliberately.
|
|
62
|
+
- Use Conventional Commits. Run the tests and ruff before committing.
|
|
63
|
+
|
|
64
|
+
## Skills
|
|
65
|
+
|
|
66
|
+
| Skill | Kind | For |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `manimvox` | router | picks the workflow, checks the setup |
|
|
69
|
+
| `manimvox-paper` | workflow | one document into one video |
|
|
70
|
+
| `manimvox-playlist` | workflow | a codebase or spec into a beginner-to-advanced series |
|
|
71
|
+
| `manimvox-concept` | workflow | a concept with no source into one video |
|
|
72
|
+
| `manimvox-pr` | workflow | a pull request into a short walkthrough |
|
|
73
|
+
| `manimvox-core` | domain | the authoring contract for episode files |
|
|
74
|
+
| `manimvox-creative` | domain | theme, story, narration, facts |
|
|
75
|
+
| `manimvox-animation` | domain | motion patterns |
|
|
76
|
+
| `manimvox-voice` | domain | engines, voices, pronunciation, cloning consent |
|
|
77
|
+
| `manimvox-cli` | domain | commands and their output |
|
|
78
|
+
| `manimvox-blocks` | domain | finding, copying and writing blocks |
|
manimvox-0.1.0/CLAUDE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
See [AGENTS.md](AGENTS.md).
|
manimvox-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 LaplacianAI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|