minimal-agent 0.8.2 → 0.10.0

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 (484) hide show
  1. package/README.md +14 -12
  2. package/package.json +34 -1
  3. package/plugins/cron-runner/.claude-plugin/plugin.json +5 -0
  4. package/plugins/cron-runner/commands/cron.md +26 -0
  5. package/plugins/cron-runner/commands/crons.md +7 -0
  6. package/plugins/cron-runner/plugin.js +34 -0
  7. package/plugins/cron-runner/src/commands.js +348 -0
  8. package/plugins/cron-runner/src/cronTime.js +148 -0
  9. package/plugins/cron-runner/src/lock.js +68 -0
  10. package/plugins/cron-runner/src/runs.js +89 -0
  11. package/plugins/cron-runner/src/scheduleEngine.js +72 -0
  12. package/plugins/cron-runner/src/scheduler.js +355 -0
  13. package/plugins/cron-runner/src/schema.js +140 -0
  14. package/plugins/cron-runner/src/service.js +167 -0
  15. package/plugins/cron-runner/src/store.js +298 -0
  16. package/plugins/cron-runner/src/types.js +1 -0
  17. package/plugins/workflow-runner/commands/workflow.md +4 -4
  18. package/plugins/workflow-runner/commands/workflows.md +1 -1
  19. package/plugins/workflow-runner/plugin.js +3 -1
  20. package/plugins/workflow-runner/src/agentCommon.js +249 -51
  21. package/plugins/workflow-runner/src/dslManifest.js +72 -0
  22. package/plugins/workflow-runner/src/expressions.js +198 -15
  23. package/plugins/workflow-runner/src/index.js +40 -8
  24. package/plugins/workflow-runner/src/jsonPayload.js +1 -1
  25. package/plugins/workflow-runner/src/loader.js +286 -72
  26. package/plugins/workflow-runner/src/multimodal.js +37 -0
  27. package/plugins/workflow-runner/src/recovery.js +49 -39
  28. package/plugins/workflow-runner/src/runner.js +802 -287
  29. package/plugins/workflow-runner/src/stepExecutors/agent.js +157 -39
  30. package/plugins/workflow-runner/src/stepExecutors/assert.js +16 -3
  31. package/plugins/workflow-runner/src/stepExecutors/llm.js +60 -111
  32. package/plugins/workflow-runner/src/stepExecutors/skill.js +47 -47
  33. package/plugins/workflow-runner/src/stepExecutors/tool.js +76 -10
  34. package/plugins/workflow-runner/src/stepExecutors/verify.js +27 -10
  35. package/plugins/workflow-runner/src/taskIdentity.js +296 -0
  36. package/plugins/workflow-runner/src/types.js +19 -9
  37. package/plugins/workflow-runner/src/workflowState.js +516 -33
  38. package/skills/adversarial-review/SKILL.md +0 -1
  39. package/skills/ai-image/SKILL.md +89 -0
  40. package/skills/ai-image/scripts/generate.mjs +497 -0
  41. package/skills/ai-image/scripts/generate_from_plan.mjs +469 -0
  42. package/skills/ai-image/scripts/generate_from_plan_test.mjs +223 -0
  43. package/skills/ai-image/scripts/generate_test.mjs +74 -0
  44. package/skills/browser-automation/SKILL.md +47 -0
  45. package/skills/docx/SKILL.md +25 -3
  46. package/skills/docx/scripts/office/helpers/__pycache__/__init__.cpython-314.pyc +0 -0
  47. package/skills/docx/scripts/office/helpers/__pycache__/merge_runs.cpython-314.pyc +0 -0
  48. package/skills/docx/scripts/office/helpers/__pycache__/simplify_redlines.cpython-314.pyc +0 -0
  49. package/skills/docx/scripts/office/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  50. package/skills/docx/scripts/office/validators/__pycache__/base.cpython-314.pyc +0 -0
  51. package/skills/docx/scripts/office/validators/__pycache__/docx.cpython-314.pyc +0 -0
  52. package/skills/docx/scripts/office/validators/__pycache__/pptx.cpython-314.pyc +0 -0
  53. package/skills/docx/scripts/office/validators/__pycache__/redlining.cpython-314.pyc +0 -0
  54. package/skills/docx/scripts/opc_check.py +253 -0
  55. package/skills/image-gen-openrouter/SKILL.md +10 -2
  56. package/skills/image-stats/SKILL.md +65 -0
  57. package/skills/image-stats/scripts/__pycache__/image_stats.cpython-314.pyc +0 -0
  58. package/skills/image-stats/scripts/__pycache__/image_stats_test.cpython-314.pyc +0 -0
  59. package/skills/image-stats/scripts/image_stats.py +368 -0
  60. package/skills/image-stats/scripts/image_stats_test.py +181 -0
  61. package/skills/pptx/SKILL.md +123 -95
  62. package/skills/pptx/design.md +82 -0
  63. package/skills/pptx/examples/README.md +29 -0
  64. package/skills/pptx/examples/hybrid_example.mjs +107 -0
  65. package/skills/pptx/examples/hybrid_example.pptx +0 -0
  66. package/skills/pptx/pptxgenjs.md +41 -0
  67. package/skills/pptx/scripts/deck_helpers.mjs +224 -0
  68. package/skills/pptx/scripts/layout_lint.py +293 -0
  69. package/skills/pptx/scripts/layout_lint_test.py +160 -0
  70. package/skills/pptx/scripts/opc_check.py +339 -0
  71. package/skills/pptx/scripts/svg_fallback.mjs +145 -0
  72. package/skills/pptx/svg.md +67 -0
  73. package/skills/tts-zh/SKILL.md +19 -2
  74. package/skills/ui-design/SKILL.md +158 -0
  75. package/skills/ui-design/claude_design.md +309 -0
  76. package/skills/ui-design/evals/evals.json +254 -0
  77. package/skills/ui-design/references/aesthetic-direction.md +83 -0
  78. package/skills/ui-design/references/claude-design-protocol.md +36 -0
  79. package/skills/ui-design/references/design-context.md +53 -0
  80. package/skills/ui-design/references/design-execution-playbook.md +82 -0
  81. package/skills/ui-design/references/export-pptx.md +124 -0
  82. package/skills/ui-design/references/layout-composition.md +654 -0
  83. package/skills/ui-design/references/preview-feedback.md +37 -0
  84. package/skills/ui-design/references/source-image-layout.md +189 -0
  85. package/skills/ui-design/references/starter-components.md +78 -0
  86. package/skills/ui-design/references/vi-aegis-vector.md +144 -0
  87. package/skills/ui-design/references/vi-amber-prism.md +133 -0
  88. package/skills/ui-design/references/vi-aqua-glass.md +200 -0
  89. package/skills/ui-design/references/vi-comfort-vision.md +147 -0
  90. package/skills/ui-design/references/vi-ember-prism.md +140 -0
  91. package/skills/ui-design/references/vi-nebula-console.md +151 -0
  92. package/skills/ui-design/references/vi-obsidian-optics.md +139 -0
  93. package/skills/ui-design/references/vi-obsidian-xui.md +143 -0
  94. package/skills/ui-design/references/vi-precision-horizon-dark.md +117 -0
  95. package/skills/ui-design/references/vi-precision-horizon.md +215 -0
  96. package/skills/ui-design/references/vi-solar-relay.md +130 -0
  97. package/skills/ui-design/references/vi-template-workflow.md +48 -0
  98. package/skills/ui-design/references/vi-verdant-grid.md +141 -0
  99. package/skills/ui-design/references/vi-violet-meridian.md +172 -0
  100. package/skills/ui-design/scripts/__pycache__/assemble_material.cpython-314.pyc +0 -0
  101. package/skills/ui-design/scripts/__pycache__/assemble_material_test.cpython-314.pyc +0 -0
  102. package/skills/ui-design/scripts/__pycache__/chart_sanity_check.cpython-314.pyc +0 -0
  103. package/skills/ui-design/scripts/__pycache__/check_language_policy.cpython-314.pyc +0 -0
  104. package/skills/ui-design/scripts/__pycache__/check_ui_artifact.cpython-314.pyc +0 -0
  105. package/skills/ui-design/scripts/__pycache__/check_ui_artifact_pptx_test.cpython-314.pyc +0 -0
  106. package/skills/ui-design/scripts/__pycache__/deck_pages_check.cpython-314.pyc +0 -0
  107. package/skills/ui-design/scripts/__pycache__/deck_pages_check_test.cpython-314.pyc +0 -0
  108. package/skills/ui-design/scripts/__pycache__/deck_visual_style_check.cpython-314.pyc +0 -0
  109. package/skills/ui-design/scripts/__pycache__/deck_visual_style_check_test.cpython-314.pyc +0 -0
  110. package/skills/ui-design/scripts/__pycache__/design_budget_check.cpython-314.pyc +0 -0
  111. package/skills/ui-design/scripts/__pycache__/design_budget_check_test.cpython-314.pyc +0 -0
  112. package/skills/ui-design/scripts/__pycache__/design_repair_hints.cpython-314.pyc +0 -0
  113. package/skills/ui-design/scripts/__pycache__/design_repair_hints_test.cpython-314.pyc +0 -0
  114. package/skills/ui-design/scripts/__pycache__/design_style_check.cpython-314.pyc +0 -0
  115. package/skills/ui-design/scripts/__pycache__/design_style_check_test.cpython-314.pyc +0 -0
  116. package/skills/ui-design/scripts/__pycache__/draft_coverage_check.cpython-314.pyc +0 -0
  117. package/skills/ui-design/scripts/__pycache__/extract_source_assets.cpython-314.pyc +0 -0
  118. package/skills/ui-design/scripts/__pycache__/extract_source_assets_test.cpython-314.pyc +0 -0
  119. package/skills/ui-design/scripts/__pycache__/generated_image_review_collect.cpython-314.pyc +0 -0
  120. package/skills/ui-design/scripts/__pycache__/generated_image_review_collect_test.cpython-314.pyc +0 -0
  121. package/skills/ui-design/scripts/__pycache__/image_plan_lint.cpython-314.pyc +0 -0
  122. package/skills/ui-design/scripts/__pycache__/image_plan_lint_test.cpython-314.pyc +0 -0
  123. package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite.cpython-314.pyc +0 -0
  124. package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite_test.cpython-314.pyc +0 -0
  125. package/skills/ui-design/scripts/__pycache__/layout_balance.cpython-314.pyc +0 -0
  126. package/skills/ui-design/scripts/__pycache__/layout_balance_test.cpython-314.pyc +0 -0
  127. package/skills/ui-design/scripts/__pycache__/normalize_design_json.cpython-314.pyc +0 -0
  128. package/skills/ui-design/scripts/__pycache__/normalize_design_json_test.cpython-314.pyc +0 -0
  129. package/skills/ui-design/scripts/__pycache__/plan_source_layout.cpython-314.pyc +0 -0
  130. package/skills/ui-design/scripts/__pycache__/plan_source_layout_test.cpython-314.pyc +0 -0
  131. package/skills/ui-design/scripts/__pycache__/resolve_source_hint.cpython-314.pyc +0 -0
  132. package/skills/ui-design/scripts/__pycache__/resolve_source_hint_test.cpython-314.pyc +0 -0
  133. package/skills/ui-design/scripts/__pycache__/resolve_source_input.cpython-314.pyc +0 -0
  134. package/skills/ui-design/scripts/__pycache__/resolve_source_input_test.cpython-314.pyc +0 -0
  135. package/skills/ui-design/scripts/__pycache__/scaffold_ui_artifact.cpython-314.pyc +0 -0
  136. package/skills/ui-design/scripts/__pycache__/source_usage_check.cpython-314.pyc +0 -0
  137. package/skills/ui-design/scripts/__pycache__/source_usage_check_test.cpython-314.pyc +0 -0
  138. package/skills/ui-design/scripts/__pycache__/text_readability_pixel.cpython-314.pyc +0 -0
  139. package/skills/ui-design/scripts/__pycache__/visual_quality_gate.cpython-314.pyc +0 -0
  140. package/skills/ui-design/scripts/__pycache__/visual_quality_gate_test.cpython-314.pyc +0 -0
  141. package/skills/ui-design/scripts/assemble_material.py +217 -0
  142. package/skills/ui-design/scripts/assemble_material_test.py +149 -0
  143. package/skills/ui-design/scripts/browser_check_ui_artifact.mjs +221 -0
  144. package/skills/ui-design/scripts/chart_sanity_check.py +261 -0
  145. package/skills/ui-design/scripts/chart_sanity_check_test.py +165 -0
  146. package/skills/ui-design/scripts/check_language_policy.py +351 -0
  147. package/skills/ui-design/scripts/check_ui_artifact.py +435 -0
  148. package/skills/ui-design/scripts/check_ui_artifact_pptx_test.py +251 -0
  149. package/skills/ui-design/scripts/deck_pages_check.py +158 -0
  150. package/skills/ui-design/scripts/deck_pages_check_test.py +134 -0
  151. package/skills/ui-design/scripts/deck_visual_style_check.py +767 -0
  152. package/skills/ui-design/scripts/deck_visual_style_check_test.py +713 -0
  153. package/skills/ui-design/scripts/design_budget_check.py +271 -0
  154. package/skills/ui-design/scripts/design_budget_check_test.py +183 -0
  155. package/skills/ui-design/scripts/design_repair_hints.py +162 -0
  156. package/skills/ui-design/scripts/design_repair_hints_test.py +54 -0
  157. package/skills/ui-design/scripts/design_style_check.py +397 -0
  158. package/skills/ui-design/scripts/design_style_check_test.py +233 -0
  159. package/skills/ui-design/scripts/draft_coverage_check.py +184 -0
  160. package/skills/ui-design/scripts/draft_coverage_check_test.py +131 -0
  161. package/skills/ui-design/scripts/export_pptx_from_html.mjs +2367 -0
  162. package/skills/ui-design/scripts/extract_source_assets.py +607 -0
  163. package/skills/ui-design/scripts/extract_source_assets_test.py +256 -0
  164. package/skills/ui-design/scripts/generated_image_review_collect.py +206 -0
  165. package/skills/ui-design/scripts/generated_image_review_collect_test.py +91 -0
  166. package/skills/ui-design/scripts/image_plan_lint.py +571 -0
  167. package/skills/ui-design/scripts/image_plan_lint_test.py +515 -0
  168. package/skills/ui-design/scripts/image_prompt_rewrite.py +713 -0
  169. package/skills/ui-design/scripts/image_prompt_rewrite_test.py +966 -0
  170. package/skills/ui-design/scripts/layout_balance.py +881 -0
  171. package/skills/ui-design/scripts/layout_balance_test.py +927 -0
  172. package/skills/ui-design/scripts/normalize_design_json.py +272 -0
  173. package/skills/ui-design/scripts/normalize_design_json_test.py +119 -0
  174. package/skills/ui-design/scripts/plan_source_layout.py +1450 -0
  175. package/skills/ui-design/scripts/plan_source_layout_test.py +1136 -0
  176. package/skills/ui-design/scripts/resolve_source_input.py +270 -0
  177. package/skills/ui-design/scripts/resolve_source_input_test.py +98 -0
  178. package/skills/ui-design/scripts/scaffold_ui_artifact.py +377 -0
  179. package/skills/ui-design/scripts/source_usage_check.py +581 -0
  180. package/skills/ui-design/scripts/source_usage_check_test.py +427 -0
  181. package/skills/ui-design/scripts/text_readability_pixel.py +340 -0
  182. package/skills/ui-design/scripts/text_readability_pixel_test.py +219 -0
  183. package/skills/ui-design/scripts/visual_quality_gate.py +301 -0
  184. package/skills/ui-design/scripts/visual_quality_gate_test.py +233 -0
  185. package/skills/ui-design/tests/e2e/prompts/deck.md +19 -0
  186. package/skills/ui-design/tests/e2e/prompts/webpage.md +17 -0
  187. package/skills/ui-design/tests/e2e/render_check.mjs +101 -0
  188. package/skills/ui-design/tests/e2e/rubric.json +54 -0
  189. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/browser-check.json +49 -0
  190. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/language-check.txt +12 -0
  191. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/static-check.txt +15 -0
  192. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/outputs/index.html +837 -0
  193. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/prompt.md +12 -0
  194. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/review.md +21 -0
  195. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/screenshots/desktop.png +0 -0
  196. package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/screenshots/mobile.png +0 -0
  197. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/outputs/homepage.html +373 -0
  198. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/outputs/platform.html +378 -0
  199. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/prompt.md +13 -0
  200. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/review.md +26 -0
  201. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/browser-check.json +49 -0
  202. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/desktop.png +0 -0
  203. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/mobile.png +0 -0
  204. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/browser-check.json +49 -0
  205. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/desktop.png +0 -0
  206. package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/mobile.png +0 -0
  207. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/checks/static-check.txt +2 -0
  208. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/outputs/index.html +656 -0
  209. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/prompt.md +12 -0
  210. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/render_check.mjs +67 -0
  211. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/checks/static-check.txt +2 -0
  212. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/outputs/index.html +587 -0
  213. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/prompt.md +12 -0
  214. package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/review.md +36 -0
  215. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/browser-check.json +49 -0
  216. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/language-check.txt +8 -0
  217. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/static-check.txt +16 -0
  218. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/outputs/index.html +739 -0
  219. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/prompt.md +11 -0
  220. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/review.md +22 -0
  221. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/screenshots/desktop.png +0 -0
  222. package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/screenshots/mobile.png +0 -0
  223. package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/checks/browser-check.json +52 -0
  224. package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/outputs/index.html +641 -0
  225. package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/screenshots/desktop.png +0 -0
  226. package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/screenshots/mobile.png +0 -0
  227. package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/outputs/index.html +467 -0
  228. package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/browser-check.json +49 -0
  229. package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/desktop.png +0 -0
  230. package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/mobile.png +0 -0
  231. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/outputs/homepage.html +373 -0
  232. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/outputs/platform.html +378 -0
  233. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/prompt.md +13 -0
  234. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/review.md +26 -0
  235. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/browser-check.json +49 -0
  236. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/desktop.png +0 -0
  237. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/mobile.png +0 -0
  238. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/browser-check.json +49 -0
  239. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/desktop.png +0 -0
  240. package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/mobile.png +0 -0
  241. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/browser-check.json +49 -0
  242. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/language-check.txt +4 -0
  243. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/static-check.txt +2 -0
  244. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/execution_notes.md +10 -0
  245. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/outputs/index.html +587 -0
  246. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/prompt.md +14 -0
  247. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/review.md +13 -0
  248. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/screenshots/desktop.png +0 -0
  249. package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/screenshots/mobile.png +0 -0
  250. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/checks/browser-check.json +24 -0
  251. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/checks/static-check.txt +2 -0
  252. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/execution_notes.md +21 -0
  253. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/outputs/deck.html +451 -0
  254. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/screenshots/slide-01.png +0 -0
  255. package/skills/ui-design/tests/e2e/runs/iteration-1/deck/screenshots/slide-02.png +0 -0
  256. package/skills/ui-design/tests/e2e/runs/iteration-1/review.md +79 -0
  257. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/checks/browser-check.json +26 -0
  258. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/checks/static-check.txt +2 -0
  259. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/execution_notes.md +20 -0
  260. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/outputs/index.html +534 -0
  261. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/screenshots/desktop.png +0 -0
  262. package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/screenshots/mobile.png +0 -0
  263. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/browser-check.json +64 -0
  264. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/language-check.txt +7 -0
  265. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/quick-validate.txt +1 -0
  266. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/static-console.txt +2 -0
  267. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/static-homepage.txt +2 -0
  268. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/outputs/console.html +600 -0
  269. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/outputs/homepage.html +556 -0
  270. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/prompt.md +29 -0
  271. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/review.md +57 -0
  272. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/console-desktop.png +0 -0
  273. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/console-mobile.png +0 -0
  274. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/homepage-desktop.png +0 -0
  275. package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/homepage-mobile.png +0 -0
  276. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/browser-check.json +33 -0
  277. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/language-check.txt +6 -0
  278. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/quick-validate.txt +1 -0
  279. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/static-check.txt +2 -0
  280. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/outputs/index.html +682 -0
  281. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/prompt.md +13 -0
  282. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/review.md +59 -0
  283. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/screenshots/desktop.png +0 -0
  284. package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/screenshots/mobile.png +0 -0
  285. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/outputs/page-01.html +466 -0
  286. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/outputs/page-02.html +433 -0
  287. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/prompt.md +13 -0
  288. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/browser-check.json +49 -0
  289. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/desktop.png +0 -0
  290. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/mobile.png +0 -0
  291. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/browser-check.json +49 -0
  292. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/desktop.png +0 -0
  293. package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/mobile.png +0 -0
  294. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/browser-check.json +49 -0
  295. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/language-check.txt +3 -0
  296. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/static-check.txt +2 -0
  297. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/execution_notes.md +24 -0
  298. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/outputs/index.html +723 -0
  299. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/prompt.md +15 -0
  300. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/review.md +26 -0
  301. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/screenshots/desktop.png +0 -0
  302. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/screenshots/mobile.png +0 -0
  303. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/browser-dark.json +49 -0
  304. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/browser-light.json +49 -0
  305. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/language-check.txt +11 -0
  306. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/static-dark.txt +2 -0
  307. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/static-light.txt +3 -0
  308. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/execution_notes.md +23 -0
  309. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/outputs/dark.html +392 -0
  310. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/outputs/light.html +476 -0
  311. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/prompt.md +23 -0
  312. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/review.md +41 -0
  313. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/dark/desktop.png +0 -0
  314. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/dark/mobile.png +0 -0
  315. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/light/desktop.png +0 -0
  316. package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/light/mobile.png +0 -0
  317. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/browser-check.json +54 -0
  318. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/language-check.txt +5 -0
  319. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/quick-validate.txt +1 -0
  320. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/static-check.txt +2 -0
  321. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/outputs/index.html +765 -0
  322. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/prompt.md +15 -0
  323. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/review.md +59 -0
  324. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/screenshots/desktop.png +0 -0
  325. package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/screenshots/mobile.png +0 -0
  326. package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/outputs/index.html +508 -0
  327. package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/browser-check.json +49 -0
  328. package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/desktop.png +0 -0
  329. package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/mobile.png +0 -0
  330. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/browser-check.json +54 -0
  331. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/language-check.txt +6 -0
  332. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/quick-validate.txt +1 -0
  333. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/static-check.txt +2 -0
  334. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/outputs/index.html +788 -0
  335. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/prompt.md +14 -0
  336. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/review.md +60 -0
  337. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/screenshots/desktop.png +0 -0
  338. package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/screenshots/mobile.png +0 -0
  339. package/skills/video-compose/SKILL.md +8 -1
  340. package/skills/web-crawler/SKILL.md +70 -0
  341. package/skills/web-crawler/scripts/crawl.mjs +538 -0
  342. package/skills/web-crawler/scripts/crawl.test.mjs +204 -0
  343. package/skills/xlsx/SKILL.md +12 -0
  344. package/skills/xlsx/scripts/opc_check.py +253 -0
  345. package/src/advisorState.js +22 -0
  346. package/src/askBridge.js +97 -3
  347. package/src/bootstrap/workingDir.js +12 -1
  348. package/src/cli/args.js +17 -1
  349. package/src/cli/configMenu.js +236 -0
  350. package/src/cli/configWizard.js +7 -5
  351. package/src/cli/print.js +37 -4
  352. package/src/cli/streamJson.js +77 -24
  353. package/src/cli/wizards/advisorWizard.js +147 -0
  354. package/src/cli/wizards/fieldForm.js +149 -0
  355. package/src/cli/wizards/imageWizard.js +60 -0
  356. package/src/cli/wizards/openRouterWizard.js +23 -0
  357. package/src/cli/wizards/providerPresets.js +95 -0
  358. package/src/cli/wizards/providerWizard.js +219 -0
  359. package/src/cli/wizards/searchWizard.js +23 -0
  360. package/src/cli/wizards/ttsWizard.js +34 -0
  361. package/src/config/configFile.js +441 -83
  362. package/src/config/configService.js +446 -0
  363. package/src/config.js +24 -64
  364. package/src/context/agentHome.js +9 -0
  365. package/src/context/archive.js +7 -2
  366. package/src/context/compact.js +8 -5
  367. package/src/context/contextLock.js +81 -0
  368. package/src/context/persistContext.js +30 -11
  369. package/src/context/reactiveCompact.js +4 -2
  370. package/src/context/recentDirs.js +21 -61
  371. package/src/context/sessionPath.js +97 -23
  372. package/src/context/sessionRegistry.js +303 -24
  373. package/src/context/tokenCounter.js +18 -0
  374. package/src/context/workspaceIndex.js +731 -0
  375. package/src/infra/verification.js +28 -15
  376. package/src/llm/client.js +394 -159
  377. package/src/llm/providers/anthropicFormat.js +241 -0
  378. package/src/llm/providers/openaiFormat.js +190 -0
  379. package/src/loop.js +219 -32
  380. package/src/main.js +61 -11
  381. package/src/messageQueue.js +97 -0
  382. package/src/multimodal.js +203 -0
  383. package/src/plugin-sdk.js +15 -0
  384. package/src/plugins/commandRouter.js +3 -0
  385. package/src/plugins/hookEngine.js +5 -1
  386. package/src/plugins/pluginLifecycle.js +28 -0
  387. package/src/plugins/pluginLoader.js +2 -1
  388. package/src/plugins/pluginRunner.js +49 -21
  389. package/src/plugins/transcript.js +4 -3
  390. package/src/prompts/pluginList.js +5 -5
  391. package/src/prompts/projectInstructions.js +3 -3
  392. package/src/prompts/promptAssembly.js +133 -144
  393. package/src/prompts/skillList.js +12 -22
  394. package/src/prompts/system.js +0 -1
  395. package/src/session/runAgentTurn.js +70 -0
  396. package/src/session/runTurn.js +41 -6
  397. package/src/toolGate.js +17 -0
  398. package/src/tools/advisor/advisor.js +379 -0
  399. package/src/tools/agent/agent.js +555 -0
  400. package/src/tools/agent/agentTypes.js +59 -0
  401. package/src/tools/agent/coordinator.js +93 -0
  402. package/src/tools/agent/worktree.js +270 -0
  403. package/src/tools/ask/ask.js +7 -2
  404. package/src/tools/bash/bash.js +112 -18
  405. package/src/tools/download/download.js +144 -0
  406. package/src/tools/edit/edit.js +1 -0
  407. package/src/tools/edit/multi-edit.js +1 -0
  408. package/src/tools/genimage/genimage.js +242 -0
  409. package/src/tools/genspeech/genspeech.js +67 -0
  410. package/src/tools/glob/glob.js +1 -0
  411. package/src/tools/grep/grep.js +3 -0
  412. package/src/tools/grep/rgPath.js +2 -0
  413. package/src/tools/index.js +25 -2
  414. package/src/tools/read/read.js +1 -0
  415. package/src/tools/shared/killTree.js +52 -0
  416. package/src/tools/toolProgressBridge.js +48 -0
  417. package/src/tools/webbrowser/agentBrowserPath.js +258 -0
  418. package/src/tools/webbrowser/browser.js +59 -42
  419. package/src/tools/webbrowser/browserControl.js +118 -0
  420. package/src/tools/webbrowser/browserDaemon.js +97 -0
  421. package/src/tools/webbrowser/browserService.js +27 -0
  422. package/src/tools/webbrowser/browserStream.js +119 -0
  423. package/src/tools/webbrowser/webbrowser.js +699 -130
  424. package/src/tools/webfetch/webfetch.js +1 -0
  425. package/src/tools/websearch/websearch.js +134 -51
  426. package/src/tools/write/write.js +1 -0
  427. package/src/ui/App.js +249 -22
  428. package/src/ui/AskQuestion.js +29 -10
  429. package/src/ui/InputBox.js +104 -12
  430. package/src/ui/LiveArea.js +112 -19
  431. package/src/ui/MessageList.js +100 -14
  432. package/src/ui/ModelPicker.js +56 -0
  433. package/src/ui/QueuedMessagesBanner.js +14 -0
  434. package/src/ui/Root.js +18 -10
  435. package/src/ui/SessionPicker.js +102 -0
  436. package/src/ui/StatusLine.js +13 -4
  437. package/src/ui/WorkspacePicker.js +55 -0
  438. package/src/ui/figures.js +44 -0
  439. package/src/ui/hooks/askSlot.js +82 -0
  440. package/src/ui/hooks/useChat.js +358 -64
  441. package/src/ui/hooks/usePasteHandler.js +11 -1
  442. package/src/ui/hooks/useTextBuffer.js +1 -3
  443. package/src/ui/liveViewport.js +5 -1
  444. package/src/ui/markdown.js +206 -0
  445. package/src/ui/textBuffer.js +0 -7
  446. package/src/ui/theme.js +32 -0
  447. package/src/utils/debugLog.js +0 -4
  448. package/src/utils/resourcePaths.js +2 -2
  449. package/src/utils/stripThink.js +50 -0
  450. package/src/web/browserBridge.js +447 -0
  451. package/src/web/protocol.js +19 -0
  452. package/workflows/adaptive-research.yaml +13 -5
  453. package/workflows/book-review-short.yaml +36 -10
  454. package/workflows/e2e-write-greet.yaml +6 -2
  455. package/workflows/illustrate.yaml +227 -0
  456. package/workflows/plan.yaml +460 -179
  457. package/workflows/ppt.yaml +1659 -0
  458. package/workflows/ralph-loop.yaml +199 -0
  459. package/workflows/schema.json +81 -23
  460. package/workflows/webppt.yaml +496 -0
  461. package/workflows/word.yaml +710 -0
  462. package/workflows/youtube-shorts.yaml +46 -15
  463. package/MINIMAL-TRACE.md +0 -77
  464. package/plugins/HOW-TO-WRITE-A-PLUGIN.md +0 -186
  465. package/plugins/ralph-wiggum/.claude-plugin/plugin.json +0 -9
  466. package/plugins/ralph-wiggum/README.md +0 -197
  467. package/plugins/ralph-wiggum/commands/cancel-ralph.md +0 -18
  468. package/plugins/ralph-wiggum/commands/help.md +0 -137
  469. package/plugins/ralph-wiggum/commands/ralph-loop.md +0 -85
  470. package/plugins/ralph-wiggum/hooks/hooks.json +0 -15
  471. package/plugins/ralph-wiggum/hooks/stop-hook.sh +0 -191
  472. package/plugins/ralph-wiggum/plugin.js +0 -280
  473. package/plugins/ralph-wiggum/src/goalState.js +0 -258
  474. package/plugins/ralph-wiggum/src/sentinels.js +0 -76
  475. package/plugins/ralph-wiggum/src/stopHookRunner.js +0 -104
  476. package/plugins/ralph-wiggum/src/verificationGate.js +0 -202
  477. package/plugins/workflow-runner/src/miniReAct.js +0 -223
  478. package/plugins/workflow-runner/src/voteHelpers.js +0 -110
  479. package/skills/config/SKILL.md +0 -123
  480. package/skills/frontend-design/LICENSE.txt +0 -177
  481. package/skills/frontend-design/SKILL.md +0 -42
  482. package/src/ui/ProgressPanel.js +0 -54
  483. package/src/ui/StreamingBlock.js +0 -11
  484. package/src/ui/ToolStatus.js +0 -11
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # minimal-agent
2
2
 
