# `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`,与现有代码保持一致 - 请求 / 响应边界优先使用 DTO;除非某文件本来就是如此,否则不要直接从控制器暴露实体 - 持久化操作应保留在 service / repository 边界内,不要堆进 controller - 对需要原子性的写操作使用 `@Transactional` ### 错误处理与安全 - 维持现有 JSON 错误格式,使用 `message` 或 `error` 字段 - HTTP 状态码保持一致: - `400`:参数或输入错误 - `401`:认证 / 授权失败 - `500`:未预期的服务端异常 - 不要在日志中输出明文密码、私钥、口令、JWT 或解密后的凭据 - 加解密逻辑统一集中在 `EncryptionService` - 修改认证逻辑时,要同时验证 HTTP 与 WebSocket token 处理 - 注意 `ChannelSftp` 不是线程安全的,不要在并发场景共享实例 ## 9. 前端约定(`frontend/`) ### Vue 与 TypeScript 结构 - Vue 单文件组件使用 `