@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.
Files changed (148) hide show
  1. package/README.md +72 -0
  2. package/dist/agents/reef-inspect-figma.md +77 -0
  3. package/dist/agents/reef-review-backend.md.tmpl +112 -0
  4. package/dist/agents/reef-review-frontend.md.tmpl +78 -0
  5. package/dist/agents/reef-review-infra.md +47 -0
  6. package/dist/agents/reef-review-security.md.tmpl +80 -0
  7. package/dist/agents/reef-scope-analysis.md +64 -0
  8. package/dist/build-registry.js +375 -0
  9. package/dist/cli.js +8581 -0
  10. package/dist/config-schema.json +133 -0
  11. package/dist/env-examples/context7.env-example +19 -0
  12. package/dist/env-examples/feishu-wiki.env-example +16 -0
  13. package/dist/env-examples/figma.env-example +16 -0
  14. package/dist/env-examples/github.env-example +20 -0
  15. package/dist/env-examples/jira.env-example +20 -0
  16. package/dist/hooks/mcp-hook.sh +77 -0
  17. package/dist/hooks/reef-auto-format.sh.tmpl +72 -0
  18. package/dist/hooks/reef-block-dangerous.sh +70 -0
  19. package/dist/hooks/reef-hooks.json +72 -0
  20. package/dist/hooks/reef-intent-detect.sh +129 -0
  21. package/dist/hooks/reef-protect-files.sh +55 -0
  22. package/dist/hooks/reef-run-tests.sh +84 -0
  23. package/dist/hooks/reef-scope-check.sh +386 -0
  24. package/dist/hooks/reef-scope-ci.sh +28 -0
  25. package/dist/hooks/reef-scope-gate.sh +115 -0
  26. package/dist/hooks/reef-scope-pre-commit.sh.tmpl +28 -0
  27. package/dist/hooks/reef-scope-setup.sh +204 -0
  28. package/dist/hooks/reef-scope-split.sh +203 -0
  29. package/dist/hooks/sweep-hooks.json +14 -0
  30. package/dist/hooks/sweep-mcp-hook.sh +77 -0
  31. package/dist/hooks/tide-hooks.json +14 -0
  32. package/dist/hooks/tide-session-preload.sh +17 -0
  33. package/dist/mcp/code-hosting/github.json +20 -0
  34. package/dist/mcp/design-tools/figma.json +19 -0
  35. package/dist/mcp/docs-reference/context7.json +28 -0
  36. package/dist/mcp/e2e-testing/playwright.json +13 -0
  37. package/dist/mcp/knowledge-base/feishu-wiki.json +19 -0
  38. package/dist/mcp/project-management/jira.json +27 -0
  39. package/dist/mcp-skills/deepflow-mcp-feishu-wiki-read/SKILL.md +65 -0
  40. package/dist/mcp-skills/deepflow-mcp-feishu-wiki-write/SKILL.md +63 -0
  41. package/dist/mcp-skills/deepflow-mcp-figma-read/SKILL.md +98 -0
  42. package/dist/mcp-skills/deepflow-mcp-github-read/SKILL.md +62 -0
  43. package/dist/mcp-skills/deepflow-mcp-github-write/SKILL.md +63 -0
  44. package/dist/mcp-skills/deepflow-mcp-jira-read/SKILL.md +80 -0
  45. package/dist/mcp-skills/deepflow-mcp-jira-write/SKILL.md +74 -0
  46. package/dist/mcp-skills/deepflow-mcp-playwright-read/SKILL.md +79 -0
  47. package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +65 -0
  48. package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +63 -0
  49. package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +98 -0
  50. package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +62 -0
  51. package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +63 -0
  52. package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +80 -0
  53. package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +74 -0
  54. package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +79 -0
  55. package/dist/registry.json +818 -0
  56. package/dist/skills/atoll-ops/SKILL.md +46 -0
  57. package/dist/skills/reef-commit/SKILL.md +127 -0
  58. package/dist/skills/reef-gen-backend/SKILL.md.tmpl +87 -0
  59. package/dist/skills/reef-gen-backend/variants/java/steps.md +28 -0
  60. package/dist/skills/reef-gen-backend/variants/python/steps.md +70 -0
  61. package/dist/skills/reef-gen-frontend/SKILL.md.tmpl +83 -0
  62. package/dist/skills/reef-gen-frontend/variants/angular/steps.md +30 -0
  63. package/dist/skills/reef-harden/EXAMPLES.md +89 -0
  64. package/dist/skills/reef-harden/SKILL.md +136 -0
  65. package/dist/skills/reef-pr/SKILL.md +97 -0
  66. package/dist/skills/reef-review/SKILL.md.tmpl +107 -0
  67. package/dist/skills/reef-scope/SKILL.md +134 -0
  68. package/dist/skills/reef-start/SKILL.md.tmpl +562 -0
  69. package/dist/skills/reef-start/references/jira-start-subagent.md +60 -0
  70. package/dist/skills/reef-style-backend/SKILL.md.tmpl +134 -0
  71. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/chat-client.md +96 -0
  72. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/rag.md +94 -0
  73. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +62 -0
  74. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/tool-calling.md +68 -0
  75. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +220 -0
  76. package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +148 -0
  77. package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +131 -0
  78. package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/quick-reference.md +103 -0
  79. package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +119 -0
  80. package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +101 -0
  81. package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +181 -0
  82. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/controller.md +95 -0
  83. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +121 -0
  84. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/infrastructure.md +179 -0
  85. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +202 -0
  86. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +107 -0
  87. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +83 -0
  88. package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +150 -0
  89. package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +197 -0
  90. package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/examples/user-repository-test.md +69 -0
  91. package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +101 -0
  92. package/dist/skills/reef-style-backend/fragments/java/test/junit5/examples/user-service-test.md +61 -0
  93. package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +100 -0
  94. package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/examples/user-controller-test.md +61 -0
  95. package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +85 -0
  96. package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/examples/user-service-integration-test.md +56 -0
  97. package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +83 -0
  98. package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +77 -0
  99. package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +164 -0
  100. package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +139 -0
  101. package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +177 -0
  102. package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +101 -0
  103. package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +135 -0
  104. package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +111 -0
  105. package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +83 -0
  106. package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +207 -0
  107. package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +91 -0
  108. package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +227 -0
  109. package/dist/skills/reef-style-backend/variants/java/examples/contributor-pattern.md +97 -0
  110. package/dist/skills/reef-style-backend/variants/java/quick-reference.md +117 -0
  111. package/dist/skills/reef-style-backend/variants/python/examples/crud-router.md +71 -0
  112. package/dist/skills/reef-style-backend/variants/python/examples/pydantic-schema.md +45 -0
  113. package/dist/skills/reef-style-backend/variants/python/examples/pytest-fixture.md +60 -0
  114. package/dist/skills/reef-style-backend/variants/python/examples/sqlalchemy-model.md +31 -0
  115. package/dist/skills/reef-style-backend/variants/python/quick-reference.md +111 -0
  116. package/dist/skills/reef-style-frontend/SKILL.md.tmpl +70 -0
  117. package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +79 -0
  118. package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +150 -0
  119. package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +141 -0
  120. package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +112 -0
  121. package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +134 -0
  122. package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/quick-reference.md +66 -0
  123. package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +252 -0
  124. package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +56 -0
  125. package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +100 -0
  126. package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +119 -0
  127. package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +95 -0
  128. package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +100 -0
  129. package/dist/skills/reef-testcase/SKILL.md +138 -0
  130. package/dist/skills/reef-testcase/references/coverage-dimensions.md +99 -0
  131. package/dist/skills/reef-testcase/references/test-case-template.md +63 -0
  132. package/dist/skills/sweep-init/SKILL.md +286 -0
  133. package/dist/skills/sweep-init/scripts/flow-selector.mjs +305 -0
  134. package/dist/skills/sweep-plan/SKILL.md.tmpl +312 -0
  135. package/dist/skills/sweep-plan/references/test-flow-template.md +46 -0
  136. package/dist/skills/sweep-run/SKILL.md +437 -0
  137. package/dist/skills/sweep-run/scripts/env-manager.mjs +208 -0
  138. package/dist/skills/sweep-run/scripts/flow-parser.mjs +329 -0
  139. package/dist/skills/sweep-run/scripts/flow-selector.mjs +483 -0
  140. package/dist/skills/sweep-run/scripts/mcp-manager.mjs +208 -0
  141. package/dist/skills/sweep-run/scripts/spec-compiler.mjs +303 -0
  142. package/dist/skills/tide-discuss/SKILL.md.tmpl +449 -0
  143. package/dist/skills/tide-discuss/references/checklists.md +88 -0
  144. package/dist/skills/tide-discuss/references/data-format.md +237 -0
  145. package/dist/skills/tide-discuss/references/prd-template.md +134 -0
  146. package/dist/skills/tide-discuss/references/publish-flow.md +167 -0
  147. package/dist/skills/tide-discuss/references/role-prompts.md +105 -0
  148. package/package.json +38 -0
