get-shit-done 修复 3599 深度解析:roadmap get-phase 如何正确命中 project-code 前缀阶段 ID

发布时间:2026/10/31 5:16:08

get-shit-done 修复 3599 深度解析:roadmap get-phase 如何正确命中 project-code 前缀阶段 ID get-shit-done 修复 #3599 深度解析roadmap get-phase 如何正确命中 project-code 前缀阶段 ID【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done本文基于仓库中的变更记录 .changeset/3599-roadmap-get-phase-project-code-prefix.md讲清 get-shit-doneGSD 元提示与规格驱动开发系统中roadmap get-phase子命令的一个正则匹配缺陷及其修复方案当阶段 ID 带有项目代号前缀如PROJ-42时命令曾查不到 ROADMAP.md 中真实的### Phase PROJ-42:标题。读完本文你能理解该命令背后的“两遍查找two-pass”设计、phaseMarkdownRegexSourceExact()新辅助函数的职责边界以及它与历史修复 #3537、#2391 之间如何互相保约而不互相破坏。背景GSD 的阶段 ID 体系与 ROADMAP 散文解析get-shit-done 以.planning/ROADMAP.md作为项目规划的单一事实来源阶段以 Markdown 标题形式书写形如### Phase 2.7: 功能名。解析阶段标题的入口是 get-shit-done/bin/lib/roadmap.cjs 中的cmdRoadmapGetPhase它把「调用方传入的阶段 ID」转换成一段正则片段再拼进#{2,4}\s*Phase\s片段:\s*([^\n])这样的标题匹配模式中。问题在于阶段 ID 存在多种合法形态。从 核心库 的normalizePhaseName()可以看出系统支持的输入标准数字阶段1、01、12A、12.1整数部分可补零、可带字母后缀、可带小數位带 project-code 前缀的目录名形态CK-01-nameproject_code配置会出现在阶段目录名中自定义阶段 IDPROJ-42、AUTH-101normalizePhaseName对这类非数字 ID 原样返回。其中两类形态之间天然存在「错位」补零错位#3537 / #2391skill 或 CLI 解析后传入补零形态02.7而人类手写的 ROADMAP 惯用未补零的### Phase 2.7:。为此core.cjs 提供了phaseMarkdownRegexSource()先剥掉 project-code 前缀再把整数部分的 leading zero 去掉、重新以0*前缀输出使片段同时匹配2.7与02.7。其源码注释明确记录了动机function phaseMarkdownRegexSource(phaseNum) { const stripped String(phaseNum).replace(/^[A-Z]{1,6}-(?\d)/i, ); const match stripped.match(/^0*(\d)([A-Z])?((?:\.\d)*)$/i); if (!match) return escapeRegex(phaseNum); const integer match[1].replace(/^0/, ) || 0; const letter match[2] ? escapeRegex(match[2]) : ; const decimal match[3] ? escapeRegex(match[3]) : ; return 0*${escapeRegex(integer)}${letter}${decimal}; }前缀错位本次 #3599PROJ-42这类 ID 本身就是一个自定义阶段 IDROADMAP 里真实写的是### Phase PROJ-42:。但上面的phaseMarkdownRegexSource()会先剥掉PROJ-前缀再生成0*42——于是roadmap get-phase PROJ-42实际生成的正则是0*42。缺陷机理剥前缀后的正则丢失了「精确身份」用0*42这段片段去匹配 ROADMAP 时会出现两种坏结果回归测试文件 tests/bug-3599-roadmap-get-phase-project-code-prefix.test.cjs 头部注释对此有完整描述若 ROADMAP 里只有### Phase PROJ-42:而没有### Phase 42:0*42匹配不到任何标题命令返回found: false——变更记录里描述的行为就是「roadmap get-phase PROJ-42now matches### Phase PROJ-42:instead of returningfound: false」若 ROADMAP 里恰好还有一个同尾数的裸数字标题### Phase 42:0*42会交叉命中它把属于42的阶段内容错配给PROJ-42查询。还有一个微妙的实现陷阱phaseMarkdownRegexSource()的 docstring 承诺「对非数字 ID 回退到escapeRegex(phaseNum)」但剥前缀之后PROJ-42变成了纯数字42if (!match)这个回退分支对项目代号前缀 数字的 ID 而言永远不可达——承诺的 fallback 恰好覆盖不到最需要它的输入。修复方案新增精确形态辅助函数 调用点两遍查找修复分两层且刻意把「选哪种正则」的决策放在调用点而非正则内部。第一层phaseMarkdownRegexSourceExact()——只回答「有没有前缀」新辅助函数位于 core.cjs实现极短function phaseMarkdownRegexSourceExact(phaseNum) { const raw String(phaseNum); if (!/^[A-Z]{1,6}-(?\d)/i.test(raw)) return null; return escapeRegex(raw); }语义输入形如PROJ-421~6 位大写字母 连字符 至少一位数字开头时返回整体转义后的精确片段PROJ\-42用于匹配### Phase PROJ-42:这一保留前缀的标题输入不带前缀如42、02.7、12A.1时返回null表示调用方只需要既有的phaseMarkdownRegexSource()数值形态即可。这样把「是否需要精确前缀匹配」的判定与「数值补零容忍」的片段构造解耦phaseMarkdownRegexSource()的 #3537 契约保持原样所有既有调用方零改动。第二层cmdRoadmapGetPhase的两遍查找修复后的命令实现见 roadmap.cjs。查找顺序是精确前缀遍若phaseMarkdownRegexSourceExact(phaseNum)非 null先用精确片段搜索「当前里程碑切片」extractCurrentMilestone产出的内容未命中再搜索剥离已交付里程碑后的全量 ROADMAPstripShippedMilestones补零容忍遍#3537只有精确遍落空才用phaseMarkdownRegexSource(phaseNum)生成0*42形态片段按同样的「当前里程碑优先、全量兜底」策略搜索。源码中的注释解释了为什么不在正则内部用「PROJ\-42|0*42」这样的选择式一步完成Doing this at the call site (instead of inside phaseMarkdownRegexSource) avoids the alternation-order ambiguity where a bare### Phase 42:heading in the same document would intercept the match for aPROJ-42query.即选择式正则的匹配顺序会让同文档中的裸### Phase 42:标题拦截掉PROJ-42查询两遍查找则保证「先精确、后宽松」的优先级在逻辑上成立同时不破坏CK-01目录名形态映射到### Phase 1:散文的既有契约。命中之后的输出结构无论哪一遍命中最终都交给 searchPhaseInContent() 解析出结构化结果匹配######级标题并截取到下一个阶段标题之间的区块提取**Goal:**、**Mode:**统一小写后规范化与**Success Criteria**编号列表返回{ found: true, phase_number: phaseNum, // 标题中「如所写」的规范 token phase_name, // 标题冒号后的名称 goal, mode, success_criteria, // 字符串数组 section, // 完整章节原文 }另有两条兜底路径标题缺失但概要清单里存在- [ ] **Phase X:** ...时返回error: malformed_roadmap提示 ROADMAP 需要「清单 详情节」双格式ROADMAP.md 不存在时返回{ found: false, error: ROADMAP.md not found }。加--json参数即输出上述 JSON payload这正是回归测试断言的字段found、phase_name、goal。SDK 侧的镜像实现该仓库同时维护一套 TypeScript 的 SDK 查询层roadmap.get-phase在 sdk/src/query/roadmap.ts 中作为roadmapGetPhase处理器存在是cmdRoadmapGetPhase的移植版本源码注释标注 Port of cmdRoadmapGetPhase from roadmap.cjs lines 75-113。#3599 的修复在 SDK 侧保持了逐行对等parityphaseMarkdownRegexSourceExact() 与 core.cjs 版本逐语句一致注释直接写明「parity with core.cjs phaseMarkdownRegexSourceExact, lines 691-708」roadmapGetPhase内部同样先计算exactEscaped精确前缀片段与numericEscapedphaseMarkdownRegexSource片段先试精确片段、落空再走补零容忍片段且都遵循「当前里程碑切片 → 全量内容」的两级搜索。另外CLI 侧的子命令路由在 roadmap-command-router.cjs 中把get-phase转发到 SDK 处理器roadmap.get-phase——也就是说路由层与底层解析层的两条实现在同一个语义下工作修复对两条链路同时生效。回归测试四个用例钉死四种行为tests/bug-3599-roadmap-get-phase-project-code-prefix.test.cjs 基于node:test通过runGsdTools()在临时项目中真实执行roadmap get-phase ... --json四个用例分别覆盖正向命中ROADMAP 只含### Phase PROJ-42: Custom phase查询PROJ-42必须found: true且phase_name/goal与该标题一致反向不交叉查询裸42时绝不能命中### Phase PROJ-42:防止修成「双向交叉匹配」#3537 契约保持查询CK-01project-code 前缀 补零时仍须解析到未补零的### Phase 1:散文——证明新修复没有弄丢旧契约双形态共存消歧同一 ROADMAP 同时存在### Phase 42:与### Phase PROJ-42:时两个查询各自命中自己那条。这四个用例合起来构成一个完整的「不回归、不交叉、能消歧」矩阵在本地可用node --test tests/bug-3599-roadmap-get-phase-project-code-prefix.test.cjs直接复验。修复的定位与适用前提契约关系#3599 是在 #3537phaseMarkdownRegexSource()补齐到全部 8 个正则构建点见 变更记录的基础上把「前缀保留」这一维度从正则内部剥离到调用点两条契约前缀 ID 精确匹配 / 目录补零形态映射数字散文各自独立可验证适用前提该修复在仓库中以待发布的 changeset 形式存在type: Fixed, issue: 3599适用对象是配置了project_code、ROADMAP 中使用### Phase PROJ-42:这类带前缀标题的项目对纯数字阶段与无 project-code 的项目行为不变phaseMarkdownRegexSourceExact()对无输入返回 null直接走原路径相关变更同批 changeset 中的 3600-milestone-phase-filter-project-code.md 处理的是 milestone 阶段过滤侧的同类前缀问题与本篇的get-phase查找侧互为补充。小结#3599 修复看似只涉及一个正则片段实际示范了一套处理「多形态 ID 命名空间」的可复用模式用一个廉价的判别函数phaseMarkdownRegexSourceExact()仅判断前缀存在性把「精确形态」与「宽松形态」的正则构造拆开再由调用点按「先精确、后宽松」的顺序做两遍查找从而同时满足新契约PROJ-42→### Phase PROJ-42:、旧契约CK-01→### Phase 1:和消歧要求42与PROJ-42互不串扰并在 CLI 与 SDK 两套实现中保持逐行对等。对于同样以 Markdown 散文承载结构化状态ROADMAP、STATE 等的规格驱动工具链这种「判别 两遍查找 双向回归用例」的做法值得直接借鉴。【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/31 5:15:13

