@yuaone/core 0.1.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 (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,568 @@
1
+ /**
2
+ * @module memory-manager
3
+ * @description YUAN 프로젝트 메모리 — 세션 간 학습 + 프로젝트 지식.
4
+ *
5
+ * YuanMemory(memory.ts)가 YUAN.md 파일의 읽기/쓰기를 담당한다면,
6
+ * MemoryManager는 그 위에 구조화된 학습/패턴/실패 기록을 관리한다.
7
+ *
8
+ * YUAN.md 파일 구조:
9
+ * ```markdown
10
+ * # YUAN Project Memory
11
+ *
12
+ * ## Project Info
13
+ * - Language: TypeScript
14
+ * - Framework: Next.js
15
+ * ...
16
+ *
17
+ * ## Conventions
18
+ * - use camelCase for variables
19
+ * ...
20
+ *
21
+ * ## Patterns
22
+ * ...
23
+ *
24
+ * ## Learnings
25
+ * ...
26
+ *
27
+ * ## Failed Approaches
28
+ * ...
29
+ * ```
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const mm = new MemoryManager("/path/to/project");
34
+ * const memory = await mm.load();
35
+ *
36
+ * mm.addLearning("build", "Must run tsc before jest for this project");
37
+ * mm.addPattern({ name: "Repository Pattern", description: "...", files: ["src/repo/"], frequency: 5 });
38
+ * mm.addFailedApproach("Tried swc for build", "Incompatible with decorators");
39
+ *
40
+ * await mm.save(mm.getMemory());
41
+ * ```
42
+ */
43
+ import { readFile, writeFile, access, mkdir } from "node:fs/promises";
44
+ import { join, dirname } from "node:path";
45
+ // ─── Constants ───
46
+ const YUAN_MEMORY_FILENAME = "YUAN.md";
47
+ const MAX_LEARNINGS = 100;
48
+ const MAX_PATTERNS = 50;
49
+ const MAX_FAILED_APPROACHES = 30;
50
+ const CONFIDENCE_INCREMENT = 0.15;
51
+ const MAX_CONFIDENCE = 1.0;
52
+ // ─── MemoryManager ───
53
+ /**
54
+ * MemoryManager — YUAN.md 기반 구조화된 프로젝트 메모리.
55
+ *
56
+ * YuanMemory가 YUAN.md의 원시 읽기/쓰기를 담당한다면,
57
+ * MemoryManager는 구조화된 학습, 패턴, 실패 기록을 관리한다.
58
+ * YUAN.md 파일을 마크다운 형식으로 직렬화/역직렬화한다.
59
+ */
60
+ export class MemoryManager {
61
+ workDir;
62
+ memory;
63
+ constructor(workDir) {
64
+ this.workDir = workDir;
65
+ this.memory = this.createEmptyMemory();
66
+ }
67
+ /**
68
+ * YUAN.md를 로드하거나 새로 생성한다.
69
+ * 파일이 없으면 빈 메모리를 반환한다.
70
+ *
71
+ * @returns 로드된 프로젝트 메모리
72
+ */
73
+ async load() {
74
+ const filePath = join(this.workDir, YUAN_MEMORY_FILENAME);
75
+ try {
76
+ await access(filePath);
77
+ const raw = await readFile(filePath, "utf-8");
78
+ this.memory = this.parseMemoryMarkdown(raw);
79
+ }
80
+ catch {
81
+ // 파일 없음 — 빈 메모리 유지
82
+ this.memory = this.createEmptyMemory();
83
+ await this.detectProjectInfo();
84
+ }
85
+ return { ...this.memory };
86
+ }
87
+ /**
88
+ * 현재 메모리를 YUAN.md에 저장한다.
89
+ *
90
+ * @param memory 저장할 메모리 (미지정 시 현재 내부 상태)
91
+ */
92
+ async save(memory) {
93
+ if (memory) {
94
+ this.memory = { ...memory };
95
+ }
96
+ this.memory.lastUpdated = Date.now();
97
+ const filePath = join(this.workDir, YUAN_MEMORY_FILENAME);
98
+ const dir = dirname(filePath);
99
+ try {
100
+ await access(dir);
101
+ }
102
+ catch {
103
+ await mkdir(dir, { recursive: true });
104
+ }
105
+ const markdown = this.serializeToMarkdown(this.memory);
106
+ await writeFile(filePath, markdown, "utf-8");
107
+ }
108
+ /**
109
+ * 현재 메모리를 반환한다 (복사본).
110
+ */
111
+ getMemory() {
112
+ return { ...this.memory };
113
+ }
114
+ /**
115
+ * 세션에서 배운 지식을 추가한다.
116
+ * 동일한 내용이 이미 있으면 confidence와 sessionCount를 증가시킨다.
117
+ *
118
+ * @param category 학습 카테고리 ("build", "test", "deploy", "style", "api", "debug")
119
+ * @param content 학습 내용
120
+ */
121
+ addLearning(category, content) {
122
+ const existing = this.memory.learnings.find((l) => l.category === category && l.content === content);
123
+ if (existing) {
124
+ existing.sessionCount++;
125
+ existing.confidence = Math.min(existing.confidence + CONFIDENCE_INCREMENT, MAX_CONFIDENCE);
126
+ return;
127
+ }
128
+ this.memory.learnings.push({
129
+ category,
130
+ content,
131
+ confidence: CONFIDENCE_INCREMENT,
132
+ sessionCount: 1,
133
+ createdAt: Date.now(),
134
+ });
135
+ // 한도 초과 시 가장 낮은 confidence의 학습 제거
136
+ if (this.memory.learnings.length > MAX_LEARNINGS) {
137
+ this.memory.learnings.sort((a, b) => b.confidence - a.confidence);
138
+ this.memory.learnings = this.memory.learnings.slice(0, MAX_LEARNINGS);
139
+ }
140
+ }
141
+ /**
142
+ * 코드베이스에서 발견된 패턴을 기록한다.
143
+ * 동일한 이름의 패턴이 있으면 frequency를 증가시키고 파일 목록을 병합한다.
144
+ *
145
+ * @param pattern 발견된 코드 패턴
146
+ */
147
+ addPattern(pattern) {
148
+ const existing = this.memory.patterns.find((p) => p.name === pattern.name);
149
+ if (existing) {
150
+ existing.frequency += 1;
151
+ existing.description = pattern.description || existing.description;
152
+ // 파일 목록 병합 (중복 제거)
153
+ const merged = new Set([...existing.files, ...pattern.files]);
154
+ existing.files = [...merged];
155
+ return;
156
+ }
157
+ this.memory.patterns.push({ ...pattern });
158
+ if (this.memory.patterns.length > MAX_PATTERNS) {
159
+ this.memory.patterns.sort((a, b) => b.frequency - a.frequency);
160
+ this.memory.patterns = this.memory.patterns.slice(0, MAX_PATTERNS);
161
+ }
162
+ }
163
+ /**
164
+ * 실패한 접근 방식을 기록하여 같은 실수를 반복하지 않도록 한다.
165
+ *
166
+ * @param approach 시도한 접근 방식
167
+ * @param reason 실패 이유
168
+ */
169
+ addFailedApproach(approach, reason) {
170
+ // 중복 체크
171
+ const exists = this.memory.failedApproaches.some((f) => f.approach === approach);
172
+ if (exists)
173
+ return;
174
+ this.memory.failedApproaches.push({
175
+ approach,
176
+ reason,
177
+ timestamp: Date.now(),
178
+ });
179
+ if (this.memory.failedApproaches.length > MAX_FAILED_APPROACHES) {
180
+ // 오래된 것부터 제거
181
+ this.memory.failedApproaches.sort((a, b) => b.timestamp - a.timestamp);
182
+ this.memory.failedApproaches = this.memory.failedApproaches.slice(0, MAX_FAILED_APPROACHES);
183
+ }
184
+ }
185
+ /**
186
+ * 코딩 규칙을 추가한다.
187
+ *
188
+ * @param convention 규칙 문자열 ("use camelCase" 등)
189
+ */
190
+ addConvention(convention) {
191
+ if (!this.memory.conventions.includes(convention)) {
192
+ this.memory.conventions.push(convention);
193
+ }
194
+ }
195
+ /**
196
+ * 태스크 설명에 관련된 메모리를 조회한다.
197
+ * 키워드 매칭으로 관련 학습, 패턴, 경고를 필터링한다.
198
+ *
199
+ * @param taskDescription 태스크 설명
200
+ * @returns 관련 메모리
201
+ */
202
+ getRelevant(taskDescription) {
203
+ const keywords = this.extractKeywords(taskDescription);
204
+ // 관련 규칙: 항상 전체 반환
205
+ const conventions = [...this.memory.conventions];
206
+ // 관련 패턴: 키워드 매칭
207
+ const patterns = this.memory.patterns.filter((p) => keywords.some((kw) => p.name.toLowerCase().includes(kw) ||
208
+ p.description.toLowerCase().includes(kw) ||
209
+ p.files.some((f) => f.toLowerCase().includes(kw))));
210
+ // 경고: 키워드와 매칭되는 실패 기록
211
+ const warnings = this.memory.failedApproaches
212
+ .filter((f) => keywords.some((kw) => f.approach.toLowerCase().includes(kw) ||
213
+ f.reason.toLowerCase().includes(kw)))
214
+ .map((f) => `WARNING: "${f.approach}" failed because: ${f.reason}`);
215
+ // 관련 학습도 경고에 추가 (높은 confidence만)
216
+ const relevantLearnings = this.memory.learnings.filter((l) => l.confidence >= 0.5 &&
217
+ keywords.some((kw) => l.content.toLowerCase().includes(kw) ||
218
+ l.category.toLowerCase().includes(kw)));
219
+ for (const l of relevantLearnings) {
220
+ warnings.push(`TIP [${l.category}]: ${l.content}`);
221
+ }
222
+ return {
223
+ conventions,
224
+ patterns,
225
+ warnings,
226
+ buildInfo: {
227
+ command: this.memory.buildCommand || "unknown",
228
+ testCommand: this.memory.testCommand || "unknown",
229
+ },
230
+ };
231
+ }
232
+ /**
233
+ * 오래되거나 신뢰도가 낮은 메모리를 정리한다.
234
+ *
235
+ * @param maxEntries 각 카테고리별 최대 항목 수 (기본값: 각 카테고리 기본 한도)
236
+ */
237
+ prune(maxEntries) {
238
+ const maxL = maxEntries ?? MAX_LEARNINGS;
239
+ const maxP = maxEntries ?? MAX_PATTERNS;
240
+ const maxF = maxEntries ?? MAX_FAILED_APPROACHES;
241
+ // 학습: confidence 순 유지
242
+ if (this.memory.learnings.length > maxL) {
243
+ this.memory.learnings.sort((a, b) => b.confidence - a.confidence);
244
+ this.memory.learnings = this.memory.learnings.slice(0, maxL);
245
+ }
246
+ // 패턴: frequency 순 유지
247
+ if (this.memory.patterns.length > maxP) {
248
+ this.memory.patterns.sort((a, b) => b.frequency - a.frequency);
249
+ this.memory.patterns = this.memory.patterns.slice(0, maxP);
250
+ }
251
+ // 실패: 최신 유지
252
+ if (this.memory.failedApproaches.length > maxF) {
253
+ this.memory.failedApproaches.sort((a, b) => b.timestamp - a.timestamp);
254
+ this.memory.failedApproaches = this.memory.failedApproaches.slice(0, maxF);
255
+ }
256
+ // 오래된 실패 기록 제거 (90일 이상)
257
+ const cutoff = Date.now() - 90 * 24 * 60 * 60 * 1000;
258
+ this.memory.failedApproaches = this.memory.failedApproaches.filter((f) => f.timestamp > cutoff);
259
+ // 극도로 낮은 confidence 학습 제거
260
+ this.memory.learnings = this.memory.learnings.filter((l) => l.confidence > 0.05);
261
+ }
262
+ // ─── Private: Serialization ───
263
+ serializeToMarkdown(memory) {
264
+ const sections = [];
265
+ // Header
266
+ sections.push(`# YUAN Project Memory\n`);
267
+ sections.push(`> Auto-generated by YUAN Agent. Last updated: ${new Date(memory.lastUpdated).toISOString()}\n`);
268
+ // Project Info
269
+ sections.push(`## Project Info\n`);
270
+ sections.push(`- **Name:** ${memory.projectName}`);
271
+ sections.push(`- **Language:** ${memory.language}`);
272
+ sections.push(`- **Framework:** ${memory.framework}`);
273
+ sections.push(`- **Build:** \`${memory.buildCommand}\``);
274
+ sections.push(`- **Test:** \`${memory.testCommand}\``);
275
+ sections.push("");
276
+ // Conventions
277
+ if (memory.conventions.length > 0) {
278
+ sections.push(`## Conventions\n`);
279
+ for (const c of memory.conventions) {
280
+ sections.push(`- ${c}`);
281
+ }
282
+ sections.push("");
283
+ }
284
+ // Patterns
285
+ if (memory.patterns.length > 0) {
286
+ sections.push(`## Patterns\n`);
287
+ for (const p of memory.patterns) {
288
+ sections.push(`### ${p.name} (freq: ${p.frequency})`);
289
+ sections.push(p.description);
290
+ if (p.files.length > 0) {
291
+ sections.push(`Files: ${p.files.join(", ")}`);
292
+ }
293
+ sections.push("");
294
+ }
295
+ }
296
+ // Learnings
297
+ if (memory.learnings.length > 0) {
298
+ sections.push(`## Learnings\n`);
299
+ // 높은 confidence 먼저
300
+ const sorted = [...memory.learnings].sort((a, b) => b.confidence - a.confidence);
301
+ for (const l of sorted) {
302
+ sections.push(`- [${l.category}] (confidence: ${l.confidence.toFixed(2)}, sessions: ${l.sessionCount}) ${l.content}`);
303
+ }
304
+ sections.push("");
305
+ }
306
+ // Failed Approaches
307
+ if (memory.failedApproaches.length > 0) {
308
+ sections.push(`## Failed Approaches\n`);
309
+ for (const f of memory.failedApproaches) {
310
+ const date = new Date(f.timestamp).toISOString().split("T")[0];
311
+ sections.push(`- [${date}] **${f.approach}** — ${f.reason}`);
312
+ }
313
+ sections.push("");
314
+ }
315
+ return sections.join("\n");
316
+ }
317
+ parseMemoryMarkdown(raw) {
318
+ const memory = this.createEmptyMemory();
319
+ const lines = raw.split("\n");
320
+ let currentSection = "";
321
+ for (let i = 0; i < lines.length; i++) {
322
+ const line = lines[i];
323
+ // Section header detection
324
+ const h2Match = line.match(/^## (.+)$/);
325
+ if (h2Match) {
326
+ currentSection = h2Match[1].trim();
327
+ continue;
328
+ }
329
+ switch (currentSection) {
330
+ case "Project Info":
331
+ this.parseProjectInfoLine(line, memory);
332
+ break;
333
+ case "Conventions":
334
+ this.parseConventionLine(line, memory);
335
+ break;
336
+ case "Patterns": {
337
+ const h3Match = line.match(/^### (.+?) \(freq: (\d+)\)$/);
338
+ if (h3Match) {
339
+ const pattern = {
340
+ name: h3Match[1],
341
+ description: "",
342
+ files: [],
343
+ frequency: parseInt(h3Match[2], 10),
344
+ };
345
+ // 다음 줄들에서 description과 files 파싱
346
+ let j = i + 1;
347
+ while (j < lines.length && !lines[j].startsWith("##") && !lines[j].startsWith("### ")) {
348
+ const pLine = lines[j].trim();
349
+ if (pLine.startsWith("Files: ")) {
350
+ pattern.files = pLine
351
+ .slice(7)
352
+ .split(", ")
353
+ .map((f) => f.trim())
354
+ .filter(Boolean);
355
+ }
356
+ else if (pLine.length > 0) {
357
+ pattern.description = pLine;
358
+ }
359
+ j++;
360
+ }
361
+ i = j - 1;
362
+ memory.patterns.push(pattern);
363
+ }
364
+ break;
365
+ }
366
+ case "Learnings":
367
+ this.parseLearningLine(line, memory);
368
+ break;
369
+ case "Failed Approaches":
370
+ this.parseFailedApproachLine(line, memory);
371
+ break;
372
+ }
373
+ }
374
+ return memory;
375
+ }
376
+ parseProjectInfoLine(line, memory) {
377
+ const kvMatch = line.match(/^- \*\*(.+?):\*\*\s*`?(.+?)`?\s*$/);
378
+ if (!kvMatch)
379
+ return;
380
+ const key = kvMatch[1].toLowerCase();
381
+ const value = kvMatch[2];
382
+ switch (key) {
383
+ case "name":
384
+ memory.projectName = value;
385
+ break;
386
+ case "language":
387
+ memory.language = value;
388
+ break;
389
+ case "framework":
390
+ memory.framework = value;
391
+ break;
392
+ case "build":
393
+ memory.buildCommand = value;
394
+ break;
395
+ case "test":
396
+ memory.testCommand = value;
397
+ break;
398
+ }
399
+ }
400
+ parseConventionLine(line, memory) {
401
+ const match = line.match(/^- (.+)$/);
402
+ if (match) {
403
+ memory.conventions.push(match[1].trim());
404
+ }
405
+ }
406
+ parseLearningLine(line, memory) {
407
+ // Format: - [category] (confidence: 0.30, sessions: 2) content
408
+ const match = line.match(/^- \[(.+?)\] \(confidence: ([\d.]+), sessions: (\d+)\) (.+)$/);
409
+ if (match) {
410
+ memory.learnings.push({
411
+ category: match[1],
412
+ confidence: parseFloat(match[2]),
413
+ sessionCount: parseInt(match[3], 10),
414
+ content: match[4],
415
+ createdAt: Date.now(),
416
+ });
417
+ }
418
+ }
419
+ parseFailedApproachLine(line, memory) {
420
+ // Format: - [YYYY-MM-DD] **approach** — reason
421
+ const match = line.match(/^- \[(\d{4}-\d{2}-\d{2})\] \*\*(.+?)\*\* — (.+)$/);
422
+ if (match) {
423
+ memory.failedApproaches.push({
424
+ approach: match[2],
425
+ reason: match[3],
426
+ timestamp: new Date(match[1]).getTime(),
427
+ });
428
+ }
429
+ }
430
+ // ─── Private: Project Detection ───
431
+ async detectProjectInfo() {
432
+ // 프로젝트 이름: 디렉토리 이름
433
+ const parts = this.workDir.split("/");
434
+ this.memory.projectName = parts[parts.length - 1] || "unknown";
435
+ // package.json에서 정보 추출
436
+ try {
437
+ const pkgPath = join(this.workDir, "package.json");
438
+ const raw = await readFile(pkgPath, "utf-8");
439
+ const pkg = JSON.parse(raw);
440
+ if (pkg.name) {
441
+ this.memory.projectName = String(pkg.name);
442
+ }
443
+ const scripts = pkg.scripts;
444
+ if (scripts?.build) {
445
+ this.memory.buildCommand = `npm run build`;
446
+ }
447
+ if (scripts?.test) {
448
+ this.memory.testCommand = `npm run test`;
449
+ }
450
+ // 패키지 매니저 감지
451
+ const hasLock = await this.detectPackageManager();
452
+ if (hasLock) {
453
+ this.memory.buildCommand = this.memory.buildCommand.replace("npm", hasLock);
454
+ this.memory.testCommand = this.memory.testCommand.replace("npm", hasLock);
455
+ }
456
+ // 언어/프레임워크 감지
457
+ await this.detectLanguageAndFramework(pkg);
458
+ }
459
+ catch {
460
+ // package.json 없음 — 다른 감지 방법 시도
461
+ await this.detectNonNodeProject();
462
+ }
463
+ }
464
+ async detectPackageManager() {
465
+ const checks = [
466
+ ["pnpm-lock.yaml", "pnpm"],
467
+ ["yarn.lock", "yarn"],
468
+ ["package-lock.json", "npm"],
469
+ ];
470
+ for (const [file, manager] of checks) {
471
+ try {
472
+ await access(join(this.workDir, file));
473
+ return manager;
474
+ }
475
+ catch {
476
+ continue;
477
+ }
478
+ }
479
+ return null;
480
+ }
481
+ async detectLanguageAndFramework(pkg) {
482
+ // TypeScript check
483
+ try {
484
+ await access(join(this.workDir, "tsconfig.json"));
485
+ this.memory.language = "TypeScript";
486
+ }
487
+ catch {
488
+ this.memory.language = "JavaScript";
489
+ }
490
+ // Framework from dependencies
491
+ const deps = {
492
+ ...pkg.dependencies,
493
+ ...pkg.devDependencies,
494
+ };
495
+ if (deps.next)
496
+ this.memory.framework = "Next.js";
497
+ else if (deps.react)
498
+ this.memory.framework = "React";
499
+ else if (deps.vue)
500
+ this.memory.framework = "Vue";
501
+ else if (deps.svelte)
502
+ this.memory.framework = "Svelte";
503
+ else if (deps.express)
504
+ this.memory.framework = "Express";
505
+ else if (deps.fastify)
506
+ this.memory.framework = "Fastify";
507
+ else if (deps["@nestjs/core"])
508
+ this.memory.framework = "NestJS";
509
+ else
510
+ this.memory.framework = "Node.js";
511
+ }
512
+ async detectNonNodeProject() {
513
+ const indicators = [
514
+ ["Cargo.toml", "Rust", "Cargo"],
515
+ ["go.mod", "Go", "Go"],
516
+ ["pyproject.toml", "Python", "Python"],
517
+ ["setup.py", "Python", "Python"],
518
+ ["requirements.txt", "Python", "Python"],
519
+ ["build.gradle", "Java", "Gradle"],
520
+ ["pom.xml", "Java", "Maven"],
521
+ ];
522
+ for (const [file, lang, framework] of indicators) {
523
+ try {
524
+ await access(join(this.workDir, file));
525
+ this.memory.language = lang;
526
+ this.memory.framework = framework;
527
+ return;
528
+ }
529
+ catch {
530
+ continue;
531
+ }
532
+ }
533
+ }
534
+ // ─── Private: Helpers ───
535
+ createEmptyMemory() {
536
+ return {
537
+ projectName: "",
538
+ language: "",
539
+ framework: "",
540
+ buildCommand: "",
541
+ testCommand: "",
542
+ conventions: [],
543
+ patterns: [],
544
+ learnings: [],
545
+ failedApproaches: [],
546
+ lastUpdated: Date.now(),
547
+ };
548
+ }
549
+ /**
550
+ * 태스크 설명에서 검색용 키워드를 추출한다.
551
+ * 소문자로 변환하고 불용어를 제거한다.
552
+ */
553
+ extractKeywords(text) {
554
+ const stopWords = new Set([
555
+ "the", "a", "an", "is", "are", "was", "were", "be",
556
+ "to", "of", "and", "in", "that", "have", "it",
557
+ "for", "not", "on", "with", "as", "do", "at",
558
+ "this", "but", "from", "or", "by", "will", "my",
559
+ "all", "can", "had", "her", "one", "our", "out",
560
+ ]);
561
+ return text
562
+ .toLowerCase()
563
+ .replace(/[^a-z0-9\s_-]/g, " ")
564
+ .split(/\s+/)
565
+ .filter((w) => w.length > 2 && !stopWords.has(w));
566
+ }
567
+ }
568
+ //# sourceMappingURL=memory-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-manager.js","sourceRoot":"","sources":["../src/memory-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @module memory
3
+ * @description YUAN.md 프로젝트 메모리 관리.
4
+ * 프로젝트 루트의 YUAN.md를 읽고/쓰고/파싱하여 에이전트에 컨텍스트를 제공.
5
+ */
6
+ /** YUAN.md 파싱 결과 */
7
+ export interface YuanMemoryData {
8
+ /** 원본 내용 */
9
+ raw: string;
10
+ /** 파일 경로 */
11
+ filePath: string;
12
+ /** 파싱된 섹션 */
13
+ sections: Map<string, string>;
14
+ }
15
+ /** 프로젝트 구조 분석 결과 */
16
+ export interface ProjectStructure {
17
+ /** 주 프로그래밍 언어 */
18
+ primaryLanguage: string;
19
+ /** 프레임워크 */
20
+ framework: string;
21
+ /** 패키지 매니저 */
22
+ packageManager: string;
23
+ /** 엔트리 포인트 */
24
+ entryPoint: string;
25
+ /** 디렉토리 트리 (depth 3) */
26
+ treeView: string;
27
+ /** 총 파일 수 */
28
+ fileCount: number;
29
+ }
30
+ /**
31
+ * YuanMemory — YUAN.md 기반 프로젝트 메모리.
32
+ *
33
+ * 역할:
34
+ * - YUAN.md 자동 탐색 및 읽기
35
+ * - 프로젝트 구조 자동 감지 (package.json, tsconfig 등)
36
+ * - 메모리 업데이트/쓰기
37
+ */
38
+ export declare class YuanMemory {
39
+ private projectPath;
40
+ private memoryData;
41
+ private projectStructure;
42
+ constructor(projectPath: string);
43
+ /**
44
+ * YUAN.md를 탐색하고 읽는다.
45
+ * 우선순위: YUAN.md > .yuan/config.md > .yuan/YUAN.md > docs/YUAN.md
46
+ * @returns 파싱된 메모리 데이터 (없으면 null)
47
+ */
48
+ load(): Promise<YuanMemoryData | null>;
49
+ /**
50
+ * 현재 로드된 메모리를 반환.
51
+ */
52
+ getMemory(): YuanMemoryData | null;
53
+ /**
54
+ * 프로젝트 구조를 자동 감지.
55
+ * package.json, tsconfig.json, Cargo.toml 등을 분석.
56
+ */
57
+ analyzeProject(): Promise<ProjectStructure>;
58
+ /**
59
+ * YUAN.md에 섹션을 추가하거나 업데이트.
60
+ * @param sectionName 섹션 이름 (## 헤더)
61
+ * @param content 섹션 내용
62
+ */
63
+ updateSection(sectionName: string, content: string): Promise<void>;
64
+ /**
65
+ * 시스템 프롬프트에 포함할 메모리 문자열 생성.
66
+ */
67
+ toPromptString(): string;
68
+ /**
69
+ * 마크다운 ## 헤더 기준으로 섹션 분리.
70
+ */
71
+ private parseSections;
72
+ private sectionsToMarkdown;
73
+ private detectLanguage;
74
+ private detectFramework;
75
+ private detectPackageManager;
76
+ private detectEntryPoint;
77
+ /**
78
+ * 디렉토리 트리를 문자열로 생성 (depth 제한).
79
+ */
80
+ private buildTreeView;
81
+ /**
82
+ * 프로젝트 내 파일 수 카운팅 (node_modules 등 제외).
83
+ */
84
+ private countFiles;
85
+ private fileExists;
86
+ }
87
+ //# sourceMappingURL=memory.d.ts.map