Skip to content

Commit c09e798

Browse files
MRNIUcodex
andcommitted
docs(governance): 收紧开发环境文档约定
同步模板治理约定在项目文档中的落点,明确宿主机只作为容器入口,不再引导安装项目开发依赖。 - 移除 README 和 docs/docker.md 中的 Dev Container CLI 全局安装提示。 - 将 README、AGENTS、CONTRIBUTING 和 docs/docker.md 的项目命令统一为 devcontainer exec 入口。 - 补齐 Copyright、注释、DCO、文件规模和运行时配置约定,并记录后续全仓库文件头检查。 验证: - git diff --check - git diff --staged --check - rg 检查宿主机安装指令和裸项目命令示例无残留 - staged diff 新增行凭据扫描无匹配 Co-authored-by: OpenAI Codex <noreply@openai.com> Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
1 parent 4f6ecd0 commit c09e798

7 files changed

Lines changed: 118 additions & 76 deletions

File tree

AGENTS.md

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<!-- Copyright The SimpleKernel Contributors -->
2+
13
# AGENTS.md — SimpleKernel
24

35
## OVERVIEW
@@ -69,19 +71,27 @@ docs/design/ # Design docs (SAS architecture, subsystem designs, phase p
6971

7072
## CONVENTIONS
7173

72-
> Full Rust coding conventions: `docs/design/00-概述.md` §9
74+
> Full project conventions: `docs/conventions.md`; legacy phase design conventions: `docs/design/00-概述.md` §9
7375
7476
### Environment
7577
- **容器优先**:凡是能在 Dev Container / Docker 中完成的构建、检查、`pre-commit`、固件构建、QEMU 运行和系统测试,都应在容器内执行,不要为本项目修改宿主机工具链。
76-
- **宿主机边界**:宿主机只负责 Docker 或兼容容器运行时、Dev Container CLI/扩展、Git 等入口工具;不要在宿主机安装 Rust nightly、交叉编译器、QEMU 或固件构建依赖来绕过容器
78+
- **宿主机边界**:宿主机只负责 Docker 或兼容容器运行时、Git、编辑器/AI agent 和已有 Dev Container 入口工具;不要在宿主机安装 Rust nightly、交叉编译器、QEMU、固件构建依赖或其他项目开发依赖来绕过容器
7779
- **命令入口**:在宿主机发起命令时优先使用 `devcontainer exec --workspace-folder . <command>`,或使用当前已构建的项目开发镜像运行等价命令。
78-
- **例外**只有容器不可用、任务明确要求本地环境,或正在修复容器自身配置时,才考虑宿主机执行;说明原因并保持宿主/容器步骤边界清晰。
80+
- **例外**只有正在修复容器自身配置、文档/Git 等入口操作,或任务明确要求无需项目工具链的本地操作时,才考虑宿主机执行;说明原因并保持宿主/容器步骤边界清晰。
7981

8082
### Git
8183
- **Commit 格式**: `<type>(<scope>): <subject>` — type: feat/fix/refactor/test/docs/chore
8284
- **Sign-off 必须**: 每条 commit 必须使用 `git commit --signoff`(DCO 签署),**不可省略**
85+
- **DCO 门禁**:PR CI 会检查每个 commit 是否包含 `Signed-off-by` trailer。
86+
- **Commit 模板**:可执行 `git config commit.template .gitmessage` 启用仓库提交模板;模板必须镜像 `docs/git.md`
8387
- **Subagent 派发时**:给 subagent 的 commit 指令中也必须包含 `--signoff`
8488

