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.
- {chattool-7.0.0/src/chattool.egg-info → chattool-7.0.2}/PKG-INFO +1 -1
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/__init__.py +1 -1
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/elements.py +0 -9
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/cli.py +1 -17
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/core.py +3 -6
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/options.py +0 -21
- chattool-7.0.2/src/chattool/setup/workspace/render.py +155 -0
- chattool-7.0.2/src/chattool/setup/workspace/templates/default/en/AGENTS.md +78 -0
- chattool-7.0.2/src/chattool/setup/workspace/templates/default/en/projects/README.md +113 -0
- chattool-7.0.2/src/chattool/setup/workspace/templates/default/zh/AGENTS.md +78 -0
- chattool-7.0.2/src/chattool/setup/workspace/templates/default/zh/projects/README.md +121 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/main.py +36 -23
- {chattool-7.0.0 → chattool-7.0.2/src/chattool.egg-info}/PKG-INFO +1 -1
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/SOURCES.txt +0 -12
- chattool-7.0.0/src/chattool/setup/workspace/render.py +0 -179
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/AGENTS.md +0 -69
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/MEMORY.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/README.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/en/projects/README.md +0 -72
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/AGENTS.md +0 -69
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/MEMORY.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/README.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/default/zh/projects/README.md +0 -74
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/AGENTS.md +0 -69
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/MEMORY.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/README.md +0 -17
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/en/projects/README.md +0 -84
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/AGENTS.md +0 -70
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/MEMORY.md +0 -13
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/README.md +0 -17
- chattool-7.0.0/src/chattool/setup/workspace/templates/opencode-loop/zh/projects/README.md +0 -90
- {chattool-7.0.0 → chattool-7.0.2}/LICENSE +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/MANIFEST.in +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/README.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/pyproject.toml +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/scripts/migrate_chattool_envs_to_chatarch.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/setup.cfg +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/_all.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/cert_client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/main.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/client/svg2gif_client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/aliyun.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/azure.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/base.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/browser.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/crs.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/elements.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/feishu.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/github.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/huggingface.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/liblib.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/openai.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/pollinations.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/siliconflow.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/skills.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tencent.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tongyi.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/tplink.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/config/zulip.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/const.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/elements.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/docker/main.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/daily.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/harvest.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/models.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/presets.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/arxiv/query.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/github/models.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/explore/wordpress/models.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/command_schema.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/policy.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/interaction/warnings.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/chattype.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/llm/response.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/catalog.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/mcp/server.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/capture.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/cert_server.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/lark_serve.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/serve/svg2gif.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/alias.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/hermes/install.sh +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/nvm.sh +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/README.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-help.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-project.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-status.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop-stop.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/commands/chatloop.md +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/plugins/chatloop/index.ts +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/assets/opencode_chatloop/plugins/chatloop/package.json +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/cc_connect.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/chrome.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/claude.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/codex.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/docker.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/frp.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/hermes.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/lark_cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/mode_prompt.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/nodejs.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/opencode.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/opencode_chatloop.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/workspace.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/setup/zsh.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/interaction.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/platforms.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/skill/validation.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/base.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/playwright_impl.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/selenium.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_browser.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_module.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/test_remote.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/browser/xhs_qrcode.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cc/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cc/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/acme_dns_tiny.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cert_server.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cert_updater.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/cert/email.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/api.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/crs/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/aliyun.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/base.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/domain_utils.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/ip_updater.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/mcp.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/tencent.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/dns/utils.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/api.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/commands.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/render.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/github/requests.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/base.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/helpers.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/huggingface.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/liblib.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/pollinations.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/siliconflow.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/image/tongyi.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/interact.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/bot.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/context.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/docx_blocks.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/elements.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/markdown_blocks.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/lark/session.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/link_check.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/mcp.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/scanner.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/network/service_urls.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/nginx/templates.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/pypi/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/tplogin.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/tplogin_cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/cli.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/client.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/legacy.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/tools/zulip/mcp.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/__init__.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/basic.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/custom_logger.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/fastobj.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/httpclient.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/pathing.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/test_helpers.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool/utils/urltool.py +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/dependency_links.txt +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/entry_points.txt +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/requires.txt +0 -0
- {chattool-7.0.0 → chattool-7.0.2}/src/chattool.egg-info/top_level.txt +0 -0
|
@@ -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
|
|
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
|
-
"
|
|
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/`。
|