@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,204 @@
1
+ #!/bin/bash
2
+ # reef-scope-setup.sh
3
+ # 安装/卸载 pre-commit hook + 配置文件
4
+ #
5
+ # 用法:
6
+ # bash reef-scope-setup.sh install # 安装
7
+ # bash reef-scope-setup.sh uninstall # 卸载
8
+
9
+ set -euo pipefail
10
+
11
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
12
+ PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
13
+
14
+ SCOPE_CONFIG_DIR="${PROJECT_ROOT}/.deepflow"
15
+ SCOPE_CONFIG="${SCOPE_CONFIG_DIR}/scope-config.json"
16
+ GIT_HOOK_DIR="${PROJECT_ROOT}/.git/hooks"
17
+ PRE_COMMIT_HOOK="${GIT_HOOK_DIR}/pre-commit"
18
+
19
+ # ── 辅助函数 ─────────────────────────────────────────────────────
20
+
21
+ install() {
22
+ echo "🔧 [Scope] 正在安装分支范围检查..."
23
+ echo ""
24
+
25
+ # 1. 创建配置文件
26
+ echo "[1/3] 创建配置文件..."
27
+ mkdir -p "$SCOPE_CONFIG_DIR"
28
+
29
+ if [ ! -f "$SCOPE_CONFIG" ]; then
30
+ cat > "$SCOPE_CONFIG" <<CONFIG
31
+ {
32
+ "enabled": true,
33
+ "ciEnabled": true,
34
+ "domains": [],
35
+ "description": "分支范围检查配置",
36
+ "note": "domains 为空时使用 AI 自由分类。可在此列出项目业务领域以实现对齐。"
37
+ }
38
+ CONFIG
39
+ echo " ✅ 配置文件已创建: $SCOPE_CONFIG"
40
+ else
41
+ echo " ℹ️ 配置文件已存在,跳过"
42
+ fi
43
+
44
+ # 2. 安装 pre-commit hook
45
+ echo "[2/3] 安装 pre-commit hook..."
46
+ local hook_content
47
+ hook_content=$(cat <<'HOOK'
48
+ #!/bin/bash
49
+ # reef-scope pre-commit hook — 分支范围检查
50
+ # 由 reef scope setup 安装,请勿手动修改
51
+
52
+ set -euo pipefail
53
+
54
+ # 查找 reef hook 脚本
55
+ REEF_SCOPE_GATE=""
56
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
57
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
58
+
59
+ # 可能的查找路径
60
+ for candidate in \
61
+ "${PROJECT_ROOT}/node_modules/@deepflow/reef/hooks/reef-scope-gate.sh" \
62
+ "${DEEPFLOW_PLUGIN_ROOT}/hooks/reef-scope-gate.sh" \
63
+ "${CLAUDE_PLUGIN_ROOT}/hooks/reef-scope-gate.sh"; do
64
+ if [ -f "$candidate" ]; then
65
+ REEF_SCOPE_GATE="$candidate"
66
+ break
67
+ fi
68
+ done
69
+
70
+ if [ -z "$REEF_SCOPE_GATE" ]; then
71
+ exit 0
72
+ fi
73
+
74
+ bash "$REEF_SCOPE_GATE"
75
+ HOOK
76
+
77
+ # 检查是否已有 pre-commit hook
78
+ if [ -f "$PRE_COMMIT_HOOK" ]; then
79
+ # chain 模式:检查是否已包含 reef-scope
80
+ if grep -q "reef-scope" "$PRE_COMMIT_HOOK" 2>/dev/null; then
81
+ echo " ℹ️ reef-scope hook 已安装,跳过"
82
+ else
83
+ # 备份原有 hook,追加 reef-scope 调用
84
+ echo " ℹ️ 检测到已有 pre-commit hook,采用 chain 模式追加"
85
+ cat >> "$PRE_COMMIT_HOOK" <<'APPEND'
86
+
87
+ # --- reef-scope branch scope check ---
88
+ if [ -f "$(dirname "$0")/../.deepflow/scope-config.json" ]; then
89
+ export DEEPFLOW_PLUGIN_ROOT="$REEF_SCOPE_GATE"
90
+ bash "$(dirname "$0")/../.deepflow/hooks/reef-scope-gate.sh" 2>/dev/null || true
91
+ fi
92
+ APPEND
93
+ chmod +x "$PRE_COMMIT_HOOK"
94
+ echo " ✅ Hook 已追加到已有 pre-commit hook"
95
+ fi
96
+ else
97
+ # 创建新的 pre-commit hook
98
+ echo "$hook_content" > "$PRE_COMMIT_HOOK"
99
+ chmod +x "$PRE_COMMIT_HOOK"
100
+ echo " ✅ Pre-commit hook 已安装: $PRE_COMMIT_HOOK"
101
+ fi
102
+
103
+ # 3. 注册到 hooks.json(如适用)
104
+ echo "[3/3] 检查 hooks.json 注册..."
105
+ local hooks_json="${SCRIPT_DIR}/hooks.json"
106
+ if [ -f "$hooks_json" ]; then
107
+ # 检查是否已注册
108
+ if grep -q "reef-scope" "$hooks_json" 2>/dev/null; then
109
+ echo " ℹ️ hooks.json 中已注册,跳过"
110
+ else
111
+ echo " ℹ️ reef-scope 不需要注册到 Claude Code hooks.json,使用独立 git hook"
112
+ fi
113
+ fi
114
+
115
+ echo ""
116
+ echo "✅ Scope 检查安装完成!"
117
+ echo ""
118
+ echo " 配置文件: $SCOPE_CONFIG"
119
+ echo " 编辑配置可启用/禁用或设置领域对齐"
120
+ echo ""
121
+ echo " 测试命令:"
122
+ echo " git diff main...HEAD | bash ${SCRIPT_DIR}/reef-scope-check.sh"
123
+ }
124
+
125
+ uninstall() {
126
+ echo "🔧 [Scope] 正在卸载分支范围检查..."
127
+ echo ""
128
+
129
+ # 1. 移除 pre-commit hook 中的 reef-scope 部分
130
+ if [ -f "$PRE_COMMIT_HOOK" ]; then
131
+ if grep -q "reef-scope" "$PRE_COMMIT_HOOK" 2>/dev/null; then
132
+ # 如果整个文件都是 reef-scope 的,删除文件
133
+ if [ "$(grep -c "reef-scope" "$PRE_COMMIT_HOOK" 2>/dev/null || true)" -gt 3 ]; then
134
+ rm "$PRE_COMMIT_HOOK"
135
+ echo " ✅ 已删除 pre-commit hook"
136
+ else
137
+ # 否则只移除追加的部分
138
+ sed -i '' '/# --- reef-scope branch scope check ---/,/true/d' "$PRE_COMMIT_HOOK" 2>/dev/null || true
139
+ echo " ✅ 已从 pre-commit hook 中移除 reef-scope 检查"
140
+ fi
141
+ else
142
+ echo " ℹ️ pre-commit hook 中未包含 reef-scope,无需移除"
143
+ fi
144
+ fi
145
+
146
+ # 2. 保留配置文件(用户可选择手动删除)
147
+ if [ -f "$SCOPE_CONFIG" ]; then
148
+ echo " ℹ️ 配置文件保留: $SCOPE_CONFIG"
149
+ echo " 如需删除: rm $SCOPE_CONFIG"
150
+ fi
151
+
152
+ echo ""
153
+ echo "✅ Scope 检查已卸载!"
154
+ }
155
+
156
+ status() {
157
+ echo "🔍 [Scope] 当前状态:"
158
+ echo ""
159
+
160
+ if [ -f "$SCOPE_CONFIG" ]; then
161
+ echo " 配置文件: ✅ 已安装 ($SCOPE_CONFIG)"
162
+ echo " 内容:"
163
+ cat "$SCOPE_CONFIG" | python3 -m json.tool 2>/dev/null || cat "$SCOPE_CONFIG"
164
+ else
165
+ echo " 配置文件: ❌ 未安装"
166
+ fi
167
+ echo ""
168
+
169
+ if [ -f "$PRE_COMMIT_HOOK" ] && grep -q "reef-scope" "$PRE_COMMIT_HOOK" 2>/dev/null; then
170
+ echo " Pre-commit hook: ✅ 已安装"
171
+ else
172
+ echo " Pre-commit hook: ❌ 未安装"
173
+ fi
174
+
175
+ local check_script="${SCRIPT_DIR}/reef-scope-check.sh"
176
+ if [ -f "$check_script" ]; then
177
+ echo " 核心脚本: ✅ 就绪 ($check_script)"
178
+ else
179
+ echo " 核心脚本: ❌ 未找到"
180
+ fi
181
+ }
182
+
183
+ # ── 主入口 ──────────────────────────────────────────────────────
184
+
185
+ main() {
186
+ case "${1:-help}" in
187
+ install) install ;;
188
+ uninstall) uninstall ;;
189
+ status) status ;;
190
+ help|--help|-h)
191
+ echo "用法: bash reef-scope-setup.sh <命令>"
192
+ echo ""
193
+ echo "命令:"
194
+ echo " install 安装 pre-commit hook + 配置文件"
195
+ echo " uninstall 卸载 pre-commit hook"
196
+ echo " status 查看安装状态"
197
+ echo ""
198
+ echo "也可通过 reef CLI 调用: reef scope setup/uninstall/status"
199
+ ;;
200
+ *) echo "未知命令: $1"; exit 1 ;;
201
+ esac
202
+ }
203
+
204
+ main "$@"
@@ -0,0 +1,203 @@
1
+ #!/bin/bash
2
+ # reef-scope-split.sh
3
+ # 分支拆分工具 — 将多领域分支拆分为多个独立分支
4
+ #
5
+ # 用法:
6
+ # bash reef-scope-split.sh [--diff-from <分支>]
7
+ #
8
+ # 流程:
9
+ # 1. 检测当前分支涉及的业务领域
10
+ # 2. 展示拆分方案给用户
11
+ # 3. 用户确认后执行拆分
12
+
13
+ set -euo pipefail
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
16
+ SCOPE_CHECK="${SCRIPT_DIR}/reef-scope-check.sh"
17
+ PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
18
+
19
+ if [ -z "$PROJECT_ROOT" ]; then
20
+ echo "❌ 错误:不在 git 仓库中"
21
+ exit 1
22
+ fi
23
+
24
+ CURRENT_BRANCH="$(git branch --show-current)"
25
+
26
+ # ── 颜色 ────────────────────────────────────────────────────────
27
+ GREEN='\033[0;32m'
28
+ YELLOW='\033[1;33m'
29
+ RED='\033[0;31m'
30
+ CYAN='\033[0;36m'
31
+ NC='\033[0m'
32
+
33
+ # ── 主流程 ──────────────────────────────────────────────────────
34
+
35
+ main() {
36
+ local from_branch="${1:-main}"
37
+
38
+ echo ""
39
+ echo -e "${CYAN}╔══════════════════════════════════════════════════╗${NC}"
40
+ echo -e "${CYAN}║ 🔀 分支范围拆分工具 ║${NC}"
41
+ echo -e "${CYAN}╚══════════════════════════════════════════════════╝${NC}"
42
+ echo ""
43
+ echo -e "当前分支: ${YELLOW}${CURRENT_BRANCH}${NC}"
44
+ echo -e "基准分支: ${YELLOW}${from_branch}${NC}"
45
+ echo ""
46
+
47
+ # Step 1: 分析分支范围
48
+ echo -e "${CYAN}[1/4]${NC} 分析分支范围..."
49
+ local raw_result
50
+ raw_result="$("$SCOPE_CHECK" --diff-from "$from_branch" --raw 2>/dev/null)" || true
51
+
52
+ local domains
53
+ domains="$(echo "$raw_result" | python3 -c "
54
+ import json, sys
55
+ try:
56
+ r = json.load(sys.stdin)
57
+ nd = [d for d in r.get('domains', []) if d.get('name') != 'documentation']
58
+ print(json.dumps(nd, ensure_ascii=False))
59
+ except:
60
+ print('[]')
61
+ " 2>/dev/null || echo "[]")"
62
+
63
+ local domain_count
64
+ domain_count="$(echo "$domains" | python3 -c "import json,sys; print(len(json.load(sys.stdin)))" 2>/dev/null || echo "0")"
65
+
66
+ if [ "$domain_count" -le 1 ]; then
67
+ echo -e "${GREEN}✅ 当前分支仅涉及 $domain_count 个业务领域,无需拆分${NC}"
68
+ exit 0
69
+ fi
70
+
71
+ echo -e "${YELLOW}⚠️ 检测到 ${domain_count} 个业务领域${NC}"
72
+ echo ""
73
+
74
+ # Step 2: 获取拆分方案
75
+ echo -e "${CYAN}[2/4]${NC} 生成拆分方案..."
76
+ echo ""
77
+
78
+ # 获取 diff 文件列表
79
+ local fork_point
80
+ fork_point="$(git merge-base "$from_branch" HEAD 2>/dev/null || true)"
81
+ local changed_files
82
+ changed_files="$(git diff "$fork_point"..HEAD --name-only 2>/dev/null || git diff HEAD --name-only 2>/dev/null || true)"
83
+
84
+ # 显示拆分方案
85
+ echo -e "${CYAN} 拆分方案:${NC}"
86
+ echo ""
87
+
88
+ local branch_prefix
89
+ branch_prefix="$(echo "$CURRENT_BRANCH" | grep -oE '^(feat|fix|chore|refactor|docs|test|perf|style)/' || echo "feat/")"
90
+
91
+ # 为每个领域生成分支名和文件分配
92
+ local idx=0
93
+ local split_plan="["
94
+ while IFS= read -r domain_line; do
95
+ local domain_name
96
+ domain_name="$(echo "$domain_line" | python3 -c "import json,sys; d=json.loads(sys.stdin.read()); print(d['name'])" 2>/dev/null || echo "unknown")"
97
+
98
+ # 分配文件
99
+ if [ -n "$fork_point" ]; then
100
+ local domain_files
101
+ domain_files="$(git diff "$fork_point"..HEAD --name-only 2>/dev/null | head -5 || true)"
102
+ else
103
+ local domain_files=""
104
+ fi
105
+
106
+ local branch_name="${branch_prefix}${domain_name}"
107
+
108
+ echo -e " ${GREEN}$((idx+1)).${NC} 分支: ${YELLOW}${branch_name}${NC}"
109
+ echo " 领域: $domain_name"
110
+ echo " 文件: $(echo "$domain_files" | tr '\n' ' ' | head -c 80)..."
111
+
112
+ if [ "$idx" -gt 0 ]; then
113
+ split_plan="${split_plan},"
114
+ fi
115
+ split_plan="${split_plan}{\"branch\":\"${branch_name}\",\"domain\":\"${domain_name}\"}"
116
+
117
+ idx=$((idx + 1))
118
+ done <<< "$(echo "$domains" | python3 -c "
119
+ import json, sys
120
+ for d in json.load(sys.stdin):
121
+ print(json.dumps(d))
122
+ " 2>/dev/null)"
123
+
124
+ split_plan="${split_plan}]"
125
+
126
+ echo ""
127
+
128
+ # Step 3: 用户确认
129
+ echo -e "${CYAN}[3/4]${NC} 确认拆分方案..."
130
+ echo ""
131
+ echo -e "将创建 ${domain_count} 个新分支,当前分支保持不变。"
132
+ echo -e "${YELLOW}⚠️ 请确保当前没有未暂存的变更,或它们已经提交。${NC}"
133
+ echo ""
134
+ echo -n "是否执行拆分?(y/N): "
135
+ read -r confirm
136
+
137
+ if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ] && [ "$confirm" != "yes" ]; then
138
+ echo ""
139
+ echo -e "${YELLOW}⏹ 拆分已取消,当前分支保持不变。${NC}"
140
+ echo "提示:可以手动拆分后,使用独立分支提交。"
141
+ exit 0
142
+ fi
143
+
144
+ # Step 4: 执行拆分
145
+ echo ""
146
+ echo -e "${CYAN}[4/4]${NC} 正在执行拆分..."
147
+
148
+ # 备份:暂存当前分支未提交的变更
149
+ local has_stash=false
150
+ if [ -n "$(git status --porcelain 2>/dev/null)" ]; then
151
+ echo " 暂存未提交的变更..."
152
+ git stash push -m "reef-scope-split-backup-$(date +%Y%m%d%H%M%S)" 2>/dev/null || true
153
+ has_stash=true
154
+ fi
155
+
156
+ # 为每个领域创建分支
157
+ echo "$split_plan" | python3 -c "
158
+ import json, sys, subprocess, os
159
+
160
+ plan = json.loads(sys.stdin.read())
161
+ fork_point = '${fork_point}'
162
+ from_branch = '${from_branch}'
163
+ project_root = '${PROJECT_ROOT}'
164
+
165
+ for i, item in enumerate(plan):
166
+ branch = item['branch']
167
+ domain = item['domain']
168
+ print(f' 创建分支: {branch}...')
169
+ # 从基准分支创建新分支
170
+ result = subprocess.run(
171
+ ['git', 'checkout', '-b', branch, from_branch],
172
+ capture_output=True, text=True, cwd=project_root
173
+ )
174
+ if result.returncode != 0:
175
+ print(f' ⚠️ 创建分支 {branch} 失败: {result.stderr.strip()}')
176
+ continue
177
+
178
+ # 切换回当前分支
179
+ subprocess.run(['git', 'checkout', '${CURRENT_BRANCH}'], capture_output=True, cwd=project_root)
180
+ print(f' ✅ 分支 {branch} 创建完成')
181
+ " 2>/dev/null
182
+
183
+ # 恢复暂存
184
+ if [ "$has_stash" = true ]; then
185
+ echo " 恢复暂存的变更..."
186
+ git stash pop 2>/dev/null || true
187
+ fi
188
+
189
+ echo ""
190
+ echo -e "${GREEN}✅ 拆分完成!${NC}"
191
+ echo ""
192
+ echo "已创建的分支:"
193
+ echo "$split_plan" | python3 -c "
194
+ import json, sys
195
+ for item in json.loads(sys.stdin.read()):
196
+ print(f' • {item[\"branch\"]} ← 基于 {item[\"domain\"]} 领域')
197
+ " 2>/dev/null
198
+ echo ""
199
+ echo "当前分支 ${CURRENT_BRANCH} 保持不变。"
200
+ echo "可使用 'git checkout <分支名>' 切换到子分支继续工作。"
201
+ }
202
+
203
+ main "$@"
@@ -0,0 +1,14 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "bash ./sweep-mcp-hook.sh"
9
+ }
10
+ ]
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -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,14 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "hooks": [
6
+ {
7
+ "type": "command",
8
+ "command": "bash ./tide-session-preload.sh"
9
+ }
10
+ ]
11
+ }
12
+ ]
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # tide-session-preload.sh
3
+ # sessionStart hook for tide-discuss.
4
+ # Reads tide-data/sessions/.index.json and injects session summaries
5
+ # into the AI system context as TIDE_SESSIONS:N header + JSON lines.
6
+ # Falls back silently if .index.json doesn't exist.
7
+ # 使用 jq 替代 python3(避免 Python 进程启动开销)
8
+
9
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(pwd)}"
10
+ INDEX_FILE="${PROJECT_DIR}/tide-data/sessions/.index.json"
11
+
12
+ [ ! -f "$INDEX_FILE" ] && exit 0
13
+
14
+ jq -r '
15
+ "TIDE_SESSIONS:\(length)",
16
+ (.[] | {sessionId, status, brief, createdAt, featureId} | tojson)
17
+ ' "$INDEX_FILE" 2>/dev/null || true
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "github",
3
+ "domain": "code-hosting",
4
+ "label": "GitHub",
5
+ "description": "源码托管与协作",
6
+ "envStubs": [
7
+ {
8
+ "key": "GITHUB_PERSONAL_ACCESS_TOKEN",
9
+ "comment": "GitHub Personal Access Token — 从 https://github.com/settings/tokens 获取"
10
+ }
11
+ ],
12
+ "mcpServers": {
13
+ "github": {
14
+ "type": "stdio",
15
+ "command": "npx",
16
+ "args": ["-y", "dotenv-cli", "-e", ".env", "--", "docker", "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"]
17
+ }
18
+ },
19
+ "notes": "需要本地 Docker 环境"
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "figma",
3
+ "domain": "design-tools",
4
+ "label": "Figma",
5
+ "description": "原型设计与协作",
6
+ "envStubs": [
7
+ {
8
+ "key": "FIGMA_API_KEY",
9
+ "comment": "Figma Access Token — 从 Figma > Settings > Personal Access Tokens 获取"
10
+ }
11
+ ],
12
+ "mcpServers": {
13
+ "figma": {
14
+ "type": "stdio",
15
+ "command": "npx",
16
+ "args": ["-y", "dotenv-cli", "-e", ".env", "--", "npx", "-y", "figma-developer-mcp", "--stdio"]
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "context7",
3
+ "domain": "docs-reference",
4
+ "label": "Context7",
5
+ "description": "库/框架文档实时查询 — React、Next.js、Angular、Prisma、Django 等",
6
+ "envStubs": [
7
+ {
8
+ "key": "CONTEXT7_API_KEY",
9
+ "comment": "Context7 API Key(ctx7sk_ 开头)— 从 https://context7.com/dashboard 获取"
10
+ }
11
+ ],
12
+ "mcpServers": {
13
+ "context7": {
14
+ "type": "stdio",
15
+ "command": "npx",
16
+ "args": [
17
+ "-y",
18
+ "dotenv-cli",
19
+ "-e",
20
+ ".env",
21
+ "--",
22
+ "npx",
23
+ "-y",
24
+ "@upstash/context7-mcp"
25
+ ]
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "playwright",
3
+ "domain": "e2e-testing",
4
+ "label": "Playwright",
5
+ "description": "浏览器自动化 E2E 测试 — 通过 Playwright MCP 操作浏览器执行测试步骤",
6
+ "mcpServers": {
7
+ "playwright": {
8
+ "type": "sse",
9
+ "url": "http://localhost:54321/sse"
10
+ }
11
+ },
12
+ "mcpSkills": ["deepstorm-mcp-playwright-read"]
13
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "feishu-wiki",
3
+ "domain": "knowledge-base",
4
+ "label": "飞书知识库",
5
+ "description": "文档协作与知识库",
6
+ "envStubs": [
7
+ {
8
+ "key": "FEISHU_WEBHOOK_TOKEN",
9
+ "comment": "飞书机器人 Token — 从飞书开放平台 > 应用凭证获取"
10
+ }
11
+ ],
12
+ "mcpServers": {
13
+ "feishu-wiki": {
14
+ "type": "stdio",
15
+ "command": "npx",
16
+ "args": ["-y", "dotenv-cli", "-e", ".env", "--", "npx", "-y", "feishu-wiki@latest"]
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "jira",
3
+ "domain": "project-management",
4
+ "label": "Jira",
5
+ "description": "任务跟踪与敏捷管理",
6
+ "envStubs": [
7
+ {
8
+ "key": "JIRA_INSTANCE_URL",
9
+ "comment": "Jira 实例 URL,如 https://your-domain.atlassian.net"
10
+ },
11
+ {
12
+ "key": "JIRA_USER_EMAIL",
13
+ "comment": "登录 Jira 时使用的邮箱地址"
14
+ },
15
+ {
16
+ "key": "JIRA_API_KEY",
17
+ "comment": "Jira API Token — 从 https://id.atlassian.com/manage/api-tokens 获取"
18
+ }
19
+ ],
20
+ "mcpServers": {
21
+ "jira": {
22
+ "type": "stdio",
23
+ "command": "npx",
24
+ "args": ["-y", "dotenv-cli", "-e", ".env", "--", "npx", "-y", "jira-mcp", "--stdio"]
25
+ }
26
+ }
27
+ }