feihong-code 7.0.0 → 7.5.0

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 (149) hide show
  1. package/.github/workflows/ci.yml +180 -140
  2. package/.github/workflows/release.yml +200 -0
  3. package/CHANGELOG.md +94 -65
  4. package/README.md +609 -586
  5. package/dist/agent/browser-agent.js +354 -0
  6. package/dist/agent/browser-agent.js.map +1 -0
  7. package/dist/agent/change-manager.js +433 -0
  8. package/dist/agent/change-manager.js.map +1 -0
  9. package/dist/agent/code-rag.js +293 -0
  10. package/dist/agent/code-rag.js.map +1 -0
  11. package/dist/agent/code-writer.js +13 -1
  12. package/dist/agent/code-writer.js.map +1 -1
  13. package/dist/agent/completion-engine.js +553 -0
  14. package/dist/agent/completion-engine.js.map +1 -0
  15. package/dist/agent/completion-postprocess.js +109 -0
  16. package/dist/agent/completion-postprocess.js.map +1 -0
  17. package/dist/agent/context-budget.js +121 -0
  18. package/dist/agent/context-budget.js.map +1 -0
  19. package/dist/agent/context-compactor.js +235 -10
  20. package/dist/agent/context-compactor.js.map +1 -1
  21. package/dist/agent/custom-agent.js +368 -0
  22. package/dist/agent/custom-agent.js.map +1 -0
  23. package/dist/agent/design-to-code.js +218 -0
  24. package/dist/agent/design-to-code.js.map +1 -0
  25. package/dist/agent/event-driven-agent.js +359 -0
  26. package/dist/agent/event-driven-agent.js.map +1 -0
  27. package/dist/agent/git-integration.js +324 -0
  28. package/dist/agent/git-integration.js.map +1 -0
  29. package/dist/agent/layered-memory.js +329 -0
  30. package/dist/agent/layered-memory.js.map +1 -0
  31. package/dist/agent/lint.js +121 -0
  32. package/dist/agent/lint.js.map +1 -0
  33. package/dist/agent/multi-agent.js +359 -0
  34. package/dist/agent/multi-agent.js.map +1 -0
  35. package/dist/agent/orchestrator.js +136 -25
  36. package/dist/agent/orchestrator.js.map +1 -1
  37. package/dist/agent/prompts.js +54 -54
  38. package/dist/agent/quality-gate.js +139 -0
  39. package/dist/agent/quality-gate.js.map +1 -1
  40. package/dist/agent/self-correction.js +274 -0
  41. package/dist/agent/self-correction.js.map +1 -0
  42. package/dist/agent/self-heal.js +47 -17
  43. package/dist/agent/self-heal.js.map +1 -1
  44. package/dist/agent/solo-agent.js +321 -0
  45. package/dist/agent/solo-agent.js.map +1 -0
  46. package/dist/agent/symbol-index.js +258 -28
  47. package/dist/agent/symbol-index.js.map +1 -1
  48. package/dist/agent/team-collaboration.js +252 -0
  49. package/dist/agent/team-collaboration.js.map +1 -0
  50. package/dist/agent/type-checker.js +229 -0
  51. package/dist/agent/type-checker.js.map +1 -0
  52. package/dist/cli/commands.js +9 -0
  53. package/dist/cli/commands.js.map +1 -1
  54. package/dist/cli/index.js +9 -0
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/multi-pane-tui.js +217 -0
  57. package/dist/cli/multi-pane-tui.js.map +1 -0
  58. package/dist/cli/run.js +130 -40
  59. package/dist/cli/run.js.map +1 -1
  60. package/dist/cli/tui-run.js +79 -0
  61. package/dist/cli/tui-run.js.map +1 -0
  62. package/dist/cli/tui.js.map +1 -1
  63. package/dist/cli/version.js +1 -1
  64. package/dist/integrations/collaboration.js +219 -0
  65. package/dist/integrations/collaboration.js.map +1 -0
  66. package/dist/integrations/figma.js +307 -0
  67. package/dist/integrations/figma.js.map +1 -0
  68. package/dist/integrations/sso.js +327 -0
  69. package/dist/integrations/sso.js.map +1 -0
  70. package/dist/knowledge/library.js +301 -0
  71. package/dist/knowledge/library.js.map +1 -0
  72. package/dist/lsp/lsp-client.js +183 -0
  73. package/dist/lsp/lsp-client.js.map +1 -0
  74. package/dist/lsp/lsp-service.js +159 -0
  75. package/dist/lsp/lsp-service.js.map +1 -0
  76. package/dist/plugins/manager.js +380 -0
  77. package/dist/plugins/manager.js.map +1 -0
  78. package/dist/runtime/event-log.js.map +1 -1
  79. package/dist/shared/i18n.js +108 -100
  80. package/dist/shared/i18n.js.map +1 -1
  81. package/dist/tools/browser/browser.tool.js +217 -0
  82. package/dist/tools/browser/browser.tool.js.map +1 -0
  83. package/dist/tools/generator/code-generator.js +40 -40
  84. package/dist/tools/generator/test-generator.js +9 -9
  85. package/dist/tools/index.js +2 -0
  86. package/dist/tools/index.js.map +1 -1
  87. package/dist/tools/shell/exec.js +73 -11
  88. package/dist/tools/shell/exec.js.map +1 -1
  89. package/dist/tools/shell/run-shell.tool.js +8 -2
  90. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  91. package/dist/training/completion-evaluator.js +213 -0
  92. package/dist/training/completion-evaluator.js.map +1 -0
  93. package/dist/training/fim-data.js +248 -0
  94. package/dist/training/fim-data.js.map +1 -0
  95. package/dist/voice/voice-programming.js +223 -0
  96. package/dist/voice/voice-programming.js.map +1 -0
  97. package/dist/web/extra-apis.js +440 -0
  98. package/dist/web/extra-apis.js.map +1 -0
  99. package/dist/web/public/css/style.css +1729 -1671
  100. package/dist/web/public/index.html +1242 -990
  101. package/dist/web/public/js/api.js +555 -382
  102. package/dist/web/public/js/app.js +2210 -2210
  103. package/dist/web/public/js/mock-api.js +234 -0
  104. package/dist/web/public/js/monaco-editor.js +363 -0
  105. package/dist/web/public/js/ui.js +2251 -1059
  106. package/dist/web/public/js/utils.js +214 -214
  107. package/dist/web/public/manifest.json +59 -0
  108. package/dist/web/public/service-worker.js +173 -0
  109. package/dist/web/server.js +1116 -45
  110. package/dist/web/server.js.map +1 -1
  111. package/dist/web/task-queue.js +22 -2
  112. package/dist/web/task-queue.js.map +1 -1
  113. package/docs/BENCHMARK_REPORT_en.md +386 -329
  114. package/docs/BENCHMARK_REPORT_zh.md +386 -329
  115. package/docs/DPA.md +63 -0
  116. package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +67 -0
  117. package/docs/SECURITY_WHITEPAPER.md +74 -0
  118. package/docs/SWE_BENCH_REPORT.md +55 -0
  119. package/docs/TECHNICAL_SPEC_en.md +292 -292
  120. package/docs/TECHNICAL_SPEC_zh.md +292 -292
  121. package/docs/UPDATE_NOTES_en.md +159 -159
  122. package/docs/UPDATE_NOTES_zh.md +159 -159
  123. package/docs/UPGRADE_7.2.0.md +309 -0
  124. package/docs/UPGRADE_GUIDE_7_5.md +86 -0
  125. package/docs/geo-feihong-code.html +391 -0
  126. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
  127. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
  128. package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
  129. package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
  130. package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +82 -0
  131. package/electron/main.js +404 -404
  132. package/package.json +175 -167
  133. package/templates/skills/api-design/SKILL.md +27 -0
  134. package/templates/skills/code-review/SKILL.md +35 -0
  135. package/templates/skills/dependency-upgrade/SKILL.md +29 -0
  136. package/templates/skills/doc-gen/SKILL.md +29 -0
  137. package/templates/skills/git-flow/SKILL.md +26 -0
  138. package/templates/skills/onboarding/SKILL.md +27 -0
  139. package/templates/skills/performance/SKILL.md +29 -0
  140. package/templates/skills/refactor/SKILL.md +28 -0
  141. package/templates/skills/security-audit/SKILL.md +28 -0
  142. package/templates/skills/test-gen/SKILL.md +30 -0
  143. package/tool-schema.json +197 -197
  144. package/dist/hello.js +0 -14
  145. package/dist/hello.js.map +0 -1
  146. package/dist/self-evolve/hook.ts +0 -80
  147. package/dist/self-evolve/manager.d.ts +0 -8
  148. package/dist/web/web-config.js +0 -143
  149. package/dist/web/web-config.js.map +0 -1
