@bossmissing/agent-meta 0.1.0

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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -0
  3. package/dist/analyzers/duplicate-rule-analyzer.d.ts +31 -0
  4. package/dist/analyzers/duplicate-rule-analyzer.js +80 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +177 -0
  7. package/dist/commands/audit.d.ts +7 -0
  8. package/dist/commands/audit.js +187 -0
  9. package/dist/commands/check.d.ts +35 -0
  10. package/dist/commands/check.js +109 -0
  11. package/dist/commands/config.d.ts +2 -0
  12. package/dist/commands/config.js +59 -0
  13. package/dist/commands/init.d.ts +8 -0
  14. package/dist/commands/init.js +179 -0
  15. package/dist/commands/new-adr.d.ts +8 -0
  16. package/dist/commands/new-adr.js +65 -0
  17. package/dist/commands/new-domain.d.ts +13 -0
  18. package/dist/commands/new-domain.js +106 -0
  19. package/dist/commands/sync.d.ts +7 -0
  20. package/dist/commands/sync.js +46 -0
  21. package/dist/core/config.d.ts +15 -0
  22. package/dist/core/config.js +40 -0
  23. package/dist/core/errors.d.ts +12 -0
  24. package/dist/core/errors.js +16 -0
  25. package/dist/core/filesystem.d.ts +33 -0
  26. package/dist/core/filesystem.js +92 -0
  27. package/dist/core/frontmatter.d.ts +19 -0
  28. package/dist/core/frontmatter.js +84 -0
  29. package/dist/core/logger.d.ts +8 -0
  30. package/dist/core/logger.js +22 -0
  31. package/dist/core/paths.d.ts +8 -0
  32. package/dist/core/paths.js +39 -0
  33. package/dist/core/risk.d.ts +3 -0
  34. package/dist/core/risk.js +8 -0
  35. package/dist/core/templates.d.ts +10 -0
  36. package/dist/core/templates.js +31 -0
  37. package/dist/core/types.d.ts +21 -0
  38. package/dist/core/types.js +7 -0
  39. package/dist/generators/adr-generator.d.ts +11 -0
  40. package/dist/generators/adr-generator.js +25 -0
  41. package/dist/generators/index-generator.d.ts +6 -0
  42. package/dist/generators/index-generator.js +87 -0
  43. package/dist/index.d.ts +11 -0
  44. package/dist/index.js +10 -0
  45. package/dist/schemas/config.schema.d.ts +208 -0
  46. package/dist/schemas/config.schema.js +83 -0
  47. package/dist/templates/index.d.ts +23 -0
  48. package/dist/templates/index.js +445 -0
  49. package/dist/validators/adr-validator.d.ts +3 -0
  50. package/dist/validators/adr-validator.js +182 -0
  51. package/dist/validators/agents-validator.d.ts +3 -0
  52. package/dist/validators/agents-validator.js +82 -0
  53. package/dist/validators/context.d.ts +12 -0
  54. package/dist/validators/context.js +1 -0
  55. package/dist/validators/docs-validator.d.ts +3 -0
  56. package/dist/validators/docs-validator.js +129 -0
  57. package/dist/validators/domain-validator.d.ts +3 -0
  58. package/dist/validators/domain-validator.js +132 -0
  59. package/dist/validators/openspec-validator.d.ts +2 -0
  60. package/dist/validators/openspec-validator.js +76 -0
  61. package/dist/validators/project-validator.d.ts +2 -0
  62. package/dist/validators/project-validator.js +41 -0
  63. package/package.json +64 -0
