Skip to content

PR-01 · Node 单栈基座:入口 CLI + Skill 内核 + 安装器 + 拼音 + 测试移植 - #166

Open
titanwings wants to merge 15 commits into
pre-v2-baselinefrom
ds/01-node-core-rebuilt
Open

titanwings wants to merge 15 commits into
pre-v2-baselinefrom
ds/01-node-core-rebuilt

Conversation

@titanwings

@titanwings titanwings commented Sep 15, 2026

Copy link
Copy Markdown
Owner

状态 · 2026-09-15CI 30–79 红,不作为合并入口。 这条分支的树与它自带的测试对不上——
重建快照不完整(例:ds/01 只有 20 个测试文件,集成分支有 86 个)。它的功能已经包含在集成分支
dot-skill-test 与后续分支里。

保留这条分支的用途是每功能一份证据文档docs/evidence/pr-NN-*.md)与当时的改动前后对比,
不是待合并的代码。权威状态与已知缺口:docs/v2/STATUS.md


这是一次等价重建,不是原分支的还原。

  • 基底不是 dot-skill-test,而是 ds/00-baseline 原因:本链每一环的内容都已包含在 dot-skill-test 里,
    若以它为 base,diff 会是空的(原计划文档 dst-evidence/PR-BODIES/PR-PLAN.md 早已预判这一点)。
    链式 base 才能让每个 PR 只显示这一个功能的改动。
  • 提交信息:能从会话转录里恢复的原样保留;恢复不到的原提交(130 条里有 50 条,多为单文件文档提交)
    chore(<区>): 重建 …(原提交信息未记录) 标注,不冒充原文。
  • 文件内容是集成分支上的最终态,不是历史中间态。原分支的 per-commit 文件树随 /tmp 清空丢失,
    转录只保留了提交信息与每次 git add 的路径清单。
  • 自检:19 条分支从基线依次应用后,链尾树与 dot-skill-test 逐字节相同(空 diff),
    所以没有任何文件被漏掉或重复归属。
  • 原版 ds/01-node-coreds/04-prompts(丢失前已推送的幸存原件)未改动,本链的同名环节以 -rebuilt 后缀区分。

本 PRds/01-node-core-rebuiltds/00-baseline,14 个提交,11606 insertions(+), 10553 deletions(-)。

本 PR 的提交清单
  • chore(python): 退役 37 个 Python 文件
  • chore(INSTALL.md): 重建 23 个文件(原提交信息未记录)
  • chore(workflows): 重建 .github/workflows/ci.yml(原提交信息未记录)
  • chore(evidence): 重建 2 个文件(原提交信息未记录)
  • chore(cli): 重建 2 个文件(原提交信息未记录)
  • feat(v2): derive the pinyin slug table from unihan
  • fix(v2): print a registered command's bilingual help
  • fix(v2): make the archived version listing deterministic
  • feat(v2): wire the skill subcommands into the cli
  • feat(v2): port the skill preset registry to node
  • docs(v2): add the Python-to-Node migration ledger
  • docs(v2): note that the host matrix ships from the integration branch
  • docs(v2): freeze the dot-skill v2 contract before parallel work
  • docs(site): add the repository README and the design-system reference

