方向反转:此前 SKILL.md 是「模板渲染产物」、sap-cli 是源;现 sap-cli 归档, sap-cli-skill 承接开发与分发,SKILL.md 回归手工维护的正本。 迁移(来自 sap-cli,共 104 文件): - tests/ 692 例测试(15 个文件的内联 sys.path 改指 assets/) - openspec/ SDD 规格与归档变更(42 文件) - docs/ 开发文档与 ADT 原理(含 dev/CLAUDE.md、AGENTS.md) - .claude/ rules 副本 + settings.json(供 Claude Code) - .github/ .hermes/ .pre-commit-config.yaml .editorconfig CLAUDE.md - scripts/ 保持仅 setup.py(pack_skill.py 已随旧仓归档,不迁) 修复(迁移暴露的真实缺陷): - assets/pyproject.toml 的 build-backend 写作 `setuptools.backends._legacy:_Backend`, 该模块在 setuptools 中不存在 → `pip install -e` 从来装不上。改为 build_meta。 实测:临时 venv 安装成功,sap-cli --help 正常列出 31 个命令 - pyproject readme 指向不存在的 assets/README.md(editable 安装会失败)→ 改内联文本 - pyproject urls 改指 sap-cli-skill 机制调整: - .github/workflows/ci.yml 适配 assets/ 布局;顶部注明该工作流仅 GitHub 执行, 本仓在 Gitee 不会自动跑 - pre-commit 增本地测试门禁(Gitee 上真正生效的那道) - .gitignore 合并旧仓完整规则(保留 log/ 下 md 知识库入库,只忽略运行日志) - 大文件上限 100KB→1MB(架构图 512KB) 守卫测试 tests/unit/test_repo_guards.py(10 → 18 例): - SKILL.md 须记录 parser 全部 CLI 命令 / 铁律 1-5 须为真实小节标题 / 示例不得违反铁律 5 - references/ 规则齐备;.claude/rules 与 references 必须一致(实测抓到一次真实漂移) - VERSION == sapcli.__version__ == README 版本 - 仓内不得再出现 pack_skill.py / skill-src(防废弃流程回潮) 698 tests OK;editable 安装与 CLI 入口经临时 venv 实测通过。 docs/RELEASING.md 重写为单源开发流程。
4.0 KiB
4.0 KiB
开发与发布
本仓是唯一来源(2026-09-11 起)
sap-cli-skill 同时是技能分发包与工具源码仓,也是 SAP 相关实机操作的运行版。
原 sap-cli 源码仓已归档(只读留档),不再接受改动。
sap-cli-skill/
├── SKILL.md ← 技能文档(手工维护,AI Agent 使用指南)
├── INSTALL.md ← 完整安装指南(手工维护)
├── README.md ← 项目说明
├── VERSION ← 版本号(须与 assets/sapcli/__version__ 一致)
├── assets/ ← 工具源码与打包元数据(Python 包根)
│ ├── sapcli/ ← 工具源码
│ ├── main.py
│ ├── pyproject.toml ← 版本动态取自 sapcli.__version__
│ ├── requirements.txt
│ └── config.ini.example
├── references/ ← 规则正本(sap-tool-constraints / abap-coding-rules / error-handling)
├── tests/ ← 单元测试与 E2E 夹具
├── log/ ← 错误知识库(LLM-WIKI 格式,md 入库)
├── docs/ ← 开发文档、ADT 原理文档
├── openspec/ ← SDD 规格
├── scripts/setup.py ← 安装脚本
├── .claude/rules/ ← 规则副本(供 Claude Code,须与 references/ 一致)
└── .github/workflows/ ← CI
目录语义说明:
assets/是技能包的载荷目录(Hermes / Claude Code 技能约定), 因此工具源码放在其中而非仓库根。安装与调用都指向assets/。
日常开发
cd D:/Gitee/sap-cli-skill
# 装依赖(editable)
pip install -e "./assets[dev]"
# 跑全量测试(692 例)
python -m unittest discover -s tests -p "test_*.py"
# 只跑单元测试(更快)
python -m unittest discover -s tests/unit -t .
改代码 → 改文档(需要时)→ 跑测试 → 提交。未绿不提交。
版本与发布
版本号权威源是 assets/sapcli/__init__.py 的 __version__:
- 改
assets/sapcli/__init__.py的__version__ - 同步
VERSION文件(test_repo_guards.py会断言二者一致,忘了会红) - 提交并打 tag:
git add -A && git commit -m "chore: bump to vX.Y.Z" git tag -a vX.Y.Z -m "sap-cli vX.Y.Z" git push origin HEAD && git push origin vX.Y.Z
发布即推送本仓。Hermes 侧无需拷贝——profiles/*/skills/productivity/sap-cli
是指向本仓的 junction,专家下一轮即读到新内容。
规则文件:两处副本必须一致
references/*.md 是正本(随技能分发给专家、被 SKILL.md 引用);
.claude/rules/*.md 是供 Claude Code 读取的副本。
两者内容必须一致,由 tests/unit/test_repo_guards.py 的
TestRuleCopiesInSync 断言。改规则时两处都要改,只改一处测试会红。
两道守卫(提交前必过)
tests/unit/test_repo_guards.py 守住几类「静默失效」:
| 守卫 | 防的问题 |
|---|---|
| SKILL.md 记录 parser 全部 CLI 命令 | 文档与代码脱节(曾只写 9 个而实际 31 个) |
| 铁律 1–5 是真实小节标题 | 子串检查被正文交叉引用蒙过 |
示例不得出现 --path ./src |
违反铁律 5 的目录结构 |
references/ 规则齐备且含关键规则 |
规则静默丢失 |
VERSION == sapcli.__version__ == README 版本 |
版本漂移(曾 2.3.0 vs 2.5.1) |
.claude/rules/ == references/ |
规则副本漂移 |
已废弃的做法(勿再使用)
pack_skill.py/skill-src/SKILL.md.tmpl打包流程——已随 sap-cli 归档。 现在SKILL.md是手工维护的正本,没有构建步骤,也就没有「构建覆盖手改」的风险。 不要再引入「模板渲染 → 覆盖仓库文档」这类机制。D:/Codespace/SAP-CLI-SKILL——早期开发副本,与分发仓同远端,2026-09-11 已删除。- 向
D:/Gitee/sap-cli提交改动——已归档。