@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 —
|
|
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
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
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
|
-
|
|
25
|
+
然后运行 `claude`,直接使用 `/devflow:context`、`/devflow:react` 等命令。
|
|
26
26
|
|
|
27
27
|
## Commands
|
|
28
28
|
|
|
29
|
-
|
|
|
30
|
-
|
|
31
|
-
| `devflow init` |
|
|
32
|
-
| `devflow
|
|
33
|
-
| `devflow
|
|
34
|
-
| `devflow
|
|
35
|
-
| `devflow
|
|
36
|
-
| `devflow
|
|
37
|
-
| `devflow workflow
|
|
38
|
-
| `devflow
|
|
39
|
-
| `devflow
|
|
40
|
-
| `devflow
|
|
41
|
-
| `devflow
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
# ──
|
|
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
|
-
"
|
|
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://
|
|
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
|
-
|
|
5
|
-
# Cleans up receipt/override files and outputs violation summary.
|
|
4
|
+
HOOK_JS="${CLAUDE_PLUGIN_ROOT:-}/dist/hooks/stop.js"
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
|
-
"version": "0.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.
|
|
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.
|
|
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.
|
|
16
|
-
"@devflow-tools/benchmark": "^0.8.
|
|
17
|
-
"@devflow-tools/context-engine": "^0.8.
|
|
18
|
-
"@devflow-tools/database": "^0.8.
|
|
19
|
-
"@devflow-tools/knowledge-engine": "^0.8.
|
|
20
|
-
"@devflow-tools/mcp-server": "^0.8.
|
|
21
|
-
"@devflow-tools/memory-engine": "^0.8.
|
|
22
|
-
"@devflow-tools/plugin-animation": "^0.8.
|
|
23
|
-
"@devflow-tools/plugin-css": "^0.8.
|
|
24
|
-
"@devflow-tools/plugin-docker": "^0.8.
|
|
25
|
-
"@devflow-tools/plugin-electron": "^0.8.
|
|
26
|
-
"@devflow-tools/plugin-git": "^0.8.
|
|
27
|
-
"@devflow-tools/plugin-graphql": "^0.8.
|
|
28
|
-
"@devflow-tools/plugin-nest": "^0.8.
|
|
29
|
-
"@devflow-tools/plugin-nextjs": "^0.8.
|
|
30
|
-
"@devflow-tools/plugin-performance": "^0.8.
|
|
31
|
-
"@devflow-tools/plugin-react": "^0.8.
|
|
32
|
-
"@devflow-tools/plugin-tailwind": "^0.8.
|
|
33
|
-
"@devflow-tools/plugin-taro": "^0.8.
|
|
34
|
-
"@devflow-tools/plugin-ui-layout": "^0.8.
|
|
35
|
-
"@devflow-tools/plugin-vue": "^0.8.
|
|
36
|
-
"@devflow-tools/sdk": "^0.8.
|
|
37
|
-
"@devflow-tools/server": "^0.8.
|
|
38
|
-
"@devflow-tools/telemetry": "^0.8.
|
|
39
|
-
"@devflow-tools/workflow-engine": "^0.8.
|
|
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": "
|
|
52
|
+
"gitHead": "a0a0b61377aa88ebbd380f50a5d532f63175ef45"
|
|
53
53
|
}
|