feat(mindspace): enforce PostgreSQL user data delivery

This commit is contained in:
john
2026-07-13 15:29:29 +08:00
parent b33c943b69
commit a6620fb719
57 changed files with 2779 additions and 164 deletions
+13 -10
View File
@@ -1,11 +1,11 @@
---
name: page-data-collect
description: 在 MindSpace 页面中收集、存储并管理结构化数据(问卷、报名、台账、后台查看),基于 Page Data API 与用户私有 SQLite
description: 在 MindSpace 页面中收集、存储并管理结构化数据(问卷、报名、台账、后台查看),基于 Page Data API 与用户隔离的 PostgreSQL 空间
---
# 页面数据收集(Page Data Collect
在 MindSpace **公开 HTML 页面**中嵌入表单、问卷、报名等交互,并将提交持久化到当前用户的 `.mindspace/private-data.sqlite`,通过平台 **Page Data API** 受控读写。
在 MindSpace **公开 HTML 页面**中嵌入表单、问卷、报名等交互,并将提交持久化到当前用户隔离的 PostgreSQL schema,通过平台 **Page Data API** 受控读写。运行时禁止创建、读取或回退到用户 SQLite。
详细 API 说明见工作区外文档 `docs/page-data-api-usage.md`Memind 仓库)。
@@ -25,7 +25,7 @@ description: 在 MindSpace 页面中收集、存储并管理结构化数据(
```text
Agent 可以建模 SQL 并注册 dataset
HTML 页面只能调用 Page Data APIpage-data-client.js);
禁止自建 Express / 独立端口 / 直接暴露 SQLite 文件路径
禁止自建 Express / 独立端口 / 直接暴露数据库连接;禁止 SQLite / localStorage 数据回退
```
## 方案选择:默认快车道 + 能力分支(必做)
@@ -36,7 +36,7 @@ HTML 页面只能调用 Page Data APIpage-data-client.js);
用户描述需求
→ 匹配能力分支(下表 A/B/C/D,默认 A)
→ 仅冲突或无法匹配时,用 1 题让用户选分支或改口令
→ 输出「方案摘要」供确认(用户可只改口令/选项)
→ 输出简短「方案摘要」;用户已明确要求直接创建/完成/发布时视为已确认并立即执行
→ 再 load_skill / 建表 / write_file / bind
```
@@ -50,7 +50,7 @@ HTML 页面只能调用 Page Data APIpage-data-client.js);
| 提交后修改 | 不支持(一次性) |
| 页面 | `public/*-survey.html` + `public/*-admin.html`(两文件各 bind 一次) |
用户只说「问卷/报名/收集数据 + 后台查看」且未提登录、协作改单、同页后台时 → **用方案 A,先展示摘要再开工**
用户只说「问卷/报名/收集数据 + 后台查看」且未提登录、协作改单、同页后台时 → **用方案 A**。若用户已说「直接做」「完整创建并发布」「不用询问」「持续推进」等终态指令,摘要后必须在同一轮立即调用工具开工,禁止停下来等待再次确认
口令规则:
@@ -83,6 +83,9 @@ HTML 页面只能调用 Page Data APIpage-data-client.js);
```text
- public:可匿名 insert;服务端禁止 update / softDelete
- password:所有 API 须先 authenticate;口令 ≥8 位且须写入发布记录
- `public` 策略中的 `insert: true` 等价于任何访客都能直接调用 API 写入;前端口令、隐藏按钮和 JavaScript 判断都不是权限控制
- password 页面必须调用 `client.authenticate(password)` 获取服务端 token;禁止在 HTML 中硬编码口令或只做 `password === "..."` 比较
- 同一公开页若要求「所有人可评价、只有所有者可写正文」:正文 dataset 在公开页必须 `insert: false`,评价 dataset 才能 `insert: true`;所有者写正文必须使用独立 `password` 作者页或 `login_required` 页面
- 同页不能同时「匿名 insert」+「口令 read 全量」→ 须拆前台 + 后台(方案 A/E)
- password 无法区分访客身份;「只改自己的」须 login_required + own_rows(方案 B
- 匿名提交后「凭链接改自己的」无内置能力,须改 B 或接受一次性提交
@@ -101,7 +104,7 @@ HTML 页面只能调用 Page Data APIpage-data-client.js);
- 页面:public/xxx.html + public/xxx-admin.html
- 内容:(由你的描述生成题目/字段/报表)
确认后开始建表与写页面。若需登录提交或团队共改,请说明,我换成 B/C 分支
若用户尚未授权创建,确认后开始建表与写页面;若用户已明确要求创建/完成/发布,此摘要仅用于告知,后面必须紧接工具调用,不得结束回复等待确认
```
### 分支切换示例
@@ -121,8 +124,8 @@ HTML 页面只能调用 Page Data APIpage-data-client.js);
```text
load_skill → page-data-collect
→ 匹配分支(默认 A)→ 方案摘要 → 用户确认或仅改口令/选项
→ 禁止未确认就 bind;禁止空转计划不调用工具
→ 匹配分支(默认 A)→ 方案摘要 → 用户确认,或从明确的创建/完成/发布指令判定已确认
→ 禁止未获创建授权就 bind已获授权时禁止空转计划、重复确认或不调用工具
```
### 2. 数据层:建表 + 注册 dataset
@@ -262,7 +265,7 @@ CREATE TABLE IF NOT EXISTS survey_responses (
## 严格禁止
1. **禁止**在方案摘要未确认时建表 / bind / 发布(默认 A 也须展示摘要;用户明确「按默认做」视为确认)
1. **禁止**在尚未获得创建授权时建表 / bind / 发布;用户明确要求「创建、完成、发布、直接做、不用询问、持续推进」均视为确认,禁止再次停下来询问
2. **禁止**让 LLM 自行发明 accessMode/拆页/口令;必须落在分支 A~E 与默认口令规则内
3. **禁止**连续两轮仅输出计划、不调用 `load_skill` / `list_dir` / `write_file` / `private_data_execute` / `bind`
4. **禁止**接受 <8 位发布口令;用户未指定口令时后台默认 **`88888888`**
@@ -274,7 +277,7 @@ CREATE TABLE IF NOT EXISTS survey_responses (
10. **禁止**只 `CREATE TABLE` 而不 `private_data_register_dataset`
11. **禁止**未配置 `private_data_set_page_policy` 就让页面调用公开 API
12. **禁止**先发布占位页(如 `<p>问卷页面</p>`)再让用户访问 `/u/.../pages/...`
13. **禁止**在 Page Data 页面中使用 `localStorage` / `sessionStorage` 存提交记录或做 API fallback
13. **禁止**在 Agent 生成的 HTML/JavaScript 中使用 `localStorage` / `sessionStorage` / `IndexedDB` 保存任何数据或做 API fallback;所有需持久化的数据必须进入当前用户专属 PostgreSQL schema,禁止 SQLite、静态 JSON/JS 文件和内存 fallback
## 交付前自检
+1
View File
@@ -27,6 +27,7 @@ description: 在专属 MindSpace 目录生成可公开访问的静态 HTML 报
10. **禁止**在 HTML 中用 CDN `https://...` 引用 `<script src>`MindSpace 发布页 CSP 仅允许同源脚本。常用库优先用平台路径(如 Chart.js → `/assets/chart.umd.min.js`),或下载到 `public/assets/` 后相对引用
11. **纯静态页(无 Page Data 问卷/后台)禁止调用 `private_data_bind_workspace_page`**`write_file` / `edit_file` 落盘 `public/*.html` 后,直接按下方「回复格式」交付 **MindSpace 路径**`/MindSpace/<用户ID>/public/...`),无需 bind、无需口令
12. **微信分享必须使用 MindSpace 路径**:该路由会在服务端注入 `og:site_name=TKMind 智趣`、封面缩略图(`*.thumbnail.png`)与微信 JS-SDK 分享桥;禁止交付 `/u/用户名/pages/...` 作为用户可见链接
13. **只要页面接收用户输入并要求以后查看、汇总、统计、修改或删除,就不是纯静态页**。禁止使用 `localStorage` / `sessionStorage` / `IndexedDB` 保存任何数据;必须立即 `load_skill``page-data-collect`,通过 Page Data API 写入当前用户专属 PostgreSQL schema。禁止 SQLite、静态 JSON/JS 文件或内存 fallback 冒充持久化。记账、日记、打卡、清单、台账、问卷、报名及其管理页都适用。
详细约束以工作区内的 `.goosehints``.agents/skills/static-page-publish/SKILL.md` 为准。