@devflow-tools/cli 0.8.9 → 0.8.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @devflow-tools/cli
2
2
 
3
- DevFlow CLI — one command to initialize and manage DevFlow in any project.
3
+ DevFlow CLI — 一行命令在任意项目中初始化和管理 DevFlow。
4
4
 
5
5
  ## Installation
6
6
 
@@ -15,30 +15,31 @@ cd your-project
15
15
  devflow init
16
16
  ```
17
17
 
18
- This single command:
19
- - Initializes `.devflow/` project config
20
- - Indexes codebase with CodeGraph
21
- - Deploys the DevFlow Claude Code plugin
22
- - Enables the plugin in `~/.claude/settings.json`
23
- - Configures MCP server in `.claude/mcp.json`
18
+ 此命令自动完成:
19
+ - 初始化 `.devflow/` 项目配置目录
20
+ - 分析项目技术栈和结构
21
+ - 生成 Onboarding Pack(`devflow init --report` 可查看)
22
+ - 部署 DevFlow Claude Code 插件到 `~/.claude/plugins/`
23
+ - 配置 MCP server 在 `.claude/mcp.json`
24
24
 
25
- Then run `claude` and use `/devflow:react`, `/devflow:context`, etc.
25
+ 然后运行 `claude`,直接使用 `/devflow:context`、`/devflow:react` 等命令。
26
26
 
27
27
  ## Commands
28
28
 
29
- | Command | Description |
30
- |---------|-------------|
31
- | `devflow init` | Initialize DevFlow in the current project |
32
- | `devflow connect [agent]` | Configure MCP for Claude Code, Cursor, Codex |
33
- | `devflow index` | Show code index status |
34
- | `devflow graph [target]` | Show dependency graph (`--depth <n>`) |
35
- | `devflow context <query>` | Search project context (`--mode fast\|deep`) |
36
- | `devflow workflow list` | List available workflows |
37
- | `devflow workflow run <type>` | Run a workflow |
38
- | `devflow memory show` | Show project memory |
39
- | `devflow knowledge <query>` | Search knowledge base |
40
- | `devflow doctor` | Run project health check |
41
- | `devflow server start` | Start DevFlow REST server |
29
+ | 命令 | 说明 |
30
+ |------|------|
31
+ | `devflow init` | 初始化 DevFlow(生成 Onboarding Pack + 部署插件) |
32
+ | `devflow init --report` | 初始化并生成人类可读的 Markdown 报告 |
33
+ | `devflow connect [agent]` | 配置 AI Agent MCP 连接(claude/cursor/codex) |
34
+ | `devflow index` | 查看代码索引状态 |
35
+ | `devflow graph [target]` | 显示依赖图谱(`--depth <n>` 控制展开深度) |
36
+ | `devflow context <query>` | 检索项目上下文(`--task` 任务模式,`--why` 显示推理) |
37
+ | `devflow workflow list` | 列出可用工作流 |
38
+ | `devflow workflow run <type>` | 运行工作流 |
39
+ | `devflow memory show` | 查看项目记忆(技术栈、约定、历史决策) |
40
+ | `devflow knowledge <query>` | 搜索技术文档知识库 |
41
+ | `devflow doctor` | 运行项目健康检查 |
42
+ | `devflow server start` | 启动 DevFlow REST 服务器 |
42
43
 
43
44
  ## Requirements
44
45
 
@@ -2,51 +2,23 @@
2
2
  set -euo pipefail
3
3
 
4
4
  INPUT_JSON=$(cat)
5
-
6
- # ── Event Recording (best-effort, never blocks hook) ──
7
5
  PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
8
6
 
9
- python3 -c "
10
- import json, sys, urllib.request, time
11
-
12
- try:
13
- data = json.loads(sys.argv[1])
14
- except:
15
- sys.exit(0)
16
-
17
- tool_name = data.get('tool_name', '')
18
- session_id = data.get('session_id', '')
19
- tool_input = data.get('tool_input', {})
20
-
21
- evt = {
22
- 'id': 'evt_{}_{}'.format(int(time.time()), __import__('random').randint(1000, 9999)),
23
- 'sessionId': session_id,
24
- 'tool': tool_name,
25
- 'command': tool_input.get('command', '') if isinstance(tool_input, dict) else '',
26
- 'createdAt': int(time.time() * 1000),
27
- }
28
-
29
- try:
30
- req = urllib.request.Request(
31
- 'http://localhost:13337/api/memory/events?rootPath=' + sys.argv[2],
32
- data=json.dumps(evt).encode(),
33
- headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
34
- method='POST',
35
- )
36
- urllib.request.urlopen(req, timeout=3)
37
- except:
38
- pass
39
- " "$INPUT_JSON" "$PROJECT_ROOT" 2>/dev/null || true
7
+ # ── Event Recording via Node.js (best-effort, never blocks hook) ──
8
+ HOOK_JS="${CLAUDE_PLUGIN_ROOT:-}/dist/hooks/post-tool-use.js"
9
+ if [ -f "$HOOK_JS" ]; then
10
+ node "$HOOK_JS" "$INPUT_JSON" 2>/dev/null || true
11
+ fi
40
12
 
41
- # ── Original Enforcement Logic ──
42
- TOOL_NAME=$(python3 -c "
13
+ # ── Enforcement Logic ──
14
+ TOOL_NAME=$(echo "$INPUT_JSON" | python3 -c "
43
15
  import sys, json
44
16
  try:
45
17
  data = json.load(sys.stdin)
46
18
  print(data.get('tool_name', ''))
47
19
  except:
48
20
  print('')
49
- " <<< "$INPUT_JSON" 2>/dev/null || echo "")
21
+ " 2>/dev/null || echo "")
50
22
 
51
23
  case "$TOOL_NAME" in
52
24
  Agent|Bash|Glob|Grep|WebSearch|WebFetch)
@@ -46,6 +46,44 @@ RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
46
46
  OVERRIDE_FILE="$RECEIPT_DIR/${SESSION_ID}.override"
47
47
  rm -f "$RECEIPT_FILE" "$OVERRIDE_FILE" 2>/dev/null || true
48
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
+
49
87
  # Determine plugin root directory (same way as superpowers)
50
88
  if [ -z "${CLAUDE_PLUGIN_ROOT:-}" ]; then
51
89
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
@@ -98,7 +136,7 @@ fi
98
136
  import urllib.request, json, sys
99
137
  try:
100
138
  req = urllib.request.Request(
101
- 'http://localhost:13337/api/memory/process?rootPath=${CLAUDE_PROJECT_DIR:-$(pwd)}',
139
+ 'http://127.0.0.1:13337/api/memory/process?rootPath=${CLAUDE_PROJECT_DIR:-$(pwd)}',
102
140
  data=b'{}',
103
141
  headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
104
142
  method='POST',
@@ -1,31 +1,10 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- # Stop Hook — DevFlow session cleanup
5
- # Cleans up receipt/override files and outputs violation summary.
4
+ HOOK_JS="${CLAUDE_PLUGIN_ROOT:-}/dist/hooks/stop.js"
6
5
 
7
- PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
8
- RECEIPT_DIR="${TMPDIR:-/tmp}/.devflow-receipts"
9
- SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "default")
10
- RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
11
- OVERRIDE_FILE="$RECEIPT_DIR/${SESSION_ID}.override"
12
-
13
- if [ -f "$RECEIPT_FILE" ]; then
14
- # Read and output summary
15
- python3 -c "
16
- import json
17
- with open('$RECEIPT_FILE') as f:
18
- d = json.load(f)
19
- bypass = d.get('bypassCount', 0)
20
- print(f'会话违规统计: {bypass}/3')
21
- if bypass > 0:
22
- print(f'最后一次拦截: {d.get(\"lastAttempt\", \"N/A\")}')
23
- " 2>/dev/null || true
24
-
25
- # Cleanup
26
- rm -f "$RECEIPT_FILE"
6
+ if [ -f "$HOOK_JS" ]; then
7
+ node "$HOOK_JS" 2>/dev/null || true
27
8
  fi
28
9
 
29
- rm -f "$OVERRIDE_FILE"
30
-
31
10
  exit 0
@@ -35,6 +35,18 @@
35
35
  }
36
36
  ]
37
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
+ }
38
50
  ]
39
51
  }
40
52
  }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/claude-code-plugin",
3
- "version": "0.8.8",
4
- "private": true,
3
+ "version": "0.8.10",
5
4
  "description": "DevFlow — Developer Intelligence Platform for Claude Code",
6
5
  "type": "module",
7
6
  "scripts": {
@@ -9,7 +8,7 @@
9
8
  "deploy": "npx tsx scripts/inject-gates.ts --deploy"
10
9
  },
11
10
  "devDependencies": {
12
- "@devflow-tools/mcp-server": "^0.8.9"
11
+ "@devflow-tools/mcp-server": "^0.8.10"
13
12
  },
14
13
  "keywords": [
15
14
  "pi-package",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/cli",
3
- "version": "0.8.9",
3
+ "version": "0.8.11",
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.8.9",
16
- "@devflow-tools/benchmark": "^0.8.9",
17
- "@devflow-tools/context-engine": "^0.8.9",
18
- "@devflow-tools/database": "^0.8.9",
19
- "@devflow-tools/knowledge-engine": "^0.8.9",
20
- "@devflow-tools/mcp-server": "^0.8.9",
21
- "@devflow-tools/memory-engine": "^0.8.9",
22
- "@devflow-tools/plugin-animation": "^0.8.9",
23
- "@devflow-tools/plugin-css": "^0.8.9",
24
- "@devflow-tools/plugin-docker": "^0.8.9",
25
- "@devflow-tools/plugin-electron": "^0.8.9",
26
- "@devflow-tools/plugin-git": "^0.8.9",
27
- "@devflow-tools/plugin-graphql": "^0.8.9",
28
- "@devflow-tools/plugin-nest": "^0.8.9",
29
- "@devflow-tools/plugin-nextjs": "^0.8.9",
30
- "@devflow-tools/plugin-performance": "^0.8.9",
31
- "@devflow-tools/plugin-react": "^0.8.9",
32
- "@devflow-tools/plugin-tailwind": "^0.8.9",
33
- "@devflow-tools/plugin-taro": "^0.8.9",
34
- "@devflow-tools/plugin-ui-layout": "^0.8.9",
35
- "@devflow-tools/plugin-vue": "^0.8.9",
36
- "@devflow-tools/sdk": "^0.8.9",
37
- "@devflow-tools/server": "^0.8.9",
38
- "@devflow-tools/telemetry": "^0.8.9",
39
- "@devflow-tools/workflow-engine": "^0.8.9",
15
+ "@devflow-tools/adapters": "^0.8.11",
16
+ "@devflow-tools/benchmark": "^0.8.11",
17
+ "@devflow-tools/context-engine": "^0.8.11",
18
+ "@devflow-tools/database": "^0.8.11",
19
+ "@devflow-tools/knowledge-engine": "^0.8.11",
20
+ "@devflow-tools/mcp-server": "^0.8.11",
21
+ "@devflow-tools/memory-engine": "^0.8.11",
22
+ "@devflow-tools/plugin-animation": "^0.8.11",
23
+ "@devflow-tools/plugin-css": "^0.8.11",
24
+ "@devflow-tools/plugin-docker": "^0.8.11",
25
+ "@devflow-tools/plugin-electron": "^0.8.11",
26
+ "@devflow-tools/plugin-git": "^0.8.11",
27
+ "@devflow-tools/plugin-graphql": "^0.8.11",
28
+ "@devflow-tools/plugin-nest": "^0.8.11",
29
+ "@devflow-tools/plugin-nextjs": "^0.8.11",
30
+ "@devflow-tools/plugin-performance": "^0.8.11",
31
+ "@devflow-tools/plugin-react": "^0.8.11",
32
+ "@devflow-tools/plugin-tailwind": "^0.8.11",
33
+ "@devflow-tools/plugin-taro": "^0.8.11",
34
+ "@devflow-tools/plugin-ui-layout": "^0.8.11",
35
+ "@devflow-tools/plugin-vue": "^0.8.11",
36
+ "@devflow-tools/sdk": "^0.8.11",
37
+ "@devflow-tools/server": "^0.8.11",
38
+ "@devflow-tools/telemetry": "^0.8.11",
39
+ "@devflow-tools/workflow-engine": "^0.8.11",
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": "5c9a804d3c2e6e6822b516fde67d5b789dbdb5b3"
52
+ "gitHead": "a0a0b61377aa88ebbd380f50a5d532f63175ef45"
53
53
  }