feat(dev): 新增开发分析与设计 Skill

This commit is contained in:
zhiye.sun
2026-08-25 17:39:57 +08:00
parent 6bc3d84018
commit 5b9fa51b6e
25 changed files with 318 additions and 13 deletions
+5 -4
View File
@@ -121,10 +121,10 @@ plan-change
建议顺序:
1. `plan-change`
2. `design-backend`
3. `design-frontend`
4. `prepare-api`
1. `plan-change`(已完成)
2. `design-backend`(已完成)
3. `design-frontend`(已完成)
4. `prepare-api`(已完成)
5. `implement-backend`
6. `implement-frontend`
7. `review-code`
@@ -239,3 +239,4 @@ plan-change
- [x] 完成知识管理批次:`trace`、`distill`、`lessons`、`worklog`。
- [x] 完成前端辅助批次:`component`、`style`、`form`,并以精确触发替代独立路由。
- [x] 完成项目规范维护能力:`guidance-edit`。
- [x] 完成开发分析与设计批次:`plan-change`、`design-backend`、`design-frontend`、`prepare-api`。
+31 -7
View File
@@ -20,7 +20,10 @@
"source-a:1b7843684955ce5a": {
"sourcePathHash": "1b7843684955ce5a0beb3ef16c6e751c5e9eb5a17409084fed806b74ec0c522f",
"sourceSha256": "eabf9fabba7b751a0b85547b141d92821f461e8d904f4fb15d5746eca1965769",
"status": "pending"
"status": "migrated",
"target": "plugins/dev/skills/plan-change",
"targetVersion": "0.1.0",
"reviewedAt": "2026-08-25"
},
"source-a:5d76364c580248a5": {
"sourcePathHash": "5d76364c580248a54449e5ec7ede0079f19df21fef95922d3538fb82c095b181",
@@ -30,12 +33,18 @@
"source-a:a0b791b6dac96b81": {
"sourcePathHash": "a0b791b6dac96b8180df558278b5c7ef643b4806cc4e534ffe6395b9236666d3",
"sourceSha256": "603b4fd6e4b52c9b5d368c5ba6bdff333d32f3e03e9b5393686b0729eb4ffc7c",
"status": "pending"
"status": "migrated",
"target": "plugins/dev/skills/design-backend",
"targetVersion": "0.1.0",
"reviewedAt": "2026-08-25"
},
"source-a:0124493991019160": {
"sourcePathHash": "0124493991019160a06c65d6200db0a50abb212a79bcefab4be4631be85c07c8",
"sourceSha256": "eca051fb929c5bd74c34564631872c2d6755b4427a7c4fbb4d6240eeb6331ee3",
"status": "pending"
"status": "migrated",
"target": "plugins/dev/skills/prepare-api",
"targetVersion": "0.1.0",
"reviewedAt": "2026-08-25"
},
"source-a:b80c5913e146321c": {
"sourcePathHash": "b80c5913e146321ca5efef5e45f11172e79c542855c2ae65478fe253414e66ea",
@@ -45,7 +54,10 @@
"source-a:cd36505dd718e889": {
"sourcePathHash": "cd36505dd718e88966ad74421c65e6c7cccd71a1436f2843eb8cfa7a4f1534c5",
"sourceSha256": "a0137bd615988c49a8967b4e0129618858268b90391ab2ed912cc72f338f41f8",
"status": "pending"
"status": "migrated",
"target": "plugins/dev/skills/design-frontend",
"targetVersion": "0.1.0",
"reviewedAt": "2026-08-25"
},
"source-a:e14c1a3cd3b041f6": {
"sourcePathHash": "e14c1a3cd3b041f650d71eb5701c71c0de76cb7a909e9a419f1d277159cd763a",
@@ -93,7 +105,11 @@
"source-b:3f05784a0a86ba5f": {
"sourcePathHash": "3f05784a0a86ba5fb8f268797ca1ceabe8ca237b3c9d3c4396e622c1ef421cc6",
"sourceSha256": "9a39cd7af138519fe3de3f7a3cb031ea5da1243ff5779504a13215fa03a5a3c2",
"status": "pending"
"status": "superseded",
"target": "plugins/dev/skills/design-backend",
"targetVersion": "0.1.0",
"reason": "后端设计能力已与另一来源合并并按项目证据中性重建",
"reviewedAt": "2026-08-25"
},
"source-b:41934e94a1922a1b": {
"sourcePathHash": "41934e94a1922a1bbccec4377246e67bd84f1ffbd2b9d1bf4027c1ed15d12260",
@@ -108,7 +124,11 @@
"source-b:f171b05e239c2e2c": {
"sourcePathHash": "f171b05e239c2e2c5f2a0c636dfac0c2456b9d3b5215fdaa7fb86a33be1ee188",
"sourceSha256": "cd16d17204009509e6798badab786b9bd4d3969117b3ad4b9005337b76a4791b",
"status": "pending"
"status": "superseded",
"target": "plugins/dev/skills/plan-change",
"targetVersion": "0.1.0",
"reason": "开发计划能力已与另一来源合并为通用变更计划",
"reviewedAt": "2026-08-25"
},
"source-b:3b29e4441f642e65": {
"sourcePathHash": "3b29e4441f642e65d442fd284f37a45364cebb7a6c53446c354d15c70e532410",
@@ -126,7 +146,11 @@
"source-b:c49d1db42acd7220": {
"sourcePathHash": "c49d1db42acd722071d61420be58ba8ccbc54f5370bdf951abfb5981914271cf",
"sourceSha256": "20875df87fb84c7d5830d6eaaff544c9e32e3f9a2359ed099de5f3a4a36eaa7d",
"status": "pending"
"status": "superseded",
"target": "plugins/dev/skills/design-frontend",
"targetVersion": "0.1.0",
"reason": "前端设计能力已与另一来源合并并移除内部组件与固定版本约束",
"reviewedAt": "2026-08-25"
},
"source-b:9a3f3d3c43d9017a": {
"sourcePathHash": "9a3f3d3c43d9017a080a9832df5b975e6ddd3f8c39947ee768aeb973fc23974e",
+58
View File
@@ -0,0 +1,58 @@
"""开发分析与设计批次的职责边界测试。"""
from pathlib import Path
import unittest
ROOT = Path(__file__).resolve().parents[2]
SKILLS = ROOT / "plugins" / "dev" / "skills"
def read_skill(name: str) -> str:
"""合并读取 Skill 入口及引用文件。"""
folder = SKILLS / name
files = [folder / "SKILL.md", *sorted((folder / "references").glob("*.md"))]
return "\n".join(path.read_text(encoding="utf-8") for path in files)
class DevDesignBatchTest(unittest.TestCase):
"""验证四个 Skill 的通用化设计和相互边界。"""
def test_plan_is_evidence_based_and_does_not_implement(self) -> None:
content = read_skill("plan-change")
self.assertIn("不执行设计或编码", content)
self.assertIn("验收标准", content)
self.assertIn("运行行为标为待验证", content)
self.assertNotIn("docs/{moduleCode}", content)
def test_backend_design_uses_project_version(self) -> None:
content = read_skill("design-backend")
self.assertIn("精确版本", content)
self.assertIn("guidance", content)
self.assertIn("事务边界", content)
self.assertIn("不生成业务代码", content)
def test_frontend_design_composes_existing_helpers(self) -> None:
content = read_skill("design-frontend")
for helper in ("component", "style", "form", "prepare-api"):
self.assertIn(helper, content)
self.assertIn("不编造组件", content)
self.assertIn("不跨版本混用", content)
def test_prepare_api_does_not_assume_contract(self) -> None:
content = read_skill("prepare-api")
self.assertIn("不预设请求客户端", content)
self.assertIn("未匹配字段", content)
self.assertIn("不发起真实请求", content)
self.assertIn("不能反向覆盖", content)
def test_descriptions_are_distinct(self) -> None:
descriptions = []
for name in ("plan-change", "design-backend", "design-frontend", "prepare-api"):
text = (SKILLS / name / "SKILL.md").read_text(encoding="utf-8")
descriptions.append(text.split("---", 2)[1])
self.assertEqual(4, len(set(descriptions)))
if __name__ == "__main__":
unittest.main()