3
3
  > 一个**最小化但功能完整**的 AI 编程助手 —— Bun + React + TypeScript + Ink TUI 构建,
4
- > OpenAI 兼容、多 provider,11 个内置工具 + Skills + 插件 + Workflow DSL + 自动上下文压缩。
4
+ > OpenAI 兼容、多 provider,16 个内置工具 + Skills + 插件 + Workflow DSL + 自动上下文压缩。
5
5
  > 为**学习与教学**而生:代码量克制、注释充分,把一个 agent「从输入到工具循环到落盘」讲透。
6
6
 
7
7
  `v0.5.1` · Runtime: **Bun**(主)/ Node ≥ 20 · License: **PolyForm Noncommercial 1.0.0**
@@ -22,10 +22,10 @@
22
22
 
23
23
  ## 特性
24
24
 
25
- - **11 个内置工具**:Read / Write / Edit / MultiEdit / Glob / Grep / WebSearch / WebFetch / WebBrowser / Bash / AskUserQuestion(向用户提结构化选择题,动态工作流交互底座)
25
+ - **16 个内置工具**:Read / Write / Edit / MultiEdit / Glob / Grep / WebSearch / WebFetch / WebBrowser / Download / GenerateImage / GenerateSpeech / Bash / AskUserQuestion(向用户提结构化选择题,动态工作流交互底座)/ Advisor(独立配置的第二个 LLM,关键节点取第二意见)/ Agent(并行子任务分身:explore 只读调研 / general 读写执行,可 git worktree 隔离)
26
26
  - **OpenAI 兼容**:Message 形状对齐 Chat Completions,一套代码接 MiniMax / 火山 ARK / DeepSeek / OpenAI / Moonshot…
