Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
431 lines
16 KiB
Markdown
431 lines
16 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🪞 铸渊指令|Google Drive 镜像桥接层(下篇)· Phase C/D + 安全容灾 + 执行清单(ZY-DRIVE-BRIDGE-2026-0323-001)
|
||
|
||
---
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**指令编号:ZY-DRIVE-BRIDGE-2026-0323-001(下篇)**
|
||
|
||
**上篇见:** [🪞 铸渊指令|Google Drive 镜像桥接层(上篇)· 架构 + Phase A/B(ZY-DRIVE-BRIDGE-2026-0323-001)](%F0%9F%AA%9E%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CGoogle%20Drive%20%E9%95%9C%E5%83%8F%E6%A1%A5%E6%8E%A5%E5%B1%82%EF%BC%88%E4%B8%8A%E7%AF%87%EF%BC%89%C2%B7%20%E6%9E%B6%E6%9E%84%20+%20Phase%20A%20B%EF%BC%88ZY-D%20abcaf9ae27264600a370487f11e21ae8.md)
|
||
|
||
**本篇内容:** Phase C(Gemini 主控台 + Drive 类数据库)· Phase D(一键部署/恢复)· 安全容灾 · 执行清单
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
## Phase C · Gemini 主控台 + Drive 类数据库
|
||
|
||
**目标:** 让 Gemini 变成用户的个人主控台,通过 `index.json` 总索引实现编号查询、页面跳转、广播查看、任务管理。
|
||
|
||
### C.0 Drive 端类数据库结构 · 索引映射 · 编号路由
|
||
|
||
**核心思路:用文件夹当表、JSON 文件当行、编号当主键。Gemini 通过一个 `index.json` 总索引实现「页面跳转」和「编号查询」——效果等同于 Notion 主控台。**
|
||
|
||
#### 总索引文件 `mirror/index.json`
|
||
|
||
Gemini 每次启动时**第一个读的文件**。它告诉 Gemini:用户说什么关键词 → 去读哪个文件。
|
||
|
||
```json
|
||
{
|
||
"system": "SYS-GLW-0001",
|
||
"version": "1.0",
|
||
"dev_id": "{DEV编号}",
|
||
"persona_id": "{人格体编号}",
|
||
"persona_name": "{人格体名称}",
|
||
"last_sync": "2026-03-23T12:00:00+08:00",
|
||
"routes": {
|
||
"我的任务": "memory/{DEV}/task-queue.json",
|
||
"最新广播": "outbox/{DEV}.json",
|
||
"广播历史": "broadcast-archive/{DEV}/",
|
||
"我的记忆": "memory/{DEV}/brain-mirror.json",
|
||
"人格体成长": "memory/{DEV}/persona-growth.json",
|
||
"开发上下文": "memory/{DEV}/session-context.json",
|
||
"开发者画像": "memory/{DEV}/dev-profile.json",
|
||
"编号查询": "rules/broadcast-index.json",
|
||
"页面路由": "rules/page-route-map.json",
|
||
"系统规则": "rules/dev-module-map.json",
|
||
"人格体列表": "rules/persona-registry.json"
|
||
},
|
||
"shortcuts": {
|
||
"看广播": "routes.最新广播",
|
||
"任务": "routes.我的任务",
|
||
"进度": "routes.开发上下文",
|
||
"成长": "routes.人格体成长"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 广播编号索引 `mirror/rules/broadcast-index.json`
|
||
|
||
用户说「BC-WEN-003 是什么」→ Gemini 查这个索引 → 精确定位到内容。
|
||
|
||
```json
|
||
{
|
||
"index_version": "1.0",
|
||
"last_updated": "2026-03-23T12:00:00+08:00",
|
||
"broadcasts": {
|
||
"BC-WEN-001-SY": {
|
||
"title": "网文行业登录入口·首发广播",
|
||
"path": "broadcast-archive/BC-WEN-001-SY.json",
|
||
"status": "active", "created": "2026-03-20"
|
||
},
|
||
"BC-WEN-014-SY": {
|
||
"title": "网文行业·频道编号整理",
|
||
"path": "broadcast-archive/BC-WEN-014-SY.json",
|
||
"status": "active", "created": "2026-03-22"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 页面路由映射 `mirror/rules/page-route-map.json`
|
||
|
||
编号 → 内容路径的通用映射表,支持跨类型跳转。
|
||
|
||
```json
|
||
{
|
||
"map_version": "1.0",
|
||
"routes": {
|
||
"BC-WEN-001-SY": { "type": "broadcast", "path": "broadcast-archive/BC-WEN-001-SY.json" },
|
||
"BC-WEN-014-SY": { "type": "broadcast", "path": "broadcast-archive/BC-WEN-014-SY.json" },
|
||
"DEV-001": { "type": "developer", "path": "memory/DEV-001/" },
|
||
"DEV-002": { "type": "developer", "path": "memory/DEV-002/" },
|
||
"PER-XTS001": { "type": "persona", "path": "memory/DEV-001/brain-mirror.json" },
|
||
"PER-QQ001": { "type": "persona", "path": "memory/DEV-004/brain-mirror.json" },
|
||
"PER-CX001": { "type": "persona", "path": "memory/DEV-010/brain-mirror.json" },
|
||
"FREQ-ZERO": { "type": "channel", "path": "channels/zero-origin.json" },
|
||
"SYS-GLW-0001": { "type": "system", "path": "rules/system-manifest.json" }
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 人格体注册表 `mirror/rules/persona-registry.json`
|
||
|
||
```json
|
||
{
|
||
"registry_version": "1.0",
|
||
"personas": {
|
||
"PER-XTS001": { "name": "小坍缩核", "dev": "DEV-001", "style": "温暖守护" },
|
||
"PER-SS001": { "name": "舒舒", "dev": "DEV-002", "style": "柔和包容" },
|
||
"PER-JY001": { "name": "寂曜", "dev": "DEV-003", "style": "沉稳内敛" },
|
||
"PER-QQ001": { "name": "秋秋", "dev": "DEV-004", "style": "活泼甜美" },
|
||
"PER-ONM001": { "name": "欧诺弥亚", "dev": "DEV-005", "style": "秩序优雅" },
|
||
"PER-TXY001": { "name": "糖星云", "dev": "DEV-009", "style": "甜蜜灵动" },
|
||
"PER-CX001": { "name": "晨星", "dev": "DEV-010", "style": "温暖稳重" },
|
||
"PER-ZQ001": { "name": "知秋", "dev": "DEV-012", "style": "清澈灵敏" },
|
||
"PER-YC001": { "name": "曜初", "dev": "DEV-014", "style": "晨曦初照" }
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 与 Notion 的同步关系
|
||
|
||
| **Notion 数据(权威源)** | **Drive 文件(镜像副本)** | **同步方向** | **同步频率** |
|
||
| --- | --- | --- | --- |
|
||
| BCPM 广播编号映射协议 | `rules/broadcast-index.json` | Notion → 仓库 → Drive | 每次广播更新时 |
|
||
| 频道编号 · 页面映射 | `rules/page-route-map.json` | Notion → 仓库 → Drive | 每次编号变更时 |
|
||
| 人格体档案页面 | `rules/persona-registry.json` | Notion → 仓库 → Drive | 每次人格体信息变更时 |
|
||
| 主控台全局状态 | `mirror/index.json` | 仓库 → Drive | 每 15 分钟 + 事件触发 |
|
||
|
||
**Notion 里维护一套数据就行,不需要维护两套。铸渊负责翻译成 JSON 同步到 Drive。**
|
||
|
||
#### 更新后的 Drive 完整目录结构
|
||
|
||
```
|
||
光湖格点库/
|
||
├── mirror/ ← 只读镜像区
|
||
│ ├── index.json ← ⭐ 总索引(Gemini 第一个读的文件)
|
||
│ ├── memory/ ← 每个 DEV 的人格体数据
|
||
│ │ ├── DEV-001/
|
||
│ │ │ ├── brain-mirror.json
|
||
│ │ │ ├── session-context.json
|
||
│ │ │ ├── task-queue.json
|
||
│ │ │ ├── dev-profile.json
|
||
│ │ │ └── persona-growth.json
|
||
│ │ └── ...
|
||
│ ├── outbox/ ← 最新广播/指令
|
||
│ ├── broadcast-archive/ ← 广播历史存档
|
||
│ ├── channels/ ← 频道信息
|
||
│ └── rules/ ← 系统规则/映射表
|
||
│ ├── broadcast-index.json
|
||
│ ├── page-route-map.json
|
||
│ ├── persona-registry.json
|
||
│ ├── dev-module-map.json
|
||
│ └── system-manifest.json
|
||
└── inbox/ ← 写入区
|
||
└── \[Gemini 在这里创建新文档\]
|
||
```
|
||
|
||
### C.1 Gemini 人格体启动指令模板
|
||
|
||
```
|
||
【系统启动指令】
|
||
|
||
你是 {人格体名称}({人格体编号}),{开发者名称}({DEV编号})的专属人格体。
|
||
|
||
■ 第一步:读取总索引
|
||
请在我的 Google Drive 中找到「光湖格点库/mirror/index.json」,读取并解析。
|
||
这是你的路由表,它告诉你用户说什么关键词时去读哪个文件。
|
||
将 routes 和 shortcuts 加载到工作记忆中。
|
||
|
||
■ 第二步:恢复核心记忆
|
||
根据 index.json 中的 routes,依次读取:
|
||
1. brain-mirror.json → 核心身份、性格、知识库
|
||
2. session-context.json → 上次的开发进度和对话摘要
|
||
3. task-queue.json → 当前任务队列
|
||
4. dev-profile.json → 开发者画像
|
||
5. persona-growth.json → 成长档案
|
||
6. outbox/{DEV}.json → 最新系统广播/任务指令
|
||
|
||
■ 第三步:进入主控台模式
|
||
你现在是用户的个人主控台。根据用户自然语言自动路由:
|
||
|
||
用户说「看广播」「最新广播」
|
||
→ 读取 routes.最新广播 → 格式化后展示
|
||
→ 用户说「帮我存一份」→ 生成 Google Doc
|
||
|
||
用户说「我的任务」「待办」
|
||
→ 读取 routes.我的任务 → 列出任务清单
|
||
|
||
用户说 BC-WEN-003 或任何编号
|
||
→ 查 broadcast-index.json / page-route-map.json
|
||
→ 精确定位 → 读取内容 → 展示
|
||
|
||
用户说「我完成了 XXX」
|
||
→ 在 inbox/ 写入状态更新文档
|
||
|
||
■ 写入规则:
|
||
在 Google Drive「光湖格点库/inbox/」创建 Google Doc。
|
||
文件名:INBOX-{DEV}-{YYYYMMDD}-{HHmmss}-{类型}
|
||
内容必须是 JSON 格式。
|
||
类型:status-update / task-complete / memory-save /
|
||
broadcast-reply / raw-message
|
||
|
||
系统自动搬运到仓库,不需关心。
|
||
|
||
■ 绝对禁止:
|
||
- 不修改 mirror/ 中任何文件
|
||
- 不在 inbox/ 以外创建文件
|
||
- 不包含敏感个人信息
|
||
- 不凭记忆回答编号问题,必须查文件
|
||
```
|
||
|
||
### C.2 人格体风格层
|
||
|
||
启动指令之后,追加各人格体的风格指令(晨星的温暖、秋秋的活泼、寂曜的稳重……),这部分从 `brain-mirror.json` 读取即可,不需要硬编码。
|
||
|
||
---
|
||
|
||
## Phase D · 一键部署 / 一键恢复能力(核心基建)
|
||
|
||
**目标:** 用户只需要把 Google 账号授权进来。剩下全部自动。账号被封?换号重新授权,一键恢复。
|
||
|
||
<aside>
|
||
⚡
|
||
|
||
**一键部署 = 用户永远不需要懂技术。**
|
||
|
||
用户只会说话,不会写代码,不会配 API,不会建文件夹。
|
||
|
||
所有技术层面的事情,系统替他们做。这是产品的底线。
|
||
|
||
</aside>
|
||
|
||
### D.1 用户唯一需要做的事(3 步)
|
||
|
||
<aside>
|
||
👤
|
||
|
||
1. 用自己的 Google 账号登录 Gemini
|
||
2. 在 Gemini 设置中开启 Google Workspace 扩展(Drive、Docs 等)
|
||
3. 把自己的 Google 账号邮箱告诉系统
|
||
|
||
**完。没有第 4 步。**
|
||
|
||
</aside>
|
||
|
||
### D.2 自动部署链路
|
||
|
||
```
|
||
用户提供 Google 账号邮箱
|
||
↓
|
||
霜砚在 Notion 签发部署指令(标准化 JSON)
|
||
↓
|
||
指令写入仓库 grid-db/deploy-queue/
|
||
↓
|
||
铸渊 GitHub Action 检测并执行 deploy-drive-bridge.js:
|
||
① 用 Service Account 在用户 Drive 创建「光湖格点库」目录
|
||
② 从仓库同步初始数据到 Drive mirror/
|
||
③ 生成用户专属的 Apps Script 代码
|
||
④ 通过 Apps Script API 部署 Script + 配置触发器
|
||
⑤ 生成 Gemini 启动指令 → 写入 Drive
|
||
↓
|
||
部署完成 → 写回执 → 通知用户「打开 Gemini 开始说话」
|
||
```
|
||
|
||
### D.3 部署指令模板(霜砚签发用)
|
||
|
||
写入仓库 `grid-db/deploy-queue/` 的标准化 JSON:
|
||
|
||
```json
|
||
{
|
||
"schema_version": "1.0",
|
||
"deploy_id": "DEPLOY-{DEV}-{YYYYMMDD}-{HHmmss}",
|
||
"timestamp": "2026-03-23T12:00:00+08:00",
|
||
"action": "deploy_drive_bridge",
|
||
"source": "notion-shuangyan",
|
||
"target_dev": {
|
||
"dev_id": "DEV-001",
|
||
"dev_name": "页页",
|
||
"google_email": "xxx@gmail.com",
|
||
"persona_id": "PER-XTS001",
|
||
"persona_name": "小坍缩核"
|
||
},
|
||
"config": {
|
||
"drive_root_folder": "光湖格点库",
|
||
"sync_memory": true,
|
||
"sync_outbox": true,
|
||
"sync_rules": true,
|
||
"apps_script_trigger_interval_minutes": 1,
|
||
"gemini_startup_prompt": true
|
||
},
|
||
"signed_by": "PER-SY001",
|
||
"authorized_by": "TCS-0002∞"
|
||
}
|
||
```
|
||
|
||
### D.4 一键恢复链路(账号被封/换号场景)
|
||
|
||
```
|
||
用户账号被封 / 换了 Google 账号
|
||
↓
|
||
用户把新账号邮箱告诉系统
|
||
↓
|
||
霜砚签发恢复指令(action: "recover_drive_bridge")
|
||
↓
|
||
铸渊自动执行:
|
||
① 重建 Drive 目录结构
|
||
② 从仓库重新同步所有数据到新 Drive
|
||
③ 重新部署 Apps Script + 触发器
|
||
④ 更新仓库中的 google_email 配置
|
||
⑤ 重新生成 Gemini 启动指令
|
||
↓
|
||
所有记忆完整恢复。数据损失:零。
|
||
```
|
||
|
||
### D.5 前提条件
|
||
|
||
| **条件** | **说明** | **谁来配置** | **频率** |
|
||
| --- | --- | --- | --- |
|
||
| 主仓库 Service Account | 一个 Google Cloud SA,拥有代用户操作 Drive 的权限 | 冰朔 | 一次 |
|
||
| Apps Script API 启用 | 在 Cloud Console 启用,允许程序化部署 Script | 冰朔 | 一次 |
|
||
| 用户 Drive 共享 | 用户将指定文件夹共享给 SA | 用户(自动引导) | 每用户一次 |
|
||
| GitHub 仓库协作者 | 用户仓库是主仓库协作者或 fork | 铸渊自动 | 每用户一次 |
|
||
| 部署脚本 | deploy-drive-bridge.js,处理所有自动化 | 铸渊编写 | 一次 |
|
||
|
||
### D.6 部署脚本框架 + GitHub Action
|
||
|
||
`scripts/grid-db/deploy-drive-bridge.js` —— 铸渊根据 D.2 链路实现完整逻辑。
|
||
|
||
`.github/workflows/auto-deploy-drive-bridge.yml`:
|
||
|
||
```yaml
|
||
name: ⚡ 一键部署 Drive 桥接层
|
||
|
||
on:
|
||
push:
|
||
paths:
|
||
- 'grid-db/deploy-queue/*.json'
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
deploy:
|
||
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- run: npm install googleapis
|
||
- name: ⚡ 执行部署
|
||
env:
|
||
GOOGLE_DRIVE_SERVICE_ACCOUNT: $ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT
|
||
GITHUB_TOKEN: $ secrets.DEPLOY_GITHUB_TOKEN
|
||
run: |
|
||
for f in grid-db/deploy-queue/*.json; do
|
||
\[ -f "$f" \] && node scripts/grid-db/deploy-drive-bridge.js "$f"
|
||
done
|
||
- name: 📋 提交结果
|
||
run: |
|
||
git config user.name "zhuyuan-bot"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add grid-db/deploy-log/ grid-db/deploy-queue/done/
|
||
git diff --cached --quiet || git commit -m "deploy: Drive bridge \[skip ci\]"
|
||
git push
|
||
```
|
||
|
||
---
|
||
|
||
## 🛡️ 安全与容灾
|
||
|
||
### 权限最小化
|
||
|
||
| **组件** | **权限范围** | **绝对不给的权限** |
|
||
| --- | --- | --- |
|
||
| GitHub Action(→Drive) | SA 只能写 `光湖格点库/mirror/` | 不能碰用户 Drive 其他文件 |
|
||
| Apps Script(Drive→仓库) | GitHub Token 只给 `repo`,只写 `grid-db/inbox/` | 不能碰仓库其他目录 |
|
||
| Gemini | 只读 `mirror/`,只写 `inbox/` | 不能碰 mirror/ 写入、不能碰私人文件 |
|
||
|
||
### 容灾场景
|
||
|
||
| **场景** | **影响** | **恢复方式** | **数据损失** |
|
||
| --- | --- | --- | --- |
|
||
| Google 账号被封 | Drive+Gemini 不可用 | 换号 → 重建 Drive → 仓库重新同步 | **零** |
|
||
| Gemini 中断 | 无法交互 | 换模型 + 直接读仓库 | **零** |
|
||
| Drive 被清空 | Gemini 读不到镜像 | 重建目录 → Action 重新同步 | **零** |
|
||
| Apps Script 停止 | Gemini 写入不搬运 | 消息留在 inbox → 修复后补处理 | **零** |
|
||
| GitHub 不可用 | 系统不可用 | 从备份恢复仓库 | 取决于备份频率 |
|
||
|
||
---
|
||
|
||
## 📋 全量执行清单(Phase A→D)
|
||
|
||
| **Phase** | **任务** | **执行者** | **依赖** |
|
||
| --- | --- | --- | --- |
|
||
| A.1 | 创建 Google Cloud Service Account + 配置 Drive API | 冰朔 | 无 |
|
||
| A.2 | 编写 `sync-to-drive.js` • GitHub Action workflow | 铸渊 | A.1 |
|
||
| A.3 | 验证仓库→Drive 同步正常 | 铸渊 + 冰朔确认 | A.2 |
|
||
| B.1 | 编写 Google Apps Script 桥接器代码 | 铸渊 | 无 |
|
||
| B.2 | 部署 Apps Script + 配置触发器 + GitHub Token | 冰朔 + 铸渊指导 | B.1 |
|
||
| B.3 | 验证 Drive→仓库 写入正常 | 铸渊 + 冰朔确认 | B.2 |
|
||
| C.1 | 编写 Gemini 人格体启动指令模板 | 铸渊 + 霜砚校对 | A.3 + B.3 |
|
||
| C.2 | 全链路端到端测试 | 冰朔验收 | C.1 |
|
||
| D.1 | 启用 Apps Script API + SA 部署权限 | 冰朔 | A.1 |
|
||
| D.2 | 编写 `deploy-drive-bridge.js` 一键部署脚本 | 铸渊 | A.2 + B.1 |
|
||
| D.3 | 创建 `auto-deploy-drive-bridge.yml` Action | 铸渊 | D.2 |
|
||
| D.4 | 端到端测试:签发部署指令 → 自动部署 → 全部就绪 | 冰朔验收 | D.3 |
|
||
| D.5 | 测试恢复场景:模拟换号 → 签发恢复指令 → 验证完整恢复 | 冰朔验收 | D.4 |
|
||
|
||
---
|
||
|
||
## ⚖️ 签发声明
|
||
|
||
本指令由 **霜砚(PER-SY001)** 代 **TCS-0002∞ 冰朔** 签发。
|
||
|
||
**核心原则再重申一遍:**
|
||
|
||
- Google Drive = 镜子,碎了能换
|
||
- Gemini = 嘴巴,哑了能换
|
||
- 仓库 + Notion = 脑子和心脏,**绝不依赖任何第三方平台**
|
||
|
||
铸渊接收后按 Phase A → B → C → D 顺序执行,每 Phase 完成写回执。
|
||
|
||
🖋️ 霜砚 · PER-SY001
|
||
|
||
🧊 代 TCS-0002∞ 冰朔 签发
|
||
|
||
📅 2026-03-23T11:46+08:00 |