@miniidealab/openlogos 0.4.3 → 0.5.3

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 (39) hide show
  1. package/dist/commands/archive.d.ts.map +1 -1
  2. package/dist/commands/archive.js +14 -1
  3. package/dist/commands/archive.js.map +1 -1
  4. package/dist/commands/change.d.ts.map +1 -1
  5. package/dist/commands/change.js +7 -0
  6. package/dist/commands/change.js.map +1 -1
  7. package/dist/commands/init.d.ts +4 -0
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +106 -42
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/sync.d.ts.map +1 -1
  12. package/dist/commands/sync.js +25 -1
  13. package/dist/commands/sync.js.map +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/lib/index.d.ts +2 -0
  16. package/dist/lib/index.d.ts.map +1 -0
  17. package/dist/lib/index.js +2 -0
  18. package/dist/lib/index.js.map +1 -0
  19. package/dist/lib/sql-comments.d.ts +14 -0
  20. package/dist/lib/sql-comments.d.ts.map +1 -0
  21. package/dist/lib/sql-comments.js +69 -0
  22. package/dist/lib/sql-comments.js.map +1 -0
  23. package/package.json +5 -4
  24. package/skills/db-designer/SKILL.en.md +53 -11
  25. package/skills/db-designer/SKILL.md +53 -11
  26. package/skills/project-init/SKILL.en.md +1 -1
  27. package/skills/project-init/SKILL.md +1 -1
  28. package/skills/test-orchestrator/SKILL.en.md +1 -1
  29. package/skills/test-orchestrator/SKILL.md +1 -1
  30. package/skills/test-writer/SKILL.en.md +1 -1
  31. package/skills/test-writer/SKILL.md +1 -1
  32. package/spec/agents-md.md +117 -0
  33. package/spec/change-management.md +197 -0
  34. package/spec/directory-convention.md +123 -0
  35. package/spec/logos-project.md +135 -0
  36. package/spec/logos.config.schema.json +147 -0
  37. package/spec/sql-comment-convention.md +225 -0
  38. package/spec/test-results.md +255 -0
  39. package/spec/workflow.md +277 -0
