@devflow-tools/devflow 0.16.0 → 0.16.2

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 (132) hide show
  1. package/dist/cli.js +78 -49
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/_next/static/chunks/{736-db1a009357c222d2.js → 384-484184f146e1b764.js} +1 -1
  4. package/dist/dashboard/_next/static/chunks/{429-eac85fdc49353ed8.js → 429-3a8e078af4ea04bd.js} +1 -1
  5. package/dist/dashboard/_next/static/chunks/app/accuracy/{page-ca6a419d8b29eb4f.js → page-3b8b7448c9c7aeee.js} +1 -1
  6. package/dist/dashboard/_next/static/chunks/app/benchmark/page-d8f3f089f1d15cc7.js +1 -0
  7. package/dist/dashboard/_next/static/chunks/app/context/{page-1874ae1050524cb6.js → page-480f7324dee9cf74.js} +1 -1
  8. package/dist/dashboard/_next/static/chunks/app/doctor/{page-d542f2ab8d6a1c59.js → page-c32c81c69968099f.js} +1 -1
  9. package/dist/dashboard/_next/static/chunks/app/executions/{page-b98ec834dcda8d93.js → page-bee250062acc03a8.js} +1 -1
  10. package/dist/dashboard/_next/static/chunks/app/graph/{page-f0e7e15288791e9c.js → page-75947209e5b7741c.js} +1 -1
  11. package/dist/dashboard/_next/static/chunks/app/knowledge/{page-86808abd0d47c026.js → page-61a2d663940fb04b.js} +1 -1
  12. package/dist/dashboard/_next/static/chunks/app/{layout-4b78776412bd4fee.js → layout-572650e435947896.js} +1 -1
  13. package/dist/dashboard/_next/static/chunks/app/memory/{page-e169762426ac7a23.js → page-71d7c8926179b065.js} +1 -1
  14. package/dist/dashboard/_next/static/chunks/app/{page-c3e980fb2621470c.js → page-10dcf844701d7903.js} +1 -1
  15. package/dist/dashboard/_next/static/chunks/app/replay/{page-a8a465ed885df0cf.js → page-f354eb8ed0bfbb11.js} +1 -1
  16. package/dist/dashboard/_next/static/chunks/app/runs/[id]/{page-cc1d5182707fca5b.js → page-ffc0fda72263722c.js} +1 -1
  17. package/dist/dashboard/_next/static/chunks/app/runs/{page-bbf0a58abd70430c.js → page-4da6997bddcfeb45.js} +1 -1
  18. package/dist/dashboard/_next/static/chunks/app/settings/{page-9602ff45892e7910.js → page-0fa1d3b02152a97c.js} +1 -1
  19. package/dist/dashboard/_next/static/chunks/app/timeline/{page-a8eb3caf23be8a86.js → page-b676878a19561da3.js} +1 -1
  20. package/dist/dashboard/_next/static/chunks/app/tool-metrics/{page-1f86f62b187f2b5e.js → page-6452423bc1f543ec.js} +1 -1
  21. package/dist/dashboard/_next/static/chunks/app/workflows/{page-551939c9e86b26c6.js → page-0ff0044616ac56aa.js} +1 -1
  22. package/dist/dashboard/_next/static/chunks/main-app-cf693a9b955f073e.js +1 -0
  23. package/dist/dashboard/accuracy.html +1 -1
  24. package/dist/dashboard/accuracy.txt +3 -3
  25. package/dist/dashboard/benchmark.html +1 -1
  26. package/dist/dashboard/benchmark.txt +3 -3
  27. package/dist/dashboard/context.html +1 -1
  28. package/dist/dashboard/context.txt +3 -3
  29. package/dist/dashboard/doctor.html +1 -1
  30. package/dist/dashboard/doctor.txt +3 -3
  31. package/dist/dashboard/executions.html +1 -1
  32. package/dist/dashboard/executions.txt +3 -3
  33. package/dist/dashboard/graph.html +1 -1
  34. package/dist/dashboard/graph.txt +3 -3
  35. package/dist/dashboard/index.html +1 -1
  36. package/dist/dashboard/index.txt +3 -3
  37. package/dist/dashboard/knowledge.html +1 -1
  38. package/dist/dashboard/knowledge.txt +3 -3
  39. package/dist/dashboard/memory.html +1 -1
  40. package/dist/dashboard/memory.txt +3 -3
  41. package/dist/dashboard/replay.html +1 -1
  42. package/dist/dashboard/replay.txt +3 -3
  43. package/dist/dashboard/runs/_.html +1 -1
  44. package/dist/dashboard/runs/_.txt +3 -3
  45. package/dist/dashboard/runs.html +1 -1
  46. package/dist/dashboard/runs.txt +3 -3
  47. package/dist/dashboard/settings.html +1 -1
  48. package/dist/dashboard/settings.txt +3 -3
  49. package/dist/dashboard/timeline.html +1 -1
  50. package/dist/dashboard/timeline.txt +3 -3
  51. package/dist/dashboard/tool-metrics.html +1 -1
  52. package/dist/dashboard/tool-metrics.txt +3 -3
  53. package/dist/dashboard/workflows.html +1 -1
  54. package/dist/dashboard/workflows.txt +3 -3
  55. package/dist/hooks/hook-client.js +5 -5
  56. package/dist/hooks/hook-daemon.js +11 -11
  57. package/dist/hooks/post-tool-use-failure.js +2 -2
  58. package/dist/hooks/post-tool-use.js +3 -3
  59. package/dist/hooks/pre-compact.js +2 -2
  60. package/dist/hooks/pre-tool-use.js +2 -2
  61. package/dist/hooks/session-end.js +2 -2
  62. package/dist/hooks/stop.js +2 -2
  63. package/dist/hooks/user-prompt-submit.js +3 -2
  64. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  65. package/dist/plugin/CLAUDE.md +34 -0
  66. package/dist/plugin/dist/command-registry.json +297 -0
  67. package/dist/plugin/dist/hooks/hook-client.js +5 -5
  68. package/dist/plugin/dist/hooks/hook-daemon.js +11 -11
  69. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  70. package/dist/plugin/dist/hooks/post-tool-use.js +3 -3
  71. package/dist/plugin/dist/hooks/pre-compact.js +2 -2
  72. package/dist/plugin/dist/hooks/pre-tool-use.js +2 -2
  73. package/dist/plugin/dist/hooks/session-end.js +2 -2
  74. package/dist/plugin/dist/hooks/stop.js +2 -2
  75. package/dist/plugin/dist/hooks/user-prompt-submit.js +3 -2
  76. package/dist/plugin/dist/skills/devflow:animation/SKILL.md +63 -0
  77. package/dist/plugin/dist/skills/devflow:context/SKILL.md +90 -0
  78. package/dist/plugin/dist/skills/devflow:css/SKILL.md +63 -0
  79. package/dist/plugin/dist/skills/devflow:docker/SKILL.md +67 -0
  80. package/dist/plugin/dist/skills/devflow:electron/SKILL.md +67 -0
  81. package/dist/plugin/dist/skills/devflow:git/SKILL.md +67 -0
  82. package/dist/plugin/dist/skills/devflow:graph/SKILL.md +80 -0
  83. package/dist/plugin/dist/skills/devflow:graphql/SKILL.md +66 -0
  84. package/dist/plugin/dist/skills/devflow:knowledge/SKILL.md +80 -0
  85. package/dist/plugin/dist/skills/devflow:memory/SKILL.md +79 -0
  86. package/dist/plugin/dist/skills/devflow:nest/SKILL.md +68 -0
  87. package/dist/plugin/dist/skills/devflow:nextjs/SKILL.md +65 -0
  88. package/dist/plugin/dist/skills/devflow:performance/SKILL.md +67 -0
  89. package/dist/plugin/dist/skills/devflow:react/SKILL.md +96 -0
  90. package/dist/plugin/dist/skills/devflow:tailwind/SKILL.md +65 -0
  91. package/dist/plugin/dist/skills/devflow:taro/SKILL.md +66 -0
  92. package/dist/plugin/dist/skills/devflow:ui-layout/SKILL.md +63 -0
  93. package/dist/plugin/dist/skills/devflow:vue/SKILL.md +72 -0
  94. package/dist/plugin/dist/skills/devflow:workflow/SKILL.md +80 -0
  95. package/dist/plugin/hooks/constitution.md +20 -0
  96. package/dist/plugin/hooks/post-tool-use +20 -0
  97. package/dist/plugin/hooks/post-tool-use-failure +19 -0
  98. package/dist/plugin/hooks/pre-compact +19 -0
  99. package/dist/plugin/hooks/pre-tool-use +23 -0
  100. package/dist/plugin/hooks/session-end +19 -0
  101. package/dist/plugin/hooks/session-start +249 -0
  102. package/dist/plugin/hooks/stop +27 -0
  103. package/dist/plugin/hooks/user-prompt-submit +19 -0
  104. package/dist/plugin/package.json +43 -0
  105. package/dist/plugin/skills/{devflow:react → react}/SKILL.md +16 -3
  106. package/package.json +13 -13
  107. package/plugin-registry.json +29 -29
  108. package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
  109. package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
  110. /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → ZaapgyqOj6AXHY5zdw6_X}/_buildManifest.js +0 -0
  111. /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → ZaapgyqOj6AXHY5zdw6_X}/_ssgManifest.js +0 -0
  112. /package/dist/plugin/{hooks.json → hooks/hooks.json} +0 -0
  113. /package/dist/plugin/skills/{devflow:animation → animation}/SKILL.md +0 -0
  114. /package/dist/plugin/skills/{devflow:context → context}/SKILL.md +0 -0
  115. /package/dist/plugin/skills/{devflow:css → css}/SKILL.md +0 -0
  116. /package/dist/plugin/skills/{devflow:docker → docker}/SKILL.md +0 -0
  117. /package/dist/plugin/skills/{devflow:doctor → doctor}/SKILL.md +0 -0
  118. /package/dist/plugin/skills/{devflow:electron → electron}/SKILL.md +0 -0
  119. /package/dist/plugin/skills/{devflow:git → git}/SKILL.md +0 -0
  120. /package/dist/plugin/skills/{devflow:graph → graph}/SKILL.md +0 -0
  121. /package/dist/plugin/skills/{devflow:graphql → graphql}/SKILL.md +0 -0
  122. /package/dist/plugin/skills/{devflow:knowledge → knowledge}/SKILL.md +0 -0
  123. /package/dist/plugin/skills/{devflow:memory → memory}/SKILL.md +0 -0
  124. /package/dist/plugin/skills/{devflow:nest → nest}/SKILL.md +0 -0
  125. /package/dist/plugin/skills/{devflow:nextjs → nextjs}/SKILL.md +0 -0
  126. /package/dist/plugin/skills/{devflow:performance → performance}/SKILL.md +0 -0
  127. /package/dist/plugin/skills/{devflow:start → start}/SKILL.md +0 -0
  128. /package/dist/plugin/skills/{devflow:tailwind → tailwind}/SKILL.md +0 -0
  129. /package/dist/plugin/skills/{devflow:taro → taro}/SKILL.md +0 -0
  130. /package/dist/plugin/skills/{devflow:ui-layout → ui-layout}/SKILL.md +0 -0
  131. /package/dist/plugin/skills/{devflow:vue → vue}/SKILL.md +0 -0
  132. /package/dist/plugin/skills/{devflow:workflow → workflow}/SKILL.md +0 -0
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: devflow:taro
3
+ description: Taro 跨端专家 — 多端适配、小程序调试、性能优化、兼容方案
4
+ required_mcp_tools:
5
+ - taro_new_page
6
+ ---
7
+
8
+ <HARD-GATE>
9
+ 收到 devflow:taro 时,必须先调用以下 MCP 工具之一:
10
+ taro_new_page
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:taro","required_mcp_tools":["taro_new_page"],"description":"devflow:taro 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__taro_new_page`
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
+ # 🛠️ TARO
32
+
33
+ 你是一个 Taro 跨端开发专家。使用 Taro 内置组件和 API,确保多端兼容。遇到小程序问题先查文档,不凭经验猜测。
34
+
35
+ ## 适用场景
36
+
37
+ **新建页面:** Taro 跨端页面 → 生成页面组件(兼容 H5/微信小程序),配置路由和导航栏。
38
+
39
+ **跨端兼容检查:扫描平台 API → 识别风险点 → 建议兼容方案**
40
+
41
+ **小程序调试:错误排查 → 包体积分析 → 性能检测**
42
+
43
+ **小程序性能优化:包体积 → 渲染优化 → 加载速度**
44
+
45
+ ## 核心规则
46
+
47
+ - 使用 Taro 内置组件(View、Text、Image)替代 HTML 元素
48
+ - 使用 Taro API 替代浏览器 API
49
+ - 避免使用 window/document 等 DOM API
50
+ - 使用条件编译处理平台差异(process.env.TARO_ENV)
51
+ - 样式使用 px 单位(Taro 自动转换)
52
+ - 合理使用分包加载减少首屏体积
53
+ - 不确定跨端兼容性时先查 Taro 文档确认
54
+
55
+ ## 当前版本
56
+
57
+ - taro-docs: 3.6.0 — https://docs.taro.zone/docs/
58
+
59
+ ## 工作流
60
+
61
+ | 场景 | 触发方式 |
62
+ |------|----------|
63
+ | 新建页面: | 调用 MCP 工具 `taro_new_page` |
64
+ | 跨端兼容检查:扫描平台 API → 识别风险点 → 建议兼容方案 | 调用 MCP 工具 `taro_check:cross-platform` |
65
+ | 小程序调试:错误排查 → 包体积分析 → 性能检测 | 调用 MCP 工具 `taro_debug:miniapp` |
66
+ | 小程序性能优化:包体积 → 渲染优化 → 加载速度 | 调用 MCP 工具 `taro_optimize:performance` |
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: devflow:ui-layout
3
+ description: UI Layout 专家 — 布局模式、组件组合、响应式架构、设计系统
4
+ required_mcp_tools:
5
+ - ui_layout_generate
6
+ ---
7
+
8
+ <HARD-GATE>
9
+ 收到 devflow:ui-layout 时,必须先调用以下 MCP 工具之一:
10
+ ui_layout_generate
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:ui-layout","required_mcp_tools":["ui_layout_generate"],"description":"devflow:ui-layout 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__ui_layout_generate`
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
+ # 📐 UI-LAYOUT
32
+
33
+ 你是一个 UI Layout 专家。精通 CSS Grid、Flexbox 和响应式设计。使用 Design Token 体系管理样式变量。
34
+
35
+ ## 适用场景
36
+
37
+ **布局审计:一致性检查 → 响应式问题 → 可访问性评估**
38
+
39
+ **响应式改造:断点分析 → 移动适配 → Container Queries**
40
+
41
+ **Design Token 体系建设:提取 → 分层 → 代码化**
42
+
43
+ ## 核心规则
44
+
45
+ - 优先使用 CSS Grid 做页面布局,Flexbox 做组件内排列
46
+ - 使用容器查询实现组件级响应式
47
+ - 间距遵循 4px 倍数的 Scale 体系
48
+ - 使用语义化 HTML(header/nav/main/aside/footer)
49
+ - 移动优先设计,渐进增强
50
+ - 使用 CSS 变量管理 Design Token
51
+ - 确保触控目标 ≥ 44×44px,对比度 ≥ 4.5:1
52
+
53
+ ## 当前版本
54
+
55
+ - web-dev-layout: 2024 — https://web.dev/learn/design/
56
+
57
+ ## 工作流
58
+
59
+ | 场景 | 触发方式 |
60
+ |------|----------|
61
+ | 布局审计:一致性检查 → 响应式问题 → 可访问性评估 | 调用 MCP 工具 `ui-layout_audit:layout` |
62
+ | 响应式改造:断点分析 → 移动适配 → Container Queries | 调用 MCP 工具 `ui-layout_design:responsive` |
63
+ | Design Token 体系建设:提取 → 分层 → 代码化 | 调用 MCP 工具 `ui-layout_setup:design-tokens` |
@@ -0,0 +1,72 @@
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
+ ---
8
+
9
+ <HARD-GATE>
10
+ 收到 devflow:vue 时,必须先调用以下 MCP 工具之一:
11
+ vue_diagnose_bug / vue_debug_reactivity
12
+ </HARD-GATE>
13
+
14
+ ## MANDATORY FIRST STEP - Skill Registration
15
+
16
+ > **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
17
+
18
+ ```bash
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
20
+ ```
21
+
22
+ After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
23
+ - `mcp__devflow__vue_diagnose_bug`
24
+ - `mcp__devflow__vue_debug_reactivity`
25
+
26
+ **Never use direct tools** (Read, Write, Edit, Bash, Grep, etc.) for tasks that can be handled by the MCP tools above.
27
+
28
+ When the skill execution is complete, clean up:
29
+ ```bash
30
+ rm -f ~/.devflow/current-skill.json ~/.devflow/current-execution-id
31
+ ```
32
+
33
+ # 💚 VUE
34
+
35
+ 你是一个 Vue 3 专家。使用 Composition API、<script setup> 和 TypeScript。遇到问题先查文档再给方案,不凭空猜测。
36
+
37
+ ## 适用场景
38
+
39
+ **Bug 排查:** 组件渲染异常、响应式数据不同步 → 定位源码,检查 computed/watch 逻辑,搜索 Vue 官方文档验证 API 用法。
40
+
41
+ **新建组件:** 按照项目 SFC 规范生成组件(template + script setup + style scoped),附带 Props/Emits/Slots 类型定义。
42
+
43
+ **响应式调试:追踪数据流 → 定位问题 → 修复**
44
+
45
+ **提取 Composable:识别重复逻辑 → 抽取 → 替换引用**
46
+
47
+ **Pinia Store 重构:结构审查 → 拆分/合并 → 类型安全**
48
+
49
+ ## 核心规则
50
+
51
+ - 使用 <script setup lang="ts"> 语法糖
52
+ - 使用 Composition API(ref、reactive、computed、watch)
53
+ - 状态管理使用 Pinia
54
+ - 可复用逻辑抽取为 composables
55
+ - 遇到不确定的 API 时先查 Vue 官方文档再回答
56
+ - 修复 Bug 前先排查响应式数据流
57
+ - 生成代码后必须通过 vue-tsc 类型检查
58
+ - 不能凭记忆猜测 API 行为,必须基于当前项目版本
59
+
60
+ ## 当前版本
61
+
62
+ - vue-docs: 3.4.0 — https://vuejs.org/guide/introduction.html
63
+
64
+ ## 工作流
65
+
66
+ | 场景 | 触发方式 |
67
+ |------|----------|
68
+ | Bug 排查: | 调用 MCP 工具 `vue_diagnose_bug` |
69
+ | 新建组件: | 调用 MCP 工具 `vue_new_component` |
70
+ | 响应式调试:追踪数据流 → 定位问题 → 修复 | 调用 MCP 工具 `vue_debug_reactivity` |
71
+ | 提取 Composable:识别重复逻辑 → 抽取 → 替换引用 | 调用 MCP 工具 `vue_extract:composable` |
72
+ | Pinia Store 重构:结构审查 → 拆分/合并 → 类型安全 | 调用 MCP 工具 `vue_refactor:pinia` |
@@ -0,0 +1,80 @@
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
+ ## 工作流(必须按顺序执行)
32
+
33
+ ### Step 1: 获取精确上下文
34
+ 调用 `mcp__devflow__get_project_context` 获取与用户问题相关的代码、记忆和知识库信息。
35
+ 这一步确保你拿到的是项目真实状态,而非凭空猜测。
36
+
37
+ ### Step 2: 分析
38
+ 基于 Step 1 返回的上下文,分析问题根因或设计方案。
39
+ 此时可以自由使用 Read 查看具体文件。
40
+
41
+ ### Step 3: 执行
42
+ 根据分析结果修改代码,逐文件编辑。
43
+
44
+ ### Step 4: 验证
45
+ 运行类型检查和测试,确保改动正确。
46
+
47
+ ## 可用工具
48
+
49
+ | 工具 | 何时调用 |
50
+ |------|----------|
51
+ | `mcp__devflow__get_project_context` | 每次任务第一步(必须) |
52
+ | `mcp__devflow__run_workflow` | 按需调用 |
53
+
54
+ ## 规则
55
+ - 永远从 `mcp__devflow__get_project_context` 开始——你不知道项目里有什么
56
+ - 上下文返回后,用 Read 确认关键文件
57
+ - 改完代码后跑类型检查
58
+
59
+ ## 规则
60
+ - 永远从 `get_project_context` 开始——你不知道项目里有什么
61
+ - 上下文返回后,用 Read 确认关键文件
62
+ - 改完代码后跑类型检查
63
+
64
+ ## 规则
65
+ - 永远从 `run_workflow` 开始——你不知道项目里有什么
66
+ - 上下文返回后,用 Read 确认关键文件
67
+ - 改完代码后跑类型检查
68
+
69
+ # /devflow:workflow
70
+
71
+ ## 执行
72
+
73
+ 调用 `mcp__devflow__run_workflow` MCP 工具:
74
+
75
+ ```
76
+ type = "bugfix" | "feature" | "review"
77
+ input = 用户的查询内容
78
+ ```
79
+
80
+ 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,20 @@
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
+ INPUT="$(cat)"
11
+
12
+ if [ -f "$CLIENT_JS" ]; then
13
+ node "$CLIENT_JS" post-tool-use "$INPUT" 2>/dev/null || {
14
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
15
+ }
16
+ elif [ -f "$FALLBACK_JS" ]; then
17
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
18
+ fi
19
+
20
+ exit 0
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
6
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
7
+ FALLBACK_JS="$PLUGIN_ROOT/dist/hooks/post-tool-use-failure.js"
8
+
9
+ INPUT="$(cat)"
10
+
11
+ if [ -f "$CLIENT_JS" ]; then
12
+ node "$CLIENT_JS" post-tool-use-failure "$INPUT" 2>/dev/null || {
13
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
14
+ }
15
+ elif [ -f "$FALLBACK_JS" ]; then
16
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
17
+ fi
18
+
19
+ exit 0
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
6
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
7
+ FALLBACK_JS="$PLUGIN_ROOT/dist/hooks/pre-compact.js"
8
+
9
+ INPUT="$(cat)"
10
+
11
+ if [ -f "$CLIENT_JS" ]; then
12
+ node "$CLIENT_JS" pre-compact "$INPUT" 2>/dev/null || {
13
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
14
+ }
15
+ elif [ -f "$FALLBACK_JS" ]; then
16
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
17
+ fi
18
+
19
+ 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
+ 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
+ else
16
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unreachable). Run devflow doctor for details."}}'
17
+ fi
18
+ }
19
+ elif [ -f "$FALLBACK_JS" ]; then
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
+ else
22
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","additionalContext":"WARNING: DevFlow is in degraded mode (daemon unavailable). Run devflow doctor for details."}}'
23
+ fi
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$SCRIPT_DIR/..}"
6
+ CLIENT_JS="$PLUGIN_ROOT/dist/hooks/hook-client.js"
7
+ FALLBACK_JS="$PLUGIN_ROOT/dist/hooks/session-end.js"
8
+
9
+ INPUT="$(cat)"
10
+
11
+ if [ -f "$CLIENT_JS" ]; then
12
+ node "$CLIENT_JS" session-end "$INPUT" 2>/dev/null || {
13
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
14
+ }
15
+ elif [ -f "$FALLBACK_JS" ]; then
16
+ echo "$INPUT" | DEVFLOW_HOOK_DEGRADED=1 node "$FALLBACK_JS" 2>/dev/null || true
17
+ fi
18
+
19
+ exit 0
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
5
+ SESSION_START_INPUT="$(cat)"
6
+
7
+ # Try to get project summary from devflow doctor
8
+ SUMMARY=""
9
+ DOCTOR_OUTPUT=""
10
+
11
+ # Try global devflow first, then npx fallback
12
+ if command -v devflow &>/dev/null; then
13
+ DOCTOR_OUTPUT=$(devflow doctor --json 2>/dev/null || echo "")
14
+ elif command -v npx &>/dev/null; then
15
+ DOCTOR_OUTPUT=$(npx --yes @devflow-tools/cli doctor --json 2>/dev/null || echo "")
16
+ fi
17
+
18
+ if [ -n "$DOCTOR_OUTPUT" ] && echo "$DOCTOR_OUTPUT" | python3 -c "import sys,json; json.load(sys.stdin)" 2>/dev/null; then
19
+ 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 "")
20
+ 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 "?")
21
+ 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")
22
+ 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 "")
23
+ 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 "")
24
+
25
+ SUMMARY="DevFlow 已就绪。项目 ${PROJECT_NAME:-unknown} (${TECH})。${FILES} 个文件已索引。引擎:${ENGINES}。已装插件:${PLUGINS}。使用 /devflow:context 查代码,/devflow:react 获取 React 专家能力。"
26
+ else
27
+ SUMMARY="DevFlow 插件已加载。如尚未初始化项目,请运行 devflow init。使用 /devflow 查看可用命令。"
28
+ fi
29
+
30
+ # Generate session token for MCP Gateway authentication
31
+ # Clean up stale receipt from previous session
32
+ RECEIPT_DIR="${TMPDIR:-/tmp}/.devflow-receipts"
33
+ mkdir -p "$RECEIPT_DIR" 2>/dev/null || true
34
+ SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "default")
35
+ RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
36
+ OVERRIDE_FILE="$RECEIPT_DIR/${SESSION_ID}.override"
37
+ rm -f "$RECEIPT_FILE" "$OVERRIDE_FILE" 2>/dev/null || true
38
+
39
+ # Determine plugin root directory (same way as superpowers)
40
+ if [ -z "${CLAUDE_PLUGIN_ROOT:-}" ]; then
41
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
42
+ PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
43
+ else
44
+ PLUGIN_ROOT="$CLAUDE_PLUGIN_ROOT"
45
+ fi
46
+
47
+ # Read DevFlow Constitution from file (avoids shell escaping issues)
48
+ CONSTITUTION_FILE="${PLUGIN_ROOT}/skills/devflow/SKILL.md"
49
+ if [ -f "${PLUGIN_ROOT}/hooks/constitution.md" ]; then
50
+ CONSTITUTION_FILE="${PLUGIN_ROOT}/hooks/constitution.md"
51
+ fi
52
+
53
+ if [ -f "$CONSTITUTION_FILE" ]; then
54
+ GLOBAL_CONSTRAINT=$(cat "$CONSTITUTION_FILE" 2>/dev/null || echo "DevFlow Constitution 加载失败")
55
+ else
56
+ GLOBAL_CONSTRAINT="DevFlow Constitution 文件未找到。使用 /devflow: 命令时请优先调用 MCP 工具。"
57
+ fi
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
+
78
+ # Append Gateway status to summary
79
+ GATEWAY_STATUS="\n\n━━━━━━ DevFlow Gateway ━━━━━━\n"
80
+ # Check if devflow MCP server is configured (token will be auto-generated by ensureSessionToken)
81
+ if [ -f ~/.claude/.mcp.json ] && grep -q '"devflow"' ~/.claude/.mcp.json 2>/dev/null; then
82
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置\nGate 层数: ${GATE_COUNT} (${GATE_DETAIL})\n"
83
+ elif [ -f .mcp.json ] && grep -q '"devflow"' .mcp.json 2>/dev/null; then
84
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🟢 DevFlow MCP 已配置(项目级)\nGate 层数: ${GATE_COUNT} (${GATE_DETAIL})\n"
85
+ else
86
+ GATEWAY_STATUS="${GATEWAY_STATUS}Status: 🔴 未配置 DevFlow MCP Server\n请将 devflow MCP 配置加入 .mcp.json\n"
87
+ fi
88
+ GATEWAY_STATUS="${GATEWAY_STATUS}━━━━━━━━━━━━━━━━━━━━━━━━━━━"
89
+
90
+ # ── MCP Tool Usage Protocol (injected into every session) ──
91
+ MCP_PROTOCOL="
92
+
93
+ ## DevFlow MCP 工具使用协议(必须遵守)
94
+
95
+ 当用户使用 /devflow: 开头的技能时(如 /devflow:react、/devflow:vue、/devflow:context 等),你必须按以下流程操作:
96
+
97
+ ### Step 1: 获取上下文(必须先执行)
98
+ 调用 mcp__devflow__get_project_context,参数格式:{\"query\": \"用户的问题描述\", \"projectRoot\": \"\${CLAUDE_PROJECT_DIR}\"}
99
+ 这个工具返回项目中的相关文件、符号、风险提示和下一步建议。
100
+ 不要跳过这一步。不要用 Explore、Agent、Grep 或 Bash 代替。
101
+
102
+ ### Step 2: 按需调用领域工具
103
+ 根据技能类型调用对应的 MCP 工具:
104
+ - React 性能问题 → mcp__devflow__react_audit_performance(参数:{\"projectRoot\": \"\${CLAUDE_PROJECT_DIR}\"})
105
+ - React Bug → mcp__devflow__react_diagnose_bug
106
+ - React Hooks 审查 → mcp__devflow__react_review_hooks
107
+ - Vue 问题 → mcp__devflow__vue_diagnose_bug
108
+ - NestJS 问题 → mcp__devflow__nest_diagnose_bug
109
+ - 代码搜索 → mcp__devflow__search_symbol
110
+ - 知识查询 → mcp__devflow__get_knowledge
111
+
112
+ ### Step 3: 基于工具返回结果进行分析
113
+ 用 Read 确认工具返回的关键文件,然后给出分析结论。
114
+
115
+ ### 铁律
116
+ - 永远不要用 Explore、Agent、Grep 或 Glob 替代 MCP 工具的第一步上下文获取
117
+ - Every mcp__devflow__ tool MUST pass projectRoot = \${CLAUDE_PROJECT_DIR}; missing projectRoot is rejected; no cwd fallback.
118
+ - 如果 MCP 工具返回错误,重试一次;再失败则回退到直接读文件"
119
+
120
+ MEMORY_DISTILL="
121
+
122
+ Next session instruction: call mcp__devflow__memory_request_distill once at session start; it safely reports when no memory events are pending."
123
+
124
+ DEVFLOW_DAEMON_REACHABLE=0
125
+ run_lifecycle() {
126
+ local PROJECT_HASH=""
127
+ local log_dir="${HOME}/.devflow/logs"
128
+ local fallback_dir="${TMPDIR:-/tmp}"
129
+
130
+ if command -v shasum >/dev/null 2>&1; then
131
+ PROJECT_HASH=$(printf '%s' "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16) || PROJECT_HASH=""
132
+ fi
133
+ [[ "$PROJECT_HASH" =~ ^[0-9a-f]{16}$ ]] || PROJECT_HASH=""
134
+
135
+ if mkdir -p "$log_dir" 2>/dev/null; then
136
+ DAEMON_LOG="${log_dir}/hook-daemon-${PROJECT_HASH:-fallback}.log"
137
+ SERVER_LOG="${HOME}/.devflow/logs/server.log"
138
+ elif [ -d "$fallback_dir" ]; then
139
+ DAEMON_LOG="${fallback_dir}/devflow-hook-daemon-${PROJECT_HASH:-fallback}.log"
140
+ SERVER_LOG="${fallback_dir}/devflow-server.log"
141
+ else
142
+ DAEMON_LOG="/dev/null"
143
+ SERVER_LOG="/dev/null"
144
+ fi
145
+
146
+ DAEMON_JS="${PLUGIN_ROOT}/dist/hooks/hook-daemon.js"
147
+ CLIENT_JS="${PLUGIN_ROOT}/dist/hooks/hook-client.js"
148
+
149
+ register_session() {
150
+ local suppress_fallback="${1:-1}"
151
+ [ -n "$SESSION_START_INPUT" ] || return 0
152
+ [ -f "$CLIENT_JS" ] || return 1
153
+ if DEVFLOW_HOOK_CLIENT_TIMEOUT_MS=250 \
154
+ DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS=50 \
155
+ DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG="$suppress_fallback" \
156
+ node "$CLIENT_JS" session-start "$SESSION_START_INPUT" >/dev/null 2>> "$DAEMON_LOG"; then
157
+ DEVFLOW_DAEMON_REACHABLE=1
158
+ return 0
159
+ fi
160
+ return 1
161
+ }
162
+
163
+ if [ -n "$SESSION_START_INPUT" ] && register_session 1; then
164
+ :
165
+ elif [ -f "$DAEMON_JS" ] && command -v nohup >/dev/null 2>&1 && command -v node >/dev/null 2>&1; then
166
+ if [ -n "$SESSION_START_INPUT" ]; then
167
+ nohup node "$DAEMON_JS" "$PROJECT_ROOT" "$SESSION_START_INPUT" </dev/null >> "$DAEMON_LOG" 2>&1 &
168
+ else
169
+ nohup node "$DAEMON_JS" "$PROJECT_ROOT" </dev/null >> "$DAEMON_LOG" 2>&1 &
170
+ fi
171
+ DAEMON_PID=$!
172
+ echo "[devflow] Hook daemon started for ${PROJECT_ROOT} (PID ${DAEMON_PID})" >&2 || true
173
+
174
+ if [ -n "$SESSION_START_INPUT" ]; then
175
+ for _ in 1 2 3 4 5 6 7 8; do
176
+ register_session 1 && break
177
+ sleep 0.05
178
+ done
179
+ fi
180
+ fi
181
+
182
+ if [ -n "$SESSION_START_INPUT" ] && [ "$DEVFLOW_DAEMON_REACHABLE" != "1" ]; then
183
+ register_session 0 || true
184
+ fi
185
+
186
+ SERVER_BOOTSTRAP_JS="${PLUGIN_ROOT}/dist/hooks/server-bootstrap.js"
187
+ if [ -f "$SERVER_BOOTSTRAP_JS" ] && command -v nohup >/dev/null 2>&1 && command -v node >/dev/null 2>&1; then
188
+ nohup node "$SERVER_BOOTSTRAP_JS" </dev/null >> "$SERVER_LOG" 2>&1 &
189
+ fi
190
+ }
191
+
192
+ run_lifecycle || true
193
+
194
+ DEGRADED_CONTEXT=""
195
+ if [ "$DEVFLOW_DAEMON_REACHABLE" != "1" ]; then
196
+ DEGRADED_CONTEXT="
197
+
198
+ 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."
199
+ fi
200
+
201
+ MEMORY_SNAPSHOT="## Project memory\n本项目暂无记忆"
202
+ CONFIG_FILE="${PROJECT_ROOT}/.devflow/config.json"
203
+ MEMORY_RESPONSE=""
204
+ if [ -f "${CLIENT_JS:-}" ] && command -v node >/dev/null 2>&1; then
205
+ MEMORY_RESPONSE=$(DEVFLOW_HOOK_CLIENT_TIMEOUT_MS=1000 node "$CLIENT_JS" memory-snapshot </dev/null 2>/dev/null || echo "")
206
+ fi
207
+ if command -v python3 >/dev/null 2>&1; then
208
+ MEMORY_SNAPSHOT=$(DEVFLOW_MEMORY_RESPONSE="$MEMORY_RESPONSE" python3 - "$CONFIG_FILE" 2>/dev/null <<'PY'
209
+ import json,os,sys
210
+ try: cfg=json.load(open(sys.argv[1])).get('sessionStart',{}).get('injectMemories',True)
211
+ except Exception: cfg=True
212
+ if cfg is False: print(''); raise SystemExit
213
+ try: response=json.loads(os.environ.get('DEVFLOW_MEMORY_RESPONSE',''))
214
+ except Exception: response={}
215
+ print(response.get('markdown') or '## Project memory\n本项目暂无记忆')
216
+ PY
217
+ ) || MEMORY_SNAPSHOT="## Project memory\n本项目暂无记忆"
218
+ fi
219
+
220
+ ONBOARDING_SNAPSHOT=""
221
+ ONBOARDING_FILE="${PROJECT_ROOT}/.devflow/onboarding-pack.json"
222
+ if [ -f "$ONBOARDING_FILE" ] && command -v python3 >/dev/null 2>&1; then
223
+ ONBOARDING_SNAPSHOT=$(python3 - "$ONBOARDING_FILE" 2>/dev/null <<'PY'
224
+ import json,sys
225
+ def clean(value): return ' '.join(str(value).split())[:120]
226
+ try: data=json.load(open(sys.argv[1]))
227
+ except Exception: raise SystemExit
228
+ modules=[clean(item.get('name','')) for item in data.get('keyModules',[])[:6] if item.get('name')]
229
+ layers=[f"{clean(item.get('name',''))} ({int(item.get('files',0))} files)" for item in data.get('architectureLayers',[])[:6] if item.get('name')]
230
+ if modules or layers:
231
+ print('## Project map (auto-injected)')
232
+ if modules: print('Key modules: ' + ', '.join(modules))
233
+ if layers: print('Architecture: ' + ', '.join(layers))
234
+ PY
235
+ ) || ONBOARDING_SNAPSHOT=""
236
+ fi
237
+
238
+ SUMMARY="${SUMMARY}${DEGRADED_CONTEXT}${MEMORY_DISTILL}\n\n${ONBOARDING_SNAPSHOT}\n\n${MEMORY_SNAPSHOT}${MCP_PROTOCOL}${GLOBAL_CONSTRAINT}${GATEWAY_STATUS}"
239
+
240
+ if command -v python3 >/dev/null 2>&1 \
241
+ && ESCAPED=$(printf '%s\n' "$SUMMARY" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))" 2>/dev/null); then
242
+ :
243
+ else
244
+ ESCAPED='"Next session instruction: call mcp__devflow__memory_request_distill once at session start; it safely reports when no memory events are pending."'
245
+ fi
246
+
247
+ printf '{\n "hookSpecificOutput": {\n "hookEventName": "SessionStart",\n "additionalContext": %s\n }\n}\n' "$ESCAPED"
248
+
249
+ exit 0