* chore: wire docs/agents config into AGENTS.md Agent skills section
Add the `## Agent skills` discovery block pointing the engineering
skills at the existing docs/agents/{issue-tracker,triage-labels,domain}.md
files (issue tracker, triage label mapping, single-context domain docs).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: rebrand to GSD Core and restructure docs with Diataxis
Reorganise the root README and docs/ around the Diataxis framework
(tutorials, how-to guides, reference, explanation), add new how-to
guides and schema references (STATE.md / CONTEXT.md / PLAN.md /
planning artifacts), and cross-link the whole set. Update the lone
legacy gsd-build reference to open-gsd; keep internal get-shit-done/
filesystem paths unchanged (directory rename tracked separately in
open-gsd/gsd-core#604). Regenerate the ja-JP, ko-KR, pt-BR and zh-CN
localised trees to mirror the new structure.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: backfill changeset PR number (#605)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
202 lines
11 KiB
Markdown
202 lines
11 KiB
Markdown
# STATE.md 架构参考
|
||
|
||
`STATE.md` 是 GSD Core 的动态项目记忆文件——一个记录项目当前状态、最近发生的事情以及下一步操作的单一 Markdown 文档。本页面记录其结构。参见[文档索引](../README.md)。
|
||
|
||
---
|
||
|
||
## 概述
|
||
|
||
由 GSD Core 管理的每个项目在 `.planning/STATE.md` 处保存一个 `STATE.md`。该文件在每次工作流开始时被读取,并在每次重要操作后被写入。该文件包含:
|
||
|
||
- **YAML 前置数据** — 机器可读字段,由状态行钩子(`parseStateMd`)和 `gsd-tools state` 命令使用。
|
||
- **Markdown 正文** — 人类可读的章节,涵盖当前位置、累积的上下文、会话连续性以及性能指标。
|
||
|
||
该文件有意保持较小(目标:不超过 100 行)。它是项目状态的摘要,而非存档。
|
||
|
||
---
|
||
|
||
## YAML 前置数据
|
||
|
||
前置数据出现在文件最开头的 `---` 分隔符之间。除 `gsd_state_version` 和 `status` 外,所有字段均为可选;当相关数据尚不可用时,字段可以缺失。
|
||
|
||
### 注释示例
|
||
|
||
```yaml
|
||
---
|
||
gsd_state_version: '1.0'
|
||
milestone: v2.0
|
||
milestone_name: Code Quality
|
||
status: executing
|
||
|
||
# Phase-lifecycle fields — all optional (added in v1.40.0, issue #2833)
|
||
active_phase: "4.5"
|
||
next_action: execute-phase
|
||
next_phases: ["4.5"]
|
||
|
||
progress:
|
||
total_phases: 17
|
||
completed_phases: 10
|
||
total_plans: 84
|
||
completed_plans: 47
|
||
percent: 59
|
||
|
||
# Additional fields written by syncStateFrontmatter
|
||
current_phase: "4"
|
||
current_phase_name: Observability
|
||
current_plan: "3"
|
||
last_updated: "2026-06-01T12:34:56.789Z"
|
||
last_activity: "2026-06-01"
|
||
stopped_at: "Phase 4 P3 execution complete"
|
||
paused_at: null
|
||
---
|
||
```
|
||
|
||
### 字段参考
|
||
|
||
| 字段 | 类型 | 填充时机 | 用途 |
|
||
|---|---|---|---|
|
||
| `gsd_state_version` | 字符串(`'1.0'`) | 始终 | 架构版本;在第一次 `state.*` 调用时由 `syncStateFrontmatter` 写入。 |
|
||
| `milestone` | 字符串(如 `v2.0`) | 配置了里程碑时 | 当前里程碑版本,从项目配置中读取。 |
|
||
| `milestone_name` | 字符串 | 配置了里程碑时 | 里程碑的人类可读标签(如 `Code Quality`)。 |
|
||
| `status` | 字符串 | 始终 | 当前生命周期阶段。由 `normalizeStateStatus()` 规范化——参见[状态值](#状态值)。 |
|
||
| `active_phase` | 字符串(如 `"4.5"`) | 编排器命令正在处理该阶段时 | 当前正在处理的阶段编号。阶段之间时设为 `null`。 |
|
||
| `next_action` | 字符串 | 空闲且有推荐命令时 | 下一步要运行的斜线命令:`discuss-phase`、`plan-phase`、`execute-phase` 或 `verify-phase`。当编排器正在运行或无可用推荐时设为 `null`。 |
|
||
| `next_phases` | YAML 流数组(如 `["4.5"]`) | 与 `next_action` 配合使用 | `next_action` 适用的阶段 ID(通常 1–2 项)。与 `next_action` 相同条件下设为 `null`。 |
|
||
| `progress.total_phases` | 整数 | 阶段数据可用时 | 当前里程碑中的阶段总数,从 ROADMAP.md 和阶段目录派生。 |
|
||
| `progress.completed_phases` | 整数 | 阶段数据可用时 | 磁盘上所有计划摘要均已存在的阶段数量(即每个计划均已完成)。 |
|
||
| `progress.total_plans` | 整数 | 计划文件存在时 | 当前里程碑中所有阶段的计划文件总数。 |
|
||
| `progress.completed_plans` | 整数 | 摘要文件存在时 | 已完成的计划摘要总数(每个已执行计划一个 SUMMARY.md)。 |
|
||
| `progress.percent` | 整数 0–100 | 进度数据可用时 | 里程碑在**阶段维度**的进度(`min(completed_plans/total_plans, completed_phases/total_phases)`)。状态行进度条仅在该字段存在时渲染——缺失时进度条不显示。 |
|
||
| `current_phase` | 字符串 | 阶段正在执行时 | 从正文 `Current Phase:` 字段提取的阶段编号。 |
|
||
| `current_phase_name` | 字符串 | 阶段有名称时 | 从正文 `Current Phase Name:` 字段提取的阶段名称。 |
|
||
| `current_plan` | 字符串 | 计划进行中时 | 从正文 `Current Plan:` 字段提取的计划编号。 |
|
||
| `last_updated` | ISO-8601 时间戳 | 始终(写入时) | 最后一次 `syncStateFrontmatter` 调用的时间戳;由 `realClock.nowIso()` 写入。 |
|
||
| `last_activity` | 字符串 | 正文中设置时 | 最后活动日期,从正文 `Last Activity:` 字段提取。 |
|
||
| `stopped_at` | 字符串 | 记录了停止点时 | 最后完成操作的描述;限定在 `## Session` 正文章节内,以避免匹配存档文本。 |
|
||
| `paused_at` | 字符串 | 项目已暂停时 | 暂停点的自由描述;未暂停时缺失或为 `null`。 |
|
||
|
||
### 状态值
|
||
|
||
`get-shit-done/bin/lib/state-document.cjs` 中的 `normalizeStateStatus()` 将原始正文文本映射到以下规范值:
|
||
|
||
| 规范值 | 匹配文本(不区分大小写) |
|
||
|---|---|
|
||
| `discussing` | 包含 `discussing` |
|
||
| `planning` | 包含 `planning` 或 `ready to plan` |
|
||
| `executing` | 包含 `executing`、`in progress` 或 `ready to execute` |
|
||
| `verifying` | 包含 `verif` |
|
||
| `completed` | 包含 `complete` 或 `done` |
|
||
| `paused` | 包含 `paused` 或 `stopped`,或 `paused_at` 有值 |
|
||
| `unknown` | 以上均不符合 |
|
||
|
||
当编排器命令正在运行时,惯例(issue #2833)是直接将生命周期阶段写入 `status`:
|
||
|
||
| 命令 | 运行期间的 `status` |
|
||
|---|---|
|
||
| `/gsd-discuss-phase` | `discussing` |
|
||
| `/gsd-plan-phase` | `planning` |
|
||
| `/gsd-execute-phase` | `executing` |
|
||
| `/gsd-verify-work` | `verifying` |
|
||
|
||
---
|
||
|
||
## 状态行渲染场景
|
||
|
||
`hooks/gsd-statusline.js` 中的 `formatGsdState()` 读取已解析的前置数据并输出**第一个匹配的场景**。如果没有新的生命周期字段适用,渲染将回退到与 v1.38.x 完全一致的原始格式。
|
||
|
||
| 场景 | 触发条件 | 显示示例 |
|
||
|---|---|---|
|
||
| **1. 阶段活跃** | `active_phase` 已填充 | `v2.0 [██░░░░░░░░] 20% · Phase 4.5 executing` |
|
||
| **2. 空闲,有下一步推荐** | `active_phase` 为 null 且 `next_action` 和 `next_phases` 均已填充 | `v2.0 [██░░░░░░░░] 20% · next execute-phase 4.5` |
|
||
| **3. 里程碑完成** | `percent` 为 `100` 或 `completed_phases == total_phases` | `v2.0 [██████████] 100% · milestone complete` |
|
||
| **4. 默认回退** | 以上均不匹配 | `v1.9 Code Quality · executing · ph 1/5`(现有格式) |
|
||
|
||
**场景优先级:** 当 `active_phase` 和 `next_action` 均已填充时,场景 1 优先——编排器正在运行,显示"下一步推荐"会造成误导。此优先级由 `formatGsdState()` 中的检查顺序强制执行,并由 `tests/enh-2833-phase-lifecycle-statusline.test.cjs` 中的 `"scene priority"` 测试套件覆盖。
|
||
|
||
进度条(`[██░░░░░░░░] 20%`)仅在前置数据中存在 `progress.percent` 时才追加到里程碑段;缺失则不显示进度条。
|
||
|
||
---
|
||
|
||
## 前置数据解析约束
|
||
|
||
状态行钩子使用基于正则表达式的解析(无完整 YAML 库),因此以下约束适用。这些约束在 `tests/enh-2833-phase-lifecycle-statusline.test.cjs` 中经过测试。
|
||
|
||
1. **前置数据必须从文件的第一个字符开始。** 任何内容——包括注释——出现在开头 `---` 之前都会使匹配失效。开头的 `---` 行必须恰好如此,不能有尾随空格。
|
||
|
||
2. **不支持嵌套块内的注释。** `progress:` 块解析器要求下一行为 `[ \t]+\w+:`。在 `progress:` 和其第一个键之间插入 `# comment` 会破坏匹配,进度条将消失。任何说明文档应放在 `STATE.md` 正文中,而不是放在前置数据块内。
|
||
|
||
3. **`next_phases` 首选格式为单行流式。** 解析器首先尝试 `next_phases: ["4.5", "4.6"]`。块序列(`- 4.5\n- 4.6`)也可解析,但对状态行渲染的可靠性较低。优先使用单行流式格式的 `next_phases` 以保持基于正则表达式的解析器的可预测性。如果需要记录大量候选阶段以供文档说明,请将其存储在 `STATE.md` 正文中。
|
||
|
||
如果未来的变更将正则表达式解析器替换为完整的 YAML 库,则这些约束可以放宽,并相应更新测试。
|
||
|
||
---
|
||
|
||
## Markdown 正文章节
|
||
|
||
正文(结束 `---` 之后的所有内容)遵循 `get-shit-done/templates/state.md` 中的模板。标准章节为:
|
||
|
||
### 项目参考
|
||
|
||
指向 `.planning/PROJECT.md`。包含:
|
||
- **核心价值** — 来自 `PROJECT.md` 核心价值章节的一句话说明。
|
||
- **当前焦点** — 哪个阶段处于活跃状态。
|
||
|
||
### 当前位置
|
||
|
||
项目当前所处的状态:
|
||
|
||
| 字段 | 格式 |
|
||
|---|---|
|
||
| `Phase:` | `X of Y (Phase name)` |
|
||
| `Plan:` | `A of B in current phase` |
|
||
| `Status:` | 自由文本,如 `Ready to execute`、`Executing Phase 4`、`Phase complete — ready for verification` |
|
||
| `Last activity:` | 处理器写入时为 ISO 日期(`YYYY-MM-DD`);执行器编写时为叙述性文本 |
|
||
| `Progress:` | 可视化进度条,如 `[████░░░░░░] 40%` |
|
||
|
||
当现有值为已知模板默认值时,该章节中的 `Status:` 和 `Last activity:` 字段由 GSD 处理器更新(Knuth 不变式:执行器编写的值被保留)。已知处理器默认值的完整列表位于 `get-shit-done/bin/lib/state-document.cjs` 中的 `KNOWN_TEMPLATE_DEFAULTS`。
|
||
|
||
### 性能指标
|
||
|
||
执行速度跟踪:
|
||
- 已完成计划总数,每个计划的平均耗时。
|
||
- 每阶段明细表(`Phase | Plans | Total | Avg/Plan`)。
|
||
- 近期趋势:改善中 / 稳定 / 下降中。
|
||
|
||
每次计划完成后更新。
|
||
|
||
### 累积的上下文
|
||
|
||
**决策** — 影响当前工作的近期决策摘要(完整日志在 `PROJECT.md` 中)。通过 `gsd-tools state add-decision` 添加。
|
||
|
||
**待处理的待办事项** — 数量及对 `.planning/todos/pending/` 的引用。通过 `/gsd-capture` 捕获。
|
||
|
||
**阻碍/关切** — 影响未来工作的问题,以发起阶段为前缀。通过 `gsd-tools state add-blocker` 添加;通过 `gsd-tools state resolve-blocker` 解决。
|
||
|
||
### 会话连续性
|
||
|
||
实现即时会话恢复:
|
||
- `Last session:` — 上次会话的 ISO-8601 时间戳。
|
||
- `Stopped at:` — 最后完成操作的描述。
|
||
- `Resume file:` — 指向 `.continue-here*.md` 文件的路径(若存在),否则为 `None`。
|
||
|
||
---
|
||
|
||
## 向后兼容性
|
||
|
||
阶段生命周期字段(`active_phase`、`next_action`、`next_phases` 以及用于进度条的 `progress.percent`)是**按项目可选添加**的:
|
||
|
||
- 未填充任何生命周期字段的 `STATE.md` 渲染结果与 v1.38.x 及更早版本**逐字节完全相同**。
|
||
- 添加任何生命周期字段是可选的——当字段缺失时,渲染器会优雅降级。
|
||
- 即使 `progress` 块存在,进度条也是可选的:只有 `progress.percent` 触发进度条;单独的 `total_phases` 和 `completed_phases` 不会触发。
|
||
|
||
`tests/enh-2833-phase-lifecycle-statusline.test.cjs` 中的 `formatGsdState #2833 backward compatibility` 测试套件锁定了此保证;任何破坏旧版 `STATE.md` 渲染的变更都将导致该套件失败。
|
||
|
||
---
|
||
|
||
## 相关内容
|
||
|
||
- [规划产物](planning-artifacts.md)
|
||
- [配置](../CONFIGURATION.md)
|
||
- [阶段循环](../explanation/the-phase-loop.md)
|
||
- [文档索引](../README.md)
|