@devflow-tools/cli 0.8.7 → 0.8.8
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/memory.d.ts +1 -0
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +51 -0
- package/dist/commands/memory.js.map +1 -1
- package/dist/plugin-files/hooks/post-tool-use +37 -12
- package/dist/plugin-files/hooks/session-start +18 -0
- package/dist/plugin-files/package.json +2 -2
- package/package.json +26 -26
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function showMemory(skipServer?: boolean): Promise<unknown>;
|
|
2
2
|
export declare function setMemory(key: string, value: string, skipServer?: boolean): Promise<void>;
|
|
3
3
|
export declare function reviewCandidates(skipServer?: boolean): Promise<unknown>;
|
|
4
|
+
export declare function reviewMemories(): Promise<void>;
|
|
4
5
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAUvE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/F;AAED,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7E;AAYD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDpD"}
|
package/dist/commands/memory.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { withServer } from "../lib/with-server.js";
|
|
2
2
|
import { createEngines } from "@devflow-tools/context-engine";
|
|
3
|
+
import readline from "node:readline";
|
|
3
4
|
export async function showMemory(skipServer) {
|
|
4
5
|
return withServer(process.cwd(), (client) => client.getMemory(), async () => {
|
|
5
6
|
const { memory } = await createEngines(process.cwd());
|
|
@@ -18,4 +19,54 @@ export async function reviewCandidates(skipServer) {
|
|
|
18
19
|
return memory.getCandidates();
|
|
19
20
|
}, { skipServer });
|
|
20
21
|
}
|
|
22
|
+
function promptUser(question) {
|
|
23
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
24
|
+
return new Promise(resolve => {
|
|
25
|
+
rl.question(question, (answer) => {
|
|
26
|
+
rl.close();
|
|
27
|
+
resolve(answer.trim().toLowerCase());
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export async function reviewMemories() {
|
|
32
|
+
const result = await withServer(process.cwd(), async (client) => {
|
|
33
|
+
const data = await client.getMemory();
|
|
34
|
+
return data.memories?.filter((m) => m.status === 'pending') ?? [];
|
|
35
|
+
}, async () => {
|
|
36
|
+
const { memory } = await createEngines(process.cwd());
|
|
37
|
+
return memory.getPendingMemories();
|
|
38
|
+
}, { skipServer: false });
|
|
39
|
+
const pending = result;
|
|
40
|
+
if (pending.length === 0) {
|
|
41
|
+
console.log('No pending memories to review.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const sorted = [...pending].sort((a, b) => {
|
|
45
|
+
if (a.category === 'failure_lesson' && b.category !== 'failure_lesson')
|
|
46
|
+
return -1;
|
|
47
|
+
if (b.category === 'failure_lesson' && a.category !== 'failure_lesson')
|
|
48
|
+
return 1;
|
|
49
|
+
return 0;
|
|
50
|
+
});
|
|
51
|
+
let reviewed = 0;
|
|
52
|
+
for (const mem of sorted) {
|
|
53
|
+
console.log(`\n[${mem.category}] (confidence: ${(mem.confidence * 100).toFixed(0)}%)`);
|
|
54
|
+
console.log(` ${mem.content}`);
|
|
55
|
+
const answer = await promptUser(' Approve? [y]es / [n]o / [s]kip: ');
|
|
56
|
+
if (answer === 'y') {
|
|
57
|
+
await withServer(process.cwd(), async (client) => { await client.approveMemory(mem.id); }, async () => { }, { skipServer: false });
|
|
58
|
+
console.log(' Approved');
|
|
59
|
+
reviewed++;
|
|
60
|
+
}
|
|
61
|
+
else if (answer === 'n') {
|
|
62
|
+
await withServer(process.cwd(), async (client) => { await client.rejectMemory(mem.id); }, async () => { }, { skipServer: false });
|
|
63
|
+
console.log(' Rejected');
|
|
64
|
+
reviewed++;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(' -> Skipped');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
console.log(`\nReviewed ${reviewed}/${pending.length} pending memories.`);
|
|
71
|
+
}
|
|
21
72
|
//# sourceMappingURL=memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA0B,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,44 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
# PostToolUse Hook — DevFlow post-correction
|
|
5
|
-
# After AI uses a native tool that could have been an MCP tool, inject a corrective reminder.
|
|
6
|
-
|
|
7
4
|
INPUT_JSON=$(cat)
|
|
5
|
+
|
|
6
|
+
# ── Event Recording (best-effort, never blocks hook) ──
|
|
7
|
+
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
8
|
+
|
|
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
|
|
40
|
+
|
|
41
|
+
# ── Original Enforcement Logic ──
|
|
8
42
|
TOOL_NAME=$(python3 -c "
|
|
9
43
|
import sys, json
|
|
10
44
|
try:
|
|
@@ -14,7 +48,6 @@ except:
|
|
|
14
48
|
print('')
|
|
15
49
|
" <<< "$INPUT_JSON" 2>/dev/null || echo "")
|
|
16
50
|
|
|
17
|
-
# Only interested in tools that could bypass MCP
|
|
18
51
|
case "$TOOL_NAME" in
|
|
19
52
|
Agent|Bash|Glob|Grep|WebSearch|WebFetch)
|
|
20
53
|
;;
|
|
@@ -23,14 +56,11 @@ case "$TOOL_NAME" in
|
|
|
23
56
|
;;
|
|
24
57
|
esac
|
|
25
58
|
|
|
26
|
-
# Determine project root and receipt file
|
|
27
|
-
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
|
|
28
59
|
RECEIPT_DIR="${TMPDIR:-/tmp}/.devflow-receipts"
|
|
29
60
|
mkdir -p "$RECEIPT_DIR"
|
|
30
61
|
SESSION_ID=$(echo -n "$PROJECT_ROOT" | shasum -a 256 2>/dev/null | cut -c1-16 || echo "default")
|
|
31
62
|
RECEIPT_FILE="$RECEIPT_DIR/${SESSION_ID}.json"
|
|
32
63
|
|
|
33
|
-
# Check if there was a recent MCP call (within 30s) — if yes, this native tool call is supplementary, not a bypass
|
|
34
64
|
HAS_RECENT_MCP=false
|
|
35
65
|
if [ -f "$RECEIPT_FILE" ]; then
|
|
36
66
|
last_call=$(python3 -c "
|
|
@@ -50,7 +80,6 @@ except:
|
|
|
50
80
|
fi
|
|
51
81
|
fi
|
|
52
82
|
|
|
53
|
-
# Read current bypass count
|
|
54
83
|
BYPASS_COUNT=0
|
|
55
84
|
if [ -f "$RECEIPT_FILE" ]; then
|
|
56
85
|
BYPASS_COUNT=$(python3 -c "
|
|
@@ -61,12 +90,10 @@ print(d.get('bypassCount', 0))
|
|
|
61
90
|
" 2>/dev/null || echo "0")
|
|
62
91
|
fi
|
|
63
92
|
|
|
64
|
-
# If no bypasses yet, nothing to correct
|
|
65
93
|
if [ "$BYPASS_COUNT" -eq 0 ]; then
|
|
66
94
|
exit 0
|
|
67
95
|
fi
|
|
68
96
|
|
|
69
|
-
# Build corrective message based on tool type and count
|
|
70
97
|
case "$TOOL_NAME" in
|
|
71
98
|
Agent)
|
|
72
99
|
MESSAGE="第 ${BYPASS_COUNT} 次违规:你刚才使用了 Agent 子代理执行搜索。下次请用 get_project_context MCP 工具替代。"
|
|
@@ -88,7 +115,6 @@ case "$TOOL_NAME" in
|
|
|
88
115
|
;;
|
|
89
116
|
esac
|
|
90
117
|
|
|
91
|
-
# Add enforcement status
|
|
92
118
|
if [ "$BYPASS_COUNT" -ge 3 ]; then
|
|
93
119
|
MESSAGE="${MESSAGE} 已达到最大违规次数,后续绕过将被硬阻止。"
|
|
94
120
|
elif [ "$BYPASS_COUNT" -ge 2 ]; then
|
|
@@ -97,7 +123,6 @@ else
|
|
|
97
123
|
MESSAGE="${MESSAGE} 请立即纠正。"
|
|
98
124
|
fi
|
|
99
125
|
|
|
100
|
-
# Output as additionalContext injection
|
|
101
126
|
if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
|
|
102
127
|
ESCAPED=$(printf '%s' "$MESSAGE" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
|
|
103
128
|
printf '{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"%s"}}\n' "$ESCAPED"
|
|
@@ -93,4 +93,22 @@ if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ]; then
|
|
|
93
93
|
fi
|
|
94
94
|
fi
|
|
95
95
|
|
|
96
|
+
# ── Trigger memory extraction for previous session events (best-effort, async) ──
|
|
97
|
+
(python3 -c "
|
|
98
|
+
import urllib.request, json, sys
|
|
99
|
+
try:
|
|
100
|
+
req = urllib.request.Request(
|
|
101
|
+
'http://localhost:13337/api/memory/process?rootPath=${CLAUDE_PROJECT_DIR:-$(pwd)}',
|
|
102
|
+
data=b'{}',
|
|
103
|
+
headers={'Content-Type': 'application/json', 'X-API-Key': 'dev-key-000000'},
|
|
104
|
+
method='POST',
|
|
105
|
+
)
|
|
106
|
+
resp = urllib.request.urlopen(req, timeout=30)
|
|
107
|
+
result = json.loads(resp.read())
|
|
108
|
+
print('DevFlow memory: {} extracted, {} approved, {} pending'.format(
|
|
109
|
+
result.get('extracted', 0), result.get('approved', 0), result.get('pending', 0)), file=sys.stderr)
|
|
110
|
+
except Exception as e:
|
|
111
|
+
print('DevFlow memory extraction skipped: {}'.format(e), file=sys.stderr)
|
|
112
|
+
" 2>/dev/null || true) &
|
|
113
|
+
|
|
96
114
|
exit 0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.8",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "DevFlow — Developer Intelligence Platform for Claude Code",
|
|
6
6
|
"type": "module",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"deploy": "npx tsx scripts/inject-gates.ts --deploy"
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@devflow-tools/mcp-server": "^0.8.
|
|
12
|
+
"@devflow-tools/mcp-server": "^0.8.8"
|
|
13
13
|
},
|
|
14
14
|
"keywords": [
|
|
15
15
|
"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.8",
|
|
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.8",
|
|
16
|
+
"@devflow-tools/benchmark": "^0.8.8",
|
|
17
|
+
"@devflow-tools/context-engine": "^0.8.8",
|
|
18
|
+
"@devflow-tools/database": "^0.8.8",
|
|
19
|
+
"@devflow-tools/knowledge-engine": "^0.8.8",
|
|
20
|
+
"@devflow-tools/mcp-server": "^0.8.8",
|
|
21
|
+
"@devflow-tools/memory-engine": "^0.8.8",
|
|
22
|
+
"@devflow-tools/plugin-animation": "^0.8.8",
|
|
23
|
+
"@devflow-tools/plugin-css": "^0.8.8",
|
|
24
|
+
"@devflow-tools/plugin-docker": "^0.8.8",
|
|
25
|
+
"@devflow-tools/plugin-electron": "^0.8.8",
|
|
26
|
+
"@devflow-tools/plugin-git": "^0.8.8",
|
|
27
|
+
"@devflow-tools/plugin-graphql": "^0.8.8",
|
|
28
|
+
"@devflow-tools/plugin-nest": "^0.8.8",
|
|
29
|
+
"@devflow-tools/plugin-nextjs": "^0.8.8",
|
|
30
|
+
"@devflow-tools/plugin-performance": "^0.8.8",
|
|
31
|
+
"@devflow-tools/plugin-react": "^0.8.8",
|
|
32
|
+
"@devflow-tools/plugin-tailwind": "^0.8.8",
|
|
33
|
+
"@devflow-tools/plugin-taro": "^0.8.8",
|
|
34
|
+
"@devflow-tools/plugin-ui-layout": "^0.8.8",
|
|
35
|
+
"@devflow-tools/plugin-vue": "^0.8.8",
|
|
36
|
+
"@devflow-tools/sdk": "^0.8.8",
|
|
37
|
+
"@devflow-tools/server": "^0.8.8",
|
|
38
|
+
"@devflow-tools/telemetry": "^0.8.8",
|
|
39
|
+
"@devflow-tools/workflow-engine": "^0.8.8",
|
|
40
40
|
"@inquirer/prompts": "^7.10.1",
|
|
41
41
|
"chalk": "^5.3.0",
|
|
42
42
|
"commander": "^12.0.0"
|