27
27
  - **Skills 系统**:放一个 `SKILL.md` 就能扩展能力,运行时实时扫描注入 prompt,改文件即生效
28
- - **插件系统**:`plugins/<id>/` drop-in,自带 `/ralph-loop`(复制任务循环)与 `/workflow`(YAML DAG 执行器)
28
+ - **插件系统**:`plugins/<id>/` drop-in,自带 `/workflow`(YAML 工作流引擎,支持 while 循环 + 验证门 + fresh_context)
29
29
  - **自动上下文压缩**:接近上限时把旧对话压成摘要,保留系统提示 + 摘要 + 最近几条
30
30
  - **多 session + 归档**:同一工作目录多个并行会话,`/new` 归档、`/restore` 恢复
31
31
  - **可编程子进程**:`-p --output-format json` 输出一行结构化结局契约,方便被宿主程序 spawn 调度
@@ -51,15 +51,15 @@ bun run start # 启动 TUI
51
51
 
52
52
  ```bash
53
53
  npm install -g minimal-agent
54
- minimal-agent # 首次运行进入配置向导
54
+ minimal-agent # 首次运行进入配置菜单(逐项配置,完成退出后进入对话)
55
55
  ```
56
56
 
57
57
  ## 配置
58
58
 
59
- 两种方式任选其一(**环境变量优先级高于配置文件**):
59
+ 两种方式任选其一(**配置文件优先于环境变量**——env 只在没有任何 `config.json` 时作兜底;`MINIMAL_AGENT_CONFIG_MODE=env` 可强制只用环境变量):
60
60
 
