pdd-skills 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1478 -0
- package/bin/pdd.js +354 -0
- package/config/bpmn-rules.yaml +166 -0
- package/config/checkstyle.xml +105 -0
- package/config/eslint.config.js +48 -0
- package/config/pmd.xml +91 -0
- package/config/prd-rules.yaml +113 -0
- package/config/ruff.toml +45 -0
- package/config/sqlfluff.cfg +82 -0
- package/hooks/hook-executor.js +332 -0
- package/index.js +43 -0
- package/lib/api-routes.js +750 -0
- package/lib/api-server.js +408 -0
- package/lib/cache/cache-config.js +209 -0
- package/lib/cache/system-cache.js +852 -0
- package/lib/config-manager.js +373 -0
- package/lib/generate.js +528 -0
- package/lib/grpc/grpc-routes.js +1134 -0
- package/lib/grpc/grpc-server.js +912 -0
- package/lib/grpc/proto-definitions.js +1033 -0
- package/lib/init.js +172 -0
- package/lib/iteration/auto-fixer.js +1025 -0
- package/lib/iteration/auto-reviewer.js +923 -0
- package/lib/iteration/controller.js +577 -0
- package/lib/list.js +130 -0
- package/lib/mcp-server.js +548 -0
- package/lib/openclaw/api-integration.js +535 -0
- package/lib/openclaw/cli-integration.js +567 -0
- package/lib/openclaw/data-sync.js +845 -0
- package/lib/openclaw/openclaw-adapter.js +783 -0
- package/lib/plugin/example-plugins/code-stats/index.js +332 -0
- package/lib/plugin/example-plugins/code-stats/plugin.json +1 -0
- package/lib/plugin/example-plugins/custom-linter/index.js +472 -0
- package/lib/plugin/example-plugins/custom-linter/plugin.json +1 -0
- package/lib/plugin/example-plugins/hello-world/index.js +86 -0
- package/lib/plugin/example-plugins/hello-world/plugin.json +1 -0
- package/lib/plugin/plugin-manager.js +655 -0
- package/lib/plugin/plugin-sdk.js +565 -0
- package/lib/plugin/sandbox.js +627 -0
- package/lib/quality/rules/maintainability.js +418 -0
- package/lib/quality/rules/performance.js +498 -0
- package/lib/quality/rules/readability.js +441 -0
- package/lib/quality/rules/robustness.js +504 -0
- package/lib/quality/rules/security.js +444 -0
- package/lib/quality/scorer.js +576 -0
- package/lib/report.js +669 -0
- package/lib/sdk-base.js +301 -0
- package/lib/sdk-js.js +446 -0
- package/lib/sdk-python/README.md +546 -0
- package/lib/sdk-python/examples/basic_usage.py +450 -0
- package/lib/sdk-python/pdd_sdk/__init__.py +180 -0
- package/lib/sdk-python/pdd_sdk/client.py +1170 -0
- package/lib/sdk-python/pdd_sdk/events.py +423 -0
- package/lib/sdk-python/pdd_sdk/exceptions.py +158 -0
- package/lib/sdk-python/pdd_sdk/models.py +518 -0
- package/lib/sdk-python/pdd_sdk/utils.py +759 -0
- package/lib/token/budget-alert.js +367 -0
- package/lib/token/budget-manager.js +485 -0
- package/lib/update.js +54 -0
- package/lib/utils/logger.js +88 -0
- package/lib/verify.js +741 -0
- package/lib/version.js +52 -0
- package/lib/vm/README.md +102 -0
- package/lib/vm/dashboard/api-routes.js +669 -0
- package/lib/vm/dashboard/server.js +391 -0
- package/lib/vm/dashboard/sse.js +358 -0
- package/lib/vm/dashboard/static/css/dashboard.css +1378 -0
- package/lib/vm/dashboard/static/index.html +118 -0
- package/lib/vm/dashboard/static/js/app.js +949 -0
- package/lib/vm/dashboard/static/js/charts.js +913 -0
- package/lib/vm/dashboard/static/js/kanban-view.js +1053 -0
- package/lib/vm/dashboard/static/js/pipeline-view.js +463 -0
- package/lib/vm/dashboard/static/js/quality-view.js +598 -0
- package/lib/vm/dashboard/static/js/system-view.js +1021 -0
- package/lib/vm/data-provider.js +1191 -0
- package/lib/vm/event-bus.js +402 -0
- package/lib/vm/hooks/extract-hook.js +307 -0
- package/lib/vm/hooks/generate-hook.js +374 -0
- package/lib/vm/hooks/hook-interface.js +458 -0
- package/lib/vm/hooks/report-hook.js +331 -0
- package/lib/vm/hooks/verify-hook.js +454 -0
- package/lib/vm/models.js +1003 -0
- package/lib/vm/reconciler.js +855 -0
- package/lib/vm/scanner.js +988 -0
- package/lib/vm/state-schema.js +955 -0
- package/lib/vm/state-store.js +733 -0
- package/lib/vm/tui/components/card.js +339 -0
- package/lib/vm/tui/components/progress-bar.js +368 -0
- package/lib/vm/tui/components/sparkline.js +327 -0
- package/lib/vm/tui/components/status-light.js +294 -0
- package/lib/vm/tui/components/table.js +370 -0
- package/lib/vm/tui/input.js +335 -0
- package/lib/vm/tui/renderer.js +548 -0
- package/lib/vm/tui/screens/kanban-screen.js +397 -0
- package/lib/vm/tui/screens/overview-screen.js +357 -0
- package/lib/vm/tui/screens/quality-screen.js +336 -0
- package/lib/vm/tui/screens/system-screen.js +379 -0
- package/lib/vm/tui/tui.js +805 -0
- package/package.json +1 -0
- package/scripts/cso-analyzer.js +198 -0
- package/scripts/eval-runner.js +359 -0
- package/scripts/i18n-checker.js +109 -0
- package/scripts/linter/activiti-linter.js +272 -0
- package/scripts/linter/prd-linter.js +162 -0
- package/scripts/linter/report-generator.js +207 -0
- package/scripts/linter/run-linters.js +285 -0
- package/scripts/linter/sql-linter.js +166 -0
- package/scripts/token-analyzer.js +162 -0
- package/scripts/vm-test.js +180 -0
- package/skills/core/official-doc-writer/LICENSE +21 -0
- package/skills/core/official-doc-writer/README.md +232 -0
- package/skills/core/official-doc-writer/SKILL.md +475 -0
- package/skills/core/official-doc-writer/_meta.json +1 -0
- package/skills/core/official-doc-writer/document_generator.py +580 -0
- package/skills/core/official-doc-writer/evals/default-evals.json +1 -0
- package/skills/core/official-doc-writer/examples.md +150 -0
- package/skills/core/official-doc-writer/fonts/FONTS_LIST.md +45 -0
- package/skills/core/official-doc-writer/fonts/README.md +141 -0
- package/skills/core/official-doc-writer/fonts/SIMFANG.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMHEI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMKAI.TTF +0 -0
- package/skills/core/official-doc-writer/fonts/SIMSUN.TTC +0 -0
- package/skills/core/official-doc-writer/fonts//346/226/271/346/255/243/345/260/217/346/240/207/345/256/213GBK.TTF +0 -0
- package/skills/core/official-doc-writer/references/GBT_9704-2012_/345/205/232/346/224/277/346/234/272/345/205/263/345/205/254/346/226/207/346/240/274/345/274/217.md +422 -0
- package/skills/core/official-doc-writer/scripts/__pycache__/generate_official_doc.cpython-313.pyc +0 -0
- package/skills/core/official-doc-writer/scripts/dialog_manager.py +564 -0
- package/skills/core/official-doc-writer/scripts/generate_official_doc.py +252 -0
- package/skills/core/official-doc-writer/scripts/install_fonts.py +390 -0
- package/skills/core/official-doc-writer/scripts/smart_prompts.py +363 -0
- package/skills/core/pdd-ba/SKILL.md +305 -0
- package/skills/core/pdd-ba/_meta.json +1 -0
- package/skills/core/pdd-ba/evals/default-evals.json +1 -0
- package/skills/core/pdd-code-reviewer/SKILL.md +378 -0
- package/skills/core/pdd-code-reviewer/_meta.json +1 -0
- package/skills/core/pdd-code-reviewer/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-change/SKILL.md +350 -0
- package/skills/core/pdd-doc-change/_meta.json +1 -0
- package/skills/core/pdd-doc-change/evals/default-evals.json +1 -0
- package/skills/core/pdd-doc-gardener/SKILL.md +248 -0
- package/skills/core/pdd-doc-gardener/_meta.json +1 -0
- package/skills/core/pdd-doc-gardener/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/SKILL.md +360 -0
- package/skills/core/pdd-entropy-reduction/_meta.json +1 -0
- package/skills/core/pdd-entropy-reduction/evals/default-evals.json +1 -0
- package/skills/core/pdd-entropy-reduction/references/entropy-report-template.md +287 -0
- package/skills/core/pdd-entropy-reduction/references/golden-principles.md +573 -0
- package/skills/core/pdd-entropy-reduction/scripts/entropy_scan.py +712 -0
- package/skills/core/pdd-extract-features/SKILL.md +320 -0
- package/skills/core/pdd-extract-features/_meta.json +1 -0
- package/skills/core/pdd-extract-features/evals/default-evals.json +1 -0
- package/skills/core/pdd-generate-spec/SKILL.md +418 -0
- package/skills/core/pdd-generate-spec/_meta.json +1 -0
- package/skills/core/pdd-generate-spec/evals/default-evals.json +1 -0
- package/skills/core/pdd-implement-feature/SKILL.md +332 -0
- package/skills/core/pdd-implement-feature/_meta.json +1 -0
- package/skills/core/pdd-implement-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/SKILL.md +540 -0
- package/skills/core/pdd-main/_meta.json +1 -0
- package/skills/core/pdd-main/evals/default-evals.json +1 -0
- package/skills/core/pdd-main/evals/evals.json +215 -0
- package/skills/core/pdd-verify-feature/SKILL.md +474 -0
- package/skills/core/pdd-verify-feature/_meta.json +1 -0
- package/skills/core/pdd-verify-feature/evals/default-evals.json +1 -0
- package/skills/core/pdd-vm/evals/default-evals.json +1 -0
- package/skills/core/traffic-accident-assessor/LICENSE +29 -0
- package/skills/core/traffic-accident-assessor/SKILL.md +439 -0
- package/skills/core/traffic-accident-assessor/evals/evals.json +1 -0
- package/skills/core/traffic-accident-assessor/references/accident-types.md +369 -0
- package/skills/core/traffic-accident-assessor/references/liability-rules.md +287 -0
- package/skills/core/traffic-accident-assessor/references/traffic-laws.md +226 -0
- package/skills/core/traffic-accident-assessor/references//351/253/230/345/260/224/345/244/253/350/257/264/346/230/216/344/271/246.pdf +32576 -106
- package/skills/core/traffic-accident-assessor/scripts/generate_official_statement.py +588 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_report.py +495 -0
- package/skills/core/traffic-accident-assessor/scripts/generate_statement.py +528 -0
- package/skills/core/traffic-accident-assessor.zip +0 -0
- package/skills/entropy/expert-arch-enforcer/SKILL.md +292 -0
- package/skills/entropy/expert-arch-enforcer/_meta.json +1 -0
- package/skills/entropy/expert-arch-enforcer/evals/default-evals.json +1 -0
- package/skills/entropy/expert-auto-refactor/SKILL.md +327 -0
- package/skills/entropy/expert-auto-refactor/_meta.json +1 -0
- package/skills/entropy/expert-auto-refactor/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/SKILL.md +468 -0
- package/skills/entropy/expert-code-quality/_meta.json +1 -0
- package/skills/entropy/expert-code-quality/evals/default-evals.json +1 -0
- package/skills/entropy/expert-code-quality/evals/evals.json +109 -0
- package/skills/entropy/expert-code-quality/references/code-smells.md +605 -0
- package/skills/entropy/expert-code-quality/references/design-patterns.md +1111 -0
- package/skills/entropy/expert-code-quality/references/refactoring-catalog.md +1281 -0
- package/skills/entropy/expert-code-quality/references/solid-principles.md +524 -0
- package/skills/entropy/expert-entropy-auditor/SKILL.md +276 -0
- package/skills/entropy/expert-entropy-auditor/_meta.json +1 -0
- package/skills/entropy/expert-entropy-auditor/evals/default-evals.json +1 -0
- package/skills/expert/expert-activiti/SKILL.md +497 -0
- package/skills/expert/expert-activiti/_meta.json +1 -0
- package/skills/expert/expert-mysql/SKILL.md +832 -0
- package/skills/expert/expert-mysql/_meta.json +1 -0
- package/skills/expert/expert-performance/SKILL.md +379 -0
- package/skills/expert/expert-performance/_meta.json +1 -0
- package/skills/expert/expert-performance/evals/default-evals.json +1 -0
- package/skills/expert/expert-ruoyi/SKILL.md +472 -0
- package/skills/expert/expert-ruoyi/_meta.json +1 -0
- package/skills/expert/expert-security/SKILL.md +1341 -0
- package/skills/expert/expert-security/_meta.json +1 -0
- package/skills/expert/expert-security/evals/default-evals.json +1 -0
- package/skills/expert/software-architect/SKILL.md +350 -0
- package/skills/expert/software-architect/_meta.json +1 -0
- package/skills/expert/software-engineer/SKILL.md +437 -0
- package/skills/expert/software-engineer/_meta.json +1 -0
- package/skills/expert/software-engineer/architecture.md +130 -0
- package/skills/expert/software-engineer/patterns.md +151 -0
- package/skills/expert/software-engineer/testing.md +135 -0
- package/skills/expert/system-architect/SKILL.md +628 -0
- package/skills/expert/system-architect/_meta.json +1 -0
- package/skills/expert/system-architect/assets/templates/ARCHITECTURE.md +25 -0
- package/skills/expert/system-architect/assets/templates/README.md +44 -0
- package/skills/expert/system-architect/references/js-ts-standards.md +18 -0
- package/skills/expert/system-architect/references/python-standards.md +19 -0
- package/skills/expert/system-architect/references/scaffolding.md +61 -0
- package/skills/expert/system-architect/references/security-checklist.md +21 -0
- package/skills/openspec/openspec-apply-change/SKILL.md +156 -0
- package/skills/openspec/openspec-apply-change/_meta.json +1 -0
- package/skills/openspec/openspec-archive-change/SKILL.md +114 -0
- package/skills/openspec/openspec-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-bulk-archive-change/SKILL.md +246 -0
- package/skills/openspec/openspec-bulk-archive-change/_meta.json +1 -0
- package/skills/openspec/openspec-continue-change/SKILL.md +118 -0
- package/skills/openspec/openspec-continue-change/_meta.json +1 -0
- package/skills/openspec/openspec-explore/SKILL.md +288 -0
- package/skills/openspec/openspec-explore/_meta.json +1 -0
- package/skills/openspec/openspec-ff-change/SKILL.md +101 -0
- package/skills/openspec/openspec-ff-change/_meta.json +1 -0
- package/skills/openspec/openspec-new-change/SKILL.md +74 -0
- package/skills/openspec/openspec-new-change/_meta.json +1 -0
- package/skills/openspec/openspec-onboard/SKILL.md +554 -0
- package/skills/openspec/openspec-onboard/_meta.json +1 -0
- package/skills/openspec/openspec-sync-specs/SKILL.md +138 -0
- package/skills/openspec/openspec-sync-specs/_meta.json +1 -0
- package/skills/openspec/openspec-verify-change/SKILL.md +168 -0
- package/skills/openspec/openspec-verify-change/_meta.json +1 -0
- package/skills/pr/pdd-multi-review/SKILL.md +534 -0
- package/skills/pr/pdd-multi-review/_meta.json +1 -0
- package/skills/pr/pdd-pr-batch/SKILL.md +303 -0
- package/skills/pr/pdd-pr-batch/_meta.json +1 -0
- package/skills/pr/pdd-pr-create/SKILL.md +344 -0
- package/skills/pr/pdd-pr-create/_meta.json +1 -0
- package/skills/pr/pdd-pr-merge/SKILL.md +286 -0
- package/skills/pr/pdd-pr-merge/_meta.json +1 -0
- package/skills/pr/pdd-pr-review/SKILL.md +217 -0
- package/skills/pr/pdd-pr-review/_meta.json +1 -0
- package/skills/pr/pdd-task-manager/SKILL.md +636 -0
- package/skills/pr/pdd-task-manager/_meta.json +1 -0
- package/skills/pr/pdd-template-engine/SKILL.md +306 -0
- package/skills/pr/pdd-template-engine/_meta.json +1 -0
- package/templates/behavior-shaping/iron-law-template.md +87 -0
- package/templates/behavior-shaping/rationalization-template.md +62 -0
- package/templates/behavior-shaping/red-flags-template.md +70 -0
- package/templates/bilingual-template.md +139 -0
- package/templates/config/default.yaml +47 -0
- package/templates/project/default/README.md +31 -0
- package/templates/project/frontend/README.md +46 -0
- package/templates/project/java/README.md +48 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expert-arch-enforcer
|
|
3
|
+
description: 架构约束强制技能,监控代码是否违反预设的不变量和架构边界。当用户需要架构检查或依赖检查时自动触发。支持中文触发:架构检查、依赖检查、模块边界检查。
|
|
4
|
+
|
|
5
|
+
核心职责:确保架构连贯性,防止架构漂移。
|
|
6
|
+
license: MIT
|
|
7
|
+
compatibility: 需要架构约束配置
|
|
8
|
+
metadata:
|
|
9
|
+
author: "neuqik@hotmail.com"
|
|
10
|
+
version: "1.0"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 架构约束强制 (expert-arch-enforcer)
|
|
14
|
+
|
|
15
|
+
## 核心理念
|
|
16
|
+
|
|
17
|
+
> "在智能体优先的世界中,架构连贯性容易随时间漂移。约束是速度的保障,不是束缚。" —— Harness Engineering
|
|
18
|
+
|
|
19
|
+
架构约束强制技能负责监控代码是否违反了预设的不变量和架构边界,确保代码结构保持一致性。
|
|
20
|
+
|
|
21
|
+
## 架构约束模型
|
|
22
|
+
|
|
23
|
+
### 六层依赖模型
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Types → Config → Repo → Service → Runtime → UI
|
|
27
|
+
|
|
28
|
+
规则:只能向前依赖,不能反向依赖
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| 层级 | 职责 | 允许依赖 |
|
|
32
|
+
|------|------|---------|
|
|
33
|
+
| Types | 类型定义、数据模型 | 无 |
|
|
34
|
+
| Config | 配置管理、常量定义 | Types |
|
|
35
|
+
| Repo | 数据访问、外部服务调用 | Types, Config |
|
|
36
|
+
| Service | 业务逻辑、领域服务 | Types, Config, Repo |
|
|
37
|
+
| Runtime | 运行时、应用入口 | Types, Config, Repo, Service |
|
|
38
|
+
| UI | 用户界面、展示层 | 所有层 |
|
|
39
|
+
|
|
40
|
+
### 边界约束
|
|
41
|
+
|
|
42
|
+
**数据边界**:
|
|
43
|
+
- 所有外部数据必须验证
|
|
44
|
+
- API 入口参数必须有 Schema 验证
|
|
45
|
+
- 不允许猜测数据结构
|
|
46
|
+
|
|
47
|
+
**模块边界**:
|
|
48
|
+
- 模块间通过接口通信
|
|
49
|
+
- 禁止跨层直接访问
|
|
50
|
+
- 共享状态必须显式声明
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 检测项
|
|
55
|
+
|
|
56
|
+
### 1. 模块依赖方向违规
|
|
57
|
+
|
|
58
|
+
**检测方法**:
|
|
59
|
+
- 解析 import/require 语句
|
|
60
|
+
- 构建依赖图
|
|
61
|
+
- 检查是否违反依赖方向
|
|
62
|
+
|
|
63
|
+
**示例**:
|
|
64
|
+
```
|
|
65
|
+
文件:src/types/User.ts
|
|
66
|
+
import: import { UserService } from '../service/UserService'
|
|
67
|
+
→ 检测结果:Types 层依赖 Service 层,违反依赖方向
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. 边界数据验证缺失
|
|
71
|
+
|
|
72
|
+
**检测方法**:
|
|
73
|
+
- 扫描 API 入口函数
|
|
74
|
+
- 检查是否有 Schema 验证
|
|
75
|
+
- 标记缺失验证的入口
|
|
76
|
+
|
|
77
|
+
**示例**:
|
|
78
|
+
```
|
|
79
|
+
API 入口:POST /api/users
|
|
80
|
+
参数验证:无
|
|
81
|
+
→ 检测结果:缺少参数验证 Schema
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 3. 文件大小超限
|
|
85
|
+
|
|
86
|
+
**检测方法**:
|
|
87
|
+
- 统计文件行数
|
|
88
|
+
- 对比配置的最大行数
|
|
89
|
+
- 标记超限文件
|
|
90
|
+
|
|
91
|
+
**示例**:
|
|
92
|
+
```
|
|
93
|
+
文件:src/service/UserService.ts
|
|
94
|
+
行数:450 行
|
|
95
|
+
限制:300 行
|
|
96
|
+
→ 检测结果:文件过大,建议拆分
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 4. 命名规范违反
|
|
100
|
+
|
|
101
|
+
**检测方法**:
|
|
102
|
+
- 检查文件名、函数名、变量名
|
|
103
|
+
- 对比命名规范
|
|
104
|
+
- 标记违规命名
|
|
105
|
+
|
|
106
|
+
**示例**:
|
|
107
|
+
```
|
|
108
|
+
函数名:get_data
|
|
109
|
+
规范:camelCase
|
|
110
|
+
→ 检测结果:命名不规范,应为 getData
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 执行流程
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
119
|
+
│ 解析 │ ──→ │ 构建 │ ──→ │ 检测 │ ──→ │ 报告 │
|
|
120
|
+
│ │ │ │ │ │ │ │
|
|
121
|
+
│ • 代码文件 │ │ • 依赖图 │ │ • 依赖违规 │ │ • 问题清单 │
|
|
122
|
+
│ • import │ │ • 调用关系 │ │ • 边界违规 │ │ • 修复建议 │
|
|
123
|
+
│ • 函数签名 │ │ • 模块结构 │ │ • 大小违规 │ │ • PR 创建 │
|
|
124
|
+
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 工具集成
|
|
130
|
+
|
|
131
|
+
### 自定义 Linter
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
// custom-linter.js
|
|
135
|
+
module.exports = {
|
|
136
|
+
rules: {
|
|
137
|
+
'layer-dependency': {
|
|
138
|
+
meta: {
|
|
139
|
+
docs: { description: '强制六层依赖方向' }
|
|
140
|
+
},
|
|
141
|
+
create(context) {
|
|
142
|
+
const layers = ['types', 'config', 'repo', 'service', 'runtime', 'ui'];
|
|
143
|
+
return {
|
|
144
|
+
ImportDeclaration(node) {
|
|
145
|
+
const source = node.source.value;
|
|
146
|
+
const currentLayer = getCurrentLayer(context.getFilename());
|
|
147
|
+
const targetLayer = getLayerFromPath(source);
|
|
148
|
+
|
|
149
|
+
if (layers.indexOf(targetLayer) < layers.indexOf(currentLayer)) {
|
|
150
|
+
context.report({
|
|
151
|
+
node,
|
|
152
|
+
message: `违反依赖方向: ${currentLayer} 不能依赖 ${targetLayer}`
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### ArchUnit 测试
|
|
164
|
+
|
|
165
|
+
```java
|
|
166
|
+
// ArchitectureTest.java
|
|
167
|
+
@AnalyzeClasses(packages = "com.example")
|
|
168
|
+
public class ArchitectureTest {
|
|
169
|
+
|
|
170
|
+
@ArchTest
|
|
171
|
+
static final ArchRule layer_dependency_rule = layeredArchitecture()
|
|
172
|
+
.layer("Types").definedBy("..types..")
|
|
173
|
+
.layer("Config").definedBy("..config..")
|
|
174
|
+
.layer("Repo").definedBy("..repo..")
|
|
175
|
+
.layer("Service").definedBy("..service..")
|
|
176
|
+
.layer("Runtime").definedBy("..runtime..")
|
|
177
|
+
.layer("UI").definedBy("..ui..")
|
|
178
|
+
.whereLayer("Types").mayNotBeAccessedByAnyLayer()
|
|
179
|
+
.whereLayer("Config").mayOnlyBeAccessedByLayers("Repo", "Service", "Runtime", "UI")
|
|
180
|
+
.whereLayer("Repo").mayOnlyBeAccessedByLayers("Service", "Runtime", "UI");
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 输出格式
|
|
187
|
+
|
|
188
|
+
### 架构约束报告
|
|
189
|
+
|
|
190
|
+
```markdown
|
|
191
|
+
# 架构约束报告 - YYYY-MM-DD
|
|
192
|
+
|
|
193
|
+
## 架构健康度:XX/100
|
|
194
|
+
|
|
195
|
+
## 依赖图
|
|
196
|
+
|
|
197
|
+
[依赖关系可视化图]
|
|
198
|
+
|
|
199
|
+
## 发现问题
|
|
200
|
+
|
|
201
|
+
### Critical(必须修复)
|
|
202
|
+
| 文件 | 问题 | 违规类型 |
|
|
203
|
+
|------|------|---------|
|
|
204
|
+
| src/types/User.ts | 依赖 Service 层 | 依赖方向违规 |
|
|
205
|
+
|
|
206
|
+
### Warning(建议修复)
|
|
207
|
+
| 文件 | 问题 | 违规类型 |
|
|
208
|
+
|------|------|---------|
|
|
209
|
+
| src/api/users.ts | 缺少参数验证 | 边界验证缺失 |
|
|
210
|
+
|
|
211
|
+
### Info(可选修复)
|
|
212
|
+
| 文件 | 问题 | 违规类型 |
|
|
213
|
+
|------|------|---------|
|
|
214
|
+
| src/service/UserService.ts | 文件 450 行 | 大小超限 |
|
|
215
|
+
|
|
216
|
+
## 修复建议
|
|
217
|
+
|
|
218
|
+
### Critical 修复
|
|
219
|
+
1. 移除 User.ts 中对 UserService 的依赖
|
|
220
|
+
2. 将共享逻辑提取到 Types 层
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 配置选项
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
# arch-enforcer-config.yaml
|
|
229
|
+
arch_enforcer:
|
|
230
|
+
# 层级定义
|
|
231
|
+
layers:
|
|
232
|
+
- name: types
|
|
233
|
+
paths: ["src/types/", "src/models/"]
|
|
234
|
+
- name: config
|
|
235
|
+
paths: ["src/config/", "src/constants/"]
|
|
236
|
+
- name: repo
|
|
237
|
+
paths: ["src/repo/", "src/data/"]
|
|
238
|
+
- name: service
|
|
239
|
+
paths: ["src/service/", "src/domain/"]
|
|
240
|
+
- name: runtime
|
|
241
|
+
paths: ["src/runtime/", "src/app/"]
|
|
242
|
+
- name: ui
|
|
243
|
+
paths: ["src/ui/", "src/components/"]
|
|
244
|
+
|
|
245
|
+
# 约束规则
|
|
246
|
+
constraints:
|
|
247
|
+
max_file_lines: 300
|
|
248
|
+
max_function_lines: 50
|
|
249
|
+
require_schema_validation: true
|
|
250
|
+
|
|
251
|
+
# 执行配置
|
|
252
|
+
execution:
|
|
253
|
+
run_linter: true
|
|
254
|
+
run_arch_test: true
|
|
255
|
+
create_pr: true
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 使用示例
|
|
261
|
+
|
|
262
|
+
### 示例 1:全面架构检查
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
用户:检查架构约束
|
|
266
|
+
|
|
267
|
+
AI:
|
|
268
|
+
1. 解析代码文件
|
|
269
|
+
2. 构建依赖图
|
|
270
|
+
3. 运行 Linter 和 ArchUnit
|
|
271
|
+
4. 生成报告
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 示例 2:依赖方向检查
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
用户:检查模块依赖方向
|
|
278
|
+
|
|
279
|
+
AI:
|
|
280
|
+
1. 解析 import 语句
|
|
281
|
+
2. 构建依赖图
|
|
282
|
+
3. 检查是否违反六层模型
|
|
283
|
+
4. 生成违规报告
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 与其他技能的协作
|
|
289
|
+
|
|
290
|
+
- **pdd-entropy-reduction**:作为子技能被协调调用
|
|
291
|
+
- **expert-auto-refactor**:接收架构违规,执行重构
|
|
292
|
+
- **pdd-code-reviewer**:集成架构检查到代码审查
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name": "expert-arch-enforcer", "version": "1.0.0", "category": "entropy", "description": "Architecture constraint enforcer monitoring code for violations of preset invariants and boundaries. Invoke when checking architecture compliance, dependency direction, or module boundary violations.", "triggers": ["架构检查", "依赖检查", "模块边界"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"name": "SKILL.md-exists", "description": "技能文件存在且格式正确", "type": "structure", "expect": {"exists": true, "hasDescription": true}, "checks": {"file_exists": "SKILL.md"}}, {"name": "_meta.json-valid", "description": "元数据文件格式正确", "type": "structure", "expect": {"exists": true, "hasName": true, "hasVersion": true, "hasTriggers": true}, "checks": {"file_exists": "_meta.json"}}, {"name": "constraints-defined", "description": "定义了架构约束规则(不变量/依赖方向/模块边界)", "type": "content", "contains": ["约束", "不变量", "依赖", "模块边界", "架构漂移"]}, {"name": "violation-types-defined", "description": "定义了违规类型和严重级别", "type": "content", "contains": ["违规", "CRITICAL", "WARN", "INFO", "检测"]}, {"name": "enforcement-actions-defined", "description": "定义了强制执行动作(阻止/警告/记录)", "type": "content", "contains": ["执行", "阻止", "警告", "记录", "CI"]}]
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expert-auto-refactor
|
|
3
|
+
description: Automated refactoring expert transforming quality improvements into concrete code operations. Call when eliminating duplication or simplifying complexity systematically. 支持中文触发:重构代码、消除重复、简化代码。
|
|
4
|
+
|
|
5
|
+
Core responsibility: Initiate targeted refactoring PRs regularly in a "small debt repayment" manner to prevent technical debt accumulation.
|
|
6
|
+
|
|
7
|
+
Trigger scenarios:
|
|
8
|
+
- User requests "refactor code", "eliminate duplicates", "simplify code"
|
|
9
|
+
- Called by pdd-entropy-reduction coordinator
|
|
10
|
+
- Refactoring suggestions passed from expert-entropy-auditor
|
|
11
|
+
|
|
12
|
+
支持中文触发:自动重构、代码重构、消除重复、简化代码、重构专家、PDD重构。
|
|
13
|
+
author: neuqik@hotmail.com
|
|
14
|
+
license: MIT
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Automated Refactoring Expert (expert-auto-refactor)
|
|
18
|
+
|
|
19
|
+
## Core Philosophy
|
|
20
|
+
|
|
21
|
+
> "Initiate targeted refactoring PRs regularly in a 'small debt repayment' manner to prevent technical debt from accumulating into unmanageable 'painful interest'." —— Harness Engineering
|
|
22
|
+
|
|
23
|
+
The automated refactoring expert is an upgraded version of `expert-code-quality`, not just recording issues but actively executing refactoring operations.
|
|
24
|
+
|
|
25
|
+
## Refactoring Types
|
|
26
|
+
|
|
27
|
+
### 1. Extract Common Methods
|
|
28
|
+
|
|
29
|
+
**Scenario**: Similar code logic in multiple places
|
|
30
|
+
|
|
31
|
+
**Refactoring Method**:
|
|
32
|
+
1. Identify similar code
|
|
33
|
+
2. Extract common methods
|
|
34
|
+
3. Replace original calls
|
|
35
|
+
|
|
36
|
+
**Example**:
|
|
37
|
+
|
|
38
|
+
Before refactoring:
|
|
39
|
+
```javascript
|
|
40
|
+
// File A
|
|
41
|
+
function formatDate(date) {
|
|
42
|
+
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// File B
|
|
46
|
+
function formatDateString(d) {
|
|
47
|
+
return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
After refactoring:
|
|
52
|
+
```javascript
|
|
53
|
+
// utils/dateUtils.ts
|
|
54
|
+
export function formatDate(date: Date): string {
|
|
55
|
+
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// File A
|
|
59
|
+
import { formatDate } from '../utils/dateUtils';
|
|
60
|
+
|
|
61
|
+
// File B
|
|
62
|
+
import { formatDate } from '../utils/dateUtils';
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 2. Eliminate Duplicate Code
|
|
66
|
+
|
|
67
|
+
**Scenario**: Identical or highly similar code blocks
|
|
68
|
+
|
|
69
|
+
**Refactoring Method**:
|
|
70
|
+
1. Detect duplicate code
|
|
71
|
+
2. Extract to shared module
|
|
72
|
+
3. Update references
|
|
73
|
+
|
|
74
|
+
**Example**:
|
|
75
|
+
|
|
76
|
+
Before refactoring:
|
|
77
|
+
```javascript
|
|
78
|
+
// Repeated validation logic in multiple places
|
|
79
|
+
if (!user.email || !user.email.includes('@')) {
|
|
80
|
+
throw new Error('Invalid email');
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
After refactoring:
|
|
85
|
+
```javascript
|
|
86
|
+
// utils/validators.ts
|
|
87
|
+
export function validateEmail(email: string): boolean {
|
|
88
|
+
return email && email.includes('@');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Usage
|
|
92
|
+
if (!validateEmail(user.email)) {
|
|
93
|
+
throw new Error('Invalid email');
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3. Simplify Complex Logic
|
|
98
|
+
|
|
99
|
+
**Scenario**: Functions that are too long, deeply nested, or have complex logic
|
|
100
|
+
|
|
101
|
+
**Refactoring Method**:
|
|
102
|
+
1. Split long functions
|
|
103
|
+
2. Extract sub-functions
|
|
104
|
+
3. Simplify conditional logic
|
|
105
|
+
|
|
106
|
+
**Example**:
|
|
107
|
+
|
|
108
|
+
Before refactoring:
|
|
109
|
+
```javascript
|
|
110
|
+
function processOrder(order) {
|
|
111
|
+
if (order.status === 'pending') {
|
|
112
|
+
if (order.items.length > 0) {
|
|
113
|
+
if (order.payment) {
|
|
114
|
+
// Processing logic...
|
|
115
|
+
if (order.shipping) {
|
|
116
|
+
// More processing...
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
After refactoring:
|
|
125
|
+
```javascript
|
|
126
|
+
function processOrder(order) {
|
|
127
|
+
if (!canProcessOrder(order)) return;
|
|
128
|
+
|
|
129
|
+
processPayment(order);
|
|
130
|
+
processShipping(order);
|
|
131
|
+
updateOrderStatus(order);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function canProcessOrder(order) {
|
|
135
|
+
return order.status === 'pending'
|
|
136
|
+
&& order.items.length > 0
|
|
137
|
+
&& order.payment;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 4. Optimize Naming
|
|
142
|
+
|
|
143
|
+
**Scenario**: Non-standard naming, unclear meaning
|
|
144
|
+
|
|
145
|
+
**Refactoring Method**:
|
|
146
|
+
1. Analyze naming context
|
|
147
|
+
2. Generate better naming
|
|
148
|
+
3. Batch replacement
|
|
149
|
+
|
|
150
|
+
**Example**:
|
|
151
|
+
|
|
152
|
+
Before refactoring:
|
|
153
|
+
```javascript
|
|
154
|
+
function calc(a, b) {
|
|
155
|
+
return a * b * 0.1;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
After refactoring:
|
|
160
|
+
```javascript
|
|
161
|
+
function calculateTax(basePrice: number, quantity: number): number {
|
|
162
|
+
const TAX_RATE = 0.1;
|
|
163
|
+
return basePrice * quantity * TAX_RATE;
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Refactoring Process
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
173
|
+
│ Analyze │ ──→ │ Plan │ ──→ │ Execute │ ──→ │ Verify │
|
|
174
|
+
│ │ │ │ │ │ │ │
|
|
175
|
+
│ • Code │ │ • Refactor │ │ • Code │ │ • Test │
|
|
176
|
+
│ structure │ │ strategy │ │ changes │ │ execution │
|
|
177
|
+
│ • │ │ • Impact │ │ • Reference │ │ • Function │
|
|
178
|
+
│ Dependencies│ │ scope │ │ updates │ │ validation│
|
|
179
|
+
│ • Test │ │ • Risk │ │ • Document │ │ • PR │
|
|
180
|
+
│ coverage │ │ assessment│ │ sync │ │ creation │
|
|
181
|
+
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Refactoring Strategy
|
|
187
|
+
|
|
188
|
+
### Small Debt Repayment Principle
|
|
189
|
+
|
|
190
|
+
Each refactoring should:
|
|
191
|
+
1. **Small steps**: Only change a small part each time
|
|
192
|
+
2. **Maintain tests**: Ensure tests always pass
|
|
193
|
+
3. **Frequent commits**: Commit after each small step
|
|
194
|
+
4. **Rollback capable**: Keep each commit independently rollbackable
|
|
195
|
+
|
|
196
|
+
### Risk Assessment
|
|
197
|
+
|
|
198
|
+
| Risk Level | Condition | Strategy |
|
|
199
|
+
|---------|------|------|
|
|
200
|
+
| Low | Complete test coverage | Auto execute |
|
|
201
|
+
| Medium | Partial test coverage | Create PR |
|
|
202
|
+
| High | No test coverage | Add tests first then refactor |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Output Format
|
|
207
|
+
|
|
208
|
+
### Refactoring Report
|
|
209
|
+
|
|
210
|
+
```markdown
|
|
211
|
+
# Refactoring Report - YYYY-MM-DD
|
|
212
|
+
|
|
213
|
+
## Refactoring Scope
|
|
214
|
+
- Target files: X
|
|
215
|
+
- Affected files: X
|
|
216
|
+
- Test coverage: X%
|
|
217
|
+
|
|
218
|
+
## Refactoring Operations
|
|
219
|
+
|
|
220
|
+
### Extract Common Methods
|
|
221
|
+
| Original File | New File | Method Name | Status |
|
|
222
|
+
|-------|-------|-------|------|
|
|
223
|
+
| utils/formatDate.js | utils/dateUtils.ts | formatDate | ✅ Completed |
|
|
224
|
+
|
|
225
|
+
### Eliminate Duplicate Code
|
|
226
|
+
| File A | File B | Duplicate Lines | Status |
|
|
227
|
+
|-------|-------|---------|------|
|
|
228
|
+
| service/UserService.ts | service/OrderService.ts | 25 lines | ✅ Completed |
|
|
229
|
+
|
|
230
|
+
### Simplify Complex Logic
|
|
231
|
+
| File | Function Name | Original Lines | New Lines | Status |
|
|
232
|
+
|------|-------|-------|-------|------|
|
|
233
|
+
| service/OrderService.ts | processOrder | 80 | 35 | ✅ Completed |
|
|
234
|
+
|
|
235
|
+
## Verification Results
|
|
236
|
+
- Unit tests: ✅ All passed
|
|
237
|
+
- Integration tests: ✅ All passed
|
|
238
|
+
- Functional verification: ✅ No anomalies
|
|
239
|
+
|
|
240
|
+
## PR Information
|
|
241
|
+
- PR number: #XXX
|
|
242
|
+
- Branch: refactor/entropy-reduction-YYYYMMDD
|
|
243
|
+
- Status: Pending review
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## Configuration Options
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
# auto-refactor-config.yaml
|
|
252
|
+
auto_refactor:
|
|
253
|
+
# Refactoring scope
|
|
254
|
+
scope:
|
|
255
|
+
code_paths: ["src/"]
|
|
256
|
+
exclude: ["node_modules/", "dist/", "build/"]
|
|
257
|
+
|
|
258
|
+
# Refactoring rules
|
|
259
|
+
rules:
|
|
260
|
+
max_file_lines: 300
|
|
261
|
+
max_function_lines: 50
|
|
262
|
+
min_similarity: 0.8
|
|
263
|
+
|
|
264
|
+
# Execution strategy
|
|
265
|
+
execution:
|
|
266
|
+
auto_fix_low_risk: true # Auto fix low risk
|
|
267
|
+
create_pr: true # Create PR
|
|
268
|
+
max_changes_per_run: 10 # Max changes per run
|
|
269
|
+
|
|
270
|
+
# Testing requirements
|
|
271
|
+
testing:
|
|
272
|
+
require_tests: true # Require tests
|
|
273
|
+
min_coverage: 80 # Minimum coverage
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Usage Examples
|
|
279
|
+
|
|
280
|
+
### Example 1: Extract Duplicate Code
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
User: Eliminate duplicates in code
|
|
284
|
+
|
|
285
|
+
AI:
|
|
286
|
+
1. Detect duplicate code
|
|
287
|
+
2. Analyze similarity
|
|
288
|
+
3. Extract to shared module
|
|
289
|
+
4. Update all references
|
|
290
|
+
5. Create PR
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Example 2: Simplify Complex Function
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
User: Simplify processOrder function
|
|
297
|
+
|
|
298
|
+
AI:
|
|
299
|
+
1. Analyze function structure
|
|
300
|
+
2. Identify extractable sub-functions
|
|
301
|
+
3. Execute split refactoring
|
|
302
|
+
4. Run test verification
|
|
303
|
+
5. Create PR
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Example 3: Optimize Naming
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
User: Optimize code naming
|
|
310
|
+
|
|
311
|
+
AI:
|
|
312
|
+
1. Scan non-standard naming
|
|
313
|
+
2. Analyze context
|
|
314
|
+
3. Generate better naming
|
|
315
|
+
4. Batch replacement
|
|
316
|
+
5. Create PR
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Collaboration with Other Skills
|
|
322
|
+
|
|
323
|
+
- **pdd-entropy-reduction**: Called as a sub-skill by the coordinator
|
|
324
|
+
- **expert-entropy-auditor**: Receive refactoring suggestions
|
|
325
|
+
- **expert-arch-enforcer**: Receive architecture violation fixes
|
|
326
|
+
- **pdd-code-reviewer**: Trigger code review after refactoring
|
|
327
|
+
- **pdd-doc-change**: Synchronously update related documentation
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name": "expert-auto-refactor", "version": "1.0.0", "category": "entropy", "description": "Automated refactoring expert transforming collected quality improvements into concrete code operations. Call when eliminating code duplication, simplifying complexity, or applying design patterns systematically.", "triggers": ["重构代码", "消除重复", "简化代码"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"name": "SKILL.md-exists", "description": "技能文件存在且格式正确", "type": "structure", "expect": {"exists": true, "hasDescription": true}, "checks": {"file_exists": "SKILL.md"}}, {"name": "_meta.json-valid", "description": "元数据文件格式正确", "type": "structure", "expect": {"exists": true, "hasName": true, "hasVersion": true, "hasTriggers": true}, "checks": {"file_exists": "_meta.json"}}, {"name": "refactor-types-defined", "description": "定义了自动化重构类型(提取方法/内联/重命名等)", "type": "content", "contains": ["重构", "Extract", "Inline", "重复", "simplify"]}, {"name": "debt-repayment-strategy", "description": "定义了小额还贷策略", "type": "content", "contains": ["小额还贷", "定期", "技术债务", "偿还", "repayment"]}, {"name": "safe-operations-defined", "description": "定义了安全重构操作边界", "type": "content", "contains": ["安全", "测试", "验证", "targeted"]}]
|