@@ -1,33 +1,55 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeFileHash = computeFileHash;
3
4
  exports.extractSymbols = extractSymbols;
5
+ exports.extractImports = extractImports;
4
6
  exports.scanDirectory = scanDirectory;
5
- exports.buildSymbolIndex = buildSymbolIndex;
7
+ exports.buildCodeGraph = buildCodeGraph;
8
+ exports.incrementalUpdate = incrementalUpdate;
6
9
  exports.cacheFile = cacheFile;
7
- exports.cacheSymbolIndex = cacheSymbolIndex;
8
- exports.loadCachedSymbolIndex = loadCachedSymbolIndex;
10
+ exports.cacheCodeGraph = cacheCodeGraph;
11
+ exports.loadCachedCodeGraph = loadCachedCodeGraph;
12
+ exports.getAllSymbols = getAllSymbols;
9
13
  exports.findSymbol = findSymbol;
14
+ exports.searchSymbols = searchSymbols;
10
15
  exports.symbolsForFile = symbolsForFile;
16
+ exports.symbolExists = symbolExists;
17
+ exports.findMissingSymbols = findMissingSymbols;
18
+ exports.getDependencies = getDependencies;
19
+ exports.getDependents = getDependents;
20
+ exports.graphStats = graphStats;
21
+ exports.buildSymbolIndex = buildSymbolIndex;
22
+ exports.cacheSymbolIndex = cacheSymbolIndex;
23
+ exports.loadCachedSymbolIndex = loadCachedSymbolIndex;
24
+ exports.findSymbolInIndex = findSymbolInIndex;
25
+ exports.symbolsForFileInIndex = symbolsForFileInIndex;
11
26
  exports.indexStats = indexStats;
