80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
|
|
/**
|
|||
|
|
* scripts/grid-db/sync-griddb-to-notion.js
|
|||
|
|
*
|
|||
|
|
* Grid-DB → Notion 增量回传脚本
|
|||
|
|
*
|
|||
|
|
* 职责:
|
|||
|
|
* - 检测 grid-db/memory/ 中变更的文件(排除 brain-mirror.json)
|
|||
|
|
* - 将 session-context, task-queue, dev-profile, persona-growth 的增量变化回传到 Notion
|
|||
|
|
* - task-queue: 追加制(新任务追加,已有任务只改状态不删除)
|
|||
|
|
* - dev-profile / persona-growth: 只追加不覆盖
|
|||
|
|
*
|
|||
|
|
* 环境变量:
|
|||
|
|
* - NOTION_API_TOKEN: Notion API 密钥
|
|||
|
|
*
|
|||
|
|
* 守护: PER-ZY001 铸渊
|
|||
|
|
* 系统: SYS-GLW-0001
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
const { execSync } = require('child_process');
|
|||
|
|
|
|||
|
|
const GRID_DB_MEMORY = path.join(__dirname, '../../grid-db/memory');
|
|||
|
|
|
|||
|
|
async function main() {
|
|||
|
|
const notionToken = process.env.NOTION_API_TOKEN;
|
|||
|
|
|
|||
|
|
if (!notionToken) {
|
|||
|
|
console.log('[sync-griddb-to-notion] NOTION_API_TOKEN not set, skipping sync');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Detect changed files (passed from workflow or detect via git diff)
|
|||
|
|
let changedFiles;
|
|||
|
|
try {
|
|||
|
|
// Use GITHUB_SHA context if available, otherwise fall back to HEAD~1
|
|||
|
|
const beforeSha = process.env.BEFORE_SHA || 'HEAD~1';
|
|||
|
|
const diff = execSync(`git diff --name-only ${beforeSha} HEAD -- grid-db/memory/`, { encoding: 'utf8' });
|
|||
|
|
changedFiles = diff.trim().split('\n')
|
|||
|
|
.filter(f => f && !f.includes('brain-mirror.json'));
|
|||
|
|
} catch {
|
|||
|
|
console.log('[sync-griddb-to-notion] No changes detected (git diff failed, possibly first commit or shallow clone)');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (changedFiles.length === 0) {
|
|||
|
|
console.log('[sync-griddb-to-notion] No eligible changes to sync');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`[sync-griddb-to-notion] Processing ${changedFiles.length} changed files:`);
|
|||
|
|
|
|||
|
|
for (const file of changedFiles) {
|
|||
|
|
const fullPath = path.join(__dirname, '../..', file);
|
|||
|
|
if (!fs.existsSync(fullPath)) {
|
|||
|
|
console.log(` [skip] ${file} (deleted)`);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const data = JSON.parse(fs.readFileSync(fullPath, 'utf8'));
|
|||
|
|
const fileName = path.basename(file);
|
|||
|
|
const devDir = path.basename(path.dirname(file));
|
|||
|
|
|
|||
|
|
console.log(` [sync] ${devDir}/${fileName}`);
|
|||
|
|
|
|||
|
|
// TODO: Implement actual Notion API write
|
|||
|
|
// - session-context.json → update Notion page property
|
|||
|
|
// - task-queue.json → append/update tasks in Notion database
|
|||
|
|
// - dev-profile.json → append growth data
|
|||
|
|
// - persona-growth.json → append adaptation log
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log('[sync-griddb-to-notion] Sync complete');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main().catch(err => {
|
|||
|
|
console.error('[sync-griddb-to-notion] Error:', err.message);
|
|||
|
|
process.exit(1);
|
|||
|
|
});
|