cgraphx 2.0.3 → 2.0.6
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/dist/.claude-template/FLOW-MAP.md +13 -3
- package/dist/.claude-template/agents/task-history.md +186 -0
- package/dist/.claude-template/commands/end.md +1 -0
- package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +5 -3
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +8 -8
- package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +8 -8
- package/dist/.claude-template/skills/clarify-requirements/SKILL.md +13 -9
- package/dist/.claude-template/skills/db-query/SKILL.md +19 -2
- package/dist/.claude-template/skills/iboc-check/SKILL.md +51 -23
- package/dist/.claude-template/skills/iboc-check/filler-prompt.md +3 -4
- package/dist/.claude-template/skills/run-api-test/SKILL.md +15 -15
- package/dist/.claude-template/skills/run-api-test/assets/{template-test-report.md → template-/346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212.md} +4 -4
- package/dist/.claude-template/skills/run-api-test/references/bru-run.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
- package/dist/.claude-template/skills/run-api-test/references/report-format.md +6 -6
- package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +1 -1
- package/dist/.claude-template/skills/run-api-test/references/test-scope.md +6 -6
- package/dist/.claude-template/skills/run-ui-test/SKILL.md +186 -0
- package/dist/.claude-template/skills/run-ui-test/references/report-format.md +77 -0
- package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
- package/dist/.claude-template/skills/write-api/SKILL.md +18 -18
- package/dist/.claude-template/skills/write-api/assets/{template-api-spec.md → template-/346/216/245/345/217/243/346/265/213/350/257/225-spec.md} +1 -1
- package/dist/.claude-template/skills/write-api/references/{api-spec-format.md → /346/216/245/345/217/243/346/265/213/350/257/225-spec-format.md} +3 -3
- package/dist/.claude-template/skills/write-plan/SKILL.md +4 -2
- package/dist/.claude-template/skills/write-ui-test/SKILL.md +125 -0
- package/dist/.claude-template/skills/write-ui-test/references//347/224/250/344/276/213/350/247/204/346/240/274-format.md +94 -0
- package/dist/core/dbquery/cli.d.ts.map +1 -1
- package/dist/core/dbquery/cli.js +5 -4
- package/dist/core/dbquery/cli.js.map +1 -1
- package/dist/core/dbquery/config.d.ts.map +1 -1
- package/dist/core/dbquery/config.js +39 -3
- package/dist/core/dbquery/config.js.map +1 -1
- package/dist/core/dbquery/drivers/http.d.ts +23 -0
- package/dist/core/dbquery/drivers/http.d.ts.map +1 -0
- package/dist/core/dbquery/drivers/http.js +125 -0
- package/dist/core/dbquery/drivers/http.js.map +1 -0
- package/dist/core/dbquery/drivers/mysql.js +1 -1
- package/dist/core/dbquery/drivers/mysql.js.map +1 -1
- package/dist/core/dbquery/drivers/postgres.js +1 -1
- package/dist/core/dbquery/drivers/postgres.js.map +1 -1
- package/dist/core/dbquery/executor.d.ts.map +1 -1
- package/dist/core/dbquery/executor.js +46 -12
- package/dist/core/dbquery/executor.js.map +1 -1
- package/dist/core/dbquery/format.d.ts.map +1 -1
- package/dist/core/dbquery/format.js +2 -1
- package/dist/core/dbquery/format.js.map +1 -1
- package/dist/core/dbquery/init.d.ts.map +1 -1
- package/dist/core/dbquery/init.js +7 -0
- package/dist/core/dbquery/init.js.map +1 -1
- package/dist/core/dbquery/types.d.ts +55 -7
- package/dist/core/dbquery/types.d.ts.map +1 -1
- package/dist/core/directory.d.ts +17 -0
- package/dist/core/directory.d.ts.map +1 -1
- package/dist/core/directory.js +37 -0
- package/dist/core/directory.js.map +1 -1
- package/dist/core/features/cli.d.ts.map +1 -1
- package/dist/core/features/cli.js +3 -2
- package/dist/core/features/cli.js.map +1 -1
- package/dist/core/features/scanner.d.ts +1 -1
- package/dist/core/features/scanner.d.ts.map +1 -1
- package/dist/core/features/scanner.js +20 -4
- package/dist/core/features/scanner.js.map +1 -1
- package/dist/core/markdown/cli.d.ts.map +1 -1
- package/dist/core/markdown/cli.js +9 -8
- package/dist/core/markdown/cli.js.map +1 -1
- package/dist/core/timeline/cli.js +7 -7
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/hook-runner.js +2 -2
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.js +6 -6
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/web/register.d.ts.map +1 -1
- package/dist/web/register.js +2 -1
- package/dist/web/register.js.map +1 -1
- package/package.json +1 -1
- package/dist/.claude-template/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-deck/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-deck/references/.cgraphx/timeline-current-turn.json +0 -1
- package/dist/.claude-template/skills/handdrawn-sketch-engine/.cgraphx/timeline-current-turn.json +0 -1
- /package/dist/.claude-template/skills/run-api-test/assets/{template-test-verify.jsonl → template-/346/216/245/345/217/243/346/265/213/350/257/225/351/252/214/350/257/201.jsonl"} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: write-api
|
|
3
|
-
description: 基于需求生成 bruno 测试接口(.bru +
|
|
3
|
+
description: 基于需求生成 bruno 测试接口(.bru + 接口测试规格 + 环境配置)。流程:识别接口范围(用户显式给 / spec 接口章节 / AI 读 spec 理解)→ 生成接口测试规格文档 → 单次 AI 调用生成 .bru(含真实参数 + 内嵌断言)→ 首次接入时生成 bruno.json + environments/*.bru 骨架。产物:接口测试规格随 feature 走;.bru collection 按 <服务>/<需求前缀>/<接口名>/<场景> 组织在 docs/bruno/(按需求隔离,跨需求不覆盖);environments 统一管理。本 skill 不跑 bru run、不核实 DB、不出报告——那是 /run-api-test 的职责。不调 write-api-doc、不自动修代码、不引入程序化配置文件(微服务/通用接口识别由 AI 判断)。Use when 用户要求生成测试接口 / 写接口测试 / 准备 bruno 测试 / 帮需求补接口 / 免去手动录接口。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Write API
|
|
7
7
|
|
|
8
8
|
## 定位
|
|
9
9
|
|
|
10
|
-
造弹药 skill:基于需求生成 bruno 测试接口的"原料"
|
|
10
|
+
造弹药 skill:基于需求生成 bruno 测试接口的"原料"——接口测试规格 + .bru + 多环境配置。跑测试 + DB 核实 + 出报告由 `/run-api-test` 接管,本 skill 不做。
|
|
11
11
|
|
|
12
12
|
## HARD-GATE
|
|
13
13
|
|
|
@@ -33,9 +33,9 @@ description: 基于需求生成 bruno 测试接口(.bru + 测试规格 + 环境
|
|
|
33
33
|
|
|
34
34
|
| skill | 关系 | 说明 |
|
|
35
35
|
|---|---|---|
|
|
36
|
-
| `run-api-test` | 下游 + 独立 | 消费本 skill 产的 .bru +
|
|
36
|
+
| `run-api-test` | 下游 + 独立 | 消费本 skill 产的 .bru + 接口测试规格跑测试;本 skill 不调它,跑测试由用户显式触发;同一份 .bru 可被多次 run-api-test 复用 |
|
|
37
37
|
| `db-query` | 复用 | S3 查真实测试数据;DB 副作用核实由 `/run-api-test` R4 做 |
|
|
38
|
-
| `write-api-doc` | 独立并列 | 不互相调用;本 skill 产 .bru +
|
|
38
|
+
| `write-api-doc` | 独立并列 | 不互相调用;本 skill 产 .bru + 接口测试规格,write-api-doc 产 HTML 接口文档 |
|
|
39
39
|
| `implementation` / `subagent-implement` | 上游 | 编码阶段,跑完触发本 skill |
|
|
40
40
|
| `write-design-doc` | 独立 | 发布后按需产设计文档 |
|
|
41
41
|
|
|
@@ -56,11 +56,11 @@ description: 基于需求生成 bruno 测试接口(.bru + 测试规格 + 环境
|
|
|
56
56
|
- 文件名不得包含 `/`、`:`、`*`、`?`、`"`、`<`、`>`、`|`
|
|
57
57
|
|
|
58
58
|
产物文件名:
|
|
59
|
-
-
|
|
59
|
+
- 接口测试规格:`docs/features/<feature-id>/<文件前缀>-接口测试-spec.md`
|
|
60
60
|
- .bru:`docs/bruno/<服务>/<文件前缀>/<接口名>/<场景>.bru`(按需求隔离,见 `references/collection-layout.md`)
|
|
61
61
|
- bruno.json + environments:见 `references/environment-setup.md`
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
接口测试报告 / JSONL 不由本 skill 产——`/run-api-test` 跑完后产,落 `docs/features/<feature-id>/`。
|
|
64
64
|
|
|
65
65
|
## 工作流
|
|
66
66
|
|
|
@@ -76,22 +76,22 @@ description: 基于需求生成 bruno 测试接口(.bru + 测试规格 + 环境
|
|
|
76
76
|
- **拿到接口并用户确认** → 进 S2
|
|
77
77
|
- **拿不到** → 报错"未检测到接口范围,请显式给接口清单或确认 spec 接口章节完整"并退出,不生成任何产物
|
|
78
78
|
|
|
79
|
-
### S2.
|
|
79
|
+
### S2. 生成接口测试规格文档
|
|
80
80
|
|
|
81
81
|
- **前置**:S1 接口清单已确认
|
|
82
|
-
- **行为**:按 `references
|
|
82
|
+
- **行为**:按 `references/接口测试-spec-format.md` 六节结构生成接口测试规格文档;AI 做微服务识别 + 通用接口判断(prompt 见 `references/ai-prompts.md` §S2),结果写入 §1 接口清单的"服务"和"通用"列
|
|
83
83
|
- **用户校正**:AI 识别结果在 §1 列出后,用户可在 S3 前校正"服务"和"通用"两列,skill 以校正后为准
|
|
84
|
-
- **结果**:落盘 `docs/features/<feature-id
|
|
84
|
+
- **结果**:落盘 `docs/features/<feature-id>/<文件前缀>-接口测试-spec.md`
|
|
85
85
|
|
|
86
86
|
### S3. 生成 bruno 测试接口
|
|
87
87
|
|
|
88
|
-
- **前置**:S2
|
|
88
|
+
- **前置**:S2 接口测试规格就绪(含用户校正后的服务/通用标注)
|
|
89
89
|
- **行为**:**单次 AI 调用**生成全部 .bru(不拆两阶段、不逐接口循环,见 `references/ai-prompts.md` §S3)
|
|
90
90
|
- .bru 格式 / 断言 / 入参 / docs 段 → `references/bru-format.md`
|
|
91
91
|
- 落盘路径 / 按需求隔离 / 根级 bruno.json → `references/collection-layout.md`
|
|
92
92
|
- 使用 db-query skill 获取基于数据库的测试数据
|
|
93
|
-
- 拿不到真实数据时 → 留 `{{var}}` 占位 +
|
|
94
|
-
- **AI 调用失败**(超时/限流)→ 报"AI 增强失败" + 保留 S2
|
|
93
|
+
- 拿不到真实数据时 → 留 `{{var}}` 占位 + 接口测试规格 §3 标注"需用户手填"
|
|
94
|
+
- **AI 调用失败**(超时/限流)→ 报"AI 增强失败" + 保留 S2 接口测试规格,**不继续 S4**
|
|
95
95
|
- **结果**:全部 .bru 落盘到 `<服务>/<需求前缀>/<接口名>/<场景>.bru` + 根级 bruno.json 就绪
|
|
96
96
|
|
|
97
97
|
### S4. 首次接入环境准备
|
|
@@ -108,7 +108,7 @@ description: 基于需求生成 bruno 测试接口(.bru + 测试规格 + 环境
|
|
|
108
108
|
S4 完成后 skill 结束。**不跑 bru run、不核实 DB、不出报告**。
|
|
109
109
|
|
|
110
110
|
产物:
|
|
111
|
-
- `docs/features/<feature-id
|
|
111
|
+
- `docs/features/<feature-id>/<文件前缀>-接口测试-spec.md`(接口测试规格)
|
|
112
112
|
- `docs/bruno/<服务>/<文件前缀>/<接口名>/<场景>.bru`(测试接口,按需求隔离)
|
|
113
113
|
- `docs/bruno/bruno.json` + `docs/bruno/environments/*.bru`(首次接入生成)
|
|
114
114
|
|
|
@@ -118,9 +118,9 @@ S4 完成后 skill 结束。**不跑 bru run、不核实 DB、不出报告**。
|
|
|
118
118
|
|---|---|
|
|
119
119
|
| 无新增接口 | 报错退出,不生成空产物 |
|
|
120
120
|
| 接口范围三种来源都拿不到 | 报错退出 |
|
|
121
|
-
| AI 拿不到真实测试数据 | 留 `{{var}}` 占位 +
|
|
122
|
-
| AI 调用失败 | 报"AI 增强失败" +
|
|
123
|
-
| 同需求重复触发 write-api | 覆盖该需求的 .bru +
|
|
121
|
+
| AI 拿不到真实测试数据 | 留 `{{var}}` 占位 + 接口测试规格标注"需用户手填",继续跑能跑的部分 |
|
|
122
|
+
| AI 调用失败 | 报"AI 增强失败" + 保留接口测试规格,不继续 S4 |
|
|
123
|
+
| 同需求重复触发 write-api | 覆盖该需求的 .bru + 覆盖接口测试规格(数据从当前需求 spec + DB 重新取) |
|
|
124
124
|
| 跨需求同接口同场景 | 各需求独立保留,不覆盖(分别在自己需求目录下) |
|
|
125
125
|
| 项目首次接入 | 自动创建 `docs/bruno/` + bruno.json + environments/ |
|
|
126
126
|
| env 文件缺失 | S4 生成骨架 + AI 填 non-secret + 暂停提示用户填 secret |
|
|
@@ -130,7 +130,7 @@ S4 完成后 skill 结束。**不跑 bru run、不核实 DB、不出报告**。
|
|
|
130
130
|
## 质量检查
|
|
131
131
|
|
|
132
132
|
跑完后自检:
|
|
133
|
-
-
|
|
133
|
+
- 接口测试规格文档落盘 feature 目录,六节齐全
|
|
134
134
|
- .bru 按 `<服务>/<需求前缀>/<接口名>/<场景>.bru` 组织,无 `collection.bru`
|
|
135
135
|
- 根级 `bruno.json` 存在;首次接入时 `environments/` + 三环境 .bru 生成,secret 留空
|
|
136
136
|
- .bru 用旧版 tests 语法(`test("name", function() { res.getStatus()/res.getBody()... })`),无 `assert` 段、无 `function onResponse`
|
|
@@ -144,7 +144,7 @@ S4 完成后 skill 结束。**不跑 bru run、不核实 DB、不出报告**。
|
|
|
144
144
|
## 收尾
|
|
145
145
|
|
|
146
146
|
提示用户:
|
|
147
|
-
1.
|
|
147
|
+
1. 接口测试规格位置(`<文件前缀>-接口测试-spec.md`)
|
|
148
148
|
2. .bru collection 位置(`docs/bruno/<服务>/<文件前缀>/<接口名>/`)
|
|
149
149
|
3. 首次接入:bruno.json + environments/*.bru 已生成,需填 `local.bru` 的 secret 变量
|
|
150
150
|
4. 下一步:**跑 `/run-api-test` 跑测试 + 核实 DB + 出报告**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 接口测试规格模板
|
|
2
2
|
|
|
3
|
-
适用于 feature 编码完成后,由 `write-api` skill 在 S2 生成。默认输出到 `docs/features/<feature-id
|
|
3
|
+
适用于 feature 编码完成后,由 `write-api` skill 在 S2 生成。默认输出到 `docs/features/<feature-id>/<文件前缀>-接口测试-spec.md`。
|
|
4
4
|
|
|
5
5
|
本模板由 AI 在 S2 填充:§1 接口清单的"服务"和"通用"列由 AI 判断(见 SKILL.md 的 S2 prompt 指引),用户可在 S3 前手动校正。
|
|
6
6
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# S2
|
|
1
|
+
# S2 接口测试规格文档格式规范
|
|
2
2
|
|
|
3
3
|
## 六节结构(必须完整)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
接口测试规格文档 `<文件前缀>-接口测试-spec.md` 必须含以下六节,顺序固定:
|
|
6
6
|
|
|
7
7
|
### §1. 接口清单
|
|
8
8
|
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
|
|
98
98
|
## 模板
|
|
99
99
|
|
|
100
|
-
完整填充示例见 `assets/template
|
|
100
|
+
完整填充示例见 `assets/template-接口测试-spec.md`,AI 生成时以它为骨架填充。
|
|
101
101
|
|
|
102
102
|
## 与下游 skill 的契约
|
|
103
103
|
|
|
@@ -47,11 +47,13 @@ spec 中"不可留到实现期的决策"或影响任务拆分的【待确认】,
|
|
|
47
47
|
|
|
48
48
|
- 按依赖和风险拆,不按模板拆:数据/契约 → 后端 → 前端(依实际依赖调整)。
|
|
49
49
|
- **默认合并**(减少审查次数,写明理由):同文件多章节改写归单 implementer;schema 改动 + 对应 migration 合一。拆开仅限:任务过大撑爆上下文、强耦合需实时反馈。
|
|
50
|
+
- **任务 = 工作包**(连贯的功能块/层块,可独立验证):「改 1 字段 / 加 1 参数 / 调 1 处样式」级微任务并入同层/同功能任务;总任务数一般 ≤6,超过先检查是否拆太细,优先合并。
|
|
50
51
|
- **测试不进 plan**:单元测试 / 接口测试是代码完成后的独立流程(`write-unit-test-spec` → `write-unit-test-code`、`write-api` → `run-api-test`,各自从 spec 派生),plan 不排测试任务、不写必测路径 / 测试命令、implementer 实现期不写新测试。plan 对测试的唯一要求是完成定义:任务提交后既有测试不被弄红(改动弄红的既有测试须同步修正)。
|
|
51
52
|
- 能独立验证的尽量独立成任务;高风险任务写保护条件和回退思路。
|
|
52
53
|
- **可独立提交的任务标「独立提交」**:任务完成后仓库处于可工作状态(能编译、相关测试不红)→ 标「独立提交:是」并给建议提交粒度 + commit message 主题;强耦合(完成后仓库不可工作、需后续任务才闭合)→ 不标,说明随哪个任务一起提交。判断依据写进任务,不机械地每任务都标——小步提交是为了原子化历史(好 review / revert / bisect),不是为了凑提交数。
|
|
53
54
|
- 可并行任务显式成批 + 写明文件集/公共契约/测试状态互不冲突;不确定 → 串行。
|
|
54
55
|
- 不重新打开 spec 已锁定的契约;不把简单需求拆碎。
|
|
56
|
+
- **执行方式建议(终判,写进 index)**:仅当三条件同时成立才建议 `/subagent-implement`——任务跨 ≥3 个相互独立的模块、预估变更文件总数 ≥10、任务间无需实时反馈(可独立派任);否则建议 `/implementation`,拿不准 → implementation。不以任务量或跨域数为依据(小全栈需求天然跨 3 域,任何需求都拆得出 ≥3 任务)。
|
|
55
57
|
|
|
56
58
|
## 消费模型与防漂移
|
|
57
59
|
|
|
@@ -80,7 +82,7 @@ docs/guides/ 存在时(init-project-guides 产出),写 plan 前按下表读规
|
|
|
80
82
|
|
|
81
83
|
## index.md 必备内容
|
|
82
84
|
|
|
83
|
-
feature-id/负责人/日期/来源 spec 摘要(需求阶段由 `cgraphx features` 从产物自动派生,不手填状态) · 目标与范围 · 明确不包含 · 计划文件清单(哪些存在/不涉及) · 总任务清单(每个任务标对应 spec 条款 + 是否「独立提交」) · 全局依赖图(Mermaid 或文本;没有依赖就直说,不强行造依赖) · 推荐执行顺序 · 可并行批次(文件/模块/验证状态不重叠依据) · 必须严格执行的契约 · 实现手段决策(自主项:选项+推荐+理由;回跳项:业务拍板结论) · 适用规范(文件 + 章节标题) · **提交规范**(有「独立提交」任务时必备:从 `git-standards.md` 结晶的提交消息格式 + 提交前检查点,实施期据此提交,precommit 门禁仅兜底) · 允许局部工程适配的范围 · Plan 冲突上报规则 · 关键风险与防跑偏约束 · 待确认项。
|
|
85
|
+
feature-id/负责人/日期/来源 spec 摘要(需求阶段由 `cgraphx features` 从产物自动派生,不手填状态) · 目标与范围 · 明确不包含 · 计划文件清单(哪些存在/不涉及) · 总任务清单(每个任务标对应 spec 条款 + 是否「独立提交」) · 全局依赖图(Mermaid 或文本;没有依赖就直说,不强行造依赖) · 推荐执行顺序 · 可并行批次(文件/模块/验证状态不重叠依据) · 必须严格执行的契约 · 实现手段决策(自主项:选项+推荐+理由;回跳项:业务拍板结论) · **执行方式建议**(`/implementation` 或 `/subagent-implement` + 理由,判据见「拆分规则」终判条) · 适用规范(文件 + 章节标题) · **提交规范**(有「独立提交」任务时必备:从 `git-standards.md` 结晶的提交消息格式 + 提交前检查点,实施期据此提交,precommit 门禁仅兜底) · 允许局部工程适配的范围 · Plan 冲突上报规则 · 关键风险与防跑偏约束 · 待确认项。
|
|
84
86
|
|
|
85
87
|
## 子计划文件(按需,不建空文件)
|
|
86
88
|
|
|
@@ -133,7 +135,7 @@ feature-id/负责人/日期/来源 spec 摘要(需求阶段由 `cgraphx features
|
|
|
133
135
|
|
|
134
136
|
## 收尾
|
|
135
137
|
|
|
136
|
-
产物落盘后自动跑 `cgraphx features sync`(更新本人需求索引,本地幂等)
|
|
138
|
+
产物落盘后自动跑 `cgraphx features sync`(更新本人需求索引,本地幂等)。全部通过后推荐执行模式一句话(即 index「执行方式建议」):**小规模 → `/implementation`;大规模(≥10 文件且 ≥3 独立模块、任务可独立派任)→ `/subagent-implement`。** 不自动开始实现,停下等用户。找需求目录:`cgraphx features list --mine`。
|
|
137
139
|
|
|
138
140
|
## 红线(绝对不能做)
|
|
139
141
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: write-ui-test
|
|
3
|
+
description: 从需求 spec 派生 UI 功能测试用例规格(一功能点一用例,每条含功能点名/操作步骤/预期表现/数据前提/登录账号)。流程:读需求 spec 识别功能点 → 功能点清单用户确认 → 派生用例 → 用例清单用户确认 → 落盘 docs/features/<feature-id>/ui功能测试/。本 skill 不碰浏览器、不执行、不出报告——那是 /run-ui-test 的职责。不调 run-ui-test、不修代码、不改需求 spec。Use when 用户要求写 UI 功能测试用例 / 生成界面功能测试 / 准备页面功能测试 / write-ui-test / 需求要在界面上验一遍。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Write UI Test
|
|
7
|
+
|
|
8
|
+
## 定位
|
|
9
|
+
|
|
10
|
+
造弹药 skill:从需求 spec 派生 UI 功能测试的用例规格——agent 打开浏览器按它执行是 `/run-ui-test` 的事,本 skill 只做用例派生,不碰浏览器。
|
|
11
|
+
|
|
12
|
+
用例规格是**自然语言用例**,不是可执行脚本:执行期由 agent 读用例、通过 Playwright MCP 实时驱动浏览器。
|
|
13
|
+
|
|
14
|
+
## HARD-GATE
|
|
15
|
+
|
|
16
|
+
- **不碰浏览器** —— 本 skill 全程不启动/不驱动浏览器,不截图
|
|
17
|
+
- **不编造功能点** —— 用例必须来自需求 spec 的功能点/验收标准,spec 里没有的功能点不派生
|
|
18
|
+
- **用例清单未经用户确认不落盘**
|
|
19
|
+
- **不重新定义 spec 已锁定的业务规则** —— 发现 spec 与代码现实不符,标注【待确认】而不是自行解释
|
|
20
|
+
|
|
21
|
+
## Trigger
|
|
22
|
+
|
|
23
|
+
**使用此 skill 当**:
|
|
24
|
+
- 用户要求"写 UI 功能测试用例""生成界面功能测试""write-ui-test"
|
|
25
|
+
- 用户在 `/implementation` 或 `/subagent-implement` 完成编码后,要在界面上验一遍需求
|
|
26
|
+
- 接口测试跑完,用户要继续验 UI 层(推荐顺序,非硬前置)
|
|
27
|
+
|
|
28
|
+
**不要使用此 skill 当**:
|
|
29
|
+
- 跑测试 / 驱动浏览器 → 用 `/run-ui-test`
|
|
30
|
+
- 接口测试 → 用 `/write-api` / `/run-api-test`
|
|
31
|
+
- 视觉回归 / 跨浏览器兼容 / 性能测试 → 非本流程目标,不接
|
|
32
|
+
- 写 spec / plan → 用 `/write-spec` / `/write-plan`
|
|
33
|
+
|
|
34
|
+
## 与既有 skill 边界
|
|
35
|
+
|
|
36
|
+
| skill | 关系 | 说明 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `run-ui-test` | 下游 + 独立 | 消费本 skill 产的用例规格驱动浏览器;本 skill 不调它,执行由用户显式触发;同一份用例规格可被多次 run-ui-test 复用 |
|
|
39
|
+
| `write-api` / `run-api-test` | 平行 | 接口层测试;本流程推荐在其之后跑,但非硬前置 |
|
|
40
|
+
| `implementation` / `subagent-implement` | 上游 | 编码完成后触发本 skill |
|
|
41
|
+
|
|
42
|
+
## 依赖
|
|
43
|
+
|
|
44
|
+
- `docs/features/<feature-id>/<文件前缀>-spec.md` 存在(U1 派生输入)
|
|
45
|
+
- 目标项目编码已完成(推荐;纯前端需求同理)
|
|
46
|
+
- **不依赖** Playwright MCP(本 skill 不碰浏览器;执行期才需要,归 `/run-ui-test` 校验)
|
|
47
|
+
|
|
48
|
+
## feature-id 与文件前缀规则
|
|
49
|
+
|
|
50
|
+
复用既有规则(同 `/write-api` / `/run-api-test` / `/write-spec` 的算法):
|
|
51
|
+
|
|
52
|
+
- feature-id 格式:`YYYY-MM-DD-[业务ID-]<标题>`
|
|
53
|
+
- 文件前缀:有业务ID = `<业务ID>-<标题>`,无业务ID = `<标题>`
|
|
54
|
+
- 标题段允许中文、英文或混合,**不得**对中文做英文 slug 转换
|
|
55
|
+
- 文件名不得包含 `/`、`:`、`*`、`?`、`"`、`<`、`>`、`|`
|
|
56
|
+
|
|
57
|
+
产物文件名:
|
|
58
|
+
|
|
59
|
+
- 用例规格:`docs/features/<feature-id>/ui功能测试/<文件前缀>-ui功能测试-spec.md`
|
|
60
|
+
|
|
61
|
+
`ui功能测试/` 目录不存在则创建(与 plan/ 平级,按需求隔离;截图与报告同目录,由 `/run-ui-test` 产)。
|
|
62
|
+
|
|
63
|
+
## 工作流
|
|
64
|
+
|
|
65
|
+
按 U1-U3 顺序执行,格式规范见 `references/用例规格-format.md`。
|
|
66
|
+
|
|
67
|
+
### U1. 确认需求与功能点范围
|
|
68
|
+
|
|
69
|
+
- **前置**:用户指定需求(feature-id / spec / 需求名)
|
|
70
|
+
- **行为**:
|
|
71
|
+
- 读 `docs/features/<feature-id>/<文件前缀>-spec.md`
|
|
72
|
+
- 从功能描述/验收标准识别功能点(用户可显式给功能点清单,优先级最高)
|
|
73
|
+
- **功能点清单必须显示给用户确认**——避免 AI 理解偏差测错范围;用户确认后才进 U2
|
|
74
|
+
- **拿不到功能点**(spec 缺失 / 无验收标准可派生)→ 报错退出,不产空产物
|
|
75
|
+
|
|
76
|
+
### U2. 派生用例
|
|
77
|
+
|
|
78
|
+
- **前置**:U1 功能点清单已确认
|
|
79
|
+
- **行为**:按 `references/用例规格-format.md` 派生——**一功能点一用例**,每条含五要素:
|
|
80
|
+
- 功能点名(与截图命名对应)
|
|
81
|
+
- 操作步骤(自然语言,页面动线)
|
|
82
|
+
- 预期表现(UI 上应看到什么——渲染/跳转/提示/输入回显;**不写 DB 断言**,本流程不验库)
|
|
83
|
+
- 数据前提(需要什么存量数据;无则写「无」)
|
|
84
|
+
- 登录账号(需要登录时记测试账号;拿不到留【待用户填写】;无需登录写「无需登录」)
|
|
85
|
+
- **入口 URL**:记入用例规格 §1 概览;拿不到留【需用户填写】
|
|
86
|
+
- **结果**:用例草稿
|
|
87
|
+
|
|
88
|
+
### U3. 确认落盘
|
|
89
|
+
|
|
90
|
+
- **前置**:U2 用例草稿就绪
|
|
91
|
+
- **行为**:用例清单(功能点名 + 步骤摘要 + 数据前提)显示给用户确认;确认后按格式规范落盘
|
|
92
|
+
- **用户校正**:增删用例、改步骤/预期/数据前提,以校正后为准
|
|
93
|
+
- **结果**:`docs/features/<feature-id>/ui功能测试/<文件前缀>-ui功能测试-spec.md` 落盘
|
|
94
|
+
|
|
95
|
+
## 工作流结束
|
|
96
|
+
|
|
97
|
+
U3 完成后 skill 结束。**不碰浏览器、不执行用例、不出报告**。
|
|
98
|
+
|
|
99
|
+
## 异常速查
|
|
100
|
+
|
|
101
|
+
| 场景 | 行为 |
|
|
102
|
+
|---|---|
|
|
103
|
+
| 需求 spec 缺失 | 报错退出,提示先跑 `/write-spec` |
|
|
104
|
+
| spec 无可派生功能点/验收标准 | 报错退出,不产空产物 |
|
|
105
|
+
| 登录账号拿不到 | 留【待用户填写】,继续派生其余内容 |
|
|
106
|
+
| 入口 URL 拿不到 | §1 概览留【需用户填写】,继续派生 |
|
|
107
|
+
| 同需求重复触发 | 覆盖该需求已有用例规格(从当前需求 spec 重新派生) |
|
|
108
|
+
|
|
109
|
+
## 质量检查
|
|
110
|
+
|
|
111
|
+
跑完后自检:
|
|
112
|
+
- 用例规格落盘 `ui功能测试/` 目录,四节齐全(概览/用例/数据前提清单/登录说明)
|
|
113
|
+
- 一功能点一用例,五要素齐全,无编造的功能点
|
|
114
|
+
- 预期表现只写 UI 表现,无 DB 断言
|
|
115
|
+
- 功能点清单与用例清单都有用户确认环节
|
|
116
|
+
- 没碰浏览器,没执行用例,没出报告
|
|
117
|
+
|
|
118
|
+
## 收尾
|
|
119
|
+
|
|
120
|
+
提示用户:
|
|
121
|
+
1. 用例规格位置(`<文件前缀>-ui功能测试-spec.md`)
|
|
122
|
+
2. 待用户填写项(登录账号 / 入口 URL,若有)
|
|
123
|
+
3. 下一步:**跑 `/run-ui-test` 驱动浏览器执行 + 截图 + 出报告**
|
|
124
|
+
|
|
125
|
+
不主动调用 `/run-ui-test` 或其他下游 skill。不写 knowledge 文件。不修改 spec / plan / 代码。
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# U2/U3 UI 功能测试用例规格格式规范
|
|
2
|
+
|
|
3
|
+
## 四节结构(必须完整)
|
|
4
|
+
|
|
5
|
+
用例规格文档 `<文件前缀>-ui功能测试-spec.md` 必须含以下四节,顺序固定。
|
|
6
|
+
|
|
7
|
+
### §1. 概览
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
## 1. 概览
|
|
11
|
+
|
|
12
|
+
| 项 | 值 |
|
|
13
|
+
|---|---|
|
|
14
|
+
| 来源需求 | <文件前缀>-spec.md |
|
|
15
|
+
| 功能点数 | 3 |
|
|
16
|
+
| 入口 URL | http://127.0.0.1:5173/admin |
|
|
17
|
+
| 需要登录 | 是 |
|
|
18
|
+
|
|
19
|
+
截图约定:截图存本目录,按功能点命名(`<功能点名>.png`,同功能点多张追加 `-2`/`-3`)。
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- 入口 URL 拿不到 → 填【需用户填写】,`/run-ui-test` 执行前会向用户要
|
|
23
|
+
- 入口 URL 是执行默认值,用户触发 `/run-ui-test` 时可覆盖
|
|
24
|
+
|
|
25
|
+
### §2. 用例
|
|
26
|
+
|
|
27
|
+
**一功能点一小节**,五要素齐全。最好案例:
|
|
28
|
+
|
|
29
|
+
```markdown
|
|
30
|
+
## 2. 用例
|
|
31
|
+
|
|
32
|
+
### 用例 1:新建客户
|
|
33
|
+
|
|
34
|
+
- **功能点名**:新建客户
|
|
35
|
+
- **操作步骤**:
|
|
36
|
+
1. 左侧菜单点「客户管理」进入列表页
|
|
37
|
+
2. 点右上角「新建」按钮,弹出新建表单
|
|
38
|
+
3. 填写:客户名称「测试客户-0825」、联系电话「13800138000」、所属行业选「制造业」
|
|
39
|
+
4. 点「保存」
|
|
40
|
+
- **预期表现**:
|
|
41
|
+
- 表单校验通过,无红色错误提示
|
|
42
|
+
- 提示「保存成功」
|
|
43
|
+
- 返回列表页,第一行出现「测试客户-0825」
|
|
44
|
+
- **数据前提**:无(本用例自行创建)
|
|
45
|
+
- **登录账号**:见 §4
|
|
46
|
+
|
|
47
|
+
### 用例 2:编辑客户
|
|
48
|
+
|
|
49
|
+
- **功能点名**:编辑客户
|
|
50
|
+
- **操作步骤**:
|
|
51
|
+
1. 客户列表页找到「华东贸易」
|
|
52
|
+
2. 点该行「编辑」,表单回填现有值
|
|
53
|
+
3. 把联系电话改为「13900139000」,点「保存」
|
|
54
|
+
- **预期表现**:提示「保存成功」;列表中「华东贸易」的联系电话显示为「13900139000」
|
|
55
|
+
- **数据前提**:存在客户「华东贸易」(见 §3)
|
|
56
|
+
- **登录账号**:见 §4
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
要求:
|
|
60
|
+
|
|
61
|
+
- 操作步骤写**页面动线**(点什么、填什么),不写接口/代码细节
|
|
62
|
+
- 预期表现只写 **UI 上可观察的**(渲染/跳转/提示/回显),**不写 DB 断言**——本流程不验库,数据层归接口测试
|
|
63
|
+
- 功能点名同时是截图文件名,不得含 `/`、`:`、`*`、`?`、`"`、`<`、`>`、`|`
|
|
64
|
+
|
|
65
|
+
### §3. 数据前提清单
|
|
66
|
+
|
|
67
|
+
汇总各用例的数据前提,供 `/run-ui-test` 执行前人工核对备齐:
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
## 3. 数据前提清单
|
|
71
|
+
|
|
72
|
+
| 用例 | 数据前提 | 状态 |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| 用例 1:新建客户 | 无 | - |
|
|
75
|
+
| 用例 2:编辑客户 | 存在客户「华东贸易」 | 待人工备 |
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- 数据前提一律**人工准备**(本流程不自动造数据);「状态」列初始全填「待人工备」
|
|
79
|
+
- 用例自行创建的(如用例 1)填「无」
|
|
80
|
+
|
|
81
|
+
### §4. 登录说明
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
## 4. 登录说明
|
|
85
|
+
|
|
86
|
+
- 登录页:`/login`(入口 URL 跳转后第一个页面)
|
|
87
|
+
- 测试账号:`admin` / 【待用户填写】
|
|
88
|
+
- 登录动线:输入账号密码 → 点「登录」→ 跳转首页
|
|
89
|
+
|
|
90
|
+
若登录遇到验证码/SSO,`/run-ui-test` 会暂停请人工介入。
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- 账号拿不到 → 密码留【待用户填写】
|
|
94
|
+
- 无需登录的应用写「无需登录」并省略登录动线
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/core/dbquery/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/core/dbquery/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0HzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4GzD"}
|
package/dist/core/dbquery/cli.js
CHANGED
|
@@ -22,6 +22,7 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
22
22
|
const index_1 = require("./index");
|
|
23
23
|
const init_1 = require("./init");
|
|
24
24
|
const identifiers_1 = require("./identifiers");
|
|
25
|
+
const directory_1 = require("../directory");
|
|
25
26
|
function parseFormat(s) {
|
|
26
27
|
if (!s || s === 'json')
|
|
27
28
|
return 'json';
|
|
@@ -157,7 +158,7 @@ function registerDbCommands(program) {
|
|
|
157
158
|
process.exitCode = 5;
|
|
158
159
|
return;
|
|
159
160
|
}
|
|
160
|
-
const projectRoot = process.cwd();
|
|
161
|
+
const projectRoot = (0, directory_1.resolveProjectRoot)(process.cwd());
|
|
161
162
|
try {
|
|
162
163
|
const format = parseFormat(options.format);
|
|
163
164
|
if (mode === 'ddl' && options.table) {
|
|
@@ -180,7 +181,7 @@ function registerDbCommands(program) {
|
|
|
180
181
|
.description('List configured DB profiles (never returns passwords)')
|
|
181
182
|
.option('--format <format>', 'Output format (always json)', 'json')
|
|
182
183
|
.action(async (options) => {
|
|
183
|
-
const projectRoot = process.cwd();
|
|
184
|
+
const projectRoot = (0, directory_1.resolveProjectRoot)(process.cwd());
|
|
184
185
|
try {
|
|
185
186
|
const format = parseFormat(options.format);
|
|
186
187
|
const result = await (0, index_1.listProfiles)({}, projectRoot);
|
|
@@ -195,7 +196,7 @@ function registerDbCommands(program) {
|
|
|
195
196
|
.description('Create .cgraphx/db-profiles.json template with example MySQL + PostgreSQL profiles')
|
|
196
197
|
.option('--force', 'Overwrite the file if it already exists')
|
|
197
198
|
.action((options) => {
|
|
198
|
-
const projectRoot = process.cwd();
|
|
199
|
+
const projectRoot = (0, directory_1.resolveProjectRoot)(process.cwd());
|
|
199
200
|
try {
|
|
200
201
|
const report = (0, init_1.initDbProfiles)(projectRoot, { force: options.force === true });
|
|
201
202
|
if (report.action === 'already-exists') {
|
|
@@ -212,7 +213,7 @@ function registerDbCommands(program) {
|
|
|
212
213
|
});
|
|
213
214
|
}
|
|
214
215
|
async function runQueryAndExit(input, formatStr) {
|
|
215
|
-
const projectRoot = process.cwd();
|
|
216
|
+
const projectRoot = (0, directory_1.resolveProjectRoot)(process.cwd());
|
|
216
217
|
try {
|
|
217
218
|
const format = parseFormat(formatStr);
|
|
218
219
|
const result = await (0, index_1.runQuery)(input, projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/core/dbquery/cli.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/core/dbquery/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/dbquery/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,cAAc,EAIpB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/dbquery/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,cAAc,EAIpB,MAAM,SAAS,CAAC;AAoIjB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAgGjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAgBpF"}
|
|
@@ -63,7 +63,7 @@ const path = __importStar(require("node:path"));
|
|
|
63
63
|
const os = __importStar(require("node:os"));
|
|
64
64
|
const constants_1 = require("./constants");
|
|
65
65
|
const errors_1 = require("./errors");
|
|
66
|
-
const VALID_DRIVERS = new Set(['mysql', 'postgres']);
|
|
66
|
+
const VALID_DRIVERS = new Set(['mysql', 'postgres', 'http']);
|
|
67
67
|
function readConfigFile(filePath) {
|
|
68
68
|
let raw;
|
|
69
69
|
try {
|
|
@@ -104,10 +104,46 @@ function normalizeProfileEntry(name, raw, sourcePath) {
|
|
|
104
104
|
if (!raw || typeof raw !== 'object') {
|
|
105
105
|
return { profile: null, error: `profile "${name}" is not an object (${sourcePath})` };
|
|
106
106
|
}
|
|
107
|
-
const { type, host, port, user, password, database, schema, description } = raw;
|
|
107
|
+
const { type, host, port, user, password, database, schema, description, url, headers } = raw;
|
|
108
108
|
if (!type || !VALID_DRIVERS.has(type)) {
|
|
109
|
-
return { profile: null, error: `profile "${name}": type must be 'mysql' or '
|
|
109
|
+
return { profile: null, error: `profile "${name}": type must be 'mysql', 'postgres', or 'http' (got: ${String(type)})` };
|
|
110
110
|
}
|
|
111
|
+
// HTTP driver — requires url; host/user/password/database unused.
|
|
112
|
+
if (type === 'http') {
|
|
113
|
+
if (typeof url !== 'string' || !url) {
|
|
114
|
+
return { profile: null, error: `profile "${name}": missing required field "url" for type=http` };
|
|
115
|
+
}
|
|
116
|
+
let normalizedHeaders;
|
|
117
|
+
if (headers !== undefined) {
|
|
118
|
+
if (typeof headers !== 'object' || headers === null || Array.isArray(headers)) {
|
|
119
|
+
return { profile: null, error: `profile "${name}": "headers" must be an object for type=http` };
|
|
120
|
+
}
|
|
121
|
+
normalizedHeaders = {};
|
|
122
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
123
|
+
if (typeof v !== 'string') {
|
|
124
|
+
return { profile: null, error: `profile "${name}": header "${k}" must be a string` };
|
|
125
|
+
}
|
|
126
|
+
normalizedHeaders[k] = v;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
profile: {
|
|
131
|
+
name,
|
|
132
|
+
description: typeof description === 'string' ? description : undefined,
|
|
133
|
+
type,
|
|
134
|
+
host: '',
|
|
135
|
+
port: 0,
|
|
136
|
+
user: '',
|
|
137
|
+
password: '',
|
|
138
|
+
database: '',
|
|
139
|
+
url,
|
|
140
|
+
headers: normalizedHeaders,
|
|
141
|
+
schema,
|
|
142
|
+
},
|
|
143
|
+
error: null,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// mysql / postgres — require host/user/password/database.
|
|
111
147
|
if (typeof host !== 'string' || !host) {
|
|
112
148
|
return { profile: null, error: `profile "${name}": missing required field "host"` };
|
|
113
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/dbquery/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/dbquery/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP driver adapter (generic read-only query transport).
|
|
3
|
+
*
|
|
4
|
+
* Delegates SQL execution to a remote HTTP endpoint (e.g. /workflow/dbquery)
|
|
5
|
+
* instead of connecting to a database directly. Used when the target DB is
|
|
6
|
+
* only reachable through an app-tier API (e.g. production behind a service).
|
|
7
|
+
*
|
|
8
|
+
* Contract (the remote endpoint MUST implement):
|
|
9
|
+
* POST <url>
|
|
10
|
+
* headers: profile.headers + Content-Type: application/json
|
|
11
|
+
* body (query): { mode:"query", sql, args?, limit?, schema? }
|
|
12
|
+
* body (schema): { mode:"tables"|"ddl"|"indexes"|"table-comment", table?, schema? }
|
|
13
|
+
* resp 200: { code:200, data: <result> } (R-style wrapper)
|
|
14
|
+
* OR <result> (bare)
|
|
15
|
+
* resp non-2xx / code!=200 → DriverError / ConnectionFailedError
|
|
16
|
+
*
|
|
17
|
+
* query result shape: { columns:[{name}], rows:[{...}] }
|
|
18
|
+
* schema result shape: depends on mode (tables/ddl/indexes/table-comment) —
|
|
19
|
+
* the endpoint assembles these; this driver just forwards the payload.
|
|
20
|
+
*/
|
|
21
|
+
import type { DBProfile, DriverConnection } from '../types';
|
|
22
|
+
export declare function createHttpConnection(profile: DBProfile): Promise<DriverConnection>;
|
|
23
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/core/dbquery/drivers/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAyC,MAAM,UAAU,CAAC;AA6CnG,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsFxF"}
|