@@ -0,0 +1,208 @@
1
+ import { z } from "zod";
2
+ export declare const DEFAULT_RISK_KEYWORDS: string[];
3
+ export declare const configSchema: z.ZodObject<{
4
+ version: z.ZodDefault<z.ZodNumber>;
5
+ project: z.ZodDefault<z.ZodObject<{
6
+ name: z.ZodDefault<z.ZodString>;
7
+ type: z.ZodDefault<z.ZodString>;
8
+ package_manager: z.ZodDefault<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ name: string;
11
+ type: string;
12
+ package_manager: string;
13
+ }, {
14
+ name?: string | undefined;
15
+ type?: string | undefined;
16
+ package_manager?: string | undefined;
17
+ }>>;
18
+ paths: z.ZodDefault<z.ZodObject<{
19
+ root_agents: z.ZodDefault<z.ZodString>;
20
+ docs: z.ZodDefault<z.ZodString>;
21
+ domain_docs: z.ZodDefault<z.ZodString>;
22
+ adr_docs: z.ZodDefault<z.ZodString>;
23
+ openspec: z.ZodDefault<z.ZodString>;
24
+ templates: z.ZodDefault<z.ZodString>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ root_agents: string;
27
+ docs: string;
28
+ domain_docs: string;
29
+ adr_docs: string;
30
+ openspec: string;
31
+ templates: string;
32
+ }, {
33
+ root_agents?: string | undefined;
34
+ docs?: string | undefined;
35
+ domain_docs?: string | undefined;
36
+ adr_docs?: string | undefined;
37
+ openspec?: string | undefined;
38
+ templates?: string | undefined;
39
+ }>>;
40
+ defaults: z.ZodDefault<z.ZodObject<{
41
+ doc_status: z.ZodDefault<z.ZodString>;
42
+ review_interval_days: z.ZodDefault<z.ZodNumber>;
43
+ adr_padding: z.ZodDefault<z.ZodNumber>;
44
+ agents_max_lines: z.ZodDefault<z.ZodNumber>;
45
+ local_agents_max_lines: z.ZodDefault<z.ZodNumber>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ doc_status: string;
48
+ review_interval_days: number;
49
+ adr_padding: number;
50
+ agents_max_lines: number;
51
+ local_agents_max_lines: number;
52
+ }, {
53
+ doc_status?: string | undefined;
54
+ review_interval_days?: number | undefined;
55
+ adr_padding?: number | undefined;
56
+ agents_max_lines?: number | undefined;
57
+ local_agents_max_lines?: number | undefined;
58
+ }>>;
59
+ features: z.ZodDefault<z.ZodObject<{
60
+ openspec: z.ZodDefault<z.ZodUnion<[z.ZodBoolean, z.ZodLiteral<"auto">]>>;
61
+ hooks: z.ZodDefault<z.ZodBoolean>;
62
+ docs_frontmatter: z.ZodDefault<z.ZodBoolean>;
63
+ generate_indexes: z.ZodDefault<z.ZodBoolean>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ openspec: boolean | "auto";
66
+ hooks: boolean;
67
+ docs_frontmatter: boolean;
68
+ generate_indexes: boolean;
69
+ }, {
70
+ openspec?: boolean | "auto" | undefined;
71
+ hooks?: boolean | undefined;
72
+ docs_frontmatter?: boolean | undefined;
73
+ generate_indexes?: boolean | undefined;
74
+ }>>;
75
+ domain: z.ZodDefault<z.ZodObject<{
76
+ create_local_agents_by_default: z.ZodDefault<z.ZodBoolean>;
77
+ create_rules_by_default: z.ZodDefault<z.ZodBoolean>;
78
+ create_state_machine_by_default: z.ZodDefault<z.ZodBoolean>;
79
+ create_glossary_by_default: z.ZodDefault<z.ZodBoolean>;
80
+ }, "strip", z.ZodTypeAny, {
81
+ create_local_agents_by_default: boolean;
82
+ create_rules_by_default: boolean;
83
+ create_state_machine_by_default: boolean;
84
+ create_glossary_by_default: boolean;
85
+ }, {
86
+ create_local_agents_by_default?: boolean | undefined;
87
+ create_rules_by_default?: boolean | undefined;
88
+ create_state_machine_by_default?: boolean | undefined;
89
+ create_glossary_by_default?: boolean | undefined;
90
+ }>>;
91
+ validation: z.ZodDefault<z.ZodObject<{
92
+ require_doc_frontmatter: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
93
+ required_frontmatter: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
94
+ stale_review_days: z.ZodDefault<z.ZodObject<{
95
+ active: z.ZodDefault<z.ZodNumber>;
96
+ draft: z.ZodDefault<z.ZodNumber>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ active: number;
99
+ draft: number;
100
+ }, {
101
+ active?: number | undefined;
102
+ draft?: number | undefined;
103
+ }>>;
104
+ }, "strip", z.ZodTypeAny, {
105
+ require_doc_frontmatter: string[];
106
+ required_frontmatter: string[];
107
+ stale_review_days: {
108
+ active: number;
109
+ draft: number;
110
+ };
111
+ }, {
112
+ require_doc_frontmatter?: string[] | undefined;
113
+ required_frontmatter?: string[] | undefined;
114
+ stale_review_days?: {
115
+ active?: number | undefined;
116
+ draft?: number | undefined;
117
+ } | undefined;
118
+ }>>;
119
+ risk_keywords: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
120
+ }, "strip", z.ZodTypeAny, {
121
+ version: number;
122
+ validation: {
123
+ require_doc_frontmatter: string[];
124
+ required_frontmatter: string[];
125
+ stale_review_days: {
126
+ active: number;
127
+ draft: number;
128
+ };
129
+ };
130
+ project: {
131
+ name: string;
132
+ type: string;
133
+ package_manager: string;
134
+ };
135
+ paths: {
136
+ root_agents: string;
137
+ docs: string;
138
+ domain_docs: string;
139
+ adr_docs: string;
140
+ openspec: string;
141
+ templates: string;
142
+ };
143
+ defaults: {
144
+ doc_status: string;
145
+ review_interval_days: number;
146
+ adr_padding: number;
147
+ agents_max_lines: number;
148
+ local_agents_max_lines: number;
149
+ };
150
+ features: {
151
+ openspec: boolean | "auto";
152
+ hooks: boolean;
153
+ docs_frontmatter: boolean;
154
+ generate_indexes: boolean;
155
+ };
156
+ domain: {
157
+ create_local_agents_by_default: boolean;
158
+ create_rules_by_default: boolean;
159
+ create_state_machine_by_default: boolean;
160
+ create_glossary_by_default: boolean;
161
+ };
162
+ risk_keywords: string[];
163
+ }, {
164
+ version?: number | undefined;
165
+ validation?: {
166
+ require_doc_frontmatter?: string[] | undefined;
167
+ required_frontmatter?: string[] | undefined;
168
+ stale_review_days?: {
169
+ active?: number | undefined;
170
+ draft?: number | undefined;
171
+ } | undefined;
172
+ } | undefined;
173
+ project?: {
174
+ name?: string | undefined;
175
+ type?: string | undefined;
176
+ package_manager?: string | undefined;
177
+ } | undefined;
178
+ paths?: {
179
+ root_agents?: string | undefined;
180
+ docs?: string | undefined;
181
+ domain_docs?: string | undefined;
182
+ adr_docs?: string | undefined;
183
+ openspec?: string | undefined;
184
+ templates?: string | undefined;
185
+ } | undefined;
186
+ defaults?: {
187
+ doc_status?: string | undefined;
188
+ review_interval_days?: number | undefined;
189
+ adr_padding?: number | undefined;
190
+ agents_max_lines?: number | undefined;
191
+ local_agents_max_lines?: number | undefined;
192
+ } | undefined;
193
+ features?: {
194
+ openspec?: boolean | "auto" | undefined;
195
+ hooks?: boolean | undefined;
196
+ docs_frontmatter?: boolean | undefined;
197
+ generate_indexes?: boolean | undefined;
198
+ } | undefined;
199
+ domain?: {
200
+ create_local_agents_by_default?: boolean | undefined;
201
+ create_rules_by_default?: boolean | undefined;
202
+ create_state_machine_by_default?: boolean | undefined;
203
+ create_glossary_by_default?: boolean | undefined;
204
+ } | undefined;
205
+ risk_keywords?: string[] | undefined;
206
+ }>;
207
+ export type MetaConfig = z.infer<typeof configSchema>;
208
+ export declare const DEFAULT_CONFIG: MetaConfig;
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ export const DEFAULT_RISK_KEYWORDS = [
3
+ "payment",
4
+ "withdrawal",
5
+ "settlement",
6
+ "commission",
7
+ "refund",
8
+ "inventory",
9
+ "permission",
10
+ "authorization",
11
+ "audit",
12
+ "webhook",
13
+ "callback",
14
+ ];
15
+ export const configSchema = z.object({
16
+ version: z.number().default(1),
17
+ project: z
18
+ .object({
19
+ name: z.string().default(""),
20
+ type: z.string().default("auto"),
21
+ package_manager: z.string().default("auto"),
22
+ })
23
+ .default({}),
24
+ paths: z
25
+ .object({
26
+ root_agents: z.string().default("AGENTS.md"),
27
+ docs: z.string().default("docs"),
28
+ domain_docs: z.string().default("docs/domain"),
29
+ adr_docs: z.string().default("docs/adr"),
30
+ openspec: z.string().default("openspec"),
31
+ templates: z.string().default("templates/agent-meta"),
32
+ })
33
+ .default({}),
34
+ defaults: z
35
+ .object({
36
+ doc_status: z.string().default("active"),
37
+ review_interval_days: z.number().default(180),
38
+ adr_padding: z.number().int().min(1).default(4),
39
+ agents_max_lines: z.number().default(180),
40
+ local_agents_max_lines: z.number().default(120),
41
+ })
42
+ .default({}),
43
+ features: z
44
+ .object({
45
+ openspec: z.union([z.boolean(), z.literal("auto")]).default("auto"),
46
+ hooks: z.boolean().default(false),
47
+ docs_frontmatter: z.boolean().default(true),
48
+ generate_indexes: z.boolean().default(true),
49
+ })
50
+ .default({}),
51
+ domain: z
52
+ .object({
53
+ create_local_agents_by_default: z.boolean().default(true),
54
+ create_rules_by_default: z.boolean().default(true),
55
+ create_state_machine_by_default: z.boolean().default(false),
56
+ create_glossary_by_default: z.boolean().default(false),
57
+ })
58
+ .default({}),
59
+ validation: z
60
+ .object({
61
+ require_doc_frontmatter: z
62
+ .array(z.string())
63
+ .default([
64
+ "docs/domain/**/*.md",
65
+ "docs/architecture/**/*.md",
66
+ "docs/api/**/*.md",
67
+ "docs/engineering/**/*.md",
68
+ "docs/runbooks/**/*.md",
69
+ ]),
70
+ required_frontmatter: z
71
+ .array(z.string())
72
+ .default(["title", "status", "owner", "last_reviewed"]),
73
+ stale_review_days: z
74
+ .object({
75
+ active: z.number().default(180),
76
+ draft: z.number().default(365),
77
+ })
78
+ .default({}),
79
+ })
80
+ .default({}),
81
+ risk_keywords: z.array(z.string()).default(DEFAULT_RISK_KEYWORDS),
82
+ });
83
+ export const DEFAULT_CONFIG = configSchema.parse({});
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Built-in templates. A project can override any of them by placing a file
3
+ * named `<key>.tmpl` under `templates/agent-meta/` (configurable via
4
+ * paths.templates). Only {{variable}} substitution is supported.
5
+ */
6
+ export declare const BUILTIN_TEMPLATES: {
7
+ readonly "agents.md": "# AGENTS.md\n\n## Project Overview\n\n- Project type: {{project_type}}\n- Package manager: {{package_manager}}\n- Main application paths: {{main_paths}}\n\n## Important Documentation\n\n- Architecture: `docs/architecture/`\n- Domain rules: `docs/domain/`\n- API conventions: `docs/api/`\n- Engineering rules: `docs/engineering/`\n- Architecture decisions: `docs/adr/`\n- Product capability specs: `openspec/specs/`\n- Active changes: `openspec/changes/`\n\n## Working Rules\n\n- Read the nearest applicable `AGENTS.md` before modifying files.\n- Read related domain documentation before changing business behavior.\n- Do not duplicate domain rules in this file.\n- Update OpenSpec specs when externally observable behavior changes.\n- Add or update tests for behavior changes.\n- Do not mix unrelated refactors into a feature change.\n\n## High-Risk Areas\n\nBefore changing payment, order, commission, settlement, withdrawal, permissions, webhooks, inventory, or audit logging, read the applicable documentation under `docs/domain/`.\n\n## Definition of Done\n\n- Relevant tests pass.\n- Type checking and lint pass where configured.\n- Behavior changes include documentation or specification updates where applicable.\n- High-risk changes include rollback and failure-path consideration.\n";
8
+ readonly "domain-readme.md": "---\ntitle: {{domain_title}}\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# {{domain_title}}\n\n## 职责\n\n<!-- 描述该领域负责的业务能力。 -->\n\n## 非职责\n\n<!-- 明确该领域不负责什么,避免模块边界扩散。 -->\n\n## 核心对象\n\n| 对象 | 说明 |\n|---|---|\n| | |\n\n## 上游依赖\n\n<!-- 哪些模块、事件、服务会驱动该领域。 -->\n\n## 下游影响\n\n<!-- 该领域变化会影响哪些模块、数据、接口或用户角色。 -->\n\n## 关键规则入口\n\n- [业务规则](./rules.md)\n{{state_machine_link}}{{glossary_link}}\n\n## 关联 ADR\n\n<!-- 例如:../adr/0004-withdrawal-idempotency.md -->\n";
9
+ readonly "domain-rules.md": "---\ntitle: {{domain_title}}业务规则\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# {{domain_title}}业务规则\n\n## 术语\n\n<!-- 仅列出该领域特有术语;通用术语应放到 docs/domain/glossary.md。 -->\n\n## 不变量\n\n<!-- 无论何时都必须成立的规则。 -->\n\n-\n-\n-\n\n## 权限规则\n\n| 角色 | 可执行操作 | 限制 |\n|---|---|---|\n| | | |\n\n## 边界条件\n\n<!-- 写清重复请求、失败重试、并发、撤销、退款、异常状态等行为。 -->\n\n## 审计与追踪\n\n<!-- 是否需要审计日志、操作人、时间、状态变更原因等。 -->\n\n## 禁止行为\n\n-\n-\n";
10
+ readonly "domain-state-machine.md": "---\ntitle: {{domain_title}}状态机\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# {{domain_title}}状态机\n\n## 状态列表\n\n| 状态 | 含义 | 是否终态 |\n|---|---|---|\n| | | 否 |\n\n## 状态流转\n\n```mermaid\nstateDiagram-v2\n [*] --> pending\n pending --> completed\n pending --> cancelled\n```\n\n## 流转规则\n\n| 当前状态 | 触发事件 | 下一个状态 | 前置条件 | 副作用 |\n| ---- | ---- | ----- | ---- | --- |\n| | | | | |\n\n## 幂等规则\n\n<!-- 对重复请求、重复事件、重复回调的处理规则。 -->\n";
11
+ readonly "domain-glossary.md": "---\ntitle: {{domain_title}}术语表\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# {{domain_title}}术语表\n\n| 术语 | 定义 | 备注 |\n|---|---|---|\n| | | |\n";
12
+ readonly "domain-agents.md": "# {{domain_title}} Module Rules\n\n## Scope\n\nThis directory contains the {{domain_title}} domain.\n\n## Required Reading\n\n- `README.md`\n- `rules.md`\n{{state_machine_reading}}\n\n## Rules for Agents\n\n- Do not change domain behavior without updating the relevant domain documentation.\n- Do not introduce new states without updating `state-machine.md`.\n- Preserve existing audit and idempotency behavior.\n- Keep business rules out of controllers and UI components.\n- Add tests for normal, boundary, and retry scenarios.\n\n## Review Checklist\n\n- Are permissions affected?\n- Are money, inventory, or externally triggered callbacks affected?\n- Is retry or duplicate handling required?\n- Does this change require an ADR?\n";
13
+ readonly "adr.md": "---\ntitle: ADR-{{adr_number}}:{{title}}\nstatus: {{status}}\ndate: {{date}}\nowners:\n - {{owner}}\nsupersedes: []\nsuperseded_by: []\ntags: []\n---\n\n# ADR-{{adr_number}}:{{title}}\n\n## 背景\n\n<!-- 当前问题是什么?为什么需要做决策? -->\n\n## 决策\n\n<!-- 明确采用什么方案。必须能被以后的人理解和执行。 -->\n\n## 不采用的方案\n\n### 方案 A\n\n<!-- 为什么不选。 -->\n\n### 方案 B\n\n<!-- 为什么不选。 -->\n\n## 后果\n\n### 正向影响\n\n-\n\n### 代价与限制\n\n-\n\n### 后续约束\n\n-\n\n## 关联内容\n\n- Domain docs:\n- OpenSpec changes:\n- Related ADRs:\n- Related APIs:\n";
14
+ readonly "adr-0001.md": "---\ntitle: ADR-{{adr_number}}:Repository conventions\nstatus: accepted\ndate: {{date}}\nowners:\n - {{owner}}\nsupersedes: []\nsuperseded_by: []\ntags: [conventions]\n---\n\n# ADR-{{adr_number}}:Repository conventions\n\n## 背景\n\n项目接入 AI Agent 协作,需要统一仓库元数据结构:AGENTS.md、领域文档、ADR、frontmatter 与校验规则。\n\n## 决策\n\n采用 Agent Meta 约定:\n\n- 根 `AGENTS.md` 只保留操作性规则与文档入口,不复制领域规则。\n- 领域规则统一放在 `docs/domain/<domain>/`。\n- 长期架构决策记录在 `docs/adr/`,四位递增编号,不复用编号。\n- 受约束文档必须包含 frontmatter:title、status、owner、last_reviewed。\n- 通过 `meta check` 在本地与 CI 校验元数据完整性。\n\n## 不采用的方案\n\n### 单一大 AGENTS.md\n\n规则集中在单文件会不可维护,且 Agent 无法按目录感知局部规则。\n\n## 后果\n\n### 正向影响\n\n- 规则只写一次,可被机器校验。\n\n### 代价与限制\n\n- 需要维护文档 frontmatter 与审核时间。\n\n### 后续约束\n\n- 新领域必须通过 `meta new-domain` 创建。\n\n## 关联内容\n\n- Domain docs: docs/domain/\n- Related ADRs:\n";
15
+ readonly "domain-index-readme.md": "---\ntitle: Domain Index\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: false\napplies_to: []\n---\n\n# Domain Index\n\n<!-- meta:domain-index:start -->\n<!-- Generated by `meta sync --indexes`. Do not edit between markers. -->\n<!-- meta:domain-index:end -->\n";
16
+ readonly "adr-index-readme.md": "---\ntitle: ADR Index\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: false\napplies_to: []\n---\n\n# ADR Index\n\n<!-- meta:adr-index:start -->\n<!-- Generated by `meta sync --indexes`. Do not edit between markers. -->\n<!-- meta:adr-index:end -->\n";
17
+ readonly "glossary.md": "---\ntitle: 术语表\nstatus: active\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# 术语表\n\n<!-- 跨领域通用术语。领域特有术语放在各领域目录下。 -->\n\n| 术语 | 定义 | 备注 |\n|---|---|---|\n| | | |\n";
18
+ readonly "system-overview.md": "---\ntitle: 系统架构总览\nstatus: draft\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# 系统架构总览\n\n## 系统边界\n\n<!-- 系统包含哪些应用 / 服务。 -->\n\n## 模块划分\n\n<!-- 主要模块与职责。 -->\n\n## 关键依赖\n\n<!-- 数据库、消息队列、第三方服务。 -->\n";
19
+ readonly "api-conventions.md": "---\ntitle: API 约定\nstatus: draft\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# API 约定\n\n## 命名与版本\n\n## 错误码规范\n\n## 鉴权约定\n";
20
+ readonly "engineering-testing.md": "---\ntitle: 测试规范\nstatus: draft\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# 测试规范\n\n## 必须覆盖的场景\n\n- 正常路径\n- 边界条件\n- 重试与幂等\n\n## 工具与命令\n";
21
+ readonly "runbooks-readme.md": "---\ntitle: Runbooks\nstatus: draft\nowner: {{owner}}\nlast_reviewed: {{date}}\nsource_of_truth: true\napplies_to: []\n---\n\n# Runbooks\n\n<!-- 运维手册与故障处理流程。 -->\n";
22
+ };
23
+ export type TemplateName = keyof typeof BUILTIN_TEMPLATES;