Bladeren bron

evolve: auto git pull/push integration — zero user commands needed

nonvioce 5 maanden geleden
bovenliggende
commit
9adc9b2175
3 gewijzigde bestanden met toevoegingen van 97 en 29 verwijderingen
  1. 8 21
      CLAUDE.md
  2. 24 8
      SKILL.md
  3. 65 0
      scripts/evolve.sh

+ 8 - 21
CLAUDE.md

@@ -64,30 +64,17 @@ target_words: 3000
 ---
 ```
 
-### 写作对话中
+### 写作对话中(全自动)
 
-在 Claude Code 中直接说"写第33章",技能自动:
-1. 读取项目铁律、大纲、细纲、钩子账本、情感矩阵
-2. 从 `evolution/genres/{genre_id}/` 加载该题材最优提示词
-3. 按六条铁律写作
-4. 写完后执行 `evolve.sh` 自动进化
+在 Claude Code 中直接说"写第33章",技能自动完成全部流程:
 
-### 手动进化命令
+1. `evolve.sh` → git pull 获取其他用户的最新进化数据 → 编译
+2. 读取项目铁律、大纲、细纲、钩子账本、情感矩阵
+3. 从 `evolution/genres/{genre_id}/` 加载该题材最优提示词 + 阈值
+4. 按六条铁律写作
+5. 写完后 `evolve.sh` → 反馈收集 → 进化 → git add + commit + push
 
-```bash
-# 写完一章后(自动执行,也可手动)
-cd ~/.claude/skills/novel-write
-bash scripts/evolve.sh --project /path/to/novel
-
-# 完整进化(每卷或每10章)
-bash scripts/evolve.sh --project /path/to/novel --full
-
-# 查看进化状态(含题材级数据)
-bash scripts/evolve.sh --project /path/to/novel --report
-
-# 从事件日志重建进化数据(git pull 后)
-bash scripts/evolve.sh --project /path/to/novel --compile
-```
+**用户不需要输入任何 git 或进化命令。** 所有 git pull、git commit、git push 由 evolve.sh 自动完成。网络不通时自动降级为纯本地模式,不会报错中断。
 
 ## 进化系统
 

+ 24 - 8
SKILL.md

@@ -1109,14 +1109,23 @@ Loop(最多 5 轮):
 
 ### 自动进化规则(铁律六)
 
-每次完成续写、修改、质检、批量生成后,自动执行:
+**写作前:** 自动执行 `scripts/evolve.sh`(不加参数即可)。evolve.sh 会自动 git pull 获取其他用户的最新进化数据并编译。这一步确保启动写作时进化数据是最新的。
+
+**每次完成续写、修改、质检、批量生成后,自动执行:**
 
 ```bash