61
61
  1. **`.env` 文件**(源码模式,Bun 自动加载)—— 复制 `.env.example` 改值。
62
- 2. **配置向导** —— 首次运行 `minimal-agent`(TUI)会引导你填,写到 `~/.minimal-agent/config.json`。
62
+ 2. **配置菜单** —— 首次运行 `minimal-agent`(TUI)会弹出菜单(基座模型/搜索引擎/生图模型/顾问模型/语音合成/OpenRouter 逐项配置),写到 `~/.minimal-agent/config.json`;会话中可用 `/config` 随时再次打开。
63
63
 
64
64
  必需三项 + 可选项:
65
65
 
@@ -98,7 +98,7 @@ bun run start # 或全局安装后直接 minimal-agent
98
98
  | `/show <id>` | 展开某次工具调用的完整输出(列表默认折叠到 3 行) |
99
99
  | `/exit`(`/quit`) | 退出 |
100
100
 
101
- `/init`、`/config` 等是 **LLM 驱动的 skill**;`/workflow`、`/ralph-loop` 是**插件命令**(见下)。
101
+ `/init`、`/config` 等是 **LLM 驱动的 skill**;`/workflow`、`/workflows` 是**插件激活入口**(见下)。
102
102
 
103
103
  ### 非交互模式(`-p`)—— 脚本 / CI / 被宿主程序调用
