* pull main hotfix to dev (#36)
* chore(dogfood): add deploy-dev.sh wrapper preserving dogfood CLAUDE.md
cataforge deploy 会用 PROJECT-STATE 模板覆盖根 CLAUDE.md,dogfood worktree
的 agile-lite 定制版会被破坏。新增 deploy-dev.sh 在 deploy 前后做基线同步:
1. 若根 CLAUDE.md 已被手工修改,先同步到 .dogfood/CLAUDE.md 作为基线
2. 运行 cataforge deploy
3. 用 .dogfood/CLAUDE.md 恢复根 CLAUDE.md
.dogfood/ 已在 .gitignore 中,基线文件不会进入版本控制。
README.md 同步更新首次 dev worktree 设置步骤。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(deploy): on_conflict + section-merge for instruction files (#33)
解决 cataforge deploy 每次覆盖 CLAUDE.md / AGENTS.md 的核心痛点, 让用户
定制内容跨越 deploy 存活。同时修复 cursor/codex/opencode 三平台抢写
AGENTS.md 的既有 bug。
新增 profile.yaml `instruction_file.targets[]` 字段:
1. on_conflict: overwrite (默认) | preserve | preserve_if_edited
- overwrite: 原有行为, 每次 deploy 覆盖
- preserve: 目标已存在则完全跳过
- preserve_if_edited: 与 .cataforge/.instruction-hashes.json 记录的
上次部署哈希对比, 用户手工编辑过则跳过
2. update_strategy: overwrite (默认) | section-merge
section-merge 依 ## 章节三分类合并:
- framework: 框架拥有, 每次 deploy 覆盖
- schema: 框架定义结构 + 用户填值, 字段级合并 (保留用户已填值,
补齐新模板字段, 追加用户自定义字段)
- runtime: orchestrator/bootstrap 运行时写入, deploy 不触碰
- user_extensible: 保留模板未列出的用户自定义章节
3. always_overwrite_fields: schema 类中强制让模板值覆盖用户值的字段。
用于 AGENTS.md 三平台场景中的 "运行时:" 字段 — 即使 cursor 先部署,
codex 后部署时 "运行时: codex" 仍会覆盖 "运行时: cursor", 不被错认
为"用户值"而保留。
四个平台 profile.yaml 已配置 section_policy 对应 PROJECT-STATE.md
的六个标准章节。scaffold 同步更新, 新建项目即享新行为。
运行时 hash 写到 .cataforge/.instruction-hashes.json (gitignore 通过
.cataforge/.* 通配即可, 本 PR 未额外添加忽略规则), Windows CRLF 译码
通过 "写完再 read_bytes 算 hash" 规避。
测试:
- tests/platform/test_on_conflict.py 8 cases (3 策略 + 边界)
- tests/platform/test_section_merge.py 14 cases (framework/schema/
runtime/user/preamble/顺序/章节注释剥离/AGENTS 多平台)
- 全仓 219 tests 通过, ruff 对新增/修改文件全部 clean
Co-authored-by: huancheng.lin@foxmail.com <huancheng.lin@foxmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore(dogfood): retire deploy-dev.sh (superseded by section-merge) (#34)
PR #33 引入的 update_strategy: section-merge 让 cataforge deploy 天然
按章节保留用户定制内容,deploy-dev.sh 的"备份再恢复"包装器不再必要:
- 删除 .cataforge/scripts/dogfood/deploy-dev.sh
- README.md 更新首次 dev worktree 设置步骤:直接 uv run cataforge deploy
依赖: 必须在 PR #33 merge 到 main 之后才能合入本分支,否则 dogfood 的
CLAUDE.md 在首次升级时会被 overwrite 覆盖。
Co-authored-by: huancheng.lin@foxmail.com <huancheng.lin@foxmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(section-merge): preserve user preamble + nested schema values (#35)
两个 dogfood 实战验证发现的缺陷,PR #33 的单元测试没覆盖。
Bug A: Preamble 被模板覆盖
- _split 把第一个 ## 之前的一切作为 preamble
- merge_sections 直接 result_preamble = tpl_preamble
- 后果: 用户的 DOGFOOD 横幅注释 + 自定义 H1 (# CataForge (dev)) 丢失
- 修复: 新增 _merge_preamble — 空→模板; 等价→模板(吸收升级); 有差异→保留用户
Bug B: 多行嵌套 schema 字段被误判为 placeholder
- 用户写 "- 阶段配置:" 下面嵌套 " - ui_design: N/A" 时
inline value 为 "", _is_placeholder("") → True
- 后果: 模板的嵌套默认值胜出, 用户的 ui_design/testing/deployment 全部丢失
同样的 bug 影响 "- 分支:" 下面的分支约定列表
- 修复: 新增 _block_is_placeholder 额外检查续行内容;
有缩进 continuation 时不视为 placeholder
Bonus: .gitignore 追加 .cataforge/.instruction-hashes.json
(preserve_if_edited 的哈希状态文件, 不应进版本控制)
测试:
- 5 个新增 test case 覆盖两个 fix 的正/反/边界
- 原 TestPreamble.test_preamble_from_template_is_used 测试错误行为,
已重写为 3 case (first-deploy/等价/自定义)
- 27 tests in test_section_merge + test_on_conflict 全部通过
- 用真实 dogfood CLAUDE.md 做端到端验证: 12/12 特征全部保留
(DOGFOOD banner, 自定义 H1, 嵌套字段, schema 字段, user_extensible section,
always_overwrite_fields 运行时)
验证轨迹:
- 先 cataforge deploy 一次→CLAUDE.md 从 119 行缩到 93 行, 丢失 DOGFOOD
- 应用 hotfix 后再次 deploy→CLAUDE.md 稳定在 111 行, 所有定制存活
- 111 < 119 是因为模板把一处重复的空行吸收, 属正常压缩
Co-authored-by: huancheng.lin@foxmail.com <huancheng.lin@foxmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: huancheng.lin@foxmail.com <huancheng.lin@foxmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* release: v0.1.8 — self-update skill + Windows build fix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore(dev): add CLAUDE.md — Claude Code dev workflow instructions
Dev-only: tracked with -f (gitignored as deploy artifact). prepare-pr.sh
filters this file before any PR to main per product-paths.txt whitelist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: reset dogfood artifacts before PR
白名单来源: .cataforge/scripts/dogfood/product-paths.txt
还原文件数: 1
源分支 : dev
---------
Co-authored-by: huancheng.lin@foxmail.com <huancheng.lin@foxmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>