Commit 3f4d1a00ebb3a613506e8ab04c9fa9aa314dc7ee
1 parent
c3abf4a9
refactor(agents): 四个存量 system agent 按 27-NAMING §3.4 归位
命名轴是「节点在哪一层图里」,把散落的老 agent 归到它实际所处的层级:
innovator → org-innovator type='cxo',是 org graph 层的节点
hunter → innovator-hunt innovator work graph 第 1 阶段
digester → innovator-digest 第 2 阶段(输入是 hunt 产出)
evolver → innovator-evolver 第 3 阶段
依据:retrain-pipeline.js 的 stepConfigs 就是按 hunter → digester → evolver 顺序
跑的,行 231 明写 steps: ['re_hunt','re_digest','evolve'] —— 这三个本来就是
innovator 的 work graph 三阶段,只是名字没体现出来。
■ 迁移(scripts/migrate-agent-naming.js,--dry-run + 幂等可重跑)
- 8 个目录(system/agents/ + system/templates/),用 git mv 保留历史
- system_agents 表 4 行的 id 与 legacy_path
- 公司实例目录与 company.json.agents[](本次无公司雇过这四个,实际 0 条)
■ 代码引用点(5 处,手工改)
- retrain-pipeline.js: stepConfigs 的 agent 字段 ×3、agentToStep 映射的 key ×3、
call_sub_agent 的 evolver 判断
- agent-chat.js: agent 列表过滤里的 innovator
- company.js: 模板训练触发的 agentId
■ 刻意不动的三类同形异义(改了会坏)
1. skill 内部子目录名 {skillDir}/hunter/knowhow.md —— 那是 hunt/digest/evolve
三阶段的产物目录约定,与 agent 名同形但不同义。涉及 open-api.js:402、
retrain-pipeline.js:148/374、evolution-loop.js:178、sync-skills.js 的 INTERNAL_DIRS
2. skill 命名空间白名单 —— skill-dir-manager.js 的 CORE_SKILLS、
migrate-trained-skills.js 的 SYSTEM_SKILLS,那里的 'innovator' 指同名 skill
3. conversations/ 与 system/tasklog/ 下的历史记录 —— 运行态数据,不改写历史
evolver-youtube-crawler 按 §3.4 列为待定,迁移脚本按精确目录名匹配,未误伤。
这四个重命名顺带解决了 27 号文档 §七 挂了很久的 6 个命名冲突 id —— 重命名后
system/agents/ 与 system/templates/ 下不再有同名目录(只剩 agent-creator 与
evolver-youtube-crawler 两个,前者是基础设施角色按规则不改名)。
验证:npm run test:unit 693 全绿(64 files);test-company-e2e 114/114;
迁移脚本二次执行 dirs=0 dbRows=0 skipped=8(幂等)。
未触碰另一进程正在进行的 P3 文件(graph-engine.js / graph-run-sse.js /
work-graph-db.js / 27-p3-p4-work-graph-console.md / 27-requirement.md)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Showing
138 changed files
with
176 additions
and
10 deletions
Too many changes.
To preserve performance only 100 of 138 files are displayed.
docs/todo/system-design/27-naming-conventions.md
| @@ -110,7 +110,17 @@ ops.json org-planner → org-monitor → org-validator | @@ -110,7 +110,17 @@ ops.json org-planner → org-monitor → org-validator | ||
| 110 | - `agent-creator`:与 `orggraph-planning` 同属**基础设施角色**,不是任何图上的节点,不加前缀,保持原名。 | 110 | - `agent-creator`:与 `orggraph-planning` 同属**基础设施角色**,不是任何图上的节点,不加前缀,保持原名。 |
| 111 | - `evolver-youtube-crawler`:针对单个 skill 特化的 evolver 实例,按规则应为 `innovator-evolver-youtube-crawler`,名字过长且疑似一次性产物,**待定**,暂不改名。 | 111 | - `evolver-youtube-crawler`:针对单个 skill 特化的 evolver 实例,按规则应为 `innovator-evolver-youtube-crawler`,名字过长且疑似一次性产物,**待定**,暂不改名。 |
| 112 | 112 | ||
| 113 | -> ⚠️ §3.4 的四个重命名**尚未落到代码**,需要一次迁移(目录改名 + `system_agents` 表 + `retrain-pipeline.js` 等引用点)。§3.1-3.3 的新命名已应用于文档与 `system/org-graph-templates/`。 | 113 | +> ✅ §3.4 的四个重命名**已落到代码**(`scripts/migrate-agent-naming.js`,幂等可重跑): |
| 114 | +> 8 个目录(`system/agents/` + `system/templates/`)、`system_agents` 表 4 行、 | ||
| 115 | +> 以及 5 处代码引用点(`retrain-pipeline.js` 的 `agent:` 字段 / `agentToStep` 映射 / | ||
| 116 | +> `call_sub_agent` 判断、`agent-chat.js` 的 agent 列表过滤、`company.js` 的训练触发)。 | ||
| 117 | +> | ||
| 118 | +> **迁移时明确不动的东西**(改了会坏): | ||
| 119 | +> - skill 内部子目录名 `{skillDir}/hunter/knowhow.md` —— 那是 hunt/digest/evolve | ||
| 120 | +> 三阶段的**产物目录**约定,与 agent 名同形但不同义 | ||
| 121 | +> - skill 命名空间的白名单(`skill-dir-manager.js` 的 `CORE_SKILLS`、 | ||
| 122 | +> `migrate-trained-skills.js` 的 `SYSTEM_SKILLS`)—— 那里的 `innovator` 指同名 skill | ||
| 123 | +> - `conversations/` 与 `system/tasklog/` 下的历史记录 —— 运行态数据,不改写历史 | ||
| 114 | 124 | ||
| 115 | ### 3.5 归因类节点 —— `validator-reflection`(R-16,两处待定案) | 125 | ### 3.5 归因类节点 —— `validator-reflection`(R-16,两处待定案) |
| 116 | 126 |
scripts/migrate-agent-naming.js
0 → 100644
| 1 | +#!/usr/bin/env node | ||
| 2 | +/** | ||
| 3 | + * migrate-agent-naming.js — 存量 system agent 按 27-NAMING §3.4 归位 | ||
| 4 | + * | ||
| 5 | + * 依据: docs/todo/system-design/27-naming-conventions.md §3.4(R-15.3 定案) | ||
| 6 | + * 命名轴是「节点在哪一层图里」,把散落的老 agent 归到它实际所处的层级: | ||
| 7 | + * | ||
| 8 | + * innovator → org-innovator type='cxo',是 org graph 层的节点 | ||
| 9 | + * hunter → innovator-hunt retrain-pipeline.js:161,innovator work graph 第 1 阶段 | ||
| 10 | + * digester → innovator-digest 同上第 2 阶段(行 179,输入是 hunter 产出) | ||
| 11 | + * evolver → innovator-evolver 同上第 3 阶段(行 196) | ||
| 12 | + * | ||
| 13 | + * 迁移内容: | ||
| 14 | + * 目录 system/agents/{旧}/ → system/agents/{新}/ | ||
| 15 | + * system/templates/{旧}/ → system/templates/{新}/ | ||
| 16 | + * DB system_agents 的 id 与 legacy_path | ||
| 17 | + * 实例 data/companies/*\/agents/{旧}/ 与 company.json.agents[](若有公司雇过) | ||
| 18 | + * | ||
| 19 | + * ⚠️ 明确不动的东西(改了会坏): | ||
| 20 | + * - skill 内部子目录名 `{skillDir}/hunter/knowhow.md` —— 那是 hunt/digest/evolve | ||
| 21 | + * 三阶段的产物目录约定,不是 agent 名(open-api.js:402、retrain-pipeline.js:148/374、 | ||
| 22 | + * evolution-loop.js:178、sync-skills.js:62 的 INTERNAL_DIRS 等) | ||
| 23 | + * - skill 命名空间的白名单 —— skill-dir-manager.js 的 CORE_SKILLS、 | ||
| 24 | + * migrate-trained-skills.js 的 SYSTEM_SKILLS,那里的 'innovator' 指的是同名 skill | ||
| 25 | + * - `evolver-youtube-crawler` —— 27-NAMING §3.4 列为待定,按精确目录名匹配,不会误伤 | ||
| 26 | + * - conversations/ 与 system/tasklog/ 下的历史记录 —— 运行态数据,不改写历史 | ||
| 27 | + * | ||
| 28 | + * 用法: | ||
| 29 | + * node scripts/migrate-agent-naming.js --dry-run | ||
| 30 | + * node scripts/migrate-agent-naming.js | ||
| 31 | + * | ||
| 32 | + * 幂等: 已迁移过(新名存在且旧名不存在)会被跳过,可重复执行。 | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | +const fs = require('fs'); | ||
| 36 | +const path = require('path'); | ||
| 37 | +const { execFileSync } = require('child_process'); | ||
| 38 | + | ||
| 39 | +const ROOT = path.resolve(__dirname, '..'); | ||
| 40 | +const DRY = process.argv.includes('--dry-run'); | ||
| 41 | + | ||
| 42 | +/** 旧名 → 新名。顺序无关,全部按精确名匹配,不做前缀/正则匹配。 */ | ||
| 43 | +const RENAMES = { | ||
| 44 | + innovator: 'org-innovator', | ||
| 45 | + hunter: 'innovator-hunt', | ||
| 46 | + digester: 'innovator-digest', | ||
| 47 | + evolver: 'innovator-evolver', | ||
| 48 | +}; | ||
| 49 | + | ||
| 50 | +const log = (...a) => console.log(DRY ? '[dry-run]' : '[migrate]', ...a); | ||
| 51 | +const stats = { dirs: 0, dbRows: 0, companyInstances: 0, skipped: 0 }; | ||
| 52 | + | ||
| 53 | +/** 用 git mv 保留历史;不在 git 索引里的目录退回 fs.renameSync */ | ||
| 54 | +function moveDir(from, to) { | ||
| 55 | + if (DRY) return; | ||
| 56 | + try { | ||
| 57 | + execFileSync('git', ['mv', from, to], { cwd: ROOT, stdio: 'pipe' }); | ||
| 58 | + } catch { | ||
| 59 | + fs.renameSync(path.join(ROOT, from), path.join(ROOT, to)); | ||
| 60 | + } | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +function migrateDirs() { | ||
| 64 | + for (const [oldName, newName] of Object.entries(RENAMES)) { | ||
| 65 | + for (const base of ['system/agents', 'system/templates']) { | ||
| 66 | + const from = `${base}/${oldName}`; | ||
| 67 | + const to = `${base}/${newName}`; | ||
| 68 | + const fromAbs = path.join(ROOT, from); | ||
| 69 | + const toAbs = path.join(ROOT, to); | ||
| 70 | + | ||
| 71 | + if (!fs.existsSync(fromAbs)) { | ||
| 72 | + if (fs.existsSync(toAbs)) { stats.skipped++; } // 已迁移过 | ||
| 73 | + continue; | ||
| 74 | + } | ||
| 75 | + if (fs.existsSync(toAbs)) { | ||
| 76 | + log(`⚠️ 跳过(新旧同时存在,需人工处理): ${from} / ${to}`); | ||
| 77 | + stats.skipped++; | ||
| 78 | + continue; | ||
| 79 | + } | ||
| 80 | + log(`目录: ${from} → ${to}`); | ||
| 81 | + moveDir(from, to); | ||
| 82 | + stats.dirs++; | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +function migrateDb() { | ||
| 88 | + const { getDb } = require(path.join(ROOT, 'server/services/graph-db')); | ||
| 89 | + const db = getDb(); | ||
| 90 | + const sel = db.prepare('SELECT id, legacy_path FROM system_agents WHERE id = ?'); | ||
| 91 | + const upd = db.prepare('UPDATE system_agents SET id = ?, legacy_path = ?, updated_at = ? WHERE id = ?'); | ||
| 92 | + const now = new Date().toISOString(); | ||
| 93 | + | ||
| 94 | + const tx = db.transaction(() => { | ||
| 95 | + for (const [oldName, newName] of Object.entries(RENAMES)) { | ||
| 96 | + const row = sel.get(oldName); | ||
| 97 | + if (!row) continue; | ||
| 98 | + const newPath = (row.legacy_path || '').replace( | ||
| 99 | + new RegExp(`(^|/)${oldName}$`), `$1${newName}` | ||
| 100 | + ); | ||
| 101 | + log(`DB: system_agents ${oldName} → ${newName}(legacy_path: ${row.legacy_path} → ${newPath})`); | ||
| 102 | + if (!DRY) upd.run(newName, newPath, now, oldName); | ||
| 103 | + stats.dbRows++; | ||
| 104 | + } | ||
| 105 | + }); | ||
| 106 | + tx(); | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +/** 有公司雇过这四个的话,同步改私有目录名与 company.json.agents[] */ | ||
| 110 | +function migrateCompanyInstances() { | ||
| 111 | + const companiesDir = path.join(ROOT, 'data/companies'); | ||
| 112 | + if (!fs.existsSync(companiesDir)) return; | ||
| 113 | + | ||
| 114 | + for (const d of fs.readdirSync(companiesDir, { withFileTypes: true })) { | ||
| 115 | + if (!d.isDirectory()) continue; | ||
| 116 | + const cid = d.name; | ||
| 117 | + | ||
| 118 | + for (const [oldName, newName] of Object.entries(RENAMES)) { | ||
| 119 | + const from = path.join(companiesDir, cid, 'agents', oldName); | ||
| 120 | + const to = path.join(companiesDir, cid, 'agents', newName); | ||
| 121 | + if (!fs.existsSync(from) || fs.existsSync(to)) continue; | ||
| 122 | + log(`实例: ${cid}/agents/${oldName} → ${newName}`); | ||
| 123 | + if (!DRY) fs.renameSync(from, to); | ||
| 124 | + stats.companyInstances++; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + const cjPath = path.join(companiesDir, cid, 'company.json'); | ||
| 128 | + if (!fs.existsSync(cjPath)) continue; | ||
| 129 | + let cj; | ||
| 130 | + try { cj = JSON.parse(fs.readFileSync(cjPath, 'utf-8')); } catch { continue; } | ||
| 131 | + if (!Array.isArray(cj.agents)) continue; | ||
| 132 | + | ||
| 133 | + const next = cj.agents.map(a => RENAMES[a] || a); | ||
| 134 | + if (JSON.stringify(next) !== JSON.stringify(cj.agents)) { | ||
| 135 | + log(`实例: ${cid}/company.json agents[] 已更新`); | ||
| 136 | + if (!DRY) { | ||
| 137 | + cj.agents = next; | ||
| 138 | + fs.writeFileSync(cjPath, JSON.stringify(cj, null, 2) + '\n', 'utf-8'); | ||
| 139 | + } | ||
| 140 | + } | ||
| 141 | + } | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +function main() { | ||
| 145 | + log(DRY ? '=== DRY RUN(不写盘)===' : '=== 开始迁移 ==='); | ||
| 146 | + migrateDirs(); | ||
| 147 | + migrateDb(); | ||
| 148 | + migrateCompanyInstances(); | ||
| 149 | + console.log('\n' + (DRY ? '[dry-run] ' : '') + '汇总:', JSON.stringify(stats)); | ||
| 150 | + if (DRY) console.log('这是 dry-run,未做任何改动。去掉 --dry-run 实际执行。'); | ||
| 151 | + else console.log('完成。代码引用点(retrain-pipeline.js / agent-chat.js / company.js)需另行修改,见 27-NAMING §3.4。'); | ||
| 152 | +} | ||
| 153 | + | ||
| 154 | +if (require.main === module) main(); | ||
| 155 | + | ||
| 156 | +module.exports = { RENAMES }; |
server/routes/agent-chat.js
| @@ -324,7 +324,7 @@ function buildSystemPrompt(agentDir, userMessage) { | @@ -324,7 +324,7 @@ function buildSystemPrompt(agentDir, userMessage) { | ||
| 324 | 324 | ||
| 325 | // ── Layer 3: Agent 专属文件 ── | 325 | // ── Layer 3: Agent 专属文件 ── |
| 326 | const agentListText = Object.entries(fullSystemConfig.agents || {}) | 326 | const agentListText = Object.entries(fullSystemConfig.agents || {}) |
| 327 | - .filter(([name]) => name !== 'master' && name !== 'innovator') | 327 | + .filter(([name]) => name !== 'master' && name !== 'org-innovator') |
| 328 | .map(([name, cfg]) => { | 328 | .map(([name, cfg]) => { |
| 329 | const typeLabel = cfg.type === 'orchestrator' ? '子编排' : cfg.type; | 329 | const typeLabel = cfg.type === 'orchestrator' ? '子编排' : cfg.type; |
| 330 | return `- ${name} (${typeLabel}): ${cfg.description || ''}`; | 330 | return `- ${name} (${typeLabel}): ${cfg.description || ''}`; |
server/routes/company.js
| @@ -522,7 +522,7 @@ router.get('/templates/:templateId/logs', (req, res) => { | @@ -522,7 +522,7 @@ router.get('/templates/:templateId/logs', (req, res) => { | ||
| 522 | // 扫描 agent-creator 和 innovator 的对话,匹配 tpl-gen-{id} 和 tpl-train-{id} | 522 | // 扫描 agent-creator 和 innovator 的对话,匹配 tpl-gen-{id} 和 tpl-train-{id} |
| 523 | const scanAgents = [ | 523 | const scanAgents = [ |
| 524 | { agentId: 'agent-creator', prefix: `tpl-gen-${templateId}`, type: 'generate', label: '🤖 Agent Creator' }, | 524 | { agentId: 'agent-creator', prefix: `tpl-gen-${templateId}`, type: 'generate', label: '🤖 Agent Creator' }, |
| 525 | - { agentId: 'innovator', prefix: `tpl-train-${templateId}`, type: 'train', label: '🎓 Innovator' }, | 525 | + { agentId: 'org-innovator', prefix: `tpl-train-${templateId}`, type: 'train', label: '🎓 Innovator' }, |
| 526 | ]; | 526 | ]; |
| 527 | 527 | ||
| 528 | for (const scan of scanAgents) { | 528 | for (const scan of scanAgents) { |
server/services/retrain-pipeline.js
| @@ -158,7 +158,7 @@ class RetrainPipeline { | @@ -158,7 +158,7 @@ class RetrainPipeline { | ||
| 158 | label: '🔍 Step 1/3: ReHunt', | 158 | label: '🔍 Step 1/3: ReHunt', |
| 159 | jobStatus: 'hunting', | 159 | jobStatus: 'hunting', |
| 160 | jobProgress: '正在猎取领域知识 (Hunt)...', | 160 | jobProgress: '正在猎取领域知识 (Hunt)...', |
| 161 | - agent: 'hunter', | 161 | + agent: 'innovator-hunt', |
| 162 | prompt: [ | 162 | prompt: [ |
| 163 | `请对 Skill "${this.skillName}" 重新猎取领域知识:`, | 163 | `请对 Skill "${this.skillName}" 重新猎取领域知识:`, |
| 164 | `- Skill 描述: ${this.skill.description || '无'}`, | 164 | `- Skill 描述: ${this.skill.description || '无'}`, |
| @@ -176,7 +176,7 @@ class RetrainPipeline { | @@ -176,7 +176,7 @@ class RetrainPipeline { | ||
| 176 | label: '📝 Step 2/3: ReDigest', | 176 | label: '📝 Step 2/3: ReDigest', |
| 177 | jobStatus: 'digesting', | 177 | jobStatus: 'digesting', |
| 178 | jobProgress: '正在消化提炼知识 (Digest)...', | 178 | jobProgress: '正在消化提炼知识 (Digest)...', |
| 179 | - agent: 'digester', | 179 | + agent: 'innovator-digest', |
| 180 | prompt: [ | 180 | prompt: [ |
| 181 | `请对 Skill "${this.skillName}" 重新消化并更新评估基准:`, | 181 | `请对 Skill "${this.skillName}" 重新消化并更新评估基准:`, |
| 182 | `- 更新后的知识: ${this.skillName}/hunter/knowhow.md`, | 182 | `- 更新后的知识: ${this.skillName}/hunter/knowhow.md`, |
| @@ -193,7 +193,7 @@ class RetrainPipeline { | @@ -193,7 +193,7 @@ class RetrainPipeline { | ||
| 193 | label: '🔄 Step 3/3: Evolve', | 193 | label: '🔄 Step 3/3: Evolve', |
| 194 | jobStatus: 'evolving', | 194 | jobStatus: 'evolving', |
| 195 | jobProgress: '进化优化中 (目标 ≥95分)...', | 195 | jobProgress: '进化优化中 (目标 ≥95分)...', |
| 196 | - agent: 'evolver', | 196 | + agent: 'innovator-evolver', |
| 197 | prompt: [ | 197 | prompt: [ |
| 198 | `请对 Skill "${this.skillName}" 进行进化优化:`, | 198 | `请对 Skill "${this.skillName}" 进行进化优化:`, |
| 199 | `- skillName: ${this.skillName}`, | 199 | `- skillName: ${this.skillName}`, |
| @@ -440,9 +440,9 @@ class RetrainPipeline { | @@ -440,9 +440,9 @@ class RetrainPipeline { | ||
| 440 | // 同步 checkpoint — 当 Master 调用 call_sub_agent 时更新 | 440 | // 同步 checkpoint — 当 Master 调用 call_sub_agent 时更新 |
| 441 | if (tc.tool === 'call_sub_agent') { | 441 | if (tc.tool === 'call_sub_agent') { |
| 442 | const agentToStep = { | 442 | const agentToStep = { |
| 443 | - 'hunter': 're_hunt', | ||
| 444 | - 'digester': 're_digest', | ||
| 445 | - 'evolver': 'evolve', | 443 | + 'innovator-hunt': 're_hunt', |
| 444 | + 'innovator-digest': 're_digest', | ||
| 445 | + 'innovator-evolver': 'evolve', | ||
| 446 | }; | 446 | }; |
| 447 | const step = agentToStep[tc.params?.agent]; | 447 | const step = agentToStep[tc.params?.agent]; |
| 448 | if (step) { | 448 | if (step) { |
| @@ -469,7 +469,7 @@ class RetrainPipeline { | @@ -469,7 +469,7 @@ class RetrainPipeline { | ||
| 469 | // 也检查 tool call 结果中的分数 | 469 | // 也检查 tool call 结果中的分数 |
| 470 | if (!finalScore && result.toolCalls) { | 470 | if (!finalScore && result.toolCalls) { |
| 471 | for (const tc of result.toolCalls) { | 471 | for (const tc of result.toolCalls) { |
| 472 | - if (tc.tool === 'call_sub_agent' && tc.params?.agent === 'evolver') { | 472 | + if (tc.tool === 'call_sub_agent' && tc.params?.agent === 'innovator-evolver') { |
| 473 | const evolveOutput = tc.result?.output || ''; | 473 | const evolveOutput = tc.result?.output || ''; |
| 474 | const sm = evolveOutput.match(/最终分数[::]\s*(\d+)/); | 474 | const sm = evolveOutput.match(/最终分数[::]\s*(\d+)/); |
| 475 | if (sm) finalScore = parseInt(sm[1]); | 475 | if (sm) finalScore = parseInt(sm[1]); |
system/agents/digester/agent.md renamed to system/agents/innovator-digest/agent.md
system/agents/digester/config.json renamed to system/agents/innovator-digest/config.json
system/agents/digester/heartbeat.md renamed to system/agents/innovator-digest/heartbeat.md
system/agents/digester/identity.md renamed to system/agents/innovator-digest/identity.md
system/agents/digester/plan.md renamed to system/agents/innovator-digest/plan.md
system/agents/digester/soul.md renamed to system/agents/innovator-digest/soul.md
system/agents/digester/todo.md renamed to system/agents/innovator-digest/todo.md
system/agents/digester/tools.md renamed to system/agents/innovator-digest/tools.md
system/agents/digester/user.md renamed to system/agents/innovator-digest/user.md
system/agents/evolver/agent.md renamed to system/agents/innovator-evolver/agent.md
system/agents/evolver/config.json renamed to system/agents/innovator-evolver/config.json
system/agents/evolver/debug_rubric.js renamed to system/agents/innovator-evolver/debug_rubric.js
system/agents/evolver/heartbeat.md renamed to system/agents/innovator-evolver/heartbeat.md
system/agents/evolver/identity.md renamed to system/agents/innovator-evolver/identity.md
system/agents/evolver/soul.md renamed to system/agents/innovator-evolver/soul.md
system/agents/evolver/tasks/task_youtube_1775225752.json renamed to system/agents/innovator-evolver/tasks/task_youtube_1775225752.json
system/agents/evolver/todo.md renamed to system/agents/innovator-evolver/todo.md
system/agents/evolver/tools.md renamed to system/agents/innovator-evolver/tools.md
system/agents/evolver/user.md renamed to system/agents/innovator-evolver/user.md
system/agents/hunter/agent.md renamed to system/agents/innovator-hunt/agent.md
system/agents/hunter/collect_seed.js renamed to system/agents/innovator-hunt/collect_seed.js
system/agents/hunter/config.json renamed to system/agents/innovator-hunt/config.json
system/agents/hunter/heartbeat.md renamed to system/agents/innovator-hunt/heartbeat.md
system/agents/hunter/identity.md renamed to system/agents/innovator-hunt/identity.md
system/agents/hunter/seed_data.json renamed to system/agents/innovator-hunt/seed_data.json
system/agents/hunter/soul.md renamed to system/agents/innovator-hunt/soul.md
system/agents/hunter/system/templates/trend-scout-global/train/hunt/seed_data.json renamed to system/agents/innovator-hunt/system/templates/trend-scout-global/train/hunt/seed_data.json
system/agents/hunter/todo.md renamed to system/agents/innovator-hunt/todo.md
system/agents/hunter/tools.md renamed to system/agents/innovator-hunt/tools.md
system/agents/hunter/user.md renamed to system/agents/innovator-hunt/user.md
system/agents/innovator/.claude/scheduled_tasks.json renamed to system/agents/org-innovator/.claude/scheduled_tasks.json
system/agents/innovator/agent.md renamed to system/agents/org-innovator/agent.md
system/agents/innovator/agent_data/story-architect/hunt/interactive_drama.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/interactive_drama.md
system/agents/innovator/agent_data/story-architect/hunt/knowhow.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/knowhow.md
system/agents/innovator/agent_data/story-architect/hunt/resurgence_business.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/resurgence_business.md
system/agents/innovator/agent_data/story-architect/hunt/suspense_inference.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/suspense_inference.md
system/agents/innovator/agent_data/story-architect/hunt/sweet_romance.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/sweet_romance.md
system/agents/innovator/agent_data/story-architect/hunt/toplist.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/toplist.md
system/agents/innovator/agent_data/story-architect/hunt/xianxia_cultivation.md renamed to system/agents/org-innovator/agent_data/story-architect/hunt/xianxia_cultivation.md
system/agents/innovator/config.json renamed to system/agents/org-innovator/config.json
system/agents/innovator/cron.json renamed to system/agents/org-innovator/cron.json
system/agents/innovator/docs/SKILL.md renamed to system/agents/org-innovator/docs/SKILL.md
system/agents/innovator/docs/benchmark_template.md renamed to system/agents/org-innovator/docs/benchmark_template.md
system/agents/innovator/docs/crawl_runner_template.py renamed to system/agents/org-innovator/docs/crawl_runner_template.py
system/agents/innovator/docs/evolving_log_template.md renamed to system/agents/org-innovator/docs/evolving_log_template.md
system/agents/innovator/docs/l1-api-request/SKILL.md renamed to system/agents/org-innovator/docs/l1-api-request/SKILL.md
system/agents/innovator/docs/l1-data-extract/SKILL.md renamed to system/agents/org-innovator/docs/l1-data-extract/SKILL.md
system/agents/innovator/docs/l1-diff-checker/SKILL.md renamed to system/agents/org-innovator/docs/l1-diff-checker/SKILL.md
system/agents/innovator/docs/l1-file-read/SKILL.md renamed to system/agents/org-innovator/docs/l1-file-read/SKILL.md
system/agents/innovator/docs/l1-kv-store/SKILL.md renamed to system/agents/org-innovator/docs/l1-kv-store/SKILL.md
system/agents/innovator/docs/l1-search-engine/SKILL.md renamed to system/agents/org-innovator/docs/l1-search-engine/SKILL.md
system/agents/innovator/docs/l1-shell-exec/SKILL.md renamed to system/agents/org-innovator/docs/l1-shell-exec/SKILL.md
system/agents/innovator/docs/l1-text-transform/SKILL.md renamed to system/agents/org-innovator/docs/l1-text-transform/SKILL.md
system/agents/innovator/docs/l1-web-fetch/SKILL.md renamed to system/agents/org-innovator/docs/l1-web-fetch/SKILL.md
system/agents/innovator/docs/l1-webhook-push/SKILL.md renamed to system/agents/org-innovator/docs/l1-webhook-push/SKILL.md
system/agents/innovator/docs/l2-web-research/SKILL.md renamed to system/agents/org-innovator/docs/l2-web-research/SKILL.md
system/agents/innovator/docs/meta_benchmark/SKILL.md renamed to system/agents/org-innovator/docs/meta_benchmark/SKILL.md
system/agents/innovator/docs/meta_creator/SKILL.md renamed to system/agents/org-innovator/docs/meta_creator/SKILL.md
system/agents/innovator/docs/meta_digest/SKILL.md renamed to system/agents/org-innovator/docs/meta_digest/SKILL.md
system/agents/innovator/docs/meta_evolving/SKILL.md renamed to system/agents/org-innovator/docs/meta_evolving/SKILL.md
system/agents/innovator/docs/meta_hunt/SKILL.md renamed to system/agents/org-innovator/docs/meta_hunt/SKILL.md
system/agents/innovator/docs/meta_research/SKILL.md renamed to system/agents/org-innovator/docs/meta_research/SKILL.md
system/agents/innovator/docs/skill_list_template.md renamed to system/agents/org-innovator/docs/skill_list_template.md
system/agents/innovator/heartbeat.md renamed to system/agents/org-innovator/heartbeat.md
system/agents/innovator/identity.md renamed to system/agents/org-innovator/identity.md
system/agents/innovator/plan.md renamed to system/agents/org-innovator/plan.md
system/agents/innovator/soul.md renamed to system/agents/org-innovator/soul.md
system/agents/innovator/todo.md renamed to system/agents/org-innovator/todo.md
system/agents/innovator/tools.md renamed to system/agents/org-innovator/tools.md
system/agents/innovator/user.md renamed to system/agents/org-innovator/user.md
system/templates/digester/SKILL.md renamed to system/templates/innovator-digest/SKILL.md
system/templates/digester/agent.md renamed to system/templates/innovator-digest/agent.md
system/templates/digester/config.json renamed to system/templates/innovator-digest/config.json
system/templates/digester/heartbeat.md renamed to system/templates/innovator-digest/heartbeat.md
system/templates/digester/identity.md renamed to system/templates/innovator-digest/identity.md
system/templates/digester/plan.md renamed to system/templates/innovator-digest/plan.md
system/templates/digester/soul.md renamed to system/templates/innovator-digest/soul.md
system/templates/digester/todo.md renamed to system/templates/innovator-digest/todo.md
system/templates/digester/tools.md renamed to system/templates/innovator-digest/tools.md
system/templates/digester/train/digest/benchmark_v1.md renamed to system/templates/innovator-digest/train/digest/benchmark_v1.md
system/templates/digester/train/digest/industry_avg_score.md renamed to system/templates/innovator-digest/train/digest/industry_avg_score.md
system/templates/digester/train/digest/test.jsonl renamed to system/templates/innovator-digest/train/digest/test.jsonl
system/templates/digester/train/digest/train.jsonl renamed to system/templates/innovator-digest/train/digest/train.jsonl
system/templates/digester/train/evolve/evolve_report.md renamed to system/templates/innovator-digest/train/evolve/evolve_report.md
system/templates/digester/train/evolve/scorer.js renamed to system/templates/innovator-digest/train/evolve/scorer.js
system/templates/digester/train/hunt/crawl_config.json renamed to system/templates/innovator-digest/train/hunt/crawl_config.json
system/templates/digester/train/hunt/knowhow_v1.md renamed to system/templates/innovator-digest/train/hunt/knowhow_v1.md
system/templates/digester/train/hunt/seed_data.json renamed to system/templates/innovator-digest/train/hunt/seed_data.json
system/templates/digester/user.md renamed to system/templates/innovator-digest/user.md
system/templates/evolver/agent.md renamed to system/templates/innovator-evolver/agent.md
system/templates/evolver/config.json renamed to system/templates/innovator-evolver/config.json
system/templates/evolver/identity.md renamed to system/templates/innovator-evolver/identity.md
system/templates/evolver/soul.md renamed to system/templates/innovator-evolver/soul.md
system/templates/evolver/todo.md renamed to system/templates/innovator-evolver/todo.md
system/templates/evolver/tools.md renamed to system/templates/innovator-evolver/tools.md