用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/wonderslife/pdd-skills-v3 --skill expert-arch-enforcer命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | expert-arch-enforcer |
| description | 架构约束强制技能,监控代码是否违反预设的不变量和架构边界。当用户需要架构检查、依赖检查、模块边界检查时触发。触发词:架构检查、依赖检查、模块边界、架构漂移。 |
| license | MIT |
| compatibility | 需要架构约束配置 |
| metadata | {"author":"neuqik@hotmail.com","version":"1.0"} |
"在智能体优先的世界中,架构连贯性容易随时间漂移。约束是速度的保障,不是束缚。" —— Harness Engineering
架构约束强制技能负责监控代码是否违反了预设的不变量和架构边界,确保代码结构保持一致性。
Types → Config → Repo → Service → Runtime → UI
规则:只能向前依赖,不能反向依赖
| 层级 | 职责 | 允许依赖 |
|---|---|---|
| Types | 类型定义、数据模型 | 无 |
| Config | 配置管理、常量定义 | Types |
| Repo | 数据访问、外部服务调用 | Types, Config |
| Service | 业务逻辑、领域服务 | Types, Config, Repo |
| Runtime | 运行时、应用入口 | Types, Config, Repo, Service |
| UI | 用户界面、展示层 | 所有层 |
数据边界:
模块边界:
检测方法:
示例:
文件:src/types/User.ts
import: import { UserService } from '../service/UserService'
→ 检测结果:Types 层依赖 Service 层,违反依赖方向
检测方法:
示例:
API 入口:POST /api/users
参数验证:无
→ 检测结果:缺少参数验证 Schema
检测方法:
示例:
文件:src/service/UserService.ts
行数:450 行
限制:300 行
→ 检测结果:文件过大,建议拆分
检测方法:
示例:
函数名:get_data
规范:camelCase
→ 检测结果:命名不规范,应为 getData
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 解析 │ ──→ │ 构建 │ ──→ │ 检测 │ ──→ │ 报告 │
│ │ │ │ │ │ │ │
│ • 代码文件 │ │ • 依赖图 │ │ • 依赖违规 │ │ • 问题清单 │
│ • import │ │ • 调用关系 │ │ • 边界违规 │ │ • 修复建议 │
│ • 函数签名 │ │ • 模块结构 │ │ • 大小违规 │ │ • PR 创建 │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
// custom-linter.js
module.exports = {
rules: {
'layer-dependency': {
meta: {
docs: { description: '强制六层依赖方向' }
},
create(context) {
const layers = ['types', 'config', 'repo', 'service', 'runtime', 'ui'];
return {
ImportDeclaration(node) {
const source = node.source.value;
const currentLayer = getCurrentLayer(context.getFilename());
const targetLayer = getLayerFromPath(source);
if (layers.indexOf(targetLayer) < layers.indexOf(currentLayer)) {
context.report({
node,
message: `违反依赖方向: ${currentLayer} 不能依赖 ${targetLayer}`
});
}
}
};
}
}
}
};
// ArchitectureTest.java
@AnalyzeClasses(packages = "com.example")
public class ArchitectureTest {
@ArchTest
static final ArchRule layer_dependency_rule = layeredArchitecture()
.layer("Types").definedBy("..types..")
.layer("Config").definedBy("..config..")
.layer("Repo").definedBy("..repo..")
.layer("Service").definedBy("..service..")
.layer("Runtime").definedBy("..runtime..")
.layer("UI").definedBy("..ui..")
.whereLayer("Types").mayNotBeAccessedByAnyLayer()
.whereLayer("Config").mayOnlyBeAccessedByLayers("Repo", "Service", "Runtime", "UI")
.whereLayer("Repo").mayOnlyBeAccessedByLayers("Service", "Runtime", "UI");
}
# 架构约束报告 - YYYY-MM-DD
## 架构健康度:XX/100
## 依赖图
[依赖关系可视化图]
## 发现问题
### Critical(必须修复)
| 文件 | 问题 | 违规类型 |
|------|------|---------|
| src/types/User.ts | 依赖 Service 层 | 依赖方向违规 |
### Warning(建议修复)
| 文件 | 问题 | 违规类型 |
|------|------|---------|
| src/api/users.ts | 缺少参数验证 | 边界验证缺失 |
### Info(可选修复)
| 文件 | 问题 | 违规类型 |
|------|------|---------|
| src/service/UserService.ts | 文件 450 行 | 大小超限 |
## 修复建议
### Critical 修复
1. 移除 User.ts 中对 UserService 的依赖
2. 将共享逻辑提取到 Types 层
# arch-enforcer-config.yaml
arch_enforcer:
# 层级定义
layers:
- name: types
paths: ["src/types/", "src/models/"]
- name: config
paths: ["src/config/", "src/constants/"]
- name: repo
paths: ["src/repo/", "src/data/"]
- name: service
paths: ["src/service/", "src/domain/"]
- name: runtime
paths: ["src/runtime/", "src/app/"]
- name: ui
paths: ["src/ui/", "src/components/"]
# 约束规则
constraints:
max_file_lines: 300
max_function_lines: 50
require_schema_validation: true
# 执行配置
execution:
run_linter: true
run_arch_test: true
create_pr:
用户:检查架构约束
AI:
1. 解析代码文件
2. 构建依赖图
3. 运行 Linter 和 ArchUnit
4. 生成报告
用户:检查模块依赖方向
AI:
1. 解析 import 语句
2. 构建依赖图
3. 检查是否违反六层模型
4. 生成违规报告