PR-01 · Node 单栈基座:入口 CLI + Skill 内核 + 安装器 + 拼音 + 测试移植

  • 分支:ds/01-node-core(12 个提交,已本地合并进 dot-skill-test
  • 依赖:无。这一条是并行工作的基座:契约、命令注册表、验收脚本都由它落下来
  • 交付:38 个文件 / +11 050 行

1. 变更

# 提交 内容
1 c383fca src/skill/writer.mjs + src/skill/slug.mjs:Python skill_writer.py 的 Node 移植,含拼音 slug
2 3337c39 src/skill/versions.mjs:版本归档(list / backup / rollback / cleanup),归档时间戳按 UTC 固定
3 579b159 归档列表确定性:同一天两次 version list 输出一致
4 f94675d scripts/parity.mjs:与迁移前 Python 的逐字节 parity 证据(按 rev 跑,不进日常门禁)
5 441ceaf src/commands/skill.mjsskill create|update|list|version 接进注册表
6 9ebfa6e src/install/hosts.mjs:8 个宿主安装器合并成一个模块(路径矩阵单一出处)
7 3436730 安装器测试移植到 node --test(claude / codex / openclaw / hermes)
8 43c837e 已注册命令的 --help 打印双语两段
9 f6dcf87 listCommands() 暴露命令名(供 doctor / prompt-lint / 审计共用)
10 f97bc0c install / uninstall / doctor / legacy 适配器(旧 python3 tools/*.py 调用转发 + deprecation 警告)
11 28b0c32 assets/pinyin.json:从 Unihan 生成,去掉 pypinyin 运行时依赖
12 1da31aa 其余 Python 测试套件移植为 node --test

新增文件(节选):src/commands/{index,skill,install,doctor,legacy}.mjssrc/cli/{args,receipt}.mjs
src/skill/{writer,presets,schema,slug,versions}.mjssrc/install/hosts.mjssrc/hosts/agents.mjs
assets/pinyin.jsonscripts/{generate-pinyin,parity,acceptance}.mjsdocs/v2/{CONTRACT,ACCEPTANCE,STATUS}.md
tests/{dispatcher,commands,cli-lifecycle,skill-writer,pinyin-slug,install-*}.test.mjs
公开语料夹具 tests/fixtures/public-corpus/synthetic-interview/**

2. 验收(当前树,可复算)

node --test tests/dispatcher.test.mjs tests/commands.test.mjs tests/cli-lifecycle.test.mjs \
            tests/skill-writer.test.mjs tests/pinyin-slug.test.mjs tests/install-*.test.mjs
# 33 个测试文件、330 个 test() 块:node --test tests/*.test.mjs → 340 pass / 0 fail
node bin/distilly.mjs --help          # 22 个命令名,全部有中英两段
node bin/distilly.mjs doctor          # 宿主矩阵 8 个宿主,逐个报告是否已安装
node scripts/parity.mjs <pre-migration-rev>   # 历史 parity 证据(需要旧 rev)

要点:零运行时依赖package.json 无 dependencies);入口唯一(bin/distilly.mjs);
--json 在任何命令上只输出一个对象(tests/dispatcher.test.mjs 断言);
命令注册表是唯一注册点,两段式命令名优先(skill create 赢过 skill)。

3. 回滚

  • 逐提交可 revert;src/commands/legacy.mjs 单独 revert 会让旧 tools/*.py 调用直接报未知命令。
  • assets/pinyin.json 是生成物:node scripts/generate-pinyin.mjs 可重现(--check 防漂移)。

4. 已知缺口

重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:docs(site): add the repository README and the design-system reference
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:docs(v2): freeze the dot-skill v2 contract before parallel work
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:docs(v2): note that the host matrix ships from the integration branch
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:docs(v2): add the Python-to-Node migration ledger
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:feat(v2): port the skill preset registry to node
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:feat(v2): wire the skill subcommands into the cli
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:fix(v2): make the archived version listing deterministic
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:fix(v2): print a registered command's bilingual help
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:feat(v2): derive the pinyin slug table from unihan
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:(未记录)
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:(未记录)
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:(未记录)
重建说明:本提交由会话转录重建,提交信息取自原分支(ds/01-node-core)。
文件内容为集成分支上的最终态,不是当时那一刻的中间态——原分支的 per-commit
文件树随 /tmp 清空丢失,转录只保留了提交信息与 git add 的路径清单。

原提交信息:(未记录)
重建说明:原分支删除这批 Python 文件是分几个提交做的,这里合并为一个删除提交;文件清单来自 git diff 的 D 状态记录。
@titanwings
titanwings changed the base branch from ds/00-baseline to pre-v2-baseline September 15, 2026 07:44
titanwings added a commit that referenced this pull request Sep 15, 2026
两处「检查看起来通过了,其实什么也没说」:

1. **渠道行**:那条 `契约里其余渠道仍未移植(discord/reddit/notion/gmail)`
   的判据恒为 `true`,证据来自 `PENDING_CHANNELS` 的映射 —— 等这张表空了
   (八个渠道都落地了),证据字符串就变成空串:一条通过的检查,
   什么也没读。现在改为正面断言八个渠道模块都存在,证据里逐个列出读过的
   文件、缺失项与 PENDING_CHANNELS 的状态。
2. **推送行**:标题还写着「PR 尚未创建」,而 `ds/NN-*` 链与 PR #166#185
   都已经在了。判据(已推送 + 工作树干净)本身没错,标题改为它真正检查的
   东西。现在审计报 **15/15 满足、0 条已知缺口**。

测试侧同步:`documented gaps` 不再要求 `discord` 出现在缺口里(那些渠道已经
交付),改为要求 `--skip-acceptance` 模式下「跳过了端到端验收」这件事必须
可见 —— 一条审计把「自己没查的东西」藏起来,正是这一行要防的失败模式。

验证:
- `node --test tests/audit-objective.test.mjs` → 2/2(改动前 0/2)
- `node scripts/audit-objective.mjs`(含真实浏览器渲染)→ 15/15、0 缺口
- 全量 → 350 通过 / 24 失败
@titanwings titanwings closed this Sep 15, 2026
@titanwings titanwings reopened this Sep 15, 2026
这 19 个 PR 是堆叠的,base 是上一条 ds/* 分支,而 CI 的触发名单只有
[dot-skill-test, dot-skill, main],所以本分支的 push / PR 都不会触发工作流,
PR 页面永远显示 no checks reported。这里只改触发条件,不动任何产品代码。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant