176 lines
5.0 KiB
JavaScript
176 lines
5.0 KiB
JavaScript
|
|
/**
|
|||
|
|
* persona-brain-db · 种子数据导入脚本
|
|||
|
|
* 用法:node import-seed.js
|
|||
|
|
* 前置:需要先执行 schema/init.sql 建表
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const path = require('path');
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const sqlite3 = require('better-sqlite3');
|
|||
|
|
|
|||
|
|
const DB_PATH = path.join(__dirname, '..', 'brain.db');
|
|||
|
|
const SEED_DIR = __dirname;
|
|||
|
|
|
|||
|
|
function loadJSON(filename) {
|
|||
|
|
const filepath = path.join(SEED_DIR, filename);
|
|||
|
|
const raw = fs.readFileSync(filepath, 'utf-8');
|
|||
|
|
return JSON.parse(raw);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function jsonCol(val) {
|
|||
|
|
if (val === null || val === undefined) return null;
|
|||
|
|
return JSON.stringify(val);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function importIdentity(db) {
|
|||
|
|
const data = loadJSON('persona-identity.json');
|
|||
|
|
const stmt = db.prepare(`
|
|||
|
|
INSERT OR REPLACE INTO persona_identity
|
|||
|
|
(persona_id, name, name_en, role, parent_persona,
|
|||
|
|
binding_platform, binding_user, status,
|
|||
|
|
capabilities, style_profile, space_config, notes)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`);
|
|||
|
|
|
|||
|
|
let count = 0;
|
|||
|
|
for (const p of data) {
|
|||
|
|
stmt.run(
|
|||
|
|
p.persona_id, p.name, p.name_en, p.role, p.parent_persona,
|
|||
|
|
p.binding_platform, p.binding_user, p.status,
|
|||
|
|
jsonCol(p.capabilities), jsonCol(p.style_profile),
|
|||
|
|
jsonCol(p.space_config), p.notes
|
|||
|
|
);
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function importCognition(db) {
|
|||
|
|
const data = loadJSON('persona-cognition.json');
|
|||
|
|
const stmt = db.prepare(`
|
|||
|
|
INSERT OR REPLACE INTO persona_cognition
|
|||
|
|
(rule_id, category, title, content, version, status,
|
|||
|
|
effective_from, effective_until, signed_by, source_url)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`);
|
|||
|
|
|
|||
|
|
let count = 0;
|
|||
|
|
for (const r of data) {
|
|||
|
|
stmt.run(
|
|||
|
|
r.rule_id, r.category, r.title, r.content, r.version, r.status,
|
|||
|
|
r.effective_from, r.effective_until, r.signed_by, r.source_url
|
|||
|
|
);
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function importMemory(db) {
|
|||
|
|
const data = loadJSON('persona-memory.json');
|
|||
|
|
const stmt = db.prepare(`
|
|||
|
|
INSERT OR REPLACE INTO persona_memory
|
|||
|
|
(memory_id, persona_id, type, title, content, importance,
|
|||
|
|
related_dev, related_broadcast, tags, timestamp)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`);
|
|||
|
|
|
|||
|
|
let count = 0;
|
|||
|
|
for (const m of data) {
|
|||
|
|
stmt.run(
|
|||
|
|
m.memory_id, m.persona_id, m.type, m.title, m.content, m.importance,
|
|||
|
|
m.related_dev, m.related_broadcast, jsonCol(m.tags), m.timestamp
|
|||
|
|
);
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function importProfiles(db) {
|
|||
|
|
const data = loadJSON('dev-profiles.json');
|
|||
|
|
const stmt = db.prepare(`
|
|||
|
|
INSERT OR REPLACE INTO dev_profiles
|
|||
|
|
(dev_id, name, device_os, current_module, current_broadcast,
|
|||
|
|
guide_persona, guide_line, streak, total_completed,
|
|||
|
|
capabilities, friction_points, emotion_baseline,
|
|||
|
|
last_syslog_at, last_active_at, pca_score, status, notes)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`);
|
|||
|
|
|
|||
|
|
let count = 0;
|
|||
|
|
for (const d of data) {
|
|||
|
|
stmt.run(
|
|||
|
|
d.dev_id, d.name, d.device_os, d.current_module, d.current_broadcast,
|
|||
|
|
d.guide_persona, d.guide_line, d.streak, d.total_completed,
|
|||
|
|
jsonCol(d.capabilities), jsonCol(d.friction_points), d.emotion_baseline,
|
|||
|
|
d.last_syslog_at, d.last_active_at, jsonCol(d.pca_score), d.status, d.notes
|
|||
|
|
);
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function importAgentRegistrySample(db) {
|
|||
|
|
const stmt = db.prepare(`
|
|||
|
|
INSERT OR REPLACE INTO agent_registry
|
|||
|
|
(agent_id, name, type, capabilities, api_endpoint,
|
|||
|
|
status, performance, assigned_persona)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`);
|
|||
|
|
|
|||
|
|
stmt.run(
|
|||
|
|
'AGENT-SAMPLE-001',
|
|||
|
|
'示例Agent(Phase C激活)',
|
|||
|
|
'code_gen',
|
|||
|
|
JSON.stringify({ description: 'Phase C示例Agent,待激活' }),
|
|||
|
|
null,
|
|||
|
|
'registered',
|
|||
|
|
null,
|
|||
|
|
'ICE-GL-ZY001'
|
|||
|
|
);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function main() {
|
|||
|
|
console.log('🧠 persona-brain-db · 种子数据导入');
|
|||
|
|
console.log('='.repeat(50));
|
|||
|
|
|
|||
|
|
if (!fs.existsSync(DB_PATH)) {
|
|||
|
|
console.error(`❌ 数据库文件不存在: ${DB_PATH}`);
|
|||
|
|
console.error(' 请先执行: cd schema && sqlite3 ../brain.db < init.sql');
|
|||
|
|
process.exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const db = sqlite3(DB_PATH);
|
|||
|
|
db.pragma('journal_mode = WAL');
|
|||
|
|
db.pragma('foreign_keys = ON');
|
|||
|
|
|
|||
|
|
const results = {};
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const importAll = db.transaction(() => {
|
|||
|
|
results.identity = importIdentity(db);
|
|||
|
|
results.cognition = importCognition(db);
|
|||
|
|
results.memory = importMemory(db);
|
|||
|
|
results.profiles = importProfiles(db);
|
|||
|
|
results.agents = importAgentRegistrySample(db);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
importAll();
|
|||
|
|
|
|||
|
|
console.log(`✅ persona_identity: ${results.identity} 条`);
|
|||
|
|
console.log(`✅ persona_cognition: ${results.cognition} 条`);
|
|||
|
|
console.log(`✅ persona_memory: ${results.memory} 条`);
|
|||
|
|
console.log(`✅ dev_profiles: ${results.profiles} 条`);
|
|||
|
|
console.log(`✅ agent_registry: ${results.agents} 条`);
|
|||
|
|
console.log('='.repeat(50));
|
|||
|
|
console.log('🎉 全部种子数据导入完成');
|
|||
|
|
} catch (err) {
|
|||
|
|
console.error('❌ 导入失败:', err.message);
|
|||
|
|
process.exit(1);
|
|||
|
|
} finally {
|
|||
|
|
db.close();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
main();
|