feat: 添加 skill 发布功能和混淆构建优化

- build.py: 移除 --obfuscate 参数,默认混淆模式;从 git config 读取 author,动态注入 SKILL.md
- publish.py: 新增发布脚本,自动 clone 目标仓库、同步 build/ 内容、git commit+push
- publish.sh: 新增一键构建+发布脚本
- skill-publishing spec: 新增发布规范
- skill-packaging spec: 更新构建规范
This commit is contained in:
2026-03-11 12:22:46 +08:00
parent 65c746c639
commit a8af3cc6c4
7 changed files with 665 additions and 122 deletions

View File

@@ -8,7 +8,7 @@
系统 SHALL 提供 build.py 脚本,运行后完成 skill 的完整打包流程。
#### Scenario: 运行 build.py 成功
- **WHEN** 用户执行 `uv run python build.py`
- **WHEN** 用户执行 `uv run --with pyarmor python build.py`
- **THEN** 脚本完成所有打包步骤并输出成功信息
### Requirement: 构建目录清理重建
@@ -18,26 +18,31 @@
- **WHEN** 构建开始
- **THEN** 脚本删除整个 build 目录(如有),然后创建新的空 build 目录
### Requirement: SKILL.md 复制
系统 SHALL 将 skill/SKILL.md 直接复制到 build/SKILL.md不保留 skill 这一级目录
### Requirement: SKILL.md 动态生成
系统 SHALL 读取 SKILL.md 模板,动态注入 version 和 author 字段后写入 build/SKILL.md
#### Scenario: SKILL.md 成功复制
#### Scenario: SKILL.md 包含动态元数据
- **WHEN** 构建执行
- **THEN** build/SKILL.md 文件存在且内容与 skill/SKILL.md 一致
- **THEN** build/SKILL.md 的 metadata 包含 version 和 author 字段
### Requirement: scripts 目录复制
系统 SHALL 将 scripts/ 目录完整复制到 build/scripts/,保持目录结构。
#### Scenario: version 是时间戳
- **WHEN** 构建在 2026年3月11日 14点30分22秒执行
- **THEN** build/SKILL.md 中 `metadata.version` 值为 "20260311_143022"
#### Scenario: scripts 目录结构保留
- **WHEN** 构建执行
- **THEN** build/scripts/ 下的子目录结构与原 scripts/ 一致
#### Scenario: author 来自 git 配置
- **WHEN** git config user.name 是 "Your Name"git config user.email 是 "your@email.com"
- **THEN** build/SKILL.md 中 `metadata.author` 值为 "Your Name <your@email.com>"
### Requirement: 仅复制 Python 文件
系统 SHALL 只复制 .py 扩展名的文件,其他文件类型自然被过滤
### Requirement: git 配置读取
系统 SHALL 从 git config 读取 user.name 和 user.email
#### Scenario: 只保留 py 文件
- **WHEN** 原目录包含多种文件类型
- **THEN** build/scripts/ 中只存在 .py 文件
#### Scenario: git config 读取成功
- **WHEN** git config 已设置 user.name 和 user.email
- **THEN** 系统读取到正确的值
#### Scenario: git config 未设置
- **WHEN** git config user.name 或 user.email 未设置
- **THEN** 系统显示错误信息并退出
### Requirement: 时间戳版本号
系统 SHALL 生成 YYYYMMDD_HHMMSS 格式的时间戳作为构建版本标识。
@@ -51,47 +56,43 @@
#### Scenario: 显示构建信息
- **WHEN** 构建成功完成
- **THEN** 控制台输出版本号和构建文件清单
- **THEN** 控制台输出版本号和作者信息
### Requirement: --obfuscate 参数支持
系统 SHALL 支持 `--obfuscate` 命令行参数,用于启用代码混淆功能
### Requirement: 仅混淆构建
系统 SHALL 仅提供混淆构建模式,移除非混淆选项
#### Scenario: 使用 --obfuscate 参数
- **WHEN** 用户执行 `uv run --with pyarmor python build.py --obfuscate`
- **THEN** 系统使用 PyArmor scripts 目录代码进行混淆
#### Scenario: build.py 始终混淆
- **WHEN** 用户执行 `uv run --with pyarmor python build.py`
- **THEN** 系统使用 PyArmor 混淆 scripts 目录代码
#### Scenario: 不使用 --obfuscate 参数
- **WHEN** 用户执行 `uv run python build.py`(不带 --obfuscate
- **THEN** 系统执行原有的复制行为,不进行混淆
#### Scenario: --obfuscate 参数
- **WHEN** 用户运行 build.py
- **THEN** 系统不需要 --obfuscate 参数,直接执行混淆构建
### Requirement: PyArmor 混淆执行
系统 SHALL `--obfuscate` 模式下调用 PyArmor 工具对 scripts 目录进行混淆。
系统 SHALL 调用 PyArmor 工具对 scripts 目录进行混淆。
#### Scenario: PyArmor 成功执行
- **WHEN** 启用 --obfuscate 且 PyArmor 可用
- **WHEN** PyArmor 可用
- **THEN** 系统执行 pyarmor gen --recursive 命令
#### Scenario: 混淆后文件输出
- **WHEN** PyArmor 混淆完成
- **THEN** build/scripts/ 目录包含混淆后的文件
#### Scenario: pyarmor_runtime 包含
- **WHEN** PyArmor 混淆完成
- **THEN** build/scripts/ 目录包含 pyarmor_runtime_xxxxxx 子目录
- **THEN** build/ 目录包含混淆后的文件和 pyarmor_runtime 子目录
### Requirement: PyArmor 未安装友好提示
系统 SHALL 在 PyArmor 未安装时提供清晰的错误提示,引导用户正确使用 `uv run --with pyarmor`
#### Scenario: PyArmor ImportError
- **WHEN** 启用 --obfuscate 但未通过 --with pyarmor 加载
- **WHEN** 未通过 --with pyarmor 加载
- **THEN** 系统显示友好错误信息,提示正确命令
### Requirement: SKILL.md 保持明文
系统 SHALL 在混淆模式下仍然将 SKILL.md 作为明文文件复制,不进行混淆。
#### Scenario: SKILL.md 保持明文
- **WHEN** 启用 --obfuscate 执行构建
- **THEN** build/SKILL.md 文件为明文,内容与原文件一致
- **WHEN** 启用混淆执行构建
- **THEN** build/SKILL.md 文件为明文,内容包含动态注入的元数据
### Requirement: 混淆错误处理
系统 SHALL 在 PyArmor 混淆失败时捕获错误并显示详细信息。
@@ -99,3 +100,10 @@
#### Scenario: PyArmor 命令失败
- **WHEN** pyarmor 命令执行返回非零退出码
- **THEN** 系统显示退出码、标准输出和错误输出信息
### Requirement: 一键发布脚本
系统 SHALL 提供 publish.sh 脚本,一键执行混淆构建并发布。
#### Scenario: publish.sh 执行成功
- **WHEN** 用户执行 `./publish.sh`
- **THEN** 系统依次执行混淆构建和发布