12
27
  /**
13
28
  * 飞虹 Code (Muse Code 参照复刻)
14
29
  * 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
15
30
  *
16
- * P5-5 轻量语义索引(对齐 Cursor 项目级索引的轻量实现):
31
+ * P0-1 仓库级代码图谱(对齐 Cursor 项目级索引):
17
32
  * - 正则级符号提取(函数/类/接口/const/type),零依赖、跨语言
18
- * - 磁盘缓存(FH_HOME/symbol-index.json),重复扫描免开销
19
- * - 查询:按符号名 / 按文件定位定义位置
20
- * - 用途:/grill 审查聚焦、swe 规划定位目标文件、refactor 影响面
33
+ * - 依赖图构建(import/require 关系),支撑相关文件自动加载
34
+ * - 文件级哈希 + 增量更新(仅重解析变更文件)
35
+ * - 磁盘缓存(FH_HOME/code-graph.json),重复扫描免开销
36
+ * - 查询:按符号名 / 按文件定位 / 依赖反向查找 / 符号存在性校验
37
+ * - 用途:RAG 检索、swe 规划定位目标文件、refactor 影响面、生成后符号校验
21
38
  *
22
39
  * 注意:这是"轻量"索引(正则近似),非完整 AST 语义;但足以支撑
23
- * 符号定位与影响面估算,性价比远高于全量解析。
40
+ * 符号定位、依赖分析与影响面估算,性价比远高于全量解析。
24
41
  */
25
42
  const fs_1 = require("fs");
26
43
  const path_1 = require("path");
27
44
  const os_1 = require("os");
45
+ const crypto_1 = require("crypto");
28
46
  /** 支持的语言扩展(正则近似) */
29
47
  const SUPPORTED_EXT = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
30
- const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'out', 'coverage', '.workbuddy']);
48
+ const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', 'out', 'coverage', '.workbuddy', 'dist_tmp', 'release']);
49
+ /** 计算文件内容哈希(SHA-256 前 16 位,足够判定变更) */
50
+ function computeFileHash(content) {
51
+ return (0, crypto_1.createHash)('sha256').update(content).digest('hex').slice(0, 16);
52
+ }
31
53
  /** 从单文件内容提取符号(多行正则逐行扫描) */
32
54
  function extractSymbols(content, file) {
33
55
  const out = [];
@@ -48,16 +70,72 @@ function extractSymbols(content, file) {
48
70
  for (const { kind, re } of patterns) {
49
71
  const m = re.exec(line);
50
72
  if (m) {
51
- out.push({ name: m[1], kind, file, line: i + 1 });
73
+ const exported = /^export\s+/.test(line);
74
+ const signature = kind === 'function' ? extractFunctionSignature(lines, i) : '';
75
+ out.push({ name: m[1], kind, file, line: i + 1, signature, exported });
52
76
  break; // 每行只记一个符号
53
77
  }
54
78
  }
55
79
  }
56
80
  return out;
57
81
  }
