creating-explainer-videos-skill 2.0.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 (90) hide show
  1. creating_explainer_videos_skill-2.0.0/.gitignore +8 -0
  2. creating_explainer_videos_skill-2.0.0/CHANGELOG.md +34 -0
  3. creating_explainer_videos_skill-2.0.0/LICENSE +21 -0
  4. creating_explainer_videos_skill-2.0.0/PKG-INFO +180 -0
  5. creating_explainer_videos_skill-2.0.0/README.en.md +62 -0
  6. creating_explainer_videos_skill-2.0.0/README.md +158 -0
  7. creating_explainer_videos_skill-2.0.0/SECURITY.md +19 -0
  8. creating_explainer_videos_skill-2.0.0/docs/superpowers/plans/2026-08-31-pypi-distribution.md +106 -0
  9. creating_explainer_videos_skill-2.0.0/docs/superpowers/specs/2026-08-31-pypi-distribution-design.md +36 -0
  10. creating_explainer_videos_skill-2.0.0/pyproject.toml +67 -0
  11. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/__init__.py +3 -0
  12. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/__main__.py +4 -0
  13. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/cli.py +177 -0
  14. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/dist_audit.py +135 -0
  15. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/installer.py +351 -0
  16. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/integrity.py +77 -0
  17. creating_explainer_videos_skill-2.0.0/python_src/creating_explainer_videos_skill/resources.py +26 -0
  18. creating_explainer_videos_skill-2.0.0/python_tests/__init__.py +1 -0
  19. creating_explainer_videos_skill-2.0.0/python_tests/test_cli.py +66 -0
  20. creating_explainer_videos_skill-2.0.0/python_tests/test_distribution_audit.py +77 -0
  21. creating_explainer_videos_skill-2.0.0/python_tests/test_installer.py +151 -0
  22. creating_explainer_videos_skill-2.0.0/scripts/audit_python_dist.py +27 -0
  23. creating_explainer_videos_skill-2.0.0/scripts/smoke_pypi_package.py +97 -0
  24. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/SKILL.md +114 -0
  25. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/agents/openai.yaml +4 -0
  26. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/douyin-release/extension.json +15 -0
  27. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/douyin-release/profile.json +12 -0
  28. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/douyin-release/reference.md +6 -0
  29. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/ink-explainer/assets/style-tokens.css +11 -0
  30. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/ink-explainer/extension.json +15 -0
  31. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/ink-explainer/profile.json +12 -0
  32. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/ink-explainer/reference.md +5 -0
  33. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/neutral-technical-zh/extension.json +15 -0
  34. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/neutral-technical-zh/profile.json +14 -0
  35. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/neutral-technical-zh/reference.md +6 -0
  36. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/paper-theatre/assets/style-tokens.css +11 -0
  37. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/paper-theatre/extension.json +15 -0
  38. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/paper-theatre/profile.json +12 -0
  39. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/paper-theatre/reference.md +5 -0
  40. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/primary-source-research/extension.json +15 -0
  41. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/primary-source-research/profile.json +11 -0
  42. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/primary-source-research/reference.md +5 -0
  43. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/spatial-chamber/assets/style-tokens.css +10 -0
  44. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/spatial-chamber/extension.json +15 -0
  45. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/spatial-chamber/profile.json +16 -0
  46. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/spatial-chamber/reference.md +5 -0
  47. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/strict-release-qc/extension.json +15 -0
  48. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/strict-release-qc/profile.json +9 -0
  49. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/extensions/strict-release-qc/reference.md +6 -0
  50. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/presets/ai-principle-series/preset.json +21 -0
  51. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/presets/general-mechanism/preset.json +19 -0
  52. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/agent-forward-validation.md +17 -0
  53. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/content-and-script-contract.md +75 -0
  54. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/engineering-pipeline.md +75 -0
  55. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/extension-api.md +65 -0
  56. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/install-and-portability.md +68 -0
  57. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/release-qc-and-publishing.md +69 -0
  58. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/visual-systems-and-motion.md +34 -0
  59. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/references/visual-template-collection.md +186 -0
  60. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/cli.mjs +211 -0
  61. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/constants.mjs +27 -0
  62. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/extensions.mjs +106 -0
  63. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/gates.mjs +127 -0
  64. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/json.mjs +40 -0
  65. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/media.mjs +262 -0
  66. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/narration.mjs +75 -0
  67. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/process.mjs +41 -0
  68. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/project.mjs +186 -0
  69. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/renderer.mjs +107 -0
  70. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/state.mjs +196 -0
  71. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/templates.mjs +107 -0
  72. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/runtime/toolchain.mjs +127 -0
  73. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/scripts/.npmignore +2 -0
  74. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/scripts/explainer-video.mjs +11 -0
  75. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/scripts/extension_catalog.py +156 -0
  76. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/scripts/test_extensions.py +46 -0
  77. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/scripts/test_skill.py +70 -0
  78. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/ink-explainer/cover.css +1 -0
  79. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/ink-explainer/motion.mjs +32 -0
  80. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/ink-explainer/scene.css +2 -0
  81. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/ink-explainer/template.json +48 -0
  82. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/paper-theatre/cover.css +1 -0
  83. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/paper-theatre/motion.mjs +20 -0
  84. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/paper-theatre/scene.css +2 -0
  85. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/paper-theatre/template.json +45 -0
  86. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/spatial-chamber/cover.css +1 -0
  87. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/spatial-chamber/motion.mjs +39 -0
  88. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/spatial-chamber/scene.css +2 -0
  89. creating_explainer_videos_skill-2.0.0/skill/creating-explainer-videos/templates/spatial-chamber/template.json +48 -0
  90. creating_explainer_videos_skill-2.0.0/skill-manifest.json +333 -0