@@ -0,0 +1,133 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "DeepStorm Configuration Schema",
4
+ "description": "定义所有合法的 DeepStorm 配置 key 和结构",
5
+ "type": "object",
6
+ "properties": {
7
+ "tide": {
8
+ "type": "object",
9
+ "description": "产品侧配置",
10
+ "properties": {
11
+ "issueTracker": {
12
+ "type": "string",
13
+ "enum": ["jira", "none"],
14
+ "description": "Issue 跟踪系统"
15
+ }
16
+ },
17
+ "additionalProperties": false
18
+ },
19
+ "reef": {
20
+ "type": "object",
21
+ "description": "开发侧配置",
22
+ "properties": {
23
+ "frontend": {
24
+ "type": "object",
25
+ "properties": {
26
+ "framework": {
27
+ "type": "string",
28
+ "enum": ["angular", "none"],
29
+ "description": "前端框架"
30
+ },
31
+ "tsConfig": {
32
+ "type": "string",
33
+ "enum": ["strict", "standard", "none"],
34
+ "description": "TypeScript 配置模式"
35
+ },
36
+ "css": {
37
+ "type": "string",
38
+ "enum": ["tailwind", "none"],
39
+ "description": "CSS 方案"
40
+ },
41
+ "test": {
42
+ "type": "string",
43
+ "enum": ["vitest", "none"],
44
+ "description": "前端测试框架"
45
+ }
46
+ },
47
+ "additionalProperties": false
48
+ },
49
+ "backend": {
50
+ "type": "object",
51
+ "properties": {
52
+ "language": {
53
+ "type": "string",
54
+ "enum": ["java", "none"],
55
+ "description": "后端语言"
56
+ },
57
+ "java": {
58
+ "type": "object",
59
+ "description": "Java 子维度",
60
+ "properties": {
61
+ "framework": {
62
+ "type": "string",
63
+ "enum": ["spring-boot", "none"],
64
+ "description": "Java Web 框架"
65
+ },
66
+ "orm": {
67
+ "type": "string",
68
+ "enum": ["hibernate", "none"],
69
+ "description": "ORM 框架"
70
+ },
71
+ "dbMigration": {
72
+ "type": "string",
73
+ "enum": ["liquibase", "none"],
74
+ "description": "数据库迁移工具"
75
+ },
76
+ "ai": {
77
+ "type": "string",
78
+ "enum": ["spring-ai", "none"],
79
+ "description": "AI 框架"
80
+ },
81
+ "test": {
82
+ "type": "string",
83
+ "enum": ["junit5", "none"],
84
+ "description": "单元测试框架"
85
+ }
86
+ },
87
+ "additionalProperties": false
88
+ }
89
+ },
90
+ "additionalProperties": false
91
+ }
92
+ },
93
+ "additionalProperties": false
94
+ },
95
+ "sweep": {
96
+ "type": "object",
97
+ "description": "测试侧配置",
98
+ "properties": {
99
+ "ciProvider": {
100
+ "type": "string",
101
+ "enum": ["github-actions", "gitlab-ci", "jenkins", "none"],
102
+ "description": "CI 提供商"
103
+ }
104
+ },
105
+ "additionalProperties": false
106
+ },
107
+ "atoll": {
108
+ "type": "object",
109
+ "description": "运维侧配置",
110
+ "properties": {
111
+ "deployTarget": {
112
+ "type": "string",
113
+ "enum": ["kubernetes", "docker", "serverless", "none"],
114
+ "description": "部署目标"
115
+ }
116
+ },
117
+ "additionalProperties": false
118
+ },
119
+ "mcp": {
120
+ "type": "object",
121
+ "description": "MCP 基础设施配置",
122
+ "properties": {
123
+ "installedMcpServers": {
124
+ "type": "array",
125
+ "items": { "type": "string" },
126
+ "description": "已安装的 MCP 服务名列表"
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ }
131
+ },
132
+ "additionalProperties": false
133
+ }
@@ -0,0 +1,19 @@
1
+ # ════════════════════════════════════════════════════════════════
2
+ # Context7 文档参考
3
+ #
4
+ # 用途:实时查询库/框架的官方文档
5
+ # - React、Next.js、Vue、Angular
6
+ # - Prisma、Django、Spring Boot
7
+ # - Tailwind CSS、Express 等
8
+ #
9
+ # 说明:Claude Code 通过 Context7 获取最新的库文档,
10
+ # 确保代码建议基于最新版本,而非过时的训练数据。
11
+ # 不配置也可使用但有 rate limit,配置后可提升限额。
12
+ #
13
+ # 获取步骤:
14
+ # 1. 访问 https://context7.com/dashboard
15
+ # 2. 注册/登录账号
16
+ # 3. 在 Dashboard 中复制 API Key
17
+ # 4. 将 API Key 填入下方(以 ctx7sk_ 开头)
18
+ # ════════════════════════════════════════════════════════════════
19
+ CONTEXT7_API_KEY=ctx7sk_your_context7_key_here
@@ -0,0 +1,16 @@
1
+ # ════════════════════════════════════════════════════════════════
2
+ # 飞书知识库 MCP 服务器
3
+ #
4
+ # 用途:文档协作与知识库
5
+ # - 读取飞书文档中的内容
6
+ # - 搜索知识库文档
7
+ # - 辅助获取项目文档上下文
8
+ #
9
+ # Token 获取步骤:
10
+ # 1. 打开飞书开放平台 → 进入「开发者后台」
11
+ # 2. 创建企业自建应用 → 获取 App ID 和 App Secret
12
+ # 3. 在「权限管理」中添加「文档-查看/编辑」权限
13
+ # 4. 发布应用后获取 tenant_access_token
14
+ # 5. 将该 token 值填入下方
15
+ # ════════════════════════════════════════════════════════════════
16
+ FEISHU_WEBHOOK_TOKEN=your_feishu_token_here
@@ -0,0 +1,16 @@
1
+ # ════════════════════════════════════════════════════════════════
2
+ # Figma MCP 服务器
3
+ #
4
+ # 用途:原型设计与协作
5
+ # - 读取 Figma 设计稿中的组件、布局、样式
6
+ # - 获取设计稿的节点信息和元数据
7
+ # - 辅助前端开发还原设计稿
8
+ #
9
+ # Token 获取步骤:
10
+ # 1. 打开 Figma → 点击右上角头像 → Settings
11
+ # 2. 左侧导航选择「Personal Access Tokens」
12
+ # 3. 点击「Generate new token」
13
+ # 4. 输入 Token 名称(如 "deepstorm-cli")
14
+ # 5. 生成后将 token 值填入下方(以 figd_ 开头)
15
+ # ════════════════════════════════════════════════════════════════
16
+ FIGMA_API_KEY=figd_your_figma_token_here
@@ -0,0 +1,20 @@
1
+ # ════════════════════════════════════════════════════════════════
2
+ # GitHub MCP 服务器
3
+ #
4
+ # 用途:源码托管与协作
5
+ # - 读取仓库文件、Issue、PR
6
+ # - 创建和合并 Pull Request
7
+ # - 管理 Issue、标签、里程碑
8
+ #
9
+ # Token 获取步骤:
10
+ # 1. 访问 https://github.com/settings/tokens
11
+ # 2. 点击「Generate new token (classic)」
12
+ # 3. 选择以下权限(scopes):
13
+ # - repo(全部选中,私有仓库需要)
14
+ # - workflow(如有 GitHub Actions 操作需求)
15
+ # 4. 生成后将 token 值填入下方
16
+ #
17
+ # Docker 要求:GitHub MCP 需要本地 Docker 环境
18
+ # 安装:https://docs.docker.com/get-docker/
19
+ # ════════════════════════════════════════════════════════════════
20
+ GITHUB_PERSONAL_ACCESS_TOKEN=ghp_your_github_token_here
@@ -0,0 +1,20 @@
1
+ # ════════════════════════════════════════════════════════════════
2
+ # Jira MCP 服务器
3
+ #
4
+ # 用途:任务跟踪与敏捷管理
5
+ # - 读取 Issue 详情和评论
6
+ # - 执行 JQL 查询定位 Issue
7
+ # - 创建和更新 Issue
8
+ #
9
+ # 所需信息:
10
+ # 1. Jira 实例地址
11
+ # 你的域名.atlassian.net
12
+ # 2. 邮箱
13
+ # 登录 Jira 时使用的邮箱地址
14
+ # 3. API Token
15
+ # 生成地址:https://id.atlassian.com/manage-profile/security/api-tokens
16
+ # 点击「Create API token」→ 命名后复制 token
17
+ # ════════════════════════════════════════════════════════════════
18
+ JIRA_INSTANCE_URL=https://your-domain.atlassian.net
19
+ JIRA_USER_EMAIL=your-email@example.com
20
+ JIRA_API_KEY=your_jira_api_token_here
@@ -0,0 +1,77 @@
1
+ #!/bin/bash
2
+ # MCP Hook for Claude Code — auto-start Playwright MCP on session start
3
+ # Usage:
4
+ # ./scripts/mcp-hook.sh # start in headless mode (default)
5
+ # ./scripts/mcp-hook.sh --headed # start with visible browser
6
+ # ./scripts/mcp-hook.sh --stop # stop MCP
7
+ # ./scripts/mcp-hook.sh --status # check status
8
+
9
+ MCP_PORT=54321
10
+ BIN="node_modules/.bin/playwright-mcp"
11
+
12
+ case "${1:-}" in
13
+ --stop)
14
+ PID=$(lsof -ti tcp:$MCP_PORT 2>/dev/null)
15
+ if [ -n "$PID" ]; then
16
+ kill -9 "$PID" 2>/dev/null
17
+ echo "mcp: stopped (PID $PID)"
18
+ else
19
+ echo "mcp: not running"
20
+ fi
21
+ exit 0
22
+ ;;
23
+ --status)
24
+ PID=$(lsof -ti tcp:$MCP_PORT 2>/dev/null)
25
+ if [ -n "$PID" ]; then
26
+ CMD=$(ps -p "$PID" -o args= 2>/dev/null)
27
+ if echo "$CMD" | grep -q -- "--headless"; then
28
+ MODE="headless"
29
+ else
30
+ MODE="headed"
31
+ fi
32
+ echo "mcp: running (PID $PID, mode: $MODE)"
33
+ else
34
+ echo "mcp: not running"
35
+ fi
36
+ exit 0
37
+ ;;
38
+ --headed)
39
+ MODE_FLAG=""
40
+ ;;
41
+ *)
42
+ MODE_FLAG="--headless"
43
+ ;;
44
+ esac
45
+
46
+ PID=$(lsof -ti tcp:$MCP_PORT 2>/dev/null)
47
+ if [ -n "$PID" ]; then
48
+ CMD=$(ps -p "$PID" -o args= 2>/dev/null)
49
+ if echo "$CMD" | grep -q -- "--headless"; then
50
+ CURRENT="headless"
51
+ else
52
+ CURRENT="headed"
53
+ fi
54
+ DESIRED="${MODE_FLAG:+headless}"
55
+ DESIRED="${DESIRED:-headed}"
56
+ if [ "$CURRENT" = "$DESIRED" ]; then
57
+ echo "mcp: already running ($CURRENT mode, PID $PID)"
58
+ exit 0
59
+ fi
60
+ kill -9 "$PID" 2>/dev/null
61
+ sleep 1
62
+ fi
63
+
64
+ if [ -x "$BIN" ]; then
65
+ nohup "$BIN" --port "$MCP_PORT" $MODE_FLAG --isolated > /tmp/playwright-mcp.log 2>&1 &
66
+ else
67
+ nohup npx @playwright/mcp --port "$MCP_PORT" $MODE_FLAG > /tmp/playwright-mcp.log 2>&1 &
68
+ fi
69
+
70
+ sleep 2
71
+ NEW_PID=$(lsof -ti tcp:$MCP_PORT 2>/dev/null)
72
+ if [ -n "$NEW_PID" ]; then
73
+ echo "mcp: started (PID $NEW_PID, mode: ${MODE_FLAG:-headed})"
74
+ else
75
+ echo "mcp: failed to start — see /tmp/playwright-mcp.log"
76
+ exit 1
77
+ fi
@@ -0,0 +1,72 @@
1
+ #!/bin/bash
2
+ # reef-auto-format.sh
3
+ # PostToolUse: 在 Edit/Write 后自动格式化代码
4
+ #
5
+ # 从 stdin JSON 解析文件路径(标准 Claude Code hook 协议),
6
+ # 同时支持 $CLAUDE_CODE_TOOL_RESULT_FILEPATH 环境变量作为降级。
7
+ #
8
+ # 性能优先:单文件格式化 > 全项目格式化
9
+ # Java: 按 reef code-style 人工控制,不自动格式化
10
+ # Python: ruff format > black
11
+ # TS/JS: eslint --fix
12
+
13
+ set -euo pipefail
14
+
15
+ # ── 1. 获取文件路径 ──────────────────────────────────────────────────
16
+ # 优先从 stdin JSON 解析(PostToolUse 标准协议),降级到环境变量
17
+ filepath=""
18
+
19
+ # 尝试从 stdin 读取(PostToolUse hook JSON)
20
+ if [ -p /dev/stdin ] && command -v jq &>/dev/null; then
21
+ filepath=$(jq -r '.tool_response.filePath // .tool_input.file_path // ""' 2>/dev/null || true)
22
+ fi
23
+
24
+ # 降级:环境变量
25
+ if [ -z "$filepath" ] || [ "$filepath" = "null" ]; then
26
+ filepath="${CLAUDE_CODE_TOOL_RESULT_FILEPATH:-}"
27
+ fi
28
+
29
+ # 仍然拿不到路径,退出
30
+ [ -z "$filepath" ] && exit 0
31
+ [ ! -f "$filepath" ] && exit 0
32
+
33
+ # 检测项目根目录
34
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
35
+
36
+ # ── 2. 按文件类型执行格式化 ──────────────────────────────────────────
37
+
38
+ case "$filepath" in
39
+ *.java)
40
+ # Java: 按 reef code-style 人工控制,不执行自动格式化
41
+ : # no-op
42
+ ;;
43
+ *.py)
44
+ if command -v ruff &>/dev/null; then
45
+ ruff format "$filepath"
46
+ elif command -v black &>/dev/null; then
47
+ black "$filepath"
48
+ fi
49
+ ;;
50
+ *.ts|*.tsx|*.html|*.css|*.scss|*.less|*.json|*.yaml|*.yml)
51
+ if ! command -v npx &>/dev/null; then
52
+ exit 0
53
+ fi
54
+ remaining=$(cd "$PROJECT_DIR" && npx eslint --fix "$filepath" 2>/dev/null || true)
55
+ if [ -n "$remaining" ]; then
56
+ echo "[auto-format] ⚠ 以下 ESLint 错误需要手动修复:"
57
+ echo "$remaining"
58
+ echo "[auto-format] 请运行 {{reef.frontend.framework.formatCmd}} lint 查看完整报告。"
59
+ fi
60
+ ;;
61
+ *.go)
62
+ command -v gofmt &>/dev/null && gofmt -w "$filepath"
63
+ ;;
64
+ *.rs)
65
+ command -v rustfmt &>/dev/null && rustfmt "$filepath"
66
+ ;;
67
+ *.sql)
68
+ # 如果项目配置了 SQL 格式化工具,在此扩展
69
+ ;;
70
+ esac
71
+
72
+ exit 0
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+ # reef-block-dangerous.sh
3
+ # PreToolUse: 拦截危险的 Bash 命令
4
+
5
+ INPUT=$(cat)
6
+ COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""') || exit 0
7
+
8
+ [ -z "$COMMAND" ] && exit 0
9
+
10
+ DANGEROUS_PATTERNS=(
11
+ "rm -rf /"
12
+ "rm -rf ~"
13
+ "rm -rf \$HOME"
14
+ "rm -rf /*"
15
+ "> /dev/sd"
16
+ "mkfs."
17
+ "dd if="
18
+ ":(){:|:&};:"
19
+ "chmod -R 777 /"
20
+ "chown -R"
21
+ "git push --force origin main"
22
+ "git push --force origin master"
23
+ "git reset --hard origin"
24
+ )
25
+
26
+ # sed -i 修改敏感文件(.env、lock 文件等)
27
+ if echo "$COMMAND" | grep -qE "sed\s+-i.*\.env|sed\s+-i.*lock\.json|sed\s+-i.*lock\.yaml"; then
28
+ cat <<EOF
29
+ {
30
+ "hookSpecificOutput": {
31
+ "hookEventName": "PreToolUse",
32
+ "permissionDecision": "deny",
33
+ "permissionDecisionReason": "Blocked: sed -i on protected file (.env or lock file)"
34
+ }
35
+ }
36
+ EOF
37
+ exit 0
38
+ fi
39
+
40
+ for pattern in "${DANGEROUS_PATTERNS[@]}"; do
41
+ if [[ "$COMMAND" == *"$pattern"* ]]; then
42
+ cat <<EOF
43
+ {
44
+ "hookSpecificOutput": {
45
+ "hookEventName": "PreToolUse",
46
+ "permissionDecision": "deny",
47
+ "permissionDecisionReason": "Blocked dangerous command pattern: $pattern"
48
+ }
49
+ }
50
+ EOF
51
+ exit 0
52
+ fi
53
+ done
54
+
55
+ # regex: curl/wget 管道到 sh/bash
56
+ if echo "$COMMAND" | grep -qE '(curl|wget)\s+\S.*\|\s*(sh|bash)\b'; then
57
+ cat <<EOF
58
+ {
59
+ "hookSpecificOutput": {
60
+ "hookEventName": "PreToolUse",
61
+ "permissionDecision": "deny",
62
+ "permissionDecisionReason": "Blocked dangerous command: pipe from curl/wget to shell"
63
+ }
64
+ }
65
+ EOF
66
+ exit 0
67
+ fi
68
+
69
+ # 默认放行
70
+ exit 0
@@ -0,0 +1,72 @@
1
+ {
2
+ "hooks": {
3
+ "UserPromptSubmit": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "bash ./reef-intent-detect.sh"
9
+ }
10
+ ]
11
+ }
12
+ ],
13
+ "PreToolUse": [
14
+ {
15
+ "matcher": "Bash",
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "bash ./reef-block-dangerous.sh"
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "matcher": "Write|Edit",
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "bash ./reef-protect-files.sh"
29
+ },
30
+ {
31
+ "type": "prompt",
32
+ "timeout": 5,
33
+ "prompt": "You are about to write or edit a file. If the target file extension is .java, load reef-style-backend skill for coding standards. If the target is .ts, .html, .css, .scss, or .less, load reef-style-frontend skill for coding standards. Follow the loaded skill's rules in your output."
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "PostToolUse": [
39
+ {
40
+ "matcher": "Edit|Write",
41
+ "hooks": [
42
+ {
43
+ "type": "command",
44
+ "command": "bash ./reef-auto-format.sh"
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "matcher": "Edit|Write",
50
+ "hooks": [
51
+ {
52
+ "type": "command",
53
+ "command": "bash ./reef-run-tests.sh",
54
+ "if": "Edit(*.ts)|Write(*.ts)",
55
+ "async": true,
56
+ "statusMessage": "Running tests..."
57
+ }
58
+ ]
59
+ }
60
+ ],
61
+ "Stop": [
62
+ {
63
+ "hooks": [
64
+ {
65
+ "type": "command",
66
+ "command": "bash ./reef-run-tests.sh"
67
+ }
68
+ ]
69
+ }
70
+ ]
71
+ }
72
+ }
@@ -0,0 +1,129 @@
1
+ #!/bin/bash
2
+ # reef-intent-detect.sh
3
+ # UserPromptSubmit hook: 检测用户输入是否为开发需求,自动唤起 reef-start skill
4
+ #
5
+ # 部署路径:.claude/hooks/reef-intent-detect.sh
6
+ # 注册方式:通过 hooks.json 的 UserPromptSubmit 条目
7
+ #
8
+ # 工作原理:
9
+ # 1. 读取用户输入(环境变量 CLAUDE_INPUT)
10
+ # 2. 匹配开发意图关键词(中文 + 英文)
11
+ # 3. 匹配成功 → 输出 <system-reminder> 指令,指示 AI 调用 reef-start skill
12
+ # 4. 未匹配 → 静默退出,AI 正常处理
13
+
14
+ # 严格模式
15
+ set -euo pipefail
16
+
17
+ # ── 配置:开发意图关键词 ──────────────────────────────────────────
18
+ # 用户可以在此扩展关键词列表,添加新的匹配模式
19
+
20
+ # 中文开发意图关键词
21
+ ZH_DEV_PATTERNS=(
22
+ # 新增功能
23
+ "我想加" "我要加" "我需要" "帮我加" "帮我做" "帮我写"
24
+ "加个" "搞个" "写个" "做个" "弄个"
25
+ "加一个" "添加一个" "新增一个" "实现一个"
26
+ "实现一下" "实现个" "帮我实现"
27
+ "新增" "添加" "创建" "建立"
28
+ "做个功能" "加个功能" "来个功能"
29
+
30
+ # Bug 修复
31
+ "修复" "修一下" "修一个" "修好" "修修"
32
+ "有问题" "有bug" "有 bug" "不正常" "有毛病"
33
+ "返回不对" "结果不对" "数据不对"
34
+ "报错" "报错了" "出错了" "出错"
35
+ "不工作" "不能用了" "坏了" "挂了"
36
+ "bug" "Bug" "BUG"
37
+
38
+ # 重构/优化
39
+ "重构" "重写" "重做" "改造" "重改"
40
+ "优化" "改善" "提升" "改进"
41
+ "整理" "提取" "抽取" "拆分" "合并"
42
+ "重新设计" "重新组织" "重构成"
43
+ "改一下" "修改一下" "改动" "调整一下"
44
+
45
+ # 代码修改
46
+ "改成" "改为" "修改为" "变更"
47
+ "把这个" "把那个" "把这些"
48
+ "改代码" "写代码" "敲代码" "编码"
49
+ "代码有点" "逻辑有点" "写法有点"
50
+ )
51
+
52
+ # 英文开发意图关键词
53
+ EN_DEV_PATTERNS=(
54
+ # New features
55
+ "add a" "add an" "add some" "add new"
56
+ "implement" "build a" "build an" "create a" "create an"
57
+ "new feature" "i need a" "i want a" "i need to"
58
+ "develop a" "write a" "write an" "make a"
59
+ "introduce" "set up" "set up a"
60
+
61
+ # Bug fixes
62
+ "fix" "bug" "broken" "not working" "doesn't work"
63
+ "error" "issue with" "problem with" "something wrong"
64
+ "fail" "failing" "failed" "crash" "crashed"
65
+
66
+ # Refactoring
67
+ "refactor" "rewrite" "restructure" "redesign"
68
+ "optimize" "optimise" "improve" "clean up" "cleanup"
69
+ "extract" "split" "merge" "reorganize" "reorganise"
70
+ )
71
+
72
+ # Issue 引用模式(如 LC-1234、PROJ-456、https://*.atlassian.net/browse/*)
73
+ # 这些通常出现在用户提及具体开发任务时
74
+ ISSUE_PATTERNS=(
75
+ "[A-Z]+-[0-9]+"
76
+ "atlassian.net/browse/"
77
+ )
78
+
79
+ # ── 配置:排除规则(匹配以下模式时不触发) ──────────────────────
80
+ # 这些是常见的非开发意图表达,即使包含开发关键词也不触发
81
+
82
+ EXCLUDE_PATTERNS=(
83
+ # 纯查询/查看类(排除过于宽泛的词,仅保留明确非开发意图的短语)
84
+ "查一下" "查查" "看看" "看一下"
85
+ "读一下" "读读"
86
+ "显示一下" "展示一下"
87
+
88
+ # 文档/配置查询
89
+ "怎么配置" "怎么设置" "怎么安装"
90
+ "配置方法" "使用方法" "怎么用"
91
+ "是什么意思" "的含义" "的定义"
92
+
93
+ # 系统命令 / slash 命令(避免重复触发)
94
+ "^/" "^opsx:" "^bmad" "^reef-"
95
+ "^deepflow-" "^gstack" "^review" "^qa"
96
+ "^ship" "^canary" "^retro" "^learn"
97
+ )
98
+
99
+ # ── 主逻辑 ────────────────────────────────────────────────────────
100
+
101
+ # 读取用户输入
102
+ MESSAGE="${CLAUDE_INPUT:-}"
103
+ [ -z "$MESSAGE" ] && exit 0
104
+
105
+ # 第一步:检查排除规则
106
+ for pattern in "${EXCLUDE_PATTERNS[@]}"; do
107
+ if echo "$MESSAGE" | grep -qiE "$pattern"; then
108
+ exit 0 # 静默通过
109
+ fi
110
+ done
111
+
112
+ # 第二步:匹配开发意图关键词(含 Issue 引用)
113
+ for pattern in "${ZH_DEV_PATTERNS[@]}" "${EN_DEV_PATTERNS[@]}" "${ISSUE_PATTERNS[@]}"; do
114
+ if echo "$MESSAGE" | grep -qiE "$pattern"; then
115
+ # 匹配成功 → 注入指令让 AI 调用 reef-start
116
+ cat <<'HOOKEOF'
117
+ <system-reminder>
118
+ The user's message indicates a development task (feature request / bug fix / refactoring).
119
+ IMPORTANT: Before responding, you MUST invoke the reef-start skill using the Skill tool.
120
+ Pass the user's original message as context to the skill.
121
+ Only skip if reef-start is already active or you are already in a development flow.
122
+ </system-reminder>
123
+ HOOKEOF
124
+ exit 0
125
+ fi
126
+ done
127
+
128
+ # 未匹配 → 静默退出
129
+ exit 0