@devflow-tools/cli 0.15.0 → 0.16.1
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/dist/commands/benchmark-cmd.d.ts +17 -4
- package/dist/commands/benchmark-cmd.d.ts.map +1 -1
- package/dist/commands/benchmark-cmd.js +71 -14
- package/dist/commands/benchmark-cmd.js.map +1 -1
- package/dist/commands/connect.d.ts +0 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +4 -10
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/context.d.ts +2 -2
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +5 -3
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/db.d.ts +25 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +258 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/docs.d.ts +20 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +37 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.d.ts +59 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3912 -50
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/index-cmd.d.ts +1 -0
- package/dist/commands/index-cmd.d.ts.map +1 -1
- package/dist/commands/index-cmd.js +7 -0
- package/dist/commands/index-cmd.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts +2 -1
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +11 -8
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/memory.d.ts +17 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +22 -3
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/plugin-loader.d.ts +1 -1
- package/dist/commands/plugin-loader.d.ts.map +1 -1
- package/dist/commands/plugin-loader.js +1 -1
- package/dist/commands/plugin-loader.js.map +1 -1
- package/dist/commands/plugin-memory-hints.d.ts +23 -0
- package/dist/commands/plugin-memory-hints.d.ts.map +1 -0
- package/dist/commands/plugin-memory-hints.js +58 -0
- package/dist/commands/plugin-memory-hints.js.map +1 -0
- package/dist/commands/reset.d.ts +32 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +316 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/server.js +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +2 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/start.js +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +33 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/index.js +225 -96
- package/dist/index.js.map +1 -1
- package/dist/lib/plugin-setup.d.ts +3 -4
- package/dist/lib/plugin-setup.d.ts.map +1 -1
- package/dist/lib/plugin-setup.js +165 -19
- package/dist/lib/plugin-setup.js.map +1 -1
- package/dist/lib/with-server.js +1 -1
- package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
- package/dist/plugin-files/dist/command-registry.json +34 -36
- package/dist/plugin-files/dist/hooks/enforcer-summary.js +6 -0
- package/dist/plugin-files/dist/hooks/hook-client.js +6 -0
- package/dist/plugin-files/dist/hooks/hook-daemon.js +14 -0
- package/dist/plugin-files/dist/hooks/post-tool-use-failure.js +2 -0
- package/dist/plugin-files/dist/hooks/post-tool-use.js +3 -0
- package/dist/plugin-files/dist/hooks/pre-compact.js +3 -0
- package/dist/plugin-files/dist/hooks/pre-tool-use.js +2 -0
- package/dist/plugin-files/dist/hooks/server-bootstrap.js +109 -0
- package/dist/plugin-files/dist/hooks/session-end.js +2 -0
- package/dist/plugin-files/dist/hooks/stop.js +2 -0
- package/dist/plugin-files/dist/hooks/user-prompt-submit.js +2 -0
- package/dist/plugin-files/dist/skills/devflow:graphql/SKILL.md +2 -4
- package/dist/plugin-files/dist/skills/devflow:nest/SKILL.md +4 -4
- package/dist/plugin-files/dist/skills/devflow:nextjs/SKILL.md +4 -4
- package/dist/plugin-files/dist/skills/devflow:react/SKILL.md +6 -8
- package/dist/plugin-files/dist/skills/devflow:tailwind/SKILL.md +4 -2
- package/dist/plugin-files/dist/skills/devflow:vue/SKILL.md +2 -4
- package/dist/plugin-files/hooks/post-tool-use +2 -2
- package/dist/plugin-files/hooks/post-tool-use-failure +2 -2
- package/dist/plugin-files/hooks/pre-compact +2 -2
- package/dist/plugin-files/hooks/pre-tool-use +4 -4
- package/dist/plugin-files/hooks/session-end +2 -2
- package/dist/plugin-files/hooks/session-start +160 -77
- package/dist/plugin-files/hooks/stop +2 -8
- package/dist/plugin-files/hooks/user-prompt-submit +2 -2
- package/dist/plugin-files/package.json +15 -2
- package/dist/plugin-files/skills/devflow/SKILL.md +20 -0
- package/dist/plugin-files/skills/devflow:animation/SKILL.md +38 -0
- package/dist/plugin-files/skills/devflow:context/SKILL.md +63 -0
- package/dist/plugin-files/skills/devflow:css/SKILL.md +38 -0
- package/dist/plugin-files/skills/devflow:docker/SKILL.md +42 -0
- package/dist/plugin-files/skills/devflow:doctor/SKILL.md +17 -0
- package/dist/plugin-files/skills/devflow:electron/SKILL.md +42 -0
- package/dist/plugin-files/skills/devflow:git/SKILL.md +42 -0
- package/dist/plugin-files/skills/devflow:graph/SKILL.md +55 -0
- package/dist/plugin-files/skills/devflow:graphql/SKILL.md +41 -0
- package/dist/plugin-files/skills/devflow:knowledge/SKILL.md +55 -0
- package/dist/plugin-files/skills/devflow:memory/SKILL.md +54 -0
- package/dist/plugin-files/skills/devflow:nest/SKILL.md +41 -0
- package/dist/plugin-files/skills/devflow:nextjs/SKILL.md +38 -0
- package/dist/plugin-files/skills/devflow:performance/SKILL.md +42 -0
- package/dist/plugin-files/skills/devflow:react/SKILL.md +50 -0
- package/dist/plugin-files/skills/devflow:start/SKILL.md +50 -0
- package/dist/plugin-files/skills/devflow:tailwind/SKILL.md +38 -0
- package/dist/plugin-files/skills/devflow:taro/SKILL.md +41 -0
- package/dist/plugin-files/skills/devflow:ui-layout/SKILL.md +38 -0
- package/dist/plugin-files/skills/devflow:vue/SKILL.md +45 -0
- package/dist/plugin-files/skills/devflow:workflow/SKILL.md +55 -0
- package/package.json +27 -27
- package/dist/commands/dashboard.d.ts +0 -3
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -10
- package/dist/commands/dashboard.js.map +0 -1
|
@@ -3,11 +3,12 @@ name: devflow:tailwind
|
|
|
3
3
|
description: Tailwind 专家 — 响应式设计、主题定制、Purge 检查、Utility 审查
|
|
4
4
|
required_mcp_tools:
|
|
5
5
|
- tailwind_new_component
|
|
6
|
+
- tailwind_optimize_classes
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
<HARD-GATE>
|
|
9
10
|
收到 devflow:tailwind 时,必须先调用以下 MCP 工具之一:
|
|
10
|
-
tailwind_new_component
|
|
11
|
+
tailwind_new_component / tailwind_optimize_classes
|
|
11
12
|
</HARD-GATE>
|
|
12
13
|
|
|
13
14
|
## MANDATORY FIRST STEP - Skill Registration
|
|
@@ -15,11 +16,12 @@ tailwind_new_component
|
|
|
15
16
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
16
17
|
|
|
17
18
|
```bash
|
|
18
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:tailwind","required_mcp_tools":["tailwind_new_component"],"description":"devflow:tailwind skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
19
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:tailwind","required_mcp_tools":["tailwind_new_component","tailwind_optimize_classes"],"description":"devflow:tailwind skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
22
23
|
- `mcp__devflow__tailwind_new_component`
|
|
24
|
+
- `mcp__devflow__tailwind_optimize_classes`
|
|
23
25
|
|
|
24
26
|
**Never use direct tools** (Read, Write, Edit, Bash, Grep, etc.) for tasks that can be handled by the MCP tools above.
|
|
25
27
|
|
|
@@ -3,13 +3,12 @@ name: devflow:vue
|
|
|
3
3
|
description: Vue 3 专家 — Bug 诊断、Composition API、响应式调试、组件重构
|
|
4
4
|
required_mcp_tools:
|
|
5
5
|
- vue_diagnose_bug
|
|
6
|
-
- vue_new_component
|
|
7
6
|
- vue_debug_reactivity
|
|
8
7
|
---
|
|
9
8
|
|
|
10
9
|
<HARD-GATE>
|
|
11
10
|
收到 devflow:vue 时,必须先调用以下 MCP 工具之一:
|
|
12
|
-
vue_diagnose_bug /
|
|
11
|
+
vue_diagnose_bug / vue_debug_reactivity
|
|
13
12
|
</HARD-GATE>
|
|
14
13
|
|
|
15
14
|
## MANDATORY FIRST STEP - Skill Registration
|
|
@@ -17,12 +16,11 @@ vue_diagnose_bug / vue_new_component / vue_debug_reactivity
|
|
|
17
16
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
18
17
|
|
|
19
18
|
```bash
|
|
20
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:vue","required_mcp_tools":["vue_diagnose_bug","
|
|
19
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:vue","required_mcp_tools":["vue_diagnose_bug","vue_debug_reactivity"],"description":"devflow:vue skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
21
20
|
```
|
|
22
21
|
|
|
23
22
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
24
23
|
- `mcp__devflow__vue_diagnose_bug`
|
|
25
|
-
- `mcp__devflow__vue_new_component`
|
|
26
24
|
- `mcp__devflow__vue_debug_reactivity`
|
|
27
25
|
|
|
28
26
|
**Never use direct tools** (Read, Write, Edit, Bash, Grep, etc.) for tasks that can be handled by the MCP tools above.
|
|
@@ -11,10 +11,10 @@ INPUT="$(cat)"
|
|
|
11
11
|
|
|
12
12
|
if [ -f "$CLIENT_JS" ]; then
|
|
13
13
|
node "$CLIENT_JS" post-tool-use "$INPUT" 2>/dev/null || {
|
|
14
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
14
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
15
15
|
}
|
|
16
16
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
17
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
17
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
18
18
|
fi
|
|
19
19
|
|
|
20
20
|
exit 0
|
|
@@ -10,10 +10,10 @@ INPUT="$(cat)"
|
|
|
10
10
|
|
|
11
11
|
if [ -f "$CLIENT_JS" ]; then
|
|
12
12
|
node "$CLIENT_JS" post-tool-use-failure "$INPUT" 2>/dev/null || {
|
|
13
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
13
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
14
14
|
}
|
|
15
15
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
16
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
16
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
17
17
|
fi
|
|
18
18
|
|
|
19
19
|
exit 0
|
|
@@ -10,10 +10,10 @@ INPUT="$(cat)"
|
|
|
10
10
|
|
|
11
11
|
if [ -f "$CLIENT_JS" ]; then
|
|
12
12
|
node "$CLIENT_JS" pre-compact "$INPUT" 2>/dev/null || {
|
|
13
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
13
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
14
14
|
}
|
|
15
15
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
16
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
16
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
17
17
|
fi
|
|
18
18
|
|
|
19
19
|
exit 0
|
|
@@ -11,13 +11,13 @@ if [ -f "$CLIENT_JS" ]; then
|
|
|
11
11
|
node "$CLIENT_JS" pre-tool-use || {
|
|
12
12
|
echo '[devflow] hook-client failed, trying fallback' >&2
|
|
13
13
|
if [ -f "$FALLBACK_JS" ]; then
|
|
14
|
-
node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
14
|
+
DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unreachable). Run devflow doctor for details."}}'
|
|
15
15
|
else
|
|
16
|
-
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
16
|
+
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unreachable). Run devflow doctor for details."}}'
|
|
17
17
|
fi
|
|
18
18
|
}
|
|
19
19
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
20
|
-
node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
20
|
+
DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unavailable). Run devflow doctor for details."}}'
|
|
21
21
|
else
|
|
22
|
-
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
22
|
+
echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unavailable). Run devflow doctor for details."}}'
|
|
23
23
|
fi
|
|
@@ -10,10 +10,10 @@ INPUT="$(cat)"
|
|
|
10
10
|
|
|
11
11
|
if [ -f "$CLIENT_JS" ]; then
|
|
12
12
|
node "$CLIENT_JS" session-end "$INPUT" 2>/dev/null || {
|
|
13
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
13
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
14
14
|
}
|
|
15
15
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
16
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
16
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
17
17
|
fi
|
|
18
18
|
|
|
19
19
|
exit 0
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
+
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
5
|
+
SESSION_START_INPUT="$(cat)"
|
|
6
|
+
|
|
4
7
|
# Try to get project summary from devflow doctor
|
|
5
8
|
SUMMARY=""
|
|
6
9
|
DOCTOR_OUTPUT=""
|
|
@@ -26,7 +29,6 @@ fi
|
|
|
26
29
|
|
|
27
30
|
# Generate session token for MCP Gateway authentication
|
|
28
31
|
# Clean up stale receipt from previous session
|
|
29
|
-
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
30
32
|
RECEIPT_DIR="${TMPDIR:-/tmp}/.devflow-receipts"
|
|
31
33
|
mkdir -p "$RECEIPT_DIR" 2>/dev/null || true
|
|
32
34
|
SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "default")
|
|
@@ -34,48 +36,10 @@ RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
|
|
|
34
36
|
OVERRIDE_FILE="$RECEIPT_DIR/${SESSION_ID}.override"
|
|
35
37
|
rm -f "$RECEIPT_FILE" "$OVERRIDE_FILE" 2>/dev/null || true
|
|
36
38
|
|
|
37
|
-
# ── Clean up stale execution from previous session (if stop hook didn't fire) ──
|
|
38
|
-
EXEC_FILE="${HOME}/.devflow/current-execution-id"
|
|
39
|
-
SKILL_FILE="${HOME}/.devflow/current-skill.json"
|
|
40
|
-
if [ -f "$EXEC_FILE" ]; then
|
|
41
|
-
EXEC_ID=$(cat "$EXEC_FILE" 2>/dev/null || echo "")
|
|
42
|
-
if [ -n "$EXEC_ID" ]; then
|
|
43
|
-
NOW_MS="$(date +%s)000"
|
|
44
|
-
python3 -c "
|
|
45
|
-
import urllib.request, json
|
|
46
|
-
try:
|
|
47
|
-
payload = json.dumps({
|
|
48
|
-
'executionId': '${EXEC_ID}',
|
|
49
|
-
'finishedAt': ${NOW_MS},
|
|
50
|
-
'status': 'completed',
|
|
51
|
-
'summary': {
|
|
52
|
-
'totalToolCalls': 0,
|
|
53
|
-
'mcpToolCalls': 0,
|
|
54
|
-
'directToolCalls': 0,
|
|
55
|
-
'subagentCount': 0,
|
|
56
|
-
'totalTokens': 0,
|
|
57
|
-
'totalDuration': 0,
|
|
58
|
-
'mcpComplianceRate': 0
|
|
59
|
-
}
|
|
60
|
-
}).encode()
|
|
61
|
-
req = urllib.request.Request(
|
|
62
|
-
'http://127.0.0.1:13337/api/telemetry/skill-execution/complete',
|
|
63
|
-
data=payload,
|
|
64
|
-
headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
|
|
65
|
-
method='POST'
|
|
66
|
-
)
|
|
67
|
-
urllib.request.urlopen(req, timeout=5)
|
|
68
|
-
except:
|
|
69
|
-
pass
|
|
70
|
-
" 2>/dev/null || true
|
|
71
|
-
fi
|
|
72
|
-
rm -f "$EXEC_FILE" "$SKILL_FILE" 2>/dev/null || true
|
|
73
|
-
fi
|
|
74
|
-
|
|
75
39
|
# Determine plugin root directory (same way as superpowers)
|
|
76
40
|
if [ -z "${CLAUDE_PLUGIN_ROOT:-}" ]; then
|
|
77
41
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
78
|
-
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}
|
|
42
|
+
PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
79
43
|
else
|
|
80
44
|
PLUGIN_ROOT="$CLAUDE_PLUGIN_ROOT"
|
|
81
45
|
fi
|
|
@@ -92,13 +56,32 @@ else
|
|
|
92
56
|
GLOBAL_CONSTRAINT="DevFlow Constitution 文件未找到。使用 /devflow: 命令时请优先调用 MCP 工具。"
|
|
93
57
|
fi
|
|
94
58
|
|
|
59
|
+
# Read the active rule/gate counts from the canonical global database.
|
|
60
|
+
GATE_COUNT=4
|
|
61
|
+
RULE_COUNT=""
|
|
62
|
+
ENFORCER_SUMMARY_JS="${PLUGIN_ROOT}/dist/hooks/enforcer-summary.js"
|
|
63
|
+
if [ -f "$ENFORCER_SUMMARY_JS" ] && command -v node >/dev/null 2>&1; then
|
|
64
|
+
ENFORCER_SUMMARY=$(node "$ENFORCER_SUMMARY_JS" 2>/dev/null || echo "")
|
|
65
|
+
if [ -n "$ENFORCER_SUMMARY" ] && command -v python3 >/dev/null 2>&1; then
|
|
66
|
+
PARSED_COUNTS=$(printf '%s' "$ENFORCER_SUMMARY" | python3 -c "import json,sys; d=json.load(sys.stdin); g=d.get('gateCount'); r=d.get('ruleCount'); print(f'{g}|{r}' if isinstance(g,int) and isinstance(r,int) else '')" 2>/dev/null || echo "")
|
|
67
|
+
if [[ "$PARSED_COUNTS" =~ ^[0-9]+\|[0-9]+$ ]]; then
|
|
68
|
+
GATE_COUNT="${PARSED_COUNTS%%|*}"
|
|
69
|
+
RULE_COUNT="${PARSED_COUNTS##*|}"
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
fi
|
|
73
|
+
GATE_DETAIL="启用规则数未知"
|
|
74
|
+
if [ -n "$RULE_COUNT" ]; then
|
|
75
|
+
GATE_DETAIL="启用规则: ${RULE_COUNT}"
|
|
76
|
+
fi
|
|
77
|
+
|
|
95
78
|
# Append Gateway status to summary
|
|
96
79
|
GATEWAY_STATUS="\n\n━━━━━━ DevFlow Gateway ━━━━━━\n"
|
|
97
80
|
# Check if devflow MCP server is configured (token will be auto-generated by ensureSessionToken)
|
|
98
81
|
if [ -f ~/.claude/.mcp.json ] && grep -q '"devflow"' ~/.claude/.mcp.json 2>/dev/null; then
|
|
99
|
-
GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置\nGate 层数:
|
|
82
|
+
GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置\nGate 层数: ${GATE_COUNT} (${GATE_DETAIL})\n"
|
|
100
83
|
elif [ -f .mcp.json ] && grep -q '"devflow"' .mcp.json 2>/dev/null; then
|
|
101
|
-
GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置(项目级)\nGate 层数:
|
|
84
|
+
GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置(项目级)\nGate 层数: ${GATE_COUNT} (${GATE_DETAIL})\n"
|
|
102
85
|
else
|
|
103
86
|
GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🔴 未配置 DevFlow MCP Server\n请将 devflow MCP 配置加入 .mcp.json\n"
|
|
104
87
|
fi
|
|
@@ -112,13 +95,13 @@ MCP_PROTOCOL="
|
|
|
112
95
|
当用户使用 /devflow: 开头的技能时(如 /devflow:react、/devflow:vue、/devflow:context 等),你必须按以下流程操作:
|
|
113
96
|
|
|
114
97
|
### Step 1: 获取上下文(必须先执行)
|
|
115
|
-
调用 mcp__devflow__get_project_context,参数格式:{\"query\": \"用户的问题描述\"}
|
|
98
|
+
调用 mcp__devflow__get_project_context,参数格式:{\"query\": \"用户的问题描述\", \"projectRoot\": \"\${CLAUDE_PROJECT_DIR}\"}
|
|
116
99
|
这个工具返回项目中的相关文件、符号、风险提示和下一步建议。
|
|
117
100
|
不要跳过这一步。不要用 Explore、Agent、Grep 或 Bash 代替。
|
|
118
101
|
|
|
119
102
|
### Step 2: 按需调用领域工具
|
|
120
103
|
根据技能类型调用对应的 MCP 工具:
|
|
121
|
-
- React 性能问题 → mcp__devflow__react_audit_performance
|
|
104
|
+
- React 性能问题 → mcp__devflow__react_audit_performance(参数:{\"projectRoot\": \"\${CLAUDE_PROJECT_DIR}\"})
|
|
122
105
|
- React Bug → mcp__devflow__react_diagnose_bug
|
|
123
106
|
- React Hooks 审查 → mcp__devflow__react_review_hooks
|
|
124
107
|
- Vue 问题 → mcp__devflow__vue_diagnose_bug
|
|
@@ -131,46 +114,146 @@ MCP_PROTOCOL="
|
|
|
131
114
|
|
|
132
115
|
### 铁律
|
|
133
116
|
- 永远不要用 Explore、Agent、Grep 或 Glob 替代 MCP 工具的第一步上下文获取
|
|
134
|
-
-
|
|
117
|
+
- Every mcp__devflow__ tool MUST pass projectRoot = \${CLAUDE_PROJECT_DIR}; missing projectRoot is rejected; no cwd fallback.
|
|
135
118
|
- 如果 MCP 工具返回错误,重试一次;再失败则回退到直接读文件"
|
|
136
119
|
|
|
137
|
-
|
|
120
|
+
MEMORY_DISTILL="
|
|
138
121
|
|
|
139
|
-
|
|
140
|
-
ESCAPED=$(echo "$SUMMARY" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
122
|
+
Next session instruction: call mcp__devflow__memory_request_distill once at session start; it safely reports when no memory events are pending."
|
|
141
123
|
|
|
142
|
-
|
|
143
|
-
|
|
124
|
+
DEVFLOW_DAEMON_REACHABLE=0
|
|
125
|
+
run_lifecycle() {
|
|
126
|
+
local PROJECT_HASH=""
|
|
127
|
+
local state_dir=""
|
|
128
|
+
local log_dir="${HOME}/.devflow/logs"
|
|
129
|
+
local fallback_dir="${TMPDIR:-/tmp}"
|
|
130
|
+
|
|
131
|
+
if command -v shasum >/dev/null 2>&1; then
|
|
132
|
+
PROJECT_HASH=$(printf '%s' "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16) || PROJECT_HASH=""
|
|
133
|
+
fi
|
|
134
|
+
[[ "$PROJECT_HASH" =~ ^[0-9a-f]{16}$ ]] || PROJECT_HASH=""
|
|
135
|
+
|
|
136
|
+
if [ -n "${DEVFLOW_STATE_DIR:-}" ]; then
|
|
137
|
+
state_dir="$DEVFLOW_STATE_DIR"
|
|
138
|
+
elif [ -n "$PROJECT_HASH" ]; then
|
|
139
|
+
state_dir="${HOME}/.devflow/state/${PROJECT_HASH}"
|
|
140
|
+
fi
|
|
141
|
+
if [ -n "$state_dir" ]; then
|
|
142
|
+
rm -f "${state_dir}/current-execution-id" "${state_dir}/current-skill.json" 2>/dev/null || true
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
if mkdir -p "$log_dir" 2>/dev/null; then
|
|
146
|
+
DAEMON_LOG="${log_dir}/hook-daemon-${PROJECT_HASH:-fallback}.log"
|
|
147
|
+
SERVER_LOG="${HOME}/.devflow/logs/server.log"
|
|
148
|
+
elif [ -d "$fallback_dir" ]; then
|
|
149
|
+
DAEMON_LOG="${fallback_dir}/devflow-hook-daemon-${PROJECT_HASH:-fallback}.log"
|
|
150
|
+
SERVER_LOG="${fallback_dir}/devflow-server.log"
|
|
151
|
+
else
|
|
152
|
+
DAEMON_LOG="/dev/null"
|
|
153
|
+
SERVER_LOG="/dev/null"
|
|
154
|
+
fi
|
|
155
|
+
|
|
156
|
+
DAEMON_JS="${PLUGIN_ROOT}/dist/hooks/hook-daemon.js"
|
|
157
|
+
CLIENT_JS="${PLUGIN_ROOT}/dist/hooks/hook-client.js"
|
|
144
158
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
159
|
+
register_session() {
|
|
160
|
+
local suppress_fallback="${1:-1}"
|
|
161
|
+
[ -n "$SESSION_START_INPUT" ] || return 0
|
|
162
|
+
[ -f "$CLIENT_JS" ] || return 1
|
|
163
|
+
if DEVFLOW_HOOK_CLIENT_TIMEOUT_MS=250 \
|
|
164
|
+
DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS=50 \
|
|
165
|
+
DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG="$suppress_fallback" \
|
|
166
|
+
node "$CLIENT_JS" session-start "$SESSION_START_INPUT" >/dev/null 2>> "$DAEMON_LOG"; then
|
|
167
|
+
DEVFLOW_DAEMON_REACHABLE=1
|
|
168
|
+
return 0
|
|
169
|
+
fi
|
|
170
|
+
return 1
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if [ -n "$SESSION_START_INPUT" ] && register_session 1; then
|
|
174
|
+
:
|
|
175
|
+
elif [ -f "$DAEMON_JS" ] && command -v nohup >/dev/null 2>&1 && command -v node >/dev/null 2>&1; then
|
|
176
|
+
if [ -n "$SESSION_START_INPUT" ]; then
|
|
177
|
+
nohup node "$DAEMON_JS" "$PROJECT_ROOT" "$SESSION_START_INPUT" </dev/null >> "$DAEMON_LOG" 2>&1 &
|
|
178
|
+
else
|
|
179
|
+
nohup node "$DAEMON_JS" "$PROJECT_ROOT" </dev/null >> "$DAEMON_LOG" 2>&1 &
|
|
180
|
+
fi
|
|
181
|
+
DAEMON_PID=$!
|
|
182
|
+
echo "[devflow] Hook daemon started for ${PROJECT_ROOT} (PID ${DAEMON_PID})" >&2 || true
|
|
183
|
+
|
|
184
|
+
if [ -n "$SESSION_START_INPUT" ]; then
|
|
185
|
+
for _ in 1 2 3 4 5 6 7 8; do
|
|
186
|
+
register_session 1 && break
|
|
187
|
+
sleep 0.05
|
|
188
|
+
done
|
|
189
|
+
fi
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
if [ -n "$SESSION_START_INPUT" ] && [ "$DEVFLOW_DAEMON_REACHABLE" != "1" ]; then
|
|
193
|
+
register_session 0 || true
|
|
194
|
+
fi
|
|
195
|
+
|
|
196
|
+
SERVER_BOOTSTRAP_JS="${PLUGIN_ROOT}/dist/hooks/server-bootstrap.js"
|
|
197
|
+
if [ -f "$SERVER_BOOTSTRAP_JS" ] && command -v nohup >/dev/null 2>&1 && command -v node >/dev/null 2>&1; then
|
|
198
|
+
nohup node "$SERVER_BOOTSTRAP_JS" </dev/null >> "$SERVER_LOG" 2>&1 &
|
|
153
199
|
fi
|
|
154
|
-
|
|
155
|
-
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
run_lifecycle || true
|
|
203
|
+
|
|
204
|
+
DEGRADED_CONTEXT=""
|
|
205
|
+
if [ "$DEVFLOW_DAEMON_REACHABLE" != "1" ]; then
|
|
206
|
+
DEGRADED_CONTEXT="
|
|
207
|
+
|
|
208
|
+
WARNING: DevFlow is in degraded mode (daemon unreachable): 4-Gate enforcement is unavailable, memory prefetch cache is unavailable, and daemon-shared Hook state is unavailable. Run devflow doctor for details."
|
|
156
209
|
fi
|
|
157
210
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
211
|
+
MEMORY_SNAPSHOT="## Project memory\n本项目暂无记忆"
|
|
212
|
+
CONFIG_FILE="${PROJECT_ROOT}/.devflow/config.json"
|
|
213
|
+
MEMORY_RESPONSE=""
|
|
214
|
+
if [ -f "${CLIENT_JS:-}" ] && command -v node >/dev/null 2>&1; then
|
|
215
|
+
MEMORY_RESPONSE=$(DEVFLOW_HOOK_CLIENT_TIMEOUT_MS=1000 node "$CLIENT_JS" memory-snapshot </dev/null 2>/dev/null || echo "")
|
|
216
|
+
fi
|
|
217
|
+
if command -v python3 >/dev/null 2>&1; then
|
|
218
|
+
MEMORY_SNAPSHOT=$(DEVFLOW_MEMORY_RESPONSE="$MEMORY_RESPONSE" python3 - "$CONFIG_FILE" 2>/dev/null <<'PY'
|
|
219
|
+
import json,os,sys
|
|
220
|
+
try: cfg=json.load(open(sys.argv[1])).get('sessionStart',{}).get('injectMemories',True)
|
|
221
|
+
except Exception: cfg=True
|
|
222
|
+
if cfg is False: print(''); raise SystemExit
|
|
223
|
+
try: response=json.loads(os.environ.get('DEVFLOW_MEMORY_RESPONSE',''))
|
|
224
|
+
except Exception: response={}
|
|
225
|
+
print(response.get('markdown') or '## Project memory\n本项目暂无记忆')
|
|
226
|
+
PY
|
|
227
|
+
) || MEMORY_SNAPSHOT="## Project memory\n本项目暂无记忆"
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
ONBOARDING_SNAPSHOT=""
|
|
231
|
+
ONBOARDING_FILE="${PROJECT_ROOT}/.devflow/onboarding-pack.json"
|
|
232
|
+
if [ -f "$ONBOARDING_FILE" ] && command -v python3 >/dev/null 2>&1; then
|
|
233
|
+
ONBOARDING_SNAPSHOT=$(python3 - "$ONBOARDING_FILE" 2>/dev/null <<'PY'
|
|
234
|
+
import json,sys
|
|
235
|
+
def clean(value): return ' '.join(str(value).split())[:120]
|
|
236
|
+
try: data=json.load(open(sys.argv[1]))
|
|
237
|
+
except Exception: raise SystemExit
|
|
238
|
+
modules=[clean(item.get('name','')) for item in data.get('keyModules',[])[:6] if item.get('name')]
|
|
239
|
+
layers=[f"{clean(item.get('name',''))} ({int(item.get('files',0))} files)" for item in data.get('architectureLayers',[])[:6] if item.get('name')]
|
|
240
|
+
if modules or layers:
|
|
241
|
+
print('## Project map (auto-injected)')
|
|
242
|
+
if modules: print('Key modules: ' + ', '.join(modules))
|
|
243
|
+
if layers: print('Architecture: ' + ', '.join(layers))
|
|
244
|
+
PY
|
|
245
|
+
) || ONBOARDING_SNAPSHOT=""
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
SUMMARY="${SUMMARY}${DEGRADED_CONTEXT}${MEMORY_DISTILL}\n\n${ONBOARDING_SNAPSHOT}\n\n${MEMORY_SNAPSHOT}${MCP_PROTOCOL}${GLOBAL_CONSTRAINT}${GATEWAY_STATUS}"
|
|
249
|
+
|
|
250
|
+
if command -v python3 >/dev/null 2>&1 \
|
|
251
|
+
&& ESCAPED=$(printf '%s\n' "$SUMMARY" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))" 2>/dev/null); then
|
|
252
|
+
:
|
|
253
|
+
else
|
|
254
|
+
ESCAPED='"Next session instruction: call mcp__devflow__memory_request_distill once at session start; it safely reports when no memory events are pending."'
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": %s\n }\n}\n' "$ESCAPED"
|
|
175
258
|
|
|
176
259
|
exit 0
|
|
@@ -11,19 +11,13 @@ if [ -f "$CLIENT_JS" ]; then
|
|
|
11
11
|
node "$CLIENT_JS" stop </dev/null 2>/dev/null || true
|
|
12
12
|
fi
|
|
13
13
|
|
|
14
|
-
# 2.
|
|
15
|
-
DAEMON_PID=$(pgrep -f "hook-daemon.js" 2>/dev/null || true)
|
|
16
|
-
if [ -n "$DAEMON_PID" ]; then
|
|
17
|
-
kill "$DAEMON_PID" 2>/dev/null || true
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
# 3. Run existing stop.js cleanup (session close, memory extraction)
|
|
14
|
+
# 2. Run existing stop.js cleanup (session close, memory extraction)
|
|
21
15
|
STOP_JS="$PLUGIN_ROOT/dist/hooks/stop.js"
|
|
22
16
|
if [ -f "$STOP_JS" ]; then
|
|
23
17
|
node "$STOP_JS" 2>/dev/null || true
|
|
24
18
|
fi
|
|
25
19
|
|
|
26
|
-
#
|
|
20
|
+
# 3. Clean up stale receipt files for this project
|
|
27
21
|
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
28
22
|
SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "")
|
|
29
23
|
RECEIPT_FILE="${TMPDIR:-/tmp}/.devflow-receipts/${SESSION_ID}.json"
|
|
@@ -10,10 +10,10 @@ INPUT="$(cat)"
|
|
|
10
10
|
|
|
11
11
|
if [ -f "$CLIENT_JS" ]; then
|
|
12
12
|
node "$CLIENT_JS" user-prompt-submit "$INPUT" 2>/dev/null || {
|
|
13
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
13
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
14
14
|
}
|
|
15
15
|
elif [ -f "$FALLBACK_JS" ]; then
|
|
16
|
-
echo "$INPUT" | node "$FALLBACK_JS" 2>/dev/null || true
|
|
16
|
+
echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
|
|
17
17
|
fi
|
|
18
18
|
|
|
19
19
|
exit 0
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "DevFlow — Developer Intelligence Platform for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "npx tsx scripts/inject-gates.ts",
|
|
8
8
|
"deploy": "npx tsx scripts/inject-gates.ts --deploy"
|
|
9
9
|
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@devflow-tools/database": "0.16.0",
|
|
12
|
+
"@devflow-tools/memory-engine": "0.16.1",
|
|
13
|
+
"@devflow-tools/sdk": "0.16.1",
|
|
14
|
+
"@devflow-tools/telemetry": "0.16.1",
|
|
15
|
+
"@devflow-tools/workflow-engine": "0.16.1"
|
|
16
|
+
},
|
|
17
|
+
"allowScripts": {
|
|
18
|
+
"better-sqlite3@12.11.1": true,
|
|
19
|
+
"sharp@0.32.6": true
|
|
20
|
+
},
|
|
10
21
|
"devDependencies": {
|
|
11
|
-
"@devflow-tools/mcp-server": "0.
|
|
22
|
+
"@devflow-tools/mcp-server": "0.16.1"
|
|
12
23
|
},
|
|
13
24
|
"keywords": [
|
|
14
25
|
"pi-package",
|
|
@@ -23,6 +34,8 @@
|
|
|
23
34
|
]
|
|
24
35
|
},
|
|
25
36
|
"files": [
|
|
37
|
+
".claude-plugin",
|
|
38
|
+
"CLAUDE.md",
|
|
26
39
|
"dist",
|
|
27
40
|
"hooks",
|
|
28
41
|
"hooks.json",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devflow
|
|
3
|
+
description: DevFlow — 项目开发智能平台。代码检索、图谱、记忆、工作流一站式工具集。
|
|
4
|
+
required_mcp_tools: []
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# DevFlow
|
|
8
|
+
|
|
9
|
+
你已接入 DevFlow 开发智能平台。收到 /devflow: 前缀命令时,只做一件事:调用对应的 MCP 工具。
|
|
10
|
+
|
|
11
|
+
| 命令 | 只调用这个工具 |
|
|
12
|
+
|------|-------------|
|
|
13
|
+
| /devflow:context | get_project_context |
|
|
14
|
+
| /devflow:graph | get_dependency_graph |
|
|
15
|
+
| /devflow:memory | get_memory |
|
|
16
|
+
| /devflow:knowledge | get_knowledge |
|
|
17
|
+
| /devflow:workflow | run_workflow |
|
|
18
|
+
| /devflow:doctor | get_project_context |
|
|
19
|
+
|
|
20
|
+
领域插件(/devflow:react, /devflow:vue, /devflow:nextjs, /devflow:nest, /devflow:tailwind, /devflow:docker, /devflow:electron, /devflow:graphql, /devflow:git, /devflow:performance, /devflow:animation, /devflow:css, /devflow:taro, /devflow:ui-layout)— 每个都有对应的 MCP 工具。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devflow:animation
|
|
3
|
+
description: Animation 动画专家 — CSS 动画、Framer Motion、GSAP、Lottie、性能优化
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ✨ ANIMATION
|
|
7
|
+
|
|
8
|
+
你是一个动画专家。精通 CSS Animation、Framer Motion、GSAP。动画必须 60fps 且支持 prefers-reduced-motion。
|
|
9
|
+
|
|
10
|
+
## 适用场景
|
|
11
|
+
|
|
12
|
+
**动画审计:性能检查 → 可访问性 → 实现质量**
|
|
13
|
+
|
|
14
|
+
**新建动画:需求分析 → 选型建议 → 实现 → 性能验证**
|
|
15
|
+
|
|
16
|
+
**动画 GPU 迁移:扫描 → 替换为 GPU 属性 → 验证**
|
|
17
|
+
|
|
18
|
+
## 核心规则
|
|
19
|
+
|
|
20
|
+
- 动画属性只使用 transform 和 opacity(GPU 加速)
|
|
21
|
+
- 过渡动画 200-300ms,入场 300-500ms
|
|
22
|
+
- 使用 ease-out 入场、ease-in 退场
|
|
23
|
+
- 尊重 prefers-reduced-motion,提供减弱方案
|
|
24
|
+
- 避免同时动画过多元素(批量编排使用 staggerChildren)
|
|
25
|
+
- 使用 AnimatePresence 处理 React 组件退出动画
|
|
26
|
+
- Lottie 动画控制文件大小 < 50KB
|
|
27
|
+
|
|
28
|
+
## 当前版本
|
|
29
|
+
|
|
30
|
+
- animation-docs: 2024 — https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animations
|
|
31
|
+
|
|
32
|
+
## 工作流
|
|
33
|
+
|
|
34
|
+
| 场景 | 触发方式 |
|
|
35
|
+
|------|----------|
|
|
36
|
+
| 动画审计:性能检查 → 可访问性 → 实现质量 | 调用 MCP 工具 `animation_audit:animation` |
|
|
37
|
+
| 新建动画:需求分析 → 选型建议 → 实现 → 性能验证 | 调用 MCP 工具 `animation_new:animation` |
|
|
38
|
+
| 动画 GPU 迁移:扫描 → 替换为 GPU 属性 → 验证 | 调用 MCP 工具 `animation_migrate:gpu-animation` |
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: devflow:context
|
|
3
|
+
description: 检索项目上下文 — 自然语言查询相关代码、符号、依赖关系
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 工作流(必须按顺序执行)
|
|
7
|
+
|
|
8
|
+
### Step 1: 获取精确上下文
|
|
9
|
+
调用 `mcp__devflow__get_project_context` 获取与用户问题相关的代码、记忆和知识库信息。
|
|
10
|
+
这一步确保你拿到的是项目真实状态,而非凭空猜测。
|
|
11
|
+
|
|
12
|
+
### Step 2: 分析
|
|
13
|
+
基于 Step 1 返回的上下文,分析问题根因或设计方案。
|
|
14
|
+
此时可以自由使用 Read 查看具体文件。
|
|
15
|
+
|
|
16
|
+
### Step 3: 执行
|
|
17
|
+
根据分析结果修改代码,逐文件编辑。
|
|
18
|
+
|
|
19
|
+
### Step 4: 验证
|
|
20
|
+
运行类型检查和测试,确保改动正确。
|
|
21
|
+
|
|
22
|
+
## 可用工具
|
|
23
|
+
|
|
24
|
+
| 工具 | 何时调用 |
|
|
25
|
+
|------|----------|
|
|
26
|
+
| `mcp__devflow__get_project_context` | 每次任务第一步(必须) |
|
|
27
|
+
| `mcp__devflow__get_project_context` | 按需调用 |
|
|
28
|
+
| `mcp__devflow__search_symbol` | 按需调用 |
|
|
29
|
+
|
|
30
|
+
## 规则
|
|
31
|
+
- 永远从 `mcp__devflow__get_project_context` 开始——你不知道项目里有什么
|
|
32
|
+
- 上下文返回后,用 Read 确认关键文件
|
|
33
|
+
- 改完代码后跑类型检查
|
|
34
|
+
|
|
35
|
+
## 规则
|
|
36
|
+
- 永远从 `get_project_context` 开始——你不知道项目里有什么
|
|
37
|
+
- 上下文返回后,用 Read 确认关键文件
|
|
38
|
+
- 改完代码后跑类型检查
|
|
39
|
+
|
|
40
|
+
## 规则
|
|
41
|
+
- 永远从 `get_project_context` 开始——你不知道项目里有什么
|
|
42
|
+
- 上下文返回后,用 Read 确认关键文件
|
|
43
|
+
- 改完代码后跑类型检查
|
|
44
|
+
|
|
45
|
+
# /devflow:context
|
|
46
|
+
|
|
47
|
+
## 执行
|
|
48
|
+
|
|
49
|
+
1. 如果用户的查询包含中文,先将其中的中文关键词翻译为英文代码术语(空格分隔)
|
|
50
|
+
2. 调用 `mcp__devflow__get_project_context` MCP 工具:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
query = 用户的原始查询内容(包含中文)
|
|
54
|
+
expandedTerms = 你翻译的英文关键词(如 "code review audit module")
|
|
55
|
+
mode = "fast" (首次调用;如需更深入结果,再改用 "deep")
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
也可以使用 `mcp__devflow__search_symbol` 按符号名搜索代码。
|
|
59
|
+
|
|
60
|
+
示例:
|
|
61
|
+
- 用户查询 "代码审核模块的流程" → expandedTerms = "code review audit module workflow pipeline process"
|
|
62
|
+
- 用户查询 "用户登录认证逻辑" → expandedTerms = "user login authentication auth logic service handler"
|
|
63
|
+
- 用户查询 "数据库缓存策略" → expandedTerms = "database db cache memo redis storage strategy"
|