@roarpeng/graphflow 1.9.4 → 1.9.12
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/CHANGELOG.md +133 -0
- package/README.md +193 -107
- package/dist/agents/atp-example-producer.d.ts +33 -0
- package/dist/agents/atp-example-producer.d.ts.map +1 -0
- package/dist/agents/atp-example-producer.js +154 -0
- package/dist/agents/atp-example-producer.js.map +1 -0
- package/dist/agents/planner.d.ts.map +1 -1
- package/dist/agents/planner.js +14 -8
- package/dist/agents/planner.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/include-extensions.d.ts +3 -1
- package/dist/config/include-extensions.d.ts.map +1 -1
- package/dist/config/include-extensions.js +6 -3
- package/dist/config/include-extensions.js.map +1 -1
- package/dist/config/loader.js +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/core/agent-delegation.d.ts +16 -2
- package/dist/core/agent-delegation.d.ts.map +1 -1
- package/dist/core/agent-delegation.js +48 -5
- package/dist/core/agent-delegation.js.map +1 -1
- package/dist/core/merge-agent-insight.d.ts.map +1 -1
- package/dist/core/merge-agent-insight.js +10 -0
- package/dist/core/merge-agent-insight.js.map +1 -1
- package/dist/core/orchestrator-episode.d.ts.map +1 -1
- package/dist/core/orchestrator-episode.js +24 -0
- package/dist/core/orchestrator-episode.js.map +1 -1
- package/dist/core/orchestrator.js +52 -1
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/submit-agent-insight.d.ts +17 -0
- package/dist/core/submit-agent-insight.d.ts.map +1 -1
- package/dist/core/submit-agent-insight.js +28 -0
- package/dist/core/submit-agent-insight.js.map +1 -1
- package/dist/core/types.d.ts +35 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/client-factory.d.ts +4 -0
- package/dist/graph/client-factory.d.ts.map +1 -1
- package/dist/graph/client-factory.js +83 -7
- package/dist/graph/client-factory.js.map +1 -1
- package/dist/graph/context-slicer-types.d.ts +4 -0
- package/dist/graph/context-slicer-types.d.ts.map +1 -1
- package/dist/graph/context-slicer-types.js +3 -0
- package/dist/graph/context-slicer-types.js.map +1 -1
- package/dist/graph/context-slicer.d.ts.map +1 -1
- package/dist/graph/context-slicer.js +154 -6
- package/dist/graph/context-slicer.js.map +1 -1
- package/dist/graph/document-convert.d.ts +33 -0
- package/dist/graph/document-convert.d.ts.map +1 -0
- package/dist/graph/document-convert.js +137 -0
- package/dist/graph/document-convert.js.map +1 -0
- package/dist/graph/document-semantic-bridge.d.ts +23 -0
- package/dist/graph/document-semantic-bridge.d.ts.map +1 -0
- package/dist/graph/document-semantic-bridge.js +61 -0
- package/dist/graph/document-semantic-bridge.js.map +1 -0
- package/dist/graph/document-semantic-ingest.d.ts +48 -0
- package/dist/graph/document-semantic-ingest.d.ts.map +1 -0
- package/dist/graph/document-semantic-ingest.js +229 -0
- package/dist/graph/document-semantic-ingest.js.map +1 -0
- package/dist/graph/episode-engineering-links.d.ts +29 -0
- package/dist/graph/episode-engineering-links.d.ts.map +1 -0
- package/dist/graph/episode-engineering-links.js +63 -0
- package/dist/graph/episode-engineering-links.js.map +1 -0
- package/dist/graph/file-indexer-edges.d.ts +26 -0
- package/dist/graph/file-indexer-edges.d.ts.map +1 -1
- package/dist/graph/file-indexer-edges.js +120 -20
- package/dist/graph/file-indexer-edges.js.map +1 -1
- package/dist/graph/file-indexer-nodes.d.ts +18 -0
- package/dist/graph/file-indexer-nodes.d.ts.map +1 -1
- package/dist/graph/file-indexer-nodes.js +0 -0
- package/dist/graph/file-indexer-nodes.js.map +1 -1
- package/dist/graph/file-indexer-walker.d.ts +4 -1
- package/dist/graph/file-indexer-walker.d.ts.map +1 -1
- package/dist/graph/file-indexer-walker.js +33 -16
- package/dist/graph/file-indexer-walker.js.map +1 -1
- package/dist/graph/file-indexer.d.ts +5 -0
- package/dist/graph/file-indexer.d.ts.map +1 -1
- package/dist/graph/file-indexer.js +162 -50
- package/dist/graph/file-indexer.js.map +1 -1
- package/dist/graph/graph-compression.d.ts +11 -2
- package/dist/graph/graph-compression.d.ts.map +1 -1
- package/dist/graph/graph-compression.js +153 -16
- package/dist/graph/graph-compression.js.map +1 -1
- package/dist/graph/graphify-client.d.ts +1 -0
- package/dist/graph/graphify-client.d.ts.map +1 -1
- package/dist/graph/graphify-client.js +24 -9
- package/dist/graph/graphify-client.js.map +1 -1
- package/dist/graph/graphify-file-client.d.ts +1 -0
- package/dist/graph/graphify-file-client.d.ts.map +1 -1
- package/dist/graph/graphify-file-client.js +8 -2
- package/dist/graph/graphify-file-client.js.map +1 -1
- package/dist/graph/language-indexers/c-cpp.d.ts.map +1 -1
- package/dist/graph/language-indexers/c-cpp.js +19 -13
- package/dist/graph/language-indexers/c-cpp.js.map +1 -1
- package/dist/graph/language-indexers/dart.d.ts.map +1 -1
- package/dist/graph/language-indexers/dart.js +2 -6
- package/dist/graph/language-indexers/dart.js.map +1 -1
- package/dist/graph/language-indexers/go.d.ts.map +1 -1
- package/dist/graph/language-indexers/go.js +3 -6
- package/dist/graph/language-indexers/go.js.map +1 -1
- package/dist/graph/language-indexers/java.d.ts.map +1 -1
- package/dist/graph/language-indexers/java.js +2 -6
- package/dist/graph/language-indexers/java.js.map +1 -1
- package/dist/graph/language-indexers/kotlin.d.ts.map +1 -1
- package/dist/graph/language-indexers/kotlin.js +2 -6
- package/dist/graph/language-indexers/kotlin.js.map +1 -1
- package/dist/graph/language-indexers/python.d.ts.map +1 -1
- package/dist/graph/language-indexers/python.js +4 -6
- package/dist/graph/language-indexers/python.js.map +1 -1
- package/dist/graph/language-indexers/ruby.d.ts.map +1 -1
- package/dist/graph/language-indexers/ruby.js +2 -6
- package/dist/graph/language-indexers/ruby.js.map +1 -1
- package/dist/graph/language-indexers/rust.d.ts.map +1 -1
- package/dist/graph/language-indexers/rust.js +3 -6
- package/dist/graph/language-indexers/rust.js.map +1 -1
- package/dist/graph/language-indexers/swift.d.ts.map +1 -1
- package/dist/graph/language-indexers/swift.js +2 -6
- package/dist/graph/language-indexers/swift.js.map +1 -1
- package/dist/graph/language-indexers/tree-sitter-loader.d.ts +20 -0
- package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -1
- package/dist/graph/language-indexers/tree-sitter-loader.js +42 -0
- package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -1
- package/dist/graph/memory-pack.d.ts +46 -0
- package/dist/graph/memory-pack.d.ts.map +1 -0
- package/dist/graph/memory-pack.js +204 -0
- package/dist/graph/memory-pack.js.map +1 -0
- package/dist/graph/snapshot-view.d.ts.map +1 -1
- package/dist/graph/snapshot-view.js +26 -1
- package/dist/graph/snapshot-view.js.map +1 -1
- package/dist/graph/sqlite-client.d.ts +1 -0
- package/dist/graph/sqlite-client.d.ts.map +1 -1
- package/dist/graph/sqlite-client.js +15 -4
- package/dist/graph/sqlite-client.js.map +1 -1
- package/dist/graph/symbol-extract.d.ts +39 -0
- package/dist/graph/symbol-extract.d.ts.map +1 -0
- package/dist/graph/symbol-extract.js +187 -0
- package/dist/graph/symbol-extract.js.map +1 -0
- package/dist/hooks/auto-capture.d.ts +87 -0
- package/dist/hooks/auto-capture.d.ts.map +1 -0
- package/dist/hooks/auto-capture.js +182 -0
- package/dist/hooks/auto-capture.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/agent-mcp-installer.d.ts +87 -5
- package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
- package/dist/integrations/agent-mcp-installer.js +418 -60
- package/dist/integrations/agent-mcp-installer.js.map +1 -1
- package/dist/integrations/agent-profiles/profiles/qoder.d.ts.map +1 -1
- package/dist/integrations/agent-profiles/profiles/qoder.js +14 -2
- package/dist/integrations/agent-profiles/profiles/qoder.js.map +1 -1
- package/dist/integrations/agent-profiles/skills/qoder.js +6 -0
- package/dist/integrations/agent-profiles/skills/qoder.js.map +1 -1
- package/dist/integrations/claude-code-hooks.d.ts +95 -0
- package/dist/integrations/claude-code-hooks.d.ts.map +1 -0
- package/dist/integrations/claude-code-hooks.js +321 -0
- package/dist/integrations/claude-code-hooks.js.map +1 -0
- package/dist/integrations/ensure-anydoc.d.ts +41 -0
- package/dist/integrations/ensure-anydoc.d.ts.map +1 -0
- package/dist/integrations/ensure-anydoc.js +221 -0
- package/dist/integrations/ensure-anydoc.js.map +1 -0
- package/dist/integrations/skill-installer.d.ts +26 -3
- package/dist/integrations/skill-installer.d.ts.map +1 -1
- package/dist/integrations/skill-installer.js +148 -4
- package/dist/integrations/skill-installer.js.map +1 -1
- package/dist/learning/canary-gate.d.ts +39 -0
- package/dist/learning/canary-gate.d.ts.map +1 -0
- package/dist/learning/canary-gate.js +57 -0
- package/dist/learning/canary-gate.js.map +1 -0
- package/dist/learning/skill-consolidate.d.ts +84 -0
- package/dist/learning/skill-consolidate.d.ts.map +1 -0
- package/dist/learning/skill-consolidate.js +353 -0
- package/dist/learning/skill-consolidate.js.map +1 -0
- package/dist/learning/skill-flywheel.d.ts +26 -0
- package/dist/learning/skill-flywheel.d.ts.map +1 -1
- package/dist/learning/skill-flywheel.js +192 -29
- package/dist/learning/skill-flywheel.js.map +1 -1
- package/dist/learning/skill-opt-lite.d.ts +46 -0
- package/dist/learning/skill-opt-lite.d.ts.map +1 -0
- package/dist/learning/skill-opt-lite.js +270 -0
- package/dist/learning/skill-opt-lite.js.map +1 -0
- package/dist/learning/skill-package.d.ts.map +1 -1
- package/dist/learning/skill-package.js +80 -6
- package/dist/learning/skill-package.js.map +1 -1
- package/dist/learning/skill-store.d.ts.map +1 -1
- package/dist/learning/skill-store.js +13 -0
- package/dist/learning/skill-store.js.map +1 -1
- package/dist/learning/skill-types.d.ts +32 -0
- package/dist/learning/skill-types.d.ts.map +1 -1
- package/dist/learning/skill-types.js +17 -0
- package/dist/learning/skill-types.js.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/surfaces/cli/index.js +46 -5
- package/dist/surfaces/cli/index.js.map +1 -1
- package/dist/surfaces/cli/init.d.ts +17 -4
- package/dist/surfaces/cli/init.d.ts.map +1 -1
- package/dist/surfaces/cli/init.js +71 -8
- package/dist/surfaces/cli/init.js.map +1 -1
- package/dist/surfaces/cli/output.d.ts.map +1 -1
- package/dist/surfaces/cli/output.js +4 -2
- package/dist/surfaces/cli/output.js.map +1 -1
- package/dist/surfaces/cli/runtime/facade.d.ts +2 -1
- package/dist/surfaces/cli/runtime/facade.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/facade.js +1 -0
- package/dist/surfaces/cli/runtime/facade.js.map +1 -1
- package/dist/surfaces/cli/runtime/graph.d.ts +59 -2
- package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/graph.js +120 -7
- package/dist/surfaces/cli/runtime/graph.js.map +1 -1
- package/dist/surfaces/cli/runtime/learning.d.ts +19 -0
- package/dist/surfaces/cli/runtime/learning.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/learning.js +46 -0
- package/dist/surfaces/cli/runtime/learning.js.map +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts +6 -3
- package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/routing.js +70 -7
- package/dist/surfaces/cli/runtime/routing.js.map +1 -1
- package/dist/surfaces/cli/runtime/types.d.ts +54 -0
- package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.d.ts +3 -3
- package/dist/surfaces/cli/runtime.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.js +6 -2
- package/dist/surfaces/cli/runtime.js.map +1 -1
- package/dist/surfaces/mcp/server.d.ts +12 -4
- package/dist/surfaces/mcp/server.d.ts.map +1 -1
- package/dist/surfaces/mcp/server.js +270 -97
- package/dist/surfaces/mcp/server.js.map +1 -1
- package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
- package/dist/surfaces/mcp/tool-definitions.js +15 -0
- package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.d.ts +5 -3
- package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
- package/dist/surfaces/mcp/tool-handlers.js +36 -6
- package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +54 -5
- package/dist/utils/logger.js.map +1 -1
- package/mcp.json +14 -0
- package/package.json +19 -1
- package/plugin.json +21 -0
- package/scripts/safe-postinstall.cjs +36 -1
- package/skills/graphflow/SKILL.md +565 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CLAUDE_HOME_ENV = exports.SESSION_HOOK_SCRIPT = void 0;
|
|
4
|
+
exports.shellQuote = shellQuote;
|
|
5
|
+
exports.resolveClaudeHome = resolveClaudeHome;
|
|
6
|
+
exports.settingsReferenceHookScript = settingsReferenceHookScript;
|
|
7
|
+
exports.getClaudeCodeHooksStatus = getClaudeCodeHooksStatus;
|
|
8
|
+
exports.buildSessionHookScript = buildSessionHookScript;
|
|
9
|
+
exports.buildClaudeCodeHooksConfig = buildClaudeCodeHooksConfig;
|
|
10
|
+
exports.installClaudeCodeHooks = installClaudeCodeHooks;
|
|
11
|
+
exports.uninstallClaudeCodeHooks = uninstallClaudeCodeHooks;
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const node_os_1 = require("node:os");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
/**
|
|
16
|
+
* claude-code-hooks.ts — Claude Code hooks 配置生成器(P0-2)
|
|
17
|
+
*
|
|
18
|
+
* 生成 ~/.claude/settings.json 风格的 hooks 片段(SessionStart / SessionEnd / Stop),
|
|
19
|
+
* 自动调用 graphflow CLI 记录 outcome/episode,让学习飞轮无需宿主 agent 主动调用
|
|
20
|
+
* graphflow_report_outcome 也能自动闭环(配套的 auto-capture 默认开启,
|
|
21
|
+
* 可通过 GRAPHFLOW_AUTO_CAPTURE=0 显式关闭):
|
|
22
|
+
*
|
|
23
|
+
* 1. SessionStart → 初始化会话日志目录(不写图)。
|
|
24
|
+
* 2. SessionEnd / Stop → 读取 src/hooks/auto-capture.ts 写入的最新 pending episode
|
|
25
|
+
* 日志条目,调用 `graphflow outcome report <episodeId> <success>` 回填真实结局
|
|
26
|
+
* (回填后触发 updateEpisodeOutcome + applySkillLearning,与手动 report_outcome 等价)。
|
|
27
|
+
*
|
|
28
|
+
* 安全:所有嵌入脚本的路径/命令均做 shell 转义(单引号包裹 + 双引号内 fallback 转义),
|
|
29
|
+
* 由 installClaudeCodeHooks 写盘;合并 settings.json 时绝不覆盖用户已有 hooks 配置。
|
|
30
|
+
*/
|
|
31
|
+
exports.SESSION_HOOK_SCRIPT = "session.sh";
|
|
32
|
+
const JOURNAL_RELATIVE = ".graphflow/session-journal.jsonl";
|
|
33
|
+
/** Test/override: when set, treat this directory as Claude Code home (`~/.claude`). */
|
|
34
|
+
exports.CLAUDE_HOME_ENV = "GRAPHFLOW_CLAUDE_HOME";
|
|
35
|
+
/** 单引号包裹的 shell 安全参数:路径/命令可含空格、单引号等字符。 */
|
|
36
|
+
function shellQuote(value) {
|
|
37
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
38
|
+
}
|
|
39
|
+
/** 双引号赋值内 fallback 值的转义:\\ $ ` " 需反斜杠转义。 */
|
|
40
|
+
function shellFallback(value) {
|
|
41
|
+
return value.replace(/([\\$`"])/g, "\\$1");
|
|
42
|
+
}
|
|
43
|
+
/** Resolve Claude Code home (`~/.claude`), honoring GRAPHFLOW_CLAUDE_HOME for tests. */
|
|
44
|
+
function resolveClaudeHome(env = process.env) {
|
|
45
|
+
const override = env[exports.CLAUDE_HOME_ENV]?.trim();
|
|
46
|
+
if (override)
|
|
47
|
+
return override;
|
|
48
|
+
return (0, node_path_1.join)((0, node_os_1.homedir)(), ".claude");
|
|
49
|
+
}
|
|
50
|
+
/** Normalize path separators for cross-platform substring checks. */
|
|
51
|
+
function normalizePathForMatch(value) {
|
|
52
|
+
return value.replace(/\\/g, "/").toLowerCase();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* True when settings.json references our session hook script.
|
|
56
|
+
* Parses JSON when possible so Windows paths survive JSON backslash escaping
|
|
57
|
+
* (`C:\\Users\\...` in file vs `C:\Users\...` in path.join).
|
|
58
|
+
*/
|
|
59
|
+
function settingsReferenceHookScript(raw, scriptPath) {
|
|
60
|
+
const needle = normalizePathForMatch(scriptPath);
|
|
61
|
+
if (!needle)
|
|
62
|
+
return false;
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(raw);
|
|
65
|
+
const hooks = parsed.hooks;
|
|
66
|
+
if (hooks && typeof hooks === "object") {
|
|
67
|
+
for (const entries of Object.values(hooks)) {
|
|
68
|
+
if (!Array.isArray(entries))
|
|
69
|
+
continue;
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
const command = entry && typeof entry === "object" && typeof entry.command === "string"
|
|
72
|
+
? entry.command
|
|
73
|
+
: "";
|
|
74
|
+
if (command && normalizePathForMatch(command).includes(needle)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Fall through to raw substring checks for partially written files.
|
|
83
|
+
}
|
|
84
|
+
const quoted = shellQuote(scriptPath);
|
|
85
|
+
const jsonEscaped = scriptPath.replace(/\\/g, "\\\\");
|
|
86
|
+
return (raw.includes(scriptPath) ||
|
|
87
|
+
raw.includes(quoted) ||
|
|
88
|
+
raw.includes(jsonEscaped) ||
|
|
89
|
+
raw.includes(shellQuote(jsonEscaped)) ||
|
|
90
|
+
normalizePathForMatch(raw).includes(needle));
|
|
91
|
+
}
|
|
92
|
+
function defaultHooksDir(claudeHome) {
|
|
93
|
+
return (0, node_path_1.join)(claudeHome ?? resolveClaudeHome(), "graphflow-hooks");
|
|
94
|
+
}
|
|
95
|
+
function defaultSettingsPath(claudeHome) {
|
|
96
|
+
return (0, node_path_1.join)(claudeHome ?? resolveClaudeHome(), "settings.json");
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Doctor/install status for Claude Code flywheel hooks.
|
|
100
|
+
* Detected when Claude Code home exists; installed when settings.json references
|
|
101
|
+
* our session script and the script file is on disk.
|
|
102
|
+
*/
|
|
103
|
+
function getClaudeCodeHooksStatus(options = {}) {
|
|
104
|
+
const claudeHome = options.claudeHome ?? resolveClaudeHome();
|
|
105
|
+
const settingsPath = options.settingsPath ?? defaultSettingsPath(claudeHome);
|
|
106
|
+
const hooksDir = options.hooksDir ?? defaultHooksDir(claudeHome);
|
|
107
|
+
const scriptPath = (0, node_path_1.join)(hooksDir, exports.SESSION_HOOK_SCRIPT);
|
|
108
|
+
const detected = (0, node_fs_1.existsSync)(claudeHome);
|
|
109
|
+
let installed = false;
|
|
110
|
+
if (detected && (0, node_fs_1.existsSync)(scriptPath) && (0, node_fs_1.existsSync)(settingsPath)) {
|
|
111
|
+
try {
|
|
112
|
+
const raw = (0, node_fs_1.readFileSync)(settingsPath, "utf8");
|
|
113
|
+
installed = settingsReferenceHookScript(raw, scriptPath);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
installed = false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
agent: "Claude Code hooks",
|
|
121
|
+
claudeHome,
|
|
122
|
+
settingsPath,
|
|
123
|
+
hooksDir,
|
|
124
|
+
scriptPath,
|
|
125
|
+
detected,
|
|
126
|
+
installed,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 生成会话 hook 脚本内容(bash)。`start` 仅准备目录;`end` 解析会话日志中
|
|
131
|
+
* 最新一条 pending episode 并调用 graphflow CLI 回填(成功默认 true,可传参数覆盖)。
|
|
132
|
+
* 所有嵌入路径均做 shell 转义;失败静默(exit 0),绝不阻塞 Claude Code 会话。
|
|
133
|
+
*/
|
|
134
|
+
function buildSessionHookScript(options = {}) {
|
|
135
|
+
const journal = options.journalPath ?? `\${CLAUDE_PROJECT_DIR:-.}/${JOURNAL_RELATIVE}`;
|
|
136
|
+
const bin = options.graphflowBin ?? "graphflow";
|
|
137
|
+
const config = options.configPath ?? "";
|
|
138
|
+
const successDefault = (options.defaultSuccess ?? true) ? "true" : "false";
|
|
139
|
+
const lines = [
|
|
140
|
+
"#!/usr/bin/env bash",
|
|
141
|
+
"# GraphFlow auto-capture session hook (generated by graphflow, do not edit).",
|
|
142
|
+
"# Resolves the most recent pending episode (src/hooks/auto-capture.ts) at",
|
|
143
|
+
"# SessionEnd/Stop by calling: graphflow outcome report <episodeId> <success>",
|
|
144
|
+
"# Runtime overrides: GRAPHFLOW_HOOK_JOURNAL / GRAPHFLOW_HOOK_BIN / GRAPHFLOW_HOOK_CONFIG.",
|
|
145
|
+
"set -u",
|
|
146
|
+
'ACTION="${1:-end}"',
|
|
147
|
+
`SUCCESS="\${2:-${successDefault}}"`,
|
|
148
|
+
`JOURNAL="\${GRAPHFLOW_HOOK_JOURNAL:-${shellFallback(journal)}}"`,
|
|
149
|
+
`GF_BIN="\${GRAPHFLOW_HOOK_BIN:-${shellFallback(bin)}}"`,
|
|
150
|
+
`GF_CONFIG="\${GRAPHFLOW_HOOK_CONFIG:-${shellFallback(config)}}"`,
|
|
151
|
+
"",
|
|
152
|
+
'case "$ACTION" in',
|
|
153
|
+
" start)",
|
|
154
|
+
' mkdir -p "$(dirname "$JOURNAL")" 2>/dev/null || true',
|
|
155
|
+
" exit 0",
|
|
156
|
+
" ;;",
|
|
157
|
+
"esac",
|
|
158
|
+
"",
|
|
159
|
+
"# end/stop: resolve the most recent pending episode recorded by auto-capture.",
|
|
160
|
+
'[ -f "$JOURNAL" ] || exit 0',
|
|
161
|
+
'LINE="$(tail -n 1 "$JOURNAL" 2>/dev/null)" || exit 0',
|
|
162
|
+
'[ -n "$LINE" ] || exit 0',
|
|
163
|
+
'EPID="$(printf "%s" "$LINE" | sed -n \'s/.*"episodeId":[[:space:]]*"\\([^"]*\\)".*/\\1/p\')"',
|
|
164
|
+
'[ -n "$EPID" ] || exit 0',
|
|
165
|
+
"",
|
|
166
|
+
'ARGS=(outcome report "$EPID" "$SUCCESS")',
|
|
167
|
+
'[ -n "$GF_CONFIG" ] && ARGS+=(--config "$GF_CONFIG")',
|
|
168
|
+
'"$GF_BIN" "${ARGS[@]}" >/dev/null 2>&1 || true',
|
|
169
|
+
"exit 0",
|
|
170
|
+
"",
|
|
171
|
+
];
|
|
172
|
+
return lines.join("\n");
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 生成 settings.json 风格 hooks 配置片段。命令参数均经 shellQuote 转义,
|
|
176
|
+
* 可直接合并进 ~/.claude/settings.json 的 "hooks" 字段。
|
|
177
|
+
*/
|
|
178
|
+
function buildClaudeCodeHooksConfig(options = {}) {
|
|
179
|
+
const hooksDir = options.hooksDir ?? defaultHooksDir(resolveClaudeHome());
|
|
180
|
+
const scriptPath = (0, node_path_1.join)(hooksDir, exports.SESSION_HOOK_SCRIPT);
|
|
181
|
+
const quotedScript = shellQuote(scriptPath);
|
|
182
|
+
const startCommand = `bash ${quotedScript} start`;
|
|
183
|
+
const endCommand = `bash ${quotedScript} end`;
|
|
184
|
+
const timeout = options.timeoutSec ?? 30;
|
|
185
|
+
return {
|
|
186
|
+
hooks: {
|
|
187
|
+
SessionStart: [{ type: "command", command: startCommand, timeout }],
|
|
188
|
+
SessionEnd: [{ type: "command", command: endCommand, timeout }],
|
|
189
|
+
Stop: [{ type: "command", command: endCommand, timeout }],
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/** 合并 hooks 配置到 settings.json(保留用户已有 hooks,append 幂等)。 */
|
|
194
|
+
function installClaudeCodeHooks(options = {}) {
|
|
195
|
+
const claudeHome = resolveClaudeHome();
|
|
196
|
+
const hooksDir = options.hooksDir ?? defaultHooksDir(claudeHome);
|
|
197
|
+
const settingsPath = options.settingsPath ?? defaultSettingsPath(claudeHome);
|
|
198
|
+
const scriptPath = (0, node_path_1.join)(hooksDir, exports.SESSION_HOOK_SCRIPT);
|
|
199
|
+
// 1) 安装会话脚本(内容一致则跳过)
|
|
200
|
+
try {
|
|
201
|
+
(0, node_fs_1.mkdirSync)(hooksDir, { recursive: true });
|
|
202
|
+
const script = buildSessionHookScript(options);
|
|
203
|
+
if (!(0, node_fs_1.existsSync)(scriptPath) || (0, node_fs_1.readFileSync)(scriptPath, "utf8") !== script) {
|
|
204
|
+
(0, node_fs_1.writeFileSync)(scriptPath, script, { mode: 0o755 });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
status: "error",
|
|
210
|
+
filePath: scriptPath,
|
|
211
|
+
message: `hook script install failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// 2) 合并 settings.json
|
|
215
|
+
try {
|
|
216
|
+
return mergeSettingsHooks(settingsPath, buildClaudeCodeHooksConfig(options));
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return {
|
|
220
|
+
status: "error",
|
|
221
|
+
filePath: settingsPath,
|
|
222
|
+
message: `settings merge failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* 合并 hooks 片段进 settings.json。文件不存在 → created;已存在且 JSON 损坏 → error
|
|
228
|
+
* (绝不覆盖用户配置);内容无变化 → skipped。
|
|
229
|
+
*/
|
|
230
|
+
function mergeSettingsHooks(settingsPath, config) {
|
|
231
|
+
const existed = (0, node_fs_1.existsSync)(settingsPath);
|
|
232
|
+
let settings;
|
|
233
|
+
if (existed) {
|
|
234
|
+
const raw = (0, node_fs_1.readFileSync)(settingsPath, "utf8");
|
|
235
|
+
try {
|
|
236
|
+
settings = JSON.parse(raw);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return {
|
|
240
|
+
status: "error",
|
|
241
|
+
filePath: settingsPath,
|
|
242
|
+
message: "existing settings.json is not valid JSON; refusing to overwrite",
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
settings = {};
|
|
248
|
+
}
|
|
249
|
+
const existingHooks = settings.hooks && typeof settings.hooks === "object"
|
|
250
|
+
? settings.hooks
|
|
251
|
+
: {};
|
|
252
|
+
const mergedHooks = { ...existingHooks };
|
|
253
|
+
for (const [event, entries] of Object.entries(config.hooks)) {
|
|
254
|
+
const existing = Array.isArray(existingHooks[event]) ? existingHooks[event] : [];
|
|
255
|
+
const existingCommands = new Set(existing.map((entry) => entry.command));
|
|
256
|
+
const added = (entries ?? []).filter((entry) => !existingCommands.has(entry.command));
|
|
257
|
+
mergedHooks[event] = [...existing, ...added];
|
|
258
|
+
}
|
|
259
|
+
const next = { ...settings, hooks: mergedHooks };
|
|
260
|
+
const payload = `${JSON.stringify(next, null, 2)}\n`;
|
|
261
|
+
if (existed && (0, node_fs_1.readFileSync)(settingsPath, "utf8") === payload) {
|
|
262
|
+
return { status: "skipped", filePath: settingsPath, message: "already up to date" };
|
|
263
|
+
}
|
|
264
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(settingsPath), { recursive: true });
|
|
265
|
+
(0, node_fs_1.writeFileSync)(settingsPath, payload, "utf8");
|
|
266
|
+
return {
|
|
267
|
+
status: existed ? "updated" : "created",
|
|
268
|
+
filePath: settingsPath,
|
|
269
|
+
message: `hooks installed (${Object.keys(config.hooks).join(", ")})`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/** 卸载:从 settings.json 移除本生成器写入的 hook 条目并删除会话脚本。 */
|
|
273
|
+
function uninstallClaudeCodeHooks(settingsPath, hooksDir) {
|
|
274
|
+
const claudeHome = resolveClaudeHome();
|
|
275
|
+
const target = settingsPath ?? defaultSettingsPath(claudeHome);
|
|
276
|
+
const scriptPath = (0, node_path_1.join)(hooksDir ?? defaultHooksDir(claudeHome), exports.SESSION_HOOK_SCRIPT);
|
|
277
|
+
if (!(0, node_fs_1.existsSync)(target)) {
|
|
278
|
+
return { status: "skipped", filePath: target, message: "settings.json not found" };
|
|
279
|
+
}
|
|
280
|
+
let settings;
|
|
281
|
+
try {
|
|
282
|
+
settings = JSON.parse((0, node_fs_1.readFileSync)(target, "utf8"));
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return { status: "error", filePath: target, message: "settings.json is not valid JSON" };
|
|
286
|
+
}
|
|
287
|
+
const hooks = settings.hooks && typeof settings.hooks === "object"
|
|
288
|
+
? settings.hooks
|
|
289
|
+
: {};
|
|
290
|
+
const ourScript = shellQuote(scriptPath);
|
|
291
|
+
let removedAny = false;
|
|
292
|
+
for (const event of ["SessionStart", "SessionEnd", "Stop"]) {
|
|
293
|
+
const entries = Array.isArray(hooks[event]) ? hooks[event] : [];
|
|
294
|
+
const kept = entries.filter((entry) => !entry.command.includes(ourScript));
|
|
295
|
+
if (kept.length !== entries.length) {
|
|
296
|
+
removedAny = true;
|
|
297
|
+
}
|
|
298
|
+
if (kept.length > 0) {
|
|
299
|
+
hooks[event] = kept;
|
|
300
|
+
}
|
|
301
|
+
else if (hooks[event] !== undefined) {
|
|
302
|
+
delete hooks[event];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const next = { ...settings, hooks };
|
|
306
|
+
(0, node_fs_1.writeFileSync)(target, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
307
|
+
if ((0, node_fs_1.existsSync)(scriptPath)) {
|
|
308
|
+
try {
|
|
309
|
+
(0, node_fs_1.rmSync)(scriptPath, { force: true });
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// 删除脚本失败不阻断
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
status: removedAny ? "updated" : "skipped",
|
|
317
|
+
filePath: target,
|
|
318
|
+
message: removedAny ? "hooks removed" : "no graphflow hooks present",
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=claude-code-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-hooks.js","sourceRoot":"","sources":["../../src/integrations/claude-code-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure optional @firecrawl/anydoc is available for Office/PDF → Markdown.
|
|
3
|
+
*
|
|
4
|
+
* VSIX does not ship native anydoc binaries. The VS Code/Cursor extension
|
|
5
|
+
* (and optionally CLI) downloads the current-platform package into
|
|
6
|
+
* ~/.graphflow/optional-deps via npm, then sets GRAPHFLOW_ANYDOC_NODE_MODULES.
|
|
7
|
+
*/
|
|
8
|
+
/** Keep in sync with package.json optionalDependencies[@firecrawl/anydoc]. */
|
|
9
|
+
export declare const ANYDOC_NPM_PACKAGE = "@firecrawl/anydoc";
|
|
10
|
+
export declare const ANYDOC_PINNED_VERSION = "0.1.7";
|
|
11
|
+
export type EnsureAnydocStatus = "already" | "installed" | "skipped" | "failed";
|
|
12
|
+
export interface EnsureAnydocResult {
|
|
13
|
+
status: EnsureAnydocStatus;
|
|
14
|
+
message: string;
|
|
15
|
+
nodeModules?: string;
|
|
16
|
+
version?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function resolveAnydocOptionalDepsRoot(home?: string): string;
|
|
19
|
+
export declare function resolveAnydocNodeModules(home?: string): string;
|
|
20
|
+
export declare function readInstalledAnydocVersion(depsRoot?: string): string | undefined;
|
|
21
|
+
export declare function isAnydocPresent(nodeModules?: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Point Node resolution at the optional-deps node_modules (extension + MCP child).
|
|
24
|
+
*/
|
|
25
|
+
export declare function applyAnydocRequireEnv(nodeModules?: string): boolean;
|
|
26
|
+
/** Try loading anydoc from env path or default resolution. */
|
|
27
|
+
export declare function tryRequireAnydoc(): unknown | null;
|
|
28
|
+
/**
|
|
29
|
+
* Ensure platform anydoc binary is installed under ~/.graphflow/optional-deps.
|
|
30
|
+
* No-op when disabled, already present at the pinned version, or already require-able.
|
|
31
|
+
*/
|
|
32
|
+
export declare function ensureAnydocInstalled(options?: {
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
version?: string;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
home?: string;
|
|
37
|
+
/** Inject install for tests. */
|
|
38
|
+
installFn?: (depsRoot: string, version: string) => Promise<void>;
|
|
39
|
+
logger?: (message: string) => void;
|
|
40
|
+
}): Promise<EnsureAnydocResult>;
|
|
41
|
+
//# sourceMappingURL=ensure-anydoc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-anydoc.d.ts","sourceRoot":"","sources":["../../src/integrations/ensure-anydoc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,SAAY,GAAG,MAAM,CAEtE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAY,GAAG,MAAM,CAEjE;AAMD,wBAAgB,0BAA0B,CAAC,QAAQ,SAAkC,GAAG,MAAM,GAAG,SAAS,CAgBzG;AAED,wBAAgB,eAAe,CAAC,WAAW,SAA6B,GAAG,OAAO,CAEjF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,SAA6B,GAAG,OAAO,CAqBvF;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CA2BjD;AA+CD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2E9B"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ensure optional @firecrawl/anydoc is available for Office/PDF → Markdown.
|
|
4
|
+
*
|
|
5
|
+
* VSIX does not ship native anydoc binaries. The VS Code/Cursor extension
|
|
6
|
+
* (and optionally CLI) downloads the current-platform package into
|
|
7
|
+
* ~/.graphflow/optional-deps via npm, then sets GRAPHFLOW_ANYDOC_NODE_MODULES.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ANYDOC_PINNED_VERSION = exports.ANYDOC_NPM_PACKAGE = void 0;
|
|
11
|
+
exports.resolveAnydocOptionalDepsRoot = resolveAnydocOptionalDepsRoot;
|
|
12
|
+
exports.resolveAnydocNodeModules = resolveAnydocNodeModules;
|
|
13
|
+
exports.readInstalledAnydocVersion = readInstalledAnydocVersion;
|
|
14
|
+
exports.isAnydocPresent = isAnydocPresent;
|
|
15
|
+
exports.applyAnydocRequireEnv = applyAnydocRequireEnv;
|
|
16
|
+
exports.tryRequireAnydoc = tryRequireAnydoc;
|
|
17
|
+
exports.ensureAnydocInstalled = ensureAnydocInstalled;
|
|
18
|
+
const node_child_process_1 = require("node:child_process");
|
|
19
|
+
const node_fs_1 = require("node:fs");
|
|
20
|
+
const node_module_1 = require("node:module");
|
|
21
|
+
const node_os_1 = require("node:os");
|
|
22
|
+
const node_path_1 = require("node:path");
|
|
23
|
+
/** Keep in sync with package.json optionalDependencies[@firecrawl/anydoc]. */
|
|
24
|
+
exports.ANYDOC_NPM_PACKAGE = "@firecrawl/anydoc";
|
|
25
|
+
exports.ANYDOC_PINNED_VERSION = "0.1.7";
|
|
26
|
+
function resolveAnydocOptionalDepsRoot(home = (0, node_os_1.homedir)()) {
|
|
27
|
+
return (0, node_path_1.join)(home, ".graphflow", "optional-deps");
|
|
28
|
+
}
|
|
29
|
+
function resolveAnydocNodeModules(home = (0, node_os_1.homedir)()) {
|
|
30
|
+
return (0, node_path_1.join)(resolveAnydocOptionalDepsRoot(home), "node_modules");
|
|
31
|
+
}
|
|
32
|
+
function versionMarkerPath(depsRoot) {
|
|
33
|
+
return (0, node_path_1.join)(depsRoot, ".anydoc-version");
|
|
34
|
+
}
|
|
35
|
+
function readInstalledAnydocVersion(depsRoot = resolveAnydocOptionalDepsRoot()) {
|
|
36
|
+
try {
|
|
37
|
+
const marker = (0, node_fs_1.readFileSync)(versionMarkerPath(depsRoot), "utf8").trim();
|
|
38
|
+
if (marker) {
|
|
39
|
+
return marker;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// fall through
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const pkgPath = (0, node_path_1.join)(depsRoot, "node_modules", "@firecrawl", "anydoc", "package.json");
|
|
47
|
+
const pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf8"));
|
|
48
|
+
return pkg.version;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isAnydocPresent(nodeModules = resolveAnydocNodeModules()) {
|
|
55
|
+
return (0, node_fs_1.existsSync)((0, node_path_1.join)(nodeModules, "@firecrawl", "anydoc", "package.json"));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Point Node resolution at the optional-deps node_modules (extension + MCP child).
|
|
59
|
+
*/
|
|
60
|
+
function applyAnydocRequireEnv(nodeModules = resolveAnydocNodeModules()) {
|
|
61
|
+
if (!(0, node_fs_1.existsSync)(nodeModules)) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
process.env.GRAPHFLOW_ANYDOC_NODE_MODULES = nodeModules;
|
|
65
|
+
const parts = (process.env.NODE_PATH ?? "")
|
|
66
|
+
.split(node_path_1.delimiter)
|
|
67
|
+
.map((p) => p.trim())
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
if (!parts.includes(nodeModules)) {
|
|
70
|
+
process.env.NODE_PATH = parts.length > 0 ? `${nodeModules}${node_path_1.delimiter}${parts.join(node_path_1.delimiter)}` : nodeModules;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
// Refresh Node's module search paths after NODE_PATH mutation.
|
|
74
|
+
const Module = require("node:module");
|
|
75
|
+
Module._initPaths?.();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore — createRequire(path) still works for document-convert
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/** Try loading anydoc from env path or default resolution. */
|
|
83
|
+
function tryRequireAnydoc() {
|
|
84
|
+
const existing = process.env.GRAPHFLOW_ANYDOC_NODE_MODULES?.trim();
|
|
85
|
+
if (existing && (0, node_fs_1.existsSync)((0, node_path_1.join)(existing, "@firecrawl", "anydoc", "package.json"))) {
|
|
86
|
+
try {
|
|
87
|
+
const req = (0, node_module_1.createRequire)((0, node_path_1.join)(existing, "@firecrawl", "anydoc", "package.json"));
|
|
88
|
+
return req(exports.ANYDOC_NPM_PACKAGE);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// fall through to default home path
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
applyAnydocRequireEnv(resolveAnydocNodeModules());
|
|
95
|
+
const fromEnv = process.env.GRAPHFLOW_ANYDOC_NODE_MODULES?.trim();
|
|
96
|
+
if (fromEnv) {
|
|
97
|
+
try {
|
|
98
|
+
const req = (0, node_module_1.createRequire)((0, node_path_1.join)(fromEnv, "@firecrawl", "anydoc", "package.json"));
|
|
99
|
+
return req(exports.ANYDOC_NPM_PACKAGE);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// fall through
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const req = (0, node_module_1.createRequire)(__filename);
|
|
107
|
+
return req(exports.ANYDOC_NPM_PACKAGE);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function resolveNpmCommand() {
|
|
114
|
+
if (process.env.GRAPHFLOW_NPM?.trim()) {
|
|
115
|
+
return process.env.GRAPHFLOW_NPM.trim();
|
|
116
|
+
}
|
|
117
|
+
return process.platform === "win32" ? "npm.cmd" : "npm";
|
|
118
|
+
}
|
|
119
|
+
function runNpmInstall(depsRoot, version, timeoutMs) {
|
|
120
|
+
const npm = resolveNpmCommand();
|
|
121
|
+
const spec = `${exports.ANYDOC_NPM_PACKAGE}@${version}`;
|
|
122
|
+
return new Promise((resolve, reject) => {
|
|
123
|
+
const child = (0, node_child_process_1.spawn)(npm, ["install", "--ignore-scripts", "--no-save", "--no-package-lock", spec], {
|
|
124
|
+
cwd: depsRoot,
|
|
125
|
+
env: process.env,
|
|
126
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
127
|
+
windowsHide: true,
|
|
128
|
+
shell: process.platform === "win32",
|
|
129
|
+
});
|
|
130
|
+
let stderr = "";
|
|
131
|
+
child.stderr?.on("data", (chunk) => {
|
|
132
|
+
stderr += chunk.toString("utf8");
|
|
133
|
+
});
|
|
134
|
+
const timer = setTimeout(() => {
|
|
135
|
+
child.kill("SIGTERM");
|
|
136
|
+
reject(new Error(`npm install ${spec} timed out after ${timeoutMs}ms`));
|
|
137
|
+
}, timeoutMs);
|
|
138
|
+
child.on("error", (err) => {
|
|
139
|
+
clearTimeout(timer);
|
|
140
|
+
reject(err);
|
|
141
|
+
});
|
|
142
|
+
child.on("close", (code) => {
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
if (code === 0) {
|
|
145
|
+
resolve();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
reject(new Error(`npm install ${spec} exited ${code}: ${stderr.slice(0, 500)}`));
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Ensure platform anydoc binary is installed under ~/.graphflow/optional-deps.
|
|
154
|
+
* No-op when disabled, already present at the pinned version, or already require-able.
|
|
155
|
+
*/
|
|
156
|
+
async function ensureAnydocInstalled(options) {
|
|
157
|
+
const enabled = options?.enabled ?? true;
|
|
158
|
+
const version = options?.version ?? exports.ANYDOC_PINNED_VERSION;
|
|
159
|
+
const timeoutMs = options?.timeoutMs ?? 180_000;
|
|
160
|
+
const home = options?.home ?? (0, node_os_1.homedir)();
|
|
161
|
+
const log = options?.logger ?? (() => undefined);
|
|
162
|
+
if (!enabled) {
|
|
163
|
+
return { status: "skipped", message: "anydoc auto-download disabled" };
|
|
164
|
+
}
|
|
165
|
+
const depsRoot = resolveAnydocOptionalDepsRoot(home);
|
|
166
|
+
const nodeModules = resolveAnydocNodeModules(home);
|
|
167
|
+
if (tryRequireAnydoc()) {
|
|
168
|
+
const nm = isAnydocPresent(nodeModules) ? nodeModules : process.env.GRAPHFLOW_ANYDOC_NODE_MODULES;
|
|
169
|
+
return {
|
|
170
|
+
status: "already",
|
|
171
|
+
message: "anydoc already resolvable",
|
|
172
|
+
...(nm ? { nodeModules: nm } : {}),
|
|
173
|
+
version: readInstalledAnydocVersion(depsRoot) ?? version,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (isAnydocPresent(nodeModules) && readInstalledAnydocVersion(depsRoot) === version) {
|
|
177
|
+
applyAnydocRequireEnv(nodeModules);
|
|
178
|
+
if (tryRequireAnydoc()) {
|
|
179
|
+
return {
|
|
180
|
+
status: "already",
|
|
181
|
+
message: `anydoc ${version} already installed in ${nodeModules}`,
|
|
182
|
+
nodeModules,
|
|
183
|
+
version,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
(0, node_fs_1.mkdirSync)(depsRoot, { recursive: true });
|
|
189
|
+
// Minimal package.json so npm install --prefix-like cwd works cleanly
|
|
190
|
+
const pkgJson = (0, node_path_1.join)(depsRoot, "package.json");
|
|
191
|
+
if (!(0, node_fs_1.existsSync)(pkgJson)) {
|
|
192
|
+
(0, node_fs_1.writeFileSync)(pkgJson, JSON.stringify({ name: "graphflow-optional-deps", private: true, version: "0.0.0" }, null, 2), "utf8");
|
|
193
|
+
}
|
|
194
|
+
log(`[GraphFlow] Downloading ${exports.ANYDOC_NPM_PACKAGE}@${version} into ${depsRoot} …`);
|
|
195
|
+
const install = options?.installFn ?? ((root, ver) => runNpmInstall(root, ver, timeoutMs));
|
|
196
|
+
await install(depsRoot, version);
|
|
197
|
+
(0, node_fs_1.writeFileSync)(versionMarkerPath(depsRoot), `${version}\n`, "utf8");
|
|
198
|
+
applyAnydocRequireEnv(nodeModules);
|
|
199
|
+
if (!tryRequireAnydoc()) {
|
|
200
|
+
return {
|
|
201
|
+
status: "failed",
|
|
202
|
+
message: `installed files under ${nodeModules} but require(@firecrawl/anydoc) still failed`,
|
|
203
|
+
nodeModules,
|
|
204
|
+
version,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
log(`[GraphFlow] anydoc ${version} ready`);
|
|
208
|
+
return {
|
|
209
|
+
status: "installed",
|
|
210
|
+
message: `installed ${exports.ANYDOC_NPM_PACKAGE}@${version}`,
|
|
211
|
+
nodeModules,
|
|
212
|
+
version,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
217
|
+
log(`[GraphFlow] anydoc download failed: ${message}`);
|
|
218
|
+
return { status: "failed", message };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=ensure-anydoc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-anydoc.js","sourceRoot":"","sources":["../../src/integrations/ensure-anydoc.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,9 +31,9 @@ export interface AgentInstructionStatus {
|
|
|
31
31
|
/**
|
|
32
32
|
* 解析 Trae Skill 源文件路径。
|
|
33
33
|
* 支持以下候选路径(按优先级排序):
|
|
34
|
-
* 1.
|
|
35
|
-
* 2.
|
|
36
|
-
* 3. src/surfaces/
|
|
34
|
+
* 1. Agent Plugins 1.0 `skills/graphflow/`(规范源)
|
|
35
|
+
* 2. vendorRuntimeRoot(VS Code 扩展打包后 vendor/graphflow 路径)
|
|
36
|
+
* 3. 兼容副本:dist/surfaces/trae-skill、src/surfaces/trae-skill
|
|
37
37
|
*/
|
|
38
38
|
export declare function resolveSkillSourcePath(vendorRuntimeRoot?: string): string | undefined;
|
|
39
39
|
/**
|
|
@@ -145,4 +145,27 @@ export declare function installAllSkills(vendorRuntimeRoot?: string, log?: (mess
|
|
|
145
145
|
export declare function removeManagedBlock(filePath: string): boolean;
|
|
146
146
|
/** 移除指定 agent 的 GraphFlow Skill 目录 */
|
|
147
147
|
export declare function removeAgentSkill(skillsRoot: string, skillName?: string): boolean;
|
|
148
|
+
/** True when content looks like a GraphFlow-owned install (not a lightly annotated user file). */
|
|
149
|
+
export declare function looksLikeGraphFlowOwnedContent(content: string): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* Remove a GraphFlow-owned file:
|
|
152
|
+
* - `graphflow.md` / `graphflow.mdc` → delete
|
|
153
|
+
* - managed-marker files → strip block
|
|
154
|
+
* - known instruction filenames that are wholly GraphFlow content → delete
|
|
155
|
+
*/
|
|
156
|
+
export declare function removeGraphFlowOwnedFile(filePath: string): boolean;
|
|
157
|
+
export interface SkillUninstallResult {
|
|
158
|
+
target: string;
|
|
159
|
+
path: string;
|
|
160
|
+
removed: boolean;
|
|
161
|
+
message?: string;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Uninstall all GraphFlow Skills, Rules, and managed instruction blocks
|
|
165
|
+
* written by `graphflow install` / `installAllSkills`.
|
|
166
|
+
*
|
|
167
|
+
* Call this together with MCP uninstall so Agent Plugin / IDE uninstall
|
|
168
|
+
* leftovers cannot keep guiding agents toward GraphFlow tools.
|
|
169
|
+
*/
|
|
170
|
+
export declare function uninstallAllSkillsAndRules(workspaceRoot?: string): SkillUninstallResult[];
|
|
148
171
|
//# sourceMappingURL=skill-installer.d.ts.map
|