Sync third-party and MCP marketplace plugins
Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed.
This commit is contained in:
1 parent
ec10f9dc0c
commit
e4ce1effaf
29 files changed
+217
-49
No files matched your search
@@ -2,8 +2,8 @@
|
||||
"sourceId": "caveman",
|
||||
"repo": "https://github.com/JuliusBrussee/caveman.git",
|
||||
"ref": "main",
|
||||
"commit": "cc067b2b3813e3187ba656b1d908761ad3e5b904",
|
||||
"commit": "c2906c626be1d703b04e203d9f804a263e87f4ef",
|
||||
"adapter": "codex-plugin",
|
||||
"sourcePath": "plugins/caveman",
|
||||
"syncedAt": "2026-09-16T15:59:59Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "grill-me",
|
||||
"repo": "https://github.com/mattpocock/skills.git",
|
||||
"ref": "main",
|
||||
"commit": "959a8e9f1edc3adbe2f7e3054bb6fbefa6696260",
|
||||
"commit": "74ca5fe077456a0b3b2f5310cf9430999fd0b5fd",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills/productivity",
|
||||
"syncedAt": "2026-09-15T16:00:00Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "hardware-development",
|
||||
"version": "1.1.0",
|
||||
"version": "1.2.0",
|
||||
"description": "以 KiCad 为主的电子硬件开发流程,覆盖电路实施、PCB 布局布线、验证和制造交付。",
|
||||
"author": {
|
||||
"name": "xufeng",
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"sourceId": "hardware-development",
|
||||
"repo": "https://git.playones.com/xufeng/hardware-development.git",
|
||||
"ref": "v1.1.0",
|
||||
"commit": "057d5e82410c789c0c8b16412c41c119d13cb192",
|
||||
"ref": "v1.2.0",
|
||||
"commit": "fcbde2e9cfa14f3fd2e154d7bef6bd264da61fcd",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": ".",
|
||||
"syncedAt": "2026-09-15T07:53:22Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
@@ -17,6 +17,10 @@ description: "用于以 KiCad 为主的电子硬件开发,包括 Cadence/OrCAD
|
||||
|
||||
## 设计依据
|
||||
|
||||
完整新建原理图按“需求与逻辑框图 → 符号及 PCB 封装库 → 详细原理图”组织,读取 [三阶段原理图开发](references/schematic-stages.md)。阶段不是自动增加的审批节点:仅在用户要求逐阶段审核时暂停,已有连续工作授权不重复确认。已提供资料优先复用,小改动只补齐相关输入。
|
||||
|
||||
默认使用中文注释;完整新建模组在独立首页绘制可编辑逻辑框图,芯片外围按功能分组并优先直接连线,跨页接口及公共电源、地可保留标签。项目明确要求可覆盖默认值,既有工程仅按授权范围调整,详见 [电路设计](references/circuit-design.md)。
|
||||
|
||||
- 器件结论以确切料号、封装后缀和厂商数据手册版本为依据,记录链接或本地文件及页码/章节。选型涉及现价、库存、生命周期时核实日期与来源;不能联网则标为待核实。
|
||||
- 区分推荐工作条件、绝对最大额定值和典型参数。关键电源、热耗散、接口电平和容差计算写明输入、单位、公式与裕量依据,不将绝对最大值当设计工作点。
|
||||
- 将“已确认”“设计假设”“待验证”分开。仿真、ERC/DRC、几何检查和实测分别支持不同结论,不能互相替代。
|
||||
@@ -35,6 +39,7 @@ PCB 设计流程同时使用 **kicad-mcp-pro 与 KiCadRoutingTools**,按 [两
|
||||
| 双层 Sensor 板 | [Sensor 双层模板](references/sensor-2layer.md) | 固定布局、双层参考地、供电与分组包地 |
|
||||
| 四层 IPC 摄像机板 | [IPC 四层模板](references/ipc-4layer.md) | 叠层、功能布局、接口及项目特殊结构 |
|
||||
| 需求、选型、原理图、电路审查 | [电路设计](references/circuit-design.md) | 约束、计算、器件依据、原理图或问题清单 |
|
||||
| 完整新建原理图、三阶段资料准备 | [三阶段原理图开发](references/schematic-stages.md) | 各阶段输入、成果、审核重点和资料模板 |
|
||||
| 转换、网表、封装入库 | [EDA 与 PCB](references/eda-pcb.md) | 原生工程、逐脚差异、本地库 |
|
||||
| 功能单元、接口、电源、测试点布局 | [布局与审核](references/layout-review.md) | 分组和端点表、通道预检、布局验收 |
|
||||
| 布线、差分、覆铜、DRC | [布线与电气验收](references/routing-validation.md) | 真实路径、参考地、载流与开路检查 |
|
||||
|
||||
+20
@@ -8,6 +8,8 @@
|
||||
|
||||
## 器件与电路
|
||||
|
||||
完整新建原理图的分阶段输入和交付见 [三阶段原理图开发](schematic-stages.md)。接口同时核实名称、用途、方向、电平及默认状态;附件中的参考命名或建议不能覆盖用户已确认的功能要求。
|
||||
|
||||
- BOM 按位号、数量、数值、精度/额定值、完整料号、封装、DNP 与替代条件记录。区分电气数值与封装名称;替代料核对引脚功能、供电、时序、热性能和尺寸,不能仅看封装相同。
|
||||
- 电源核对输入范围、输出误差、启动时序、使能/掉电状态、反灌路径、稳压器稳定性所需电容及热耗散。最坏工况应计入适用的容差、温度及直流偏压影响。
|
||||
- 数字接口核对双方 VIH/VIL、VOH/VOL、绝对额定值、上拉电压、开漏/推挽、掉电容忍、启动绑带、复位和调试访问。
|
||||
@@ -16,4 +18,22 @@
|
||||
|
||||
## 审查输出
|
||||
|
||||
原理图重排、重新连线及符号显示调整,按 [EDA 与 PCB](eda-pcb.md) 检查连接等价;页序与交付按 [工程基准与交付](project-workflow.md) 核查。
|
||||
|
||||
每条问题写明位号/网络、现有连接、证据、可能后果、建议动作及验证方式。区分确定错误与需补充资料的疑点,优先报告可能损坏器件、无法启动或需要改板的问题。修改后复核受影响接口,不能用增加 PWR_FLAG、删除网络或屏蔽告警替代查明根因。
|
||||
|
||||
## 电源时序与兼容预留
|
||||
|
||||
- 不能仅凭电压或“先上某电源”认定时序合格;核对适用的斜率、间隔、掉电、复位、时钟和反灌条件。RC 延迟与 LDO 输出放电不等同于全工况时序保证。
|
||||
- 区分工作必需电路、厂家兼容预留和项目自选扩展。引用预留条款时说明适用型号、目的和条件,不把单一器件的兼容要求推广到所有设计。
|
||||
- DNP 表示不装配而非删除;注明用途、启用条件、互斥关系及需联动修改的软硬件配置。是否保留 PCB 位置取决于工程及变体定义,不可一概推断。
|
||||
- 默认装配变体需独立检查供电跳线、上拉、地址绑带等选配关系。完整网表及 ERC 可能包含不装配器件,不能据此认定默认装配下的电路已正确工作。
|
||||
- 电压值有资料依据不代表稳压器订货型号已确定;未确认的具体料号只能作为审核模板,不可采购放行。厂家兼容建议不自动增加 FAE 审批节点,应说明采用或不采用的影响,关键未知项按实际风险处理。
|
||||
|
||||
## 原理图可读性
|
||||
|
||||
- 默认使用中文功能说明、设计注意事项及装配说明,保留型号、位号、引脚编号、网络名和标准缩写;项目既定语言要求优先。
|
||||
- 完整新建模组默认在独立首页绘制可编辑逻辑框图,表示供电、信号方向及对应电路页。双向通信与单向控制分开表达,框图使用图形对象,不引入虚假电气网络。既有工程的小改动不强行新增页面。
|
||||
- 按电源输入、转换、输出与负载,或信号流向组织电路。去耦、滤波、上拉/下拉、反馈、使能、复位和定时器件靠近相关芯片引脚绘制并优先直接连线;跨页接口、公共电源和地可保留标签。
|
||||
- 避免将所有器件画成孤立的“器件 + 两端标签”,也不为直连制造大量长线和交叉。导线不得穿过符号本体或覆盖字段,连接点与无连接交叉应明确;逐页检查文字、DNP 标记和标题栏遮挡。
|
||||
- 原理图位置服务于阅读,不能据此认定 PCB 的电气或机械布局已经合格。
|
||||
+4
@@ -2,12 +2,16 @@
|
||||
|
||||
## 转换及连接一致性
|
||||
|
||||
以下规则同样适用于原理图重排、重新连线及符号替换。仅改善图面时,以修改前有效工程为基准,使用原生工具独立导出修改前后网表;有意的电路变化单独记录,不混入纯排版改动。
|
||||
|
||||
1. 确认源格式、单位、层级、符号库和目标 EDA 版本;保留源文件,生成可重开且依赖完整的目标工程。
|
||||
2. 建立位号、单元、引脚号到封装焊盘号的映射。依据实际料号的数据手册及封装视图核实 B/C/E、G/S/D、连接器镜像和裸露焊盘;没有证据的映射单列待确认。
|
||||
3. 以每个网络的 `(位号, 引脚/焊盘号)` 成员集合比较拓扑,单独报告同连接异名网络、连接差异、未分配网络的焊盘、明确 NC 和缺失引脚。重复编号焊盘按其电气含义归组,多单元符号考虑单元与隐藏电源脚。
|
||||
4. 元件数量、网络数量相同不能证明连接一致。检查 Value、Footprint、料号、DNP、层级路径和库关联;同步前预览可能的重建或重编号影响。
|
||||
5. 从 PDF 或图片恢复时逐页核对连接点、跨线、隐藏电源和跨页标签。OCR 与视觉近邻只提供候选,不能据此宣布电气等价。
|
||||
|
||||
为阅读调整符号引脚显示位置时,保持引脚编号、名称、电气类型及封装映射,并核对项目库与嵌入符号一致。分别检查符号、PCB 焊盘几何和完整采购型号,不能用其中一项通过代替其余检查。比较网络数量时区分有效网络、不连接引脚和虚拟标记;连接等价与图面可读性分别验收。
|
||||
|
||||
## 板载封装入库
|
||||
|
||||
从 PCB 提取封装时,同名实例可能已独立修改。先比较几何、焊盘和属性;未经等价核对不要按名称去重。可按“原封装名__位号”分别保存到项目 `.pretty` 库,生成位号对应表,用原生库读取核对焊盘编号、数量及几何。注册到项目 `fp-lib-table` 并使用项目相对路径。仅导出库时不改原 PCB;需要重关联时再同步实例及原理图字段。
|
||||
|
||||
+4
@@ -29,6 +29,10 @@
|
||||
|
||||
## 阶段交付
|
||||
|
||||
完整新建原理图按 [三阶段原理图开发](schematic-stages.md) 准备资料和成果,审核暂停点服从用户约定与已有授权。用户要求新增独立逻辑框图页时,原有页面顺延,同时更新目录、交叉引用、层级实例页码及实际导出顺序,不能只改标题文字。
|
||||
|
||||
维护原理图生成脚本时,标明当前有效入口、输入基准及执行顺序;失效的旧脚本明确停用或标记。重建前核对人工修改,防止旧快照覆盖已审核的连线、中文注释和页面顺序。
|
||||
|
||||
按本次请求选择必要产物:原生工程和本地库、整板顶底视图及关键局部、变化/端点对照、规则与验证报告、剩余问题。截图写清板面、观察方向和镜像状态;投影、虚线及功能框仅为审核标注,不写成铜连接。
|
||||
|
||||
审核表使用 `要求/对象 | 依据或测量口径 | 结果 | 符合/未符合/未验证/不适用 | 剩余动作`。主动报告局部改善导致的供电距离增长、回流变长或装配空间收紧。保留来源封装的制造错误也不能因用户要求保持而记为通过。
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
# 三阶段原理图开发与资料准备
|
||||
|
||||
适用于从需求开始的新建电路和完整模组原理图。已有工程的小修订只读取与变更相关的资料,不要求用户重新提交整套材料。三个阶段是组织工作的方法,是否暂停由用户约定和已有授权决定;用户明确要求逐阶段审核时,应在相应阶段交付后等待。
|
||||
|
||||
### 第一阶段:需求、接口与逻辑框图
|
||||
|
||||
输入资料:
|
||||
|
||||
- 功能要求、明确不需要的功能、兼容范围及验收目标。
|
||||
- 核心芯片的具体型号、数据手册和可用的应用指南;未定型号应提供选型约束。
|
||||
- 对接主板的有效版本,优先提供原生原理图、对应 PDF 与网表,并明确冲突时的权威资料。没有完整解析原生文件时,应说明实际使用的资料与验证范围。
|
||||
- 接口表:连接器位号、针数、间距、观察方向、引脚编号、功能、相对于模组的方向、电平、有效极性、上电默认状态、已有上拉/下拉、电源方向和电流预算。
|
||||
- 电源来源、电压范围、上电先后、已知间隔和掉电条件;外接负载的电气参数。
|
||||
- 尺寸、机械安装、环境温度、成本、器件限制,以及用户已确定的 PCB 层数等约束。
|
||||
|
||||
交付:逻辑框图、电源树、接口对应表、已确认/假设/待验证清单。
|
||||
|
||||
审核重点:功能完整性、方向和电平、供电关系、兼容范围。接口名称与实际用途不一致时,按用户确认落实功能并注明原始名称;不得仅凭 LED/WLED 等名称推断是否共用控制。
|
||||
|
||||
### 第二阶段:原理图符号与 PCB 封装库
|
||||
|
||||
输入资料:
|
||||
|
||||
- 完整订货型号和后缀、引脚表、封装尺寸图及视图方向;优先使用厂商推荐焊盘。
|
||||
- 连接器接触面、针数、间距、安装方式、机械固定脚和配套线缆/插头定义。
|
||||
- 安装孔、镜头座、定位柱、禁布区等机械图;需要准确三维检查时提供对应 STEP。
|
||||
- 希望复用的现有库、命名规范和装配工艺约束。
|
||||
|
||||
交付:项目符号库和封装库、库表、引脚—焊盘对应表、可视预览及未确认项。用户明确要求全局注册时,再更新相应全局库表并保留备份。
|
||||
|
||||
审核重点:分别检查符号电气引脚、封装几何和采购型号。不能把同系列、同间距视为相同封装,也不能按电容容量或设计习惯猜测封装。缺乏推荐焊盘时,将工程焊盘假设与制造工艺待核实项写清楚。
|
||||
|
||||
### 第三阶段:详细原理图与设计审查
|
||||
|
||||
输入资料:
|
||||
|
||||
- 前阶段已确认的功能、接口及元件库;用户对前阶段的最新修订。
|
||||
- 厂家应用电路、应用指南及对应版本。
|
||||
- 电源容差、可供电流、上升/下降时间、两路间隔、复位/时钟/GPIO 默认状态、掉电容忍等实际条件。
|
||||
- 负载最大电流及输入阈值;线圈等执行器的阻值容差、工作电压、脉宽、温度条件和线束定义。
|
||||
- 总线地址、其他共享设备、上拉位置、时钟来源、同步主从、接口速率或 lane 数等适用配置。
|
||||
- 默认装配、DNP、互斥选配和兼容要求,以及图框、语言和出图习惯。
|
||||
|
||||
交付:原生可编辑工程与依赖库、BOM、审核图、ERC、适用的引脚/网表核对结果,以及需资料或样机关闭的问题清单。
|
||||
|
||||
审核重点:电气实现和参数、启动/掉电状态、器件额定值与裕量、装配策略、可读性。ERC、仿真和实测各自说明验证边界。
|
||||
|
||||
### 资料缺失时如何推进
|
||||
|
||||
优先从用户已提供的文件和现有工程查找,不把可自行核实的问题交回用户。只追问影响当前决策的关键缺失项;资料不足但可独立完成的部分继续推进。未知电气条件不得默认为已经确认。
|
||||
|
||||
### 可复用的资料提交模板
|
||||
|
||||
项目名称与版本:
|
||||
本次阶段和审核节点:
|
||||
功能与核心器件:
|
||||
主板版本及权威资料:
|
||||
接口表与线缆定义:
|
||||
电源来源、容差、上下电条件:
|
||||
外接负载及控制电平:
|
||||
尺寸、安装及环境条件:
|
||||
兼容范围、指定/禁用物料和成本:
|
||||
默认装配与 DNP 策略:
|
||||
语言、图框及出图要求:
|
||||
已确认与尚未确认事项:
|
||||
|
||||
参考:[电路设计](circuit-design.md)、[连接与库核对](eda-pcb.md)、[工程基准与交付](project-workflow.md)。
|
||||
|
||||
跨项目复用查证、计算和验证方法;具体型号、电压、脚序、地址、RC 值、脉宽及历史检查数量须由当前项目确定。
|
||||
@@ -3,5 +3,5 @@
|
||||
"name": "playwright浏览器自动化操作",
|
||||
"version": "20260605",
|
||||
"keySource": "none",
|
||||
"syncedAt": "2026-09-16T16:02:24Z"
|
||||
"syncedAt": "2026-09-17T16:02:37Z"
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "next-skills",
|
||||
"repo": "https://github.com/vercel/next.js.git",
|
||||
"ref": "canary",
|
||||
"commit": "6130a493168e69c3c72bc1a3d161314ffa77b124",
|
||||
"commit": "7d42c9dcdd11b01716eb5a8eb473f493ea5b23c6",
|
||||
"adapter": "skill-collection",
|
||||
"sourcePath": "skills",
|
||||
"syncedAt": "2026-09-16T15:59:59Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
@@ -15,7 +15,7 @@ English | [中文](./README_CN.md)
|
||||
|
||||
## ❤️ Sponsors
|
||||
|
||||
This project is kept free and open source with the support of <a href="https://www.kimi.com/code/?aff=ppt-master">Kimi</a>, <a href="https://www.packyapi.ai/register?aff=ppt-master">PackyCode</a>, <a href="https://apikey.fan/register?aff=PPT-MASTER">APIKEY.FAN</a>, <a href="https://runapi.host/register?aff=WMLJ">RunAPI</a>, <a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624">YouYun ZhiSuan</a> and other sponsors.
|
||||
This project is kept free and open source with the support of <a href="https://www.kimi.com/code/?aff=ppt-master">Kimi</a>, <a href="https://www.packyapi.ai/register?aff=ppt-master">PackyCode</a>, <a href="https://apikey.fan/register?aff=PPT-MASTER">APIKEY.FAN</a>, <a href="https://runapi.host/register?aff=WMLJ">RunAPI</a>, <a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624">YouYun ZhiSuan</a>, <a href="https://go.apimart.ai/gh-ppt-master1">APIMart</a> and other sponsors.
|
||||
|
||||
> **[Want to appear here?](SPONSORING.md)**
|
||||
|
||||
@@ -49,6 +49,10 @@ Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring this
|
||||
<td width="180"><a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624"><img src="docs/assets/sponsors/youyun.png" alt="YouYun ZhiSuan" width="150"></a></td>
|
||||
<td>Thanks to YouYun ZhiSuan for sponsoring this project! YouYun ZhiSuan is UCloud's AI cloud platform, providing one-stop API services for mainstream domestic and international models, all accessible with a single key. The platform features cost-effective CodingPlan packages for domestic models (including GLM5.2, Deepseek-v4, and more), along with official channels for stable access to overseas models, meeting diverse development needs. It's compatible with mainstream AI coding tools like Claude Code and Codex, as well as general API calls. The platform supports enterprise-level high concurrency, 24/7 technical support, and self-service invoicing. Register through <a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624">this link</a> to receive up to <strong>¥10 in free credits</strong>. This project has been built into an Agent — <strong>PPT Master</strong> — ready to use without local deployment.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="180"><a href="https://go.apimart.ai/gh-ppt-master1"><img src="docs/assets/sponsors/apimart.png" alt="APIMart" width="150"></a></td>
|
||||
<td>Thanks to APIMart for sponsoring this project! APIMart is a low-cost API platform for AI image & video generation — GPT-Image-2 from <strong>$0.006/image</strong>, 160+ images per dollar. One async API covers both image and video: submit a task, get an ID, fetch results via polling or callback. Batch tens of thousands of images without timeouts, switch models without changing code. Pay-as-you-go with no monthly fee — sign up <a href="https://go.apimart.ai/gh-ppt-master1">here</a> to get started.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</details>
|
||||
@@ -416,6 +420,8 @@ PPT Master is currently built and maintained primarily by me. Every new template
|
||||
|
||||
<a href="https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624"><img src="docs/assets/sponsors/youyun.png" alt="YouYun ZhiSuan" height="40" /></a>
|
||||
|
||||
<a href="https://go.apimart.ai/gh-ppt-master1"><img src="docs/assets/sponsors/apimart.png" alt="APIMart" height="40" /></a>
|
||||
|
||||
<a href="https://m.do.co/c/547f129aabe1"><img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" alt="Powered by DigitalOcean" height="40" /></a>
|
||||
|
||||
**[Want to appear here? →](SPONSORING.md)** — placements, audience and rates.
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "ppt-master",
|
||||
"repo": "https://github.com/hugohe3/ppt-master.git",
|
||||
"ref": "main",
|
||||
"commit": "3b45af2c3dab15626b1d499ea60ce689b7f97a5a",
|
||||
"commit": "9c29d7d80d31d6aa658ae0caed9f7f1356b0d72a",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/ppt-master",
|
||||
"syncedAt": "2026-09-16T15:59:59Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
@@ -46,6 +46,12 @@ Thanks to [Kimi](https://www.kimi.com/code/?aff=ppt-master) for sponsoring PPT M
|
||||
|
||||
[YouYun ZhiSuan](https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624), UCloud's AI cloud platform, provides domestic and international model APIs, CodingPlan packages, enterprise concurrency, technical support, and invoicing. Register through the dedicated link to receive up to **¥10 in free trial credit**. PPT Master is also available there as a hosted Agent for users who do not want to deploy it locally.
|
||||
|
||||
### APIMart
|
||||
|
||||
<a href="https://go.apimart.ai/gh-ppt-master1"><img src="https://raw.githubusercontent.com/hugohe3/ppt-master/main/docs/assets/sponsors/apimart.png" alt="APIMart" width="150"></a>
|
||||
|
||||
[APIMart](https://go.apimart.ai/gh-ppt-master1) is a low-cost API platform for AI image and video generation, with GPT-Image-2 from **$0.006 per image**. One async API covers both image and video: submit a task, get an ID, and fetch results by polling or callback. Pay-as-you-go with no monthly fee; register through the dedicated link to get started.
|
||||
|
||||
## Infrastructure Support
|
||||
|
||||
<a href="https://m.do.co/c/547f129aabe1"><img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" alt="Powered by DigitalOcean" height="40"></a>
|
||||
|
||||
@@ -46,6 +46,12 @@ PPT Master 始终免费开源。以下赞助方共同支持项目的持续维护
|
||||
|
||||
[优云智算](https://www.compshare.cn/coding-plan?ytag=GPU_YY-git_pptmaster0624) 是 UCloud 旗下 AI 云平台,提供国内外模型 API、CodingPlan 套餐、企业级并发、技术支持和开票服务。通过专属链接注册,最高可获得 **¥10 免费体验金**。平台还提供无需本地部署的 PPT Master Agent。
|
||||
|
||||
### APIMart
|
||||
|
||||
<a href="https://go.apimart.ai/gh-ppt-master1"><img src="https://raw.githubusercontent.com/hugohe3/ppt-master/main/docs/assets/sponsors/apimart.png" alt="APIMart" width="150"></a>
|
||||
|
||||
[APIMart](https://go.apimart.ai/gh-ppt-master1) 是专注 AI 图片/视频生成的低价 API 平台,GPT-Image-2 低至 **$0.006/张**。图片、视频共用一套异步 API:提交任务拿 ID,轮询或回调取结果。按量付费、无月费,通过专属链接注册即可开用。
|
||||
|
||||
## 基础设施支持
|
||||
|
||||
<a href="https://m.do.co/c/547f129aabe1"><img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" alt="Powered by DigitalOcean" height="40"></a>
|
||||
|
||||
@@ -14,7 +14,7 @@ Motion is several separate capabilities, not one dial; two of them are decided w
|
||||
| A continuous action — slide-in, flip, camera push-in, progressive reveal, camera pan | **Morph: author the action as two static pages**, then select Morph and add explicit pairs when identity must be deterministic; there is no keyframe timeline anywhere — the difference between two editable slides *is* the animation | **Page authoring (Step 6), then motion post-processing** — §2.1, §3.1 |
|
||||
| A static full-bleed page that should stop looking frozen | Slow `path_*` motion on a visually subordinate image or atmospheric layer | Post-processing; §4.1 |
|
||||
| Carousel, counting numerals, parallax depth, click-to-reveal flip card | Four recipes assembled from the mechanisms above; carousel and odometer need paired pages | §4.2 |
|
||||
| Kiosk or unattended playback | `--auto-advance <seconds>`, optionally with `-t none` | Export; §3 |
|
||||
| Unattended looping playback | `--auto-advance <seconds>`, optionally with `-t none` | Export; §3 |
|
||||
| A transition or object animation needs an audible cue | Optional `transition.sound` or object `sound`, selected only after the visual solution is complete and synced from the global library; a narrated MP4 uses either the verified native-export mix or explicit slideshow capture, never both | Post-motion; §2.2 |
|
||||
| Nothing should move | `-t none` and per-element `none` | Export; §1 |
|
||||
|
||||
@@ -153,7 +153,7 @@ python3 skills/ppt-master/scripts/sound_sync.py <project_path> <namespace>/<soun
|
||||
```bash
|
||||
python3 skills/ppt-master/scripts/svg_to_pptx.py <project> -t push --transition-duration 0.6
|
||||
python3 skills/ppt-master/scripts/svg_to_pptx.py <project> -t none
|
||||
python3 skills/ppt-master/scripts/svg_to_pptx.py <project> --auto-advance 5 # kiosk playback
|
||||
python3 skills/ppt-master/scripts/svg_to_pptx.py <project> --auto-advance 5 # unattended playback
|
||||
python3 skills/ppt-master/scripts/svg_to_pptx.py <project> -t none --auto-advance 5
|
||||
```
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ An all-`web` deck never reads `image-generator.md`, and vice versa.
|
||||
1. Read the Design Spec/lock or reuse Quick's active-context decisions; separate derivatives, group canonical rows by `Acquire Via`; ensure `project/images/` exists.
|
||||
2. Finish `user` and triggered `ai` / `web` / `slice` canonical preparation.
|
||||
3. Materialize only declared derivatives from usable parents, preserving originals, then run `analyze_images.py` once before SVG.
|
||||
4. Verify: every non-skipped row has `project/images/<filename>` or is `Needs-Manual`; each derivative has its distinct file and usable parent, with web provenance copied in `image_sources.json`; every `slice` row has its element file or is `Needs-Manual` because its sheet is unavailable; no `Pending`, `Failed`, or `Needs-Selection` remains; `image_prompts.json` exists when an active `ai` row remains, every entry `Generated` or `Needs-Manual`; `image_sources.json` exists when a web row was processed, every entry with `license_tier ∈ {no-attribution, attribution-required, manual}`.
|
||||
4. Verify: every non-skipped row has `project/images/<filename>` or is `Needs-Manual`; each derivative has its distinct file and usable parent, with web provenance copied in `image_sources.json`; every `slice` row has its element file or is `Needs-Manual` because its sheet is unavailable; no `Pending`, `Failed`, or `Needs-Selection` remains — write each resource row's terminal `Status` back yourself, since the tools update only their own manifests; `image_prompts.json` exists when an active `ai` row remains, every entry `Generated` or `Needs-Manual`; `image_sources.json` exists when a web row was processed, every entry with `license_tier ∈ {no-attribution, attribution-required, manual}`.
|
||||
|
||||
`Needs-Manual` is terminal for acquisition, not for export: a later supplied file is validated and its row reconciled to `Existing`, `Generated`, or `Sourced`. Quick blocks every required row still in `Needs-Selection` or `Needs-Manual` whatever files happen to exist.
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ CANVAS_FORMATS = {
|
||||
'use_case': 'WeChat article cover images'
|
||||
},
|
||||
'xiaohongshu': {
|
||||
'name': '小红书',
|
||||
'name': 'Xiaohongshu (RED)',
|
||||
'dimensions': '1242×1660',
|
||||
'viewbox': '0 0 1242 1660',
|
||||
'width': 1242,
|
||||
@@ -201,7 +201,7 @@ CANVAS_FORMATS = {
|
||||
'use_case': 'Knowledge sharing, product reviews'
|
||||
},
|
||||
'moments': {
|
||||
'name': 'Moments/Instagram',
|
||||
'name': 'WeChat Moments / IG',
|
||||
'dimensions': '1080×1080',
|
||||
'viewbox': '0 0 1080 1080',
|
||||
'width': 1080,
|
||||
@@ -210,7 +210,7 @@ CANVAS_FORMATS = {
|
||||
'use_case': 'Social media square images'
|
||||
},
|
||||
'story': {
|
||||
'name': 'Story/Vertical',
|
||||
'name': 'Story / TikTok',
|
||||
'dimensions': '1080×1920',
|
||||
'viewbox': '0 0 1080 1920',
|
||||
'width': 1080,
|
||||
@@ -219,7 +219,7 @@ CANVAS_FORMATS = {
|
||||
'use_case': 'Short video covers, stories'
|
||||
},
|
||||
'banner': {
|
||||
'name': 'Horizontal Banner',
|
||||
'name': 'Landscape Banner',
|
||||
'dimensions': '1920×1080',
|
||||
'viewbox': '0 0 1920 1080',
|
||||
'width': 1920,
|
||||
|
||||
@@ -2301,11 +2301,16 @@ def run_search_manifest(
|
||||
elif selection_required:
|
||||
item["status"] = SEARCH_STATUS_NEEDS_SELECTION
|
||||
_clear_candidate_selection_outputs(item)
|
||||
# The row's own `provider` is the caller's pin; the
|
||||
# next candidate page must search the same provider.
|
||||
pinned_provider = item.get("provider")
|
||||
if manifest_item is not None:
|
||||
item.update(manifest_item)
|
||||
item.pop("last_error", None)
|
||||
item.pop("provider", None)
|
||||
item.pop("license_tier", None)
|
||||
if pinned_provider:
|
||||
item["provider"] = pinned_provider
|
||||
needs_selection_count += 1
|
||||
print(f" [REVIEW] {item['filename']} — {error}")
|
||||
elif retryable:
|
||||
|
||||
+5
-5
@@ -172,7 +172,7 @@
|
||||
],
|
||||
"presets": {
|
||||
"rect": {"intent": "Fully neutral rectangular field or carrier."},
|
||||
"roundRect": {"intent": "Uniformly rounded carrier with a softer, more approachable boundary."}
|
||||
"roundRect": {"intent": "Uniformly rounded carrier with a softer, more approachable boundary.", "adjustment_notes": "adj is the corner radius in 1/100000 of the shorter side (0–50000): radius = min(w, h) × adj / 100000, so the default 16667 rounds a 600×300 box by 50 px."}
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -385,8 +385,8 @@
|
||||
"Do not use folded or diagonal details without a matching page-level edge language."
|
||||
],
|
||||
"presets": {
|
||||
"foldedCorner": {"intent": "Sheet-like carrier or accent with one folded corner."},
|
||||
"frame": {"intent": "Closed rectangular frame for a strong aperture or ownership boundary."},
|
||||
"foldedCorner": {"intent": "Sheet-like carrier or accent with one folded corner.", "adjustment_notes": "adj is the fold size in 1/100000 of the shorter side (0–50000): the folded triangle spans min(w, h) × adj / 100000 along the right and bottom edges."},
|
||||
"frame": {"intent": "Closed rectangular frame for a strong aperture or ownership boundary.", "adjustment_notes": "adj1 is the frame thickness in 1/100000 of the shorter side (0–50000): thickness = min(w, h) × adj1 / 100000 on all four sides."},
|
||||
"halfFrame": {"intent": "Partially open frame for directional grouping or an incomplete boundary."},
|
||||
"corner": {"intent": "L-shaped corner piece for edge anchoring or a partial frame."},
|
||||
"diagStripe": {"intent": "Diagonal band for edge emphasis, slanted continuity, or a literal stripe."}
|
||||
@@ -414,7 +414,7 @@
|
||||
"presets": {
|
||||
"leftBracket": {"intent": "Left-side bracket that collects content to its right."},
|
||||
"rightBracket": {"intent": "Right-side bracket that collects content to its left."},
|
||||
"bracketPair": {"intent": "Paired brackets that enclose a complete range or set."}
|
||||
"bracketPair": {"intent": "Paired brackets that enclose a complete range or set.", "adjustment_notes": "adj is the bracket corner radius in 1/100000 of the shorter side (0–50000): radius = min(w, h) × adj / 100000; on a large frame the default 16667 reaches far into the enclosed area, so lower it."}
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -439,7 +439,7 @@
|
||||
"presets": {
|
||||
"leftBrace": {"intent": "Left-side brace that groups or assigns content to its right."},
|
||||
"rightBrace": {"intent": "Right-side brace that groups or assigns content to its left."},
|
||||
"bracePair": {"intent": "Paired braces that enclose a complete set."}
|
||||
"bracePair": {"intent": "Paired braces that enclose a complete set.", "adjustment_notes": "adj is the brace curl radius in 1/100000 of the shorter side (0–25000): radius = min(w, h) × adj / 100000, and each brace is twice that wide."}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
+15
-1
@@ -87,6 +87,15 @@ _CUSTOM_REFERENCE_CATALOGS = (
|
||||
),
|
||||
)
|
||||
|
||||
# Display names the registry carried before it was aligned with
|
||||
# references/canvas-formats.md; locks written against them still validate.
|
||||
_LEGACY_CANVAS_NAMES = {
|
||||
"xiaohongshu": ("小红书",),
|
||||
"moments": ("Moments/Instagram",),
|
||||
"story": ("Story/Vertical",),
|
||||
"banner": ("Horizontal Banner",),
|
||||
}
|
||||
|
||||
_MARKDOWN_H2_RE = re.compile(r"^##[ \t]+(.+?)[ \t]*$", re.MULTILINE)
|
||||
_MARKDOWN_SUBHEADING_RE = re.compile(r"^#{3,6}[ \t]+(.+?)[ \t]*$", re.MULTILINE)
|
||||
_MARKDOWN_DATA_LINE_RE = re.compile(
|
||||
@@ -1227,9 +1236,14 @@ def _validate_spec_lock_relations(
|
||||
if canvas is not None:
|
||||
expected_format = str(canvas["name"])
|
||||
expected_viewbox = str(canvas["viewbox"])
|
||||
accepted_formats = {
|
||||
expected_format,
|
||||
format_key,
|
||||
*_LEGACY_CANVAS_NAMES.get(format_key, ()),
|
||||
}
|
||||
if (
|
||||
"format" in canvas_fields
|
||||
and _normalize_schema_value(canvas_fields["format"]) != expected_format
|
||||
and _normalize_schema_value(canvas_fields["format"]) not in accepted_formats
|
||||
):
|
||||
errors.append(
|
||||
f"{markdown_name} schema: canvas.format must be '{expected_format}'"
|
||||
|
||||
@@ -47,25 +47,25 @@ except ImportError:
|
||||
'aspect_ratio': '2.35:1'
|
||||
},
|
||||
'xiaohongshu': {
|
||||
'name': '小红书',
|
||||
'name': 'Xiaohongshu (RED)',
|
||||
'dimensions': '1242×1660',
|
||||
'viewbox': '0 0 1242 1660',
|
||||
'aspect_ratio': '3:4'
|
||||
},
|
||||
'moments': {
|
||||
'name': 'Moments/Instagram',
|
||||
'name': 'WeChat Moments / IG',
|
||||
'dimensions': '1080×1080',
|
||||
'viewbox': '0 0 1080 1080',
|
||||
'aspect_ratio': '1:1'
|
||||
},
|
||||
'story': {
|
||||
'name': 'Story/Vertical',
|
||||
'name': 'Story / TikTok',
|
||||
'dimensions': '1080×1920',
|
||||
'viewbox': '0 0 1080 1920',
|
||||
'aspect_ratio': '9:16'
|
||||
},
|
||||
'banner': {
|
||||
'name': 'Horizontal Banner',
|
||||
'name': 'Landscape Banner',
|
||||
'dimensions': '1920×1080',
|
||||
'viewbox': '0 0 1920 1080',
|
||||
'aspect_ratio': '16:9'
|
||||
|
||||
+19
@@ -3652,6 +3652,23 @@ def resolve_text_run_fonts(text: str, fonts: dict[str, str]) -> dict[str, str]:
|
||||
return {'latin': latin, 'ea': ea, 'cs': latin}
|
||||
|
||||
|
||||
# Unicode fixed-width spaces carry their width in their definition; bundled
|
||||
# advance tables omit them, and the generic 0.55em fallback triples the thin
|
||||
# spaces German and French typography sets before '%', units, and '§'.
|
||||
_FIXED_SPACE_EMS = {
|
||||
' ': 0.5, # en space
|
||||
' ': 1.0, # em space
|
||||
' ': 1 / 3, # three-per-em space
|
||||
' ': 0.25, # four-per-em space
|
||||
' ': 1 / 6, # six-per-em space
|
||||
' ': 0.55, # figure space
|
||||
' ': 0.3, # punctuation space
|
||||
' ': 0.2, # thin space
|
||||
' ': 0.1, # hair space
|
||||
' ': 0.2, # narrow no-break space
|
||||
}
|
||||
|
||||
|
||||
def _estimate_character_width(ch: str, font_size: float) -> float:
|
||||
if (
|
||||
0xFF00 <= ord(ch) <= 0xFFEF
|
||||
@@ -3662,6 +3679,8 @@ def _estimate_character_width(ch: str, font_size: float) -> float:
|
||||
return font_size
|
||||
if ch == ' ':
|
||||
return font_size * 0.3
|
||||
if ch in _FIXED_SPACE_EMS:
|
||||
return font_size * _FIXED_SPACE_EMS[ch]
|
||||
if ch in 'mMwWOQ%':
|
||||
return font_size * 0.75
|
||||
if ch in 'iIlj!|':
|
||||
|
||||
@@ -359,6 +359,16 @@ Features:
|
||||
# Split notes
|
||||
success = split_notes(notes, output_dir, verbose)
|
||||
|
||||
# A renamed, dropped, or renumbered page leaves its old per-page file
|
||||
# behind; nothing reads it now, but a page that returns to that stem would.
|
||||
stale = sorted(
|
||||
p.name for p in output_dir.glob('*.md')
|
||||
if p.stem not in notes and extract_leading_number(p.stem) is not None
|
||||
)
|
||||
if stale:
|
||||
print(f"[ADVISORY] {len(stale)} per-page notes file(s) match no current page; "
|
||||
f"delete them if they are leftovers: {', '.join(stale)}")
|
||||
|
||||
if success:
|
||||
if verbose:
|
||||
print(f"\n[Done] Notes splitting complete")
|
||||
|
||||
@@ -14,7 +14,7 @@ After Generate Step 4 Gate 1, read the completed Design Spec and current page/re
|
||||
|
||||
| Section | Required keys | Notes |
|
||||
| --- | --- | --- |
|
||||
| `canvas` | `viewBox`, `format` | `format` is the canonical display name (e.g. `PPT 16:9`); `viewBox` the exact geometry |
|
||||
| `canvas` | `viewBox`, `format` | `format` is the Format column of [`canvas-formats.md`](../references/canvas-formats.md) (e.g. `PPT 16:9`) or the format ID; `viewBox` the exact geometry |
|
||||
| `communication` | `primary_language`, `audience`, `objective`, `core_message` | Canonical BCP-47 (reject `und` and Chinese without script/region; old locks may omit it); `objective` merges intent/outcome; `consumption_mode` optional off PPT |
|
||||
| `mode` | `mode` | Preset or `custom` |
|
||||
| `visual_style` | `visual_style` | Preset or `custom` |
|
||||
|
||||
@@ -365,7 +365,7 @@ Sound: the optional post-motion pass is [`animations.md`](../references/animatio
|
||||
|
||||
### Revision Round (delivered project)
|
||||
|
||||
A delivered project that comes back with a change stays in this route; planning does not restart. Act at the owning layer. A wording change, an added condition, or a re-titled page edits the SVG, then its §IX block, `notes/total.md`, and every page that repeats the line (a chapter page's route, the contents page). A page inserted, dropped, or moved renumbers the roster first — files, footers, contents-page numbers, §IX blocks, `page_rhythm` / `page_visualizations` rows, `animations.json` keys, `notes/total.md` headings — then authors or removes the page; whatever the moved page carried moves with it: a Morph `from` names the new preceding page and a "next chapter" preview group follows its boundary. A deck-wide colour or family runs [`update_spec.py`](../scripts/docs/update_spec.md); derived tints, pages designed around the old value, and spec prose naming it are edited by hand, and a hand-edited Chart/Table fallback is re-stamped before the gate. Rerun the final quality gate (it compares §IX with `svg_output/`), `animation_config.py validate`, 7.1 when notes changed, 7.2, and 7.3; calibration, the early gate, and `verify-charts` return only when a type role, the first pages, or a chart's geometry changed. Earlier exports stay; the new ones carry their own timestamp.
|
||||
A delivered project that comes back with a change stays in this route; planning does not restart. Act at the owning layer. A wording change, an added condition, or a re-titled page edits the SVG, then its §IX block, `notes/total.md`, and every page that repeats the line (a chapter page's route, the contents page). A page inserted, dropped, or moved renumbers the roster first — files, footers, contents-page numbers, §IX blocks, `page_rhythm` / `page_visualizations` rows, `animations.json` keys, `notes/total.md` headings, same-deck hyperlink targets — then authors or removes the page; whatever the moved page carried moves with it: a Morph `from` names the new preceding page and a "next chapter" preview group follows its boundary. A deck-wide colour or family runs [`update_spec.py`](../scripts/docs/update_spec.md); derived tints, pages designed around the old value, and spec prose naming it are edited by hand; a generated image that painted the old accent does not follow, and regenerating it redraws the composition, so report it instead of regenerating unprompted; a hand-edited Chart/Table fallback is re-stamped before the gate. Rerun the final quality gate (it compares §IX with `svg_output/`), `animation_config.py validate`, 7.1 when notes changed, 7.2, and 7.3; calibration, the early gate, and `verify-charts` return only when a type role, the first pages, or a chart's geometry changed. Earlier exports stay; the new ones carry their own timestamp.
|
||||
|
||||
## ✅ Generate PPTX Complete
|
||||
|
||||
|
||||
+1
-1
@@ -230,7 +230,7 @@ python3 ${SKILL_DIR}/scripts/svg_to_pptx.py <project_path> --quick-generate --no
|
||||
|
||||
**On failure**: repair the owning SVG, resource, or capability input, rerun the checker, and export again — never create a Design Spec or lock.
|
||||
|
||||
**Revision after delivery**: a Quick project that comes back with a change has no spec or lock to update — edit the owning SVG (and every page repeating the line), `notes/total.md`, and `animations.json` directly; a page inserted, dropped, or moved renumbers files, footers, contents-page numbers, sidecar keys, and each Morph `from` first; a deck-wide colour or family is substituted by hand across `svg_output/` (`update_spec.py` reads a lock). Then rerun the same final check, the notes split when notes changed, `animation_config.py validate`, and the export; earlier exports stay. When Narration Audio is enabled, run [`generate-audio`](../stages/generate-audio.md) after the validated export (page audio/SRT, narrated PPTX, optional raw MP4, final mixed or captured MP4, or the capture-ready handoff).
|
||||
**Revision after delivery**: a Quick project that comes back with a change has no spec or lock to update — edit the owning SVG (and every page repeating the line), `notes/total.md`, and `animations.json` directly; a page inserted, dropped, or moved renumbers files, footers, contents-page numbers, `notes/total.md` headings, sidecar keys, same-deck hyperlink targets, and each Morph `from` first; a deck-wide colour or family is substituted by hand across `svg_output/` (`update_spec.py` reads a lock); a generated image that painted the old accent does not follow, and regenerating it redraws the composition, so report it instead of regenerating unprompted. Then rerun the same final check, the notes split when notes changed, `animation_config.py validate`, and the export; earlier exports stay. When Narration Audio is enabled, run [`generate-audio`](../stages/generate-audio.md) after the validated export (page audio/SRT, narrated PPTX, optional raw MP4, final mixed or captured MP4, or the capture-ready handoff).
|
||||
|
||||
```markdown
|
||||
## ✅ Quick Generate Complete
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"sourceId": "shadcn",
|
||||
"repo": "https://github.com/shadcn-ui/ui.git",
|
||||
"ref": "main",
|
||||
"commit": "f5bb039c749afd2d111ad970dfaa9ab30bd90b3b",
|
||||
"commit": "a87a63b2ca25143d26c8bd0903e4e9bc77b3f824",
|
||||
"adapter": "claude-skill",
|
||||
"sourcePath": "skills/shadcn",
|
||||
"syncedAt": "2026-09-16T15:59:59Z"
|
||||
"syncedAt": "2026-09-17T16:00:00Z"
|
||||
}
|
||||
Reference in new issue
Block a user