fix: 修复项目定位逻辑,支持在任意位置创建小说项目

- 移除 project_locator.py 中硬编码的默认目录名 (noma-project)
- 更新文档明确说明项目可以在任意位置创建
- 修复 FIXES.md 中的硬编码路径示例
- 新增 CHANGELOG.md 记录变更历史
This commit is contained in:
2026-06-24 04:18:48 +08:00
parent ea8f6066c4
commit 63da7e2d3c
4 changed files with 62 additions and 17 deletions
+41
View File
@@ -0,0 +1,41 @@
# CHANGELOG
## [Unreleased]
### Fixed
- **项目定位逻辑修复**:移除 `project_locator.py` 中硬编码的默认项目目录名 (`noma-project`)
- 修改 `DEFAULT_PROJECT_DIR_NAMES``("noma-project",)` 改为 `()`
- 现在支持在任意位置创建小说项目,不再限制在特定目录
- 影响范围:`resolve_project_root()` 函数的查找逻辑
- 影响范围:`_candidate_roots()` 函数不再自动添加 `noma-project/` 子目录
- **文档更新**:更新相关文档,明确说明项目可以在任意位置创建
- 更新 `docs/operations.md`:添加"重要说明"章节,明确项目可以在任意位置创建
- 更新 `FIXES.md`:将硬编码路径示例改为通用路径(使用 `/path/to/your/novel-project` 或相对路径)
- 更新 `FIXES.md`:将 PowerShell 示例改为 Bash 示例,提高跨平台兼容性
### Impact
- Agent 不再强制建议在 NovelMaster 目录下创建项目
- 用户可以在任何有权限的目录中创建小说项目
- 提高了系统的灵活性和可用性
- 文档示例更加通用,不会误导 agent
### Technical Details
修改文件:
1. `noma/scripts/project_locator.py`
- 第24行:清空 `DEFAULT_PROJECT_DIR_NAMES` 元组
- 第29行:更新注释,说明全局注册表路径的用途
2. `noma/docs/operations.md`
- 新增"重要说明"章节(第3-8行)
- 明确说明项目可以在任意位置创建
3. `noma/FIXES.md`
- 第119-134行:更新测试示例,使用通用路径和 Bash 语法
- 第174-185行:更新 Python 测试代码,使用相对路径
- 第201-204行:更新路径规范化测试示例
### Migration Guide
- 无需迁移,此修改为纯优化,不影响现有项目
- 现有项目仍然可以正常工作
- 新项目现在可以在任意位置创建
+13 -13
View File
@@ -116,21 +116,21 @@ noma/
### 1. 测试 update_state.py ### 1. 测试 update_state.py
```powershell ```bash
# 进入测试项目目录 # 进入测试项目目录(可以是任何位置)
cd e:\Project\NovelMaster\workspaces\homestory cd /path/to/your/novel-project
# 测试添加审查报告 # 测试添加审查报告
python ..\..\noma\scripts\update_state.py --project-root . add-review "1-5" "测试报告.md" python "${SCRIPTS_DIR}/update_state.py" --project-root . add-review "1-5" "测试报告.md"
# 测试更新实体 # 测试更新实体
python ..\..\noma\scripts\update_state.py --project-root . update-entity 角色 测试角色 '{"境界": "斗者"}' python "${SCRIPTS_DIR}/update_state.py" --project-root . update-entity 角色 测试角色 '{"境界": "斗者"}'
# 测试设置章节元数据 # 测试设置章节元数据
python ..\..\noma\scripts\update_state.py --project-root . set-chapter-meta 1 '{"word_count": 2000}' python "${SCRIPTS_DIR}/update_state.py" --project-root . set-chapter-meta 1 '{"word_count": 2000}'
# 测试设置进度 # 测试设置进度
python ..\..\noma\scripts\update_state.py --project-root . set-progress --current-chapter 5 python "${SCRIPTS_DIR}/update_state.py" --project-root . set-progress --current-chapter 5
``` ```
预期输出: 预期输出:
@@ -171,7 +171,7 @@ ledger_data = {
] ]
} }
ledger_path = Path("e:/Project/NovelMaster/workspaces/homestory/.noma/novel_data/ledger.json") ledger_path = Path("./.noma/novel_data/ledger.json")
ledger_path.parent.mkdir(parents=True, exist_ok=True) ledger_path.parent.mkdir(parents=True, exist_ok=True)
with open(ledger_path, 'w', encoding='utf-8') as f: with open(ledger_path, 'w', encoding='utf-8') as f:
json.dump(ledger_data, f, ensure_ascii=False, indent=2) json.dump(ledger_data, f, ensure_ascii=False, indent=2)
@@ -180,8 +180,8 @@ with open(ledger_path, 'w', encoding='utf-8') as f:
from agents.catchup_agent import CatchupAgent from agents.catchup_agent import CatchupAgent
agent = CatchupAgent( agent = CatchupAgent(
project_root="e:/Project/NovelMaster/workspaces/homestory", project_root=".", # 当前目录或任何项目路径
storage_path="../noma/novel_data/" storage_path=".noma/novel_data/"
) )
dirty_flags = agent._check_dirty_flags("萧炎") dirty_flags = agent._check_dirty_flags("萧炎")
@@ -198,10 +198,10 @@ Dirty flags found: 1
### 3. 测试 extract-context ### 3. 测试 extract-context
```powershell ```bash
# 测试路径规范化 # 测试路径规范化
cd e:\Project\NovelMaster\workspaces\homestory cd /path/to/your/novel-project
python ..\..\noma\scripts\noma.py --project-root . extract-context --chapter 1 python "${SCRIPTS_DIR}/noma.py" --project-root . extract-context --chapter 1
``` ```
### 4. 安装依赖 ### 4. 安装依赖
+6 -2
View File
@@ -1,12 +1,16 @@
# 项目结构与运维 # 项目结构与运维
## 重要说明
**项目可以在任意位置创建**NovelMaster 是一个技能/工具,不限制项目创建位置。您可以在任何有权限的目录中创建小说项目。
## 目录层级(真实运行) ## 目录层级(真实运行)
在 Claude Code + Marketplace 安装下,至少有 4 层概念: 在 Claude Code + Marketplace 安装下,至少有 4 层概念:
1. `WORKSPACE_ROOT`Claude 工作区根,通常是 `${CLAUDE_PROJECT_DIR}` 1. `WORKSPACE_ROOT`Claude 工作区根,通常是 `${CLAUDE_PROJECT_DIR}`,可以是任意目录
2. `WORKSPACE_ROOT/.claude/`(工作区级指针与配置) 2. `WORKSPACE_ROOT/.claude/`(工作区级指针与配置)
3. `PROJECT_ROOT`(真实小说项目根,`/noma-init` 按书名创建) 3. `PROJECT_ROOT`(真实小说项目根,`/noma-init` 按书名创建,可在任意位置
4. `CLAUDE_PLUGIN_ROOT`(插件缓存目录,不在项目内) 4. `CLAUDE_PLUGIN_ROOT`(插件缓存目录,不在项目内)
### A) Workspace 目录(含 `.claude` ### A) Workspace 目录(含 `.claude`
+2 -2
View File
@@ -21,12 +21,12 @@ from typing import Iterable, Optional
from runtime_compat import normalize_windows_path from runtime_compat import normalize_windows_path
DEFAULT_PROJECT_DIR_NAMES: tuple[str, ...] = ("noma-project",) DEFAULT_PROJECT_DIR_NAMES: tuple[str, ...] = () # 不再硬编码默认目录名,支持任意位置创建项目
CURRENT_PROJECT_POINTER_REL: Path = Path(".claude") / ".noma-current-project" CURRENT_PROJECT_POINTER_REL: Path = Path(".claude") / ".noma-current-project"
# 用户级全局映射(当 skills/agents 安装在 ~/.claude 时,项目目录可能在任意盘符) # 用户级全局映射(当 skills/agents 安装在 ~/.claude 时,项目目录可能在任意盘符)
# 该文件用于在"空上下文 + CWD 不在项目内"的情况下仍能定位到正确 project_root。 # 该文件用于在"空上下文 + CWD 不在项目内"的情况下仍能定位到正确 project_root。
GLOBAL_REGISTRY_REL: Path = Path("novelmaster") / "workspaces.json" GLOBAL_REGISTRY_REL: Path = Path("novelmaster") / "workspaces.json" # 全局注册表路径,用于存储工作区到项目的映射
# Claude Code 常见环境变量(存在时优先作为"工作区根目录"提示) # Claude Code 常见环境变量(存在时优先作为"工作区根目录"提示)
ENV_CLAUDE_PROJECT_DIR = "CLAUDE_PROJECT_DIR" ENV_CLAUDE_PROJECT_DIR = "CLAUDE_PROJECT_DIR"