frago-cli 0.1.0__tar.gz

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 (300) hide show
  1. frago_cli-0.1.0/.claude/commands/frago.exec.md +425 -0
  2. frago_cli-0.1.0/.claude/commands/frago.recipe.md +631 -0
  3. frago_cli-0.1.0/.claude/commands/frago.run.md +577 -0
  4. frago_cli-0.1.0/.claude/commands/frago.test.md +133 -0
  5. frago_cli-0.1.0/.claude/commands/speckit.analyze.md +185 -0
  6. frago_cli-0.1.0/.claude/commands/speckit.checklist.md +295 -0
  7. frago_cli-0.1.0/.claude/commands/speckit.clarify.md +182 -0
  8. frago_cli-0.1.0/.claude/commands/speckit.constitution.md +83 -0
  9. frago_cli-0.1.0/.claude/commands/speckit.implement.md +136 -0
  10. frago_cli-0.1.0/.claude/commands/speckit.plan.md +90 -0
  11. frago_cli-0.1.0/.claude/commands/speckit.specify.md +260 -0
  12. frago_cli-0.1.0/.claude/commands/speckit.tasks.md +138 -0
  13. frago_cli-0.1.0/.claude/commands/speckit.taskstoissues.md +29 -0
  14. frago_cli-0.1.0/.claude/settings.local.json +18 -0
  15. frago_cli-0.1.0/.claude/skills/frago-browser-automation/SKILL.md +879 -0
  16. frago_cli-0.1.0/.claude/skills/ones-task-form-automation/EXAMPLES.md +516 -0
  17. frago_cli-0.1.0/.claude/skills/ones-task-form-automation/REFERENCE.md +420 -0
  18. frago_cli-0.1.0/.claude/skills/ones-task-form-automation/SKILL.md +162 -0
  19. frago_cli-0.1.0/.claude/skills/video-production/SKILL.md +665 -0
  20. frago_cli-0.1.0/.github/FUNDING.yml +13 -0
  21. frago_cli-0.1.0/.gitignore +57 -0
  22. frago_cli-0.1.0/.specify/memory/constitution.md +50 -0
  23. frago_cli-0.1.0/.specify/scripts/bash/check-prerequisites.sh +166 -0
  24. frago_cli-0.1.0/.specify/scripts/bash/common.sh +156 -0
  25. frago_cli-0.1.0/.specify/scripts/bash/create-new-feature.sh +305 -0
  26. frago_cli-0.1.0/.specify/scripts/bash/setup-plan.sh +61 -0
  27. frago_cli-0.1.0/.specify/scripts/bash/update-agent-context.sh +781 -0
  28. frago_cli-0.1.0/.specify/templates/agent-file-template.md +28 -0
  29. frago_cli-0.1.0/.specify/templates/checklist-template.md +40 -0
  30. frago_cli-0.1.0/.specify/templates/plan-template.md +104 -0
  31. frago_cli-0.1.0/.specify/templates/spec-template.md +115 -0
  32. frago_cli-0.1.0/.specify/templates/tasks-template.md +251 -0
  33. frago_cli-0.1.0/CLAUDE.md +187 -0
  34. frago_cli-0.1.0/CODE_OF_CONDUCT.md +45 -0
  35. frago_cli-0.1.0/CONTRIBUTING.md +81 -0
  36. frago_cli-0.1.0/LICENSE +21 -0
  37. frago_cli-0.1.0/PKG-INFO +371 -0
  38. frago_cli-0.1.0/README.md +318 -0
  39. frago_cli-0.1.0/README.zh-CN.md +318 -0
  40. frago_cli-0.1.0/STEALTH_MODE.md +179 -0
  41. frago_cli-0.1.0/docs/architecture.md +541 -0
  42. frago_cli-0.1.0/docs/architecture.zh-CN.md +469 -0
  43. frago_cli-0.1.0/docs/development.md +284 -0
  44. frago_cli-0.1.0/docs/development.zh-CN.md +265 -0
  45. frago_cli-0.1.0/docs/examples.md +596 -0
  46. frago_cli-0.1.0/docs/examples.zh-CN.md +512 -0
  47. frago_cli-0.1.0/docs/images/architecture.jpg +0 -0
  48. frago_cli-0.1.0/docs/installation.md +222 -0
  49. frago_cli-0.1.0/docs/installation.zh-CN.md +220 -0
  50. frago_cli-0.1.0/docs/recipes.md +1044 -0
  51. frago_cli-0.1.0/docs/recipes.zh-CN.md +1042 -0
  52. frago_cli-0.1.0/docs/roadmap.md +321 -0
  53. frago_cli-0.1.0/docs/roadmap.zh-CN.md +319 -0
  54. frago_cli-0.1.0/docs/use-cases.md +510 -0
  55. frago_cli-0.1.0/docs/use-cases.zh-CN.md +260 -0
  56. frago_cli-0.1.0/docs/user-guide.md +547 -0
  57. frago_cli-0.1.0/docs/user-guide.zh-CN.md +255 -0
  58. frago_cli-0.1.0/examples/atomic/chrome/test_inspect_tab.js +67 -0
  59. frago_cli-0.1.0/examples/atomic/chrome/test_inspect_tab.md +72 -0
  60. frago_cli-0.1.0/examples/atomic/chrome/upwork_extract_job_details_as_markdown.js +184 -0
  61. frago_cli-0.1.0/examples/atomic/chrome/upwork_extract_job_details_as_markdown.md +139 -0
  62. frago_cli-0.1.0/examples/atomic/chrome/x_extract_tweet_with_comments.js +155 -0
  63. frago_cli-0.1.0/examples/atomic/chrome/x_extract_tweet_with_comments.md +140 -0
  64. frago_cli-0.1.0/examples/atomic/chrome/youtube_extract_video_transcript.js +61 -0
  65. frago_cli-0.1.0/examples/atomic/chrome/youtube_extract_video_transcript.md +113 -0
  66. frago_cli-0.1.0/examples/atomic/system/akshare_fetch_stock_latest_price.md +107 -0
  67. frago_cli-0.1.0/examples/atomic/system/akshare_fetch_stock_latest_price.py +96 -0
  68. frago_cli-0.1.0/examples/atomic/system/akshare_fetch_stock_minute_data.md +147 -0
  69. frago_cli-0.1.0/examples/atomic/system/akshare_fetch_stock_minute_data.py +133 -0
  70. frago_cli-0.1.0/examples/atomic/system/akshare_monitor_stock_with_alert.md +194 -0
  71. frago_cli-0.1.0/examples/atomic/system/akshare_monitor_stock_with_alert.py +216 -0
  72. frago_cli-0.1.0/examples/atomic/system/arxiv_fetch_paper.md +106 -0
  73. frago_cli-0.1.0/examples/atomic/system/arxiv_fetch_paper.py +179 -0
  74. frago_cli-0.1.0/examples/atomic/system/arxiv_search_papers.md +135 -0
  75. frago_cli-0.1.0/examples/atomic/system/arxiv_search_papers.py +135 -0
  76. frago_cli-0.1.0/examples/atomic/system/clipboard_read.md +69 -0
  77. frago_cli-0.1.0/examples/atomic/system/clipboard_read.py +33 -0
  78. frago_cli-0.1.0/examples/atomic/system/file_copy.md +90 -0
  79. frago_cli-0.1.0/examples/atomic/system/file_copy.sh +41 -0
  80. frago_cli-0.1.0/examples/atomic/system/gemini_generate_image_with_references.md +182 -0
  81. frago_cli-0.1.0/examples/atomic/system/gemini_generate_image_with_references.py +275 -0
  82. frago_cli-0.1.0/examples/atomic/system/pubmed_fetch_paper.md +140 -0
  83. frago_cli-0.1.0/examples/atomic/system/pubmed_fetch_paper.py +431 -0
  84. frago_cli-0.1.0/examples/atomic/system/pubmed_search_papers.md +152 -0
  85. frago_cli-0.1.0/examples/atomic/system/pubmed_search_papers.py +152 -0
  86. frago_cli-0.1.0/examples/workflows/fetch_academic_paper.md +192 -0
  87. frago_cli-0.1.0/examples/workflows/fetch_academic_paper.py +305 -0
  88. frago_cli-0.1.0/examples/workflows/git_extract_commits_to_ones_tasks.md +594 -0
  89. frago_cli-0.1.0/examples/workflows/git_extract_commits_to_ones_tasks.py +496 -0
  90. frago_cli-0.1.0/examples/workflows/project_specific_task.md +194 -0
  91. frago_cli-0.1.0/examples/workflows/project_specific_task.py +71 -0
  92. frago_cli-0.1.0/examples/workflows/search_academic_papers.md +213 -0
  93. frago_cli-0.1.0/examples/workflows/search_academic_papers.py +235 -0
  94. frago_cli-0.1.0/examples/workflows/stock_batch_monitor_multiple.md +240 -0
  95. frago_cli-0.1.0/examples/workflows/stock_batch_monitor_multiple.py +193 -0
  96. frago_cli-0.1.0/examples/workflows/upwork_batch_extract.md +190 -0
  97. frago_cli-0.1.0/examples/workflows/upwork_batch_extract.py +147 -0
  98. frago_cli-0.1.0/pre-publish-checklist.md +64 -0
  99. frago_cli-0.1.0/pyproject.toml +166 -0
  100. frago_cli-0.1.0/scripts/share/check_python_env.sh +89 -0
  101. frago_cli-0.1.0/scripts/test/test_proxy_configuration.sh +266 -0
  102. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/checklists/requirements.md +38 -0
  103. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/contracts/script-interface.yaml +304 -0
  104. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/data-model.md +203 -0
  105. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/plan.md +205 -0
  106. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/quickstart.md +199 -0
  107. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/research.md +165 -0
  108. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/spec.md +136 -0
  109. frago_cli-0.1.0/specs/001-standardize-cdp-scripts/tasks.md +301 -0
  110. frago_cli-0.1.0/specs/002-cdp-integration-refactor/IMPLEMENTATION_SUMMARY_20251117.md +105 -0
  111. frago_cli-0.1.0/specs/002-cdp-integration-refactor/checklists/requirements.md +36 -0
  112. frago_cli-0.1.0/specs/002-cdp-integration-refactor/contracts/api-contract.md +367 -0
  113. frago_cli-0.1.0/specs/002-cdp-integration-refactor/data-model.md +240 -0
  114. frago_cli-0.1.0/specs/002-cdp-integration-refactor/plan.md +141 -0
  115. frago_cli-0.1.0/specs/002-cdp-integration-refactor/quickstart.md +277 -0
  116. frago_cli-0.1.0/specs/002-cdp-integration-refactor/research.md +127 -0
  117. frago_cli-0.1.0/specs/002-cdp-integration-refactor/spec.md +139 -0
  118. frago_cli-0.1.0/specs/002-cdp-integration-refactor/tasks.md +268 -0
  119. frago_cli-0.1.0/specs/003-skill-automation/checklists/requirements.md +47 -0
  120. frago_cli-0.1.0/specs/003-skill-automation/plan.md +159 -0
  121. frago_cli-0.1.0/specs/003-skill-automation/quickstart.md +339 -0
  122. frago_cli-0.1.0/specs/003-skill-automation/research.md +604 -0
  123. frago_cli-0.1.0/specs/003-skill-automation/spec.md +135 -0
  124. frago_cli-0.1.0/specs/003-skill-automation/tasks.md +272 -0
  125. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/acceptance-checklist.md +413 -0
  126. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/checklists/requirements.md +40 -0
  127. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/contracts/cli-commands.md +618 -0
  128. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/data-model.md +484 -0
  129. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/plan.md +170 -0
  130. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/quickstart.md +775 -0
  131. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/research.md +318 -0
  132. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/spec.md +251 -0
  133. frago_cli-0.1.0/specs/004-recipe-architecture-refactor/tasks.md +328 -0
  134. frago_cli-0.1.0/specs/005-run-command-system/checklists/requirements.md +35 -0
  135. frago_cli-0.1.0/specs/005-run-command-system/contracts/cli-commands.md +494 -0
  136. frago_cli-0.1.0/specs/005-run-command-system/data-model.md +331 -0
  137. frago_cli-0.1.0/specs/005-run-command-system/plan.md +147 -0
  138. frago_cli-0.1.0/specs/005-run-command-system/quickstart.md +370 -0
  139. frago_cli-0.1.0/specs/005-run-command-system/research.md +555 -0
  140. frago_cli-0.1.0/specs/005-run-command-system/spec.md +308 -0
  141. frago_cli-0.1.0/specs/005-run-command-system/tasks.md +307 -0
  142. frago_cli-0.1.0/specs/006-init-command/checklists/requirements.md +73 -0
  143. frago_cli-0.1.0/specs/006-init-command/contracts/cli_commands.md +489 -0
  144. frago_cli-0.1.0/specs/006-init-command/data-model.md +447 -0
  145. frago_cli-0.1.0/specs/006-init-command/plan.md +326 -0
  146. frago_cli-0.1.0/specs/006-init-command/quickstart.md +628 -0
  147. frago_cli-0.1.0/specs/006-init-command/research.md +738 -0
  148. frago_cli-0.1.0/specs/006-init-command/spec.md +279 -0
  149. frago_cli-0.1.0/specs/006-init-command/tasks.md +445 -0
  150. frago_cli-0.1.0/specs/007-init-commands-setup/checklists/requirements.md +36 -0
  151. frago_cli-0.1.0/specs/007-init-commands-setup/contracts/resources-api.md +140 -0
  152. frago_cli-0.1.0/specs/007-init-commands-setup/data-model.md +184 -0
  153. frago_cli-0.1.0/specs/007-init-commands-setup/plan.md +91 -0
  154. frago_cli-0.1.0/specs/007-init-commands-setup/quickstart.md +124 -0
  155. frago_cli-0.1.0/specs/007-init-commands-setup/research.md +293 -0
  156. frago_cli-0.1.0/specs/007-init-commands-setup/spec.md +99 -0
  157. frago_cli-0.1.0/specs/007-init-commands-setup/tasks.md +187 -0
  158. frago_cli-0.1.0/src/chrome_cdp_launcher.py +410 -0
  159. frago_cli-0.1.0/src/chrome_cdp_launcher_v2.py.bakcup +465 -0
  160. frago_cli-0.1.0/src/frago/README.md +762 -0
  161. frago_cli-0.1.0/src/frago/__init__.py +25 -0
  162. frago_cli-0.1.0/src/frago/cdp/__init__.py +19 -0
  163. frago_cli-0.1.0/src/frago/cdp/client.py +93 -0
  164. frago_cli-0.1.0/src/frago/cdp/commands/__init__.py +29 -0
  165. frago_cli-0.1.0/src/frago/cdp/commands/dom.py +102 -0
  166. frago_cli-0.1.0/src/frago/cdp/commands/input.py +129 -0
  167. frago_cli-0.1.0/src/frago/cdp/commands/page.py +183 -0
  168. frago_cli-0.1.0/src/frago/cdp/commands/runtime.py +86 -0
  169. frago_cli-0.1.0/src/frago/cdp/commands/screenshot.py +71 -0
  170. frago_cli-0.1.0/src/frago/cdp/commands/scroll.py +67 -0
  171. frago_cli-0.1.0/src/frago/cdp/commands/status.py +91 -0
  172. frago_cli-0.1.0/src/frago/cdp/commands/visual_effects.py +186 -0
  173. frago_cli-0.1.0/src/frago/cdp/commands/wait.py +71 -0
  174. frago_cli-0.1.0/src/frago/cdp/commands/zoom.py +54 -0
  175. frago_cli-0.1.0/src/frago/cdp/config.py +177 -0
  176. frago_cli-0.1.0/src/frago/cdp/exceptions.py +50 -0
  177. frago_cli-0.1.0/src/frago/cdp/logger.py +195 -0
  178. frago_cli-0.1.0/src/frago/cdp/retry.py +215 -0
  179. frago_cli-0.1.0/src/frago/cdp/session.py +596 -0
  180. frago_cli-0.1.0/src/frago/cdp/stealth.js +148 -0
  181. frago_cli-0.1.0/src/frago/cdp/types.py +88 -0
  182. frago_cli-0.1.0/src/frago/cli/__init__.py +9 -0
  183. frago_cli-0.1.0/src/frago/cli/commands.py +409 -0
  184. frago_cli-0.1.0/src/frago/cli/init_command.py +405 -0
  185. frago_cli-0.1.0/src/frago/cli/main.py +225 -0
  186. frago_cli-0.1.0/src/frago/cli/recipe_commands.py +426 -0
  187. frago_cli-0.1.0/src/frago/cli/run_commands.py +417 -0
  188. frago_cli-0.1.0/src/frago/cli/sync_command.py +125 -0
  189. frago_cli-0.1.0/src/frago/cli/update_command.py +144 -0
  190. frago_cli-0.1.0/src/frago/init/__init__.py +96 -0
  191. frago_cli-0.1.0/src/frago/init/checker.py +237 -0
  192. frago_cli-0.1.0/src/frago/init/configurator.py +653 -0
  193. frago_cli-0.1.0/src/frago/init/exceptions.py +44 -0
  194. frago_cli-0.1.0/src/frago/init/formatter.py +262 -0
  195. frago_cli-0.1.0/src/frago/init/installer.py +244 -0
  196. frago_cli-0.1.0/src/frago/init/models.py +216 -0
  197. frago_cli-0.1.0/src/frago/init/recovery.py +234 -0
  198. frago_cli-0.1.0/src/frago/init/resources.py +391 -0
  199. frago_cli-0.1.0/src/frago/recipes/__init__.py +45 -0
  200. frago_cli-0.1.0/src/frago/recipes/env_loader.py +238 -0
  201. frago_cli-0.1.0/src/frago/recipes/exceptions.py +58 -0
  202. frago_cli-0.1.0/src/frago/recipes/metadata.py +239 -0
  203. frago_cli-0.1.0/src/frago/recipes/output_handler.py +77 -0
  204. frago_cli-0.1.0/src/frago/recipes/registry.py +235 -0
  205. frago_cli-0.1.0/src/frago/recipes/runner.py +378 -0
  206. frago_cli-0.1.0/src/frago/resources/__init__.py +7 -0
  207. frago_cli-0.1.0/src/frago/resources/commands/frago.exec.md +425 -0
  208. frago_cli-0.1.0/src/frago/resources/commands/frago.recipe.md +631 -0
  209. frago_cli-0.1.0/src/frago/resources/commands/frago.run.md +577 -0
  210. frago_cli-0.1.0/src/frago/resources/commands/frago.test.md +133 -0
  211. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/test_inspect_tab.js +67 -0
  212. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/test_inspect_tab.md +72 -0
  213. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/upwork_extract_job_details_as_markdown.js +184 -0
  214. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/upwork_extract_job_details_as_markdown.md +139 -0
  215. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/x_extract_tweet_with_comments.js +155 -0
  216. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/x_extract_tweet_with_comments.md +140 -0
  217. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/youtube_extract_video_transcript.js +61 -0
  218. frago_cli-0.1.0/src/frago/resources/recipes/atomic/chrome/youtube_extract_video_transcript.md +113 -0
  219. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_fetch_stock_latest_price.md +107 -0
  220. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_fetch_stock_latest_price.py +96 -0
  221. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_fetch_stock_minute_data.md +147 -0
  222. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_fetch_stock_minute_data.py +133 -0
  223. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_monitor_stock_with_alert.md +194 -0
  224. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/akshare_monitor_stock_with_alert.py +216 -0
  225. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/arxiv_fetch_paper.md +106 -0
  226. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/arxiv_fetch_paper.py +179 -0
  227. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/arxiv_search_papers.md +135 -0
  228. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/arxiv_search_papers.py +135 -0
  229. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/clipboard_read.md +69 -0
  230. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/clipboard_read.py +33 -0
  231. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/file_copy.md +90 -0
  232. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/file_copy.sh +41 -0
  233. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/gemini_generate_image_with_references.md +182 -0
  234. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/gemini_generate_image_with_references.py +275 -0
  235. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/pubmed_fetch_paper.md +140 -0
  236. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/pubmed_fetch_paper.py +431 -0
  237. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/pubmed_search_papers.md +152 -0
  238. frago_cli-0.1.0/src/frago/resources/recipes/atomic/system/pubmed_search_papers.py +152 -0
  239. frago_cli-0.1.0/src/frago/resources/recipes/workflows/fetch_academic_paper.md +192 -0
  240. frago_cli-0.1.0/src/frago/resources/recipes/workflows/fetch_academic_paper.py +305 -0
  241. frago_cli-0.1.0/src/frago/resources/recipes/workflows/git_extract_commits_to_ones_tasks.md +594 -0
  242. frago_cli-0.1.0/src/frago/resources/recipes/workflows/git_extract_commits_to_ones_tasks.py +496 -0
  243. frago_cli-0.1.0/src/frago/resources/recipes/workflows/project_specific_task.md +194 -0
  244. frago_cli-0.1.0/src/frago/resources/recipes/workflows/project_specific_task.py +71 -0
  245. frago_cli-0.1.0/src/frago/resources/recipes/workflows/search_academic_papers.md +213 -0
  246. frago_cli-0.1.0/src/frago/resources/recipes/workflows/search_academic_papers.py +235 -0
  247. frago_cli-0.1.0/src/frago/resources/recipes/workflows/stock_batch_monitor_multiple.md +240 -0
  248. frago_cli-0.1.0/src/frago/resources/recipes/workflows/stock_batch_monitor_multiple.py +193 -0
  249. frago_cli-0.1.0/src/frago/resources/recipes/workflows/upwork_batch_extract.md +190 -0
  250. frago_cli-0.1.0/src/frago/resources/recipes/workflows/upwork_batch_extract.py +147 -0
  251. frago_cli-0.1.0/src/frago/run/__init__.py +5 -0
  252. frago_cli-0.1.0/src/frago/run/context.py +155 -0
  253. frago_cli-0.1.0/src/frago/run/discovery.py +76 -0
  254. frago_cli-0.1.0/src/frago/run/exceptions.py +66 -0
  255. frago_cli-0.1.0/src/frago/run/logger.py +148 -0
  256. frago_cli-0.1.0/src/frago/run/manager.py +219 -0
  257. frago_cli-0.1.0/src/frago/run/models.py +181 -0
  258. frago_cli-0.1.0/src/frago/run/screenshot.py +84 -0
  259. frago_cli-0.1.0/src/frago/run/utils.py +95 -0
  260. frago_cli-0.1.0/src/frago/tools/__init__.py +0 -0
  261. frago_cli-0.1.0/src/frago/tools/sync.py +200 -0
  262. frago_cli-0.1.0/test_stealth.html +195 -0
  263. frago_cli-0.1.0/tests/QUICK_TEST.sh +77 -0
  264. frago_cli-0.1.0/tests/TESTING_GUIDE.md +283 -0
  265. frago_cli-0.1.0/tests/contract/__init__.py +1 -0
  266. frago_cli-0.1.0/tests/contract/test_cli_exit_codes.py +330 -0
  267. frago_cli-0.1.0/tests/contract/test_json_output.py +374 -0
  268. frago_cli-0.1.0/tests/contract/test_log_format.py +268 -0
  269. frago_cli-0.1.0/tests/integration/__init__.py +1 -0
  270. frago_cli-0.1.0/tests/integration/recipe/test_ai_workflow.py +309 -0
  271. frago_cli-0.1.0/tests/integration/recipe/test_project_recipes.py +291 -0
  272. frago_cli-0.1.0/tests/integration/recipe/test_recipe_execution.py +203 -0
  273. frago_cli-0.1.0/tests/integration/recipe/test_workflow_execution.py +160 -0
  274. frago_cli-0.1.0/tests/integration/test_init_command.py +599 -0
  275. frago_cli-0.1.0/tests/integration/test_log_persistence.py +237 -0
  276. frago_cli-0.1.0/tests/integration/test_multi_runs.py +217 -0
  277. frago_cli-0.1.0/tests/integration/test_run_lifecycle.py +218 -0
  278. frago_cli-0.1.0/tests/manual_test_models.py +301 -0
  279. frago_cli-0.1.0/tests/performance/test_run_performance.py +140 -0
  280. frago_cli-0.1.0/tests/unit/init/__init__.py +1 -0
  281. frago_cli-0.1.0/tests/unit/init/test_checker.py +271 -0
  282. frago_cli-0.1.0/tests/unit/init/test_configurator.py +617 -0
  283. frago_cli-0.1.0/tests/unit/init/test_exceptions.py +96 -0
  284. frago_cli-0.1.0/tests/unit/init/test_formatter.py +294 -0
  285. frago_cli-0.1.0/tests/unit/init/test_installer.py +267 -0
  286. frago_cli-0.1.0/tests/unit/init/test_models.py +245 -0
  287. frago_cli-0.1.0/tests/unit/init/test_recovery.py +295 -0
  288. frago_cli-0.1.0/tests/unit/recipe/test_env_loader.py +198 -0
  289. frago_cli-0.1.0/tests/unit/recipe/test_metadata_parser.py +402 -0
  290. frago_cli-0.1.0/tests/unit/recipe/test_output_handler.py +208 -0
  291. frago_cli-0.1.0/tests/unit/recipe/test_recipe_registry.py +301 -0
  292. frago_cli-0.1.0/tests/unit/recipe/test_runner.py +456 -0
  293. frago_cli-0.1.0/tests/unit/test_run/__init__.py +1 -0
  294. frago_cli-0.1.0/tests/unit/test_run/test_context.py +190 -0
  295. frago_cli-0.1.0/tests/unit/test_run/test_discovery.py +172 -0
  296. frago_cli-0.1.0/tests/unit/test_run/test_logger.py +228 -0
  297. frago_cli-0.1.0/tests/unit/test_run/test_manager.py +193 -0
  298. frago_cli-0.1.0/tests/unit/test_run/test_screenshot.py +207 -0
  299. frago_cli-0.1.0/tests/unit/test_run/test_utils.py +225 -0
  300. frago_cli-0.1.0/uv.lock +1486 -0