-scripts/evolve.sh   # 自动检测项目,轻量进化 + 同步到 evolution/
+scripts/evolve.sh   # 自动检测项目,进化 + git pull + git push
 ```
 
+evolve.sh 现在包含完整的 git 集成:
+- 写前:`git pull` → 获取其他用户事件 → `event_store.py compile` 重建 population.json
+- 写后:进化完成 → `git add evolution/genres/` → `git commit` → `git push`
+- 网络不通时降级为纯本地进化,不会报错中断
+
+**用户完全无需手动操作 git 或进化命令。** Claude Code 在执行写作任务前后各调用一次 `scripts/evolve.sh` 即可。
+
 - 连续写作 3 章以上无进化 → 警告
-- 每写完一卷(或每 10 章)→ 手动执行 `/进化 完整`
+- 每写完一卷(或每 10 章)→ 执行 `scripts/evolve.sh --full`
 
 ### evolution/ 目录
 
@@ -1150,11 +1159,18 @@ evolution/                          # 进化输出(由脚本维护,勿手动
 
 ### 写作时如何使用进化数据
 
-1. **确定题材**:读取当前项目的 `项目铁律.md` → 提取 `genre` 字段 → 映射到题材 ID
-2. **写前加载**:优先读 `evolution/genres/{genre_id}/prompts/current_best.json`;不存在则回退到 `evolution/prompts/current_best.json`
-3. **质检参照**:优先读 `evolution/genres/{genre_id}/thresholds.json`;不存在则用 `evolution/thresholds.json`
-4. **模式参照**:参考 `evolution/genres/{genre_id}/patterns/pattern_library.json` 中该题材经验证有效的写作模式
-5. **写后进化**:完成章节后执行 `scripts/evolve.sh`,系统自动检测题材并将反馈写入题材池
+**写前(Claude Code 自动执行):**
+1. 运行 `scripts/evolve.sh`(不加参数)→ 自动 git pull + 编译最新进化数据
+2. 读取当前项目的 `项目铁律.md` → 提取 `genre` 字段 → 映射到题材 ID
+3. 优先读 `evolution/genres/{genre_id}/prompts/current_best.json` 中的最优提示词
+4. 优先读 `evolution/genres/{genre_id}/thresholds.json` 中的题材特定阈值
+5. 参考 `evolution/genres/{genre_id}/patterns/pattern_library.json` 中的写作模式
+6. 如题材目录不存在,回退到 `evolution/prompts/current_best.json`(技能级通用)
+
+**写后(Claude Code 自动执行):**
+7. 完成章节后执行 `scripts/evolve.sh --project {项目路径}`
+8. 系统自动:收集反馈 → 分析质量 → 提示词进化 → 同步阈值 → git add + commit + push
+9. 其他用户下次写作时自动 git pull 获取本次进化结果
 
 ### 四大组件
 

+ 65 - 0
scripts/evolve.sh

@@ -35,6 +35,65 @@ banner() {
     echo -e "└─────────────────────────────────┘${N}"
 }
 
+# ── Git 集成 ──────────────────────────────────────────
+
+is_git_repo() {
+    git -C "$SKILL_DIR" rev-parse --git-dir &>/dev/null
+}
+
+git_pull() {
+    # 写前拉取:获取其他用户的最新进化数据
+    if ! is_git_repo; then return 0; fi
+    if ! git -C "$SKILL_DIR" remote get-url origin &>/dev/null; then return 0; fi
+
+    log "git pull: 获取共享进化数据..."
+    if git -C "$SKILL_DIR" pull --ff-only origin master 2>/dev/null; then
+        ok "git pull 完成"
+        # 有新数据 → 编译所有已变更题材的事件
+        local changed_genres
+        changed_genres=$(git -C "$SKILL_DIR" diff --name-only HEAD@{1}..HEAD -- evolution/genres/ 2>/dev/null \
+            | grep -oP 'evolution/genres/\K[^/]+' | sort -u || echo "")
+        if [[ -n "$changed_genres" ]]; then
+            for gid in $changed_genres; do
+                log "  编译题材: $gid"
+                $PYTHON "$SCRIPT_DIR/event_store.py" compile --genre "$gid" 2>/dev/null || true
+            done
+        fi
+    else
+        warn "git pull 失败(网络不通或无可更新),继续本地进化"
+    fi
+}
+
+git_push_events() {
+    # 写后推送:将本次进化事件提交并推送到远程
+    if ! is_git_repo; then return 0; fi
+    if ! git -C "$SKILL_DIR" remote get-url origin &>/dev/null; then return 0; fi
+
+    # 检查 evolution/genres/ 下是否有变更(新事件、编译产物、阈值等)
+    local has_changes
+    has_changes=$(git -C "$SKILL_DIR" status --porcelain -- evolution/genres/ 2>/dev/null || echo "")
+
+    if [[ -z "$has_changes" ]]; then
+        log "git: 无变更,跳过推送"
+        return 0
+    fi
+
+    log "git: 提交并推送进化数据..."
+
+    # 汇总变更的题材
+    local summary
+    summary=$(echo "$has_changes" | sed 's|.*evolution/genres/||' | cut -d/ -f1 | sort -u | tr '\n' ',' | sed 's/,$//')
+
+    git -C "$SKILL_DIR" add evolution/genres/ 2>/dev/null || true
+    git -C "$SKILL_DIR" commit -m "evolve(${summary:-auto}): auto-commit evolution data" 2>/dev/null || true
+
+    if git -C "$SKILL_DIR" push origin master 2>/dev/null; then
+        ok "git push 完成 ($(echo "$has_changes" | wc -l) 个文件)"
+    else
+        warn "git push 失败(网络不通),下次推送会包含本次变更"
+    fi
+}
+
 # ── 查找项目 ──────────────────────────────────────────
 
 find_project() {
@@ -206,6 +265,9 @@ phase_sync() {
 main() {
     banner
 
+    # 写前拉取:获取其他用户的最新进化数据
+    git_pull
+
     local mode="${1:---quick}"
     local project=""
 
@@ -307,6 +369,9 @@ print(map_genre_to_inkos_id(find_project_genre(Path('$project'))))
                 | sed "s|$EVOLUTION_DIR/genres/$genre_id/|    |" || echo "    (空)"
         fi
     fi
+
+    # 写后推送:将本次进化事件自动提交到 git
+    git_push_events
 }
 
 main "$@"