@@ -0,0 +1,123 @@
1
+ # 目录结构约定
2
+
3
+ > 版本:0.3.0
4
+ >
5
+ > 本文档定义遵循 OpenLogos 方法论的项目应采用的标准目录结构。统一的目录结构让 AI 工具和团队成员都能快速定位资源。
6
+
7
+ ## 标准项目结构
8
+
9
+ ```
10
+ project-root/
11
+ ├── AGENTS.md # AI 助手指令(自动生成,根目录)
12
+
13
+ ├── logos/ # OpenLogos 方法论资产(独立收纳)
14
+ │ ├── logos.config.json # 项目配置(OpenLogos 规范)
15
+ │ ├── logos-project.yaml # AI 协作索引(OpenLogos 规范)
16
+ │ │
17
+ │ ├── resources/ # 研发资源文档(当前已生效的"真相")
18
+ │ │ ├── prd/ # 产品文档
19
+ │ │ │ ├── 1-product-requirements/ # Phase 1: 需求文档
20
+ │ │ │ ├── 2-product-design/
21
+ │ │ │ │ ├── 1-feature-specs/ # Phase 2: 功能规格
22
+ │ │ │ │ └── 2-page-design/ # Phase 2: 页面设计 + HTML 原型
23
+ │ │ │ └── 3-technical-plan/
24
+ │ │ │ ├── 1-architecture/ # Phase 3: 架构与技术选型
25
+ │ │ │ └── 2-scenario-implementation/ # Phase 3: 场景实现文档
26
+ │ │ ├── api/ # Phase 3: OpenAPI YAML
27
+ │ │ ├── database/ # Phase 3: SQL DDL
28
+ │ │ ├── test/ # Phase 3: 测试用例规格(Markdown)
29
+ │ │ ├── scenario/ # Phase 3: API 编排测试(JSON)
30
+ │ │ └── verify/ # Phase 3: 测试验收结果(JSONL + 报告)
31
+ │ │
32
+ │ └── changes/ # 变更提案工作区
33
+ │ ├── {change-name}/ # 进行中的变更提案
34
+ │ │ ├── proposal.md
35
+ │ │ ├── tasks.md
36
+ │ │ └── deltas/
37
+ │ └── archive/ # 已完成变更的历史归档
38
+
39
+ └── src/ # 源代码(结构由项目技术栈决定)
40
+ ```
41
+
42
+ OpenLogos 的所有方法论资产收纳在 `logos/` 目录下,与项目自身代码和配置彻底分离。`AGENTS.md`(及 `CLAUDE.md`)保留在项目根目录,因为 AI 工具要求指令文件位于根目录。
43
+
44
+ ## 目录职责
45
+
46
+ ### logos/
47
+
48
+ OpenLogos 方法论的统一入口。包含配置文件、研发资源文档和变更管理。
49
+
50
+ ### logos/resources/
51
+
52
+ 存放所有研发资源文档,是项目当前已生效的"真相源"。按 OpenLogos 三层推进模型组织:
53
+
54
+ | 子目录 | 对应阶段 | 内容 |
55
+ |--------|---------|------|
56
+ | `prd/1-product-requirements/` | Phase 1: WHY | 需求文档、用户故事、竞品分析 |
57
+ | `prd/2-product-design/1-feature-specs/` | Phase 2: WHAT | 功能规格、信息架构、设计规范 |
58
+ | `prd/2-product-design/2-page-design/` | Phase 2: WHAT | 页面设计文档 + HTML 原型 |
59
+ | `prd/3-technical-plan/1-architecture/` | Phase 3: HOW | 整体架构、技术选型 |
60
+ | `prd/3-technical-plan/2-scenario-implementation/` | Phase 3: HOW | 业务场景文档(时序图 + 步骤说明) |
61
+ | `api/` | Phase 3: HOW | OpenAPI YAML 规格文件 |
62
+ | `database/` | Phase 3: HOW | SQL DDL 设计文件 |
63
+ | `test/` | Phase 3: HOW | 单元测试 + 场景测试用例规格(Markdown) |
64
+ | `scenario/` | Phase 3: HOW | API 编排测试用例(JSON,仅 API 项目) |
65
+ | `verify/` | Phase 3: HOW | 测试运行结果(JSONL)+ 验收报告(Markdown) |
66
+
67
+ ### logos/changes/
68
+
69
+ 变更提案工作区。每次功能迭代或 Bug 修复,先在这里创建变更提案,审核通过后再合并回主文档。详见 [change-management.md](./change-management.md)。
70
+
71
+ ### logos.config.json 与 logos-project.yaml
72
+
73
+ - `logos/logos.config.json`:项目配置文件,定义文档模块的路径和匹配模式
74
+ - `logos/logos-project.yaml`:AI 协作索引,为 AI 助手提供项目全局上下文
75
+
76
+ 两个文件都放在 `logos/` 目录下。
77
+
78
+ ## 文件命名约定
79
+
80
+ ### 文档文件
81
+
82
+ - 使用 `{序号}-{英文名}.md` 格式:`01-requirements.md`
83
+ - 序号用于控制显示顺序
84
+ - HTML 原型使用 `{序号}-{英文名}-prototype.html` 格式
85
+ - 设计文档与原型成对出现:`03-homepage-design.md` + `03-homepage-prototype.html`
86
+
87
+ ### API 文件
88
+
89
+ - 按领域分文件:`auth.yaml`、`payment.yaml`、`license.yaml`
90
+ - 使用 OpenAPI 3.0 YAML 格式
91
+
92
+ ### 数据库文件
93
+
94
+ - 完整 Schema:`{project-name}.sql`
95
+ - 或按领域分文件:`auth.sql`、`payment.sql`
96
+
97
+ ### 测试用例规格文件
98
+
99
+ - 按场景分文件:`S01-test-cases.md`、`S02-test-cases.md`
100
+ - 使用 Markdown 格式,包含单元测试和场景测试的用例设计
101
+ - 每个文件对应一个场景编号,覆盖该场景的所有测试层级
102
+
103
+ ### 场景文件
104
+
105
+ - 按场景分文件:`user-auth.json`、`payment-flow.json`
106
+ - 使用 JSON 格式定义 API 编排
107
+
108
+ ### 验收文件
109
+
110
+ - 测试结果:`test-results.jsonl`(JSONL 格式,每行一个用例结果)
111
+ - 验收报告:`acceptance-report.md`(由 `openlogos verify` 自动生成)
112
+ - 详细格式定义见 [test-results.md](./test-results.md)
113
+
114
+ ## 可选目录
115
+
116
+ 根据项目需要,可以添加以下目录:
117
+
118
+ | 目录 | 用途 |
119
+ |------|------|
120
+ | `logos/resources/image/` | 产品图片资源(截图、图标等) |
121
+ | `logos/resources/context/` | 额外的 AI 上下文文件 |
122
+ | `docs/` | 面向用户的文档(部署文档、使用手册等) |
123
+ | `scripts/` | 开发脚本 |
@@ -0,0 +1,135 @@
1
+ # logos-project.yaml 规范
2
+
3
+ > 版本:0.3.0
4
+ >
5
+ > logos-project.yaml 是 OpenLogos 项目的 AI 协作索引文件。它为 AI 助手提供项目的全局上下文,让 AI 打开项目就知道该读哪些资料、项目用了什么技术栈、遵循什么约定。
6
+
7
+ ## 文件位置
8
+
9
+ `logos/logos-project.yaml`(位于 `logos/` 目录下)
10
+
11
+ ## 字段定义
12
+
13
+ ### 顶层字段
14
+
15
+ | 字段 | 类型 | 必填 | 说明 |
16
+ |------|------|------|------|
17
+ | `project` | object | 是 | 项目基本信息 |
18
+ | `tech_stack` | object | 是 | 技术栈描述 |
19
+ | `resource_index` | array | 是 | 资源索引列表 |
20
+ | `conventions` | array | 否 | 项目约定 |
21
+
22
+ ### project
23
+
24
+ | 字段 | 类型 | 必填 | 说明 |
25
+ |------|------|------|------|
26
+ | `name` | string | 是 | 项目名称 |
27
+ | `description` | string | 是 | 项目一句话描述 |
28
+ | `methodology` | string | 否 | 遵循的方法论(默认 "OpenLogos") |
29
+
30
+ ### tech_stack
31
+
32
+ 自由格式的键值对,描述项目使用的技术栈。推荐包含以下 key:
33
+
34
+ | Key | 说明 | 示例 |
35
+ |-----|------|------|
36
+ | `framework` | 主框架 | "Astro 5.x" |
37
+ | `language` | 主语言 | "TypeScript" |
38
+ | `hosting` | 部署平台 | "Cloudflare Pages" |
39
+ | `database` | 数据库 | "Supabase (PostgreSQL)" |
40
+ | `auth` | 认证方案 | "Supabase Auth" |
41
+
42
+ ### external_dependencies
43
+
44
+ 数组,声明项目依赖的外部服务及其测试策略。在架构设计阶段(S12)确定,供编排测试阶段(S06)自动消费。
45
+
46
+ | 字段 | 类型 | 必填 | 说明 |
47
+ |------|------|------|------|
48
+ | `name` | string | 是 | 外部依赖名称(如"邮件服务"、"图形验证码") |
49
+ | `provider` | string | 是 | 具体服务商(如"SendGrid"、"reCAPTCHA") |
50
+ | `used_in` | array | 是 | 涉及的场景列表(如 `["S01-用户注册", "S03-忘记密码"]`) |
51
+ | `test_strategy` | string | 是 | 测试策略枚举值(见下表) |
52
+ | `test_config` | string | 是 | 测试策略的具体配置说明 |
53
+
54
+ `test_strategy` 枚举值:
55
+
56
+ | 值 | 说明 | 典型场景 |
57
+ |----|------|---------|
58
+ | `test-api` | 测试环境提供后门 API 获取验证码/回调等 | 邮件验证码、短信验证码 |
59
+ | `fixed-value` | 特定测试数据使用固定值 | 测试手机号固定验证码 |
60
+ | `env-disable` | 通过环境变量关闭该功能 | 图形验证码、滑块验证 |
61
+ | `mock-callback` | 编排中主动调用模拟回调端点 | 支付回调、Webhook |
62
+ | `mock-service` | 使用本地 mock 服务替代 | OAuth Provider、第三方 API |
63
+
64
+ ### resource_index
65
+
66
+ 数组,每个元素描述一个关键资源文件:
67
+
68
+ | 字段 | 类型 | 必填 | 说明 |
69
+ |------|------|------|------|
70
+ | `path` | string | 是 | 文件相对路径 |
71
+ | `desc` | string | 是 | 一句话描述——告诉 AI 什么场景下需要读这个文件 |
72
+
73
+ ### conventions
74
+
75
+ 数组,每个元素是一条项目约定(字符串格式)。
76
+
77
+ ## 完整示例
78
+
79
+ ```yaml
80
+ project:
81
+ name: "My SaaS Product"
82
+ description: "一个基于 OpenLogos 方法论构建的 SaaS 产品"
83
+ methodology: "OpenLogos"
84
+
85
+ tech_stack:
86
+ framework: "Next.js 15"
87
+ language: "TypeScript"
88
+ hosting: "Vercel"
89
+ database: "Supabase (PostgreSQL)"
90
+ auth: "Supabase Auth"
91
+ payment: "Paddle"
92
+
93
+ external_dependencies:
94
+ - name: "邮件服务"
95
+ provider: "SendGrid"
96
+ used_in: ["S01-用户注册", "S03-忘记密码"]
97
+ test_strategy: "test-api"
98
+ test_config: "GET /api/test/latest-email?to={email}"
99
+ - name: "图形验证码"
100
+ provider: "reCAPTCHA"
101
+ used_in: ["S01-用户注册", "S02-密码登录"]
102
+ test_strategy: "env-disable"
103
+ test_config: "CAPTCHA_ENABLED=false"
104
+ - name: "支付回调"
105
+ provider: "Paddle"
106
+ used_in: ["S05-订阅付费"]
107
+ test_strategy: "mock-callback"
108
+ test_config: "POST /api/test/simulate-payment-callback"
109
+
110
+ resource_index:
111
+ - path: logos/resources/prd/1-product-requirements/01-requirements.md
112
+ desc: 产品核心需求文档。涉及产品定位、目标用户、功能需求时必读。
113
+ - path: logos/resources/prd/2-product-design/1-feature-specs/01-information-architecture.md
114
+ desc: 信息架构文档。涉及页面结构、导航设计时必读。
115
+ - path: logos/resources/api/auth.yaml
116
+ desc: 认证相关 API 规格。涉及登录、注册、OAuth 接口设计时必读。
117
+ - path: logos/resources/database/schema.sql
118
+ desc: 数据库完整 Schema。涉及表结构、字段设计、RLS 策略时必读。
119
+ - path: logos/resources/scenario/user-auth.json
120
+ desc: 用户认证场景的 API 编排。涉及认证流程验收时必读。
121
+
122
+ conventions:
123
+ - "所有 API 路径以 /api/ 开头"
124
+ - "数据库金额字段使用 INTEGER 存储分值"
125
+ - "时间字段统一使用 TIMESTAMPTZ"
126
+ - "每次变更必须先创建 logos/changes/ 变更提案"
127
+ ```
128
+
129
+ ## 与 AGENTS.md 的关系
130
+
131
+ `logos-project.yaml` 是项目资源的结构化索引,`AGENTS.md` 是面向 AI 的自然语言指令。两者互补:
132
+
133
+ - AGENTS.md 告诉 AI "先读 `logos/logos-project.yaml`"
134
+ - logos-project.yaml 告诉 AI "这个项目有哪些关键文件、什么时候该读"
135
+ - `openlogos sync` 命令会根据 logos-project.yaml 的内容更新 AGENTS.md
@@ -0,0 +1,147 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://openlogos.ai/schemas/logos.config.json",
4
+ "title": "OpenLogos Project Configuration",
5
+ "description": "logos.config.json 是 OpenLogos 项目的核心配置文件(位于 logos/ 目录下),定义项目的基本信息和文档模块结构。",
6
+ "type": "object",
7
+ "required": ["name", "documents"],
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "项目名称"
12
+ },
13
+ "description": {
14
+ "type": "string",
15
+ "description": "项目描述"
16
+ },
17
+ "maxOpenTabs": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "default": 20,
21
+ "description": "RunLogos 中最大打开标签页数(仅 RunLogos 使用)"
22
+ },
23
+ "modules": {
24
+ "type": "array",
25
+ "description": "代码模块定义(保留字段,供 RunLogos 使用)",
26
+ "items": {
27
+ "type": "object"
28
+ }
29
+ },
30
+ "fileModules": {
31
+ "type": "object",
32
+ "description": "文件级模块映射(保留字段,供 RunLogos 使用)"
33
+ },
34
+ "locale": {
35
+ "type": "string",
36
+ "enum": ["en", "zh"],
37
+ "default": "en",
38
+ "description": "CLI and RunLogos display language"
39
+ },
40
+ "documents": {
41
+ "type": "object",
42
+ "description": "文档模块定义。每个 key 是模块标识符,value 定义模块的标签、路径和文件匹配模式。",
43
+ "additionalProperties": {
44
+ "$ref": "#/definitions/DocumentModule"
45
+ }
46
+ },
47
+ "verify": {
48
+ "type": "object",
49
+ "description": "测试验收配置(可选)。配置 openlogos verify 的行为。",
50
+ "properties": {
51
+ "result_path": {
52
+ "type": "string",
53
+ "default": "logos/resources/verify/test-results.jsonl",
54
+ "description": "测试结果 JSONL 文件路径(相对项目根目录)"
55
+ },
56
+ "test_command": {
57
+ "type": "string",
58
+ "description": "测试命令(可选)。配置后 openlogos verify 会先执行此命令再读取结果"
59
+ }
60
+ }
61
+ }
62
+ },
63
+ "definitions": {
64
+ "DocumentModule": {
65
+ "type": "object",
66
+ "required": ["label", "path", "pattern"],
67
+ "properties": {
68
+ "label": {
69
+ "$ref": "#/definitions/I18nLabel",
70
+ "description": "模块显示名称(支持多语言)"
71
+ },
72
+ "path": {
73
+ "type": "string",
74
+ "description": "模块根目录的相对路径(相对于 logos.config.json 所在目录)"
75
+ },
76
+ "pattern": {
77
+ "type": "string",
78
+ "description": "文件匹配的 glob 模式"
79
+ }
80
+ }
81
+ },
82
+ "I18nLabel": {
83
+ "type": "object",
84
+ "required": ["en"],
85
+ "properties": {
86
+ "en": {
87
+ "type": "string",
88
+ "description": "英文标签"
89
+ },
90
+ "zh": {
91
+ "type": "string",
92
+ "description": "中文标签"
93
+ }
94
+ },
95
+ "additionalProperties": {
96
+ "type": "string"
97
+ }
98
+ }
99
+ },
100
+ "examples": [
101
+ {
102
+ "name": "My SaaS Project",
103
+ "description": "A SaaS product following OpenLogos methodology",
104
+ "locale": "en",
105
+ "documents": {
106
+ "prd": {
107
+ "label": { "en": "Product Docs", "zh": "产品文档" },
108
+ "path": "./resources/prd",
109
+ "pattern": "**/*.{md,html,htm,pdf}"
110
+ },
111
+ "api": {
112
+ "label": { "en": "API Docs", "zh": "API 文档" },
113
+ "path": "./resources/api",
114
+ "pattern": "**/*.{yaml,yml,json}"
115
+ },
116
+ "test": {
117
+ "label": { "en": "Test Cases", "zh": "测试用例" },
118
+ "path": "./resources/test",
119
+ "pattern": "**/*.md"
120
+ },
121
+ "scenario": {
122
+ "label": { "en": "Scenarios", "zh": "业务场景" },
123
+ "path": "./resources/scenario",
124
+ "pattern": "**/*.json"
125
+ },
126
+ "database": {
127
+ "label": { "en": "Database", "zh": "数据库" },
128
+ "path": "./resources/database",
129
+ "pattern": "**/*.sql"
130
+ },
131
+ "verify": {
132
+ "label": { "en": "Verify Reports", "zh": "验收报告" },
133
+ "path": "./resources/verify",
134
+ "pattern": "**/*.{jsonl,md}"
135
+ },
136
+ "changes": {
137
+ "label": { "en": "Change Proposals", "zh": "变更提案" },
138
+ "path": "./changes",
139
+ "pattern": "**/*.{md,json}"
140
+ }
141
+ },
142
+ "verify": {
143
+ "result_path": "logos/resources/verify/test-results.jsonl"
144
+ }
145
+ }
146
+ ]
147
+ }
@@ -0,0 +1,225 @@
1
+ # SQLite 结构化注释规范
2
+
3
+ > 版本:0.1.0
4
+ >
5
+ > 本文档定义 OpenLogos 项目中 SQLite DDL 的结构化注释格式。AI 在生成 SQLite `schema.sql` 时必须遵循此格式输出表注释和字段注释,使其可被 `parseSqlComments()` 等工具链解析。
6
+
7
+ ## 概述
8
+
9
+ PostgreSQL 和 MySQL 提供原生的注释语法(`COMMENT ON` / `COMMENT`),但 SQLite 不支持任何形式的元数据注释。OpenLogos 定义了一套基于 SQL 行注释(`--`)的结构化约定,让 SQLite DDL 具备等价的元数据表达能力:
10
+
11
+ - **`-- @comment`**:字段注释,放在字段定义行的紧邻上方
12
+ - **`-- @table-comment`**:表注释,放在 `CREATE TABLE` 语句的紧邻下方
13
+
14
+ 这套约定对标准 SQL 工具完全透明(只是普通注释),不影响 SQLite 执行。
15
+
16
+ ## 适用范围
17
+
18
+ 仅当 `logos-project.yaml` 的 `tech_stack.database` 为 **SQLite** 时激活此约定。PostgreSQL 和 MySQL 项目继续使用各自的原生注释语法。
19
+
20
+ ## 字段注释:`-- @comment`
21
+
22
+ ### 语法
23
+
24
+ ```sql
25
+ -- @comment <描述文本>
26
+ <字段定义行>
27
+ ```
28
+
29
+ ### 规则
30
+
31
+ 1. `-- @comment` 行必须**紧邻**目标字段定义行的上方
32
+ 2. `-- @comment` 与字段定义之间**不允许空行**(空行会断开关联)
33
+ 3. 多行注释:连续多个 `-- @comment` 行会自动拼接为一条注释(以空格连接)
34
+ 4. 约束行(`FOREIGN KEY`、独立 `CHECK`、独立 `UNIQUE`)**不需要也不消费** `-- @comment`
35
+
36
+ ### 示例
37
+
38
+ 单行注释:
39
+
40
+ ```sql
41
+ -- @comment 用户唯一标识,UUID v4 字符串
42
+ id TEXT PRIMARY KEY NOT NULL,
43
+ ```
44
+
45
+ 多行注释(自动拼接):
46
+
47
+ ```sql
48
+ -- @comment 账户余额,单位:分 [USD cents]
49
+ -- @comment 禁止使用 DECIMAL/FLOAT 存储金额
50
+ balance INTEGER NOT NULL DEFAULT 0,
51
+ ```
52
+
53
+ 解析结果:`"账户余额,单位:分 [USD cents] 禁止使用 DECIMAL/FLOAT 存储金额"`
54
+
55
+ ### 不需要注释的行
56
+
57
+ 以下行不应添加 `-- @comment`,解析器也不会将 `-- @comment` 关联到它们:
58
+
59
+ ```sql
60
+ FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
61
+ ```
62
+
63
+ ## 表注释:`-- @table-comment`
64
+
65
+ ### 语法
66
+
67
+ ```sql
68
+ );
69
+ -- @table-comment <表名> <描述文本>
70
+ ```
71
+
72
+ ### 规则
73
+
74
+ 1. `-- @table-comment` 放在 `CREATE TABLE ... ();` 语句的**紧邻下方**
75
+ 2. `<表名>` 必须与 `CREATE TABLE` 中的表名完全一致
76
+ 3. `<表名>` 与 `<描述文本>` 之间用空格分隔,第一个空格之后的所有内容为描述
77
+
78
+ ### 示例
79
+
80
+ ```sql
81
+ CREATE TABLE users (
82
+ -- @comment 用户唯一标识
83
+ id TEXT PRIMARY KEY NOT NULL,
84
+ -- @comment 用户邮箱
85
+ email TEXT NOT NULL UNIQUE
86
+ );
87
+ -- @table-comment users 用户基础信息表,存储核心用户数据
88
+ ```
89
+
90
+ ## 完整示例
91
+
92
+ ```sql
93
+ -- TaskFlow v0.1 — SQLite DDL
94
+ -- 方言:SQLite 3;连接须开启 PRAGMA foreign_keys = ON;
95
+ -- 生成日期:2026-04-07
96
+
97
+ -- ---------------------------------------------------------------------------
98
+ -- users(来源:auth.yaml → register, login)
99
+ -- ---------------------------------------------------------------------------
100
+ CREATE TABLE users (
101
+ -- @comment 用户唯一标识,UUID v4 字符串
102
+ id TEXT PRIMARY KEY NOT NULL,
103
+ -- @comment 用户邮箱,已归一化为小写
104
+ email TEXT NOT NULL UNIQUE,
105
+ -- @comment Argon2id 密码哈希,仅存哈希
106
+ password_hash TEXT NOT NULL,
107
+ -- @comment 创建时间,ISO 8601 格式
108
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
109
+ -- @comment 最后更新时间
110
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
111
+ );
112
+ -- @table-comment users 用户表,存储注册用户的核心信息
113
+
114
+ CREATE INDEX idx_users_email ON users (email);
115
+
116
+ -- ---------------------------------------------------------------------------
117
+ -- tasks(来源:tasks.yaml → create, list, get, update, delete)
118
+ -- ---------------------------------------------------------------------------
119
+ CREATE TABLE tasks (
120
+ -- @comment 任务唯一标识
121
+ id TEXT PRIMARY KEY NOT NULL,
122
+ -- @comment 任务归属用户 ID
123
+ user_id TEXT NOT NULL,
124
+ -- @comment 任务标题
125
+ title TEXT NOT NULL,
126
+ -- @comment 任务详细描述,可为空
127
+ description TEXT,
128
+ -- @comment 任务状态:todo / in_progress / done
129
+ status TEXT NOT NULL DEFAULT 'todo' CHECK (status IN ('todo', 'in_progress', 'done')),
130
+ -- @comment 任务优先级:low / medium / high
131
+ priority TEXT NOT NULL DEFAULT 'medium' CHECK (priority IN ('low', 'medium', 'high')),
132
+ -- @comment 创建时间
133
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
134
+ -- @comment 最后更新时间
135
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
136
+ FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
137
+ );
138
+ -- @table-comment tasks 任务表,存储用户创建的所有任务
139
+
140
+ CREATE INDEX idx_tasks_user_status ON tasks (user_id, status);
141
+ CREATE INDEX idx_tasks_user_updated ON tasks (user_id, updated_at);
142
+ ```
143
+
144
+ ## 解析算法
145
+
146
+ 解析器逐行扫描 SQL 文件,维护以下状态:
147
+
148
+ - `currentTable: string | null` — 当前所在的 `CREATE TABLE` 上下文
149
+ - `pendingComment: string[]` — 待关联的注释缓冲区
150
+
151
+ ### 伪代码
152
+
153
+ ```
154
+ for each line in file:
155
+ trimmed = line.trim()
156
+
157
+ if trimmed starts with "-- @table-comment ":
158
+ extract tableName and description
159
+ associate description with tableName
160
+ continue
161
+
162
+ if trimmed starts with "-- @comment ":
163
+ extract text after "-- @comment "
164
+ append to pendingComment
165
+ continue
166
+
167
+ if trimmed is empty:
168
+ clear pendingComment
169
+ continue
170
+
171
+ if trimmed matches /^CREATE TABLE\s+(\w+)/i:
172
+ set currentTable to captured name
173
+ clear pendingComment (table-level comment uses @table-comment)
174
+ continue
175
+
176
+ if currentTable is set AND trimmed is a column definition:
177
+ extract columnName (first word-like token)
178
+ if pendingComment is not empty:
179
+ associate joined pendingComment with currentTable.columnName
180
+ clear pendingComment
181
+ add column to currentTable's column list
182
+
183
+ if trimmed starts with ")":
184
+ clear currentTable
185
+ clear pendingComment
186
+ ```
187
+
188
+ ### 列定义识别
189
+
190
+ 一行被视为列定义,当且仅当:
191
+ 1. 当前在 `CREATE TABLE` 块内(`currentTable` 不为 `null`)
192
+ 2. 该行**不是**以 `FOREIGN KEY`、`CHECK`、`UNIQUE`、`PRIMARY KEY`(独立约束)、`CONSTRAINT` 开头(不区分大小写)
193
+ 3. 该行**不是** `)`(表结束行)
194
+ 4. 该行**不是** `--` 开头的注释行
195
+
196
+ 列名提取:取该行第一个匹配 `/^\s*["']?(\w+)["']?/` 的标识符。
197
+
198
+ ## 输出数据结构
199
+
200
+ ```typescript
201
+ interface SchemaMetadata {
202
+ tables: TableMeta[];
203
+ }
204
+
205
+ interface TableMeta {
206
+ name: string;
207
+ comment?: string;
208
+ columns: ColumnMeta[];
209
+ }
210
+
211
+ interface ColumnMeta {
212
+ name: string;
213
+ comment?: string;
214
+ }
215
+ ```
216
+
217
+ ## 与其他方言的关系
218
+
219
+ | 数据库 | 表注释 | 字段注释 |
220
+ |--------|--------|---------|
221
+ | PostgreSQL | `COMMENT ON TABLE t IS '...'` | `COMMENT ON COLUMN t.c IS '...'` |
222
+ | MySQL | `CREATE TABLE t (...) COMMENT = '...'` | `col TYPE COMMENT '...'` |
223
+ | **SQLite** | **`-- @table-comment t 描述`** | **`-- @comment 描述`** |
224
+
225
+ OpenLogos 的 `db-designer` Skill 会根据 `tech_stack.database` 自动选择正确的注释方式。工具链中的 `parseSqlComments()` 函数专门解析 SQLite 的 `@comment` / `@table-comment` 标记。