feat(workspace): make workspace location configurable via env var
- Add MYCLAUDE_WORKSPACE_ROOT env var, default ~/workspace - Auto-create workspace directory if it does not exist - Move workspace/CLAUDE.md + .gitignore to workspace_template/ - Remove hardcoded symlink paths from workspace template - Update get_workspace_root() with env-var priority logic - Update metabot bots.json defaultWorkingDirectory to ~/workspace
This commit is contained in:
@@ -42,16 +42,22 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
myclaude/
|
myclaude/
|
||||||
├── myclaude/ # Python 源码
|
├── myclaude/ # Python 源码
|
||||||
│ ├── cli.py # CLI entrypoint
|
│ ├── cli.py # CLI entrypoint
|
||||||
│ ├── commands/ # 子命令
|
│ ├── commands/ # 子命令
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── workspace/ # 主工作环境 (默认 --cwd 目标)
|
├── workspace_template/ # workspace 模板 (CLAUDE.md, .gitignore)
|
||||||
│ └── CLAUDE.md # 日常工作指令
|
└── .claude/ # Claude Code 运行时配置
|
||||||
└── .claude/ # Claude Code 运行时配置
|
|
||||||
|
workspace/ # 主工作环境 (默认 --cwd 目标, 独立目录)
|
||||||
|
├── CLAUDE.md # 日常工作指令
|
||||||
|
├── myacademia -> ... # 符号链接
|
||||||
|
├── myslides -> ...
|
||||||
|
└── tmp/ # 临时文件
|
||||||
```
|
```
|
||||||
|
|
||||||
默认运行 `myclaude`(不带 --cwd)时,cwd 为 `workspace/`,指向工作区 CLAUDE.md。
|
默认运行 `myclaude`(不带 --cwd)时,cwd 为 `MYCLAUDE_WORKSPACE_ROOT`
|
||||||
|
(默认 `~/workspace`),指向独立工作区 CLAUDE.md。
|
||||||
开发 CLI 时运行 `myclaude --cwd .` 以读取本文件。
|
开发 CLI 时运行 `myclaude --cwd .` 以读取本文件。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
+2
-13
@@ -10,7 +10,7 @@ import click
|
|||||||
from rich.console import Console
|
from rich.console import Console
|
||||||
|
|
||||||
from myclaude.commands import update_cmd, upgrade_cmd
|
from myclaude.commands import update_cmd, upgrade_cmd
|
||||||
from myclaude.project_root import get_myclaude_project_root
|
from myclaude.project_root import get_workspace_root
|
||||||
|
|
||||||
stderr_console = Console(stderr=True)
|
stderr_console = Console(stderr=True)
|
||||||
|
|
||||||
@@ -23,18 +23,7 @@ def _package_version() -> str:
|
|||||||
|
|
||||||
|
|
||||||
def _resolve_chat_cwd() -> Path:
|
def _resolve_chat_cwd() -> Path:
|
||||||
root = get_myclaude_project_root()
|
return get_workspace_root()
|
||||||
fallback = Path.home() / ".myclaude"
|
|
||||||
if root == fallback:
|
|
||||||
stderr_console.print(
|
|
||||||
"[red]Cannot resolve myclaude project root.[/red] Run from the repo or set "
|
|
||||||
"[cyan]MYCLAUDE_PROJECT_ROOT[/cyan].",
|
|
||||||
)
|
|
||||||
raise SystemExit(1)
|
|
||||||
workspace = root / "workspace"
|
|
||||||
if workspace.is_dir():
|
|
||||||
return workspace
|
|
||||||
return root
|
|
||||||
|
|
||||||
|
|
||||||
@click.group(
|
@click.group(
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""Resolve myclaude repository root for make / editable install flows."""
|
"""Resolve myclaude repository and workspace roots."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -54,3 +54,25 @@ def get_myclaude_project_root() -> Path:
|
|||||||
here = here.parent
|
here = here.parent
|
||||||
|
|
||||||
return Path.home() / ".myclaude"
|
return Path.home() / ".myclaude"
|
||||||
|
|
||||||
|
|
||||||
|
def get_workspace_root() -> Path:
|
||||||
|
"""
|
||||||
|
Root of the myclaude workspace directory.
|
||||||
|
|
||||||
|
Order: MYCLAUDE_WORKSPACE_ROOT > project_root/workspace/ > ~/workspace
|
||||||
|
Creates the directory if it does not exist.
|
||||||
|
"""
|
||||||
|
env_root = os.environ.get("MYCLAUDE_WORKSPACE_ROOT")
|
||||||
|
if env_root:
|
||||||
|
root = Path(env_root).expanduser().resolve()
|
||||||
|
else:
|
||||||
|
project_root = get_myclaude_project_root()
|
||||||
|
project_workspace = project_root / "workspace"
|
||||||
|
if project_workspace.is_dir():
|
||||||
|
root = project_workspace
|
||||||
|
else:
|
||||||
|
root = Path.home() / "workspace"
|
||||||
|
|
||||||
|
root.mkdir(parents=True, exist_ok=True)
|
||||||
|
return root
|
||||||
|
|||||||
@@ -46,23 +46,24 @@
|
|||||||
```
|
```
|
||||||
workspace/
|
workspace/
|
||||||
├── .obsidian/ # Obsidian 配置
|
├── .obsidian/ # Obsidian 配置
|
||||||
├── myacademia -> ... # → Obsidian/iCloud 知识库
|
├── myacademia -> ... # → Obsidian/iCloud 知识库 (符号链接)
|
||||||
├── myagent -> ... # → myagent 项目
|
├── myagent -> ... # → myagent 项目 (符号链接)
|
||||||
├── mydesktop -> ... # → Obsidian/iCloud 过程/共享文件
|
├── mydesktop -> ... # → Obsidian/iCloud 过程/共享文件 (符号链接)
|
||||||
├── myslides -> ... # → Slidev 幻灯片
|
├── myslides -> ... # → Slidev 幻灯片 (符号链接)
|
||||||
├── mytoolkit -> ... # → 个人 CLI 工具集
|
├── mytoolkit -> ... # → 个人 CLI 工具集 (符号链接)
|
||||||
├── mywebpage -> ... # → Docusaurus 网站
|
├── mywebpage -> ... # → Docusaurus 网站 (符号链接)
|
||||||
├── scripts/ # 实用脚本
|
├── scripts/ # 实用脚本
|
||||||
└── tmp/ # 临时文件
|
└── tmp/ # 临时文件
|
||||||
```
|
```
|
||||||
|
|
||||||
**符号链接目标**:
|
**符号链接配置**:
|
||||||
- `myacademia` → `~/Library/Mobile Documents/iCloud~md~obsidian/Documents/myacademia`
|
根据实际环境创建符号链接,目标路径因人而异。例如:
|
||||||
- `mydesktop` → `~/Library/Mobile Documents/iCloud~md~obsidian/Documents/mydesktop`
|
- `myacademia` → Obsidian/iCloud 知识库路径
|
||||||
- `myagent` → `~/Documents/myResearch/myProjects/apaam/repo/myagent`
|
- `mydesktop` → Obsidian/iCloud 过程文件路径
|
||||||
- `myslides` → `~/Documents/myWork/sysu/4_成果归档/myslides`
|
- `myagent` → myagent 项目路径
|
||||||
- `mytoolkit` → `~/Documents/MyBin/mytoolkit`
|
- `myslides` → Slidev 幻灯片路径
|
||||||
- `mywebpage` → `~/Documents/myWork/sysu/4_成果归档/mywebpage`
|
- `mytoolkit` → 个人 CLI 工具集路径
|
||||||
|
- `mywebpage` → Docusaurus 网站路径
|
||||||
|
|
||||||
**重要路径**:
|
**重要路径**:
|
||||||
- `myacademia/` - Obsidian 知识库
|
- `myacademia/` - Obsidian 知识库
|
||||||
Reference in New Issue
Block a user