@fieldwangai/agentflow 0.1.149 → 0.1.154

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 (195) hide show
  1. package/README.md +20 -33
  2. package/README.zh-CN.md +14 -34
  3. package/agents/agentflow-node-executor-code.md +13 -3
  4. package/agents/agentflow-node-executor-planning.md +13 -3
  5. package/agents/agentflow-node-executor-requirement.md +13 -3
  6. package/agents/agentflow-node-executor-test.md +13 -3
  7. package/agents/agentflow-node-executor-ui.md +13 -3
  8. package/agents/agentflow-node-executor.md +13 -3
  9. package/agents/en/agentflow-node-executor.md +13 -3
  10. package/agents/zh/agentflow-node-executor.md +13 -3
  11. package/bin/agentflow.mjs +3 -3
  12. package/bin/lib/admin-builtin-pipelines.mjs +3 -2
  13. package/bin/lib/agent-runners.mjs +0 -929
  14. package/bin/lib/auth.mjs +2 -1
  15. package/bin/lib/catalog-agents.mjs +2 -1
  16. package/bin/lib/catalog-flows.mjs +167 -88
  17. package/bin/lib/composer-agent.mjs +3 -793
  18. package/bin/lib/composer-skill-router.mjs +3 -323
  19. package/bin/lib/exec-buffered.mjs +32 -0
  20. package/bin/lib/flow-dsl/cli.mjs +276 -0
  21. package/bin/lib/flow-dsl/codegen.mjs +358 -0
  22. package/bin/lib/flow-dsl/defs.mjs +103 -0
  23. package/bin/lib/flow-dsl/index.mjs +77 -0
  24. package/bin/lib/flow-dsl/ir.mjs +305 -0
  25. package/bin/lib/flow-dsl/layout.mjs +115 -0
  26. package/bin/lib/flow-dsl/legacy-yaml.mjs +268 -0
  27. package/bin/lib/flow-dsl/lint.mjs +241 -0
  28. package/bin/lib/flow-dsl/packages.mjs +251 -0
  29. package/bin/lib/flow-dsl/parser.mjs +444 -0
  30. package/bin/lib/flow-import.mjs +96 -26
  31. package/bin/lib/flow-write.mjs +48 -12
  32. package/bin/lib/help.mjs +10 -30
  33. package/bin/lib/html-escape.mjs +19 -0
  34. package/bin/lib/http-util.mjs +49 -0
  35. package/bin/lib/legacy-flow-execution.mjs +43 -0
  36. package/bin/lib/locales/en.json +1 -1
  37. package/bin/lib/locales/zh.json +1 -1
  38. package/bin/lib/main.mjs +153 -283
  39. package/bin/lib/marketplace.mjs +206 -61
  40. package/bin/lib/model-config.mjs +10 -0
  41. package/bin/lib/node-package-archive.mjs +240 -0
  42. package/bin/lib/node-package-bootstrap.mjs +72 -0
  43. package/bin/lib/node-package-manifest.mjs +174 -0
  44. package/bin/lib/paths.mjs +42 -19
  45. package/bin/lib/prd-workflow-routes.mjs +2949 -0
  46. package/bin/lib/prd-workflow-server.mjs +4884 -0
  47. package/bin/lib/run-events.mjs +0 -66
  48. package/bin/lib/schedule-config.mjs +4 -4
  49. package/bin/lib/skill-runtime.mjs +35 -0
  50. package/bin/lib/startup-storage-migrations.mjs +274 -0
  51. package/bin/lib/ui-server.mjs +1106 -18013
  52. package/bin/lib/user-env.mjs +16 -0
  53. package/bin/lib/workspace-auto-layout.mjs +234 -0
  54. package/bin/lib/workspace-flow-store.mjs +478 -0
  55. package/bin/lib/workspace-graph-merge.mjs +41 -34
  56. package/bin/lib/workspace-preview.mjs +74 -0
  57. package/bin/lib/workspace-routes.mjs +3088 -0
  58. package/bin/lib/workspace-server.mjs +6199 -0
  59. package/bin/lib/workspace-state.mjs +331 -0
  60. package/bin/lib/workspace.mjs +2 -1
  61. package/builtin/nodes/agent_subAgent.md +1 -0
  62. package/builtin/nodes/control_agent_toBool.md +2 -0
  63. package/builtin/nodes/control_anyOne.md +2 -0
  64. package/builtin/nodes/control_cancelled.md +2 -0
  65. package/builtin/nodes/control_cd_workspace.md +5 -11
  66. package/builtin/nodes/control_delay.md +2 -0
  67. package/builtin/nodes/control_end.md +2 -0
  68. package/builtin/nodes/control_if.md +1 -0
  69. package/builtin/nodes/control_interval_loop.md +2 -0
  70. package/builtin/nodes/control_load_mcp.md +24 -0
  71. package/builtin/nodes/control_load_skills.md +8 -23
  72. package/builtin/nodes/control_start.md +2 -0
  73. package/builtin/nodes/control_toBool.md +2 -0
  74. package/builtin/nodes/control_user_workspace.md +2 -0
  75. package/builtin/nodes/control_wait_until.md +2 -0
  76. package/builtin/nodes/display_ascii.md +1 -0
  77. package/builtin/nodes/display_chart.md +1 -0
  78. package/builtin/nodes/display_html.md +1 -0
  79. package/builtin/nodes/display_image.md +1 -0
  80. package/builtin/nodes/display_markdown.md +1 -0
  81. package/builtin/nodes/display_mermaid.md +1 -0
  82. package/builtin/nodes/display_react_app.md +1 -0
  83. package/builtin/nodes/display_table.md +1 -0
  84. package/builtin/nodes/provide_bool.md +1 -0
  85. package/builtin/nodes/provide_file.md +1 -0
  86. package/builtin/nodes/provide_password.md +1 -0
  87. package/builtin/nodes/provide_str.md +1 -0
  88. package/builtin/nodes/tool_display_share_link.md +1 -0
  89. package/builtin/nodes/tool_get_env.md +2 -0
  90. package/builtin/nodes/tool_git_checkout.md +1 -0
  91. package/builtin/nodes/tool_git_worktree_load.md +1 -0
  92. package/builtin/nodes/tool_git_worktree_unload.md +1 -0
  93. package/builtin/nodes/tool_gitlab_create_mr.md +1 -0
  94. package/builtin/nodes/tool_jenkins_build.md +2 -0
  95. package/builtin/nodes/tool_load_key.md +2 -0
  96. package/builtin/nodes/tool_nodejs.md +17 -19
  97. package/builtin/nodes/tool_print.md +2 -0
  98. package/builtin/nodes/tool_save_key.md +2 -0
  99. package/builtin/nodes/tool_set_run_env.md +1 -0
  100. package/builtin/nodes/tool_user_ask.md +2 -0
  101. package/builtin/nodes/tool_user_check.md +2 -0
  102. package/builtin/nodes/tool_wecom_send_app_markdown.md +1 -0
  103. package/builtin/nodes/tool_wecom_send_group_markdown.md +1 -0
  104. package/builtin/nodes/workspace_one_click_task.md +44 -0
  105. package/builtin/nodes/workspace_run.md +16 -0
  106. package/builtin/nodes/workspace_scheduled_run.md +16 -0
  107. package/builtin/pipelines/module-migrate/scripts/gate.mjs +37 -0
  108. package/builtin/pipelines/module-migrate/scripts/static-check.mjs +82 -0
  109. package/builtin/pipelines/module-migrate/workspace.flow.js +172 -0
  110. package/builtin/pipelines/module-migrate/workspace.layout.json +134 -0
  111. package/builtin/pipelines/new/scripts/lint-flow.mjs +38 -0
  112. package/builtin/pipelines/new/workspace.flow.js +91 -0
  113. package/builtin/pipelines/new/workspace.layout.json +70 -0
  114. package/builtin/web-ui/dist/assets/{WorkflowAssistantThread-DPbR2UaN.js → WorkflowAssistantThread-CKClwj96.js} +1 -1
  115. package/builtin/web-ui/dist/assets/index-BZ5KqLur.js +870 -0
  116. package/builtin/web-ui/dist/assets/index-CEXmmwM2.css +1 -0
  117. package/builtin/web-ui/dist/index.html +2 -2
  118. package/package.json +2 -1
  119. package/reference/flow-control-capabilities.md +77 -158
  120. package/reference/flow-layout.md +1 -1
  121. package/reference/flow-prompt-handler-check.md +2 -2
  122. package/skills/agentflow-author-flow/SKILL.md +8 -47
  123. package/skills/agentflow-cli/SKILL.md +158 -25
  124. package/skills/agentflow-cli/agents/openai.yaml +2 -2
  125. package/skills/agentflow-cli/scripts/agentflow-cli.mjs +668 -18
  126. package/skills/agentflow-cli/scripts/agentflow-runtime.mjs +97 -0
  127. package/skills/agentflow-flow-add-instances/SKILL.md +7 -248
  128. package/skills/agentflow-flow-dsl/SKILL.md +206 -0
  129. package/skills/agentflow-flow-dsl/agents/openai.yaml +4 -0
  130. package/skills/agentflow-flow-dsl/references/node-calls.md +39 -0
  131. package/skills/agentflow-flow-edit-node-fields/SKILL.md +4 -73
  132. package/skills/agentflow-flow-recipes/SKILL.md +7 -18
  133. package/skills/agentflow-flow-recipes/references/recipes.md +97 -43
  134. package/skills/agentflow-flow-sync-ui/SKILL.md +3 -54
  135. package/skills/agentflow-node-dsl/SKILL.md +212 -0
  136. package/skills/agentflow-node-dsl/agents/openai.yaml +4 -0
  137. package/skills/agentflow-node-reference/SKILL.md +5 -4
  138. package/skills/agentflow-node-reference/references/builtin-nodes.md +166 -115
  139. package/skills/agentflow-placeholder-reference/SKILL.md +2 -2
  140. package/skills/agentflow-runtime-reference/SKILL.md +2 -2
  141. package/skills/agentflow-runtime-reference/references/runtime.md +1 -1
  142. package/skills/agentflow-workspace-ascii/SKILL.md +9 -16
  143. package/skills/agentflow-workspace-graph/SKILL.md +62 -48
  144. package/skills/agentflow-workspace-html/SKILL.md +7 -2
  145. package/skills/agentflow-workspace-image/SKILL.md +6 -2
  146. package/skills/agentflow-workspace-markdown/SKILL.md +14 -21
  147. package/skills/agentflow-workspace-mermaid/SKILL.md +8 -16
  148. package/bin/lib/api-runner.mjs +0 -387
  149. package/bin/lib/apply.mjs +0 -903
  150. package/bin/lib/composer-flow-instances.mjs +0 -68
  151. package/bin/lib/composer-flow-skeleton.mjs +0 -334
  152. package/bin/lib/composer-flow-validate.mjs +0 -47
  153. package/bin/lib/composer-model-router.mjs +0 -185
  154. package/bin/lib/composer-node-schema.mjs +0 -303
  155. package/bin/lib/composer-planner.mjs +0 -751
  156. package/bin/lib/composer-script-ops.mjs +0 -233
  157. package/bin/lib/flow-static-preview.mjs +0 -104
  158. package/bin/lib/hub-login.mjs +0 -54
  159. package/bin/lib/hub-publish.mjs +0 -159
  160. package/bin/lib/hub-remote.mjs +0 -189
  161. package/bin/lib/hub.mjs +0 -299
  162. package/bin/lib/jenkins.mjs +0 -380
  163. package/bin/lib/node-execute.mjs +0 -539
  164. package/bin/lib/normalize-node-tool-command.mjs +0 -97
  165. package/bin/lib/runtime-context.mjs +0 -243
  166. package/bin/lib/scheduler.mjs +0 -601
  167. package/bin/lib/ui-print.mjs +0 -94
  168. package/bin/pipeline/build-node-prompt.mjs +0 -271
  169. package/bin/pipeline/check-cache.mjs +0 -191
  170. package/bin/pipeline/check-flow.mjs +0 -543
  171. package/bin/pipeline/collect-nodes.mjs +0 -212
  172. package/bin/pipeline/compute-cache-md5.mjs +0 -177
  173. package/bin/pipeline/ensure-run-dir.mjs +0 -71
  174. package/bin/pipeline/gc.mjs +0 -129
  175. package/bin/pipeline/get-env.mjs +0 -59
  176. package/bin/pipeline/get-resolved-values.mjs +0 -344
  177. package/bin/pipeline/load-key.mjs +0 -62
  178. package/bin/pipeline/parse-flow.mjs +0 -708
  179. package/bin/pipeline/post-process-control-if.mjs +0 -23
  180. package/bin/pipeline/post-process-node.mjs +0 -490
  181. package/bin/pipeline/pre-process-node.mjs +0 -1430
  182. package/bin/pipeline/resolve-inputs.mjs +0 -201
  183. package/bin/pipeline/run-tool-nodejs.mjs +0 -167
  184. package/bin/pipeline/save-key.mjs +0 -93
  185. package/bin/pipeline/snapshot-prior-round.mjs +0 -70
  186. package/bin/pipeline/validate-for-ui.mjs +0 -234
  187. package/bin/pipeline/validate-script-output.mjs +0 -130
  188. package/bin/pipeline/write-result.mjs +0 -182
  189. package/builtin/pipelines/module-migrate/flow.yaml +0 -819
  190. package/builtin/pipelines/new/flow.yaml +0 -545
  191. package/builtin/pipelines/new/scripts/check-flow.mjs +0 -9
  192. package/builtin/pipelines/new/scripts/collect-nodes.mjs +0 -211
  193. package/builtin/web-ui/dist/assets/index-BSCpd5la.js +0 -889
  194. package/builtin/web-ui/dist/assets/index-DZ328oSo.css +0 -1
  195. package/skills/agentflow-node-authoring/SKILL.md +0 -57