89+
### Repository Hygiene
90+
- **Copyright**:仓库自有源码、脚本、CI 配置、重要项目配置和长期维护文档,新增时应带 `Copyright The SimpleKernel Contributors` 文件头;严格 JSON 或不支持注释的文件不强行加入文件头。
91+
- **机器可读格式**`.json` 文件保持严格 JSON,不写注释、不留尾随逗号;需要说明时写在相邻文档。
92+
- **文件规模**:手写源码超过 300 行时 review 应检查职责边界;原则上不超过 500 行,超过时 PR 需说明暂不拆分理由或拆分计划。
93+
- **运行时配置**:FDT、MMIO、timer 频率、core count、QEMU 参数、固件路径和硬件拓扑等运行时/platform 输入必须显式校验;缺失或非法输入应 fail fast,不用 `Default``unwrap_or(...)` 等隐式 fallback 掩盖。
94+
8595
### Rust
8696
- **Language**: Rust nightly, `#![no_std]`, `#![no_main]`, edition 2024
8797
- **Naming**: `snake_case` functions/methods, `PascalCase` types/traits/enums, `SCREAMING_SNAKE_CASE` constants
@@ -91,6 +101,7 @@ docs/design/ # Design docs (SAS architecture, subsystem designs, phase p
91101
- **Doc comments**: `///` with `# Safety`, `# Errors`, `# Panics` sections for public APIs(节标题保留英文,内容用中文)
92102
- **注释语言**: 所有注释和文档注释使用中文;`// SAFETY:` 前缀保留英文(Rust 社区惯例),其后说明用中文
93103
- **注释位置**: 注释写在代码上方,不写在行尾(`// SAFETY:` 除外——紧跟 `unsafe` 块上方)
104+
- **注释内容**: 注释解释原因、不变量和失败后果,不重复代码表面含义;临时 TODO 必须说明触发条件、后续处理位置或关联文档。
94105
- **Error handling**: Syscall boundary uses `Result<T, ErrorCode>` + `?`; kernel internals use `.expect("reason with data")` or `panic!()` — the kernel must not silently proceed on internal errors
95106
- **Unsafe**: Every `unsafe` block MUST have `// SAFETY:` comment explaining invariants; minimize scope
96107
- **Singletons**: `spin::Once<T>` with `call_once()` / `get()`
@@ -122,28 +133,31 @@ docs/design/ # Design docs (SAS architecture, subsystem designs, phase p
122133
- Cargo workspace: root package (kernel) + `xtask` (build tool)
123134

124135
## COMMANDS
136+
宿主机侧执行项目命令时使用 `devcontainer exec --workspace-folder . <command>`
137+
125138
```bash
126139
# Build kernel
127-
cargo xtask build --arch riscv64
128-
cargo xtask build --arch aarch64
140+
devcontainer exec --workspace-folder . cargo xtask build --arch riscv64
141+
devcontainer exec --workspace-folder . cargo xtask build --arch aarch64
129142

130143
# Run in QEMU (via xtask — handles FIT image + TFTP + QEMU)
131-
cargo xtask run --arch riscv64
132-
cargo xtask run --arch aarch64
144+
devcontainer exec --workspace-folder . cargo xtask run --arch riscv64
145+
devcontainer exec --workspace-folder . cargo xtask run --arch aarch64
133146

134147
# Debug (GDB on localhost:1234)
135-
cargo xtask debug --arch riscv64
148+
devcontainer exec --workspace-folder . cargo xtask debug --arch riscv64
136149

137150
# System tests in QEMU
138-
cargo xtask test --arch riscv64 # all standalone tests
139-
cargo xtask test --arch riscv64 --name panic-test # specific standalone test
140-
cargo xtask test --list # list available tests
151+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64
152+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --name panic-test
153+
devcontainer exec --workspace-folder . cargo xtask test --list
141154

142155
# Format + lint check
143-
cargo fmt --check && cargo clippy -- -D warnings
156+
devcontainer exec --workspace-folder . cargo fmt --check
157+
devcontainer exec --workspace-folder . cargo clippy -- -D warnings
144158

145159
# Documentation
146-
cargo doc --no-deps
160+
devcontainer exec --workspace-folder . cargo doc --no-deps
147161
```
148162

149163
**QEMU 超时**:在 QEMU 中运行内核或测试时经常出现卡死或无限循环打印日志的情况。所有通过 Bash 工具执行的 QEMU 相关命令(`cargo xtask run``cargo xtask test`**必须设置 30 秒超时**`timeout: 30000`)。超时后应 `pkill -f qemu-system` 清理残留进程。
@@ -157,9 +171,9 @@ cargo doc --no-deps
157171
每个测试是独立的 `#![no_std]` 裸机二进制,启动独立 QEMU 实例,拥有干净的内核环境。
158172

159173
```bash
160-
cargo xtask test --arch riscv64 # 全部独立测试
161-
cargo xtask test --arch riscv64 --name frame-alloc-test # 指定测试
162-
cargo xtask test --list # 列出可用测试
174+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64
175+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --name frame-alloc-test
176+
devcontainer exec --workspace-folder . cargo xtask test --list
163177
```
164178

165179
测试基础设施位于 `tests/test_harness/`,核心是 `test_main!` 宏:

CONTRIBUTING.md

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1+
<!-- Copyright The SimpleKernel Contributors -->
2+
13
# 贡献指南
24

35
感谢参与 SimpleKernel。提交前请先阅读根目录 `AGENTS.md``docs/conventions.md``docs/git.md`
46

