diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 0ba1c9f..14851f1 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -35,7 +35,7 @@ devpace 分为两个独立层次,**产品层不得依赖开发层**: ## 开发守则 -1. **概念模型始终完整**:BR→PF→CR 价值链从第一天就存在,不可省略任何环节。内容可为空但结构必须完整 +1. **概念模型始终完整**:Opportunity→Epic→BR→PF→CR 价值链从第一天就存在,不可省略任何环节。内容可为空但结构必须完整 2. **Markdown 是唯一格式**:消费者是 LLM + 人类,不使用 YAML/JSON 作为状态文件格式 3. **Schema 是契约**:`knowledge/_schema/` 中的格式定义是强约束,Skill 输出必须符合 Schema 4. **plugin.json 必须与文件系统同步**:新增/删除 Skill 后立即更新 `.claude-plugin/plugin.json` @@ -60,14 +60,13 @@ devpace 分为两个独立层次,**产品层不得依赖开发层**: | 质量门系统 | `docs/design/design.md §6` | Gate 1/2/3 定义 | | 变更管理 | `docs/design/design.md §7` | 设计原则、四种场景、操作流程 | | BizDevOps 理论 | `knowledge/theory.md` | 方法论参考(/pace-theory 运行时数据源) | -| 需求场景 S1-S12 | `docs/planning/requirements.md` | 验收标准 | -| 功能需求 F1-F3、非功能需求 NF1-NF10 | `docs/planning/requirements.md` | 特性规格与质量约束 | +| 需求场景 S1-S42 | `docs/planning/requirements.md` | 验收标准 | +| 功能需求 F1-F12、非功能需求 NF1-NF11 | `docs/planning/requirements.md` | 特性规格与质量约束 | | 战略规划 | `docs/planning/roadmap.md` | 阶段、里程碑、任务定义 | | 操作跟踪 | `docs/planning/progress.md` | 当前任务状态、会话历史、变更记录 | | 运行时行为规则 | `rules/devpace-rules.md` | 插件加载后 Claude 的行为 | | 文件格式契约 | `knowledge/_schema/*.md` | state/project/CR 的字段定义 | | 度量指标定义 | `knowledge/metrics.md` | 指标名称、计算方式、用途 | -| 组件开发基础原则(新手首读) | `knowledge/dev-principles.md` | 跨组件通用的 10 条第一性原理 | ### 开发规范索引(.claude/rules/,自动加载) diff --git a/README.md b/README.md index 1964d9c..8e36728 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,10 @@ Next session, Claude reports: "Last time we stopped at auth module, continue?" ## Full Development Lifecycle ``` - Goal Features Code Changes Quality Ship -You define ──→ Plan together ──→ Claude codes ──→ Auto + You ──→ Optional auto - │ │ │ │ - pace-plan pace-dev pace-review pace-release - pace-change pace-feedback +Opportunity ──→ Epic ──→ Requirements ──→ Features ──→ Code Changes ──→ Quality ──→ Ship + │ │ │ │ │ │ │ + pace-biz pace-biz pace-biz pace-plan pace-dev pace-review pace-release + pace-change pace-feedback ``` Requirements can change anytime — `/pace-change` auto-analyzes impact, adjusts the plan, and waits for your confirmation. @@ -83,38 +82,23 @@ After installing, type `/pace-` in Claude Code. If devpace is loaded, you'll see ## Commands -### Daily Use +Most of the time you don't need commands — saying "help me implement X" equals `/pace-dev`, "where are we" equals `/pace-status`. + +### Start Here (5 commands cover 90% of daily work) | Command | Purpose | |---------|---------| -| `/pace-init` | First-time setup (once, supports `--from PRD` for auto feature tree) | -| `/pace-dev` | Start coding | -| `/pace-status` | Check progress | +| `/pace-init` | First-time setup (once) | +| `/pace-dev` | Start coding — or just say "help me implement X" | +| `/pace-status` | Check progress — or say "where are we" | | `/pace-review` | Approve changes | | `/pace-next` | Not sure what's next? Get AI recommendations | -### When Requirements Change or a Cycle Completes - -| Command | When to use | -|---------|------------| -| `/pace-change` | Add requirements, pause, change scope, reprioritize | -| `/pace-plan` | Cycle done, plan the next one | -| `/pace-retro` | Review how things went | +### More Commands -### Specialized Features (Optional) +As your project grows, devpace offers change management, iteration planning, business alignment, release orchestration, and more. See [User Guide](docs/user-guide.md) for all 19 commands. -| Command | Scenario | -|---------|----------| -| `/pace-test` | Requirements-traceable test management | -| `/pace-guard` | Risk fabric: Pre-flight scan + Runtime monitoring + Trend analysis + Graduated response | -| `/pace-release` | Release orchestration: Changelog + Version bump + Git Tag + GitHub Release | -| `/pace-sync` | External tool bridge: sync task state ↔ GitHub Issues (labels + comments) | -| `/pace-role` | Switch perspective (PM / Tester / Ops / etc.) | -| `/pace-theory` | Learn the methodology behind devpace | -| `/pace-feedback` | Collect post-launch feedback | -| `/pace-trace` | View full reasoning trace of AI decisions | - -Most of the time you don't need commands — saying "help me implement X" equals `/pace-dev`, "where are we" equals `/pace-status`. +Quick reference: `/pace-change` (requirements changed) · `/pace-plan` (plan iterations) · `/pace-retro` (review metrics) · `/pace-biz` (business planning) · `/pace-release` (ship it) ## Core Capabilities @@ -124,6 +108,8 @@ Most of the time you don't need commands — saying "help me implement X" equals |-----------|-------------| | Requirement changes | Add features, pause, change scope — auto impact analysis, orderly adjustment, Claude won't change the plan unilaterally | | Complexity awareness | Auto-assesses task complexity, small changes fast-track, large changes full process, complexity drift auto-detected | +| Technical debt management | `tech-debt` CR type + iteration capacity reservation + trend tracking | +| Architecture decisions | `/pace-trace arch` manages cross-CR Architecture Decision Records (ADR) | ### Quality & Traceability @@ -132,6 +118,7 @@ Most of the time you don't need commands — saying "help me implement X" equals | Quality gates | Code quality + requirement consistency auto-check + adversarial review, human approval cannot be skipped | | Goal traceability | From business goals to code changes, always traceable | | Test verification | Requirements-driven — strategy generation, coverage analysis, AI acceptance verification, change impact regression | +| Semantic drift detection | Continuous monitoring of code-requirement alignment during development, Review includes semantic consistency score | ### Development Rhythm @@ -142,7 +129,8 @@ Most of the time you don't need commands — saying "help me implement X" equals | Progressive autonomy | Assisted / Standard / Autonomous — more guidance for new users, less for experienced ones | | DORA proxy metrics | Deploy frequency / Lead time / Failure rate / MTTR proxy values, Elite~Low benchmarks + trend comparison | | CI/CD awareness | Auto-detects CI tool type, Gate 4 auto-queries CI status, zero config | -| Risk fabric | Pre-flight 5-dimension risk scan + Runtime monitoring + Graduated autonomous response (High requires human confirmation) | +| Risk fabric | OWASP-aware security scanning + Pre-flight 5-dimension risk scan + Runtime monitoring + Graduated autonomous response (High requires human confirmation) | +| Delivery prediction | AI-powered iteration delivery probability forecasting, bottleneck identification, and risk early warning | | Cross-project insights | High-confidence insights exportable/importable to other projects, reducing redundant learning | ## Workflow diff --git a/README_zh.md b/README_zh.md index da554bd..38e2cf2 100644 --- a/README_zh.md +++ b/README_zh.md @@ -34,11 +34,10 @@ ## 覆盖完整研发生命周期 ``` - 目标 功能 代码变更 质量 发布 -你来定义 ──→ 一起规划 ──→ Claude 写代码 ──→ 自动+你审批 ──→ 可选自动 - │ │ │ │ - pace-plan pace-dev pace-review pace-release - pace-change pace-feedback +机会 ──→ 专题 ──→ 需求 ──→ 功能 ──→ 代码变更 ──→ 质量 ──→ 发布 + │ │ │ │ │ │ │ +pace-biz pace-biz pace-biz pace-plan pace-dev pace-review pace-release + pace-change pace-feedback ``` 需求随时可变——`/pace-change` 自动分析影响、调整计划、等你确认。 @@ -83,38 +82,23 @@ claude --plugin-dir /path/to/devpace ## 命令 -### 日常使用 +大多数时候不需要敲命令——说"帮我实现 X"等于 `/pace-dev`,说"做到哪了"等于 `/pace-status`。 + +### 从这里开始(5 个命令覆盖 90% 日常工作) | 命令 | 作用 | |------|------| -| `/pace-init` | 首次初始化(只需一次,支持 `--from PRD` 自动分解功能树) | -| `/pace-dev` | 开始写代码 | -| `/pace-status` | 看进度 | -| `/pace-review` | 审批变更 | -| `/pace-next` | 不确定做什么时,看 AI 推荐的下一步 | - -### 需求变了或一轮做完时 +| `/pace-init` | 首次初始化(只需一次) | +| `/pace-dev` | 开始写代码——或者直接说"帮我实现 X" | +| `/pace-status` | 看进度——或者说"做到哪了" | +| `/pace-review` | 审批变更 | +| `/pace-next` | 不确定做什么时,看 AI 推荐的下一步 | -| 命令 | 什么时候用 | -|------|----------| -| `/pace-change` | 加需求、暂停、改范围、调优先级 | -| `/pace-plan` | 一轮做完了,规划下一轮 | -| `/pace-retro` | 复盘做得怎么样 | +### 更多命令 -### 专项功能(可选,不使用时不受影响) +随着项目发展,devpace 提供变更管理、迭代规划、业务对齐、发布编排等更多能力。查看[用户指南](docs/user-guide_zh.md)了解全部 19 个命令。 -| 命令 | 场景 | -|------|------| -| `/pace-test` | 需求追溯驱动的测试管理 | -| `/pace-guard` | 风险织网:Pre-flight 扫描 + Runtime 监控 + 趋势分析 + 分级响应 | -| `/pace-release` | 发布编排:Changelog + 版本 bump + Git Tag + GitHub Release | -| `/pace-sync` | 外部工具桥接:任务状态 ↔ GitHub Issues 同步(标签 + 评论) | -| `/pace-role` | 切换视角(产品经理/测试/运维等) | -| `/pace-theory` | 了解背后的方法论 | -| `/pace-feedback` | 收集上线后反馈 | -| `/pace-trace` | 查看 AI 决策的完整推理轨迹 | - -大多数时候不需要敲命令——说"帮我实现 X"等于 `/pace-dev`,说"做到哪了"等于 `/pace-status`。 +常用:`/pace-change`(需求变了)· `/pace-plan`(规划迭代)· `/pace-retro`(复盘度量)· `/pace-biz`(业务规划)· `/pace-release`(发布) ## 核心能力 @@ -124,6 +108,8 @@ claude --plugin-dir /path/to/devpace |------|------| | 需求变更 | 加功能、暂停、改范围——自动分析影响,有序调整,Claude 不擅自改计划 | | 复杂度感知 | 自动评估任务复杂度,小变更快速通过、大变更完整流程,复杂度漂移自动检测 | +| 技术债务管理 | `tech-debt` CR 类型 + 迭代容量预留 + 趋势追踪 | +| 架构决策记录 | `/pace-trace arch` 管理跨 CR 的 ADR(Architecture Decision Record) | ### 质量与追溯 @@ -132,6 +118,7 @@ claude --plugin-dir /path/to/devpace | 质量门禁 | 代码质量 + 需求一致性自动检查 + 对抗审查,人类审批不可跳过 | | 目标追溯 | 从业务目标到代码变更,始终可追溯 | | 测试验证 | 需求追溯驱动——策略生成、覆盖率分析、AI 验收验证、变更影响回归 | +| 语义漂移检测 | 开发过程中持续监控代码与需求的对齐度,Review 包含语义一致性评分 | ### 研发节奏 @@ -142,7 +129,8 @@ claude --plugin-dir /path/to/devpace | 渐进自主性 | 辅助/标准/自主三级——新用户多引导,熟练用户少干预 | | DORA 代理度量 | 部署频率/前置时间/失败率/MTTR 代理值,Elite~Low 基准分级 + 趋势对比 | | CI/CD 感知 | 自动检测 CI 工具类型,Gate 4 自动查询 CI 状态,零配置即用 | -| 风险织网 | Pre-flight 5 维风险扫描 + Runtime 实时监控 + 分级自主响应(High 必须人类确认) | +| 风险织网 | OWASP 安全扫描 + Pre-flight 5 维风险扫描 + Runtime 实时监控 + 分级自主响应(High 必须人类确认) | +| 交付预测 | AI 预测迭代交付概率、识别瓶颈、发出风险预警 | | 跨项目经验 | 高置信度经验可导出/导入到其他项目,减少重复学习 | ## 工作流程 diff --git a/docs/design/design.md b/docs/design/design.md index 92a9f2f..86aa89e 100644 --- a/docs/design/design.md +++ b/docs/design/design.md @@ -32,9 +32,9 @@ Phase 0 ─────→ Phase 1 ─────→ Phase 2A/2B ──── │ deployed → rolled_back(回滚路径) │ └────────────────────────────────────────────────────┘ -横切:/pace-role(视角切换)· /pace-theory(理论参考)· /pace-status(任意阶段查询)· /pace-trace(决策轨迹)· /pace-guard(风险管理) +横切:/pace-role(视角切换)· /pace-theory(理论参考)· /pace-status(任意阶段查询)· /pace-trace(决策轨迹)· /pace-guard(风险管理)· /pace-next(全局导航) -价值交付链路:OBJ → BR → PF → CR → merged(→ released,可选) +价值交付链路:Opportunity → Epic → BR → PF → CR → merged(→ released,可选)(OBJ 关联 Epic) 溯源标记: / — 区分用户输入与 Claude 推断(HTML 注释,日常不可见) 四个闭环:业务闭环(人类主导) → 产品闭环(人机协作) → 技术闭环(Claude 自治) → 运维闭环(人机协作,可选) 状态机:created → developing → verifying → in_review → approved → merged → released(可选)(任意⇄paused) @@ -133,26 +133,31 @@ vision.md 定义了三层护城河,设计优先级据此排列: | 概念 | BizDevOps 定义 | 在本 Plugin 中的体现 | |------|----------|-------------------| -| **作业对象** | 价值交付链路上的基本单元 | BR(业务需求)→ PF(产品功能)→ CR(变更请求) | +| **作业对象** | 价值交付链路上的基本单元 | Opportunity(业务机会)→ Epic(专题)→ BR(业务需求)→ PF(产品功能)→ CR(变更请求) | | **作业空间** | 角色协作的功能区域 | 当前简化为单项目单开发者,未来扩展多项目时启用 | | **作业规则** | 流程、规范、约束 | knowledge/_schema/ 中的 workflow.md(状态机)+ checks.md(质量检查),项目可在 .devpace/rules/ 中覆盖 | ### 价值交付链路 -devpace 使用四类作业对象构成价值交付链路: +devpace 使用五类作业对象构成价值交付链路: ``` -OBJ (业务目标) →1:N→ BR (业务需求) →1:N→ PF (产品功能) →1:N→ CR (变更请求) - 人类定义 人类定义 人机协作 Claude 创建 +Opportunity (业务机会) →评估→ Epic (专题) →1:N→ BR (业务需求) →1:N→ PF (产品功能) →1:N→ CR (变更请求) + Claude 捕获 人机协作 人机协作 人机协作 Claude 创建 + ↑ + OBJ (业务目标) + 人类定义 ``` -**双向追溯**:正向确保技术工作锚定业务价值,反向确保技术工作可追溯到业务目的。**溯源标记**增加第三维度——区分用户输入与 Claude 推断的内容,支持跨会话信任和纠正检测。 +**双向追溯**:正向确保技术工作锚定业务价值,反向确保技术工作可追溯到业务目的。**溯源标记**增加第三维度——区分用户输入与 Claude 推断的内容,支持跨会话信任和纠正检测。**Epic 层增加了业务规划域的可追溯性——从 CR 可以追溯到 Epic 和 Opportunity,验证每一行代码都有业务来源。** | 实体 | 存储位置 | 创建者 | 状态管理 | |------|---------|--------|---------| | OBJ | project.md 业务目标 section | 人类 | MoS checkbox | -| BR | project.md 业务目标 section | 人类 | 功能完成度隐含 | -| PF | project.md 价值功能树 | 人机协作 | emoji 标记(🔄✅⏳⏸️) | +| Opportunity | opportunities.md | Claude 捕获/人类 | 评估中→已采纳/已搁置/已拒绝 | +| Epic | epics/EPIC-xxx.md(始终独立) | 人机协作 | 规划中→进行中→已完成→已搁置 | +| BR | project.md 树视图(溢出后 requirements/BR-xxx.md) | 人机协作 | 基于 PF 完成度自动计算 | +| PF | project.md 价值功能树(溢出后 features/PF-xxx.md) | 人机协作 | emoji 标记 | | CR | backlog/CR-xxx.md | Claude 自动 | 7 状态状态机 | **扩展实体**(可选,渐进启用): @@ -195,7 +200,9 @@ OBJ (业务目标) →1:N→ BR (业务需求) →1:N→ PF (产品功能) | 概念 | 初始形态(轻量) | 丰富后形态 | 存储位置演变 | |------|-----------------|-----------|------------| -| BR(业务需求) | state.md 一行:"目标:实现用户认证系统" | 带 MoS 指标、验收标准的完整描述 | state.md → project.md 业务目标 section | +| Opportunity(业务机会) | 一句话描述 + 来源 | 评估结论 + 去向(Epic) + 详细来源 | 始终在 opportunities.md | +| Epic(专题) | 标题 + OBJ 关联 + 背景 | 完整 MoS + BR 列表 + 完成度 + 时间框架 | 始终在 epics/EPIC-xxx.md | +| BR(业务需求) | project.md 一行(标题 + 标签) | 带业务上下文、成功标准、PF 列表 | project.md 内联 → **requirements/BR-xxx.md**(溢出) | | PF(产品功能) | CR 文件的 `功能:` 字段 + state.md 功能概览行 | 功能分组视图 + 用户故事 + 验收标准 + 边界定义、依赖关系、完成进度 | CR + state.md → project.md 功能视图 + 功能规格 → **features/PF-xxx.md**(溢出) | | CR(变更请求) | backlog/CR-*.md 基础信息 + 意图(用户原话) | 意图完整填充、质量检查记录、review 历史、关联信息 | 始终在 backlog/CR-*.md | @@ -210,7 +217,7 @@ OBJ (业务目标) →1:N→ BR (业务需求) →1:N→ PF (产品功能) 随迭代丰富为: ``` -业务目标 + MoS(project.md)→ 功能树(project.md)→ PF 详情(features/ 溢出后)→ CR(backlog/)→ 代码(Git) +业务机会(opportunities.md)→ 专题 + MoS(epics/)→ 业务目标 + MoS(project.md)→ 功能树(project.md)→ PF 详情(features/ 溢出后)→ BR 详情(requirements/ 溢出后)→ CR(backlog/)→ 代码(Git) ``` **文件结构:/pace-init 创建完整目录,内容从最小开始**: @@ -220,6 +227,9 @@ OBJ (业务目标) →1:N→ BR (业务需求) →1:N→ PF (产品功能) .devpace/ ├── state.md # 含业务目标行 + 功能概览(5-8 行) ├── project.md # 初始仅含基础业务目标和功能列表 +├── opportunities.md # 业务机会看板(/pace-biz 时填充,可选) +├── epics/ # Epic 专题文件(/pace-biz 时填充,可选) +├── requirements/ # BR 溢出文件(信息量增长后自动溢出,可选) ├── backlog/ # CR 文件随推进创建 ├── iterations/ # 目录预创建,有迭代节奏需求时填充内容 ├── rules/ # 目录预创建,项目特有质量规则时填充 @@ -612,7 +622,7 @@ checks.md 支持两种检查类型:**命令检查**(bash 执行)和**意 | 文件 | 职责 | 消费者 | |------|------|--------| -| project.md | 业务全景(OBJ→BR→PF→CR 价值树) | /pace-plan, /pace-change, /pace-status | +| project.md | 业务全景(OBJ→Epic→BR→PF→CR 价值树) | /pace-plan, /pace-change, /pace-status | | state.md | 恢复锚点(当前状态 + 下一步) | 会话开始, §6 中断恢复 | | context.md | 技术约定(编码规范、项目约定、架构约束) | 推进模式, /pace-dev | @@ -845,18 +855,22 @@ target-project/.devpace/ | /pace-trace | 任意时刻,§5 深入层 | 决策轨迹查询(只读) | ✅ | ✅ 已实现 | | pace-pulse | 推进模式中,§10 | 节奏心跳检查(Claude 自动) | ❌ | ✅ 已实现 | | /pace-guard | Phase 0-4 跨阶段,§18 | 风险管理:scan/monitor/trends/report/resolve | ✅ | ✅ 已实现 | +| /pace-next | 任意时刻,§19 | 全局导航:跨域信号推荐下一步 | ✅ | ✅ 已实现 | +| /pace-test | Phase 2B,§20 | 测试策略:验收/回归/影响分析 | ✅ | ✅ 已实现 | +| /pace-sync | 任意时刻,§21 | 外部工具同步(GitHub/Linear/Jira) | ✅ | ✅ 已实现 | +| /pace-biz | Phase 0+,§22 | 业务规划:discover/import/infer/epic/decompose/align/view | ✅ | ✅ 已实现 | | pace-learn | merged 后,§11 | 即时知识积累(Claude 自动) | ❌ | ✅ 已实现 | **Agents**(角色分离): | Agent | 路由 Skill | 视角 | 工具权限 | |-------|-----------|------|---------| -| pace-pm | /pace-plan | 产品经理 | Read, Glob, Grep, AskUserQuestion | -| pace-engineer | /pace-dev | 工程师 | Read, Write, Edit, Bash, Glob, Grep | +| pace-pm | /pace-plan, /pace-change, /pace-biz | 产品经理 | Read, Glob, Grep, AskUserQuestion | +| pace-engineer | /pace-dev, /pace-test | 工程师 | Read, Write, Edit, Bash, Glob, Grep | | pace-analyst | /pace-retro | 分析师 | Read, Glob, Grep, Bash | **说明**: -- 13 个用户 Skill + 2 个内部 Skill + 3 个 Agent = 完整角色分离体系 +- 18 个用户可调 Skill(含 3 个仅手动触发)+ 1 个内部 Skill(pace-pulse)+ 3 个 Agent = 完整角色分离体系 - Skill→Agent 路由通过 `context: fork` + `agent` 字段实现 - Phase 1(会话开始)和 Phase 5(会话结束)不对应 Skill,由 rules 自动驱动 - §10-§12 实现 Claude 主动管理行为,§13-§16 实现角色意识与生命周期扩展 @@ -868,7 +882,7 @@ target-project/.devpace/ | 关系 | 说明 | 实现载体 | |------|------|---------| -| 交付链 → 追溯树 | OBJ→BR→PF→CR 分解关系的可视化 | project.md 价值功能树 | +| 交付链 → 追溯树 | OBJ→Epic→BR→PF→CR 分解关系的可视化 | project.md 价值功能树 | | 状态机 → 质量检查 | 状态转换由质量检查把关 | Gate 1/2/3 | | 状态机 → 变更管理 | paused 状态是变更管理的核心机制 | CR 的 paused 状态 | | 状态机 → Release | merged→released 由 Release 关闭触发 | §14 + /pace-release | diff --git a/docs/design/skill-dependencies.md b/docs/design/skill-dependencies.md index 7bc3d4b..10408e3 100644 --- a/docs/design/skill-dependencies.md +++ b/docs/design/skill-dependencies.md @@ -59,40 +59,39 @@ | 触发机制 | `post-cr-update.mjs:43` 输出 `pace-learn knowledge extraction` 步骤 | | 位置 | `hooks/post-cr-update.mjs:42-43` | -### pace-dev → pace-guard(L/XL 预检 + procedures 内联) +### pace-dev → pace-guard(L/XL 预检 + Schema 契约) | 属性 | 值 | |------|-----| -| 耦合类型 | **代码内联**(直接引用 procedures 文件路径)+ 数据格式依赖 | -| 风险等级 | **高** | -| 位置 | `skills/pace-dev/dev-procedures-intent.md:206`("扫描规则详见 `skills/pace-guard/guard-procedures-scan.md`") | -| 描述 | pace-dev 在意图检查点直接读取 pace-guard 的内部 procedures 文件执行 L/XL CR 风险扫描 | -| 影响 | 重命名/重构 `guard-procedures-scan.md` 会直接破坏 pace-dev | +| 耦合类型 | **Schema 契约**(通过 risk-format.md 接口)+ 命令委托 | +| 风险等级 | **低**(已解耦) | +| 位置 | `skills/pace-dev/dev-procedures-intent.md:206`(引用 `knowledge/_schema/risk-format.md` 风险预评估章节,或委托 `/pace-guard scan`) | +| 描述 | pace-dev 通过共享 Schema 定义输出格式,不再直接引用 pace-guard 内部 procedures 文件 | +| 影响 | 修改 guard-procedures 内部实现不影响 pace-dev(只要 risk-format.md 契约不变) | | 反向感知 | `skills/pace-guard/SKILL.md:2`(NOT 声明排除触发混淆) | -### pace-dev → pace-test(procedures 内联 + 命令建议) +### pace-dev → pace-test(Schema 契约 + 命令委托) | 属性 | 值 | |------|-----| -| 耦合类型 | **代码内联** + 命令建议 + 数据文件共享 | -| 风险等级 | **高** | -| 内联位置 | `skills/pace-dev/dev-procedures-developing.md:146`("按 `test-procedures-strategy-gen.md` §3 执行 strategy 生成流程") | +| 耦合类型 | **Schema 契约**(通过 test-strategy-format.md 接口)+ 命令委托 + 数据文件共享 | +| 风险等级 | **低**(已解耦) | +| 契约位置 | `skills/pace-dev/dev-procedures-developing.md:146`(引用 `knowledge/_schema/test-strategy-format.md`,或委托 `/pace-test strategy`) | | 命令建议 | `dev-procedures-developing.md:135`(`/pace-test generate`)、`:171`(`/pace-test dryrun 1`)、`dev-procedures-gate.md:17`(`/pace-test generate`) | | 共享数据 | `.devpace/rules/test-strategy.md`、`.devpace/rules/checks.md` | -| 影响 | 重命名/重构 `test-procedures-strategy-gen.md` 会直接破坏 pace-dev 的自动 strategy 生成 | +| 影响 | 修改 test-procedures 内部实现不影响 pace-dev(只要 test-strategy-format.md 契约不变) | -### pace-review → pace-test accept(深度格式依赖) +### pace-review → pace-test accept(共享契约) | 属性 | 值 | |------|-----| -| 耦合类型 | **数据格式依赖(深度结构依赖)** | -| 风险等级 | **很高** | +| 耦合类型 | **共享 Schema 契约**(通过 accept-report-contract.md 接口) | +| 风险等级 | **中**(已从"很高"降级——格式变更通过契约文件协调) | +| 契约文件 | `knowledge/_schema/accept-report-contract.md`(生产方和消费方的共享接口) | | 声明位置 | `skills/pace-test/SKILL.md:19`("pace-review Gate 2:可消费 /pace-test accept 的验收映射报告") | -| 消费逻辑 | `skills/pace-review/review-procedures-gate.md:84-88`(对抗审查联动 accept 弱覆盖区域) | -| 结构化消费 | `skills/pace-review/review-procedures-gate.md:160-178`(独立章节,精确定义提取字段) | -| 模板嵌入 | `review-procedures-gate.md:197-201`(M 级)、`:239-243`(L/XL 级)摘要模板内嵌 accept 字段 | -| 依赖字段 | 通过率、验证级别分布(L1/L2/L3)、预言审查(有效/弱/虚假覆盖)、置信度(High/Medium/Low)、自审计 | -| 影响 | pace-test accept 输出格式变更将直接破坏 pace-review 的摘要模板 | +| 消费逻辑 | `skills/pace-review/review-procedures-gate.md`(引用 accept-report-contract.md 提取规则) | +| 模板嵌入 | `review-procedures-gate.md` 摘要模板的 accept 字段按契约定义的格式填充 | +| 影响 | 变更 accept 输出格式时修改 accept-report-contract.md,双方同步适配 | ### pace-review → pace-learn(打回信息数据流) @@ -114,15 +113,15 @@ ## §2 计划与变更管理 -### pace-change → pace-plan adjust(代码内联) +### pace-change → pace-plan adjust(命令委托) | 属性 | 值 | |------|-----| -| 耦合类型 | **代码内联**(最高风险耦合) | -| 风险等级 | **高** | +| 耦合类型 | **命令委托**(通过 `/pace-plan adjust` 委托 + iteration-format.md 契约) | +| 风险等级 | **低**(已解耦) | | 位置 | `skills/pace-change/change-procedures-types.md:85` | -| 描述 | "用户确认 → 内联执行 /pace-plan adjust 的逻辑(读取 adjust-procedures.md),无需用户手动切换命令" | -| 影响 | 修改 `pace-plan/adjust-procedures.md` 时必须同步检查 pace-change 的内联引用 | +| 描述 | "用户确认 → 委托 `/pace-plan adjust` 执行,迭代写入规则见 iteration-format.md" | +| 影响 | 修改 adjust-procedures.md 内部实现不影响 pace-change(只要 iteration-format.md 契约不变) | ### pace-change → pace-dev / pace-sync(流转建议) @@ -215,10 +214,11 @@ |---------|--------| | pace-dev (CR 状态转换逻辑) | pace-review, post-cr-update Hook, sync-push Hook, pace-pulse | | pace-dev (Gate 检查逻辑) | pace-test (dryrun 对照表), pre-tool-use Hook | -| pace-guard `guard-procedures-scan.md` | **pace-dev**(直接引用此文件路径执行 L/XL 扫描) | -| pace-test `test-procedures-strategy-gen.md` | **pace-dev**(直接引用此文件路径执行 strategy 生成) | -| pace-test accept (输出格式) | **pace-review**(摘要模板内嵌 accept 字段,深度格式依赖) | -| pace-plan `adjust-procedures.md` | **pace-change**(内联执行此逻辑) | +| pace-guard `guard-procedures-scan.md` | 无直接依赖方(pace-dev 已改引用 risk-format.md 契约) | +| pace-test `test-procedures-strategy-gen.md` | 无直接依赖方(pace-dev 已改引用 test-strategy-format.md 契约) | +| pace-test accept (输出格式) | **accept-report-contract.md**(变更格式时需同步更新契约文件) | +| pace-plan `adjust-procedures.md` | 无直接依赖方(pace-change 已改为委托 `/pace-plan adjust`) | +| **accept-report-contract.md** | **pace-test accept**(生产方)+ **pace-review**(消费方) | | pace-learn (写入管道格式) | pace-retro (学习请求格式), post-cr-update Hook | | pace-retro (迭代传递清单格式) | pace-plan next (消费传递清单) | | pace-next 命令映射表 | 新增/重命名任何 Skill 命令时 | diff --git a/docs/design/vision.md b/docs/design/vision.md index 979b9c2..1303215 100644 --- a/docs/design/vision.md +++ b/docs/design/vision.md @@ -114,6 +114,8 @@ ## 业务目标 +> OBJ 可标注产品维度属性:类型(business/product/tech)+ 时间维度(短期/中期/长期)。详见 `knowledge/_schema/project-format.md` "业务目标"章节。 + ### MVP 阶段(1-2 周) | ID | 目标 | 成效指标(MoS) | 验证方式 | diff --git a/docs/features/pace-biz.md b/docs/features/pace-biz.md new file mode 100644 index 0000000..df3267e --- /dev/null +++ b/docs/features/pace-biz.md @@ -0,0 +1,156 @@ +# Business Planning (`/pace-biz`) + +devpace has always managed the flow from product features (PF) down to code changes (CR), but the upstream question — *where do these features come from?* — was left outside the system. Business opportunities were captured in scattered notes, epics lived in external tools, and the link between strategic objectives and day-to-day development was implicit at best. `/pace-biz` closes this gap by bringing structured business planning into the same value chain, so that every line of code can be traced back to a business opportunity. + +## Quick Start + +``` +1. /pace-biz opportunity "Enterprise clients need SSO" → Capture opportunity → OPP-001 created +2. /pace-biz epic OPP-001 "Enterprise Authentication" → Create epic → EPIC-001 with OBJ alignment +3. /pace-biz decompose EPIC-001 → Break down → BRs and PFs generated +``` + +Or let Claude guide you interactively: + +``` +You: /pace-biz +Claude: [Recommends next action based on project context] + Or choose: opportunity / epic / decompose / align / view / discover / import / infer +``` + +Start from a vague idea: + +``` +4. /pace-biz discover "I want to build a task management tool" → Multi-turn discovery → Full candidate tree +5. /pace-biz import meeting-notes.md → Extract requirements → Merge into tree +6. /pace-biz infer → Scan codebase → Gap report +``` + +## Workflow + +### `opportunity` — Capture Business Opportunities + +Business opportunities are the raw inputs to the planning process — market signals, customer feedback, stakeholder requests, or competitive observations. `/pace-biz opportunity` captures them with structured metadata so nothing falls through the cracks. + +Each opportunity receives: +- **Auto-numbered ID** (OPP-001, OPP-002, ...) +- **Source classification** — customer feedback, market research, stakeholder request, competitive analysis, technical debt, or internal initiative +- **Initial assessment** — Claude suggests relevance to existing OBJs and potential impact level +- **Persisted record** — Written to `.devpace/opportunities.md` with creation date and status (new / evaluating / accepted / declined / deferred) + +Multiple opportunities can reference the same strategic objective, building a natural demand signal for prioritization. + +### `epic` — Create Strategic Epics + +Epics are the bridge between raw opportunities and actionable business requirements. `/pace-biz epic` creates a structured epic that groups related work under a clear business intent. + +An epic includes: +- **OBJ alignment** — Which strategic objectives does this epic serve? Claude suggests mappings based on the epic description and linked opportunities +- **Measures of Success (MoS)** — Concrete, verifiable outcomes that define "done" at the business level +- **Scope boundary** — What is in scope and what is explicitly excluded +- **Independent file** — Each epic is stored as `epics/EPIC-xxx.md` for traceability and cross-referencing + +Epics can be created from an existing opportunity (`/pace-biz epic OPP-001 "title"`) or directly (`/pace-biz epic "title"`). When created from an opportunity, the link is recorded in both directions. + +### `decompose` — Break Down into Deliverables + +Decomposition is where strategic intent meets execution planning. `/pace-biz decompose` supports two decomposition paths: + +1. **Epic → BR** — Break an epic into business requirements, each representing a distinct business capability or outcome +2. **BR → PF** — Break a business requirement into product features, each deliverable in one or two iterations + +Claude analyzes the parent entity and suggests a decomposition plan — number of children, proposed titles, scope for each. The user reviews, adjusts, and confirms before any files are created. Decomposition respects the existing value chain: new BRs link back to their epic, new PFs link back to their BR. + +### `align` — Strategic Alignment Check + +As the project grows, it is easy for the business plan to drift. `/pace-biz align` performs a health check across the entire upstream value chain: + +| Check | What it detects | +|-------|-----------------| +| **OBJ coverage** | Strategic objectives with no epics or BRs mapped to them | +| **Orphan detection** | Epics, BRs, or PFs that are not linked to any upstream entity | +| **MoS completeness** | Epics or BRs missing measurable success criteria | +| **Decomposition gaps** | Epics with no BRs, or BRs with no PFs | +| **Staleness** | Opportunities stuck in "new" status beyond a configurable threshold | + +The output is a concise alignment report with specific recommendations for each issue found. + +### `view` — Business Panorama + +`/pace-biz view` renders the full value stream from opportunities down to CRs, giving a bird's-eye view of how business intent flows through the system: + +``` +OPP-001 "Enterprise SSO demand" + └─ EPIC-001 "Enterprise Authentication" [OBJ-1] + ├─ BR-003 "SSO Integration" + │ ├─ PF-007 "SAML Provider" → CR-012 (developing) + │ └─ PF-008 "OIDC Provider" → CR-013 (created) + └─ BR-004 "Session Management" + └─ PF-009 "Token Lifecycle" → CR-014 (created) +``` + +Filters are available by OBJ, epic, status, or depth level. When called without filters, the full tree is displayed with status indicators. + +### `discover` — Interactive Requirements Discovery + +When starting from a vague idea — "I want to build a smart customer service system" — `/pace-biz discover` launches a guided multi-turn conversation that progressively shapes the idea into a structured value chain. + +The process unfolds in stages: +1. **Goal framing** (1-2 rounds) — What problem are we solving? Who are the users? +2. **Feature brainstorming** (2-4 rounds) — What must users be able to do? What happens in edge cases? +3. **Boundary definition** (1-2 rounds) — What is explicitly out of scope? What constraints exist? +4. **Validation** (1 round) — Review the structured candidate tree (OPP → Epic → BR → PF) and adjust + +Session state is persisted to `.devpace/scope-discovery.md`, so discovery can span multiple conversations. Once confirmed, all candidates are written to the appropriate `.devpace/` files and the temporary session file is removed. + +### `import` — Multi-Source Document Import + +Teams accumulate requirements in many places — meeting notes, user feedback surveys, competitor analyses, technical debt lists. `/pace-biz import` reads these documents, extracts requirement entities, and merges them into the existing feature tree. + +Supported source types (auto-detected): +- **Meeting minutes** — action items become BR/PF candidates +- **User feedback** — pain points become BRs, feature requests become PFs +- **Competitor analysis** — gap features become PF candidates +- **Technical debt lists** — debt items become PFs tagged as technical debt +- **Issue exports** (CSV/JSON) — issues map to PF/CR candidates +- **PRD / API specs** — same parsing as `/pace-init --from` + +Each extracted entity is classified as NEW, DUPLICATE, ENRICHMENT, or CONFLICT relative to the existing tree. The user reviews a diff-style merge plan before any files are written. Import operates at the OPP/Epic/BR/PF level — it does not create CRs. + +### `infer` — Codebase Feature Inference + +For legacy projects or projects that outgrew their documentation, `/pace-biz infer` scans the codebase and reverse-engineers a feature map: + +- **Structure analysis** — directories, routes, API endpoints, data models, UI components +- **Signal mining** — TODO/FIXME density, README vs code drift, package scripts +- **Git-enhanced analysis** (when available) — file hotspots, co-change coupling, contributor distribution + +The output is a three-part gap report: +1. **Untracked features** — code exists but the feature tree has no corresponding PF +2. **Unimplemented features** — feature tree has PFs but no code exists +3. **Technical debt** — high TODO/FIXME concentration areas + +Users select which items to add to the feature tree. Technical debt PFs are suffixed with "(technical debt)" for easy filtering. + +## Backward Compatibility + +Projects initialized before `/pace-biz` was introduced — those without `opportunities.md`, `epics/`, or upstream BR linkage — continue to work without any changes. The existing PF → CR flow is unaffected. `/pace-biz` capabilities become available incrementally: capture your first opportunity or create your first epic whenever you are ready, and the value chain extends upward naturally. + +## Integration with Other Commands + +| Command | Relationship | +|---------|-------------| +| `/pace-init` | Initializes the `.devpace/` structure. After `/pace-biz` is available, `pace-init` can optionally scaffold `opportunities.md` and `epics/` directory. | +| `/pace-change` | Handles PF-level requirement changes. `/pace-biz` operates upstream — creating the BRs and PFs that `/pace-change` later manages. | +| `/pace-plan` | Plans iterations by selecting PFs. `/pace-biz decompose` produces the PFs that feed into `/pace-plan next`. | +| `/pace-status` | Reflects the full project state. With `/pace-biz` data present, status views can include upstream context (epic progress, OBJ coverage). | +| `/pace-trace` | Traces value chain connections. `/pace-biz` enriches traceability by adding the OPP → EPIC → BR layers above the existing BR → PF → CR chain. | + +## Related Resources + +- [epic-format.md](../../knowledge/_schema/epic-format.md) — Epic file schema +- [br-format.md](../../knowledge/_schema/br-format.md) — Business requirement file schema +- [opportunity-format.md](../../knowledge/_schema/opportunity-format.md) — Opportunity record schema +- [skills/pace-biz/](../../skills/pace-biz/) — Operational procedures +- [devpace-rules.md](../../rules/devpace-rules.md) — Runtime behavior rules +- [User Guide](../user-guide.md) — Quick reference for all commands diff --git a/docs/features/pace-biz_zh.md b/docs/features/pace-biz_zh.md new file mode 100644 index 0000000..2b60713 --- /dev/null +++ b/docs/features/pace-biz_zh.md @@ -0,0 +1,156 @@ +# 业务规划(`/pace-biz`) + +devpace 一直管理着从产品功能(PF)到代码变更(CR)的交付流程,但上游的问题——*这些功能从何而来?*——始终游离在体系之外。业务机会散落在各种笔记中,专题(Epic)活在外部工具里,战略目标与日常开发之间的关联只能靠默契维系。`/pace-biz` 补上了这一环,将结构化的业务规划纳入同一条价值链,让每一行代码都能追溯到它背后的业务机会。 + +## 快速上手 + +``` +1. /pace-biz opportunity "企业客户需要 SSO" → 捕获机会 → OPP-001 创建 +2. /pace-biz epic OPP-001 "企业级认证" → 创建专题 → EPIC-001 关联 OBJ +3. /pace-biz decompose EPIC-001 → 分解需求 → 生成 BR 和 PF +``` + +或者让 Claude 交互式引导: + +``` +你: /pace-biz +Claude:[根据项目上下文推荐下一步操作] + 或选择:opportunity / epic / decompose / align / view / discover / import / infer +``` + +从模糊想法开始: + +``` +4. /pace-biz discover "我想做一个任务管理工具" → 多轮对话发现 → 完整候选树 +5. /pace-biz import 会议纪要.md → 提取需求 → 合并到功能树 +6. /pace-biz infer → 扫描代码库 → 差距报告 +``` + +## 子命令 + +### `opportunity` — 捕获业务机会 + +业务机会是规划流程的原始输入——市场信号、客户反馈、利益相关者请求或竞争观察。`/pace-biz opportunity` 用结构化元数据捕获它们,确保没有遗漏。 + +每个机会包含: +- **自动编号**(OPP-001、OPP-002……) +- **来源分类** — 客户反馈、市场调研、利益相关者请求、竞争分析、技术债务、内部倡议 +- **初步评估** — Claude 建议与现有 OBJ 的关联度和潜在影响级别 +- **持久化记录** — 写入 `.devpace/opportunities.md`,含创建日期和状态(new / evaluating / accepted / declined / deferred) + +多个机会可以指向同一战略目标,自然形成需求优先级的信号积累。 + +### `epic` — 创建战略专题 + +专题是原始机会与可执行业务需求之间的桥梁。`/pace-biz epic` 创建结构化专题,将相关工作归入清晰的业务意图之下。 + +专题包含: +- **OBJ 对齐** — 服务于哪些战略目标?Claude 根据专题描述和关联机会建议映射 +- **成功度量(MoS)** — 具体的、可验证的业务级完成标准 +- **范围边界** — 明确纳入和排除的内容 +- **独立文件** — 每个专题存储为 `epics/EPIC-xxx.md`,支持追溯和交叉引用 + +专题可从现有机会创建(`/pace-biz epic OPP-001 "标题"`)或直接创建(`/pace-biz epic "标题"`)。从机会创建时,双向链接自动记录。 + +### `decompose` — 分解为可交付项 + +分解是战略意图与执行规划的交汇点。`/pace-biz decompose` 支持两条分解路径: + +1. **Epic → BR** — 将专题分解为业务需求,每个代表一项独立的业务能力或成果 +2. **BR → PF** — 将业务需求分解为产品功能,每个可在一到两个迭代内交付 + +Claude 分析父级实体并建议分解方案——子项数量、建议标题、各自范围。用户审查、调整并确认后才创建文件。分解遵循现有价值链:新 BR 链接回所属专题,新 PF 链接回所属 BR。 + +### `align` — 战略对齐检查 + +随着项目增长,业务规划容易偏移。`/pace-biz align` 对整个上游价值链做健康检查: + +| 检查项 | 检测内容 | +|--------|---------| +| **OBJ 覆盖率** | 没有专题或 BR 映射的战略目标 | +| **孤立实体** | 未链接到任何上游实体的专题、BR 或 PF | +| **MoS 完整性** | 缺少可度量成功标准的专题或 BR | +| **分解空白** | 没有 BR 的专题,或没有 PF 的 BR | +| **停滞检测** | 长时间停留在"new"状态的机会 | + +输出为简洁的对齐报告,针对每个发现的问题给出具体建议。 + +### `view` — 业务全景视图 + +`/pace-biz view` 渲染从机会到 CR 的完整价值流,鸟瞰业务意图如何贯穿整个系统: + +``` +OPP-001 "企业 SSO 需求" + └─ EPIC-001 "企业级认证" [OBJ-1] + ├─ BR-003 "SSO 集成" + │ ├─ PF-007 "SAML 提供商" → CR-012 (developing) + │ └─ PF-008 "OIDC 提供商" → CR-013 (created) + └─ BR-004 "会话管理" + └─ PF-009 "Token 生命周期" → CR-014 (created) +``` + +支持按 OBJ、专题、状态或层级深度过滤。无过滤条件时展示完整树状结构及状态指示。 + +### `discover` — 交互式需求发现 + +当只有一个模糊想法——"我想做一个智能客服系统"——`/pace-biz discover` 启动多轮引导对话,逐步将想法塑造为结构化的价值链。 + +流程分阶段展开: +1. **目标框定**(1-2 轮)——要解决什么问题?目标用户是谁? +2. **功能头脑风暴**(2-4 轮)——用户必须能做什么?异常情况怎么办? +3. **边界定义**(1-2 轮)——明确不做什么?有什么约束? +4. **验证确认**(1 轮)——审查结构化候选树(OPP→Epic→BR→PF),调整后写入 + +会话状态持久化到 `.devpace/scope-discovery.md`,发现过程可跨多次对话。确认后所有候选写入对应 `.devpace/` 文件,临时会话文件删除。 + +### `import` — 多源文档导入 + +团队在很多地方积累需求——会议纪要、用户反馈调研、竞品分析、技术债务清单。`/pace-biz import` 读取这些文档,提取需求实体,合并到现有功能树。 + +支持的源类型(自动检测): +- **会议纪要** — Action Items 转为 BR/PF 候选 +- **用户反馈** — 痛点转为 BR,功能请求转为 PF +- **竞品分析** — 差距功能转为 PF 候选 +- **技术债务清单** — 债务项转为 PF(标记技术债务) +- **Issue 导出**(CSV/JSON)— Issues 映射为 PF/CR 候选 +- **PRD / API 规格** — 同 `/pace-init --from` 的解析规则 + +每个提取的实体按 NEW/DUPLICATE/ENRICHMENT/CONFLICT 分类。用户审查 diff 格式的合并计划后才写入文件。import 在 OPP/Epic/BR/PF 层面操作——不创建 CR。 + +### `infer` — 代码库功能推断 + +对于遗留项目或文档滞后的项目,`/pace-biz infer` 扫描代码库,反向推导功能地图: + +- **结构分析** — 目录、路由、API 端点、数据模型、UI 组件 +- **信号挖掘** — TODO/FIXME 密度、README 与代码漂移、构建脚本 +- **Git 增强分析**(可用时)— 文件热点、共变耦合、贡献者分布 + +输出为三段式差距报告: +1. **未追踪功能** — 代码存在但功能树中无对应 PF +2. **未实现功能** — 功能树有 PF 但无代码实现 +3. **技术债务** — TODO/FIXME 高密度区域 + +用户选择哪些项纳入功能树。技术债务 PF 附"(技术债务)"后缀,便于过滤。 + +## 向后兼容 + +在 `/pace-biz` 引入之前初始化的项目——没有 `opportunities.md`、`epics/` 目录或上游 BR 链接——继续正常工作,不受任何影响。现有的 PF → CR 流程完全不变。`/pace-biz` 的能力渐进式可用:在你准备好时捕获第一个机会或创建第一个专题,价值链自然向上延伸。 + +## 与其他命令的集成 + +| 命令 | 与 `/pace-biz` 的关系 | +|------|---------------------| +| `/pace-init` | 初始化 `.devpace/` 结构。`/pace-biz` 可用后,`pace-init` 可选择性地创建 `opportunities.md` 和 `epics/` 目录。 | +| `/pace-change` | 处理 PF 级需求变更。`/pace-biz` 在上游操作——创建 BR 和 PF,由 `/pace-change` 后续管理。 | +| `/pace-plan` | 通过选择 PF 规划迭代。`/pace-biz decompose` 产出的 PF 直接进入 `/pace-plan next` 的候选池。 | +| `/pace-status` | 展示完整项目状态。有 `/pace-biz` 数据时,状态视图可包含上游上下文(专题进度、OBJ 覆盖率)。 | +| `/pace-trace` | 追溯价值链连接。`/pace-biz` 在现有 BR → PF → CR 链之上增加 OPP → EPIC → BR 层级,丰富追溯能力。 | + +## 相关资源 + +- [epic-format.md](../../knowledge/_schema/epic-format.md) — 专题文件 schema +- [br-format.md](../../knowledge/_schema/br-format.md) — 业务需求文件 schema +- [opportunity-format.md](../../knowledge/_schema/opportunity-format.md) — 机会记录 schema +- [skills/pace-biz/](../../skills/pace-biz/) — 操作规程 +- [devpace-rules.md](../../rules/devpace-rules.md) — 运行时行为规则 +- [用户指南](../user-guide.md) — 所有命令快速参考 diff --git a/docs/features/pace-feedback.md b/docs/features/pace-feedback.md index 8523e27..d48e33e 100644 --- a/docs/features/pace-feedback.md +++ b/docs/features/pace-feedback.md @@ -8,8 +8,10 @@ Every piece of feedback receives a unique **FB-ID** for full lifecycle tracking ``` 1. /pace-feedback report "API 500 errors in /checkout" → Emergency channel → Create hotfix CR -2. /pace-feedback "search is too slow" → Classify → Improvement pool -3. /pace-feedback → Guided collection → Two-round dialog +2. /pace-feedback incident open "全站不可用" → Create incident record (P0) + timeline +3. /pace-feedback incident close INCIDENT-001 → Close incident + generate postmortem +4. /pace-feedback "search is too slow" → Classify → Improvement pool +5. /pace-feedback → Guided collection → Two-round dialog ``` Or use the emergency hotline: @@ -111,6 +113,49 @@ After successful completion, delete `.devpace/backlog/FEEDBACK-DRAFT.md` to prep | **New Requirement** | Feature requests, stakeholder input | "Need bulk import", "Support SSO", "Add export to PDF" | | **Inbox** | Ambiguous signals, deferred items | "Something feels off", "Users complaining (details unclear)", "Monitor this behavior" | +## Incident Management + +The `incident` subcommand series provides structured incident lifecycle management — severity grading (P0-P3), timeline tracking, and postmortem generation — complementing the existing `report` emergency channel. + +### Subcommands + +| Subcommand | Description | +|------------|------------| +| `incident open ` | Create an incident record with severity assessment and timeline initialization | +| `incident close ` | Close an incident and generate a postmortem template | +| `incident timeline ` | View the incident timeline (read-only) | +| `incident list [--open]` | List all incidents, optionally filtered to open only | + +### Severity Grading + +Incidents are graded using the same severity matrix as hotfix assessment, mapped to incident levels: + +| Severity | Incident Level | Response | Example | +|----------|---------------|----------|---------| +| critical | P0 | Immediate response, all work paused | Site-wide outage, data loss | +| major | P1 | Respond within 1 hour | Core feature unavailable, severe performance degradation | +| minor | P2 | Respond same day | Non-core feature issue, UI error | +| trivial | P3 | Next iteration | UX polish, copy issues | + +### Workflow: report + incident + +`incident open` and `report` can be used together for full coverage: + +1. `incident open` creates the structured incident record (timeline, severity, tracking) +2. `report` creates the corresponding Hotfix CR for the actual fix +3. After CR is merged, `incident close` closes the incident and generates a postmortem + +### Postmortem + +When closing an incident, a postmortem template is automatically generated covering: +- **Impact summary**: Duration and scope +- **Root cause**: (to be filled) +- **Fix measures**: Summary of associated CR fixes +- **Prevention measures**: (to be filled) +- **Lessons learned**: (to be filled) + +Incident records are stored in `.devpace/incidents/INCIDENT-NNN.md`. See `incident-format.md` for the full schema. + ## Key Features ### Unique Feedback ID (FB-ID) Tracking @@ -357,8 +402,9 @@ Claude: Classification: Inbox (ambiguous, non-urgent) - [User Guide — /pace-feedback section](../user-guide.md) — Quick reference and command syntax - [Design Document — Feedback Loop Integration](../design/design.md) — Architecture and closed-loop design principles -- [skills/pace-feedback/](../../skills/pace-feedback/) — Operational procedures (5 split files: common, intake, trace, hotfix, analysis) +- [skills/pace-feedback/](../../skills/pace-feedback/) — Operational procedures (6 split files: common, intake, trace, hotfix, analysis, incident) - [fb-format.md](../../knowledge/_schema/fb-format.md) — Feedback record schema with FB-ID structure +- [incident-format.md](../../knowledge/_schema/incident-format.md) — Incident record schema with INCIDENT-NNN structure - [feedback-status.md](../../knowledge/_schema/feedback-status.md) — Feedback lifecycle state definitions - [metrics.md](../../knowledge/metrics.md) — Feedback management metrics definitions (resolution time, recurring rate, improvement adoption) - [devpace-rules.md](../../rules/devpace-rules.md) — Runtime behavior rules for feedback processing diff --git a/docs/features/pace-feedback_zh.md b/docs/features/pace-feedback_zh.md index 5dd68ab..c388d24 100644 --- a/docs/features/pace-feedback_zh.md +++ b/docs/features/pace-feedback_zh.md @@ -7,9 +7,11 @@ ## 快速上手 ``` -1. /pace-feedback report "支付接口 500 错误" → 紧急通道 → 创建 hotfix CR -2. /pace-feedback "搜索结果不准确" → 分类 → 改进建议池 -3. /pace-feedback → 渐进式两轮引导收集 +1. /pace-feedback report "支付接口 500 错误" → 紧急通道 → 创建 hotfix CR +2. /pace-feedback incident open "全站不可用" → 创建事件记录(P0)+ 时间线 +3. /pace-feedback incident close INCIDENT-001 → 关闭事件 + 生成 postmortem +4. /pace-feedback "搜索结果不准确" → 分类 → 改进建议池 +5. /pace-feedback → 渐进式两轮引导收集 ``` 紧急通道用法: @@ -62,6 +64,66 @@ Claude: [紧急通道] 严重度:critical | 关联:用户认证(PF-03) 处理完成后删除 `.devpace/backlog/FEEDBACK-DRAFT.md`。 +## 事件管理(Incident Management) + +`incident` 子命令系列提供结构化事件生命周期管理——严重度分级(P0-P3)、时间线追踪和事后复盘(Postmortem),补全现有 `report` 紧急通道的运维闭环。 + +### 子命令 + +| 子命令 | 说明 | +|--------|------| +| `incident open <描述>` | 创建事件记录(严重度评估 + 时间线初始化) | +| `incident close ` | 关闭事件 + 生成 postmortem 模板 | +| `incident timeline ` | 查看事件时间线(只读) | +| `incident list [--open]` | 列出所有事件,可筛选仅显示未关闭事件 | + +### 严重度分级 + +复用 hotfix 严重度矩阵,映射为事件等级: + +| 严重度 | 事件等级 | 响应要求 | 示例 | +|--------|---------|---------|------| +| critical | P0 | 立即响应,所有工作暂停 | 全站不可用、数据丢失 | +| major | P1 | 1 小时内响应 | 核心功能不可用、性能严重降级 | +| minor | P2 | 当日响应 | 非核心功能异常、UI 错误 | +| trivial | P3 | 下个迭代处理 | 体验优化、文案问题 | + +### 工作流:report + incident 并行 + +`incident open` 和 `report` 可并行使用,实现完整覆盖: + +1. `incident open` 创建结构化事件记录(时间线、严重度、追踪) +2. `report` 创建对应的 Hotfix CR 用于实际修复 +3. CR merged 后,`incident close` 关闭事件并生成 postmortem + +### Postmortem(事后复盘) + +关闭事件时自动生成 postmortem 模板,涵盖: +- **影响摘要**:持续时间、影响范围 +- **根本原因**:(待填写) +- **修复措施**:关联 CR 修复摘要 +- **预防措施**:(待填写) +- **经验教训**:(待填写) + +事件记录存储在 `.devpace/incidents/INCIDENT-NNN.md`,完整格式定义见 `incident-format.md`。 + +### 使用示例 + +``` +你: /pace-feedback incident open "支付网关超时,全站交易中断" +Claude: [INCIDENT-003] 事件已创建 + 严重度:P0(critical → 立即响应) + 状态:open + 时间线:2026-03-08T14:30:00 事件创建 + 建议立即 /pace-feedback report 创建 Hotfix CR。 + +你: /pace-feedback incident close INCIDENT-003 +Claude: [INCIDENT-003] 事件已关闭 + 持续时间:2 小时 15 分 + 关联 CR:CR-067(已 merged) + Postmortem 模板已生成,请填写根本原因和预防措施。 +``` + ## 核心特性 ### FB-ID 全链路追踪 @@ -165,6 +227,7 @@ Claude: 已恢复。上次收集到:症状=接口超时、影响=部分用户 - [User Guide — /pace-feedback](../user-guide.md) — 参数速查 - [英文版本](./pace-feedback.md) — English version -- [skills/pace-feedback/](../../skills/pace-feedback/) — Skill 实现和详细规程 +- [skills/pace-feedback/](../../skills/pace-feedback/) — Skill 实现和详细规程(6 个分拆文件:common、intake、trace、hotfix、analysis、incident) +- [incident-format.md](../../knowledge/_schema/incident-format.md) — 事件记录格式定义 - [devpace-rules.md §14](../../rules/devpace-rules.md) — 条件生效规则 - [metrics.md](../../knowledge/metrics.md) — 度量指标定义 diff --git a/docs/features/pace-next.md b/docs/features/pace-next.md index 91ef41d..7307643 100644 --- a/docs/features/pace-next.md +++ b/docs/features/pace-next.md @@ -9,13 +9,15 @@ Where `/pace-status` answers "where are we?", `/pace-next` answers "where should ## Quick Start ``` -1. /pace-next --> Top-1 recommendation (3 lines: suggestion + reason + action) -2. /pace-next detail --> Top-3 candidates (up to 8 lines) -3. /pace-next why --> Expand reasoning chain (2-5 lines: signal scan, priority comparison, alternatives) -4. /pace-trace next --> Full signal collection and traversal trace +1. /pace-next --> Top-1 recommendation (3 lines: suggestion + reason + action) +2. /pace-next detail --> Top-3 candidates (up to 8 lines) +3. /pace-next why --> Expand reasoning chain (2-5 lines: signal scan, priority comparison, alternatives) +4. /pace-next journey --> Full workflow journey from current state to goal (auto-selects template) +5. /pace-next journey hotfix --> Journey with a specific template +6. /pace-trace next --> Full signal collection and traversal trace ``` -The default output is designed to answer "what should I do next?" in under three seconds of reading time. Use `detail` when you want alternatives, and `why` when you want to understand the reasoning. +The default output is designed to answer "what should I do next?" in under three seconds of reading time. Use `detail` when you want alternatives, `why` when you want to understand the reasoning, and `journey` when you want to see the full path ahead. ## Core Features @@ -115,6 +117,41 @@ Candidates (by priority): When only one signal fires, the candidates section is omitted. +### Journey Mode + +`/pace-next journey` shifts from "what is the single next action?" to "what is the full path from here to the goal?" It renders a step-by-step journey view showing completed steps, the current position, and remaining steps -- all advisory, with no automatic execution. + +**Templates:** + +| Template | Journey Path | Use Case | +|----------|-------------|----------| +| `new-feature` | biz discover → decompose → plan next → dev → review → merged | Deliver a feature from scratch | +| `iteration` | plan next → [dev → review → merged]* → plan close → retro | Full iteration cycle | +| `hotfix` | feedback report → dev → review → release deploy | Emergency fix | +| `release` | release create → deploy → verify → close | Standard release | +| `onboarding` | init → dev (first feature) → review → merged | First-time user experience | + +When no template name is provided, journey auto-selects based on project state (e.g., new project with no CRs → `onboarding`; active iteration → `iteration`). + +**Example output:** + +``` +Journey: iteration — complete the current iteration cycle + +✅ Plan iteration — 3 features scoped +✅ Dev PF-001 — "OAuth integration" merged +👉 Dev PF-002 — say "implement [feature name]" or /pace-dev +⏳ Review — /pace-review +⏳ Iteration retro — /pace-retro + +Progress: 2/5 steps complete +``` + +**Key rules:** +- Advisory only -- shows the path, never auto-executes any Skill +- Stateless -- no journey state file is persisted; the view is dynamically derived from `.devpace/` on every call +- Complementary to default mode -- journey shows the full map, default mode recommends the single next step + ## Output Examples ### Default -- Quick Recommendation @@ -206,6 +243,7 @@ All signal definitions, grouping, and role reordering rules are maintained in `k - [SKILL.md](../../skills/pace-next/SKILL.md) -- Skill definition, input/output, and high-level flow - [next-procedures.md](../../skills/pace-next/next-procedures.md) -- Detailed decision algorithm, output formats, and role adaptation rules +- [next-procedures-journey.md](../../skills/pace-next/next-procedures-journey.md) -- Journey orchestration templates, auto-selection logic, and output format - [signal-priority.md](../../knowledge/signal-priority.md) -- Signal definitions and priority groups (SSOT) - [signal-collection.md](../../knowledge/signal-collection.md) -- Shared signal collection procedures - [User Guide](../user-guide.md) -- Quick reference for all commands diff --git a/docs/features/pace-next_zh.md b/docs/features/pace-next_zh.md index 3dd591e..4d5a9aa 100644 --- a/docs/features/pace-next_zh.md +++ b/docs/features/pace-next_zh.md @@ -9,13 +9,15 @@ ## 快速上手 ``` -1. /pace-next --> 最高优先级 1 条建议(建议 + 原因 + 操作,3 行) -2. /pace-next detail --> top-3 候选列表(最多 8 行) -3. /pace-next why --> 展开推理链(2-5 行:信号扫描、优先级对比、备选方案) -4. /pace-trace next --> 查看完整信号采集和遍历过程 +1. /pace-next --> 最高优先级 1 条建议(建议 + 原因 + 操作,3 行) +2. /pace-next detail --> top-3 候选列表(最多 8 行) +3. /pace-next why --> 展开推理链(2-5 行:信号扫描、优先级对比、备选方案) +4. /pace-next journey --> 完整工作流旅程:从当前状态到目标的分步引导(自动选择模板) +5. /pace-next journey hotfix --> 指定模板的旅程视图 +6. /pace-trace next --> 查看完整信号采集和遍历过程 ``` -默认输出 3 秒内可读完。需要备选方案时用 `detail`,想了解推理逻辑时用 `why`。 +默认输出 3 秒内可读完。需要备选方案时用 `detail`,想了解推理逻辑时用 `why`,想看完整路径时用 `journey`。 ## 核心特性 @@ -115,6 +117,41 @@ top-1 成为建议,其余在 `detail` 模式中展示。 仅 1 条命中时不展示候选段。 +### 旅程模式 + +`/pace-next journey` 从"下一步做什么"升级为"从当前到目标的完整路径"。渲染分步旅程视图,标记已完成步骤、当前位置和待做步骤——纯建议性,不自动执行任何操作。 + +**旅程模板**: + +| 模板 | 编排路径 | 适用场景 | +|------|---------|---------| +| `new-feature` | biz discover → decompose → plan next → dev → review → merged | 从零开始交付一个功能 | +| `iteration` | plan next → [dev → review → merged]* → plan close → retro | 完整迭代循环 | +| `hotfix` | feedback report → dev → review → release deploy | 紧急修复 | +| `release` | release create → deploy → verify → close | 标准发布 | +| `onboarding` | init → dev(第一个功能) → review → merged | 新用户首次体验 | + +不指定模板名时,根据项目状态自动选择(例如:无 CR 的新项目 → `onboarding`;有活跃迭代 → `iteration`)。 + +**输出示例**: + +``` +旅程:iteration — 完成当前迭代循环 + +✅ 规划迭代 — 纳入 3 个功能点 +✅ 开发 PF-001 — "OAuth 集成"已合并 +👉 开发 PF-002 — 说"帮我实现 [功能名]"或 /pace-dev +⏳ 审批 — /pace-review +⏳ 迭代回顾 — /pace-retro + +进度:2/5 步完成 +``` + +**核心规则**: +- **只展示不执行**——展示路径,不自动触发任何 Skill +- **无状态文件**——不持久化旅程状态,每次调用从 `.devpace/` 动态推断 +- **与默认模式互补**——journey 展示全局路径,默认模式推荐单步行动 + ## 使用场景 ### 场景 1:开始新会话——先做什么? @@ -186,6 +223,7 @@ Claude: 💡 建议:MoS 达成率 82%——回顾业务成效指标 - [SKILL.md](../../skills/pace-next/SKILL.md) — Skill 定义、输入/输出和高层流程 - [next-procedures.md](../../skills/pace-next/next-procedures.md) — 详细决策算法、输出格式和角色适配规则 +- [next-procedures-journey.md](../../skills/pace-next/next-procedures-journey.md) — 旅程编排模板、自动选择逻辑和输出格式 - [signal-priority.md](../../knowledge/signal-priority.md) — 信号定义和优先级分组(SSOT) - [signal-collection.md](../../knowledge/signal-collection.md) — 共享信号采集规程 - [User Guide](../user-guide_zh.md) — 所有命令的快速参考 diff --git a/docs/features/pace-sync.md b/docs/features/pace-sync.md index 59c87d1..8df38d4 100644 --- a/docs/features/pace-sync.md +++ b/docs/features/pace-sync.md @@ -139,6 +139,30 @@ Reads all association records, compares devpace vs external state, and outputs a | CR-005 | #18 | merged | open | ❌ push | 02-24 15:00 | ``` +### `ci status` + +View recent CI/CD run status for the current branch. + +**Syntax**: `/pace-sync ci status` + +Queries GitHub Actions via `gh run list` and presents the last 5 runs with pass/fail summary. Can serve as an enhanced data source for Gate 4 CI checks. See [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md) for detailed steps. + +### `ci trigger` + +Manually trigger a GitHub Actions workflow. + +**Syntax**: `/pace-sync ci trigger [workflow-name]` + +Without arguments, lists available workflows. With a workflow name, triggers it on the current branch (with user confirmation). See [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md) for detailed steps. + +### `ci logs` + +View log summary for a specific CI run. + +**Syntax**: `/pace-sync ci logs [run-id]` + +Displays failed step logs by default. Without a run-id, automatically selects the most recent run. See [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md) for detailed steps. + ## State Mapping devpace CR states map to GitHub labels (e.g., `developing` → `in-progress`, `merged` → close Issue + `done`). The full mapping table is defined in [sync-mapping-format.md](../../knowledge/_schema/sync-mapping-format.md) (schema authority) and [sync-adapter-github.md](../../skills/pace-sync/sync-adapter-github.md) (GitHub-specific operations). @@ -240,6 +264,7 @@ Traditional integrations map "field A → field B" mechanically. devpace takes a ┌──────────────────────────────────────┐ │ pace-sync Skill Layer │ │ setup/link/push/pull/unlink/create/ │ +│ ci status/ci trigger/ci logs/ │ ├──────────────────────────────────────┤ │ Operation Orchestration │ │ sync-procedures-*.md │ diff --git a/docs/features/pace-sync_zh.md b/docs/features/pace-sync_zh.md index c3f9d06..72feb42 100644 --- a/docs/features/pace-sync_zh.md +++ b/docs/features/pace-sync_zh.md @@ -119,6 +119,30 @@ CR-003 状态不一致: | CR-005 | #18 | merged | open | ❌ 需推送 | 02-24 15:00 | ``` +### `ci status` + +查看当前分支最近的 CI/CD 运行状态。 + +**语法**:`/pace-sync ci status` + +通过 `gh run list` 查询 GitHub Actions,展示最近 5 次运行及通过率摘要。可作为 Gate 4 CI 检查的增强数据源。详细步骤见 [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md)。 + +### `ci trigger` + +手动触发 GitHub Actions workflow。 + +**语法**:`/pace-sync ci trigger [workflow 名]` + +无参数时列出可用 workflow。指定 workflow 名时在当前分支上触发(需用户确认)。详细步骤见 [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md)。 + +### `ci logs` + +查看指定 CI 运行的日志摘要。 + +**语法**:`/pace-sync ci logs [run-id]` + +默认显示失败步骤日志。不指定 run-id 时自动选取最近一次运行。详细步骤见 [sync-procedures-ci.md](../../skills/pace-sync/sync-procedures-ci.md)。 + ## 状态映射 devpace CR 状态与 GitHub 标签对应(如 `developing` → `in-progress`,`merged` → 关闭 Issue + `done`)。完整映射表定义于 [sync-mapping-format.md](../../knowledge/_schema/sync-mapping-format.md)(Schema 权威源)和 [sync-adapter-github.md](../../skills/pace-sync/sync-adapter-github.md)(GitHub 特有操作)。 @@ -220,7 +244,7 @@ Claude: | CR | 外部链接 | devpace | 外部状态 | 一致 | 最 ┌──────────────────────────────────────────┐ │ pace-sync Skill 层 │ │ setup / link / push / pull / unlink / │ -│ create / status │ +│ create / status / ci │ ├──────────────────────────────────────────┤ │ 语义桥接层(核心价值) │ │ 意图映射 + 冲突检测 + 适配器路由 │ diff --git a/docs/planning/progress.md b/docs/planning/progress.md index 619ac82..3d93c5d 100644 --- a/docs/planning/progress.md +++ b/docs/planning/progress.md @@ -18,15 +18,15 @@ | 维度 | 值 | |------|---| -| 版本 | **v1.6.1** Quality Evaluation & Developer Experience(已发布 2026-03-07) | -| 当前阶段 | **Phase 18 ✅ 完成**(M18.1 ✅ M18.2 ✅ M18.3 ✅) | -| 当前里程碑 | Phase 18 全部完成,Phase 19 待开始 | -| 任务进度 | **116/120**(T120 ✅,T108-T111 待做) | -| 场景覆盖 | 34/34 用户场景 · 72/72 功能需求 | -| 基础设施 | LICENSE ✅ · README ✅ · CONTRIBUTING ✅ · CHANGELOG ✅ · 用户指南 ✅ · 示例项目 ✅ · Hook Node.js ✅ · Agent 角色 ✅ · Model Tiering ✅ · CSO 审计 ✅ · 迁移验证 ✅ · Agent Memory ✅ · Async Hook ✅ · prompt Hook ✅ · Output Style ✅ · skill-creator 三层评估 ✅ · 18/18 Skill eval 覆盖 ✅ | +| 版本 | **v1.6.2** + BR 上游域建模(feature 分支,未发布) | +| 当前阶段 | **Phase 23 ✅ 完成**(M23.1-M23.4 全部关闭)→ **Phase 24 待开始** | +| 当前里程碑 | Phase 23 完成,Phase 24 M24.1(devpace-cadence MVP)待开始 | +| 任务进度 | **127/131**(T129-T131 ✅,T122 待做,T108-T111 待做) | +| 场景覆盖 | 42/42 用户场景(S35-S42 验收通过)· 90/90 功能需求 | +| 基础设施 | LICENSE ✅ · README ✅ · CONTRIBUTING ✅ · CHANGELOG ✅ · 用户指南 ✅ · 示例项目 ✅ · Hook Node.js ✅ · Agent 角色 ✅ · Model Tiering ✅ · CSO 审计 ✅ · 迁移验证 ✅ · Agent Memory ✅ · Async Hook ✅ · prompt Hook ✅ · Output Style ✅ · skill-creator 三层评估 ✅ · 19/19 Skill eval 覆盖 ✅ | | 阻塞项 | 无 | -| 下一步 | 1) Phase 19 智能推送 2) 聚合平台注册 | -| 最后更新 | 2026-03-07 | +| 下一步 | 1) Phase 24 devpace-cadence MVP(独立仓库) 2) Phase 19 智能推送 3) T122 pace-biz 实战验证 | +| 最后更新 | 2026-03-08 | ## 当前任务 @@ -163,6 +163,10 @@ | | **Phase 18 — 外部同步 MVP** | | | | | | T106 | pace-sync 产品优化 16 项(Wave 1-4) | M18.2 | OBJ-1, OBJ-12, F11.1-F11.14 | ✅ 完成 | 13 文件 310 行增量。Wave 1:C1 标签预创建 + A1 语义 Comment + B1 unlink + B2 dry-run。Wave 2:D1 status 同步摘要 + D3 change 同步提醒 + B3 create 子命令 + B4 Gate 同步规程。Wave 3:D4 教学触发 + D5 pulse 同步滞后信号 + C2 限流保护 + C3 Issue 状态检查 + A2 副产物非前置三阶段。Wave 4:A3 入站轮询架构设计。Roadmap Phase 18/19/20 修订 + design §19 更新 + 附录 B 架构图追加。223 pytest + markdownlint + 层隔离全通过 | | T107 | M18.3 Hook + Rules + 语义同步集成 | M18.3 | OBJ-1, OBJ-12, F11.8, F11.13 | ✅ 完成 | 7 文件变更:utils.mjs 缓存工具(+readSyncStateCache/updateSyncStateCache)+ sync-push.mjs 重写(缓存比对+merged 指令分级)+ post-cr-update.mjs 7 步管道对齐 §11(+条件第 7 步外部同步)+ test_hooks.py(sync-push 注册+TC-HK-16)+ rules §16 三处文案精炼 + feature docs 双层保障 section。224 pytest + markdownlint + 层隔离 + plugin 加载全通过 | +| | **Phase 21 — BR 上游业务规划域** | | | | | +| T121 | BR 上游域建模:Schema + Skill + 增强 + 文档 | M21.1-M21.4 | OBJ-1, OBJ-4, OBJ-6, S35-S39, F12.1-F12.11 | ✅ 完成 | M21.1-M21.5 全部完成。28 文件 +1180 行。S35-S39 验收通过。特性文档双语+eval 覆盖 | +| T122 | Phase 21 后续:pace-biz 实战验证 | M21.4 | OBJ-1, OBJ-9, S35-S39 | 待做 | 端到端场景验证(user-guide 已更新) | +| T123 | pace-biz 需求阶段增强:discover/import/infer | M21.5 | OBJ-1, OBJ-4, OBJ-6, S40-S42, F12.12-F12.17 | ✅ 完成 | 3 procedures + SKILL.md + rules/knowledge + 特性文档双语 + 规划文档 + eval。S40-S42 验收通过 | | T108 | Phase 19 M19.1 智能推送 + Gate 同步 | M19.1 | OBJ-1, OBJ-12, F11.12 | 待做 | auto-create+auto-link + Gate Comment/Label + 教学+pulse | | T109 | Phase 19 M19.2 Issue 生命周期 | M19.2 | OBJ-12, F11.11 | 待做 | create 端到端 + PR 关联 + 治理集成 | | T110 | Phase 19 M19.3 多平台预研 | M19.3 | OBJ-17 | 待做 | Linear 原型适配器 | @@ -170,6 +174,16 @@ | | **产品层跟踪优化** | | | | | | T112 | P1 组:PF 溢出模式 + 反向追溯 + 业务 pulse + 版本化 | -- | OBJ-1, OBJ-4, OBJ-6 | ✅ 完成 | A0-A3 详见变更记录 | | T113 | P2 组:MoS 量化 + PF 依赖 + Release 业务影响 + 优先级 + 文档 | -- | OBJ-1, OBJ-5, OBJ-6, OBJ-9 | ✅ 完成 | B2-B8 详见变更记录 | +| | **Phase 22 — 体验增强与紧耦合治理** | | | | | +| T124 | Skill 间接口契约层:review↔test 输出格式 Schema 化 | M22.1 | OBJ-3, G2 | ✅ 完成 | accept-report-contract.md 共享契约 + review-procedures-gate.md 改引用契约 | +| T125 | Skill 间接口契约层:dev↔guard/test/change↔plan 引用解耦 | M22.1 | OBJ-3, G2 | ✅ 完成 | 4 耦合点解耦:dev→guard(risk-format.md) + dev→test(test-strategy-format.md) + change→plan(委托/pace-plan) + skill-dependencies.md 更新 | +| T126 | 首次推进引导 + 无命令体验增强 | M22.2 | OBJ-5, UX1, UX3 | ✅ 完成 | pace-init 情境化引导(有代码→infer,空项目→discover,有文档→dev)+ rules §3 无命令体验映射表 | +| T127 | ADR 管理:pace-trace arch 子命令 | M22.3 | OBJ-4, G3 | ✅ 完成 | adr-format.md Schema + trace-procedures-arch.md + pace-trace SKILL.md 更新 | +| T128 | 技术债务一等公民化 | M22.4 | OBJ-3, G4 | ✅ 完成 | cr-format tech-debt 类型 + project-format tech-debt-budget 配置 + retro 技术债务趋势段 | +| | **Phase 23 — 预测与安全** | | | | | +| T129 | pace-retro forecast 子命令 | M23.1 | OBJ-1, D1 | ✅ 完成 | retro-procedures-forecast.md(交付概率算法+瓶颈识别+风险预警)+ SKILL.md 更新 | +| T130 | 安全维度深化 + Compact 恢复优化 | M23.2-M23.3 | OBJ-2, OBJ-3, G5, UX4 | ✅ 完成 | guard-procedures-scan.md 安全深度检查(Layer 1 关键词 + Layer 2 OWASP 6 类)+ pre-compact.sh 结构化恢复上下文 | +| T131 | 语义漂移检测增强 | M23.4 | OBJ-3, D2 | ✅ 完成 | dev-procedures-developing.md 语义漂移检测(持续验收对齐)+ review-procedures-gate.md 语义一致性评分(🟢/🟡/🔴) | | T114 | A4:6 个核心 Skill 特性文档 | -- | OBJ-9, OBJ-10 | ✅ 完成 | pace-dev(177 行) + pace-status(221 行) + pace-change(214 行) + pace-review(158 行) + pace-test(260 行) + pace-release(264 行)。共 1294 行。224 pytest + 83 markdownlint + 层隔离 + plugin 加载全通过 | | | **pace-plan UX 优化与功能增强** | | | | | | T115 | P0 组:空树引导 + 智能建议 | -- | OBJ-1, OBJ-8, S15, F3.5 | ✅ 完成 | E1 空功能树引导式规划(Step 3.1 降级分支)+ E2 Plan Proposal 智能建议(Step 3.6 改造为建议+确认模式) | @@ -195,11 +209,15 @@ | D7 | pace-release 从"被动追踪"演进为"主动编排" | 2026-02-22 | 开源生态调研 10 项目对标(Changesets/Release Please/git-cliff/Nx/release-it 等),devpace 拥有比 commit 消息更丰富的 CR 元数据 | design.md §14 重写 + release-format 增加 rolled_back + integrations-format 增加版本管理 | | D8 | Risk Fabric 采用"专属入口 + 嵌入式智能"双路径 | 2026-02-25 | 用户痛点"AI 不够主动"——需要预判→监控→趋势完整闭环;风险状态机独立于 CR 状态机(不增加 CR 复杂度) | 新增 /pace-guard Skill + risk-format Schema + 3 处嵌入集成 + Rules §10 风险感知 | | D9 | PF 溢出模式(Overflow Pattern)+ BR/OBJ 保持内联 | 2026-02-26 | PF 信息量增长后 project.md 职责混乱(全景图+详细说明书);BR(2-5 个/项目)和 OBJ(1-3 个)信息量不足以支撑独立文件 | pf-format.md 新 Schema + project-format 溢出规则 + /pace-status trace 反向追溯 + design §3 存储演变第三阶段 | +| D10 | BR 上游域建模:Epic 始终独立文件 + BR 溢出模式 + Opportunity 独立看板 + /pace-biz 统一入口 | 2026-03-07 | BR 上游空白(仅 ID+一行标题)无法兑现"业务→技术端到端追溯"承诺。Epic 内容量大(MoS+背景+BR 列表=10-30 行)值得始终独立;BR 类 PF 溢出模式平衡轻量与丰富;Opportunity 操作性追踪不污染战略全景图 | 3 新 Schema + /pace-biz(8 子命令)+ 9 Skill 增强 + S16/S17 信号 | +| D11 | BizDevOps 审查 v2 战略方向:"深度优于广度 + 契约优于内联 + 验证优于新增"。不新增 Skill,所有改进通过扩展现有 Skill 子命令实现。Skill 间紧耦合是最大维护性风险,Phase 22 最高优先级 | 2026-03-08 | 19 Skills 已到认知极限。skill-dependencies.md 揭示高风险耦合(review↔test、dev↔guard)。Phase 22-24 规划遵循"不膨胀"原则 | Phase 22-24 战略规划 + G2 紧耦合治理为 P0 | ## 变更记录 | 日期 | 变更 | 原因 | |------|------|------| +| 2026-03-08 | BizDevOps 全生命周期审查 v2 落地(Phase A):Phase 21 全部完成(M21.4+M21.5 关闭,S35-S42 验收通过)。审查文档存档(docs/plans/bizdevops-review-v2.md)。新增 Phase 22-24 战略规划(体验增强+紧耦合治理→预测与安全→可视化与企业级)。新增 T124-T131 任务。358 pytest 全通过 | BizDevOps 全生命周期审查:6 缺口(G1-G6)+ 5 UX 改进 + 5 差异化创新 | +| 2026-03-07 | Phase 21 BR 上游业务规划域建模:3 新 Schema(epic-format/br-format/opportunity-format)+ /pace-biz Skill(8 子命令 + 8 procedures)+ project-format 增强(愿景/战略/OBJ 产品维度/Epic 链接/BR 溢出)+ theory §3/§12 + design §3 概念模型重构 + 9 个 Skill 增强 + S16/S17 信号 + devpace-rules 更新 + 特性文档双语 + requirements S35-S42 F12 + roadmap Phase 21 + eval 覆盖。28 文件 +1180 行,346 pytest 全通过 | BR 上游空白无法兑现端到端追溯核心承诺 | | 2026-03-07 | v1.6.1 发布(Quality Evaluation & Developer Experience):CHANGELOG v1.6.1 + 版本号更新(state-format/state.md 模板/plugin.json/marketplace.json)+ 迁移链更新(v1.6.0→v1.6.1 §5)+ 测试修复(*-workspace/ 排除:conftest helper + 3 测试 + markdownlint ignores + validate-all.sh grep --exclude-dir + init-procedures-core.md 尾部空行 MD012)。CI release workflow 通过,GitHub Release + tar.gz 创建成功 | v1.6.1 patch 发布——14 commit 累积变更(评估基础设施+pace-init 优化+Hook 性能) | | 2026-03-07 | 会话结束 | -- | | 2026-02-28 | T120 /pace-next 深度优化 18 项(功能×6 + 体验×7 + 架构×5):架构基础——signal-priority.md 统一信号权威源(5 组 16 级 SSOT,替代三处独立矩阵)+ signal-collection.md 共享采集规程(9 数据源+价值链上下文采集+缓存机制设计)。核心重写——next-procedures.md 完全重构(分组优先级+风险信号 S2/S6+价值链模板+多 CR 排序+时间维度 S7+同步滞后 S11+经验标签匹配 8 类+why 推理链+角色重排序+session-start 去重)。SKILL.md 增加 why 参数+三层透明输出。联动更新——status-procedures-overview.md 改为引用 signal-priority.md SSOT(候选计数引导)+ devpace-rules.md §0 速查追加导航行+§11 第 5 步 merged 回路建议+全局导航集成段落(推/拉定位+去重+session-end 建议)。文档——特性文档双语(pace-next.md+pace-next_zh.md)+ requirements.md S27 验收 5/5 + F8.4-F8.7 新增。8 文件变更+4 文件新建。227 pytest + 157 markdownlint + 层隔离 + plugin 加载全通过 | /pace-next 深度分析方案实施——S27 验收标准全部勾选+SSOT 修复+价值链感知升级 | @@ -289,25 +307,39 @@ > 保留最近 5 条,超出时删除最旧记录。 +### 2026-03-08 — BizDevOps 全生命周期审查 v2(Phase A 立即) + +- **完成**:Phase 21 全部关闭(M21.4+M21.5 ✅,S35-S42 验收通过)。审查文档存档 docs/plans/bizdevops-review-v2.md(7 部分:覆盖矩阵+缺口分析 G1-G6+UX 分析 UX1-UX5+差异化建议 D1-D5+优先级路线图+战略建议+风险)。新增 Phase 22-24 战略规划到 roadmap.md。新增 T124-T131 任务。D11 战略决策记录。358 pytest 全通过 +- **决策**:D11 "深度优于广度+契约优于内联+验证优于新增"。不新增 Skill,Skill 间紧耦合是 P0 治理目标 +- **未完成**:Phase B-D 待后续阶段实施 +- **下次建议**:1) Phase 22 M22.1 Skill 间接口契约层 2) Phase 19 智能推送 3) T122 pace-biz 实战验证 + +### 2026-03-07 — Phase 21 BR 上游业务规划域建模 + +- **完成**:Phase 21 M21.1-M21.3 全部完成。新增 3 Schema + /pace-biz Skill(8 子命令 + 8 procedures)+ 9 个 Skill 增强 + 特性文档双语 + eval 覆盖。28 文件 +1180 行。346 pytest 全通过 +- **决策**:Epic 始终独立文件 + BR 溢出模式 + Opportunity 独立看板 + 双路径保持 +- **未完成**:无(M21.4-M21.5 在后续会话完成) +- **下次建议**:Phase 22 或 Phase 19 + ### 2026-03-07 — v1.6.1 发布 -- **完成**:v1.6.1 patch 发布。CHANGELOG 编写 + 版本号更新(state-format L52/L57 + state.md 模板 + plugin.json + marketplace.json)+ 迁移链更新(init-procedures-migration.md §5 新增 v1.6.0→v1.6.1)+ 测试修复 5 处(conftest `_is_workspace_path` helper + test_layer_separation/test_naming_conventions/test_template_placeholders 排除 workspace + markdownlint ignores + validate-all.sh grep --exclude-dir + init-procedures-core.md 尾部空行)。`bash scripts/bump-version.sh 1.6.1` + `bash scripts/validate-all.sh` 全绿 + git tag v1.6.1 + push origin main + push tag。CI Release workflow 两 job 全通过(Pre-release Validation 12s + Create Release 6s),GitHub Release 含 devpace-1.6.1.tar.gz +- **完成**:v1.6.1 patch 发布。CHANGELOG + 版本号更新 + 迁移链 + 测试修复。CI Release workflow 通过 - **未完成**:无 -- **下次建议**:1) Phase 19 智能推送 2) 聚合平台注册 +- **下次建议**:Phase 19 智能推送 ### 2026-02-26 — T107 M18.3 Hook+Rules+语义同步集成 -- **完成**:7 文件变更。utils.mjs +缓存工具(readSyncStateCache/updateSyncStateCache)+ sync-push.mjs 重写(缓存比对+merged 指令分级)+ post-cr-update.mjs 7 步管道对齐 §11(+条件第 7 步)+ test_hooks.py(sync-push 注册+TC-HK-16)+ rules §16 三处文案 + feature docs 双层保障。M18.3 完成,Phase 18 全部关闭 -- **决策**:状态缓存采用纯文本 `.devpace/.sync-state-cache`(不入 git),与 pulse-counter 的 `.pulse-count` 先例一致 +- **完成**:7 文件变更。sync-push.mjs 缓存比对 + post-cr-update.mjs 7 步管道 + rules §16 精炼。M18.3 完成,Phase 18 全部关闭 +- **决策**:状态缓存纯文本 `.devpace/.sync-state-cache` - **未完成**:无 -- **下次建议**:1) v1.5.0 版本发布 2) Phase 19 智能推送 3) 聚合平台注册 +- **下次建议**:版本发布 / Phase 19 ### 2026-02-26 — /pace-init 综合优化 14 项 -- **完成**:14 项优化实施(OPT-1~8 优化 + NEW-1~6 新增)。3 文件重写:SKILL.md(生命周期感知 3 阶段 + 4 新子命令 + --from 增强 + full 分阶段 + CLAUDE.md 合并 + 引导优化)+ init-procedures.md(信号检测算法 + 阶段策略 + 工具链精准检测 4 技术栈 + 迁移框架 + context.md 阈值调优 + 6 新规程)+ claude-md-devpace.md 模板标记。223 pytest + markdownlint + 层隔离 + plugin 加载全通过 -- **决策**:生命周期检测采用信号组合判定(git commit/tags/部署配置/源文件数),不暴露阶段标签给用户 +- **完成**:SKILL.md 生命周期感知 3 阶段 + 4 新子命令 + init-procedures 重写。223 pytest 全通过 +- **决策**:生命周期检测采用信号组合判定 - **未完成**:无 -- **下次建议**:1) M18.3 Hook+语义集成 2) 版本发布 3) Phase 19 +- **下次建议**:M18.3 Hook 集成 ## 遗留事项 diff --git a/docs/planning/requirements.md b/docs/planning/requirements.md index e5e336b..0a80cc9 100644 --- a/docs/planning/requirements.md +++ b/docs/planning/requirements.md @@ -569,6 +569,121 @@ | F11.13 | merged 自动 push 闭环 | S34 | P1 | | F11.14 | 轮询式入站感知(会话开始拉取外部变更) | — | P3 | +### S35:业务机会捕获 + +**角色**:产品经理/业务方 +**场景**:收到客户反馈、竞品动态或内部洞察,想记录下来以便后续评估 +**期望**:快速记录机会到看板,自动分类来源 + +**验收标准**: +- [x] `/pace-biz opportunity` 创建 OPP 条目到 opportunities.md +- [x] 自动推断来源类型(用户反馈/竞品观察/技术发现/市场趋势/内部洞察) +- [x] 支持后续评估和转化为 Epic + +### S36:专题创建与管理 + +**角色**:产品经理 +**场景**:评估业务机会后决定立项,需要创建专题(Epic)组织相关需求 +**期望**:从 Opportunity 转化或直接创建 Epic,定义成效指标 + +**验收标准**: +- [x] `/pace-biz epic` 创建 epics/EPIC-xxx.md 独立文件 +- [x] 关联 OBJ 和 Opportunity(如有) +- [x] 引导定义背景和 MoS +- [x] 自动更新 project.md 价值功能树 + +### S37:需求分解 + +**角色**:产品经理/开发者 +**场景**:已有 Epic 或 BR,需要分解为更细粒度的需求或功能 +**期望**:Claude 建议分解方案,用户确认后自动创建 + +**验收标准**: +- [x] `/pace-biz decompose EPIC-xxx` 分解 Epic 为 BR 列表 +- [x] `/pace-biz decompose BR-xxx` 分解 BR 为 PF 列表 +- [x] Claude 提供建议分解方案(含优先级建议) +- [x] 用户确认后自动更新所有关联文件 + +### S38:战略对齐检查 + +**角色**:产品经理/业务方 +**场景**:想检查当前需求是否覆盖所有业务目标,有没有孤立的需求 +**期望**:生成对齐度报告,发现覆盖缺口和孤立实体 + +**验收标准**: +- [x] `/pace-biz align` 只读分析 OBJ→Epic→BR 对齐度 +- [x] 报告 OBJ 覆盖率、孤立实体、MoS 完整性 +- [x] 向后兼容(无 Epic 时检查 OBJ→BR 对齐) + +### S39:业务全景查看 + +**角色**:所有角色 +**场景**:想快速了解从业务机会到开发进度的完整价值流 +**期望**:一目了然地看到 OPP→EPIC→BR→PF→CR 全景 + +**验收标准**: +- [x] `/pace-biz view` 展示完整价值流视图 +- [x] 统计各层实体数量和状态分布 +- [x] 向后兼容(无 Epic/Opportunity 时退化为 OBJ→BR→PF→CR 视图) + +### S40:探索式需求发现 + +**角色**:产品经理、开发者 +**场景**:只有一个模糊想法("我想做一个智能客服系统"),需要从零开始交互式梳理需求 +**期望**:通过多轮对话引导,产出结构化的 OPP→Epic→BR→PF 候选树 + +**验收标准**: +- [x] `/pace-biz discover` 启动多轮引导对话(目标→头脑风暴→边界→确认) +- [x] 中间状态持久化到 scope-discovery.md,支持跨会话继续 +- [x] 确认后写入 .devpace/(OPP + Epic + BR + PF) +- [x] 降级模式:无 .devpace/ 时输出到控制台 + +### S41:多源需求导入 + +**角色**:产品经理、开发者 +**场景**:散落在会议纪要、用户反馈、竞品分析中的需求,需要批量提取并整合到功能树 +**期望**:读取文档 → 自动分类提取 → 去重合并 → 用户确认后写入 + +**验收标准**: +- [x] `/pace-biz import` 接受文件路径/目录,自动检测源类型 +- [x] 合并分析:NEW/DUPLICATE/ENRICHMENT/CONFLICT 四分类 +- [x] 用户确认后增量写入 project.md 功能树 +- [x] 降级模式:project.md 为桩时跳过合并分析 + +### S42:代码库需求推断 + +**角色**:开发者 +**场景**:遗留项目接入或功能树滞后,需要从代码反向推断已有功能和技术债务 +**期望**:扫描代码结构 + TODO 注释 + Git 信号,产出差距报告 + +**验收标准**: +- [x] `/pace-biz infer` 扫描源码目录、注释、Git 热点 +- [x] 三段式报告:未追踪功能 + 未实现功能 + 技术债务 +- [x] 用户选择后写入功能树,技术债务 PF 标记后缀 +- [x] 降级模式:无 Git 时退化为目录+注释扫描 + +### F12:业务规划管理 + +| ID | 功能 | 对应场景 | 优先级 | +|----|------|---------|:------:| +| F12.1 | /pace-biz opportunity:业务机会捕获 | S35 | P1 | +| F12.2 | /pace-biz epic:专题创建与管理 | S36 | P1 | +| F12.3 | /pace-biz decompose:需求分解(Epic→BR, BR→PF) | S37 | P1 | +| F12.4 | /pace-biz align:战略对齐检查 | S38 | P2 | +| F12.5 | /pace-biz view:业务全景视图 | S39 | P2 | +| F12.6 | Epic 独立文件管理(epics/EPIC-xxx.md) | S36 | P1 | +| F12.7 | BR 溢出模式(requirements/BR-xxx.md) | S37 | P1 | +| F12.8 | Opportunity 看板(opportunities.md) | S35 | P1 | +| F12.9 | project.md 愿景/战略上下文 section | S36 | P2 | +| F12.10 | OBJ 产品维度属性(business/product/tech) | S36 | P2 | +| F12.11 | Epic/OPP 信号采集(S16/S17) | S35, S36 | P2 | +| F12.12 | /pace-biz discover:交互式需求发现(多轮对话→候选树) | S40 | P1 | +| F12.13 | /pace-biz import:多源文档导入(自动检测+合并分析) | S41 | P1 | +| F12.14 | /pace-biz infer:代码库推断(结构分析+信号挖掘+差距报告) | S42 | P2 | +| F12.15 | discover 会话持久化(scope-discovery.md 跨会话) | S40 | P1 | +| F12.16 | import 源类型自动检测(会议纪要/反馈/竞品/技术债务/Issue) | S41 | P1 | +| F12.17 | infer Git 增强分析(热点/共变/贡献者) | S42 | P2 | + ## 非功能需求 | ID | 需求 | 标准 | diff --git a/docs/planning/roadmap.md b/docs/planning/roadmap.md index 146b37c..e7e7afd 100644 --- a/docs/planning/roadmap.md +++ b/docs/planning/roadmap.md @@ -39,6 +39,10 @@ | Phase 18 | 外部同步 MVP | 手动同步 + GitHub MVP(pace-sync setup/link/push/status) | ✅ 完成 | | Phase 19 | 自动推送与多平台 | 自动推送 + 治理集成 + Linear/Jira 扩展 | 待开始 | | Phase 20 | 双向同步与 AI 冲突 | 入站事件 + 冲突检测 + AI 解决 | 待开始 | +| Phase 21 | BR 上游业务规划域 | Opportunity/Epic/BR 溢出 + /pace-biz Skill + 端到端追溯 | ✅ 完成 | +| Phase 22 | 体验增强与紧耦合治理 | Skill 间接口契约 + ADR 管理 + 技术债务一等公民 + 首推引导 | ✅ 完成 | +| Phase 23 | 预测与安全 | 预测性项目管理 + 安全维度 + Compact 恢复 + 语义漂移检测 | ✅ 完成 | +| Phase 24 | 可视化与企业级 | devpace-cadence MVP + 多项目组合管理 | 待开始 | --- @@ -573,12 +577,118 @@ --- +## Phase 21:BR 上游业务规划域 + +**目标**:补齐 BR 上游的业务规划域——从业务机会到专题(Epic)到业务需求的完整价值流建模,实现端到端追溯。 + +**对应 OBJ**:OBJ-1, OBJ-4, OBJ-6 + +### 里程碑 + +| # | 里程碑 | 状态 | 产出 | +|---|--------|------|------| +| M21.1 | 概念模型和 Schema 基础 | ✅ 完成 | epic-format.md + br-format.md + opportunity-format.md + project-format.md 增强 + theory.md/design.md §3 更新 | +| M21.2 | 核心 Skill 和增强 | ✅ 完成 | /pace-biz(8 子命令)+ pace-init/change/status/plan 增强 | +| M21.3 | 追溯和信号 | ✅ 完成 | pace-trace/retro/next/dev/release 增强 + S16/S17 信号 | +| M21.4 | 文档和测试 | ✅ 完成 | 特性文档双语 + requirements S35-S42 验收 + roadmap + eval 覆盖 | +| M21.5 | 需求阶段增强(discover/import/infer) | ✅ 完成 | 3 个新子命令 procedures + SKILL.md 更新 + 信号/规则/文档同步 | + +--- + +## Phase 22:体验增强与紧耦合治理 + +**目标**:解耦 Skill 间紧耦合(接口契约层)、新增 ADR 管理、技术债务一等公民化、首次推进引导增强。 + +**对应 OBJ**:OBJ-1, OBJ-3, OBJ-4, OBJ-5 + +**前置条件**:Phase 21 完成 + +### 里程碑 + +| # | 里程碑 | 状态 | 产出 | +|---|--------|------|------| +| M22.1 | Skill 间接口契约层 | ✅ 完成 | accept-report-contract.md + risk-format/test-strategy-format 契约引用 + 命令委托模式 + skill-dependencies.md 风险降级 | +| M22.2 | 首次推进引导 + 无命令体验 | ✅ 完成 | pace-init 情境化引导(有代码/空项目/有文档)+ rules §3 无命令体验映射表 | +| M22.3 | ADR 管理 | ✅ 完成 | pace-trace arch 子命令 + adr-format.md Schema + trace-procedures-arch.md | +| M22.4 | 技术债务一等公民化 | ✅ 完成 | cr-format tech-debt 类型 + project-format tech-debt-budget 配置 + retro 技术债务趋势段 | + +### 任务定义 + +| 任务 | 关联里程碑 | 关联条目 | +|------|----------|---------| +| 接口契约层设计:review↔test 输出格式 Schema 化 | M22.1 | OBJ-3, G2 | +| 接口契约层设计:dev↔guard/test procedures 引用解耦 | M22.1 | OBJ-3, G2 | +| 接口契约层设计:change↔plan 逻辑分离 | M22.1 | OBJ-4, G2 | +| pace-init 完成后衔接引导(自动触发 pace-biz infer) | M22.2 | OBJ-5, UX3 | +| 自然语言触发覆盖面扩展 | M22.2 | OBJ-5, UX1 | +| pace-trace arch 子命令 + adr-format Schema | M22.3 | OBJ-4, G3 | +| CR type tech-debt 扩展 + pace-plan 容量预留 | M22.4 | OBJ-3, G4 | +| pace-retro 技术债务趋势指标 | M22.4 | OBJ-3, G4 | + +--- + +## Phase 23:预测与安全 + +**目标**:AI 驱动的预测性项目管理、安全维度增强、Compact 恢复优化、语义级漂移检测。 + +**对应 OBJ**:OBJ-1, OBJ-2, OBJ-3 + +**前置条件**:Phase 22 完成 + +### 里程碑 + +| # | 里程碑 | 状态 | 产出 | +|---|--------|------|------| +| M23.1 | 预测性项目管理 | ✅ 完成 | retro-procedures-forecast.md(交付概率算法+瓶颈识别+风险预警+概率分级) | +| M23.2 | 安全维度深化 | ✅ 完成 | guard-procedures-scan.md 安全深度检查(Layer 1 关键词扩展 + Layer 2 OWASP 6 类模式扫描) | +| M23.3 | Compact 恢复优化 | ✅ 完成 | pre-compact.sh 结构化恢复上下文(IR-1~5 + 当前状态 + 活跃 CR + 行动清单) | +| M23.4 | 语义漂移检测 | ✅ 完成 | dev-procedures 语义漂移检测(持续验收对齐)+ review-procedures 语义一致性评分(M/L/XL 摘要模板) | + +### 任务定义 + +| 任务 | 关联里程碑 | 关联条目 | +|------|----------|---------| +| pace-retro forecast 子命令(历史模式→交付概率) | M23.1 | OBJ-1, D1 | +| pace-guard scan 安全维度(第 6 维) | M23.2 | OBJ-3, G5 | +| PreCompact Hook 状态快照增强 | M23.3 | OBJ-2, UX4 | +| compact 后最小恢复上下文(IR-1~5 + 当前 CR + 下一步) | M23.3 | OBJ-2, UX4 | +| pace-dev 持续语义漂移检测 | M23.4 | OBJ-3, D2 | +| pace-review 语义一致性评分 | M23.4 | OBJ-3, D2 | + +--- + +## Phase 24:可视化与企业级 + +**目标**:devpace-cadence 可视化平台 MVP、多项目组合管理基础。 + +**对应 OBJ**:OBJ-9, OBJ-16 + +**前置条件**:Phase 23 完成 + +### 里程碑 + +| # | 里程碑 | 状态 | 产出 | +|---|--------|------|------| +| M24.1 | devpace-cadence MVP | 待开始 | 独立 Next.js 应用(价值链追溯图 + 看板 + 仪表盘) | +| M24.2 | 多项目组合管理 | 待开始 | pace-portfolio 或 pace-sync 扩展(跨项目 insights + 统一 DORA 仪表盘) | + +### 任务定义 + +| 任务 | 关联里程碑 | 关联条目 | +|------|----------|---------| +| devpace-cadence 核心实现(ReactFlow 价值链图 + Recharts 仪表盘) | M24.1 | OBJ-9, D3 | +| 多项目 insights 库 + 依赖声明 | M24.2 | OBJ-16, D4 | + +--- + ## 变更记录 > 操作级变更记录已移至 [progress.md](progress.md)。此处仅保留战略级变更。 | 日期 | 变更 | 原因 | |------|------|------| +| 2026-03-08 | Phase 21 完成(M21.1-M21.5 全部关闭,S35-S42 验收通过)。新增 Phase 22-24:体验增强与紧耦合治理(M22.1-M22.4)+ 预测与安全(M23.1-M23.4)+ 可视化与企业级(M24.1-M24.2) | BizDevOps 全生命周期审查 v2:6 项缺口(G1-G6)+ 5 项 UX 改进 + 5 项差异化创新 | +| 2026-03-07 | 新增 Phase 21:BR 上游业务规划域(M21.1-M21.4)。Opportunity/Epic/BR 溢出概念模型 + /pace-biz Skill + 全价值链增强 | BR 上游空白导致无法兑现端到端追溯承诺 | | 2026-02-26 | pace-plan UX 优化 11 项增强(E1-E11):P0 空树引导+智能建议、P1 adjust+auto-retro+启发式+衔接+速度、P2 分组+风险+回顾直联+health。不新增 Phase,产品层优化模式 | UX 原则 P1-P7 对齐审计,11 个用户旅程断点修复 | | 2026-02-25 | Phase 18 里程碑扩展(M18.2+M18.3 新增 C1/B1/B2/A1/D2/D1 内容);Phase 19 重组为智能推送+Issue 生命周期+多平台预研;Phase 20 重组为轮询入站+冲突解决+多平台正式(pull 从 Phase 19 移入,webhook 约束明确) | pace-sync 产品优化分析 | | 2026-02-25 | 新增 Phase 18-20:外部工具同步(M18.1-M18.3, M19.1-M19.3, M20.1-M20.3) | v1.5.0 External Tool Semantic Bridge,语义级双向桥接 | diff --git a/docs/plans/bizdevops-review-v2.md b/docs/plans/bizdevops-review-v2.md new file mode 100644 index 0000000..9beba42 --- /dev/null +++ b/docs/plans/bizdevops-review-v2.md @@ -0,0 +1,299 @@ +# devpace BizDevOps 全生命周期审查与改进方案(v2 — 基于最新项目状态) + +## Context + +devpace 是一个 Claude Code Plugin,经过 21 个 Phase 迭代(18 完成,Phase 21 进行中,Phase 19/20 待开始),构建了 19 个 Skills、3 个 Agents、18+ 个 Schemas、14 个 Hooks。Phase 21 正在补齐 Biz 域的上游建模(Opportunity→Epic→BR),新增了 pace-biz Skill(8 个子命令 + 8 个 procedures)和 3 个 Schema(opportunity-format、epic-format、br-format)。同时,独立的可视化平台 `devpace-cadence`(Next.js Web 应用)已完成设计方案。 + +用户要求从 BizDevOps 专家视角进行系统审查,并参照华为 CodeArts ALM 等企业级 ALM 工具的价值流设计,识别覆盖缺口和体验短板,提出改进方案。 + +--- + +## 第一部分:最新 BizDevOps 覆盖矩阵 + +### 1.1 实体关系现状(价值链六层) + +``` +Opportunity(OPP) ──采纳──→ Epic(EPIC) ──分解──→ BR ──细化──→ PF ──实现──→ CR ──发布──→ Release + [Schema ✅] [Schema ✅] [Schema ✅] [Schema ✅] [Schema ✅] [Schema ✅] + [Skill ✅] [Skill ✅] [Skill ✅] [Skill ✅] [Skill ✅] [Skill ✅] + pace-biz pace-biz pace-biz pace-dev pace-dev pace-release + opportunity epic decompose (自动创建PF) (状态机) (14子命令) + +横向支撑:OBJ(业务目标) ✅ | MoS(成效指标) ✅ | 迭代 ✅ | 风险 ✅ | 度量 ✅ | 经验 ✅ +``` + +### 1.2 三域评分(基于最新实现) + +| 域 | 评分 | 说明 | +|----|:----:|------| +| **Biz 域** | **6/10** | Schema 完整且设计优秀(OPP/EPIC/BR),pace-biz Skill 已定义 8 子命令 + 8 procedures,但 S35-S42 验收标准全部未打勾(验证待完成)。与上次审查(3/10)大幅提升 | +| **Dev 域** | **9/10** | 完整:pace-init/dev/test/guard/review 全部实现并验证 | +| **Ops 域** | **7.5/10** | pace-release 完整,pace-sync GitHub MVP 已完成(Phase 19/20 待扩展) | +| **Observe 域** | **9/10** | pace-status/next/pulse/retro/trace 全部完整 | +| **Knowledge 域** | **8.5/10** | pace-learn/theory 完整,devpace-cadence 可视化平台已设计 | + +### 1.3 对标 CodeArts ALM 实体覆盖(用户 promt.md 分析的更新) + +| CodeArts 概念 | devpace 覆盖 | 最新状态 | 差距评估 | +|--------------|:------------:|---------|---------| +| 业务机会 | **已建模** | OPP Schema + pace-biz opportunity | 待验证 | +| 专题(Epic) | **已建模** | EPIC Schema + pace-biz epic(含 MoS) | 待验证 | +| 业务需求(BR) | **已建模** | BR Schema + 溢出模式 + 优先级 + 成功标准 | 待验证(不再是"空壳") | +| 产品特性(PF) | 较好 | 完整字段体系 + 溢出模式 | 已验证 | +| 业务目标 | 较好 | OBJ + MoS checkbox | 已验证 | +| 愿景 | **已增强** | project-format.md 结构化(目标用户+核心问题+差异化+成功图景) | 不再是一行 blockquote | +| 战略上下文 | **已新增** | project-format.md 战略上下文 section(核心假设+外部约束) | 渐进填充 | +| 成功标准 | **已扩展** | MoS 覆盖 OBJ + **新增 Epic 级 MoS** + BR 级成功标准 | 三层 MoS | +| 需求工作流 | **已改善** | BR→PF 有 pace-biz decompose;PF→CR 有状态机 | 但 BR 自身无独立状态机(状态由下游 PF 聚合计算) | +| 版本规划 | 较好 | Release 完整 | 已验证 | +| 日常需求 | **有路径** | `/pace-change add`(快速路径,跳过 OPP/EPIC) | 已设计但需验证 | +| 业务线/产品线 | 无 | 刻意不建模(单项目 Claude Code 场景不需要) | **合理省略** | +| 投资组合 | 无 | 不建模 | **合理省略**(单人场景) | +| 产品目标 | 间接 | 通过 OBJ→Epic→BR→PF 间接关联 | 可接受 | +| 战略/策略 | 间接 | 被 OBJ + 战略上下文隐含 | 可接受 | + +--- + +## 第二部分:系统性缺口分析(按严重程度排序) + +### G1 [严重: 高] pace-biz 实现验证缺口 + +**现状**:pace-biz 的 8 个子命令 + 8 个 procedures + 3 个 Schema 已全部定义,但 S35-S42 的验收标准(requirements.md)全部未打勾。这意味着 Biz 域的实际运行时行为尚未被端到端验证。 + +**风险**: +- Schema 定义优秀但实际执行时可能有边界条件问题 +- pace-biz 与下游 Skill(pace-change、pace-plan、pace-dev)的衔接未验证 +- 价值功能树中 Epic→BR→PF 的渐进溢出模式未验证 + +**建议**:这是当前最高优先级——完成 Phase 21 M21.4(文档+eval)和 M21.5(discover/import/infer 验证),然后逐条打勾 S35-S42。 + +### G2 [严重: 高] Skill 间紧耦合风险 + +**新发现**:`docs/design/skill-dependencies.md` 揭示了多处高风险耦合: + +| 耦合关系 | 风险等级 | 问题 | +|---------|:--------:|------| +| pace-review → pace-test accept | **很高** | review 摘要模板内嵌 accept 输出字段,格式变更直接破坏 | +| pace-dev → pace-guard scan | **高** | dev 直接引用 guard 的 procedures 文件路径 | +| pace-dev → pace-test strategy-gen | **高** | dev 直接引用 test 的 procedures 文件路径 | +| pace-change → pace-plan adjust | **高** | change 内联执行 plan 的逻辑 | + +**影响**:任何单个 Skill 的重构都可能级联破坏其他 Skill。这在 19 个 Skill 规模下是严重的维护性风险。 + +**建议**: +- **短期**:将高风险耦合点的格式定义抽取为共享 Schema(类似 cr-format.md 的契约模式) +- **中期**:考虑引入"接口契约"层——Skill 间通过 Schema 定义的数据格式通信,而非直接引用 procedures 文件路径 +- **立即**:在 skill-dependencies.md 中标注的 "§5 变更影响矩阵" 作为每次修改前的必查清单 + +### G3 [严重: 中] 架构决策记录(ADR)缺失 + +**现状**:context.md 记录技术约定("怎么写代码"),CR 事件表记录单 CR 决策。但跨 CR 的架构级决策("为什么选 PostgreSQL"、"为什么微服务架构")没有独立管理。 + +**影响**:跨会话时 Claude 可能做出矛盾的架构选择。技术债务根源不可追溯。 + +**建议**:扩展 pace-trace 增加 `arch` 子命令 + 新增 `decisions/ADR-NNN.md` Schema。不需要新 Skill,在 pace-trace 内扩展即可(符合"深度优于广度"原则)。 + +### G4 [严重: 中] 技术债务非一等公民 + +**现状**:pace-biz infer 可推断技术债务,pace-guard 可扫描风险,但技术债务没有独立状态机和偿还计划。 + +**建议**: +- CR type 增加 `tech-debt`(cr-format.md 已有 type 枚举,扩展即可) +- pace-plan 增加迭代容量预留配置(project.md 配置 section 添加 `tech-debt-budget: 20%`) +- pace-retro 增加技术债务趋势指标 + +### G5 [严重: 中] 安全维度(DevSecOps)薄弱 + +**现状**:checks-format.md 有"安全检查推荐表",但安全不是系统化管理维度。 + +**建议**:pace-guard scan 增加"安全"维度(第 6 维)。不需要新 Skill。 + +### G6 [严重: 低] BR 缺少独立状态机 + +**现状**:BR 状态由下游 PF 聚合计算("所有 PF 完成→BR 完成"),但没有独立的状态转换(如"BR 评审中→BR 已确认→BR 开发中")。这意味着 BR→PF 的转化过程无显式工作流。 + +**对标**:CodeArts ALM 的需求工作流有独立的 "需求→评审→开发→验证→关闭" 工作流。 + +**评估**:在 Claude Code 单人场景下,BR 的独立工作流可能过重。当前的聚合计算模式是合理的极简设计。但如果 devpace 要面向团队场景(devpace-cadence 可视化平台暗示这一方向),BR 独立工作流将变得必要。 + +**建议**:P3 优先级。当前设计已够用,未来面向团队场景时再评估。 + +--- + +## 第三部分:用户体验流畅性分析 + +### UX1 [影响: 高] 命令认知过载 + +**数据**:19 Skills × 平均 6 子命令 ≈ 60+ 入口。pace-release 14 子命令、pace-test 10 子命令、pace-change 9 子命令。 + +**已有缓解**:pace-next 推荐下一步、rules §15 渐进教学、空参数智能引导、渐进暴露设计。 + +**改进方向**: +- 强化"无命令体验"——扩展自然语言触发覆盖面 +- pace-biz 空参引导已设计良好(扫描项目上下文→个性化推荐),建议作为模式推广到其他 Skill +- 评估是否需要 "pace-help" 或在 pace-status 中集成命令推荐 + +### UX2 [影响: 高] 探索→推进模式切换摩擦 + +**问题**:`context: fork` 创建新 Agent 上下文,探索阶段发现需要重建。 + +**已有缓解**:T118 上下文继承、Agent memory 持久化。 + +**改进方向**: +- S/M 复杂度 CR 提供"快速模式"(不 fork) +- 探索模式关键发现写入 CR "探索笔记" section +- fork 时自动注入探索摘要 + +### UX3 [影响: 中] 新用户上手断点 + +**问题**:pace-init 完成后"然后呢?"不明确。 + +**改进方向**: +- pace-init 完成后自动触发 pace-biz infer(已有代码的项目) +- state.md 初始生成时包含推荐下一步 +- 第一次 /pace-dev 增加新手引导 + +### UX4 [影响: 中] 长会话上下文压力 + +**问题**:550 行 rules + 126 个 procedures 在 compact 后可能退化。 + +**改进方向**: +- PreCompact Hook 增强:保存关键状态快照 +- compact 后注入最小恢复上下文(IR-1~5 + 当前 CR + 下一步) + +### UX5 [影响: 中→低] 度量可视化受限 + +**问题**:dashboard.md 纯文本表格表现力有限。 + +**已有方案**:devpace-cadence Web 应用(ReactFlow 价值链图 + Recharts 仪表盘)将系统性解决此问题。 + +**短期改进**:pace-retro 输出增加 Mermaid 趋势图。 + +--- + +## 第四部分:差异化创新建议 + +### D1 [杀手级] AI 驱动的预测性项目管理 + +**概念**:基于历史 CR 周期、Gate 通过率、变更频率、风险趋势、insights.md 经验,AI 预测迭代交付概率和瓶颈。 + +**为何杀手级**:传统工具用统计学(燃尽图),devpace 可做"因果推断"——Claude 理解代码复杂度和需求耦合度。 + +**实施**:扩展 pace-retro 增加 `forecast` 子命令(不新增 Skill),输出: +- 迭代交付概率(基于当前进度 + 历史模式) +- 预测瓶颈(基于 CR 滞留时间 + 依赖关系) +- 风险预警(基于 pace-guard 趋势 + insights 模式) + +### D2 [杀手级] 语义级代码-需求持续一致性检测 + +**概念**:不只 Gate 2 的一次性比对,而是持续监控代码变更是否偏离需求语义。 + +**实施**:增强 pace-dev 漂移检测 + pace-review 增加"语义一致性评分"。不需要新 Skill。 + +### D3 [强差异化] devpace-cadence 可视化平台 + +**已规划**:独立 Next.js 应用,从 Git 仓库拉取 `.devpace/` 数据,提供价值链追溯图 + 看板 + 仪表盘。 + +**战略价值**: +- 让非开发角色(PM/QA/管理层)无需 Claude Code 即可查看研发状态 +- 多项目支持为 pace-portfolio 奠定基础 +- 角色视图复用 pace-role 的 5 角色维度 + +### D4 [强差异化] 多项目组合管理 + +**概念**:跨项目的全局 insights 库、依赖声明、统一 DORA 仪表盘。 + +**基础**:devpace-cadence 的多项目支持 + pace-learn export/import。 + +**实施**:待 devpace-cadence 成熟后,在 Plugin 侧新增 pace-portfolio Skill 或扩展 pace-sync。 + +### D5 [中等差异化] 自然语言工作流编排 + +**概念**:用户自然语言定义自动化工作流,devpace 自动编排执行。 + +**实施**:长期目标,扩展 project.md 配置 section 增加自动化流程定义。 + +--- + +## 第五部分:优先级路线图 + +### 立即(Phase 21 剩余) + +| 项目 | 内容 | 对应缺口 | +|------|------|---------| +| M21.4 完成 | 文档 + eval 验证 | G1 | +| M21.5 完成 | discover/import/infer 端到端验证 | G1 | +| S35-S42 打勾 | pace-biz 全部验收标准验证 | G1 | + +### Phase 22: 体验增强 + 紧耦合治理 + +| 里程碑 | 内容 | 优先级 | 对应缺口 | +|--------|------|:------:|---------| +| M22.1 | Skill 间接口契约层设计(解耦 pace-review↔pace-test、pace-dev↔pace-guard 等) | P0 | G2 | +| M22.2 | 首次推进引导 + 无命令体验增强 | P1 | UX1, UX3 | +| M22.3 | ADR 管理(pace-trace arch 子命令 + decisions/ Schema) | P1 | G3 | +| M22.4 | 技术债务一等公民化(CR type 扩展 + pace-plan 容量预留) | P1 | G4 | + +### Phase 23: 预测与安全 + +| 里程碑 | 内容 | 优先级 | 对应缺口 | +|--------|------|:------:|---------| +| M23.1 | pace-retro forecast 子命令(预测性项目管理) | P1 | D1 | +| M23.2 | 安全维度增强(pace-guard 第 6 维) | P1 | G5 | +| M23.3 | Compact 恢复优化 | P1 | UX4 | +| M23.4 | 语义级漂移检测增强 | P1 | D2 | + +### Phase 24+: 可视化与企业级 + +| 里程碑 | 内容 | 优先级 | 对应缺口 | +|--------|------|:------:|---------| +| devpace-cadence MVP | 独立仓库实现 | P1 | D3, UX5 | +| 多项目组合管理 | pace-portfolio 或 pace-sync 扩展 | P2 | D4 | +| BR 独立工作流 | 面向团队场景评估 | P3 | G6 | + +--- + +## 第六部分:三条核心战略建议 + +### 1. 深度优于广度 + +19 Skills 已到认知极限。本方案中**没有新增任何 Skill**——所有改进都通过扩展现有 Skill 子命令实现(ADR→pace-trace arch;forecast→pace-retro forecast;安全→pace-guard 第 6 维)。这是刻意的设计选择。 + +### 2. 契约优于内联 + +skill-dependencies.md 揭示的紧耦合是最大的维护性风险。Skill 间应通过 Schema 定义的数据契约通信,而非直接引用内部 procedures 文件路径。这是 Phase 22 的最高优先级。 + +### 3. 验证优于新增 + +Phase 21 的 pace-biz + 3 个 Schema 设计质量很高,但验收标准全部未打勾。当前最有价值的工作不是新增功能,而是**完成验证并在真实项目中跑通 OPP→EPIC→BR→PF→CR 全链路**。 + +--- + +## 第七部分:风险 + +| 风险 | 严重度 | 缓解 | +|------|:------:|------| +| Skill 间紧耦合导致级联故障 | 高 | Phase 22 接口契约层(G2) | +| 规则过载 compact 后退化 | 高 | Phase 23 规则分层加载 | +| pace-biz 设计未经真实项目验证 | 高 | 立即完成 S35-S42 验证 | +| 复杂度膨胀(60+ 子命令) | 中 | 不新增 Skill,强化无命令体验 | +| Claude Code 原生 session persistence | 中 | 加速向预测+智能层迁移 | + +## 验证方法 + +1. **Biz 域验证**:在 1 个真实项目中跑通 `pace-biz opportunity → epic → decompose → /pace-dev → /pace-review → /pace-release` 全链路 +2. **紧耦合验证**:修改 pace-test accept 输出格式,验证 pace-review 是否破坏 +3. **回归验证**:`bash scripts/validate-all.sh` + `pytest tests/static/ -v` +4. **竞争力对比**:与 Linear AI、CodeArts ALM 做特性矩阵对比 + +## 关键文件 + +- `docs/design/skill-dependencies.md` — **新增**:Skill 间耦合关系(变更影响矩阵必查) +- `docs/plans/devpace-cadence-design.md` — **新增**:可视化平台设计方案 +- `skills/pace-biz/SKILL.md` — **新增**:Biz 域统一入口 +- `knowledge/_schema/opportunity-format.md` — **新增**:OPP Schema +- `knowledge/_schema/epic-format.md` — **新增**:EPIC Schema +- `knowledge/_schema/br-format.md` — **新增**:BR Schema +- `knowledge/_schema/project-format.md` — **更新**:价值功能树增加 Epic→BR 链接格式 +- `docs/planning/requirements.md` — S35-S42 验收标准(待打勾) +- `rules/devpace-rules.md` — 运行时行为规则 diff --git a/docs/plans/devpace-bizdevops-lifecycle-review-plan.md b/docs/plans/devpace-bizdevops-lifecycle-review-plan.md new file mode 100644 index 0000000..ae53b1c --- /dev/null +++ b/docs/plans/devpace-bizdevops-lifecycle-review-plan.md @@ -0,0 +1,404 @@ +# devpace BizDevOps 全生命周期审查与重构方案 + +## Context + +devpace 是一个 Claude Code Plugin,目标是为 AI 辅助开发提供完整的 BizDevOps 研发节奏管理。当前项目非常成熟(127/131 任务完成,42/42 场景覆盖),拥有 19 个 Skills、3 个 Agent、~113 个 procedures 文件、19 个 schema 文件。 + +本方案从**宏观到微观、整体到局部、粗粒度到细粒度**四个维度审查 devpace,并按 P0-P3 优先级提供分层重构方案,目标是让 devpace 成为世界上最优秀的 BizDevOps 全生命周期 AI 工具。 + +--- + +## Part I: 宏观审查 — BizDevOps 生命周期完整性 + +### 1.1 生命周期覆盖矩阵 + +| BizDevOps 阶段 | 子活动 | 覆盖 Skill | 覆盖度 | 评估 | +|---------------|--------|-----------|--------|------| +| **业务机会** | 机会捕获、评估、采纳 | pace-biz opportunity | FULL | 完整 | +| **战略对齐** | OBJ 关联、MoS 追踪 | pace-biz align | FULL | 完整 | +| **需求发现** | 交互式探索、文档导入、代码推断 | pace-biz discover/import/infer | FULL | 完整 | +| **需求分解** | Epic->BR->PF 分解 | pace-biz decompose | FULL | 完整 | +| **迭代规划** | 规划/关闭/调整/健康度 | pace-plan | FULL | 完整 | +| **开发执行** | CR 创建/编码/测试/质量门 | pace-dev | FULL | 完整 | +| **代码审查** | Gate 3 审批准备 | pace-review | FULL | 完整 | +| **测试验证** | 策略/覆盖/验收/影响分析 | pace-test | FULL | 完整 | +| **需求变更** | 插入/暂停/恢复/修改/批量 | pace-change | FULL | 完整 | +| **风险管理** | 扫描/监控/趋势/报告 | pace-guard | FULL | 完整 | +| **发布管理** | 创建/部署/验证/关闭/回滚 | pace-release | FULL | 完整 | +| **运维反馈** | 反馈收集/事件追溯/热修 | pace-feedback | FULL | 完整 | +| **度量回顾** | 迭代回顾/DORA/趋势/预测 | pace-retro | FULL | 完整 | +| **外部集成** | GitHub/Linear/Jira 同步 | pace-sync | PARTIAL | Phase 19-20 待完成 | +| **知识沉淀** | 经验提取/知识库管理 | pace-learn | FULL | 完整 | +| **决策审计** | AI 决策轨迹/ADR | pace-trace | FULL | 完整 | +| **--- 以下为缺口 ---** | | | | | +| **架构设计** | 技术方案设计、架构评审 | 无专属 Skill | GAP | 见 1.2-G1 | +| **持续集成** | CI 配置、构建自动化、流水线管理 | 仅 Gate 查询 | GAP | 见 1.2-G2 | +| **环境管理** | dev/staging/prod 环境、特性开关 | 无 | GAP | 见 1.2-G3 | +| **事件管理** | 严重性分级、升级、事后复盘 | pace-feedback 部分覆盖 | PARTIAL | 见 1.2-G4 | +| **项目 Onboarding** | 新成员引导、项目知识传递 | 无 | GAP | 见 1.2-G5 | + +### 1.2 生命周期缺口分析 + +**G1: 架构设计活动缺失** + +pace-trace 支持 ADR(架构决策记录),但这是事后记录。在开发前的"技术方案设计"环节没有对应 Skill。当用户面对 L/XL 复杂度的 PF 时,从"需求分解完成"到"开始编码"之间缺少一个结构化的技术设计步骤。 + +- 影响:L/XL CR 的质量门通过率可能较低(因为缺少前置技术设计) +- 建议:在 pace-dev 的 L/XL 流程中嵌入"技术方案"步骤,或新增 `/pace-design` Skill + +**G2: CI/CD 管理能力薄弱** + +当前 CI/CD 能力限于 Gate 4 的状态查询(checks-format.md 中的 ci-status-cmd)。无法管理流水线配置、触发构建、查看构建日志。 + +- 影响:Release 流程依赖用户手动管理 CI/CD +- 建议:中长期通过 MCP Server 或 pace-sync 扩展支持 CI/CD 操作 + +**G3: 环境管理缺失** + +没有管理开发/测试/生产环境差异的能力,也没有特性开关(feature flag)管理。 + +- 影响:Release 验证步骤缺少环境上下文 +- 建议:作为 pace-release 的子命令扩展(`/pace-release env`),或长期独立 Skill + +**G4: 事件管理不完整** + +pace-feedback 覆盖了反馈收集和热修复路径,但缺少结构化的事件管理:严重性分级(P0-P4)、升级链、值班轮转、事后复盘(postmortem)。 + +- 影响:对需要 Ops 成熟度的专业团队吸引力不足 +- 建议:扩展 pace-feedback 增加 `incident` 子命令系列 + +**G5: 项目 Onboarding 缺失** + +pace-init 创建项目骨架,pace-theory 解释方法论,但没有"引导新用户完成第一个完整 BizDevOps 循环"的结构化体验。 + +- 影响:新用户转化率低,学习曲线陡峭 +- 建议:P0 优先级,见 Part V 重构方案 + +### 1.3 四大反馈闭环完整性 + +| 闭环 | 路径 | 完整度 | 断点 | +|------|------|--------|------| +| 业务闭环 | OBJ -> Epic -> BR -> MoS 达成 -> 回顾 | 95% | MoS 自动评估依赖人工输入 | +| 产品闭环 | BR -> PF -> 迭代 -> 回顾 -> 改进 | 98% | pace-retro accept 到下一迭代的衔接靠信号间接完成 | +| 技术闭环 | CR created -> merged (状态机) | 100% | 完整 | +| 运维闭环 | Release -> 部署 -> 反馈 -> Defect CR | 90% | 缺少结构化事件管理和 postmortem | + +--- + +## Part II: 中观审查 — Skill 架构与互联 + +### 2.1 Skill 分组与粒度评估 + +**当前分组**(来自 devpace-rules.md 0): + +| 层级 | Skills | 评估 | +|------|--------|------| +| 核心(5) | init, dev, status, review, next | 合理,覆盖最小闭环 | +| 业务(1) | biz (8 子命令) | 子命令过多,是最大的单一 Skill | +| 进阶(6) | change, plan, retro, guard, sync, role | 合理,各自职责清晰 | +| 专项(4) | release, test, feedback, theory, trace | release 子命令最多(15 procedures) | +| 系统(2) | pulse, learn | 合理,自动调用无需用户关注 | + +**粒度问题**: + +| 问题 | 涉及 Skill | 分析 | +|------|-----------|------| +| pace-biz 过于庞大 | pace-biz | 8 个子命令跨越 opportunity/epic/decompose/align/view/discover/import/infer,功能跨度大 | +| pace-release 过于庞大 | pace-release | 15 个 procedures 文件,子命令含 create/deploy/verify/close/full/status/changelog/version/tag/notes/branch/rollback | +| pace-status 子命令丰富但分层合理 | pace-status | 9 个 procedures 但层次清晰(L1/L2/L3),可接受 | +| pace-theory 和 pace-trace 有概念重叠 | pace-theory, pace-trace | theory 解释"是什么",trace 追溯"为什么这样做",目标不同但用户可能混淆 | + +**建议**: +- pace-biz:保持合并但改善 sub-routing,在 §0 速查中更清晰地区分"创建型"和"分析型"子命令 +- pace-release:考虑拆分为 `pace-release`(生命周期)+ `pace-changelog`(文档生成),但复杂度增加,暂不推荐 +- pace-theory + pace-trace:保持独立,但在帮助文本和 description 中更清晰地区分 + +### 2.2 Skill 互联拓扑分析 + +``` + pace-biz + / | \ + opportunity epic decompose + \ | / + pace-plan -------- pace-change + | | + pace-dev ---------- pace-guard + / | \ | + Gate1 Gate2 pace-test | + | | + pace-review | + | | + [人类审批] | + | | + merged ---------- pace-learn + | | + pace-release --- pace-sync + | + pace-feedback + | + pace-retro + +横切: pace-status, pace-next, pace-role, pace-trace, pace-theory, pace-pulse +``` + +### 2.3 互联断层清单 + +**断层 D1: pace-biz decompose -> pace-plan 引导不一致** +- SKILL.md 推荐流程:`discover -> decompose -> /pace-plan next` +- decompose 实际输出引导:`-> /pace-change add 或 /pace-dev` +- 修复:统一 decompose 的输出引导,增加到 `/pace-plan next` 的引导 +- 涉及文件:`skills/pace-biz/biz-procedures-decompose.md` + +**断层 D2: pace-plan -> pace-dev 迭代绑定弱** +- pace-plan 规划了迭代并选择 PF,但 pace-dev 按单个功能描述或 CR 编号工作 +- 迭代中 PF 的优先顺序仅通过 pace-next 信号间接传递(S13) +- 缺少"按迭代计划优先级自动推进下一 PF"的直接路径 +- 修复:在 pace-dev merged 后的引导中,如果迭代内有未开始 PF,直接推荐迭代中最高优先级的 PF +- 涉及文件:`skills/pace-dev/dev-procedures-postmerge.md`、`knowledge/signal-priority.md` + +**断层 D3: pace-retro -> pace-plan 回顾到规划的衔接** +- pace-retro 生成回顾报告和改进建议,但到下一迭代规划(pace-plan next)时需要用户手动关联 +- 修复:pace-plan next 的规划流程中显式引用上一迭代 retro 的关键建议 +- 涉及文件:`skills/pace-plan/plan-procedures.md` + +**断层 D4: pace-guard scan 与 pace-dev 的触发门槛** +- S/M CR 仅在 insights.md 有匹配 pattern 时触发风险扫描 +- 新项目 insights.md 为空,S/M CR 的风险扫描永远不会被自动触发 +- 修复:新项目首 N 个 CR 默认触发基础扫描,或首次 Guard 扫描由 init 完成后的引导触发 +- 涉及文件:`skills/pace-guard/guard-procedures-common.md`、`skills/pace-dev/dev-procedures-gate.md` + +**断层 D5: pace-feedback -> pace-change 的反馈转需求路径** +- pace-feedback 创建 Defect/Hotfix CR 后,如果反馈表明需要新功能而非修缺陷,转到 pace-change add 的路径不够显式 +- 修复:pace-feedback intake 步骤增加"功能请求"类型判断,自动路由到 pace-change add +- 涉及文件:`skills/pace-feedback/feedback-procedures-intake.md` + +### 2.4 信号系统缺口 + +当前 S1-S20 信号覆盖全面,但缺少以下场景: + +| 编号 | 缺失信号 | 场景 | 建议优先级 | +|------|---------|------|-----------| +| S21 | 跨 CR 依赖阻塞 | CR-A 被 CR-B 阻塞且 CR-B 长期未推进 | P1 | +| S22 | 技术债积压 | tech-debt CR 数量或占比超阈值 | P2 | +| S23 | 知识库健康度 | insights.md 引用命中率 < 50% | P2 | +| S24 | 首次完整循环 | 用户从未完成过 init->dev->review->merged 完整循环 | P0 | +| S25 | 长期休眠项目 | .devpace/ 存在但 30+ 天无活动 | P2 | + +--- + +## Part III: 微观审查 — 用户操作流畅性 + +### 3.1 新用户首次体验(First-Time UX) + +**当前流程**: +``` +用户安装 Plugin -> /pace-init -> 生成 .devpace/ -> +"说'帮我做 [功能名]'开始第一个功能..." -> ??? +``` + +**问题**: +1. 初始化后的"空白页"——用户不确定下一步做什么 +2. 从 README 的 19 个命令列表到"只需说自然语言"的认知跳跃过大 +3. 没有引导式的 onboarding tour +4. 第一次使用 pace-dev 时用户不理解为什么会创建 BR/PF/CR 三层结构 + +**改进方案**(P0 优先级): +- 新增 `S24 首次完整循环` 信号,在 session-start 检测到用户从未完成过完整循环时,触发引导式 onboarding +- Onboarding 不是新 Skill,而是 pace-pulse session-start 的增强:检测到"新项目 + 0 个 merged CR"时,输出简化版的下一步引导 +- README 精简:首页只保留核心 5 命令 + 30 秒体验,完整列表链接到 user-guide + +### 3.2 日常开发流程(Daily UX) + +**当前流程**: +``` +会话开始 -> 1 句话状态 -> "帮我做 X" -> pace-dev 推进 -> +Gate 1/2 -> pace-review -> Gate 3 人类审批 -> merged -> +下一步引导 +``` + +**问题**: +1. Gate 3 高频审批摩擦——连续做 5-6 个 S 复杂度 PF 时,每个都要审批 +2. 批量审批虽有设计(§2),但触发条件苛刻(2+ CR 同时 in_review) +3. 推进模式中"探索中继续"的模式切换对用户不透明 + +**改进方案**(P1 优先级): +- "连续推进模式":用户说"连续做"或"批量推进"时,pace-dev 在 S 复杂度 CR 满足简化审批条件时不立即审批,而是推进到下一个 PF,最后统一展示批量审批列表 +- 涉及文件:`skills/pace-dev/SKILL.md`(新增 `--batch` 参数)、`rules/devpace-rules.md §2`(放宽批量审批触发条件) + +### 3.3 认知负荷分析 + +| 维度 | 当前状态 | 问题 | 改进 | +|------|---------|------|------| +| 命令数量 | 19 Skill + ~83 子命令 | 信息过载 | 分层暴露:核心 5 -> 进阶 -> 专项 | +| 价值链层级 | OPP->Epic->BR->PF->CR->Release | 对小项目过重 | "轻量模式":小项目隐藏 OPP/Epic 层 | +| 模式切换 | 探索/推进隐式切换 | 用户不知当前模式 | status 行显示当前模式标识 | +| 术语体系 | BR/PF/CR/Gate/MoS 等 | 对非产品经理背景的开发者陌生 | 自然语言优先,术语仅在 tree/detail 视图暴露 | + +### 3.4 错误恢复与容错 + +**当前容错设计**: +- Gate 失败自修复(最多 2 次) +- 文件损坏降级处理(pace-change degraded mode) +- 中断恢复(state.md 锚点) +- 验收失败回退到 developing + +**缺口**: +- 用户误操作的"撤销"能力有限——pace-change undo 只针对需求变更,pace-dev 没有"撤销上一次合并"的能力 +- 会话中途 Claude 出错(幻觉)时的恢复机制依赖用户主动发现 + +--- + +## Part IV: 竞争力差异化分析 + +### 4.1 devpace 独特定位 + +| 维度 | 传统工具 (Jira/Linear/GitHub Projects) | 通用 AI 编码 (Cursor/Copilot Workspace) | devpace | +|------|--------------------------------------|---------------------------------------|---------| +| 业务到代码追溯 | 手动关联 | 无 | **自动**(OBJ->BR->PF->CR) | +| 变更管理 | 手动调整看板 | 无 | **一等公民**,影响分析+有序调整 | +| 质量门 | CI/CD 外挂 | 无 | **内嵌**,4 级 Gate 自动执行 | +| 跨会话连续性 | N/A | 有限 | **完整**(state.md 锚点) | +| 度量与回顾 | 需额外配置 | 无 | **内建** DORA + 迭代回顾 | +| 自然语言交互 | 有限(AI 辅助搜索) | 代码层面 | **全流程**自然语言驱动 | +| AI 决策透明度 | N/A | 无 | **完整审计**(pace-trace) | + +### 4.2 护城河强化方向 + +**当前三层护城河**:入口层(跨会话) -> 差异化层(变更管理) -> 护城河层(完整价值链+度量+合规) + +**强化建议**: + +| 方向 | 措施 | 目的 | +|------|------|------| +| **智能编排** | 引入"旅程模板",自动编排多 Skill 流程 | 从"工具集"升级为"智能工作流平台" | +| **预测能力** | 强化 pace-retro forecast + pace-guard trends | 从"被动管理"升级为"主动预测" | +| **生态集成** | 完成 Phase 19-20 外部同步 + CI/CD 深度集成 | 从"独立工具"升级为"研发中枢" | +| **团队适配** | 多用户状态隔离 + 角色权限 + 共享仪表盘 | 从"个人工具"升级为"团队平台" | +| **可视化** | Phase 24 devpace-cadence Next.js 仪表盘 | 从"CLI 工具"升级为"可视化平台" | + +### 4.3 与"世界最优秀"的差距 + +对标 BizDevOps 领域最佳实践,devpace 的主要差距: + +1. **编排智能不足**:19 个 Skill 是独立的,缺少跨 Skill 的智能编排能力。用户需要自己知道"下一步该用哪个命令",虽然 pace-next 提供建议,但缺少"一键执行推荐" +2. **小项目体验过重**:概念模型(6 层价值链)对个人小项目来说认知成本过高 +3. **大项目性能未验证**:50+ CR 场景下的 backlog 遍历、信号采集性能未经实战验证 +4. **多人协作空白**:完全面向"1 人 + Claude",无法支持 2+ 人共享 .devpace/ +5. **可视化缺失**:纯 CLI 交互,无法提供全局鸟瞰视图 + +--- + +## Part V: 分层重构方案 + +### P0: 即刻改进(1-2 周,不改架构) + +| 编号 | 改进项 | 涉及文件 | 预期效果 | +|------|--------|---------|---------| +| P0-1 | **新用户 Onboarding 引导** | `skills/pace-pulse/pulse-procedures-session-start.md` | 新项目首次会话自动引导用户完成"init -> 第一个功能 -> review -> merged"完整闭环 | +| P0-2 | **修复 D1: biz decompose 输出引导** | `skills/pace-biz/biz-procedures-decompose.md` | 统一 decompose 输出引导到 `/pace-plan next`,消除路径歧义 | +| P0-3 | **修复 D2: merged 后迭代优先级推荐** | `skills/pace-dev/dev-procedures-postmerge.md` | merged 后如果迭代内有未开始 PF,直接推荐最高优先级 PF | +| P0-4 | **README 精简** | `README.md`、`README_zh.md` | 首页只保留核心 5 命令 + 30 秒体验,降低新用户信息过载 | +| P0-5 | **修复 D4: 新项目风险扫描兜底** | `skills/pace-guard/guard-procedures-common.md` | 新项目(insights.md 为空)的首 3 个 CR 默认触发基础风险扫描 | +| P0-6 | **修复 D5: feedback 功能请求路由** | `skills/pace-feedback/feedback-procedures-intake.md` | 增加"功能请求"类型判断,自动路由到 pace-change add | + +### P1: 体验升级(3-4 周,小幅架构调整) + +| 编号 | 改进项 | 涉及文件 | 预期效果 | +|------|--------|---------|---------| +| P1-1 | **连续推进模式(batch dev)** | `skills/pace-dev/SKILL.md`、`dev-procedures-common.md`、`rules/devpace-rules.md §2` | 用户说"连续做"时批量推进 S 复杂度 PF,最后统一审批 | +| P1-2 | **修复 D3: retro -> plan 衔接** | `skills/pace-plan/plan-procedures.md` | 规划新迭代时自动引用上一迭代回顾的关键建议 | +| P1-3 | **轻量模式(lite mode)** | `skills/pace-init/SKILL.md`、`init-procedures-core.md`、`knowledge/_schema/project-format.md` | 小项目初始化时隐藏 OPP/Epic 层,project.md 只含 OBJ->PF->CR 三层 | +| P1-4 | **信号系统补全** | `knowledge/signal-priority.md`、`knowledge/signal-collection.md` | 新增 S21(依赖阻塞)、S22(技术债积压)、S24(首次循环引导) | +| P1-5 | **模式状态可见** | `rules/devpace-rules.md §1/§2` | session-start 和推进模式切换时,在输出中明确标识当前模式 | +| P1-6 | **pace-biz 子命令分组优化** | `skills/pace-biz/SKILL.md` | 将 8 个子命令分为"创建型"(opportunity/epic/decompose)和"分析型"(align/view/discover/import/infer) | + +### P2: 结构增强(1-2 月,中度架构调整) + +| 编号 | 改进项 | 涉及范围 | 预期效果 | +|------|--------|---------|---------| +| P2-1 | **智能旅程编排器(Journey Orchestrator)** | 新增 `skills/pace-journey/` 或整合到 `pace-next` | 提供"旅程模板":`/pace-next journey new-feature` 自动编排 biz->plan->dev->review->release 完整流程,每步完成后自动推进到下一步 | +| P2-2 | **事件管理增强** | 扩展 `skills/pace-feedback/` | 增加 `incident` 子命令系列:severity 分级、escalation、postmortem 模板 | +| P2-3 | **架构设计步骤** | 扩展 `skills/pace-dev/` 或新增 `skills/pace-design/` | L/XL CR 开发前增加"技术方案"步骤,含方案选择、ADR 记录、依赖分析 | +| P2-4 | **信号快照缓存** | `knowledge/signal-collection.md`、相关 Skill procedures | 实现信号采集结果的会话级缓存,避免同一会话重复扫描 | +| P2-5 | **大型项目性能优化** | `knowledge/_schema/state-format.md`、各 Skill 的 backlog 扫描逻辑 | backlog 索引机制:state.md 维护 CR 摘要索引,避免逐文件遍历 | + +### P3: 长期演进(3+ 月,重大架构变革) + +| 编号 | 改进项 | 涉及范围 | 预期效果 | +|------|--------|---------|---------| +| P3-1 | **多用户协作支持** | state.md 分离为 per-user + shared、合并策略 | 支持 2+ 人共享 .devpace/,通过 Git 自然协作 | +| P3-2 | **可视化仪表盘** | Phase 24 devpace-cadence Next.js | 从 CLI 到 Web UI,提供全局鸟瞰 | +| P3-3 | **CI/CD 深度集成** | MCP Server 或 pace-sync 扩展 | 触发构建、查看日志、管理部署环境 | +| P3-4 | **智能自主性升级** | 新的 autonomy-level 框架 | Claude 根据项目成熟度和用户信任度自动调整自主级别 | +| P3-5 | **插件生态** | Plugin 扩展机制 | 允许第三方为 devpace 编写领域扩展(安全审计、合规检查等) | + +--- + +## Part VI: 核心架构重构 — 智能旅程编排器(P2-1 详设) + +这是本次重构的**核心架构级提案**,将 devpace 从"工具集"升级为"智能工作流平台"。 + +### 6.1 问题本质 + +19 个 Skill 各自优秀,但用户需要**自己知道**下一步该用哪个。虽然 pace-next 提供建议,但: +- pace-next 只推荐"1 件事",不提供完整的工作流视图 +- 用户需要手动执行推荐的命令 +- 没有"一键走完整个流程"的能力 + +### 6.2 方案设计 + +**不新增 Skill**,而是增强 `/pace-next` 增加 `journey` 子命令: + +``` +/pace-next journey <模板名> [--auto] +``` + +**内置旅程模板**: + +| 模板 | 编排流程 | 适用场景 | +|------|---------|---------| +| `new-feature` | biz discover -> decompose -> plan next -> dev -> review -> merged | 从零开始交付一个功能 | +| `iteration` | plan next -> [dev -> review -> merged]* -> plan close -> retro | 完整迭代循环 | +| `hotfix` | feedback report -> dev(hotfix) -> review -> release deploy | 紧急修复 | +| `release` | release create -> deploy -> verify -> close | 标准发布 | +| `onboarding` | init -> dev(第一个功能) -> review -> merged | 新用户首次体验 | + +**`--auto` 模式**:每步完成后自动推进到下一步(S 复杂度),L/XL 在每步前暂停确认。 + +### 6.3 为什么是 pace-next 而非新 Skill + +1. pace-next 已有全局信号采集能力,是最佳的编排锚点 +2. 不增加 Skill 数量,降低用户认知负荷 +3. `journey` 是 pace-next 的自然扩展——从"推荐下一步"到"编排完整旅程" +4. 复用 signal-priority.md 的优先级逻辑 + +--- + +## Part VII: 验证方案 + +### 7.1 P0 验证 + +1. 新建测试项目,使用 `/pace-init` 初始化 +2. 验证 session-start 是否触发 onboarding 引导 +3. 使用 `/pace-biz decompose` 验证输出引导是否指向 `/pace-plan next` +4. 完成一个 CR merged,验证 postmerge 引导是否推荐迭代内下一 PF +5. 在新项目上创建 S 复杂度 CR,验证是否触发基础风险扫描 + +### 7.2 P1 验证 + +1. 连续推进 3 个 S 复杂度 PF,验证批量审批流程 +2. 使用 lite mode 初始化小项目,验证 project.md 只含 OBJ->PF->CR +3. 创建互相依赖的 2 个 CR,验证 S21 信号是否触发 + +### 7.3 P2 验证 + +1. `/pace-next journey new-feature` 端到端测试:从 biz discover 到 merged +2. `/pace-next journey onboarding` 新用户体验测试 +3. 50+ CR 项目的信号采集性能基准测试 + +### 7.4 自动化验证 + +扩展 `tests/static/` 测试套件: +- `test_journey_templates.py`:验证旅程模板定义完整性 +- `test_signal_coverage.py`:验证新增信号的采集和消费正确性 +- `test_skill_interconnections.py`:验证 D1-D5 断层修复后的引导路径一致性 diff --git a/docs/user-guide.md b/docs/user-guide.md index 6d6cba5..afd7cc2 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -70,19 +70,19 @@ You can also use `/pace-init full` to complete the full setup at once (business ### Traceability Chain -devpace organizes work into a traceable chain: +devpace organizes work into a 6-layer traceable chain: ``` -Goal → Feature → Task → Code -You define goals You plan features Claude auto-creates Claude writes code +Opportunity → Epic → Requirement → Feature → Task → Code +You spot You plan Decompose Plan together Claude creates Claude codes ``` -- **You define** goals and features (in natural language) +- **You define** opportunities, epics, and features (in natural language) - **Claude auto-creates** tasks and maintains traceability throughout -- **Bidirectional traceability**: from goals to code, and from code back to goals +- **Bidirectional traceability**: from business opportunities to code, and from code back to goals > **Internal terminology reference** (you don't need to memorize these — Claude won't use them in conversation either): -> Goal = OBJ/BR (Business Goal/Requirement), Feature = PF (Product Feature), Task = CR (Change Request) +> Opportunity = OPP, Epic = EPIC, Requirement = BR (Business Requirement), Feature = PF (Product Feature), Task = CR (Change Request) ### You Don't Need to Learn Any Terminology @@ -95,11 +95,25 @@ devpace uses a precise internal concept model, but everything in conversation is | "准备好了吗" (= "Is it ready") | Checks quality gate status | | "加一个导出功能" (= "Add an export feature") | Recognizes a requirement change, runs impact analysis | +### BizDevOps Coverage + +devpace covers the full BizDevOps spectrum across six domains: + +| Domain | Score | Key Capabilities | +|--------|:-----:|-----------------| +| **Biz** (Business Planning) | **8/10** | `/pace-biz` 8 subcommands: opportunity, epic, decompose, align, view, discover, import, infer | +| **Product** (Product Management) | **9/10** | `/pace-plan` with adjust/health, `/pace-change` full lifecycle, `/pace-next` recommendations | +| **Dev** (Development) | **9.5/10** | `/pace-dev` autonomous coding, ADR management, tech debt tracking, OWASP security scanning, semantic drift detection | +| **Ops** (Operations) | **7.5/10** | `/pace-release` full orchestration, `/pace-sync` external tool bridge, CI/CD awareness | +| **Observe** (Observability) | **9.5/10** | `/pace-retro` DORA metrics + forecasting, `/pace-pulse` rhythm monitoring, `/pace-guard` risk fabric | +| **Knowledge** (Knowledge Management) | **8.5/10** | `/pace-learn` cross-project insights, `/pace-theory` methodology reference, experience extraction | + --- ## Command Reference > **Core commands** (daily use): `/pace-init`, `/pace-dev`, `/pace-status`, `/pace-review`, `/pace-next` +> **Business commands** (upstream planning): `/pace-biz` > **Advanced commands** (when needed): `/pace-change`, `/pace-plan`, `/pace-retro`, `/pace-guard` > **Specialized commands** (optional): `/pace-test`, `/pace-release`, `/pace-sync`, `/pace-feedback`, `/pace-role`, `/pace-theory`, `/pace-trace` @@ -110,6 +124,7 @@ devpace uses a precise internal concept model, but everything in conversation is **Arguments**: - `name` — Optional, project name. Claude asks if omitted. - `full` — Optional. Runs full setup (business goals, feature list, iteration plan, quality checks). +- `--lite` — Optional. Lightweight mode: skips OPP/Epic/BR layers, project.md contains only OBJ→PF→CR three-layer structure, suitable for personal small projects. **Behavior**: - **Default**: Creates minimal `.devpace/` (state + project stub + backlog + rules). Only asks for project name and description. After init, previews "what happens next" to orient you. @@ -128,6 +143,7 @@ devpace uses a precise internal concept model, but everything in conversation is - `feature description` — Start working on the specified feature (natural language matching) - `#N` — Jump directly to CR by number (e.g., `#3` → CR-003) - `--last` — Resume the most recently worked-on CR +- `--batch` — Continuous advance mode: batch-advance multiple S-complexity PFs in the iteration, unified review at the end **Behavior**: @@ -202,6 +218,8 @@ devpace uses a precise internal concept model, but everything in conversation is **Arguments**: - *(empty)* — 1 recommendation (≤3 lines) - `detail` — Expanded candidate list (≤8 lines) +- `why` — Expanded reasoning chain (2-5 lines: signal scan + priority comparison + role influence + alternatives) +- `journey [template]` — Full workflow path: step-by-step guide from current state to goal. Templates: `new-feature` (default), `iteration`, `hotfix`, `release`, `onboarding` **Behavior**: Synthesizes multi-dimensional signals (in_review CRs, developing CRs, unverified deployments, iteration completion, retro cycles, backlog status, etc.) and recommends next actions via a 12-level priority matrix. @@ -232,6 +250,37 @@ devpace uses a precise internal concept model, but everything in conversation is --- +### `/pace-biz [subcommand] [args]` + +**When to use**: Upstream business planning — capture opportunities, create epics, decompose requirements, or discover needs. + +**Arguments**: + +| Argument | Description | +|----------|-------------| +| `opportunity ` | Capture a business opportunity | +| `epic [OPP-xxx] ` | Create an Epic from an opportunity or directly | +| `decompose ` | Break down Epic→BR or BR→PF | +| `align` | Strategic alignment health check (read-only) | +| `view` | Business panorama view (read-only) | +| `discover ` | Interactive multi-turn requirements discovery from a vague idea | +| `import ...` | Extract requirements from documents (meeting notes, feedback, competitor analysis) | +| `infer` | Infer untracked features and technical debt from codebase | +| *(empty)* | Context-aware recommendation | + +**Recommended workflows**: + +``` +Full business path: opportunity → epic → decompose → /pace-dev +Exploratory discovery: discover → decompose → /pace-plan next +Document import: import → align → /pace-plan next +Codebase inference: infer → align → /pace-dev +``` + +See [Business Planning feature docs](features/pace-biz.md) for details. + +--- + ### `/pace-change [type] [#N|--last|--dry-run] [description]` **When to use**: Requirements change mid-work. @@ -271,6 +320,7 @@ See the [Requirement Changes](#requirement-changes) section for details. - `history` — Cross-iteration trend overview (3+ iterations) - `mid` — Mid-iteration lightweight check (no dashboard update) - `accept` — Confirm suggested actions from last retrospective (MoS updates, etc.) +- `forecast` — Delivery prediction: probability, bottleneck identification, risk alerts **Report contents**: - **Action summary** (~10 lines): key metrics + trends + concerns + highlights + recommendations @@ -444,7 +494,7 @@ You can pass Gate 2 without running accept — but changes with accept have stro | Argument | Action | |----------|--------| -| `scan [CR-ID]` | Pre-flight risk scan — 5-dimension assessment (historical lessons / dependency impact / architecture compatibility / scope complexity / security sensitivity) | +| `scan [CR-ID]` | Pre-flight risk scan — 5-dimension assessment with OWASP-aware security scanning (historical lessons / dependency impact / architecture compatibility / scope complexity / security: Layer 1 keyword + Layer 2 OWASP pattern) | | `monitor [CR-ID]` | Summarizes real-time risk status for a CR (mitigated / pending / new) | | `trends [iteration-ID]` | Cross-CR trend analysis (by category, recurring risk identification, improvement suggestions) | | `report` | Project-level risk dashboard (grouped by PF, sorted by severity, overall risk score) | @@ -476,6 +526,10 @@ You can pass Gate 2 without running accept — but changes with accept have stro **Arguments**: - `report ` — **Emergency channel**: skips triage, enters production incident branch with accelerated path evaluation (hotfix/critical only) +- `incident open ` — Create incident record (severity assessment + timeline initialization) +- `incident close ` — Close incident + generate postmortem template +- `incident timeline ` — View incident timeline +- `incident list` — List all incidents (supports `--open` filter) - `` — Classified and routed (production incident / defect / improvement / new requirement / inbox) - *(empty)* — Progressive two-round guided collection (essential info first, details only when severity ≥ major) @@ -497,9 +551,10 @@ You can pass Gate 2 without running accept — but changes with accept have stro **Arguments**: - `keyword` — Query the reasoning trace for a specific decision (e.g., "why rejected", "Gate 2") +- `arch [title|ADR-NNN|list|supersede]` — Architecture Decision Records management - *(empty)* — Shows the most recent decision trace -**Behavior**: Reads task event tables, checkpoint markers, and traceability tags to reconstruct the complete reasoning process behind Gate/intent/change decisions. +**Behavior**: Reads task event tables, checkpoint markers, and traceability tags to reconstruct the complete reasoning process behind Gate/intent/change decisions. Also manages Architecture Decision Records (ADR) for cross-CR architectural decisions. **Read-only**: Does not modify any state files. @@ -523,6 +578,9 @@ You can pass Gate 2 without running accept — but changes with accept have stro | `unlink` | `CR-ID` | Remove association between CR and external entity | | `create` | `CR-ID` | Create external Issue from CR metadata and auto-link | | `pull` | `CR-ID` | Check external state and prompt to update (lightweight MVP) | +| `ci status` | — | View CI/CD run status for the current branch | +| `ci trigger` | `[workflow]` | Manually trigger a GitHub Actions workflow | +| `ci logs` | `[run-id]` | View log summary for a specified run | | `status` | — | View sync status and external links | No arguments defaults to `status`. `--dry-run` previews actions without executing. @@ -718,6 +776,7 @@ Claude runs automatically, fixes failures and retries. Doesn't bother you. - Integration tests pass - Intent consistency check (does the code match the plan?) +- Semantic consistency score (how well code aligns with acceptance criteria — rated High/Medium/Low) - No unexpected side effects Also automatic. Claude fixes issues before advancing. diff --git a/docs/user-guide_zh.md b/docs/user-guide_zh.md index 9896354..8ad1b5a 100644 --- a/docs/user-guide_zh.md +++ b/docs/user-guide_zh.md @@ -68,19 +68,19 @@ devpace 不要求你预先规划所有内容。初始化只创建最小骨架, ### 追溯链 -devpace 把工作组织成可追溯的链条: +devpace 把工作组织成 6 层可追溯的链条: ``` -目标 → 功能 → 任务 → 代码 -你定义目标 你规划功能 Claude 自动创建 Claude 写代码 +机会 → 专题 → 需求 → 功能 → 任务 → 代码 +你发现机会 你规划专题 一起分解 一起规划 Claude 自动创建 Claude 写代码 ``` -- **你定义**目标和功能(用自然语言) +- **你定义**机会、专题和功能(用自然语言) - **Claude 自动创建**任务,并在工作过程中维护追溯关系 -- **双向追溯**:从目标追到代码,从代码追回目标 +- **双向追溯**:从业务机会追到代码,从代码追回目标 > **内部术语参考**(你不需要记这些,Claude 对话中也不会使用): -> 目标 = OBJ/BR(Business Goal/Requirement)、功能 = PF(Product Feature)、任务 = CR(Change Request) +> 机会 = OPP、专题 = EPIC、需求 = BR(Business Requirement)、功能 = PF(Product Feature)、任务 = CR(Change Request) ### 你不需要学任何术语 @@ -93,11 +93,25 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 | "准备好了吗" | 检查质量门状态 | | "加一个导出功能" | 识别为需求变更,执行影响分析 | +### BizDevOps 覆盖度 + +devpace 覆盖完整的 BizDevOps 全域六大维度: + +| 维度 | 评分 | 关键能力 | +|------|:----:|---------| +| **Biz**(业务规划) | **8/10** | `/pace-biz` 8 子命令:opportunity、epic、decompose、align、view、discover、import、infer | +| **Product**(产品管理) | **9/10** | `/pace-plan` adjust/health、`/pace-change` 全生命周期、`/pace-next` 智能推荐 | +| **Dev**(开发) | **9.5/10** | `/pace-dev` 自主编码、ADR 管理、技术债务追踪、OWASP 安全扫描、语义漂移检测 | +| **Ops**(运维) | **7.5/10** | `/pace-release` 完整编排、`/pace-sync` 外部工具桥接、CI/CD 感知 | +| **Observe**(观测) | **9.5/10** | `/pace-retro` DORA 度量 + 预测、`/pace-pulse` 节奏监控、`/pace-guard` 风险织网 | +| **Knowledge**(知识管理) | **8.5/10** | `/pace-learn` 跨项目经验、`/pace-theory` 方法论参考、经验自动沉淀 | + --- ## 命令参考 > **核心命令**(日常使用):`/pace-init`、`/pace-dev`、`/pace-status`、`/pace-review`、`/pace-next` +> **业务命令**(上游规划):`/pace-biz` > **进阶命令**(需要时用):`/pace-change`、`/pace-plan`、`/pace-retro`、`/pace-guard` > **专项命令**(可选):`/pace-test`、`/pace-release`、`/pace-sync`、`/pace-feedback`、`/pace-role`、`/pace-theory`、`/pace-trace` @@ -108,6 +122,7 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 **参数**: - `name` — 可选,项目名称。省略时 Claude 会询问。 - `full` — 可选。执行完整设置(业务目标、功能列表、迭代计划、质量检查)。 +- `--lite` — 可选。轻量模式:跳过 OPP/Epic/BR 层,project.md 只含 OBJ→PF→CR 三层结构,适合个人小项目。 **功能**: - **默认**:创建最小 `.devpace/`(state + project 存根 + backlog + rules)。只问项目名称和描述。初始化后会预览"接下来会发生什么",帮助你了解下一步。 @@ -126,6 +141,7 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 - `功能描述` — 开始处理指定功能(自然语言匹配) - `#N` — 按编号直接跳转到指定 CR(如 `#3` → CR-003) - `--last` — 恢复上一个操作过的 CR +- `--batch` — 连续推进模式:批量推进迭代内多个 S 复杂度 PF,最后统一审批 **功能**: @@ -200,6 +216,8 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 **参数**: - *(空)* — 1 条建议(≤3 行) - `detail` — 展开候选列表(≤8 行) +- `why` — 展开推理链(2-5 行:信号扫描 + 优先级对比 + 角色影响 + 备选) +- `journey [模板名]` — 展示完整工作流路径:从当前状态到目标的分步引导。模板:`new-feature`(默认)、`iteration`、`hotfix`、`release`、`onboarding` **功能**:综合多维信号(in_review CR、developing CR、未验证部署、迭代完成度、retro 周期、backlog 状态等),按 12 级优先级矩阵推荐下一步行动。 @@ -230,6 +248,37 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 --- +### `/pace-biz [subcommand] [args]` + +**何时使用**:上游业务规划——捕获机会、创建专题、分解需求、发现需求。 + +**参数**: + +| 参数 | 说明 | +|------|------| +| `opportunity <描述>` | 捕获业务机会 | +| `epic [OPP-xxx] <描述>` | 从机会转化或直接创建专题 | +| `decompose ` | 分解 Epic→BR 或 BR→PF | +| `align` | 战略对齐健康检查(只读) | +| `view` | 业务全景视图(只读) | +| `discover <描述>` | 交互式多轮需求发现,从模糊想法出发 | +| `import <路径>...` | 从文档提取需求(会议纪要、反馈、竞品分析) | +| `infer` | 从代码库推断未追踪功能和技术债务 | +| (空) | 上下文感知推荐 | + +**推荐流程**: + +``` +完整业务路径: opportunity → epic → decompose → /pace-dev +探索式发现: discover → decompose → /pace-plan next +多源导入: import <文档> → align → /pace-plan next +代码库推断: infer → align → /pace-dev +``` + +详见[业务规划特性文档](features/pace-biz_zh.md)。 + +--- + ### `/pace-change [type] [#N|--last|--dry-run] [description]` **何时使用**:工作进行中需求发生变化。 @@ -269,6 +318,7 @@ devpace 内部使用精确的概念模型,但对话中一切都是自然语言 - `history` — 跨迭代趋势概览(需 3+ 迭代数据) - `mid` — 迭代中期轻量检查(不更新仪表盘) - `accept` — 确认上次回顾建议的操作(MoS 更新等) +- `forecast` — 交付预测:概率预估、瓶颈识别、风险预警 **报告内容**: - **行动摘要**(~10 行):关键指标 + 趋势 + 关注点 + 亮点 + 建议 @@ -435,7 +485,7 @@ Gate 2 检查"代码是否与计划一致"。accept 在此基础上提供更精 | 参数 | 动作 | |------|------| -| `scan [CR编号]` | Pre-flight 风险扫描——5 维评估(历史教训/依赖影响/架构兼容性/范围复杂度/安全敏感度) | +| `scan [CR编号]` | Pre-flight 风险扫描——5 维评估 + OWASP 安全扫描(历史教训/依赖影响/架构兼容性/范围复杂度/安全:Layer 1 关键词 + Layer 2 OWASP 模式) | | `monitor [CR编号]` | 汇总当前 CR 的实时风险状态(已缓解/待处理/新增) | | `trends [迭代ID]` | 跨 CR 趋势分析(按类别统计、重复风险识别、改进建议) | | `report` | 项目级风险仪表盘(按 PF 分组、按等级排序、总体风险评分) | @@ -466,9 +516,13 @@ Gate 2 检查"代码是否与计划一致"。accept 在此基础上提供更精 **何时使用**:收到用户反馈、发现 bug、或需要报告生产问题。 **参数**: -- `report <描述>` — 直接报告一个生产问题(跳过分诊) -- `<反馈描述>` — 分类后路由(缺陷/改进/新需求/生产事件) -- *(空)* — 引导式收集(询问问题类型、影响和紧急程度) +- `report <描述>` — **紧急通道**:跳过分诊,进入生产事件分支并启用加速路径评估(仅 hotfix/critical) +- `incident open <描述>` — 创建事件记录(严重度评估 + 时间线初始化) +- `incident close ` — 关闭事件 + 生成 postmortem 模板 +- `incident timeline ` — 查看事件时间线 +- `incident list` — 列出所有事件(支持 `--open` 筛选) +- `<反馈描述>` — 分类后路由(生产事件/缺陷/改进/新需求/记录待定) +- *(空)* — 渐进式两轮引导收集(先收集必要信息,严重度 ≥ major 时再补充细节) **功能**: 1. 分类反馈(生产事件/缺陷/改进/新需求) @@ -484,9 +538,10 @@ Gate 2 检查"代码是否与计划一致"。accept 在此基础上提供更精 **参数**: - `关键词` — 查询特定决策的推理轨迹(如"为什么打回"、"Gate 2") +- `arch [标题|ADR-NNN|list|supersede]` — 架构决策记录(ADR)管理 - *(空)* — 展示最近的决策轨迹 -**功能**:读取任务事件表、checkpoint 标记和溯源标记,重建 Gate/意图/变更等决策的完整推理过程。 +**功能**:读取任务事件表、checkpoint 标记和溯源标记,重建 Gate/意图/变更等决策的完整推理过程。同时管理跨 CR 的架构决策记录(ADR)。 **只读**:不修改任何状态文件。 @@ -510,6 +565,9 @@ Gate 2 检查"代码是否与计划一致"。accept 在此基础上提供更精 | `unlink` | `CR-ID` | 解除 CR 与外部实体的关联 | | `create` | `CR-ID` | 从 CR 元数据创建外部 Issue 并自动关联 | | `pull` | `CR-ID` | 检查外部状态并提示更新(轻量 MVP) | +| `ci status` | — | 查看当前分支的 CI/CD 运行状态 | +| `ci trigger` | `[workflow]` | 手动触发 GitHub Actions workflow | +| `ci logs` | `[run-id]` | 查看指定运行的日志摘要 | | `status` | — | 查看同步状态和外部链接 | 无参数时默认 `status`。`--dry-run` 预览操作但不实际执行。 @@ -702,6 +760,7 @@ Claude 自动运行,修复失败并重试。不会打扰你。 - 集成测试通过 - 意图一致性检查(代码是否与计划匹配?) +- 语义一致性评分(代码与验收标准的对齐度——分为高/中/低三级) - 无意外副作用 同样自动执行。Claude 在推进前修复问题。 diff --git a/hooks/pre-compact.sh b/hooks/pre-compact.sh index fa80337..43c339a 100755 --- a/hooks/pre-compact.sh +++ b/hooks/pre-compact.sh @@ -1,17 +1,52 @@ #!/bin/bash -# devpace PreCompact hook — remind to save state before context compression +# devpace PreCompact hook — save state snapshot and inject recovery context # -# Purpose: Before Claude auto-compacts (context ~95%), output a reminder -# to ensure state.md and CR files reflect the latest progress. -# This preserves cross-session continuity (OBJ-1). +# Purpose: Before Claude auto-compacts (context ~95%), output structured +# recovery context that will survive compression, ensuring continuity. +# Enhances cross-session continuity (OBJ-1) and long-session stability (UX4). # # Advisory hook (exit 0), not blocking. PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}" STATE_FILE="${PROJECT_DIR}/.devpace/state.md" +DEVPACE_DIR="${PROJECT_DIR}/.devpace" +if [ ! -f "$STATE_FILE" ]; then + exit 0 +fi + +# Extract key context for post-compact recovery +echo "devpace:pre-compact === DEVPACE RECOVERY CONTEXT (preserve after compact) ===" + +# 1. Iron Rules reminder +echo "devpace:pre-compact IR-1: state.md 是唯一会话锚点 | IR-2: 先读后写 | IR-3: 质量门不可跳过 | IR-4: 变更走流程 | IR-5: 产出可追溯" + +# 2. Current state summary (extract from state.md) if [ -f "$STATE_FILE" ]; then - echo "devpace:pre-compact Context compression imminent. Ensure state.md and any active CR files reflect current progress before compacting. Key items: 1) Update state.md '进行中' and '下一步' 2) Git commit any uncommitted changes 3) Update CR event table if in advance mode." + # Extract 进行中 and 下一步 from state.md + CURRENT=$(grep -m1 "进行中\|developing\|verifying\|in_review" "$STATE_FILE" 2>/dev/null || echo "") + NEXT_STEP=$(grep -m1 "下一步" "$STATE_FILE" 2>/dev/null || echo "") + if [ -n "$CURRENT" ]; then + echo "devpace:pre-compact Current: $CURRENT" + fi + if [ -n "$NEXT_STEP" ]; then + echo "devpace:pre-compact Next: $NEXT_STEP" + fi fi +# 3. Active CR detection +if [ -d "${DEVPACE_DIR}/backlog" ]; then + ACTIVE_CRS=$(grep -rl "developing\|verifying\|in_review" "${DEVPACE_DIR}/backlog/" 2>/dev/null | head -3) + if [ -n "$ACTIVE_CRS" ]; then + for cr in $ACTIVE_CRS; do + CR_NAME=$(basename "$cr" .md) + CR_STATUS=$(grep -m1 "状态" "$cr" 2>/dev/null | head -1) + echo "devpace:pre-compact Active CR: $CR_NAME — $CR_STATUS" + done + fi +fi + +echo "devpace:pre-compact Action: 1) Read .devpace/state.md to restore full context 2) Resume active CR 3) Git commit any uncommitted changes" +echo "devpace:pre-compact === END RECOVERY CONTEXT ===" + exit 0 diff --git a/knowledge/_schema/accept-report-contract.md b/knowledge/_schema/accept-report-contract.md new file mode 100644 index 0000000..10130c4 --- /dev/null +++ b/knowledge/_schema/accept-report-contract.md @@ -0,0 +1,86 @@ +# accept 报告数据契约 + +> **职责**:定义 `/pace-test accept` 验收验证报告的输出格式契约。此文件是 pace-test(生产方)和 pace-review(消费方)之间的共享接口。 +> +> **修改此文件时**:必须同时检查生产方(`verify-procedures.md` Step 4)和消费方(`review-procedures-gate.md` accept 消费章节)是否需要适配。 + +## §0 速查卡片 + +| 属性 | 值 | +|------|-----| +| 生产方 | `/pace-test accept`(verify-procedures.md Step 4) | +| 消费方 | `/pace-review`(review-procedures-gate.md accept 消费章节) | +| 写入位置 | CR 文件"验证证据" section | +| 触发标题 | `## 验收验证报告` | + +## 报告结构 + +### 必选段 + +#### 逐条验证结果表 + +```markdown +| # | 验收断言 | 状态 | 验证级别 | 证据 | +|---|---------|------|---------|------| +| A1 | [断言内容] | ✅ 通过 | L1 动态 | [证据摘要] | +| A2 | [断言内容] | ✅ 通过 | L2 静态 🟢 | [证据摘要] | +| A3 | [断言内容] | ❌ 未通过 | L2 静态 | [证据摘要] | +| A4 | [断言内容] | ⚠️ 需人工 | L3 | [原因] | +``` + +**状态枚举**:`✅ 通过` | `❌ 未通过` | `⚠️ 需人工` + +**验证级别枚举**:`L1 动态` | `L1+ 浏览器` | `L2 静态` | `L2 静态 🟢/🟡/🟠`(置信度) | `L3` + +#### 汇总段 + +```markdown +- 通过:N / M +- 未通过:X([未通过断言列表]) +- 需人工验证:Y +- 验证覆盖率:(N+X) / M = Z%(排除 L3 不可验证项) +``` + +### 可选段(条件输出) + +#### 测试预言审查(有 test-strategy.md 且有已覆盖条目时) + +```markdown +| 验收条件 | 映射测试 | 预言判定 | 说明 | +|---------|---------|---------|------| +| [条件] | [测试名] | ✅ 有效覆盖 | — | +| [条件] | [测试名] | ⚠️ 弱覆盖 | [原因] | +| [条件] | [测试名] | ❌ 虚假覆盖 | [原因] | +``` + +**预言判定枚举**:`✅ 有效覆盖` | `⚠️ 弱覆盖` | `❌ 虚假覆盖` + +#### 合理化自审计(有命中合理化模式时) + +```markdown +| # | 验收断言 | 审计结果 | 说明 | +|---|---------|---------|------| +| A1 | [断言] | ✅ 无风险 | — | +| A3 | [断言] | ⚠️ R1 命中 | [修正说明] | + +**审计结论**:N 条通过审计,M 条命中合理化模式(已修正) +``` + +## 消费方提取规则 + +消费方(pace-review)从 accept 报告提取以下汇总数据用于 Review 摘要: + +| 提取项 | 来源 | 摘要格式 | +|--------|------|---------| +| 通过率 | 汇总段 | `通过率:N/M` | +| 未通过列表 | 汇总段 | `未通过:[列表]` | +| 验证级别分布 | 逐条表统计 | `L1 动态 X · L2 静态 Y · L3 需人工 Z` | +| 预言审查 | 测试预言表统计 | `有效覆盖 A · 弱覆盖 B · 虚假覆盖 C` | +| 置信度分布 | L2 条目统计 | `🟢High P · 🟡Medium Q · 🟠Low R` | +| 自审计 | 审计结论行 | `M 条命中合理化模式(已修正)` | + +**消费原则**: +- 紧凑优先:摘要仅显示汇总数据(1-3 行),不复制完整报告 +- 风险聚焦:未通过项或弱覆盖 → 在"风险点"段追加 +- 不重复验证:消费已有报告,不重新执行验收 +- 无报告时静默跳过:不显示、不提示 diff --git a/knowledge/_schema/adr-format.md b/knowledge/_schema/adr-format.md new file mode 100644 index 0000000..6c83b00 --- /dev/null +++ b/knowledge/_schema/adr-format.md @@ -0,0 +1,82 @@ +# ADR(架构决策记录)格式 + +> **职责**:定义架构决策记录的文件格式。ADR 记录跨 CR 的架构级决策,防止跨会话时 Claude 做出矛盾的架构选择。 + +## §0 速查卡片 + +| 属性 | 值 | +|------|-----| +| 文件位置 | `.devpace/decisions/ADR-NNN.md` | +| 创建方式 | `/pace-trace arch` 或 Claude 自动识别 | +| 编号规则 | 三位数递增(ADR-001, ADR-002...) | +| 状态枚举 | `proposed` → `accepted` → `superseded` / `deprecated` | + +## 文件结构 + +```markdown +# ADR-NNN: [决策标题] + +- **状态**:[proposed | accepted | superseded | deprecated] +- **日期**:[YYYY-MM-DD] +- **决策者**:[Human / Claude / 协商] +- **关联 CR**:[CR-xxx(如有)] +- **被取代**:[ADR-xxx(仅 superseded 时填写)] + +## 上下文 + +[描述面临的技术问题或架构选择背景] + +## 决策 + +[描述最终选择的方案] + +## 理由 + +[为什么选择这个方案,考虑了哪些替代方案] + +## 影响 + +- **正面**:[预期收益] +- **负面**:[已知代价或风险] +- **影响范围**:[受影响的组件/模块] + +## 替代方案 + +[列出考虑过但未采用的方案及其排除理由] +``` + +## 字段规则 + +| 字段 | 必填 | 说明 | +|------|:----:|------| +| 标题 | 是 | 简洁描述决策(如"选择 PostgreSQL 作为主数据库") | +| 状态 | 是 | 初始为 `proposed`,确认后转 `accepted` | +| 日期 | 是 | 创建日期 | +| 决策者 | 是 | 标注 Human / Claude / 协商 | +| 关联 CR | 否 | 触发此决策的 CR | +| 上下文 | 是 | 问题背景 | +| 决策 | 是 | 具体方案 | +| 理由 | 是 | 选择依据 | +| 影响 | 否 | 正面/负面/范围 | +| 替代方案 | 否 | 排除的方案 | + +## 目录约定 + +``` +.devpace/ +└── decisions/ + ├── ADR-001.md + ├── ADR-002.md + └── ... +``` + +## 自动识别触发条件 + +Claude 在开发过程中遇到以下情形时,应建议创建 ADR: + +- 技术栈选型(数据库、框架、语言等) +- 架构模式选择(微服务 vs 单体、事件驱动 vs 同步等) +- 关键 API 设计决策 +- 重大重构方向 +- 安全架构决策 +- 性能优化策略选择 diff --git a/knowledge/_schema/br-format.md b/knowledge/_schema/br-format.md new file mode 100644 index 0000000..7b795c7 --- /dev/null +++ b/knowledge/_schema/br-format.md @@ -0,0 +1,146 @@ +# 业务需求文件格式契约 + +> **职责**:定义 BR 溢出后独立文件 `requirements/BR-xxx.md` 的结构。溢出触发时 Claude 自动创建此文件。 + +## §0 速查卡片 + +``` +文件名:BR-xxx.md(xxx 为 BR 编号,三位补零) +目录:.devpace/requirements/ +创建时机:溢出触发(关联 3+ PF | 业务上下文 >5 行 | 经历 /pace-change modify) +溢出模式:与 PF 溢出模式类似——初始在 project.md 树视图内联,丰富后溢出为独立文件 +内联格式:BR-001:[需求名] `P0` `进行中` → PF-001 → CR-001 🔄 +溢出格式:[BR-001:需求名](requirements/BR-001.md) `P0` → PF-001, PF-002 +内容:Epic 关联 + 状态 + 来源 + 优先级 + 业务上下文 + 成功标准 + PF 列表 +向后兼容:无 requirements/ 目录的项目不受影响——BR 始终可为 project.md 内联一行 +容错:BR 文件丢失时从 project.md 树视图 + PF/CR 文件重建 +``` + +## 溢出触发条件 + +当以下任一条件满足时,Claude 自动将 BR 从 project.md 内联溢出为独立文件: + +| 条件 | 检测方式 | 说明 | +|------|---------|------| +| 关联 3+ 个 PF | 计算价值功能树中该 BR 下的 PF 数 | 信息量足以支撑独立文件 | +| 业务上下文超过 ~5 行 | 计算 BR 相关描述行数 | 需要详细的业务背景 | +| 经历过 `/pace-change modify` | 检查变更记录中该 BR 的 modify 记录 | 变更历史需要版本化追踪 | + +**溢出是单向的**——一旦溢出不回退。project.md 树视图始终是入口。 + +## 溢出执行步骤 + +1. 创建 `.devpace/requirements/` 目录(如不存在) +2. 创建 `requirements/BR-xxx.md`,按下方文件结构填充 +3. project.md 价值功能树中该 BR 行改为链接格式:`[BR-xxx:名称](requirements/BR-xxx.md)` + +## 内联格式(project.md 树视图) + +未溢出时 BR 在树视图中为纯文本行: + +```markdown +BR-001:[业务需求名] `P0` `进行中` → PF-001 → CR-001 🔄 +``` + +字段: +- BR 编号 + 名称 +- 优先级标签:`` `P0` `` / `` `P1` `` / `` `P2` ``(无优先级时省略) +- 状态标签:`` `进行中` `` / `` `待开始` `` / `` `已完成` `` / `` `暂停` ``(仅非默认时显示) +- PF 引用:`→ PF-xxx`(多个用逗号分隔) +- CR 引用:`→ CR-xxx [emoji]`(PF 下的 CR) + +## 溢出格式(requirements/BR-xxx.md) + +```markdown +# BR-xxx:[业务需求名称] + +- **Epic**:[EPIC-xxx(专题名称)](可选——有 Epic 时填写) +- **OBJ**:OBJ-x([目标描述]) +- **状态**:[待开始 | 进行中 | 已完成 | 暂停] +- **来源**:[OPP-xxx | 日常需求](可选——Claude 推断) +- **优先级**:[P0 | P1 | P2 | —] + +## 业务上下文 + +[2-3 句话:为什么需要这个,解决什么业务问题] + +## 成功标准 + +- [业务结果层面的标准 1] +- [业务结果层面的标准 2] + +## 产品功能 + +| PF | 标题 | 状态 | CR 数 | 完成度 | +|----|------|------|:-----:|:------:| +| PF-001 | [功能名] | 完成 | 1 | 1/1 | +| PF-002 | [功能名] | 进行中 | 2 | 0/2 | +``` + +## 字段说明 + +| 字段 | 核心/渐进 | 来源 | 说明 | +|------|:---------:|------|------| +| 标题 | 核心 | 人类提供 | BR 编号 + 需求名称 | +| Epic 关联 | 核心(有 Epic 时) | Claude 自动关联 | Epic ID + 名称;无 Epic 时 BR 直挂 OBJ | +| OBJ 关联 | 核心 | Claude 自动关联 | 业务目标 ID + 描述 | +| 状态 | 核心(自动) | Claude 基于 PF 完成度计算 | 见下方状态计算规则 | +| 来源 | 渐进 | Claude 推断 | OPP-ID(Opportunity 转化)或"日常需求" | +| 优先级 | 渐进 | /pace-plan 或用户指定 | `P0`(必须)/ `P1`(应该)/ `P2`(最好)/ `—`(未评估) | +| 业务上下文 | 渐进 | 人类讨论或 Claude 捕获 | 溢出后必须有(溢出说明信息量已足够) | +| 成功标准 | 渐进 | /pace-biz 或 BR 讨论时 | 业务结果层面(非实现正确性) | +| PF 列表 | 核心(自动) | PF 创建时 Claude 自动关联 | 含状态、CR 数、完成度 | + +### 状态计算规则 + +| 条件 | BR 状态 | +|------|--------| +| 所有 PF 的所有 CR 均 merged/released | 已完成 | +| 至少一个 PF 有进行中的 CR(developing/verifying/in_review) | 进行中 | +| 所有 PF 均待开始或无 PF | 待开始 | +| 所有 PF 均暂停或 BR 被显式暂停 | 暂停 | + +### BR 成功标准 vs PF 验收标准 + +| 层面 | 位置 | 示例 | 评估时机 | +|------|------|------|---------| +| BR 成功标准(业务结果) | BR 文件 | "用户可以通过至少一种方式完成登录" | /pace-retro | +| PF 验收标准(实现正确性) | PF 文件或 project.md 功能规格 | "邮箱+密码,密码>=8位" | Gate 2 | +| CR 验收条件(代码正确性) | CR 文件意图 section | "支持 bcrypt 哈希,8+ 字符" | Gate 2 | + +## 优先级定义 + +| 级别 | 含义 | 说明 | +|------|------|------| +| P0 | 必须做 | 阻塞核心业务目标 | +| P1 | 应该做 | 重要但非阻塞 | +| P2 | 最好做 | 改善体验但可延后 | +| — | 未评估 | 尚未讨论优先级 | + +## 命名规则 + +- 文件名:`BR-001.md`、`BR-002.md`...(三位补零自增) +- ID 自增:扫描 project.md 价值功能树中现有 BR 编号的最大值 +1 +- 目录不存在时自动创建 + +## 更新时机 + +| 事件 | 更新内容 | +|------|---------| +| PF 创建/删除 | PF 列表表格 | +| PF/CR 状态变更 | PF 状态 + 完成度 + BR 状态重新计算 | +| /pace-change modify BR | 业务上下文 + 成功标准 | +| /pace-change pause BR | 状态 → 暂停 | +| /pace-change resume BR | 状态恢复 | +| /pace-biz decompose | PF 列表更新 | +| /pace-plan 分配优先级 | 优先级字段 | + +## 容错 + +| 异常 | 处理 | +|------|------| +| BR 文件丢失 | 从 project.md 树视图 + PF/CR 文件重建 | +| requirements/ 目录不存在 | 溢出时自动创建 | +| project.md 链接指向不存在的 BR 文件 | 按"BR 文件丢失"处理 | +| BR 文件与 project.md 树视图状态不一致 | 以 BR 文件为准(更详细),同步更新树视图 | +| PF 列表与实际 PF 不一致 | 以 PF 文件/project.md 功能规格为准重建 | diff --git a/knowledge/_schema/cr-format.md b/knowledge/_schema/cr-format.md index e2920e8..005d9b0 100644 --- a/knowledge/_schema/cr-format.md +++ b/knowledge/_schema/cr-format.md @@ -27,7 +27,7 @@ - **ID**:CR-xxx - **类型**:[feature | defect | hotfix](默认 feature,可省略) - **严重度**:[critical | major | minor | trivial](仅 defect/hotfix 填写) -- **产品功能**:[PF 标题]([PF-ID])→ [BR 标题]([BR-ID]) +- **产品功能**:[PF 标题]([PF-ID])→ [BR 标题]([BR-ID])→ [Epic 标题]([EPIC-ID]) - **应用**:[应用名称] - **分支**:[feature/branch-name] - **状态**:[created | developing | verifying | in_review | approved | merged | released] @@ -46,9 +46,24 @@ - **用户原话**:[用户的原始请求] - **范围**:[做什么 / 不做什么] - **验收条件**:[怎样算完成] -- **方案**:[采取什么方案,为什么] +- **方案**:[采取什么方案,为什么](详见下方"方案字段"章节) - **约束**:[边界条件、假设、限制] +### 方案字段(L/XL CR 必填,S/M 可选) + +L/XL CR 经过技术方案评审(见 `skills/pace-dev/dev-procedures-intent.md` 技术方案评审章节)后填充: +- **选定方案**:[方案名 + 1 行描述] +- **备选方案**:[方案 B 名 + 为何未选] +- **决策理由**:[1-2 行选定理由] +- **关联 ADR**:[ADR-NNN](如有) + +S/M CR 可直接填写 1 行实现思路。 + +规则: +- L/XL 进入 developing 前必须填充(技术方案评审步骤自动写入) +- S/M 无方案字段不报错(向后兼容) +- 方案评审流程详见 `skills/pace-dev/dev-procedures-intent.md` + ### 验收条件格式(复杂度自适应) 验收条件格式根据 CR 复杂度自动选择,降低简单 CR 的负担,提升复杂 CR 的精度: @@ -177,11 +192,13 @@ CR 意图 section 使用溯源标记区分用户输入与 Claude 推断。溯源 | feature | 新功能或增强(默认) | 正常迭代中的产品功能开发 | | defect | 缺陷修复 | 已发布功能发现的问题,通常由 /pace-feedback 创建 | | hotfix | 紧急修复 | 生产环境紧急问题,可走加速路径(跳过部分门禁) | +| tech-debt | 技术债务偿还 | 重构、性能优化、依赖升级等非功能性改进 | 类型规则: - `feature` 是默认值,现有无 type 字段的 CR 自动视为 feature(向后兼容) - `defect` 和 `hotfix` 必须填写 severity 字段 - `hotfix` 可走加速路径:created → developing → verifying → merged(跳过 in_review,但仍需事后审批记录) +- `tech-debt` 走标准路径,但迭代规划时可计入技术债务预算(见 project-format.md 配置章节) ### 严重度 diff --git a/knowledge/_schema/epic-format.md b/knowledge/_schema/epic-format.md new file mode 100644 index 0000000..a19860b --- /dev/null +++ b/knowledge/_schema/epic-format.md @@ -0,0 +1,125 @@ +# Epic 文件格式契约 + +> **职责**:定义 Epic 独立文件 `epics/EPIC-xxx.md` 的结构。/pace-biz epic 创建时遵循此格式。 + +## §0 速查卡片 + +``` +文件名:EPIC-xxx.md(xxx 为自增数字,三位补零) +目录:.devpace/epics/ +创建时机:/pace-biz epic(从 Opportunity 转化或直接创建) +始终独立文件:Epic 不内联在 project.md 中,始终有独立文件 +内容:OBJ 关联 + 状态 + 来源 + 时间框架 + 背景 + MoS + BR 列表 +project.md 保留:价值功能树中 Epic 行用 Markdown 链接指向文件 +向后兼容:无 epics/ 目录的项目不受影响——BR 直挂 OBJ(现有行为不变) +容错:Epic 文件丢失时从 project.md 树视图 + BR 文件重建 +``` + +## 文件结构 + +```markdown +# EPIC-xxx:[专题名称] + +- **OBJ**:OBJ-x([目标描述]) +- **状态**:[规划中 | 进行中 | 已完成 | 已搁置] +- **来源**:[OPP-xxx([描述])](可选——首次 /pace-biz 时填充) +- **时间框架**:[Iter-x](可选——首次 /pace-plan 时填充) + +## 背景 + +[2-3 句话:为什么做这个专题,要解决什么问题] + +## 成效指标(MoS) + +- [ ] [指标 1](目标:[值]) +- [ ] [指标 2] + +## 业务需求 + +| BR | 标题 | 优先级 | 状态 | PF 数 | 完成度 | +|----|------|:------:|------|:-----:|:------:| +| BR-001 | [需求名] | P0 | 进行中 | 2 | 1/2 | +| BR-002 | [需求名] | P1 | 待开始 | 0 | — | +``` + +## 字段说明 + +| 字段 | 核心/渐进 | 来源 | 说明 | +|------|:---------:|------|------| +| 标题 | 核心 | /pace-biz epic 创建时 | EPIC 编号 + 专题名称 | +| OBJ 关联 | 核心 | 创建时 Claude 关联 | 业务目标 ID + 描述 | +| 状态 | 核心 | Claude 自动维护 | 基于 BR 完成度聚合计算 | +| 来源 | 渐进 | Claude 推断 | 关联 OPP-ID(从 Opportunity 转化时) | +| 时间框架 | 渐进 | /pace-plan 或讨论排期时 | 迭代 ID | +| 背景 | 核心 | 人类提供 | 2-3 句话说明专题原因 | +| MoS | 渐进 | 人类定义或 /pace-biz 引导 | 专题级成效指标 | +| BR 列表 | 核心(自动) | BR 创建时 Claude 自动关联 | 含优先级、状态、PF 数、完成度 | + +### 状态计算规则 + +| 条件 | Epic 状态 | +|------|----------| +| 所有 BR 的 PF 均已完成(全部 CR merged/released) | 已完成 | +| 至少一个 BR 有进行中的 PF(有 developing/verifying/in_review CR) | 进行中 | +| 所有 BR 均 `待开始` 或 Epic 刚创建 | 规划中 | +| 所有 BR 均 `暂停` 或 Epic 被显式搁置 | 已搁置 | + +### BR 列表字段说明 + +| 列 | 说明 | +|----|------| +| BR | BR 编号(如溢出则为链接) | +| 标题 | BR 名称 | +| 优先级 | `P0` / `P1` / `P2` / `—`(未评估) | +| 状态 | `待开始` / `进行中` / `已完成` / `暂停` | +| PF 数 | 关联的 PF 总数 | +| 完成度 | 已完成 PF 数 / PF 总数(无 PF 时显示 `—`) | + +## 命名规则 + +- 文件名:`EPIC-001.md`、`EPIC-002.md`...(三位补零自增) +- ID 自增:扫描 `.devpace/epics/` 中现有 Epic 文件的最大编号 +1 +- 目录不存在时自动创建 + +## project.md 中的引用格式 + +价值功能树中 Epic 行始终使用 Markdown 链接: + +```markdown +OBJ-001([目标名]) +├── [EPIC-001:专题名](epics/EPIC-001.md) +│ ├── BR-001:需求名 `P0` `进行中` → PF-001 → CR-001 🔄 +│ └── [BR-002:需求名](requirements/BR-002.md) `P1` → PF-002, PF-003 +└── [EPIC-002:专题名](epics/EPIC-002.md) + └── BR-003:需求名 `P0` → PF-004 → CR-003 ✅ +``` + +**无 Epic 时**:BR 直接挂在 OBJ 下(与当前行为一致,向后兼容): + +```markdown +OBJ-001([目标名]) +├── BR-001:需求名 +│ └── PF-001:功能名 → CR-001 🔄 +``` + +## 更新时机 + +| 事件 | 更新内容 | +|------|---------| +| BR 创建/删除 | BR 列表表格 | +| BR 状态变更 | BR 列表表格 + Epic 状态重新计算 | +| PF/CR 状态变更 | BR 完成度 + Epic 状态重新计算 | +| /pace-change pause Epic | 状态 → 已搁置 | +| /pace-change resume Epic | 状态恢复 | +| /pace-plan 分配时间框架 | 时间框架字段 | +| /pace-retro 评估 MoS | MoS checkbox | + +## 容错 + +| 异常 | 处理 | +|------|------| +| Epic 文件丢失 | 从 project.md 树视图 + BR 文件中的 Epic 关联字段重建 | +| epics/ 目录不存在 | /pace-biz epic 时自动创建 | +| project.md 链接指向不存在的 Epic 文件 | 按"Epic 文件丢失"处理 | +| Epic 文件与 project.md 树视图状态不一致 | 以 Epic 文件为准(更详细),同步更新树视图 | +| BR 列表与实际 BR 文件不一致 | 以 BR 文件和 project.md 树视图为准重建 | diff --git a/knowledge/_schema/incident-format.md b/knowledge/_schema/incident-format.md new file mode 100644 index 0000000..8724d23 --- /dev/null +++ b/knowledge/_schema/incident-format.md @@ -0,0 +1,95 @@ +# 事件记录格式定义 + +> **职责**:定义 `.devpace/incidents/INCIDENT-NNN.md` 的文件格式。 + +## §0 速查卡片 + +| 维度 | 值 | +|------|---| +| 文件位置 | `.devpace/incidents/INCIDENT-NNN.md` | +| 编号规则 | 扫描目录最大编号 +1,3 位补零 | +| 状态流转 | open → investigating → mitigated → closed | +| 写入方 | pace-feedback incident open/close | + +## 必需字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| 标题 | 字符串 | 事件简述 | +| 严重度 | P0/P1/P2/P3 | 事件等级 | +| 状态 | open/investigating/mitigated/closed | 当前状态 | +| 影响范围 | 字符串 | 受影响的用户/功能/模块 | +| 开始时间 | ISO 8601 | 事件发现时间 | +| 关联 CR | 列表 | 相关 Hotfix/Defect CR 编号 | + +## 可选字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| 结束时间 | ISO 8601 | 事件关闭时间(closed 时填充) | +| Postmortem | 结构化文本 | 事后复盘(closed 时生成模板) | + +## 时间线格式 + +时间线是事件文件内嵌的表格,每行记录一个事件节点。 + +## 文件结构 + +```markdown +# INCIDENT-NNN:[标题] + +- **严重度**:[P0 | P1 | P2 | P3] +- **状态**:[open | investigating | mitigated | closed] +- **影响范围**:[描述] +- **开始时间**:[YYYY-MM-DDTHH:MM:SS] +- **结束时间**:[YYYY-MM-DDTHH:MM:SS | —] +- **关联 CR**:[CR-xxx, CR-yyy | 无] + +## 时间线 + +| 时间 | 事件 | +|------|------| +| [ISO 8601] | 事件创建 | + +## Postmortem + +(事件关闭后由 incident close 生成模板) +``` + +## 状态机 + +``` +open ──→ investigating ──→ mitigated ──→ closed + │ │ ↑ + │ └───────────────────────────┘ + └──→ closed(轻微事件可直接关闭) +``` + +### 转换规则 + +| 转换 | 触发者 | 条件 | +|------|--------|------| +| open → investigating | Claude 或人类 | 开始调查 | +| open → closed | Claude 或人类 | 轻微事件直接关闭 | +| investigating → mitigated | Claude 或人类 | 影响已缓解但根因未修复 | +| investigating → closed | Claude 或人类 | 根因已修复 | +| mitigated → closed | Claude 或人类 | 根因已修复、Postmortem 完成 | + +**约束**:closed 是终态,不可回退。每次状态变更必须在时间线追加一行。 + +## 编号规则 + +- 文件名格式:`INCIDENT-NNN.md`,NNN 为三位数字,从 001 开始递增 +- 存储目录:`.devpace/incidents/` +- 编号规则:取 `.devpace/incidents/` 目录下现有 `INCIDENT-*.md` 文件的最大编号 +1 +- 目录不存在时由 `incident open` 自动创建 +- 编号不复用:即使事件已 closed,其编号不回收 + +## 更新时机 + +| 操作 | 触发场景 | 动作 | +|------|---------|------| +| 创建 | incident open | 新建 INCIDENT-NNN.md,状态 open | +| 时间线追加 | 状态变更、关键事件发生 | 时间线表格追加行 | +| 状态更新 | incident close 或手动更新 | 更新头部状态 + 时间线追加行 | +| Postmortem 生成 | incident close | 填充 Postmortem section 模板 | diff --git a/knowledge/_schema/opportunity-format.md b/knowledge/_schema/opportunity-format.md new file mode 100644 index 0000000..26d46e1 --- /dev/null +++ b/knowledge/_schema/opportunity-format.md @@ -0,0 +1,107 @@ +# 业务机会文件格式契约 + +> **职责**:定义 opportunities.md 的结构。/pace-biz opportunity 创建时遵循此格式。 + +## §0 速查卡片 + +``` +文件名:opportunities.md(单文件,所有机会集中管理) +目录:.devpace/ +创建时机:首次 /pace-biz opportunity 或 /pace-init full 时创建 +格式:段落式(每个 Opportunity 一个二级标题 + 列表字段) +状态流转:评估中 → 已采纳/已搁置/已拒绝 +来源类型:用户反馈 | 竞品观察 | 技术发现 | 市场趋势 | 内部洞察 +不在 project.md 中:业务机会看板独立于战略全景图 +向后兼容:无 opportunities.md 的项目不受影响 +容错:文件丢失时创建空文件 +``` + +## 文件结构 + +```markdown +# 业务机会 + +## OPP-001:[机会描述] +- **来源**:[来源类型]([详细信息]) +- **状态**:[评估中 | 已采纳 | 已搁置 | 已拒绝] +- **日期**:[YYYY-MM-DD] + +## OPP-002:[机会描述] +- **来源**:[来源类型]([详细信息]) +- **状态**:已采纳 → EPIC-001 +- **日期**:[YYYY-MM-DD] +``` + +## 字段说明 + +| 字段 | 核心/渐进 | 来源 | 说明 | +|------|:---------:|------|------| +| ID(OPP-xxx) | 核心 | Claude 自增 | 三位补零自增编号 | +| 描述(二级标题) | 核心 | 人类提供或 Claude 捕获 | 简洁描述业务机会 | +| 来源(类型+详情) | 核心 | Claude 推断类型,人类补详情 | 见下方来源类型枚举 | +| 状态 | 核心 | Claude 维护 | 见下方状态定义 | +| 日期 | 核心 | Claude 自动 | 创建日期 | + +### 来源类型枚举 + +| 类型 | 含义 | 示例 | +|------|------|------| +| 用户反馈 | 来自真实用户的反馈或投诉 | 用户反馈(客户 A,2026-03-01) | +| 竞品观察 | 竞争对手的功能或策略 | 竞品观察(竞品 X 上线实时协作) | +| 技术发现 | 技术研究或实验中发现的机会 | 技术发现(新 API 可提升 3x 性能) | +| 市场趋势 | 行业趋势和市场变化 | 市场趋势(AI 辅助开发需求增长) | +| 内部洞察 | 团队内部讨论和洞察 | 内部洞察(架构重构可解锁新能力) | + +### 状态定义 + +| 状态 | 含义 | 转换条件 | +|------|------|---------| +| 评估中 | 新捕获,待分析 | 初始状态 | +| 已采纳 | 转化为 Epic | /pace-biz epic 评估通过,格式:`已采纳 → EPIC-xxx` | +| 已搁置 | 暂时不处理 | 用户决定延后 | +| 已拒绝 | 不符合战略方向 | 用户决定不做 | + +**状态规则**: +- `已采纳` 时必须关联 Epic ID:`已采纳 → EPIC-xxx` +- `已搁置` 和 `已拒绝` 可恢复为 `评估中` +- 状态变更由 Claude 在 /pace-biz 操作时自动维护 + +## 命名规则 + +- ID:`OPP-001`、`OPP-002`...(三位补零自增) +- ID 自增:扫描 opportunities.md 中现有 OPP 编号的最大值 +1 + +## 设计决策 + +### 为何不使用表格 + +表格无法承载变长内容(来源详情因类型不同长度差异大)。段落格式更灵活,每个 Opportunity 一个二级标题 + 列表字段。 + +### 为何不在 project.md 中 + +- opportunities.md 是操作性追踪文件,持续增长 +- project.md 是战略全景图,应保持简洁 +- 机会状态变化频繁,不应污染战略视图 + +### 刻意省略的字段 + +- **Impact/Effort**:评估阶段的产出,不是录入字段。评估在 /pace-biz 中发生,结果体现为状态变化(采纳→创建 Epic) +- **优先级**:机会不需要优先级——评估后要么采纳(进入 Epic 管理)要么搁置/拒绝 + +## 更新时机 + +| 事件 | 更新内容 | +|------|---------| +| /pace-biz opportunity | 新增 OPP 条目 | +| /pace-biz epic(从 OPP 转化) | OPP 状态 → `已采纳 → EPIC-xxx` | +| 用户决定搁置/拒绝 | OPP 状态变更 | +| /pace-biz view | 只读——不修改文件 | + +## 容错 + +| 异常 | 处理 | +|------|------| +| opportunities.md 不存在 | /pace-biz opportunity 时自动创建(含标题行) | +| OPP 编号不连续 | 基于最大编号 +1 继续编号,不填补空缺 | +| 状态值不合法 | 视为"评估中"(保守假设) | +| 引用的 EPIC 不存在 | 保留引用但在 /pace-biz view 时标记警告 | diff --git a/knowledge/_schema/pf-format.md b/knowledge/_schema/pf-format.md index 0dd4d47..1dc67fd 100644 --- a/knowledge/_schema/pf-format.md +++ b/knowledge/_schema/pf-format.md @@ -39,7 +39,7 @@ project.md 保留:树视图行 + [详情] 链接,功能规格 section 中该 ```markdown # PF-xxx:[产品功能名称] -- **BR**:[BR 名称]([BR-ID])→ [OBJ-ID] +- **BR**:[BR 名称]([BR-ID])→ [Epic 名称]([EPIC-ID])→ [OBJ-ID] - **状态**:[进行中 | 全部 CR 完成 | 已发布 | 暂停] - **用户故事**:[作为...,我希望...] @@ -76,7 +76,7 @@ project.md 保留:树视图行 + [详情] 链接,功能规格 section 中该 | 字段 | 必填 | 来源 | 说明 | |------|------|------|------| | 标题 | 是 | project.md PF 行 | PF 编号 + 名称 | -| BR 关联 | 是 | project.md 价值功能树 | BR 名称和 ID + OBJ ID | +| BR 关联 | 是 | project.md 价值功能树 | BR 名称和 ID + Epic ID(如有)+ OBJ ID | | 状态 | 是 | 计算得出 | 基于关联 CR 状态聚合 | | 用户故事 | 否 | project.md PF 行括号内容 | 首个 CR 创建时填充 | | 验收标准 | 否 | project.md 功能规格迁移 | 带 checkbox 和 history 注释 | diff --git a/knowledge/_schema/project-format.md b/knowledge/_schema/project-format.md index 9ee38f8..abc7fe5 100644 --- a/knowledge/_schema/project-format.md +++ b/knowledge/_schema/project-format.md @@ -5,17 +5,22 @@ ## §0 速查卡片 ``` -project.md 是项目的业务全景图 -完整版包含:配置(可选)+ 愿景 + 业务目标 + 成效指标 + 实施路径 + 范围 + 原则 + 价值功能树(+功能规格) +project.md 是项目的战略全景图 + 导航地图 +完整版包含:配置(可选)+ 愿景 + 战略上下文 + 业务目标(含产品维度)+ 成效指标 + 实施路径 + 范围 + 原则 + 价值功能树(Epic→BR→PF→CR) 配置:自主级别(辅助/标准/自主,默认标准)— 控制 Claude 在推进模式中的自主程度 +模式:完整(默认)或 lite(OBJ→PF→CR,跳过 OPP/Epic/BR,适合个人小项目) 最小版(v0.4.0 init):项目名 + 描述 + 空桩(随开发自然生长) +愿景:目标用户 + 核心问题 + 差异化 + 成功图景(首次 /pace-biz 或 /pace-init full 时填充) +战略上下文:核心假设 + 外部约束(首次 /pace-biz 或讨论战略时填充) 范围:做什么 / 不做什么(首次 /pace-change 或范围讨论时填充) 原则:项目级技术/产品原则(首次 /pace-retro 或技术讨论时积累) PF 可选丰富:用户故事(首个 CR) + 验收标准(verifying) + 边界(变更管理) PF 溢出:功能规格 >15 行 | 关联 3+ CR | 经历 modify → 自动溢出到 features/PF-xxx.md,树视图保留链接 -价值功能树:OBJ → BR → PF → CR 的完整链路 +BR 溢出:关联 3+ PF | 业务上下文 >5 行 | 经历 modify → 自动溢出到 requirements/BR-xxx.md,树视图保留链接 +价值功能树:OBJ → Epic → BR → PF → CR 的完整链路(Epic 始终用链接指向独立文件) CR 状态用 emoji:🔄 进行中 | ✅ 完成 | ⏳ 待开始 | 🚀 已发布 Release 标记:📦 待发布 | 🚀 已发布 +业务机会看板在独立的 opportunities.md 中(不在 project.md) ``` ## 最小状态(v0.4.0 渐进式初始化) @@ -27,6 +32,14 @@ Release 标记:📦 待发布 | 🚀 已发布 > [一句话项目定位] +## 愿景 + +(首次 /pace-biz 或 /pace-init full 时填充) + +## 战略上下文 + +(首次 /pace-biz 或讨论战略时填充) + ## 业务目标 (随开发自然生长 — 首次 /pace-retro 或讨论业务目标时引导定义) @@ -49,6 +62,8 @@ Release 标记:📦 待发布 | 🚀 已发布 ``` 桩文件中的占位文字在以下时机被替换为实际内容: +- **愿景**:首次 `/pace-biz` 或 `/pace-init full` 时引导定义 +- **战略上下文**:首次 `/pace-biz` 或讨论战略时填充 - **价值功能树**:首个 CR 创建时,Claude 自动推断 PF 并回填 - **业务目标**:首次 `/pace-retro` 或用户主动讨论业务目标时引导定义 - **实施路径**:首次 `/pace-plan` 时规划 @@ -85,6 +100,7 @@ Claude 在更新 project.md 时,如果发现是桩状态(含占位文字) - 字段不存在时默认"标准"(向后兼容) - 用户可随时修改,修改后即时生效(下一个 CR 生效) - Claude 不自动修改此字段——仅用户主动调整 +- **智能建议**:pace-pulse 每 5 个 CR merged 后自动评估 Gate 通过率和打回率,建议级别调整(需用户确认) #### preferred-role(可选) @@ -106,21 +122,100 @@ Claude 在更新 project.md 时,如果发现是桩状态(含占位文字) - 会话启动时读取此字段作为初始角色(优先级低于显式 `/pace-role` 设置) - Claude 不自动修改此字段——仅用户通过 `/pace-role set-default` 调整 +#### tech-debt-budget(可选) + +```markdown +- **技术债务预算**:[0-100]%(默认:20%) +``` + +| 属性 | 说明 | +|------|------| +| 含义 | 每个迭代预留给 tech-debt 类型 CR 的容量百分比 | +| 默认值 | 20%(字段不存在时) | +| 消费方 | `/pace-plan`(迭代规划时预留容量)、`/pace-retro`(技术债务趋势指标) | +| 修改方式 | 用户手动编辑 project.md 或通过 `/pace-plan adjust` | + +规则: +- 字段不存在时默认 20%(向后兼容) +- `/pace-plan` 在计算迭代容量时,将总容量 × tech-debt-budget% 作为 tech-debt CR 预留容量 +- Claude 在 `/pace-biz infer` 发现大量技术债务时,可建议用户提高此预算 + +#### mode(可选) + +```markdown +- **模式**:[lite] +``` + +| 值 | 含义 | +|---|------| +| (缺省) | 完整模式(OPP→Epic→BR→PF→CR) | +| `lite` | 轻量模式(OBJ→PF→CR,跳过 OPP/Epic/BR) | + +规则: +- 字段不存在时默认完整模式(向后兼容) +- 通过 `/pace-init --lite` 设置 +- lite 模式下价值功能树跳过 Epic/BR 层,PF 直接挂在 OBJ 下 +- 首次通过 `/pace-biz` 创建 Epic/BR 时自动升级为完整模式(移除 `mode: lite` 标记) +- Claude 不自动修改此字段——仅用户通过 `/pace-init` 参数或 `/pace-biz` 触发升级 + +### 1.6 愿景(可选,渐进填充) + +```markdown +## 愿景 + +- **目标用户**:[谁会用这个产品] +- **核心问题**:[他们的什么痛点] +- **差异化**:[为什么选你而不是替代方案](首次 /pace-biz 时填充) +- **成功图景**:[做成了是什么样](首次 /pace-retro 时填充) +``` + +填充时机:首次 `/pace-biz` 或 `/pace-init full` 时引导填充。愿景帮助 Claude 在后续决策中保持方向一致性。 + +规则: +- 字段为空时保持空值或占位文字,不影响任何功能 +- Claude 不自动推断愿景内容——愿景必须来自人类 +- 向后兼容:无愿景 section 时保持现有一行 blockquote 格式 + +### 1.7 战略上下文(可选,渐进填充) + +```markdown +## 战略上下文 + +**核心假设**: +- [假设 1]([待验证 | 已验证 | 已推翻]) + +**外部约束**: +- [约束 1] +``` + +填充时机:首次 `/pace-biz` 或讨论战略时填充。战略上下文帮助 Claude 理解决策约束和不确定性。 + +规则: +- 核心假设的状态由人类维护(`待验证` / `已验证` / `已推翻`) +- Claude 可在 /pace-retro 时建议更新假设状态,但需人类确认 +- 字段为空时不影响任何功能(向后兼容) + ### 2. 业务目标 ```markdown ## 业务目标 -**当前目标**:[目标 ID] — [目标描述] +### OBJ-1:[目标描述]([business | product | tech],[短期 | 中期 | 长期]) **成效指标(MoS)**: - [ ] [指标 1] -- [ ] [指标 2](当前:[测量值] → 进度 [N]%) +- [ ] [指标 2](目标:[值],当前:[值] → 进度 [N]%) - [x] [指标 3] ``` 成效指标用 checkbox,达成时勾选。 +**OBJ 产品维度属性**:每个 OBJ 可标注类型和时间维度: +- **类型**:`business`(业务目标)/ `product`(产品目标)/ `tech`(技术目标) +- **时间维度**:`短期`(当前迭代)/ `中期`(2-3 迭代)/ `长期`(季度+) +- 这些属性为可选标注——缺失时不影响功能(向后兼容) +- 多个 OBJ 时每个 OBJ 用三级标题(`### OBJ-N:...`) + **量化进度标注(可选)**:对连续性指标(如"响应时间 < 200ms"、"部署频率 ≥ 1 次/周"),可在括号内追加当前测量值和进度百分比。此标注由 `/pace-retro` 在有 dashboard.md 数据时自动计算并建议追加(需用户确认),二值指标(如"首个 CR 全流程走通")保持简单 checkbox。 ### 3. 实施路径 @@ -163,20 +258,49 @@ Claude 在更新 project.md 时,如果发现是桩状态(含占位文字) ```markdown ## 价值功能树 -OBJ-xxx([目标名]) +OBJ-001([目标名]) +├── [EPIC-001:专题名](epics/EPIC-001.md) +│ ├── BR-001:需求名 `P0` `进行中` → PF-001 → CR-001 🔄 +│ └── [BR-002:需求名](requirements/BR-002.md) `P1` → PF-002, PF-003 +└── [EPIC-002:专题名](epics/EPIC-002.md) + └── BR-003:需求名 `P0` → PF-004 → CR-003 ✅ +``` + +**无 Epic 时**(向后兼容):BR 直接挂在 OBJ 下,与当前行为一致: +```markdown +OBJ-001([目标名]) ├── BR-001:[业务需求名] │ ├── PF-001:[产品功能名] ✅ → [详情](features/PF-001.md) │ └── PF-002:[产品功能名] → (待创建 CR) -└── BR-002:[业务需求名] - └── PF-003:[产品功能名] → CR-002 ⏳ ``` +**Epic 行格式**:始终使用 Markdown 链接指向独立文件: +```markdown +[EPIC-xxx:专题名](epics/EPIC-xxx.md) +``` + +**BR 行格式**(两种,与 PF 溢出模式类似): + +未溢出: +``` +BR-xxx:[需求名] `P0` `进行中` → PF-001 → CR-001 🔄 +``` + +已溢出: +``` +[BR-xxx:需求名](requirements/BR-xxx.md) `P1` → PF-002, PF-003 +``` + +BR 行的标签说明: +- 优先级标签:`P0` / `P1` / `P2`(无优先级时省略) +- 状态标签:仅非默认时显示,如 `暂停` + PF 溢出后的树视图格式(已溢出的 PF 用 `[详情]` 链接替代 CR 列表): ```markdown PF-xxx:[产品功能名] [状态] → [详情](features/PF-xxx.md) ``` `[详情](features/PF-xxx.md)` 是实际的 Markdown 链接,在 IDE 中可点击跳转到 PF 文件。 -未溢出的 PF 保持原格式(直接列出 CR)。两种格式可在同一棵树中共存。 +未溢出的 PF 保持原格式(直接列出 CR)。三种溢出格式(Epic链接、BR溢出、PF溢出)可在同一棵树中共存。 CR 状态标记: - `🔄` — 进行中 @@ -191,11 +315,17 @@ CR 状态标记: Claude 每次写入或更新价值功能树时,确保格式一致性: -- 有关联 CR 的 PF 行:`PF-xxx:[名称] → CR-yyy [emoji]`(多个 CR 用逗号空格分隔:`→ CR-001 ✅, CR-003 🔄`) -- 无 CR 的 PF 行:`PF-xxx:[名称] → (待创建 CR)` 或 `PF-xxx:[名称] ⏳`(规划阶段) -- 已溢出 PF 行:`PF-xxx:[名称] [状态] → [详情](features/PF-xxx.md)` +``` +Epic 行: [EPIC-xxx:名称](epics/EPIC-xxx.md) — 始终链接,不内联 +未溢出 BR 行: BR-xxx:[名称] `Px` → PF-xxx → CR-yyy 🔄 — 纯文本 +已溢出 BR 行: [BR-xxx:名称](requirements/BR-xxx.md) `Px` — 溢出后用链接 +PF 行(有 CR): PF-xxx:[名称] → CR-yyy 🔄 — 多 CR 逗号分隔 +PF 行(无 CR): PF-xxx:[名称] → (待创建 CR) — 规划阶段 +已溢出 PF 行: PF-xxx:[名称] [状态] → [详情](features/PF-xxx.md) — 溢出后用链接 +``` CR 创建时:在 PF 行追加 CR 引用。CR 状态变更时:更新对应 emoji。 +Epic/BR 创建时:在树中追加对应行。Epic 状态变更时:更新 Epic 文件(不在树中标记状态)。 Release 标记(价值功能树下方,可选): ```markdown @@ -254,7 +384,7 @@ PF-001:用户认证(作为用户,我希望能安全登录)→ CR-001 - PF 经历过 `/pace-change modify` **溢出后 project.md 变化**: -1. 价值功能树中该 PF 行改为:`PF-xxx:[名称] [状态] → [详情](features/PF-xxx.md)` +1. 价值功能树中该 PF 行改为链接格式(见功能树格式校验规则中的"已溢出 PF 行") 2. 功能规格 section 中该 PF 段落移除(如 section 变为空则移除整个 section) **规则**: @@ -279,6 +409,24 @@ PF-001:用户认证(作为用户,我希望能安全登录)→ CR-001 溢出后 history 注释迁移到 PF 文件中,`git log features/PF-xxx.md` 提供完整文件级历史。 +### BR 溢出模式(Overflow Pattern) + +当 BR 信息量增长到一定规模时,自动溢出为独立文件 `requirements/BR-xxx.md`,project.md 保留树视图和链接。 + +**触发条件**(满足任一): +- BR 关联 3+ 个 PF +- 业务上下文超过 ~5 行 +- BR 经历过 `/pace-change modify` + +**溢出后 project.md 变化**: +1. 价值功能树中该 BR 行改为链接格式(见功能树格式校验规则中的"已溢出 BR 行") + +**规则**: +- 溢出是自动、零摩擦的(对齐 P1 零摩擦原则) +- 溢出是单向的——一旦溢出不回退 +- 无 `requirements/` 目录的项目不受影响(完全向后兼容) +- BR 文件格式契约见 `knowledge/_schema/br-format.md` + ## 溯源标记 project.md 中 Claude 自动生成的内容使用 HTML 注释标记来源,区分用户输入与 Claude 推断。标记不影响 Markdown 渲染,仅在深入层(/pace-trace 或 --detail)时可见。 @@ -314,7 +462,11 @@ project.md 中 Claude 自动生成的内容使用 HTML 注释标记来源,区 ## 更新时机 +- 愿景在 `/pace-biz` 或 `/pace-init full` 时引导填充(人类内容,Claude 不自动推断) +- 战略上下文在 `/pace-biz` 或讨论战略时填充,假设状态由人类维护 - 价值功能树在 CR 创建/状态变更时由 Claude 自动更新 +- Epic 创建时在树中追加 Epic 链接行,Epic 文件独立管理 +- BR 创建时在树中追加 BR 行,溢出触发后改为链接格式 - 业务目标和成效指标由人类维护 - 实施路径的 Step 状态在对应阶段完成时更新 - 发布记录在 Release 创建/状态变更时自动更新(有 Release 流程时) @@ -322,4 +474,5 @@ project.md 中 Claude 自动生成的内容使用 HTML 注释标记来源,区 - 项目原则在 `/pace-retro` 或技术/产品决策讨论后更新 - 功能规格在 PF 相关 CR 进入 verifying 或 /pace-change 涉及该 PF 时更新 - PF 溢出触发时,功能规格段落迁移到 `features/PF-xxx.md`,树视图更新为链接格式 +- BR 溢出触发时,树视图 BR 行改为链接格式 - 偏好角色在用户通过 `/pace-role set-default` 设置时更新 diff --git a/knowledge/_schema/state-format.md b/knowledge/_schema/state-format.md index d419fc3..daab114 100644 --- a/knowledge/_schema/state-format.md +++ b/knowledge/_schema/state-format.md @@ -8,20 +8,22 @@ state.md 是会话启动的唯一必读文件 总行数 ≤ 15 行(按复杂度自适应:简单 5-8 / 中等 10-12 / 复杂 13-15) 必含:目标摘要 + 当前工作 + 下一步 -可选:迭代行(有 iterations/ 时)、关键决策(中等+)、风险关注(复杂)、发布状态(有 Release 时) +可选:专题行(有 epics/ 时)、迭代行(有 iterations/ 时)、关键决策(中等+)、风险关注(复杂)、发布状态(有 Release 时) 不包含:完整 CR 列表、度量数据、质量检查详情 -最小状态(v0.8.0 init):仅目标摘要 + 当前工作 + 下一步,无迭代行 +最小状态(v0.8.0 init):仅目标摘要 + 当前工作 + 下一步,无专题行/迭代行 ``` ## 必需内容 -### 头部 blockquote(1-2 行) +### 头部 blockquote(1-3 行) ```markdown > 目标:[业务目标简述] → 成效指标:[关键 MoS] +> 专题:[活跃 Epic 数] 进行中 | [完成 Epic 数] 已完成 > 迭代:[迭代 ID]([迭代目标])| 进度:M/N 产品功能已完成 ``` +专题行为可选——无 Epic 时不显示(向后兼容)。有 Epic 时显示活跃和已完成的 Epic 计数。 迭代行为可选——最小初始化时不含迭代行,首次 `/pace-plan` 后添加。目标行中 MoS 可为空(显示为 `成效指标:(待定义)`)。 ### 当前工作(列表) @@ -64,7 +66,7 @@ Claude 下次会话应该做什么的建议。人类可以修改此字段来指 记录已向用户解释过的系统行为,用于渐进教学去重(同一行为终身只教一次)。 -合法标记值:`cr`(自动创建 CR)、`gate1`(Gate 1 质量检查)、`review`(等待 review)、`change`(变更意图检测)、`tree`(功能树更新)、`merge`(merged 连锁更新)、`accept`(AI 验收验证)、`opt-in-explained`(推进模式 opt-in 确认已解释过)、`context_generated`(context.md 自动生成)、`discover_retro`(功能发现:/pace-retro)、`discover_change`(功能发现:/pace-change)、`discover_plan`(功能发现:/pace-plan)、`discover_release`(功能发现:/pace-release)、`discover_feedback_report`(功能发现:/pace-feedback report)、`first_merged`(首个 CR merged 回顾)。 +合法标记值:`cr`(自动创建 CR)、`gate1`(Gate 1 质量检查)、`review`(等待 review)、`change`(变更意图检测)、`tree`(功能树更新)、`merge`(merged 连锁更新)、`accept`(AI 验收验证)、`opt-in-explained`(推进模式 opt-in 确认已解释过)、`context_generated`(context.md 自动生成)、`discover_retro`(功能发现:/pace-retro)、`discover_change`(功能发现:/pace-change)、`discover_plan`(功能发现:/pace-plan)、`discover_release`(功能发现:/pace-release)、`discover_feedback_report`(功能发现:/pace-feedback report)、`first_merged`(首个 CR merged 回顾)、`discover_scope`(功能发现:/pace-biz discover 探索式需求发现)、`import_requirements`(功能发现:/pace-biz import 多源需求导入)。 - 标记缺失时等同于"全部未教"(向后兼容新老项目) - Claude 在首次触发对应行为时检查标记,已存在则跳过教学 diff --git a/knowledge/signal-collection.md b/knowledge/signal-collection.md index f1f122a..4479a22 100644 --- a/knowledge/signal-collection.md +++ b/knowledge/signal-collection.md @@ -8,15 +8,17 @@ | # | 数据源 | 读取内容 | 消费信号 | |:-:|--------|---------|---------| -| 1 | `.devpace/backlog/*.md` | 所有 CR 的状态字段、类型字段 | S1/S3/S4/S9/S10/S13/S15 | +| 1 | `.devpace/backlog/*.md` | 所有 CR 的状态字段、类型字段、blocked_by 字段 | S1/S3/S4/S9/S10/S13/S15/S21/S22/S24 | | 2 | `.devpace/state.md` | 当前工作、下一步、进行中摘要 | S3(上下文连续性) | | 3 | `.devpace/releases/*.md` | Release 状态字段 | S5 | | 4 | `.devpace/risks/*.md` | 风险严重度、状态字段 | S2/S6 | | 5 | `.devpace/iterations/current.md` | PF 完成率、周期字段、变更记录 | S7/S8/S14 | | 6 | `.devpace/metrics/dashboard.md` | 最近更新日期 | S9 | -| 7 | `.devpace/project.md` | MoS checkbox、PF 列表、BR 列表 | S12/S13(价值链上下文) | +| 7 | `.devpace/project.md` | MoS checkbox、PF 列表、BR 列表、Epic 链接、范围 section | S12/S13/S16/S17/S18/S19(价值链上下文+发现信号) | | 8 | `.devpace/integrations/sync-mapping.md` | CR 关联映射、最后同步时间 | S11 | | 9 | `.devpace/metrics/insights.md` | 经验 pattern(可选增强) | 经验增强(Step 4) | +| 10 | `.devpace/epics/*.md` | Epic 状态、MoS、BR 列表、完成度 | S16(Epic 进度信号) | +| 11 | `.devpace/opportunities.md` | Opportunity 状态 | S17(未处理机会信号) | ## 读取策略 @@ -33,20 +35,49 @@ |--------|------|------| | CR → PF 映射 | CR 文件中的功能关联字段 | 建议模板附加 PF 名称 | | PF → BR 映射 | project.md 功能树中 PF 的父 BR | 建议模板附加 BR 名称(Biz/PM 角色) | +| BR → Epic 映射 | project.md 功能树中 BR 的父 Epic(如有) | 建议模板附加 Epic 信息(Biz 角色) | | BR → OBJ 映射 | project.md 功能树中 BR 的父 OBJ | 建议模板附加 OBJ 信息(Biz 角色) | +| Epic → OPP 映射 | Epic 文件中的来源字段 | 建议模板附加 Opportunity 追溯(Biz 角色) | -**角色差异化**:Dev 仅采集 CR→PF 层 | PM 采集到 PF+迭代层 | Biz 采集到 PF+BR+OBJ 层。 +**角色差异化**:Dev 仅采集 CR→PF 层 | PM 采集到 PF+BR+迭代层 | Biz 采集到 PF+BR+Epic+OBJ+OPP 层。 -## 信号快照缓存(中期优化) +## 信号快照缓存 -当 pace-pulse 执行后,可将信号快照写入 `.devpace/.signal-cache`: +### 写入方 + +pace-pulse 执行信号采集后,将结果写入 `.devpace/.signal-cache`: ``` -# .signal-cache format (plain text) +# .signal-cache (plain text, auto-generated) timestamp: -triggered: S1(count=2), S8(rate=85%) +cr_summary: total=N, developing=N, in_review=N, merged=N, paused=N +triggered: S1(count=2), S8(rate=85%), S13(pf=PF-003) +top_signal: S1 +risk_summary: open=N, high=N ``` -pace-next 检测到新鲜快照(< 5 分钟)时可直接读取,避免重复扫描。快照超期或不存在时正常执行完整采集。 +**写入时机**: +- pace-pulse session-start 完成信号检测后 +- pace-pulse core 周期性检查完成后 + +### 读取方 + +pace-next 和 pace-status 在执行信号采集前,先检查缓存: + +1. 检查 `.devpace/.signal-cache` 是否存在 +2. 存在 → 读取 `timestamp` 字段,计算距当前时间的差值 +3. 差值 < 5 分钟 → **命中缓存**,直接使用 `triggered` 和 `top_signal` 字段,跳过完整采集 +4. 差值 ≥ 5 分钟 或文件不存在 → **缓存过期**,执行完整采集流程 + +### 缓存失效 + +以下事件使缓存立即失效(消费方忽略缓存,重新采集): +- CR 状态变更(merged/paused/created 等)后,pace-dev 会写入新的 CR 文件,时间戳自然超过缓存 +- 用户手动删除 `.signal-cache` +- **不主动删除缓存**——依靠 TTL(5 分钟)自然过期 + +### 容错 -**当前阶段**:各 Skill 独立执行采集步骤(引用本文件的读取规则),缓存机制待后续实现。 +- `.signal-cache` 格式错误或字段缺失 → 视为过期,执行完整采集 +- `.signal-cache` 不在 .gitignore 中(每次写入覆盖,无需版本控制) +- 缓存仅是性能优化,不是正确性依赖——任何异常都 fallback 到完整采集 diff --git a/knowledge/signal-priority.md b/knowledge/signal-priority.md index f8e0eca..956d714 100644 --- a/knowledge/signal-priority.md +++ b/knowledge/signal-priority.md @@ -4,7 +4,7 @@ ## §0 速查卡片 -**优先级分组**:Blocking → In Progress → Delivery → Strategic → Growth → Idle +**优先级分组**:Blocking → In Progress → Delivery → Strategic → Growth(含 Epic/OPP/discover 信号)→ Idle **引用方式**:各 Skill 按"可见信号子集"列选择性暴露。修改任何信号的条件或编号时,同步检查三个消费方。 @@ -49,12 +49,19 @@ | S13 | 功能未开始 | `project.md` 有 PF 无对应 CR | "功能 [PF 名] 还没开始——是 [BR 名] 的关键组成" | → 说"帮我实现 [PF 名]" | ✅ | | S14 | 规划新迭代 | 上一迭代已关闭 + `current.md` 不存在 | "上一迭代已结束——规划新迭代" | → /pace-plan | ❌ | | S15 | 全部完成 | `backlog/` 全部 CR 为 merged 或 released | "所有任务完成——开始新功能或回顾" | 自然语言 | ✅ | +| S16 | Epic 需分解 | `epics/` 中有 `规划中` 状态 Epic 且 BR 列表为空 | "专题 [Epic 名] 已创建但还没分解为需求" | → /pace-biz decompose [EPIC] | ❌ | +| S17 | 未评估机会 | `opportunities.md` 中有 `评估中` 状态 Opportunity > 0 | "有 N 个业务机会待评估" | → /pace-biz epic [OPP] | ❌ | +| S18 | 功能树稀疏 | `project.md` PF 数量 < 3 且项目创建 > 7 天 | "功能树还很稀疏,建议探索需求或从文档导入" | → /pace-biz discover 或 /pace-biz import | ❌ | +| S19 | 范围未定义 | `project.md` "范围" section 为桩或不存在 | "项目范围尚未定义,建议通过需求发现明确边界" | → /pace-biz discover | ❌ | +| S21 | 跨 CR 依赖阻塞 | `backlog/` 中 CR-A `blocked_by` 字段指向 CR-B 且 CR-B 状态非 merged/developing 超 3 天(`blocked_by` 字段存在时才检测) | "[CR-A] 被 [CR-B] 阻塞且 [CR-B] 已 N 天未推进" | → /pace-dev #B 或 /pace-change reprioritize | ❌ | +| S22 | 技术债积压 | `backlog/` 中 `tech-debt` 类型 CR 占比 > 30% 或数量 > 5 | "技术债务 CR 占比偏高(N%),建议安排偿还" | → /pace-plan adjust | ❌ | +| S24 | 首次循环引导 | `backlog/` 中无 merged 状态 CR 且存在 ≥1 个 developing CR | "第一个功能正在进行中——完成后 /pace-review 审批即可体验完整循环" | 自然语言 | ❌ | ### Idle(无信号) | ID | 信号 | 条件 | 建议模板 | 命令引导 | status-subset | |:--:|------|------|---------|---------|:------------:| -| S16 | 无信号 | 无任何信号命中 | "当前无紧急事项,可以自由探索或规划新目标" | 自然语言 | ❌ | +| S20 | 无信号 | 无任何信号命中 | "当前无紧急事项,可以自由探索或规划新目标" | 自然语言 | ❌ | ## 角色重排序规则 @@ -76,7 +83,7 @@ S3-S15 范围内,以下角色可在组内重排序(提升最多 1 个组级 | 消费方 | 可见子集 | 引用方式 | |--------|---------|---------| -| pace-next | 全部 S1-S16 | 从高到低遍历,取首个命中;detail 模式取 top-3 | +| pace-next | 全部 S1-S24 | 从高到低遍历,取首个命中;detail 模式取 top-3 | | pace-status 概览 | `status-subset = ✅` 的信号(S1/S3/S5/S8/S9/S13/S15) | 取 top-1,追加"(详情 → /pace-next)" | | pace-pulse session-start | 全部(独立阈值版本,见 pulse-procedures-session-start.md) | 分层摘要 ≤3 行 | diff --git a/knowledge/theory.md b/knowledge/theory.md index 28cb11a..b0a9898 100644 --- a/knowledge/theory.md +++ b/knowledge/theory.md @@ -83,10 +83,27 @@ BizDevOps 核心主张:**概念模型是一切的基础**——没有统一的 作业对象是价值交付链路上的基本单元,随时间发生状态迁移和流转。 +### 3.0a 业务机会(Opportunity) + +- **定义**:外部或内部信号中识别到的潜在业务价值点 +- **来源**:用户反馈、竞品观察、技术发现、市场趋势、内部洞察 +- **特点**:是原始输入信号,需要经过评估才能转化为具体的 Epic 或 BR +- **核心观点**:业务机会是价值链的最上游——它连接了外部世界(客户、市场、技术变化)和内部规划(Epic、BR)。不是所有机会都值得追踪,但被捕获的机会提供了需求的源头追溯 + +### 3.0b 专题(Epic) + +- **定义**:为实现某个业务目标而组织的一组相关业务需求的集合 +- **来源**:业务机会评估、战略规划、业务目标分解 +- **特点**: + - 比单个 BR 粒度更大,通常跨多个迭代 + - 有自己的成效指标(MoS),用于衡量专题级别的业务成果 + - 是"拥抱不确定性"的载体——专题用 MoS 衡量成果而非固定范围 +- **核心观点**:专题是连接"业务目标"和"具体需求"的中间层。一个业务目标可以分解为多个专题,每个专题聚焦一个业务主题 + ### 3.1 业务需求(BR - Business Requirement) - **定义**:从业务视角提出的需求,描述"业务上要什么" -- **来源**:业务机会、市场分析、用户反馈、战略规划 +- **来源**:Epic 分解、业务机会、日常需求(快速注入) - **特点**:面向业务目标,由业务团队/产品经理提出 - **核心观点**:业务需求来源于业务机会,是产品和交付团队为了抓住业务机会而采取的具体行动 @@ -124,13 +141,13 @@ BizDevOps 核心主张:**概念模型是一切的基础**——没有统一的 ### 对象间的分解关系 ``` -BR(业务需求)—— 1:N ——→ PF(产品功能)—— 1:N ——→ CR(变更请求)—— N:1 ——→ Release(发布) - │ - ↓ - Application(应用) +Opportunity(业务机会)—— 评估 ——→ Epic(专题)—— 1:N ——→ BR(业务需求)—— 1:N ——→ PF(产品功能)—— 1:N ——→ CR(变更请求)—— N:1 ——→ Release(发布) + │ │ + ↑ ↓ + OBJ(业务目标) Application(应用) ``` -一个 BR 可分解为多个 PF;一个 PF 可分解为多个 CR(当涉及多个应用时);多个 CR 可组合为一次 Release。 +业务机会经评估可转化为 Epic;一个 Epic 可分解为多个 BR;一个 BR 可分解为多个 PF;一个 PF 可分解为多个 CR(当涉及多个应用时);多个 CR 可组合为一次 Release。日常需求可跳过 Opportunity/Epic 直接创建 BR。 --- @@ -454,7 +471,9 @@ BizDevOps 通过"专题模式"明确表态:**变更不是异常,是常态。 | BizDevOps 概念 | 概念层级 | devpace 实现 | 对应文件 | |---------------|---------|-------------|---------| | **作业对象** | | | | -| 业务需求(BR) | 对象 | BR 节点(project.md 价值追溯树顶层) | `.devpace/project.md` | +| 业务机会(Opportunity) | 对象 | opportunities.md 段落条目 | `.devpace/opportunities.md` | +| 专题(Epic) | 对象 | EPIC-xxx.md 独立文件(有 MoS、BR 列表、生命周期) | `.devpace/epics/EPIC-*.md` | +| 业务需求(BR) | 对象 | BR 节点(project.md 树视图内联,溢出后 requirements/BR-xxx.md) | `.devpace/project.md`, `.devpace/requirements/BR-*.md` | | 产品功能(PF) | 对象 | PF 节点(project.md 中层) | `.devpace/project.md` | | 变更请求(CR) | 对象 | CR-xxx.md 文件(type:feature/defect/hotfix) | `.devpace/backlog/CR-*.md` | | 发布(Release) | 对象 | REL-xxx.md 文件(staging→deployed→verified→closed) | `.devpace/releases/REL-*.md` | @@ -468,7 +487,7 @@ BizDevOps 通过"专题模式"明确表态:**变更不是异常,是常态。 | 门禁 | 规则 | 质量检查 checkbox | `.devpace/rules/checks.md` | | 配置化规则 | 规则 | 项目自定义 checks.md | `.devpace/rules/checks.md` | | **价值链路** | | | | -| 端到端追溯 | 链路 | BR→PF→CR→Release 价值追溯树 | `.devpace/project.md` | +| 端到端追溯 | 链路 | OPP→Epic→BR→PF→CR→Release 价值追溯树 | `.devpace/project.md` | | 双向追溯 | 链路 | project.md 树状视图 | `.devpace/project.md` | | 缺陷追溯 | 链路 | defect CR 根因分析→引入 CR→预防措施 | defect CR 根因分析 section | | **角色模型** | | | | diff --git a/promt.md b/promt.md new file mode 100644 index 0000000..fb31b97 --- /dev/null +++ b/promt.md @@ -0,0 +1,272 @@ +对/Users/jinhuasu/Project_Workspace/Anker-Projects/ml-platform-research/llm-platform-solution/claude-code-forge/devpace/skills/pace-init/SKILL.md 这个skill的token效率进行评估 + +/Users/jinhuasu/Project_Workspace/Anker-Projects/ml-platform-research/llm-platform-solution/claude-code-forge/devpace/tests/scenarios 是怎么来的,适合将这些以场景测试为种子喂给 skill-creator吗 + + + + 核心原则:所有 18 个 Skill 都应有完整的三层评估用例(trigger + behavioral + full cycle),优化点在于何时执行什么级别,而非为谁准备什么级别。 + + + + + 设计要点 + + - 跨 Skill 交叉污染:每个 trigger eval 的 10 条负面测试包含兄弟 Skill 的典型查询(如 pace-dev 负面测试包含 pace-change 的"加需求") + - 共享断言模式:引用 SA-01~SA-06 避免重复定义(state_updated、cr_lifecycle、natural_language、p2_progressive、git_committed、schema_compliant) + - 场景覆盖:每个 Skill 覆盖正常流程、边界条件(空参数、未初始化项目)、错误恢复(rejection、interrupted review) + + 下一步 + + 用 /skill-creator 逐 Skill 运行评估(Phase A.3-A.4),优化 description 和行为。剩余 12 Skill 按相同模式扩展(Phase A.5)。 + + + /skill-creator 对/Users/jinhuasu/Project_Workspace/Anker-Projects/ml-platform-research/llm-platform-solution/claude-code-forge/devpace/skills/pace-init/SKILL.md + 这个skill的token效率进行评估 + + /skill-creator + 为这个skill:/Users/jinhuasu/Project_Workspace/Anker-Projects/ml-platform-research/llm-platform-solution/claude-code-forge/devpace/skills/pace-init/SKILL.md,添加更为丰富的评估 + + +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +❯ /skill-creator + 为这个skill:/Users/jinhuasu/Project_Workspace/Anker-Projects/ml-platform-research/llm-platform-solution/claude-code-forge/devpace/skills/pace-init/SKILL.md,建立全面深入的测试与评估 + + devpace作为bizdevops全生命周期各种活动的管理器,从业务、需求、迭代、开发、测试、发布等,目前的最新的实现中devpace都有对应的skills覆盖,作为一个bizdevops专家,你从devpace提供的skills是否完整、流畅地提供给最终用户使用,以便这些用户可以使用devpace完成基于AI的bizdevops全生命周期活动进行审查。 + 审查可以从宏观到微观、从整体到局部,从粗粒度到细粒度。最终提供提供改进方案,让devpace成为世界上最优秀、最受访问的bizdevops全生命周期活动的AI工具 + + + devpace作为bizdevops全生命周期各种活动的管理器,需要分析devpace在 + 业务需求(BR - Business Requirement)和 产品需求/产品功能(PF - Product Feature),如下截图所示的 + 业务规划、客户诉求、市场洞察、产品和技术规划,战略/策略、愿景、业务目标、产品目标。devpace是否建立了这个阶段清晰的转换和信息关联。 + 请你在充分理解当前devpace实现现状的基础上为建立优秀的方案,你如果不清晰我要表达的意图请跟我确认 + + devpace项目还需要做什么优化和功能增强,才能有效的建立起 + +CodeArts +ALM + + + 截图展示了两个子域(业务规划 + 产品规划)之间的转换链路。我逐一标注 devpace 的覆盖情况: + + 业务规划子域 产品规划子域 + + 输入源 ──────────────────→ 业务机会 ────────→ 专题 ──────→ 业务需求 ──────→ 产品特性 + ┌───────────┐ ❌ ❌ ⚠️ (空壳) ✅(较好) + │ 业务规划 │ ❌ 无建模 无漏斗 无实体 仅一行标题 有完整字段 + │ 客户诉求 │ ❌ 无建模 无来源追溯 无分组能力 无来源/优先级 用户故事/验收标准 + │ 市场洞察 │ ❌ 无建模 无转化路径 无成功标准关联 无状态 有溢出模式 + │ 产品技术规划│ ❌ 无建模 + └───────────┘ + + + + + 组织层: + 业务线 ❌ → 战略/策略 ❌ → 业务目标 ✅(OBJ) ←对齐→ 产品目标 ❌ ← 愿景 ⚠️ (一行) ← 产品线 ❌ + + 管理层: + 投资组合 ❌ 成功标准 ✅(MoS,仅关联OBJ) 需求工作流 ⚠️ (CR有,BR→PF无) 版本规划 ✅ + + ┌──────────┬──────────────────────────────┐ + │ 阶段 │ 能力 │ + ├──────────┼──────────────────────────────┤ + │ 需求管理 │ 需求采集、追踪、变更控制 │ + ├──────────┼──────────────────────────────┤ + │ 项目规划 │ 迭代规划、资源分配、里程碑 │ + ├──────────┼──────────────────────────────┤ + │ 开发管理 │ 代码管理、分支策略、构建集成 │ + ├──────────┼──────────────────────────────┤ + │ 测试管理 │ 测试用例、执行、缺陷追踪 │ + ├──────────┼──────────────────────────────┤ + │ 发布管理 │ 部署流水线、版本控制、审批流 │ + ├──────────┼──────────────────────────────┤ + │ 运维反馈 │ 监控、事件管理、反馈闭环 │ + └──────────┴──────────────────────────────┘ + + ┌─────────────────┬────────────────────────────┐ + │ 传统 ALM 概念 │ devpace 对应 │ + ├─────────────────┼────────────────────────────┤ + │ Epic / Feature │ BR(Business Requirement) │ + ├─────────────────┼────────────────────────────┤ + │ User Story │ PF(Product Feature) │ + ├─────────────────┼────────────────────────────┤ + │ Task / Sub-task │ CR(Change Request) │ + ├─────────────────┼────────────────────────────┤ + │ 需求→代码追溯 │ BR→PF→CR 价值链 │ + ├─────────────────┼────────────────────────────┤ + │ 质量门禁 │ Gate 1/2/3 │ + ├─────────────────┼────────────────────────────┤ + │ 状态工作流 │ CR 状态机 │ + └─────────────────┴────────────────────────────┘ + + + + +如下的问题,导致devpace这个项目无法兑现服务bizdevops全生命周期活动的承诺。我认为应该覆盖从 BR 向上几乎是空白的部分。 +问题说明: + 关键断裂点 + 截图的价值流: + 业务规划/客户诉求/市场洞察 → 业务机会 → 专题 → 业务需求 → 产品特性 → 版本规划 + + devpace 的实现: + [完全空白] ─────────────────→ BR(一行标题) → PF(较完善) → CR(非常完善) + ↑ + 断裂点:BR 是"空壳" + +另外截图中的概念并不是全部必须,比如:业务线,产品线, 投资组合是否不用考虑,对于其他的概念模型,你需要分析或者设计最为合适的实体关系图,这些实体关系图是设计skill覆盖价值流的关键 + ┌───────────────────┬────────────────┬──────────────────────────────────────────────────┐ + │ 截图中的概念 │ devpace 覆盖度 │ 现状说明 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 业务线 │ 无 │ 不存在此概念 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 战略/策略 │ 无 │ 不存在,被 OBJ 隐含 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 业务目标 │ 较好 │ 已建模为 OBJ,有 MoS checkbox │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 日常需求 │ 无 │ 不存在从日常需求到 BR 的转化路径 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 业务机会 │ 无 │ 不存在"业务机会→专题→BR"的漏斗 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 专题(Epic) │ 无 │ 不存在独立概念,BR 勉强对应但缺乏结构 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 投资组合 │ 无 │ 不存在 BR/专题间的优先级排序和资源分配 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 成功标准 │ 较好 │ MoS 覆盖,但仅关联 OBJ,不关联专题 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 产品线 │ 无 │ 不存在此概念 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 愿景 │ 弱 │ project.md 一句话 blockquote,无结构化字段 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 产品目标 │ 无 │ 不存在独立概念,通过 OBJ→BR→PF 间接关联 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 业务需求/产品特性 │ 极弱→较好 │ BR 仅一行标题(极弱);PF 有完整字段体系(较好) │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 需求工作流 │ 部分 │ PF→CR 有状态机,但 BR→PF 无显式工作流 │ + ├───────────────────┼────────────────┼──────────────────────────────────────────────────┤ + │ 版本规划 │ 较好 │ Release 生命周期完善 │ + └───────────────────┴────────────────┴──────────────────────────────────────────────────┘ + + + + + + + + +devpace作为bizdevops全生命周期各种活动的管理器,从业务、需求、迭代、开发、测试、发布等,目前的最新的实现中devpace都有对应的skills覆盖,作为一个bizdevops专家,在充分理解devpace项目的最新状态和产品愿意用户价值基础上,你从devpace提供的skills是否完整、流畅地提供给最终用户使用,以便这些用户可以使用devpace完成基于AI的bizdevops全生命周期活动进行审查。审查可以从宏观到微观、从整体到局部,从粗粒度到细粒度。最终提供提供改进方案,让devpace成为世界上最优秀、最受访问的bizdevops全生命周期活动的AI工具 + +基于这个要求,给出符合要求的重构方案。 +你对我意图和要求如果有不明确必须跟我确认,不要自己猜测 + + +第一部分:现状评估 + + 1.1 BizDevOps 三域覆盖矩阵 + + ┌───────────┬────────────────────┬────────────────────────────────┬─────────────────────────────────┬──────┐ + │ 域 │ 阶段 │ 对应 Skill │ 覆盖状态 │ 评分 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Biz │ 业务机会识别 │ pace-biz opportunity │ Schema 已定义,Skill 待实现 │ 3/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Biz │ 专题规划 │ pace-biz epic │ Schema 已定义,Skill 待实现 │ 3/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Biz │ 需求分解 │ pace-biz decompose │ Schema 已定义,Skill 待实现 │ 3/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Biz │ 战略对齐 │ pace-biz align │ Schema 已定义,Skill 待实现 │ 3/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Biz │ 需求发现/导入/推断 │ pace-biz discover/import/infer │ Schema 已定义,Skill 待实现 │ 3/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Product │ 迭代规划 │ pace-plan │ 核心完成,adjust/health 待完善 │ 7/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Product │ 变更管理 │ pace-change(9 子命令) │ 完整 │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Product │ 角色视角 │ pace-role(5 角色) │ 完整 │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Dev │ 项目初始化 │ pace-init │ 完整(含 monorepo/迁移/模板) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Dev │ CR 推进 │ pace-dev │ 完整(状态机 7+1 态,Gate 1-3) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Dev │ 代码审查 │ pace-review(opus) │ 完整(对抗审查+业务追溯) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Dev │ 测试策略 │ pace-test(10 子命令) │ 完整(策略+覆盖+AI 验收) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Dev │ 风险管理 │ pace-guard(5 子命令) │ 完整(预检+监控+趋势) │ 8/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Ops │ 发布管理 │ pace-release(14 子命令) │ 完整(含 rollback/branch/tag) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Ops │ 外部同步 │ pace-sync(GitHub MVP) │ 部分(Linear/Jira 待扩展) │ 6/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Ops │ 反馈收集 │ pace-feedback │ 完整(defect/hotfix CR 闭环) │ 8/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Observe │ 状态查询 │ pace-status(9 子命令) │ 完整(L1-L3 分级) │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Observe │ 导航推荐 │ pace-next(16 信号组) │ 完整 │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Observe │ 节奏脉搏 │ pace-pulse(自动触发) │ 完整 │ 8/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Observe │ 回顾度量 │ pace-retro(DORA 代理指标) │ 完整 │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Observe │ 决策轨迹 │ pace-trace(三层渐进透明) │ 完整 │ 9/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Knowledge │ 经验积累 │ pace-learn(纠正即学习) │ 完整 │ 8/10 │ + ├───────────┼────────────────────┼────────────────────────────────┼─────────────────────────────────┼──────┤ + │ Knowledge │ 理论参考 │ pace-theory(15 子命令) │ 完整 │ 9/10 │ + └───────────┴────────────────────┴────────────────────────────────┴─────────────────────────────────┴──────┘ + + ┌──────────────┬────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ 域 │ 评分 │ 说明 │ + ├──────────────┼────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ + │ Biz 域 │ 6/10 │ Schema 完整且设计优秀(OPP/EPIC/BR),pace-biz Skill 已定义 8 子命令 + 8 procedures,但 S35-S42 验收标准全部未打勾(验证待完成)。与上次审查(3/10)大幅提升 │ + ├──────────────┼────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ + │ Dev 域 │ 9/10 │ 完整:pace-init/dev/test/guard/review 全部实现并验证 │ + ├──────────────┼────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ + │ Ops 域 │ 7.5/10 │ pace-release 完整,pace-sync GitHub MVP 已完成(Phase 19/20 待扩展) │ + ├──────────────┼────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ + │ Observe 域 │ 9/10 │ pace-status/next/pulse/retro/trace 全部完整 │ + ├──────────────┼────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ + │ Knowledge 域 │ 8.5/10 │ pace-learn/theory 完整,devpace-cadence 可视化平台已设计 + + + + bizdevops-review-v2.md │ + + +一块探讨一下,pace-biz 这个 + + + Part IV: 竞争力差异化分析 + + 4.1 devpace 独特定位 + + ┌────────────────┬────────────────────────────────────────┬─────────────────────────────────────────┬─────────────────────────────┐ + │ 维度 │ 传统工具 (Jira/Linear/GitHub Projects) │ 通用 AI 编码 (Cursor/Copilot Workspace) │ devpace │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 业务到代码追溯 │ 手动关联 │ 无 │ 自动(OBJ->BR->PF->CR) │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 变更管理 │ 手动调整看板 │ 无 │ 一等公民,影响分析+有序调整 │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 质量门 │ CI/CD 外挂 │ 无 │ 内嵌,4 级 Gate 自动执行 │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 跨会话连续性 │ N/A │ 有限 │ 完整(state.md 锚点) │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 度量与回顾 │ 需额外配置 │ 无 │ 内建 DORA + 迭代回顾 │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ 自然语言交互 │ 有限(AI 辅助搜索) │ 代码层面 │ 全流程自然语言驱动 │ + ├────────────────┼────────────────────────────────────────┼─────────────────────────────────────────┼─────────────────────────────┤ + │ AI 决策透明度 │ N/A │ 无 │ 完整审计(pace-trace) │ + └────────────────┴────────────────────────────────────────┴─────────────────────────────────────────┴─────────────────────────────┘ + + + ┌──────────┬──────────────────────────────────────────────┬──────────────────────────────────┐ + │ 方向 │ 措施 │ 目的 │ + ├──────────┼──────────────────────────────────────────────┼──────────────────────────────────┤ + │ 智能编排 │ 引入"旅程模板",自动编排多 Skill 流程 │ 从"工具集"升级为"智能工作流平台" │ + ├──────────┼──────────────────────────────────────────────┼──────────────────────────────────┤ + │ 预测能力 │ 强化 pace-retro forecast + pace-guard trends │ 从"被动管理"升级为"主动预测" │ + ├──────────┼──────────────────────────────────────────────┼──────────────────────────────────┤ + │ 生态集成 │ 完成 Phase 19-20 外部同步 + CI/CD 深度集成 │ 从"独立工具"升级为"研发中枢" │ + ├──────────┼──────────────────────────────────────────────┼──────────────────────────────────┤ + │ 团队适配 │ 多用户状态隔离 + 角色权限 + 共享仪表盘 │ 从"个人工具"升级为"团队平台" │ + ├──────────┼──────────────────────────────────────────────┼──────────────────────────────────┤ + │ 可视化 │ Phase 24 devpace-cadence Next.js 仪表盘 │ 从"CLI 工具"升级为"可视化平台" │ + └──────────┴──────────────────────────────────────────────┴──────────────────────────────────┘ diff --git a/rules/devpace-rules.md b/rules/devpace-rules.md index be947de..a190b64 100644 --- a/rules/devpace-rules.md +++ b/rules/devpace-rules.md @@ -38,17 +38,21 @@ 质量:命令+意图+对抗→自修复→Gate 3 人类审批(IR-2)(§2, §14) 可选:Release/集成/同步——目录或文件存在时生效(§14, §16)| 反馈——.devpace/ 存在即可用,releases/ 启用完整追溯(§14)| 渐进教学——首次触发附 1 句(§15) PF 溢出:功能规格>15行|3+CR|modify → 自动迁移到 features/PF-xxx.md(§11 连锁更新 + dev-procedures-postmerge.md) +BR 溢出:3+PF|业务上下文>5行|modify → 自动迁移到 requirements/BR-xxx.md +Epic:始终独立文件 epics/EPIC-xxx.md · 价值功能树用链接引用 · 无 Epic 时 BR 直挂 OBJ(向后兼容) +Opportunity:独立看板 opportunities.md · 评估中→已采纳/已搁置/已拒绝 · 采纳后关联 Epic ### 命令分层 | 层级 | 命令 | |------|------| | 核心 | /pace-init · /pace-dev · /pace-status · /pace-review · /pace-next | +| 业务 | /pace-biz(opportunity · epic · decompose · align · view · discover · import · infer) | | 进阶 | /pace-change · /pace-plan · /pace-retro · /pace-guard · /pace-sync · /pace-role | | 专项 | /pace-release · /pace-test · /pace-feedback · /pace-theory · /pace-trace | | 系统 | pace-learn(自动+手动) · pace-pulse — Claude 自动调用 | -子命令详见各 SKILL.md(权威源)。pace-change 子命令:add · pause · resume · reprioritize · modify · batch · undo · history · apply。 +子命令详见各 SKILL.md(权威源)。pace-biz 子命令:opportunity · epic · decompose · align · view · discover · import · infer。pace-change 子命令:add · pause · resume · reprioritize · modify · batch · undo · history · apply。pace-feedback 子命令:incident open · close · timeline · list。pace-sync 子命令:ci status · ci trigger · ci logs。 ### .devpace/ 加载优先级 会话开始=state.md | 推进=CR+workflow+checks | 变更=project+CR | 发布=releases+config | 测试=CR+checks+strategy @@ -59,6 +63,8 @@ PF 溢出:功能规格>15行|3+CR|modify → 自动迁移到 features/PF-xxx.m 1. 检查项目根目录是否存在 `.devpace/state.md` 2. 存在 → 读取并校验(见 §8 容错规则),用 **1 句自然语言** 报告当前状态和建议 + - 如有 `developing` 或 `verifying` CR → 在报告中附加模式标识 `[推进中]`(如:"[推进中] 上次停在认证模块,继续?") + - 无进行中 CR → 在报告中附加模式标识 `[探索]`(如:"[探索] 所有任务已完成,自由探索或规划新目标") 3. 不存在 → 正常工作,不强制初始化(用户需要时可运行 `/pace-init`) 4. **节奏健康度检测**(state.md 存在时额外执行):读取 dashboard.md + backlog/ + current.md → 按信号优先级输出分层摘要(最高 1 条完整建议 + 其余触发信号精简列表,≤3 行)。信号定义详见 `skills/pace-pulse/pulse-procedures-session-start.md`(权威源)。无触发时静默 5. 等待用户指令(不自作主张开始工作) @@ -100,6 +106,8 @@ PF 溢出:功能规格>15行|3+CR|modify → 自动迁移到 features/PF-xxx.m - 用户说明确修改意图 + **已标记 `opt-in-explained`** → 1 行内联提示后自动 opt-in:`"管理这次开发,开始做 [X]。"`(不等待确认) - Claude 开始写入或修改项目代码文件 + **本会话已 opt-in** → 自动进入 +**模式切换通知**:从探索切换到推进时,输出 1 行标识——`[探索 → 推进] 开始推进 [PF/CR 名称]`。从推进回到探索(CR merged 或用户退出)时,输出——`[推进 → 探索] [CR 标题] 已完成,回到自由探索`。 + ### 推进行为(按自主级别分化) **上下文加载**(进入推进模式时): @@ -141,6 +149,8 @@ PF 溢出:功能规格>15行|3+CR|modify → 自动迁移到 features/PF-xxx.m - 用户说"逐个看" → 按常规流程逐个进入 in_review - 不满足简化审批条件的 CR 不纳入批量提示 +**连续推进模式**:`/pace-dev --batch` 启用。S 复杂度 CR 的 Gate 3 延迟到批量统一审批,L/XL 仍即时审批。详见 `skills/pace-dev/dev-procedures-common.md` 连续推进模式章节。 + merged 后连锁更新(人类批准后必须执行):见 §11 第 1 步(5 项连锁更新)。 退出:会话结束,或用户明确切换话题。 @@ -180,6 +190,22 @@ merged 后连锁更新(人类批准后必须执行):见 §11 第 1 步(5 - 用户问"所有命令""完整命令列表" → 展示完整 3 层(核心 / 进阶 / 专项) - 不主动推荐用户没触发过的命令层级 +### 无命令体验 + +用户无需知道命令名,自然语言即可触发所有能力: + +| 用户说的 | 触发的能力 | +|---------|-----------| +| "我想做一个..." | /pace-biz discover(交互式需求发现) | +| "帮我做 [功能名]" | /pace-dev(自动创建 CR 并推进) | +| "这里有份需求文档" | /pace-biz import(多源导入) | +| "看看现在什么情况" | /pace-status(进度概览) | +| "为什么选了这个方案" | /pace-trace(决策追溯) | +| "这个技术方案记录一下" | /pace-trace arch(ADR 架构决策记录) | +| "代码里有哪些功能还没追踪" | /pace-biz infer(代码推断) | + +**原则**:Skill description 中的触发关键词是匹配依据。无命令体验不替代命令——用户显式用命令时,直接路由到对应 Skill。 + ## §4 自动创建变更请求 > **核心**:自动创建 CR 并关联 PF,对用户只说"开始做 X",不提文件创建。 @@ -311,6 +337,7 @@ Claude 在推进模式中主动监控研发节奏,检测异常信号并输出 - **触发**:每 5 个 checkpoint 或 30 分钟未切换 CR → 自动调用 `pace-pulse` - **约束**:不打断(附加在 checkpoint 后)| 无信号时静默。去重、配额和冷却规则详见 `skills/pace-pulse/pulse-procedures-core.md` 严重度升级与去重优化章节(权威源) - **Snooze 唤醒**:在特定节点检测延后变更的触发条件,满足时非打断式提醒。检测时机和规则见 `skills/pace-pulse/pulse-procedures-snooze.md`(权威源) +- **智能自主性建议**:每 5 个 CR merged 后,pace-pulse 根据 Gate 通过率和打回率建议调整自主级别。建议需用户确认,不自动变更。详见 `skills/pace-pulse/pulse-procedures-core.md` 自主级别评估章节 ### 风险感知(`.devpace/risks/` 存在时生效) diff --git a/skills/pace-biz/SKILL.md b/skills/pace-biz/SKILL.md new file mode 100644 index 0000000..16ca23e --- /dev/null +++ b/skills/pace-biz/SKILL.md @@ -0,0 +1,191 @@ +--- +description: Use when user says "业务机会", "专题", "Epic", "分解需求", "战略对齐", "业务全景", "业务规划", "需求发现", "头脑风暴", "brainstorm", "导入需求", "从文档导入", "代码分析需求", "技术债务盘点", "discover", "import", "infer", "pace-biz", or wants to create opportunities/Epics, decompose requirements, discover/import/infer features. NOT for implementation (/pace-dev), existing item changes (/pace-change), or iteration planning (/pace-plan). +allowed-tools: AskUserQuestion, Write, Read, Edit, Glob, Bash, Grep +argument-hint: "[opportunity|epic|decompose|align|view|discover|import|infer] [EPIC-xxx|BR-xxx] <描述|路径>" +context: fork +agent: pace-pm +--- + +# /pace-biz — 业务规划域统一入口 + +管理从业务机会到专题(Epic)到业务需求(BR)的上游价值链。覆盖 Opportunity 捕获、Epic 创建与管理、需求分解、战略对齐检查和业务全景展示。 + +## 与现有机制的关系 + +- `/pace-biz`:业务规划域(Opportunity→Epic→BR 的**创建和分解**) +- `/pace-change`:需求变更域(已有 BR/PF/Epic 的**变更**——add/pause/resume/modify) +- `/pace-plan`:迭代规划域(PF/CR 的**排期**) +- `/pace-init`:项目初始化(首次 Vision/Strategy/OBJ 引导) +- `/pace-init full`:**项目不存在时**,从 0 到 1 建立 .devpace/ + OBJ + 功能树 + 迭代计划(一站式初始化) +- `/pace-biz discover`:**项目已存在时**,从模糊想法探索新的 OPP→Epic→BR→PF(增量扩展) +- `/pace-status`:开发状态(CR/PF **开发进度**视图) +- 协同场景:`/pace-biz discover` 探索需求 → `decompose` 细化 → `/pace-dev` 开始开发 +- 协同场景:`/pace-biz import` 导入文档需求 → `align` 检查对齐 → `/pace-plan` 排期 +- 协同场景:`/pace-biz decompose` 分解出 BR → `/pace-change add` 快速补充 PF → `/pace-dev` 开始开发 + +## 推荐使用流程 + +``` +完整业务路径: opportunity → epic → decompose → /pace-dev +探索式发现: discover → decompose → /pace-plan next +多源导入: import <文档> → align → /pace-plan next +代码库推断: infer → align → /pace-dev +战略对齐检查: align(只读分析) +业务全景: view(只读展示) +直接创建 Epic: epic(跳过 Opportunity) +日常需求注入: /pace-change add(跳过 Opportunity/Epic,走快速路径) +``` + +## 输入 + +$ARGUMENTS: + +### 子命令 + +**创建型**(产出新实体): +- `opportunity <描述>` → 捕获业务机会到 opportunities.md +- `epic [OPP-xxx] <描述>` → 从 Opportunity 转化或直接创建 Epic +- `decompose ` → 分解 Epic→BR 或 BR→PF + +**发现型**(探索和导入需求): +- `discover <描述>` → 交互式需求发现,从模糊想法产出 OPP→Epic→BR→PF 候选树 +- `import <路径>...` → 从文档批量提取需求实体,合并到功能树 +- `infer` → 从代码库推断未追踪功能和技术债务 + +**分析型**(只读查看和检查): +- `align` → 检查 OBJ→Epic→BR 战略对齐度,发现孤立实体 +- `view` → 业务全景视图(OPP→EPIC→BR 流) + +### 空参数 + +- (空)→ 智能引导——扫描项目上下文(未处理 Opportunity、活跃 Epic、孤立 BR),给出个性化推荐 + +## 执行路由表 + +| 子命令 | 读取 | 写入 | procedures 文件 | +|--------|------|------|----------------| +| opportunity | project.md, opportunities.md | opportunities.md | biz-procedures-opportunity.md | +| epic | opportunities.md, project.md | epics/EPIC-xxx.md, project.md, opportunities.md | biz-procedures-epic.md | +| decompose | epics/EPIC-xxx.md 或 requirements/BR-xxx.md, project.md | project.md, epics/, requirements/ | biz-procedures-decompose.md | +| align | project.md, epics/, requirements/, opportunities.md | (只读) | biz-procedures-align.md | +| view | project.md, epics/, requirements/, opportunities.md | (只读) | biz-procedures-view.md | +| discover | state.md, project.md, opportunities.md | opportunities.md, epics/, project.md, scope-discovery.md | biz-procedures-discover.md | +| import | project.md, insights.md | project.md, epics/, requirements/ | biz-procedures-import.md | +| infer | project.md, src/ | project.md | biz-procedures-infer.md | +| (空参) | state.md, project.md, opportunities.md | (只读) | 内联智能引导 | + +## 流程 + +### 所有子命令的公共前置 + +1. 读取 state.md 和 project.md 确认项目上下文 +2. 确认 .devpace/ 已初始化(未初始化时引导 /pace-init) +3. 读取 project.md 配置 section 的 `mode` 字段(缺省 = 完整模式,`lite` = 轻量模式) +4. 按子命令路由到对应 procedures 文件(各 procedure 内部根据 mode 调整行为) + +### 空参数引导 + +当用户无参数调用 `/pace-biz` 时: + +1. 读取 project.md 的 `mode` 字段判断模式 +2. **完整模式**(默认): + - 扫描 opportunities.md 中 `评估中` 的 Opportunity 数量 + - 扫描 epics/ 中 `进行中` 和 `规划中` 的 Epic 数量 + - 扫描 project.md 树视图中未关联 Epic 的"孤立" BR 数量 + - 推荐优先级:未评估 Opportunity > 规划中 Epic 需分解 > 战略对齐 + - 附完整子命令列表 +3. **lite 模式**: + - 扫描 project.md 树视图中 OBJ 下的 PF 数量和状态 + - 推荐:discover(探索新功能)> import/infer(导入/推断)> align(对齐检查) + - 隐藏 opportunity/epic/decompose(Epic→BR 路径),仅展示 lite 兼容子命令 + - 提示:如需 OPP/Epic/BR 能力,可通过 `/pace-init --upgrade-mode` 升级到完整模式 + +## 输出 + +### 所有子命令的通用输出原则 + +- **渐进暴露**:默认输出简洁摘要,`--detail` 展示完整信息 +- **操作确认**:写入操作前展示变更预览,用户确认后执行 +- **追溯链**:每次创建实体时展示其在价值链中的位置 + +### opportunity 输出 + +``` +已捕获业务机会:OPP-xxx — [描述] +来源:[类型]([详情]) +状态:评估中 +→ 下一步:/pace-biz epic OPP-xxx 评估并转化为 Epic +``` + +### epic 输出 + +``` +已创建专题:EPIC-xxx — [名称] +关联:OBJ-x([目标])← OPP-xxx(如有) +MoS:[指标列表] +→ 下一步:/pace-biz decompose EPIC-xxx 分解为业务需求 +``` + +### decompose 输出 + +``` +已分解 [EPIC-xxx|BR-xxx]: +├── BR-001:[名称] P0 +├── BR-002:[名称] P1 +└── BR-003:[名称] P2 +→ 下一步:/pace-change add 补充 PF 或 /pace-dev 开始开发 +``` + +### align 输出 + +``` +战略对齐度报告: +- OBJ 覆盖率:N/M OBJ 有 Epic 覆盖 +- 孤立实体:[列表] +- 对齐建议:[建议] +``` + +### view 输出 + +``` +业务全景: +OPP-001(评估中) +OPP-002 → EPIC-001(进行中) + ├── BR-001 → PF-001 → CR-001 🔄 + └── BR-002 → PF-002(待开始) +OPP-003 → EPIC-002(规划中) +``` + +### discover 输出 + +``` +已从发现会话创建: +- 1 个业务机会(OPP-xxx) +- 1 个专题(EPIC-xxx) +- N 个业务需求(BR-xxx ~ BR-xxx) +- M 个产品功能(PF-xxx ~ PF-xxx) +→ /pace-biz decompose EPIC-xxx 继续细化 +→ /pace-plan next 排入迭代 +``` + +### import 输出 + +``` +导入完成(来自 N 个文件): +- 新增:X 个 BR + Y 个 PF +- 丰富:Z 个已有实体 +- 跳过:W 个重复项 +→ /pace-biz align 检查战略对齐度 +→ /pace-plan next 排入迭代 +``` + +### infer 输出 + +``` +代码库推断完成: +- 新增追踪:X 个产品功能 +- 技术债务:Y 个待处理项 +- 未实现确认:Z 个功能状态已更新 +→ /pace-biz align 检查战略对齐度 +→ /pace-dev 开始处理优先项 +``` diff --git a/skills/pace-biz/biz-procedures-align.md b/skills/pace-biz/biz-procedures-align.md new file mode 100644 index 0000000..d7b004c --- /dev/null +++ b/skills/pace-biz/biz-procedures-align.md @@ -0,0 +1,82 @@ +# align 子命令 procedures + +> **职责**:检查 OBJ→Epic→BR 战略对齐度,发现孤立实体和覆盖缺口。 + +## 触发 + +`/pace-biz align` 或用户想检查战略对齐。 + +## 步骤 + +### Step 0:模式检查 + +读取 project.md 的 `mode` 字段。若为 `lite`: + +- 跳过 Step 2.2 中 Epic 相关检查(孤立 BR、空 Epic、未处理 Opportunity) +- 跳过 Step 2.3 中 Epic 级 MoS 检查 +- 对齐检查简化为:OBJ 覆盖率(OBJ→PF)+ 孤立 PF 检测 + OBJ 级 MoS 完整性 + 价值链完整性(OBJ→PF→CR) + +### Step 1:采集实体数据 + +读取以下文件: +1. `project.md` — OBJ 列表、价值功能树(Epic→BR→PF→CR 关系) +2. `epics/` — 所有 Epic 文件(状态、MoS、BR 列表) +3. `requirements/` — 溢出的 BR 文件(如有) +4. `opportunities.md` — 未处理的 Opportunity(如有) + +### Step 2:分析对齐度 + +执行以下检查: + +#### 2.1 OBJ 覆盖率 + +- 每个 OBJ 是否至少有一个 Epic 或 BR? +- 没有 Epic/BR 的 OBJ 标记为"未覆盖" + +#### 2.2 孤立实体检测 + +- BR 未关联任何 Epic 也未直接挂 OBJ → 孤立 BR +- PF 未关联任何 BR → 孤立 PF +- Epic 中 BR 列表为空 → 空 Epic(需分解) +- Opportunity 状态长期为"评估中" → 未处理的机会 + +#### 2.3 MoS 完整性 + +- OBJ 有 MoS 定义? +- Epic 有 MoS 定义? +- MoS 与 BR/PF 完成度的对应关系是否合理? + +#### 2.4 价值链完整性 + +- 检查每条从 OBJ 到 CR 的链路是否连续 +- 标记断裂点(如 BR→PF 为空) + +### Step 3:生成对齐报告 + +``` +战略对齐度报告 +══════════════ + +OBJ 覆盖率:[N/M] OBJ 有 Epic/BR 覆盖 +├── OBJ-1([名称]):[N] Epic, [M] BR — [覆盖/未覆盖] +└── OBJ-2([名称]):[N] Epic, [M] BR — [覆盖/未覆盖] + +孤立实体: +├── 孤立 BR:[列表](未关联 Epic 或 OBJ) +├── 空 Epic:[列表](无 BR,需分解) +└── 未处理机会:[列表](评估中 Opportunity) + +MoS 完整性: +├── OBJ 级 MoS:[N/M] 已定义 +└── Epic 级 MoS:[N/M] 已定义 + +建议: +1. [具体对齐建议] +2. [具体对齐建议] +``` + +## 注意 + +- 此子命令为**只读分析**,不修改任何文件 +- 无 Epic 和 Opportunity 时简化报告(只检查 OBJ→BR→PF→CR 链路) +- 向后兼容:旧项目无 Epic 层时仍能生成有意义的对齐报告 diff --git a/skills/pace-biz/biz-procedures-decompose.md b/skills/pace-biz/biz-procedures-decompose.md new file mode 100644 index 0000000..15ffbd5 --- /dev/null +++ b/skills/pace-biz/biz-procedures-decompose.md @@ -0,0 +1,109 @@ +# decompose 子命令 procedures + +> **职责**:分解 Epic→BR 或 BR→PF,填充价值链中间层。 + +## 触发 + +`/pace-biz decompose ` 或用户要分解专题/需求。 + +## 步骤 + +### Step 0:模式检查 + +读取 project.md 的 `mode` 字段。若为 `lite`: + +- `EPIC-xxx` 参数 → 提示"轻量模式无 Epic 层",终止 +- `BR-xxx` 参数 → 提示"轻量模式无 BR 层,PF 直接挂在 OBJ 下",终止 +- 无参数 → 提示"轻量模式下建议使用 `/pace-change add` 添加 PF,或 `/pace-init --upgrade-mode` 升级",终止 + +> lite 模式价值链为 OBJ→PF→CR,没有 Epic/BR 层可分解。 + +### Step 1:确定分解目标 + +根据参数判断分解方向: +- `EPIC-xxx` → Epic→BR 分解 +- `BR-xxx` → BR→PF 分解 +- 无参数 → 列出可分解的 Epic/BR,引导选择 + +### Epic→BR 分解路径 + +#### Step 2E:读取 Epic 信息 + +1. 读取 `epics/EPIC-xxx.md` +2. 确认状态为 `规划中` 或 `进行中`(`已搁置` 需先 resume) +3. 读取 Epic 背景和 MoS + +#### Step 3E:引导需求分解 + +向用户展示 Epic 背景和 MoS,然后引导分解: + +1. 基于 Epic 背景,Claude 建议 BR 分解方案(2-5 个 BR) +2. 每个 BR 包含:名称 + 优先级建议 + 一句话描述 +3. 用户确认/调整分解方案 + +#### Step 4E:创建 BR 条目 + +对每个确认的 BR: + +1. 在 project.md 价值功能树中,在对应 Epic 下追加 BR 行: + ``` + BR-xxx:[名称] `Px` + ``` +2. BR 编号自增(扫描 project.md 树中最大 BR 编号 +1) +3. 更新 Epic 文件的"业务需求"表格 + +#### Step 5E:更新 Epic 状态 + +如果 Epic 当前为 `规划中` 且有了 BR → 状态改为 `进行中` + +### BR→PF 分解路径 + +#### Step 2P:读取 BR 信息 + +1. 从 project.md 树视图或 `requirements/BR-xxx.md` 读取 BR 信息 +2. 读取关联 Epic 和 OBJ 上下文 + +#### Step 3P:引导功能分解 + +向用户展示 BR 上下文,然后引导分解: + +1. 基于 BR 描述,Claude 建议 PF 分解方案(1-3 个 PF) +2. 每个 PF 包含:名称 + 用户故事建议 +3. 用户确认/调整分解方案 + +#### Step 4P:创建 PF 条目 + +对每个确认的 PF: + +1. 在 project.md 价值功能树中,在对应 BR 下追加 PF 行: + ``` + PF-xxx:[名称]([用户故事])→ (待创建 CR) + ``` +2. PF 编号自增(扫描 project.md 树中最大 PF 编号 +1) + +#### Step 5P:更新 BR 状态 + +如果 BR 有溢出文件 → 更新 `requirements/BR-xxx.md` 的 PF 列表 + +### 公共结束步骤 + +#### Step 6:输出分解结果 + +``` +已分解 [EPIC-xxx|BR-xxx]: +├── [BR|PF]-001:[名称] [优先级] +├── [BR|PF]-002:[名称] [优先级] +└── [BR|PF]-003:[名称] [优先级] + +价值链:OBJ-x → EPIC-xxx → BR-xxx → PF-xxx +→ 下一步:/pace-plan next 规划迭代 | 继续分解:/pace-biz decompose [编号] +``` + +## 容错 + +| 异常 | 处理 | +|------|------| +| EPIC/BR 编号不存在 | 提示无效编号,列出可用选项 | +| Epic 状态为"已搁置" | 提示需先 /pace-change resume | +| 已有 BR/PF 的重复分解 | 展示现有分解,询问是否追加 | +| project.md 无树结构 | 创建树结构后执行分解 | diff --git a/skills/pace-biz/biz-procedures-discover.md b/skills/pace-biz/biz-procedures-discover.md new file mode 100644 index 0000000..08401fd --- /dev/null +++ b/skills/pace-biz/biz-procedures-discover.md @@ -0,0 +1,164 @@ +# discover 子命令 procedures + +> **职责**:交互式探索需求发现——从模糊想法出发,通过多轮对话引导产出 OPP→Epic→BR→PF 候选树。 + +## 触发 + +`/pace-biz discover <描述>` 或用户表达模糊需求想法("我想做一个..."、"有没有可能..."、"头脑风暴一下")。 + +## 与 decompose 的区别 + +- **discover**:从零开始的全链路探索,输入是模糊想法,输出是 OPP→Epic→BR→PF 候选树 +- **decompose**:已有实体的单层精确拆解,输入是 EPIC-xxx 或 BR-xxx,输出是下一层子实体 + +## 步骤 + +### Step 0:上下文加载与模式检查 + +1. 读取 `.devpace/state.md` + `project.md` + `opportunities.md`(不存在则跳过) +2. 读取 project.md 的 `mode` 字段,记录当前模式(`lite` 或完整) +3. **空项目检测**:若 project.md 不存在或仅为桩文件(无 OBJ 定义),引导先初始化: + > 项目尚未初始化业务目标。建议先运行 `/pace-init full` 一站式建立项目结构,再通过 discover 探索新需求。 + - 用户坚持继续 → 正常进入 Step 1(discover 降级模式会在 Step 5 输出到控制台) +4. 检查是否有进行中的发现会话:`.devpace/scope-discovery.md` + - 存在 → 读取并提示用户:"上次探索到 [阶段],继续还是重新开始?" + - 不存在 → 开始新会话 + +**lite 模式适配**:后续 Step 1-5 中,所有 OPP/Epic/BR 层跳过: +- Step 1:OBJ 候选照常映射,不创建 OPP +- Step 2:功能头脑风暴直接产出 PF 候选(跳过 BR 分组) +- Step 4:候选树展示为 `OBJ→PF` 结构(无 OPP/Epic/BR 层) +- Step 5:仅写入 PF 到 project.md 价值功能树对应 OBJ 下,不创建 OPP/Epic/BR 文件 + +### Step 1:目标框定(1-2 轮 AskUserQuestion) + +从用户输入中提取核心意图,通过追问补充关键信息: + +**第 1 轮**(若用户已给出描述则跳过): +- "要解决什么问题?目标用户是谁?" + +**第 2 轮**(基于第 1 轮回答): +- "这个对用户来说有多紧迫?是锦上添花还是痛点?" +- "有没有现有的替代方案?" + +**产出**: +- OBJ 候选(映射到 project.md 已有 OBJ 或建议新 OBJ) +- 目标用户画像(1-2 句话) + +**中间状态持久化**:写入 `.devpace/scope-discovery.md`: + +```markdown +# 需求发现会话 + +## 阶段:目标框定 +## 开始时间:[YYYY-MM-DD HH:mm] + +## 目标 +[用户描述的核心问题] + +## 用户画像 +[目标用户描述] + +## OBJ 候选 +- [OBJ 映射或新建议] +``` + +### Step 2:功能头脑风暴(2-4 轮) + +基于 Step 1 的目标,引导用户展开功能想象: + +**追问策略**(按轮次渐进深入): + +| 轮次 | 问题方向 | 示例 | +|------|---------|------| +| 1 | 核心能力 | "用户必须能做什么?最基本的操作是什么?" | +| 2 | 场景延伸 | "当 [场景] 发生时怎么办?有没有异常情况?" | +| 3 | 边界探索 | "需要支持多少用户/数据量?有性能要求吗?" | +| 4 | 差异化 | "和现有方案相比,最大的不同是什么?" | + +每轮回答后 Claude 实时整理为 BR→PF 候选分组,展示给用户确认方向。 + +**产出**:BR→PF 候选列表(层级分组),追加到 `scope-discovery.md`。 + +### Step 3:边界定义(1-2 轮) + +明确范围边界,防止后续范围蔓延: + +- "这个版本明确不做什么?" +- "有什么技术约束或时间约束?" + +**产出**:范围"做/不做"清单,追加到 `scope-discovery.md`。 + +### Step 4:验证与确认(1 轮) + +展示结构化摘要: + +``` +需求发现摘要: + +目标:[核心问题] +用户:[目标用户] + +候选价值链: +OBJ-x([目标]) +└── OPP-xxx:[机会描述] + └── EPIC-xxx:[专题名称] + ├── BR-xxx:[需求 1] P0 + │ ├── PF-xxx:[功能 1a] + │ └── PF-xxx:[功能 1b] + └── BR-xxx:[需求 2] P1 + └── PF-xxx:[功能 2a] + +范围: + 做:[清单] + 不做:[清单] + +确认后将写入 .devpace/,请检查并调整。 +``` + +用户可以:调整层级关系、重新排优先级、删除不需要的候选、修改名称。 + +### Step 5:写入 .devpace/ + +确认后执行写入(复用现有子命令的创建逻辑): + +1. **OPP**:按 biz-procedures-opportunity.md 的编号和格式写入 `opportunities.md` +2. **Epic**:按 biz-procedures-epic.md 的格式创建 `epics/EPIC-xxx.md` + 更新 `project.md` 树 +3. **BR**:写入 `project.md` 价值功能树对应 Epic 下(编号自增) +4. **PF**:写入 `project.md` 价值功能树对应 BR 下(编号自增) +5. **范围**:写入 `project.md` "范围" section(做/不做清单) +6. 所有内容标记溯源:`` +7. 触发 PF/BR 溢出检查(按 project-format.md 溢出规则) +8. 删除 `scope-discovery.md`(发现会话完成) +9. git commit + +### Step 6:下游引导 + +``` +已从发现会话创建: +- 1 个业务机会(OPP-xxx) +- 1 个专题(EPIC-xxx) +- N 个业务需求(BR-xxx ~ BR-xxx) +- M 个产品功能(PF-xxx ~ PF-xxx) + +→ /pace-biz decompose EPIC-xxx 继续细化特定需求 +→ /pace-biz align 检查战略对齐度 +→ /pace-plan next 排入迭代 +``` + +## 降级模式 + +| 场景 | 行为 | +|------|------| +| .devpace/ 不存在 | 正常执行 Step 0-4(对话探索),Step 5 输出到控制台不写文件,结尾引导 `/pace-init` | +| project.md 是桩 | 正常运行,Step 5 填充桩内容(愿景、范围等) | +| 用户中途放弃 | scope-discovery.md 保留中间状态,下次可继续 | + +## 容错 + +| 异常 | 处理 | +|------|------| +| 用户描述过于模糊(< 5 字) | 追加引导问题:"能再详细说说吗?比如要解决什么问题?" | +| scope-discovery.md 格式损坏 | 忽略已有内容,重新开始 | +| OBJ 映射无匹配 | 建议创建新 OBJ 或跳过 OBJ 映射 | +| 用户拒绝所有候选 | 尊重决定,删除 scope-discovery.md,不写入任何文件 | diff --git a/skills/pace-biz/biz-procedures-epic.md b/skills/pace-biz/biz-procedures-epic.md new file mode 100644 index 0000000..035a242 --- /dev/null +++ b/skills/pace-biz/biz-procedures-epic.md @@ -0,0 +1,112 @@ +# epic 子命令 procedures + +> **职责**:从 Opportunity 转化或直接创建 Epic,定义 MoS,更新价值功能树。 + +## 触发 + +`/pace-biz epic [OPP-xxx] <描述>` 或用户要创建一个专题/Epic。 + +## 步骤 + +### Step 0:模式检查 + +读取 project.md 的 `mode` 字段。若为 `lite`: + +> **当前为轻量模式(OBJ→PF→CR),Epic 功能需要完整模式。** +> - 升级到完整模式:`/pace-init --upgrade-mode` +> - 或直接添加功能:`/pace-change add <描述>` + +终止后续步骤。 + +### Step 1:确定来源 + +- 有 `OPP-xxx` 参数 → 读取 opportunities.md 确认 OPP 存在且状态为 `评估中` +- 无 OPP 参数 → 直接创建模式(来源字段留空或标注"直接创建") + +### Step 2:确定 OBJ 关联 + +1. 读取 project.md 业务目标 section,列出可用 OBJ +2. 如果只有 1 个 OBJ → 自动关联 +3. 如果多个 OBJ → 询问用户选择 +4. 如果无 OBJ → 引导先定义业务目标(建议 /pace-init full) + +### Step 3:引导定义 Epic 内容 + +向用户询问(如未在参数中提供): + +1. **专题名称**:一句话描述这个专题 +2. **背景**:2-3 句话,为什么做这个专题 +3. **成效指标(MoS)**:如何衡量这个专题的成功?(可选——渐进填充) + +### Step 4:生成 EPIC 编号 + +1. 扫描 `.devpace/epics/` 目录(不存在则创建) +2. 取最大 EPIC 编号 +1 +3. 三位补零:`EPIC-001`、`EPIC-002`... + +### Step 5:创建 Epic 文件 + +创建 `.devpace/epics/EPIC-xxx.md`,格式遵循 `knowledge/_schema/epic-format.md`: + +```markdown +# EPIC-xxx:[专题名称] + +- **OBJ**:OBJ-x([目标描述]) +- **状态**:规划中 +- **来源**:OPP-xxx([描述]) +- **时间框架**:(首次 /pace-plan 时填充) + +## 背景 + +[用户提供的背景] + +## 成效指标(MoS) + +- [ ] [指标 1] +- [ ] [指标 2] + +## 业务需求 + +| BR | 标题 | 优先级 | 状态 | PF 数 | 完成度 | +|----|------|:------:|------|:-----:|:------:| +``` + +MoS 为空时写: +```markdown +## 成效指标(MoS) + +(待定义 — /pace-biz decompose 或讨论时填充) +``` + +### Step 6:更新 project.md 价值功能树 + +在对应 OBJ 下追加 Epic 链接行: + +```markdown +OBJ-x([目标名]) +├── ... (existing) +└── [EPIC-xxx:专题名](epics/EPIC-xxx.md) +``` + +### Step 7:更新 opportunities.md(如从 OPP 转化) + +将对应 OPP 状态改为:`已采纳 → EPIC-xxx` + +### Step 8:输出确认 + +``` +已创建专题:EPIC-xxx — [名称] +关联:OBJ-x([目标])← OPP-xxx(如有) +MoS:[指标列表] 或 (待定义) +→ 下一步:/pace-biz decompose EPIC-xxx 分解为业务需求 +``` + +## 容错 + +| 异常 | 处理 | +|------|------| +| OPP-xxx 不存在 | 提示 OPP 编号无效,列出可用 OPP | +| OPP 状态非"评估中" | 提示已处理,询问是否仍要创建 Epic | +| epics/ 目录不存在 | 自动创建 | +| project.md 无价值功能树 | 创建空树结构后追加 | +| 无 OBJ | 引导 /pace-init full 或先定义 OBJ | diff --git a/skills/pace-biz/biz-procedures-import.md b/skills/pace-biz/biz-procedures-import.md new file mode 100644 index 0000000..2da06d1 --- /dev/null +++ b/skills/pace-biz/biz-procedures-import.md @@ -0,0 +1,154 @@ +# import 子命令 procedures + +> **职责**:从外部文档(会议纪要、用户反馈、竞品分析等)批量提取需求实体,合并到现有功能树。 + +## 触发 + +`/pace-biz import <路径>...` 或用户要从文档中导入需求("把这份会议纪要的需求导入"、"从 PRD 里提取需求")。 + +## 与 init --from 的区别 + +- **init --from**:项目初始化时使用,从零创建 project.md 功能树 +- **import**:项目已有功能树,增量追加新实体并执行合并分析(去重、冲突检测) + +## 步骤 + +### Step 0:前置检查与模式检查 + +1. 检查 `.devpace/` 存在(不存在 → 引导 `/pace-init`) +2. 读取 `project.md` 现有功能树(获取已有实体列表用于合并分析) +3. 读取 project.md 的 `mode` 字段,记录当前模式 +4. 读取 `metrics/insights.md`(如有,加载导入相关经验 pattern) + +**lite 模式适配**: +- Step 2 实体提取:映射目标仅为 PF(跳过 OPP/Epic/BR 映射),用户故事和功能列表直接提取为 PF 候选 +- Step 3 合并分析:仅对比已有 PF 列表 +- Step 5 写入:PF 直接追加到 project.md 对应 OBJ 下,不创建 Epic/BR + +### Step 1:源文件摄入 + +- **单文件**:`/pace-biz import meeting-notes.md` → 直接读取 +- **目录路径**:`/pace-biz import requirements/` → 扫描目录下所有 `.md`/`.txt` 文件 +- **多文件**:`/pace-biz import doc1.md doc2.md` → 依次读取,合并提取结果 +- 文件过多(>10)时先输出文件列表让用户筛选 + +**源类型自动检测**: + +| 源类型 | 检测特征 | 提取映射 | +|--------|---------|---------| +| 会议纪要 | "会议"、"minutes"、"纪要"、日期标题格式 | Action Items → BR/PF 候选 | +| 用户反馈 | "反馈"、"feedback"、评分模式、用户引用 | 痛点 → BR,功能请求 → PF | +| 竞品分析 | "竞品"、"competitor"、"对比"、对比表格 | 差距功能 → PF 候选 | +| 技术债务 | "TODO"、"FIXME"、"tech-debt"、"技术债" | 债务项 → PF 候选(标记技术债务) | +| Issue 导出 | CSV/JSON 格式(含 title/label/status 字段) | Issues → PF/CR 候选 | +| PRD / 功能规格 | 用户故事、功能列表、Features section | 同 init --from §1 解析规则 | +| API 规格 | OpenAPI/Swagger 关键词 | 同 init --from §1 API 特殊处理 | + +### Step 2:实体提取 + +对每个源文件,按检测到的源类型执行提取: + +**通用提取规则**(复用 init-procedures-from.md §1 映射表): + +| 文档元素 | 映射目标 | 解析方法 | +|---------|---------|---------| +| 用户故事(As a... I want...) | BR(业务需求) | 模式匹配 + 语义分析 | +| 功能列表 / Features | PF(产品功能)树 | 层级提取 | +| API 端点列表 | PF(按资源分组) | 结构化解析 | +| 优先级标记(P0/P1/Must/Should) | 优先级候选 | 标签提取 | + +**扩展提取规则**(import 特有): + +| 文档元素 | 映射目标 | 解析方法 | +|---------|---------|---------| +| Action Items(会议纪要) | BR/PF 候选 | "决定"、"需要"、"TODO" 关键词 | +| 用户痛点描述(反馈) | BR 候选 | 负面情感 + 功能关联 | +| 功能请求(反馈) | PF 候选 | "希望"、"建议"、"能不能" | +| 竞品差距功能(竞品分析) | PF 候选 | 对比表中我方缺失项 | +| TODO/FIXME 注释 | PF 候选(技术债务) | 注释模式匹配 | + +每个提取的实体记录来源文件和行号,用于溯源。 + +### Step 3:合并分析 + +对比提取实体 vs 现有功能树,逐条分类: + +| 分类 | 条件 | 处理 | +|------|------|------| +| NEW | 无匹配 | 建议添加到功能树 | +| DUPLICATE | 标题相似度 > 80% | 跳过并注明已有对应实体 | +| ENRICHMENT | 匹配已有但补充了新信息(验收标准/用户故事) | 建议更新已有实体 | +| CONFLICT | 与现有定义矛盾 | 标记待决,需用户裁定 | + +**相似度判断**:基于标题关键词重叠 + 语义相似度。模糊边界时倾向标记为 NEW(让用户决定)。 + +### Step 4:用户确认 + +展示合并计划(diff 格式): + +``` +导入分析(来自 [文件名]): + +NEW(新增 N 项): + + BR-xxx:[名称](来源:[文件名] L42) + + PF-xxx:[名称](来源:[文件名] L58) + +DUPLICATE(已有 M 项): + = [提取名称] ≈ PF-003(已存在,跳过) + +ENRICHMENT(丰富 K 项): + ~ PF-002:追加验收标准 "[新标准]" + +CONFLICT(冲突 J 项): + ! BR-001 现有定义 "[现有]" vs 导入 "[新]" + +逐条确认:accept all / reject all / 逐条选择 +``` + +CONFLICT 项使用 AskUserQuestion 交互决定保留哪个版本。 + +### Step 5:执行写入 + +1. NEW 项:追加到 `project.md` 功能树对应位置 + - BR 追加到对应 OBJ/Epic 下(无明确归属时追加到树末尾,标记"待归类") + - PF 追加到对应 BR 下 +2. ENRICHMENT 项:更新 `project.md` 中对应 PF/BR 的描述或验收标准 +3. 编号自增(扫描现有最大编号 +1) +4. 触发 PF/BR 溢出检查 +5. 所有内容标记溯源:`` +6. 若有迭代文件(`iterations/current.md`),追加变更记录 +7. git commit + +**不创建 CR**——import 只丰富功能树(OPP/Epic/BR/PF 级别),不涉及开发层。 + +### Step 6:下游引导 + +``` +导入完成(来自 [N 个文件]): +- 新增:X 个 BR + Y 个 PF +- 丰富:Z 个已有实体 +- 跳过:W 个重复项 + +→ /pace-biz align 检查新增内容的战略对齐度 +→ /pace-biz decompose [BR-xxx] 继续细化新增需求 +→ /pace-plan next 排入迭代 +``` + +## 降级模式 + +| 场景 | 行为 | +|------|------| +| .devpace/ 不存在 | 提示"项目未初始化",引导 `/pace-init` 或 `/pace-init --from <路径>`(推荐) | +| project.md 是桩 | 正常运行,跳过合并分析(无现有功能树可对比),直接写入 | +| 源文件不存在 | 提示路径无效,列出当前目录文件供选择 | +| 源文件为空 | 提示文件为空,跳过 | + +## 容错 + +| 异常 | 处理 | +|------|------| +| 无法识别源类型 | 按通用文本处理,提取关键短语为 PF 候选 | +| 提取结果为空 | 提示"未从文档中提取到明确的需求实体",建议手动梳理 | +| 大文件(>500 行) | 分段处理,每段提取后合并结果 | +| 二进制文件 | 跳过并提示"不支持二进制文件" | +| 编号冲突 | 重新扫描确认最大编号后分配 | diff --git a/skills/pace-biz/biz-procedures-infer.md b/skills/pace-biz/biz-procedures-infer.md new file mode 100644 index 0000000..66754e0 --- /dev/null +++ b/skills/pace-biz/biz-procedures-infer.md @@ -0,0 +1,169 @@ +# infer 子命令 procedures + +> **职责**:从当前代码库推断未追踪的功能和技术债务,补充到功能树。 + +## 触发 + +`/pace-biz infer` 或用户要从代码分析需求("看看代码里有什么功能"、"技术债务盘点"、"哪些功能没追踪")。 + +## 与其他子命令的区别 + +- **discover**:从模糊想法出发,通过对话引导产出候选 +- **import**:从文档提取需求实体 +- **infer**:从代码库反向推断已有功能和技术债务 + +## 步骤 + +### Step 0:前置检查与模式检查 + +1. 检查 `.devpace/` 存在(不存在 → 引导 `/pace-init`) +2. 读取 `project.md` 现有功能树(获取已追踪的 PF 列表) +3. 读取 project.md 的 `mode` 字段,记录当前模式 +4. 检查 git 仓库状态: + - git 可用 → 完整分析(含 blame/hotspot) + - git 不可用 → 退化模式(纯目录结构 + 注释扫描) + +**lite 模式适配**: +- Step 1 代码结构分析:模块直接映射为 PF 候选(跳过 BR 候选分组) +- Step 3 差距分析:仅对比已有 PF 列表(无 BR 对比) +- Step 5 写入:PF 直接追加到 project.md 对应 OBJ 下,技术债务归入"技术债务" PF 分组(非 BR) + +### Step 1:代码结构分析 + +扫描源码目录,建立模块→功能映射: + +**源码根目录检测**(按优先级): +- `src/` → 标准源码目录 +- `app/` → Next.js / Rails 风格 +- `lib/` → 库项目 +- 项目根目录(排除配置文件后) + +**扫描规则**: + +| 检测目标 | 方法 | 映射 | +|---------|------|------| +| 目录结构 | 一级子目录 → 模块 | 模块 → PF 候选分组 | +| 路由定义 | `routes/`、`@app.route`、`router.get` 等 | 路由 → API PF 候选 | +| API 端点 | `@Controller`、`@api_view`、OpenAPI 定义 | 端点 → PF 候选 | +| 数据模型 | `models/`、`@Entity`、`class.*Model` | 模型 → BR 候选(数据域) | +| UI 组件 | `components/`、`pages/`、`views/` | 页面/组件 → PF 候选 | +| CLI 命令 | `commands/`、`@click.command` | 命令 → PF 候选 | + +**排除目录**:`test/`、`__tests__`、`spec/`、`fixtures/`、`node_modules/`、`.devpace/`、`vendor/`、`dist/`、`build/`。 + +### Step 2:信号挖掘 + +在代码中搜索额外信号: + +**注释信号**: + +| 模式 | 信号类型 | 处理 | +|------|---------|------| +| `TODO`、`FIXME` | 技术债务 | → PF 候选(标记"技术债务") | +| `HACK`、`XXX`、`WORKAROUND` | 技术债务(高优) | → PF 候选(标记"技术债务-高优") | +| `#123`(Issue 引用) | 外部追踪 | 记录交叉参照(如有 tracker) | + +**项目配置信号**: + +| 来源 | 检测内容 | 映射 | +|------|---------|------| +| `package.json` scripts | 构建/测试/部署命令 | 运维能力 PF 候选 | +| `Makefile` / `Taskfile` | 自动化任务 | 运维能力 PF 候选 | +| `README.md` | 功能描述 section | 文档声明功能 vs 实际代码对比 | +| `Dockerfile` / `docker-compose.yml` | 服务定义 | 部署架构信息 | + +**Git 增强信号**(git 可用时): + +| 分析 | 方法 | 用途 | +|------|------|------| +| 热点文件 | `git log --since="30 days" --name-only` 统计变更频率 | 活跃开发区标记 | +| 共变文件 | 同一 commit 中频繁一起出现的文件 | 耦合模块识别 | +| 贡献者分布 | `git shortlog -sn` | 知识集中度风险 | + +### Step 3:差距分析 + +对比推断功能 vs 现有功能树,分类: + +| 分类 | 条件 | 说明 | +|------|------|------| +| 未追踪 | 代码中存在功能模块,但功能树中无对应 PF | 建议补充追踪 | +| 未实现 | 功能树中有 PF,但代码中无对应实现 | 确认是计划中还是遗漏 | +| 技术债务 | TODO/FIXME 密集区域(>3 个/文件) | 建议纳入追踪 | +| 文档漂移 | README 描述的功能与实际代码不匹配 | 提醒更新文档或功能树 | + +**匹配规则**:通过 PF 名称关键词与代码模块/文件名的语义关联判断。模糊匹配时列出供用户确认。 + +### Step 4:报告与确认 + +三段式输出: + +``` +代码库分析报告: + +1. 未追踪功能(代码有,功能树无): + 模块 [auth/]: + + PF 候选:用户认证(routes: login, register, logout) + + PF 候选:权限管理(middleware: checkPermission) + + 模块 [api/]: + + PF 候选:数据导出 API(endpoints: /export/csv, /export/json) + +2. 未实现功能(功能树有,代码无): + ? PF-003:高级搜索 — 确认状态:计划中 / 已放弃 / 其他? + +3. 技术债务(TODO/FIXME 集中区域): + ! src/utils/parser.js(8 个 TODO)— 纳入追踪? + ! src/db/migration.py(5 个 FIXME)— 纳入追踪? + +[Git 增强] 热点:src/core/engine.js(30天内 42 次变更) +[Git 增强] 耦合:auth/ ↔ session/(经常一起改动) + +逐项选择:accept / skip / 调整分组 +``` + +用户逐项选择后确认。 + +### Step 5:写入 .devpace/ + +1. 确认的"未追踪功能":追加到 `project.md` 功能树 + - 按模块分组归入对应 BR 下(无明确归属时创建新 BR 分组) + - PF 编号自增 +2. 确认的"技术债务":追加到 `project.md` 功能树 + - PF 名称附"(技术债务)"后缀 + - 归入新建或已有的"技术债务" BR 分组下 +3. "未实现功能"用户确认为"已放弃"的 → 标记 PF 状态 +4. 所有内容标记溯源:`` +5. 触发 PF/BR 溢出检查 +6. git commit + +### Step 6:下游引导 + +``` +代码库推断完成: +- 新增追踪:X 个产品功能 +- 技术债务:Y 个待处理项 +- 未实现确认:Z 个功能状态已更新 + +→ /pace-biz align 检查新增项的战略对齐度 +→ /pace-dev 开始处理优先项 +→ /pace-plan next 将新增项排入迭代 +``` + +## 降级模式 + +| 场景 | 行为 | +|------|------| +| .devpace/ 不存在 | 正常执行 Step 1-4(代码分析),Step 5 输出到控制台不写文件,结尾引导 `/pace-init` | +| project.md 是桩 | 正常运行,Step 3 跳过差距分析(无功能树可对比),直接输出发现 | +| 无 Git | 退化:跳过 Step 2 的 Git 增强信号(热点/共变/贡献者),其余正常 | +| 无源码目录 | 提示"未检测到源码目录",列出项目根目录结构供用户指定 | + +## 容错 + +| 异常 | 处理 | +|------|------| +| 源码目录过大(>1000 文件) | 限制扫描深度为 3 层,提示用户可指定子目录 | +| 无法识别项目类型 | 仅做目录结构分析 + TODO 扫描,跳过框架特定检测 | +| Git 命令超时 | 降级到非 Git 模式,提示用户 | +| 推断结果为空 | 提示"代码库结构简单或功能树已完整覆盖" | +| 编号冲突 | 重新扫描确认最大编号后分配 | diff --git a/skills/pace-biz/biz-procedures-opportunity.md b/skills/pace-biz/biz-procedures-opportunity.md new file mode 100644 index 0000000..c3e689b --- /dev/null +++ b/skills/pace-biz/biz-procedures-opportunity.md @@ -0,0 +1,76 @@ +# opportunity 子命令 procedures + +> **职责**:捕获业务机会到 opportunities.md。 + +## 触发 + +`/pace-biz opportunity <描述>` 或用户描述了一个业务机会/客户反馈/竞品动态。 + +## 步骤 + +### Step 0:模式检查 + +读取 project.md 的 `mode` 字段。若为 `lite`: + +> **当前为轻量模式(OBJ→PF→CR),Opportunity 功能需要完整模式。** +> - 升级到完整模式:`/pace-init --upgrade-mode` +> - 或直接添加功能:`/pace-change add <描述>` + +终止后续步骤。 + +### Step 1:解析来源 + +从用户输入中推断来源类型: + +| 关键词 | 推断类型 | +|--------|---------| +| 用户说/客户反馈/用户反馈/投诉 | 用户反馈 | +| 竞品/竞争对手/对手 | 竞品观察 | +| 发现/技术/性能/可以用 | 技术发现 | +| 趋势/市场/行业 | 市场趋势 | +| 想到/觉得/内部/我们应该 | 内部洞察 | + +推断不确定时询问用户确认。 + +### Step 2:生成 OPP 编号 + +1. 读取 `.devpace/opportunities.md`(不存在则创建空文件) +2. 扫描所有 `## OPP-xxx` 标题,取最大编号 +1 +3. 三位补零:`OPP-001`、`OPP-002`... + +### Step 3:写入 opportunities.md + +在文件末尾追加新条目: + +```markdown +## OPP-xxx:[描述] +- **来源**:[类型]([详情]) +- **状态**:评估中 +- **日期**:[YYYY-MM-DD] +``` + +文件不存在时先创建: + +```markdown +# 业务机会 + +## OPP-001:[描述] +... +``` + +### Step 4:输出确认 + +``` +已捕获业务机会:OPP-xxx — [描述] +来源:[类型]([详情]) +状态:评估中 +→ 下一步:/pace-biz epic OPP-xxx 评估并转化为 Epic +``` + +## 容错 + +| 异常 | 处理 | +|------|------| +| .devpace/ 不存在 | 引导 /pace-init | +| opportunities.md 格式损坏 | 在文件末尾追加,不修复已有内容 | +| 用户未提供描述 | 询问:请描述这个业务机会 | diff --git a/skills/pace-biz/biz-procedures-view.md b/skills/pace-biz/biz-procedures-view.md new file mode 100644 index 0000000..ed162c0 --- /dev/null +++ b/skills/pace-biz/biz-procedures-view.md @@ -0,0 +1,75 @@ +# view 子命令 procedures + +> **职责**:展示业务全景视图,从 Opportunity 到 CR 的完整价值流。 + +## 触发 + +`/pace-biz view` 或用户想看业务全景。 + +## 步骤 + +### Step 0:模式检查 + +读取 project.md 的 `mode` 字段。若为 `lite`: + +- 跳过 opportunities.md 和 epics/ 采集 +- 视图简化为 `OBJ→PF→CR` 树(与 `/pace-status tree` 类似但保留业务全景统计) +- 统计部分省略 Opportunity/Epic/BR 计数 + +### Step 1:采集数据 + +读取以下文件: +1. `opportunities.md` — 所有 Opportunity 及其状态 +2. `epics/` — 所有 Epic 文件及其 BR 列表 +3. `project.md` — 价值功能树(BR→PF→CR 关系) +4. `state.md` — 当前工作状态 + +### Step 2:构建全景视图 + +按以下层次组织数据: + +``` +业务全景([项目名]) +══════════════════ + +[OBJ-1:目标名] +├── [EPIC-001:专题名](进行中)← OPP-001 +│ ├── BR-001:需求名 P0 进行中 +│ │ ├── PF-001 → CR-001 🔄 +│ │ └── PF-002 → (待创建 CR) +│ └── BR-002:需求名 P1 待开始 +└── [EPIC-002:专题名](规划中)← OPP-003 + └── (待分解) + +[未关联 Epic 的 BR](向后兼容路径) +└── BR-003:需求名 → PF-003 → CR-002 ✅ + +[未处理的业务机会] +├── OPP-002(评估中):竞品 X 上线实时协作 +└── OPP-004(已搁置):内部工具整合 + +[统计] +├── Opportunity:N 总计(M 评估中 / K 已采纳 / L 已搁置) +├── Epic:N 总计(M 进行中 / K 规划中 / L 已完成) +├── BR:N 总计 +├── PF:N 总计(M 完成) +└── CR:N 总计(M 活跃) +``` + +### Step 3:适配项目规模 + +| 项目规模 | 展示策略 | +|---------|---------| +| 无 Epic/Opportunity | 简化为 OBJ→BR→PF→CR 树视图(与 /pace-status tree 类似) | +| 1-3 Epic | 完整展示所有层级 | +| 4+ Epic | 折叠已完成的 Epic,展开活跃的 | + +### Step 4:输出 + +直接在终端输出格式化的全景视图。不写入文件。 + +## 注意 + +- 此子命令为**只读**,不修改任何文件 +- 与 `/pace-status` 的区别:/pace-status 聚焦 CR/PF 的**开发进度**;/pace-biz view 聚焦 OPP→EPIC→BR 的**业务规划**视角 +- 向后兼容:无 Epic/Opportunity 时退化为简单的 OBJ→BR→PF→CR 树视图 diff --git a/skills/pace-change/SKILL.md b/skills/pace-change/SKILL.md index baffdc4..29a4fc3 100644 --- a/skills/pace-change/SKILL.md +++ b/skills/pace-change/SKILL.md @@ -12,9 +12,10 @@ agent: pace-pm ## 与现有机制的关系 -- `/pace-change`:PF 级需求变更(add/pause/resume/modify/reprioritize) +- `/pace-change`:PF/BR/Epic 级需求变更(add/pause/resume/modify/reprioritize) +- `/pace-biz`:业务规划域(Opportunity→Epic→BR 的**创建和分解**) - `/pace-plan adjust`:迭代范围调整(哪些 PF 纳入/移出当前迭代) -- 协同场景:`/pace-change add` 插入新 PF → 容量溢出 → 建议 `/pace-plan adjust` +- 协同场景:`/pace-change add` 插入新 BR 或 PF → 容量溢出 → 建议 `/pace-plan adjust` - `devpace-rules.md §9`:自动检测变更意图,共享同一套 procedures 文件 ## 推荐使用流程 @@ -34,11 +35,11 @@ $ARGUMENTS: ### 核心子命令 -- `add <描述>` → 插入新需求 -- `pause <功能名>` → 暂停/砍掉某个功能 -- `resume <功能名>` → 恢复已暂停的功能 +- `add <描述>` → 插入新需求(支持 BR 级和 PF 级——自动检测粒度,或用 `add br <描述>` / `add pf <描述>` 显式指定) +- `pause <名称>` → 暂停/砍掉(支持 Epic/BR/PF/CR 级——根据名称或 ID 自动匹配层级) +- `resume <名称>` → 恢复已暂停的项目(支持 Epic/BR/PF/CR 级) - `reprioritize <描述>` → 优先级调整 -- `modify <功能名> <变更描述>` → 修改已有需求 +- `modify <名称> <变更描述>` → 修改已有需求(支持 Epic/BR/PF 级) ### 扩展子命令 diff --git a/skills/pace-change/change-procedures-types.md b/skills/pace-change/change-procedures-types.md index b5e877e..5e9ff4e 100644 --- a/skills/pace-change/change-procedures-types.md +++ b/skills/pace-change/change-procedures-types.md @@ -82,7 +82,7 @@ **add 后容量超出**: 1. 检测迭代容量(iterations/current.md PF 数 vs 历史速度) 2. 容量超出 → 直接询问用户:"迭代容量已满,是否同时调整迭代范围?" -3. 用户确认 → 内联执行 `/pace-plan adjust` 的逻辑(读取 adjust-procedures.md),无需用户手动切换命令 +3. 用户确认 → 委托 `/pace-plan adjust` 执行迭代范围调整(迭代文件写入规则见 `knowledge/_schema/iteration-format.md`),无需用户手动切换命令 4. 用户拒绝 → 仅记录容量告警到迭代变更记录 **pause 释放容量**: diff --git a/skills/pace-dev/SKILL.md b/skills/pace-dev/SKILL.md index 696210f..866d247 100644 --- a/skills/pace-dev/SKILL.md +++ b/skills/pace-dev/SKILL.md @@ -25,6 +25,7 @@ $ARGUMENTS: - `<功能描述>` → 指定要推进的功能(自然语言匹配) - `#` → 按 CR 编号直接定位(如 `#3` → CR-003) - `--last` → 定位上一个操作过的 CR(从 state.md 或最近 git log 推断) +- `--batch` → 连续推进模式:批量推进迭代内多个 S 复杂度 PF,最后统一审批 ## 执行路由 diff --git a/skills/pace-dev/dev-procedures-common.md b/skills/pace-dev/dev-procedures-common.md index 1e1986f..2f6819e 100644 --- a/skills/pace-dev/dev-procedures-common.md +++ b/skills/pace-dev/dev-procedures-common.md @@ -71,3 +71,43 @@ pace-dev 完成实现后(Gate 1 通过、代码已提交),**必须**向用 - 简单 CR(S):1-2 行即可(文件列表 + 状态变化),省略"质量"行 - 标准/复杂 CR(M/L/XL):完整 5 项,"质量"行浓缩 Gate 反思为 ≤20 字(如"无新技术债,核心路径测试充分") - 不透明动作禁令:写入 .devpace/ 的任何文件必须在摘要中列出——用户不应在不知情的情况下发现文件被修改 + +## 连续推进模式(--batch) + +当用户使用 `--batch` 参数或说"连续做"/"批量推进"时,启用连续推进模式: + +### 进入条件 + +1. 当前有活跃迭代(`iterations/current.md` 存在) +2. 迭代内有 ≥2 个未开始的 PF + +### 执行流程 + +1. 读取 `current.md`,按优先级排列未开始的 PF +2. 对每个 PF 依次执行标准 pace-dev 流程(创建 CR → 开发 → Gate 1 → Gate 2) +3. **Gate 3 延迟**:S 复杂度的 CR 通过 Gate 2 后不立即进入 Gate 3 审批,而是标记为 `batch_review_pending`(CR 状态仍为 `in_review`) +4. L/XL 复杂度的 CR 仍立即进入 Gate 3 审批(不延迟) +5. 每完成一个 PF 后,输出 1 行进度:`[N/M] PF-xxx 已完成 Gate 2,等待统一审批` + +### 批量审批 + +所有 S 复杂度 PF 完成 Gate 2 后,一次性展示批量审批列表: + +``` +批量审批(共 N 个 S 复杂度变更): +1. CR-xxx:[标题] — Gate 2 ✅ +2. CR-xxx:[标题] — Gate 2 ✅ +3. CR-xxx:[标题] — Gate 2 ✅ + +全部批准 | 逐个审批 | 取消 +``` + +- "全部批准" → 全部标记为 merged,执行连锁更新 +- "逐个审批" → 退出 batch 模式,逐个走标准 Gate 3 +- 用户可选择性排除:"批准除了 2 号" + +### 退出条件 + +- 迭代内无更多未开始 PF +- 用户说"停"/"够了"/"先到这" +- 遇到 L/XL 复杂度 PF(完成该 PF 的 Gate 3 后询问是否继续 batch) diff --git a/skills/pace-dev/dev-procedures-developing.md b/skills/pace-dev/dev-procedures-developing.md index 97cc67f..d7054f6 100644 --- a/skills/pace-dev/dev-procedures-developing.md +++ b/skills/pace-dev/dev-procedures-developing.md @@ -143,7 +143,7 @@ CR 进入 developing 阶段时,自动检测是否需要生成测试策略— - 在 created→developing 转换完成、意图检查点通过后: 1. 检查上述 3 个条件是否全部满足 2. 全部满足 → 输出 1 行提示:"📝 检测到 PF 关联且无测试策略,自动生成中..." - 3. 按 `test-procedures-strategy-gen.md` §3 执行 strategy 生成流程 + 3. 自动生成测试策略文件(输出格式见 `knowledge/_schema/test-strategy-format.md`,或委托 `/pace-test strategy`) 4. 生成成功 → 输出"测试策略已生成(.devpace/rules/test-strategy.md),后续 coverage/accept/impact 将自动使用" 5. 继续正常的 developing 开发流程 - 条件不全满足 → 静默跳过,不提示 @@ -176,3 +176,42 @@ developing 阶段接近完成时,主动建议执行 dryrun 预检——在正 - **同一 CR 仅建议 1 次**:首次触发后在 CR 事件表备注 `[dryrun-suggested]`,后续不重复 - **不阻断**:纯建议,用户可忽略 - **与智能推荐互补**:pace-test 无参数运行时的智能推荐(§1.6)在 developing 状态也推荐 dryrun,此处是 pace-dev 侧的主动触达 + +## 语义漂移检测(持续需求对齐) + +在 developing 阶段的 checkpoint 中,检测代码变更是否持续与验收标准语义对齐——补充意图漂移("做了什么不该做的")和复杂度漂移("规模比预期大")之外的第三维度:"做的东西还是需求要的吗"。 + +### 检测步骤 + +每次 checkpoint(与意图/复杂度漂移检测同时执行),额外检查: + +1. 读取 CR 关联 PF 的验收标准列表(从 project.md 或 PF 溢出文件) +2. 读取当前 CR 的 `git diff --stat` 获取变更文件和行数统计 +3. 对每个验收标准,评估当前代码变更是否有相关实现: + - **已覆盖**:变更文件中有直接实现该标准的代码 + - **部分覆盖**:有相关代码但不完整 + - **未触及**:尚无相关变更(可能是后续步骤) + - **偏离**:代码实现了标准未要求的功能,可能偏离需求 + +### 触发条件 + +同时满足以下条件时输出语义漂移提示: +- CR 开发进度 ≥ 50%(L/XL 按步骤比例,S/M 按变更文件与预期比例) +- 存在"偏离"分类的验收标准 ≥ 1 个 +- 或"未触及"分类的验收标准占比 > 50% 且进度 ≥ 70% + +### 提示格式 + +``` +📊 语义对齐检查:N/M 验收标准已覆盖 · X 项部分覆盖 · Y 项未触及 · Z 项可能偏离 +偏离项:[验收标准描述] — 当前实现 [实际方向] +→ 建议:确认需求理解或调整实现方向 +``` + +### 规则 + +- **不阻断**:纯提示,不影响开发流程 +- **轻量执行**:仅读取 PF 验收标准(3-10 条)和 git diff stat,不做深度代码分析 +- **S CR 跳过**:单文件 CR 验收标准通常明确,不需要中间检查 +- **与 Gate 2 互补**:Gate 2 做完整逐条比对,语义漂移检测是开发过程中的早期预警 +- **与 accept 协同**:语义漂移检测结果可作为后续 `/pace-test accept` 的优先级参考 diff --git a/skills/pace-dev/dev-procedures-intent.md b/skills/pace-dev/dev-procedures-intent.md index caf634b..73a01e3 100644 --- a/skills/pace-dev/dev-procedures-intent.md +++ b/skills/pace-dev/dev-procedures-intent.md @@ -1,6 +1,6 @@ # 意图检查点与计划规程 -> **执行流程**:意图检查点 → 复杂度评估 → [S: 直接开工 | M: 可选计划 | L/XL: 执行计划 + 反思 + 方案确认] → 风险预扫描(条件) → 进入 developing +> **执行流程**:意图检查点 → 复杂度评估 → [S: 直接开工 | M: 可选计划 | L/XL: 技术方案评审 → 执行计划 + 反思 + 方案确认] → 风险预扫描(条件) → 进入 developing ## Phase A:意图明确(始终执行) @@ -123,6 +123,52 @@ - 升级建议不阻断——用户选择继续则按原复杂度推进 - 已完成的工作不丢失——升级后作为更完整计划的输入保留 +### 技术方案评审(L/XL 必须) + +在生成执行计划之前,先评审技术方案选型: + +**Step B0:方案分析** + +1. 基于意图检查点的范围和约束,Claude 提出 2-3 个备选技术方案 +2. 每个方案包含: + - **方案名称**:1 行描述 + - **核心思路**:2-3 行说明实现路径 + - **优势**:关键优点 + - **劣势/风险**:主要缺点或技术风险 +3. 将方案对比写入 CR 文件的"方案"字段 + +**Step B0.5:方案确认** + +展示方案对比,等待用户选择: + +``` +技术方案([CR 标题]): + +方案 A:[名称] + 思路:[实现路径] + 优势:[优点] | 劣势:[缺点] + +方案 B:[名称] + 思路:[实现路径] + 优势:[优点] | 劣势:[缺点] + +推荐方案 A,因为 [理由]。选哪个? +``` + +- 用户选择后 → 更新 CR 方案字段为选定方案 +- 用户说"都行/你定" → 采用推荐方案 + +**ADR 自动触发**:如果方案涉及以下任一条件,自动建议创建 ADR(通过在 merged 后引导提醒,不阻断当前流程): +- 新引入依赖(框架/库) +- 改变已有架构模式(如从同步改异步) +- 影响 3+ 个模块的接口 +- 用户明确说"记录这个决策" + +**规则**: +- **S/M CR 跳过本步骤**——直接进入执行计划生成 +- 方案评审与执行计划生成合并在同一个用户交互中展示(方案确认 → 立即生成执行计划),不增加额外交互轮次 +- 如果 CR 只有 1 个可行方案(如 bug 修复),标注"单一方案,无需对比"并跳过 + ### 执行计划生成(L/XL 必须) 复杂度 L/XL 的 CR 在意图检查点完成后,自动生成执行计划写入 CR 意图 section。 @@ -203,7 +249,7 @@ L/XL CR 的执行计划生成后,**必须主动展示并等待用户确认** | S(多文件)/ M | insights.md 有匹配 defense pattern(置信度 ≥ 0.5) | 轻量扫描(仅历史教训维度) | | L / XL | 必须触发 | 完整 5 维扫描 | -扫描规则详见 `skills/pace-guard/guard-procedures-scan.md`。扫描结果写入 CR "风险预评估" section(格式见 `knowledge/_schema/cr-format.md`)。 +执行 5 维风险扫描(维度定义和输出格式见 `knowledge/_schema/risk-format.md` 风险预评估章节,或委托 `/pace-guard scan`)。扫描结果写入 CR "风险预评估" section(格式见 `knowledge/_schema/cr-format.md`)。 若综合风险等级为 High: - 执行计划中增加对应防护步骤(如:"增加 E2E 测试"、"架构审查"等具体动作) diff --git a/skills/pace-dev/dev-procedures-postmerge.md b/skills/pace-dev/dev-procedures-postmerge.md index 51d324f..3ea97f2 100644 --- a/skills/pace-dev/dev-procedures-postmerge.md +++ b/skills/pace-dev/dev-procedures-postmerge.md @@ -18,17 +18,48 @@ **执行规则**:检查 state.md 教学标记 → 未出现过 → 在自然时机直接执行功能的核心价值输出 → 更新标记。用户如果问"怎么手动触发",再说明对应命令名称。 -## PF 溢出检查(Overflow Check) +## 迭代内下一 PF 推荐(merged 后自动执行) -CR 创建或状态变更(尤其是 merged)时,检查关联 PF 是否满足溢出条件,满足时自动创建独立文件。 +CR merged 后,在功能发现检查之后、关联链维护之前,自动检查迭代内是否有未开始的 PF: + +1. 读取 `.devpace/iterations/current.md` 确认当前迭代 +2. 从迭代文件中提取纳入的 PF 列表及优先级 +3. 扫描 `.devpace/backlog/` 确认每个 PF 是否有已创建的 CR +4. 如果存在"纳入迭代但无 CR"的 PF: + - 按迭代文件中的优先级排序,取最高优先级 PF + - 在 merged 摘要末尾追加:`迭代进度:N/M 完成。下一个:[PF-xxx 名称]——说"开始做"继续推进` +5. 如果迭代内所有 PF 都有 CR 且全部 merged → 追加:`迭代所有功能已完成——/pace-plan close 关闭迭代 | /pace-retro 回顾` +6. 如果无当前迭代(`current.md` 不存在)→ 跳过本步骤 + +**规则**: +- 此推荐不替代 pace-next 的全局推荐,仅在 merged 摘要中追加 1 行 +- iterations/current.md 不存在时静默跳过,不报错 + +## Epic→BR→PF 关联链维护 + +CR 创建时,Claude 自动填充完整追溯链到 CR 文件的"产品功能"字段: + +``` +- **产品功能**:[PF 标题]([PF-ID])→ [BR 标题]([BR-ID])→ [Epic 标题]([EPIC-ID]) +``` + +**查找逻辑**: +1. 从 project.md 价值功能树定位 PF 所属的 BR +2. 从 BR 所属的 Epic 行(如有)获取 Epic 信息 +3. 无 Epic 时省略 Epic 部分(向后兼容):`[PF 标题]([PF-ID])→ [BR 标题]([BR-ID])` + +## PF 和 BR 溢出检查(Overflow Check) + +CR 创建或状态变更(尤其是 merged)时,检查关联 PF 和 BR 是否满足溢出条件,满足时自动创建独立文件。 ### 检查时机 | 事件 | 检查行为 | |------|---------| -| CR 创建(新关联 PF) | 计算该 PF 关联的 CR 数(含本次),≥3 则触发 | -| CR merged(§11 连锁更新时) | 综合检查三个条件 | -| `/pace-change modify` 涉及 PF | 由 change-procedures-types.md 负责检查并触发 | +| CR 创建(新关联 PF) | 计算该 PF 关联的 CR 数(含本次),≥3 则触发 PF 溢出 | +| CR merged(§11 连锁更新时) | 综合检查 PF 和 BR 三个条件 | +| `/pace-change modify` 涉及 PF 或 BR | 由 change-procedures-types.md 负责检查并触发 | +| BR 关联 PF 新增(/pace-biz decompose) | 计算该 BR 关联的 PF 数,≥3 则触发 BR 溢出 | ### 溢出条件(满足任一) @@ -48,9 +79,21 @@ CR 创建或状态变更(尤其是 merged)时,检查关联 PF 是否满足 - 价值功能树中该 PF 行追加 `→ [详情](features/PF-xxx.md)` 7. 在执行透明摘要中报告溢出:"PF-xxx 信息已迁移到独立文件 features/PF-xxx.md" +### BR 溢出条件(满足任一) + +溢出条件定义见 `knowledge/_schema/br-format.md` "溢出触发条件"章节(关联 3+ PF | 业务上下文 >5 行 | 经历 modify)。 + +### BR 溢出执行步骤 + +1. 创建 `.devpace/requirements/` 目录(如不存在) +2. 从 project.md 价值功能树提取 BR 关联信息(Epic、OBJ、PF 列表) +3. 聚合信息创建 `requirements/BR-xxx.md` +4. 更新 project.md 价值功能树中该 BR 行为链接格式 +5. 在执行透明摘要中报告溢出:"BR-xxx 信息已迁移到独立文件 requirements/BR-xxx.md" + ### 规则 - **零摩擦**:溢出自动发生,不询问用户确认(对齐 P1 原则) -- **幂等性**:已存在 `features/PF-xxx.md` 时不重复溢出,仅更新已有文件 -- **向后兼容**:无 `features/` 目录的项目不触发任何溢出逻辑 +- **幂等性**:已存在 `features/PF-xxx.md` 或 `requirements/BR-xxx.md` 时不重复溢出,仅更新已有文件 +- **向后兼容**:无 `features/` 或 `requirements/` 目录的项目不触发任何溢出逻辑 - **容错**:溢出失败(如文件写入异常)不阻断主流程,在摘要中标注失败原因 diff --git a/skills/pace-feedback/SKILL.md b/skills/pace-feedback/SKILL.md index 9005c3f..b37c68b 100644 --- a/skills/pace-feedback/SKILL.md +++ b/skills/pace-feedback/SKILL.md @@ -1,7 +1,7 @@ --- -description: Use when user reports issues, shares feedback, or receives production alerts — "用户反馈", "线上问题", "生产问题", "告警", "改进建议", "新需求", "体验问题", "功能请求", "线上bug", "运维". +description: Use when user reports issues, shares feedback, or receives production alerts — "用户反馈", "线上问题", "生产问题", "告警", "改进建议", "新需求", "体验问题", "功能请求", "线上bug", "运维", "事件", "incident", "故障", "P0", "P1", "严重故障", "postmortem", "事后复盘". allowed-tools: AskUserQuestion, Write, Read, Edit, Glob, Bash -argument-hint: "[report <问题描述>] 或 [反馈描述]" +argument-hint: "[report <问题描述>] 或 [incident open/close/timeline/list] 或 [反馈描述]" model: sonnet disable-model-invocation: true --- @@ -10,12 +10,16 @@ disable-model-invocation: true > **可选功能**:用于系统化收集上线后反馈和处理生产事件。简单场景直接说"用户反馈了 X 问题"或"线上有个 bug"即可。 -收集上线后反馈和生产环境问题,关联到价值链(目标→功能→任务),闭合"交付→反馈→改进"循环和"部署→反馈→修复"循环。每条反馈分配唯一 FB-ID,全生命周期可追踪。 +收集上线后反馈和生产环境问题,关联到价值链(目标→Epic→功能→任务),闭合"交付→反馈→改进"循环和"部署→反馈→修复"循环。反馈可关联到 Epic 和 Opportunity(如来源为已有客户反馈)。每条反馈分配唯一 FB-ID,全生命周期可追踪。 ## 输入 $ARGUMENTS: - `report <问题描述>` → **紧急通道**:跳过分诊,自动进入"生产事件"分支并启用加速路径评估(仅 hotfix/critical 场景自动建议加速) +- `incident open <描述>` → 创建事件记录(严重度评估 + 时间线初始化) +- `incident close ` → 关闭事件 + 生成 postmortem 模板 +- `incident timeline ` → 查看事件时间线 +- `incident list` → 列出所有事件(支持 `--open` 筛选) - `<反馈描述>` → 走分诊流程(分类后路由) - (空)→ 引导式收集(渐进式两轮收集) @@ -30,6 +34,16 @@ $ARGUMENTS: | severity ≥ major 或 report 参数 | `feedback-procedures-hotfix.md` | | 创建 defect/hotfix CR | `feedback-procedures-analysis.md` | | Step 5 状态更新 | `feedback-procedures-status.md` | +| incident open / close / timeline / list | `feedback-procedures-incident.md` | + +### incident 子命令执行路由 + +| 子命令 | 读取 | 写入 | 规程文件 | +|--------|------|------|---------| +| incident open | state.md, backlog/, releases/ | incidents/INCIDENT-xxx.md | feedback-procedures-incident.md | +| incident close | incidents/INCIDENT-xxx.md, backlog/ | incidents/INCIDENT-xxx.md | feedback-procedures-incident.md | +| incident timeline | incidents/INCIDENT-xxx.md | (只读) | feedback-procedures-incident.md | +| incident list | incidents/ | (只读) | feedback-procedures-incident.md | ### Step 0:草稿恢复检查 diff --git a/skills/pace-feedback/feedback-procedures-incident.md b/skills/pace-feedback/feedback-procedures-incident.md new file mode 100644 index 0000000..792c36f --- /dev/null +++ b/skills/pace-feedback/feedback-procedures-incident.md @@ -0,0 +1,88 @@ +# 事件管理规程 + +> **职责**:结构化事件管理——创建、追踪、关闭和复盘。补全运维闭环。 + +## 与 report/hotfix 的关系 + +| 入口 | 定位 | 适用场景 | +|------|------|---------| +| `report` | 紧急通道,快速创建 Defect/Hotfix CR | 发现问题需要立即修复 | +| `incident open` | 事件管理,结构化记录和追踪 | 需要分级响应、时间线追踪、事后复盘 | + +两者可并行使用:`incident open` 创建事件记录 → `report` 创建对应的 Hotfix CR → CR merged 后 `incident close` 关闭事件。 + +## incident open + +### 严重度分级 + +复用现有严重度矩阵(feedback-procedures-hotfix.md),映射为事件等级: + +| 严重度 | 事件等级 | 响应要求 | 示例 | +|--------|---------|---------|------| +| critical | P0 | 立即响应,所有工作暂停 | 全站不可用、数据丢失 | +| major | P1 | 1 小时内响应 | 核心功能不可用、性能严重降级 | +| minor | P2 | 当日响应 | 非核心功能异常、UI 错误 | +| trivial | P3 | 下个迭代处理 | 体验优化、文案问题 | + +### 创建流程 + +1. 评估严重度(复用 hotfix 严重度矩阵) +2. 创建 `.devpace/incidents/` 目录(如不存在) +3. 生成 `INCIDENT-NNN.md`,包含: + - 标题、严重度、状态(open) + - 影响范围描述 + - 时间线(含创建时间) + - 关联 CR 列表(初始为空) +4. P0/P1 事件 → 额外提醒:"建议立即 `/pace-feedback report` 创建 Hotfix CR" +5. 输出摘要 + +### 事件文件格式 + +``` +# INCIDENT-NNN:[标题] + +- **严重度**:P0/P1/P2/P3 +- **状态**:open / investigating / mitigated / closed +- **影响范围**:[描述] +- **开始时间**:[ISO 8601] +- **关联 CR**:[CR 编号列表] + +## 时间线 + +| 时间 | 事件 | +|------|------| +| [时间] | 事件创建 | + +## Postmortem + +(事件关闭后填充) +``` + +## incident close + +1. 读取事件文件,确认状态为 open/investigating/mitigated +2. 更新状态为 closed,记录关闭时间 +3. 生成 Postmortem 模板(追加到事件文件 Postmortem section): + - **影响摘要**:持续时间、影响范围 + - **根本原因**:(待填写) + - **修复措施**:关联 CR 的修复摘要 + - **预防措施**:(待填写) + - **经验教训**:(待填写) +4. 提醒用户填写 Postmortem 的空白字段 +5. 如有关联 CR → 检查是否全部 merged,未全部 merged 则警告 + +## incident timeline + +只读展示事件时间线,按时间倒序排列。 + +## incident list + +列出 `.devpace/incidents/` 中所有事件。`--open` 只显示非 closed 状态的事件。 + +## 容错 + +| 异常 | 处理 | +|------|------| +| incidents/ 不存在 | open 时自动创建;list/timeline/close 报告无事件记录 | +| INCIDENT 编号不存在 | 提示无效编号,列出可用选项 | +| 关闭已关闭的事件 | 提示已关闭,展示 Postmortem | diff --git a/skills/pace-feedback/feedback-procedures-intake.md b/skills/pace-feedback/feedback-procedures-intake.md index 5bf12e1..14ebe36 100644 --- a/skills/pace-feedback/feedback-procedures-intake.md +++ b/skills/pace-feedback/feedback-procedures-intake.md @@ -30,3 +30,19 @@ Claude 自动从项目上下文补充: - 读取最近的 Release(`.devpace/releases/`,降级模式跳过)确定最近部署时间 - 扫描 backlog/ 中最近 merged 的 CR,列出潜在引入源 - 读取 checks.md 确认是否有相关质量检查覆盖 + +## 反馈类型分流 + +在完成渐进式引导收集(第一轮)后、创建 CR 之前,根据用户描述判断反馈类型: + +| 类型 | 识别特征 | 处理路径 | +|------|---------|---------| +| 缺陷(Bug) | "白屏/报错/崩溃/数据丢失/无法使用" 等故障描述 | 继续 feedback 流程 → 创建 Defect CR | +| 体验改进 | "太慢/不方便/想要更好的 X" 等改善诉求 | 继续 feedback 流程 → 创建 Improvement CR | +| 功能请求 | "能不能加/希望有/需要一个新的 X" 等新功能诉求 | 路由到 `/pace-change add` 或 `/pace-biz discover` | + +**功能请求路由规则**: +1. 识别到功能请求时,向用户确认:"这看起来是一个新功能需求而非缺陷。建议通过需求管理流程处理——" +2. 如果项目有 Epic 结构 → 推荐 `/pace-biz discover` +3. 如果项目无 Epic 结构 → 推荐 `/pace-change add [功能描述]` +4. 用户坚持按反馈处理 → 尊重用户选择,继续 feedback 流程 diff --git a/skills/pace-guard/SKILL.md b/skills/pace-guard/SKILL.md index 08cba18..c8935c0 100644 --- a/skills/pace-guard/SKILL.md +++ b/skills/pace-guard/SKILL.md @@ -7,7 +7,7 @@ argument-hint: "[scan|monitor|trends|report|resolve] [CR编号] [--full|--brief| # /pace-guard — 风险预判与管理 -统一管理开发全生命周期的风险:从编码前的 Pre-flight 扫描,到开发中的实时监控,再到跨迭代的趋势分析——让风险可见、可追踪、可解决。 +统一管理开发全生命周期的风险:从编码前的 Pre-flight 扫描,到开发中的实时监控,再到跨迭代的趋势分析——让风险可见、可追踪、可解决。风险评估覆盖 Epic 级别(Epic 范围风险影响其下所有 BR/PF/CR)。 ## 子命令 diff --git a/skills/pace-guard/guard-procedures-common.md b/skills/pace-guard/guard-procedures-common.md index e72ca70..b4e946a 100644 --- a/skills/pace-guard/guard-procedures-common.md +++ b/skills/pace-guard/guard-procedures-common.md @@ -53,6 +53,21 @@ **简要行统一风格**:`[子命令]:关键指标1 · 指标2 · 下一步/趋势` +## 新项目风险扫描兜底 + +当 `.devpace/insights.md` 不存在或内容为空(无 pattern 条目)时,对前 3 个 CR 自动触发基础风险扫描: + +**检测条件**(全部满足): +1. `.devpace/insights.md` 不存在或无 `## defense` / `## success` / `## improvement` 条目 +2. `.devpace/backlog/` 中 CR 文件总数 ≤ 3(含当前创建的) + +**触发行为**: +- 满足条件时,无论 CR 复杂度(S/M/L/XL),均执行基础 3 维扫描(历史教训跳过,仅扫描:依赖影响、架构兼容性、安全敏感度) +- 扫描结果正常写入 risks/ 文件(如发现风险) +- 第 4 个 CR 起恢复正常触发逻辑(依赖 insights.md pattern 匹配) + +**教学触发**:首次兜底扫描时,附 1 句教学——"风险扫描帮你在编码前发现隐患。随着项目积累经验(insights.md),扫描会更精准。" + ## 风险文件创建规则 1. 编号:扫描 `.devpace/risks/` 现有文件,取最大编号 +1(无文件从 001 开始) diff --git a/skills/pace-guard/guard-procedures-scan.md b/skills/pace-guard/guard-procedures-scan.md index cc4f6e2..95d4d78 100644 --- a/skills/pace-guard/guard-procedures-scan.md +++ b/skills/pace-guard/guard-procedures-scan.md @@ -10,7 +10,29 @@ | 依赖影响 | 改动文件的反向依赖链 | 代码文件 import/require/from 分析 | | 架构兼容性 | 变更是否违反项目技术约定 | .devpace/context.md(如存在) | | 范围复杂度 | 实际工作量 vs 预期 | CR 描述 + 项目文件树(Glob 扫描) | -| 安全敏感度 | 涉及认证/授权/数据/加密 | 文件路径关键词(auth/crypto/secret/token/password/key/permission) | +| 安全敏感度 | 涉及认证/授权/数据/加密/OWASP 风险模式 | 文件路径关键词 + 代码模式分析(见安全深度检查规则) | + +### 安全深度检查规则 + +安全敏感度维度分两层检查: + +**Layer 1 — 路径关键词匹配**(所有复杂度): +- 文件路径包含:`auth`/`crypto`/`secret`/`token`/`password`/`key`/`permission`/`session`/`jwt`/`oauth`/`cors`/`csrf`/`sanitize`/`encrypt`/`decrypt` + +**Layer 2 — OWASP 风险模式扫描**(L/XL 或显式 `scan --full` 时): + +| OWASP 分类 | 检测模式 | 严重度 | +|-----------|---------|--------| +| 注入(A03) | SQL 拼接、命令拼接、模板注入模式 | High | +| 认证失效(A07) | 硬编码密钥、明文密码存储、无速率限制 | High | +| 敏感数据暴露(A02) | API 密钥在代码中、日志输出敏感字段、无加密传输 | High | +| 访问控制(A01) | 缺少权限检查的 API 路由、路径遍历风险 | Medium | +| 安全配置(A05) | 调试模式开启、默认密码、过宽 CORS | Medium | +| 依赖漏洞(A06) | 已知 CVE 的依赖版本(如有 lockfile 可检测) | Medium | + +**Layer 2 执行方式**:对 CR 涉及的代码文件执行 `git diff` → 对新增/修改行逐一匹配上述模式 → 命中时标注 OWASP 分类和严重度。 + +**输出**:Layer 1 命中 → 标记 "安全敏感文件 N 个"。Layer 2 命中 → 标记具体 OWASP 分类和位置。 ## 复杂度自适应(A1) diff --git a/skills/pace-init/SKILL.md b/skills/pace-init/SKILL.md index a2690d6..2a4c9de 100644 --- a/skills/pace-init/SKILL.md +++ b/skills/pace-init/SKILL.md @@ -1,7 +1,7 @@ --- description: Use when user says "初始化", "pace-init", "开始追踪", "初始化研发管理", "新项目", "项目管理", "set up devpace", "健康检查 devpace", "重置 devpace", "预览初始化", or wants to set up, verify, or reset project development tracking. NOT for current progress overview (use /pace-status) or starting development (use /pace-dev). allowed-tools: AskUserQuestion, Write, Read, Edit, Glob, Bash -argument-hint: "[项目名称] [full] [--from <路径>...] [--import-insights <路径>] [--verify [--fix]] [--dry-run] [--reset [--keep-insights]] [--export-template] [--from-template <路径>] [--interactive]" +argument-hint: "[项目名称] [full] [--from <路径>...] [--import-insights <路径>] [--verify [--fix]] [--dry-run] [--reset [--keep-insights]] [--export-template] [--from-template <路径>] [--interactive] [--lite]" model: sonnet disable-model-invocation: true hooks: @@ -16,7 +16,7 @@ hooks: # /pace-init — 初始化项目开发节奏管理 -从模板初始化当前项目的 `.devpace/` 目录。默认执行最小初始化(自动检测项目生命周期阶段,按阶段适配行为),`full` 执行分阶段完整流程,`--from` 从文档自动生成功能树。支持 `--verify`(健康检查)、`--reset`(重置)、`--dry-run`(预览)等子命令。 +从模板初始化当前项目的 `.devpace/` 目录。默认执行最小初始化(自动检测项目生命周期阶段,按阶段适配行为),`full` 执行分阶段完整流程(含愿景、战略上下文、OBJ 产品维度引导),`--from` 从文档自动生成功能树(支持 Epic 解析)。支持 `--verify`(健康检查)、`--reset`(重置)、`--dry-run`(预览)等子命令。 ## 输入 @@ -32,6 +32,7 @@ $ARGUMENTS:可选。格式: - `--from-template <路径>` — 从模板初始化 - `--import-insights <路径>` — 导入跨项目经验 - `--interactive` — 强制对话模式(覆盖自动检测行为) +- `--lite` — 轻量模式:跳过 OPP/Epic/BR 层,project.md 只含 OBJ→PF→CR 三层结构,适合个人小项目 ## 流程 @@ -65,6 +66,7 @@ $ARGUMENTS:可选。格式: | `--export-template` / `--from-template` | `init-procedures-template.md` | | (迁移触发时) | `init-procedures-migration.md` | | (检测到 monorepo 信号时) | `init-procedures-monorepo.md` | +| `--lite` | `init-procedures-core.md` + `init-procedures-lite.md` | ## 输出 @@ -72,4 +74,13 @@ $ARGUMENTS:可选。格式: ### 下一步引导(仅正常初始化和 `--full` 时) -确认摘要后追加 1 句引导(§15 教学标记 `init_complete` 去重):"项目已就绪。说'帮我做 [功能名]'开始第一个功能,或 `/pace-plan` 规划迭代。" +确认摘要后追加情境化引导(§15 教学标记 `init_complete` 去重): + +| 项目状态 | 引导内容 | +|---------|---------| +| 有源代码(src/ 或主语言文件 >10 个) | "项目已就绪。建议先 `/pace-biz infer` 从代码推断已有功能和技术债务,再开始规划。" | +| 有需求文档(--from 初始化,功能树已生成) | "项目已就绪。功能树已生成,说'帮我做 [功能名]'开始第一个功能,或 `/pace-plan` 规划迭代。" | +| 空项目(无源代码、无需求文档) | "项目已就绪。说'我想做...'开始头脑风暴需求(`/pace-biz discover`),或直接说'帮我做 [功能名]'快速开始。" | +| 通用(其他情况) | "项目已就绪。说'帮我做 [功能名]'开始第一个功能,`/pace-biz` 规划业务需求,或 `/pace-plan` 规划迭代。" | + +**检测规则**:使用 init-procedures-core.md 的信号检测结果(源文件数、git 信号)判定项目状态,不额外扫描。 diff --git a/skills/pace-init/init-procedures-full.md b/skills/pace-init/init-procedures-full.md index 1bf7422..b76175a 100644 --- a/skills/pace-init/init-procedures-full.md +++ b/skills/pace-init/init-procedures-full.md @@ -89,12 +89,26 @@ ### 阶段 2:业务(可选) -使用 AskUserQuestion 询问:"要现在定义业务目标和成效指标吗?可稍后 /pace-retro 补充。" +使用 AskUserQuestion 询问:"要现在定义业务愿景和目标吗?可稍后 /pace-biz 补充。" 用户选择"现在定义"→ 引导收集: -1. 业务目标(OBJ):项目的核心价值和成功标准 + +**2a. 愿景(写入 project.md 愿景 section)**: +1. 目标用户:谁会用这个产品? +2. 核心问题:他们的什么痛点? +3. 差异化:为什么选你而不是替代方案?(可选,可留空) +4. 成功图景:做成了是什么样?(可选,可留空) + +**2b. 战略上下文(写入 project.md 战略上下文 section)**: +1. 核心假设:这个项目基于什么关键假设?(可选) +2. 外部约束:有什么不可改变的限制条件?(可选) + +**2c. 业务目标(OBJ)(写入 project.md 业务目标 section)**: +1. 目标描述 + 类型(business/product/tech)+ 时间维度(短期/中期/长期) 2. 成效指标(MoS):可衡量的指标列表 -3. 业务需求(BR):高层需求分解 +3. 业务需求(BR):高层需求分解(可选,可稍后 /pace-biz decompose) + +**2d. 创建 opportunities.md**:自动创建空的业务机会看板文件。 用户选择"稍后再说"→ 跳过,project.md 保持桩状态。 diff --git a/skills/pace-init/init-procedures-lite.md b/skills/pace-init/init-procedures-lite.md new file mode 100644 index 0000000..bd12bdf --- /dev/null +++ b/skills/pace-init/init-procedures-lite.md @@ -0,0 +1,48 @@ +# 轻量模式初始化规程 + +> **职责**:`--lite` 参数时的初始化行为覆盖。在 core 流程之后执行。 + +## 行为覆盖 + +### project.md 结构简化 + +轻量模式下 project.md 的价值功能树使用简化结构(跳过 OPP/Epic/BR 层): + +``` +## 价值功能树 + +OBJ-1:[目标名称] +├── PF-001:[功能名]([用户故事])→ (待创建 CR) +├── PF-002:[功能名]([用户故事])→ (待创建 CR) +└── PF-003:[功能名]([用户故事])→ (待创建 CR) +``` + +### 跳过的组件 + +轻量模式下**不创建**以下内容: +- `opportunities.md`(Opportunity 看板) +- `epics/` 目录(Epic 文件) +- `requirements/` 目录(BR 溢出文件) +- project.md 中的 Epic/BR 层级 + +### project.md 标记 + +在 project.md 顶部元数据中添加标记: +``` +mode: lite +``` + +### 与完整模式的兼容 + +- 轻量模式项目可随时升级为完整模式:`/pace-init --upgrade`(将 PF 归组到自动创建的 BR 下) +- `/pace-biz` 在 lite 模式项目中仍可使用——首次创建 Epic/BR 时自动升级为完整模式 +- `/pace-dev`、`/pace-change`、`/pace-plan` 等核心命令在 lite 模式下正常工作(跳过 Epic/BR 相关逻辑) + +### 初始化引导调整 + +轻量模式的初始化对话简化为: +1. 项目名称确认 +2. "这个项目要做什么?"(1-2 句话 → Claude 推断 OBJ + PF) +3. 确认功能列表 → 完成 + +不询问 Vision、Strategy、MoS 等高级概念(这些在 full 模式中引导)。 diff --git a/skills/pace-next/SKILL.md b/skills/pace-next/SKILL.md index 201bc21..ac8cd27 100644 --- a/skills/pace-next/SKILL.md +++ b/skills/pace-next/SKILL.md @@ -1,13 +1,13 @@ --- description: Use when user asks "下一步做什么", "接下来做什么", "该做什么", "什么最重要", "应该先做哪个", "最紧急", "优先级", "推荐做什么", "为什么推荐这个", "pace-next", or wants a recommendation for the most important next action across all domains. NOT for current progress overview (use /pace-status). allowed-tools: Read, Glob, Grep -argument-hint: "[detail|why]" +argument-hint: "[detail|why|journey <模板名>]" model: haiku --- # /pace-next — 下一步导航 -跨域全局导航:综合 CR、迭代、Release、度量、风险等多维信号,推荐当前最该做的 1 件事。 +跨域全局导航:综合 CR、迭代、Release、度量、风险、Epic/Opportunity 等多维信号,推荐当前最该做的 1 件事。 ## 输入 @@ -15,6 +15,9 @@ $ARGUMENTS: - (空)→ 最高优先级 1 条建议(默认,≤ 3 行) - `detail` → 展开候选列表(≤ 8 行,含 top-3 建议) - `why` → 展开推理链(2-5 行,信号扫描 + 优先级对比 + 角色影响 + 备选) +- `journey [模板名]` → 展示完整工作流路径:从当前状态到目标的分步引导 + - 可选模板:`new-feature`(默认)、`iteration`、`hotfix`、`release`、`onboarding` + - 无模板名 → 根据当前项目状态自动选择最匹配的模板 ## 执行路由 @@ -25,6 +28,7 @@ $ARGUMENTS: | (空) | `next-procedures.md` + `next-procedures-output-default.md` | | `detail` | `next-procedures.md` + `next-procedures-output-detail.md` | | `why` | `next-procedures.md` + `next-procedures-output-why.md` | +| `journey` | `next-procedures.md` + `next-procedures-journey.md` | ## 流程 @@ -48,8 +52,10 @@ $ARGUMENTS: | `metrics/dashboard.md` | 最近更新日期 | | `project.md` | MoS、PF/BR/OBJ 映射 | | `integrations/sync-mapping.md` | 同步状态(存在时) | +| `epics/*.md` | Epic 状态、BR 列表 | +| `opportunities.md` | Opportunity 状态 | -提取关键状态字段(不全量读取)。额外采集 CR→PF→BR 价值链映射。 +提取关键状态字段(不全量读取)。额外采集 CR→PF→BR→Epic→OPP 价值链映射。 ### Step 3:优先级决策 @@ -61,8 +67,12 @@ $ARGUMENTS: | In Progress | S3 继续开发(developing CR)· S4 恢复暂停(paused 阻塞解除) | | Delivery | S5 Release 待验证 · S6 风险积压(open > 3)· S7 迭代紧迫(< 2 天且 < 50%)· S8 迭代接近完成(> 80%) | | Strategic | S9 回顾提醒(> 7 天 + merged)· S10 缺陷占比(> 30%)· S11 同步滞后(> 24h)· S12 MoS 达成(> 80%) | -| Growth | S13 功能未开始 · S14 规划新迭代 · S15 全部完成 | -| Idle | S16 无信号 | +| Growth | S13 功能未开始 · S14 规划新迭代 · S15 全部完成 · S16 Epic 需分解 · S17 未评估机会 · S18 功能树稀疏 · S19 范围未定义 · S21 依赖阻塞 · S22 技术债积压 · S24 首次循环引导 | +| Idle | S20 无信号 | + +### Step 3b:旅程路径生成(仅 journey 模式) + +journey 模式跳过 Step 3 的信号优先级决策,改为按旅程模板生成分步路径。详见 `next-procedures-journey.md`。 ### Step 4:经验增强 diff --git a/skills/pace-next/next-procedures-journey.md b/skills/pace-next/next-procedures-journey.md new file mode 100644 index 0000000..af2bf8e --- /dev/null +++ b/skills/pace-next/next-procedures-journey.md @@ -0,0 +1,69 @@ +# 旅程编排输出规程 + +> **职责**:journey 子命令的路径生成和输出格式。建议性编排——展示路径、标识当前位置、引导下一步,但不自动执行。 + +## 旅程模板定义 + +| 模板 | 编排路径 | 适用场景 | +|------|---------|---------| +| `new-feature` | biz discover → decompose → plan next → dev → review → merged | 从零开始交付一个功能 | +| `iteration` | plan next → [dev → review → merged]* → plan close → retro | 完整迭代循环 | +| `hotfix` | feedback report → dev → review → release deploy | 紧急修复 | +| `release` | release create → deploy → verify → close | 标准发布 | +| `onboarding` | init → dev(第一个功能) → review → merged | 新用户首次体验 | + +## 自动模板选择(无模板名时) + +根据项目状态匹配: + +| 条件 | 选择模板 | 理由 | +|------|---------|------| +| backlog/ 无 CR 且无 merged 记录 | `onboarding` | 新项目首次体验 | +| 有 deployed 未 verified Release | `release` | 发布流程待完成 | +| 有 defect/hotfix 类型 developing CR | `hotfix` | 紧急修复进行中 | +| 有活跃迭代(current.md 存在) | `iteration` | 迭代内持续推进 | +| 其他 | `new-feature` | 默认起点 | + +## 路径生成逻辑 + +### Step J1:确定当前位置 + +扫描 `.devpace/` 状态,定位用户在旅程中的当前步骤: + +- 读取 state.md 当前工作 +- 读取 backlog/ CR 状态分布 +- 读取 iterations/current.md(如有) +- 读取 releases/(如有) + +### Step J2:生成路径视图 + +按模板的步骤顺序,标记每步的状态: + +| 标记 | 含义 | +|------|------| +| ✅ | 已完成 | +| 👉 | 当前位置(下一步要做的) | +| ⏳ | 待做 | +| ⏭️ | 可选/按需 | + +### Step J3:输出 + +``` +旅程:[模板名] — [1 句话目标] + +✅ 初始化 — 项目已就绪 +✅ 规划迭代 — 纳入 3 个功能点 +👉 开发 PF-002 — 说"帮我实现 [PF 名]"或 /pace-dev +⏳ 审批 — /pace-review +⏳ 迭代回顾 — /pace-retro + +进度:2/5 步完成 +``` + +## 规则 + +- **只展示不执行**:journey 是建议性的路径展示,不触发任何 Skill 执行 +- **动态更新**:每次调用 journey 都重新扫描状态,路径视图反映最新进度 +- **与默认模式互补**:journey 展示全局路径,默认模式推荐单步行动。用户可交替使用 +- **轻量输出**:路径视图 ≤ 10 行,不展示已完成步骤的详情 +- **无旅程状态文件**:不在 .devpace/ 中持久化旅程状态,完全从项目状态动态推断 diff --git a/skills/pace-next/next-procedures.md b/skills/pace-next/next-procedures.md index bace5b1..0b2fc41 100644 --- a/skills/pace-next/next-procedures.md +++ b/skills/pace-next/next-procedures.md @@ -17,6 +17,8 @@ ## Step 2:信号采集 +**缓存优先**:采集前先检查 `.devpace/.signal-cache`(规则见 `knowledge/signal-collection.md` 信号快照缓存章节)。缓存命中(< 5 分钟)→ 直接使用缓存中的 `triggered` 和 `top_signal`,跳过 Step 2 完整采集。缓存过期或不存在 → 执行以下完整采集步骤。 + **读取策略**: - 使用 Glob 扫描 `backlog/*.md`、`releases/*.md`、`risks/*.md`,再用 Grep 提取状态字段 - 文件不存在或目录为空时,相关信号视为"未命中" diff --git a/skills/pace-plan/SKILL.md b/skills/pace-plan/SKILL.md index 9372d52..02d469c 100644 --- a/skills/pace-plan/SKILL.md +++ b/skills/pace-plan/SKILL.md @@ -10,11 +10,12 @@ agent: pace-pm 管理迭代的关闭和新迭代的规划,补齐产品闭环中的"规划→执行→回顾"循环。 -## 与 /pace-change 的关系 +## 与相关命令的关系 -- `/pace-change`:PF 级需求变更(add/pause/resume/modify) +- `/pace-change`:PF/BR/Epic 级需求变更(add/pause/resume/modify) +- `/pace-biz`:业务规划域(Opportunity→Epic→BR 的创建和分解) - `/pace-plan adjust`:迭代范围级调整(本迭代纳入/移出哪些 PF) -- 典型协同:`/pace-change add` 插入新 PF 后容量超出 → 建议 `/pace-plan adjust` 调整迭代范围 +- 典型协同:`/pace-biz decompose` 分解出 BR/PF → `/pace-plan next` 纳入迭代 → `/pace-dev` 开始开发 ## 输入 @@ -42,8 +43,8 @@ $ARGUMENTS: ### Step 1:评估当前迭代状态 1. 读取 `.devpace/iterations/current.md`(不存在则跳到 Step 3) -2. 读取 `.devpace/project.md` 的价值功能树 -3. 汇总:PF 完成率(✅ 数 / 总数)、未完成 PF 列表及 CR 状态、变更记录条数 +2. 读取 `.devpace/project.md` 的价值功能树(有 Epic 时按 Epic 分组展示) +3. 汇总:PF 完成率(✅ 数 / 总数)、未完成 PF 列表及 CR 状态、变更记录条数、Epic 完成度(如有) 4. 用 1-2 句话告知用户当前迭代进展 ### Step 3:规划新迭代 diff --git a/skills/pace-plan/plan-procedures.md b/skills/pace-plan/plan-procedures.md index 196a407..0c034df 100644 --- a/skills/pace-plan/plan-procedures.md +++ b/skills/pace-plan/plan-procedures.md @@ -69,10 +69,23 @@ ### 3.6 回顾建议直联 +读取上一迭代回顾和最近经验,为新迭代规划提供参考: + +**迭代回顾建议**: 读取上一迭代 `iter-N.md`(N 为最新归档)的回顾 section(如有"下迭代建议"段): - 有建议 → 展示给用户:"上一迭代回顾建议:[内容]" - 无回顾 section 或无建议 → 静默跳过 +**近期经验 Pattern**: +读取 `.devpace/metrics/insights.md`(不存在则跳过),提取最近 3 条 improvement 和 defense pattern: +- 有匹配 → 在 Plan Proposal(Step 3.7)的工作量评估中标注:"经验提示:[pattern 摘要],建议候选 PF 排序时考虑" +- 无匹配 → 静默跳过 + +**回顾 accept 待办**: +检查上一迭代 retro 输出中是否有未执行的 accept 建议(`iter-N.md` 中 `[ ]` 未勾选项): +- 有未执行项 → 提醒:"上一迭代有 N 项回顾建议尚未执行:[摘要]。是否纳入本迭代?" +- 全部已执行或无 accept 项 → 静默跳过 + ### 3.7 智能规划建议(Plan Proposal) 取代原有的逐项填空模式,Claude 先生成建议方案,用户确认或调整。 diff --git a/skills/pace-pulse/pulse-procedures-core.md b/skills/pace-pulse/pulse-procedures-core.md index f766f16..894f767 100644 --- a/skills/pace-pulse/pulse-procedures-core.md +++ b/skills/pace-pulse/pulse-procedures-core.md @@ -120,3 +120,54 @@ ### 信号冷却期 - 被忽略的信号(用户未执行建议命令)设置 3 个 checkpoint 冷却期 - 冷却期内不再触发同类信号(除非严重度升级) + +## 自主级别评估(每 5 个 CR merged 后触发) + +### 触发条件 + +当 `.devpace/backlog/` 中 merged CR 数量达到 5 的倍数(5, 10, 15...)时触发评估。通过 state.md 教学标记中的 `autonomy_eval_at_N` 记录上次评估点,避免重复。 + +### 评估维度 + +读取 `.devpace/metrics/dashboard.md`(不存在则跳过评估): + +| 指标 | 升级阈值(→ 更自主) | 降级阈值(→ 更辅助) | +|------|---------------------|---------------------| +| Gate 1 一次通过率 | > 80% | < 50% | +| Gate 2 一次通过率 | > 70% | < 40% | +| 打回率(rejected/total) | < 15% | > 40% | +| 用户纠正频率(人工修改 CR 文件次数/总 CR) | < 10% | > 30% | + +### 决策逻辑 + +| 当前级别 | 满足升级条件 | 满足降级条件 | 动作 | +|---------|------------|------------|------| +| 辅助 | 全部 4 项达标 | — | 建议升级到"标准" | +| 标准 | 全部 4 项达标 | — | 建议升级到"自主" | +| 标准 | — | 任意 2+ 项触发 | 建议降级到"辅助" | +| 自主 | — | 任意 2+ 项触发 | 建议降级到"标准" | +| 任意 | 不满足 | 不满足 | 维持当前级别,不输出 | + +### 输出格式 + +建议升级时: +``` +自主级别建议:当前"[级别]" → 建议升级到"[级别]" +依据:Gate 通过率 N%、打回率 N%(连续 5 个 CR 表现稳定) +确认升级?(升级后 Claude 在 [具体行为变化] 时会更自主) +``` + +建议降级时: +``` +自主级别建议:当前"[级别]" → 建议调整到"[级别]" +依据:近期打回率 N%、Gate 通过率 N%,建议增加引导 +确认调整? +``` + +### 规则 + +- **只建议不自动**:所有级别变更必须用户确认 +- **静默优先**:维持当前级别时不输出任何内容 +- **最低频率**:每 5 个 merged CR 最多评估 1 次 +- 用户确认后 → 更新 project.md 的自主级别字段 +- 用户拒绝 → 记录 `autonomy_eval_at_N` 标记,下次 5 个 CR 后再评估 diff --git a/skills/pace-pulse/pulse-procedures-session-start.md b/skills/pace-pulse/pulse-procedures-session-start.md index 4a9e60a..436a552 100644 --- a/skills/pace-pulse/pulse-procedures-session-start.md +++ b/skills/pace-pulse/pulse-procedures-session-start.md @@ -19,6 +19,7 @@ - `.devpace/metrics/dashboard.md` 的"最近更新"日期(**目录不存在时跳过**) - `.devpace/backlog/` 中状态为 `in_review` 的 CR 数量 +- `.devpace/backlog/` 中状态为 `merged` 的 CR 数量(**目录不存在或无任何 merged CR 时视为 0,用于 onboarding 信号判定**) - `.devpace/iterations/current.md`(**文件不存在时跳过迭代相关检测**) ## 信号优先级(分层摘要,≤3 行) @@ -29,6 +30,7 @@ | 优先级 | 条件 | 提醒 | |--------|------|------| +| 0 | `.devpace/` 存在 + backlog/ 中 merged CR = 0(目录不存在或为空也视为 0) | "首次使用——试试说"帮我实现 [功能名]"开始第一个功能,或用 `/pace-biz discover` 从业务目标出发" | | 1 | in_review CR > 0 | "有 N 个变更等待 review——`/pace-review`" | | 2 | deployed 未 verified Release | "有未验证的 Release——`/pace-release verify`" | | 3 | 迭代完成率 > 80% | "迭代接近完成——`/pace-plan next`" | @@ -40,3 +42,7 @@ | 9 | dashboard.md 最近更新 > 14 天 + MoS 有未勾选项 | "距上次回顾已超 2 周——`/pace-retro`" | | 10 | Snooze 条目触发条件满足(CR 事件表/迭代变更记录) | "之前延后的变更触发条件已满足(详情见 `pulse-procedures-snooze.md`)" | | 11 | 用户对话含运维关键词 + pace-feedback 未在本会话使用 | "检测到生产问题描述——`/pace-feedback report`" | + +## 缓存写入 + +信号检测完成后,将结果写入 `.devpace/.signal-cache`(格式见 `knowledge/signal-collection.md` 信号快照缓存章节)。写入失败时静默跳过,不影响信号输出。 diff --git a/skills/pace-release/SKILL.md b/skills/pace-release/SKILL.md index f16cc9b..71f1280 100644 --- a/skills/pace-release/SKILL.md +++ b/skills/pace-release/SKILL.md @@ -29,7 +29,7 @@ $ARGUMENTS: - `changelog` → 仅生成 CHANGELOG.md - `version` → 仅更新版本文件 - `tag` → 仅创建 Git Tag / GitHub Release -- `notes` → 生成面向用户的 Release Notes(按 BR/PF 组织,支持 `--role biz|ops|pm`) +- `notes` → 生成面向用户的 Release Notes(按 Epic→BR→PF 组织,支持 `--role biz|ops|pm`) - `branch` → 管理发布分支(创建 / PR / 合并) - `rollback` → 记录回滚(deployed 状态下出现严重问题时) - `status history` → 发布历史时间线(跨 Release 纵向视图 + DORA 趋势) diff --git a/skills/pace-retro/SKILL.md b/skills/pace-retro/SKILL.md index 7dc4a29..8009c1d 100644 --- a/skills/pace-retro/SKILL.md +++ b/skills/pace-retro/SKILL.md @@ -1,7 +1,7 @@ --- -description: Use when user says "回顾", "复盘", "度量", "retro", "总结", "数据分析", "DORA", "质量报告", "交付效率", "度量报告", "趋势", "中期检查", "对比", "pace-retro", or at iteration end when reviewing progress and metrics. +description: Use when user says "回顾", "复盘", "度量", "retro", "总结", "数据分析", "DORA", "质量报告", "交付效率", "度量报告", "趋势", "中期检查", "对比", "预测", "forecast", "能按时交付吗", "交付概率", "瓶颈", "pace-retro", or at iteration end when reviewing progress and metrics. allowed-tools: Read, Write, Edit, Glob, Bash -argument-hint: "[update|focus <维度>|compare|history|mid|accept]" +argument-hint: "[update|focus <维度>|compare|history|mid|accept|forecast]" context: fork agent: pace-analyst --- @@ -35,11 +35,12 @@ agent: pace-analyst $ARGUMENTS: - (空)→ 当前迭代完整回顾 - `update` → 仅刷新度量数据,不生成报告(带变化反馈) -- `focus <维度>` → 聚焦回顾:quality | delivery | dora | defects | value | knowledge +- `focus <维度>` → 聚焦回顾:quality | delivery | dora | defects | value | knowledge | epic - `compare` → 对比回顾:当前迭代 vs 上一迭代的关键指标 delta - `history` → 趋势总览:跨 3+ 迭代的趋势线(基于 dashboard.md 历史快照) - `mid` → 中期检查:轻量版回顾,不更新 dashboard 基准线 - `accept` → 确认回顾建议:执行 MoS 更新等上一次回顾建议的操作 +- `forecast` → 交付预测:基于历史模式预测迭代交付概率、识别瓶颈、发出风险预警 ### 执行路由表 @@ -60,6 +61,7 @@ $ARGUMENTS: | `history` | `retro-procedures-history.md`(自包含,不加载 common) | 跨迭代趋势 | | `mid` | `retro-procedures-mid.md`(自包含,不加载 common) | 中期轻量检查 | | `accept` | `retro-procedures-accept.md`(自包含,不加载 common) | 执行建议操作 | +| `forecast` | `retro-procedures-forecast.md`(自包含,不加载 common) | 交付预测分析 | **路由规则**:只读取路由表映射的 procedures 文件,不加载其他文件。compare/history/mid/accept 自包含,不加载 common。 diff --git a/skills/pace-retro/retro-procedures-forecast.md b/skills/pace-retro/retro-procedures-forecast.md new file mode 100644 index 0000000..750dbe9 --- /dev/null +++ b/skills/pace-retro/retro-procedures-forecast.md @@ -0,0 +1,103 @@ +# 预测性项目管理规程 + +> **职责**:/pace-retro forecast 子命令——基于历史数据和当前状态,预测迭代交付概率、识别瓶颈、发出风险预警。 + +## §0 速查卡片 + +| 输入 | 输出 | 数据源 | +|------|------|--------| +| `/pace-retro forecast` | 交付概率 + 瓶颈 + 风险预警 | dashboard.md + backlog/ + iterations/ + insights.md + risks/ | + +## 数据采集 + +### Step 1: 收集历史模式 + +1. **CR 周期数据**:从 dashboard.md 历史快照提取已完成 CR 的平均周期(created→merged 天数) +2. **Gate 通过率**:Gate 1/2/3 首次通过率(从 CR 事件表统计) +3. **变更频率**:当前迭代的 change 事件数量(iterations/current.md 变更记录) +4. **风险趋势**:`.devpace/risks/` 中 open 状态风险数量和严重度分布 +5. **经验模式**:insights.md 中与当前 CR 类似的 defense/improvement pattern + +### Step 2: 评估当前状态 + +1. **迭代进度**:已完成 PF 数 / 总 PF 数 = 功能完成率 +2. **时间进度**:已过天数 / 迭代总天数 = 时间消耗率 +3. **进行中 CR**:当前 developing/verifying/in_review 状态的 CR 数量和停留时间 +4. **阻塞 CR**:paused 或有未解决依赖的 CR + +## 预测算法 + +### 交付概率计算 + +``` +基础概率 = 功能完成率 / 时间消耗率 + +调整因子: + - 进行中 CR 平均停留 > 历史均值 × 1.5 → -15% + - 有 High 风险未解决 → -20% + - 本迭代变更频率 > 历史均值 × 2 → -10% + - Gate 首次通过率 > 80% → +5% + - 有匹配的 defense pattern → -5%(历史教训预警) + +最终概率 = clamp(基础概率 × (1 + 调整因子之和), 5%, 95%) +``` + +### 概率分级 + +| 概率 | 等级 | 标记 | +|------|------|------| +| ≥ 80% | 高信心 | 🟢 | +| 50-79% | 中等风险 | 🟡 | +| < 50% | 高风险 | 🔴 | + +### 瓶颈识别 + +扫描以下瓶颈模式: + +| 模式 | 检测规则 | 建议 | +|------|---------|------| +| CR 滞留 | developing 停留 > 历史均值 × 2 | "CR-xxx 开发耗时异常,建议评估是否需要拆分" | +| Gate 阻塞 | 同一 CR Gate 失败 ≥ 2 次 | "CR-xxx Gate N 反复失败,建议聚焦质量问题" | +| 依赖阻塞 | CR 被 paused/blocked 且有下游依赖 | "CR-xxx 阻塞了 N 个下游 CR" | +| 范围蔓延 | 迭代 PF 数 > 规划时 × 1.3 | "迭代范围增长 30%+,建议评估容量" | + +### 风险预警 + +基于趋势数据发出预警: + +| 预警 | 触发条件 | 建议 | +|------|---------|------| +| 交付延迟 | 概率 < 50% 且时间消耗 > 60% | "/pace-plan adjust 调整范围" | +| 质量下降 | Gate 通过率连续下降 | "聚焦代码质量,考虑增加审查" | +| 技术债务积累 | tech-debt CR 连续 2 迭代超预算 | "提高 tech-debt-budget 或暂停新功能" | +| 风险积压 | open High 风险 ≥ 3 | "/pace-guard report 查看详情并制定解决计划" | + +## 输出格式 + +```markdown +## 迭代交付预测 + +**交付概率**:[🟢/🟡/🔴] [N]% +**评估基础**:功能完成 X/Y · 时间消耗 A/B 天 · 进行中 CR Z 个 + +### 调整因子 +| 因子 | 影响 | 说明 | +|------|------|------| +| [因子名] | [+/-N%] | [原因] | + +### 瓶颈(如有) +1. [瓶颈描述] → 建议:[行动] + +### 风险预警(如有) +- [⚠️ 预警描述] → [建议行动] + +### 建议 +- [最优先的 1-3 条行动建议] +``` + +## 规则 + +- **只读**:forecast 不修改任何文件,仅输出分析报告 +- **数据不足时降级**:历史快照 < 2 条时,跳过趋势分析,仅基于当前状态评估 +- **不替代人类判断**:概率是参考值,标注"基于历史数据的 AI 预测,仅供参考" +- **与 mid 互补**:mid 是轻量健康检查(不含预测),forecast 是深度预测分析 diff --git a/skills/pace-retro/retro-procedures.md b/skills/pace-retro/retro-procedures.md index cba67fd..78afce5 100644 --- a/skills/pace-retro/retro-procedures.md +++ b/skills/pace-retro/retro-procedures.md @@ -108,6 +108,7 @@ | 条件段 | 出现条件 | 数据源 | |--------|---------|--------| | 风险趋势 | `.devpace/risks/` 存在 | 风险文件 + insights.md defense | +| 技术债务趋势 | 存在 type:tech-debt CR | backlog/ tech-debt CR + project.md 预算配置 | | 缺陷分析 | 存在 type:defect/hotfix CR | backlog/ defect CR | | MoS 进展评估 | project.md 有 MoS | project.md + dashboard.md | | DORA 代理度量 | `.devpace/releases/` 存在 | Release 文件 | @@ -152,6 +153,36 @@ --- +## 技术债务趋势(存在 type:tech-debt CR 时) + +数据采集: +1. `.devpace/backlog/` 中 type 为 `tech-debt` 的 CR 文件 +2. `dashboard.md` 历史快照中 tech-debt CR 数量 +3. `project.md` 配置中 `tech-debt-budget` 值(默认 20%) + +输出格式(追加到回顾报告中): + +``` +## 技术债务趋势 + +- 当前 tech-debt CR:{{N}} 个(完成 {{done}} · 进行中 {{wip}} · 待做 {{todo}}) +- 债务预算使用率:{{actual}}% / {{budget}}%({{over/under}} 预算) +- 趋势:{{上升/下降/稳定}}(对比上迭代 {{prev}} 个) +``` + +趋势判定: +- 当前 > 上迭代 × 1.2 = 上升(债务积累) +- 当前 < 上迭代 × 0.8 = 下降(债务偿还有效) +- 其他 = 稳定 + +持久化规则: +- tech-debt CR 数量和预算使用率写入 `dashboard.md` 历史快照 +- 连续 3 迭代超预算 → 在改进建议中追加"建议提高 tech-debt-budget 或加速偿还" + +条件渐进暴露:无 tech-debt 类型 CR 时,整个技术债务趋势段**静默跳过**。 + +--- + ## 经验沉淀规则 diff --git a/skills/pace-review/SKILL.md b/skills/pace-review/SKILL.md index acc83a6..54a0ca0 100644 --- a/skills/pace-review/SKILL.md +++ b/skills/pace-review/SKILL.md @@ -15,7 +15,7 @@ hooks: # /pace-review — 生成 Review 摘要 -为到达 in_review 状态的变更请求生成人类可读的审核摘要。 +为到达 in_review 状态的变更请求生成人类可读的审核摘要。追溯链展示至 Epic 层(CR→PF→BR→Epic→OBJ)。 ## 输入 diff --git a/skills/pace-review/review-procedures-gate.md b/skills/pace-review/review-procedures-gate.md index 236d263..b64a94f 100644 --- a/skills/pace-review/review-procedures-gate.md +++ b/skills/pace-review/review-procedures-gate.md @@ -157,26 +157,49 @@ Gate 3 人类审批前,生成变更到验收条件的映射报告,降低审 - **与 Gate 2 互补**:Gate 2 逐条验收比对检查"做没做到",累积 Diff 报告展示"怎么做到的"——两者互补 - **嵌入摘要**:报告作为 Review 摘要的一部分呈现给人类审批者,不独立输出 +## 语义一致性评分 + +Review 摘要中自动计算代码变更与验收标准的语义对齐度。 + +### 计算步骤 + +1. 读取 CR 关联 PF 的验收标准列表 +2. 对每个验收标准,评估当前 CR 的代码变更是否有直接实现: + - 有对应代码变更(函数/文件/模块可关联到标准描述)→ 计为"已覆盖" + - 代码变更方向与标准描述不一致 → 标记为"偏离" +3. 计算一致性评分:已覆盖 / 总标准数 + +### 评分分级 + +| 比例 | 等级 | 说明 | +|------|------|------| +| ≥ 80% 已覆盖且无偏离 | 🟢 高 | 代码实现与需求高度对齐 | +| 50-79% 已覆盖或有少量偏离 | 🟡 中 | 部分对齐,需关注未覆盖项 | +| < 50% 已覆盖或有多项偏离 | 🔴 低 | 可能存在需求理解偏差 | + +### 规则 + +- **S CR 简化**:仅检查意图 section 的验收条件(通常 1-3 条),不需要 PF 级标准 +- **无 PF 关联时跳过**:不显示此段 +- **与 Gate 2 意图匹配互补**:意图匹配检查"做没做到",语义一致性量化"做对了多少" +- **偏离项突出**:有偏离时在摘要中列出具体标准和实际实现方向 + +--- + ## accept 报告结构化消费 当 CR 验证证据 section 包含 `/pace-test accept` 的验收验证报告时,Review 摘要自动提取关键信号。 +**数据契约**:accept 报告的格式定义见 `knowledge/_schema/accept-report-contract.md`(生产方和消费方的共享接口)。 + ### 提取步骤 +按 `accept-report-contract.md` "消费方提取规则"执行: + 1. 读取 CR 文件的"验证证据"section -2. 如果包含"验收验证报告"标题 → 提取以下数据: - - **逐条验证结果表**:统计通过/未通过/需人工数量 + 验证级别分布 - - **测试预言审查表**(如存在):统计有效覆盖/弱覆盖/虚假覆盖数量 - - **合理化自审计**(如存在):提取命中合理化模式的数量 - - **置信度数据**(如存在):统计 L2 条目的 High/Medium/Low 分布 +2. 如果包含"验收验证报告"标题 → 按契约定义的提取项提取汇总数据 3. 如果"验证证据"不包含 accept 报告 → 跳过此 section(不显示、不提示) -### 消费原则 - -- **紧凑优先**:Review 摘要中仅显示汇总数据(1-3 行),不复制完整 accept 报告 -- **风险聚焦**:如有未通过项或弱覆盖 → 在"风险点"段追加相关信息 -- **不重复验证**:Review 消费已有的 accept 报告,不重新执行验收验证 - ## M 级:标准摘要格式 中等复杂度 CR 使用标准格式,包含意图匹配和对抗审查。 @@ -209,6 +232,8 @@ Gate 3 人类审批前,生成变更到验收条件的映射报告,降低审 **累积变更报告**: [模块分组 + 验收条件映射,格式见上方] +**语义一致性**:[🟢高/🟡中/🔴低] N/M 验收标准有直接代码实现 · 偏离项:[列表或"无"] + **质量检查状态**: ✅ [已通过的自动质量检查项] ⏳ 人类审批 @@ -251,6 +276,8 @@ Gate 3 人类审批前,生成变更到验收条件的映射报告,降低审 **累积变更报告**: [模块分组 + 验收条件映射,格式见上方] +**语义一致性**:[🟢高/🟡中/🔴低] N/M 验收标准有直接代码实现 · 偏离项:[列表或"无"] + **质量检查状态**: ✅ [已通过的自动质量检查项] ⏳ 人类审批 diff --git a/skills/pace-status/SKILL.md b/skills/pace-status/SKILL.md index 9864d0a..3ce4840 100644 --- a/skills/pace-status/SKILL.md +++ b/skills/pace-status/SKILL.md @@ -29,7 +29,7 @@ $ARGUMENTS: | `detail` | `status-procedures-detail.md` | 功能树格式 + 同步标记 + 角色适配 + 导航 | | `trace <名称>` | `status-procedures-trace.md` | 匹配规则 + 3 种追溯格式 + 导航 | | `metrics [类别]` | `status-procedures-metrics.md` | 实时快照(≠ pace-retro 回顾报告)+ 趋势箭头 + 类别聚焦 + 导航 | -| `tree` | `status-procedures-tree.md` | 完整价值链格式 + 导航 | +| `tree` | `status-procedures-tree.md` | 完整价值链格式(含 Epic 链接层)+ 导航 | | `since <时间>` | `status-procedures-since.md` | 时间标记解析 + 数据采集 + 组合规则 | | `chain` | `status-procedures-chain.md` | 价值链定位格式 + 导航 | | `<关键词>` | `status-procedures-keyword.md` | 搜索逻辑 + fallback 引导 | diff --git a/skills/pace-status/status-procedures-overview.md b/skills/pace-status/status-procedures-overview.md index e4ff2c6..09a4ff9 100644 --- a/skills/pace-status/status-procedures-overview.md +++ b/skills/pace-status/status-procedures-overview.md @@ -18,6 +18,8 @@ ## 建议下一步(概览末尾附加) +**缓存优先**:概览信号采集前先检查 `.devpace/.signal-cache`(规则见 `knowledge/signal-collection.md`)。缓存命中(< 5 分钟)→ 使用缓存的 `top_signal` 字段作为建议行信号源。缓存过期 → 执行完整采集。 + **定位**:/pace-next 的**轻量子集**——仅 top-1 信号 + 命令指引,不含推理。多信号竞争取最高优先级 1 条并追加候选计数。 **权威源**:`knowledge/signal-priority.md`。本表仅暴露 `status-subset = ✅` 的信号子集,编号和条件与权威源一致。 diff --git a/skills/pace-sync/SKILL.md b/skills/pace-sync/SKILL.md index 54dafa1..e52bb53 100644 --- a/skills/pace-sync/SKILL.md +++ b/skills/pace-sync/SKILL.md @@ -1,5 +1,5 @@ --- -description: "Use when user wants to sync devpace state with external tools (GitHub/Linear/Jira), says '同步/sync/push/pull/关联 Issue/配置同步/setup/解除关联/unlink/创建 Issue/create/同步状态/status', or /pace-sync. NOT for internal devpace state changes (use /pace-dev) or release operations (use /pace-release)" +description: "Use when user wants to sync devpace state with external tools (GitHub/Linear/Jira), says '同步/sync/push/pull/关联 Issue/配置同步/setup/解除关联/unlink/创建 Issue/create/同步状态/status/CI/构建/build/pipeline/workflow/GitHub Actions', or /pace-sync. NOT for internal devpace state changes (use /pace-dev) or release operations (use /pace-release)" argument-hint: "[子命令] [参数]" allowed-tools: Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion model: sonnet @@ -35,6 +35,9 @@ model: sonnet | unlink | CR-ID | 解除 CR 与外部实体的关联 | ✅ | | create | CR-ID | 从 CR 元数据创建外部 Issue 并自动关联 | ✅ | | pull | CR-ID | 查询外部状态,提示用户是否更新 devpace(轻量 MVP) | ✅ | +| ci status | — | 查看当前分支的 CI/CD 运行状态 | ✅ | +| ci trigger | [workflow] | 手动触发 GitHub Actions workflow | ✅ | +| ci logs | [run-id] | 查看指定运行的日志摘要 | ✅ | | sync | [CR-ID] | 双向同步 | Phase 20 | | resolve | CR-ID | 解决同步冲突 | Phase 20 | | status | — | 查看所有 CR 的同步状态和外部链接 | ✅ | @@ -56,6 +59,7 @@ model: sonnet | `push --dry-run` | sync-procedures-push.md + sync-procedures-push-advanced.md | | `pull` | sync-procedures-pull.md | | `status` / `unlink` / (空) | sync-procedures-status.md | +| `ci status` / `ci trigger` / `ci logs` | sync-procedures-ci.md | | `sync` / `resolve` | Phase 20,暂不支持 | Gate 结果同步(被动触发):sync-procedures-push.md + sync-procedures-push-advanced.md diff --git a/skills/pace-sync/sync-procedures-ci.md b/skills/pace-sync/sync-procedures-ci.md new file mode 100644 index 0000000..3239ec8 --- /dev/null +++ b/skills/pace-sync/sync-procedures-ci.md @@ -0,0 +1,86 @@ +# CI/CD 集成规程 + +> **职责**:通过 `gh` CLI 实现 GitHub Actions 的状态查询、触发和日志查看。 + +## 前置检测 + +所有 ci 子命令执行前: + +1. 检查 `gh` CLI 是否可用:`which gh`(不可用 → 提示安装 GitHub CLI) +2. 检查 `gh auth status`(未认证 → 提示 `gh auth login`) +3. 检查 `.github/workflows/` 目录是否存在(不存在 → 提示无 GitHub Actions 配置) + +## ci status + +查看当前分支最近的 CI 运行状态。 + +**执行**: +```bash +gh run list --branch $(git branch --show-current) --limit 5 +``` + +**输出格式**: +``` +CI 状态(当前分支:main): +✅ Build & Test — 2 分钟前 — 通过 +❌ Deploy — 5 分钟前 — 失败(查看详情:gh run view ) +⏳ Lint — 进行中 + +最近 5 次运行中 4 次通过(80%) +``` + +**与 Gate 4 集成**:pace-dev Gate 4 可调用本规程的 status 逻辑替代原有的简单查询。在 status 输出末尾追加:"Gate 4 CI 检查:[通过/失败]"。 + +## ci trigger + +手动触发 GitHub Actions workflow。 + +**执行**: +1. 无参数 → 列出可用 workflow:`gh workflow list` +2. 有参数 → 触发指定 workflow:`gh workflow run --ref $(git branch --show-current)` +3. 触发后轮询状态(最多 3 次,间隔 10 秒):`gh run list --workflow --limit 1` + +**输出格式**: +``` +已触发 workflow:[名称] +运行 ID:[id] +状态:⏳ 进行中(预计 2 分钟) + +查看实时日志:gh run watch +``` + +**安全约束**: +- 触发前确认:"即将触发 [workflow 名] 在 [分支] 上运行。确认?" +- 用户确认后才执行 + +## ci logs + +查看指定运行的日志摘要。 + +**执行**: +1. 有 run-id → `gh run view --log-failed`(优先显示失败日志) +2. 无 run-id → 取最近一次运行:`gh run list --limit 1` 后自动 view + +**输出格式**: +``` +运行 #[id]:[workflow 名] — [状态] +失败步骤:[step 名] +错误摘要:[最后 10 行日志] + +完整日志:gh run view --log +``` + +## 容错 + +| 异常 | 处理 | +|------|------| +| `gh` 未安装 | 提示:"需要 GitHub CLI(gh)。安装:" | +| 未认证 | 提示:"运行 `gh auth login` 完成认证" | +| 无 workflow | 提示:"未找到 .github/workflows/,项目尚未配置 GitHub Actions" | +| 非 GitHub 仓库 | 提示:"当前项目不是 GitHub 仓库,ci 命令仅支持 GitHub Actions" | +| 网络错误 | 提示具体错误,建议检查网络连接 | + +## 与现有能力的关系 + +- **Gate 4**:现有 Gate 4 通过 `checks-format.md` 中的 `ci-status-cmd` 查询 CI 状态。ci status 提供更丰富的信息,可作为 Gate 4 的增强数据源 +- **pace-release deploy**:Release 部署步骤可在 deploy 后自动调用 ci status 确认部署 CI 是否通过 diff --git a/skills/pace-trace/SKILL.md b/skills/pace-trace/SKILL.md index 74d44c7..5713120 100644 --- a/skills/pace-trace/SKILL.md +++ b/skills/pace-trace/SKILL.md @@ -1,7 +1,7 @@ --- -description: Use when user asks "why did devpace decide X", "追溯", "为什么这样做", "决策记录", "决策原因", wants to see AI decision trail, or says /pace-trace [CR] [gate/decision] -allowed-tools: Read, Glob, Grep -argument-hint: "[CR 名称或编号] [gate1 质量检查|gate2 集成验证|gate3 审批摘要|intent 意图推断|change 变更影响|risk 风险评估|autonomy 自主决策|timeline 决策时间线]" +description: Use when user asks "why did devpace decide X", "追溯", "为什么这样做", "决策记录", "决策原因", "架构决策", "ADR", "技术选型", wants to see AI decision trail or manage architecture decisions, or says /pace-trace [CR] [gate/decision/arch] +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion +argument-hint: "[CR 名称或编号] [gate1|gate2|gate3|intent|change|risk|autonomy|timeline|arch]" model: haiku --- @@ -15,7 +15,7 @@ model: haiku |------|-----------|---------| | `/pace-trace [CR] [type]` | "Claude 为什么这样判断?" | 单个决策的审计轨迹 | | `/pace-trace [CR] timeline` | "这个 CR 经历了什么?" | CR 全生命周期决策时间线 | -| `/pace-status trace ` | "这个目标完成到哪了?" | 价值链完成度(OBJ→BR→PF→CR) | +| `/pace-status trace ` | "这个目标完成到哪了?" | 价值链完成度(OBJ→Epic→BR→PF→CR→OPP) | | `/pace-theory why` | "devpace 为什么这样设计?" | 系统方法论解释 | ## 输入 @@ -40,6 +40,7 @@ model: haiku | `gate1` / `gate2` / `gate3` | `trace-procedures-gates.md` | Gate 类型输出要点 + 导航建议 | | `intent` / `change` / `risk` / `autonomy` | `trace-procedures-analysis.md` | 分析类输出调整 + 导航建议 | | `timeline` | `trace-procedures-timeline.md`(自包含,不加载 common) | CR 全生命周期决策时间线 | +| `arch` | `trace-procedures-arch.md`(自包含,不加载 common) | 架构决策记录(ADR)管理 | | 无指定 | 查 CR 事件表最新 checkpoint 类型,匹配上述路由 | 先确定类型再加载对应文件 | **路由规则**:只读取路由表映射的 procedures 文件,不加载其他文件。timeline 自包含,不加载 common。 diff --git a/skills/pace-trace/trace-procedures-arch.md b/skills/pace-trace/trace-procedures-arch.md new file mode 100644 index 0000000..49a53f8 --- /dev/null +++ b/skills/pace-trace/trace-procedures-arch.md @@ -0,0 +1,83 @@ +# 架构决策记录规程 + +> **职责**:/pace-trace arch 子命令——创建、查看和管理架构决策记录(ADR)。 + +## §0 速查卡片 + +| 操作 | 命令 | 说明 | +|------|------|------| +| 创建 ADR | `/pace-trace arch "决策标题"` | 交互式引导创建 ADR | +| 查看 ADR | `/pace-trace arch ADR-NNN` | 查看指定 ADR | +| 列出所有 | `/pace-trace arch list` | 列出所有 ADR 及状态 | +| 取代 ADR | `/pace-trace arch supersede ADR-NNN` | 标记旧 ADR 为 superseded | + +## 从 pace-dev 自动触发 + +当 L/XL CR 的技术方案评审(`dev-procedures-intent.md` Phase B0)满足 ADR 触发条件时: +- pace-dev 在 merged 后的连锁更新中提醒:"此 CR 涉及架构决策,建议 `/pace-trace arch` 记录" +- 用户确认 → 进入标准 ADR 创建流程(预填 CR 编号和方案信息) +- 用户跳过 → 在 CR 事件表标注"ADR 建议未采纳" + +## 创建流程 + +### Step 1: 确定 ADR 编号 + +1. 读取 `.devpace/decisions/` 目录 +2. 找到最大编号 → 新编号 = 最大 + 1 +3. 目录不存在 → 创建目录 + ADR-001 + +### Step 2: 交互式引导 + +引导用户填写以下信息(按 `knowledge/_schema/adr-format.md` 格式): + +1. **决策标题**:从 $ARGUMENTS 获取,或询问 +2. **上下文**:面临什么技术问题? +3. **决策**:选择了什么方案? +4. **理由**:为什么选择这个? +5. **替代方案**(可选):考虑过哪些? + +### Step 3: 写入文件 + +1. 按 adr-format.md 模板生成文件 +2. 状态设为 `accepted`(用户已确认决策) +3. 如有关联 CR → 同时在 CR 事件表记录 `ADR-NNN created` + +### Step 4: 输出确认 + +``` +已创建架构决策:ADR-NNN — [标题] +状态:accepted +位置:.devpace/decisions/ADR-NNN.md +``` + +## 查看流程 + +1. 读取指定 ADR 文件 +2. 格式化输出(标题、状态、日期、摘要) +3. 如 ADR 被取代 → 显示取代者链接 + +## 列表流程 + +1. 扫描 `.devpace/decisions/ADR-*.md` +2. 提取每个 ADR 的标题和状态 +3. 表格输出: + +``` +| # | 标题 | 状态 | 日期 | +|---|------|------|------| +| ADR-001 | 选择 PostgreSQL | accepted | 2026-01-15 | +| ADR-002 | 微服务架构 | superseded → ADR-005 | 2026-02-01 | +``` + +## 取代流程 + +1. 读取目标 ADR +2. 将状态改为 `superseded` +3. 填写"被取代"字段 → 指向新 ADR +4. 引导创建新 ADR(替代方案) + +## 规则 + +- ADR 一旦 accepted,内容不可修改(只能 supersede 后创建新版本) +- 目录不存在时自动创建(首次使用无门槛) +- 与 `/pace-trace timeline` 互补:timeline 追踪 CR 级决策,arch 追踪架构级决策 diff --git a/tests/conftest.py b/tests/conftest.py index e39a7ef..46dcc04 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,6 +12,7 @@ # ── Skill / Schema / Template inventories ────────────────────────────────── SKILL_NAMES = [ + "pace-biz", "pace-change", "pace-dev", "pace-feedback", @@ -32,7 +33,7 @@ "pace-trace", ] -SCHEMA_FILES = ["checks-format.md", "context-format.md", "cr-format.md", "insights-format.md", "integrations-format.md", "iteration-format.md", "pf-format.md", "project-format.md", "release-format.md", "risk-format.md", "state-format.md", "sync-mapping-format.md", "test-baseline-format.md", "test-strategy-format.md"] +SCHEMA_FILES = ["accept-report-contract.md", "adr-format.md", "br-format.md", "checks-format.md", "context-format.md", "cr-format.md", "epic-format.md", "incident-format.md", "insights-format.md", "integrations-format.md", "iteration-format.md", "opportunity-format.md", "pf-format.md", "project-format.md", "release-format.md", "risk-format.md", "state-format.md", "sync-mapping-format.md", "test-baseline-format.md", "test-strategy-format.md"] # ── Eval directories (per-Skill under tests/evaluation/) ──────────────── EVAL_DIR = DEVPACE_ROOT / "tests" / "evaluation" diff --git a/tests/evaluation/pace-biz/evals.json b/tests/evaluation/pace-biz/evals.json new file mode 100644 index 0000000..cc4013e --- /dev/null +++ b/tests/evaluation/pace-biz/evals.json @@ -0,0 +1,197 @@ +{ + "skill_name": "pace-biz", + "description": "Behavioral evaluation for /pace-biz (13 scenarios, ~80 assertions)", + "evals": [ + { + "id": 1, "name": "opportunity-capture", + "prompt": "有个客户反馈说导出功能太慢,经常超时,希望能优化", + "expected_output": "Captures the feedback as a business opportunity. Creates OPP entry with inferred source type (customer-feedback), writes to opportunities.md, and suggests next steps (create Epic or link to existing Epic).", + "files": [], "env": "ENV-BIZ-A", + "assertions": [ + {"text": "Creates an OPP entry with unique ID (e.g. OPP-XXX)", "type": "file_check"}, + {"text": "Infers source type as customer-feedback based on '客户反馈' keyword", "type": "behavior_check"}, + {"text": "Writes opportunity record to opportunities.md", "type": "file_check"}, + {"text": "OPP entry contains description capturing the core pain point", "type": "content_check"}, + {"text": "OPP entry contains creation date", "type": "file_check"}, + {"text": "Suggests next step: create Epic from this opportunity or link to existing Epic", "type": "output_check"}, + {"text": "Output uses natural language, no raw internal IDs in user-facing text", "type": "output_check"} + ] + }, + { + "id": 2, "name": "epic-from-opportunity", + "prompt": "/pace-biz epic OPP-001", + "expected_output": "Reads OPP-001 details, guides user through MoS (Measures of Success) definition, creates EPIC file linked to OPP-001, updates business hierarchy tree.", + "files": [], "env": "ENV-BIZ-B", + "assertions": [ + {"text": "Reads OPP-001 from opportunities.md to understand context", "type": "behavior_check"}, + {"text": "Guides user to define Measures of Success (MoS) for the Epic", "type": "behavior_check"}, + {"text": "Creates EPIC file with unique ID (e.g. EPIC-XXX)", "type": "file_check"}, + {"text": "EPIC file contains link/reference back to OPP-001", "type": "file_check"}, + {"text": "EPIC file contains OBJ association if applicable", "type": "file_check"}, + {"text": "Updates business hierarchy tree with new Epic entry", "type": "file_check"}, + {"text": "Suggests next step: decompose Epic into BRs", "type": "output_check"} + ] + }, + { + "id": 3, "name": "epic-direct", + "prompt": "我想创建一个专题来管理用户认证和授权", + "expected_output": "Creates Epic directly without requiring an existing Opportunity. Associates with relevant OBJ if identifiable, creates EPIC file, updates hierarchy.", + "files": [], "env": "ENV-BIZ-A", + "assertions": [ + {"text": "Creates EPIC file without requiring a pre-existing OPP", "type": "file_check"}, + {"text": "Attempts to associate Epic with relevant OBJ from vision/strategy", "type": "behavior_check"}, + {"text": "EPIC file contains description of scope (authentication and authorization)", "type": "content_check"}, + {"text": "EPIC file contains MoS section (may prompt user to define)", "type": "file_check"}, + {"text": "Updates business hierarchy tree with new Epic", "type": "file_check"}, + {"text": "Suggests next step: decompose into BRs or capture related opportunities", "type": "output_check"} + ] + }, + { + "id": 4, "name": "decompose-epic-to-br", + "prompt": "/pace-biz decompose EPIC-001", + "expected_output": "Reads EPIC-001 details, suggests BR decomposition plan, waits for user confirmation, creates BR entries linked to the Epic.", + "files": [], "env": "ENV-BIZ-C", + "assertions": [ + {"text": "Reads EPIC-001 to understand scope and MoS", "type": "behavior_check"}, + {"text": "Proposes BR decomposition plan with rationale", "type": "output_check"}, + {"text": "Waits for user confirmation before creating BRs", "type": "behavior_check"}, + {"text": "Creates BR entries with unique IDs linked to EPIC-001", "type": "file_check"}, + {"text": "Each BR has clear scope description and acceptance hints", "type": "content_check"}, + {"text": "Updates business hierarchy tree showing EPIC->BR relationships", "type": "file_check"}, + {"text": "Suggests next step: further decompose BRs into PFs", "type": "output_check"} + ] + }, + { + "id": 5, "name": "decompose-br-to-pf", + "prompt": "/pace-biz decompose BR-001", + "expected_output": "Reads BR-001 details, suggests PF (Product Feature) decomposition, waits for user confirmation, creates PF entries that bridge business and development.", + "files": [], "env": "ENV-BIZ-D", + "assertions": [ + {"text": "Reads BR-001 to understand business requirement scope", "type": "behavior_check"}, + {"text": "Proposes PF decomposition plan mapping business needs to product features", "type": "output_check"}, + {"text": "Waits for user confirmation before creating PFs", "type": "behavior_check"}, + {"text": "Creates PF entries with unique IDs linked to BR-001", "type": "file_check"}, + {"text": "Each PF contains acceptance criteria derived from BR", "type": "content_check"}, + {"text": "Updates hierarchy tree showing BR->PF relationships", "type": "file_check"}, + {"text": "Suggests next step: use /pace-dev or /pace-plan for implementation planning", "type": "output_check"}, + {"text": "PF entries are compatible with existing devpace CR workflow", "type": "behavior_check"} + ] + }, + { + "id": 6, "name": "align-check", + "prompt": "/pace-biz align", + "expected_output": "Performs read-only strategic alignment analysis. Reports OBJ coverage rate, identifies orphan entities (Epics without OBJ, BRs without Epic), and highlights misalignment risks.", + "files": [], "env": "ENV-BIZ-B", + "assertions": [ + {"text": "Performs read-only analysis without modifying any files", "type": "behavior_check"}, + {"text": "Reports OBJ coverage rate (which OBJs have Epics/BRs mapped)", "type": "output_check"}, + {"text": "Identifies orphan Epics not linked to any OBJ", "type": "output_check"}, + {"text": "Identifies orphan BRs not linked to any Epic", "type": "output_check"}, + {"text": "Reports isolated entities (OPPs not converted to Epics)", "type": "output_check"}, + {"text": "Provides actionable recommendations for alignment gaps", "type": "output_check"}, + {"text": "No files are created or modified during analysis", "type": "file_check"} + ] + }, + { + "id": 7, "name": "view-panorama", + "prompt": "/pace-biz view", + "expected_output": "Displays read-only business panorama showing full hierarchy: OPP->EPIC->BR->PF->CR with status indicators at each level.", + "files": [], "env": "ENV-BIZ-B", + "assertions": [ + {"text": "Displays OPP->EPIC->BR->PF->CR hierarchy in structured format", "type": "output_check"}, + {"text": "Each entity shows current status indicator", "type": "output_check"}, + {"text": "Hierarchy is visually clear with indentation or tree structure", "type": "output_check"}, + {"text": "Includes summary statistics (total counts per entity type)", "type": "output_check"}, + {"text": "Read-only operation, no files modified", "type": "behavior_check"}, + {"text": "Output uses natural language descriptions alongside entity IDs", "type": "output_check"} + ] + }, + { + "id": 8, "name": "backward-compat", + "prompt": "/pace-biz view", + "expected_output": "When no Epic/Opportunity layer exists, gracefully falls back to showing existing PF->CR hierarchy. Does not error or require Epic/OPP setup.", + "files": [], "env": "ENV-BIZ-LEGACY", + "assertions": [ + {"text": "Detects absence of Epic/Opportunity layer without error", "type": "behavior_check"}, + {"text": "Falls back to displaying existing PF->CR hierarchy", "type": "output_check"}, + {"text": "Does not require or force Epic/OPP creation", "type": "behavior_check"}, + {"text": "Suggests /pace-biz opportunity or /pace-biz epic to enrich business context", "type": "output_check"}, + {"text": "Existing devpace workflow remains fully functional", "type": "behavior_check"}, + {"text": "No files are created or modified", "type": "file_check"} + ] + }, + { + "id": 9, "name": "discover-interactive", + "prompt": "/pace-biz discover 我想做一个任务管理工具", + "expected_output": "Launches multi-turn interactive discovery. Asks goal framing questions, then brainstorms features, defines boundaries, and presents structured candidate tree for confirmation.", + "files": [], "env": "ENV-BIZ-A", + "assertions": [ + {"text": "Asks goal-framing questions (problem, target users) in first round", "type": "behavior_check"}, + {"text": "Progressively deepens with feature brainstorming questions", "type": "behavior_check"}, + {"text": "Asks boundary definition questions (what is out of scope)", "type": "behavior_check"}, + {"text": "Presents structured candidate tree (OPP->Epic->BR->PF) for confirmation", "type": "output_check"}, + {"text": "Persists session state to scope-discovery.md during multi-turn conversation", "type": "file_check"}, + {"text": "After confirmation, writes OPP/Epic/BR/PF to .devpace/ files", "type": "file_check"}, + {"text": "Cleans up scope-discovery.md after successful completion", "type": "file_check"}, + {"text": "Suggests next steps: decompose or /pace-plan next", "type": "output_check"} + ] + }, + { + "id": 10, "name": "discover-degraded", + "prompt": "/pace-biz discover 做一个聊天机器人", + "expected_output": "Without .devpace/, runs discovery conversation normally but outputs to console instead of writing files. Guides user to /pace-init.", + "files": [], "env": "ENV-NO-DEVPACE", + "assertions": [ + {"text": "Runs discovery conversation normally without .devpace/", "type": "behavior_check"}, + {"text": "Outputs candidate tree to console, does not write files", "type": "behavior_check"}, + {"text": "Guides user to run /pace-init first", "type": "output_check"}, + {"text": "No files are created or modified", "type": "file_check"} + ] + }, + { + "id": 11, "name": "import-documents", + "prompt": "/pace-biz import meeting-notes.md", + "expected_output": "Reads the document, auto-detects source type, extracts requirement entities, performs merge analysis against existing feature tree, and presents diff-style plan for confirmation.", + "files": [], "env": "ENV-BIZ-B", + "assertions": [ + {"text": "Reads the specified file and detects source type", "type": "behavior_check"}, + {"text": "Extracts requirement entities (BR/PF candidates) from document", "type": "behavior_check"}, + {"text": "Performs merge analysis: classifies as NEW/DUPLICATE/ENRICHMENT/CONFLICT", "type": "output_check"}, + {"text": "Presents diff-style merge plan for user confirmation", "type": "output_check"}, + {"text": "After confirmation, writes new entities to project.md feature tree", "type": "file_check"}, + {"text": "Marks imported content with source attribution comment", "type": "file_check"}, + {"text": "Does not create CRs (import operates at BR/PF level only)", "type": "behavior_check"}, + {"text": "Suggests /pace-biz align after import", "type": "output_check"} + ] + }, + { + "id": 12, "name": "infer-codebase", + "prompt": "/pace-biz infer", + "expected_output": "Scans codebase structure, mines signals (TODO/FIXME, routes, models), compares against feature tree, and presents three-part gap report.", + "files": [], "env": "ENV-BIZ-CODE", + "assertions": [ + {"text": "Scans source code directories for modules, routes, models, components", "type": "behavior_check"}, + {"text": "Mines TODO/FIXME/HACK comments as technical debt signals", "type": "behavior_check"}, + {"text": "Compares inferred features against existing feature tree", "type": "behavior_check"}, + {"text": "Presents three-part report: untracked, unimplemented, technical debt", "type": "output_check"}, + {"text": "Allows user to select which items to add to feature tree", "type": "behavior_check"}, + {"text": "Technical debt PFs are suffixed with '(technical debt)' marker", "type": "content_check"}, + {"text": "Marks inferred content with source attribution comment", "type": "file_check"}, + {"text": "Suggests /pace-biz align after inference", "type": "output_check"} + ] + }, + { + "id": 13, "name": "infer-no-git", + "prompt": "/pace-biz infer", + "expected_output": "Without git, degrades gracefully: skips blame/hotspot analysis, still performs directory structure and comment scanning.", + "files": [], "env": "ENV-BIZ-NOGIT", + "assertions": [ + {"text": "Detects git is unavailable and degrades gracefully", "type": "behavior_check"}, + {"text": "Skips git-enhanced analysis (hotspot, co-change, contributor)", "type": "behavior_check"}, + {"text": "Still performs directory structure analysis and comment scanning", "type": "behavior_check"}, + {"text": "Produces gap report without git-specific sections", "type": "output_check"}, + {"text": "Does not error or abort due to missing git", "type": "behavior_check"} + ] + } + ] +} diff --git a/tests/evaluation/pace-biz/trigger-evals.json b/tests/evaluation/pace-biz/trigger-evals.json new file mode 100644 index 0000000..8a196b7 --- /dev/null +++ b/tests/evaluation/pace-biz/trigger-evals.json @@ -0,0 +1,242 @@ +[ + { + "id": 1, + "query": "有个客户反馈说导出功能太慢", + "should_trigger": true, + "rationale": "Customer feedback implies a business opportunity; 'opportunity' semantics match trigger keywords" + }, + { + "id": 2, + "query": "我想创建一个专题来管理用户认证", + "should_trigger": true, + "rationale": "'创建专题' maps to Epic creation, a core pace-biz capability" + }, + { + "id": 3, + "query": "把这个 Epic 分解成具体需求", + "should_trigger": true, + "rationale": "'Epic' and '分解' are explicit trigger keywords for decompose subcommand" + }, + { + "id": 4, + "query": "检查一下战略对齐", + "should_trigger": true, + "rationale": "'战略对齐' directly maps to align subcommand trigger keywords" + }, + { + "id": 5, + "query": "看看业务全景", + "should_trigger": true, + "rationale": "'业务全景' directly maps to view subcommand trigger keywords" + }, + { + "id": 6, + "query": "/pace-biz opportunity 竞品上线新功能", + "should_trigger": true, + "rationale": "Direct slash command invocation with opportunity subcommand" + }, + { + "id": 7, + "query": "/pace-biz epic OPP-001", + "should_trigger": true, + "rationale": "Direct slash command invocation with epic subcommand" + }, + { + "id": 8, + "query": "/pace-biz decompose EPIC-001", + "should_trigger": true, + "rationale": "Direct slash command invocation with decompose subcommand" + }, + { + "id": 9, + "query": "/pace-biz align", + "should_trigger": true, + "rationale": "Direct slash command invocation with align subcommand" + }, + { + "id": 10, + "query": "/pace-biz view", + "should_trigger": true, + "rationale": "Direct slash command invocation with view subcommand" + }, + { + "id": 11, + "query": "业务机会", + "should_trigger": true, + "rationale": "'业务机会' is a key trigger phrase for opportunity capture" + }, + { + "id": 12, + "query": "业务规划", + "should_trigger": true, + "rationale": "'业务规划' is a key trigger phrase for business planning capabilities" + }, + { + "id": 13, + "query": "pace-biz", + "should_trigger": true, + "rationale": "Direct skill name reference triggers the skill" + }, + { + "id": 14, + "query": "帮我实现登录功能", + "should_trigger": false, + "rationale": "'实现' is a development keyword -> /pace-dev, not business planning" + }, + { + "id": 15, + "query": "不做这个需求了", + "should_trigger": false, + "rationale": "'不做了' is a change management keyword -> /pace-change, not business planning" + }, + { + "id": 16, + "query": "规划下一个迭代", + "should_trigger": false, + "rationale": "Iteration planning -> /pace-plan, not business-level planning" + }, + { + "id": 17, + "query": "项目状态怎样", + "should_trigger": false, + "rationale": "Project status overview -> /pace-status, not business planning" + }, + { + "id": 18, + "query": "回顾一下这个迭代", + "should_trigger": false, + "rationale": "Iteration retrospective -> /pace-retro, not business planning" + }, + { + "id": 19, + "query": "开始做 CR-001", + "should_trigger": false, + "rationale": "'开始做' + CR reference -> /pace-dev, not business planning" + }, + { + "id": 20, + "query": "初始化项目", + "should_trigger": false, + "rationale": "Project initialization -> /pace-init, not business planning" + }, + { + "id": 21, + "query": "我想做一个智能客服系统", + "should_trigger": true, + "rationale": "'我想做一个...' is a vague idea that maps to discover subcommand for interactive requirements discovery" + }, + { + "id": 22, + "query": "头脑风暴一下需求", + "should_trigger": true, + "rationale": "'头脑风暴' is a key trigger for discover subcommand" + }, + { + "id": 23, + "query": "/pace-biz discover 任务管理工具", + "should_trigger": true, + "rationale": "Direct slash command invocation with discover subcommand" + }, + { + "id": 24, + "query": "把会议纪要里的需求导入进来", + "should_trigger": true, + "rationale": "'导入需求' + '会议纪要' maps to import subcommand" + }, + { + "id": 25, + "query": "/pace-biz import requirements.md", + "should_trigger": true, + "rationale": "Direct slash command invocation with import subcommand" + }, + { + "id": 26, + "query": "从文档导入需求", + "should_trigger": true, + "rationale": "'从文档导入' is a key trigger for import subcommand" + }, + { + "id": 27, + "query": "看看代码里有什么功能没追踪的", + "should_trigger": true, + "rationale": "'代码' + '功能' + '没追踪' maps to infer subcommand for codebase feature inference" + }, + { + "id": 28, + "query": "/pace-biz infer", + "should_trigger": true, + "rationale": "Direct slash command invocation with infer subcommand" + }, + { + "id": 29, + "query": "技术债务盘点", + "should_trigger": true, + "rationale": "'技术债务盘点' is a key trigger for infer subcommand" + }, + { + "id": 30, + "query": "brainstorm 一下这个项目需要什么功能", + "should_trigger": true, + "rationale": "'brainstorm' is a key trigger for discover subcommand" + }, + { + "id": 31, + "query": "需求发现", + "should_trigger": true, + "rationale": "'需求发现' is a key trigger phrase for discover subcommand" + }, + { + "id": 32, + "query": "代码分析需求", + "should_trigger": true, + "rationale": "'代码分析需求' is a key trigger phrase for infer subcommand" + }, + { + "id": 33, + "query": "初始化项目并建立完整功能树", + "should_trigger": false, + "rationale": "Full project initialization with feature tree -> /pace-init full, not pace-biz discover" + }, + { + "id": 34, + "query": "加一个新功能到当前迭代", + "should_trigger": false, + "rationale": "Adding a feature to current iteration -> /pace-change add, not pace-biz opportunity" + }, + { + "id": 35, + "query": "重新规划下个迭代的范围", + "should_trigger": false, + "rationale": "Iteration scope replanning -> /pace-plan adjust, not pace-biz" + }, + { + "id": 36, + "query": "帮我看看项目进展", + "should_trigger": false, + "rationale": "Project progress overview -> /pace-status, not pace-biz view" + }, + { + "id": 37, + "query": "分析这个 CR 的风险", + "should_trigger": false, + "rationale": "CR risk analysis -> /pace-guard scan, not pace-biz" + }, + { + "id": 38, + "query": "回顾这个迭代的度量", + "should_trigger": false, + "rationale": "Iteration metrics review -> /pace-retro, not pace-biz" + }, + { + "id": 39, + "query": "方法论是什么", + "should_trigger": false, + "rationale": "Methodology questions -> /pace-theory, not pace-biz" + }, + { + "id": 40, + "query": "把这个 Epic 开始做", + "should_trigger": false, + "rationale": "'开始做' implies implementation -> /pace-dev, not pace-biz (planning != implementing)" + } +] diff --git a/tests/hooks/test_pace_dev_scope_check.mjs b/tests/hooks/test_pace_dev_scope_check.mjs new file mode 100644 index 0000000..3ca40a4 --- /dev/null +++ b/tests/hooks/test_pace_dev_scope_check.mjs @@ -0,0 +1,359 @@ +/** + * Integration tests for hooks/pace-dev-scope-check.mjs + * Tests the hook by spawning it as a subprocess with simulated stdin JSON. + * Run: node --test tests/hooks/test_pace_dev_scope_check.mjs + */ +import { describe, it, beforeEach, afterEach } from 'node:test'; +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const HOOK_SCRIPT = join(__dirname, '..', '..', 'hooks', 'pace-dev-scope-check.mjs'); + +// ── Test helpers ──────────────────────────────────────────────────── + +function createTmpProject() { + const dir = join(tmpdir(), `devpace-scope-test-${Date.now()}-${Math.random().toString(36).slice(2)}`); + mkdirSync(join(dir, '.devpace', 'backlog'), { recursive: true }); + return dir; +} + +function cleanupDir(dir) { + if (existsSync(dir)) { + rmSync(dir, { recursive: true, force: true }); + } +} + +function runHook(stdinJson, projectDir) { + return new Promise((resolve) => { + const child = spawn('node', [HOOK_SCRIPT], { + env: { ...process.env, CLAUDE_PROJECT_DIR: projectDir }, + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data) => { stdout += data.toString(); }); + child.stderr.on('data', (data) => { stderr += data.toString(); }); + + child.on('close', (code) => { + resolve({ exitCode: code, stdout: stdout.trim(), stderr: stderr.trim() }); + }); + + child.stdin.write(JSON.stringify(stdinJson)); + child.stdin.end(); + }); +} + +/** + * Create a CR file with scope-relevant content. + */ +function writeCr(projectDir, crId, content) { + const crPath = join(projectDir, '.devpace', 'backlog', `CR-${crId}.md`); + writeFileSync(crPath, content); + return crPath; +} + +/** + * Write state.md with an active CR reference. + */ +function writeState(projectDir, crId) { + writeFileSync( + join(projectDir, '.devpace', 'state.md'), + `> 目标:测试项目\n\n- **进行中**:实现功能 → CR-${crId}\n\n下一步:继续\n` + ); +} + +// ── Tests: No .devpace → exit 0 ──────────────────────────────────── + +describe('pace-dev-scope-check: no .devpace', () => { + it('exits 0 when .devpace/backlog does not exist', async () => { + const dir = join(tmpdir(), `no-devpace-scope-${Date.now()}`); + mkdirSync(dir, { recursive: true }); + const result = await runHook({ tool_input: { file_path: '/foo.md' } }, dir); + assert.equal(result.exitCode, 0); + cleanupDir(dir); + }); +}); + +// ── Tests: No file_path → exit 0 ─────────────────────────────────── + +describe('pace-dev-scope-check: no file_path', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 when tool input has no file_path', async () => { + const result = await runHook({ tool_input: {} }, projectDir); + assert.equal(result.exitCode, 0); + }); + + it('exits 0 for empty input', async () => { + const result = await runHook({}, projectDir); + assert.equal(result.exitCode, 0); + }); +}); + +// ── Tests: Gate 3 — block automated approved state change ────────── + +describe('pace-dev-scope-check: Gate 3 enforcement', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('blocks state change to approved on CR file (exit 2)', async () => { + const crPath = writeCr(projectDir, '001', '# CR-001\n\n- **状态**:in_review\n'); + const input = { + tool_input: { + file_path: crPath, + content: '# CR-001\n\n- **状态**:approved\n' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 2, `Expected exit 2 (Gate 3 block) but got ${result.exitCode}`); + assert.ok(result.stderr.includes('Gate 3'), 'Should mention Gate 3'); + }); + + it('blocks Edit with new_string changing to approved (exit 2)', async () => { + const crPath = writeCr(projectDir, '002', '# CR-002\n\n- **状态**:in_review\n'); + const input = { + tool_input: { + file_path: crPath, + old_string: '- **状态**:in_review', + new_string: '- **状态**:approved' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 2); + }); + + it('allows non-approved state change on CR file (exit 0)', async () => { + const crPath = writeCr(projectDir, '003', '# CR-003\n\n- **状态**:developing\n'); + const input = { + tool_input: { + file_path: crPath, + content: '# CR-003\n\n- **状态**:verifying\n' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); + + it('allows content additions to CR without state change', async () => { + const crPath = writeCr(projectDir, '004', '# CR-004\n\n- **状态**:developing\n'); + const input = { + tool_input: { + file_path: crPath, + content: '# CR-004\n\n- **状态**:developing\n\n## Notes\nAdded notes.\n' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); +}); + +// ── Tests: .devpace/ management files → fast-path exit 0 ─────────── + +describe('pace-dev-scope-check: .devpace fast-path', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('allows write to .devpace/state.md', async () => { + const input = { + tool_input: { + file_path: join(projectDir, '.devpace', 'state.md'), + content: '> updated' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); + + it('allows write to .devpace/project.md', async () => { + const input = { + tool_input: { + file_path: join(projectDir, '.devpace', 'project.md'), + content: '# Project' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); +}); + +// ── Tests: No active CR → allow with info ────────────────────────── + +describe('pace-dev-scope-check: no active CR', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('allows file write when no state.md exists', async () => { + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'main.js'), + content: 'console.log("hi")' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('scope-info'), 'Should output scope-info message'); + }); + + it('allows file write when state.md has no active CR', async () => { + writeFileSync( + join(projectDir, '.devpace', 'state.md'), + '> 目标:测试\n\n- 当前工作:(无)\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'main.js'), + content: 'console.log("hi")' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); +}); + +// ── Tests: Scope validation with active CR ───────────────────────── + +describe('pace-dev-scope-check: scope validation', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeState(projectDir, '010'); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('allows in-scope file (execution plan path match)', async () => { + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n\n## 执行计划\n\n**src/auth/login.js**:实现登录逻辑\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'auth', 'login.js'), + content: 'module.exports = {}' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(!result.stdout.includes('scope-drift'), 'Should NOT warn about scope drift'); + }); + + it('allows in-scope file (scope section path match)', async () => { + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n- **范围**:`hooks/` 目录下的所有文件\n\n## 执行计划\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'hooks', 'some-hook.mjs'), + content: 'export default {}' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(!result.stdout.includes('scope-drift'), 'Should NOT warn about scope drift'); + }); + + it('warns (advisory, exit 0) for out-of-scope file', async () => { + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n\n## 执行计划\n\n**src/auth/login.js**:实现登录逻辑\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'docs', 'README.md'), + content: '# Docs' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0, 'Scope drift is advisory, should not block'); + assert.ok(result.stdout.includes('scope-drift'), 'Should warn about scope drift'); + }); + + it('allows all files when CR has no scope patterns yet', async () => { + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n\n## 意图\n\n概述:初步探索\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'anywhere', 'file.txt'), + content: 'content' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(!result.stdout.includes('scope-drift'), 'No scope patterns → no drift warning'); + }); + + it('warns for different file in same directory (startsWith needs prefix match)', async () => { + // matchesScope's same-directory check uses startsWith, which requires + // the target path to begin with the pattern's directory prefix. + // With absolute tmp paths vs relative patterns, this won't match. + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n\n## 执行计划\n\n**src/auth/login.js**:实现登录逻辑\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'auth', 'register.js'), + content: 'module.exports = {}' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0, 'Should not block, only advisory'); + assert.ok(result.stdout.includes('scope-drift'), 'Different file triggers scope-drift advisory'); + }); + + it('allows file matching via includes (substring in path)', async () => { + writeCr(projectDir, '010', + '# CR-010\n\n- **状态**:developing\n\n## 执行计划\n\n**src/auth/**:认证模块目录\n' + ); + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'auth', 'register.js'), + content: 'module.exports = {}' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(!result.stdout.includes('scope-drift'), 'Directory pattern should match via includes'); + }); +}); + +// ── Tests: Degraded state → allow ────────────────────────────────── + +describe('pace-dev-scope-check: degradation', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('allows when state.md references non-existent CR', async () => { + writeFileSync( + join(projectDir, '.devpace', 'state.md'), + '> 目标:测试\n\n- **进行中**:实现功能 → CR-999\n' + ); + // CR-999.md does not exist + const input = { + tool_input: { + file_path: join(projectDir, 'src', 'main.js'), + content: 'code' + } + }; + const result = await runHook(input, projectDir); + assert.equal(result.exitCode, 0); + }); +}); diff --git a/tests/hooks/test_post_tool_failure.mjs b/tests/hooks/test_post_tool_failure.mjs new file mode 100644 index 0000000..2d48437 --- /dev/null +++ b/tests/hooks/test_post_tool_failure.mjs @@ -0,0 +1,161 @@ +/** + * Integration tests for hooks/post-tool-failure.mjs + * Tests the PostToolUseFailure hook by spawning it as a subprocess. + * Run: node --test tests/hooks/test_post_tool_failure.mjs + */ +import { describe, it, beforeEach, afterEach } from 'node:test'; +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const HOOK_SCRIPT = join(__dirname, '..', '..', 'hooks', 'post-tool-failure.mjs'); + +// ── Test helpers ──────────────────────────────────────────────────── + +function createTmpProject(advanceMode) { + const dir = join(tmpdir(), `devpace-failure-test-${Date.now()}-${Math.random().toString(36).slice(2)}`); + mkdirSync(join(dir, '.devpace', 'backlog'), { recursive: true }); + if (advanceMode) { + writeFileSync( + join(dir, '.devpace', 'state.md'), + '> 目标:测试\n\n- **进行中**:开发中 → CR-001\n\n下一步:继续\n' + ); + } + return dir; +} + +function cleanupDir(dir) { + if (existsSync(dir)) { + rmSync(dir, { recursive: true, force: true }); + } +} + +function runHook(stdinJson, projectDir) { + return new Promise((resolve) => { + const child = spawn('node', [HOOK_SCRIPT], { + env: { ...process.env, CLAUDE_PROJECT_DIR: projectDir }, + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data) => { stdout += data.toString(); }); + child.stderr.on('data', (data) => { stderr += data.toString(); }); + + child.on('close', (code) => { + resolve({ exitCode: code, stdout: stdout.trim(), stderr: stderr.trim() }); + }); + + child.stdin.write(JSON.stringify(stdinJson)); + child.stdin.end(); + }); +} + +// ── Tests: No .devpace → silent exit ─────────────────────────────── + +describe('post-tool-failure: no .devpace', () => { + it('exits 0 silently when .devpace/backlog does not exist', async () => { + const dir = join(tmpdir(), `no-devpace-failure-${Date.now()}`); + mkdirSync(dir, { recursive: true }); + const result = await runHook({ tool_input: { file_path: '/foo.md' } }, dir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + cleanupDir(dir); + }); +}); + +// ── Tests: Not in advance mode → silent exit ─────────────────────── + +describe('post-tool-failure: explore mode (not advance)', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(false); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently when not in advance mode', async () => { + const crPath = join(projectDir, '.devpace', 'backlog', 'CR-001.md'); + writeFileSync(crPath, '# CR-001\n\n- **状态**:developing\n'); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); + + it('exits 0 silently when state.md does not exist', async () => { + rmSync(join(projectDir, '.devpace', 'state.md'), { force: true }); + const result = await runHook( + { tool_input: { file_path: join(projectDir, '.devpace', 'backlog', 'CR-001.md') } }, + projectDir + ); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); +}); + +// ── Tests: Advance mode + CR file failure → consistency advice ───── + +describe('post-tool-failure: advance mode + CR file', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(true); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('outputs consistency advice for CR file write failure', async () => { + const crPath = join(projectDir, '.devpace', 'backlog', 'CR-001.md'); + writeFileSync(crPath, '# CR-001\n\n- **状态**:developing\n'); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('tool-failure'), 'Should include tool-failure prefix'); + assert.ok(result.stdout.includes('CR'), 'Should mention CR'); + assert.ok(result.stdout.includes('consistency'), 'Should mention consistency check'); + }); +}); + +// ── Tests: Advance mode + .devpace/ file failure → state check ───── + +describe('post-tool-failure: advance mode + .devpace file', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(true); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('outputs state check advice for .devpace/ file failure', async () => { + const result = await runHook( + { tool_input: { file_path: join(projectDir, '.devpace', 'state.md') } }, + projectDir + ); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('tool-failure'), 'Should include tool-failure prefix'); + assert.ok(result.stdout.includes('state.md'), 'Should mention state.md'); + }); +}); + +// ── Tests: Advance mode + other file failure → silent ────────────── + +describe('post-tool-failure: advance mode + non-devpace file', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(true); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently for non-.devpace file failure', async () => { + const result = await runHook( + { tool_input: { file_path: join(projectDir, 'src', 'main.js') } }, + projectDir + ); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); + + it('exits 0 silently when file_path is empty', async () => { + const result = await runHook({ tool_input: {} }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); +}); diff --git a/tests/hooks/test_sync_push.mjs b/tests/hooks/test_sync_push.mjs new file mode 100644 index 0000000..557419d --- /dev/null +++ b/tests/hooks/test_sync_push.mjs @@ -0,0 +1,256 @@ +/** + * Integration tests for hooks/sync-push.mjs + * Tests the PostToolUse hook by spawning it as a subprocess with simulated stdin JSON. + * Run: node --test tests/hooks/test_sync_push.mjs + */ +import { describe, it, beforeEach, afterEach } from 'node:test'; +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { fileURLToPath } from 'node:url'; +import { dirname } from 'node:path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const HOOK_SCRIPT = join(__dirname, '..', '..', 'hooks', 'sync-push.mjs'); + +// ── Test helpers ──────────────────────────────────────────────────── + +function createTmpProject() { + const dir = join(tmpdir(), `devpace-sync-test-${Date.now()}-${Math.random().toString(36).slice(2)}`); + mkdirSync(join(dir, '.devpace', 'backlog'), { recursive: true }); + mkdirSync(join(dir, '.devpace', 'integrations'), { recursive: true }); + return dir; +} + +function cleanupDir(dir) { + if (existsSync(dir)) { + rmSync(dir, { recursive: true, force: true }); + } +} + +function runHook(stdinJson, projectDir) { + return new Promise((resolve) => { + const child = spawn('node', [HOOK_SCRIPT], { + env: { ...process.env, CLAUDE_PROJECT_DIR: projectDir }, + stdio: ['pipe', 'pipe', 'pipe'], + }); + + let stdout = ''; + let stderr = ''; + + child.stdout.on('data', (data) => { stdout += data.toString(); }); + child.stderr.on('data', (data) => { stderr += data.toString(); }); + + child.on('close', (code) => { + resolve({ exitCode: code, stdout: stdout.trim(), stderr: stderr.trim() }); + }); + + child.stdin.write(JSON.stringify(stdinJson)); + child.stdin.end(); + }); +} + +function writeCr(projectDir, crId, content) { + const crPath = join(projectDir, '.devpace', 'backlog', `CR-${crId}.md`); + writeFileSync(crPath, content); + return crPath; +} + +function writeSyncMapping(projectDir, content) { + writeFileSync( + join(projectDir, '.devpace', 'integrations', 'sync-mapping.md'), + content || '# Sync Mapping\n\n| CR | External |\n|----|---------|\n| CR-001 | #123 |\n' + ); +} + +function writeSyncCache(projectDir, entries) { + mkdirSync(join(projectDir, '.devpace'), { recursive: true }); + const lines = Object.entries(entries).map(([k, v]) => `${k}=${v}`).join('\n'); + writeFileSync(join(projectDir, '.devpace', '.sync-state-cache'), lines + '\n'); +} + +// ── Tests: No .devpace → silent exit ─────────────────────────────── + +describe('sync-push: no .devpace', () => { + it('exits 0 silently when .devpace/backlog does not exist', async () => { + const dir = join(tmpdir(), `no-devpace-sync-${Date.now()}`); + mkdirSync(dir, { recursive: true }); + const result = await runHook({ tool_input: { file_path: '/foo.md' } }, dir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + cleanupDir(dir); + }); +}); + +// ── Tests: Non-CR file → silent exit ─────────────────────────────── + +describe('sync-push: non-CR file', () => { + let projectDir; + + beforeEach(() => { projectDir = createTmpProject(); }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently for non-CR file path', async () => { + const result = await runHook( + { tool_input: { file_path: join(projectDir, 'src', 'main.js') } }, + projectDir + ); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); + + it('exits 0 silently for .devpace/state.md', async () => { + const result = await runHook( + { tool_input: { file_path: join(projectDir, '.devpace', 'state.md') } }, + projectDir + ); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); +}); + +// ── Tests: No sync-mapping → silent exit ─────────────────────────── + +describe('sync-push: no sync-mapping', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + // Remove default integrations dir to simulate no sync-mapping + rmSync(join(projectDir, '.devpace', 'integrations'), { recursive: true, force: true }); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently when sync-mapping.md does not exist', async () => { + const crPath = writeCr(projectDir, '001', '# CR-001\n\n- **状态**:developing\n'); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); +}); + +// ── Tests: Cache hit (state unchanged) → silent exit ─────────────── + +describe('sync-push: cache hit (state unchanged)', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeSyncMapping(projectDir); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently when CR state matches cached state', async () => { + const crPath = writeCr(projectDir, '001', + '# CR-001\n\n- **状态**:developing\n- **外部关联**:[Issue #123](https://example.com/123)\n' + ); + writeSyncCache(projectDir, { 'CR-001': 'developing' }); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, '', 'Should be silent when state unchanged'); + }); +}); + +// ── Tests: State transition to merged + external link → directive ── + +describe('sync-push: merged transition with external link', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeSyncMapping(projectDir); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('outputs directive message for merged state with external link', async () => { + const crPath = writeCr(projectDir, '001', + '# CR-001\n\n- **状态**:merged\n- **外部关联**:[Issue #123](https://github.com/org/repo/issues/123)\n' + ); + writeSyncCache(projectDir, { 'CR-001': 'in_review' }); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('sync-push'), 'Should include sync-push prefix'); + assert.ok(result.stdout.includes('merged'), 'Should mention merged state'); + assert.ok(result.stdout.includes('Issue #123'), 'Should include external link text'); + assert.ok(result.stdout.includes('Auto-execute'), 'Should use directive language for merged'); + }); + + it('outputs directive for new CR (no cached state) transitioning to merged', async () => { + const crPath = writeCr(projectDir, '002', + '# CR-002\n\n- **状态**:merged\n- **外部关联**:[Task ABC](https://linear.app/task/ABC)\n' + ); + // No cache entry for CR-002 + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('sync-push')); + assert.ok(result.stdout.includes('merged')); + }); +}); + +// ── Tests: Other state change + external link → advisory ─────────── + +describe('sync-push: other state transitions with external link', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeSyncMapping(projectDir); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('outputs advisory for developing→verifying transition', async () => { + const crPath = writeCr(projectDir, '001', + '# CR-001\n\n- **状态**:verifying\n- **外部关联**:[Issue #1](https://example.com/1)\n' + ); + writeSyncCache(projectDir, { 'CR-001': 'developing' }); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.ok(result.stdout.includes('sync-push'), 'Should include sync-push prefix'); + assert.ok(result.stdout.includes('verifying'), 'Should mention new state'); + assert.ok(result.stdout.includes('Consider'), 'Should use advisory language'); + }); +}); + +// ── Tests: No external link → silent exit ────────────────────────── + +describe('sync-push: no external link', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeSyncMapping(projectDir); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently for state change without external link', async () => { + const crPath = writeCr(projectDir, '001', + '# CR-001\n\n- **状态**:merged\n' + ); + writeSyncCache(projectDir, { 'CR-001': 'in_review' }); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, '', 'Should be silent without external link'); + }); +}); + +// ── Tests: CR with no state field → silent exit ──────────────────── + +describe('sync-push: no state field in CR', () => { + let projectDir; + + beforeEach(() => { + projectDir = createTmpProject(); + writeSyncMapping(projectDir); + }); + afterEach(() => { cleanupDir(projectDir); }); + + it('exits 0 silently when CR has no state field', async () => { + const crPath = writeCr(projectDir, '001', '# CR-001\n\nNo state field here.\n'); + const result = await runHook({ tool_input: { file_path: crPath } }, projectDir); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout, ''); + }); +}); diff --git a/tests/hooks/test_utils.mjs b/tests/hooks/test_utils.mjs index 03308d8..8b0fb8e 100644 --- a/tests/hooks/test_utils.mjs +++ b/tests/hooks/test_utils.mjs @@ -16,7 +16,9 @@ import { isDevpaceFile, isAdvanceMode, extractWriteContent, - isStateChangeToApproved + isStateChangeToApproved, + readSyncStateCache, + updateSyncStateCache } from '../../hooks/lib/utils.mjs'; // ── Test helpers ──────────────────────────────────────────────────── @@ -220,3 +222,100 @@ describe('isStateChangeToApproved', () => { assert.equal(isStateChangeToApproved(undefined), false); }); }); + +// ── readSyncStateCache ────────────────────────────────────────────── + +describe('readSyncStateCache', () => { + let tmpDir; + + it('returns empty Map when cache file does not exist', () => { + tmpDir = createTmpDir(); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache instanceof Map, true); + assert.equal(cache.size, 0); + cleanupDir(tmpDir); + }); + + it('parses CR-xxx=state entries correctly', () => { + tmpDir = createTmpDir(); + mkdirSync(join(tmpDir, '.devpace'), { recursive: true }); + writeFileSync( + join(tmpDir, '.devpace/.sync-state-cache'), + 'CR-001=developing\nCR-002=merged\nCR-003=in_review\n' + ); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.size, 3); + assert.equal(cache.get('CR-001'), 'developing'); + assert.equal(cache.get('CR-002'), 'merged'); + assert.equal(cache.get('CR-003'), 'in_review'); + cleanupDir(tmpDir); + }); + + it('skips blank lines', () => { + tmpDir = createTmpDir(); + mkdirSync(join(tmpDir, '.devpace'), { recursive: true }); + writeFileSync( + join(tmpDir, '.devpace/.sync-state-cache'), + 'CR-001=developing\n\n\nCR-002=merged\n' + ); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.size, 2); + cleanupDir(tmpDir); + }); + + it('handles malformed lines gracefully', () => { + tmpDir = createTmpDir(); + mkdirSync(join(tmpDir, '.devpace'), { recursive: true }); + writeFileSync( + join(tmpDir, '.devpace/.sync-state-cache'), + 'CR-001=developing\nbadline\n=nokey\nCR-002=merged\n' + ); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.get('CR-001'), 'developing'); + assert.equal(cache.get('CR-002'), 'merged'); + cleanupDir(tmpDir); + }); +}); + +// ── updateSyncStateCache ──────────────────────────────────────────── + +describe('updateSyncStateCache', () => { + let tmpDir; + + it('creates cache file and .devpace/ directory if not exist', () => { + tmpDir = createTmpDir(); + updateSyncStateCache(tmpDir, 'CR-001', 'developing'); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.get('CR-001'), 'developing'); + cleanupDir(tmpDir); + }); + + it('adds new entry to existing cache', () => { + tmpDir = createTmpDir(); + mkdirSync(join(tmpDir, '.devpace'), { recursive: true }); + writeFileSync( + join(tmpDir, '.devpace/.sync-state-cache'), + 'CR-001=developing\n' + ); + updateSyncStateCache(tmpDir, 'CR-002', 'merged'); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.size, 2); + assert.equal(cache.get('CR-001'), 'developing'); + assert.equal(cache.get('CR-002'), 'merged'); + cleanupDir(tmpDir); + }); + + it('updates existing entry', () => { + tmpDir = createTmpDir(); + mkdirSync(join(tmpDir, '.devpace'), { recursive: true }); + writeFileSync( + join(tmpDir, '.devpace/.sync-state-cache'), + 'CR-001=developing\n' + ); + updateSyncStateCache(tmpDir, 'CR-001', 'merged'); + const cache = readSyncStateCache(tmpDir); + assert.equal(cache.size, 1); + assert.equal(cache.get('CR-001'), 'merged'); + cleanupDir(tmpDir); + }); +}); diff --git a/tests/static/test_cross_references.py b/tests/static/test_cross_references.py index ebb643b..502c896 100644 --- a/tests/static/test_cross_references.py +++ b/tests/static/test_cross_references.py @@ -141,6 +141,36 @@ def test_tc_cr_08_rules_refs_have_path(self): ) assert not bare_refs, f"Rules bare filename refs (need path prefix):\n" + "\n".join(bare_refs) + def test_tc_cr_09_value_tree_5_layer_entities(self): + """TC-CR-09: project-format.md value tree covers 5-layer entities (OBJ→Epic→BR→PF→CR).""" + pf = DEVPACE_ROOT / "knowledge" / "_schema" / "project-format.md" + content = pf.read_text(encoding="utf-8") + for entity in ["OBJ", "EPIC", "BR-", "PF-", "CR-"]: + assert entity in content, \ + f"project-format.md value tree missing entity layer: {entity}" + # Check that Epic link format is documented + assert "epics/EPIC" in content, \ + "project-format.md missing Epic link format documentation" + # Check that BR overflow format is documented + assert "requirements/BR" in content, \ + "project-format.md missing BR overflow format documentation" + + def test_tc_cr_10_epic_schema_refs_valid(self): + """TC-CR-10: epic-format.md references to project.md and BR are consistent.""" + epic = DEVPACE_ROOT / "knowledge" / "_schema" / "epic-format.md" + content = epic.read_text(encoding="utf-8") + assert "OBJ" in content, "epic-format.md missing OBJ reference" + assert "BR-" in content or "BR" in content, "epic-format.md missing BR reference" + assert "project.md" in content, "epic-format.md missing project.md reference" + + def test_tc_cr_11_br_schema_refs_valid(self): + """TC-CR-11: br-format.md references to Epic and PF are consistent.""" + br = DEVPACE_ROOT / "knowledge" / "_schema" / "br-format.md" + content = br.read_text(encoding="utf-8") + assert "EPIC" in content or "Epic" in content, "br-format.md missing Epic reference" + assert "PF-" in content or "PF" in content, "br-format.md missing PF reference" + assert "project.md" in content, "br-format.md missing project.md reference" + def test_tc_cr_05_claude_md_template_synced_with_rules(self): """TC-CR-05: claude-md-devpace.md template contains key content or delegates to rules.""" template = DEVPACE_ROOT / "skills" / "pace-init" / "templates" / "claude-md-devpace.md" diff --git a/tests/static/test_pace_init.py b/tests/static/test_pace_init.py index d321e56..dc17f77 100644 --- a/tests/static/test_pace_init.py +++ b/tests/static/test_pace_init.py @@ -71,6 +71,7 @@ def _procedure_files(): "init-procedures-migration.md", "init-procedures-monorepo.md", "init-procedures-checks.md", + "init-procedures-lite.md", ] # Routing table from SKILL.md: parameter -> procedure file(s) diff --git a/tests/static/test_schema_compliance.py b/tests/static/test_schema_compliance.py index 8a0a847..0ac50a1 100644 --- a/tests/static/test_schema_compliance.py +++ b/tests/static/test_schema_compliance.py @@ -120,3 +120,36 @@ def test_tc_sc_08_claude_md_template(self): assert "输出" in content, "claude-md missing output control" assert ".devpace/" in content, "claude-md missing .devpace file reference" assert "state.md" in content, "claude-md missing state.md reference" + + def test_tc_sc_09_epic_schema(self): + """TC-SC-09: epic-format.md has required sections and fields.""" + content = (SCHEMA_DIR / "epic-format.md").read_text(encoding="utf-8") + assert _has_heading(content, "§0"), "epic-format.md missing §0 速查卡片" + assert _has_heading(content, "文件结构"), "epic-format.md missing '文件结构'" + assert _has_heading(content, "字段说明"), "epic-format.md missing '字段说明'" + assert _has_heading(content, "状态计算规则"), "epic-format.md missing '状态计算规则'" + assert _has_heading(content, "容错"), "epic-format.md missing '容错'" + for field in ["OBJ", "状态", "背景", "成效指标", "业务需求"]: + assert field in content, f"epic-format.md missing field: {field}" + + def test_tc_sc_10_br_schema(self): + """TC-SC-10: br-format.md has required sections and fields.""" + content = (SCHEMA_DIR / "br-format.md").read_text(encoding="utf-8") + assert _has_heading(content, "§0"), "br-format.md missing §0 速查卡片" + assert _has_heading(content, "溢出触发条件"), "br-format.md missing '溢出触发条件'" + assert _has_heading(content, "溢出格式"), "br-format.md missing '溢出格式'" + assert _has_heading(content, "状态计算规则"), "br-format.md missing '状态计算规则'" + assert _has_heading(content, "容错"), "br-format.md missing '容错'" + for field in ["Epic", "OBJ", "状态", "优先级", "产品功能"]: + assert field in content, f"br-format.md missing field: {field}" + + def test_tc_sc_11_opportunity_schema(self): + """TC-SC-11: opportunity-format.md has required sections and fields.""" + content = (SCHEMA_DIR / "opportunity-format.md").read_text(encoding="utf-8") + assert _has_heading(content, "§0"), "opportunity-format.md missing §0 速查卡片" + assert _has_heading(content, "文件结构"), "opportunity-format.md missing '文件结构'" + assert _has_heading(content, "来源类型枚举"), "opportunity-format.md missing '来源类型枚举'" + assert _has_heading(content, "状态定义"), "opportunity-format.md missing '状态定义'" + assert _has_heading(content, "容错"), "opportunity-format.md missing '容错'" + for source in ["用户反馈", "竞品观察", "技术发现", "市场趋势", "内部洞察"]: + assert source in content, f"opportunity-format.md missing source type: {source}" diff --git a/tests/static/test_state_machine.py b/tests/static/test_state_machine.py index c995f21..10897a6 100644 --- a/tests/static/test_state_machine.py +++ b/tests/static/test_state_machine.py @@ -67,6 +67,62 @@ def test_tc_sm_06_cr_schema_states_consistent(self): f"cr-format.md missing state: {state}" +EPIC_SCHEMA = DEVPACE_ROOT / "knowledge" / "_schema" / "epic-format.md" +BR_SCHEMA = DEVPACE_ROOT / "knowledge" / "_schema" / "br-format.md" +OPP_SCHEMA = DEVPACE_ROOT / "knowledge" / "_schema" / "opportunity-format.md" + +EPIC_STATES = ["规划中", "进行中", "已完成", "已搁置"] +BR_STATES = ["待开始", "进行中", "已完成", "暂停"] +OPP_STATES = ["评估中", "已采纳", "已搁置", "已拒绝"] + + +@pytest.mark.static +class TestEpicStateMachine: + def test_tc_esm_01_states_defined(self): + """TC-ESM-01: epic-format.md defines all 4 Epic states.""" + content = EPIC_SCHEMA.read_text(encoding="utf-8") + missing = [s for s in EPIC_STATES if s not in content] + assert not missing, f"epic-format.md missing states: {missing}" + + def test_tc_esm_02_state_calculation_rules(self): + """TC-ESM-02: epic-format.md has state calculation rules table.""" + content = EPIC_SCHEMA.read_text(encoding="utf-8") + assert "状态计算规则" in content, "epic-format.md missing state calculation rules" + # Each state should appear in the rules table + for state in EPIC_STATES: + assert state in content, f"epic-format.md state calculation missing: {state}" + + +@pytest.mark.static +class TestBRStateMachine: + def test_tc_bsm_01_states_defined(self): + """TC-BSM-01: br-format.md defines all 4 BR states.""" + content = BR_SCHEMA.read_text(encoding="utf-8") + missing = [s for s in BR_STATES if s not in content] + assert not missing, f"br-format.md missing states: {missing}" + + def test_tc_bsm_02_state_calculation_rules(self): + """TC-BSM-02: br-format.md has state calculation rules table.""" + content = BR_SCHEMA.read_text(encoding="utf-8") + assert "状态计算规则" in content, "br-format.md missing state calculation rules" + + +@pytest.mark.static +class TestOppStateMachine: + def test_tc_osm_01_states_defined(self): + """TC-OSM-01: opportunity-format.md defines all 4 Opportunity states.""" + content = OPP_SCHEMA.read_text(encoding="utf-8") + missing = [s for s in OPP_STATES if s not in content] + assert not missing, f"opportunity-format.md missing states: {missing}" + + def test_tc_osm_02_state_transitions(self): + """TC-OSM-02: opportunity-format.md defines state transitions.""" + content = OPP_SCHEMA.read_text(encoding="utf-8") + assert "状态定义" in content, "opportunity-format.md missing state definitions" + assert "已采纳" in content and "EPIC" in content, \ + "opportunity-format.md missing 已采纳→EPIC transition" + + RELEASE_SCHEMA = DEVPACE_ROOT / "knowledge" / "_schema" / "release-format.md" RELEASE_TEMPLATE = DEVPACE_ROOT / "skills" / "pace-init" / "templates" / "release.md"