Skip to content

v0.1.8

  • v0.1.8
  • d1ab350
  • Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
  • Choose a tag to compare

  • v0.1.8
  • d1ab350
  • Choose a tag to compare

  • Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature.
@lync-cyber lync-cyber tagged this 24 Apr 03:00
* 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>
Assets 2
Loading