@specpow/framework 0.5.28 → 0.5.30

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 (52) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +99 -18
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +41 -0
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/apply.d.ts.map +1 -1
  7. package/dist/commands/apply.js +6 -0
  8. package/dist/commands/apply.js.map +1 -1
  9. package/dist/commands/archive.d.ts.map +1 -1
  10. package/dist/commands/archive.js +46 -0
  11. package/dist/commands/archive.js.map +1 -1
  12. package/dist/commands/memory.d.ts +20 -0
  13. package/dist/commands/memory.d.ts.map +1 -1
  14. package/dist/commands/memory.js +267 -0
  15. package/dist/commands/memory.js.map +1 -1
  16. package/dist/core/artifact-graph/types.d.ts +4 -4
  17. package/dist/core/config/config-schema.d.ts +3097 -0
  18. package/dist/core/config/config-schema.d.ts.map +1 -1
  19. package/dist/core/config/config-schema.js +77 -0
  20. package/dist/core/config/config-schema.js.map +1 -1
  21. package/dist/core/init/engine.d.ts +4 -0
  22. package/dist/core/init/engine.d.ts.map +1 -1
  23. package/dist/core/init/engine.js +42 -0
  24. package/dist/core/init/engine.js.map +1 -1
  25. package/dist/core/memory/adapters/auto-collector.d.ts +59 -0
  26. package/dist/core/memory/adapters/auto-collector.d.ts.map +1 -0
  27. package/dist/core/memory/adapters/auto-collector.js +126 -0
  28. package/dist/core/memory/adapters/auto-collector.js.map +1 -0
  29. package/dist/core/memory/adapters/claude-code-adapter.d.ts +51 -0
  30. package/dist/core/memory/adapters/claude-code-adapter.d.ts.map +1 -0
  31. package/dist/core/memory/adapters/claude-code-adapter.js +197 -0
  32. package/dist/core/memory/adapters/claude-code-adapter.js.map +1 -0
  33. package/dist/core/memory/adapters/codebuddy-adapter.d.ts +44 -0
  34. package/dist/core/memory/adapters/codebuddy-adapter.d.ts.map +1 -0
  35. package/dist/core/memory/adapters/codebuddy-adapter.js +194 -0
  36. package/dist/core/memory/adapters/codebuddy-adapter.js.map +1 -0
  37. package/dist/core/memory/adapters/index.d.ts +56 -0
  38. package/dist/core/memory/adapters/index.d.ts.map +1 -0
  39. package/dist/core/memory/adapters/index.js +184 -0
  40. package/dist/core/memory/adapters/index.js.map +1 -0
  41. package/dist/core/memory/memory-injector.d.ts +101 -0
  42. package/dist/core/memory/memory-injector.d.ts.map +1 -0
  43. package/dist/core/memory/memory-injector.js +269 -0
  44. package/dist/core/memory/memory-injector.js.map +1 -0
  45. package/dist/core/memory/memory-types.d.ts +79 -0
  46. package/dist/core/memory/memory-types.d.ts.map +1 -1
  47. package/dist/core/memory/templates/phase-summary-renderer.d.ts +34 -0
  48. package/dist/core/memory/templates/phase-summary-renderer.d.ts.map +1 -0
  49. package/dist/core/memory/templates/phase-summary-renderer.js +72 -0
  50. package/dist/core/memory/templates/phase-summary-renderer.js.map +1 -0
  51. package/dist/templates/claude-commands/specpow-apply.md +17 -2
  52. package/package.json +1 -1