发布后功能缺失?用配置漂移与完整性校验定位遗漏

创体服拾遗,放到发布故障场景里,就是在回答一个问题:为什么你明明验证过的功能,发布到目标环境后看起来像被删掉了一截。从代码仓库到体验服,再到正式区服或生产环境,只要中间某层只同步了一部分内容&#…

2026/10/31 5:13:26

GEE机器学习遥感分类实战:水体植被识别全流程

1. GEE机器学习遥感分类实战:从数据到结果全流程解析在遥感影像分析领域,Google Earth Engine(GEE)平台的出现彻底改变了传统工作模式。这个基于云计算的平台不仅提供了海量的遥感数据资源,更集成了强大的机器学习算法…

2026/10/31 5:13:26

从录音到AI配音:一站式人声处理工作流实战指南

如果你跟我一样既做播客、又要剪短视频口播、偶尔还接点有声书试音,应该能体会这种状态:白天在软件里剪片子,晚上架起麦克风录人声,结果一段两分钟的旁白,因为门口快递按门铃、楼上拖椅子、自己嘴瓢说错词,…

2026/10/31 5:13:26

把技能当过程:构建技能树与刻意练习的实践方法

"skills"这个词,我印象里很多人的理解是"一项本事"。会用Excel是技能,会写文案是技能,会开车也是技能。这么理解不错,但不够——我自己栽过跟头之后才明白,把它当成一个过程来看待,而不…

2026/10/31 5:13:26

爆款高跟鞋背后的消费心理学与产品设计逻辑

1. 高跟鞋爆单背后的消费心理学解析高跟鞋作为女性鞋柜中的经典单品,其销售爆单现象背后隐藏着复杂的消费心理机制。从市场数据来看,某些款式的高跟鞋能在短时间内实现销量突破,往往不是单一因素作用的结果,而是多重消费心理共同驱…

2026/10/31 5:13:26

深度学习显存优化:五大隐形杀手与实战解决方案

1. 显存不足的真相:被忽视的五大隐形杀手刚入行时我也曾天真地认为,只要把模型参数压缩得足够小,显存问题就能迎刃而解。直到在部署Qwen-7B模型时,即使使用了4-bit量化,我的RTX 3090(24GB显存)仍…

2026/10/31 5:08:26

Servlet+JSP校园兼职系统开发实战指南

1. Servlet校园兼职系统开发全解析这个校园兼职系统采用经典的ServletJSP技术栈实现,是Java Web开发的典型教学案例。我在实际开发中发现,这类系统虽然结构简单,但涉及用户权限管理、信息审核流程、数据分页展示等多个实用功能点,…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