58
- /** 递归扫描目录并提取全部符号(跳过 node_modules/.git 等) */
82
+ /** 提取函数签名(从定义行开始,尝试捕获到参数列表闭合 + 返回类型注释) */
83
+ function extractFunctionSignature(lines, startLine) {
84
+ let collected = '';
85
+ let parenDepth = 0;
86
+ let started = false;
87
+ for (let i = startLine; i < Math.min(startLine + 10, lines.length); i++) {
88
+ const line = lines[i];
89
+ for (const ch of line) {
90
+ if (ch === '(') {
91
+ parenDepth++;
92
+ started = true;
93
+ }
94
+ if (ch === ')')
95
+ parenDepth--;
96
+ }
97
+ collected += (collected ? ' ' : '') + line.trim();
98
+ if (started && parenDepth <= 0) {
99
+ // 尝试捕获返回类型(: 后到 { 或 = 前)
100
+ const returnMatch = collected.match(/\)\s*:\s*([^{=]+?)(?:\s*[{=]|$)/);
101
+ if (returnMatch) {
102
+ return collected.match(/\(([^)]*)\)/)?.[1]
103
+ ? `(${collected.match(/\(([^)]*)\)/)?.[1]})${returnMatch[1].trim()}`
104
+ : collected;
105
+ }
106
+ return collected.match(/function\s+\w+\s*(.*?)(?:\{|$)/)?.[1]?.trim() || collected;
107
+ }
108
+ }
109
+ return collected || '';
110
+ }
111
+ /** 从文件内容提取 import/require 依赖 */
112
+ function extractImports(content, file) {
113
+ const edges = [];
114
+ const seen = new Set();
115
+ // ES module import: import ... from '...' / import '...'
116
+ const importRe = /(?:import|export)\s+(?:[^'"]+\s+from\s+)?['"]([^'"]+)['"]/g;
117
+ // CommonJS require: require('...')
118
+ const requireRe = /require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
119
+ const collect = (m) => {
120
+ if (!m)
121
+ return;
122
+ const target = m[1];
123
+ if (seen.has(target))
124
+ return;
125
+ seen.add(target);
126
+ const internal = target.startsWith('.') || target.startsWith('/');
127
+ edges.push({ from: file, to: target, internal });
128
+ };
129
+ let m;
130
+ while ((m = importRe.exec(content)) !== null)
131
+ collect(m);
132
+ while ((m = requireRe.exec(content)) !== null)
133
+ collect(m);
134
+ return edges;
135
+ }
136
+ /** 递归扫描目录并构建文件节点(跳过 node_modules/.git 等) */
59
137
  function scanDirectory(root, maxFiles = 2000) {
60
- const symbols = [];
138
+ const nodes = [];
61
139
  let count = 0;
62
140
  const walk = (d) => {
63
141
  if (count >= maxFiles)
@@ -90,7 +168,12 @@ function scanDirectory(root, maxFiles = 2000) {
90
168
  try {
91
169
  const content = (0, fs_1.readFileSync)(abs, 'utf8');
92
170
  const rel = (0, path_1.relative)(root, abs).replace(/\\/g, '/');
93
- symbols.push(...extractSymbols(content, rel));
171
+ nodes.push({
172
+ path: rel,
173
+ hash: computeFileHash(content),
174
+ symbols: extractSymbols(content, rel),
175
+ imports: extractImports(content, rel),
176
+ });
94
177
  }
95
178
  catch {
96
179
  /* 二进制/不可读跳过 */
@@ -99,55 +182,202 @@ function scanDirectory(root, maxFiles = 2000) {
99
182
  }
100
183
  };
101
184
  walk(root);
102
- return symbols;
185
+ return nodes;
103
186
  }
104
- /** 构建符号索引 */
105
- function buildSymbolIndex(root, opts = {}) {
187
+ /** 构建完整代码图谱 */
188
+ function buildCodeGraph(root, opts = {}) {
189
+ const nodes = scanDirectory((0, path_1.resolve)(root), opts.maxFiles);
190
+ const files = {};
191
+ for (const n of nodes)
192
+ files[n.path] = n;
106
193
  return {
107
194
  root: (0, path_1.resolve)(root),
108
195
  builtAt: new Date().toISOString(),
109
- symbols: scanDirectory((0, path_1.resolve)(root), opts.maxFiles),
196
+ files,
197
+ };
198
+ }
199
+ /** 增量更新:仅重解析哈希变更的文件,删除已不存在的文件,新增新文件 */
200
+ function incrementalUpdate(graph, root, opts = {}) {
201
+ const resolvedRoot = (0, path_1.resolve)(root);
202
+ const currentNodes = scanDirectory(resolvedRoot, opts.maxFiles);
203
+ const currentPaths = new Set(currentNodes.map((n) => n.path));
204
+ const files = { ...graph.files };
205
+ for (const node of currentNodes) {
206
+ const existing = files[node.path];
207
+ if (!existing || existing.hash !== node.hash) {
208
+ files[node.path] = node; // 新增或变更
209
+ }
210
+ }
211
+ // 删除已不存在的文件
212
+ for (const path of Object.keys(files)) {
213
+ if (!currentPaths.has(path))
214
+ delete files[path];
215
+ }
216
+ return {
217
+ root: resolvedRoot,
218
+ builtAt: new Date().toISOString(),
219
+ files,
110
220
  };
111
221
  }
112
222
  /** 缓存文件路径(固定放用户主目录,避免仓库内写缓存;尊重 FH_HOME) */
113
223
  function cacheFile() {
114
224
  const base = process.env.FH_HOME?.trim() || (0, path_1.join)((0, os_1.homedir)(), '.feihong-code');
115
- return (0, path_1.join)(base, 'symbol-index.json');
225
+ return (0, path_1.join)(base, 'code-graph.json');
116
226
  }
117
227
  /** 写缓存 */
118
- function cacheSymbolIndex(index) {
228
+ function cacheCodeGraph(graph) {
119
229
  try {
120
230
  const file = cacheFile();
121
- (0, fs_1.mkdirSync)((0, path_1.join)(file, '..'), { recursive: true });
122
- (0, fs_1.writeFileSync)(file, JSON.stringify(index), 'utf8');
231
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(file), { recursive: true });
232
+ (0, fs_1.writeFileSync)(file, JSON.stringify(graph), 'utf8');
123
233
  }
124
234
  catch {
125
235
  /* 缓存失败不影响使用 */
126
236
  }
127
237
  }
128
238
  /** 读缓存(根路径匹配才返回) */
129
- function loadCachedSymbolIndex(root) {
239
+ function loadCachedCodeGraph(root) {
130
240
  try {
131
241
  const file = cacheFile();
132
242
  if (!(0, fs_1.existsSync)(file))
133
243
  return null;
134
244
  const parsed = JSON.parse((0, fs_1.readFileSync)(file, 'utf8'));
135
- return parsed && parsed.root === (0, path_1.resolve)(root) ? parsed : null;
245
+ return parsed && parsed.root === (0, path_1.resolve)(root) && parsed.files ? parsed : null;
136
246
  }
137
247
  catch {
138
248
  return null;
139
249
  }
140
250
  }
141
- /** 按符号名精确查找(全索引) */
142
- function findSymbol(index, name) {
143
- return index.symbols.filter((s) => s.name === name);
251
+ /** 获取图谱中所有符号(扁平列表,兼容旧接口) */
252
+ function getAllSymbols(graph) {
253
+ return Object.values(graph.files).flatMap((f) => f.symbols);
254
+ }
255
+ /** 按符号名精确查找(全图谱) */
256
+ function findSymbol(graph, name) {
257
+ return getAllSymbols(graph).filter((s) => s.name === name);
258
+ }
259
+ /** 按符号名模糊查找(包含匹配,用于 RAG 检索) */
260
+ function searchSymbols(graph, query, limit = 20) {
261
+ const q = query.toLowerCase();
262
+ return getAllSymbols(graph)
263
+ .filter((s) => s.name.toLowerCase().includes(q))
264
+ .sort((a, b) => {
265
+ // 精确匹配优先,其次导出符号优先
266
+ const aExact = a.name.toLowerCase() === q ? 2 : a.exported ? 1 : 0;
267
+ const bExact = b.name.toLowerCase() === q ? 2 : b.exported ? 1 : 0;
268
+ return bExact - aExact;
269
+ })
270
+ .slice(0, limit);
144
271
  }
145
272
  /** 按文件列出符号 */
146
- function symbolsForFile(index, file) {
273
+ function symbolsForFile(graph, file) {
274
+ const f = file.replace(/\\/g, '/');
275
+ return graph.files[f]?.symbols ?? [];
276
+ }
277
+ /** 符号存在性校验(生成后验证用:调用的函数/引用的类型是否在图谱中存在) */
278
+ function symbolExists(graph, name) {
279
+ return getAllSymbols(graph).some((s) => s.name === name);
280
+ }
281
+ /** 批量符号存在性校验,返回不存在的符号名列表 */
282
+ function findMissingSymbols(graph, names) {
283
+ const existing = new Set(getAllSymbols(graph).map((s) => s.name));
284
+ return names.filter((n) => !existing.has(n));
285
+ }
286
+ /** 获取某文件的直接依赖(import 了哪些项目内文件) */
287
+ function getDependencies(graph, file) {
288
+ const f = file.replace(/\\/g, '/');
289
+ const node = graph.files[f];
290
+ if (!node)
291
+ return [];
292
+ return node.imports.filter((i) => i.internal).map((i) => resolveImportPath(f, i.to));
293
+ }
294
+ /** 获取反向依赖(哪些文件 import 了该文件) */
295
+ function getDependents(graph, file) {
296
+ const target = file.replace(/\\/g, '/');
297
+ const dependents = [];
298
+ for (const [path, node] of Object.entries(graph.files)) {
299
+ for (const imp of node.imports) {
300
+ if (imp.internal && resolveImportPath(path, imp.to) === target) {
301
+ dependents.push(path);
302
+ break;
303
+ }
304
+ }
305
+ }
306
+ return dependents;
307
+ }
308
+ /** 将相对 import 路径解析为相对仓库根的路径 */
309
+ function resolveImportPath(fromFile, importPath) {
310
+ if (!importPath.startsWith('.'))
311
+ return importPath;
312
+ const fromDir = (0, path_1.dirname)(fromFile);
313
+ let resolved = (0, path_1.join)(fromDir, importPath).replace(/\\/g, '/');
314
+ // 处理无扩展名的 import(默认 .ts / .tsx / .js)
315
+ if (!(0, path_1.extname)(resolved)) {
316
+ for (const ext of ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx']) {
317
+ if (resolved.endsWith(ext))
318
+ break;
319
+ }
320
+ }
321
+ return resolved;
322
+ }
323
+ /** 图谱统计(诊断/展示用) */
324
+ function graphStats(graph) {
325
+ const byKind = {};
326
+ let symbols = 0;
327
+ let internalDeps = 0;
328
+ let externalDeps = 0;
329
+ for (const f of Object.values(graph.files)) {
330
+ symbols += f.symbols.length;
331
+ for (const s of f.symbols)
332
+ byKind[s.kind] = (byKind[s.kind] ?? 0) + 1;
333
+ for (const i of f.imports) {
334
+ if (i.internal)
335
+ internalDeps++;
336
+ else
337
+ externalDeps++;
338
+ }
339
+ }
340
+ return { files: Object.keys(graph.files).length, symbols, internalDeps, externalDeps, byKind };
341
+ }
342
+ // ==================== 向后兼容:旧 SymbolIndex 接口 ====================
343
+ /** 兼容旧版:构建扁平符号索引 */
344
+ function buildSymbolIndex(root, opts = {}) {
345
+ const graph = buildCodeGraph(root, opts);
346
+ return { root: graph.root, builtAt: graph.builtAt, symbols: getAllSymbols(graph) };
347
+ }
348
+ /** 兼容旧版:缓存符号索引(实际缓存完整图谱) */
349
+ function cacheSymbolIndex(index) {
350
+ const graph = {
351
+ root: index.root,
352
+ builtAt: index.builtAt,
353
+ files: {},
354
+ };
355
+ // 将扁平符号按文件重组
356
+ for (const s of index.symbols) {
357
+ if (!graph.files[s.file]) {
358
+ graph.files[s.file] = { path: s.file, hash: '', symbols: [], imports: [] };
359
+ }
360
+ graph.files[s.file].symbols.push(s);
361
+ }
362
+ cacheCodeGraph(graph);
363
+ }
364
+ /** 兼容旧版:加载缓存的符号索引 */
365
+ function loadCachedSymbolIndex(root) {
366
+ const graph = loadCachedCodeGraph(root);
367
+ if (!graph)
368
+ return null;
369
+ return { root: graph.root, builtAt: graph.builtAt, symbols: getAllSymbols(graph) };
370
+ }
371
+ /** 兼容旧版:按符号名查找 */
372
+ function findSymbolInIndex(index, name) {
373
+ return index.symbols.filter((s) => s.name === name);
374
+ }
375
+ /** 兼容旧版:按文件列出符号 */
376
+ function symbolsForFileInIndex(index, file) {
147
377
  const f = file.replace(/\\/g, '/');
148
378
  return index.symbols.filter((s) => s.file === f);
149
379
  }
150
- /** 文件数量与符号数量(诊断/展示用) */
380
+ /** 兼容旧版:索引统计 */
151
381
  function indexStats(index) {
152
382
  const byKind = {};
153
383
  const files = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"symbol-index.js","sourceRoot":"","sources":["../../src/agent/symbol-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"symbol-index.js","sourceRoot":"","sources":["../../src/agent/symbol-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TeamCollaborationManager = void 0;
4
+ exports.createTeamCollaborationManager = createTeamCollaborationManager;
5
+ /**
6
+ * 飞虹 Code - 团队协作模块 (P2-3)
7
+ * 在企业级 RBAC 基础上增强:团队成员管理、共享任务、团队配置、协作权限
8
+ *
9
+ * 设计原则:
10
+ * - 团队数据持久化到 ~/.feihong-code/team/ 目录
11
+ * - 成员角色继承企业级 Policy(admin/developer/viewer)
12
+ * - 共享任务支持查看、评论、协作编辑
13
+ * - 所有操作记录审计日志
14
+ */
15
+ const fs_1 = require("fs");
16
+ const path_1 = require("path");
17
+ const config_1 = require("../shared/config");
18
+ const logger_1 = require("../shared/logger");
19
+ /** 角色权限矩阵 */
20
+ const ROLE_PERMISSIONS = {
21
+ owner: ['*'],
22
+ admin: [
23
+ 'team:manage', 'member:invite', 'member:remove', 'member:role',
24
+ 'task:create', 'task:edit', 'task:delete', 'task:assign',
25
+ 'task:comment', 'config:edit', 'workspace:access',
26
+ ],
27
+ developer: [
28
+ 'task:create', 'task:edit', 'task:assign', 'task:comment',
29
+ 'workspace:access',
30
+ ],
31
+ viewer: [
32
+ 'task:view', 'task:comment', 'workspace:view',
33
+ ],
34
+ };
35
+ /**
36
+ * 团队协作管理器
37
+ */
38
+ class TeamCollaborationManager {
39
+ data;
40
+ dataPath;
41
+ constructor(homeDir) {
42
+ const base = homeDir || (0, config_1.resolveHomeDir)();
43
+ const teamDir = (0, path_1.join)(base, 'team');
44
+ if (!(0, fs_1.existsSync)(teamDir)) {
45
+ (0, fs_1.mkdirSync)(teamDir, { recursive: true });
46
+ }
47
+ this.dataPath = (0, path_1.join)(teamDir, 'team.json');
48
+ this.data = this.load();
49
+ }
50
+ /** 加载团队数据 */
51
+ load() {
52
+ if ((0, fs_1.existsSync)(this.dataPath)) {
53
+ try {
54
+ const raw = (0, fs_1.readFileSync)(this.dataPath, 'utf-8');
55
+ return JSON.parse(raw);
56
+ }
57
+ catch (e) {
58
+ logger_1.logger.warn('team data load failed, using default', { error: e instanceof Error ? e.message : String(e) });
59
+ }
60
+ }
61
+ // 默认团队
62
+ const defaultData = {
63
+ id: 'default-team',
64
+ config: {
65
+ name: '默认团队',
66
+ description: '飞虹 Code 默认协作团队',
67
+ defaultRole: 'developer',
68
+ allowedWorkspaces: [],
69
+ sharedModels: [],
70
+ maxMembers: 10,
71
+ requireApprovalFor: ['write_file', 'run_shell'],
72
+ },
73
+ members: [
74
+ {
75
+ id: 'owner-1',
76
+ name: '团队所有者',
77
+ email: 'owner@feihong.local',
78
+ role: 'owner',
79
+ joinedAt: new Date().toISOString(),
80
+ lastActiveAt: new Date().toISOString(),
81
+ status: 'active',
82
+ },
83
+ ],
84
+ tasks: [],
85
+ createdAt: new Date().toISOString(),
86
+ updatedAt: new Date().toISOString(),
87
+ };
88
+ this.save(defaultData);
89
+ return defaultData;
90
+ }
91
+ /** 保存团队数据 */
92
+ save(data) {
93
+ const toSave = data || this.data;
94
+ toSave.updatedAt = new Date().toISOString();
95
+ (0, fs_1.writeFileSync)(this.dataPath, JSON.stringify(toSave, null, 2), 'utf-8');
96
+ }
97
+ /** 获取团队数据 */
98
+ getTeam() {
99
+ return this.data;
100
+ }
101
+ /** 更新团队配置 */
102
+ updateConfig(config) {
103
+ this.data.config = { ...this.data.config, ...config };
104
+ this.save();
105
+ logger_1.logger.info('team config updated', { config });
106
+ return this.data.config;
107
+ }
108
+ /** 获取成员列表 */
109
+ getMembers() {
110
+ return this.data.members;
111
+ }
112
+ /** 获取单个成员 */
113
+ getMember(id) {
114
+ return this.data.members.find((m) => m.id === id);
115
+ }
116
+ /** 邀请成员 */
117
+ inviteMember(name, email, role = 'developer') {
118
+ if (this.data.members.length >= this.data.config.maxMembers) {
119
+ throw new Error(`团队成员已达上限 ${this.data.config.maxMembers}`);
120
+ }
121
+ if (this.data.members.some((m) => m.email === email)) {
122
+ throw new Error('该邮箱已在团队中');
123
+ }
124
+ const member = {
125
+ id: `member-${Date.now()}`,
126
+ name,
127
+ email,
128
+ role,
129
+ joinedAt: new Date().toISOString(),
130
+ lastActiveAt: new Date().toISOString(),
131
+ status: 'invited',
132
+ };
133
+ this.data.members.push(member);
134
+ this.save();
135
+ logger_1.logger.info('member invited', { memberId: member.id, email, role });
136
+ return member;
137
+ }
138
+ /** 更新成员角色 */
139
+ updateMemberRole(id, role) {
140
+ const member = this.getMember(id);
141
+ if (!member)
142
+ throw new Error('成员不存在');
143
+ if (member.role === 'owner')
144
+ throw new Error('不能修改所有者角色');
145
+ member.role = role;
146
+ this.save();
147
+ logger_1.logger.info('member role updated', { memberId: id, role });
148
+ return member;
149
+ }
150
+ /** 移除成员 */
151
+ removeMember(id) {
152
+ const member = this.getMember(id);
153
+ if (!member)
154
+ throw new Error('成员不存在');
155
+ if (member.role === 'owner')
156
+ throw new Error('不能移除所有者');
157
+ this.data.members = this.data.members.filter((m) => m.id !== id);
158
+ this.save();
159
+ logger_1.logger.info('member removed', { memberId: id });
160
+ }
161
+ /** 检查成员权限 */
162
+ hasPermission(memberId, permission) {
163
+ const member = this.getMember(memberId);
164
+ if (!member)
165
+ return false;
166
+ const perms = ROLE_PERMISSIONS[member.role] || [];
167
+ return perms.includes('*') || perms.includes(permission);
168
+ }
169
+ /** 获取共享任务列表 */
170
+ getTasks(status) {
171
+ let tasks = this.data.tasks;
172
+ if (status)
173
+ tasks = tasks.filter((t) => t.status === status);
174
+ return tasks.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
175
+ }
176
+ /** 获取单个任务 */
177
+ getTask(id) {
178
+ return this.data.tasks.find((t) => t.id === id);
179
+ }
180
+ /** 创建共享任务 */
181
+ createTask(title, createdBy, opts = {}) {
182
+ const task = {
183
+ id: `task-${Date.now()}`,
184
+ title,
185
+ description: opts.description || '',
186
+ createdBy,
187
+ createdAt: new Date().toISOString(),
188
+ updatedAt: new Date().toISOString(),
189
+ status: opts.status || 'todo',
190
+ assignees: opts.assignees || [],
191
+ priority: opts.priority || 'medium',
192
+ tags: opts.tags || [],
193
+ comments: [],
194
+ linkedTaskId: opts.linkedTaskId,
195
+ };
196
+ this.data.tasks.push(task);
197
+ this.save();
198
+ logger_1.logger.info('shared task created', { taskId: task.id, title, createdBy });
199
+ return task;
200
+ }
201
+ /** 更新任务 */
202
+ updateTask(id, updates) {
203
+ const task = this.getTask(id);
204
+ if (!task)
205
+ throw new Error('任务不存在');
206
+ Object.assign(task, updates, { updatedAt: new Date().toISOString() });
207
+ this.save();
208
+ logger_1.logger.info('shared task updated', { taskId: id, updates });
209
+ return task;
210
+ }
211
+ /** 删除任务 */
212
+ deleteTask(id) {
213
+ this.data.tasks = this.data.tasks.filter((t) => t.id !== id);
214
+ this.save();
215
+ logger_1.logger.info('shared task deleted', { taskId: id });
216
+ }
217
+ /** 添加任务评论 */
218
+ addComment(taskId, author, content) {
219
+ const task = this.getTask(taskId);
220
+ if (!task)
221
+ throw new Error('任务不存在');
222
+ task.comments.push({
223
+ id: `comment-${Date.now()}`,
224
+ author,
225
+ content,
226
+ createdAt: new Date().toISOString(),
227
+ });
228
+ task.updatedAt = new Date().toISOString();
229
+ this.save();
230
+ return task;
231
+ }
232
+ /** 获取团队统计 */
233
+ getStats() {
234
+ const members = this.data.members;
235
+ const tasks = this.data.tasks;
236
+ return {
237
+ totalMembers: members.length,
238
+ activeMembers: members.filter((m) => m.status === 'active').length,
239
+ totalTasks: tasks.length,
240
+ todoTasks: tasks.filter((t) => t.status === 'todo').length,
241
+ inProgressTasks: tasks.filter((t) => t.status === 'in-progress').length,
242
+ reviewTasks: tasks.filter((t) => t.status === 'review').length,
243
+ doneTasks: tasks.filter((t) => t.status === 'done').length,
244
+ };
245
+ }
246
+ }
247
+ exports.TeamCollaborationManager = TeamCollaborationManager;
248
+ /** 便捷函数:创建团队协作管理器 */
249
+ function createTeamCollaborationManager(homeDir) {
250
+ return new TeamCollaborationManager(homeDir);
251
+ }
252
+ //# sourceMappingURL=team-collaboration.js.map