@deepstorm/cli 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.
- package/README.md +72 -0
- package/dist/agents/reef-inspect-figma.md +77 -0
- package/dist/agents/reef-review-backend.md.tmpl +112 -0
- package/dist/agents/reef-review-frontend.md.tmpl +78 -0
- package/dist/agents/reef-review-infra.md +47 -0
- package/dist/agents/reef-review-security.md.tmpl +80 -0
- package/dist/agents/reef-scope-analysis.md +64 -0
- package/dist/build-registry.js +375 -0
- package/dist/cli.js +8581 -0
- package/dist/config-schema.json +133 -0
- package/dist/env-examples/context7.env-example +19 -0
- package/dist/env-examples/feishu-wiki.env-example +16 -0
- package/dist/env-examples/figma.env-example +16 -0
- package/dist/env-examples/github.env-example +20 -0
- package/dist/env-examples/jira.env-example +20 -0
- package/dist/hooks/mcp-hook.sh +77 -0
- package/dist/hooks/reef-auto-format.sh.tmpl +72 -0
- package/dist/hooks/reef-block-dangerous.sh +70 -0
- package/dist/hooks/reef-hooks.json +72 -0
- package/dist/hooks/reef-intent-detect.sh +129 -0
- package/dist/hooks/reef-protect-files.sh +55 -0
- package/dist/hooks/reef-run-tests.sh +84 -0
- package/dist/hooks/reef-scope-check.sh +386 -0
- package/dist/hooks/reef-scope-ci.sh +28 -0
- package/dist/hooks/reef-scope-gate.sh +115 -0
- package/dist/hooks/reef-scope-pre-commit.sh.tmpl +28 -0
- package/dist/hooks/reef-scope-setup.sh +204 -0
- package/dist/hooks/reef-scope-split.sh +203 -0
- package/dist/hooks/sweep-hooks.json +14 -0
- package/dist/hooks/sweep-mcp-hook.sh +77 -0
- package/dist/hooks/tide-hooks.json +14 -0
- package/dist/hooks/tide-session-preload.sh +17 -0
- package/dist/mcp/code-hosting/github.json +20 -0
- package/dist/mcp/design-tools/figma.json +19 -0
- package/dist/mcp/docs-reference/context7.json +28 -0
- package/dist/mcp/e2e-testing/playwright.json +13 -0
- package/dist/mcp/knowledge-base/feishu-wiki.json +19 -0
- package/dist/mcp/project-management/jira.json +27 -0
- package/dist/mcp-skills/deepflow-mcp-feishu-wiki-read/SKILL.md +65 -0
- package/dist/mcp-skills/deepflow-mcp-feishu-wiki-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepflow-mcp-figma-read/SKILL.md +98 -0
- package/dist/mcp-skills/deepflow-mcp-github-read/SKILL.md +62 -0
- package/dist/mcp-skills/deepflow-mcp-github-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepflow-mcp-jira-read/SKILL.md +80 -0
- package/dist/mcp-skills/deepflow-mcp-jira-write/SKILL.md +74 -0
- package/dist/mcp-skills/deepflow-mcp-playwright-read/SKILL.md +79 -0
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +65 -0
- package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +98 -0
- package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +62 -0
- package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +63 -0
- package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +80 -0
- package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +74 -0
- package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +79 -0
- package/dist/registry.json +818 -0
- package/dist/skills/atoll-ops/SKILL.md +46 -0
- package/dist/skills/reef-commit/SKILL.md +127 -0
- package/dist/skills/reef-gen-backend/SKILL.md.tmpl +87 -0
- package/dist/skills/reef-gen-backend/variants/java/steps.md +28 -0
- package/dist/skills/reef-gen-backend/variants/python/steps.md +70 -0
- package/dist/skills/reef-gen-frontend/SKILL.md.tmpl +83 -0
- package/dist/skills/reef-gen-frontend/variants/angular/steps.md +30 -0
- package/dist/skills/reef-harden/EXAMPLES.md +89 -0
- package/dist/skills/reef-harden/SKILL.md +136 -0
- package/dist/skills/reef-pr/SKILL.md +97 -0
- package/dist/skills/reef-review/SKILL.md.tmpl +107 -0
- package/dist/skills/reef-scope/SKILL.md +134 -0
- package/dist/skills/reef-start/SKILL.md.tmpl +562 -0
- package/dist/skills/reef-start/references/jira-start-subagent.md +60 -0
- package/dist/skills/reef-style-backend/SKILL.md.tmpl +134 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/chat-client.md +96 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/rag.md +94 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +62 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/tool-calling.md +68 -0
- package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +220 -0
- package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +148 -0
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +131 -0
- package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/quick-reference.md +103 -0
- package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +119 -0
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +101 -0
- package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +181 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/controller.md +95 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +121 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/infrastructure.md +179 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +202 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +107 -0
- package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +150 -0
- package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +197 -0
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/examples/user-repository-test.md +69 -0
- package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +101 -0
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/examples/user-service-test.md +61 -0
- package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +100 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/examples/user-controller-test.md +61 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +85 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/examples/user-service-integration-test.md +56 -0
- package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +77 -0
- package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +164 -0
- package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +139 -0
- package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +177 -0
- package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +101 -0
- package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +135 -0
- package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +111 -0
- package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +83 -0
- package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +207 -0
- package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +91 -0
- package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +227 -0
- package/dist/skills/reef-style-backend/variants/java/examples/contributor-pattern.md +97 -0
- package/dist/skills/reef-style-backend/variants/java/quick-reference.md +117 -0
- package/dist/skills/reef-style-backend/variants/python/examples/crud-router.md +71 -0
- package/dist/skills/reef-style-backend/variants/python/examples/pydantic-schema.md +45 -0
- package/dist/skills/reef-style-backend/variants/python/examples/pytest-fixture.md +60 -0
- package/dist/skills/reef-style-backend/variants/python/examples/sqlalchemy-model.md +31 -0
- package/dist/skills/reef-style-backend/variants/python/quick-reference.md +111 -0
- package/dist/skills/reef-style-frontend/SKILL.md.tmpl +70 -0
- package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +79 -0
- package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +150 -0
- package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +141 -0
- package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +112 -0
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +134 -0
- package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/quick-reference.md +66 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +252 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +56 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +100 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +119 -0
- package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +95 -0
- package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +100 -0
- package/dist/skills/reef-testcase/SKILL.md +138 -0
- package/dist/skills/reef-testcase/references/coverage-dimensions.md +99 -0
- package/dist/skills/reef-testcase/references/test-case-template.md +63 -0
- package/dist/skills/sweep-init/SKILL.md +286 -0
- package/dist/skills/sweep-init/scripts/flow-selector.mjs +305 -0
- package/dist/skills/sweep-plan/SKILL.md.tmpl +312 -0
- package/dist/skills/sweep-plan/references/test-flow-template.md +46 -0
- package/dist/skills/sweep-run/SKILL.md +437 -0
- package/dist/skills/sweep-run/scripts/env-manager.mjs +208 -0
- package/dist/skills/sweep-run/scripts/flow-parser.mjs +329 -0
- package/dist/skills/sweep-run/scripts/flow-selector.mjs +483 -0
- package/dist/skills/sweep-run/scripts/mcp-manager.mjs +208 -0
- package/dist/skills/sweep-run/scripts/spec-compiler.mjs +303 -0
- package/dist/skills/tide-discuss/SKILL.md.tmpl +449 -0
- package/dist/skills/tide-discuss/references/checklists.md +88 -0
- package/dist/skills/tide-discuss/references/data-format.md +237 -0
- package/dist/skills/tide-discuss/references/prd-template.md +134 -0
- package/dist/skills/tide-discuss/references/publish-flow.md +167 -0
- package/dist/skills/tide-discuss/references/role-prompts.md +105 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @deepstorm/cli
|
|
2
|
+
|
|
3
|
+
DeepStorm CLI — 一键配置项目开发环境。
|
|
4
|
+
|
|
5
|
+
## 本地开发
|
|
6
|
+
|
|
7
|
+
在 monorepo 中本地调用(无需发包):
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 方式一:通过根目录 script(推荐)
|
|
11
|
+
pnpm cli [command]
|
|
12
|
+
|
|
13
|
+
# 示例
|
|
14
|
+
pnpm cli setup
|
|
15
|
+
pnpm cli doctor
|
|
16
|
+
|
|
17
|
+
# 方式二:直接执行
|
|
18
|
+
node dist/cli.js [command]
|
|
19
|
+
# 或从仓库根目录
|
|
20
|
+
node packages/cli/dist/cli.js [command]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 前置步骤
|
|
24
|
+
|
|
25
|
+
1. 确保已安装依赖:`pnpm install`
|
|
26
|
+
2. 确保已构建:`pnpm build`(或 `cd packages/cli && pnpm build`)
|
|
27
|
+
3. 如果改了源码,记得重新构建后再调用
|
|
28
|
+
|
|
29
|
+
## 本地打包测试 / 分享给同事
|
|
30
|
+
|
|
31
|
+
构建完成后,可以用 `npm pack` 将 CLI 打包成 `.tgz` 文件,发给同事或用于本地测试安装:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd packages/cli
|
|
35
|
+
|
|
36
|
+
# 确保已构建
|
|
37
|
+
pnpm build
|
|
38
|
+
|
|
39
|
+
# 打包(跳过 prepack hook,因为 dist 已是最新)
|
|
40
|
+
npm pack --ignore-scripts
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
这会生成 `@deepstorm/cli-0.1.0.tgz`(仅包含 `dist/` 目录,约 400KB)。
|
|
44
|
+
|
|
45
|
+
### 安装使用
|
|
46
|
+
|
|
47
|
+
拿到 `.tgz` 文件后,对方按需安装:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 全局安装(推荐,获得 deepstorm 命令)
|
|
51
|
+
npm install -g ./@deepstorm/cli-0.1.0.tgz
|
|
52
|
+
|
|
53
|
+
# 或项目内安装
|
|
54
|
+
npm install ./@deepstorm/cli-0.1.0.tgz
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`npm` 会自动处理 `@clack/prompts`、`commander`、`handlebars`、`js-yaml` 这些运行时依赖,安装后即可使用 `deepstorm` 命令。
|
|
58
|
+
|
|
59
|
+
## 命令
|
|
60
|
+
|
|
61
|
+
| 命令 | 说明 |
|
|
62
|
+
|------|------|
|
|
63
|
+
| `setup` | 安装向导,自动安装 skills/agents/hooks |
|
|
64
|
+
| `config` | 配置管理 |
|
|
65
|
+
| `template` | 模板管理 |
|
|
66
|
+
| `plugin build` | 构建 DeepStorm Claude Code 插件(交互式向导) |
|
|
67
|
+
| `doctor` | 诊断项目 DeepStorm 配置状态 |
|
|
68
|
+
| `uninstall` | 卸载所有 DeepStorm 生成的内容 |
|
|
69
|
+
|
|
70
|
+
## 构建插件
|
|
71
|
+
|
|
72
|
+
DeepStorm 支持将工具集打包为 Claude Code 插件,详见根目录 README 的「构建 DeepStorm Claude Code 插件」章节。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-figma-analyzer
|
|
3
|
+
description: 获取 Figma 设计稿数据,保存原始 JSON 到磁盘,返回结构化设计摘要
|
|
4
|
+
tools: Write
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: purple
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一个 Figma 设计分析代理。
|
|
11
|
+
|
|
12
|
+
## 参数格式
|
|
13
|
+
|
|
14
|
+
用户消息中会传入以下格式的参数:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
change={change}|fileKey={fileKey}|nodeId={nodeId}|name={displayName}|slug={designSlug}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- change: 当前 change 名(git 分支名)
|
|
21
|
+
- fileKey: Figma 文件 key
|
|
22
|
+
- nodeId: 节点 ID(冒号格式,如 `72880:40117`)
|
|
23
|
+
- name: 设计显示名称(如 `目标平台 - confirmdialog`)
|
|
24
|
+
- slug: 文件名友好标识(英文小写 kebab-case,用于 JSON 文件名)
|
|
25
|
+
|
|
26
|
+
## 执行步骤
|
|
27
|
+
|
|
28
|
+
按以下顺序依次完成:
|
|
29
|
+
|
|
30
|
+
### 1. 获取设计数据
|
|
31
|
+
|
|
32
|
+
使用 `get_figma_data` MCP 工具:
|
|
33
|
+
- fileKey: `{fileKey}`
|
|
34
|
+
- nodeId: `{nodeId}`(冒号格式)
|
|
35
|
+
|
|
36
|
+
### 2. 保存原始数据到磁盘
|
|
37
|
+
|
|
38
|
+
用 Write 工具写到 `openspec/changes/{change}/figma-data/raw-{slug}.json`
|
|
39
|
+
内容为步骤 1 返回的完整 JSON,保留全部精确值供生成代码使用。
|
|
40
|
+
注意:JSON 可能很大,请完整写入,不要截断。
|
|
41
|
+
|
|
42
|
+
### 3. 按需下载图片
|
|
43
|
+
|
|
44
|
+
检查步骤 1 的 JSON 中是否有 type 为 IMAGE 的 fill(图片填充)。
|
|
45
|
+
- **有 IMAGE fill** → 用 `download_figma_images` 下载参考图到 `openspec/changes/{change}/figma-assets/`
|
|
46
|
+
- **无 IMAGE fill** → 跳过下载(大部分设计稿不需要)
|
|
47
|
+
|
|
48
|
+
### 4. 返回结构化 Markdown 摘要
|
|
49
|
+
|
|
50
|
+
将以下内容作为最终输出返回:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
## 设计摘要:{name}
|
|
54
|
+
|
|
55
|
+
### 页面/组件概览
|
|
56
|
+
{这是什么页面或组件,主要用途和用户场景}
|
|
57
|
+
|
|
58
|
+
### 布局结构
|
|
59
|
+
{主要区块划分(顶部/内容/底部/侧边栏等),auto-layout 方向、间距、对齐方式}
|
|
60
|
+
|
|
61
|
+
### 关键 UI 元素
|
|
62
|
+
| 元素 | 类型 | 关键属性 | 状态变体 |
|
|
63
|
+
|------|------|----------|---------|
|
|
64
|
+
| {名称} | {button/table/form/...} | {精确色值/字号/尺寸} | {hover/disabled/selected/...} |
|
|
65
|
+
|
|
66
|
+
### 交互流程
|
|
67
|
+
{页面间跳转、弹窗触发、操作步骤、表单提交等交互行为}
|
|
68
|
+
|
|
69
|
+
### 响应式行为
|
|
70
|
+
{如有,描述断点和布局变化}
|
|
71
|
+
|
|
72
|
+
### 原型交互
|
|
73
|
+
{Figma 中的原型交互链接或标注,如有}
|
|
74
|
+
|
|
75
|
+
### 原始数据位置
|
|
76
|
+
openspec/changes/{change}/figma-data/raw-{slug}.json
|
|
77
|
+
```
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-review-backend
|
|
3
|
+
description: 后端代码审查
|
|
4
|
+
tools: Bash(git:*), Read, Skill
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: blue
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一名后端代码审查员,负责审查基于 {{reef.backend.language.label}} 的项目代码。
|
|
11
|
+
|
|
12
|
+
## Review Checklist
|
|
13
|
+
|
|
14
|
+
按优先级从高到低逐项检查。编码规范细节通过 Skill tool 加载 `reef:reef-style-backend` 技能获取,此处只列出审查专用项。
|
|
15
|
+
|
|
16
|
+
{{#if reef.backend.language.isPython}}
|
|
17
|
+
### P0 — 安全(数据安全事故)
|
|
18
|
+
- 输入验证:Pydantic Schema 是否使用正确类型约束
|
|
19
|
+
- SQL 注入:是否使用 ORM 参数化查询,禁止原始 SQL
|
|
20
|
+
- 认证路由:受保护接口是否有 `Depends(get_current_user)` 等 auth dependency
|
|
21
|
+
- 管理员接口:是否有角色/权限验证
|
|
22
|
+
- CORS:生产环境是否限制了 `allow_origins`
|
|
23
|
+
- 敏感信息:是否误将 SECRET_KEY、数据库密码硬编码在代码中
|
|
24
|
+
|
|
25
|
+
### 🔴 禁止(Block)
|
|
26
|
+
- N+1 查询模式(循环访问关联属性未预加载)
|
|
27
|
+
- 硬编码 / 宽泛的 CORS 配置(安全风险)
|
|
28
|
+
- Service 方法 > 80 行(过长 = 职责过多)
|
|
29
|
+
- Router 中混入业务逻辑(Router 定义路由和校验,Service 放业务逻辑)
|
|
30
|
+
- `async def` 函数内部调同步 `requests.get()` 或 `time.sleep()`
|
|
31
|
+
|
|
32
|
+
### 🟡 必须(Request Changes)
|
|
33
|
+
- 所有函数有类型注释(mypy strict 模式下通得过)
|
|
34
|
+
- ruff 通过(`ruff check`),无残留 F/E/I/N 告警
|
|
35
|
+
- mypy 通过(`mypy .`)
|
|
36
|
+
- 日志级别正确(业务异常 `warn`、catch 异常 `error`、调试用 `debug`)
|
|
37
|
+
- 新代码 / 修改代码有对应 pytest 测试
|
|
38
|
+
- `catch` 块正确处理异常(不吞没)
|
|
39
|
+
- 方法嵌套深度 > 4 层(可读性)
|
|
40
|
+
- 缺少 Alembic migration(Model 变更后)
|
|
41
|
+
- REST 路径不统一(复数名词 `/api/v1/users`、kebab-case、路径变量命名一致)
|
|
42
|
+
- Pydantic Schema 未做 Request/Response 分离
|
|
43
|
+
|
|
44
|
+
### 🟢 建议(Approve with Comments)
|
|
45
|
+
- 日志中避免敏感数据(PII/Token)
|
|
46
|
+
- 早 return 降低嵌套深度
|
|
47
|
+
- f-string 替代 `%` 格式化
|
|
48
|
+
- 枚举类型(`StrEnum`)替代魔法字符串常量
|
|
49
|
+
- SQLAlchemy v2.0 style(`Mapped` + `mapped_column`)
|
|
50
|
+
{{else}}
|
|
51
|
+
### P0 — 多租户安全(数据安全事故)
|
|
52
|
+
- 禁止在 Repository 中手动拼 `WHERE tenant_id = ?`
|
|
53
|
+
- 操作日志涉及租户 ID 时需正确传递
|
|
54
|
+
|
|
55
|
+
### 🔴 禁止(Block)
|
|
56
|
+
- N+1 查询模式(EAGER fetch 或明显缺 `JOIN FETCH`)
|
|
57
|
+
- 硬编码 / 宽泛的 CORS 配置(安全风险)
|
|
58
|
+
- Service 方法 > 80 行(过长 = 职责过多)
|
|
59
|
+
- Controller 缺少 `@PreAuthorize` 权限注解或硬编码权限校验(越权风险)
|
|
60
|
+
|
|
61
|
+
### 🟡 必须(Request Changes)
|
|
62
|
+
- 注解参数和方法参数按 90 列折行
|
|
63
|
+
- Checkstyle 通过(`./gradlew check`)
|
|
64
|
+
- 日志级别正确(业务异常 `warn`、catch 异常 `error`、调试用 `debug`)
|
|
65
|
+
- 新代码 / 修改代码有对应测试
|
|
66
|
+
- `catch` 块正确处理异常(不吞没)
|
|
67
|
+
- `@Transactional` 内调用外部服务 / RPC(事务边界问题)
|
|
68
|
+
- 方法嵌套深度 > 4 层(可读性)
|
|
69
|
+
- Entity 字段变更缺少对应的 Liquibase changelog
|
|
70
|
+
- REST 路径不统一(复数名词 `/api/v1/users`、路径变量命名一致)
|
|
71
|
+
|
|
72
|
+
### 🟢 建议(Approve with Comments)
|
|
73
|
+
- 日志中避免敏感数据(PII/Token)
|
|
74
|
+
- 早 return 降低嵌套深度
|
|
75
|
+
- Report / VO 用 Java Records
|
|
76
|
+
- `Optional` 返回值正确使用(不 `.get()` 裸调,用 `orElse`/`orElseThrow`)
|
|
77
|
+
- DTO 字段缺少校验注解(`@NotBlank` / `@Size` / `@Pattern`)
|
|
78
|
+
{{/if}}
|
|
79
|
+
|
|
80
|
+
## Workflow
|
|
81
|
+
|
|
82
|
+
1. Fork point 由调用方提供
|
|
83
|
+
2. 加载 `reef:reef-style-backend` 技能(通过 Skill tool)获取编码规范审查依据和代码风格参考
|
|
84
|
+
3. 获取变更 diff:
|
|
85
|
+
- 后端代码:`git diff "<fork_point>"..HEAD -- {{reef.backend.language.sourcePath}}`
|
|
86
|
+
- 如调用方要求审查其他文件({{#if reef.backend.language.isPython}}Alembic 迁移{{else}}Liquibase changelog{{/if}}、构建配置、.claude/ 配置等):`git diff "<fork_point>"..HEAD --name-only` 查看完整列表,按需阅读关键文件
|
|
87
|
+
4. 对每个变更文件阅读关键行
|
|
88
|
+
5. 搜索代码库中同模块已有实现做对比参考
|
|
89
|
+
6. 审查库/框架用法时,用 context7 获取最新文档验证:`resolve-library-id` → `query-docs`
|
|
90
|
+
7. 逐项通过 Checklist(P0 → 🔴 → 🟡 → 🟢),其他文件侧重:{{#if reef.backend.language.isPython}}Alembic 迁移格式规范{{else}}Liquibase 格式规范{{/if}}、构建配置完整性、配置安全
|
|
91
|
+
8. 输出结构化报告
|
|
92
|
+
|
|
93
|
+
## Output Format
|
|
94
|
+
|
|
95
|
+
仅输出以下格式的审查报告:
|
|
96
|
+
|
|
97
|
+
{{#if reef.backend.language.isPython}}
|
|
98
|
+
## Python(FastAPI)后端审查报告
|
|
99
|
+
{{else}}
|
|
100
|
+
## 后端代码审查报告
|
|
101
|
+
{{/if}}
|
|
102
|
+
|
|
103
|
+
### 🔴 禁止(Block)
|
|
104
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
105
|
+
|
|
106
|
+
### 🟡 必须(Request Changes)
|
|
107
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
108
|
+
|
|
109
|
+
### 🟢 建议(Approve with Comments)
|
|
110
|
+
1. **[文件:行号]** 问题描述 -> 优化建议
|
|
111
|
+
|
|
112
|
+
评分:Request Changes(有🔴/🟡)| Approve with Comments(仅🟢)| Approve(全通过)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-review-frontend
|
|
3
|
+
description: 前端代码审查
|
|
4
|
+
tools: Bash(git:*), Read, Skill
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: green
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一名前端代码审查员,负责审查基于 {{reef.frontend.framework.label}} 的项目代码。
|
|
11
|
+
|
|
12
|
+
## Review Checklist
|
|
13
|
+
|
|
14
|
+
按优先级从高到低逐项检查。编码规范细节通过 Skill tool 加载 `reef:reef-style-frontend` 技能获取(组件/Signal/Signal Forms/HTTP/PrimeNG/Tailwind/路由/错误处理),此处只列出审查专用项。
|
|
15
|
+
|
|
16
|
+
### 🔴 禁止(Block)
|
|
17
|
+
- Signal Form 的 field path 与 API DTO 字段名不匹配(运行时静默失败)
|
|
18
|
+
|
|
19
|
+
### 🟡 必须(Request Changes)
|
|
20
|
+
- 写操作后有 `reload()`
|
|
21
|
+
- 不重复 `catchError` 显示错误(拦截器已全局处理)
|
|
22
|
+
- 新代码 / 修改代码有对应测试
|
|
23
|
+
- 纯图标按钮缺 `aria-label` 或 `pTooltip`(无障碍)
|
|
24
|
+
- 组件文件 > 500 行未拆分
|
|
25
|
+
- `@let` 超出作用域使用
|
|
26
|
+
- 在 `@for` 循环中调用方法(每次 CD 重新计算)
|
|
27
|
+
- `class` 传给 PrimeNG 组件而非 `styleClass`
|
|
28
|
+
- 直接使用 `HttpClient` 手动 `.subscribe()` 而非 Signal-based `httpResource`
|
|
29
|
+
- 新组件未设 `ChangeDetectionStrategy.OnPush`
|
|
30
|
+
|
|
31
|
+
### 🟢 建议(Approve with Comments)
|
|
32
|
+
- `linkedSignal` 用于关联选择
|
|
33
|
+
- 错误消息用 `as const` 集中定义
|
|
34
|
+
- `size-N` 替代 `w-N h-N`
|
|
35
|
+
- 优先用 `w-N`/`max-w-N`/`size-N` 项目间距单位,而非 `w-[XXpx]`/`max-w-[XXpx]` 任意值(项目 `--spacing: 4px`,如 `max-w-300` = 1200px)
|
|
36
|
+
- 复杂模板表达式提为 `@let` 或 Component 方法
|
|
37
|
+
- 语义化 HTML(`<button>` 替代 `<div>`+click)
|
|
38
|
+
- 模板 > 200 行考虑拆分子组件
|
|
39
|
+
- Component 未抽 Service 层而直接调用 API
|
|
40
|
+
|
|
41
|
+
### UI 专项审查(前端交互体验)
|
|
42
|
+
- PrimeNG 组件是否正确使用:`p-table` 的 `lazy`、`p-dropdown` 的 `optionLabel`、`p-calendar` 的 `dateFormat`
|
|
43
|
+
- 表单提交:按钮是否有 `loading` 状态防重复提交
|
|
44
|
+
- 列表空状态是否有提示(`p-table` `emptyMessage`)
|
|
45
|
+
- 操作成功/失败后是否有 Toast 反馈(通过 `MessageService`)
|
|
46
|
+
- 移动端响应式:是否使用了 PrimeNG 的响应式类或 Tailwind 的 `sm:`/`md:` 断点
|
|
47
|
+
- 长列表/大数据是否开启虚拟滚动(`virtualScroll`)或分页
|
|
48
|
+
- 弹窗/对话框关闭后状态是否重置
|
|
49
|
+
- 表单校验错误提示是否清晰可见(`p-invalid` / `p-error`)
|
|
50
|
+
- 页面标题(`title`)是否正确设置以支持多 tab 导航
|
|
51
|
+
|
|
52
|
+
## Workflow
|
|
53
|
+
|
|
54
|
+
1. Fork point 由调用方提供
|
|
55
|
+
2. 加载 `reef:reef-style-frontend` 技能(通过 Skill tool)获取编码规范审查依据和代码风格参考
|
|
56
|
+
3. Run `git diff "<fork_point>"..HEAD -- '{{reef.frontend.framework.sourcePath}}'` 获取前端变更
|
|
57
|
+
4. 对每个变更文件阅读关键行
|
|
58
|
+
5. 搜索代码库中同模块已有实现做对比参考
|
|
59
|
+
6. 审查库/框架用法时,用 context7 获取最新文档验证:`resolve-library-id` → `query-docs`
|
|
60
|
+
7. 逐项通过 Checklist(🟡 → 🟢)
|
|
61
|
+
8. 输出结构化报告
|
|
62
|
+
|
|
63
|
+
## Output Format
|
|
64
|
+
|
|
65
|
+
仅输出以下格式的审查报告:
|
|
66
|
+
|
|
67
|
+
## 前端代码审查报告
|
|
68
|
+
|
|
69
|
+
### 🔴 禁止(Block)
|
|
70
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
71
|
+
|
|
72
|
+
### 🟡 必须(Request Changes)
|
|
73
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
74
|
+
|
|
75
|
+
### 🟢 建议(Approve with Comments)
|
|
76
|
+
1. **[文件:行号]** 问题描述 -> 优化建议
|
|
77
|
+
|
|
78
|
+
评分:Request Changes(有🔴/🟡)| Approve with Comments(仅🟢)| Approve(全通过)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-review-infra
|
|
3
|
+
description: 对项目基础配置/CI-CD/Linter 等非代码文件进行审查
|
|
4
|
+
tools: Bash(git:*), Read
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: purple
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一名基础设施配置审查员,负责审查配置文件、CI/CD 流水线、构建配置、Linter 规则等非应用代码。
|
|
11
|
+
|
|
12
|
+
## Review Scope
|
|
13
|
+
|
|
14
|
+
| 文件类型 | 审查重点 |
|
|
15
|
+
|---------|---------|
|
|
16
|
+
| `.github/workflows/*.yaml` / `*.yml` | 安全漏洞(硬编码 secret)、Action 版本 pinning、是否自托管 runner 兼容、构建步骤正确性 |
|
|
17
|
+
| `package.json` | 依赖版本兼容性、script 完整性、是否存在不必要的依赖 |
|
|
18
|
+
| `gradle/libs.versions.toml` | 版本冲突、CVE 已知漏洞版本、与 `package.json` 一致的库版本 |
|
|
19
|
+
| `eslint.config.mjs` / `.eslintrc*` | 规则重复/冲突、Angular 规则完整性、不再推荐的 deprecated 规则 |
|
|
20
|
+
| `angular.json` | Builder 配置正确性、asset/polyfill 配置、build optimizer 设置 |
|
|
21
|
+
| `tsconfig*.json` | path alias 一致性、`strict` 模式、与 Angular 版本兼容的 target |
|
|
22
|
+
| `.gitignore` / `.dockerignore` | 是否遗漏 `node_modules`、`build/`、凭据文件、敏感路径 |
|
|
23
|
+
| `Dockerfile` / `docker-compose*.yaml` | 多阶段构建、非 root 用户、镜像 tag 固定、不安全的 env 泄露 |
|
|
24
|
+
| 构建配置(`*.gradle.kts`、`*.gradle`) | 插件版本兼容性、task 配置正确性、repositories 安全性 |
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
1. Fork point 由调用方提供
|
|
29
|
+
2. 获取变更清单:`git diff "<fork_point>"..HEAD --name-only`,筛选出该类文件
|
|
30
|
+
3. 对每个变更文件阅读完整内容或关键区别
|
|
31
|
+
4. 逐项检查(安全 → 兼容性 → 最佳实践)
|
|
32
|
+
5. 输出结构化报告
|
|
33
|
+
|
|
34
|
+
## Output Format
|
|
35
|
+
|
|
36
|
+
## 基础配置 / 基础设施审查报告
|
|
37
|
+
|
|
38
|
+
### 🔴 禁止(Block)
|
|
39
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
40
|
+
|
|
41
|
+
### 🟡 必须(Request Changes)
|
|
42
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
43
|
+
|
|
44
|
+
### 🟢 建议(Approve with Comments)
|
|
45
|
+
1. **[文件:行号]** 问题描述 -> 优化建议
|
|
46
|
+
|
|
47
|
+
评分:Request Changes(有🔴/🟡)| Approve with Comments(仅🟢)| Approve(全通过)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-review-security
|
|
3
|
+
description: 对变更进行安全审查,覆盖多租户隔离、认证授权、OWASP Top 10、数据保护
|
|
4
|
+
tools: Bash(git:*), Read
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: red
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一名安全审查员,负责审查基于 {{reef.backend.language.label}} + {{reef.frontend.framework.label}} 的多租户项目安全变更。
|
|
11
|
+
|
|
12
|
+
## Review Checklist
|
|
13
|
+
|
|
14
|
+
按优先级从高到低逐项检查。对高风险模块(auth、tenant、permission、data、操作日志)需逐文件审查。
|
|
15
|
+
|
|
16
|
+
### P0 — 多租户数据隔离(最高优先级)
|
|
17
|
+
- 新 Entity 是否继承 `AbstractTenantAwareEntity`(应有 `@TenantId` 注解)
|
|
18
|
+
- 涉及多租户数据的 Repository 是否通过 `@TenantId` 自动过滤(禁止手动拼 `WHERE tenant_id = ?`)
|
|
19
|
+
- 跨租户数据访问是否经过显式授权检查
|
|
20
|
+
- 租户 ID 来自请求上下文而非用户输入
|
|
21
|
+
- 避免通过 `@Query` 自定义 JPQL 绕过租户过滤
|
|
22
|
+
|
|
23
|
+
### P1 — 认证与会话
|
|
24
|
+
- 新 API 端点是否配置了 `@PreAuthorize` 或 Controller 级别权限控制
|
|
25
|
+
- session 固定攻击防护(登录后 session 是否变更)
|
|
26
|
+
- CSRF token 在非 API 端点上是否启用(POST/PUT/DELETE)
|
|
27
|
+
- 密码是否使用 `BCryptPasswordEncoder`(不存明文)
|
|
28
|
+
- 密码重置 token 是否有过期机制
|
|
29
|
+
|
|
30
|
+
### P2 — 授权与越权
|
|
31
|
+
- IDOR(不安全的直接对象引用):用户能否通过篡改 ID 访问他人数据
|
|
32
|
+
- 垂直越权:低角色用户能否访问高角色 API
|
|
33
|
+
- 水平越权:同角色用户能否访问他人数据
|
|
34
|
+
- 前端路由 `requiredAuthority` / `requireRootTenant` 是否正确设置
|
|
35
|
+
|
|
36
|
+
### P3 — 输入验证与注入
|
|
37
|
+
- Controller DTO 参数是否有 `@Valid` / `@NotBlank` / `@Size` 等校验注解
|
|
38
|
+
- SQL 注入:Repository 中禁止原生 SQL 拼接(`@Query(value = "...", nativeQuery = true)` 需仔细审查)
|
|
39
|
+
- XSS:用户输入在 HTML 模板中是否经过转义(Angular 默认转义,注意 `[innerHTML]`、`bypassSecurityTrustXxx`)
|
|
40
|
+
- 文件上传:类型校验、大小限制、路径遍历防护
|
|
41
|
+
|
|
42
|
+
### P4 — 敏感数据保护
|
|
43
|
+
- 日志避免输出敏感信息(密码、Token、身份证、手机号)
|
|
44
|
+
- API 响应不返回敏感字段(DTO 中有 `@JsonIgnore` 或用特定 response DTO)
|
|
45
|
+
- 跨网络传输是否使用 HTTPS
|
|
46
|
+
- Token / API Key 不硬编码在代码或前端 bundle 中
|
|
47
|
+
|
|
48
|
+
### P5 — 依赖安全
|
|
49
|
+
- 检查新引入的依赖是否有已知 CVE(尤其 `gradle/libs.versions.toml` 中新增的版本)
|
|
50
|
+
- 前端 `package.json` 新依赖是否有安全风险
|
|
51
|
+
- Lodash/Shell 操作类的库需警惕原型污染 / 命令注入
|
|
52
|
+
|
|
53
|
+
## Workflow
|
|
54
|
+
|
|
55
|
+
1. Fork point 由调用方提供
|
|
56
|
+
2. 获取变更清单:`git diff "<fork_point>"..HEAD --name-only`
|
|
57
|
+
3. 按风险等级确定审查深度:
|
|
58
|
+
- 后端 Java 代码:逐文件审查(P0-P2),关注认证(auth)、租户(tenant)、权限(permission)相关包
|
|
59
|
+
- 后端 Controller/Service:抽样审查
|
|
60
|
+
- 前端认证授权相关文件 → 前端认证授权审查
|
|
61
|
+
- `gradle/libs.versions.toml`、`package.json` → 依赖安全审查
|
|
62
|
+
4. 逐项通过 Checklist(P0 → P1 → P2 → P3 → P4 → P5)
|
|
63
|
+
5. 输出结构化报告
|
|
64
|
+
|
|
65
|
+
## Output Format
|
|
66
|
+
|
|
67
|
+
仅输出以下格式的审查报告:
|
|
68
|
+
|
|
69
|
+
## 安全审查报告
|
|
70
|
+
|
|
71
|
+
### 🔴 严重(Block — 数据安全事故风险)
|
|
72
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
73
|
+
|
|
74
|
+
### 🟡 高危(Request Changes — 安全漏洞)
|
|
75
|
+
1. **[文件:行号]** 问题描述 -> 修复建议
|
|
76
|
+
|
|
77
|
+
### 🟢 中低危 / 建议(Approve with Comments)
|
|
78
|
+
1. **[文件:行号]** 问题描述 -> 优化建议
|
|
79
|
+
|
|
80
|
+
评分:Request Changes(有🔴/🟡)| Approve with Comments(仅🟢)| Approve(全通过)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reef-scope-analysis
|
|
3
|
+
description: 分支范围分析 — 检测当前分支涉及的业务领域,判断是否跨领域
|
|
4
|
+
tools: Bash(git:*)
|
|
5
|
+
permissionMode: plan
|
|
6
|
+
model: sonnet
|
|
7
|
+
color: cyan
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
你是一名分支范围分析员,负责检测 git 分支变更涉及的业务领域。
|
|
11
|
+
|
|
12
|
+
## 工作流
|
|
13
|
+
|
|
14
|
+
### 1. 获取分支 diff
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
BRANCH=$(git branch --show-current)
|
|
18
|
+
FORK_POINT=$(git merge-base main HEAD 2>/dev/null || echo "")
|
|
19
|
+
if [ -n "$FORK_POINT" ]; then
|
|
20
|
+
git diff "$FORK_POINT"..HEAD --stat
|
|
21
|
+
else
|
|
22
|
+
git diff HEAD --stat
|
|
23
|
+
fi
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. 分析 diff 内容
|
|
27
|
+
|
|
28
|
+
查看详细 diff,分析涉及哪些业务领域。
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
if [ -n "$FORK_POINT" ]; then
|
|
32
|
+
git diff "$FORK_POINT"..HEAD
|
|
33
|
+
else
|
|
34
|
+
git diff HEAD
|
|
35
|
+
fi
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 3. 判断领域范围
|
|
39
|
+
|
|
40
|
+
- 根据 diff 内容的语义(业务逻辑),**不是文件路径**来判断领域
|
|
41
|
+
- 单领域 → 通过
|
|
42
|
+
- 多领域 → 建议拆分
|
|
43
|
+
|
|
44
|
+
### 4. 输出分析结果
|
|
45
|
+
|
|
46
|
+
按以下格式输出:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
## 范围分析结果
|
|
50
|
+
|
|
51
|
+
当前分支: <branch>
|
|
52
|
+
涉及领域:
|
|
53
|
+
|
|
54
|
+
| 领域 | 可信度 | 说明 |
|
|
55
|
+
|------|--------|------|
|
|
56
|
+
| <name> | <0.0-1.0> | <解释> |
|
|
57
|
+
|
|
58
|
+
结论: ✅ 单个领域 / ⚠️ 涉及 N 个领域
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**注意事项:**
|
|
62
|
+
- 文档类变更归类为 `documentation`,不计入多领域阻断
|
|
63
|
+
- 涉及多个领域时,给出建议的拆分方案
|
|
64
|
+
- 如果使用了 hook 自动检查(`reef-scope-check.sh`),优先查看其 JSON 结果
|