@@ -1,211 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 收集所有节点(内置 + 当前流水线)的元数据,按 tool_nodejs 约定向 stdout 输出一行 JSON。
4
- * 用法:agentflow apply -ai collect-nodes <workspaceRoot> <flowName> [runDir]
5
- * 输出(仅 stdout 一行):{ "err_code": 0, "message": { "result": "<节点元数据 markdown>" } };err_code 0=成功 1=失败,无 next。
6
- * 不写任何文件,由 agentflow apply -ai run-tool-nodejs 根据 message 写入 output。
7
- */
8
-
9
- import fs from "fs";
10
- import path from "path";
11
- import { fileURLToPath } from "url";
12
- import yaml from "js-yaml";
13
- import { LEGACY_NODES_DIR, PIPELINES_DIR, PROJECT_NODES_DIR } from "../../../../bin/lib/paths.mjs";
14
- import { getFlowDir } from "../../../../bin/lib/workspace.mjs";
15
-
16
- const __dirnameScript = path.dirname(fileURLToPath(import.meta.url));
17
- const PACKAGE_BUILTIN_NODES_DIR = path.join(path.resolve(__dirnameScript, "..", "..", ".."), "nodes");
18
-
19
- function extractFrontmatter(raw) {
20
- const m = raw.match(/^---\s*\n([\s\S]*?)\n---/);
21
- return m ? m[1] : "";
22
- }
23
-
24
- function parseDescription(fm) {
25
- const match = fm.match(/\bdescription:\s*["']?([^"'\n#][^\n]*)["']?/);
26
- return match ? match[1].trim().replace(/^["']|["']$/g, "") : "";
27
- }
28
-
29
- function parseDisplayName(fm) {
30
- const match = fm.match(/\bdisplayName:\s*["']?([^"'\n#][^\n]*)["']?/);
31
- return match ? match[1].trim().replace(/^["']|["']$/g, "") : "";
32
- }
33
-
34
- /** 解析 frontmatter 中的 input/output 数组,返回 [{ type, name, defaultOrValue }, ...] */
35
- function parseSlots(fm, key) {
36
- const slots = [];
37
- const re = new RegExp(`\\b${key}:\\s*\\n([\\s\\S]*?)(?=\\n[a-zA-Z_][a-zA-Z0-9_]*\\s*:|---|$)`, "m");
38
- const blockMatch = fm.match(re);
39
- if (!blockMatch) return slots;
40
- const block = blockMatch[1];
41
- let current = {};
42
- for (const line of block.split("\n")) {
43
- const typeMatch = line.match(/^\s*-\s+type:\s*["']?([^"'\n]*)["']?/);
44
- if (typeMatch) {
45
- if (current.type) slots.push({ ...current });
46
- current = { type: typeMatch[1].trim() };
47
- continue;
48
- }
49
- const nameMatch = line.match(/^\s+name:\s*["']?([^"'\n]*)["']?/);
50
- if (nameMatch) {
51
- current.name = nameMatch[1].trim();
52
- continue;
53
- }
54
- const defaultMatch = line.match(/^\s+(?:default|value):\s*(.*)$/);
55
- if (defaultMatch) {
56
- current.defaultOrValue = defaultMatch[1].trim().replace(/^["']|["']$/g, "");
57
- slots.push({ ...current });
58
- current = {};
59
- }
60
- }
61
- if (current.type) slots.push({ ...current });
62
- return slots;
63
- }
64
-
65
- function readNodeMeta(filePath) {
66
- try {
67
- if (!fs.existsSync(filePath)) return null;
68
- const raw = fs.readFileSync(filePath, "utf-8");
69
- const fm = extractFrontmatter(raw);
70
- return {
71
- description: parseDescription(fm),
72
- displayName: parseDisplayName(fm),
73
- input: parseSlots(fm, "input"),
74
- output: parseSlots(fm, "output"),
75
- };
76
- } catch {
77
- return null;
78
- }
79
- }
80
-
81
- /** 从 flow.yaml 的 instances 得到节点列表,每项 { id, label, definitionId, input, output },input/output 为 [{ type, name, defaultOrValue }] */
82
- function loadFlowYamlNodes(flowDir) {
83
- const flowPath = path.join(flowDir, "flow.yaml");
84
- if (!fs.existsSync(flowPath)) return [];
85
- try {
86
- const raw = fs.readFileSync(flowPath, "utf-8");
87
- const data = yaml.load(raw);
88
- const instances = data?.instances && typeof data.instances === "object" ? data.instances : {};
89
- return Object.entries(instances).map(([id, inst]) => {
90
- const inp = Array.isArray(inst.input) ? inst.input : [];
91
- const out = Array.isArray(inst.output) ? inst.output : [];
92
- const input = inp.map((s) => ({
93
- type: (s && s.type != null) ? String(s.type).trim() : "",
94
- name: (s && s.name != null) ? String(s.name).trim() : "",
95
- defaultOrValue: (s && (s.value != null || s.default != null)) ? String(s.value ?? s.default ?? "").trim() : "",
96
- }));
97
- const output = out.map((s) => ({
98
- type: (s && s.type != null) ? String(s.type).trim() : "",
99
- name: (s && s.name != null) ? String(s.name).trim() : "",
100
- defaultOrValue: (s && (s.value != null || s.default != null)) ? String(s.value ?? s.default ?? "").trim() : "",
101
- }));
102
- return {
103
- id,
104
- label: (inst.label != null) ? String(inst.label) : id,
105
- definitionId: (inst.definitionId != null) ? String(inst.definitionId) : id,
106
- input,
107
- output,
108
- };
109
- });
110
- } catch (_) {
111
- return [];
112
- }
113
- }
114
-
115
- function main() {
116
- const args = process.argv.slice(2);
117
- if (args.length < 2) {
118
- const payload = { err_code: 1, message: { result: "Usage: agentflow apply -ai collect-nodes <workspaceRoot> <flowName> [runDir]" } };
119
- console.log(JSON.stringify(payload));
120
- process.exit(1);
121
- }
122
-
123
- const [workspaceRoot, flowName] = args.map((p) => path.resolve(p));
124
- const nodesDirLegacy = path.join(workspaceRoot, LEGACY_NODES_DIR);
125
- const nodesDirNew = path.join(workspaceRoot, PROJECT_NODES_DIR);
126
- const flowDir = getFlowDir(workspaceRoot, flowName) || path.join(workspaceRoot, PIPELINES_DIR, flowName);
127
-
128
- const out = [];
129
-
130
- // 1. 项目级节点目录:旧 .cursor 与新 .workspace 合并(同 id 新路径优先)
131
- out.push("# 节点元数据(内置 + 当前流水线)\n");
132
- out.push("## 1. 内置节点元数据\n\n");
133
- const projectById = new Map();
134
- const mergeProjectDir = (dir) => {
135
- if (!fs.existsSync(dir)) return;
136
- for (const file of fs.readdirSync(dir).filter((f) => f.endsWith(".md")).sort()) {
137
- projectById.set(file.replace(/\.md$/, ""), path.join(dir, file));
138
- }
139
- };
140
- mergeProjectDir(nodesDirLegacy);
141
- mergeProjectDir(nodesDirNew);
142
- if (projectById.size === 0) {
143
- out.push("(无项目内节点目录)\n");
144
- } else {
145
- for (const definitionId of [...projectById.keys()].sort()) {
146
- const meta = readNodeMeta(projectById.get(definitionId));
147
- if (!meta) continue;
148
- out.push(`### ${definitionId}\n`);
149
- out.push(`- **displayName**: ${meta.displayName || definitionId}\n`);
150
- out.push(`- **description**: ${meta.description || ""}\n`);
151
- out.push(`- **input** (handle: input-0, input-1, …):\n`);
152
- if (meta.input.length) meta.input.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → input-${i}\n`));
153
- else out.push(" - 无\n");
154
- out.push(`- **output** (handle: output-0, output-1, …):\n`);
155
- if (meta.output.length) meta.output.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → output-${i}\n`));
156
- else out.push(" - 无\n");
157
- out.push("\n");
158
- }
159
- }
160
-
161
- // 2. 当前流水线节点(来自 flow.yaml instances)
162
- out.push("## 2. 当前流水线节点元数据\n\n");
163
- const flowNodes = loadFlowYamlNodes(flowDir);
164
- for (const node of flowNodes) {
165
- const { id, label, definitionId, input: nodeInput, output: nodeOutput } = node;
166
- let input = nodeInput || [];
167
- let output = nodeOutput || [];
168
- if (input.length === 0 && output.length === 0) {
169
- const tryPaths = [
170
- path.join(flowDir, "nodes", `${definitionId}.md`),
171
- path.join(nodesDirNew, `${definitionId}.md`),
172
- path.join(nodesDirLegacy, `${definitionId}.md`),
173
- path.join(PACKAGE_BUILTIN_NODES_DIR, `${definitionId}.md`),
174
- ];
175
- let meta = null;
176
- for (const defPath of tryPaths) {
177
- meta = readNodeMeta(defPath);
178
- if (meta) break;
179
- }
180
- if (meta) {
181
- input = meta.input;
182
- output = meta.output;
183
- }
184
- }
185
- out.push(`### ${id}\n`);
186
- out.push(`- **label**: ${label || id}\n`);
187
- out.push(`- **definitionId**: ${definitionId || ""}\n`);
188
- out.push(`- **input** (handle):\n`);
189
- if (input.length) input.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → input-${i}\n`));
190
- else out.push(" - 无\n");
191
- out.push(`- **output** (handle):\n`);
192
- if (output.length) output.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → output-${i}\n`));
193
- else out.push(" - 无\n");
194
- out.push("\n");
195
- }
196
-
197
- const content = out.join("");
198
-
199
- // 优先写入 output 引脚文件(直接写文件模式)
200
- const resultOutPath = args[2] ? String(args[2]).trim() : "";
201
- if (resultOutPath) {
202
- fs.mkdirSync(path.dirname(resultOutPath), { recursive: true });
203
- fs.writeFileSync(resultOutPath, content, "utf-8");
204
- } else {
205
- // 兼容旧模式:通过 JSON stdout 输出
206
- const payload = { err_code: 0, message: { result: content } };
207
- console.log(JSON.stringify(payload));
208
- }
209
- }
210
-
211
- main();