@@ -0,0 +1,184 @@
1
+ /**
2
+ * 适配器注册表
3
+ *
4
+ * 统一管理所有会话适配器,提供数据源检测、会话索引等功能
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { ClaudeCodeAdapter } from './claude-code-adapter.js';
9
+ import { CodeBuddyAdapter } from './codebuddy-adapter.js';
10
+ /**
11
+ * 适配器注册表实现
12
+ */
13
+ export class AdapterRegistryImpl {
14
+ adapters = new Map();
15
+ memoryManager = null;
16
+ projectRoot;
17
+ indexedSessionsPath;
18
+ constructor(projectRoot, memoryManager) {
19
+ this.projectRoot = projectRoot;
20
+ this.memoryManager = memoryManager || null;
21
+ this.indexedSessionsPath = join(projectRoot, '.specpow', 'memory', 'indexed-sessions.json');
22
+ }
23
+ /**
24
+ * 注册适配器
25
+ */
26
+ register(adapter) {
27
+ this.adapters.set(adapter.name, adapter);
28
+ }
29
+ /**
30
+ * 检测所有数据源
31
+ */
32
+ async detectSources() {
33
+ const results = [];
34
+ for (const [name, adapter] of this.adapters.entries()) {
35
+ try {
36
+ const detected = await adapter.detect();
37
+ if (detected) {
38
+ const projects = await adapter.listProjects();
39
+ let sessionCount = 0;
40
+ for (const project of projects) {
41
+ const sessions = await adapter.listSessions(project);
42
+ sessionCount += sessions.length;
43
+ }
44
+ results.push({
45
+ name,
46
+ detected: true,
47
+ sessionCount,
48
+ });
49
+ }
50
+ else {
51
+ results.push({
52
+ name,
53
+ detected: false,
54
+ });
55
+ }
56
+ }
57
+ catch (error) {
58
+ results.push({
59
+ name,
60
+ detected: false,
61
+ });
62
+ }
63
+ }
64
+ return results;
65
+ }
66
+ /**
67
+ * 获取指定适配器
68
+ */
69
+ getAdapter(name) {
70
+ return this.adapters.get(name);
71
+ }
72
+ /**
73
+ * 索引所有数据源
74
+ */
75
+ async indexAll(options) {
76
+ const result = {
77
+ indexed: 0,
78
+ skipped: 0,
79
+ errors: [],
80
+ };
81
+ // 加载已索引记录
82
+ const indexedSessions = this.loadIndexedSessions();
83
+ // 遍历所有适配器
84
+ for (const [name, adapter] of this.adapters.entries()) {
85
+ // 检查是否指定了数据源
86
+ if (options?.sources && !options.sources.includes(name)) {
87
+ continue;
88
+ }
89
+ try {
90
+ const detected = await adapter.detect();
91
+ if (!detected) {
92
+ continue;
93
+ }
94
+ const projects = await adapter.listProjects();
95
+ for (const project of projects) {
96
+ const sessions = await adapter.listSessions(project);
97
+ for (const session of sessions) {
98
+ const key = `${name}:${project}:${session.id}`;
99
+ // 检查是否已索引
100
+ if (!options?.force && indexedSessions.sessions[key]) {
101
+ result.skipped++;
102
+ continue;
103
+ }
104
+ try {
105
+ // 加载会话
106
+ const sessionLog = await adapter.loadSession(project, session.id);
107
+ // 索引会话
108
+ if (this.memoryManager) {
109
+ await this.memoryManager.indexSession(sessionLog);
110
+ }
111
+ // 标记为已索引
112
+ indexedSessions.sessions[key] = true;
113
+ result.indexed++;
114
+ }
115
+ catch (error) {
116
+ const errorMsg = `Failed to index session ${session.id}: ${error}`;
117
+ result.errors.push(errorMsg);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ catch (error) {
123
+ const errorMsg = `Failed to process adapter ${name}: ${error}`;
124
+ result.errors.push(errorMsg);
125
+ }
126
+ }
127
+ // 保存已索引记录
128
+ this.saveIndexedSessions(indexedSessions);
129
+ return result;
130
+ }
131
+ /**
132
+ * 设置 Memory 管理器
133
+ */
134
+ setMemoryManager(manager) {
135
+ this.memoryManager = manager;
136
+ }
137
+ /**
138
+ * 清除索引缓存
139
+ */
140
+ clearIndexCache() {
141
+ const empty = { sessions: {} };
142
+ this.saveIndexedSessions(empty);
143
+ }
144
+ /**
145
+ * 加载已索引记录
146
+ */
147
+ loadIndexedSessions() {
148
+ if (!existsSync(this.indexedSessionsPath)) {
149
+ return { sessions: {} };
150
+ }
151
+ try {
152
+ const content = readFileSync(this.indexedSessionsPath, 'utf-8');
153
+ return JSON.parse(content);
154
+ }
155
+ catch {
156
+ return { sessions: {} };
157
+ }
158
+ }
159
+ /**
160
+ * 保存已索引记录
161
+ */
162
+ saveIndexedSessions(sessions) {
163
+ const dir = join(this.projectRoot, '.specpow', 'memory');
164
+ if (!existsSync(dir)) {
165
+ mkdirSync(dir, { recursive: true });
166
+ }
167
+ writeFileSync(this.indexedSessionsPath, JSON.stringify(sessions, null, 2), 'utf-8');
168
+ }
169
+ }
170
+ /**
171
+ * 创建适配器注册表
172
+ * 自动注册 Claude Code 和 CodeBuddy 适配器
173
+ */
174
+ export function createAdapterRegistry(projectRoot, memoryManager) {
175
+ const registry = new AdapterRegistryImpl(projectRoot, memoryManager);
176
+ // 注册默认适配器
177
+ registry.register(new ClaudeCodeAdapter());
178
+ registry.register(new CodeBuddyAdapter());
179
+ return registry;
180
+ }
181
+ // 导出适配器
182
+ export { ClaudeCodeAdapter } from './claude-code-adapter.js';
183
+ export { CodeBuddyAdapter } from './codebuddy-adapter.js';
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/memory/adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * 记忆注入器
3
+ *
4
+ * 将记忆条目格式化为可注入到 AI 上下文的文本
5
+ * 支持 token 预算控制
6
+ */
7
+ import type { MemoryEntry, MemoryManager, WorkflowStage } from './memory-types.js';
8
+ /**
9
+ * 注入配置
10
+ */
11
+ export interface InjectionConfig {
12
+ /** 最大条目数 */
13
+ maxEntries: number;
14
+ /** 最小相关性 */
15
+ minRelevance: number;
16
+ /** Token 预算 */
17
+ tokenBudget: number;
18
+ /** 是否查询所有阶段(默认只查前一阶段) */
19
+ allPhases?: boolean;
20
+ /** 自定义关键词(优先级高于自动提取) */
21
+ customKeywords?: string[];
22
+ }
23
+ /**
24
+ * 查询上下文(用于增强关键词提取)
25
+ */
26
+ export interface QueryContext {
27
+ /** 变更名称 */
28
+ changeName?: string;
29
+ /** 用户输入 */
30
+ userInput?: string;
31
+ /** 任务描述 */
32
+ taskDescription?: string;
33
+ /** 涉及文件 */
34
+ files?: string[];
35
+ }
36
+ /**
37
+ * 记忆注入器
38
+ */
39
+ export declare class MemoryInjector {
40
+ private memoryManager;
41
+ constructor(memoryManager: MemoryManager);
42
+ /**
43
+ * 格式化用于 explore 阶段注入
44
+ */
45
+ formatForExplore(entries: MemoryEntry[], budget?: number): string;
46
+ /**
47
+ * 格式化用于 propose 阶段注入
48
+ */
49
+ formatForPropose(entries: MemoryEntry[], budget?: number): string;
50
+ /**
51
+ * 格式化用于 Brief 文件注入
52
+ */
53
+ formatForBrief(entries: MemoryEntry[], budget?: number): string;
54
+ /**
55
+ * 格式化用于 verify 阶段注入
56
+ */
57
+ formatForVerify(entries: MemoryEntry[], budget?: number): string;
58
+ /**
59
+ * 查询并格式化指定阶段的记忆
60
+ * @param changeName 变更名称(向后兼容)
61
+ * @param phase 工作流阶段
62
+ * @param config 注入配置
63
+ * @param context 查询上下文(可选,用于增强关键词提取)
64
+ */
65
+ queryForPhase(changeName: string, phase: WorkflowStage, config?: Partial<InjectionConfig>, context?: QueryContext): Promise<string>;
66
+ /**
67
+ * 方案 A: 从上下文综合提取关键词
68
+ */
69
+ extractKeywordsFromContext(context: QueryContext): string[];
70
+ /**
71
+ * 估算 token 数
72
+ * 简单估算:中文字符数 + 英文单词数/4
73
+ */
74
+ estimateTokens(text: string): number;
75
+ /**
76
+ * 格式化记忆条目
77
+ */
78
+ private formatEntries;
79
+ /**
80
+ * 提取关键词(增强版)
81
+ * 支持 kebab-case、camelCase、中文等多种格式
82
+ */
83
+ private extractKeywords;
84
+ /**
85
+ * 获取要查询的阶段
86
+ */
87
+ private getQueryPhases;
88
+ /**
89
+ * 获取阶段标签
90
+ */
91
+ private getPhaseLabel;
92
+ /**
93
+ * 获取章节标题
94
+ */
95
+ private getSectionTitle;
96
+ }
97
+ /**
98
+ * 创建记忆注入器
99
+ */
100
+ export declare function createMemoryInjector(memoryManager: MemoryManager): MemoryInjector;
101
+ //# sourceMappingURL=memory-injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-injector.d.ts","sourceRoot":"","sources":["../../../src/core/memory/memory-injector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAqB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAIxC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,GAAE,MAAoC,GAAG,MAAM;IAI9F;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,GAAE,MAAoC,GAAG,MAAM;IAI9F;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,GAAE,MAAkC,GAAG,MAAM;IAI1F;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,GAAE,MAAmC,GAAG,MAAM;IAI5F;;;;;;OAMG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC;IAqClB;;OAEG;IACH,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE;IA6C3D;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAuBpC;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAmCvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,eAAe;CAWxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,aAAa,GAAG,cAAc,CAEjF"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * 记忆注入器
3
+ *
4
+ * 将记忆条目格式化为可注入到 AI 上下文的文本
5
+ * 支持 token 预算控制
6
+ */
7
+ /**
8
+ * 默认注入配置
9
+ */
10
+ const DEFAULT_CONFIG = {
11
+ maxEntries: 3,
12
+ minRelevance: 0.3,
13
+ tokenBudget: 300,
14
+ allPhases: false,
15
+ };
16
+ /**
17
+ * 各阶段默认 token 预算
18
+ */
19
+ const PHASE_TOKEN_BUDGETS = {
20
+ explore: 300,
21
+ propose: 500,
22
+ apply: 400,
23
+ verify: 200,
24
+ archive: 100,
25
+ idle: 200,
26
+ };
27
+ /**
28
+ * 记忆注入器
29
+ */
30
+ export class MemoryInjector {
31
+ memoryManager;
32
+ constructor(memoryManager) {
33
+ this.memoryManager = memoryManager;
34
+ }
35
+ /**
36
+ * 格式化用于 explore 阶段注入
37
+ */
38
+ formatForExplore(entries, budget = PHASE_TOKEN_BUDGETS.explore) {
39
+ return this.formatEntries(entries, budget, '历史探索记忆');
40
+ }
41
+ /**
42
+ * 格式化用于 propose 阶段注入
43
+ */
44
+ formatForPropose(entries, budget = PHASE_TOKEN_BUDGETS.propose) {
45
+ return this.formatEntries(entries, budget, '历史决策参考');
46
+ }
47
+ /**
48
+ * 格式化用于 Brief 文件注入
49
+ */
50
+ formatForBrief(entries, budget = PHASE_TOKEN_BUDGETS.apply) {
51
+ return this.formatEntries(entries, budget, '历史上下文');
52
+ }
53
+ /**
54
+ * 格式化用于 verify 阶段注入
55
+ */
56
+ formatForVerify(entries, budget = PHASE_TOKEN_BUDGETS.verify) {
57
+ return this.formatEntries(entries, budget, '历史审查经验');
58
+ }
59
+ /**
60
+ * 查询并格式化指定阶段的记忆
61
+ * @param changeName 变更名称(向后兼容)
62
+ * @param phase 工作流阶段
63
+ * @param config 注入配置
64
+ * @param context 查询上下文(可选,用于增强关键词提取)
65
+ */
66
+ async queryForPhase(changeName, phase, config, context) {
67
+ const cfg = { ...DEFAULT_CONFIG, ...config };
68
+ const budget = PHASE_TOKEN_BUDGETS[phase] || cfg.tokenBudget;
69
+ // 方案 A: 增强关键词提取
70
+ let keywords;
71
+ if (cfg.customKeywords && cfg.customKeywords.length > 0) {
72
+ // 方案 C: 用户自定义关键词优先
73
+ keywords = cfg.customKeywords;
74
+ }
75
+ else if (context) {
76
+ // 从上下文综合提取
77
+ keywords = this.extractKeywordsFromContext(context);
78
+ }
79
+ else {
80
+ // 向后兼容:只从变更名称提取
81
+ keywords = this.extractKeywords(changeName);
82
+ }
83
+ // 方案 B: 扩大阶段范围
84
+ const queryPhases = cfg.allPhases
85
+ ? ['explore', 'propose', 'apply', 'verify', 'archive', 'idle']
86
+ : this.getQueryPhases(phase);
87
+ // 构建查询
88
+ const query = {
89
+ keywords: keywords.length > 0 ? keywords : undefined,
90
+ phases: queryPhases,
91
+ limit: cfg.maxEntries,
92
+ minRelevance: cfg.minRelevance,
93
+ };
94
+ // 执行查询
95
+ const result = await this.memoryManager.search(query);
96
+ // 格式化结果
97
+ return this.formatEntries(result.entries, budget, this.getSectionTitle(phase));
98
+ }
99
+ /**
100
+ * 方案 A: 从上下文综合提取关键词
101
+ */
102
+ extractKeywordsFromContext(context) {
103
+ const allWords = [];
104
+ // 从变更名称提取
105
+ if (context.changeName) {
106
+ allWords.push(...this.extractKeywords(context.changeName));
107
+ }
108
+ // 从用户输入提取
109
+ if (context.userInput) {
110
+ allWords.push(...this.extractKeywords(context.userInput));
111
+ }
112
+ // 从任务描述提取
113
+ if (context.taskDescription) {
114
+ allWords.push(...this.extractKeywords(context.taskDescription));
115
+ }
116
+ // 从文件路径提取(提取文件名和目录名)
117
+ if (context.files && context.files.length > 0) {
118
+ for (const file of context.files) {
119
+ // 提取文件名(不含扩展名)
120
+ const fileName = file.split('/').pop()?.split('.').shift() || '';
121
+ allWords.push(...this.extractKeywords(fileName));
122
+ // 提取目录名
123
+ const dirName = file.split('/').slice(-2, -1)[0] || '';
124
+ if (dirName && dirName !== 'src' && dirName !== 'lib') {
125
+ allWords.push(...this.extractKeywords(dirName));
126
+ }
127
+ }
128
+ }
129
+ // 去重并按词频排序
130
+ const freq = new Map();
131
+ for (const word of allWords) {
132
+ freq.set(word, (freq.get(word) || 0) + 1);
133
+ }
134
+ return Array.from(freq.entries())
135
+ .sort((a, b) => b[1] - a[1])
136
+ .map(([word]) => word)
137
+ .slice(0, 10); // 返回前 10 个关键词
138
+ }
139
+ /**
140
+ * 估算 token 数
141
+ * 简单估算:中文字符数 + 英文单词数/4
142
+ */
143
+ estimateTokens(text) {
144
+ let tokens = 0;
145
+ // 统计中文字符
146
+ const chineseChars = text.match(/[\u4e00-\u9fa3]/g);
147
+ if (chineseChars) {
148
+ tokens += chineseChars.length;
149
+ }
150
+ // 统计英文单词(去除中文后按空格分割)
151
+ const englishText = text.replace(/[\u4e00-\u9fa3]/g, ' ');
152
+ const englishWords = englishText.split(/\s+/).filter(w => w.length > 0);
153
+ tokens += Math.ceil(englishWords.length / 4);
154
+ // 加上标点符号
155
+ const punctuation = text.match(/[,。!?、;:""''()【】]/g);
156
+ if (punctuation) {
157
+ tokens += punctuation.length;
158
+ }
159
+ return tokens;
160
+ }
161
+ /**
162
+ * 格式化记忆条目
163
+ */
164
+ formatEntries(entries, budget, sectionTitle) {
165
+ if (entries.length === 0) {
166
+ return `## ${sectionTitle}\n\n(无相关历史记忆)`;
167
+ }
168
+ const lines = [];
169
+ let currentTokens = this.estimateTokens(`## ${sectionTitle}`);
170
+ for (const entry of entries) {
171
+ const phaseLabel = this.getPhaseLabel(entry.phase);
172
+ const line = `- [${phaseLabel}] ${entry.content}`;
173
+ const lineTokens = this.estimateTokens(line);
174
+ if (currentTokens + lineTokens > budget) {
175
+ break;
176
+ }
177
+ lines.push(line);
178
+ currentTokens += lineTokens;
179
+ }
180
+ if (lines.length === 0) {
181
+ return `## ${sectionTitle}\n\n(无相关历史记忆)`;
182
+ }
183
+ return `## ${sectionTitle}\n\n${lines.join('\n')}`;
184
+ }
185
+ /**
186
+ * 提取关键词(增强版)
187
+ * 支持 kebab-case、camelCase、中文等多种格式
188
+ */
189
+ extractKeywords(text) {
190
+ // 预处理:将 kebab-case 和 camelCase 转换为空格分隔
191
+ let normalized = text
192
+ // kebab-case: memory-auto-adapter -> memory auto adapter
193
+ .replace(/-/g, ' ')
194
+ // camelCase: memoryAutoAdapter -> memory Auto Adapter
195
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
196
+ // snake_case: memory_auto_adapter -> memory auto adapter
197
+ .replace(/_/g, ' ');
198
+ // 转为小写并分割
199
+ const words = normalized
200
+ .toLowerCase()
201
+ .replace(/[^\w\u4e00-\u9fa3\s]/g, ' ')
202
+ .split(/\s+/)
203
+ .filter(w => {
204
+ // 过滤短词和停用词
205
+ if (w.length <= 1)
206
+ return false;
207
+ const stopWords = new Set([
208
+ '的', '了', '在', '是', '我', '有', '就', '不', '也', '很', '到', '说', '要', '去',
209
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
210
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
211
+ 'should', 'may', 'might', 'can', 'shall', 'must', 'need', 'dare',
212
+ 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',
213
+ 'into', 'through', 'during', 'before', 'after', 'above', 'below',
214
+ 'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',
215
+ 'this', 'that', 'these', 'those', 'it', 'its', 'he', 'she', 'they',
216
+ ]);
217
+ return !stopWords.has(w);
218
+ });
219
+ // 去重并返回前 10 个
220
+ return Array.from(new Set(words)).slice(0, 10);
221
+ }
222
+ /**
223
+ * 获取要查询的阶段
224
+ */
225
+ getQueryPhases(currentPhase) {
226
+ // 查询前一阶段的记忆
227
+ const phaseOrder = ['explore', 'propose', 'apply', 'verify', 'archive'];
228
+ const currentIndex = phaseOrder.indexOf(currentPhase);
229
+ if (currentIndex <= 0) {
230
+ return [currentPhase];
231
+ }
232
+ return [phaseOrder[currentIndex - 1], currentPhase];
233
+ }
234
+ /**
235
+ * 获取阶段标签
236
+ */
237
+ getPhaseLabel(phase) {
238
+ const labels = {
239
+ explore: '探索',
240
+ propose: '提案',
241
+ apply: '实现',
242
+ verify: '验证',
243
+ archive: '归档',
244
+ idle: '通用',
245
+ };
246
+ return labels[phase] || phase;
247
+ }
248
+ /**
249
+ * 获取章节标题
250
+ */
251
+ getSectionTitle(phase) {
252
+ const titles = {
253
+ explore: '历史探索记忆',
254
+ propose: '历史决策参考',
255
+ apply: '历史上下文',
256
+ verify: '历史审查经验',
257
+ archive: '历史归档记忆',
258
+ idle: '相关记忆',
259
+ };
260
+ return titles[phase] || '相关记忆';
261
+ }
262
+ }
263
+ /**
264
+ * 创建记忆注入器
265
+ */
266
+ export function createMemoryInjector(memoryManager) {
267
+ return new MemoryInjector(memoryManager);
268
+ }
269
+ //# sourceMappingURL=memory-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-injector.js","sourceRoot":"","sources":["../../../src/core/memory/memory-injector.ts"],"names":[],"mappings":"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"}
@@ -151,4 +151,83 @@ export interface MemoryStats {
151
151
  /** 索引大小(字节) */
152
152
  indexSize: number;
153
153
  }
154
+ /**
155
+ * 会话元数据
156
+ */
157
+ export interface SessionMeta {
158
+ /** 会话 ID */
159
+ id: string;
160
+ /** 会话名称 */
161
+ name?: string;
162
+ /** 创建时间 */
163
+ createdAt: number;
164
+ /** 最后消息时间 */
165
+ lastMessageAt?: number;
166
+ /** 消息数量 */
167
+ messageCount?: number;
168
+ }
169
+ /**
170
+ * 会话适配器接口
171
+ * 用于从不同宿主工具(Claude Code、CodeBuddy 等)读取会话日志
172
+ */
173
+ export interface SessionAdapter {
174
+ /** 适配器名称 */
175
+ name: string;
176
+ /** 检测当前环境是否支持此适配器 */
177
+ detect(): Promise<boolean>;
178
+ /** 列出所有项目 */
179
+ listProjects(): Promise<string[]>;
180
+ /** 列出指定项目的所有会话 */
181
+ listSessions(project: string): Promise<SessionMeta[]>;
182
+ /** 加载指定会话并转换为标准格式 */
183
+ loadSession(project: string, sessionId: string): Promise<SessionLog>;
184
+ }
185
+ /**
186
+ * 数据源检测结果
187
+ */
188
+ export interface SourceDetection {
189
+ /** 数据源名称 */
190
+ name: string;
191
+ /** 是否检测到 */
192
+ detected: boolean;
193
+ /** 数据目录路径 */
194
+ baseDir?: string;
195
+ /** 当前项目标识 */
196
+ currentProject?: string;
197
+ /** 会话数量 */
198
+ sessionCount?: number;
199
+ }
200
+ /**
201
+ * 索引选项
202
+ */
203
+ export interface IndexOptions {
204
+ /** 强制重新索引 */
205
+ force?: boolean;
206
+ /** 指定数据源 */
207
+ sources?: string[];
208
+ }
209
+ /**
210
+ * 索引结果
211
+ */
212
+ export interface IndexResult {
213
+ /** 已索引数量 */
214
+ indexed: number;
215
+ /** 跳过数量 */
216
+ skipped: number;
217
+ /** 错误列表 */
218
+ errors: string[];
219
+ }
220
+ /**
221
+ * 适配器注册表接口
222
+ */
223
+ export interface AdapterRegistry {
224
+ /** 注册适配器 */
225
+ register(adapter: SessionAdapter): void;
226
+ /** 检测所有数据源 */
227
+ detectSources(): Promise<SourceDetection[]>;
228
+ /** 获取指定适配器 */
229
+ getAdapter(name: string): SessionAdapter | undefined;
230
+ /** 索引所有数据源 */
231
+ indexAll(options?: IndexOptions): Promise<IndexResult>;
232
+ }
154
233
  //# sourceMappingURL=memory-types.d.ts.map