@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
|
@@ -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,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,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
|
+
}
|