Files
ssh-manager/AGENTS.md
2026-03-24 13:52:24 +08:00

153 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `ssh-manager` AGENTS 指南
本文件用于指导在本仓库中执行任务的 agentic coding assistants。
目标是在保证安全、可验证和风格统一的前提下,以尽量小的意外完成聚焦改动。
## 1. 仓库结构
- Monorepo包含
- `backend/`Spring Boot 2.7、Java 8、Maven、H2、WebSocket、JWT
- `frontend/`Vue 3、TypeScript、Vite、Pinia、Tailwind、Axios
- 后端默认端口:`48080`
- 前端开发服务端口:`5173`
- 前端开发时会将 `/api``/ws` 代理到后端
- 数据库:文件型 H2路径为 `./data/sshmanager`
- 认证方式HTTP 使用 Bearer JWT终端相关 WebSocket 流程在 query 中携带 token
## 2. 需优先检查的规则文件
- 主要仓库规范来源:本 `AGENTS.md`
- Cursor 规则:未发现 `.cursor/rules/` 目录,也未发现 `.cursorrules`
- Copilot 规则:未发现 `.github/copilot-instructions.md`
- 如果未来新增这些文件,编辑前应先读取,并将其视为高优先级约束
## 3. 工具链
- JDK`8+`
- Maven`3.6+`
- Node.js`18+`
- npm使用与 `frontend/package-lock.json` 兼容的版本
- Docker Compose通过 `docker compose` 使用
## 4. 构建 / 运行 / 测试命令
### 后端(`backend/`
- 启动开发服务:`mvn spring-boot:run`
- 打包应用:`mvn package`
- 跳过测试打包:`mvn -DskipTests package`
- 运行全部测试:`mvn test`
- 运行单个测试类:`mvn -Dtest=ConnectionServiceTest test`
- 运行单个测试方法:`mvn -Dtest=ConnectionServiceTest#shouldCreateConnection test`
- 运行同一类中的多个方法:`mvn -Dtest=ConnectionServiceTest#testA,testB test`
### 前端(`frontend/`
- 安装依赖:`npm install`
- 启动开发服务:`npm run dev`
- 生产构建:`npm run build`
- 预览构建产物:`npm run preview`
- 当前没有独立的 `lint` script
- 当前没有独立的前端测试 script
- `npm run build` 会先执行 `vue-tsc -b`,因此它也是主要的前端类型检查入口
### Docker / 根目录(`./`
- 构建镜像:`docker compose -f docker/docker-compose.yml build`
- 前台启动:`docker compose -f docker/docker-compose.yml up`
- 后台启动:`docker compose -f docker/docker-compose.yml up -d`
- Make 快捷命令:
- `make build`
- `make up`
- `make down`
- `make restart`
- `make logs`
- `make ps`
## 5. 测试策略
- 优先选择能覆盖改动的最小测试命令
- 对后端改动,先运行受影响的单个测试,再按需要扩大范围
- 现有后端测试位于 `backend/src/test/java`
- 当前后端测试类包括控制器和服务测试,如 `ConnectionControllerTest``SftpControllerTest``ConnectionServiceTest``SftpServiceTest`
- 如果改动涉及 Spring MVC、安全、WebSocket、SSH 或 SFTP 流程,优先补充或运行定向回归测试,而不只是编译通过
- 前端当前没有提交测试套件;对前端改动,至少运行 `npm run build`
## 6. 改动范围规则
- 保持改动小且聚焦任务本身
- 实现需求时不要顺手重构无关文件
- 除非任务明确要求,否则不要静默改变 API 语义
- 如果后端契约发生变化,需要在同一改动中同步更新前端 API / 类型
- 严禁提交 secrets、密码、token、私钥或带环境属性的敏感凭据
## 7. Git 与提交规范
- 开始修改前先查看工作区状态,识别是否存在与当前任务无关的脏变更
- 不要回退、覆盖或格式化并非由当前任务引入的用户改动
- 除非用户明确要求,否则不要主动创建 commit、tag、分支或 PR
- 避免使用 `git reset --hard``git checkout --`、强制推送等破坏性命令
- 若需要提交,提交内容应仅包含与当前任务直接相关的文件
- 提交说明建议简洁描述“为什么改”,而不只是罗列“改了什么”
- 若因 hooks 或生成步骤导致文件变动,应先确认内容合理,再决定是否纳入同一提交
## 8. 后端约定(`backend/`
### import 与文件结构
- 包名前缀固定为 `com.sshmanager`
- 保持显式 import不使用通配符 import
- 遵循仓库现有 import 分组风格:
- 先项目内 import`com.sshmanager...`
- 再框架 / 第三方:`org...``javax...`
- 最后 JDK`java...`
- 控制器放在 `controller`,服务放在 `service`,仓库层放在 `repository`DTO 放在 `dto`,实体放在 `entity`,安全相关代码放在 `security`
### 格式与命名
- 使用 4 空格缩进
- 左花括号与声明同行
- 类名使用 `PascalCase`
- 方法名和字段名使用 `camelCase`
- 常量使用 `UPPER_SNAKE_CASE`
- Spring 类型命名后缀保持一致:`*Controller``*Service``*Repository`
### 类型与 Spring 用法
- 保持 Java 8 兼容,不要引入更高版本语言特性
- 优先使用构造器注入
- 控制器返回 `ResponseEntity<?>``ResponseEntity<T>`,与现有代码保持一致
- 请求 / 响应边界优先使用 DTO除非某文件本来就是如此否则不要直接从控制器暴露实体
- 持久化操作应保留在 service / repository 边界内,不要堆进 controller
- 对需要原子性的写操作使用 `@Transactional`
### 错误处理与安全
- 维持现有 JSON 错误格式,使用 `message``error` 字段
- HTTP 状态码保持一致:
- `400`:参数或输入错误
- `401`:认证 / 授权失败
- `500`:未预期的服务端异常
- 不要在日志中输出明文密码、私钥、口令、JWT 或解密后的凭据
- 加解密逻辑统一集中在 `EncryptionService`
- 修改认证逻辑时,要同时验证 HTTP 与 WebSocket token 处理
- 注意 `ChannelSftp` 不是线程安全的,不要在并发场景共享实例
## 9. 前端约定(`frontend/`
### Vue 与 TypeScript 结构
- Vue 单文件组件使用 `<script setup lang="ts">`
- 新增前端逻辑时优先使用 TypeScript
- ref、路由参数、API payload 尽量强类型化,不要随手使用 `any`
- 先新增或更新 API 层类型,再接入 UI 行为
- 有状态的数据流应保留在 Pinia store 或 API 模块中,不要在多个视图里重复维护
### import 与命名
- 遵循当前观察到的 import 顺序:
- Vue 核心包
- router / store
- 本地 API / 类型 / 组件
- 未与核心库归组时的第三方 UI / 图标库
- 组件文件名使用 `PascalCase.vue`
- Store 命名使用 `useXxxStore`
- 变量 / 函数名使用 `camelCase`
- 常量使用 `UPPER_SNAKE_CASE`
### 格式与界面模式
- 使用 2 空格缩进
- TS / Vue script 块保持现有的无分号、单引号风格
- 优先使用 Tailwind 工具类,不引入新的样式体系
- 除非任务明确要求改版,否则保留当前 `slate` / `cyan` 视觉语言
- 保持基础可访问性:表单标签、按钮状态、必要的 `aria-*` 属性,以及键盘可操作性
### 错误处理与性能
- 重要操作失败时要给用户可见反馈,不要静默失败
- 除非明确要改认证流程,否则保留当前 Axios 拦截器中的登录失效处理逻辑
- 对终端和 SFTP 视图要特别注意,避免不必要重渲染和高成本响应式循环
- 对可选后端数据优先做空值安全处理,如 `string | null` 与可选响应字段
## 10. 完成前验证
- 仅后端改动:至少运行最相关的 `mvn -Dtest=... test``mvn test`
- 仅前端改动:运行 `npm run build`
- 全栈改动:运行最窄范围的后端测试,再运行 `npm run build`
- 如果运行时行为发生变化,在可能时手工检查受影响流程,如登录、连接 CRUD、终端或 SFTP
- 最终说明中应明确写出已验证内容与未验证内容
## 11. 仓库特定说明
- 后端配置文件位于 `backend/src/main/resources/application.yml`
- 与安全相关的环境变量包括 `SSHMANAGER_JWT_SECRET``SSHMANAGER_ENCRYPTION_KEY`
- 生产部署必须提供真实有效的这些密钥
- 前端认证 token 当前存储在 `localStorage`
- `frontend/src/api/client.ts` 在收到 `401` 响应时会跳转到 `/login`
## 12. 在本仓库中的良好 agent 行为
- 先阅读现有代码,再决定采用什么模式
- 匹配周边代码风格,不要强行套用新偏好
- 优先做手术式修改,而不是大范围重写
- 当改动会让相邻文档或类型失真时,一并更新它们
- 只在任务范围内把工作区变得更整洁
- 输出结果时优先说明实际改动、验证情况以及仍未覆盖的风险点