airail 0.1.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.
Files changed (46) hide show
  1. package/bin/airail.js +3 -0
  2. package/dist/cli/add.js +136 -0
  3. package/dist/cli/clear.js +87 -0
  4. package/dist/cli/colors.js +18 -0
  5. package/dist/cli/config.js +232 -0
  6. package/dist/cli/index.js +144 -0
  7. package/dist/cli/init.js +74 -0
  8. package/dist/cli/status.js +66 -0
  9. package/dist/cli/update.js +51 -0
  10. package/dist/index.js +4 -0
  11. package/dist/utils.js +243 -0
  12. package/package.json +39 -0
  13. package/skills/universal/code-quality/SKILL.md +37 -0
  14. package/skills/universal/code-review/SKILL.md +37 -0
  15. package/skills/universal/error-handling/SKILL.md +40 -0
  16. package/skills/universal/git-workflow/SKILL.md +37 -0
  17. package/skills/universal/performance/SKILL.md +31 -0
  18. package/skills/universal/security/SKILL.md +33 -0
  19. package/skills/universal/skill-add/SKILL.md +241 -0
  20. package/skills/universal/testing/SKILL.md +39 -0
  21. package/src/templates/CLAUDE.md +11 -0
  22. package/src/templates/agents/code-reviewer.md +58 -0
  23. package/src/templates/agents/project-manager.md +45 -0
  24. package/src/templates/commands/add-todo.md +24 -0
  25. package/src/templates/commands/check.md +42 -0
  26. package/src/templates/commands/crud.md +27 -0
  27. package/src/templates/commands/dev.md +21 -0
  28. package/src/templates/commands/init-docs.md +80 -0
  29. package/src/templates/commands/next.md +31 -0
  30. package/src/templates/commands/progress.md +38 -0
  31. package/src/templates/commands/start.md +30 -0
  32. package/src/templates/commands/update-status.md +22 -0
  33. package/src/templates/docs/README.md +36 -0
  34. package/src/templates/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +59 -0
  35. package/src/templates/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +104 -0
  36. package/src/templates/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +80 -0
  37. package/src/templates/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +91 -0
  38. package/src/templates/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +77 -0
  39. package/src/templates/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +52 -0
  40. package/src/templates/hooks/guard.js +113 -0
  41. package/src/templates/hooks/inject.js +40 -0
  42. package/src/templates/hooks/skill-eval.js +48 -0
  43. package/src/templates/settings.json +24 -0
  44. package/src/templates/templates//345/276/205/345/212/236/346/270/205/345/215/225.md +22 -0
  45. package/src/templates/templates//351/234/200/346/261/202/346/226/207/346/241/243.md +47 -0
  46. package/src/templates/templates//351/241/271/347/233/256/347/212/266/346/200/201.md +50 -0
