Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 4 additions & 11 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,8 @@ Closes #

## Documentation checklist

<!-- See docs/DOCUMENTATION.md for the full documentation standard. -->

- [ ] New/changed public API → Spec updated (`docs/spec/`)
- [ ] New/changed diagnostic ID → Spec updated + `AnalyzerReleases.Unshipped.md` updated
- [ ] Implementation detail changed → Design Doc updated (`docs/design/`)
- [ ] New RFC → used `docs/rfc/_template.md` template
- [ ] RFC status changed → frontmatter updated + archived to `docs/rfc/archive/` if Implemented/Rejected
- [ ] New ADR → numbered from `docs/adr/README.md` next available
- [ ] New Plan / Review → used `docs/plans/_template.md` / `docs/review/_template.md` template
- [ ] Plan / Review status changed → frontmatter updated + archived + index README updated
- [ ] `CHANGELOG.md` `[Unreleased]` entry added
<!-- See docs/DOCUMENTATION.md for documentation conventions. -->

- [ ] Design Doc updated if API / diagnostic / implementation changed
- [ ] User-facing docs synced (separate PRs if multi-repo)
- [ ] No documentation changes needed
52 changes: 20 additions & 32 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ DesignPatterns.slnx
├── DesignPatterns.Extensions.Autofac/ # Autofac 扩展 + Autofac 生成器 targets
├── DesignPatterns.Package/ # NuGet 元包(PackageId=Skymly.DesignPatterns)
├── tests/ # 单元 / 生成器 Verify / Analyzer / DI
├── docs/ # 维护者文档(DOCUMENTATION、DEVELOPMENT、ROADMAP、rfc/、adr/、spec/、design/、模式文档
├── docs/ # 维护者文档(DOCUMENTATION、DEVELOPMENT、ROADMAP、adr/、design/)
├── .github/ # Issue/PR 模板、CI
└── AGENTS.md
```
Expand Down Expand Up @@ -115,7 +115,7 @@ dotnet test DesignPatterns.slnx -c Release
| State(M1–M2) | `ITransitionTable`、`[StateMachine]`、`[Transition]` | `StateTransitionGenerator` |
| DI Health Checks | `AddDesignPatternsHealthChecks`、`IHealthCheck` | —(运行时扩展) |

模式文档:Spec(稳定契约)见 [docs/spec/](docs/spec/README.md),Design Doc(实现细节)见 [docs/design/](docs/design/README.md)。横切约定见 [docs/FactoryKeyConventions.md](docs/FactoryKeyConventions.md)。设计提案见 [docs/rfc/](docs/rfc/README.md),架构决策见 [docs/adr/](docs/adr/README.md)。
模式文档见 [docs/design/](docs/design/README.md)。横切约定见 [docs/FactoryKeyConventions.md](docs/FactoryKeyConventions.md)。架构决策见 [docs/adr/](docs/adr/README.md)。

---

Expand Down Expand Up @@ -160,7 +160,7 @@ dotnet test DesignPatterns.slnx -c Release

诊断 ID 规范(**本表为唯一登记源**,其他文档不得另立分类):

- 下一个可用 ID:**DP067**;ID 一经发布不复用、不改语义(DP067–DP071 已由 [RFC: Singleton 生命周期诊断](docs/rfc/SingletonLifecycleDiagnostics.md) 预留)。
- 下一个可用 ID:**DP067**;ID 一经发布不复用、不改语义(DP067–DP071 已由 [ADR-008](docs/adr/ADR-008-singleton-lifecycle-diagnostics.md) 预留)。
- 新增 / 修改诊断必须同步 [`DiagnosticIds.cs`](DesignPatterns.Diagnostics/DiagnosticIds.cs)、[`DesignPatternsDiagnosticDescriptors.cs`](DesignPatterns.Diagnostics/DesignPatternsDiagnosticDescriptors.cs)(经 Compile Link 编入 SourceGenerators / Analyzers)与 [`AnalyzerReleases.Unshipped.md`](DesignPatterns.SourceGenerators/AnalyzerReleases.Unshipped.md)。
- 归属:DP006 / DP023 / DP024 / DP025 / DP033 / DP036 / DP044 / DP060 / DP061 / DP062 / DP066 属 **Analyzer**;其余属**生成器**。
- 文案:`messageFormat` 须含可操作建议;`description` 供 IDE 悬停;`helpLinkUri` 指向 [`DesignPatterns.Docs` diagnostics 页](https://skymly.github.io/DesignPatterns.Docs/diagnostics)(`#dp###` 片段,见 [`DiagnosticHelpLinks.cs`](DesignPatterns.Diagnostics/DiagnosticHelpLinks.cs))。
Expand Down Expand Up @@ -313,40 +313,28 @@ git push origin v0.1.0-preview3

