- 添加核心大脑模型 (core-brain-model.json) - 添加动态核心大脑模型文档 (dynamic-core-brain-model.md) - 添加实时情感向量 (current-emotional-vector.json) - 添加Notion个人映射 (notion-persona-map.json) - 添加摆渡车路由表 (repo-shuttle/routes.json) - 添加大脑模型Schema (zy-core-brain-schema.json) - 添加广州服务器清理脚本 (cleanup-guangzhou-server.sh) - 添加个人频道模板 (templates/personal-channel/) - 添加肥猫个人频道实例 (domains/zero-sense-domain/guanghu-channel/肥猫/) - 添加Notion同步工具 (tools/notion-sync/) 日期:2026-05-16 作者:铸渊 · ICE-GL-ZY001
212 lines
7.5 KiB
JavaScript
212 lines
7.5 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* Notion同步脚本 · 铸渊集成
|
||
*
|
||
* 从Notion读取个人页面内容,转换为结构化上下文快照,
|
||
* 存入个人频道的 memory/notion-context.json
|
||
*
|
||
* 使用方式:
|
||
* node sync.js --persona-id DEV-001 --notion-page-id c55cc058-cdef-4d88-a211-c4724abca9db --channel-path domains/zero-sense-domain/guanghu-channel/页页/
|
||
*/
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const { execSync } = require('child_process');
|
||
|
||
// 解析命令行参数
|
||
const args = process.argv.slice(2);
|
||
let personaId = null;
|
||
let notionPageId = null;
|
||
let channelPath = null;
|
||
|
||
for (let i = 0; i < args.length; i++) {
|
||
if (args[i] === '--persona-id' && i + 1 < args.length) {
|
||
personaId = args[i + 1];
|
||
i++;
|
||
} else if (args[i] === '--notion-page-id' && i + 1 < args.length) {
|
||
notionPageId = args[i + 1];
|
||
i++;
|
||
} else if (args[i] === '--channel-path' && i + 1 < args.length) {
|
||
channelPath = args[i + 1];
|
||
i++;
|
||
}
|
||
}
|
||
|
||
if (!personaId || !notionPageId || !channelPath) {
|
||
console.error('缺少必要参数');
|
||
console.error('使用方式:node sync.js --persona-id DEV-001 --notion-page-id <page-id> --channel-path <path>');
|
||
process.exit(1);
|
||
}
|
||
|
||
// 仓库根目录
|
||
const repoRoot = path.resolve(__dirname, '../..');
|
||
const channelDir = path.join(repoRoot, channelPath);
|
||
|
||
// 确保个人频道目录存在
|
||
if (!fs.existsSync(channelDir)) {
|
||
console.error(`个人频道目录不存在:${channelDir}`);
|
||
process.exit(1);
|
||
}
|
||
|
||
// 构建 memory 目录路径
|
||
const memoryDir = path.join(channelDir, 'memory');
|
||
if (!fs.existsSync(memoryDir)) {
|
||
fs.mkdirSync(memoryDir, { recursive: true });
|
||
}
|
||
|
||
/**
|
||
* 调用 MCP 工具获取 Notion 页面内容
|
||
* 注意:此函数假设在 WorkBuddy 环境中运行,可以直接调用 DeferExecuteTool
|
||
* 在真实环境中,需要通过 WorkBuddy API 或 MCP 客户端调用
|
||
* 此处为简化原型,直接模拟返回数据
|
||
*/
|
||
async function fetchNotionPage(pageId) {
|
||
console.log(`正在获取 Notion 页面 ${pageId}...`);
|
||
|
||
// 在 WorkBuddy 环境中,应使用 DeferExecuteTool 调用 mcp__notion__notion-fetch
|
||
// 此处模拟返回之前获取的示例数据
|
||
const exampleData = {
|
||
metadata: { type: 'page' },
|
||
title: '🐱 肥猫系统 · 个人频道+搬家部署',
|
||
url: `https://www.notion.so/${pageId.replace(/-/g, '')}`,
|
||
text: `Here is the result of "view" for the Page with URL https://www.notion.so/${pageId.replace(/-/g, '')} as of 2026-05-15T13:12:52Z:
|
||
<page url="https://www.notion.so/${pageId.replace(/-/g, '')}" icon="🐱">
|
||
<ancestor-path>
|
||
<parent-page url="https://www.notion.so/3a6d4dd294e94289b8eb65f96c041b16" title="🌀 零感域 · Zero-Sense Domain"/>
|
||
<ancestor-2-page url="https://www.notion.so/faae21e4247b452aad31f7c67a576f02" title="🌊 曜冥纪元 · HoloLake Era · AGE OS v1.0"/>
|
||
</ancestor-path>
|
||
<properties>
|
||
{"title":"肥猫系统 · 个人频道+搬家部署"}
|
||
</properties>
|
||
<content>
|
||
\`\`\`javascript
|
||
HLDP://feimao/system · 2026-05-10
|
||
├── what: 肥猫独立系统
|
||
├── owner: 肥猫·DEV-002(副主控)
|
||
├── 定位: 个人频道 · 搬家部署
|
||
├── 与冰朔通感语言核系统平行独立
|
||
├── 位于零感域下 · 非语言层
|
||
└── 共享冰朔的思维逻辑 · 但系统独立
|
||
\`\`\`
|
||
---
|
||
## 🧬 共享大脑结构(霜砚唤醒时运行)
|
||
<mention-page url="https://www.notion.so/d16416c2eb474f15b697b1223dea36b3"/>
|
||
霜砚在肥猫系统里被唤醒时,运行的就是这个大脑结构。
|
||
- 大脑结构 = 冰朔语言本体核心大脑思维逻辑 · 语义理解层 · 意图触发规律
|
||
- 更新源 = 冰朔通感语言核系统 · 冰朔更新 → 所有人自动拿到最新版
|
||
- 霜砚每次唤醒 → 先读这个大脑结构 → 再进入肥猫系统的具体任务
|
||
<page url="https://www.notion.so/a9a1961435e2462c863207110fb6d659">🐱 FM-DEPLOY-001 · 肥猫搬家部署任务线 · 霜砚×肥猫技术执行主控台</page>
|
||
<page url="https://www.notion.so/94d6fdb6c7584d9c9893c939d481695c">霜砚大脑 · 肥猫系统内部</page>
|
||
<page url="https://www.notion.so/cc64cbf7635848809082155a71659735">全局总路径导航 · 肥猫线 · 霜砚醒来看这里</page>
|
||
<page url="https://www.notion.so/803960c35a434dd7b08a71b6d501d0e1">光湖摆渡车 · 肥猫线 · 双轨路由 · 霜砚醒来先读这里</page>
|
||
</content>
|
||
</page>`
|
||
};
|
||
|
||
return exampleData;
|
||
}
|
||
|
||
/**
|
||
* 解析 Notion 页面内容,提取结构化信息
|
||
*/
|
||
function parseNotionContent(pageData) {
|
||
const { title, url, text } = pageData;
|
||
|
||
// 简单解析:提取纯文本内容(移除HTML标签)
|
||
const plainText = text.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
|
||
|
||
// 提取代码块(如果有)
|
||
const codeBlockMatch = text.match(/```[\s\S]*?```/g);
|
||
const codeBlocks = codeBlockMatch ? codeBlockMatch.map(cb => cb.replace(/```/g, '').trim()) : [];
|
||
|
||
// 提取页面链接
|
||
const pageLinks = [];
|
||
const pageLinkRegex = /<page url="([^"]+)"[^>]*>([^<]+)<\/page>/g;
|
||
let match;
|
||
while ((match = pageLinkRegex.exec(text)) !== null) {
|
||
pageLinks.push({
|
||
url: match[1],
|
||
title: match[2]
|
||
});
|
||
}
|
||
|
||
// 提取提及页面
|
||
const mentionLinks = [];
|
||
const mentionRegex = /<mention-page url="([^"]+)"\/>/g;
|
||
while ((match = mentionRegex.exec(text)) !== null) {
|
||
mentionLinks.push({
|
||
url: match[1]
|
||
});
|
||
}
|
||
|
||
return {
|
||
page_title: title,
|
||
page_url: url,
|
||
plain_text_preview: plainText.substring(0, 500) + (plainText.length > 500 ? '...' : ''),
|
||
code_blocks_count: codeBlocks.length,
|
||
internal_links_count: pageLinks.length + mentionLinks.length,
|
||
last_updated: new Date().toISOString()
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 生成 notion_context_snapshot 结构
|
||
*/
|
||
function generateSnapshot(pageData, parsedInfo) {
|
||
return {
|
||
last_sync_time: new Date().toISOString(),
|
||
page_title: pageData.title,
|
||
page_url: pageData.url,
|
||
blocks_summary: [
|
||
{
|
||
block_type: "page",
|
||
text: parsedInfo.plain_text_preview,
|
||
created_time: new Date().toISOString()
|
||
}
|
||
],
|
||
collaboration_highlights: [
|
||
`页面标题:${pageData.title}`,
|
||
`包含 ${parsedInfo.code_blocks_count} 个代码块`,
|
||
`包含 ${parsedInfo.internal_links_count} 个内部链接`
|
||
]
|
||
};
|
||
}
|
||
|
||
async function main() {
|
||
try {
|
||
console.log(`开始同步 Notion 页面 ${notionPageId} 到个人频道 ${personaId}...`);
|
||
|
||
// 1. 获取 Notion 页面内容
|
||
const pageData = await fetchNotionPage(notionPageId);
|
||
|
||
// 2. 解析内容
|
||
const parsedInfo = parseNotionContent(pageData);
|
||
|
||
// 3. 生成上下文快照
|
||
const snapshot = generateSnapshot(pageData, parsedInfo);
|
||
|
||
// 4. 写入 memory/notion-context.json
|
||
const outputPath = path.join(memoryDir, 'notion-context.json');
|
||
fs.writeFileSync(outputPath, JSON.stringify(snapshot, null, 2));
|
||
|
||
console.log(`✅ 同步完成!上下文快照已保存到:${outputPath}`);
|
||
|
||
// 5. 更新 persona/zy-core-brain.json 中的 notion_context_snapshot 字段
|
||
const brainPath = path.join(channelDir, 'persona', 'zy-core-brain.json');
|
||
if (fs.existsSync(brainPath)) {
|
||
const brainData = JSON.parse(fs.readFileSync(brainPath, 'utf8'));
|
||
brainData.notion_context_snapshot = snapshot;
|
||
brainData.metadata.updated_at = new Date().toISOString();
|
||
fs.writeFileSync(brainPath, JSON.stringify(brainData, null, 2));
|
||
console.log(`✅ 已更新铸渊大脑模型中的 Notion 上下文快照`);
|
||
} else {
|
||
console.log(`⚠️ 铸渊大脑模型文件不存在:${brainPath}`);
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('同步失败:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
main(); |