@roarpeng/graphflow 1.0.0 → 1.0.4

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 (137) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +96 -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 +119 -0
  105. package/dist/surfaces/cli/index.js.map +1 -1
  106. package/dist/surfaces/cli/output.d.ts.map +1 -1
  107. package/dist/surfaces/cli/output.js +7 -0
  108. package/dist/surfaces/cli/output.js.map +1 -1
  109. package/dist/surfaces/cli/runtime/graph.d.ts +77 -3
  110. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  111. package/dist/surfaces/cli/runtime/graph.js +140 -9
  112. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  113. package/dist/surfaces/cli/runtime/routing.d.ts +24 -1
  114. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  115. package/dist/surfaces/cli/runtime/routing.js +57 -0
  116. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  117. package/dist/surfaces/cli/runtime/settings.d.ts.map +1 -1
  118. package/dist/surfaces/cli/runtime/settings.js +4 -1
  119. package/dist/surfaces/cli/runtime/settings.js.map +1 -1
  120. package/dist/surfaces/cli/runtime/types.d.ts +16 -0
  121. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  122. package/dist/surfaces/cli/runtime.d.ts +2 -2
  123. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  124. package/dist/surfaces/cli/runtime.js +11 -1
  125. package/dist/surfaces/cli/runtime.js.map +1 -1
  126. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  127. package/dist/surfaces/mcp/server.js +143 -2
  128. package/dist/surfaces/mcp/server.js.map +1 -1
  129. package/package.json +5 -2
  130. package/scripts/safe-postinstall.cjs +167 -12
  131. package/src/surfaces/trae-skill/graphflow/SKILL.md +535 -0
  132. package/wasm/tree-sitter-c.wasm +0 -0
  133. package/wasm/tree-sitter-go.wasm +0 -0
  134. package/wasm/tree-sitter-java.wasm +0 -0
  135. package/wasm/tree-sitter-python.wasm +0 -0
  136. package/wasm/tree-sitter-ruby.wasm +0 -0
  137. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -1,20 +1,175 @@
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;
64
+ }
65
+
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
+ }
6
132
  }
7
133
 
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);
134
+ function main() {
135
+ if (process.env.GRAPHFLOW_SKIP_POSTINSTALL === "1" || process.env.CI === "true") {
136
+ process.exit(0);
137
+ }
138
+
139
+ if (process.env.GRAPHFLOW_ENABLE_POSTINSTALL !== "1") {
140
+ console.log("[GraphFlow] Post-install skipped. Set GRAPHFLOW_ENABLE_POSTINSTALL=1 to auto-install MCP + Skill.");
141
+ console.log("[GraphFlow] Run 'npx @roarpeng/graphflow install' to install manually.");
142
+ process.exit(0);
143
+ }
144
+
145
+ console.log("[GraphFlow] Running post-install setup...");
146
+
147
+ const skillSourceDir = getSkillSourceDir();
148
+ const traeDirs = getTraeUserDirs();
149
+
150
+ const skillResults = [];
151
+ if (skillSourceDir && traeDirs.length > 0) {
152
+ for (const trae of traeDirs) {
153
+ const result = installSkill(trae.skillsDir, skillSourceDir);
154
+ skillResults.push({ agent: trae.name, ...result });
155
+ console.log(`[GraphFlow] Skill for ${trae.name}: ${result.status}${result.reason ? ` (${result.reason})` : ""}`);
156
+ }
157
+ }
158
+
159
+ const mcpResult = runMcpInstaller();
160
+ if (mcpResult.status === "installed" && Array.isArray(mcpResult.details)) {
161
+ for (const item of mcpResult.details) {
162
+ console.log(`[GraphFlow] MCP for ${item.agentName} (${item.scope}): ${item.status}`);
163
+ }
164
+ } else if (mcpResult.status === "skipped") {
165
+ console.log(`[GraphFlow] MCP install skipped: ${mcpResult.reason}`);
166
+ }
167
+
168
+ console.log("[GraphFlow] Post-install complete.");
12
169
  }
13
170
 
14
- const initPath = "dist/surfaces/cli/init.js";
15
- if (!existsSync(initPath)) {
16
- process.exit(0);
171
+ if (require.main === module) {
172
+ main();
17
173
  }
18
174
 
19
- const result = spawnSync(process.execPath, [initPath], { stdio: "inherit" });
20
- process.exit(result.status ?? 1);
175
+ module.exports = { installSkill, detectTrae, getTraeUserDirs, getSkillSourceDir };