feat(dev): 新增开发分析与设计 Skill
This commit is contained in:
@@ -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`。
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user