@@ -0,0 +1,30 @@
1
+ # 项目快速了解
2
+
3
+ > 使用方式:在 Claude Code 中输入 `/start`
4
+ > 适用场景:新成员接手项目、AI 新会话开始时快速建立上下文
5
+
6
+ ## 执行流程
7
+
8
+ 1. 读取 `.claude/docs/` 下所有文档
9
+ 2. 扫描项目目录结构,识别技术栈和模块划分
10
+ 3. 检查 `.claude/templates/项目状态.md`,了解当前进度
11
+ 4. 输出项目概览报告
12
+
13
+ ## 输出格式
14
+
15
+ ```
16
+ 📦 项目:{{PROJECT_NAME}}
17
+ 🔧 技术栈:{{TECH_STACK}}
18
+ 📁 模块:{{MODULES}}
19
+ 📊 当前状态:{{STATUS}}
20
+
21
+ 最近在做:{{RECENT_WORK}}
22
+ 下一步建议:{{NEXT_STEPS}}
23
+ ```
24
+
25
+ ## 新成员入门清单
26
+
27
+ - [ ] 阅读 [框架说明](../docs/框架说明.md)
28
+ - [ ] 阅读 [后端开发指南](../docs/后端开发指南.md)
29
+ - [ ] 查看 [新功能开发流程](../docs/新功能开发流程.md)
30
+ - [ ] 运行项目,确认本地环境正常
@@ -0,0 +1,22 @@
1
+ # 更新项目状态
2
+
3
+ > 使用方式:`/update-status`
4
+
5
+ ## 执行流程
6
+
7
+ 1. 扫描当前代码变更(git diff 或最近修改的文件)
8
+ 2. 自动识别完成了哪些功能
9
+ 3. 更新 `.claude/templates/项目状态.md` 中的进度
10
+ 4. 将已完成的待办标记为 ✅
11
+
12
+ ## 输出格式
13
+
14
+ ```
15
+ 📝 状态已更新
16
+
17
+ 本次完成:
18
+ ✅ {{COMPLETED_1}}
19
+ ✅ {{COMPLETED_2}}
20
+
21
+ 更新后进度:{{PROGRESS}}%
22
+ ```
@@ -0,0 +1,36 @@
1
+ # 开发文档目录
2
+
3
+ > 本目录由 `airail init` 自动生成,请根据实际项目补充完善。
4
+ > AI 在每次会话开始时会读取此目录,文档越完整,AI 输出越准确。
5
+ > 提示:使用 `/init-docs` 命令让 AI 自动分析项目代码并填充文档。
6
+
7
+ ## 项目概述
8
+
9
+ - **项目名称**:<!-- TODO: 填写项目名称 -->
10
+ - **技术栈**:<!-- TODO: 填写技术栈,如 Spring Boot 3.x / Vue3 / MySQL -->
11
+ - **项目类型**:<!-- TODO: 填写项目类型,如 Java / Node / Python / Go -->
12
+
13
+ ## 文档列表
14
+
15
+ | 文档 | 说明 |
16
+ |------|------|
17
+ | [框架说明](./框架说明.md) | 技术栈、模块划分、核心依赖 |
18
+ | [后端开发指南](./后端开发指南.md) | 架构规范、代码模板、开发约定 |
19
+ | [前端开发指南](./前端开发指南.md) | 组件规范、状态管理、接口调用 |
20
+ | [数据库设计规范](./数据库设计规范.md) | 建表规范、命名约定、索引设计 |
21
+ | [新功能开发流程](./新功能开发流程.md) | 从需求到上线的完整流程 |
22
+ | [工具类使用指南](./工具类使用指南.md) | 项目内工具类、公共方法索引 |
23
+
24
+ ## 核心规范速查
25
+
26
+ <!-- TODO: 填写本项目最重要的几条约定,让 AI 第一时间知道 -->
27
+
28
+ - **包名/命名空间**:<!-- TODO: 如 com.example.project -->
29
+ - **代码风格**:<!-- TODO: 如驼峰命名、4空格缩进 -->
30
+ - **禁止事项**:<!-- TODO: 如禁止硬编码密码、禁止 System.out -->
31
+
32
+ ## 快速开始
33
+
34
+ ```bash
35
+ # TODO: 填写本地启动命令
36
+ ```
@@ -0,0 +1,59 @@
1
+ # 前端开发指南
2
+
3
+ > TODO: 如果是纯后端项目,说明前后端分离架构;如果有前端,填写前端规范。
4
+
5
+ ## 项目类型
6
+
7
+ <!-- 选择一种,删除另一种 -->
8
+
9
+ **前后端分离**:前端项目独立维护,本仓库只提供后端 API。
10
+ **全栈项目**:前端代码位于 <!-- TODO: 如 frontend/ -->。
11
+
12
+ ## 前后端接口约定
13
+
14
+ - **接口文档地址**:<!-- TODO: 如 http://localhost:8080/swagger-ui.html -->
15
+ - **认证方式**:<!-- e.g. Bearer Token / Cookie / API Key -->
16
+ - **跨域配置**:<!-- 说明允许的前端域名 -->
17
+
18
+ ## 前端技术栈(如有)
19
+
20
+ <!-- TODO: 填写前端使用的技术 -->
21
+
22
+ | 技术 | 版本 | 用途 |
23
+ |------|------|------|
24
+ | <!-- Vue3 / React --> | | 核心框架 |
25
+ | <!-- Vite / Webpack --> | | 构建工具 |
26
+ | <!-- Pinia / Redux --> | | 状态管理 |
27
+ | <!-- Axios / Fetch --> | | HTTP 请求 |
28
+ | <!-- Element Plus / Ant Design --> | | UI 组件库 |
29
+
30
+ ## 组件规范
31
+
32
+ ```
33
+ <!-- TODO: 描述组件命名、目录结构、Props 规范 -->
34
+ src/
35
+ ├── views/ # 页面组件(路由级别)
36
+ ├── components/ # 公共组件
37
+ ├── api/ # 接口定义
38
+ ├── store/ # 状态管理
39
+ └── utils/ # 工具函数
40
+ ```
41
+
42
+ ## API 调用规范
43
+
44
+ ```javascript
45
+ // TODO: 粘贴项目标准的 API 调用模板
46
+ // 重点标注:统一请求封装、错误处理、Loading 处理
47
+ ```
48
+
49
+ ## 权限控制
50
+
51
+ <!-- TODO: 描述前端权限控制方式,例如按钮权限、路由权限 -->
52
+
53
+ ## 开发检查清单
54
+
55
+ - [ ] 接口调用使用统一封装,不直接用原生 fetch/axios
56
+ - [ ] 敏感操作有二次确认
57
+ - [ ] 表单有前端校验
58
+ - [ ] 列表页有分页、加载状态
59
+ - [ ] 错误信息有友好提示
@@ -0,0 +1,104 @@
1
+ # 后端开发指南
2
+
3
+ > TODO: 根据项目实际情况填写,这是 AI 写后端代码时最重要的参考文档。
4
+
5
+ ## 核心架构
6
+
7
+ ### 分层规范
8
+
9
+ <!-- TODO: 描述项目的分层架构,例如三层/四层/六边形等 -->
10
+
11
+ ```
12
+ Controller → Service → Repository/DAO → Database
13
+ (接口层) (业务层) (数据访问层)
14
+ ```
15
+
16
+ ### 包名/命名空间规范
17
+
18
+ ```
19
+ # TODO: 填写实际包名结构
20
+ com.example.controller # 控制器
21
+ com.example.service # 业务接口
22
+ com.example.service.impl # 业务实现
23
+ com.example.mapper / repository # 数据访问
24
+ com.example.domain / entity # 实体类
25
+ com.example.dto / vo # 数据传输对象
26
+ ```
27
+
28
+ ### 命名约定
29
+
30
+ | 类型 | 规范 | 示例 |
31
+ |------|------|------|
32
+ | 实体类 | 表名转大驼峰 | `SysUser` |
33
+ | 查询入参 | `XxxQuery` / `XxxRequest` | `UserQuery` |
34
+ | 返回对象 | `XxxVO` / `XxxResponse` | `UserVO` |
35
+ | Service 接口 | `IXxxService` / `XxxService` | `IUserService` |
36
+ | Controller | `XxxController` | `UserController` |
37
+
38
+ <!-- TODO: 根据项目实际命名习惯修改上表 -->
39
+
40
+ ## 代码模板
41
+
42
+ ### 实体类
43
+
44
+ ```
45
+ // TODO: 粘贴项目标准实体类模板
46
+ // 重点标注:基类继承、必备注解、审计字段
47
+ ```
48
+
49
+ ### Service
50
+
51
+ ```
52
+ // TODO: 粘贴项目标准 Service 模板
53
+ // 重点标注:事务注解、异常处理方式
54
+ ```
55
+
56
+ ### Controller
57
+
58
+ ```
59
+ // TODO: 粘贴项目标准 Controller 模板
60
+ // 重点标注:路由规范、权限注解、统一返回格式
61
+ ```
62
+
63
+ ## API 规范
64
+
65
+ - **基础路径**:<!-- TODO: 如 /api/v1 -->
66
+ - **返回格式**:
67
+ ```json
68
+ {
69
+ "code": 200,
70
+ "msg": "操作成功",
71
+ "data": {}
72
+ }
73
+ ```
74
+ <!-- TODO: 修改为项目实际的统一返回格式 -->
75
+
76
+ - **分页格式**:<!-- TODO: 描述分页请求和响应格式 -->
77
+ - **错误码规范**:<!-- TODO: 列出项目约定的错误码 -->
78
+
79
+ ## 核心工具类
80
+
81
+ <!-- TODO: 列出项目内常用工具类,避免 AI 重复造轮子 -->
82
+
83
+ | 工具类 | 用途 | 示例 |
84
+ |--------|------|------|
85
+ | <!-- XxxUtils --> | <!-- 说明 --> | <!-- 用法 --> |
86
+
87
+ ## 异常处理
88
+
89
+ ```
90
+ // TODO: 描述项目的异常处理方式
91
+ // 例如:统一异常类、全局异常处理器
92
+ ```
93
+
94
+ ## 开发检查清单
95
+
96
+ 在提交代码前,确认以下事项:
97
+
98
+ - [ ] 包名/命名空间符合规范
99
+ - [ ] 有统一返回格式包装
100
+ - [ ] Service 层有事务注解(写操作)
101
+ - [ ] 敏感接口有权限校验
102
+ - [ ] 没有硬编码配置(密码、URL等)
103
+ - [ ] 没有 System.out.println / print 调试输出
104
+ - [ ] 新增接口有对应的 DTO/VO,不直接暴露实体
@@ -0,0 +1,80 @@
1
+ # 工具类使用指南
2
+
3
+ > TODO: 列出项目内已有的工具类和公共方法,避免 AI 重复造轮子。
4
+
5
+ ## 核心原则
6
+
7
+ **优先使用项目已有工具类,其次使用框架内置,最后才自己实现。**
8
+
9
+ ## 工具类索引
10
+
11
+ <!-- TODO: 填写项目中实际存在的工具类 -->
12
+
13
+ | 工具类 | 位置 | 用途 |
14
+ |--------|------|------|
15
+ | <!-- StringUtils --> | <!-- TODO: 填写路径 --> | 字符串处理 |
16
+ | <!-- DateUtils --> | <!-- TODO: 填写路径 --> | 日期时间处理 |
17
+ | <!-- JsonUtils --> | <!-- TODO: 填写路径 --> | JSON 序列化/反序列化 |
18
+ | <!-- FileUtils --> | <!-- TODO: 填写路径 --> | 文件操作 |
19
+ | <!-- SecurityUtils --> | <!-- TODO: 填写路径 --> | 获取当前登录用户 |
20
+ | <!-- RedisUtils --> | <!-- TODO: 填写路径 --> | 缓存操作 |
21
+
22
+ ## 常用工具详解
23
+
24
+ ### 获取当前登录用户
25
+
26
+ ```
27
+ // TODO: 粘贴项目获取当前用户的标准写法
28
+ // 示例(Java):
29
+ // Long userId = SecurityUtils.getUserId();
30
+ // String username = SecurityUtils.getUsername();
31
+ ```
32
+
33
+ ### 统一异常抛出
34
+
35
+ ```
36
+ // TODO: 粘贴项目抛出业务异常的标准写法
37
+ // 示例(Java):
38
+ // throw new ServiceException("操作失败");
39
+ // throw new ServiceException("数据不存在", HttpStatus.NOT_FOUND);
40
+ ```
41
+
42
+ ### 对象转换
43
+
44
+ ```
45
+ // TODO: 粘贴项目 Entity ↔ VO/DTO 转换的标准写法
46
+ // 示例(Java MapStruct):
47
+ // UserVO vo = UserConverter.INSTANCE.toVO(entity);
48
+ // 示例(BeanUtils):
49
+ // BeanUtils.copyProperties(entity, vo);
50
+ ```
51
+
52
+ ### 分页查询
53
+
54
+ ```
55
+ // TODO: 粘贴项目标准分页查询写法
56
+ ```
57
+
58
+ ### 缓存操作
59
+
60
+ ```
61
+ // TODO: 粘贴项目 Redis/缓存操作的标准写法
62
+ ```
63
+
64
+ ## 禁止重复实现的功能
65
+
66
+ 以下功能项目已有实现,**禁止重新造轮子**:
67
+
68
+ - [ ] <!-- 日期格式化 → 使用 DateUtils.format() -->
69
+ - [ ] <!-- JSON 转换 → 使用 JsonUtils.toJson() -->
70
+ - [ ] <!-- 获取当前用户 → 使用 SecurityUtils.getUserId() -->
71
+ - [ ] <!-- TODO: 补充项目特有的禁止重复实现项 -->
72
+
73
+ ## 第三方库使用规范
74
+
75
+ <!-- TODO: 列出项目引入的第三方工具库及使用规范 -->
76
+
77
+ | 库名 | 版本 | 用途 | 使用规范 |
78
+ |------|------|------|---------|
79
+ | <!-- Hutool --> | | 通用工具 | <!-- 优先使用 Hutool,不引入 Apache Commons --> |
80
+ | <!-- Lombok --> | | 减少样板代码 | <!-- 实体类必须加 @Data --> |
@@ -0,0 +1,91 @@
1
+ # 数据库设计规范
2
+
3
+ > TODO: 根据项目实际情况填写,AI 建表时会严格遵守此规范。
4
+
5
+ ## 核心规范速查
6
+
7
+ - **数据库类型**:<!-- MySQL / PostgreSQL / SQL Server / SQLite -->
8
+ - **字符集**:<!-- utf8mb4 / UTF-8 -->
9
+ - **表名前缀**:<!-- e.g. sys_ / biz_ / t_ / 无前缀 -->
10
+ - **主键策略**:<!-- 自增 / UUID / 雪花ID / ULID -->
11
+
12
+ ## 表命名规范
13
+
14
+ ```
15
+ # TODO: 填写本项目的表命名约定
16
+ 业务表:前缀_模块名_功能名 示例:biz_order_item
17
+ 系统表:sys_功能名 示例:sys_user
18
+ 关联表:表1_表2 示例:user_role
19
+ ```
20
+
21
+ ## 建表模板
22
+
23
+ ```sql
24
+ -- TODO: 粘贴本项目标准建表 SQL 模板
25
+ -- 重点标注:必备字段、字符集、引擎、注释规范
26
+
27
+ CREATE TABLE `example_table` (
28
+ `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
29
+ -- TODO: 业务字段
30
+
31
+ -- 审计字段(根据项目实际情况保留或删除)
32
+ `create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
33
+ `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
34
+ `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
35
+ `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
36
+ `del_flag` TINYINT(1) DEFAULT 0 COMMENT '删除标志(0正常 1删除)',
37
+ PRIMARY KEY (`id`)
38
+ ) ENGINE=InnoDB COMMENT='TODO: 表注释';
39
+ ```
40
+
41
+ <!-- TODO: 如果是 PostgreSQL / SQL Server,替换为对应语法 -->
42
+
43
+ ## 字段命名规范
44
+
45
+ | 规范 | 说明 |
46
+ |------|------|
47
+ | 命名风格 | <!-- snake_case / camelCase --> |
48
+ | 布尔字段 | <!-- is_xxx TINYINT(1) / bool --> |
49
+ | 状态字段 | <!-- status TINYINT / VARCHAR --> |
50
+ | 金额字段 | <!-- DECIMAL(10,2),单位:元 --> |
51
+ | 时间字段 | <!-- DATETIME / TIMESTAMP --> |
52
+ | 长文本 | <!-- TEXT / VARCHAR(max) --> |
53
+
54
+ ## 必备字段
55
+
56
+ <!-- TODO: 列出每张表必须有的字段 -->
57
+
58
+ | 字段 | 类型 | 说明 | 是否必须 |
59
+ |------|------|------|---------|
60
+ | id | BIGINT | 主键 | ✅ |
61
+ | create_time | DATETIME | 创建时间 | ✅ |
62
+ | update_time | DATETIME | 更新时间 | ✅ |
63
+ | del_flag | TINYINT | 逻辑删除 | <!-- 根据项目决定 --> |
64
+
65
+ ## 索引设计规范
66
+
67
+ ```sql
68
+ -- 唯一索引
69
+ UNIQUE KEY `uk_字段名` (`字段名`),
70
+ -- 普通索引(查询频繁的字段)
71
+ KEY `idx_字段名` (`字段名`),
72
+ -- 联合索引(遵循最左前缀)
73
+ KEY `idx_字段1_字段2` (`字段1`, `字段2`),
74
+ ```
75
+
76
+ ## 禁止事项
77
+
78
+ - [ ] 禁止使用外键约束(在代码层维护关联关系)
79
+ - [ ] 禁止存储 NULL(使用默认值代替)
80
+ - [ ] 禁止使用 FLOAT/DOUBLE 存储金额
81
+ - <!-- TODO: 补充项目特有的禁止事项 -->
82
+
83
+ ## SQL 文件位置
84
+
85
+ <!-- TODO: 说明项目的 SQL 文件存放位置和执行方式 -->
86
+ ```
87
+ sql//
88
+ ├── schema.sql # 建表语句
89
+ ├── data.sql # 初始化数据
90
+ └── migration/ # 版本迁移脚本(如使用 Flyway/Liquibase)
91
+ ```
@@ -0,0 +1,77 @@
1
+ # 新功能开发流程
2
+
3
+ > 开发任何新功能时,AI 遵循此流程,确保代码质量和一致性。
4
+
5
+ ## 开发流程总览
6
+
7
+ ```
8
+ 需求分析 → 数据库设计 → 后端实现 → 前端实现(如有)→ 自测 → 提交
9
+ ```
10
+
11
+ ## 第一步:需求分析
12
+
13
+ 在开始写代码前,先确认:
14
+
15
+ - [ ] 功能是否已存在?(避免重复开发)
16
+ - [ ] 影响哪些模块?
17
+ - [ ] 需要新建表还是复用现有表?
18
+ - [ ] 有无权限控制要求?
19
+
20
+ ## 第二步:数据库设计
21
+
22
+ 参考 [数据库设计规范](./数据库设计规范.md),完成:
23
+
24
+ 1. 设计表结构(字段、类型、索引)
25
+ 2. 编写建表 SQL,放入 `sql//`
26
+ 3. 确认与现有表的关联关系
27
+
28
+ ## 第三步:后端实现
29
+
30
+ 按以下顺序创建文件,参考 [后端开发指南](./后端开发指南.md):
31
+
32
+ ```
33
+ 1. Entity / Domain ← 实体类,对应数据库表
34
+ 2. DTO / VO ← 入参和出参对象
35
+ 3. Mapper / Repository ← 数据访问层
36
+ 4. Service 接口 ← 定义业务方法
37
+ 5. Service 实现 ← 实现业务逻辑
38
+ 6. Controller ← 暴露 API 接口
39
+ ```
40
+
41
+ **每一层的检查点:**
42
+
43
+ - Entity:继承基类、注解完整、字段与表一致
44
+ - DTO/VO:不暴露敏感字段、有校验注解
45
+ - Service:写操作加事务、异常用项目统一异常类
46
+ - Controller:路由规范、权限注解、统一返回格式
47
+
48
+ ## 第四步:前端实现(如有)
49
+
50
+ 参考 [前端开发指南](./前端开发指南.md):
51
+
52
+ 1. 在 `<!-- TODO: 如 src/api/ -->/` 新增接口定义
53
+ 2. 实现页面组件
54
+ 3. 配置路由和菜单权限
55
+
56
+ ## 第五步:自测检查清单
57
+
58
+ - [ ] 新增/编辑/删除/查询功能均正常
59
+ - [ ] 分页、排序正常
60
+ - [ ] 权限控制生效
61
+ - [ ] 边界情况处理(空数据、超长输入等)
62
+ - [ ] 无控制台报错
63
+
64
+ ## 常见错误
65
+
66
+ <!-- TODO: 补充本项目开发中常见的错误和解决方案 -->
67
+
68
+ | 错误现象 | 原因 | 解决方案 |
69
+ |---------|------|---------|
70
+ | <!-- 示例:接口 404 --> | <!-- 路由配置错误 --> | <!-- 检查 @RequestMapping --> |
71
+
72
+ ## 参考实现
73
+
74
+ <!-- TODO: 指向项目中已有的标准实现,供 AI 参考 -->
75
+
76
+ - 标准 CRUD 参考:`<!-- TODO: 指向标准实现模块 -->`
77
+ - 带权限控制参考:`<!-- TODO: 指向带权限控制的实现 -->`
@@ -0,0 +1,52 @@
1
+ # 框架说明
2
+
3
+ > TODO: 描述本项目使用的框架和技术栈,让 AI 了解项目全貌。
4
+
5
+ ## 技术栈
6
+
7
+ | 层次 | 技术 | 版本 | 说明 |
8
+ |------|------|------|------|
9
+ | 后端框架 | <!-- e.g. Spring Boot / ASP.NET Core / Django / Go Gin --> | <!-- x.x --> | |
10
+ | ORM | <!-- e.g. MyBatis-Plus / EF Core / SQLAlchemy / GORM --> | | |
11
+ | 数据库 | <!-- e.g. MySQL / PostgreSQL / SQL Server --> | | |
12
+ | 缓存 | <!-- e.g. Redis / Memcached --> | | |
13
+ | 前端框架 | <!-- e.g. Vue3 / React / Angular / 无前端 --> | | |
14
+ | 构建工具 | <!-- e.g. Maven / Gradle / npm / pip --> | | |
15
+
16
+ ## 模块划分
17
+
18
+ <!-- TODO: 列出项目的主要模块/目录,说明各自职责 -->
19
+
20
+ ```
21
+ 项目根目录/
22
+ ├── module-1/ # TODO: 说明职责
23
+ ├── module-2/ # TODO: 说明职责
24
+ └── module-3/ # TODO: 说明职责
25
+ ```
26
+
27
+ ## 已完成的基础功能
28
+
29
+ <!-- TODO: 列出框架/脚手架已提供的功能,AI 不需要重复实现这些 -->
30
+
31
+ - [ ] 用户认证(登录/登出/Token)
32
+ - [ ] 权限控制(RBAC / 其他)
33
+ - [ ] 日志记录
34
+ - [ ] 异常处理
35
+ - [ ] 数据库连接池
36
+ - [ ] 缓存集成
37
+ - [ ] 文件上传
38
+
39
+ ## 业务开发区域
40
+
41
+ <!-- TODO: 说明哪些目录/模块是业务代码,AI 应该在这里写代码 -->
42
+
43
+ - 业务代码目录:<!-- TODO: 如 src/modules/ -->
44
+ - 禁止修改目录:<!-- TODO: 如 framework/(框架核心,不要动) -->
45
+
46
+ ## 核心依赖说明
47
+
48
+ <!-- TODO: 列出项目特有的重要依赖,说明用途和使用方式 -->
49
+
50
+ | 依赖名 | 用途 |
51
+ |--------|------|
52
+ | <!-- e.g. hutool --> | <!-- 通用工具库 --> |
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Hook: PreToolUse (Bash|Write)
4
+ * 阻止危险命令,警告敏感操作,修正常见错误
5
+ */
6
+
7
+ const fs = require('fs');
8
+
9
+ let inputData = '';
10
+ try {
11
+ inputData = fs.readFileSync(0, 'utf8');
12
+ } catch {
13
+ console.log(JSON.stringify({ continue: true }));
14
+ process.exit(0);
15
+ }
16
+
17
+ let input;
18
+ try {
19
+ input = JSON.parse(inputData);
20
+ } catch {
21
+ console.log(JSON.stringify({ continue: true }));
22
+ process.exit(0);
23
+ }
24
+
25
+ const toolName = input.tool_name;
26
+ const toolInput = input.tool_input || {};
27
+
28
+ // ─── Bash 命令检查 ────────────────────────────────────────────────────────────
29
+
30
+ if (toolName === 'Bash') {
31
+ const command = toolInput.command || '';
32
+
33
+ // Windows: > nul 误用(会创建名为 nul 的文件)
34
+ if (/[12]?\s*>\s*nul\b/i.test(command)) {
35
+ console.log(JSON.stringify({
36
+ decision: 'block',
37
+ reason: `🚫 命令被阻止:检测到 \`> nul\`\n\n问题:Windows 下会创建名为 nul 的文件\n解决方案:移除重定向,或改用 \`> /dev/null 2>&1\`\n\n原命令: \`${command}\``
38
+ }));
39
+ process.exit(0);
40
+ }
41
+
42
+ // 危险命令(直接阻止)
43
+ const dangerousPatterns = [
44
+ { pattern: /rm\s+-rf\s+\/(?!\w)/, reason: '删除根目录' },
45
+ { pattern: /rm\s+-rf\s+\*/, reason: '删除所有文件' },
46
+ { pattern: /drop\s+database/i, reason: '删除数据库' },
47
+ { pattern: /truncate\s+table/i, reason: '清空表数据' },
48
+ { pattern: /git\s+push\s+--force\s+(origin\s+)?(main|master)/i, reason: '强制推送主分支' },
49
+ { pattern: /git\s+reset\s+--hard\s+HEAD~\d+/, reason: '硬重置多个提交' },
50
+ { pattern: />\s*\/dev\/sd[a-z]/, reason: '直接写入磁盘设备' },
51
+ { pattern: /mkfs\./, reason: '格式化文件系统' },
52
+ { pattern: /format\s+[a-z]:/i, reason: '格式化磁盘' },
53
+ { pattern: /:(){ :|:& };:/, reason: 'Fork 炸弹' },
54
+ ];
55
+
56
+ for (const { pattern, reason } of dangerousPatterns) {
57
+ if (pattern.test(command)) {
58
+ console.log(JSON.stringify({
59
+ decision: 'block',
60
+ reason: `⚠️ 危险操作已阻止\n\n命令: \`${command}\`\n原因: ${reason}\n\n如确需执行,请手动在终端运行`
61
+ }));
62
+ process.exit(0);
63
+ }
64
+ }
65
+
66
+ // 警告命令(放行但提示)
67
+ const warningPatterns = [
68
+ { pattern: /git\s+push\s+--force/, warning: 'force push 可能覆盖他人代码' },
69
+ { pattern: /npm\s+publish/, warning: '即将发布包到 npm registry' },
70
+ { pattern: /docker\s+system\s+prune/, warning: '将清理所有未使用的 Docker 资源' },
71
+ { pattern: /rm\s+-rf/, warning: '递归删除操作,请确认路径正确' },
72
+ ];
73
+
74
+ for (const { pattern, warning } of warningPatterns) {
75
+ if (pattern.test(command)) {
76
+ console.log(JSON.stringify({
77
+ continue: true,
78
+ systemMessage: `⚠️ 注意: ${warning}`
79
+ }));
80
+ process.exit(0);
81
+ }
82
+ }
83
+ }
84
+
85
+ // ─── Write 工具检查 ───────────────────────────────────────────────────────────
86
+
87
+ if (toolName === 'Write') {
88
+ const filePath = toolInput.file_path || '';
89
+
90
+ const sensitiveFiles = [
91
+ '.env.production',
92
+ '.env.prod',
93
+ 'application-prod.yml',
94
+ 'application-production.yml',
95
+ 'credentials.json',
96
+ 'secrets.json',
97
+ 'private.key',
98
+ 'id_rsa',
99
+ ];
100
+
101
+ for (const sensitive of sensitiveFiles) {
102
+ if (filePath.endsWith(sensitive)) {
103
+ console.log(JSON.stringify({
104
+ continue: true,
105
+ systemMessage: `⚠️ 敏感文件警告:正在写入 \`${sensitive}\`,请确保不要将敏感信息提交到 Git`
106
+ }));
107
+ process.exit(0);
108
+ }
109
+ }
110
+ }
111
+
112
+ // 默认放行
113
+ console.log(JSON.stringify({ continue: true }));