Просмотр исходного кода

fix: align evolve.ps1 git_pull logic with evolve.sh, document OS-specific usage

- evolve.ps1: git_pull now compiles all genre dirs with events/ (not just
  git-diff'd ones), matching .sh robustness on fresh clones
- SKILL.md / CLAUDE.md: document Windows/Linux/macOS script choice
  throughout -- evolve.sh for bash, evolve.ps1 for PowerShell

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
nonvioce 5 месяцев назад
Родитель
Сommit
bd5e931174
3 измененных файлов с 50 добавлено и 27 удалено
  1. 23 9
      CLAUDE.md
  2. 19 8
      SKILL.md
  3. 8 10
      scripts/evolve.ps1

+ 23 - 9
CLAUDE.md

@@ -10,13 +10,15 @@
 完全自包含,零外部依赖。内置 15 个中文题材配置文件。
 
 ```bash
-# 克隆仓库
+# Linux/macOS:克隆仓库
 git clone ssh://git@数学.top:10022/nonvioce/novel-skill.git ~/.claude/skills/novel-write
 
 # 或:如果已有本地项目,直接软链接
 ln -s /path/to/novel-skill ~/.claude/skills/novel-write
 ```
 
+Windows 用户将 `~/.claude/skills/novel-write` 替换为 `%USERPROFILE%\.claude\skills\novel-write`,软链接替换为 `mklink /D` 或直接克隆到该路径。
+
 安装后,在 Claude Code 对话中输入"写小说""开新书""续写第X章"等自动触发技能。
 
 ## 快速开始
@@ -66,13 +68,13 @@ target_words: 3000
 
 在 Claude Code 中直接说"写第33章",技能自动完成全部流程:
 
-1. `evolve.sh` → git pull 获取其他用户的最新进化数据 → 编译
+1. 进化脚本(`evolve.sh` / `evolve.ps1`,按操作系统选择)→ git pull 获取其他用户的最新进化数据 → 编译
 2. 读取项目铁律、大纲、细纲、钩子账本、情感矩阵
 3. 从 `evolution/genres/{genre_id}/` 加载该题材最优提示词 + 阈值
 4. 按六条铁律写作
-5. 写完后 `evolve.sh` → 反馈收集 → 进化 → git add + commit + push
+5. 写完后进化脚本 → 反馈收集 → 进化 → git add + commit + push
 
-**用户不需要输入任何 git 或进化命令。** 所有 git pull、git commit、git push 由 evolve.sh 自动完成。网络不通时自动降级为纯本地模式,不会报错中断。
+**用户不需要输入任何 git 或进化命令。** 所有 git pull、git commit、git push 由进化脚本自动完成。网络不通时自动降级为纯本地模式,不会报错中断。
 
 ## 进化系统
 
@@ -166,15 +168,17 @@ Git 仓库**只追踪事件文件**(`evolution/genres/*/events/*.json`)和 R
 
 两个设备在不同时间产生的进化数据,通过事件文件合并到同一题材种群中,互不覆盖。
 
-### 自动工作流(evolve.sh 全自动)
+### 自动工作流(进化脚本全自动)
+
+> **操作系统:** `evolve.sh` 用于 Linux/macOS (bash),`evolve.ps1` 用于 Windows (PowerShell)。两个脚本功能完全相同。
 
 ```bash
-# 写前:evolve.sh 自动执行
+# 写前:进化脚本自动执行
 #   → git pull(获取其他设备/用户的进化事件)
 #   → event_store.py compile(从事件重建 population/thresholds/current_best)
 #   → 加载最新最优提示词,开始写作
 
-# 写后:evolve.sh --project /path/to/novel 自动执行
+# 写后:进化脚本 --project /path/to/novel 自动执行
 #   → 收集反馈 → 分析质量 → 提示词进化
 #   → git add evolution/genres/*/events/(只推送事件文件)
 #   → git commit + git push
@@ -185,8 +189,10 @@ Git 仓库**只追踪事件文件**(`evolution/genres/*/events/*.json`)和 R
 ### 手动 compile(仅在自动流程失效时使用)
 
 ```bash
-# 对指定题材从事件重建所有编译产物
+# 从指定项目检测题材,重建所有编译产物
 bash scripts/evolve.sh --project /path/to/novel --compile
+# Windows PowerShell:
+# .\scripts\evolve.ps1 -Project /path/to/novel -Compile
 
 # 或直接指定题材
 python3 scripts/event_store.py compile --genre xianxia
@@ -247,13 +253,20 @@ python3 scripts/event_store.py list --genre xianxia
 
 ## 全部 CLI 命令
 
+> **操作系统:** `evolve.sh` 用于 Linux/macOS,`evolve.ps1` 用于 Windows PowerShell。功能完全相同,参数格式略有差异(`--flag` vs `-Flag`)。下面以 bash 为例:
+
 ```bash
 # === 进化编排 ===
 bash scripts/evolve.sh                                    # 快速进化(自动检测项目)
+# Windows: .\scripts\evolve.ps1
 bash scripts/evolve.sh --project /path/to/novel           # 指定项目
+# Windows: .\scripts\evolve.ps1 -Project /path/to/novel
 bash scripts/evolve.sh --project /path/to/novel --full    # 完整进化
+# Windows: .\scripts\evolve.ps1 -Project /path/to/novel -Full
 bash scripts/evolve.sh --project /path/to/novel --report  # 状态报告
+# Windows: .\scripts\evolve.ps1 -Project /path/to/novel -Report
 bash scripts/evolve.sh --project /path/to/novel --compile # 从事件重建
+# Windows: .\scripts\evolve.ps1 -Project /path/to/novel -Compile
 
 # === 提示词进化 ===
 python3 scripts/prompt_evolver.py evolve                      # 技能级进化
@@ -292,7 +305,8 @@ python3 scripts/pattern_mine.py mine --project /path/to/novel
 |------|------|
 | `SKILL.md` | 技能主文件,Claude Code 加载此文件获取写作指令 |
 | `CLAUDE.md` | 本文件,项目进度和使用说明 |
-| `scripts/evolve.sh` | 进化编排器入口,自动检测项目/题材 |
+| `scripts/evolve.sh` | 进化编排器入口 (Linux/macOS),自动检测项目/题材 |
+| `scripts/evolve.ps1` | 进化编排器入口 (Windows PowerShell),功能与 .sh 完全相同 |
 | `scripts/prompt_evolver.py` | 岛屿模型 + 遗传算法 + 早停 + 灭绝 |
 | `scripts/seed_extractor.py` | 内置15题材配置 → 5岛种子提取 |
 | `scripts/event_store.py` | 事件溯源引擎(编译/写入/列出事件) |

+ 19 - 8
SKILL.md

@@ -26,7 +26,9 @@ description: |
 不否定类型化——而是在类型框架中注入信息增量。开篇用熟悉感留住读者,关键节点用陌生走向制造惊喜。拒绝模板复制:每个角色的行为应该有只属于 ta 的动机,而非"这个类型就该这样写"。
 
 **铁律六:每次写作任务后自动进化。**
-每次完成续写/修改/质检/批量生成后,必须执行 `~/.claude/skills/novel-write/scripts/evolve.sh`(自动检测项目目录)。进化结果写入 `evolution/` 文件夹,不修改本 SKILL.md。本文件从 `evolution/` 读取最优提示词和阈值。连续写作 3 章以上无进化 → 警告提示。
+每次完成续写/修改/质检/批量生成后,必须执行进化脚本(自动检测项目目录)。进化结果写入 `evolution/` 文件夹,不修改本 SKILL.md。本文件从 `evolution/` 读取最优提示词和阈值。连续写作 3 章以上无进化 → 警告提示。
+
+> **操作系统差异:** Linux/macOS 执行 `~/.claude/skills/novel-write/scripts/evolve.sh`,Windows 执行 `~/.claude/skills/novel-write/scripts/evolve.ps1`。两个脚本功能完全相同。
 
 ---
 
@@ -1109,23 +1111,27 @@ Loop(最多 5 轮):
 
 ### 自动进化规则(铁律六)
 
-**写作前:** 自动执行 `~/.claude/skills/novel-write/scripts/evolve.sh`(不加参数即可)。evolve.sh 会自动 git pull 获取其他用户的最新进化数据并编译。这一步确保启动写作时进化数据是最新的。
+**写作前:** 自动执行进化脚本(不加参数即可)。脚本会自动 git pull 获取其他用户的最新进化数据并编译。这一步确保启动写作时进化数据是最新的。Linux/macOS 用 `evolve.sh`,Windows 用 `evolve.ps1`。
 
 **每次完成续写、修改、质检、批量生成后,自动执行:**
 
 ```bash
-~/.claude/skills/novel-write/scripts/evolve.sh   # 自动检测项目,进化 + git pull + git push
+# Linux/macOS
+~/.claude/skills/novel-write/scripts/evolve.sh
+
+# Windows (PowerShell)
+~\\.claude\\skills\\novel-write\\scripts\\evolve.ps1
 ```
 
-evolve.sh 现在包含完整的 git 集成:
+进化脚本包含完整的 git 集成:
 - 写前:`git pull` → 获取其他用户事件 → `event_store.py compile` 重建 population.json
 - 写后:进化完成 → `git add evolution/genres/` → `git commit` → `git push`
 - 网络不通时降级为纯本地进化,不会报错中断
 
-**用户完全无需手动操作 git 或进化命令。** Claude Code 在执行写作任务前后各调用一次 `~/.claude/skills/novel-write/scripts/evolve.sh` 即可。
+**用户完全无需手动操作 git 或进化命令。** Claude Code 在执行写作任务前后各调用一次进化脚本(`evolve.sh` / `evolve.ps1`,按操作系统选择)即可。
 
 - 连续写作 3 章以上无进化 → 警告
-- 每写完一卷(或每 10 章)→ 执行 `~/.claude/skills/novel-write/scripts/evolve.sh --full`
+- 每写完一卷(或每 10 章)→ 执行进化脚本的 `--full` 模式
 
 ### evolution/ 目录
 
@@ -1160,7 +1166,7 @@ evolution/                          # 进化输出(由脚本维护,勿手动
 ### 写作时如何使用进化数据
 
 **写前(Claude Code 自动执行):**
-1. 运行 `~/.claude/skills/novel-write/scripts/evolve.sh`(不加参数)→ 自动 git pull + 编译最新进化数据
+1. 运行进化脚本(`evolve.sh` / `evolve.ps1`,不加参数)→ 自动 git pull + 编译最新进化数据
 2. 读取当前项目的 `项目铁律.md` → 提取 `genre` 字段 → 映射到题材 ID
 3. 优先读 `evolution/genres/{genre_id}/prompts/current_best.json` 中的最优提示词
 4. 优先读 `evolution/genres/{genre_id}/thresholds.json` 中的题材特定阈值
@@ -1168,7 +1174,7 @@ evolution/                          # 进化输出(由脚本维护,勿手动
 6. 如题材目录不存在,回退到 `evolution/prompts/current_best.json`(技能级通用)
 
 **写后(Claude Code 自动执行):**
-7. 完成章节后执行 `~/.claude/skills/novel-write/scripts/evolve.sh --project {项目路径}`
+7. 完成章节后执行进化脚本 `--project {项目路径}` 参数
 8. 系统自动:收集反馈 → 分析质量 → 提示词进化 → 同步阈值 → git add + commit + push
 9. 其他用户下次写作时自动 git pull 获取本次进化结果
 
@@ -1205,6 +1211,7 @@ evolution/                          # 进化输出(由脚本维护,勿手动
 # 用户 A:写完章节,收集反馈,进化
 git pull origin main
 python3 ~/.claude/skills/novel-write/scripts/feedback_collector.py collect --project ... --chapter 33 --scores '{"P1":85,...}'
+# evolve.sh (Linux/macOS) 或 evolve.ps1 (Windows)
 bash ~/.claude/skills/novel-write/scripts/evolve.sh --project ... --full
 git add evolution/genres/other/events/
 git commit -m "evolve(other): ch33 feedback + mutation"
@@ -1220,8 +1227,12 @@ bash ~/.claude/skills/novel-write/scripts/evolve.sh --project ... --compile   #
 
 ### 手动命令
 
+> **操作系统:** `evolve.sh` 用于 Linux/macOS (bash),`evolve.ps1` 用于 Windows (PowerShell)。两个脚本功能完全相同,下面以 bash 为例:
+
 ```bash
 # 快速进化(写后自动调用的就是这个)
+#   Linux/macOS: ~/.claude/skills/novel-write/scripts/evolve.sh
+#   Windows:     ~\.claude\skills\novel-write\scripts\evolve.ps1
 ~/.claude/skills/novel-write/scripts/evolve.sh
 
 # 指定项目完整进化(自动检测题材)

+ 8 - 10
scripts/evolve.ps1

@@ -60,16 +60,14 @@ function Invoke-GitPull {
         git -C $SKILL_DIR pull --ff-only origin master 2>$null | Out-Null
         Write-Ok "git pull 完成"
 
-        # 有新数据 → 编译所有已变更题材的事件
-        $diffOutput = git -C $SKILL_DIR diff --name-only 'HEAD@{1}..HEAD' -- evolution/genres/ 2>$null
-        if ($diffOutput) {
-            $changedGenres = $diffOutput | ForEach-Object {
-                if ($_ -match 'evolution/genres/([^/]+)') { $matches[1] }
-            } | Sort-Object -Unique
-            foreach ($gid in $changedGenres) {
-                Write-Log "  编译题材: $gid"
-                try { & $PYTHON "$SCRIPT_DIR\event_store.py" compile --genre $gid 2>$null } catch { }
-            }
+        # population/thresholds/current_best 已 gitignore,
+        # 每次 pull 后必须从事件重建(即使无新 commit)
+        $genreDirs = Get-ChildItem -Path "$EVOLUTION_DIR\genres" -Directory -ErrorAction SilentlyContinue |
+            Where-Object { Test-Path (Join-Path $_.FullName "events") } |
+            ForEach-Object { $_.Name }
+        foreach ($gid in $genreDirs) {
+            Write-Log "  编译题材: $gid"
+            try { & $PYTHON "$SCRIPT_DIR\event_store.py" compile --genre $gid 2>$null } catch { }
         }
     } catch {
         Write-Warn "git pull 失败(网络不通或无可更新),继续本地进化"