feihong-code 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +486 -405
  2. package/README.md +59 -0
  3. package/dist/agent/code-writer.js +6 -3
  4. package/dist/agent/code-writer.js.map +1 -1
  5. package/dist/agent/experience.js +105 -70
  6. package/dist/agent/experience.js.map +1 -1
  7. package/dist/agent/orchestrator.js +103 -21
  8. package/dist/agent/orchestrator.js.map +1 -1
  9. package/dist/agent/parallel-orchestrator.js +6 -3
  10. package/dist/agent/parallel-orchestrator.js.map +1 -1
  11. package/dist/agent/planner.js +30 -7
  12. package/dist/agent/planner.js.map +1 -1
  13. package/dist/agent/prompts.js +27 -8
  14. package/dist/agent/prompts.js.map +1 -1
  15. package/dist/agent/self-heal.js +43 -13
  16. package/dist/agent/self-heal.js.map +1 -1
  17. package/dist/cli/repl.js +10 -9
  18. package/dist/cli/repl.js.map +1 -1
  19. package/dist/cli/run.js +39 -37
  20. package/dist/cli/run.js.map +1 -1
  21. package/dist/cli/version.js +1 -1
  22. package/dist/enterprise/audit.js +70 -11
  23. package/dist/enterprise/audit.js.map +1 -1
  24. package/dist/models/model-router.js +83 -23
  25. package/dist/models/model-router.js.map +1 -1
  26. package/dist/models/model.dto.js +25 -3
  27. package/dist/models/model.dto.js.map +1 -1
  28. package/dist/models/providers/ollama.provider.js +12 -0
  29. package/dist/models/providers/ollama.provider.js.map +1 -1
  30. package/dist/models/providers/openai-compatible.provider.js +14 -1
  31. package/dist/models/providers/openai-compatible.provider.js.map +1 -1
  32. package/dist/self-evolve/hook.js +2 -2
  33. package/dist/self-evolve/hook.js.map +1 -1
  34. package/dist/self-evolve/hook.ts +80 -0
  35. package/dist/self-evolve/manager.d.ts +8 -0
  36. package/dist/self-evolve/manager.js +401 -0
  37. package/dist/shared/concurrency.js +80 -0
  38. package/dist/shared/concurrency.js.map +1 -0
  39. package/dist/shared/errors.js +6 -2
  40. package/dist/shared/errors.js.map +1 -1
  41. package/dist/shared/secure-store.js +117 -0
  42. package/dist/shared/secure-store.js.map +1 -0
  43. package/dist/tools/mcp/mcp-client.js +35 -13
  44. package/dist/tools/mcp/mcp-client.js.map +1 -1
  45. package/dist/tools/shell/exec.js +47 -3
  46. package/dist/tools/shell/exec.js.map +1 -1
  47. package/dist/tools/shell/run-shell.tool.js +33 -6
  48. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  49. package/dist/tools/tool.registry.js +32 -0
  50. package/dist/tools/tool.registry.js.map +1 -1
  51. package/dist/web/auth.js +143 -7
  52. package/dist/web/auth.js.map +1 -1
  53. package/dist/web/public/css/style.css +1546 -0
  54. package/dist/web/public/index.html +806 -3253
  55. package/dist/web/public/js/api.js +309 -0
  56. package/dist/web/public/js/app.js +1483 -0
  57. package/dist/web/public/js/ui.js +764 -0
  58. package/dist/web/public/js/utils.js +214 -0
  59. package/dist/web/server.js +224 -77
  60. package/dist/web/server.js.map +1 -1
  61. package/dist/web/task-queue.js +140 -14
  62. package/dist/web/task-queue.js.map +1 -1
  63. package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +299 -0
  64. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +554 -0
  65. package/docs/SELF-EVOLVE-GUIDE.md +313 -0
  66. package/docs/error-codes.md +198 -0
  67. package/docs/screenshots/cli-demo.png +0 -0
  68. package/docs/screenshots/feature-comparison.png +0 -0
  69. package/docs/screenshots/web-console.png +0 -0
  70. package/docs//351/241/265/351/235/242/345/212/237/350/203/275/345/244/215/347/233/230/344/270/216/345/206/222/347/203/237/346/265/213/350/257/225/346/212/245/345/221/212.html +117 -0
  71. package/package.json +9 -15
  72. package/tool-schema.json +198 -127
  73. package/dist/web/public/index.html.tmp +0 -3117
  74. package/dist/web/public/index_new.html +0 -3196
