coding-agent-harness 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.en-US.md +14 -0
- package/README.md +111 -86
- package/README.zh-CN.md +270 -0
- package/SKILL.md +116 -189
- package/docs-release/README.md +72 -5
- package/docs-release/architecture/overview.md +286 -28
- package/docs-release/architecture/overview.zh-CN.md +288 -0
- package/docs-release/assets/dashboard-overview-en.png +0 -0
- package/docs-release/assets/harness-architecture.svg +163 -0
- package/docs-release/assets/harness-workflow.svg +64 -0
- package/docs-release/guides/agent-installation.en-US.md +214 -0
- package/docs-release/guides/agent-installation.md +123 -26
- package/docs-release/guides/document-audience-and-surfaces.en-US.md +112 -0
- package/docs-release/guides/document-audience-and-surfaces.md +112 -0
- package/docs-release/guides/full-legacy-migration-subagent-strategy.md +334 -0
- package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +334 -0
- package/docs-release/guides/legacy-migration-agent-prompt.md +384 -0
- package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +361 -0
- package/docs-release/guides/migration-playbook.en-US.md +325 -0
- package/docs-release/guides/migration-playbook.md +329 -0
- package/docs-release/guides/parent-control-repository-pattern.en-US.md +252 -0
- package/docs-release/guides/parent-control-repository-pattern.md +252 -0
- package/docs-release/guides/repository-operating-models.en-US.md +196 -0
- package/docs-release/guides/repository-operating-models.md +196 -0
- package/docs-release/intl/README.md +15 -0
- package/docs-release/intl/de-DE.md +18 -0
- package/docs-release/intl/en-US.md +18 -0
- package/docs-release/intl/es-ES.md +18 -0
- package/docs-release/intl/fr-FR.md +18 -0
- package/docs-release/intl/ja-JP.md +18 -0
- package/docs-release/intl/ko-KR.md +18 -0
- package/docs-release/intl/zh-CN.md +18 -0
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/brief.md +13 -0
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/lesson_candidates.md +24 -0
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/progress.md +1 -1
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/task_plan.md +4 -2
- package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/{visual_roadmap.md → visual_map.md} +9 -1
- package/package.json +3 -1
- package/references/agents-md-pattern.md +3 -3
- package/references/docs-directory-standard.md +47 -3
- package/references/external-source-intake-standard.md +75 -0
- package/references/harness-ledger.md +5 -3
- package/references/legacy-12-phase-bootstrap.md +41 -0
- package/references/lessons-governance.md +23 -6
- package/references/planning-loop.md +41 -3
- package/references/project-onboarding-audit.md +10 -0
- package/references/repo-governance-standard.md +2 -0
- package/references/testing-standard.md +50 -0
- package/references/walkthrough-closeout.md +6 -5
- package/scripts/check-harness.mjs +76 -35
- package/scripts/harness.mjs +303 -12
- package/scripts/lib/capability-registry.mjs +533 -0
- package/scripts/lib/check-profiles.mjs +510 -0
- package/scripts/lib/core-shared.mjs +186 -0
- package/scripts/lib/dashboard-data.mjs +389 -0
- package/scripts/lib/dashboard-workbench.mjs +217 -0
- package/scripts/lib/dashboard-writer.mjs +93 -2
- package/scripts/lib/harness-core.mjs +10 -1318
- package/scripts/lib/lesson-maintenance.mjs +145 -0
- package/scripts/lib/markdown-utils.mjs +158 -0
- package/scripts/lib/migration-planner.mjs +478 -0
- package/scripts/lib/migration-support.mjs +312 -0
- package/scripts/lib/task-lifecycle.mjs +755 -0
- package/scripts/lib/task-scanner.mjs +682 -0
- package/scripts/smoke-dashboard.mjs +22 -0
- package/scripts/test-harness.mjs +926 -14
- package/templates/AGENTS.md.template +41 -30
- package/templates/architecture/Architecture-SSoT.md +21 -0
- package/templates/architecture/README.md +49 -0
- package/templates/architecture/critical-flows.md +22 -0
- package/templates/architecture/local-repo-context.md +20 -0
- package/templates/architecture/service-catalog.md +17 -0
- package/templates/architecture/services/service-template.md +31 -0
- package/templates/architecture/system-map.md +22 -0
- package/templates/dashboard/assets/app-src/00-state.js +41 -0
- package/templates/dashboard/assets/app-src/10-router.js +76 -0
- package/templates/dashboard/assets/app-src/20-overview.js +235 -0
- package/templates/dashboard/assets/app-src/30-tasks.js +563 -0
- package/templates/dashboard/assets/app-src/40-modules.js +58 -0
- package/templates/dashboard/assets/app-src/45-review.js +128 -0
- package/templates/dashboard/assets/app-src/50-migration.js +169 -0
- package/templates/dashboard/assets/app-src/60-shared.js +61 -0
- package/templates/dashboard/assets/app-src/90-bindings.js +382 -0
- package/templates/dashboard/assets/app.css +2575 -310
- package/templates/dashboard/assets/app.js +1498 -307
- package/templates/dashboard/assets/app.manifest.json +11 -0
- package/templates/dashboard/assets/i18n.js +429 -44
- package/templates/dashboard/assets/mermaid-renderer.js +58 -8
- package/templates/development/README.md +52 -0
- package/templates/development/codebase-map.md +11 -0
- package/templates/development/cross-repo-debugging.md +18 -0
- package/templates/development/external-context/service-template.md +33 -0
- package/templates/development/external-source-packs/README.md +24 -0
- package/templates/development/external-source-packs/digest-template.md +28 -0
- package/templates/development/local-setup.md +16 -0
- package/templates/development/stubs-and-mocks.md +11 -0
- package/templates/integrations/README.md +40 -0
- package/templates/integrations/api-contract.md +42 -0
- package/templates/integrations/event-contract.md +46 -0
- package/templates/integrations/third-party/vendor-template.md +42 -0
- package/templates/integrations/webhook-contract.md +41 -0
- package/templates/planning/brief.md +32 -0
- package/templates/planning/lesson_candidates.md +58 -0
- package/templates/planning/long-running-task-contract.md +7 -0
- package/templates/planning/module_brief.md +25 -0
- package/templates/planning/module_session_prompt.md +6 -0
- package/templates/planning/task_plan.md +7 -5
- package/templates/planning/{visual_roadmap.md → visual_map.md} +24 -2
- package/templates/reference/docs-library-standard.md +31 -0
- package/templates/reference/execution-workflow-standard.md +4 -2
- package/templates/reference/external-source-intake-standard.md +82 -0
- package/templates/reference/harness-ledger-standard.md +1 -0
- package/templates/reference/repo-governance-standard.md +6 -4
- package/templates/reference/walkthrough-standard.md +2 -1
- package/templates/walkthrough/walkthrough-template.md +2 -2
- package/templates-zh-CN/AGENTS.md.template +69 -70
- package/templates-zh-CN/architecture/Architecture-SSoT.md +21 -0
- package/templates-zh-CN/architecture/README.md +51 -0
- package/templates-zh-CN/architecture/critical-flows.md +24 -0
- package/templates-zh-CN/architecture/local-repo-context.md +20 -0
- package/templates-zh-CN/architecture/service-catalog.md +17 -0
- package/templates-zh-CN/architecture/services/service-template.md +31 -0
- package/templates-zh-CN/architecture/system-map.md +22 -0
- package/templates-zh-CN/development/README.md +54 -0
- package/templates-zh-CN/development/codebase-map.md +11 -0
- package/templates-zh-CN/development/cross-repo-debugging.md +18 -0
- package/templates-zh-CN/development/external-context/service-template.md +33 -0
- package/templates-zh-CN/development/external-source-packs/README.md +24 -0
- package/templates-zh-CN/development/external-source-packs/digest-template.md +28 -0
- package/templates-zh-CN/development/local-setup.md +16 -0
- package/templates-zh-CN/development/stubs-and-mocks.md +11 -0
- package/templates-zh-CN/integrations/README.md +42 -0
- package/templates-zh-CN/integrations/api-contract.md +42 -0
- package/templates-zh-CN/integrations/event-contract.md +46 -0
- package/templates-zh-CN/integrations/third-party/vendor-template.md +42 -0
- package/templates-zh-CN/integrations/webhook-contract.md +41 -0
- package/templates-zh-CN/planning/brief.md +32 -0
- package/templates-zh-CN/planning/lesson_candidates.md +58 -0
- package/templates-zh-CN/planning/long-running-task-contract.md +1 -1
- package/templates-zh-CN/planning/module_brief.md +25 -0
- package/templates-zh-CN/planning/module_plan.md +2 -2
- package/templates-zh-CN/planning/module_session_prompt.md +4 -3
- package/templates-zh-CN/planning/task_plan.md +10 -4
- package/templates-zh-CN/planning/{visual_roadmap.md → visual_map.md} +21 -2
- package/templates-zh-CN/reference/docs-library-standard.md +35 -0
- package/templates-zh-CN/reference/execution-workflow-standard.md +9 -2
- package/templates-zh-CN/reference/external-source-intake-standard.md +82 -0
- package/templates-zh-CN/reference/harness-ledger-standard.md +5 -2
- package/templates-zh-CN/reference/repo-governance-standard.md +2 -0
- package/templates-zh-CN/reference/walkthrough-standard.md +4 -4
- package/templates-zh-CN/walkthrough/Closeout-SSoT.md +2 -2
- package/templates-zh-CN/walkthrough/walkthrough-template.md +2 -2
- package/templates-zh-CN/dashboard/assets/app.css +0 -399
- package/templates-zh-CN/dashboard/assets/app.js +0 -435
- package/templates-zh-CN/dashboard/assets/i18n.js +0 -47
- package/templates-zh-CN/dashboard/assets/markdown-reader.js +0 -116
- package/templates-zh-CN/dashboard/assets/mermaid-renderer.js +0 -59
- package/templates-zh-CN/dashboard/index.html +0 -18
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 外部资料摄取标准
|
|
2
|
+
|
|
3
|
+
## 职责
|
|
4
|
+
|
|
5
|
+
本标准定义 Agent 如何接收、过滤、整理外部项目或微服务团队提供的大量文档。目标是把外部资料变成可执行上下文,而不是把资料堆进 `03/04/06`。
|
|
6
|
+
|
|
7
|
+
## 核心模型
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
外部原始资料 -> source pack 索引 -> digest 摘要 -> 03/04/06 执行投影
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`03-ARCHITECTURE`、`04-DEVELOPMENT`、`06-INTEGRATIONS` 只保存已经提炼并可用于执行的事实。外部团队丢来的原文、长文档、截图、聊天记录、导出包和历史资料先进入 `docs/04-DEVELOPMENT/external-source-packs/`,不能直接污染执行文档。
|
|
14
|
+
|
|
15
|
+
## 何时询问用户
|
|
16
|
+
|
|
17
|
+
在 Diagnose / Decide 阶段,只要发现以下任一信号,Agent 必须询问用户是否有外部资料:
|
|
18
|
+
|
|
19
|
+
- 当前仓库属于多仓系统、微服务系统、前后端分仓或平台子系统。
|
|
20
|
+
- 代码中出现外部服务、SDK、API gateway、message queue、webhook、contract、schema 或 mock。
|
|
21
|
+
- 用户提到“其他仓库”“外部服务”“上下游”“接口文档”“业务知识”“系统整体设计”。
|
|
22
|
+
- Agent 无法只靠当前仓库判断服务职责、接口契约或联调方式。
|
|
23
|
+
|
|
24
|
+
推荐问题:
|
|
25
|
+
|
|
26
|
+
1. 这个项目是否依赖外部服务或其他仓库?
|
|
27
|
+
2. 你是否有外部团队提供的架构文档、接口文档、流程图、会议纪要、代码路径、链接或导出包?
|
|
28
|
+
3. 这些资料能否复制进本仓?如果不能,是否只能保存本地路径或 URL?
|
|
29
|
+
4. 哪些资料是可信来源,哪些只是历史参考?
|
|
30
|
+
|
|
31
|
+
## 存储规则
|
|
32
|
+
|
|
33
|
+
| 场景 | 存储方式 |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| 只有 1-4 个稳定外部文档 | 不必建独立 source pack;在对应 `03/04/06` 的 `Source Evidence` 中链接即可 |
|
|
36
|
+
| 外部资料超过 5 份、跨多个主题、或会持续增长 | 创建 `docs/04-DEVELOPMENT/external-source-packs/<source-key>/` |
|
|
37
|
+
| 资料含敏感信息、密钥、客户数据或不能进仓 | 不复制原文;在 source pack README 记录外部路径、owner、访问条件和摘要 |
|
|
38
|
+
| 资料是可公开或可入仓的原始文档 | 可放 `raw/`,但仍要经过 digest 后才能投影到执行文档 |
|
|
39
|
+
|
|
40
|
+
建议结构:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
docs/04-DEVELOPMENT/external-source-packs/<source-key>/
|
|
44
|
+
├── README.md # 资料索引和投影状态
|
|
45
|
+
├── digests/ # 每份或每组资料的摘要
|
|
46
|
+
├── raw/ # 可入仓原文;禁止放密钥、隐私或客户数据
|
|
47
|
+
└── raw-index.md # 原文不能入仓时,用路径/URL/owner 索引替代 raw/
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
不要为每个微服务复制一套完整 `03/04/06` 目录。source pack 是资料入口;稳定执行入口仍然是:
|
|
51
|
+
|
|
52
|
+
- `docs/03-ARCHITECTURE/service-catalog.md`
|
|
53
|
+
- `docs/03-ARCHITECTURE/services/<service-key>.md`
|
|
54
|
+
- `docs/04-DEVELOPMENT/external-context/<service-key>.md`
|
|
55
|
+
- `docs/06-INTEGRATIONS/<contract>.md`
|
|
56
|
+
|
|
57
|
+
## 摄取流程
|
|
58
|
+
|
|
59
|
+
1. **Inventory**:列出所有外部资料,记录来源、owner、时间、可信度、是否可入仓。
|
|
60
|
+
2. **Classify**:按 architecture、development、integration、security、operations、product、unknown 分类。
|
|
61
|
+
3. **Sanitize**:检查密钥、token、客户数据、隐私、内部账号、不可公开链接;不能入仓的只存引用。
|
|
62
|
+
4. **Digest**:用 digest 模板提炼事实、疑问、不安全假设和证据。
|
|
63
|
+
5. **Project**:把稳定事实投影到 `03/04/06`,并在 source pack README 标记 projected。
|
|
64
|
+
6. **Verify**:能用代码、接口测试、owner 确认或运行证据验证的,更新 `Last Verified` 和 `Confidence`。
|
|
65
|
+
7. **Residual**:不能确认的内容留在 source pack,不进入执行文档,或进入 `Do Not Assume`。
|
|
66
|
+
|
|
67
|
+
## 投影规则
|
|
68
|
+
|
|
69
|
+
| 资料内容 | 投影位置 |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| 服务职责、上下游、owner、数据归属、系统拓扑 | `03-ARCHITECTURE/service-catalog.md` 或 `services/<service-key>.md` |
|
|
72
|
+
| 本仓开发时如何 mock、stub、启动、联调、排查 | `04-DEVELOPMENT/external-context/<service-key>.md` |
|
|
73
|
+
| endpoint、payload、auth、error、event、webhook、SDK、contract test | `06-INTEGRATIONS/<contract>.md` |
|
|
74
|
+
| 仍未确认、来源冲突、过期或只作为背景参考 | 留在 source pack README / digest,不进入执行文档 |
|
|
75
|
+
|
|
76
|
+
## 禁止事项
|
|
77
|
+
|
|
78
|
+
- 不要把几十份外部文档直接复制到 `03-ARCHITECTURE`、`04-DEVELOPMENT` 或 `06-INTEGRATIONS` 根目录。
|
|
79
|
+
- 不要把外部资料摘要当成已验证事实;必须记录 `Source Evidence`、`Last Verified` 和 `Confidence`。
|
|
80
|
+
- 不要在执行文档里保留大段原文、聊天流水或历史会议记录。
|
|
81
|
+
- 不要把密钥、真实 token、客户数据、个人隐私或不可公开资料提交进仓。
|
|
82
|
+
- 不要为了“完整”而给每个微服务复制一套目录树;只给资料量大的外部来源建 source pack。
|
|
@@ -37,7 +37,8 @@ docs/Harness-Ledger.md
|
|
|
37
37
|
4. 状态值使用固定词,避免自由文本失控。
|
|
38
38
|
5. 任务收口时最后更新 Harness Ledger。
|
|
39
39
|
6. `closed` 行必须有 Lessons 检查结果。
|
|
40
|
-
7. `checked-
|
|
40
|
+
7. 新任务默认引用 `lesson_candidates.md`,并使用 `checked-candidate`、`queued-promotion` 或 `checked-created` 记录人工判定。
|
|
41
|
+
8. `checked-created` 必须引用 lesson ID 和详情文档。
|
|
41
42
|
8. 如果 closeout、review 或 regression 被跳过,必须写 `skipped-with-reason`。
|
|
42
43
|
|
|
43
44
|
## 固定状态词
|
|
@@ -46,6 +47,8 @@ docs/Harness-Ledger.md
|
|
|
46
47
|
- `updated`
|
|
47
48
|
- `created`
|
|
48
49
|
- `checked-none`
|
|
50
|
+
- `checked-candidate`
|
|
51
|
+
- `queued-promotion`
|
|
49
52
|
- `checked-created`
|
|
50
53
|
- `n/a`
|
|
51
54
|
- `skipped-with-reason`
|
|
@@ -66,7 +69,7 @@ docs/Harness-Ledger.md
|
|
|
66
69
|
- [ ] Regression SSoT / Cadence Ledger 已更新,或标记 `n/a`。
|
|
67
70
|
- [ ] walkthrough 已创建,或 Closeout SSoT 写明受控跳过原因。
|
|
68
71
|
- [ ] walkthrough 包含 Lessons 反思。
|
|
69
|
-
- [ ] Lessons 检查结果为 `checked-
|
|
72
|
+
- [ ] Lessons 检查结果为 `checked-candidate: LC-...`、`queued-promotion: LC-...`、`checked-created: L-YYYY-MM-DD-NNN`,或旧任务兼容的 `checked-none: <reason>`。
|
|
70
73
|
- [ ] Harness Ledger 行已收口,或 residual 已写明 owner 和后续路径。
|
|
71
74
|
|
|
72
75
|
## 框架更新检查清单
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
| branch 命名 | 分支模式 |
|
|
74
74
|
| owner 规则 | 谁创建、谁清理、谁集成 |
|
|
75
75
|
| subagent worker 规则 | 每个可写 worker 使用独立 worktree / branch,并 handoff commit SHA |
|
|
76
|
+
| 主动提交规则 | 已验证的、有意义的切片默认主动提交;暂不提交必须写明原因 |
|
|
76
77
|
| merge 顺序 | coordinator 或 release owner 决定 |
|
|
77
78
|
| 清理规则 | merge 后删除,保留需写原因 |
|
|
78
79
|
|
|
@@ -81,4 +82,5 @@
|
|
|
81
82
|
- 非平凡任务的 PR 或 walkthrough 必须说明 required checks 的执行结果。
|
|
82
83
|
- branch protection 未 verified 时,不能声称仓库已受保护;只能写 `designed`、`implemented` 或 `blocked-with-owner`。
|
|
83
84
|
- worker 结果只能通过 commit / branch 集成,不能混入 coordinator 未提交改动。
|
|
85
|
+
- coordinator 自己执行时也要主动提交已验证切片;未提交状态必须有 owner、原因和下一步。
|
|
84
86
|
- repo governance 变化必须同步 CI/CD 标准、worktree 标准和 Harness Ledger。
|
|
@@ -55,7 +55,7 @@ docs/10-WALKTHROUGH/Closeout-SSoT.md
|
|
|
55
55
|
Closeout SSoT 中:
|
|
56
56
|
|
|
57
57
|
- walkthrough 列写实际路径,或写受控跳过原因。
|
|
58
|
-
- Lessons 检查列写 `checked-created: L-YYYY-MM-DD-NNN
|
|
58
|
+
- Lessons 检查列写 `checked-candidate: LC-...`、`queued-promotion: LC-...`、`checked-created: L-YYYY-MM-DD-NNN`,或旧任务兼容的 `checked-none: <reason>`。
|
|
59
59
|
- 允许的跳过原因只有:`docs-only`、`no-runtime`、`superseded`、`historical-backfill`、`owner-deferred`。
|
|
60
60
|
|
|
61
61
|
## 经验沉淀反思规则
|
|
@@ -68,14 +68,14 @@ Closeout SSoT 中:
|
|
|
68
68
|
|
|
69
69
|
任一答案为“有”时:
|
|
70
70
|
|
|
71
|
-
-
|
|
72
|
-
-
|
|
71
|
+
- 先在任务目录 `lesson_candidates.md` 写候选。
|
|
72
|
+
- 人工审查后,如需沉淀,再由维护命令写 lesson 详情文档并追加 Lessons SSoT。
|
|
73
73
|
- Lessons SSoT 的详情文档列必须指向该详情文档。
|
|
74
74
|
|
|
75
75
|
三个答案都为“没有”时,Closeout SSoT 和 Harness Ledger 仍要记录:
|
|
76
76
|
|
|
77
77
|
```text
|
|
78
|
-
|
|
78
|
+
lesson_candidates.md: no-candidate-accepted
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
## 收口要求
|
|
@@ -38,5 +38,5 @@
|
|
|
38
38
|
2. 实现类任务应写 walkthrough;跳过原因只用于受限场景,不用于省略收口。
|
|
39
39
|
3. `证据` 必须列出实际检查、冒烟、review、运行时验证或发布证据。
|
|
40
40
|
4. `残余路由` 必须写 `none`,或指向负责人、任务、Regression SSoT、Harness Ledger、issue 或接受风险记录。
|
|
41
|
-
5. `Lessons 检查` 只能写 `checked-created: L-YYYY-MM-DD-NNN
|
|
42
|
-
6. `checked-created` 必须同时存在 Lessons SSoT 行和 lesson
|
|
41
|
+
5. `Lessons 检查` 只能写 `checked-candidate: LC-...`、`queued-promotion: LC-...`、`checked-created: L-YYYY-MM-DD-NNN`,或旧任务兼容的 `checked-none: [原因]`。
|
|
42
|
+
6. `checked-created` 必须同时存在 Lessons SSoT 行和 lesson 详情文档;`queued-promotion` 必须能追溯到任务目录 `lesson_candidates.md`。
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
| 本轮是否暴露 reference、workflow、模板或 checker 的缺口? | [有 / 无,写一句理由] |
|
|
47
47
|
| 是否出现跨模块、跨阶段、跨 agent 的重复问题? | [有 / 无,写一句理由] |
|
|
48
48
|
| 下次 agent 是否可能在同类任务中重复踩坑? | [有 / 无,写一句理由] |
|
|
49
|
-
| Lessons 结果 | `checked-created: L-YYYY-MM-DD-NNN` / `checked-none: [一句话原因]` |
|
|
50
|
-
| Lessons 详情文档 | `docs/01-GOVERNANCE/lessons/[file].md` / `none` |
|
|
49
|
+
| Lessons 结果 | `checked-candidate: LC-...` / `queued-promotion: LC-...` / `checked-created: L-YYYY-MM-DD-NNN` / 旧任务 `checked-none: [一句话原因]` |
|
|
50
|
+
| Lessons 详情文档 | `lesson_candidates.md` / `docs/01-GOVERNANCE/lessons/[file].md` / `none` |
|
|
51
51
|
|
|
52
52
|
## 关联索引
|
|
53
53
|
|
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
color-scheme: light;
|
|
3
|
-
--bg: #f4f6f3;
|
|
4
|
-
--surface: #fbfcf8;
|
|
5
|
-
--surface-2: #eef2ec;
|
|
6
|
-
--ink: #182018;
|
|
7
|
-
--muted: #627061;
|
|
8
|
-
--line: #dce3d8;
|
|
9
|
-
--accent: #2e6b4f;
|
|
10
|
-
--accent-2: #9d6b2f;
|
|
11
|
-
--danger: #a83f32;
|
|
12
|
-
--warn: #9a6a13;
|
|
13
|
-
--ok: #2f7b4f;
|
|
14
|
-
--shadow: 0 18px 45px rgba(32, 43, 28, 0.10);
|
|
15
|
-
font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
[data-theme="dark"] {
|
|
19
|
-
color-scheme: dark;
|
|
20
|
-
--bg: #151812;
|
|
21
|
-
--surface: #1d2219;
|
|
22
|
-
--surface-2: #252d20;
|
|
23
|
-
--ink: #edf1e8;
|
|
24
|
-
--muted: #a9b4a1;
|
|
25
|
-
--line: #384230;
|
|
26
|
-
--accent: #83c69d;
|
|
27
|
-
--accent-2: #d3a15f;
|
|
28
|
-
--danger: #e17668;
|
|
29
|
-
--warn: #e0b456;
|
|
30
|
-
--ok: #85cf9b;
|
|
31
|
-
--shadow: 0 18px 45px rgba(0, 0, 0, 0.28);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
* { box-sizing: border-box; }
|
|
35
|
-
body {
|
|
36
|
-
margin: 0;
|
|
37
|
-
background: var(--bg);
|
|
38
|
-
color: var(--ink);
|
|
39
|
-
}
|
|
40
|
-
button, select {
|
|
41
|
-
font: inherit;
|
|
42
|
-
}
|
|
43
|
-
.layout {
|
|
44
|
-
min-height: 100vh;
|
|
45
|
-
display: grid;
|
|
46
|
-
grid-template-columns: 248px minmax(0, 1fr);
|
|
47
|
-
}
|
|
48
|
-
.sidebar {
|
|
49
|
-
border-right: 1px solid var(--line);
|
|
50
|
-
background: var(--surface);
|
|
51
|
-
padding: 22px 18px;
|
|
52
|
-
position: sticky;
|
|
53
|
-
top: 0;
|
|
54
|
-
height: 100vh;
|
|
55
|
-
}
|
|
56
|
-
.brand {
|
|
57
|
-
display: grid;
|
|
58
|
-
gap: 4px;
|
|
59
|
-
margin-bottom: 24px;
|
|
60
|
-
}
|
|
61
|
-
.brand strong { font-size: 18px; }
|
|
62
|
-
.brand span { color: var(--muted); font-size: 13px; }
|
|
63
|
-
.nav {
|
|
64
|
-
display: grid;
|
|
65
|
-
gap: 6px;
|
|
66
|
-
}
|
|
67
|
-
.nav button, .control button, .drawer-tabs button {
|
|
68
|
-
border: 0;
|
|
69
|
-
background: transparent;
|
|
70
|
-
color: var(--muted);
|
|
71
|
-
border-radius: 7px;
|
|
72
|
-
padding: 9px 10px;
|
|
73
|
-
text-align: left;
|
|
74
|
-
cursor: pointer;
|
|
75
|
-
}
|
|
76
|
-
.nav button.active, .nav button:hover, .control button.active, .drawer-tabs button.active {
|
|
77
|
-
background: var(--surface-2);
|
|
78
|
-
color: var(--ink);
|
|
79
|
-
}
|
|
80
|
-
.main {
|
|
81
|
-
padding: 24px clamp(18px, 4vw, 44px);
|
|
82
|
-
min-width: 0;
|
|
83
|
-
}
|
|
84
|
-
.topbar {
|
|
85
|
-
display: flex;
|
|
86
|
-
justify-content: space-between;
|
|
87
|
-
gap: 18px;
|
|
88
|
-
align-items: flex-start;
|
|
89
|
-
margin-bottom: 22px;
|
|
90
|
-
}
|
|
91
|
-
.eyebrow {
|
|
92
|
-
color: var(--muted);
|
|
93
|
-
font-size: 13px;
|
|
94
|
-
margin: 0 0 6px;
|
|
95
|
-
}
|
|
96
|
-
h1, h2, h3, p { margin-top: 0; letter-spacing: 0; }
|
|
97
|
-
h1 { font-size: clamp(26px, 4vw, 42px); line-height: 1.04; max-width: 760px; }
|
|
98
|
-
h2 { font-size: 20px; }
|
|
99
|
-
h3 { font-size: 15px; }
|
|
100
|
-
.controls {
|
|
101
|
-
display: flex;
|
|
102
|
-
flex-wrap: wrap;
|
|
103
|
-
gap: 8px;
|
|
104
|
-
justify-content: flex-end;
|
|
105
|
-
}
|
|
106
|
-
.control {
|
|
107
|
-
display: inline-flex;
|
|
108
|
-
border: 1px solid var(--line);
|
|
109
|
-
border-radius: 8px;
|
|
110
|
-
padding: 3px;
|
|
111
|
-
background: var(--surface);
|
|
112
|
-
}
|
|
113
|
-
.status-grid {
|
|
114
|
-
display: grid;
|
|
115
|
-
grid-template-columns: minmax(260px, 1.4fr) repeat(3, minmax(150px, 0.7fr));
|
|
116
|
-
gap: 12px;
|
|
117
|
-
margin-bottom: 18px;
|
|
118
|
-
}
|
|
119
|
-
.panel, .metric, .table-panel, .drawer {
|
|
120
|
-
background: var(--surface);
|
|
121
|
-
border: 1px solid var(--line);
|
|
122
|
-
border-radius: 8px;
|
|
123
|
-
box-shadow: var(--shadow);
|
|
124
|
-
}
|
|
125
|
-
.metric {
|
|
126
|
-
padding: 16px;
|
|
127
|
-
min-height: 112px;
|
|
128
|
-
}
|
|
129
|
-
.metric strong {
|
|
130
|
-
display: block;
|
|
131
|
-
font-size: 30px;
|
|
132
|
-
line-height: 1;
|
|
133
|
-
}
|
|
134
|
-
.metric span, .muted { color: var(--muted); }
|
|
135
|
-
.readiness {
|
|
136
|
-
padding: 18px;
|
|
137
|
-
}
|
|
138
|
-
.readiness .state {
|
|
139
|
-
display: inline-flex;
|
|
140
|
-
align-items: center;
|
|
141
|
-
border-radius: 7px;
|
|
142
|
-
padding: 6px 9px;
|
|
143
|
-
font-weight: 700;
|
|
144
|
-
margin-bottom: 14px;
|
|
145
|
-
}
|
|
146
|
-
.state.pass, .tag.pass { background: color-mix(in srgb, var(--ok) 18%, transparent); color: var(--ok); }
|
|
147
|
-
.state.warn, .tag.warn { background: color-mix(in srgb, var(--warn) 18%, transparent); color: var(--warn); }
|
|
148
|
-
.state.fail, .tag.fail, .tag.open { background: color-mix(in srgb, var(--danger) 18%, transparent); color: var(--danger); }
|
|
149
|
-
.page-grid {
|
|
150
|
-
display: grid;
|
|
151
|
-
grid-template-columns: minmax(0, 1fr) 410px;
|
|
152
|
-
gap: 16px;
|
|
153
|
-
align-items: start;
|
|
154
|
-
}
|
|
155
|
-
.page-grid > * {
|
|
156
|
-
min-width: 0;
|
|
157
|
-
}
|
|
158
|
-
.table-panel {
|
|
159
|
-
overflow: hidden;
|
|
160
|
-
min-width: 0;
|
|
161
|
-
}
|
|
162
|
-
.panel-head {
|
|
163
|
-
display: flex;
|
|
164
|
-
justify-content: space-between;
|
|
165
|
-
gap: 12px;
|
|
166
|
-
padding: 14px 16px;
|
|
167
|
-
border-bottom: 1px solid var(--line);
|
|
168
|
-
}
|
|
169
|
-
.table-wrap { overflow: auto; }
|
|
170
|
-
table {
|
|
171
|
-
width: 100%;
|
|
172
|
-
border-collapse: collapse;
|
|
173
|
-
font-size: 14px;
|
|
174
|
-
}
|
|
175
|
-
[data-density="compact"] table { font-size: 13px; }
|
|
176
|
-
th, td {
|
|
177
|
-
padding: 11px 12px;
|
|
178
|
-
border-bottom: 1px solid var(--line);
|
|
179
|
-
vertical-align: top;
|
|
180
|
-
text-align: left;
|
|
181
|
-
}
|
|
182
|
-
[data-density="compact"] th, [data-density="compact"] td { padding: 7px 9px; }
|
|
183
|
-
th {
|
|
184
|
-
color: var(--muted);
|
|
185
|
-
font-size: 12px;
|
|
186
|
-
font-weight: 700;
|
|
187
|
-
text-transform: uppercase;
|
|
188
|
-
}
|
|
189
|
-
tr {
|
|
190
|
-
cursor: pointer;
|
|
191
|
-
}
|
|
192
|
-
tr:hover td {
|
|
193
|
-
background: color-mix(in srgb, var(--accent) 8%, transparent);
|
|
194
|
-
}
|
|
195
|
-
.linklike {
|
|
196
|
-
border: 0;
|
|
197
|
-
padding: 0;
|
|
198
|
-
background: transparent;
|
|
199
|
-
color: var(--accent);
|
|
200
|
-
font: inherit;
|
|
201
|
-
text-align: left;
|
|
202
|
-
cursor: pointer;
|
|
203
|
-
overflow-wrap: anywhere;
|
|
204
|
-
}
|
|
205
|
-
.linklike:hover { text-decoration: underline; }
|
|
206
|
-
.tag {
|
|
207
|
-
display: inline-flex;
|
|
208
|
-
border-radius: 999px;
|
|
209
|
-
padding: 4px 8px;
|
|
210
|
-
font-size: 12px;
|
|
211
|
-
font-weight: 700;
|
|
212
|
-
background: var(--surface-2);
|
|
213
|
-
}
|
|
214
|
-
.bar {
|
|
215
|
-
height: 7px;
|
|
216
|
-
border-radius: 999px;
|
|
217
|
-
background: var(--surface-2);
|
|
218
|
-
overflow: hidden;
|
|
219
|
-
margin-top: 6px;
|
|
220
|
-
}
|
|
221
|
-
.bar i {
|
|
222
|
-
display: block;
|
|
223
|
-
height: 100%;
|
|
224
|
-
background: var(--accent);
|
|
225
|
-
}
|
|
226
|
-
.drawer {
|
|
227
|
-
position: sticky;
|
|
228
|
-
top: 18px;
|
|
229
|
-
min-width: 0;
|
|
230
|
-
max-height: calc(100vh - 36px);
|
|
231
|
-
overflow: hidden;
|
|
232
|
-
display: grid;
|
|
233
|
-
grid-template-rows: auto auto auto minmax(0, 1fr);
|
|
234
|
-
}
|
|
235
|
-
.drawer-head {
|
|
236
|
-
padding: 15px 16px;
|
|
237
|
-
border-bottom: 1px solid var(--line);
|
|
238
|
-
}
|
|
239
|
-
.drawer-tabs {
|
|
240
|
-
display: flex;
|
|
241
|
-
gap: 4px;
|
|
242
|
-
overflow-x: auto;
|
|
243
|
-
padding: 8px;
|
|
244
|
-
border-bottom: 1px solid var(--line);
|
|
245
|
-
}
|
|
246
|
-
.drawer-mode {
|
|
247
|
-
display: flex;
|
|
248
|
-
gap: 6px;
|
|
249
|
-
padding: 8px 12px;
|
|
250
|
-
border-bottom: 1px solid var(--line);
|
|
251
|
-
}
|
|
252
|
-
.drawer-mode button {
|
|
253
|
-
border: 1px solid var(--line);
|
|
254
|
-
background: transparent;
|
|
255
|
-
color: var(--muted);
|
|
256
|
-
border-radius: 7px;
|
|
257
|
-
padding: 6px 9px;
|
|
258
|
-
cursor: pointer;
|
|
259
|
-
}
|
|
260
|
-
.drawer-mode button.active {
|
|
261
|
-
color: var(--ink);
|
|
262
|
-
background: var(--surface-2);
|
|
263
|
-
}
|
|
264
|
-
.drawer-tabs button {
|
|
265
|
-
white-space: nowrap;
|
|
266
|
-
font-size: 13px;
|
|
267
|
-
}
|
|
268
|
-
.drawer-body {
|
|
269
|
-
padding: 16px;
|
|
270
|
-
overflow: auto;
|
|
271
|
-
}
|
|
272
|
-
.markdown {
|
|
273
|
-
line-height: 1.55;
|
|
274
|
-
color: var(--ink);
|
|
275
|
-
}
|
|
276
|
-
.markdown h1 { font-size: 24px; }
|
|
277
|
-
.markdown h2 { font-size: 18px; margin-top: 18px; }
|
|
278
|
-
.markdown pre {
|
|
279
|
-
white-space: pre-wrap;
|
|
280
|
-
background: var(--surface-2);
|
|
281
|
-
border-radius: 7px;
|
|
282
|
-
padding: 10px;
|
|
283
|
-
overflow: auto;
|
|
284
|
-
}
|
|
285
|
-
.rendered-table-wrap {
|
|
286
|
-
overflow: auto;
|
|
287
|
-
margin: 12px 0;
|
|
288
|
-
border: 1px solid var(--line);
|
|
289
|
-
border-radius: 7px;
|
|
290
|
-
}
|
|
291
|
-
.rendered-table {
|
|
292
|
-
min-width: 520px;
|
|
293
|
-
background: var(--surface);
|
|
294
|
-
}
|
|
295
|
-
.md-table {
|
|
296
|
-
margin: 0 0 2px;
|
|
297
|
-
box-shadow: none;
|
|
298
|
-
}
|
|
299
|
-
.mermaid-fallback {
|
|
300
|
-
margin: 12px 0;
|
|
301
|
-
border: 1px solid var(--line);
|
|
302
|
-
border-radius: 8px;
|
|
303
|
-
padding: 10px;
|
|
304
|
-
background: var(--surface-2);
|
|
305
|
-
}
|
|
306
|
-
.mermaid-rendered {
|
|
307
|
-
margin: 12px 0;
|
|
308
|
-
border: 1px solid var(--line);
|
|
309
|
-
border-radius: 8px;
|
|
310
|
-
padding: 10px;
|
|
311
|
-
background: var(--surface-2);
|
|
312
|
-
overflow-x: auto;
|
|
313
|
-
}
|
|
314
|
-
.mermaid-rendered figcaption {
|
|
315
|
-
font-weight: 700;
|
|
316
|
-
color: var(--accent);
|
|
317
|
-
margin-bottom: 8px;
|
|
318
|
-
}
|
|
319
|
-
.mermaid-rendered svg {
|
|
320
|
-
min-width: 360px;
|
|
321
|
-
width: 100%;
|
|
322
|
-
height: auto;
|
|
323
|
-
}
|
|
324
|
-
.mermaid-node rect {
|
|
325
|
-
fill: var(--surface);
|
|
326
|
-
stroke: var(--accent);
|
|
327
|
-
stroke-width: 1.5;
|
|
328
|
-
}
|
|
329
|
-
.mermaid-node text {
|
|
330
|
-
fill: var(--ink);
|
|
331
|
-
font-size: 11px;
|
|
332
|
-
}
|
|
333
|
-
.mermaid-edge {
|
|
334
|
-
stroke: var(--accent);
|
|
335
|
-
stroke-width: 1.5;
|
|
336
|
-
fill: none;
|
|
337
|
-
}
|
|
338
|
-
.mermaid-arrow {
|
|
339
|
-
fill: var(--accent);
|
|
340
|
-
}
|
|
341
|
-
.graph-panel {
|
|
342
|
-
margin-bottom: 16px;
|
|
343
|
-
overflow: hidden;
|
|
344
|
-
}
|
|
345
|
-
.graph-lanes {
|
|
346
|
-
display: grid;
|
|
347
|
-
grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
|
|
348
|
-
gap: 10px;
|
|
349
|
-
padding: 14px;
|
|
350
|
-
}
|
|
351
|
-
.lane {
|
|
352
|
-
display: grid;
|
|
353
|
-
gap: 5px;
|
|
354
|
-
min-height: 88px;
|
|
355
|
-
border: 1px solid var(--line);
|
|
356
|
-
border-radius: 8px;
|
|
357
|
-
padding: 10px;
|
|
358
|
-
background: var(--surface-2);
|
|
359
|
-
}
|
|
360
|
-
.lane span, .lane small {
|
|
361
|
-
color: var(--muted);
|
|
362
|
-
overflow-wrap: anywhere;
|
|
363
|
-
}
|
|
364
|
-
.mermaid-fallback figcaption {
|
|
365
|
-
font-weight: 700;
|
|
366
|
-
color: var(--accent);
|
|
367
|
-
margin-bottom: 8px;
|
|
368
|
-
}
|
|
369
|
-
.risk-list {
|
|
370
|
-
display: grid;
|
|
371
|
-
gap: 8px;
|
|
372
|
-
}
|
|
373
|
-
.risk-item {
|
|
374
|
-
border-left: 3px solid var(--accent-2);
|
|
375
|
-
padding: 8px 10px;
|
|
376
|
-
background: var(--surface-2);
|
|
377
|
-
border-radius: 6px;
|
|
378
|
-
}
|
|
379
|
-
.empty {
|
|
380
|
-
color: var(--muted);
|
|
381
|
-
padding: 18px;
|
|
382
|
-
}
|
|
383
|
-
@media (max-width: 980px) {
|
|
384
|
-
.layout { grid-template-columns: 1fr; }
|
|
385
|
-
.sidebar {
|
|
386
|
-
position: static;
|
|
387
|
-
height: auto;
|
|
388
|
-
border-right: 0;
|
|
389
|
-
border-bottom: 1px solid var(--line);
|
|
390
|
-
}
|
|
391
|
-
.nav { grid-template-columns: repeat(4, minmax(0, 1fr)); }
|
|
392
|
-
.status-grid, .page-grid { grid-template-columns: 1fr; }
|
|
393
|
-
.drawer { position: static; max-height: none; }
|
|
394
|
-
}
|
|
395
|
-
@media (max-width: 620px) {
|
|
396
|
-
.topbar { display: block; }
|
|
397
|
-
.controls { justify-content: flex-start; }
|
|
398
|
-
.nav { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
399
|
-
}
|