57
## 开发环境
68

7-
开发环境默认使用 Dev Container。宿主机只需要 Docker 或兼容容器运行时、Dev Container CLI/扩展、Git 等入口工具;不要为了本项目在宿主机安装 Rust nightly、交叉编译器、QEMU 或固件构建依赖
9+
开发环境默认使用 Dev Container。宿主机只保留 Docker 或兼容容器运行时、Git、编辑器/AI agent 和已有 Dev Container 入口工具;不要为了本项目在宿主机安装 Rust nightly、交叉编译器、QEMU、固件构建依赖或其他项目开发依赖
810

911
```bash
1012
devcontainer up --workspace-folder .
1113
devcontainer exec --workspace-folder . bash
1214
```
1315

14-
容器内常用命令
16+
宿主机侧常用命令
1517

1618
```bash
17-
cargo xtask build --arch riscv64
18-
cargo xtask test --arch riscv64
19-
cargo fmt --check
20-
cargo clippy -- -D warnings
19+
devcontainer exec --workspace-folder . cargo xtask build --arch riscv64
20+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64
21+
devcontainer exec --workspace-folder . cargo fmt --check
22+
devcontainer exec --workspace-folder . cargo clippy -- -D warnings
2123
```
2224

2325
通过 Bash 工具运行 QEMU 相关命令时必须设置 30 秒超时;超时后清理残留 QEMU 进程。
@@ -37,6 +39,8 @@ cargo clippy -- -D warnings
3739
|------|--------------|
3840
| 启动流程、命令、测试入口变化 | `README.md``docs/README.md`、相关 SOP |
3941
| 架构不变量变化 | `docs/adr/`、SAD/SDD、`AGENTS.md` |
42+
| 项目长期约定、Copyright、注释、文件规模、运行时配置规则变化 | `AGENTS.md``docs/conventions.md` |
43+
| Git/commit/DCO/提交模板变化 | `docs/git.md``.gitmessage`、PR 模板 |
4044
| 公开 trait、错误码、类型或模块边界变化 | 代码文档注释、SDD、模块 README |
4145
| 固件、第三方源码、供应商交付物变化 | `3rd/` 记录、`docs/suppliers/``docs/production/` |
4246
| 硬件或生产流程变化 | `docs/hardware/``docs/sop/` |
@@ -48,6 +52,9 @@ cargo clippy -- -D warnings
4852
- 不使用 `.unwrap()`;错误信息必须包含有助于定位问题的数据。
4953
- 内核互斥使用项目自定义 `SpinLock<T>`
5054
- trait 是契约,不要为了某个实现把实现细节塞进 trait 定义。
55+
- 新增自有源码、脚本、CI 配置、重要配置和长期维护文档时按 `docs/conventions.md` 添加 Copyright 文件头。
56+
- 手写源码超过 300 行时主动检查职责边界;超过 500 行时 PR 说明暂不拆分理由或拆分计划。
57+
- 运行时/platform 输入缺失或非法时 fail fast,不用隐式默认值掩盖配置或硬件描述问题。
5158

5259
## Commit
5360

@@ -56,3 +63,11 @@ commit 使用 `docs/git.md` 中的格式,并且必须带 DCO sign-off:
5663
```bash
5764
git commit --signoff -m "docs(conventions): 补充文档结构约定"
5865
```
66+
67+
可选启用仓库提交模板:
68+
69+
```bash
70+
git config commit.template .gitmessage
71+
```
72+
73+
PR CI 会检查每个 commit 是否包含 `Signed-off-by` trailer。

