@roarpeng/graphflow 1.0.0 → 1.0.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.
Files changed (142) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +99 -38
  3. package/dist/agents/insight.d.ts +83 -0
  4. package/dist/agents/insight.d.ts.map +1 -0
  5. package/dist/agents/insight.js +381 -0
  6. package/dist/agents/insight.js.map +1 -0
  7. package/dist/config/defaults.js +1 -1
  8. package/dist/config/defaults.js.map +1 -1
  9. package/dist/config/discover-workspace.d.ts +16 -0
  10. package/dist/config/discover-workspace.d.ts.map +1 -0
  11. package/dist/config/discover-workspace.js +112 -0
  12. package/dist/config/discover-workspace.js.map +1 -0
  13. package/dist/config/resolve.d.ts.map +1 -1
  14. package/dist/config/resolve.js +22 -8
  15. package/dist/config/resolve.js.map +1 -1
  16. package/dist/config/scaffold.d.ts.map +1 -1
  17. package/dist/config/scaffold.js +2 -1
  18. package/dist/config/scaffold.js.map +1 -1
  19. package/dist/config/workspace-root.d.ts +24 -0
  20. package/dist/config/workspace-root.d.ts.map +1 -0
  21. package/dist/config/workspace-root.js +59 -0
  22. package/dist/config/workspace-root.js.map +1 -0
  23. package/dist/core/orchestrator.js +10 -1
  24. package/dist/core/orchestrator.js.map +1 -1
  25. package/dist/core/state-machine.js +1 -1
  26. package/dist/core/state-machine.js.map +1 -1
  27. package/dist/core/types.d.ts +2 -2
  28. package/dist/core/types.d.ts.map +1 -1
  29. package/dist/graph/artifact-manager.d.ts +72 -0
  30. package/dist/graph/artifact-manager.d.ts.map +1 -0
  31. package/dist/graph/artifact-manager.js +215 -0
  32. package/dist/graph/artifact-manager.js.map +1 -0
  33. package/dist/graph/context-slicer.d.ts.map +1 -1
  34. package/dist/graph/context-slicer.js +3 -2
  35. package/dist/graph/context-slicer.js.map +1 -1
  36. package/dist/graph/file-indexer.d.ts +31 -0
  37. package/dist/graph/file-indexer.d.ts.map +1 -1
  38. package/dist/graph/file-indexer.js +332 -3
  39. package/dist/graph/file-indexer.js.map +1 -1
  40. package/dist/graph/graph-compression.d.ts.map +1 -1
  41. package/dist/graph/graph-compression.js +2 -0
  42. package/dist/graph/graph-compression.js.map +1 -1
  43. package/dist/graph/graph-utils.d.ts +4 -1
  44. package/dist/graph/graph-utils.d.ts.map +1 -1
  45. package/dist/graph/graph-utils.js +62 -0
  46. package/dist/graph/graph-utils.js.map +1 -1
  47. package/dist/graph/graphify-file-client.d.ts.map +1 -1
  48. package/dist/graph/graphify-file-client.js +30 -8
  49. package/dist/graph/graphify-file-client.js.map +1 -1
  50. package/dist/graph/language-indexers/c-cpp.d.ts +9 -1
  51. package/dist/graph/language-indexers/c-cpp.d.ts.map +1 -1
  52. package/dist/graph/language-indexers/c-cpp.js +328 -103
  53. package/dist/graph/language-indexers/c-cpp.js.map +1 -1
  54. package/dist/graph/language-indexers/index.d.ts +20 -0
  55. package/dist/graph/language-indexers/index.d.ts.map +1 -1
  56. package/dist/graph/language-indexers/index.js +4 -0
  57. package/dist/graph/language-indexers/index.js.map +1 -1
  58. package/dist/graph/language-indexers/java.d.ts +12 -0
  59. package/dist/graph/language-indexers/java.d.ts.map +1 -0
  60. package/dist/graph/language-indexers/java.js +273 -0
  61. package/dist/graph/language-indexers/java.js.map +1 -0
  62. package/dist/graph/language-indexers/python.d.ts.map +1 -1
  63. package/dist/graph/language-indexers/python.js +47 -4
  64. package/dist/graph/language-indexers/python.js.map +1 -1
  65. package/dist/graph/language-indexers/ruby.d.ts +14 -0
  66. package/dist/graph/language-indexers/ruby.d.ts.map +1 -0
  67. package/dist/graph/language-indexers/ruby.js +245 -0
  68. package/dist/graph/language-indexers/ruby.js.map +1 -0
  69. package/dist/graph/language-indexers/rust.d.ts +10 -1
  70. package/dist/graph/language-indexers/rust.d.ts.map +1 -1
  71. package/dist/graph/language-indexers/rust.js +254 -80
  72. package/dist/graph/language-indexers/rust.js.map +1 -1
  73. package/dist/graph/language-indexers/tree-sitter-loader.d.ts +8 -1
  74. package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -1
  75. package/dist/graph/language-indexers/tree-sitter-loader.js +64 -13
  76. package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -1
  77. package/dist/graph/language-indexers/typescript.d.ts.map +1 -1
  78. package/dist/graph/language-indexers/typescript.js +72 -8
  79. package/dist/graph/language-indexers/typescript.js.map +1 -1
  80. package/dist/graph/metrics.d.ts +33 -0
  81. package/dist/graph/metrics.d.ts.map +1 -0
  82. package/dist/graph/metrics.js +117 -0
  83. package/dist/graph/metrics.js.map +1 -0
  84. package/dist/graph/token-savings.d.ts +52 -0
  85. package/dist/graph/token-savings.d.ts.map +1 -0
  86. package/dist/graph/token-savings.js +113 -0
  87. package/dist/graph/token-savings.js.map +1 -0
  88. package/dist/index.d.ts +2 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +7 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/integrations/agent-mcp-installer.d.ts +2 -0
  93. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  94. package/dist/integrations/agent-mcp-installer.js +115 -23
  95. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  96. package/dist/learning/episodic-memory.d.ts +8 -1
  97. package/dist/learning/episodic-memory.d.ts.map +1 -1
  98. package/dist/learning/episodic-memory.js +33 -0
  99. package/dist/learning/episodic-memory.js.map +1 -1
  100. package/dist/skills/index.d.ts +157 -0
  101. package/dist/skills/index.d.ts.map +1 -0
  102. package/dist/skills/index.js +157 -0
  103. package/dist/skills/index.js.map +1 -0
  104. package/dist/surfaces/cli/index.js +128 -0
  105. package/dist/surfaces/cli/index.js.map +1 -1
  106. package/dist/surfaces/cli/init.d.ts +7 -0
  107. package/dist/surfaces/cli/init.d.ts.map +1 -1
  108. package/dist/surfaces/cli/init.js +121 -7
  109. package/dist/surfaces/cli/init.js.map +1 -1
  110. package/dist/surfaces/cli/output.d.ts.map +1 -1
  111. package/dist/surfaces/cli/output.js +8 -0
  112. package/dist/surfaces/cli/output.js.map +1 -1
  113. package/dist/surfaces/cli/runtime/graph.d.ts +77 -3
  114. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  115. package/dist/surfaces/cli/runtime/graph.js +140 -9
  116. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  117. package/dist/surfaces/cli/runtime/routing.d.ts +24 -1
  118. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  119. package/dist/surfaces/cli/runtime/routing.js +57 -0
  120. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  121. package/dist/surfaces/cli/runtime/settings.d.ts.map +1 -1
  122. package/dist/surfaces/cli/runtime/settings.js +4 -1
  123. package/dist/surfaces/cli/runtime/settings.js.map +1 -1
  124. package/dist/surfaces/cli/runtime/types.d.ts +16 -0
  125. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  126. package/dist/surfaces/cli/runtime.d.ts +2 -2
  127. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  128. package/dist/surfaces/cli/runtime.js +11 -1
  129. package/dist/surfaces/cli/runtime.js.map +1 -1
  130. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  131. package/dist/surfaces/mcp/server.js +143 -2
  132. package/dist/surfaces/mcp/server.js.map +1 -1
  133. package/dist/surfaces/trae-skill/graphflow/SKILL.md +535 -0
  134. package/package.json +6 -3
  135. package/scripts/safe-postinstall.cjs +187 -12
  136. package/src/surfaces/trae-skill/graphflow/SKILL.md +535 -0
  137. package/wasm/tree-sitter-c.wasm +0 -0
  138. package/wasm/tree-sitter-go.wasm +0 -0
  139. package/wasm/tree-sitter-java.wasm +0 -0
  140. package/wasm/tree-sitter-python.wasm +0 -0
  141. package/wasm/tree-sitter-ruby.wasm +0 -0
  142. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -1,20 +1,195 @@