@@ -0,0 +1,425 @@
1
+ ---
2
+ description: "执行一次性的复杂任务(使用完整的frago工具集)"
3
+ ---
4
+
5
+ # /frago.exec - 执行复杂任务
6
+
7
+ ## 你的任务
8
+
9
+ 作为任务执行者,你需要优先使用完整的 **frago 工具集**、**已有的配方**和**已有的project工作记录**(通过rg搜索),完成用户指定的一次性复杂任务。与 `/frago.run`(专注于调研)不同,本命令专注于**任务完成**。
10
+
11
+ ## 核心定位
12
+
13
+ - **目标**:完成用户指定的具体任务(如"在Upwork申请5个Python职位")
14
+ - **成功标准**:任务目标达成 + 结果可验证
15
+ - **工作空间**:使用 `projects/` 目录(与 `/frago.run` 共享基础设施)
16
+
17
+ ## 可用工具
18
+
19
+ ### 🔍 资源发现
20
+
21
+ **开始任务前,先搜索已有资源**:
22
+
23
+ ```bash
24
+ # 查找可复用的配方
25
+ uv run frago recipe list --format json
26
+
27
+ # 搜索相关的历史项目记录
28
+ rg -l "关键词" projects/
29
+
30
+ # 查看某个项目的执行日志
31
+ cat projects/<project_id>/logs/execution.jsonl
32
+ ```
33
+
34
+ **命令用法查询**:
35
+
36
+ ```bash
37
+ uv run frago --help # 所有命令
38
+ uv run frago <command> --help # 具体用法
39
+ ```
40
+
41
+ ### 📝 核心命令(必须掌握)
42
+
43
+ #### 1. Run 命令系统(任务管理)
44
+
45
+ **初始化和上下文**:
46
+ ```bash
47
+ uv run frago run init "task-description"
48
+ uv run frago run set-context <project_id>
49
+ ```
50
+
51
+ **记录日志**(最重要):
52
+ ```bash
53
+ uv run frago run log \
54
+ --step "步骤描述" \
55
+ --status "success|error|warning" \
56
+ --action-type "<9种有效值之一>" \
57
+ --execution-method "<6种有效值之一>" \
58
+ --data '{"key": "value"}'
59
+ ```
60
+
61
+ **9种有效 action-type 值**:
62
+ 1. `navigation` - 页面导航
63
+ 2. `extraction` - 数据提取
64
+ 3. `interaction` - 页面交互
65
+ 4. `screenshot` - 截图
66
+ 5. `recipe_execution` - Recipe执行
67
+ 6. `data_processing` - 数据处理
68
+ 7. `analysis` - AI分析
69
+ 8. `user_interaction` - 用户交互
70
+ 9. `other` - 其他
71
+
72
+ **6种有效 execution-method 值**:
73
+ 1. `command` - CLI命令
74
+ 2. `recipe` - Recipe调用
75
+ 3. `file` - 脚本文件
76
+ 4. `manual` - 手动操作
77
+ 5. `analysis` - AI推理
78
+ 6. `tool` - AI工具
79
+
80
+ **常见错误**:
81
+ - ❌ `web_search` → ✅ `data_processing`
82
+ - ❌ `browsing` → ✅ `navigation`
83
+ - ❌ `scraping` → ✅ `extraction`
84
+
85
+ #### 2. Recipe 系统
86
+
87
+ ```bash
88
+ # 发现 Recipe
89
+ uv run frago recipe list --format json
90
+ uv run frago recipe info <name> --format json
91
+
92
+ # 执行 Recipe
93
+ uv run frago recipe run <name> --params '{...}' --output-file result.json
94
+ ```
95
+
96
+ #### 3. 其他常用命令
97
+
98
+ **浏览器操作**:参考 `uv run frago --help`,包括:
99
+ - `navigate` - 导航
100
+ - `click` - 点击
101
+ - `exec-js` - 执行 JavaScript
102
+ - `screenshot` - 截图
103
+
104
+ **提示**:需要其他命令时,使用 `--help` 查询
105
+
106
+ ## 执行流程
107
+
108
+ ### 1. 明确任务目标和输出物
109
+
110
+ 在开始前,**必须明确任务的输出物要求**:
111
+
112
+ #### Step 1: 分析用户的输出物需求
113
+
114
+ 检查用户的任务描述是否明确了输出格式:
115
+
116
+ **✅ 输出物明确的情况**(直接执行):
117
+ - "生成一份 JSON 格式的投资分析数据"
118
+ - "输出 Markdown 格式的研究报告"
119
+ - "保存 CSV 格式的职位列表"
120
+ - "导出 HTML 格式的可视化报告"
121
+
122
+ **⚠️ 输出物模糊的情况**(需要询问用户):
123
+ - "分析伯克希尔投资 Google 的逻辑" → 没说要什么格式
124
+ - "帮我研究一下 API 使用方法" → 没说要文档还是数据
125
+ - "在 Upwork 申请职位" → 没说要什么记录
126
+
127
+ #### Step 2: 如果输出物模糊,使用 AskUserQuestion 明确
128
+
129
+ **重要**:如果用户没有明确输出格式,**必须**使用 **AskUserQuestion** 工具询问:
130
+
131
+ ```markdown
132
+ 问题:你希望任务的最终输出是什么格式?
133
+ 选项:
134
+ - 📊 结构化数据(JSON/CSV)- 适合后续处理和分析
135
+ - 📝 文档报告(Markdown/HTML)- 适合阅读和分享
136
+ - 💾 仅执行日志 - 最小化输出,只保存执行记录
137
+ - 🖼️ 截图集合 - 可视化记录关键步骤
138
+ ```
139
+
140
+ **记录用户选择**:
141
+ ```bash
142
+ uv run frago run log \
143
+ --step "明确任务输出物格式" \
144
+ --status "success" \
145
+ --action-type "user_interaction" \
146
+ --execution-method "tool" \
147
+ --data '{"tool": "AskUserQuestion", "question": "输出格式确认", "answer": "结构化数据文件(JSON)", "reasoning": "用户选择 JSON 格式用于后续分析"}'
148
+ ```
149
+
150
+ #### Step 3: 确定最终输出规格
151
+
152
+ 基于用户的明确要求或选择,定义输出规格:
153
+
154
+ ```markdown
155
+ ## 任务目标
156
+ - **任务描述**:[用户原始需求]
157
+ - **成功标准**:[可验证的完成条件]
158
+ - **输出格式**:[用户明确的格式或通过交互确认的格式]
159
+ - **输出位置**:projects/<project_id>/outputs/
160
+ - **文件命名**:[描述性名称,反映内容]
161
+
162
+ 示例 1(结构化数据 - JSON):
163
+ - 任务描述:在Upwork上申请5个Python职位
164
+ - 成功标准:成功提交5个申请 + 保存职位详情
165
+ - 输出格式:JSON(包含职位列表、申请状态、时间戳)
166
+ - 输出文件:`outputs/applied_jobs.json`
167
+
168
+ 示例 2(文档报告 - Markdown):
169
+ - 任务描述:分析伯克希尔投资 Google 的逻辑
170
+ - 成功标准:完整的投资分析 + 数据支撑
171
+ - 输出格式:Markdown 报告(包含时间线、分析、数据)
172
+ - 输出文件:`outputs/investment_analysis.md`
173
+
174
+ 示例 3(结构化数据 - CSV):
175
+ - 任务描述:提取Upwork上Python职位列表
176
+ - 成功标准:提取至少20个职位的详细信息
177
+ - 输出格式:CSV 表格(便于Excel打开)
178
+ - 输出文件:`outputs/python_jobs.csv`
179
+
180
+ 示例 4(HTML报告):
181
+ - 任务描述:生成网页数据分析报告
182
+ - 成功标准:包含图表和表格的可视化报告
183
+ - 输出格式:HTML(可在浏览器中打开)
184
+ - 输出文件:`outputs/analysis_report.html`
185
+ ```
186
+
187
+ ### 2. 生成任务 ID
188
+
189
+ **重要**:project_id 必须是简洁、可读的英文短句(3-5 个词)
190
+
191
+ ```python
192
+ # 示例
193
+ 用户任务:"在Upwork上申请5个Python职位"
194
+ 任务短句:"upwork python job apply"
195
+
196
+ 用户任务:"批量下载YouTube视频字幕"
197
+ 任务短句:"youtube batch download subtitles"
198
+ ```
199
+
200
+ ### 3. 初始化工作空间
201
+
202
+ ```bash
203
+ # 创建 project
204
+ uv run frago run init "upwork python job apply"
205
+
206
+ # 设置上下文(假设返回的 project_id 是 upwork-python-job-apply)
207
+ uv run frago run set-context upwork-python-job-apply
208
+ ```
209
+
210
+ ### 4. 执行任务并记录日志
211
+
212
+ 每完成一个关键步骤后记录日志:
213
+
214
+ ```bash
215
+ # 示例:导航到Upwork
216
+ uv run frago navigate https://upwork.com/jobs
217
+
218
+ uv run frago run log \
219
+ --step "导航到Upwork职位搜索页" \
220
+ --status "success" \
221
+ --action-type "navigation" \
222
+ --execution-method "command" \
223
+ --data '{"url": "https://upwork.com/jobs"}'
224
+
225
+ # 示例:提取职位列表
226
+ uv run frago exec-js "Array.from(document.querySelectorAll('.job-tile')).map(el => ({title: el.querySelector('.title').textContent, url: el.querySelector('a').href}))"
227
+
228
+ uv run frago run log \
229
+ --step "提取到15个Python职位" \
230
+ --status "success" \
231
+ --action-type "extraction" \
232
+ --execution-method "command" \
233
+ --data '{"jobs": [...], "total": 15}'
234
+ ```
235
+
236
+ ### 5. 使用 Recipe 加速重复操作
237
+
238
+ 如果发现重复操作(如批量申请),优先使用 Recipe:
239
+
240
+ ```bash
241
+ # 发现现有 Recipe
242
+ uv run frago recipe list --format json | grep "upwork"
243
+
244
+ # 如果有现成的 Recipe
245
+ uv run frago recipe run upwork_apply_job \
246
+ --params '{"job_url": "https://...", "cover_letter": "..."}' \
247
+ --output-file result.json
248
+
249
+ # 记录日志
250
+ uv run frago run log \
251
+ --step "使用Recipe申请职位" \
252
+ --status "success" \
253
+ --action-type "recipe_execution" \
254
+ --execution-method "recipe" \
255
+ --data '{"recipe": "upwork_apply_job", "result": {...}}'
256
+ ```
257
+
258
+ ### 6. 保存任务结果
259
+
260
+ ```bash
261
+ # 保存关键截图
262
+ uv run frago run screenshot "申请成功页面"
263
+
264
+ # 将结果保存到 outputs/
265
+ echo '{"applied_jobs": [...]}' > projects/<project_id>/outputs/result.json
266
+
267
+ # 记录最终结果
268
+ uv run frago run log \
269
+ --step "完成任务:成功申请5个职位" \
270
+ --status "success" \
271
+ --action-type "user_interaction" \
272
+ --execution_method "analysis" \
273
+ --data '{"total_applied": 5, "result_file": "outputs/result.json", "task_completed": true}'
274
+ ```
275
+
276
+ ## 任务成功标准
277
+
278
+ ### ✅ 完成条件
279
+
280
+ 任务完成需满足以下条件:
281
+
282
+ 1. **用户目标达成**:
283
+ - 任务描述中的具体目标已实现
284
+ - 可通过日志或文件验证
285
+
286
+ 2. **结果已保存**:
287
+ - 任务结果保存到 `outputs/` 或日志
288
+ - 关键步骤有截图记录
289
+
290
+ 3. **最后一条日志标记**:
291
+ ```json
292
+ {
293
+ "action_type": "analysis",
294
+ "execution_method": "analysis",
295
+ "step": "完成任务:[简要描述]",
296
+ "data": {
297
+ "task_completed": true,
298
+ "summary": "完成情况摘要",
299
+ "result_file": "outputs/result.json" // 可选
300
+ }
301
+ }
302
+ ```
303
+
304
+ ### 🛑 停止条件
305
+
306
+ 满足以下任一条件立即停止:
307
+ - 用户目标达成 + 最后一条日志标记 `task_completed: true`
308
+ - 任务执行失败,原因已记录
309
+ - 用户明确指示停止
310
+
311
+ ## 输出约束
312
+
313
+ ### ✅ 允许的输出
314
+
315
+ **根据用户选择的输出格式,创建相应的文件**:
316
+
317
+ #### 1. **必需输出**
318
+ - `execution.jsonl`(执行日志,记录所有操作步骤)
319
+
320
+ #### 2. **用户指定的结果文件**(根据 Step 1 确认的格式)
321
+
322
+ **📊 结构化数据文件**(Agent 可直接生成):
323
+ - `outputs/*.json` - JSON 格式数据
324
+ - `outputs/*.csv` - CSV 表格(简单的逗号分隔)
325
+
326
+ **📝 文档报告**(Agent 可直接生成):
327
+ - `outputs/*.md` - Markdown 格式报告
328
+ - `outputs/*.html` - HTML 格式报告
329
+ - `outputs/*.txt` - 纯文本文件
330
+
331
+ **🖼️ 多媒体文件**(通过工具生成):
332
+ - `screenshots/*.png` - 截图(使用 `uv run frago screenshot`)
333
+ - `outputs/*.srt` - 字幕文件(如果任务涉及)
334
+
335
+ **⚠️ 复杂格式**(需要额外库,一般不推荐):
336
+ - ~~`outputs/*.pdf`~~ - 需要 PDF 库,复杂度高
337
+ - ~~`outputs/*.xlsx`~~ - 需要 Excel 库,建议用 CSV 代替
338
+
339
+ #### 3. **辅助文件**(可选)
340
+ - `scripts/*.{py,js,sh}` - 执行过程中生成的脚本
341
+ - `outputs/metadata.json` - 输出文件的元数据说明
342
+
343
+ ### ❌ 禁止的行为
344
+
345
+ - **违背用户选择**:用户选择 JSON,不要输出 Markdown
346
+ - **创建未经确认的文档**:如果用户没选"文档报告",不要创建 `.md` 或 `.html`
347
+ - **生成复杂格式**:不要尝试生成 PDF、XLSX 等需要额外库的格式
348
+ - **重复记录相似的日志**:避免冗余
349
+ - **过度输出**:每个关键步骤记录一次即可
350
+
351
+ ### 📋 输出文件命名规范
352
+
353
+ - **描述性命名**:`investment_analysis.json` 而非 `result.json`
354
+ - **日期标记**(如需要):`jobs_2025-11-23.csv`
355
+ - **版本区分**(如有多个):`report_v1.md`, `report_v2.md`
356
+
357
+ ## 进度展示
358
+
359
+ 每完成 5 个关键步骤,输出进度摘要:
360
+
361
+ ```markdown
362
+ ✅ 已完成 5 步:
363
+ 1. 导航到Upwork搜索页(navigation/command)
364
+ 2. 搜索Python职位(interaction/command)
365
+ 3. 提取15个职位列表(extraction/command)
366
+ 4. 筛选合适职位(data_processing/analysis)
367
+ 5. 申请第1个职位(user_interaction/recipe)
368
+
369
+ 📊 当前进度:已申请 1/5 个职位
370
+ 📁 输出文件:outputs/applied_jobs.json
371
+ ```
372
+
373
+ ## 最佳实践
374
+
375
+ ### ✅ 推荐做法
376
+
377
+ 1. **优先使用 Recipe**:避免重复手动操作
378
+ 2. **结构化输出**:任务结果保存为 JSON 格式
379
+ 3. **关键步骤截图**:保留任务完成的证据
380
+ 4. **每5步输出进度**:让用户了解任务进展
381
+ 5. **失败及时记录**:错误信息记录在日志中
382
+
383
+ ### ❌ 禁止做法
384
+
385
+ 1. **跳过上下文设置**:必须先 `set-context`
386
+ 2. **忽略错误**:任务失败需记录原因
387
+ 3. **过度日志**:只记录关键步骤
388
+ 4. **创建冗余文档**:不要创建总结 Markdown
389
+
390
+ ## 任务完成后
391
+
392
+ 生成执行摘要:
393
+
394
+ ```markdown
395
+ ✅ 任务完成!
396
+
397
+ **Project**: upwork-python-job-apply
398
+ **执行时间**: 2025-11-23 14:00 - 14:30 (30分钟)
399
+
400
+ **完成情况**:
401
+ - 成功申请 5 个 Python 职位
402
+ - 保存职位详情到 outputs/applied_jobs.json
403
+ - 保存申请截图到 screenshots/
404
+
405
+ **关键步骤**:
406
+ 1. 导航到Upwork并搜索
407
+ 2. 提取15个候选职位
408
+ 3. 筛选出5个合适职位
409
+ 4. 批量申请(使用Recipe加速)
410
+ 5. 验证申请成功
411
+
412
+ **输出文件**:
413
+ - outputs/applied_jobs.json(5个职位详情)
414
+ - screenshots/001_search-results.png
415
+ - screenshots/002_application-success.png
416
+
417
+ **详细日志**: projects/upwork-python-job-apply/logs/execution.jsonl(共12条记录)
418
+ ```
419
+
420
+ ## 注意事项
421
+
422
+ - **工作目录管理**:始终在项目根目录执行命令,使用相对路径访问文件
423
+ - **禁止使用 `cd`**:会导致 `uv run frago` 命令失效
424
+ - **上下文优先级**:环境变量 `FRAGO_CURRENT_RUN` > 配置文件 `.frago/current_project`
425
+ - **并发安全**:同一时间只在一个 project 中工作