@@ -44,14 +44,36 @@ exports.ollamaChatResponseSchema = zod_1.z.object({
44
44
  prompt_eval_count: zod_1.z.number().optional(),
45
45
  eval_count: zod_1.z.number().optional(),
46
46
  });
47
- /** 将模型返回的工具参数(可能是 JSON 字符串或对象)归一为对象 */
47
+ /** 将模型返回的工具参数(可能是 JSON 字符串或对象)归一为对象。
48
+ * 对畸形字符串尝试提取 JSON(处理 markdown 代码块、前后多余文本等),
49
+ * 仍失败时返回 { __parse_error__: raw } 让上游能感知并给模型反馈,而非静默 {}。 */
48
50
  function parseToolArgs(raw) {
49
51
  if (typeof raw === 'string') {
52
+ const trimmed = raw.trim();
53
+ // 1. 直接解析
50
54
  try {
51
- return JSON.parse(raw);
55
+ return JSON.parse(trimmed);
52
56
  }
53
57
  catch {
54
- return {};
58
+ // 2. 尝试从 markdown 代码块中提取
59
+ const codeBlockMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i);
60
+ if (codeBlockMatch) {
61
+ try {
62
+ return JSON.parse(codeBlockMatch[1].trim());
63
+ }
64
+ catch { /* fall through */ }
65
+ }
66
+ // 3. 尝试提取第一个 { ... } 块
67
+ const objMatch = trimmed.match(/\{[\s\S]*\}/);
68
+ if (objMatch) {
69
+ try {
70
+ return JSON.parse(objMatch[0]);
71
+ }
72
+ catch { /* fall through */ }
73
+ }
74
+ // 4. 全部失败:保留原始文本供上游警告,不静默丢弃
75
+ console.warn('[parseToolArgs] 无法解析工具参数,保留原始文本', { raw: trimmed.slice(0, 200) });
76
+ return { __parse_error__: trimmed };
55
77
  }
56
78
  }
57
79
  if (raw && typeof raw === 'object')
