chattool 7.0.0__tar.gz → 7.0.2__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 (217) hide show
  1. {chattool-7.0.0/src/chattool.egg-info → chattool-7.0.2}/PKG-INFO +1 -1
  2. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/__init__.py +1 -1
  3. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/elements.py +0 -9
  4. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/cli.py +1 -17
  5. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/core.py +3 -6
  6. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/options.py +0 -21
  7. chattool-7.0.2/src/chattool/setup/workspace/render.py +155 -0
  8. chattool-7.0.2/src/chattool/setup/workspace/templates/default/en/AGENTS.md +78 -0
  9. chattool-7.0.2/src/chattool/setup/workspace/templates/default/en/projects/README.md +113 -0
  10. chattool-7.0.2/src/chattool/setup/workspace/templates/default/zh/AGENTS.md +78 -0
  11. chattool-7.0.2/src/chattool/setup/workspace/templates/default/zh/projects/README.md +121 -0
  12. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/main.py +36 -23
  13. {chattool-7.0.0 → chattool-7.0.2/src/chattool.egg-info}/PKG-INFO +1 -1
  14. {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/SOURCES.txt +0 -12
  15. chattool-7.0.0/src/chattool/setup/workspace/render.py +0 -179
  16. chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/AGENTS.md +0 -69
  17. chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/MEMORY.md +0 -13
  18. chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/README.md +0 -13
  19. chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/projects/README.md +0 -72
  20. chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/AGENTS.md +0 -69
  21. chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/MEMORY.md +0 -13
  22. chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/README.md +0 -13
  23. chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/projects/README.md +0 -74
  24. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/AGENTS.md +0 -69
  25. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/MEMORY.md +0 -13
  26. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/README.md +0 -17
  27. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/projects/README.md +0 -84
  28. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/AGENTS.md +0 -70
  29. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/MEMORY.md +0 -13
  30. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/README.md +0 -17
  31. chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/projects/README.md +0 -90
  32. {chattool-7.0.0 → chattool-7.0.2}/LICENSE +0 -0
  33. {chattool-7.0.0 → chattool-7.0.2}/MANIFEST.in +0 -0
  34. {chattool-7.0.0 → chattool-7.0.2}/README.md +0 -0
  35. {chattool-7.0.0 → chattool-7.0.2}/pyproject.toml +0 -0
  36. {chattool-7.0.0 → chattool-7.0.2}/scripts/migrate_chattool_envs_to_chatarch.py +0 -0
  37. {chattool-7.0.0 → chattool-7.0.2}/setup.cfg +0 -0
  38. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/_all.py +0 -0
  39. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/__init__.py +0 -0
  40. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/cert_client.py +0 -0
  41. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/main.py +0 -0
  42. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/svg2gif_client.py +0 -0
  43. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/__init__.py +0 -0
  44. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/aliyun.py +0 -0
  45. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/azure.py +0 -0
  46. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/base.py +0 -0
  47. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/browser.py +0 -0
  48. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/crs.py +0 -0
  49. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/elements.py +0 -0
  50. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/feishu.py +0 -0
  51. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/github.py +0 -0
  52. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/huggingface.py +0 -0
  53. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/liblib.py +0 -0
  54. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/openai.py +0 -0
  55. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/pollinations.py +0 -0
  56. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/siliconflow.py +0 -0
  57. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/skills.py +0 -0
  58. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tencent.py +0 -0
  59. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tongyi.py +0 -0
  60. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tplink.py +0 -0
  61. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/zulip.py +0 -0
  62. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/const.py +0 -0
  63. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/__init__.py +0 -0
  64. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/cli.py +0 -0
  65. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/elements.py +0 -0
  66. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/main.py +0 -0
  67. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/__init__.py +0 -0
  68. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/__init__.py +0 -0
  69. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/cli.py +0 -0
  70. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/client.py +0 -0
  71. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/daily.py +0 -0
  72. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/harvest.py +0 -0
  73. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/models.py +0 -0
  74. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/presets.py +0 -0
  75. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/query.py +0 -0
  76. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/cli.py +0 -0
  77. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/__init__.py +0 -0
  78. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/client.py +0 -0
  79. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/models.py +0 -0
  80. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/__init__.py +0 -0
  81. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/client.py +0 -0
  82. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/models.py +0 -0
  83. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/__init__.py +0 -0
  84. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/command_schema.py +0 -0
  85. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/policy.py +0 -0
  86. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/warnings.py +0 -0
  87. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/__init__.py +0 -0
  88. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/chattype.py +0 -0
  89. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/response.py +0 -0
  90. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/__init__.py +0 -0
  91. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/catalog.py +0 -0
  92. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/cli.py +0 -0
  93. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/server.py +0 -0
  94. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/__init__.py +0 -0
  95. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/capture.py +0 -0
  96. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/cert_server.py +0 -0
  97. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/cli.py +0 -0
  98. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/lark_serve.py +0 -0
  99. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/svg2gif.py +0 -0
  100. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/__init__.py +0 -0
  101. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/alias.py +0 -0
  102. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/hermes/install.sh +0 -0
  103. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/nvm.sh +0 -0
  104. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/README.md +0 -0
  105. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-help.md +0 -0
  106. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-project.md +0 -0
  107. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-status.md +0 -0
  108. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-stop.md +0 -0
  109. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop.md +0 -0
  110. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/plugins/chatloop/index.ts +0 -0
  111. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/plugins/chatloop/package.json +0 -0
  112. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/cc_connect.py +0 -0
  113. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/chrome.py +0 -0
  114. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/claude.py +0 -0
  115. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/cli.py +0 -0
  116. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/codex.py +0 -0
  117. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/docker.py +0 -0
  118. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/frp.py +0 -0
  119. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/hermes.py +0 -0
  120. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/lark_cli.py +0 -0
  121. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/mode_prompt.py +0 -0
  122. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/nodejs.py +0 -0
  123. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/opencode.py +0 -0
  124. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/opencode_chatloop.py +0 -0
  125. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/__init__.py +0 -0
  126. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace.py +0 -0
  127. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/zsh.py +0 -0
  128. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/__init__.py +0 -0
  129. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/cli.py +0 -0
  130. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/interaction.py +0 -0
  131. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/platforms.py +0 -0
  132. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/validation.py +0 -0
  133. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/__init__.py +0 -0
  134. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/__init__.py +0 -0
  135. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/base.py +0 -0
  136. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/cli.py +0 -0
  137. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/playwright_impl.py +0 -0
  138. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/selenium.py +0 -0
  139. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_browser.py +0 -0
  140. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_module.py +0 -0
  141. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_remote.py +0 -0
  142. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/xhs_qrcode.py +0 -0
  143. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cc/__init__.py +0 -0
  144. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cc/cli.py +0 -0
  145. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/__init__.py +0 -0
  146. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/acme_dns_tiny.py +0 -0
  147. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cert_server.py +0 -0
  148. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cert_updater.py +0 -0
  149. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cli.py +0 -0
  150. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/email.py +0 -0
  151. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/__init__.py +0 -0
  152. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/api.py +0 -0
  153. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/cli.py +0 -0
  154. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/__init__.py +0 -0
  155. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/aliyun.py +0 -0
  156. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/base.py +0 -0
  157. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/cli.py +0 -0
  158. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/domain_utils.py +0 -0
  159. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/ip_updater.py +0 -0
  160. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/mcp.py +0 -0
  161. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/tencent.py +0 -0
  162. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/utils.py +0 -0
  163. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/__init__.py +0 -0
  164. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/api.py +0 -0
  165. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/cli.py +0 -0
  166. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/client.py +0 -0
  167. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/commands.py +0 -0
  168. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/render.py +0 -0
  169. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/requests.py +0 -0
  170. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/__init__.py +0 -0
  171. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/base.py +0 -0
  172. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/cli.py +0 -0
  173. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/helpers.py +0 -0
  174. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/huggingface.py +0 -0
  175. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/liblib.py +0 -0
  176. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/pollinations.py +0 -0
  177. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/siliconflow.py +0 -0
  178. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/tongyi.py +0 -0
  179. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/interact.py +0 -0
  180. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/__init__.py +0 -0
  181. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/bot.py +0 -0
  182. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/cli.py +0 -0
  183. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/context.py +0 -0
  184. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/docx_blocks.py +0 -0
  185. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/elements.py +0 -0
  186. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/markdown_blocks.py +0 -0
  187. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/session.py +0 -0
  188. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/__init__.py +0 -0
  189. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/cli.py +0 -0
  190. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/link_check.py +0 -0
  191. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/mcp.py +0 -0
  192. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/scanner.py +0 -0
  193. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/service_urls.py +0 -0
  194. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/__init__.py +0 -0
  195. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/cli.py +0 -0
  196. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/templates.py +0 -0
  197. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/__init__.py +0 -0
  198. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/cli.py +0 -0
  199. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/tplogin.py +0 -0
  200. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/tplogin_cli.py +0 -0
  201. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/__init__.py +0 -0
  202. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/cli.py +0 -0
  203. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/client.py +0 -0
  204. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/legacy.py +0 -0
  205. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/mcp.py +0 -0
  206. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/__init__.py +0 -0
  207. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/basic.py +0 -0
  208. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/custom_logger.py +0 -0
  209. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/fastobj.py +0 -0
  210. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/httpclient.py +0 -0
  211. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/pathing.py +0 -0
  212. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/test_helpers.py +0 -0
  213. {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/urltool.py +0 -0
  214. {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/dependency_links.txt +0 -0
  215. {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/entry_points.txt +0 -0
  216. {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/requires.txt +0 -0
  217. {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chattool
3
- Version: 7.0.0
3
+ Version: 7.0.2
4
4
  Summary: Toolkit for Chat API
5
5
  Author-email: Rex Wang <1073853456@qq.com>
6
6
  License: MIT license
@@ -4,7 +4,7 @@ import importlib
4
4
 
5
5
  __author__ = """Rex Wang"""
6
6
  __email__ = "1073853456@qq.com"
7
- __version__ = "7.0.0"
7
+ __version__ = "7.0.2"
8
8
 
9
9
  from dotenv import load_dotenv
10
10
 
@@ -194,7 +194,6 @@ def workspace_setup(
194
194
  dry_run,
195
195
  with_chattool,
196
196
  chattool_source,
197
- with_opencode_loop,
198
197
  ):
199
198
  setup_workspace(
200
199
  profile_name=profile,
@@ -205,7 +204,6 @@ def workspace_setup(
205
204
  dry_run=dry_run,
206
205
  with_chattool=with_chattool,
207
206
  chattool_source=chattool_source,
208
- with_opencode_loop=with_opencode_loop,
209
207
  )
210
208
 
211
209
 
@@ -690,13 +688,6 @@ SETUP_COMMAND_ELEMENTS = (
690
688
  "help": "Git URL or local ChatTool repo path used when --with-chattool is enabled.",
691
689
  },
692
690
  ),
693
- SetupOptionElement(
694
- param_decls=("--with-opencode-loop/--no-opencode-loop",),
695
- kwargs={
696
- "default": False,
697
- "help": "Use the OpenCode loop-aware workspace template and install the global chatloop plugin and slash commands for OpenCode.",
698
- },
699
- ),
700
691
  ),
701
692
  ),
702
693
  )
@@ -4,7 +4,6 @@ from pathlib import Path
4
4
 
5
5
  import click
6
6
 
7
- from chattool.setup.opencode import setup_opencode
8
7
  from chattool.interaction import (
9
8
  BACK_VALUE,
10
9
  abort_if_force_without_tty,
@@ -54,8 +53,6 @@ def _plan_workspace(
54
53
  language: str,
55
54
  enabled_options: list[str],
56
55
  profile,
57
- *,
58
- template_variant: str = "default",
59
56
  ) -> tuple[list[Path], dict[Path, str]]:
60
57
  dir_paths = [workspace_dir / rel for rel in BASE_DIRS]
61
58
  dir_paths.extend(workspace_dir / rel for rel in profile.extra_dirs())
@@ -65,7 +62,6 @@ def _plan_workspace(
65
62
  profile,
66
63
  language,
67
64
  enabled_options,
68
- template_variant=template_variant,
69
65
  existing_workspace=existing_workspace,
70
66
  )
71
67
  planned_files = {workspace_dir / rel: content for rel, content in file_map.items()}
@@ -106,7 +102,6 @@ def setup_workspace(
106
102
  dry_run=False,
107
103
  with_chattool=False,
108
104
  chattool_source=None,
109
- with_opencode_loop=False,
110
105
  ):
111
106
  profile_name, workspace_dir = coerce_profile_and_workspace(
112
107
  profile_name, workspace_dir
@@ -117,7 +112,6 @@ def setup_workspace(
117
112
  usage = (
118
113
  "Usage: chattool setup workspace [PROFILE] [WORKSPACE_DIR] "
119
114
  "[--language zh|en] [--with-chattool] [--chattool-source <path-or-url>] "
120
- "[--with-opencode-loop] "
121
115
  "[--force] [--dry-run] [-i|-I]"
122
116
  )
123
117
  interactive, can_prompt, force_interactive, _, need_prompt = (
@@ -135,7 +129,6 @@ def setup_workspace(
135
129
  "source": chattool_source or workspace_options.CHATTOOL_REPO_URL,
136
130
  },
137
131
  "rexblog": {"enabled": False, "source": workspace_options.REXBLOG_REPO_URL},
138
- "opencode_loop": {"enabled": bool(with_opencode_loop)},
139
132
  }
140
133
 
141
134
  if need_prompt:
@@ -158,9 +151,8 @@ def setup_workspace(
158
151
  enabled_options = [
159
152
  name for name, item in option_settings.items() if item["enabled"]
160
153
  ]
161
- template_variant = "opencode-loop" if option_settings["opencode_loop"]["enabled"] else "default"
162
154
  dir_paths, file_map = _plan_workspace(
163
- workspace_path, language, enabled_options, profile, template_variant=template_variant
155
+ workspace_path, language, enabled_options, profile
164
156
  )
165
157
 
166
158
  if dry_run:
@@ -177,9 +169,6 @@ def setup_workspace(
177
169
  write_text_file(path, content, force=force)
178
170
 
179
171
  applied = []
180
- if option_settings["opencode_loop"]["enabled"]:
181
- setup_opencode(interactive=False, install_only=True, plugin="chatloop")
182
- applied.append(workspace_options.apply_opencode_loop_option(workspace_path))
183
172
  if option_settings["chattool"]["enabled"]:
184
173
  applied.append(
185
174
  workspace_options.apply_chattool_option(
@@ -220,8 +209,3 @@ def setup_workspace(
220
209
  click.echo(f"RexBlog repo: {item['repo_dir']}")
221
210
  click.echo(f"Repo action: {item['repo_action']}")
222
211
  click.echo(f"Public link: {item['public_link']}")
223
- if item["name"] == "opencode_loop":
224
- click.echo(f"OpenCode home: {item['opencode_home']}")
225
- click.echo(f"ChatLoop plugin: {item['plugin_dir']}")
226
- click.echo(f"ChatLoop commands: {item['commands_dir']}")
227
- click.echo("ChatLoop state and event records are written under each project's .opencode/ directory when /chatloop runs.")
@@ -36,14 +36,11 @@ PROFILES: dict[str, WorkspaceProfile] = {
36
36
 
37
37
 
38
38
  BASE_DIRS = [
39
+ ".trash",
39
40
  "projects",
40
- "reference",
41
- "docs",
42
- "docs/memory",
43
- "docs/skills",
44
- "docs/themes",
45
- "docs/tools",
41
+ "archive",
46
42
  "core",
43
+ "scripts",
47
44
  "skills",
48
45
  "public",
49
46
  ]
@@ -13,10 +13,6 @@ from chattool.interaction import (
13
13
  ask_text,
14
14
  create_choice,
15
15
  )
16
- from chattool.setup.opencode_chatloop import (
17
- build_chatloop_plugin_entry,
18
- resolve_opencode_home,
19
- )
20
16
  from chattool.utils import mask_secret
21
17
 
22
18
 
@@ -86,18 +82,6 @@ def _copy_skill_tree(src: Path, dst: Path) -> list[str]:
86
82
  shutil.copytree(skill_dir, target_dir)
87
83
  copied.append(skill_dir.name)
88
84
  return copied
89
- def apply_opencode_loop_option(workspace_dir: Path) -> dict:
90
- opencode_home = resolve_opencode_home()
91
- plugin_dir = opencode_home / "plugins" / "chatloop"
92
- commands_dir = opencode_home / "command"
93
- return {
94
- "name": "opencode_loop",
95
- "workspace_dir": workspace_dir,
96
- "opencode_home": opencode_home,
97
- "plugin_dir": plugin_dir,
98
- "commands_dir": commands_dir,
99
- "plugin_entry": build_chatloop_plugin_entry(opencode_home),
100
- }
101
85
 
102
86
 
103
87
  def _credential_path_from_source(repo_source: str) -> str | None:
@@ -246,7 +230,6 @@ def prompt_optional_modules(language: str) -> dict[str, dict]:
246
230
  "source": REXBLOG_REPO_URL,
247
231
  "github_token": None,
248
232
  },
249
- "opencode_loop": {"enabled": False},
250
233
  }
251
234
 
252
235
  enable_extras = ask_confirm(
@@ -267,10 +250,6 @@ def prompt_optional_modules(language: str) -> dict[str, dict]:
267
250
  choices=[
268
251
  create_choice("ChatTool -> core/ChatTool + ./skills", "chattool"),
269
252
  create_choice("RexBlog -> core/RexBlog + public/hexo_blog", "rexblog"),
270
- create_choice(
271
- "OpenCode loop support -> .opencode chatloop plugin + commands",
272
- "opencode_loop",
273
- ),
274
253
  ],
275
254
  default_values=[],
276
255
  instruction="",
@@ -0,0 +1,155 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib import resources
4
+ from pathlib import Path
5
+
6
+ from .core import WorkspaceProfile
7
+
8
+
9
+ def _read_template(language: str, relative_path: str) -> str:
10
+ return (
11
+ resources.files("chattool.setup.workspace")
12
+ .joinpath("templates")
13
+ .joinpath("default")
14
+ .joinpath(language)
15
+ .joinpath(relative_path)
16
+ .read_text(encoding="utf-8")
17
+ )
18
+
19
+
20
+ def _render_text_template(language: str, relative_path: str, **variables: str) -> str:
21
+ content = _read_template(language, relative_path)
22
+ for key, value in variables.items():
23
+ content = content.replace(f"{{{{{key}}}}}", value)
24
+ return content
25
+
26
+
27
+ def render_projects_readme(language: str) -> str:
28
+ return _read_template(language, "projects/README.md")
29
+
30
+
31
+ def render_archive_readme(language: str) -> str:
32
+ if language == "en":
33
+ return (
34
+ "# Archive README\n\n"
35
+ "`archive/` stores inactive projects by archive date.\n\n"
36
+ "## Structure\n\n"
37
+ "```text\narchive/\n README.md\n YYYY-MM-DD/\n <project-name>/\n```\n\n"
38
+ "Move inactive projects into `archive/YYYY-MM-DD/` and summarize them in the workspace root `ARCHIVE.md`.\n"
39
+ )
40
+ return (
41
+ "# Archive README\n\n"
42
+ "`archive/` 是 Playground 的历史日志区,按归档日期保存已不活跃的 project。\n\n"
43
+ "## 目录结构\n\n"
44
+ "```text\narchive/\n README.md\n YYYY-MM-DD/\n <project-name>/\n```\n\n"
45
+ "每次归档时,把 project 移到 `archive/YYYY-MM-DD/`,并在 workspace 根目录 `ARCHIVE.md` 中补归档摘要。\n"
46
+ )
47
+
48
+
49
+ def render_archive_md(language: str) -> str:
50
+ if language == "en":
51
+ return "# Archive\n\nRecord archived project summaries in reverse chronological order.\n"
52
+ return (
53
+ "# Archive\n\n"
54
+ "按日期倒序记录归档项目摘要。每个项目都说明“这是做什么的”和“本轮做了什么”。更具体的维护规则见 `archive/README.md`。\n"
55
+ )
56
+
57
+
58
+ def render_todo_md(language: str) -> str:
59
+ if language == "en":
60
+ return "# TODO\n\nNear-term plans for this workspace.\n"
61
+ return "# TODO\n\n这里记录这个 workspace 近期打算做的事。\n"
62
+
63
+
64
+ def render_scripts_readme(language: str) -> str:
65
+ if language == "en":
66
+ return (
67
+ "# Scripts\n\n"
68
+ "Workspace-level maintenance scripts live here. Keep task-specific scripts inside the relevant project.\n"
69
+ )
70
+ return (
71
+ "# Scripts\n\n"
72
+ "这里放 workspace 级维护脚本。\n\n"
73
+ "约定:\n"
74
+ "- 只放跨 project 复用的维护脚本\n"
75
+ "- 不要在 workspace 顶层散放脚本或临时文件\n"
76
+ "- 业务任务相关脚本,优先放在对应 project 内部\n"
77
+ )
78
+
79
+
80
+ def render_workspace_maintenance_skill() -> tuple[str, str]:
81
+ skill_md = (
82
+ "---\n"
83
+ "name: workspace-maintenance\n"
84
+ "description: Maintain the outer workspace structure. Use for project cleanup, archive review, root protocol alignment, and moving files into the proper workspace-level locations.\n"
85
+ "version: 0.2.2\n"
86
+ "---\n\n"
87
+ "# Workspace Maintenance\n\n"
88
+ "Use this skill when maintaining the outer workspace rather than editing a source repository.\n\n"
89
+ "- keep active work under `projects/` and archive inactive work into `archive/YYYY-MM-DD/`\n"
90
+ "- update `ARCHIVE.md` when projects are archived or restored\n"
91
+ "- keep workspace-level scripts under `scripts/`\n"
92
+ "- prefer moving files into the nearest `.trash/` instead of deleting them directly\n"
93
+ "- keep root protocol files (`AGENTS.md`, `ARCHIVE.md`, `TODO.md`) aligned with the real workspace structure\n"
94
+ )
95
+ skill_zh = (
96
+ "---\n"
97
+ "name: workspace-maintenance\n"
98
+ "description: 维护 workspace 外层协作结构。适用于整理活跃项目、归档旧项目、对齐根协议文件,以及把文件移动到正确的 workspace 级目录。\n"
99
+ "version: 0.2.2\n"
100
+ "---\n\n"
101
+ "# Workspace Maintenance(中文)\n\n"
102
+ "用于维护 workspace 外层结构,而不是直接修改源码仓库。\n\n"
103
+ "- 活跃工作保留在 `projects/`,不活跃项目归档到 `archive/YYYY-MM-DD/`\n"
104
+ "- 发生归档或恢复时同步更新 `ARCHIVE.md`\n"
105
+ "- workspace 级维护脚本统一放到 `scripts/`\n"
106
+ "- 删除前优先移动到就近的 `.trash/`,不要直接删除\n"
107
+ "- 保持根协议文件(`AGENTS.md`、`ARCHIVE.md`、`TODO.md`)与真实结构一致\n"
108
+ )
109
+ return skill_md, skill_zh
110
+
111
+
112
+ def render_public_readme(language: str) -> str:
113
+ if language == "en":
114
+ return "# Public\n\nThis directory is used for deploying public-facing websites and related publish artifacts.\n"
115
+ return "# Public\n\n这个目录用于部署公开网站及相关发布产物。\n"
116
+
117
+
118
+ def render_agents_md(
119
+ workspace_dir: Path,
120
+ profile: WorkspaceProfile,
121
+ language: str,
122
+ enabled_options: list[str],
123
+ ) -> str:
124
+ options_text = ", ".join(enabled_options) if enabled_options else "none"
125
+ return _render_text_template(language, "AGENTS.md", ENABLED_OPTIONS=options_text)
126
+
127
+
128
+ def base_file_map(
129
+ workspace_dir: Path,
130
+ profile: WorkspaceProfile,
131
+ language: str,
132
+ enabled_options: list[str],
133
+ *,
134
+ existing_workspace: bool,
135
+ helper_agents_path: str | None = None,
136
+ helper_identity_path: str | None = None,
137
+ ) -> dict[str, str]:
138
+ file_map = {
139
+ "TODO.md": render_todo_md(language),
140
+ "ARCHIVE.md": render_archive_md(language),
141
+ "projects/README.md": render_projects_readme(language),
142
+ "archive/README.md": render_archive_readme(language),
143
+ "scripts/README.md": render_scripts_readme(language),
144
+ "public/README.md": render_public_readme(language),
145
+ }
146
+ skill_md, skill_zh = render_workspace_maintenance_skill()
147
+ file_map["skills/workspace-maintenance/SKILL.md"] = skill_md
148
+ file_map["skills/workspace-maintenance/SKILL.zh.md"] = skill_zh
149
+ agents_content = render_agents_md(workspace_dir, profile, language, enabled_options)
150
+ if helper_agents_path:
151
+ file_map[helper_agents_path] = agents_content
152
+ else:
153
+ file_map["AGENTS.md"] = agents_content
154
+ file_map.update(profile.extra_files(workspace_dir))
155
+ return file_map
@@ -0,0 +1,78 @@
1
+ # Workspace Agents
2
+
3
+ `AGENTS.md` is the entry guide when a model enters this workspace.
4
+
5
+ ## Core Principles
6
+
7
+ - Keep only a small set of control files at workspace root; actual execution should happen inside the target project directory.
8
+ - Keep all active work under `projects/`; archive inactive projects into `archive/YYYY-MM-DD/`.
9
+ - Project structure should stay minimal by default, while naming still allows more flexible grouping.
10
+ - `PRD.md` records stable requirements, scope, constraints, and completion criteria; progress details belong in `progress.md`.
11
+ - `progress.md` is the continuity log for each task. Update it after each substantive action.
12
+ - Archiving should not be decided by scripts alone. Scripts can collect candidates and validate rules, but the final archive summary should be reviewed and written into `ARCHIVE.md` by the model.
13
+ - If requirements are unclear, ask follow-up questions before execution.
14
+
15
+ See `projects/README.md` for concrete project structures and naming rules.
16
+
17
+ ## Architecture
18
+
19
+ ```text
20
+ Workspace/
21
+ AGENTS.md
22
+ TODO.md
23
+ ARCHIVE.md
24
+ .trash/
25
+ projects/
26
+ archive/
27
+ YYYY-MM-DD/
28
+ core/
29
+ scripts/
30
+ skills/
31
+ public/
32
+ ```
33
+
34
+ This workspace is an outer collaboration scaffold around source repositories.
35
+
36
+ ## Current Options
37
+
38
+ - Enabled options: `archive/`, `ARCHIVE.md`
39
+ - Source repositories go under `core/`
40
+ - Workspace maintenance scripts go under `scripts/`
41
+ - The workspace root keeps a `.trash/` directory; prefer moving files there before deleting them directly
42
+ - Imported shared skills go under `skills/`
43
+ - Public publish output goes under `public/`
44
+ - Archived projects go under `archive/YYYY-MM-DD/`
45
+
46
+ ## Workflow
47
+
48
+ 1. Read root `AGENTS.md`, then enter the target project.
49
+ 2. Identify the repo to change under `core/` and the target project under `projects/`.
50
+ 3. Create or refine `PRD.md` before execution.
51
+ 4. Update the current project's `progress.md` after each substantive action.
52
+ 5. Keep drafts, experiments, and local references inside the current project and place them into the matching subdirectories.
53
+ 6. Do not write debug temp files into `/tmp`; use the current project's `playground/`.
54
+ 7. Keep the project root minimal: control files at the root, reports under `reports/`, scripts under `scripts/`.
55
+ 8. If you use `projects/<topic>/<name>/`, keep `projects/<topic>/` as an index layer with only `README.md`, `.trash/`, and child project directories.
56
+ 9. Use `MM-DD-...` for new execution tasks by default; only clearly long-lived stable subprojects should omit the date prefix.
57
+ 10. Prefer `.trash/` at both workspace and project level; move files there before irreversible deletion.
58
+ 11. If a project needs a shorter repo path, create an on-demand symlink to `core/<repo-name>` instead of copying the repository.
59
+ 12. Finish with a report; if archiving happens, update `ARCHIVE.md`.
60
+ 13. Follow an archive flow of “script candidate collection + model review + `ARCHIVE.md` update”.
61
+
62
+ ## Write Rules
63
+
64
+ | Situation | Write To |
65
+ |-----------|----------|
66
+ | Any active work unit | `projects/<name>/` or `projects/<topic>/<name>/` |
67
+ | Short-term project | Prefer `MM-DD-<project-name>` |
68
+ | Long-lived project | Use a stable name without a date prefix |
69
+ | Inactive old project | `archive/YYYY-MM-DD/<project-name>/` |
70
+ | Archive summary | `ARCHIVE.md` |
71
+ | Repositories to change | `core/<repo-name>/` |
72
+ | Workspace maintenance scripts | `scripts/<name>.py` |
73
+
74
+ ## Conventions
75
+
76
+ - Stay within the current task boundary unless the task is explicitly expanded.
77
+ - State uncertainty explicitly instead of silently assuming.
78
+ - Do not scatter standalone scripts or temp files at the workspace root; place durable scripts under `scripts/`.
@@ -0,0 +1,113 @@
1
+ # Projects
2
+
3
+ This directory contains all active work. Each project should be self-contained enough that execution can happen mostly inside that project directory.
4
+
5
+ ## When to create a new project
6
+
7
+ Create a new project when the work has its own goal, context, and deliverables. Examples:
8
+
9
+ - a research task
10
+ - a one-off implementation
11
+ - a bugfix stream
12
+ - a larger initiative that may later split into multiple tasks
13
+
14
+ ## Naming and Grouping
15
+
16
+ Use a date prefix for short-term projects by default:
17
+
18
+ ```text
19
+ MM-DD-<project-name>
20
+ ```
21
+
22
+ The structure may also group work by topic:
23
+
24
+ ```text
25
+ projects/<topic>/<name>/
26
+ ```
27
+
28
+ Examples:
29
+
30
+ ```text
31
+ projects/agent-collab/05-25-feishu-links/
32
+ projects/chatrss/05-25-auth-debug/
33
+ ```
34
+
35
+ Recommended rules:
36
+ - short-term one-off work: prefer `MM-DD-<project-name>`
37
+ - recurring work in one theme: group under `projects/<topic>/<name>/`
38
+ - long-lived projects: use a stable name without a date prefix
39
+
40
+ ## Topic Directory Rules
41
+
42
+ When multiple tasks live under the same theme, prefer:
43
+
44
+ ```text
45
+ projects/<topic>/<name>/
46
+ ```
47
+
48
+ Guidelines:
49
+ - `topic/` is an index layer for an ongoing theme or domain, such as `agent-collab/`, `chatrss/`, or `feishu/`
50
+ - keep `topic/` minimal; usually only `README.md`, `.trash/`, and child project directories belong there
51
+ - `<name>/` is the actual execution unit
52
+ - new tasks under a topic should still use a date prefix by default
53
+ - only clearly long-lived subprojects should use a stable name
54
+
55
+ Avoid:
56
+ - grouping when a single flat `projects/MM-DD-<project-name>/` directory is enough
57
+ - deep topic nesting; usually `projects/<topic>/<name>/` is enough
58
+ - using the topic directory itself as an execution unit
59
+ - placing `reports/`, `playground/`, `reference/`, or task directories without a date prefix directly under `projects/<topic>/`
60
+
61
+ ## Default Project Shape
62
+
63
+ Start minimal and grow only when the task needs it:
64
+
65
+ ```text
66
+ <project-root>/
67
+ PRD.md
68
+ progress.md
69
+ memory.md
70
+ .trash/
71
+ reports/
72
+ scripts/
73
+ playground/
74
+ reference/
75
+ ```
76
+
77
+ Notes:
78
+ - `PRD.md`, `progress.md`, and `memory.md` are the control files kept at project root
79
+ - `.trash/` is the project-local soft-delete buffer; prefer moving files there before deleting them
80
+ - other artifacts should go into the matching subdirectories instead of cluttering project root
81
+ - `reports/`, `scripts/`, and similar directories are created on demand
82
+
83
+ ## File Roles
84
+
85
+ - `PRD.md`: requirements, scope, constraints, expected deliverables, completion criteria
86
+ - `progress.md`: current status, key decisions, next steps; update it after each substantive action
87
+ - `memory.md`: local context, important files, working notes
88
+ - `reports/`: reports, summaries, staged outputs; use task-specific filenames instead of a generic `report.md`
89
+ - `scripts/`: project-local scripts; use purpose-driven names instead of `temp.py` or `run.sh`
90
+ - `playground/`: drafts, experiments, intermediate outputs, and debug temp files; do not write these into `/tmp`
91
+ - `reference/`: project-local references and examples
92
+ - `.trash/`: project-local soft-delete buffer; move files here before permanent deletion
93
+
94
+ Notes:
95
+ - `PRD.md` is the primary entry file
96
+ - `progress.md` is the continuity log for the task and should stay current
97
+ - `memory.md` adds local supporting context
98
+ - keep project root minimal instead of scattering reports, scripts, temp output, and miscellaneous files there
99
+ - prefer moving files into workspace or project `.trash/` instead of deleting them directly
100
+
101
+ ## Archiving
102
+
103
+ - `projects/` keeps active or recently active work
104
+ - move clearly inactive projects into `../archive/YYYY-MM-DD/`
105
+ - write archive summaries into workspace root `../ARCHIVE.md`
106
+ - archive by moving directories, not by deleting content
107
+ - use “script candidate collection + model review” instead of blind script-only archiving
108
+
109
+ ## Repository Access
110
+
111
+ - real source repositories stay under `core/`
112
+ - if a project needs a shorter path, create an on-demand symlink inside the project, for example `ln -s /path/to/ChatTool ./ChatTool`
113
+ - this symlink is optional and should not be generated by default
@@ -0,0 +1,78 @@
1
+ # Workspace Agents
2
+
3
+ `AGENTS.md` 是模型进入这个 workspace 后的入口说明。
4
+
5
+ ## 核心原则
6
+
7
+ - 外层根目录只保留少量总控文件;真正执行任务时,应进入对应 project 目录埋头推进。
8
+ - 所有实际工作统一放到 `projects/` 下;过时项目归档到 `archive/YYYY-MM-DD/`。
9
+ - project 目录结构默认保持最小化,但命名规则允许更灵活的分组方式。
10
+ - `PRD.md` 只记录稳定需求、范围、约束和完成标准;进展细节写入 `progress.md`。
11
+ - `progress.md` 是任务连续性的主日志。每次完成实质动作后,都应及时更新。
12
+ - 归档不应仅靠纯脚本决定。脚本适合做候选收集和规则检查,最终归档摘要应由模型审查候选内容后写入 `ARCHIVE.md`。
13
+ - 需求不清晰时,先补问题,再执行。
14
+
15
+ 具体的 project 目录结构与命名规则,统一看 `projects/README.md`。
16
+
17
+ ## 架构
18
+
19
+ ```text
20
+ Workspace/
21
+ AGENTS.md
22
+ TODO.md
23
+ ARCHIVE.md
24
+ .trash/
25
+ projects/
26
+ archive/
27
+ YYYY-MM-DD/
28
+ core/
29
+ scripts/
30
+ skills/
31
+ public/
32
+ ```
33
+
34
+ 这个 workspace 是包裹源码仓库的一层协作脚手架,协作痕迹尽量留在外层。
35
+
36
+ ## 当前配置项
37
+
38
+ - 已启用项:`archive/`、`ARCHIVE.md`
39
+ - 需要修改的源码仓库放到 `core/`
40
+ - 维护脚本统一放到 `scripts/`
41
+ - workspace 根目录维护一个 `.trash/`,需要删除或清理文件时,默认优先移动到 `.trash/`
42
+ - 导入的共享 skills 放到 `skills/`
43
+ - 对外发布产物放到 `public/`
44
+ - 归档项目放到 `archive/YYYY-MM-DD/`
45
+
46
+ ## 工作流
47
+
48
+ 1. 先读当前根目录 `AGENTS.md`,再进入目标 project。
49
+ 2. 识别当前要改的仓库到 `core/`,并进入目标 project。
50
+ 3. 先补齐 `PRD.md`,再开始执行。
51
+ 4. 每次完成实质动作后,及时更新当前 project 的 `progress.md`。
52
+ 5. 草稿、实验和局部参考都放在当前 project 内部,并优先进入匹配职责的子目录。
53
+ 6. 项目调试临时文件不要写到 `/tmp`;默认写到当前 project 的 `playground/`。
54
+ 7. project 根目录默认只保留 `PRD.md`、`progress.md`、`memory.md` 等控制文件;报告放 `reports/`,脚本放 `scripts/`。
55
+ 8. 若使用 `projects/<topic>/<name>/` 主题分组结构,则 `projects/<topic>/` 根目录只作为索引层,默认只保留 `README.md`、`.trash/` 与子项目目录。
56
+ 9. 新建执行任务默认使用 `MM-DD-...` 日期前缀;只有明确的长期稳定子项目才可不带日期前缀。
57
+ 10. workspace 和 project 级别都应优先准备 `.trash/`;需要删除文件时,默认先移动到就近的 `.trash/`,而不是直接 `rm`。
58
+ 11. 如需从 project 根目录直接访问源码仓库,可按需手动创建到 `core/<repo-name>` 的符号链接,但不要复制仓库。
59
+ 12. 收尾时完成汇报;如有归档动作,同步更新 `ARCHIVE.md`。
60
+ 13. 归档流程采用“脚本收集候选 + 模型审查 + 更新 `ARCHIVE.md`”的方式。
61
+
62
+ ## 写入规则
63
+
64
+ | 情况 | 写入位置 |
65
+ |-----------|----------|
66
+ | 任意实际工作单元 | `projects/<name>/` 或 `projects/<topic>/<name>/` |
67
+ | 短期 project | 推荐 `MM-DD-<project-name>` |
68
+ | 长期 project | 可直接使用稳定名称,不加日期前缀 |
69
+ | 已不活跃的旧 project | `archive/YYYY-MM-DD/<project-name>/` |
70
+ | 归档摘要 | `ARCHIVE.md` |
71
+ | 需要修改的源码仓库 | `core/<repo-name>/` |
72
+ | workspace 维护脚本 | `scripts/<name>.py` |
73
+
74
+ ## 约定
75
+
76
+ - 不要超出当前任务边界;如需扩展,先说明或单独开任务。
77
+ - 不确定时要显式说明,不要默默假设。
78
+ - 避免在 workspace 顶层新增零散脚本或临时文件;需要保留的脚本统一放入 `scripts/`。