104
104
 
@@ -152,9 +152,8 @@ minimal-agent -p --output-format json "做点事" # 一行结构化结
152
152
  - **Skills**:每个 `skills/<name>/SKILL.md`(带 frontmatter)。运行时实时扫描注入 prompt,prompt 体按需懒加载。
153
153
  cwd 优先、包内 fallback,用户可在自己项目里覆盖或新增。内置 20+ 个(`/init`、`/config`、文档生成、设计等)。
154
154
  - **插件**(`plugins/<id>/`,drop-in,`src/` 一行不改):
155
- - **`/ralph-loop`**(ralph-wiggum)—— Karpathy 式复制任务循环,自带 PLAN/BUILD/VERIFY/HEAL 状态机 + 验证门
156
- - **`/workflow` · `/workflows`**(workflow-runner)—— YAML DAG 执行器,9 种 step(tool/llm/skill/assert/branch/loop/pause/parallel/vote)
157
- - **可视化编辑器**:`editor/` 子项目(Bun + Vite + React Flow)拖拽编排 workflow YAML(不属于 npm 发布物)。
155
+ - **`/workflow` · `/workflows`**(workflow-runner)—— YAML 工作流引擎,13 种 step(tool/llm/skill/agent + assert/verify/set/branch/loop/break/continue/echo/pause),支持 while 循环 + fresh_context + 验证门。内置 `ralph-loop` 等工作流定义
156
+ - **可视化编辑器**:`../minimal-workflow/` 子项目(与本仓库平级,Bun + Vite + React Flow)拖拽编排 workflow YAML(不属于 npm 发布物)。
158
157
 
159
158
  ---
160
159
 
@@ -215,14 +214,17 @@ dev 下 Bun 透明回退到 `.ts` 兄弟,发布前 `tsc --build` 原地产出
215
214
  minimal-agent/
216
215
  ├─ src/ # 主程序(loop / tools / llm / ui / plugins / config …)
217
216
  ├─ skills/ # 内置 skill(每个一个 SKILL.md)
218
- ├─ plugins/ # 内置插件(ralph-wiggum / workflow-runner)
217
+ ├─ plugins/ # 内置插件(workflow-runner)
219
218
  ├─ workflows/ # 内置 workflow(YAML)
220
219
  ├─ vendor/ripgrep/ # Grep 自带的 6 平台 ripgrep 二进制
221
220
  ├─ scripts/ # 构建脚本(含绿色版 build-green.ts)
222
- ├─ editor/ # workflow 可视化编辑器(独立子项目)
223
221
  ├─ test/ # 测试
224
222
  ├─ GREEN-BUILD.md # 绿色版/U 盘分发指南
225
223
  └─ CLAUDE.md # 架构与开发指南