@@ -1 +1 @@
1
- {"version":3,"file":"model.dto.js","sourceRoot":"","sources":["../../src/models/model.dto.ts"],"names":[],"mappings":";;;AAiDA,sCAUC;AA3DD;;;;;GAKG;AACH,6BAAwB;AAEX,QAAA,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,OAAC;SACV,KAAK,CACJ,OAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,SAAS,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SACpE,CAAC;KACH,CAAC,CACH;SACA,QAAQ,EAAE;IACb,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,OAAC;SACP,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,2BAAmB,EAAE,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;SACvF,GAAG,CAAC,CAAC,CAAC;IACT,KAAK,EAAE,OAAC;SACL,MAAM,CAAC;QACN,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE;QAC7B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;KACzB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,2BAAmB;IAC5B,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,uCAAuC;AACvC,SAAgB,aAAa,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAA8B,CAAC;IAC1E,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"model.dto.js","sourceRoot":"","sources":["../../src/models/model.dto.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,13 @@ class OllamaProvider {
39
39
  if (req.timeoutMs && req.timeoutMs > 0) {
40
40
  timer = setTimeout(() => controller.abort(), req.timeoutMs);
41
41
  }
42
+ const onExternalAbort = () => controller.abort();
43
+ if (req.signal) {
44
+ if (req.signal.aborted)
45
+ controller.abort();
46
+ else
47
+ req.signal.addEventListener('abort', onExternalAbort, { once: true });
48
+ }
42
49
  let res;
43
50
  try {
44
51
  res = await fetch(`${this.baseURL}/api/chat`, {
@@ -49,11 +56,16 @@ class OllamaProvider {
49
56
  });
50
57
  }
51
58
  catch (e) {
59
+ const aborted = controller.signal.aborted;
60
+ if (aborted)
61
+ throw new errors_1.ModelError('任务已被用户中断', this.id);
52
62
  throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
53
63
  }
54
64
  finally {
55
65
  if (timer)
56
66
  clearTimeout(timer);
67
+ if (req.signal)
68
+ req.signal.removeEventListener('abort', onExternalAbort);
57
69
  }
58
70
  if (!res.ok) {
59
71
  const text = await res.text().catch(() => '');
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.provider.js","sourceRoot":"","sources":["../../../src/models/providers/ollama.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.provider.js","sourceRoot":"","sources":["../../../src/models/providers/ollama.provider.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,14 @@ class OpenAICompatibleProvider {
52
52
  if (req.timeoutMs && req.timeoutMs > 0) {
53
53
  timer = setTimeout(() => controller.abort(), req.timeoutMs);
54
54
  }
55
+ // 外部中断信号(任务停止):链接到本地 controller,触发即中断 fetch
56
+ const onExternalAbort = () => controller.abort();
57
+ if (req.signal) {
58
+ if (req.signal.aborted)
59
+ controller.abort();
60
+ else
61
+ req.signal.addEventListener('abort', onExternalAbort, { once: true });
62
+ }
55
63
  let res;
56
64
  try {
57
65
  res = await fetch(`${this.baseURL}/chat/completions`, {
@@ -65,15 +73,20 @@ class OpenAICompatibleProvider {
65
73
  });
66
74
  }
67
75
  catch (e) {
76
+ const aborted = controller.signal.aborted;
77
+ if (aborted)
78
+ throw new errors_1.ModelError('任务已被用户中断', this.id);
68
79
  throw new errors_1.ModelError(`网络请求失败: ${e instanceof Error ? e.message : String(e)}`, this.id);
69
80
  }
70
81
  finally {
71
82
  if (timer)
72
83
  clearTimeout(timer);
84
+ if (req.signal)
85
+ req.signal.removeEventListener('abort', onExternalAbort);
73
86
  }
74
87
  if (!res.ok) {
75
88
  const text = await res.text().catch(() => '');
76
- throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id);
89
+ throw new errors_1.ModelError(`HTTP ${res.status} ${text.slice(0, 200)}`, this.id, res.status);
77
90
  }
78
91
  const json = await res.json().catch(() => undefined);
79
92
  const parsed = model_dto_1.openAIChatResponseSchema.safeParse(json);
@@ -1 +1 @@
1
- {"version":3,"file":"openai-compatible.provider.js","sourceRoot":"","sources":["../../../src/models/providers/openai-compatible.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai-compatible.provider.js","sourceRoot":"","sources":["../../../src/models/providers/openai-compatible.provider.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,gDAAiD;AAIjD,4CAAuE;AACvE,kCAAuC;AAEvC,MAAa,wBAAwB;IAC1B,EAAE,CAAS;IACX,KAAK,CAAS;IACd,IAAI,CAAkB;IACtB,SAAS,CAAS;IACV,OAAO,CAAS;IAChB,MAAM,CAAU;IAEjC,YAAY,GAAmB;QAC7B,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAgB;QACzB,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;iBACnE,CAAC,CAAC;gBACH,YAAY,EAAE,CAAC,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,KAAK,EACH,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAC/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC;oBACpC,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE;iBACjF,CAAC,CAAC;gBACL,CAAC,CAAC,SAAS;YACf,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;YACjC,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;SAClC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,KAAiC,CAAC;QACtC,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC;QACD,4CAA4C;QAC5C,MAAM,eAAe,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACvD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;gBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;;gBACtC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnE;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;YAC1C,IAAI,OAAO;gBAAE,MAAM,IAAI,mBAAU,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACvD,MAAM,IAAI,mBAAU,CAAC,WAAW,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,GAAG,CAAC,MAAM;gBAAE,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,mBAAU,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,IAAI,GAAY,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,oCAAwB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,mBAAU,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK;YAC7B,CAAC,CAAC;gBACE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa;gBAC7C,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB;gBACrD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY;aAC5C;YACH,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAE7D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,SAAS,EAAE,IAAA,yBAAa,EAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;SAChD,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE;YAChF,KAAK;YACL,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAA,mBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;SAC7C,CAAC;IACJ,CAAC;CACF;AA3GD,4DA2GC"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.selfEvolveHook = exports.SelfEvolveHook = void 0;
4
- const manager_js_1 = require("./manager.js");
4
+ const manager_1 = require("./manager");
5
5
  /**
6
6
  * Hook: 任务完成后自动检查是否需要记录失败
7
7
  * 集成到工具调用流程中
@@ -9,7 +9,7 @@ const manager_js_1 = require("./manager.js");
9
9
  class SelfEvolveHook {
10
10
  manager;
11
11
  constructor() {
12
- this.manager = new manager_js_1.SelfEvolveManager();
12
+ this.manager = new manager_1.SelfEvolveManager();
13
13
  this.manager.init();
14
14
  }
15
15
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/self-evolve/hook.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAEjD;;;GAGG;AACH,MAAa,cAAc;IACjB,OAAO,CAAoB;IAEnC;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,8BAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAKb;QACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CACxC,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EACjD,KAAK,EACL,kBAAkB,IAAI,EAAE,CACzB,CAAC;QAEF,aAAa;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEzF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,eAAe;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAId;QACC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,aAAa,CAAC;gBACxB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAtED,wCAsEC;AAED,OAAO;AACM,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/self-evolve/hook.ts"],"names":[],"mappings":";;;AAAA,uCAA8C;AAE9C;;;GAGG;AACH,MAAa,cAAc;IACjB,OAAO,CAAoB;IAEnC;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAKb;QACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CACxC,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EACjD,KAAK,EACL,kBAAkB,IAAI,EAAE,CACzB,CAAC;QAEF,aAAa;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEzF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,eAAe;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAId;QACC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,aAAa,CAAC;gBACxB,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;gBAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAElD,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAtED,wCAsEC;AAED,OAAO;AACM,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { SelfEvolveManager } from './manager';
2
+
3
+ /**
4
+ * Hook: 任务完成后自动检查是否需要记录失败
5
+ * 集成到工具调用流程中
6
+ */
7
+ export class SelfEvolveHook {
8
+ private manager: SelfEvolveManager;
9
+
10
+ constructor() {
11
+ this.manager = new SelfEvolveManager();
12
+ this.manager.init();
13
+ }
14
+
15
+ /**
16
+ * 在工具调用失败时触发
17
+ */
18
+ onToolFailure(context: {
19
+ tool: string,
20
+ input: any,
21
+ error: Error | string,
22
+ attemptedSolutions?: string[]
23
+ }) {
24
+ const { tool, input, error, attemptedSolutions } = context;
25
+
26
+ console.log(`[自我迭代] 检测到工具 ${tool} 调用失败`);
27
+
28
+ const failure = this.manager.recordFailure(
29
+ `${tool}: ${JSON.stringify(input).slice(0, 100)}`,
30
+ error,
31
+ attemptedSolutions || []
32
+ );
33
+
34
+ // 尝试查找已知解决方案
35
+ const solutions = this.manager.searchSolution(failure.error_type, failure.error_message);
36
+
37
+ if (solutions.length > 0) {
38
+ console.log(`[自我迭代] 找到已知解决方案: ${solutions[0].name}`);
39
+ // 这里可以自动应用解决方案
40
+ } else {
41
+ console.log(`[自我迭代] 新问题,建议创建技能解决`);
42
+ }
43
+
44
+ return failure;
45
+ }
46
+
47
+ /**
48
+ * 在任务完成时触发
49
+ */
50
+ onTaskComplete(context: {
51
+ success: boolean,
52
+ task: string,
53
+ error?: Error | string
54
+ }) {
55
+ if (!context.success && context.error) {
56
+ return this.onToolFailure({
57
+ tool: 'task',
58
+ input: { task: context.task },
59
+ error: context.error
60
+ });
61
+ }
62
+ return null;
63
+ }
64
+
65
+ /**
66
+ * 每日自动复盘
67
+ */
68
+ async dailyReview() {
69
+ const report = this.manager.generateDailyReport();
70
+
71
+ if (report.pending > 0) {
72
+ console.warn(`[自我迭代] 今日仍有 ${report.pending} 个未解决问题`);
73
+ }
74
+
75
+ return report;
76
+ }
77
+ }
78
+
79
+ // 导出单例
80
+ export const selfEvolveHook = new SelfEvolveHook();
@@ -0,0 +1,8 @@
1
+ declare class SelfEvolveManager {
2
+ init(): void;
3
+ recordFailure(errorType: string, error: any, attemptedSolutions?: string[]): any;
4
+ searchSolution(errorType: string, errorMessage: string): any[];
5
+ generateDailyReport(): any;
6
+ }
7
+
8
+ export { SelfEvolveManager };
@@ -0,0 +1,401 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Self-Evolve Manager - 自我迭代升级管理器
4
+ * 负责记录失败、创建技能、定期复盘
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const { v4: uuidv4 } = require('uuid');
10
+
11
+ // 确保uuid已安装或实现简单的UUID
12
+ function generateId() {
13
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
14
+ const r = Math.random() * 16 | 0;
15
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
16
+ return v.toString(16);
17
+ });
18
+ }
19
+
20
+ class SelfEvolveManager {
21
+ constructor() {
22
+ this.baseDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.feihong-code', 'self-evolve');
23
+ this.failuresFile = path.join(this.baseDir, 'failures.json');
24
+ this.skillsIndexFile = path.join(this.baseDir, 'skills-index.json');
25
+ this.historyFile = path.join(this.baseDir, 'history.json');
26
+
27
+ this.ensureDirs();
28
+ this.loadData();
29
+ }
30
+
31
+ ensureDirs() {
32
+ if (!fs.existsSync(this.baseDir)) {
33
+ fs.mkdirSync(this.baseDir, { recursive: true });
34
+ }
35
+ // 确保用户技能目录也存在
36
+ const userSkillsDir = path.join(process.env.HOME || process.env.USERPROFILE || '.', '.feihong-code', 'skills');
37
+ if (!fs.existsSync(userSkillsDir)) {
38
+ fs.mkdirSync(userSkillsDir, { recursive: true });
39
+ }
40
+ }
41
+
42
+ loadData() {
43
+ this.failures = this.loadJSON(this.failuresFile, []);
44
+ this.skillsIndex = this.loadJSON(this.skillsIndexFile, []);
45
+ this.history = this.loadJSON(this.historyFile, []);
46
+ }
47
+
48
+ loadJSON(file, defaultValue) {
49
+ try {
50
+ if (fs.existsSync(file)) {
51
+ const content = fs.readFileSync(file, 'utf8');
52
+ return JSON.parse(content);
53
+ }
54
+ } catch (e) {
55
+ console.error(`加载 ${file} 失败:`, e.message);
56
+ }
57
+ return defaultValue;
58
+ }
59
+
60
+ saveData() {
61
+ this.saveJSON(this.failuresFile, this.failures);
62
+ this.saveJSON(this.skillsIndexFile, this.skillsIndex);
63
+ this.saveJSON(this.historyFile, this.history);
64
+ }
65
+
66
+ saveJSON(file, data) {
67
+ try {
68
+ fs.writeFileSync(file, JSON.stringify(data, null, 2), 'utf8');
69
+ } catch (e) {
70
+ console.error(`保存 ${file} 失败:`, e.message);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * 记录任务失败
76
+ */
77
+ recordFailure(task, error, attemptedSolutions = [], rootCause = null) {
78
+ const failure = {
79
+ id: generateId(),
80
+ timestamp: new Date().toISOString(),
81
+ task: task,
82
+ error_type: this.categorizeError(error),
83
+ error_message: typeof error === 'string' ? error : (error?.message || String(error)),
84
+ attempted_solutions: attemptedSolutions,
85
+ root_cause: rootCause || '待分析',
86
+ solution: null,
87
+ created_skill: false,
88
+ skill_name: null,
89
+ status: 'pending'
90
+ };
91
+
92
+ this.failures.push(failure);
93
+ this.history.push({
94
+ type: 'failure',
95
+ timestamp: failure.timestamp,
96
+ failure_id: failure.id
97
+ });
98
+
99
+ this.saveData();
100
+ console.log(`[自我迭代] 记录失败任务 #${failure.id.slice(0, 8)}`);
101
+ return failure;
102
+ }
103
+
104
+ /**
105
+ * 错误分类
106
+ */
107
+ categorizeError(error) {
108
+ const msg = typeof error === 'string' ? error.toLowerCase() : '';
109
+
110
+ if (msg.includes('error ts') || msg.includes('syntax error') || msg.includes('编译')) {
111
+ return 'compile-error';
112
+ }
113
+ if (msg.includes('typeerror') || msg.includes('referenceerror')) {
114
+ return 'runtime-error';
115
+ }
116
+ if (msg.includes('path traversal') || msg.includes('outside workspace')) {
117
+ return 'path-error';
118
+ }
119
+ if (msg.includes('timeout') || msg.includes('etimedout')) {
120
+ return 'timeout';
121
+ }
122
+ if (msg.includes('permission denied') || msg.includes('eacces')) {
123
+ return 'permission-error';
124
+ }
125
+ if (msg.includes('rate limit') || msg.includes('429') || msg.includes('5xx')) {
126
+ return 'api-error';
127
+ }
128
+ return 'unknown';
129
+ }
130
+
131
+ /**
132
+ * 搜索已知解决方案
133
+ */
134
+ searchSolution(errorType, errorMessage) {
135
+ // 先按类型精确匹配
136
+ let matches = this.skillsIndex.filter(s => s.error_pattern === errorType);
137
+
138
+ // 再按关键词模糊匹配
139
+ if (matches.length === 0) {
140
+ const keywords = errorMessage.toLowerCase().split(/\s+/).filter(k => k.length > 3);
141
+ for (const keyword of keywords) {
142
+ matches = this.skillsIndex.filter(s =>
143
+ s.triggers && s.triggers.some(t => t.includes(keyword))
144
+ );
145
+ if (matches.length > 0) break;
146
+ }
147
+ }
148
+
149
+ return matches;
150
+ }
151
+
152
+ /**
153
+ * 标记问题已解决
154
+ */
155
+ markResolved(failureId, solution, skillName = null) {
156
+ const failure = this.failures.find(f => f.id === failureId);
157
+ if (!failure) return null;
158
+
159
+ failure.solution = solution;
160
+ failure.status = 'resolved';
161
+ if (skillName) {
162
+ failure.created_skill = true;
163
+ failure.skill_name = skillName;
164
+ }
165
+
166
+ this.history.push({
167
+ type: 'resolved',
168
+ timestamp: new Date().toISOString(),
169
+ failure_id: failureId,
170
+ solution: solution
171
+ });
172
+
173
+ this.saveData();
174
+ console.log(`[自我迭代] 问题 #${failureId.slice(0, 8)} 已解决`);
175
+ return failure;
176
+ }
177
+
178
+ /**
179
+ * 创建新技能
180
+ */
181
+ createSkill(name, description, triggers, errorPattern, solution) {
182
+ const skill = {
183
+ name,
184
+ description,
185
+ triggers: triggers || [name],
186
+ error_pattern: errorPattern,
187
+ solution,
188
+ created_at: new Date().toISOString(),
189
+ usage_count: 0,
190
+ version: '1.0.0'
191
+ };
192
+
193
+ // 添加到索引
194
+ this.skillsIndex.push(skill);
195
+
196
+ // 创建SKILL.md文件
197
+ this.saveSkillToFile(skill);
198
+
199
+ // 更新相关失败记录
200
+ this.failures.forEach(f => {
201
+ if (f.error_type === errorPattern ||
202
+ (f.error_message && f.error_message.toLowerCase().includes(name.toLowerCase()))) {
203
+ f.solution = `应用技能: ${name}`;
204
+ f.status = 'resolved';
205
+ f.created_skill = true;
206
+ f.skill_name = name;
207
+ }
208
+ });
209
+
210
+ this.history.push({
211
+ type: 'skill_created',
212
+ timestamp: new Date().toISOString(),
213
+ skill_name: name
214
+ });
215
+
216
+ this.saveData();
217
+ console.log(`[自我迭代] 新技能已创建: ${name}`);
218
+ return skill;
219
+ }
220
+
221
+ /**
222
+ * 保存技能到文件
223
+ */
224
+ saveSkillToFile(skill) {
225
+ const skillDir = path.join(
226
+ process.env.HOME || process.env.USERPROFILE || '.',
227
+ '.feihong-code',
228
+ 'skills',
229
+ skill.name
230
+ );
231
+
232
+ if (!fs.existsSync(skillDir)) {
233
+ fs.mkdirSync(skillDir, { recursive: true });
234
+ }
235
+
236
+ const triggersText = skill.triggers ? skill.triggers.join(', ') : skill.name;
237
+ const content = `---
238
+ name: ${skill.name}
239
+ description: ${skill.description}
240
+ triggers: [${triggersText}]
241
+ ---
242
+
243
+ # ${skill.name} 技能
244
+
245
+ **自动创建的解决技能**
246
+
247
+ ## 触发条件
248
+ ${skill.triggers ? skill.triggers.join('\n- ') : skill.name}
249
+
250
+ ## 错误模式
251
+ ${skill.error_pattern}
252
+
253
+ ## 解决方案
254
+ ${skill.solution}
255
+
256
+ ## 创建时间
257
+ ${skill.created_at}
258
+ `;
259
+
260
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content, 'utf8');
261
+ }
262
+
263
+ /**
264
+ * 生成每日复盘报告
265
+ */
266
+ generateDailyReport() {
267
+ const today = new Date().toISOString().split('T')[0];
268
+ const todayFailures = this.failures.filter(f => f.timestamp.startsWith(today));
269
+ const todayResolutions = this.history.filter(h =>
270
+ h.timestamp.startsWith(today) && h.type === 'resolved'
271
+ );
272
+
273
+ const report = {
274
+ date: today,
275
+ total_failures: todayFailures.length,
276
+ resolved: todayResolutions.length,
277
+ pending: todayFailures.filter(f => f.status !== 'resolved').length,
278
+ new_skills: this.history.filter(h =>
279
+ h.timestamp.startsWith(today) && h.type === 'skill_created'
280
+ ).length,
281
+ failures: todayFailures.map(f => ({
282
+ id: f.id.slice(0, 8),
283
+ type: f.error_type,
284
+ message: f.error_message.slice(0, 100),
285
+ status: f.status
286
+ }))
287
+ };
288
+
289
+ // 保存报告
290
+ const reportFile = path.join(this.baseDir, `report-${today}.json`);
291
+ fs.writeFileSync(reportFile, JSON.stringify(report, null, 2));
292
+
293
+ console.log(`[自我迭代] 每日报告已生成: ${today}`);
294
+ console.log(` - 失败任务: ${report.total_failures}`);
295
+ console.log(` - 已解决: ${report.resolved}`);
296
+ console.log(` - 待处理: ${report.pending}`);
297
+ console.log(` - 新技能: ${report.new_skills}`);
298
+
299
+ return report;
300
+ }
301
+
302
+ /**
303
+ * 统计分析
304
+ */
305
+ getStatistics() {
306
+ const totalFailures = this.failures.length;
307
+ const resolved = this.failures.filter(f => f.status === 'resolved').length;
308
+ const byType = {};
309
+
310
+ this.failures.forEach(f => {
311
+ byType[f.error_type] = (byType[f.error_type] || 0) + 1;
312
+ });
313
+
314
+ return {
315
+ total_failures: totalFailures,
316
+ resolved: resolved,
317
+ pending: totalFailures - resolved,
318
+ resolution_rate: totalFailures > 0 ? ((resolved / totalFailures) * 100).toFixed(1) + '%' : '0%',
319
+ by_type: byType,
320
+ total_skills: this.skillsIndex.length,
321
+ history_entries: this.history.length
322
+ };
323
+ }
324
+
325
+ /**
326
+ * 列出所有失败记录
327
+ */
328
+ listFailures(filters = {}) {
329
+ let result = this.failures;
330
+
331
+ if (filters.type) {
332
+ result = result.filter(f => f.error_type === filters.type);
333
+ }
334
+ if (filters.status) {
335
+ result = result.filter(f => f.status === filters.status);
336
+ }
337
+ if (filters.days) {
338
+ const cutoff = new Date(Date.now() - filters.days * 24 * 60 * 60 * 1000);
339
+ result = result.filter(f => new Date(f.timestamp) >= cutoff);
340
+ }
341
+
342
+ return result;
343
+ }
344
+
345
+ /**
346
+ * 列出所有技能
347
+ */
348
+ listSkills() {
349
+ return this.skillsIndex;
350
+ }
351
+
352
+ /**
353
+ * 初始化系统
354
+ */
355
+ init() {
356
+ this.ensureDirs();
357
+ this.loadData();
358
+
359
+ // 创建初始数据文件(如果不存在)
360
+ if (!fs.existsSync(this.failuresFile)) {
361
+ this.saveData();
362
+ }
363
+
364
+ console.log('[自我迭代] 系统已初始化');
365
+ console.log(` - 基础目录: ${this.baseDir}`);
366
+ console.log(` - 失败记录: ${this.failures.length} 条`);
367
+ console.log(` - 技能库: ${this.skillsIndex.length} 个`);
368
+ console.log(` - 历史记录: ${this.history.length} 条`);
369
+ }
370
+ }
371
+
372
+ module.exports = { SelfEvolveManager };
373
+
374
+ // CLI 入口
375
+ if (require.main === module) {
376
+ const manager = new SelfEvolveManager();
377
+ const args = process.argv.slice(2);
378
+
379
+ if (args[0] === 'init') {
380
+ manager.init();
381
+ } else if (args[0] === 'status') {
382
+ console.log(JSON.stringify(manager.getStatistics(), null, 2));
383
+ } else if (args[0] === 'failures' && args[1] === 'list') {
384
+ const filters = {};
385
+ if (args[2] === '--type' && args[3]) filters.type = args[3];
386
+ if (args[2] === '--days' && args[3]) filters.days = parseInt(args[3]);
387
+ console.log(JSON.stringify(manager.listFailures(filters), null, 2));
388
+ } else if (args[0] === 'skills' && args[1] === 'list') {
389
+ console.log(JSON.stringify(manager.listSkills(), null, 2));
390
+ } else if (args[0] === 'review' && args[1] === '--daily') {
391
+ manager.generateDailyReport();
392
+ } else {
393
+ console.log('自我迭代管理系统');
394
+ console.log('用法:');
395
+ console.log(' self-evolve init - 初始化系统');
396
+ console.log(' self-evolve status - 查看统计');
397
+ console.log(' self-evolve failures list - 列出失败');
398
+ console.log(' self-evolve skills list - 列出技能');
399
+ console.log(' self-evolve review --daily - 每日复盘');
400
+ }
401
+ }