1
- const { existsSync } = require("node:fs");
1
+ #!/usr/bin/env node
2
+ const { existsSync, mkdirSync, copyFileSync, readFileSync } = require("node:fs");
3
+ const { join } = require("node:path");
4
+ const { homedir } = require("node:os");
2
5
  const { spawnSync } = require("node:child_process");
3
6
 
4
- if (process.env.GRAPHFLOW_SKIP_POSTINSTALL === "1" || process.env.CI === "true") {
5
- process.exit(0);
7
+ const isWindows = process.platform === "win32";
8
+
9
+ function resolveHomePaths() {
10
+ const home = homedir();
11
+ const appData = process.env.APPDATA || (isWindows ? join(home, "AppData", "Roaming") : "");
12
+ const localAppData = process.env.LOCALAPPDATA || (isWindows ? join(home, "AppData", "Local") : "");
13
+ return { home, appData, localAppData };
14
+ }
15
+
16
+ function detectTrae() {
17
+ const { home, appData } = resolveHomePaths();
18
+ const markers = [
19
+ join(home, ".trae"),
20
+ join(home, ".trae-cn"),
21
+ join(appData, "Trae"),
22
+ join(appData, "Trae CN"),
23
+ ];
24
+ return markers.some((m) => existsSync(m));
25
+ }
26
+
27
+ function getTraeUserDirs() {
28
+ const { home, appData } = resolveHomePaths();
29
+ const dirs = [];
30
+
31
+ if (isWindows) {
32
+ if (existsSync(join(appData, "Trae"))) {
33
+ dirs.push({
34
+ name: "Trae",
35
+ userDir: join(appData, "Trae", "User"),
36
+ skillsDir: join(appData, "Trae", "User", "skills"),
37
+ });
38
+ }
39
+ if (existsSync(join(appData, "Trae CN"))) {
40
+ dirs.push({
41
+ name: "Trae CN",
42
+ userDir: join(appData, "Trae CN", "User"),
43
+ skillsDir: join(appData, "Trae CN", "User", "skills"),
44
+ });
45
+ }
46
+ } else {
47
+ if (existsSync(join(home, ".config", "Trae"))) {
48
+ dirs.push({
49
+ name: "Trae",
50
+ userDir: join(home, ".config", "Trae", "User"),
51
+ skillsDir: join(home, ".config", "Trae", "User", "skills"),
52
+ });
53
+ }
54
+ if (existsSync(join(home, ".config", "Trae CN"))) {
55
+ dirs.push({
56
+ name: "Trae CN",
57
+ userDir: join(home, ".config", "Trae CN", "User"),
58
+ skillsDir: join(home, ".config", "Trae CN", "User", "skills"),
59
+ });
60
+ }
61
+ }
62
+
63
+ return dirs;
6
64
  }
7
65
 
8
- // Only run init when explicitly opted in. Avoid mutating global MCP/config when
9
- // GraphFlow is installed as a transitive dependency of another project.
10
- if (process.env.GRAPHFLOW_ENABLE_POSTINSTALL !== "1") {
11
- process.exit(0);
66
+ function installSkill(skillsDir, skillSourceDir) {
67
+ const skillDestDir = join(skillsDir, "graphflow");
68
+ const skillDestFile = join(skillDestDir, "SKILL.md");
69
+ const skillSourceFile = join(skillSourceDir, "SKILL.md");
70
+
71
+ if (!existsSync(skillSourceFile)) {
72
+ return { status: "skipped", reason: "skill source not found" };
73
+ }
74
+
75
+ const existed = existsSync(skillDestFile);
76
+
77
+ if (existed) {
78
+ const existingContent = readFileSync(skillDestFile, "utf8");
79
+ const newContent = readFileSync(skillSourceFile, "utf8");
80
+ if (existingContent === newContent) {
81
+ return { status: "skipped", reason: "already up to date" };
82
+ }
83
+ }
84
+
85
+ mkdirSync(skillDestDir, { recursive: true });
86
+ copyFileSync(skillSourceFile, skillDestFile);
87
+
88
+ return { status: existed ? "updated" : "created" };
89
+ }
90
+
91
+ function getSkillSourceDir() {
92
+ const candidates = [
93
+ join(__dirname, "..", "dist", "surfaces", "trae-skill", "graphflow"),
94
+ join(__dirname, "..", "src", "surfaces", "trae-skill", "graphflow"),
95
+ ];
96
+
97
+ for (const dir of candidates) {
98
+ if (existsSync(join(dir, "SKILL.md"))) {
99
+ return dir;
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+
105
+ function runMcpInstaller() {
106
+ const installerPath = join(__dirname, "..", "dist", "integrations", "agent-mcp-installer.js");
107
+ if (!existsSync(installerPath)) {
108
+ return { status: "skipped", reason: "installer not built yet" };
109
+ }
110
+
111
+ try {
112
+ const result = spawnSync(
113
+ process.execPath,
114
+ ["-e", `
115
+ const { installMcpToDetectedAgents } = require(${JSON.stringify(installerPath)});
116
+ const results = installMcpToDetectedAgents({ strategy: "npx" });
117
+ console.log(JSON.stringify(results));
118
+ `],
119
+ { encoding: "utf8" }
120
+ );
121
+ if (result.status === 0 && result.stdout.trim()) {
122
+ try {
123
+ return { status: "installed", details: JSON.parse(result.stdout.trim()) };
124
+ } catch {
125
+ return { status: "unknown", output: result.stdout.trim() };
126
+ }
127
+ }
128
+ return { status: "error", error: result.stderr || result.stdout };
129
+ } catch (err) {
130
+ return { status: "error", error: err.message };
131
+ }
132
+ }
133
+
134
+ function isGlobalInstall() {
135
+ if (process.env.npm_config_global === "true") {
136
+ return true;
137
+ }
138
+ try {
139
+ const pkgRoot = join(__dirname, "..");
140
+ const globalPrefix = process.env.npm_config_prefix || "";
141
+ if (globalPrefix && pkgRoot.startsWith(globalPrefix)) {
142
+ return true;
143
+ }
144
+ } catch {
145
+ // ignore
146
+ }
147
+ return false;
148
+ }
149
+
150
+ function main() {
151
+ if (process.env.GRAPHFLOW_SKIP_POSTINSTALL === "1" || process.env.CI === "true") {
152
+ process.exit(0);
153
+ }
154
+
155
+ const globalInstall = isGlobalInstall();
156
+ const explicitlyEnabled = process.env.GRAPHFLOW_ENABLE_POSTINSTALL === "1";
157
+
158
+ if (!globalInstall && !explicitlyEnabled) {
159
+ console.log("[GraphFlow] Local install detected. Auto-setup skipped to avoid modifying your global config.");
160
+ console.log("[GraphFlow] To install GraphFlow MCP + Skill, run:");
161
+ console.log("[GraphFlow] npx @roarpeng/graphflow install");
162
+ process.exit(0);
163
+ }
164
+
165
+ console.log(`[GraphFlow] Running post-install setup (${globalInstall ? "global install" : "explicitly enabled"})...`);
166
+
167
+ const skillSourceDir = getSkillSourceDir();
168
+ const traeDirs = getTraeUserDirs();
169
+
170
+ const skillResults = [];
171
+ if (skillSourceDir && traeDirs.length > 0) {
172
+ for (const trae of traeDirs) {
173
+ const result = installSkill(trae.skillsDir, skillSourceDir);
174
+ skillResults.push({ agent: trae.name, ...result });
175
+ console.log(`[GraphFlow] Skill for ${trae.name}: ${result.status}${result.reason ? ` (${result.reason})` : ""}`);
176
+ }
177
+ }
178
+
179
+ const mcpResult = runMcpInstaller();
180
+ if (mcpResult.status === "installed" && Array.isArray(mcpResult.details)) {
181
+ for (const item of mcpResult.details) {
182
+ console.log(`[GraphFlow] MCP for ${item.agentName} (${item.scope}): ${item.status}`);
183
+ }
184
+ } else if (mcpResult.status === "skipped") {
185
+ console.log(`[GraphFlow] MCP install skipped: ${mcpResult.reason}`);
186
+ }
187
+
188
+ console.log("[GraphFlow] Post-install complete.");
12
189
  }
13
190
 
14
- const initPath = "dist/surfaces/cli/init.js";
15
- if (!existsSync(initPath)) {
16
- process.exit(0);
191
+ if (require.main === module) {
192
+ main();
17
193
  }
18
194
 
19
- const result = spawnSync(process.execPath, [initPath], { stdio: "inherit" });
20
- process.exit(result.status ?? 1);
195
+ module.exports = { installSkill, detectTrae, getTraeUserDirs, getSkillSourceDir };