@@ -0,0 +1,8 @@
1
+ node_modules/
2
+ dist/
3
+ .worktrees/
4
+ *.tgz
5
+ __pycache__/
6
+ *.pyc
7
+ .DS_Store
8
+ Thumbs.db
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ All notable changes are documented here.
4
+
5
+ ## [2.0.0] - 2026-08-31
6
+
7
+ ### Changed
8
+
9
+ - Renamed the product from an AI-series-specific Skill to the domain-neutral `creating-explainer-videos-skill` package and `creating-explainer-videos` Skill.
10
+ - Promoted `explainer-video-skill` to the primary CLI; kept `ai-principle-video-skill` as a deprecated compatibility alias.
11
+ - Moved series-specific defaults into the isolated `ai-principle-series` example preset.
12
+
13
+ ### Added
14
+
15
+ - Executable production state machine and JSON-first project lifecycle commands.
16
+ - Runnable renderer and dedicated cover generated for every new project.
17
+ - Canonical narration normalization, escaped/snake-case underscore guard, caption/TTS identity, and measured timing import.
18
+ - Deterministic render, mux, ffprobe/FFmpeg audit, artifact hashing, packaging, and human-release decision boundary.
19
+ - Three-template visual collection: Paper Theatre, Spatial Chamber, and Ink Explainer.
20
+ - Spatial Chamber depth/path grammar, licensed-plugin fallbacks, and QC limits derived from the former B visual direction.
21
+ - Declarative presets, permission-listed extensions, immutable hash metadata, and legacy research ID alias.
22
+ - Credit-card clearing and quantum-tunneling non-AI fixtures.
23
+ - Windows/Linux and Node.js 18/22 CI plus packed npx/global install smoke tests.
24
+ - PyPI wheel/source distribution with a dependency-free Python lifecycle CLI, bundled canonical Skill assets, Node.js runtime delegation, archive security audit, and clean-environment smoke test.
25
+
26
+ ### Security and licensing
27
+
28
+ - No font, premium GSAP, music, audio, image, or video binaries are redistributed.
29
+ - Automated QC cannot set `passed`; a named human must completely review the exact artifact hash.
30
+ - Package commands use argument arrays and keep provider credentials outside projects and logs.
31
+
32
+ ## [1.1.0] - 2026-08-30
33
+
34
+ Legacy AI-series-specific first public release: portable installer, declarative extension API, integrity manifest, Ink/Paper profiles, episode scaffold, and release gates.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wzwailr
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.
@@ -0,0 +1,180 @@
1
+ Metadata-Version: 2.5
2
+ Name: creating-explainer-videos-skill
3
+ Version: 2.0.0
4
+ Summary: Executable Agent Skill and scaffold for producing rigorous mechanism and process explainer videos.
5
+ Project-URL: Homepage, https://github.com/wzwailr/creating-explainer-videos-skill
6
+ Project-URL: Repository, https://github.com/wzwailr/creating-explainer-videos-skill
7
+ Project-URL: Issues, https://github.com/wzwailr/creating-explainer-videos-skill/issues
8
+ Project-URL: Changelog, https://github.com/wzwailr/creating-explainer-videos-skill/blob/main/CHANGELOG.md
9
+ Author: wzwailr
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: agent-skill,educational-video,explainer-video,gsap,motion-design
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Topic :: Multimedia :: Video
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+
23
+ # Explainer Video Skill
24
+
25
+ [![CI](https://github.com/wzwailr/creating-explainer-videos-skill/actions/workflows/ci.yml/badge.svg)](https://github.com/wzwailr/creating-explainer-videos-skill/actions/workflows/ci.yml)
26
+ [![PyPI](https://img.shields.io/pypi/v/creating-explainer-videos-skill)](https://pypi.org/project/creating-explainer-videos-skill/)
27
+ [![Release](https://img.shields.io/github/v/release/wzwailr/creating-explainer-videos-skill)](https://github.com/wzwailr/creating-explainer-videos-skill/releases)
28
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
29
+
30
+ 一套通用、可安装、可扩展、真正可执行的解释型视频 Agent Skill 与工程脚手架。它适用于机制、流程、系统、科学和技术科普,不绑定某个系列或某类题材。
31
+
32
+ 它不只是几份 Markdown:包内包含生产状态机、项目生成器、旁白规范化、真实音频时轴导入、三套可编程视觉模板、确定性 HTML/SVG/GSAP 渲染器、HyperFrames/FFmpeg 适配、媒体质检、扩展 API、打包工具和非 AI 端到端示例。
33
+
34
+ [English](README.en.md) · [v2 迁移指南](docs/MIGRATION_V2.md) · [视觉模板集](skill/creating-explainer-videos/references/visual-template-collection.md) · [扩展 API](skill/creating-explainer-videos/references/extension-api.md)
35
+
36
+ ## 一键使用
37
+
38
+ 推荐使用 `pipx` 安装独立 CLI:
39
+
40
+ ```powershell
41
+ pipx install creating-explainer-videos-skill==2.0.0
42
+ explainer-video-skill --version
43
+ ```
44
+
45
+ 也可以安装到当前 Python 环境:
46
+
47
+ ```powershell
48
+ python -m pip install creating-explainer-videos-skill==2.0.0
49
+ explainer-video-skill --version
50
+ ```
51
+
52
+ Python 入口可在没有 Node.js 时完成 Skill 的安装、更新、校验、回滚、卸载和扩展列表。创建视频工程、模板预览、渲染和媒体命令使用包内同一套 JavaScript runtime,需要 Node.js 18+。
53
+
54
+ 需要 npm 形式时,可直接安装 GitHub Release 中经过验证的 tarball:
55
+
56
+ ```powershell
57
+ npm install --global https://github.com/wzwailr/creating-explainer-videos-skill/releases/download/v2.0.0/creating-explainer-videos-skill-2.0.0.tgz
58
+ ```
59
+
60
+ 安装到 Codex:
61
+
62
+ ```powershell
63
+ explainer-video-skill install --target codex --json
64
+ explainer-video-skill verify --target codex --json
65
+ ```
66
+
67
+ 安装到任何支持目录型 `SKILL.md` 的 Agent、仓库或团队目录:
68
+
69
+ ```powershell
70
+ explainer-video-skill install --destination "C:\path\to\skills" --json
71
+ explainer-video-skill verify --destination "C:\path\to\skills" --json
72
+ ```
73
+
74
+ `--destination` 指向 skills 父目录,实际安装目录是 `creating-explainer-videos`。升级、回滚和卸载均保留可恢复备份。
75
+
76
+ ## 直接创建视频工程
77
+
78
+ ```powershell
79
+ explainer-video-skill doctor --json
80
+ explainer-video-skill templates list --json
81
+ explainer-video-skill new ".\my-video" `
82
+ --title "信用卡清算" `
83
+ --topic "为什么授权成功后钱还没有到账" `
84
+ --template spatial-chamber `
85
+ --preset general-mechanism `
86
+ --json
87
+ explainer-video-skill status --json ".\my-video"
88
+ explainer-video-skill next --json ".\my-video"
89
+ ```
90
+
91
+ 工程会生成 JSON-first 生产合同、状态机、可运行 renderer、独立 cover、模板资产、旁白/cue 文件、媒体/QC/发布目录。Agent 按以下闭环推进:
92
+
93
+ ```text
94
+ status -> next -> 执行真实工作 -> 写入证据 -> validate -> 下一阶段
95
+ ```
96
+
97
+ 核心阶段:
98
+
99
+ ```text
100
+ brief -> evidence -> mechanism_map -> narration_and_cues
101
+ -> real_audio_timing -> scene_spec -> runnable_renderer
102
+ -> render -> automated_qc -> human_listen
103
+ -> publishing_package -> human_release_decision
104
+ ```
105
+
106
+ 自动化只能生成 `release_candidate_pending_human_listen`。只有人工完整听看过同一个 SHA-256 成片并明确记录决定,才能成为 `passed`。
107
+
108
+ ## 视觉模板集
109
+
110
+ | 模板 | 最适合的知识结构 | 核心动作 |
111
+ | --- | --- | --- |
112
+ | `paper-theatre` | 对象身份、证据、分拣、比较、规则、物理处理 | 剪、折、盖章、堆叠、交接 |
113
+ | `spatial-chamber` | 路由、层级、管线、队列、网络、状态迁移 | 镜头纵深、路径飞行、分层变换 |
114
+ | `ink-explainer` | 推导、公式、因果关系、比较、纠错、密集讲解 | 手绘、连接、圈注、推导、修正 |
115
+
116
+ 三者是结构和运动语法不同的模板,不是 A/B/C 换色版。每套都包含独立 DOM 指纹、场景 CSS、封面 CSS、时间轴控制器、插件降级和可量化 QC 规则。Spatial Chamber 正式收录了原 B 方案的纵深、路径和空间叙事能力。
117
+
118
+ 钉钉进步体/DingTalk Sans 可作为本机显示字体,Noto Sans SC 可作为字幕字体;仓库不分发字体文件。GSAP 商业插件同样不随包分发,每个模板都声明了开源/原生降级路径。
119
+
120
+ ## 旁白、动画与渲染
121
+
122
+ 字幕与 TTS 来自同一个 canonical 字符串。规范化会移除 `\_`、snake_case 下划线和可能被读成符号名的 Markdown 标记。真实旁白生成后导入测量时轴:
123
+
124
+ ```powershell
125
+ explainer-video-skill narration prepare ".\my-video" --json
126
+ explainer-video-skill narration import-timing ".\my-video" --timing ".\timing.json" --json
127
+ explainer-video-skill build ".\my-video" --json
128
+ explainer-video-skill render ".\my-video" --json
129
+ explainer-video-skill cover ".\my-video" --json
130
+ explainer-video-skill mux ".\my-video" --audio ".\narration.wav" --json
131
+ explainer-video-skill audit ".\my-video" --json
132
+ explainer-video-skill package ".\my-video" --json
133
+ ```
134
+
135
+ 最终动画只使用真实测量旁白时间,渲染页使用可暂停、可 seek、确定性的时间轴。禁止用整屏扫描线、长条扫光或无意义粒子代替知识动作。
136
+
137
+ ## 预设与扩展
138
+
139
+ `general-mechanism` 是通用默认预设,而且故意不锁定视觉模板。`ai-principle-series` 只是一个经过真实系列验证的示例预设,AI 不是包的产品身份。
140
+
141
+ 扩展 API v1 支持 `visual`、`voice`、`research`、`qc`、`publishing`。扩展是声明式 JSON/文档/可授权资产,包含权限清单和哈希锁,不允许任意 `hooks`、`scripts` 或 `postinstall`。
142
+
143
+ 内置扩展:
144
+
145
+ - 三个同名视觉 profile;
146
+ - `neutral-technical-zh` 中文技术讲解声音规则;
147
+ - `primary-source-research` 一手资料证据规则;
148
+ - `strict-release-qc` 自动与人工发布门禁;
149
+ - `douyin-release` 抖音标题、封面与发布资料规则。
150
+
151
+ ## 示例与验证
152
+
153
+ 包内提供两个非 AI fixture:
154
+
155
+ - `credit-card-clearing`:Spatial Chamber;
156
+ - `quantum-tunneling`:Ink Explainer。
157
+
158
+ ```powershell
159
+ npm test
160
+ npm run examples:verify
161
+ python -m unittest discover -s python_tests -v
162
+ $env:PYTHONUTF8='1'
163
+ python skill\creating-explainer-videos\scripts\test_skill.py
164
+ python skill\creating-explainer-videos\scripts\test_extensions.py
165
+ npm run pack:local
166
+ npm run pack:zip
167
+ npm run smoke:packed -- .\dist\creating-explainer-videos-skill-2.0.0.tgz
168
+ python -m build --sdist --wheel --outdir .\dist\pypi
169
+ python -m twine check .\dist\pypi\*
170
+ python .\scripts\audit_python_dist.py .\dist\pypi\*
171
+ python .\scripts\smoke_pypi_package.py .\dist\pypi\creating_explainer_videos_skill-2.0.0-py3-none-any.whl
172
+ ```
173
+
174
+ CI 覆盖 Windows/Linux、Node.js 18/22 和 Python 分发。发布前会分别从实际 npm `.tgz` 与 Python wheel 隔离安装,验证主/旧命令、项目脚手架、模板集、Skill 安装/校验/升级/回滚/卸载和全局命令。
175
+
176
+ ## 许可证与安全边界
177
+
178
+ 原创代码和文档采用 [MIT License](LICENSE)。字体、GSAP 商业插件、音乐、音效、图片、视频和供应商凭据不在包内。付费或异步生成必须显式授权、保存任务 ID、先查询既有任务再决定是否重试。
179
+
180
+ 详见 [安全策略](SECURITY.md)、[贡献指南](CONTRIBUTING.md)、[更新记录](CHANGELOG.md) 和 [v2.0.0 Release Notes](docs/releases/v2.0.0.md)。
@@ -0,0 +1,62 @@
1
+ # Explainer Video Skill
2
+
3
+ An installable, extensible, executable Agent Skill and project scaffold for mechanism, process, system, science, and technical explainer videos.
4
+
5
+ This is not a Markdown-only prompt pack. It ships a production state machine, JSON-first project generator, narration normalization, measured-audio timing import, three programmable visual templates, deterministic HTML/SVG/GSAP rendering, HyperFrames/FFmpeg adapters, media QC, declarative extensions, release gates, and non-AI end-to-end fixtures.
6
+
7
+ ## Install
8
+
9
+ Recommended isolated CLI installation:
10
+
11
+ ```powershell
12
+ pipx install creating-explainer-videos-skill==2.0.0
13
+ explainer-video-skill --version
14
+ ```
15
+
16
+ Or install into the current Python environment:
17
+
18
+ ```powershell
19
+ python -m pip install creating-explainer-videos-skill==2.0.0
20
+ ```
21
+
22
+ Python lifecycle commands work without Node.js. Project creation, template preview, rendering, and media commands execute the bundled canonical JavaScript runtime and require Node.js 18+.
23
+
24
+ The verified npm tarball is also available from the GitHub Release:
25
+
26
+ ```powershell
27
+ npm install --global https://github.com/wzwailr/creating-explainer-videos-skill/releases/download/v2.0.0/creating-explainer-videos-skill-2.0.0.tgz
28
+ ```
29
+
30
+ Install the Skill into Codex or another folder-based Agent host:
31
+
32
+ ```powershell
33
+ explainer-video-skill install --target codex --json
34
+ explainer-video-skill install --destination "C:\path\to\skills" --json
35
+ ```
36
+
37
+ ## Create a project
38
+
39
+ ```powershell
40
+ explainer-video-skill doctor --json
41
+ explainer-video-skill new ".\demo" --title "Credit-card clearing" --topic "Why authorization is not settlement" --template spatial-chamber --preset general-mechanism --json
42
+ explainer-video-skill status --json ".\demo"
43
+ explainer-video-skill next --json ".\demo"
44
+ ```
45
+
46
+ Agents advance through `status -> next -> real work -> evidence -> validate`. The production stages cover brief, evidence, mechanism mapping, canonical narration/cues, measured audio timing, scene design, renderer, media render, automated QC, human listening, publishing package, and explicit human release decision.
47
+
48
+ Automation cannot approve a release. It can only produce `release_candidate_pending_human_listen`; `passed` requires a named human who reviewed the exact artifact hash.
49
+
50
+ ## Visual template collection
51
+
52
+ - `paper-theatre`: object identity, evidence, sorting, comparison, and physical processing.
53
+ - `spatial-chamber`: routes, layers, pipelines, networks, queues, and spatial state transitions.
54
+ - `ink-explainer`: derivations, formulas, causal relations, comparison, annotation, and correction.
55
+
56
+ The templates have distinct DOM and motion fingerprints, cover grammars, plugin fallbacks, and measurable QC rules. They are not lettered recolors.
57
+
58
+ ## Portable boundaries
59
+
60
+ The package does not redistribute fonts, premium GSAP plugins, music, sound effects, stock media, or credentials. DingTalk JinBuTi/DingTalk Sans and Noto Sans SC may be used when legally installed on the host. Paid or asynchronous providers require explicit authorization and task-ID recovery rules.
61
+
62
+ See the [Chinese README](README.md), [visual collection](skill/creating-explainer-videos/references/visual-template-collection.md), [extension API](skill/creating-explainer-videos/references/extension-api.md), [v2 migration](docs/MIGRATION_V2.md), and [release notes](docs/releases/v2.0.0.md).
@@ -0,0 +1,158 @@
1
+ # Explainer Video Skill
2
+
3
+ [![CI](https://github.com/wzwailr/creating-explainer-videos-skill/actions/workflows/ci.yml/badge.svg)](https://github.com/wzwailr/creating-explainer-videos-skill/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/creating-explainer-videos-skill)](https://pypi.org/project/creating-explainer-videos-skill/)
5
+ [![Release](https://img.shields.io/github/v/release/wzwailr/creating-explainer-videos-skill)](https://github.com/wzwailr/creating-explainer-videos-skill/releases)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
+
8
+ 一套通用、可安装、可扩展、真正可执行的解释型视频 Agent Skill 与工程脚手架。它适用于机制、流程、系统、科学和技术科普,不绑定某个系列或某类题材。
9
+
10
+ 它不只是几份 Markdown:包内包含生产状态机、项目生成器、旁白规范化、真实音频时轴导入、三套可编程视觉模板、确定性 HTML/SVG/GSAP 渲染器、HyperFrames/FFmpeg 适配、媒体质检、扩展 API、打包工具和非 AI 端到端示例。
11
+
12
+ [English](README.en.md) · [v2 迁移指南](docs/MIGRATION_V2.md) · [视觉模板集](skill/creating-explainer-videos/references/visual-template-collection.md) · [扩展 API](skill/creating-explainer-videos/references/extension-api.md)
13
+
14
+ ## 一键使用
15
+
16
+ 推荐使用 `pipx` 安装独立 CLI:
17
+
18
+ ```powershell
19
+ pipx install creating-explainer-videos-skill==2.0.0
20
+ explainer-video-skill --version
21
+ ```
22
+
23
+ 也可以安装到当前 Python 环境:
24
+
25
+ ```powershell
26
+ python -m pip install creating-explainer-videos-skill==2.0.0
27
+ explainer-video-skill --version
28
+ ```
29
+
30
+ Python 入口可在没有 Node.js 时完成 Skill 的安装、更新、校验、回滚、卸载和扩展列表。创建视频工程、模板预览、渲染和媒体命令使用包内同一套 JavaScript runtime,需要 Node.js 18+。
31
+
32
+ 需要 npm 形式时,可直接安装 GitHub Release 中经过验证的 tarball:
33
+
34
+ ```powershell
35
+ npm install --global https://github.com/wzwailr/creating-explainer-videos-skill/releases/download/v2.0.0/creating-explainer-videos-skill-2.0.0.tgz
36
+ ```
37
+
38
+ 安装到 Codex:
39
+
40
+ ```powershell
41
+ explainer-video-skill install --target codex --json
42
+ explainer-video-skill verify --target codex --json
43
+ ```
44
+
45
+ 安装到任何支持目录型 `SKILL.md` 的 Agent、仓库或团队目录:
46
+
47
+ ```powershell
48
+ explainer-video-skill install --destination "C:\path\to\skills" --json
49
+ explainer-video-skill verify --destination "C:\path\to\skills" --json
50
+ ```
51
+
52
+ `--destination` 指向 skills 父目录,实际安装目录是 `creating-explainer-videos`。升级、回滚和卸载均保留可恢复备份。
53
+
54
+ ## 直接创建视频工程
55
+
56
+ ```powershell
57
+ explainer-video-skill doctor --json
58
+ explainer-video-skill templates list --json
59
+ explainer-video-skill new ".\my-video" `
60
+ --title "信用卡清算" `
61
+ --topic "为什么授权成功后钱还没有到账" `
62
+ --template spatial-chamber `
63
+ --preset general-mechanism `
64
+ --json
65
+ explainer-video-skill status --json ".\my-video"
66
+ explainer-video-skill next --json ".\my-video"
67
+ ```
68
+
69
+ 工程会生成 JSON-first 生产合同、状态机、可运行 renderer、独立 cover、模板资产、旁白/cue 文件、媒体/QC/发布目录。Agent 按以下闭环推进:
70
+
71
+ ```text
72
+ status -> next -> 执行真实工作 -> 写入证据 -> validate -> 下一阶段
73
+ ```
74
+
75
+ 核心阶段:
76
+
77
+ ```text
78
+ brief -> evidence -> mechanism_map -> narration_and_cues
79
+ -> real_audio_timing -> scene_spec -> runnable_renderer
80
+ -> render -> automated_qc -> human_listen
81
+ -> publishing_package -> human_release_decision
82
+ ```
83
+
84
+ 自动化只能生成 `release_candidate_pending_human_listen`。只有人工完整听看过同一个 SHA-256 成片并明确记录决定,才能成为 `passed`。
85
+
86
+ ## 视觉模板集
87
+
88
+ | 模板 | 最适合的知识结构 | 核心动作 |
89
+ | --- | --- | --- |
90
+ | `paper-theatre` | 对象身份、证据、分拣、比较、规则、物理处理 | 剪、折、盖章、堆叠、交接 |
91
+ | `spatial-chamber` | 路由、层级、管线、队列、网络、状态迁移 | 镜头纵深、路径飞行、分层变换 |
92
+ | `ink-explainer` | 推导、公式、因果关系、比较、纠错、密集讲解 | 手绘、连接、圈注、推导、修正 |
93
+
94
+ 三者是结构和运动语法不同的模板,不是 A/B/C 换色版。每套都包含独立 DOM 指纹、场景 CSS、封面 CSS、时间轴控制器、插件降级和可量化 QC 规则。Spatial Chamber 正式收录了原 B 方案的纵深、路径和空间叙事能力。
95
+
96
+ 钉钉进步体/DingTalk Sans 可作为本机显示字体,Noto Sans SC 可作为字幕字体;仓库不分发字体文件。GSAP 商业插件同样不随包分发,每个模板都声明了开源/原生降级路径。
97
+
98
+ ## 旁白、动画与渲染
99
+
100
+ 字幕与 TTS 来自同一个 canonical 字符串。规范化会移除 `\_`、snake_case 下划线和可能被读成符号名的 Markdown 标记。真实旁白生成后导入测量时轴:
101
+
102
+ ```powershell
103
+ explainer-video-skill narration prepare ".\my-video" --json
104
+ explainer-video-skill narration import-timing ".\my-video" --timing ".\timing.json" --json
105
+ explainer-video-skill build ".\my-video" --json
106
+ explainer-video-skill render ".\my-video" --json
107
+ explainer-video-skill cover ".\my-video" --json
108
+ explainer-video-skill mux ".\my-video" --audio ".\narration.wav" --json
109
+ explainer-video-skill audit ".\my-video" --json
110
+ explainer-video-skill package ".\my-video" --json
111
+ ```
112
+
113
+ 最终动画只使用真实测量旁白时间,渲染页使用可暂停、可 seek、确定性的时间轴。禁止用整屏扫描线、长条扫光或无意义粒子代替知识动作。
114
+
115
+ ## 预设与扩展
116
+
117
+ `general-mechanism` 是通用默认预设,而且故意不锁定视觉模板。`ai-principle-series` 只是一个经过真实系列验证的示例预设,AI 不是包的产品身份。
118
+
119
+ 扩展 API v1 支持 `visual`、`voice`、`research`、`qc`、`publishing`。扩展是声明式 JSON/文档/可授权资产,包含权限清单和哈希锁,不允许任意 `hooks`、`scripts` 或 `postinstall`。
120
+
121
+ 内置扩展:
122
+
123
+ - 三个同名视觉 profile;
124
+ - `neutral-technical-zh` 中文技术讲解声音规则;
125
+ - `primary-source-research` 一手资料证据规则;
126
+ - `strict-release-qc` 自动与人工发布门禁;
127
+ - `douyin-release` 抖音标题、封面与发布资料规则。
128
+
129
+ ## 示例与验证
130
+
131
+ 包内提供两个非 AI fixture:
132
+
133
+ - `credit-card-clearing`:Spatial Chamber;
134
+ - `quantum-tunneling`:Ink Explainer。
135
+
136
+ ```powershell
137
+ npm test
138
+ npm run examples:verify
139
+ python -m unittest discover -s python_tests -v
140
+ $env:PYTHONUTF8='1'
141
+ python skill\creating-explainer-videos\scripts\test_skill.py
142
+ python skill\creating-explainer-videos\scripts\test_extensions.py
143
+ npm run pack:local
144
+ npm run pack:zip
145
+ npm run smoke:packed -- .\dist\creating-explainer-videos-skill-2.0.0.tgz
146
+ python -m build --sdist --wheel --outdir .\dist\pypi
147
+ python -m twine check .\dist\pypi\*
148
+ python .\scripts\audit_python_dist.py .\dist\pypi\*
149
+ python .\scripts\smoke_pypi_package.py .\dist\pypi\creating_explainer_videos_skill-2.0.0-py3-none-any.whl
150
+ ```
151
+
152
+ CI 覆盖 Windows/Linux、Node.js 18/22 和 Python 分发。发布前会分别从实际 npm `.tgz` 与 Python wheel 隔离安装,验证主/旧命令、项目脚手架、模板集、Skill 安装/校验/升级/回滚/卸载和全局命令。
153
+
154
+ ## 许可证与安全边界
155
+
156
+ 原创代码和文档采用 [MIT License](LICENSE)。字体、GSAP 商业插件、音乐、音效、图片、视频和供应商凭据不在包内。付费或异步生成必须显式授权、保存任务 ID、先查询既有任务再决定是否重试。
157
+
158
+ 详见 [安全策略](SECURITY.md)、[贡献指南](CONTRIBUTING.md)、[更新记录](CHANGELOG.md) 和 [v2.0.0 Release Notes](docs/releases/v2.0.0.md)。
@@ -0,0 +1,19 @@
1
+ # Security policy
2
+
3
+ ## Supported version
4
+
5
+ Security fixes target the latest major release. v1 is retained as a legacy release; upgrade to v2 for current fixes.
6
+
7
+ ## Reporting
8
+
9
+ Do not post credentials, tokens, private media, paid-provider task IDs, or personal filesystem paths in a public issue. Create a minimal non-sensitive report and request a private follow-up when sensitive evidence is unavoidable.
10
+
11
+ ## Trust boundaries
12
+
13
+ - Extension API v1 is declarative, permission-listed, path-contained, and rejects executable hooks.
14
+ - Skill installation verifies a SHA-256 package manifest before copying files.
15
+ - Update, rollback, and uninstall target one exact Skill directory and preserve recoverable backups.
16
+ - CLI process execution uses argument arrays; it does not build shell commands from project text.
17
+ - Provider credentials and paid-execution authorization remain outside the package and generated projects.
18
+ - Automated QC cannot create a human `passed` decision.
19
+ - Published archives must exclude tokens, personal absolute paths, cache files, generated media, font binaries, and premium plugin binaries.
@@ -0,0 +1,106 @@
1
+ # PyPI Distribution Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Add, validate, and publish a Python distribution that installs the complete explainer-video Skill and exposes the existing command surface.
6
+
7
+ **Architecture:** A dependency-free Python installer owns filesystem-safe Skill lifecycle commands. Project and render commands execute the canonical bundled JavaScript runtime after checking Node.js 18+, while Hatchling includes the canonical Skill tree directly in the wheel so assets have one source of truth.
8
+
9
+ **Tech Stack:** Python 3.9+, standard library, Hatchling, unittest, Node.js 18+, Twine
10
+
11
+ **Spec:** `docs/superpowers/specs/2026-08-31-pypi-distribution-design.md`
12
+
13
+ ## Global Constraints
14
+
15
+ - Package and command identity remain `creating-explainer-videos-skill` and `explainer-video-skill` at version `2.0.0`.
16
+ - The Python distribution contains the canonical Skill, template collection, extensions, presets, runtime, scripts, and manifest.
17
+ - Python lifecycle commands work without Node.js; project and rendering commands require Node.js 18+.
18
+ - Publication credentials must never be printed, copied into the repository, or included in an archive.
19
+ - Existing npm behavior and its package file allowlist remain unchanged.
20
+
21
+ ---
22
+
23
+ ### Task 1: Python CLI and packaged-resource contract
24
+
25
+ **Files:**
26
+ - Create: `python_tests/test_cli.py`
27
+ - Create: `python_src/creating_explainer_videos_skill/__init__.py`
28
+ - Create: `python_src/creating_explainer_videos_skill/__main__.py`
29
+ - Create: `python_src/creating_explainer_videos_skill/cli.py`
30
+ - Create: `python_src/creating_explainer_videos_skill/resources.py`
31
+
32
+ **Interfaces:**
33
+ - Produces: `main(argv: Sequence[str] | None) -> int`, `package_paths() -> PackagePaths`, and the two console entrypoints.
34
+ - Consumes: canonical Skill files from the repository in source mode and bundled `assets/` in an installed wheel.
35
+
36
+ - [x] **Step 1: Write failing CLI tests**
37
+
38
+ ```python
39
+ def test_version_works_without_node(self):
40
+ result = run_cli("--version", env={"PATH": ""})
41
+ self.assertEqual(result.returncode, 0)
42
+ self.assertEqual(result.stdout.strip(), "2.0.0")
43
+
44
+ def test_project_command_reports_node_18_requirement(self):
45
+ result = run_cli("templates", "list", env={"PATH": ""})
46
+ self.assertNotEqual(result.returncode, 0)
47
+ self.assertIn("Node.js 18+", result.stderr)
48
+ ```
49
+
50
+ - [x] **Step 2: Run `py -m unittest python_tests.test_cli -v` and confirm failure because the package does not exist.**
51
+ - [x] **Step 3: Implement version/help handling, packaged-resource discovery, and Node command delegation.**
52
+ - [x] **Step 4: Re-run the focused test and confirm it passes.**
53
+
54
+ ### Task 2: Safe Python Skill lifecycle
55
+
56
+ **Files:**
57
+ - Create: `python_tests/test_installer.py`
58
+ - Create: `python_src/creating_explainer_videos_skill/installer.py`
59
+ - Create: `python_src/creating_explainer_videos_skill/integrity.py`
60
+ - Modify: `python_src/creating_explainer_videos_skill/cli.py`
61
+
62
+ **Interfaces:**
63
+ - Produces: `install_skill`, `verify_installed_skill`, `rollback_skill`, `uninstall_skill`, and `discover_extensions`.
64
+ - Consumes: `PackagePaths.skill_root` and `PackagePaths.manifest_path` from Task 1.
65
+
66
+ - [x] **Step 1: Write failing integration tests for install, update backup, manifest tampering, rollback, uninstall recovery, custom destinations, and extension traversal.**
67
+ - [x] **Step 2: Run `py -m unittest python_tests.test_installer -v` and confirm failures name missing lifecycle behavior.**
68
+ - [x] **Step 3: Implement staged copies, manifest verification, extension validation, recoverable backups, and JSON output.**
69
+ - [x] **Step 4: Re-run both Python test modules and confirm they pass.**
70
+
71
+ ### Task 3: Build metadata and archive smoke test
72
+
73
+ **Files:**
74
+ - Create: `pyproject.toml`
75
+ - Create: `scripts/smoke_pypi_package.py`
76
+ - Create: `scripts/audit_python_dist.py`
77
+ - Create: `python_tests/__init__.py`
78
+ - Modify: `.gitignore`
79
+
80
+ **Interfaces:**
81
+ - Produces: `dist/*.whl`, `dist/*.tar.gz`, and deterministic archive audit/smoke commands.
82
+ - Consumes: Python package and canonical Skill tree from Tasks 1-2.
83
+
84
+ - [x] **Step 1: Write the smoke script expectations for wheel installation, both CLI names, templates, Skill installation, and verification.**
85
+ - [x] **Step 2: Run the build before metadata exists and confirm it fails for the expected missing configuration.**
86
+ - [x] **Step 3: Add Hatchling metadata, console scripts, force-included assets, and archive auditing.**
87
+ - [x] **Step 4: Build wheel/sdist in an isolated environment, run `twine check`, audit both archives, and run the exact-wheel smoke test.**
88
+
89
+ ### Task 4: Documentation, release evidence, and publication
90
+
91
+ **Files:**
92
+ - Modify: `README.md`
93
+ - Modify: `README.en.md`
94
+ - Modify: `CHANGELOG.md`
95
+ - Modify: `docs/releases/v2.0.0.md`
96
+ - Modify: `docs/superpowers/plans/2026-08-31-pypi-distribution.md`
97
+
98
+ **Interfaces:**
99
+ - Produces: verified install instructions and public registry evidence.
100
+ - Consumes: exact built archives and local PyPI credential.
101
+
102
+ - [x] **Step 1: Document `pipx`/`pip` installation, Node.js boundary, dual-registry identity, and public verification commands.**
103
+ - [x] **Step 2: Run all Python tests, existing Node tests, Skill validators, build, `twine check`, archive audit, and clean-wheel smoke test.**
104
+ - [ ] **Step 3: Upload only the verified wheel and source distribution to production PyPI without exposing the token.**
105
+ - [ ] **Step 4: Install `creating-explainer-videos-skill==2.0.0` from public PyPI in a fresh environment and repeat the smoke checks.**
106
+ - [ ] **Step 5: Commit and push the verified source changes, then update the GitHub repository homepage/release links if publication succeeds.**
@@ -0,0 +1,36 @@
1
+ # PyPI Distribution Design
2
+
3
+ ## Goal
4
+
5
+ Publish `creating-explainer-videos-skill` as a real Python distribution without weakening the existing npm package or duplicating the maintained Skill and template assets.
6
+
7
+ ## User Experience
8
+
9
+ - Install with `pipx install creating-explainer-videos-skill` or `python -m pip install creating-explainer-videos-skill`.
10
+ - Run `explainer-video-skill --help` and `explainer-video-skill --version` without Node.js.
11
+ - Install, update, verify, roll back, uninstall, and list extensions through the Python CLI.
12
+ - Keep `ai-principle-video-skill` as a compatibility command.
13
+ - Delegate project creation, validation, rendering, and media commands to the bundled JavaScript runtime, with a clear Node.js 18+ diagnostic when Node is unavailable.
14
+
15
+ ## Architecture
16
+
17
+ The Python package is an additional distribution layer in the same repository. Hatchling builds a pure-Python wheel from `python_src/creating_explainer_videos_skill` and force-includes the canonical `skill/creating-explainer-videos` tree plus `skill-manifest.json` as package assets. This avoids a second maintained copy of the Skill, templates, extensions, and runtime.
18
+
19
+ The Python installer mirrors the safety properties of the Node installer: validate before mutation, stage before replace, back up an existing installation, keep uninstall recoverable, reject path traversal in extension entrypoints, and verify every packaged file against the canonical manifest.
20
+
21
+ ## Boundaries
22
+
23
+ - Python 3.9+ is required for the Python distribution.
24
+ - Node.js 18+ remains required for project and rendering commands because the canonical runtime, GSAP templates, and rendering toolchain are JavaScript-based.
25
+ - No credentials, `.npmrc`, `.pypirc`, fonts, media binaries, caches, or machine-specific paths may enter wheel or source distribution files.
26
+ - The npm tarball allowlist remains unchanged.
27
+ - PyPI publication uses the local credential only at upload time; it is never printed, committed, or copied into project files.
28
+
29
+ ## Verification Gates
30
+
31
+ 1. Python unit and integration tests pass.
32
+ 2. Existing Node tests and Skill validators pass.
33
+ 3. Wheel and sdist build successfully and pass `twine check`.
34
+ 4. A clean virtual environment installs the exact wheel and exercises version, help, template listing, Skill installation, and verification.
35
+ 5. The built archives pass a secret and portability audit.
36
+ 6. After upload, a second clean environment installs the exact public PyPI version and repeats the smoke checks.