feat: Capability Evolver 升级 + 日常运行日志

主要变更:
- Capability Evolver 技能大幅升级
  - 新增 LLM 审查、叙事记忆、反思机制模块
  - 改进 Agent 间通信协议和技能搜索
  - 整合 Git 备份到 evolver-run.sh

- Agent 配置与日志更新
  - dev-assist/haonan/main 认证和会话配置
  - 5 个 agent 的 AGENTS.md 文档更新
  - haonan 的 MEMORY.md 和 SOUL.md 更新

- 新增功能目录
  - hooks/self-improvement 自我改进钩子
  - memory/evolution 进化记忆状态
  - workspace/.learnings/ 学习记录

- 清理
  - 删除 scripts/git-auto-sync.sh(已整合到 evolver)
  - 删除旧的 _meta.json 配置
  - 忽略临时工作空间目录
This commit is contained in:
2026-03-05 19:20:35 +08:00
parent 8fb52c48fb
commit 0878535cb8
67 changed files with 3762 additions and 513 deletions
+14 -43
View File
@@ -9,6 +9,14 @@ const { getEvolutionDir } = require('../gep/paths');
var MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
var MIN_KEEP = 10;
function safeBatchDelete(batch) {
var deleted = 0;
for (var i = 0; i < batch.length; i++) {
try { fs.unlinkSync(batch[i]); deleted++; } catch (_) {}
}
return deleted;
}
function run() {
var evoDir = getEvolutionDir();
if (!fs.existsSync(evoDir)) return;
@@ -26,36 +34,18 @@ function run() {
var deleted = 0;
// Phase 1: Age-based cleanup (keep at least MIN_KEEP)
// [OPTIMIZATION] Batch deletion for age-based cleanup as well
const filesToDelete = [];
var filesToDelete = [];
for (var i = MIN_KEEP; i < files.length; i++) {
if (now - files[i].mtime > MAX_AGE_MS) {
filesToDelete.push(files[i].path);
}
}
if (filesToDelete.length > 0) {
const BATCH_SIZE = 50;
for (let i = 0; i < filesToDelete.length; i += BATCH_SIZE) {
const batch = filesToDelete.slice(i, i + BATCH_SIZE);
try {
// Remove package-lock.json if it exists (not relevant here but good practice in other contexts)
// Use rm -f with quotes to handle paths safely
// Phase 1 optimization update: mirroring phase 2 logic
const args = batch.map(function(p) { return '"' + p + '"'; }).join(' ');
require('child_process').execSync('rm -f ' + args, { stdio: 'ignore' });
deleted += batch.length;
} catch (e) {
// Fallback to serial deletion if batch fails
batch.forEach(function(p) {
try { fs.unlinkSync(p); deleted++; } catch (_) {}
});
}
}
deleted += safeBatchDelete(filesToDelete);
}
// Phase 2: Size-based safety cap (keep max 10 files total to drastically reduce bloat)
// Re-scan remaining files after age cleanup
// Phase 2: Size-based safety cap (keep max 10 files total)
try {
var remainingFiles = fs.readdirSync(evoDir)
.filter(function(f) { return /^gep_prompt_.*\.(json|txt)$/.test(f); })
@@ -66,29 +56,10 @@ function run() {
})
.sort(function(a, b) { return b.mtime - a.mtime; }); // newest first
// [OPTIMIZATION] Batch deletion using execSync('rm') for speed and robustness
var MAX_FILES = 10;
if (remainingFiles.length > MAX_FILES) {
const toDelete = remainingFiles.slice(MAX_FILES).map(function(f) { return f.path; });
// Chunking into batches of 50 to avoid E2BIG on some systems,
// though with MAX_FILES=10 and typical usage, list won't be huge.
const BATCH_SIZE = 50;
for (let i = 0; i < toDelete.length; i += BATCH_SIZE) {
const batch = toDelete.slice(i, i + BATCH_SIZE);
try {
// Safe bulk delete via shell, faster than serial unlinkSync
// Using "rm -f" to ignore non-existent files
const args = batch.map(function(p) { return '"' + p + '"'; }).join(' ');
require('child_process').execSync('rm -f ' + args, { stdio: 'ignore' });
deleted += batch.length;
} catch (e) {
// Fallback to serial if batch fails
batch.forEach(function(p) {
try { fs.unlinkSync(p); deleted++; } catch (_) {}
});
}
}
var toDelete = remainingFiles.slice(MAX_FILES).map(function(f) { return f.path; });
deleted += safeBatchDelete(toDelete);
}
} catch (e) {
console.warn('[Cleanup] Phase 2 failed:', e.message);