224
+
225
+ ../minimal-desktop/ # React/Tauri 桌面产品与本机 Agent Runtime
226
+ ../minimal-server/ # 中央账号、好友、群聊、附件与 Agent Node 路由
227
+ ../minimal-workflow/ # workflow 可视化编辑器
226
228
  ```
227
229
 
228
230
  ## License
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minimal-agent",
3
- "version": "0.8.2",
3
+ "version": "0.10.0",
4
4
  "description": "最小化 Agent 系统 —— 10 工具 + 插件系统 + workflow DSL + 自动压缩 + OpenAI 兼容 + Ink TUI;NodeNext + tsc 原地编译,dev 用 Bun .ts、install 用 Node .js(学习/教学用)",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Bill Wang <leiwang0359@gmail.com>",
@@ -29,6 +29,31 @@
29
29
  "bin": {
30
30
  "minimal-agent": "src/main.js"
31
31
  },
32
+ "exports": {
33
+ "./protocol": {
34
+ "types": "./src/web/protocol.ts",
35
+ "bun": "./src/web/protocol.ts",
36
+ "default": "./src/web/protocol.js"
37
+ },
38
+ "./config-service": {
39
+ "types": "./src/config/configService.ts",
40
+ "bun": "./src/config/configService.ts",
41
+ "default": "./src/config/configService.js"
42
+ },
43
+ "./provider-presets": {
44
+ "types": "./src/cli/wizards/providerPresets.ts",
45
+ "bun": "./src/cli/wizards/providerPresets.ts",
46
+ "default": "./src/cli/wizards/providerPresets.js"
47
+ },
48
+ "./tools/agent/worktree": {
49
+ "types": "./src/tools/agent/worktree.ts",
50
+ "bun": "./src/tools/agent/worktree.ts",
51
+ "default": "./src/tools/agent/worktree.js"
52
+ },
53
+ "./src/*.js": "./src/*.ts",
54
+ "./plugins/*.js": "./plugins/*.ts",
55
+ "./package.json": "./package.json"
56
+ },
32
57
  "engines": {
33
58
  "node": ">=20"
34
59
  },
@@ -53,16 +78,19 @@
53
78
  "dev": "bun --watch src/main.tsx",
54
79
  "build": "tsc --build",
55
80
  "clean": "bun scripts/clean-build.ts",
81
+ "check:build-artifacts": "bun scripts/check-build-artifacts.ts",
56
82
  "test": "bun test",
57
83
  "typecheck": "tsc --noEmit -p tsconfig.typecheck.json",
58
84
  "verify-all": "bun scripts/verify-all.ts",
59
85
  "compile:green": "bun scripts/build-green.ts",
60
86
  "compile:green:host": "bun scripts/build-green.ts --host",
87
+ "doc:gen": "node doc/scripts/gen-pptx.mjs",
61
88
  "prepublishOnly": "bun run clean && bun run build"
62
89
  },
63
90
  "dependencies": {
64
91
  "fast-glob": "^3.3.2",
65
92
  "ink": "^5.0.1",
93
+ "marked": "^18.0.6",
66
94
  "react": "^18.3.1",
67
95
  "turndown": "^7.2.4",
68
96
  "yaml": "^2.9.0",
@@ -74,5 +102,10 @@
74
102
  "@types/react": "^18.3.0",
75
103
  "bun-types": "^1.3.13",
76
104
  "typescript": "^5.5.0"
105
+ },
106
+ "optionalDependencies": {
107
+ "playwright-core": "^1.40.0",
108
+ "pngjs": "^7.0.0",
109
+ "pptxgenjs": "^4.0.1"
77
110
  }
78
111
  }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "cron-runner",
3
+ "version": "0.1.0",
4
+ "description": "Schedule prompt and workflow runs while the minimal-agent TUI is alive"
5
+ }
@@ -0,0 +1,26 @@
1
+ ---
2
+ description: "Create and manage scheduled cron tasks"
3
+ argument-hint: "create|list|pause|resume|delete|run|show|missed ..."
4
+ ---
5
+
6
+ The cron-runner plugin handles this command in plugin.ts.
7
+
8
+ Supported forms:
9
+
10
+ - `/cron 120m Prompt`
11
+ - `/cron 1d Task description /workflow daily-news.yaml Extra workflow prompt`
12
+ - `/cron 1m Task description workflow inspect-homework.yaml camera.jpg`
13
+ - `/cron 每天 6:07 Prompt`
14
+ - `/cron 工作日 6:07 Prompt`
15
+ - `/cron 每周一 6:07 Prompt`
16
+ - `/cron create --name "Name" --cron "7 6 * * 1" --prompt "Prompt"`
17
+ - `/cron create --name "Once" --cron "5 13 * * *" --prompt "Prompt" --once`
18
+ - `/cron create --name "Workflow" --cron "7 6 * * 1" --workflow "plan \"Weekly report\"" --permanent`
19
+ - `/cron create --name "Fresh workflow" --cron "7 6 * * *" --workflow "daily-news.yaml" --fresh-session`
20
+ - `/cron list`
21
+ - `/cron show <id>`
22
+ - `/cron pause <id>`
23
+ - `/cron resume <id>`
24
+ - `/cron run <id>`
25
+ - `/cron missed`
26
+ - `/cron delete <id>`
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: "List scheduled cron tasks"
3
+ argument-hint: ""
4
+ ---
5
+
6
+ The cron-runner plugin handles this command in plugin.ts and lists active,
7
+ paused, recurring, once, and recently missed cron tasks.
@@ -0,0 +1,34 @@
1
+ import { handleCronCommand } from './src/commands.js';
2
+ import { Scheduler } from './src/scheduler.js';
3
+ import { migrateCronTasks } from './src/store.js';
4
+ let scheduler = null;
5
+ let schedulerStop = null;
6
+ export function getCronScheduler() {
7
+ return scheduler;
8
+ }
9
+ const api = {
10
+ async activate(ctx) {
11
+ await migrateCronTasks();
12
+ await scheduler?.stop();
13
+ await schedulerStop;
14
+ const instance = new Scheduler(ctx);
15
+ scheduler = instance;
16
+ instance.start();
17
+ return () => {
18
+ if (scheduler === instance)
19
+ scheduler = null;
20
+ let tracked;
21
+ tracked = instance.stop().finally(() => {
22
+ if (schedulerStop === tracked)
23
+ schedulerStop = null;
24
+ });
25
+ schedulerStop = tracked;
26
+ };
27
+ },
28
+ async *runCommand(commandName, args) {
29
+ const text = await handleCronCommand(commandName, args, scheduler);
30
+ yield { type: 'text', delta: text };
31
+ yield { type: 'turn_done' };
32
+ },
33
+ };
34
+ export default api;
@@ -0,0 +1,348 @@
1
+ import { getWorkingDir } from '../../../src/plugin-sdk.js';
2
+ import { formatDateTime } from './cronTime.js';
3
+ import { createTask, deleteTask, getTask, listMissed, listTasks, recentRuns, updateTask, upsertTask, } from './store.js';
4
+ import { validateCron, validateIsoDate } from './schema.js';
5
+ export async function handleCronCommand(commandName, args, scheduler) {
6
+ if (commandName === 'crons')
7
+ return await formatTaskList(await listTasks());
8
+ const argv = tokenize(args);
9
+ const action = argv.shift() ?? 'list';
10
+ if (action === 'list')
11
+ return await formatTaskList(await listTasks());
12
+ if (action === 'create')
13
+ return await createFromArgs(argv);
14
+ if (action === 'pause' || action === 'resume')
15
+ return await setStatus(argv[0], action === 'resume' ? 'active' : 'paused');
16
+ if (action === 'delete' || action === 'remove')
17
+ return await remove(argv[0]);
18
+ if (action === 'show')
19
+ return await show(argv[0]);
20
+ if (action === 'run')
21
+ return await runNow(argv[0], scheduler);
22
+ if (action === 'missed')
23
+ return await formatMissed();
24
+ if (action === 'help')
25
+ return helpText();
26
+ const shortcut = await createFromShortcut(action, argv);
27
+ if (shortcut)
28
+ return shortcut;
29
+ if (/^\d+\S*$/.test(action)) {
30
+ return `无效间隔:${action}。支持 1m、2h、1d、1w(最小 1 分钟)。`;
31
+ }
32
+ return `未知 /cron 子命令:${action}\n\n${helpText()}`;
33
+ }
34
+ async function createFromArgs(argv) {
35
+ const opts = parseOptions(argv);
36
+ const cron = opts.cron;
37
+ const name = opts.name;
38
+ const prompt = opts.prompt;
39
+ const workflow = opts.workflow;
40
+ if (!cron || !name || (!prompt && !workflow)) {
41
+ return helpText();
42
+ }
43
+ const cronValidation = validateCron(cron);
44
+ if (!cronValidation.ok) {
45
+ return `无效 cron 表达式:${cron}\n${cronValidation.error}`;
46
+ }
47
+ const maxTurns = opts.maxTurns ? Number.parseInt(opts.maxTurns, 10) : undefined;
48
+ if (opts.maxTurns && (!Number.isFinite(maxTurns) || maxTurns <= 0)) {
49
+ return `无效 maxTurns:${opts.maxTurns}`;
50
+ }
51
+ const maxRuns = opts.maxRuns ? Number.parseInt(opts.maxRuns, 10) : undefined;
52
+ if (opts.maxRuns && (!Number.isFinite(maxRuns) || maxRuns <= 0)) {
53
+ return `无效 max-runs:${opts.maxRuns}(须是正整数,跑满这么多次后自动暂停)`;
54
+ }
55
+ if (opts.expiresAt) {
56
+ const expiresAtValidation = validateIsoDate(opts.expiresAt, 'expires-at');
57
+ if (!expiresAtValidation.ok)
58
+ return expiresAtValidation.error;
59
+ }
60
+ const task = createTask({
61
+ name,
62
+ ...(opts.description ? { description: opts.description } : {}),
63
+ cron,
64
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'local',
65
+ cwd: getWorkingDir(),
66
+ ...(opts.model ? { model: opts.model } : {}),
67
+ ...(maxTurns ? { maxTurns } : {}),
68
+ kind: opts.once === 'true' ? 'once' : 'recurring',
69
+ ...(opts.permanent === 'true' ? { permanent: true } : {}),
70
+ ...(opts.expiresAt ? { expiresAt: opts.expiresAt } : {}),
71
+ ...(maxRuns ? { maxRuns } : {}),
72
+ sessionMode: opts.freshSession === 'true' ? 'fresh' : 'persistent',
73
+ action: workflow
74
+ ? { type: 'workflow', command: workflow }
75
+ : { type: 'prompt', prompt: prompt },
76
+ });
77
+ await upsertTask(task);
78
+ return `已创建 cron:${task.id}\n${await formatTask(task)}`;
79
+ }
80
+ async function createFromShortcut(head, rest) {
81
+ const parsed = parseShortcutSchedule(head, rest);
82
+ if (!parsed)
83
+ return null;
84
+ if ('error' in parsed)
85
+ return parsed.error;
86
+ const task = createTask({
87
+ name: parsed.name,
88
+ ...(parsed.description ? { description: parsed.description } : {}),
89
+ ...(parsed.cron ? { cron: parsed.cron } : {}),
90
+ ...(parsed.intervalMs ? { intervalMs: parsed.intervalMs, anchorAt: new Date().toISOString() } : {}),
91
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || 'local',
92
+ cwd: getWorkingDir(),
93
+ action: parsed.action,
94
+ });
95
+ await upsertTask(task);
96
+ return `已创建 cron:${task.id}\n${await formatTask(task)}`;
97
+ }
98
+ export function parseShortcutSchedule(head, rest) {
99
+ const intervalMs = parseIntervalShortcut(head);
100
+ let actionTokens = rest;
101
+ let cron;
102
+ if (!intervalMs) {
103
+ const time = rest[0];
104
+ if (!time)
105
+ return null;
106
+ const parsedTime = parseClockTime(time);
107
+ if (!parsedTime)
108
+ return null;
109
+ actionTokens = rest.slice(1);
110
+ const { hour, minute } = parsedTime;
111
+ const cronTime = `${minute} ${hour}`;
112
+ if (head === '每天' || head === '每日')
113
+ cron = `${cronTime} * * *`;
114
+ else if (head === '工作日')
115
+ cron = `${cronTime} * * 1-5`;
116
+ else {
117
+ const weekly = head.match(/^每周([一二三四五六日天])$/);
118
+ if (!weekly)
119
+ return null;
120
+ cron = `${cronTime} * * ${weekdayNumber(weekly[1])}`;
121
+ }
122
+ }
123
+ const parsedAction = parseShortcutAction(actionTokens);
124
+ if ('error' in parsedAction)
125
+ return parsedAction;
126
+ return {
127
+ ...(cron ? { cron } : {}),
128
+ ...(intervalMs ? { intervalMs } : {}),
129
+ ...parsedAction,
130
+ };
131
+ }
132
+ export function parseIntervalShortcut(text) {
133
+ const match = text.match(/^(\d+)(m|min|分钟|h|小时|d|天|w|周)$/i);
134
+ if (!match)
135
+ return null;
136
+ const value = Number.parseInt(match[1], 10);
137
+ if (!Number.isFinite(value) || value <= 0)
138
+ return null;
139
+ const unit = match[2].toLowerCase();
140
+ const multiplier = unit === 'w' || unit === '周'
141
+ ? 7 * 24 * 60 * 60_000
142
+ : unit === 'd' || unit === '天'
143
+ ? 24 * 60 * 60_000
144
+ : unit === 'h' || unit === '小时'
145
+ ? 60 * 60_000
146
+ : 60_000;
147
+ const intervalMs = value * multiplier;
148
+ return Number.isSafeInteger(intervalMs) && intervalMs >= 60_000 ? intervalMs : null;
149
+ }
150
+ function parseShortcutAction(tokens) {
151
+ if (tokens.length === 0) {
152
+ return { error: '请在时间后面写提示词或 workflow。\n例如:/cron 1d /workflow daily-news.yaml 生成中文新闻稿' };
153
+ }
154
+ const markerIndex = tokens.findIndex((token) => token === '/workflow' || token === 'workflow');
155
+ if (markerIndex < 0) {
156
+ const prompt = tokens.join(' ').trim();
157
+ return { action: { type: 'prompt', prompt }, name: deriveName(prompt) };
158
+ }
159
+ const workflowName = tokens[markerIndex + 1];
160
+ if (!workflowName)
161
+ return { error: 'workflow 标记后缺少 YAML 名称。' };
162
+ const description = tokens.slice(0, markerIndex).join(' ').trim();
163
+ const command = serializeTokens(tokens.slice(markerIndex + 1));
164
+ return {
165
+ action: { type: 'workflow', command },
166
+ ...(description ? { description } : {}),
167
+ name: description || deriveName(workflowName.replace(/\.ya?ml$/i, '')),
168
+ };
169
+ }
170
+ function serializeTokens(tokens) {
171
+ return tokens
172
+ .map((token) => (/\s|["'\\]/.test(token) ? JSON.stringify(token) : token))
173
+ .join(' ');
174
+ }
175
+ function parseClockTime(text) {
176
+ const match = text.match(/^(\d{1,2})[::](\d{1,2})$/);
177
+ if (!match)
178
+ return null;
179
+ const hour = Number.parseInt(match[1], 10);
180
+ const minute = Number.parseInt(match[2], 10);
181
+ if (hour < 0 || hour > 23 || minute < 0 || minute > 59)
182
+ return null;
183
+ return { hour, minute };
184
+ }
185
+ function weekdayNumber(day) {
186
+ return { 日: 0, 天: 0, 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6 }[day] ?? 1;
187
+ }
188
+ function deriveName(prompt) {
189
+ const compact = prompt.replace(/\s+/g, ' ').trim();
190
+ return compact.length > 18 ? `${compact.slice(0, 18)}...` : compact || 'cron task';
191
+ }
192
+ async function setStatus(id, status) {
193
+ if (!id)
194
+ return '请提供任务 id。';
195
+ const task = await getTask(id);
196
+ if (!task)
197
+ return `未找到任务:${id}`;
198
+ await updateTask(task.id, (latest) => ({ ...latest, status }));
199
+ return `已${status === 'active' ? '恢复' : '暂停'} ${task.id}`;
200
+ }
201
+ async function remove(id) {
202
+ if (!id)
203
+ return '请提供任务 id。';
204
+ return (await deleteTask(id)) ? `已删除 ${id}` : `未找到任务:${id}`;
205
+ }
206
+ async function show(id) {
207
+ if (!id)
208
+ return '请提供任务 id。';
209
+ const task = await getTask(id);
210
+ if (!task)
211
+ return `未找到任务:${id}`;
212
+ const runs = await recentRuns(task.id, 5);
213
+ const runLines = runs.length === 0
214
+ ? '最近运行:无'
215
+ : `最近运行:\n${runs.map((r) => `- ${formatDateTime(r.startedAt)} ${r.status}${r.error ? ` · ${r.error}` : ''}`).join('\n')}`;
216
+ return `${await formatTask(task)}\n${runLines}`;
217
+ }
218
+ async function runNow(id, scheduler) {
219
+ if (!id)
220
+ return '请提供任务 id。';
221
+ if (!scheduler)
222
+ return 'cron scheduler 尚未启动;请在 TUI 中运行。';
223
+ const task = await getTask(id);
224
+ if (!task)
225
+ return `未找到任务:${id}`;
226
+ void scheduler.runTaskNow(task.id);
227
+ return `已开始手动运行 ${task.id}`;
228
+ }
229
+ async function formatMissed() {
230
+ const missed = await listMissed(20);
231
+ if (missed.length === 0)
232
+ return '暂无错过任务。';
233
+ return [
234
+ '错过任务:',
235
+ ...missed.map((m) => `- ${m.taskId} · ${m.taskName} · ${m.reason === 'overlap' ? '运行重叠' : m.reason === 'binding_unavailable' ? '会话绑定失效' : '宿主离线'}跳过 ${m.missedCount} 次 · 计划 ${formatDateTime(m.scheduledFor)} · ${m.actionPreview}`),
236
+ ].join('\n');
237
+ }
238
+ async function formatTaskList(tasks) {
239
+ if (tasks.length === 0)
240
+ return '暂无 cron 任务。';
241
+ const missed = await listMissed(1);
242
+ const header = missed.length > 0 ? `提示:有错过任务,可用 /cron missed 查看。\n\n` : '';
243
+ const body = await Promise.all(tasks.map(formatTask));
244
+ return `${header}${body.join('\n\n')}`;
245
+ }
246
+ async function formatTask(task) {
247
+ const action = task.action.type === 'workflow'
248
+ ? `/workflow ${task.action.command}`
249
+ : task.action.prompt;
250
+ const runs = await recentRuns(task.id, 1);
251
+ const recent = runs[0]
252
+ ? `${runs[0].status}${runs[0].error ? ` · ${runs[0].error}` : ''}`
253
+ : '-';
254
+ return [
255
+ `${task.id} · ${task.name}`,
256
+ `状态:${task.status === 'active' ? '活跃' : '暂停'}`,
257
+ `类型:${task.kind === 'once' ? '一次性' : task.maxRuns ? `限 ${task.maxRuns} 次` : '重复'}`,
258
+ `下次运行:${formatDateTime(task.schedule.nextRunAt)}`,
259
+ `上次运行时间:${formatDateTime(task.stats.lastRunAt)}`,
260
+ `详情:${task.description ?? '-'}`,
261
+ `运行环境:${task.runtime.environment}`,
262
+ `项目:${task.runtime.cwd}`,
263
+ `重复次数:${task.stats.runCount}${task.maxRuns ? `/${task.maxRuns}(跑满自动暂停)` : ''}`,
264
+ `跳过次数:${task.stats.skippedCount}`,
265
+ `会话:${task.runtime.sessionMode === 'fresh' ? '每次全新' : '持续会话'}`,
266
+ `模型:${task.runtime.model ?? '-'}`,
267
+ `最近结果:${recent}`,
268
+ `计划:${task.schedule.human} (${task.schedule.type === 'cron' ? `${task.schedule.cron}, ${task.schedule.timezone}` : `锚点 ${formatDateTime(task.schedule.anchorAt)}`})`,
269
+ `动作:${action}`,
270
+ ].join('\n');
271
+ }
272
+ function helpText() {
273
+ return [
274
+ '用法:',
275
+ '/cron 120m 整理最近 AI 新闻',
276
+ '/cron 1d 整理每日国际新闻 /workflow daily-news.yaml 生成中文新闻稿',
277
+ '/cron 1m 检查学生作业 workflow inspect-homework.yaml 摄像头画面在 camera.jpg',
278
+ '/cron 每天 6:07 写国际 AI 晨间简报',
279
+ '/cron 工作日 6:07 写过去 48 小时国际 AI 大事',
280
+ '/cron 每周一 6:07 整理国际 AI 超级个体创业案例',
281
+ '/cron create --name "晨间简报" --cron "7 6 * * 2-6,0" --prompt "写国际 AI 简报"',
282
+ '/cron create --name "提醒" --cron "5 13 * * *" --prompt "执行提醒" --once',
283
+ '/cron create --name "周报" --cron "7 6 * * 1" --workflow "plan \\"整理周报\\"" --permanent',
284
+ '/cron create --name "定时PPT" --cron "0 */2 * * *" --workflow "ppt.yaml 做个X方案" --max-runs 5',
285
+ '/cron create --name "独立日报" --cron "7 6 * * *" --workflow "daily-news.yaml" --fresh-session',
286
+ '/cron list',
287
+ '/cron pause <id>',
288
+ '/cron resume <id>',
289
+ '/cron run <id>',
290
+ '/cron show <id>',
291
+ '/cron missed',
292
+ '/cron delete <id>',
293
+ ].join('\n');
294
+ }
295
+ function tokenize(input) {
296
+ const out = [];
297
+ let cur = '';
298
+ let quote = null;
299
+ for (let i = 0; i < input.length; i++) {
300
+ const ch = input[i];
301
+ if (quote) {
302
+ if (ch === '\\' && i + 1 < input.length) {
303
+ cur += input[++i];
304
+ }
305
+ else if (ch === quote) {
306
+ quote = null;
307
+ }
308
+ else {
309
+ cur += ch;
310
+ }
311
+ continue;
312
+ }
313
+ if (ch === '"' || ch === "'") {
314
+ quote = ch;
315
+ continue;
316
+ }
317
+ if (/\s/.test(ch)) {
318
+ if (cur) {
319
+ out.push(cur);
320
+ cur = '';
321
+ }
322
+ continue;
323
+ }
324
+ cur += ch;
325
+ }
326
+ if (cur)
327
+ out.push(cur);
328
+ return out;
329
+ }
330
+ function parseOptions(argv) {
331
+ const map = {};
332
+ for (let i = 0; i < argv.length; i++) {
333
+ const key = argv[i];
334
+ if (!key.startsWith('--'))
335
+ continue;
336
+ const value = argv[i + 1];
337
+ if (!value || value.startsWith('--')) {
338
+ map[toCamel(key.slice(2))] = 'true';
339
+ continue;
340
+ }
341
+ map[toCamel(key.slice(2))] = value;
342
+ i++;
343
+ }
344
+ return map;
345
+ }
346
+ function toCamel(s) {
347
+ return s.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
348
+ }