@devflow-tools/cli 0.12.6 → 0.13.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 (154) hide show
  1. package/dist/commands/benchmark-cmd.d.ts +5 -0
  2. package/dist/commands/benchmark-cmd.d.ts.map +1 -0
  3. package/dist/commands/benchmark-cmd.js +18 -0
  4. package/dist/commands/benchmark-cmd.js.map +1 -0
  5. package/dist/commands/connect.d.ts +8 -0
  6. package/dist/commands/connect.d.ts.map +1 -0
  7. package/dist/commands/connect.js +26 -0
  8. package/dist/commands/connect.js.map +1 -0
  9. package/dist/commands/context.d.ts +15 -0
  10. package/dist/commands/context.d.ts.map +1 -0
  11. package/dist/commands/context.js +24 -0
  12. package/dist/commands/context.js.map +1 -0
  13. package/dist/commands/dashboard.d.ts +3 -0
  14. package/dist/commands/dashboard.d.ts.map +1 -0
  15. package/dist/commands/dashboard.js +10 -0
  16. package/dist/commands/dashboard.js.map +1 -0
  17. package/dist/commands/doctor.d.ts +56 -0
  18. package/dist/commands/doctor.d.ts.map +1 -0
  19. package/dist/commands/doctor.js +156 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/graph.d.ts +11 -0
  22. package/dist/commands/graph.d.ts.map +1 -0
  23. package/dist/commands/graph.js +14 -0
  24. package/dist/commands/graph.js.map +1 -0
  25. package/dist/commands/index-cmd.d.ts +4 -0
  26. package/dist/commands/index-cmd.d.ts.map +1 -0
  27. package/dist/commands/index-cmd.js +15 -0
  28. package/dist/commands/index-cmd.js.map +1 -0
  29. package/dist/commands/init.d.ts +20 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +145 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/knowledge.d.ts +5 -0
  34. package/dist/commands/knowledge.d.ts.map +1 -0
  35. package/dist/commands/knowledge.js +23 -0
  36. package/dist/commands/knowledge.js.map +1 -0
  37. package/dist/commands/memory.d.ts +5 -0
  38. package/dist/commands/memory.d.ts.map +1 -0
  39. package/dist/commands/memory.js +72 -0
  40. package/dist/commands/memory.js.map +1 -0
  41. package/dist/commands/plugin/install.d.ts +3 -0
  42. package/dist/commands/plugin/install.d.ts.map +1 -0
  43. package/dist/commands/plugin/install.js +22 -0
  44. package/dist/commands/plugin/install.js.map +1 -0
  45. package/dist/commands/plugin/list.d.ts +3 -0
  46. package/dist/commands/plugin/list.d.ts.map +1 -0
  47. package/dist/commands/plugin/list.js +47 -0
  48. package/dist/commands/plugin/list.js.map +1 -0
  49. package/dist/commands/plugin/search.d.ts +3 -0
  50. package/dist/commands/plugin/search.d.ts.map +1 -0
  51. package/dist/commands/plugin/search.js +29 -0
  52. package/dist/commands/plugin/search.js.map +1 -0
  53. package/dist/commands/plugin/uninstall.d.ts +3 -0
  54. package/dist/commands/plugin/uninstall.d.ts.map +1 -0
  55. package/dist/commands/plugin/uninstall.js +21 -0
  56. package/dist/commands/plugin/uninstall.js.map +1 -0
  57. package/dist/commands/plugin-guide.d.ts +19 -0
  58. package/dist/commands/plugin-guide.d.ts.map +1 -0
  59. package/dist/commands/plugin-guide.js +131 -0
  60. package/dist/commands/plugin-guide.js.map +1 -0
  61. package/dist/commands/plugin-loader.d.ts +2 -0
  62. package/dist/commands/plugin-loader.d.ts.map +1 -0
  63. package/dist/commands/plugin-loader.js +2 -0
  64. package/dist/commands/plugin-loader.js.map +1 -0
  65. package/dist/commands/review.d.ts +6 -0
  66. package/dist/commands/review.d.ts.map +1 -0
  67. package/dist/commands/review.js +75 -0
  68. package/dist/commands/review.js.map +1 -0
  69. package/dist/commands/server.d.ts +16 -0
  70. package/dist/commands/server.d.ts.map +1 -0
  71. package/dist/commands/server.js +88 -0
  72. package/dist/commands/server.js.map +1 -0
  73. package/dist/commands/session.d.ts +7 -0
  74. package/dist/commands/session.d.ts.map +1 -0
  75. package/dist/commands/session.js +20 -0
  76. package/dist/commands/session.js.map +1 -0
  77. package/dist/commands/setup.d.ts +6 -0
  78. package/dist/commands/setup.d.ts.map +1 -0
  79. package/dist/commands/setup.js +78 -0
  80. package/dist/commands/setup.js.map +1 -0
  81. package/dist/commands/skill.d.ts +18 -0
  82. package/dist/commands/skill.d.ts.map +1 -0
  83. package/dist/commands/skill.js +105 -0
  84. package/dist/commands/skill.js.map +1 -0
  85. package/dist/commands/start.d.ts +5 -0
  86. package/dist/commands/start.d.ts.map +1 -0
  87. package/dist/commands/start.js +58 -0
  88. package/dist/commands/start.js.map +1 -0
  89. package/dist/commands/status.d.ts +2 -0
  90. package/dist/commands/status.d.ts.map +1 -0
  91. package/dist/commands/status.js +33 -0
  92. package/dist/commands/status.js.map +1 -0
  93. package/dist/commands/stop.d.ts +2 -0
  94. package/dist/commands/stop.d.ts.map +1 -0
  95. package/dist/commands/stop.js +12 -0
  96. package/dist/commands/stop.js.map +1 -0
  97. package/dist/commands/workflow.d.ts +6 -0
  98. package/dist/commands/workflow.d.ts.map +1 -0
  99. package/dist/commands/workflow.js +24 -0
  100. package/dist/commands/workflow.js.map +1 -0
  101. package/dist/index.d.ts +3 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +606 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/lib/paths.d.ts +1 -0
  106. package/dist/lib/paths.d.ts.map +1 -0
  107. package/dist/lib/paths.js +4 -0
  108. package/dist/lib/paths.js.map +1 -0
  109. package/dist/lib/plugin-registry.d.ts +18 -0
  110. package/dist/lib/plugin-registry.d.ts.map +1 -0
  111. package/dist/lib/plugin-registry.js +39 -0
  112. package/dist/lib/plugin-registry.js.map +1 -0
  113. package/dist/lib/plugin-setup.d.ts +23 -0
  114. package/dist/lib/plugin-setup.d.ts.map +1 -0
  115. package/dist/lib/plugin-setup.js +141 -0
  116. package/dist/lib/plugin-setup.js.map +1 -0
  117. package/dist/lib/with-server.d.ts +7 -0
  118. package/dist/lib/with-server.d.ts.map +1 -0
  119. package/dist/lib/with-server.js +28 -0
  120. package/dist/lib/with-server.js.map +1 -0
  121. package/dist/mode.d.ts +10 -0
  122. package/dist/mode.d.ts.map +1 -0
  123. package/dist/mode.js +40 -0
  124. package/dist/mode.js.map +1 -0
  125. package/dist/plugin-files/.claude-plugin/plugin.json +29 -0
  126. package/dist/plugin-files/CLAUDE.md +34 -0
  127. package/dist/plugin-files/dist/command-registry.json +300 -0
  128. package/dist/plugin-files/dist/skills/devflow:animation/SKILL.md +63 -0
  129. package/dist/plugin-files/dist/skills/devflow:context/SKILL.md +51 -0
  130. package/dist/plugin-files/dist/skills/devflow:css/SKILL.md +63 -0
  131. package/dist/plugin-files/dist/skills/devflow:docker/SKILL.md +67 -0
  132. package/dist/plugin-files/dist/skills/devflow:electron/SKILL.md +67 -0
  133. package/dist/plugin-files/dist/skills/devflow:git/SKILL.md +67 -0
  134. package/dist/plugin-files/dist/skills/devflow:graph/SKILL.md +42 -0
  135. package/dist/plugin-files/dist/skills/devflow:graphql/SKILL.md +68 -0
  136. package/dist/plugin-files/dist/skills/devflow:knowledge/SKILL.md +42 -0
  137. package/dist/plugin-files/dist/skills/devflow:memory/SKILL.md +41 -0
  138. package/dist/plugin-files/dist/skills/devflow:nest/SKILL.md +68 -0
  139. package/dist/plugin-files/dist/skills/devflow:nextjs/SKILL.md +65 -0
  140. package/dist/plugin-files/dist/skills/devflow:performance/SKILL.md +67 -0
  141. package/dist/plugin-files/dist/skills/devflow:react/SKILL.md +85 -0
  142. package/dist/plugin-files/dist/skills/devflow:tailwind/SKILL.md +65 -0
  143. package/dist/plugin-files/dist/skills/devflow:taro/SKILL.md +66 -0
  144. package/dist/plugin-files/dist/skills/devflow:ui-layout/SKILL.md +63 -0
  145. package/dist/plugin-files/dist/skills/devflow:vue/SKILL.md +74 -0
  146. package/dist/plugin-files/dist/skills/devflow:workflow/SKILL.md +42 -0
  147. package/dist/plugin-files/hooks/constitution.md +20 -0
  148. package/dist/plugin-files/hooks/post-tool-use +16 -0
  149. package/dist/plugin-files/hooks/pre-tool-use +23 -0
  150. package/dist/plugin-files/hooks/session-start +165 -0
  151. package/dist/plugin-files/hooks/stop +32 -0
  152. package/dist/plugin-files/hooks.json +52 -0
  153. package/dist/plugin-files/package.json +31 -0
  154. package/package.json +27 -27
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: devflow:vue
3
+ description: Vue 3 专家 — Bug 诊断、Composition API、响应式调试、组件重构
4
+ required_mcp_tools:
5
+ - vue_diagnose_bug
6
+ - vue_debug_reactivity
7
+ - vue_new_component
8
+ ---
9
+
10
+ <HARD-GATE>
11
+ 收到 devflow:vue 时,必须先调用以下 MCP 工具之一:
12
+ vue_diagnose_bug / vue_debug_reactivity / vue_new_component
13
+ </HARD-GATE>
14
+
15
+ ## MANDATORY FIRST STEP - Skill Registration
16
+
17
+ > **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
18
+
19
+ ```bash
20
+ mkdir -p ~/.devflow && echo '{"name":"devflow:vue","required_mcp_tools":["vue_diagnose_bug","vue_debug_reactivity","vue_new_component"],"description":"devflow:vue skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
21
+ ```
22
+
23
+ After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
24
+ - `mcp__devflow__vue_diagnose_bug`
25
+ - `mcp__devflow__vue_debug_reactivity`
26
+ - `mcp__devflow__vue_new_component`
27
+
28
+ **Never use direct tools** (Read, Write, Edit, Bash, Grep, etc.) for tasks that can be handled by the MCP tools above.
29
+
30
+ When the skill execution is complete, clean up:
31
+ ```bash
32
+ rm -f ~/.devflow/current-skill.json ~/.devflow/current-execution-id
33
+ ```
34
+
35
+ # 💚 VUE
36
+
37
+ 你是一个 Vue 3 专家。使用 Composition API、<script setup> 和 TypeScript。遇到问题先查文档再给方案,不凭空猜测。
38
+
39
+ ## 适用场景
40
+
41
+ **Bug 排查:** 组件渲染异常、响应式数据不同步 → 定位源码,检查 computed/watch 逻辑,搜索 Vue 官方文档验证 API 用法。
42
+
43
+ **新建组件:** 按照项目 SFC 规范生成组件(template + script setup + style scoped),附带 Props/Emits/Slots 类型定义。
44
+
45
+ **响应式调试:追踪数据流 → 定位问题 → 修复**
46
+
47
+ **提取 Composable:识别重复逻辑 → 抽取 → 替换引用**
48
+
49
+ **Pinia Store 重构:结构审查 → 拆分/合并 → 类型安全**
50
+
51
+ ## 核心规则
52
+
53
+ - 使用 <script setup lang="ts"> 语法糖
54
+ - 使用 Composition API(ref、reactive、computed、watch)
55
+ - 状态管理使用 Pinia
56
+ - 可复用逻辑抽取为 composables
57
+ - 遇到不确定的 API 时先查 Vue 官方文档再回答
58
+ - 修复 Bug 前先排查响应式数据流
59
+ - 生成代码后必须通过 vue-tsc 类型检查
60
+ - 不能凭记忆猜测 API 行为,必须基于当前项目版本
61
+
62
+ ## 当前版本
63
+
64
+ - vue-docs: 3.4.0 — https://vuejs.org/guide/introduction.html
65
+
66
+ ## 工作流
67
+
68
+ | 场景 | 触发方式 |
69
+ |------|----------|
70
+ | Bug 排查: | 调用 MCP 工具 `mcp__devflow__vue_diagnose_bug` |
71
+ | 新建组件: | 调用 MCP 工具 `mcp__devflow__vue_new_component` |
72
+ | 响应式调试:追踪数据流 → 定位问题 → 修复 | 调用 MCP 工具 `mcp__devflow__vue_debug_reactivity` |
73
+ | 提取 Composable:识别重复逻辑 → 抽取 → 替换引用 | 调用 MCP 工具 `mcp__devflow__vue_extract:composable` |
74
+ | Pinia Store 重构:结构审查 → 拆分/合并 → 类型安全 | 调用 MCP 工具 `mcp__devflow__vue_refactor:pinia` |
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: devflow:workflow
3
+ description: 执行标准化开发工作流 — Bug 修复、功能开发、代码审查
4
+ required_mcp_tools:
5
+ - run_workflow
6
+ ---
7
+
8
+ <HARD-GATE>
9
+ 收到 devflow:workflow 时,必须先调用以下 MCP 工具之一:
10
+ run_workflow
11
+ </HARD-GATE>
12
+
13
+ ## MANDATORY FIRST STEP - Skill Registration
14
+
15
+ > **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
16
+
17
+ ```bash
18
+ mkdir -p ~/.devflow && echo '{"name":"devflow:workflow","required_mcp_tools":["run_workflow"],"description":"devflow:workflow skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
19
+ ```
20
+
21
+ After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
22
+ - `mcp__devflow__run_workflow`
23
+
24
+ **Never use direct tools** (Read, Write, Edit, Bash, Grep, etc.) for tasks that can be handled by the MCP tools above.
25
+
26
+ When the skill execution is complete, clean up:
27
+ ```bash
28
+ rm -f ~/.devflow/current-skill.json ~/.devflow/current-execution-id
29
+ ```
30
+
31
+ # /devflow:workflow
32
+
33
+ ## 执行
34
+
35
+ 调用 `mcp__devflow__run_workflow` MCP 工具:
36
+
37
+ ```
38
+ type = "bugfix" | "feature" | "review"
39
+ input = 用户的查询内容
40
+ ```
41
+
42
+ MCP 工具提供标准化的 DAG 步骤编排、人工确认节点、执行追踪和遥测记录。工作流执行过程中,MCP 工具会返回需要你介入的步骤,此时才根据步骤指引执行具体操作。
@@ -0,0 +1,20 @@
1
+ <EXTREMELY_IMPORTANT>
2
+ 你正在使用 DevFlow MCP Gateway。
3
+
4
+ ## MCP 优先原则
5
+
6
+ 收到 /devflow:* 命令时,必须先调用 SKILL.md 中列出的 MCP 工具。
7
+ Hook 会自动拦截不符合规范的原生工具调用,并按提示引导你使用正确的 MCP 工具。
8
+
9
+ 正确流程:
10
+ 1. 调用 Skill 加载命令
11
+ 2. 立即调用 MCP 工具
12
+ 3. 基于 MCP 结果回答
13
+ 4. 如需补充信息,使用 Read 工具读取 MCP 未包含的关联文件
14
+
15
+ 绝对不要:
16
+ - 在调用 MCP 之前用 grep/find/Glob/Explore 搜索代码
17
+ - 用 WebSearch/WebFetch 替代 get_knowledge
18
+ - 用 Agent(Explore) 替代 MCP 工具
19
+ - 尝试绕过 Hook 拦截
20
+ </EXTREMELY_IMPORTANT>
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DevFlow PostToolUse Hook — talks to hook-daemon via hook-client
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
7
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
8
+ FALLBACK_JS="$PLUGIN_ROOT/dist/hooks/post-tool-use.js"
9
+
10
+ if [ -f "$CLIENT_JS" ]; then
11
+ node "$CLIENT_JS" post-tool-use "$(cat)" 2>/dev/null || true
12
+ elif [ -f "$FALLBACK_JS" ]; then
13
+ node "$FALLBACK_JS" 2>/dev/null || true
14
+ fi
15
+
16
+ exit 0
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DevFlow PreToolUse Hook — talks to hook-daemon via hook-client
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
7
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
8
+ FALLBACK_JS="$PLUGIN_ROOT/dist/hooks/pre-tool-use.js"
9
+
10
+ if [ -f "$CLIENT_JS" ]; then
11
+ node "$CLIENT_JS" pre-tool-use || {
12
+ echo '[devflow] hook-client failed, trying fallback' >&2
13
+ if [ -f "$FALLBACK_JS" ]; then
14
+ node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
15
+ else
16
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
17
+ fi
18
+ }
19
+ elif [ -f "$FALLBACK_JS" ]; then
20
+ node "$FALLBACK_JS" || echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
21
+ else
22
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
23
+ fi
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # Try to get project summary from devflow doctor
5
+ SUMMARY=""
6
+ DOCTOR_OUTPUT=""
7
+
8
+ # Try global devflow first, then npx fallback
9
+ if command -v devflow &>/dev/null; then
10
+ DOCTOR_OUTPUT=$(devflow doctor --json 2>/dev/null || echo "")
11
+ elif command -v npx &>/dev/null; then
12
+ DOCTOR_OUTPUT=$(npx --yes @devflow-tools/cli doctor --json 2>/dev/null || echo "")
13
+ fi
14
+
15
+ if [ -n "$DOCTOR_OUTPUT" ] && echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
16
+ PROJECT_NAME=$(echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('project',{}).get('name','') or d.get('projectName',''))" 2>/dev/null || echo "")
17
+ FILES=$(echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('project',{}).get('files', d.get('indexedFiles','?')))" 2>/dev/null || echo "?")
18
+ TECH=$(echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); s=d.get('project',{}).get('techStack',[]); print(', '.join(s) if s else 'unknown')" 2>/dev/null || echo "unknown")
19
+ ENGINES=$(echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); e=d.get('engines',{}); print(' '.join([f'{k} {\"✓\" if v else \"✗\"}' for k,v in e.items()]))" 2>/dev/null || echo "")
20
+ PLUGINS=$(echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); p=d.get('plugins',[]); print(', '.join(p))" 2>/dev/null || echo "")
21
+
22
+ SUMMARY="DevFlow 已就绪。项目 ${PROJECT_NAME:-unknown} (${TECH})。${FILES} 个文件已索引。引擎:${ENGINES}。已装插件:${PLUGINS}。使用 /devflow:context 查代码,/devflow:react 获取 React 专家能力。"
23
+ else
24
+ SUMMARY="DevFlow 插件已加载。如尚未初始化项目,请运行 devflow init。使用 /devflow 查看可用命令。"
25
+ fi
26
+
27
+ # Generate session token for MCP Gateway authentication
28
+ SESSION_TOKEN=""
29
+ if command -v devflow &>/dev/null; then
30
+ SESSION_TOKEN=$(devflow session token --expires 3600 2>/dev/null || echo "")
31
+ elif command -v npx &>/dev/null; then
32
+ SESSION_TOKEN=$(npx --yes @devflow-tools/cli session token --expires 3600 2>/dev/null || echo "")
33
+ fi
34
+
35
+ TOKEN_VALUE=""
36
+ if [ -n "$SESSION_TOKEN" ] && echo "$SESSION_TOKEN" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
37
+ TOKEN_VALUE=$(echo "$SESSION_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))" 2>/dev/null || echo "")
38
+ fi
39
+
40
+ # Clean up stale receipt from previous session
41
+ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
42
+ RECEIPT_DIR="${TMPDIR:-/tmp}/.devflow-receipts"
43
+ mkdir -p "$RECEIPT_DIR" 2>/dev/null || true
44
+ SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "default")
45
+ RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
46
+ OVERRIDE_FILE="$RECEIPT_DIR/${SESSION_ID}.override"
47
+ rm -f "$RECEIPT_FILE" "$OVERRIDE_FILE" 2>/dev/null || true
48
+
49
+ # ── Clean up stale execution from previous session (if stop hook didn't fire) ──
50
+ EXEC_FILE="${HOME}/.devflow/current-execution-id"
51
+ SKILL_FILE="${HOME}/.devflow/current-skill.json"
52
+ if [ -f "$EXEC_FILE" ]; then
53
+ EXEC_ID=$(cat "$EXEC_FILE" 2>/dev/null || echo "")
54
+ if [ -n "$EXEC_ID" ]; then
55
+ NOW_MS="$(date +%s)000"
56
+ python3 -c "
57
+ import urllib.request, json
58
+ try:
59
+ payload = json.dumps({
60
+ 'executionId': '${EXEC_ID}',
61
+ 'finishedAt': ${NOW_MS},
62
+ 'status': 'completed',
63
+ 'summary': {
64
+ 'totalToolCalls': 0,
65
+ 'mcpToolCalls': 0,
66
+ 'directToolCalls': 0,
67
+ 'subagentCount': 0,
68
+ 'totalTokens': 0,
69
+ 'totalDuration': 0,
70
+ 'mcpComplianceRate': 0
71
+ }
72
+ }).encode()
73
+ req = urllib.request.Request(
74
+ 'http://127.0.0.1:13337/api/telemetry/skill-execution/complete',
75
+ data=payload,
76
+ headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
77
+ method='POST'
78
+ )
79
+ urllib.request.urlopen(req, timeout=5)
80
+ except:
81
+ pass
82
+ " 2>/dev/null || true
83
+ fi
84
+ rm -f "$EXEC_FILE" "$SKILL_FILE" 2>/dev/null || true
85
+ fi
86
+
87
+ # Determine plugin root directory (same way as superpowers)
88
+ if [ -z "${CLAUDE_PLUGIN_ROOT:-}" ]; then
89
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
90
+ PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
91
+ else
92
+ PLUGIN_ROOT="$CLAUDE_PLUGIN_ROOT"
93
+ fi
94
+
95
+ # Read DevFlow Constitution from file (avoids shell escaping issues)
96
+ CONSTITUTION_FILE="${PLUGIN_ROOT}/skills/devflow/SKILL.md"
97
+ if [ -f "${PLUGIN_ROOT}/hooks/constitution.md" ]; then
98
+ CONSTITUTION_FILE="${PLUGIN_ROOT}/hooks/constitution.md"
99
+ fi
100
+
101
+ if [ -f "$CONSTITUTION_FILE" ]; then
102
+ GLOBAL_CONSTRAINT=$(cat "$CONSTITUTION_FILE" 2>/dev/null || echo "DevFlow Constitution 加载失败")
103
+ else
104
+ GLOBAL_CONSTRAINT="DevFlow Constitution 文件未找到。使用 /devflow: 命令时请优先调用 MCP 工具。"
105
+ fi
106
+
107
+ # Append Gateway status to summary
108
+ GATEWAY_STATUS="\n\n━━━━━━ DevFlow Gateway ━━━━━━\n"
109
+ # Check if devflow MCP server is configured (token will be auto-generated by ensureSessionToken)
110
+ if [ -f ~/.claude/.mcp.json ] && grep -q '"devflow"' ~/.claude/.mcp.json 2>/dev/null; then
111
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置\nGate 层数: 4 (宪法 → 派发 → 拦截 → 纠正)\n"
112
+ elif [ -f .mcp.json ] && grep -q '"devflow"' .mcp.json 2>/dev/null; then
113
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置(项目级)\nGate 层数: 4 (宪法 → 派发 → 拦截 → 纠正)\n"
114
+ else
115
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🔴 未配置 DevFlow MCP Server\n请将 devflow MCP 配置加入 .mcp.json\n"
116
+ fi
117
+ GATEWAY_STATUS="${GATEWAY_STATUS}━━━━━━━━━━━━━━━━━━━━━━━━━━━"
118
+
119
+ SUMMARY="${SUMMARY}${GLOBAL_CONSTRAINT}${GATEWAY_STATUS}"
120
+
121
+ # Escape for JSON
122
+ ESCAPED=$(echo "$SUMMARY" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
123
+
124
+ # Output context injection in Claude Code format
125
+ if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
126
+ if [ -n "$TOKEN_VALUE" ]; then
127
+ ESCAPED_TOKEN=$(echo "$TOKEN_VALUE" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
128
+ printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": %s\n },\n "env": {\n "DEVFLOW_SESSION_TOKEN": %s\n }\n}\n' "$ESCAPED" "$ESCAPED_TOKEN"
129
+ else
130
+ printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": %s\n }\n}\n' "$ESCAPED"
131
+ fi
132
+ fi
133
+
134
+ # ── Start hook daemon (background, Unix socket) ──
135
+ DAEMON_JS="${PLUGIN_ROOT}/dist/hooks/hook-daemon.js"
136
+ if [ -f "$DAEMON_JS" ]; then
137
+ # Kill any stale daemon from previous session
138
+ STALE_PID=$(pgrep -f "hook-daemon.js" 2>/dev/null || true)
139
+ if [ -n "$STALE_PID" ]; then
140
+ kill "$STALE_PID" 2>/dev/null || true
141
+ sleep 0.5
142
+ fi
143
+ node "$DAEMON_JS" "${CLAUDE_PROJECT_DIR:-$(pwd)}" &
144
+ echo "[devflow] Hook daemon started (PID $!)" >&2
145
+ fi
146
+
147
+ # ── Trigger memory extraction for previous session events (best-effort, async) ──
148
+ (python3 -c "
149
+ import urllib.request, json, sys
150
+ try:
151
+ req = urllib.request.Request(
152
+ 'http://127.0.0.1:13337/api/memory/process?rootPath=${CLAUDE_PROJECT_DIR:-$(pwd)}',
153
+ data=b'{}',
154
+ headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
155
+ method='POST',
156
+ )
157
+ resp = urllib.request.urlopen(req, timeout=30)
158
+ result = json.loads(resp.read())
159
+ print('DevFlow memory: {} extracted, {} approved, {} pending'.format(
160
+ result.get('extracted', 0), result.get('approved', 0), result.get('pending', 0)), file=sys.stderr)
161
+ except Exception as e:
162
+ print('DevFlow memory extraction skipped: {}'.format(e), file=sys.stderr)
163
+ " 2>/dev/null || true) &
164
+
165
+ exit 0
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DevFlow Stop Hook — graceful daemon shutdown + cleanup
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
7
+
8
+ # 1. Tell daemon to stop via hook-client
9
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
10
+ if [ -f "$CLIENT_JS" ]; then
11
+ node "$CLIENT_JS" stop </dev/null 2>/dev/null || true
12
+ fi
13
+
14
+ # 2. Fallback: kill any remaining daemon process
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)
21
+ STOP_JS="$PLUGIN_ROOT/dist/hooks/stop.js"
22
+ if [ -f "$STOP_JS" ]; then
23
+ node "$STOP_JS" 2>/dev/null || true
24
+ fi
25
+
26
+ # 4. Clean up stale receipt files for this project
27
+ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
28
+ SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "")
29
+ RECEIPT_FILE="${TMPDIR:-/tmp}/.devflow-receipts/${SESSION_ID}.json"
30
+ rm -f "$RECEIPT_FILE" 2>/dev/null || true
31
+
32
+ exit 0
@@ -0,0 +1,52 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/session-start\"",
10
+ "async": false
11
+ }
12
+ ]
13
+ }
14
+ ],
15
+ "PreToolUse": [
16
+ {
17
+ "matcher": "*",
18
+ "hooks": [
19
+ {
20
+ "type": "command",
21
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/pre-tool-use\"",
22
+ "async": false
23
+ }
24
+ ]
25
+ }
26
+ ],
27
+ "PostToolUse": [
28
+ {
29
+ "matcher": "*",
30
+ "hooks": [
31
+ {
32
+ "type": "command",
33
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/post-tool-use\"",
34
+ "async": false
35
+ }
36
+ ]
37
+ }
38
+ ],
39
+ "Stop": [
40
+ {
41
+ "matcher": "",
42
+ "hooks": [
43
+ {
44
+ "type": "command",
45
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/stop\"",
46
+ "async": false
47
+ }
48
+ ]
49
+ }
50
+ ]
51
+ }
52
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@devflow-tools/claude-code-plugin",
3
+ "version": "0.12.6",
4
+ "description": "DevFlow \u2014 Developer Intelligence Platform for Claude Code",
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "npx tsx scripts/inject-gates.ts",
8
+ "deploy": "npx tsx scripts/inject-gates.ts --deploy"
9
+ },
10
+ "devDependencies": {
11
+ "@devflow-tools/mcp-server": "^0.12.5"
12
+ },
13
+ "keywords": [
14
+ "pi-package",
15
+ "skills",
16
+ "development",
17
+ "context",
18
+ "knowledge-base"
19
+ ],
20
+ "pi": {
21
+ "skills": [
22
+ "./skills"
23
+ ]
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "hooks",
28
+ "hooks.json",
29
+ "skills"
30
+ ]
31
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/cli",
3
- "version": "0.12.6",
3
+ "version": "0.13.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -12,31 +12,31 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@colbymchenry/codegraph": "^1.1.1",
15
- "@devflow-tools/adapters": "^0.12.5",
16
- "@devflow-tools/benchmark": "^0.12.5",
17
- "@devflow-tools/context-engine": "^0.12.5",
18
- "@devflow-tools/database": "^0.12.5",
19
- "@devflow-tools/knowledge-engine": "^0.12.5",
20
- "@devflow-tools/mcp-server": "^0.12.5",
21
- "@devflow-tools/memory-engine": "^0.12.5",
22
- "@devflow-tools/plugin-animation": "^0.12.0",
23
- "@devflow-tools/plugin-css": "^0.12.0",
24
- "@devflow-tools/plugin-docker": "^0.12.0",
25
- "@devflow-tools/plugin-electron": "^0.12.0",
26
- "@devflow-tools/plugin-git": "^0.12.0",
27
- "@devflow-tools/plugin-graphql": "^0.12.0",
28
- "@devflow-tools/plugin-nest": "^0.12.0",
29
- "@devflow-tools/plugin-nextjs": "^0.12.0",
30
- "@devflow-tools/plugin-performance": "^0.12.0",
31
- "@devflow-tools/plugin-react": "^0.12.0",
32
- "@devflow-tools/plugin-tailwind": "^0.12.0",
33
- "@devflow-tools/plugin-taro": "^0.12.0",
34
- "@devflow-tools/plugin-ui-layout": "^0.12.0",
35
- "@devflow-tools/plugin-vue": "^0.12.0",
36
- "@devflow-tools/sdk": "^0.12.5",
37
- "@devflow-tools/server": "^0.12.5",
38
- "@devflow-tools/telemetry": "^0.12.5",
39
- "@devflow-tools/workflow-engine": "^0.12.5",
15
+ "@devflow-tools/adapters": "^0.13.0",
16
+ "@devflow-tools/benchmark": "^0.13.0",
17
+ "@devflow-tools/context-engine": "^0.13.0",
18
+ "@devflow-tools/database": "^0.13.0",
19
+ "@devflow-tools/knowledge-engine": "^0.13.0",
20
+ "@devflow-tools/mcp-server": "^0.13.0",
21
+ "@devflow-tools/memory-engine": "^0.13.0",
22
+ "@devflow-tools/plugin-animation": "^0.13.0",
23
+ "@devflow-tools/plugin-css": "^0.13.0",
24
+ "@devflow-tools/plugin-docker": "^0.13.0",
25
+ "@devflow-tools/plugin-electron": "^0.13.0",
26
+ "@devflow-tools/plugin-git": "^0.13.0",
27
+ "@devflow-tools/plugin-graphql": "^0.13.0",
28
+ "@devflow-tools/plugin-nest": "^0.13.0",
29
+ "@devflow-tools/plugin-nextjs": "^0.13.0",
30
+ "@devflow-tools/plugin-performance": "^0.13.0",
31
+ "@devflow-tools/plugin-react": "^0.13.0",
32
+ "@devflow-tools/plugin-tailwind": "^0.13.0",
33
+ "@devflow-tools/plugin-taro": "^0.13.0",
34
+ "@devflow-tools/plugin-ui-layout": "^0.13.0",
35
+ "@devflow-tools/plugin-vue": "^0.13.0",
36
+ "@devflow-tools/sdk": "^0.13.0",
37
+ "@devflow-tools/server": "^0.13.0",
38
+ "@devflow-tools/telemetry": "^0.13.0",
39
+ "@devflow-tools/workflow-engine": "^0.13.0",
40
40
  "@inquirer/prompts": "^7.10.1",
41
41
  "chalk": "^5.3.0",
42
42
  "commander": "^12.0.0"
@@ -49,5 +49,5 @@
49
49
  "dist",
50
50
  "bin"
51
51
  ],
52
- "gitHead": "d544427472016eb332c6c2107f0fc98d8ae59c14"
52
+ "gitHead": "6e5878a1ab2bba3a21bd42a5f7e236d4f7375d4f"
53
53
  }