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.
Files changed (211) hide show
  1. manimvox-0.1.0/.claude-plugin/marketplace.json +15 -0
  2. manimvox-0.1.0/.claude-plugin/plugin.json +19 -0
  3. manimvox-0.1.0/.codex-plugin/plugin.json +6 -0
  4. manimvox-0.1.0/.cursor-plugin/plugin.json +5 -0
  5. manimvox-0.1.0/.gitattributes +1 -0
  6. manimvox-0.1.0/.github/scripts/report.sh +15 -0
  7. manimvox-0.1.0/.github/workflows/ci.yml +98 -0
  8. manimvox-0.1.0/.github/workflows/release.yml +40 -0
  9. manimvox-0.1.0/.gitignore +8 -0
  10. manimvox-0.1.0/AGENTS.md +78 -0
  11. manimvox-0.1.0/CLAUDE.md +1 -0
  12. manimvox-0.1.0/LICENSE +21 -0
  13. manimvox-0.1.0/PKG-INFO +570 -0
  14. manimvox-0.1.0/README.md +493 -0
  15. manimvox-0.1.0/blocks/bar-ranking/block.json +18 -0
  16. manimvox-0.1.0/blocks/bar-ranking/block.py +44 -0
  17. manimvox-0.1.0/blocks/bar-ranking/demo.py +18 -0
  18. manimvox-0.1.0/blocks/bar-ranking/preview.png +0 -0
  19. manimvox-0.1.0/blocks/bug-grid/block.json +16 -0
  20. manimvox-0.1.0/blocks/bug-grid/block.py +18 -0
  21. manimvox-0.1.0/blocks/bug-grid/demo.py +14 -0
  22. manimvox-0.1.0/blocks/bug-grid/preview.png +0 -0
  23. manimvox-0.1.0/blocks/code-diff/block.json +16 -0
  24. manimvox-0.1.0/blocks/code-diff/block.py +51 -0
  25. manimvox-0.1.0/blocks/code-diff/demo.py +26 -0
  26. manimvox-0.1.0/blocks/code-diff/preview.png +0 -0
  27. manimvox-0.1.0/blocks/line-by-level/block.json +17 -0
  28. manimvox-0.1.0/blocks/line-by-level/block.py +51 -0
  29. manimvox-0.1.0/blocks/line-by-level/demo.py +17 -0
  30. manimvox-0.1.0/blocks/line-by-level/preview.png +0 -0
  31. manimvox-0.1.0/blocks/log-scatter/block.json +18 -0
  32. manimvox-0.1.0/blocks/log-scatter/block.py +49 -0
  33. manimvox-0.1.0/blocks/log-scatter/demo.py +18 -0
  34. manimvox-0.1.0/blocks/log-scatter/preview.png +0 -0
  35. manimvox-0.1.0/blocks/mesh-model/block.json +16 -0
  36. manimvox-0.1.0/blocks/mesh-model/block.py +48 -0
  37. manimvox-0.1.0/blocks/mesh-model/demo.py +32 -0
  38. manimvox-0.1.0/blocks/mesh-model/preview.png +0 -0
  39. manimvox-0.1.0/blocks/request-flow/block.json +16 -0
  40. manimvox-0.1.0/blocks/request-flow/block.py +24 -0
  41. manimvox-0.1.0/blocks/request-flow/demo.py +17 -0
  42. manimvox-0.1.0/blocks/request-flow/preview.png +0 -0
  43. manimvox-0.1.0/blocks/sequence-diagram/block.json +17 -0
  44. manimvox-0.1.0/blocks/sequence-diagram/block.py +31 -0
  45. manimvox-0.1.0/blocks/sequence-diagram/demo.py +15 -0
  46. manimvox-0.1.0/blocks/sequence-diagram/preview.png +0 -0
  47. manimvox-0.1.0/blocks/surface-plot/block.json +18 -0
  48. manimvox-0.1.0/blocks/surface-plot/block.py +68 -0
  49. manimvox-0.1.0/blocks/surface-plot/demo.py +23 -0
  50. manimvox-0.1.0/blocks/surface-plot/preview.png +0 -0
  51. manimvox-0.1.0/blocks/token-panel/block.json +14 -0
  52. manimvox-0.1.0/blocks/token-panel/block.py +29 -0
  53. manimvox-0.1.0/blocks/token-panel/demo.py +15 -0
  54. manimvox-0.1.0/blocks/token-panel/preview.png +0 -0
  55. manimvox-0.1.0/blocks/venn/block.json +17 -0
  56. manimvox-0.1.0/blocks/venn/block.py +21 -0
  57. manimvox-0.1.0/blocks/venn/demo.py +14 -0
  58. manimvox-0.1.0/blocks/venn/preview.png +0 -0
  59. manimvox-0.1.0/examples/agents/README.md +20 -0
  60. manimvox-0.1.0/examples/agents/adk_agent.py +40 -0
  61. manimvox-0.1.0/examples/agents/agno_agent.py +32 -0
  62. manimvox-0.1.0/examples/agents/crewai_agent.py +35 -0
  63. manimvox-0.1.0/examples/agents/deep_agent.py +25 -0
  64. manimvox-0.1.0/examples/agents/haystack_agent.py +28 -0
  65. manimvox-0.1.0/examples/agents/llamaindex_agent.py +33 -0
  66. manimvox-0.1.0/examples/agents/openai_agent.py +26 -0
  67. manimvox-0.1.0/examples/agents/pydantic_ai_agent.py +30 -0
  68. manimvox-0.1.0/gemini-extension.json +5 -0
  69. manimvox-0.1.0/plugin.json +20 -0
  70. manimvox-0.1.0/pyproject.toml +95 -0
  71. manimvox-0.1.0/skills/manimvox/SKILL.md +61 -0
  72. manimvox-0.1.0/skills/manimvox-animation/SKILL.md +40 -0
  73. manimvox-0.1.0/skills/manimvox-animation/references/adapters.md +89 -0
  74. manimvox-0.1.0/skills/manimvox-animation/references/patterns.md +236 -0
  75. manimvox-0.1.0/skills/manimvox-animation/references/three-d.md +111 -0
  76. manimvox-0.1.0/skills/manimvox-blocks/SKILL.md +53 -0
  77. manimvox-0.1.0/skills/manimvox-blocks/references/writing-a-block.md +41 -0
  78. manimvox-0.1.0/skills/manimvox-cli/SKILL.md +142 -0
  79. manimvox-0.1.0/skills/manimvox-concept/SKILL.md +89 -0
  80. manimvox-0.1.0/skills/manimvox-core/SKILL.md +76 -0
  81. manimvox-0.1.0/skills/manimvox-core/references/author-guide.md +121 -0
  82. manimvox-0.1.0/skills/manimvox-creative/SKILL.md +31 -0
  83. manimvox-0.1.0/skills/manimvox-creative/references/facts.md +32 -0
  84. manimvox-0.1.0/skills/manimvox-creative/references/narration.md +27 -0
  85. manimvox-0.1.0/skills/manimvox-creative/references/script.md +119 -0
  86. manimvox-0.1.0/skills/manimvox-creative/references/story.md +78 -0
  87. manimvox-0.1.0/skills/manimvox-creative/references/theming.md +98 -0
  88. manimvox-0.1.0/skills/manimvox-paper/SKILL.md +97 -0
  89. manimvox-0.1.0/skills/manimvox-playlist/SKILL.md +77 -0
  90. manimvox-0.1.0/skills/manimvox-playlist/references/series-design.md +48 -0
  91. manimvox-0.1.0/skills/manimvox-playlist/sub-agents/episode-author.md +42 -0
  92. manimvox-0.1.0/skills/manimvox-pr/SKILL.md +96 -0
  93. manimvox-0.1.0/skills/manimvox-voice/SKILL.md +135 -0
  94. manimvox-0.1.0/skills-manifest.json +49 -0
  95. manimvox-0.1.0/src/manimvox/__init__.py +11 -0
  96. manimvox-0.1.0/src/manimvox/_cairo.py +45 -0
  97. manimvox-0.1.0/src/manimvox/blocks.py +191 -0
  98. manimvox-0.1.0/src/manimvox/checks/__init__.py +15 -0
  99. manimvox-0.1.0/src/manimvox/checks/audio.py +86 -0
  100. manimvox-0.1.0/src/manimvox/checks/layout.py +70 -0
  101. manimvox-0.1.0/src/manimvox/checks/sheets.py +52 -0
  102. manimvox-0.1.0/src/manimvox/checks/theme.py +77 -0
  103. manimvox-0.1.0/src/manimvox/cli.py +430 -0
  104. manimvox-0.1.0/src/manimvox/confirm.py +15 -0
  105. manimvox-0.1.0/src/manimvox/integrations/__init__.py +5 -0
  106. manimvox-0.1.0/src/manimvox/integrations/agno.py +30 -0
  107. manimvox-0.1.0/src/manimvox/integrations/common.py +280 -0
  108. manimvox-0.1.0/src/manimvox/integrations/crewai.py +30 -0
  109. manimvox-0.1.0/src/manimvox/integrations/google_adk.py +58 -0
  110. manimvox-0.1.0/src/manimvox/integrations/haystack.py +42 -0
  111. manimvox-0.1.0/src/manimvox/integrations/langchain.py +53 -0
  112. manimvox-0.1.0/src/manimvox/integrations/llamaindex.py +28 -0
  113. manimvox-0.1.0/src/manimvox/integrations/openai_agents.py +30 -0
  114. manimvox-0.1.0/src/manimvox/integrations/pydantic_ai.py +28 -0
  115. manimvox-0.1.0/src/manimvox/kit/__init__.py +59 -0
  116. manimvox-0.1.0/src/manimvox/kit/_context.py +30 -0
  117. manimvox-0.1.0/src/manimvox/kit/colours.py +37 -0
  118. manimvox-0.1.0/src/manimvox/kit/components.py +259 -0
  119. manimvox-0.1.0/src/manimvox/kit/episode.py +411 -0
  120. manimvox-0.1.0/src/manimvox/kit/icons.py +85 -0
  121. manimvox-0.1.0/src/manimvox/kit/mesh.py +138 -0
  122. manimvox-0.1.0/src/manimvox/kit/text.py +78 -0
  123. manimvox-0.1.0/src/manimvox/kit/theme.py +73 -0
  124. manimvox-0.1.0/src/manimvox/playlist.py +210 -0
  125. manimvox-0.1.0/src/manimvox/post/__init__.py +2 -0
  126. manimvox-0.1.0/src/manimvox/post/audio.py +70 -0
  127. manimvox-0.1.0/src/manimvox/post/draw.py +111 -0
  128. manimvox-0.1.0/src/manimvox/post/encode.py +124 -0
  129. manimvox-0.1.0/src/manimvox/post/finish.py +109 -0
  130. manimvox-0.1.0/src/manimvox/post/options.py +68 -0
  131. manimvox-0.1.0/src/manimvox/project.py +174 -0
  132. manimvox-0.1.0/src/manimvox/runner.py +51 -0
  133. manimvox-0.1.0/src/manimvox/scaffold.py +58 -0
  134. manimvox-0.1.0/src/manimvox/scenes/__init__.py +10 -0
  135. manimvox-0.1.0/src/manimvox/scenes/charts.py +142 -0
  136. manimvox-0.1.0/src/manimvox/scenes/clip.py +112 -0
  137. manimvox-0.1.0/src/manimvox/scenes/model.py +161 -0
  138. manimvox-0.1.0/src/manimvox/scenes/raster.py +42 -0
  139. manimvox-0.1.0/src/manimvox/skills.py +143 -0
  140. manimvox-0.1.0/src/manimvox/skills_admin.py +251 -0
  141. manimvox-0.1.0/src/manimvox/templates/FACTS.md +17 -0
  142. manimvox-0.1.0/src/manimvox/templates/SERIES.md +55 -0
  143. manimvox-0.1.0/src/manimvox/templates/__init__.py +0 -0
  144. manimvox-0.1.0/src/manimvox/templates/gitignore +6 -0
  145. manimvox-0.1.0/src/manimvox/tools.py +619 -0
  146. manimvox-0.1.0/src/manimvox/voice/__init__.py +79 -0
  147. manimvox-0.1.0/src/manimvox/voice/base.py +114 -0
  148. manimvox-0.1.0/src/manimvox/voice/cache.py +30 -0
  149. manimvox-0.1.0/src/manimvox/voice/convert.py +42 -0
  150. manimvox-0.1.0/src/manimvox/voice/download.py +114 -0
  151. manimvox-0.1.0/src/manimvox/voice/engines/__init__.py +1 -0
  152. manimvox-0.1.0/src/manimvox/voice/engines/edge.py +80 -0
  153. manimvox-0.1.0/src/manimvox/voice/engines/elevenlabs.py +134 -0
  154. manimvox-0.1.0/src/manimvox/voice/engines/f5.py +117 -0
  155. manimvox-0.1.0/src/manimvox/voice/engines/fake.py +39 -0
  156. manimvox-0.1.0/src/manimvox/voice/engines/kokoro.py +92 -0
  157. manimvox-0.1.0/src/manimvox/voice/engines/openai.py +94 -0
  158. manimvox-0.1.0/src/manimvox/voice/engines/piper.py +128 -0
  159. manimvox-0.1.0/src/manimvox/voice/engines/say.py +78 -0
  160. manimvox-0.1.0/src/manimvox/voice/engines/xtts.py +112 -0
  161. manimvox-0.1.0/src/manimvox/voice/http.py +99 -0
  162. manimvox-0.1.0/src/manimvox/voice/pron.py +55 -0
  163. manimvox-0.1.0/src/manimvox/voice/registry.py +26 -0
  164. manimvox-0.1.0/tests/__init__.py +0 -0
  165. manimvox-0.1.0/tests/conftest.py +6 -0
  166. manimvox-0.1.0/tests/fixtures/hello/episodes/ep01_hello.py +15 -0
  167. manimvox-0.1.0/tests/fixtures/hello/series.json +9 -0
  168. manimvox-0.1.0/tests/http_fakes.py +39 -0
  169. manimvox-0.1.0/tests/media.py +81 -0
  170. manimvox-0.1.0/tests/test_audio.py +64 -0
  171. manimvox-0.1.0/tests/test_blocks.py +371 -0
  172. manimvox-0.1.0/tests/test_charts.py +189 -0
  173. manimvox-0.1.0/tests/test_cli.py +16 -0
  174. manimvox-0.1.0/tests/test_cli_commands.py +225 -0
  175. manimvox-0.1.0/tests/test_cli_post.py +199 -0
  176. manimvox-0.1.0/tests/test_convert.py +37 -0
  177. manimvox-0.1.0/tests/test_download.py +74 -0
  178. manimvox-0.1.0/tests/test_edge.py +96 -0
  179. manimvox-0.1.0/tests/test_elevenlabs.py +152 -0
  180. manimvox-0.1.0/tests/test_f5.py +206 -0
  181. manimvox-0.1.0/tests/test_frameworks.py +156 -0
  182. manimvox-0.1.0/tests/test_http.py +107 -0
  183. manimvox-0.1.0/tests/test_integrations.py +228 -0
  184. manimvox-0.1.0/tests/test_integrations_common.py +301 -0
  185. manimvox-0.1.0/tests/test_kit.py +318 -0
  186. manimvox-0.1.0/tests/test_kokoro.py +86 -0
  187. manimvox-0.1.0/tests/test_layout.py +37 -0
  188. manimvox-0.1.0/tests/test_manifests.py +49 -0
  189. manimvox-0.1.0/tests/test_mesh.py +102 -0
  190. manimvox-0.1.0/tests/test_model.py +169 -0
  191. manimvox-0.1.0/tests/test_openai.py +97 -0
  192. manimvox-0.1.0/tests/test_piper.py +172 -0
  193. manimvox-0.1.0/tests/test_playlist.py +121 -0
  194. manimvox-0.1.0/tests/test_post_audio.py +116 -0
  195. manimvox-0.1.0/tests/test_post_video.py +169 -0
  196. manimvox-0.1.0/tests/test_project.py +199 -0
  197. manimvox-0.1.0/tests/test_pron.py +25 -0
  198. manimvox-0.1.0/tests/test_runner.py +95 -0
  199. manimvox-0.1.0/tests/test_say.py +75 -0
  200. manimvox-0.1.0/tests/test_scaffold.py +104 -0
  201. manimvox-0.1.0/tests/test_scenes.py +148 -0
  202. manimvox-0.1.0/tests/test_sheets.py +28 -0
  203. manimvox-0.1.0/tests/test_skills_admin.py +501 -0
  204. manimvox-0.1.0/tests/test_skills_lint.py +117 -0
  205. manimvox-0.1.0/tests/test_skills_pkg.py +157 -0
  206. manimvox-0.1.0/tests/test_theme.py +95 -0
  207. manimvox-0.1.0/tests/test_tools.py +200 -0
  208. manimvox-0.1.0/tests/test_tools_render.py +171 -0
  209. manimvox-0.1.0/tests/test_voice.py +139 -0
  210. manimvox-0.1.0/tests/test_xtts.py +176 -0
  211. 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,6 @@
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
+ "skills": "./skills/"
6
+ }
@@ -0,0 +1,5 @@
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
+ }
@@ -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
@@ -0,0 +1,8 @@
1
+ __pycache__/
2
+ *.egg-info/
3
+ .venv/
4
+ dist/
5
+ build/
6
+ media/
7
+ .pytest_cache/
8
+ .ruff_cache/
@@ -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 |
@@ -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.