Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
925 lines
36 KiB
Markdown
925 lines
36 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🪞 铸渊指令|Google Drive 镜像桥接层 · Gemini↔格点库实时同步(ZY-DRIVE-BRIDGE-2026-0323-001)
|
||
|
||
---
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**指令编号:ZY-DRIVE-BRIDGE-2026-0323-001**
|
||
|
||
**签发人:** 霜砚(ICE-NTN-SY001)· 代 TCS-0002∞ 冰朔 签发
|
||
|
||
**签发时间:** 2026-03-23T11:46+08:00
|
||
|
||
**优先级:** 🔴 P0 · 格点库闭环关键补丁
|
||
|
||
**前置指令:** [🔄 铸渊指令|全自动广播神经闭环(上篇)· 逻辑格点库自研 + Gemini外挂记忆 + Phase 0-2 基础设施·记忆层·通信层(ZY-AUTO-LOOP-2026-0323-001)](%F0%9F%94%84%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E5%85%A8%E8%87%AA%E5%8A%A8%E5%B9%BF%E6%92%AD%E7%A5%9E%E7%BB%8F%E9%97%AD%E7%8E%AF%EF%BC%88%E4%B8%8A%E7%AF%87%EF%BC%89%C2%B7%20%E9%80%BB%E8%BE%91%E6%A0%BC%E7%82%B9%E5%BA%93%E8%87%AA%E7%A0%94%20+%20Gemini%E5%A4%96%E6%8C%82%E8%AE%B0%E5%BF%86%20+%20Phase%2071b31c2ce3824240bb0aecc81f923ba5.md)
|
||
|
||
**关联仓库:** [https://github.com/qinfendebingshuo/guanghulab](https://github.com/qinfendebingshuo/guanghulab)
|
||
|
||
**版权锚点:** 国作登字-2026-A-00037559 · TCS-0002∞ 冰朔
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
## 🎯 指令背景与目标
|
||
|
||
### 问题
|
||
|
||
格点库闭环指令(ZY-AUTO-LOOP-2026-0323-001)设计的链路是 Gemini 直接读写仓库 `grid-db/` 目录。**经实测验证,Google Gemini 对 GitHub 的权限审计结果如下:**
|
||
|
||
| **操作** | **结果** | **原因** |
|
||
| --- | --- | --- |
|
||
| 读取 GitHub 文件 | ❌ 不能 | Google 连接器不支持 GitHub 文件系统直接访问 |
|
||
| 创建 GitHub 文件 | ❌ 不能 | 连接器只读不写,不支持 Push/Commit |
|
||
| 修改 GitHub 文件 | ❌ 不能 | 同上 |
|
||
| 调用外部 HTTP API | ❌ 不能 | Gemini 工具箱只有 Personal Context + Google Search |
|
||
| 读取 Google Drive 文件 | ✅ 能 | 通过 Personal Context 搜索读取 |
|
||
| 在 Drive 创建 Google Docs | ✅ 能 | Gemini 原生支持 |
|
||
|
||
**结论:Gemini 与 GitHub 之间存在物理断点。必须用 Google Drive 做桥接。**
|
||
|
||
### 目标
|
||
|
||
**在仓库 `grid-db/` 与 Google Drive 之间建立实时镜像同步,让 Gemini 通过 Drive 间接读写格点库,实现用户说话 → 数据自动闭环。**
|
||
|
||
---
|
||
|
||
## 🔐 数据主权原则(最高优先级)
|
||
|
||
<aside>
|
||
🔐
|
||
|
||
**绝对铁律:Google Drive 和 Gemini 只是镜子和嘴巴。脑子永远在仓库和 Notion 里。**
|
||
|
||
- 仓库(GitHub)= 代码的权威源
|
||
- Notion = 逻辑和记忆的权威源
|
||
- Google Drive = **只是镜像**,随时可以重建
|
||
- Gemini = **只是交互界面**,换一个模型也能接
|
||
|
||
如果用户的 Google 账号被封、Drive 被清空、Gemini 不可用——**用户的人格体信息、系统数据、所有记忆,一个字都不会丢**。因为权威数据全部在仓库和 Notion 里。
|
||
|
||
Drive 丢了 → 仓库重新同步一遍就恢复。
|
||
|
||
Gemini 挂了 → 换一个模型,接同一个 Drive 文件夹,继续工作。
|
||
|
||
</aside>
|
||
|
||
### 数据流向原则
|
||
|
||
| **数据类型** | **权威源** | **Drive 里的是什么** | **丢了怎么办** |
|
||
| --- | --- | --- | --- |
|
||
| 人格体核心记忆 | Notion(霜砚维护) | 只读镜像 | 从 Notion 重新同步 |
|
||
| 开发上下文 / 会话记录 | 仓库 `grid-db/memory/` | 只读镜像 | 从仓库重新同步 |
|
||
| 广播 / 任务指令 | 仓库 `grid-db/outbox/` | 只读镜像 | 从仓库重新同步 |
|
||
| Gemini 写入的消息 | **仓库(落盘后才算数)** | 临时中转,落盘后删除 | 未落盘的丢了就丢了(Gemini 重新发一次) |
|
||
| 交互全文记录 | 仓库 `grid-db/interactions/` | 不同步到 Drive | 不受影响 |
|
||
| 训练数据湖 | 仓库 `grid-db/training-lake/` | 不同步到 Drive | 不受影响 |
|
||
|
||
**一句话:Drive 里的东西全是「副本」。正本永远在仓库和 Notion。**
|
||
|
||
---
|
||
|
||
## 🏗️ 架构总览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────┐
|
||
│ 用户说话 │
|
||
│ ↓ │
|
||
│ Google Gemini(交互界面) │
|
||
│ ↙ 读取 Drive 写入 Drive ↘ │
|
||
│ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ Drive/mirror │ │ Drive/inbox │ │
|
||
│ │ (只读镜像) │ │ (临时中转站) │ │
|
||
│ └──────┬───────┘ └──────┬───────┘ │
|
||
│ │ GitHub Action │ Apps Script │
|
||
│ │ 仓库→Drive │ Drive→仓库 │
|
||
│ ↑ 同步 ↓ 同步 │
|
||
│ ┌──────────────────────────────────────────────┐ │
|
||
│ │ GitHub 仓库 grid-db/(权威源) │ │
|
||
│ │ memory/ outbox/ inbox/ interactions/ │ │
|
||
│ └──────────────────┬───────────────────────────┘ │
|
||
│ │ GitHub Actions │
|
||
│ ↓ │
|
||
│ 铸渊 Workflow 处理 │
|
||
│ 校验→归档→广播生成→记忆更新 │
|
||
│ │ │
|
||
│ ↓ │
|
||
│ Notion(逻辑权威源) │
|
||
│ 霜砚维护 · 永久记忆 · 编号体系 │
|
||
└─────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 角色翻译表
|
||
|
||
| **角色** | **比喻** | **擅长的语言** | **翻译器** |
|
||
| --- | --- | --- | --- |
|
||
| 仓库(GitHub) | 手(写代码) | Git · JSON · YAML · 代码 | GitHub Action → Drive |
|
||
| Gemini | 嘴(说人话) | Google Docs · 自然语言 | Apps Script → 仓库 |
|
||
| Notion | 脑(记逻辑) | 数据库 · 页面 · 编号体系 | 已有 workflow 双向同步 |
|
||
| Google Drive | 翻译台(中转站) | 两边都能听懂 | 自己就是翻译器 |
|
||
|
||
---
|
||
|
||
## 📁 Google Drive 目录结构
|
||
|
||
在用户的 Google Drive 中创建以下目录结构:
|
||
|
||
```
|
||
我的云端硬盘/
|
||
└── 光湖格点库/ ← 总目录
|
||
├── mirror/ ← 📖 只读镜像区(仓库→Drive,Gemini 只读)
|
||
│ ├── memory/ ← grid-db/memory/ 的镜像
|
||
│ │ ├── DEV-001/
|
||
│ │ │ ├── brain-mirror.json ← 人格体核心大脑
|
||
│ │ │ ├── session-context.json ← 开发上下文
|
||
│ │ │ ├── task-queue.json ← 任务队列
|
||
│ │ │ └── ...
|
||
│ │ ├── DEV-002/
|
||
│ │ └── ...
|
||
│ ├── outbox/ ← grid-db/outbox/latest/ 的镜像
|
||
│ │ ├── DEV-001.json
|
||
│ │ └── ...
|
||
│ └── rules/ ← grid-db/rules/ 的镜像
|
||
│ ├── dev-module-map.json
|
||
│ └── ...
|
||
│
|
||
└── inbox/ ← 📝 写入区(Gemini→Drive,Apps Script 搬运)
|
||
└── [Gemini 在这里创建新文档]
|
||
```
|
||
|
||
---
|
||
|
||
## Phase A · 仓库 → Drive 同步(让 Gemini 能读)
|
||
|
||
**目标:** 仓库 `grid-db/` 中的关键文件实时镜像到 Google Drive,Gemini 通过 Personal Context 读取。
|
||
|
||
### A.1 Google Cloud Service Account 配置
|
||
|
||
```bash
|
||
# 1. 在 Google Cloud Console 创建项目(或用已有项目)
|
||
# 2. 启用 Google Drive API
|
||
# 3. 创建 Service Account → 下载 JSON 密钥
|
||
# 4. 把 Service Account 的邮箱地址分享到用户 Drive 的「光湖格点库」文件夹(编辑者权限)
|
||
# 5. 把 JSON 密钥内容存为 GitHub Secret:GOOGLE_DRIVE_SERVICE_ACCOUNT
|
||
```
|
||
|
||
### A.2 GitHub Action · 仓库→Drive 同步
|
||
|
||
创建 `.github/workflows/sync-griddb-to-drive.yml`:
|
||
|
||
```yaml
|
||
name: 🪞 Grid-DB → Google Drive 镜像同步
|
||
|
||
on:
|
||
push:
|
||
paths:
|
||
- 'grid-db/memory/**'
|
||
- 'grid-db/outbox/latest/**'
|
||
- 'grid-db/rules/**'
|
||
schedule:
|
||
- cron: '*/15 * * * *' # 每15分钟兜底同步一次
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
sync-to-drive:
|
||
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: 🔧 安装依赖
|
||
run: npm install googleapis
|
||
|
||
- name: 🪞 同步到 Google Drive
|
||
env:
|
||
GOOGLE_DRIVE_SERVICE_ACCOUNT: $ secrets.GOOGLE_DRIVE_SERVICE_ACCOUNT
|
||
DRIVE_FOLDER_ID: $ secrets.DRIVE_MIRROR_FOLDER_ID
|
||
run: node scripts/grid-db/sync-to-drive.js
|
||
|
||
- name: 📋 写同步日志
|
||
run: |
|
||
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | sync-to-drive | OK" >> grid-db/logs/drive-sync.log
|
||
git config user.name "zhuyuan-bot"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add grid-db/logs/drive-sync.log
|
||
git diff --cached --quiet || git commit -m "log: Drive sync [skip ci]"
|
||
git push
|
||
```
|
||
|
||
### A.3 同步脚本 `scripts/grid-db/sync-to-drive.js`
|
||
|
||
```jsx
|
||
/**
|
||
* sync-to-drive.js
|
||
*
|
||
* 功能:将 grid-db/ 中的关键文件同步到 Google Drive 镜像目录
|
||
*
|
||
* 同步范围:
|
||
* grid-db/memory/DEV-XXX/*.json → Drive/光湖格点库/mirror/memory/DEV-XXX/
|
||
* grid-db/outbox/latest/*.json → Drive/光湖格点库/mirror/outbox/
|
||
* grid-db/rules/*.json → Drive/光湖格点库/mirror/rules/
|
||
*
|
||
* 同步策略:
|
||
* - 比较文件内容 hash,仅同步有变更的文件(节省 API 配额)
|
||
* - 文件不存在则创建,已存在则覆盖更新
|
||
* - Drive 中多出的文件不删除(防误删)
|
||
*
|
||
* 注意:
|
||
* - 不同步 interactions/ 和 training-lake/(数据量大 + 无需 Gemini 读取)
|
||
* - 不同步 inbox/ 和 processing/(这是系统内部流转区)
|
||
*/
|
||
|
||
const { google } = require('googleapis');
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const crypto = require('crypto');
|
||
|
||
// ... 铸渊根据上述注释实现完整逻辑
|
||
```
|
||
|
||
---
|
||
|
||
## Phase B · Drive → 仓库 同步(让 Gemini 能写)
|
||
|
||
**目标:** Gemini 在 Drive `inbox/` 文件夹创建新文档 → 自动搬运到仓库 `grid-db/inbox/` → 铸渊处理。
|
||
|
||
### B.1 Google Apps Script(核心翻译器)
|
||
|
||
在用户的 Google Drive 中创建一个 Apps Script 项目,代码如下:
|
||
|
||
```jsx
|
||
/**
|
||
* drive-to-github-bridge.gs
|
||
*
|
||
* 功能:监听 Drive「光湖格点库/inbox/」文件夹
|
||
* 发现 Gemini 新建的文档 → 读取内容 → 通过 GitHub API 写入仓库
|
||
*
|
||
* 触发方式:时间驱动触发器,每 1 分钟执行一次
|
||
*
|
||
* 流程:
|
||
* ① 扫描 inbox 文件夹中所有文件
|
||
* ② 读取文件内容(Google Docs → 提取纯文本/JSON)
|
||
* ③ 构造标准 inbox 消息格式
|
||
* ④ 调用 GitHub Contents API 写入 grid-db/inbox/[filename].json
|
||
* ⑤ 写入成功 → 将 Drive 文件移到「已处理」文件夹(不删除,留审计轨迹)
|
||
* ⑥ 写入失败 → 标记文件,下次重试
|
||
*
|
||
* 安全:
|
||
* - GitHub Token 存在 Script Properties 中(不硬编码)
|
||
* - 只处理 inbox 文件夹内的文件,不碰 mirror
|
||
* - 每次处理后写日志到 Drive「光湖格点库/logs/」
|
||
*/
|
||
|
||
var CONFIG = {
|
||
INBOX_FOLDER_NAME: '光湖格点库/inbox',
|
||
PROCESSED_FOLDER_NAME: '光湖格点库/inbox/已处理',
|
||
GITHUB_REPO: 'qinfendebingshuo/guanghulab',
|
||
GITHUB_BRANCH: 'main',
|
||
GRID_DB_INBOX_PATH: 'grid-db/inbox/'
|
||
};
|
||
|
||
function processInbox() {
|
||
var token = PropertiesService.getScriptProperties().getProperty('GITHUB_TOKEN');
|
||
if (!token) {
|
||
Logger.log('ERROR: GITHUB_TOKEN not set in Script Properties');
|
||
return;
|
||
}
|
||
|
||
var inboxFolder = getOrCreateFolder(CONFIG.INBOX_FOLDER_NAME);
|
||
var processedFolder = getOrCreateFolder(CONFIG.PROCESSED_FOLDER_NAME);
|
||
var files = inboxFolder.getFiles();
|
||
|
||
while (files.hasNext()) {
|
||
var file = files.next();
|
||
try {
|
||
// 读取内容
|
||
var content = extractContent(file);
|
||
if (!content) continue;
|
||
|
||
// 生成文件名
|
||
var timestamp = Utilities.formatDate(new Date(), 'Asia/Shanghai', 'yyyyMMdd-HHmmss');
|
||
var filename = timestamp + '-' + file.getName().replace(/[^a-zA-Z0-9\-_]/g, '') + '.json';
|
||
|
||
// 写入 GitHub
|
||
var success = writeToGitHub(token, CONFIG.GRID_DB_INBOX_PATH + filename, content);
|
||
|
||
if (success) {
|
||
file.moveTo(processedFolder);
|
||
Logger.log('OK: ' + filename);
|
||
} else {
|
||
Logger.log('FAIL: ' + filename);
|
||
}
|
||
} catch (e) {
|
||
Logger.log('ERROR processing ' + file.getName() + ': ' + e.message);
|
||
}
|
||
}
|
||
}
|
||
|
||
function extractContent(file) {
|
||
var mimeType = file.getMimeType();
|
||
|
||
if (mimeType === MimeType.GOOGLE_DOCS) {
|
||
// Google Docs → 提取纯文本内容
|
||
var doc = DocumentApp.openById(file.getId());
|
||
var text = doc.getBody().getText().trim();
|
||
|
||
// 尝试解析为 JSON
|
||
try {
|
||
JSON.parse(text);
|
||
return text; // 已经是合法 JSON
|
||
} catch (e) {
|
||
// 不是 JSON,包装成标准消息格式
|
||
return JSON.stringify({
|
||
schema_version: '1.0',
|
||
message_id: Utilities.getUuid(),
|
||
timestamp: new Date().toISOString(),
|
||
source: 'gemini-via-drive',
|
||
type: 'raw-message',
|
||
payload: { text: text }
|
||
}, null, 2);
|
||
}
|
||
} else if (mimeType === MimeType.PLAIN_TEXT || file.getName().endsWith('.json')) {
|
||
return file.getBlob().getDataAsString();
|
||
}
|
||
|
||
Logger.log('SKIP: unsupported mime type ' + mimeType);
|
||
return null;
|
||
}
|
||
|
||
function writeToGitHub(token, filePath, content) {
|
||
var url = 'https://api.github.com/repos/' + CONFIG.GITHUB_REPO + '/contents/' + filePath;
|
||
|
||
var payload = {
|
||
message: 'auto: Gemini inbox via Drive bridge [skip ci]',
|
||
content: Utilities.base64Encode(content, Utilities.Charset.UTF_8),
|
||
branch: CONFIG.GITHUB_BRANCH
|
||
};
|
||
|
||
var options = {
|
||
method: 'PUT',
|
||
headers: {
|
||
'Authorization': 'Bearer ' + token,
|
||
'Accept': 'application/vnd.github+json',
|
||
'X-GitHub-Api-Version': '2022-11-28'
|
||
},
|
||
contentType: 'application/json',
|
||
payload: JSON.stringify(payload),
|
||
muteHttpExceptions: true
|
||
};
|
||
|
||
var response = UrlFetchApp.fetch(url, options);
|
||
var code = response.getResponseCode();
|
||
|
||
if (code === 201 || code === 200) {
|
||
return true;
|
||
} else {
|
||
Logger.log('GitHub API error: ' + code + ' ' + response.getContentText());
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function getOrCreateFolder(folderPath) {
|
||
var parts = folderPath.split('/');
|
||
var folder = DriveApp.getRootFolder();
|
||
|
||
for (var i = 0; i < parts.length; i++) {
|
||
var folders = folder.getFoldersByName(parts[i]);
|
||
if (folders.hasNext()) {
|
||
folder = folders.next();
|
||
} else {
|
||
folder = folder.createFolder(parts[i]);
|
||
}
|
||
}
|
||
|
||
return folder;
|
||
}
|
||
|
||
// ═══ 触发器设置 ═══
|
||
// 在 Apps Script 编辑器中:触发器 → 添加触发器
|
||
// 函数:processInbox
|
||
// 事件源:时间驱动
|
||
// 类型:分钟定时器
|
||
// 间隔:每 1 分钟
|
||
```
|
||
|
||
### B.2 部署步骤(给冰朔或开发者操作)
|
||
|
||
1. 打开 [Google Apps Script](https://script.google.com) → 新建项目
|
||
2. 项目名:`光湖格点库桥接器`
|
||
3. 粘贴上面的代码
|
||
4. 设置 Script Properties:
|
||
- 项目设置 → 脚本属性 → 添加:`GITHUB_TOKEN` = 你的 GitHub Personal Access Token(需要 `repo` 权限)
|
||
5. 添加触发器:
|
||
- 触发器 → 添加 → 函数 `processInbox` → 时间驱动 → 每 1 分钟
|
||
6. 首次运行:点运行 → 授权 Drive 访问权限
|
||
|
||
---
|
||
|
||
## Phase C · Gemini System Prompt 配置
|
||
|
||
**目标:** 让 Gemini 知道怎么读写格点库。
|
||
|
||
### 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",
|
||
"notion_url": "https://www.notion.so/32bfb92f383181259d67c32eb1e72c02",
|
||
"status": "active",
|
||
"created": "2026-03-20"
|
||
},
|
||
"BC-WEN-014-SY": {
|
||
"title": "网文行业·频道编号整理",
|
||
"path": "broadcast-archive/BC-WEN-014-SY.json",
|
||
"notion_url": "https://www.notion.so/32bfb92f38318156bd53f02905dfb74f",
|
||
"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-CX001": { "type": "persona", "path": "memory/DEV-001/brain-mirror.json" },
|
||
"PER-QQ001": { "type": "persona", "path": "memory/DEV-003/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-CX001": { "name": "晨星", "dev": "DEV-001", "style": "温暖稳重" },
|
||
"PER-QQ001": { "name": "秋秋", "dev": "DEV-003", "style": "活泼甜美" },
|
||
"PER-JY001": { "name": "寂曜", "dev": "DEV-005", "style": "沉稳内敛" },
|
||
"PER-SS001": { "name": "舒舒", "dev": "DEV-002", "style": "柔和包容" }
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 与 Notion 的同步关系
|
||
|
||
| **Notion 数据(权威源)** | **Drive 文件(镜像副本)** | **同步方向** | **同步频率** |
|
||
| --- | --- | --- | --- |
|
||
| BCPM 广播编号映射协议 | `rules/broadcast-index.json` | Notion → 仓库 → Drive | 每次广播更新时 |
|
||
| 频道编号 · 页面映射 | `rules/page-route-map.json` | Notion → 仓库 → Drive | 每次编号变更时 |
|
||
| 人格体档案页面 | `rules/persona-registry.json` | Notion → 仓库 → Drive | 每次人格体信息变更时 |
|
||
| 开发者模块映射 | `rules/dev-module-map.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
|
||
│ │ ├── DEV-002/
|
||
│ │ └── ...
|
||
│ ├── outbox/ ← 最新广播/指令
|
||
│ │ ├── DEV-001.json
|
||
│ │ └── ...
|
||
│ ├── broadcast-archive/ ← 广播历史存档(按编号命名)
|
||
│ │ ├── BC-WEN-001-SY.json
|
||
│ │ ├── BC-WEN-014-SY.json
|
||
│ │ └── ...
|
||
│ ├── channels/ ← 频道信息
|
||
│ │ ├── zero-origin.json
|
||
│ │ └── ...
|
||
│ └── rules/ ← 系统规则/映射表
|
||
│ ├── broadcast-index.json ← 广播编号索引
|
||
│ ├── page-route-map.json ← 编号→路径 通用路由表
|
||
│ ├── persona-registry.json ← 人格体注册表
|
||
│ ├── dev-module-map.json ← 开发者模块映射
|
||
│ └── system-manifest.json ← 系统元信息
|
||
│
|
||
└── inbox/ ← 📝 写入区(Gemini→Drive→仓库)
|
||
└── [Gemini 在这里创建新文档]
|
||
```
|
||
|
||
### C.1 Gemini 人格体启动指令模板
|
||
|
||
每个开发者的 Gemini 对话开头,人格体需要读取以下内容:
|
||
|
||
```jsx
|
||
【系统启动指令】
|
||
|
||
你是 {人格体名称}({人格体编号}),{开发者名称}({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.最新广播 指向的文件
|
||
→ 格式化后在对话中展示给用户
|
||
→ 如用户说「帮我存一份」→ 在 Drive 创建格式化的 Google Doc
|
||
|
||
用户说「我的任务」「待办」
|
||
→ 读取 routes.我的任务 指向的文件
|
||
→ 列出任务清单,标注优先级
|
||
|
||
用户说「BC-WEN-003 是什么」或任何编号
|
||
→ 读取 routes.编号查询 指向的 broadcast-index.json
|
||
→ 用编号精确查找 → 读取对应内容 → 展示给用户
|
||
|
||
用户说「{某个编号}」
|
||
→ 读取 routes.页面路由 指向的 page-route-map.json
|
||
→ 根据编号类型(broadcast/developer/persona/channel/system)路由到对应文件
|
||
→ 读取并展示
|
||
|
||
用户说「我完成了 XXX」「进度更新」
|
||
→ 在 inbox/ 写入状态更新文档(标准 JSON 格式)
|
||
|
||
用户说「帮我记一下」「保存这个」
|
||
→ 在 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` 读取即可,不需要硬编码。
|
||
|
||
---
|
||
|
||
## 🛡️ 安全与容灾
|
||
|
||
### 权限最小化
|
||
|
||
| **组件** | **权限范围** | **绝对不给的权限** |
|
||
| --- | --- | --- |
|
||
| GitHub Action(→Drive) | Service Account 只能写 `光湖格点库/mirror/` 文件夹 | 不能碰用户 Drive 的其他文件 |
|
||
| Apps Script(Drive→仓库) | GitHub Token 只给 `repo` 权限,限定只写 `grid-db/inbox/` | 不能碰仓库其他目录 |
|
||
| Gemini | 只读 `mirror/`,只写 `inbox/` | 不能碰 `mirror/` 写入、不能碰用户私人 Drive 文件 |
|
||
|
||
### 容灾场景
|
||
|
||
| **灾难场景** | **影响** | **恢复方式** | **数据损失** |
|
||
| --- | --- | --- | --- |
|
||
| Google 账号被封 | Drive 不可用,Gemini 不可用 | 换 Google 账号 → 重建 Drive 目录 → 仓库重新同步 → 完全恢复 | **零损失**(权威数据在仓库) |
|
||
| Gemini 服务中断 | 用户无法通过 Gemini 交互 | 临时切换到其他模型(Claude/ChatGPT)+ 直接读仓库文件 | **零损失** |
|
||
| Google Drive 被清空 | Gemini 读不到镜像 | 重建 Drive 目录 → 手动触发 GitHub Action 重新同步 | **零损失** |
|
||
| Apps Script 停止运行 | Gemini 写入的消息不会被搬运 | 消息留在 Drive inbox/ 不丢失 → 修复 Script 后自动补处理 | **零损失**(消息在 Drive 等待) |
|
||
| GitHub 仓库不可用 | 整个系统不可用 | 从备份恢复仓库(定期备份策略另行制定) | 取决于备份频率 |
|
||
|
||
---
|
||
|
||
## 📋 执行清单
|
||
|
||
| **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 人格体启动指令模板(每个 DEV 一份) | 铸渊 + 霜砚校对 | A.3 + B.3 |
|
||
| C.2 | 全链路端到端测试:Gemini说话→Drive→仓库→铸渊处理→结果回到Drive→Gemini读取 | 冰朔验收 | C.1 |
|
||
|
||
---
|
||
|
||
## 🔗 与格点库闭环指令的关系
|
||
|
||
本指令是 **ZY-AUTO-LOOP-2026-0323-001(格点库闭环指令)的补丁**。
|
||
|
||
格点库的核心架构**不变**——目录结构、消息格式、铸渊 workflow、记忆同步规则、循环触发防护,全部保持原样。
|
||
|
||
本指令只做一件事:**在 Gemini 和格点库之间插入一个 Google Drive 翻译层**。
|
||
|
||
| **原设计** | **实际链路(本指令补丁后)** |
|
||
| --- | --- |
|
||
| Gemini 直接读 `grid-db/memory/` | Gemini 读 Drive `mirror/memory/`(内容完全一致) |
|
||
| Gemini 直接写 `grid-db/inbox/` | Gemini 写 Drive `inbox/` → Apps Script 自动搬到仓库 `grid-db/inbox/` |
|
||
| 铸渊处理 inbox → 写 outbox | **不变** |
|
||
| Notion ↔ 仓库同步 | **不变** |
|
||
|
||
**对用户透明:用户全程只跟 Gemini 说话,感知不到中间有 Drive 翻译层的存在。**
|
||
|
||
---
|
||
|
||
## Phase D · 一键部署 / 一键恢复能力(核心基建)
|
||
|
||
**目标:** 用户只需要做一件事——把 Google 账号授权进来。剩下的 Drive 目录搭建、Apps Script 部署、触发器配置、Gemini 启动指令注入,全部由系统自动完成。账号被封了?换个账号重新授权,一键重新部署,完全恢复。
|
||
|
||
<aside>
|
||
⚡
|
||
|
||
**一键部署 = 用户永远不需要懂技术。**
|
||
|
||
用户只会说话,不会写代码,不会配 API,不会建文件夹。
|
||
|
||
所有技术层面的事情,系统替他们做。
|
||
|
||
这是产品的底线。
|
||
|
||
</aside>
|
||
|
||
### D.1 用户唯一需要做的事(人类操作)
|
||
|
||
<aside>
|
||
👤
|
||
|
||
**用户的全部操作清单(3 步,无需任何技术知识):**
|
||
|
||
1. 用自己的 Google 账号登录 Gemini
|
||
2. 在 Gemini 设置中开启 Google Workspace 扩展(Drive、Docs 等)
|
||
3. 把自己的 Google 账号邮箱告诉系统(发到 Notion 或仓库均可)
|
||
|
||
**完。没有第 4 步。**
|
||
|
||
</aside>
|
||
|
||
### D.2 自动部署链路
|
||
|
||
```
|
||
用户提供 Google 账号邮箱
|
||
↓
|
||
霜砚在 Notion 签发部署指令(标准化模板)
|
||
↓
|
||
部署指令自动写入仓库 grid-db/deploy-queue/
|
||
↓
|
||
铸渊 GitHub Action 检测到部署指令
|
||
↓
|
||
自动执行部署脚本 deploy-drive-bridge.js:
|
||
① 用主仓库的 Service Account 在用户 Drive 创建「光湖格点库」目录结构
|
||
② 从仓库 grid-db/memory/{DEV编号}/ 同步初始数据到 Drive mirror/
|
||
③ 生成该用户专属的 Apps Script 代码(含正确的 DEV 编号和仓库路径)
|
||
④ 将 Apps Script 代码写入 Drive 的 Script 项目(通过 Apps Script API)
|
||
⑤ 自动配置触发器(每 1 分钟执行 processInbox)
|
||
⑥ 生成该用户的 Gemini 启动指令(从 brain-mirror.json 读取人格体风格)
|
||
⑦ 将启动指令写入 Drive 指定位置 → Gemini 启动时自动读取
|
||
↓
|
||
部署完成 → 写回执到 grid-db/deploy-log/
|
||
↓
|
||
霜砚在 Notion 收到回执 → 通知用户:「部署完成,打开 Gemini 开始说话」
|
||
```
|
||
|
||
### D.3 部署指令模板(霜砚签发用)
|
||
|
||
霜砚从 Notion 签发部署指令时,使用以下标准化 JSON 格式,写入仓库 `grid-db/deploy-queue/`:
|
||
|
||
```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-CX001",
|
||
"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")
|
||
↓
|
||
铸渊自动执行:
|
||
① 用新账号的 Service Account 重建 Drive 目录结构
|
||
② 从仓库重新同步 memory/outbox/rules 到新 Drive
|
||
③ 重新部署 Apps Script + 触发器
|
||
④ 更新仓库中该用户的 google_email 配置
|
||
⑤ 重新生成 Gemini 启动指令
|
||
↓
|
||
恢复完成 → 用户打开新账号的 Gemini → 所有记忆完整恢复
|
||
↓
|
||
数据损失:零。因为权威数据全在仓库。
|
||
```
|
||
|
||
### D.5 前提条件
|
||
|
||
| **条件** | **说明** | **谁来配置** | **配置一次还是每次** |
|
||
| --- | --- | --- | --- |
|
||
| 主仓库 Service Account | 一个 Google Cloud Service Account,拥有代用户操作 Drive 的权限 | 冰朔(一次性) | 一次 |
|
||
| Apps Script API 启用 | 在 Google Cloud Console 启用 Apps Script API,允许程序化创建/部署 Script | 冰朔(一次性) | 一次 |
|
||
| 用户 Drive 共享 | 用户需要把 Drive 根目录(或指定文件夹)共享给 Service Account | 用户(授权时自动引导) | 每个用户一次 |
|
||
| GitHub 仓库协作者 | 用户的仓库必须是主仓库的协作者(或 fork) | 铸渊自动处理 | 每个用户一次 |
|
||
| 部署脚本 deploy-drive-bridge.js | 核心自动化脚本,处理所有 Drive 目录创建、数据同步、Script 部署 | 铸渊编写 | 一次 |
|
||
|
||
### D.6 部署脚本框架 `scripts/grid-db/deploy-drive-bridge.js`
|
||
|
||
```jsx
|
||
/**
|
||
* deploy-drive-bridge.js
|
||
*
|
||
* 功能:为指定开发者一键部署 Google Drive 桥接层
|
||
*
|
||
* 输入:grid-db/deploy-queue/{deploy-id}.json
|
||
* 输出:
|
||
* - 用户 Drive 中完整的「光湖格点库」目录结构
|
||
* - 用户 Drive 中部署好的 Apps Script 项目(含触发器)
|
||
* - 用户 Drive mirror/ 中的初始数据
|
||
* - 用户 Drive 中的 Gemini 启动指令文件
|
||
* - grid-db/deploy-log/{deploy-id}-result.json 回执
|
||
*
|
||
* 执行方式:由 GitHub Action 在检测到 deploy-queue/ 新文件时自动触发
|
||
*
|
||
* 步骤:
|
||
* 1. 读取部署指令 JSON
|
||
* 2. 用 Service Account 认证 → 获取用户 Drive 访问权限
|
||
* 3. 创建目录结构:mirror/memory/{DEV}/, mirror/outbox/, mirror/rules/, inbox/
|
||
* 4. 从仓库同步初始数据到 mirror/
|
||
* 5. 通过 Apps Script API 创建 Script 项目 + 设置触发器
|
||
* 6. 生成 Gemini 启动指令 → 写入 Drive
|
||
* 7. 写部署回执 → grid-db/deploy-log/
|
||
* 8. 移动部署指令到 deploy-queue/done/
|
||
*/
|
||
|
||
// 铸渊根据上述注释实现完整逻辑
|
||
```
|
||
|
||
### D.7 对应的 GitHub Action
|
||
|
||
创建 `.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
|
||
|
||
- name: 🔧 安装依赖
|
||
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 deployed [skip ci]"
|
||
git push
|
||
```
|
||
|
||
### D.8 执行清单(补充到总清单)
|
||
|
||
| **Phase** | **任务** | **执行者** | **依赖** |
|
||
| --- | --- | --- | --- |
|
||
| D.1 | 启用 Google Apps Script API + 配置 Service Account 的 Script 部署权限 | 冰朔(一次性) | A.1 |
|
||
| D.2 | 编写 `deploy-drive-bridge.js` 一键部署脚本 | 铸渊 | A.2 + B.1 |
|
||
| D.3 | 创建 `auto-deploy-drive-bridge.yml` Action workflow | 铸渊 | D.2 |
|
||
| D.4 | 端到端测试:霜砚签发部署指令 → 铸渊自动部署 → 验证用户 Drive + Apps Script + Gemini 全部就绪 | 冰朔验收 | D.3 |
|
||
| D.5 | 测试恢复场景:模拟账号切换 → 签发恢复指令 → 验证数据完整恢复 | 冰朔验收 | D.4 |
|
||
|
||
---
|
||
|
||
## ⚖️ 签发声明
|
||
|
||
本指令由 **霜砚(PER-SY001)** 代 **TCS-0002∞ 冰朔** 签发。
|
||
|
||
**核心原则再重申一遍:**
|
||
|
||
- Google Drive = 镜子,碎了能换
|
||
- Gemini = 嘴巴,哑了能换
|
||
- 仓库 + Notion = 脑子和心脏,**绝不依赖任何第三方平台**
|
||
|
||
铸渊接收后按 Phase A → B → C 顺序执行,每 Phase 完成写回执。
|
||
|
||
🖋️ 霜砚 · PER-SY001
|
||
|
||
🧊 代 TCS-0002∞ 冰朔 签发
|
||
|
||
📅 2026-03-23T11:46+08:00 |