README.md

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<!-- Copyright The SimpleKernel Contributors -->
2+
13
[![codecov](https://codecov.io/gh/Simple-XX/SimpleKernel/graph/badge.svg?token=J7NKK3SBNJ)](https://codecov.io/gh/Simple-XX/SimpleKernel)
24
![workflow](https://github.com/Simple-XX/SimpleKernel/actions/workflows/workflow.yml/badge.svg)
35
![commit-activity](https://img.shields.io/github/commit-activity/t/Simple-XX/SimpleKernel)
@@ -86,11 +88,11 @@ pub trait Scheduler: Send + Sync {
8688
#### 3. 测试验证
8789

8890
```bash
89-
# 单元测试(宿主机)
90-
cargo test
91+
# 单元测试
92+
devcontainer exec --workspace-folder . cargo test
9193

9294
# 系统测试(QEMU)
93-
cargo xtask test --arch riscv64
95+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64
9496
```
9597

9698
#### 4. 对照参考实现
@@ -124,8 +126,7 @@ cd SimpleKernel
124126
# 安装 Dev Containers 扩展后,点击左下角 >< 图标
125127
# 选择 "Reopen in Container"
126128

127-
# 或使用 CLI
128-
npm install -g @devcontainers/cli
129+
# 或使用已存在的 Dev Container CLI
129130
devcontainer up --workspace-folder .
130131
devcontainer exec --workspace-folder . bash
131132
```
@@ -134,35 +135,35 @@ devcontainer exec --workspace-folder . bash
134135
>
135136
> 详细说明见 [Dev Container 文档](./docs/docker.md)
136137
137-
> 开发环境默认优先使用 Dev Container。除安装 Docker、Dev Container CLI/扩展
138-
> Git 等入口工具外,不需要在宿主机安装 Rust nightly、交叉编译器、QEMU 或固件构建依赖
138+
> 开发环境默认优先使用 Dev Container。宿主机只保留 Docker 或兼容容器运行时
139+
> Git、编辑器/AI agent 和已有 Dev Container 入口工具;不要为了本项目在宿主机安装开发依赖
139140
140141
**方式二:修复容器或执行明确要求的本地任务**
141142

142-
默认不在宿主机安装 Rust nightly、交叉编译器、QEMU 或固件构建依赖。只有容器不可用、正在修复容器自身配置,或任务明确要求本地环境时,才在宿主机执行,并在 PR 中说明原因和验证边界。
143+
默认不在宿主机安装 Rust nightly、交叉编译器、QEMU、固件构建依赖或其他项目开发依赖。只有正在修复容器自身配置、文档/Git 等入口操作,或任务明确要求无需项目工具链的本地操作时,才在宿主机执行,并在 PR 中说明原因和验证边界。
143144

144145
### 编译与运行
145146

146-
```bash
147-
cd SimpleKernel
147+
以下项目命令通过 Dev Container、Codespaces 或 CI 声明的隔离环境执行;宿主机只作为 Docker/Dev Container 编排入口。
148148

149+
```bash
149150
# 编译内核
150-
cargo xtask build --arch riscv64
151+
devcontainer exec --workspace-folder . cargo xtask build --arch riscv64
151152

152153
# 在 QEMU 模拟器中运行
153-
cargo xtask run --arch riscv64
154+
devcontainer exec --workspace-folder . cargo xtask run --arch riscv64
154155

155156
# 调试(GDB 连接 localhost:1234)
156-
cargo xtask debug --arch riscv64
157+
devcontainer exec --workspace-folder . cargo xtask debug --arch riscv64
157158

158-
# 单元测试(宿主机 x86_64)
159-
cargo test
159+
# 单元测试
160+
devcontainer exec --workspace-folder . cargo test
160161

161162
# 系统测试(QEMU 中运行)
162-
cargo xtask test --arch riscv64 # 统一测试内核
163-
cargo xtask test --arch riscv64 --all # 全部测试(统一 + 独立)
164-
cargo xtask test --arch riscv64 --name panic-test # 指定独立测试
165-
cargo xtask test --list # 列出可用测试
163+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64
164+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --all
165+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --name panic-test
166+
devcontainer exec --workspace-folder . cargo xtask test --list
166167
```
167168

168169
**支持的架构:**
@@ -218,12 +219,12 @@ SimpleKernel/
218219

219220
SimpleKernel 采用两层测试 + 冒烟测试:
220221

221-
### 单元测试(宿主机
222+
### 单元测试(容器内 host target
222223

223-
纯逻辑 crate 的 `#[test]` 模块,在宿主机上运行
224+
纯逻辑 crate 的 `#[test]` 模块,在容器内以宿主架构运行
224225

225226
```bash
226-
cargo test -p memory_types -p config -p page_table_entry -p arch
227+
devcontainer exec --workspace-folder . cargo test -p memory_types -p config -p page_table_entry -p arch
227228
```
228229

229230
覆盖范围:地址运算、PTE 编解码、常量验证等。
@@ -233,9 +234,9 @@ cargo test -p memory_types -p config -p page_table_entry -p arch
233234
每个测试是独立的 `#![no_std]` 裸机二进制,启动独立 QEMU 实例,拥有干净的内核环境。
234235

235236
```bash
236-
cargo xtask test --arch riscv64 --all # 全部测试
237-
cargo xtask test --arch riscv64 --name <name> # 指定测试
238-
cargo xtask test --list # 列出可用测试
237+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --all
238+
devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --name <name>
239+
devcontainer exec --workspace-folder . cargo xtask test --list
239240
```
240241

241242
测试位于 `tests/` 目录,使用 `tests/test_harness/` 提供的 `test_main!` 宏消除样板代码。
@@ -295,6 +296,7 @@ cargo xtask test --list # 列出可用测试
295296
- **格式化**: `rustfmt.toml`(100 字符宽度),`cargo fmt` 强制执行
296297
- **静态检查**: `cargo clippy -- -D warnings`
297298
- **注释语言**: 所有注释和文档注释使用中文;`// SAFETY:` 前缀保留英文
299+
- **完整约定**: Copyright、注释、文件规模、严格 JSON、第三方代码和运行时配置规则见 [docs/conventions.md](./docs/conventions.md)
298300

299301
### 命名约定
300302

@@ -310,11 +312,17 @@ cargo xtask test --list # 列出可用测试
310312
```
311313
<type>(<scope>): <subject>
312314
313-
type: feat|fix|docs|style|refactor|perf|test|build|revert
315+
type: feat|fix|refactor|test|docs|chore|build|ci|perf|style|revert
314316
scope: 可选,影响的模块 (arch, memory, task, xtask)
315317
```
316318

317319
每条 commit 必须使用 `git commit --signoff`(DCO 签署)。
320+
PR CI 会检查每个 commit 是否包含 `Signed-off-by` trailer。
321+
可选提交模板:
322+
323+
```bash
324+
git config commit.template .gitmessage
325+
```
318326

319327
## 文档入口
320328

@@ -346,8 +354,8 @@ scope: 可选,影响的模块 (arch, memory, task, xtask)
346354

347355
1. Fork 本仓库
348356
2. 创建功能分支: `git checkout -b feat/amazing-feature`
349-
3. 遵循代码规范进行开发
350-
4. 确保所有测试通过: `cargo test && cargo xtask test --arch riscv64 --all`
357+
3. 遵循 `AGENTS.md``docs/conventions.md``docs/git.md` 进行开发
358+
4. 确保相关测试通过,例如 `devcontainer exec --workspace-folder . cargo test``devcontainer exec --workspace-folder . cargo xtask test --arch riscv64 --all`
351359
5. 提交变更: `git commit --signoff -m 'feat(scope): add amazing feature'`
352360
6. 创建 Pull Request
353361

docs/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<!-- Copyright The SimpleKernel Contributors -->
2+
13
# docs/
24

35
本目录保存 SimpleKernel 的项目文档。代码是实现真值源;当历史设计文档与代码冲突时,以当前代码为准,并在审查记录或 ADR 中标出差异。
@@ -36,8 +38,8 @@ docs/
3638
| 跟踪审计阶段目标、进度和发现 | `docs/audit/` |
3739
| 记录硬件接口、固件、生产、供应商或 SOP | `docs/hardware/``docs/production/``docs/suppliers/``docs/sop/` |
3840
| 创建局部协作规则或新文档 | `docs/templates/` |
39-
| 记录长期工程约定 | `docs/conventions.md` |
40-
| 记录 Git 和 commit 规范 | `docs/git.md` |
41+
| 记录长期工程约定,包括 Copyright、注释、文件规模、严格 JSON、第三方代码和运行时配置 | `docs/conventions.md` |
42+
| 记录 Git、commit、DCO`.gitmessage` 规范 | `docs/git.md` |
4143

4244
## SAD、SDD 与历史文档边界
4345

docs/conventions.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
<!-- Copyright The SimpleKernel Contributors -->
2+
13
# 项目约定
24

35
本文记录 SimpleKernel 长期协作约定。审计阶段的临时规则仍以根目录 `AGENTS.md` 的“CURRENT PHASE”部分为准;临时规则清理后,应把仍然有效的规则沉淀到本文。
@@ -17,6 +19,7 @@
1719
- 严格 JSON 文件不写注释,也不为了版权头破坏 JSON 兼容性;需要说明版权、用途或格式约束时,写在相邻 README 或文档中。
1820
- 第三方代码、vendor copy、submodule、许可证正文和生成文件保留其上游或生成器声明,不改写为 SimpleKernel 版权头。
1921
- 既有文件没有版权头时,不为补版权做大规模无关 churn;在本次修改触及且格式允许时顺手补齐即可。
22+
- 后续需要做一次全仓库 Copyright 与文件头检查,统一确认哪些文件需要补头、哪些文件因格式或来源应豁免。
2023

2124
## 注释写法
2225

0 commit comments

Comments
 (0)