---

## 文档体系(文档驱动开发)
## 文档体系

本仓库实行**文档驱动开发**:先文档后代码,任何非琐碎变更先满足文档前置条件(决策表见 [docs/DOCUMENTATION.md §11](docs/DOCUMENTATION.md#11-文档驱动开发流程))再进入实现。文档分为 7 种类型,完整规范见 [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md)。Agent 与人类开发者均须遵守
完整约定见 [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md)。仓内沉淀 ADR + Design Doc + Roadmap;任务与审查用 GitHub Issue / PR / Release

| 类型 | 目录 | 用途 | 关键规则 |
|------|------|------|----------|
| **RFC** | `docs/rfc/` | 设计提案与讨论 | 新增模式/诊断/破坏性 API 必须 RFC;模板 `docs/rfc/_template.md`;已实现移入 `archive/` |
| **ADR** | `docs/adr/` | 架构决策记录(不可变) | RFC Accepted → 产出 ADR;编号不复用;正文不修改,仅 Supersede |
| **Spec** | `docs/spec/` | 稳定契约(API 面、诊断 ID、不变量) | 变更需 RFC + ADR;随代码 PR 同步更新 |
| **Design Doc** | `docs/design/` | 实现细节、设计权衡、已知局限 | 随代码 PR 同步更新 |
| **Plan** | `docs/plans/` | 大型任务计划(跨多 PR) | 里程碑对齐单模块 PR 边界;Done/Cancelled 移入 `archive/`;小任务用 Issue 即可 |
| **Review** | `docs/review/` | 评审记录(设计/实现/发版/回顾) | Final 后正文不可变;行动项全部关闭移入 `archive/` |
| **Roadmap** | `docs/ROADMAP.md` | 功能与技术 backlog | 完成项移入「已完成(归档)」章节 |

**归档统一规则**:归档 = 移动文件 + 更新状态字段 + 更新 README 索引,同一 PR 完成;归档后正文不再修改(仅修失效链接);归档不删除。
| 载体 | 位置 | 用途 |
|------|------|------|
| **ADR** | `docs/adr/` | 架构决策(不可变;编号不复用;仅 Supersede) |
| **Design Doc** | `docs/design/` | 每域一份:API / 诊断 / 实现与权衡 |
| **Roadmap** | `docs/ROADMAP.md` | 宏观 backlog |
| **Issue / PR / Release** | GitHub | 任务、审查、版本历史 |

### Agent 文档工作流约定
### Agent 文档工作流

| 场景 | Agent 行为 |
|------|-----------|
| 新增诊断 ID | 确认是否有对应 RFC;无则提示需创建 RFC |
| 修改公共 API | 确认是否有对应 RFC + ADR;无则提示需创建 RFC |
| 跨多 PR 的大型任务 | 确认 `docs/plans/` 是否有对应 Plan;无则先建 Plan(经用户确认)再实现 |
| 创建 RFC | 使用 `docs/rfc/_template.md`;frontmatter 从 `Draft` 开始 |
| 创建 ADR | 编号取 `docs/adr/README.md` 中下一个可用编号 |
| 创建 Plan / Review | 使用对应 `_template.md`;Review 评审人注明为 Agent |
| RFC / Plan / Review 状态变更 | 更新 frontmatter `状态` + 日期;归档时移动到对应 `archive/` 并更新 README 索引 |
| Spec 变更 | 确认 RFC 已 Accepted;同步更新 Spec 版本号 |
| CHANGELOG | 在 `[Unreleased]` 下添加条目 |
| 文档目录 | 不在 `docs/` 之外创建文档文件(`.Local/` 除外) |

### 模式文档结构
| 新增诊断 ID / 改生成器行为 / 改公开 API | 同一 PR 更新对应 Design Doc;登记 `DiagnosticIds` + descriptors + `AnalyzerReleases`;更新 `AGENTS.md` 诊断表 |
| 破坏性或跨模块架构决策 | 记新 ADR(编号取 `docs/adr/README.md` 下一个可用编号);正文不可改,仅 Supersede |
| 发版 | 按 `docs/PUBLISHING.md`;`CHANGELOG` 迁出版本节;不擅自 bump/tag/publish |
| CHANGELOG | 用户可见变更写入 `[Unreleased]` |
| 文档目录 | 不在 `docs/` 之外新建文档(`.Local/` 除外) |

所有模式文档已拆分为 Spec(`docs/spec/`)+ Design Doc(`docs/design/`)。Spec 描述稳定契约(API 面、诊断 ID、不变量),Design Doc 描述实现细节(设计权衡、已知局限)。索引见 [docs/spec/README.md](docs/spec/README.md) 和 [docs/design/README.md](docs/design/README.md)。
模式文档索引:[docs/design/README.md](docs/design/README.md)。

---

Expand All @@ -366,9 +354,9 @@ git push origin v0.1.0-preview3
Agent 行为准则——与「与用户沟通」并行生效:

1. **用户表述不清楚时,立刻询问**:不要基于猜测继续工作。用聚焦的问题(而非开放式提问)澄清意图,提供 2–4 个具体选项供用户选择。
2. **用户表述不合理时,立刻指出并给出建议**:包括但不限于——违反已有 ADR(如 Core 引用 MSDI、厚重基类体系替代 primitives)、复用或改变已发布 `DP###` 诊断 ID 的语义、未走 RFC/ADR 流程变更 Spec 契约、跳过测试(单元 / 生成器 Verify 快照 / Analyzer)、单 PR 混合多个模块、破坏兼容基线(TFM / Roslyn 4.8.0)、过度设计。指出问题时必须说明**为什么不合理**,并给出合理替代方案。
2. **用户表述不合理时,立刻指出并给出建议**:包括但不限于——违反已有 ADR(如 Core 引用 MSDI、厚重基类体系替代 primitives)、复用或改变已发布 `DP###` 诊断 ID 的语义、未更新 Design Doc / ADR 就变更已发布契约、跳过测试(单元 / 生成器 Verify 快照 / Analyzer)、单 PR 混合多个模块、破坏兼容基线(TFM / Roslyn 4.8.0)、过度设计。指出问题时必须说明**为什么不合理**,并给出合理替代方案。
3. **不要盲目执行**:即使能「做到」用户要求的事,如果认为方向有误,应先提出异议,等待用户确认后再动手。
4. **发现矛盾时主动报告**:如果用户的新要求与已有 ADR / RFC / `AGENTS.md` 规则冲突,指出冲突点,由用户决定是否更新规则或调整需求(ADR 变更须走 Supersede 流程,见 [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md))。
4. **发现矛盾时主动报告**:如果用户的新要求与已有 ADR / `AGENTS.md` 规则冲突,指出冲突点,由用户决定是否更新规则或调整需求(ADR 变更须走 Supersede 流程,见 [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md))。

## 与用户沟通

Expand Down
5 changes: 3 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- **Composite parallel traversal**: `CompositeTraverser.TraverseParallel` / `TraverseParallelAsync` / `TraverseForestParallel` / `TraverseForestParallelAsync` — parallel tree traversal with `MaxDegreeOfParallelism` and `MaxParallelDepth` options. BFS same-level parallel, DFS child-parallel recursion with sequential fallback beyond depth threshold. `AggregateException` for error aggregation. `ConfigureAwait(false)` for async paths. `#if` split: `Parallel.ForEachAsync` on net8.0, `SemaphoreSlim` + `Task.WhenAll` on netstandard2.0. 17 new tests. Design RFC: [docs/rfc/CompositeParallelTraversal.md](docs/rfc/CompositeParallelTraversal.md).
- **Composite parallel traversal**: `CompositeTraverser.TraverseParallel` / `TraverseParallelAsync` / `TraverseForestParallel` / `TraverseForestParallelAsync` — parallel tree traversal with `MaxDegreeOfParallelism` and `MaxParallelDepth` options. BFS same-level parallel, DFS child-parallel recursion with sequential fallback beyond depth threshold. `AggregateException` for error aggregation. `ConfigureAwait(false)` for async paths. `#if` split: `Parallel.ForEachAsync` on net8.0, `SemaphoreSlim` + `Task.WhenAll` on netstandard2.0. 17 new tests. See [ADR-006](docs/adr/ADR-006-composite-parallel-traversal.md).
- **DP062 Phase 2 — generated RegisterDi coverage**: `CaptiveDependencyAnalyzer` now also scans `RegisterDi` calls from DesignPatterns source generators. Extracts `implementationLifetime` (or `lifetime` for single-param overloads) and applies it to all types bearing `[RegisterStrategy]`, `[RegisterFactory]`, `[RegisterEventHandler]`, `[Decorator]`, `[CompositePart]` attributes. 5 new Verify snapshot tests.
- **Singleton lifecycle diagnostics P1 — Autofac and factory delegate coverage**: `CaptiveDependencyAnalyzer` now collects Autofac registrations (`RegisterType` + fluent lifetime chain, `Register(c => ...)`) via symbol-name matching with no Autofac package reference, and reports the new **DP066** (Warning) when a Singleton factory delegate (`AddSingleton<T>(sp => ...)` or Autofac `Register(...).SingleInstance()`) directly resolves a Scoped/Transient service via `GetRequiredService`/`GetService`/`Resolve`. MSDI factory and instance registrations now also feed the lifetime map, so Singletons constructor-depending on factory-registered Scoped/Transient services report DP062. Limitation: only direct resolution calls inside the delegate body are detected. 11 new Verify snapshot tests. RFC: [docs/rfc/SingletonLifecycleDiagnostics.md](docs/rfc/SingletonLifecycleDiagnostics.md), ADR-008.
- **Singleton lifecycle diagnostics P1 — Autofac and factory delegate coverage**: `CaptiveDependencyAnalyzer` now collects Autofac registrations (`RegisterType` + fluent lifetime chain, `Register(c => ...)`) via symbol-name matching with no Autofac package reference, and reports the new **DP066** (Warning) when a Singleton factory delegate (`AddSingleton<T>(sp => ...)` or Autofac `Register(...).SingleInstance()`) directly resolves a Scoped/Transient service via `GetRequiredService`/`GetService`/`Resolve`. MSDI factory and instance registrations now also feed the lifetime map, so Singletons constructor-depending on factory-registered Scoped/Transient services report DP062. Limitation: only direct resolution calls inside the delegate body are detected. 11 new Verify snapshot tests. See [ADR-008](docs/adr/ADR-008-singleton-lifecycle-diagnostics.md).
- **Documentation system simplification**: Removed in-repo RFC / Spec / Plan / Review document types. Spec content merged into Design Docs; task tracking and review use GitHub Issues / PRs. See [docs/DOCUMENTATION.md](docs/DOCUMENTATION.md).

## [0.2.2] - 2026-06-30

Expand Down
21 changes: 9 additions & 12 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,28 +63,25 @@ dotnet test tests/DesignPatterns.SourceGenerators.Tests --filter FullyQualifiedN

## 文档

本仓库文档体系分为 RFC、ADR、Spec、Design Doc、Roadmap 五种类型,完整规范见 [`docs/DOCUMENTATION.md`](docs/DOCUMENTATION.md)。人类开发者和 AI 编码助手均须遵守
文档约定见 [`docs/DOCUMENTATION.md`](docs/DOCUMENTATION.md)。仓内保留 ADR、Design Doc、Roadmap;任务与审查用 GitHub Issue / PR

### 文档工作流

| 变更类型 | 需要的文档操作 |
|----------|----------------|
| 新增模式 / 诊断 ID / 破坏性 API | 创建 RFC → Accepted 后产出 ADR → 实现 PR 中更新 Spec + Design Doc |
| Bug fix | Issue + PR;如影响实现细节则更新 Design Doc |
| 公共 API 变更 | Spec 更新 + CHANGELOG 条目 |
| 诊断 ID 变更 | Spec 更新 + `AnalyzerReleases.Unshipped.md` 更新 |
| 用户可见变更 | 更新 [`CHANGELOG.md`](CHANGELOG.md)(英语,Keep a Changelog;发版时将 `[Unreleased]` 条目迁入版本节) |
| 新模式 | 在 [DesignPatterns.Samples](https://github.com/Skymly/DesignPatterns.Samples) 增加示例项目、更新本仓 `docs/` 与 [`AGENTS.md`](AGENTS.md) |
| 破坏性 API / 跨模块架构 | ADR + 更新对应 Design Doc |
| 公共 API / 诊断 / 实现细节变化 | 更新 Design Doc(+ `AnalyzerReleases` / `AGENTS.md` 诊断表,如适用) |
| Bug fix | Issue + PR;影响实现细节时更新 Design Doc |
| 用户可见变更 | 更新 [`CHANGELOG.md`](CHANGELOG.md)(英语,Keep a Changelog) |
| 新模式 | DesignPatterns.Samples 示例 + 本仓 Design Doc + [`AGENTS.md`](AGENTS.md) |
| key 命名 | 遵循 [`docs/FactoryKeyConventions.md`](docs/FactoryKeyConventions.md) |
| 架构 backlog | 见 [`docs/ROADMAP.md`](docs/ROADMAP.md) |

### 文档目录

| 目录 | 用途 |
|------|------|
| [`docs/DOCUMENTATION.md`](docs/DOCUMENTATION.md) | 文档体系标准(类型、生命周期、模板、归档) |
| [`docs/rfc/`](docs/rfc/README.md) | RFC — 设计提案与讨论 |
| [`docs/adr/`](docs/adr/README.md) | ADR — 架构决策记录 |
| [`docs/spec/`](docs/spec/README.md) | Spec — 稳定契约 |
| [`docs/design/`](docs/design/README.md) | Design Doc — 实现细节 |
| [`docs/DOCUMENTATION.md`](docs/DOCUMENTATION.md) | 文档约定 |
| [`docs/adr/`](docs/adr/README.md) | ADR — 架构决策 |
| [`docs/design/`](docs/design/README.md) | Design Doc — 每域设计 |
| [`docs/ROADMAP.md`](docs/ROADMAP.md) | 路线图 |
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,8 @@ DesignPatterns.slnx
| [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) | 环境、构建、测试、架构约定 |
| [docs/PUBLISHING.md](docs/PUBLISHING.md) | NuGet 发版流程 |
| [docs/FactoryKeyConventions.md](docs/FactoryKeyConventions.md) | Strategy / Factory key 命名约定 |
| [docs/spec/](docs/spec/README.md) | 模式规范(Spec)— 稳定契约:API 面、诊断 ID、不变量 |
| [docs/design/](docs/design/README.md) | 模式设计文档(Design Doc)— 实现细节、设计权衡、已知局限 |
| [docs/design/](docs/design/README.md) | 模式设计文档(Design Doc)— API / 诊断 / 实现与权衡 |
| [docs/adr/](docs/adr/README.md) | 架构决策记录(ADR) |
| [docs/ROADMAP.md](docs/ROADMAP.md) | 功能与技术 backlog |
| [CONTRIBUTING.md](CONTRIBUTING.md) | 贡献与测试说明 |
| [AGENTS.md](AGENTS.md) | AI 编码助手项目上下文 |
Expand Down
Loading
Loading