a2a-memory 0.11.5 → 0.12.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 (274) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.d.ts +8 -2
  10. package/dist/claude/sync.js +1 -298
  11. package/dist/cli/commands/add.js +1 -80
  12. package/dist/cli/commands/claude-sync.d.ts +3 -3
  13. package/dist/cli/commands/claude-sync.js +1 -70
  14. package/dist/cli/commands/cleanup.js +1 -83
  15. package/dist/cli/commands/config.js +1 -79
  16. package/dist/cli/commands/edit.js +1 -69
  17. package/dist/cli/commands/embed.js +1 -92
  18. package/dist/cli/commands/extract.js +1 -103
  19. package/dist/cli/commands/health.js +1 -105
  20. package/dist/cli/commands/list.js +1 -46
  21. package/dist/cli/commands/migrate-chunks.js +1 -205
  22. package/dist/cli/commands/migrate-file-refs.js +1 -183
  23. package/dist/cli/commands/proficiency.js +1 -146
  24. package/dist/cli/commands/rm.js +1 -64
  25. package/dist/cli/commands/search.js +1 -90
  26. package/dist/cli/commands/setup-wizard.js +1 -387
  27. package/dist/cli/commands/setup.js +1 -170
  28. package/dist/cli/commands/skill.js +1 -151
  29. package/dist/cli/commands/status.js +1 -70
  30. package/dist/cli/commands/sync.js +1 -202
  31. package/dist/cli/commands/team.js +1 -142
  32. package/dist/cli/index.js +1 -87
  33. package/dist/config/manager.js +1 -372
  34. package/dist/db/database.d.ts +36 -0
  35. package/dist/db/database.js +1 -1400
  36. package/dist/embedding/e5-provider.js +1 -147
  37. package/dist/embedding/index.js +1 -34
  38. package/dist/embedding/local-provider.js +1 -157
  39. package/dist/embedding/openai-provider.js +1 -92
  40. package/dist/embedding/quantization.js +1 -89
  41. package/dist/extraction/dedup-manager.js +1 -161
  42. package/dist/extraction/emotion-filter.js +1 -33
  43. package/dist/extraction/extractor.d.ts +0 -3
  44. package/dist/extraction/extractor.js +1 -648
  45. package/dist/extraction/file-reference.js +1 -77
  46. package/dist/extraction/filter.js +1 -86
  47. package/dist/extraction/scorer.js +1 -142
  48. package/dist/extraction/similarity.js +1 -85
  49. package/dist/hooks/client-factory.js +1 -44
  50. package/dist/hooks/post-tool-use.js +1 -518
  51. package/dist/hooks/pre-compact.js +1 -209
  52. package/dist/hooks/session-end.js +1 -633
  53. package/dist/hooks/session-start.js +1 -549
  54. package/dist/hooks/shared.js +1 -110
  55. package/dist/hooks/stop.d.ts +21 -0
  56. package/dist/hooks/stop.js +1 -0
  57. package/dist/hooks/user-prompt-submit.js +1 -316
  58. package/dist/i18n/index.js +1 -2
  59. package/dist/i18n/messages.js +1 -150
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.js +1 -43
  62. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  63. package/dist/lifecycle/cleanup.d.ts +1 -0
  64. package/dist/lifecycle/cleanup.js +1 -116
  65. package/dist/lifecycle/consolidation.d.ts +22 -0
  66. package/dist/lifecycle/consolidation.js +1 -0
  67. package/dist/lifecycle/index.d.ts +2 -0
  68. package/dist/lifecycle/index.js +1 -13
  69. package/dist/lifecycle/injection-flush.d.ts +24 -0
  70. package/dist/lifecycle/injection-flush.js +1 -0
  71. package/dist/lifecycle/quality-scorer.d.ts +5 -6
  72. package/dist/lifecycle/quality-scorer.js +1 -46
  73. package/dist/lifecycle/tiering.js +1 -246
  74. package/dist/llm/client.js +1 -226
  75. package/dist/llm/index.js +1 -5
  76. package/dist/proficiency/actr-engine.js +1 -106
  77. package/dist/proficiency/detection.js +1 -77
  78. package/dist/proficiency/index.js +1 -9
  79. package/dist/proficiency/tracker.js +1 -173
  80. package/dist/proficiency/types.js +1 -8
  81. package/dist/providers/adapters.js +1 -140
  82. package/dist/providers/detector.js +1 -57
  83. package/dist/search/adaptive-router.js +1 -93
  84. package/dist/search/index.js +1 -9
  85. package/dist/search/ranker.js +1 -171
  86. package/dist/search/reranker.js +1 -155
  87. package/dist/session/parser.js +1 -130
  88. package/dist/skill/evaluator.js +1 -509
  89. package/dist/skill/index.js +1 -7
  90. package/dist/skill/types.js +1 -7
  91. package/dist/sync/client.d.ts +7 -0
  92. package/dist/sync/client.js +1 -597
  93. package/dist/sync/encryption.js +1 -203
  94. package/dist/sync/index.js +1 -12
  95. package/dist/sync/queue.js +1 -214
  96. package/dist/sync/scheduler.js +1 -140
  97. package/dist/sync/synchronizer.js +1 -241
  98. package/dist/sync/team-synchronizer.js +1 -204
  99. package/dist/sync/vector-clock.js +1 -70
  100. package/dist/types/index.d.ts +13 -1
  101. package/dist/types/index.js +1 -132
  102. package/dist/utils/keychain.js +1 -170
  103. package/dist/utils/logger.js +1 -128
  104. package/package.json +15 -10
  105. package/dist/a2a/client.d.ts.map +0 -1
  106. package/dist/a2a/client.js.map +0 -1
  107. package/dist/a2a/discovery.d.ts.map +0 -1
  108. package/dist/a2a/discovery.js.map +0 -1
  109. package/dist/a2a/index.d.ts.map +0 -1
  110. package/dist/a2a/index.js.map +0 -1
  111. package/dist/a2a/types.d.ts.map +0 -1
  112. package/dist/a2a/types.js.map +0 -1
  113. package/dist/adapters/anthropic.d.ts.map +0 -1
  114. package/dist/adapters/anthropic.js.map +0 -1
  115. package/dist/chunking/chunker.d.ts.map +0 -1
  116. package/dist/chunking/chunker.js.map +0 -1
  117. package/dist/claude/sync.d.ts.map +0 -1
  118. package/dist/claude/sync.js.map +0 -1
  119. package/dist/cli/commands/add.d.ts.map +0 -1
  120. package/dist/cli/commands/add.js.map +0 -1
  121. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  122. package/dist/cli/commands/claude-sync.js.map +0 -1
  123. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  124. package/dist/cli/commands/cleanup.js.map +0 -1
  125. package/dist/cli/commands/config.d.ts.map +0 -1
  126. package/dist/cli/commands/config.js.map +0 -1
  127. package/dist/cli/commands/edit.d.ts.map +0 -1
  128. package/dist/cli/commands/edit.js.map +0 -1
  129. package/dist/cli/commands/embed.d.ts.map +0 -1
  130. package/dist/cli/commands/embed.js.map +0 -1
  131. package/dist/cli/commands/extract.d.ts.map +0 -1
  132. package/dist/cli/commands/extract.js.map +0 -1
  133. package/dist/cli/commands/health.d.ts.map +0 -1
  134. package/dist/cli/commands/health.js.map +0 -1
  135. package/dist/cli/commands/list.d.ts.map +0 -1
  136. package/dist/cli/commands/list.js.map +0 -1
  137. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  138. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  139. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  140. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  141. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  142. package/dist/cli/commands/proficiency.js.map +0 -1
  143. package/dist/cli/commands/rm.d.ts.map +0 -1
  144. package/dist/cli/commands/rm.js.map +0 -1
  145. package/dist/cli/commands/search.d.ts.map +0 -1
  146. package/dist/cli/commands/search.js.map +0 -1
  147. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  148. package/dist/cli/commands/setup-wizard.js.map +0 -1
  149. package/dist/cli/commands/setup.d.ts.map +0 -1
  150. package/dist/cli/commands/setup.js.map +0 -1
  151. package/dist/cli/commands/skill.d.ts.map +0 -1
  152. package/dist/cli/commands/skill.js.map +0 -1
  153. package/dist/cli/commands/status.d.ts.map +0 -1
  154. package/dist/cli/commands/status.js.map +0 -1
  155. package/dist/cli/commands/sync.d.ts.map +0 -1
  156. package/dist/cli/commands/sync.js.map +0 -1
  157. package/dist/cli/commands/team.d.ts.map +0 -1
  158. package/dist/cli/commands/team.js.map +0 -1
  159. package/dist/cli/index.d.ts.map +0 -1
  160. package/dist/cli/index.js.map +0 -1
  161. package/dist/config/manager.d.ts.map +0 -1
  162. package/dist/config/manager.js.map +0 -1
  163. package/dist/db/database.d.ts.map +0 -1
  164. package/dist/db/database.js.map +0 -1
  165. package/dist/embedding/e5-provider.d.ts.map +0 -1
  166. package/dist/embedding/e5-provider.js.map +0 -1
  167. package/dist/embedding/index.d.ts.map +0 -1
  168. package/dist/embedding/index.js.map +0 -1
  169. package/dist/embedding/local-provider.d.ts.map +0 -1
  170. package/dist/embedding/local-provider.js.map +0 -1
  171. package/dist/embedding/openai-provider.d.ts.map +0 -1
  172. package/dist/embedding/openai-provider.js.map +0 -1
  173. package/dist/embedding/quantization.d.ts.map +0 -1
  174. package/dist/embedding/quantization.js.map +0 -1
  175. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  176. package/dist/extraction/dedup-manager.js.map +0 -1
  177. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  178. package/dist/extraction/emotion-filter.js.map +0 -1
  179. package/dist/extraction/extractor.d.ts.map +0 -1
  180. package/dist/extraction/extractor.js.map +0 -1
  181. package/dist/extraction/file-reference.d.ts.map +0 -1
  182. package/dist/extraction/file-reference.js.map +0 -1
  183. package/dist/extraction/filter.d.ts.map +0 -1
  184. package/dist/extraction/filter.js.map +0 -1
  185. package/dist/extraction/scorer.d.ts.map +0 -1
  186. package/dist/extraction/scorer.js.map +0 -1
  187. package/dist/extraction/similarity.d.ts.map +0 -1
  188. package/dist/extraction/similarity.js.map +0 -1
  189. package/dist/hooks/client-factory.d.ts.map +0 -1
  190. package/dist/hooks/client-factory.js.map +0 -1
  191. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  192. package/dist/hooks/post-tool-use.js.map +0 -1
  193. package/dist/hooks/pre-compact.d.ts.map +0 -1
  194. package/dist/hooks/pre-compact.js.map +0 -1
  195. package/dist/hooks/session-end.d.ts.map +0 -1
  196. package/dist/hooks/session-end.js.map +0 -1
  197. package/dist/hooks/session-start.d.ts.map +0 -1
  198. package/dist/hooks/session-start.js.map +0 -1
  199. package/dist/hooks/shared.d.ts.map +0 -1
  200. package/dist/hooks/shared.js.map +0 -1
  201. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  202. package/dist/hooks/user-prompt-submit.js.map +0 -1
  203. package/dist/i18n/index.d.ts.map +0 -1
  204. package/dist/i18n/index.js.map +0 -1
  205. package/dist/i18n/messages.d.ts.map +0 -1
  206. package/dist/i18n/messages.js.map +0 -1
  207. package/dist/index.d.ts.map +0 -1
  208. package/dist/index.js.map +0 -1
  209. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  210. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  211. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  212. package/dist/lifecycle/cleanup.js.map +0 -1
  213. package/dist/lifecycle/index.d.ts.map +0 -1
  214. package/dist/lifecycle/index.js.map +0 -1
  215. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  216. package/dist/lifecycle/quality-scorer.js.map +0 -1
  217. package/dist/lifecycle/tiering.d.ts.map +0 -1
  218. package/dist/lifecycle/tiering.js.map +0 -1
  219. package/dist/llm/client.d.ts.map +0 -1
  220. package/dist/llm/client.js.map +0 -1
  221. package/dist/llm/index.d.ts.map +0 -1
  222. package/dist/llm/index.js.map +0 -1
  223. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  224. package/dist/proficiency/actr-engine.js.map +0 -1
  225. package/dist/proficiency/detection.d.ts.map +0 -1
  226. package/dist/proficiency/detection.js.map +0 -1
  227. package/dist/proficiency/index.d.ts.map +0 -1
  228. package/dist/proficiency/index.js.map +0 -1
  229. package/dist/proficiency/tracker.d.ts.map +0 -1
  230. package/dist/proficiency/tracker.js.map +0 -1
  231. package/dist/proficiency/types.d.ts.map +0 -1
  232. package/dist/proficiency/types.js.map +0 -1
  233. package/dist/providers/adapters.d.ts.map +0 -1
  234. package/dist/providers/adapters.js.map +0 -1
  235. package/dist/providers/detector.d.ts.map +0 -1
  236. package/dist/providers/detector.js.map +0 -1
  237. package/dist/search/adaptive-router.d.ts.map +0 -1
  238. package/dist/search/adaptive-router.js.map +0 -1
  239. package/dist/search/index.d.ts.map +0 -1
  240. package/dist/search/index.js.map +0 -1
  241. package/dist/search/ranker.d.ts.map +0 -1
  242. package/dist/search/ranker.js.map +0 -1
  243. package/dist/search/reranker.d.ts.map +0 -1
  244. package/dist/search/reranker.js.map +0 -1
  245. package/dist/session/parser.d.ts.map +0 -1
  246. package/dist/session/parser.js.map +0 -1
  247. package/dist/skill/evaluator.d.ts.map +0 -1
  248. package/dist/skill/evaluator.js.map +0 -1
  249. package/dist/skill/index.d.ts.map +0 -1
  250. package/dist/skill/index.js.map +0 -1
  251. package/dist/skill/types.d.ts.map +0 -1
  252. package/dist/skill/types.js.map +0 -1
  253. package/dist/sync/client.d.ts.map +0 -1
  254. package/dist/sync/client.js.map +0 -1
  255. package/dist/sync/encryption.d.ts.map +0 -1
  256. package/dist/sync/encryption.js.map +0 -1
  257. package/dist/sync/index.d.ts.map +0 -1
  258. package/dist/sync/index.js.map +0 -1
  259. package/dist/sync/queue.d.ts.map +0 -1
  260. package/dist/sync/queue.js.map +0 -1
  261. package/dist/sync/scheduler.d.ts.map +0 -1
  262. package/dist/sync/scheduler.js.map +0 -1
  263. package/dist/sync/synchronizer.d.ts.map +0 -1
  264. package/dist/sync/synchronizer.js.map +0 -1
  265. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  266. package/dist/sync/team-synchronizer.js.map +0 -1
  267. package/dist/sync/vector-clock.d.ts.map +0 -1
  268. package/dist/sync/vector-clock.js.map +0 -1
  269. package/dist/types/index.d.ts.map +0 -1
  270. package/dist/types/index.js.map +0 -1
  271. package/dist/utils/keychain.d.ts.map +0 -1
  272. package/dist/utils/keychain.js.map +0 -1
  273. package/dist/utils/logger.d.ts.map +0 -1
  274. package/dist/utils/logger.js.map +0 -1
@@ -1,298 +1 @@
1
- /**
2
- * CLAUDE.md Sync
3
- *
4
- * CLAUDE.md 파일을 파싱하여 섹션별 메모리를 생성/업데이트합니다.
5
- *
6
- * 동작:
7
- * 1. CLAUDE.md 파일 탐색 (프로젝트 루트, .claude/ 등)
8
- * 2. 마크다운 헤딩(##) 기준으로 섹션 분리
9
- * 3. Parent-Child 패턴: 파일 전체 → Parent, 섹션별 → Child
10
- * 4. content hash로 중복/변경 감지
11
- */
12
- import { readFileSync, existsSync } from 'node:fs';
13
- import { join, basename } from 'node:path';
14
- import { createHash } from 'node:crypto';
15
- const CLAUDE_MD_TAG = 'claude-md-sync';
16
- /**
17
- * Claude auto-memory 파일 여부 판별
18
- *
19
- * 감지 대상:
20
- * - ~/.claude/projects/{hash}/memory/*.md (auto memory 파일)
21
- * - {project}/CLAUDE.md (프로젝트 루트)
22
- */
23
- export function isClaudeMemoryFile(filePath) {
24
- // ~/.claude/projects/<hash>/memory/*.md
25
- if (/\/.claude\/projects\/[^/]+\/memory\/[^/]+\.md$/i.test(filePath))
26
- return true;
27
- // CLAUDE.md (프로젝트 루트)
28
- if (/\/CLAUDE\.md$/.test(filePath))
29
- return true;
30
- return false;
31
- }
32
- /**
33
- * CLAUDE.md 파일 동기화
34
- */
35
- export async function syncClaudeMd(db, options = {}) {
36
- const filePath = options.claudeMdPath ?? findClaudeMd(options.projectPath);
37
- if (!filePath || !existsSync(filePath)) {
38
- return {
39
- found: false,
40
- filePath: filePath ?? '',
41
- totalSections: 0,
42
- created: 0,
43
- updated: 0,
44
- skipped: 0,
45
- sections: [],
46
- };
47
- }
48
- const content = readFileSync(filePath, 'utf-8');
49
- const sections = parseClaudeMd(content);
50
- const filename = basename(filePath);
51
- const contentHash = computeHash(content);
52
- const result = {
53
- found: true,
54
- filePath,
55
- totalSections: sections.length,
56
- created: 0,
57
- updated: 0,
58
- skipped: 0,
59
- sections: [],
60
- };
61
- const projectPath = options.projectPath ?? process.cwd();
62
- // Parent-Child 패턴: Parent 탐색
63
- const existingParent = findExistingParent(db, filename, projectPath);
64
- if (existingParent) {
65
- // hash 비교
66
- const existingHashTag = existingParent.tags.find(t => t.startsWith('hash:'));
67
- const existingHash = existingHashTag?.slice(5) ?? '';
68
- if (existingHash === contentHash && !options.force) {
69
- // 변경 없음 → 전체 스킵
70
- result.skipped = sections.length;
71
- for (const section of sections) {
72
- result.sections.push({ title: section.title, category: classifySection(section.title), action: 'skipped' });
73
- }
74
- return result;
75
- }
76
- // 변경됨 → Parent 업데이트 + Children 재생성
77
- if (!options.dryRun) {
78
- // sync_status 보존을 위해 기존 remoteId 저장
79
- const oldSyncStatus = db.getSyncStatus(existingParent.id);
80
- // 새 Parent + Children 생성 입력값 준비
81
- const parentTags = [CLAUDE_MD_TAG, `source:${filename}`, `hash:${contentHash}`];
82
- const childInputs = sections.map((section) => ({
83
- content: formatSectionAsMemory(section, filePath),
84
- category: classifySection(section.title),
85
- tier: 'semantic',
86
- tags: [CLAUDE_MD_TAG, `section:${section.title}`, `hash:${section.hash}`, `source:${filename}`],
87
- projectPath,
88
- }));
89
- // 원자적 교체: 기존 삭제 + 신규 생성을 단일 트랜잭션으로 처리
90
- const newParentId = db.replaceMemoryWithChunks(existingParent.id, {
91
- content,
92
- category: 'project_knowledge',
93
- tier: 'semantic',
94
- tags: parentTags,
95
- projectPath,
96
- }, childInputs);
97
- // 이전 sync_status의 remoteId가 있으면 새 parentId에 pending으로 복원
98
- if (oldSyncStatus?.remoteId) {
99
- db.setSyncStatus(newParentId, oldSyncStatus.remoteId, 'pending');
100
- }
101
- }
102
- result.updated = sections.length;
103
- for (const section of sections) {
104
- result.sections.push({ title: section.title, category: classifySection(section.title), action: 'updated' });
105
- }
106
- }
107
- else {
108
- // Parent 없음: 레거시 섹션별 메모리 존재 여부 확인
109
- const hasLegacyMemories = sections.some(s => findExistingMemory(db, s.title, projectPath) !== null);
110
- if (hasLegacyMemories) {
111
- // 레거시 모드: 기존 섹션별 처리 (하위호환)
112
- for (const section of sections) {
113
- const category = classifySection(section.title);
114
- const memoryContent = formatSectionAsMemory(section, filePath);
115
- const sectionTags = [CLAUDE_MD_TAG, `section:${section.title}`, `hash:${section.hash}`];
116
- const existing = findExistingMemory(db, section.title, projectPath);
117
- if (existing) {
118
- const existingHashTag = existing.tags.find(t => t.startsWith('hash:'));
119
- const existingHash = existingHashTag?.slice(5) ?? '';
120
- if (existingHash === section.hash && !options.force) {
121
- result.skipped++;
122
- result.sections.push({ title: section.title, category, action: 'skipped' });
123
- continue;
124
- }
125
- if (!options.dryRun) {
126
- db.updateMemory(existing.id, { content: memoryContent, category, tags: sectionTags });
127
- }
128
- result.updated++;
129
- result.sections.push({ title: section.title, category, action: 'updated' });
130
- }
131
- else {
132
- if (!options.dryRun) {
133
- db.createMemory({ content: memoryContent, category, tier: 'semantic', tags: sectionTags, projectPath });
134
- }
135
- result.created++;
136
- result.sections.push({ title: section.title, category, action: 'created' });
137
- }
138
- }
139
- }
140
- else {
141
- // 신규 Parent-Child 패턴
142
- if (!options.dryRun) {
143
- const parentTags = [CLAUDE_MD_TAG, `source:${filename}`, `hash:${contentHash}`];
144
- const childInputs = sections.map((section) => ({
145
- content: formatSectionAsMemory(section, filePath),
146
- category: classifySection(section.title),
147
- tier: 'semantic',
148
- tags: [CLAUDE_MD_TAG, `section:${section.title}`, `hash:${section.hash}`, `source:${filename}`],
149
- projectPath,
150
- }));
151
- db.createMemoryWithChunks({
152
- content,
153
- category: 'project_knowledge',
154
- tier: 'semantic',
155
- tags: parentTags,
156
- projectPath,
157
- }, childInputs);
158
- }
159
- result.created = sections.length;
160
- for (const section of sections) {
161
- result.sections.push({ title: section.title, category: classifySection(section.title), action: 'created' });
162
- }
163
- }
164
- }
165
- return result;
166
- }
167
- /**
168
- * CLAUDE.md 파일 탐색 (우선순위)
169
- */
170
- export function findClaudeMd(projectPath) {
171
- const base = projectPath ?? process.cwd();
172
- const candidates = [
173
- join(base, 'CLAUDE.md'),
174
- join(base, '.claude', 'CLAUDE.md'),
175
- join(base, 'claude.md'),
176
- ];
177
- for (const path of candidates) {
178
- if (existsSync(path))
179
- return path;
180
- }
181
- return null;
182
- }
183
- /**
184
- * CLAUDE.md를 섹션으로 파싱
185
- */
186
- export function parseClaudeMd(content) {
187
- const lines = content.split('\n');
188
- const sections = [];
189
- let currentTitle = '';
190
- let currentLevel = 0;
191
- let currentLines = [];
192
- for (const line of lines) {
193
- const headingMatch = line.match(/^(#{1,3})\s+(.+)/);
194
- if (headingMatch) {
195
- // 이전 섹션 저장
196
- if (currentTitle && currentLines.length > 0) {
197
- const sectionContent = currentLines.join('\n').trim();
198
- if (sectionContent.length > 10) { // 최소 길이 필터
199
- sections.push({
200
- title: currentTitle,
201
- content: sectionContent,
202
- level: currentLevel,
203
- hash: computeHash(sectionContent),
204
- });
205
- }
206
- }
207
- currentTitle = headingMatch[2].trim();
208
- currentLevel = headingMatch[1].length;
209
- currentLines = [];
210
- }
211
- else {
212
- currentLines.push(line);
213
- }
214
- }
215
- // 마지막 섹션
216
- if (currentTitle && currentLines.length > 0) {
217
- const sectionContent = currentLines.join('\n').trim();
218
- if (sectionContent.length > 10) {
219
- sections.push({
220
- title: currentTitle,
221
- content: sectionContent,
222
- level: currentLevel,
223
- hash: computeHash(sectionContent),
224
- });
225
- }
226
- }
227
- return sections;
228
- }
229
- /**
230
- * 섹션 제목으로 카테고리 분류
231
- */
232
- function classifySection(title) {
233
- const lower = title.toLowerCase();
234
- if (lower.includes('convention') || lower.includes('규칙') || lower.includes('rule') ||
235
- lower.includes('스타일') || lower.includes('style') || lower.includes('패턴') ||
236
- lower.includes('pattern') || lower.includes('원칙')) {
237
- return 'convention';
238
- }
239
- if (lower.includes('결정') || lower.includes('decision') || lower.includes('선택') ||
240
- lower.includes('why') || lower.includes('이유')) {
241
- return 'decision';
242
- }
243
- if (lower.includes('에러') || lower.includes('error') || lower.includes('문제') ||
244
- lower.includes('trouble') || lower.includes('fix') || lower.includes('해결')) {
245
- return 'error_solution';
246
- }
247
- if (lower.includes('학습') || lower.includes('learning') || lower.includes('배운')) {
248
- return 'learning';
249
- }
250
- return 'project_knowledge';
251
- }
252
- /**
253
- * 섹션을 메모리 content로 포맷
254
- */
255
- function formatSectionAsMemory(section, filePath) {
256
- return `[CLAUDE.md: ${section.title}]\nSource: ${basename(filePath)}\n\n${section.content}`;
257
- }
258
- /**
259
- * 기존 Parent 메모리 탐색 (source:{filename} + projectPath 기반)
260
- *
261
- * listMemories(limit=1000) 대신 tag 인덱스 JOIN을 활용하여 전체 조회합니다.
262
- * projectPath로 필터링하여 다른 프로젝트의 동일 파일명 중복 생성을 방지합니다.
263
- */
264
- function findExistingParent(db, filename, projectPath) {
265
- const sourceTag = `source:${filename}`;
266
- const candidates = db.findMemoriesByTag(sourceTag);
267
- const existing = candidates.find(m => m.tags.includes(CLAUDE_MD_TAG) &&
268
- !m.parentId &&
269
- m.projectPath === projectPath);
270
- if (existing) {
271
- return { id: existing.id, content: existing.content, tags: existing.tags };
272
- }
273
- return null;
274
- }
275
- /**
276
- * 기존 claude-md-sync 태그 메모리 탐색 (레거시 호환용)
277
- *
278
- * listMemories(limit=1000) 대신 tag 인덱스 JOIN을 활용하여 전체 조회합니다.
279
- * FTS 기반 접근은 섹션 제목 오매칭/미매칭으로 중복 생성을 유발하므로 사용하지 않습니다.
280
- * projectPath로 필터링하여 다른 프로젝트의 동일 섹션 제목 충돌을 방지합니다.
281
- */
282
- function findExistingMemory(db, sectionTitle, projectPath) {
283
- const sectionTag = `section:${sectionTitle}`;
284
- const candidates = db.findMemoriesByTag(sectionTag);
285
- const existing = candidates.find(m => m.tags.includes(CLAUDE_MD_TAG) &&
286
- m.projectPath === projectPath);
287
- if (existing) {
288
- return { id: existing.id, content: existing.content, tags: existing.tags };
289
- }
290
- return null;
291
- }
292
- /**
293
- * content hash (SHA-256, 8자)
294
- */
295
- function computeHash(content) {
296
- return createHash('sha256').update(content).digest('hex').slice(0, 16);
297
- }
298
- //# sourceMappingURL=sync.js.map
1
+ (function(_0x5574c5,_0x362c3a){const _0x2e59b7=_0x5574c5();function _0x40ee40(_0x37fef4,_0x3b26b3){return _0x4f10(_0x37fef4-0x10d,_0x3b26b3);}function _0x595278(_0x6200b0,_0x10687f){return _0x4f10(_0x6200b0- -0x119,_0x10687f);}while(!![]){try{const _0xcf494d=-parseInt(_0x40ee40(0x18d,0x1a6))/0x1+-parseInt(_0x595278(-0x5a,-0x93))/0x2+-parseInt(_0x595278(-0xa1,-0x6f))/0x3*(parseInt(_0x595278(-0x2f,-0x36))/0x4)+parseInt(_0x40ee40(0x1f0,0x1bf))/0x5*(-parseInt(_0x595278(-0x3a,-0x47))/0x6)+-parseInt(_0x595278(-0x62,-0x38))/0x7+parseInt(_0x595278(-0x74,-0x85))/0x8*(-parseInt(_0x595278(-0x41,-0x6e))/0x9)+parseInt(_0x40ee40(0x1c8,0x1d9))/0xa;if(_0xcf494d===_0x362c3a)break;else _0x2e59b7['push'](_0x2e59b7['shift']());}catch(_0xea99be){_0x2e59b7['push'](_0x2e59b7['shift']());}}}(_0x4565,0x2cc1e));function _0x4f10(_0x1b79d5,_0x4c5198){_0x1b79d5=_0x1b79d5-0x78;const _0x456562=_0x4565();let _0x4f10ed=_0x456562[_0x1b79d5];if(_0x4f10['nLefDK']===undefined){var _0x5b0edd=function(_0x110bfa){const _0x4fd81a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xcfbf5c='',_0x5c7fac='';for(let _0x315c87=0x0,_0x19368c,_0x403a00,_0x18dc41=0x0;_0x403a00=_0x110bfa['charAt'](_0x18dc41++);~_0x403a00&&(_0x19368c=_0x315c87%0x4?_0x19368c*0x40+_0x403a00:_0x403a00,_0x315c87++%0x4)?_0xcfbf5c+=String['fromCharCode'](0xff&_0x19368c>>(-0x2*_0x315c87&0x6)):0x0){_0x403a00=_0x4fd81a['indexOf'](_0x403a00);}for(let _0x208806=0x0,_0xb9f0a=_0xcfbf5c['length'];_0x208806<_0xb9f0a;_0x208806++){_0x5c7fac+='%'+('00'+_0xcfbf5c['charCodeAt'](_0x208806)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5c7fac);};_0x4f10['jrEPel']=_0x5b0edd,_0x4f10['OcTfIT']={},_0x4f10['nLefDK']=!![];}const _0x270afa=_0x456562[0x0],_0x66992e=_0x1b79d5+_0x270afa,_0x225c56=_0x4f10['OcTfIT'][_0x66992e];return!_0x225c56?(_0x4f10ed=_0x4f10['jrEPel'](_0x4f10ed),_0x4f10['OcTfIT'][_0x66992e]=_0x4f10ed):_0x4f10ed=_0x225c56,_0x4f10ed;}import{readFileSync,existsSync}from'node:fs';import{join,basename}from'node:path';import{createHash}from'node:crypto';const CLAUDE_MD_TAG=_0x3a2c6f(0x444,0x427)+_0x164410(-0x25f,-0x250);function _0x164410(_0x245271,_0x5797ff){return _0x4f10(_0x5797ff- -0x330,_0x245271);}export function isClaudeMemoryFile(_0x259239){function _0x43c0fd(_0x9726a7,_0x54f046){return _0x3a2c6f(_0x54f046,_0x9726a7- -0x34a);}function _0x370fe6(_0x5579ff,_0x2d77e2){return _0x3a2c6f(_0x5579ff,_0x2d77e2- -0x62d);}if(/\/.claude\/projects\/[^/]+\/memory\/[^/]+\.md$/i[_0x370fe6(-0x1ea,-0x214)](_0x259239))return!![];if(/\/CLAUDE\.md$/[_0x43c0fd(0xcf,0xd9)](_0x259239))return!![];return![];}export async function syncClaudeMd(_0x222cd7,_0xb45e5b={}){const _0x495def={'hMSSL':_0x3623aa(-0x13e,-0x150),'fFgjF':'decision','mDiOe':function(_0x506fa2,_0x1d34d7){return _0x506fa2(_0x1d34d7);},'gkAsv':_0x56f771(0x2e9,0x2ae),'MFVtr':function(_0xd3fc2a,_0x2c812a,_0x5caa26){return _0xd3fc2a(_0x2c812a,_0x5caa26);},'fNXgj':'skipped','bEwPi':_0x3623aa(-0x158,-0x14e),'SFjrQ':function(_0x4110a1,_0x1140f4){return _0x4110a1===_0x1140f4;},'KvtBq':_0x3623aa(-0x139,-0x12d),'lcBPm':_0x56f771(0x2e3,0x2a8),'kFkXa':_0x56f771(0x2dc,0x2cb),'ugVle':function(_0x57f488,_0x17b7cd,_0x235274){return _0x57f488(_0x17b7cd,_0x235274);},'ojbrT':_0x3623aa(-0x17f,-0x16e),'EjFTN':_0x3623aa(-0x170,-0x186),'dELDp':_0x3623aa(-0x115,-0x14e),'Fptut':_0x3623aa(-0x15a,-0x161),'RqRKI':function(_0x38bf3e,_0xbbb40){return _0x38bf3e!==_0xbbb40;},'qiZDN':_0x56f771(0x311,0x2ef),'rxrqd':'project_kn'+_0x56f771(0x26b,0x29b)};function _0x56f771(_0x225a65,_0x2fb72e){return _0x3a2c6f(_0x225a65,_0x2fb72e- -0x127);}const _0x355356=_0xb45e5b[_0x56f771(0x2e5,0x2b4)+'th']??findMarkdownFile(_0xb45e5b['projectPat'+'h'],_0xb45e5b[_0x3623aa(-0x11d,-0x13f)]);if(!_0x355356||!_0x495def[_0x56f771(0x30e,0x2db)](existsSync,_0x355356))return _0x3623aa(-0x143,-0x137)!==_0x56f771(0x2db,0x2dc)?_0x495def['hMSSL']:{'found':![],'filePath':_0x355356??'','totalSections':0x0,'created':0x0,'updated':0x0,'skipped':0x0,'sections':[]};const _0x1e79bf=readFileSync(_0x355356,_0x3623aa(-0x185,-0x165)),_0x30d730=parseClaudeMd(_0x1e79bf),_0x20c26b=_0x495def['mDiOe'](basename,_0x355356),_0x4a1bb7=computeHash(_0x1e79bf);function _0x3623aa(_0xb52870,_0xdb83a6){return _0x3a2c6f(_0xdb83a6,_0xb52870- -0x546);}const _0x4237e4={'found':!![],'filePath':_0x355356,'totalSections':_0x30d730[_0x3623aa(-0x180,-0x183)],'created':0x0,'updated':0x0,'skipped':0x0,'sections':[]},_0x404e2d=_0xb45e5b['projectPat'+'h']??process['cwd'](),_0x463cfa=findExistingParent(_0x222cd7,_0x20c26b,_0x404e2d);if(_0x463cfa){const _0x3699c0=_0x463cfa['tags'][_0x56f771(0x315,0x2ea)](_0x1ca5e8=>_0x1ca5e8['startsWith']('hash:')),_0x306c1f=_0x3699c0?.[_0x3623aa(-0x125,-0xf8)](0x5)??'';if(_0x306c1f===_0x4a1bb7&&!_0xb45e5b[_0x3623aa(-0x118,-0x125)]){_0x4237e4[_0x56f771(0x2a3,0x2a4)]=_0x30d730[_0x56f771(0x2ba,0x29f)];for(const _0x5904af of _0x30d730){_0x495def[_0x56f771(0x2c6,0x297)]===_0x3623aa(-0x17c,-0x152)?_0x50382d['push'](_0x470606):_0x4237e4['sections'][_0x3623aa(-0x187,-0x174)]({'title':_0x5904af[_0x3623aa(-0x12b,-0xfc)],'category':_0x495def[_0x56f771(0x2e6,0x2ff)](classifySection,_0x5904af['title'],_0x5904af[_0x3623aa(-0x14c,-0x126)]),'action':_0x495def[_0x56f771(0x2ae,0x2e4)]});}return _0x4237e4;}if(!_0xb45e5b[_0x3623aa(-0x162,-0x150)]){const _0x45c2dc=_0x222cd7[_0x3623aa(-0x137,-0x166)+'tus'](_0x463cfa['id']),_0x2e0183=[CLAUDE_MD_TAG,_0x3623aa(-0x15d,-0x18b)+_0x20c26b,_0x56f771(0x2e7,0x2b2)+_0x4a1bb7],_0x10ed3b=_0x30d730[_0x3623aa(-0x155,-0x169)](_0xdc5fe3=>({'content':formatSectionAsMemory(_0xdc5fe3,_0x355356),'category':classifySection(_0xdc5fe3[_0x56f771(0x31f,0x2f4)],_0xdc5fe3[_0x56f771(0x2cb,0x2d3)]),'tier':_0x56f771(0x2d3,0x2c7),'tags':[CLAUDE_MD_TAG,_0x3623aa(-0x14d,-0x150)+_0xdc5fe3['title'],_0x56f771(0x2e5,0x2b2)+_0xdc5fe3[_0x3623aa(-0x14f,-0x14c)],'source:'+_0x20c26b],'projectPath':_0x404e2d})),_0x583105=_0x222cd7[_0x3623aa(-0x13a,-0x117)+'oryWithChu'+'nks'](_0x463cfa['id'],{'content':_0x1e79bf,'category':_0x3623aa(-0x119,-0x10c)+_0x56f771(0x2b3,0x29b),'tier':_0x495def[_0x56f771(0x306,0x2df)],'tags':_0x2e0183,'projectPath':_0x404e2d},_0x10ed3b);if(_0x45c2dc?.[_0x3623aa(-0x174,-0x17d)]){if(_0x495def[_0x3623aa(-0x152,-0x13c)](_0x495def[_0x56f771(0x290,0x29c)],_0x495def['lcBPm']))return _0x3623aa(-0x175,-0x150)+_0x3623aa(-0x13d,-0x168);else _0x222cd7[_0x3623aa(-0x12f,-0x138)+_0x56f771(0x2b1,0x2a6)](_0x583105,_0x45c2dc['remoteId'],_0x495def[_0x3623aa(-0x114,-0x144)]);}}_0x4237e4[_0x3623aa(-0x170,-0x198)]=_0x30d730[_0x3623aa(-0x180,-0x1ad)];for(const _0x40b440 of _0x30d730){_0x4237e4['sections'][_0x3623aa(-0x187,-0x195)]({'title':_0x40b440[_0x56f771(0x321,0x2f4)],'category':_0x495def['ugVle'](classifySection,_0x40b440['title'],_0x40b440[_0x3623aa(-0x14c,-0x156)]),'action':'updated'});}}else{if('NQasS'===_0x495def['ojbrT']){const _0x39360b=_0x30d730['some'](_0x1afaf4=>findExistingMemory(_0x222cd7,_0x1afaf4[_0x3623aa(-0x12b,-0x10a)],_0x404e2d)!==null);if(_0x39360b)for(const _0x1aa03b of _0x30d730){const _0x532282=classifySection(_0x1aa03b[_0x56f771(0x2e2,0x2f4)],_0x1aa03b['content']),_0x44b85f=formatSectionAsMemory(_0x1aa03b,_0x355356),_0x11a1b4=[CLAUDE_MD_TAG,_0x56f771(0x2bd,0x2d2)+_0x1aa03b[_0x56f771(0x32c,0x2f4)],_0x3623aa(-0x16d,-0x192)+_0x1aa03b['hash']],_0x745544=findExistingMemory(_0x222cd7,_0x1aa03b[_0x3623aa(-0x12b,-0x10c)],_0x404e2d);if(_0x745544){const _0x346fb3=_0x745544['tags'][_0x3623aa(-0x135,-0x155)](_0x508e11=>_0x508e11['startsWith'](_0x56f771(0x2d4,0x2b2))),_0x55d58e=_0x346fb3?.[_0x56f771(0x2e0,0x2fa)](0x5)??'';if(_0x55d58e===_0x1aa03b[_0x3623aa(-0x14f,-0x148)]&&!_0xb45e5b[_0x3623aa(-0x118,-0x125)]){_0x4237e4[_0x56f771(0x297,0x2a4)]++,_0x4237e4[_0x56f771(0x2e0,0x2c6)][_0x56f771(0x2ab,0x298)]({'title':_0x1aa03b[_0x3623aa(-0x12b,-0x156)],'category':_0x532282,'action':_0x56f771(0x27a,0x2a4)});continue;}!_0xb45e5b['dryRun']&&_0x222cd7['updateMemo'+'ry'](_0x745544['id'],{'content':_0x44b85f,'category':_0x532282,'tags':_0x11a1b4}),_0x4237e4[_0x56f771(0x2c5,0x2af)]++,_0x4237e4[_0x56f771(0x300,0x2c6)][_0x3623aa(-0x187,-0x168)]({'title':_0x1aa03b[_0x3623aa(-0x12b,-0x13b)],'category':_0x532282,'action':_0x495def['EjFTN']});}else{if(_0x495def[_0x56f771(0x2ea,0x2cd)](_0x495def['dELDp'],_0x495def[_0x3623aa(-0x116,-0x149)]))!_0xb45e5b[_0x56f771(0x2da,0x2bd)]&&_0x222cd7[_0x3623aa(-0x169,-0x14c)+'ry']({'content':_0x44b85f,'category':_0x532282,'tier':'semantic','tags':_0x11a1b4,'projectPath':_0x404e2d}),_0x4237e4[_0x56f771(0x2a6,0x2c5)]++,_0x4237e4[_0x56f771(0x2b9,0x2c6)][_0x3623aa(-0x187,-0x179)]({'title':_0x1aa03b[_0x3623aa(-0x12b,-0x15d)],'category':_0x532282,'action':_0x495def[_0x3623aa(-0x14e,-0x15d)]});else return _0x3623aa(-0x165,-0x18c);}}else{if(!_0xb45e5b[_0x56f771(0x2ea,0x2bd)]){if(_0x495def[_0x3623aa(-0x12a,-0x13d)](_0x495def[_0x56f771(0x291,0x2b1)],_0x3623aa(-0x11a,-0x110))){const _0x14c1f9=[CLAUDE_MD_TAG,'source:'+_0x20c26b,_0x56f771(0x285,0x2b2)+_0x4a1bb7],_0x3d78c5=_0x30d730[_0x3623aa(-0x155,-0x156)](_0x5aebef=>({'content':formatSectionAsMemory(_0x5aebef,_0x355356),'category':classifySection(_0x5aebef['title'],_0x5aebef[_0x56f771(0x2db,0x2d3)]),'tier':_0x3623aa(-0x158,-0x151),'tags':[CLAUDE_MD_TAG,_0x3623aa(-0x14d,-0x11e)+_0x5aebef[_0x56f771(0x2d8,0x2f4)],_0x3623aa(-0x16d,-0x1a5)+_0x5aebef[_0x56f771(0x2c4,0x2d0)],'source:'+_0x20c26b],'projectPath':_0x404e2d}));_0x222cd7['createMemo'+'ryWithChun'+'ks']({'content':_0x1e79bf,'category':_0x495def[_0x56f771(0x29f,0x2be)],'tier':_0x495def[_0x56f771(0x311,0x2df)],'tags':_0x14c1f9,'projectPath':_0x404e2d},_0x3d78c5);}else return _0x495def['fFgjF'];}_0x4237e4[_0x56f771(0x2a9,0x2c5)]=_0x30d730[_0x56f771(0x2bd,0x29f)];for(const _0x5b423c of _0x30d730){_0x4237e4[_0x3623aa(-0x159,-0x170)][_0x3623aa(-0x187,-0x18c)]({'title':_0x5b423c[_0x56f771(0x2ec,0x2f4)],'category':classifySection(_0x5b423c['title'],_0x5b423c['content']),'action':_0x495def['Fptut']});}}}else{if(/\/.claude\/projects\/[^/]+\/memory\/[^/]+\.md$/i[_0x56f771(0x2e1,0x2f2)](_0x315c87))return!![];if(/\/CLAUDE\.md$/[_0x56f771(0x2d6,0x2f2)](_0x19368c))return!![];return![];}}return _0x4237e4;}export function findMarkdownFile(_0x2bd2b1,_0xb175a){const _0x2ce6f6={'kOWVn':_0x1ad288(-0x31d,-0x300),'aRyjh':function(_0x71419b,_0x2f99f3){return _0x71419b!==_0x2f99f3;},'nVwyA':'.gemini','gxAHu':function(_0x29b8bc,_0x581a44,_0x5e3a72){return _0x29b8bc(_0x581a44,_0x5e3a72);},'pWccE':function(_0x3021fd,_0x4605c9,_0x9bf351){return _0x3021fd(_0x4605c9,_0x9bf351);}},_0x25bcb0=_0x2bd2b1??process[_0x1ad288(-0x308,-0x339)](),_0x2fcf27=_0xb175a??_0x2ce6f6[_0x1ad288(-0x35b,-0x342)],_0x5c2a6f=_0xb175a!==undefined&&_0x2ce6f6[_0x1ad288(-0x300,-0x2eb)](_0xb175a,_0x1ad288(-0x31e,-0x300)),_0x1e6b8d={'CLAUDE.md':_0x1ad288(-0x2fb,-0x332),'AGENTS.md':_0x5f130b(0x1ac,0x178),'GEMINI.md':_0x2ce6f6[_0x5f130b(0x1ae,0x17b)]},_0x10e4e1=_0x1e6b8d[_0x2fcf27];function _0x5f130b(_0x22a03c,_0x553ea7){return _0x164410(_0x553ea7,_0x22a03c-0x409);}const _0x57e69e=[_0x2ce6f6[_0x5f130b(0x189,0x1b2)](join,_0x25bcb0,_0x2fcf27),..._0x10e4e1?[join(_0x25bcb0,_0x10e4e1,_0x2fcf27)]:[],_0x2ce6f6[_0x1ad288(-0x36d,-0x349)](join,_0x25bcb0,_0x2fcf27[_0x1ad288(-0x2fb,-0x307)+'e']())];if(_0x5c2a6f&&_0x10e4e1){const _0x2034cc=join(process.env.HOME??'',_0x10e4e1,_0x2fcf27);!_0x57e69e[_0x5f130b(0x17c,0x175)](_0x2034cc)&&_0x57e69e[_0x1ad288(-0x37c,-0x356)](_0x2034cc);}for(const _0x4c8d68 of _0x57e69e){if(existsSync(_0x4c8d68))return _0x4c8d68;}function _0x1ad288(_0x3afc10,_0x477272){return _0x164410(_0x3afc10,_0x477272- -0xa0);}return null;}export function findClaudeMd(_0xf73d39){function _0x10a21c(_0x5152d5,_0x4c18b7){return _0x164410(_0x5152d5,_0x4c18b7-0x69f);}function _0x41dda8(_0x2d81d8,_0x1b36ae){return _0x164410(_0x2d81d8,_0x1b36ae-0x3d6);}const _0x1c9837={'MPhVc':function(_0x52b0f9,_0x81feea,_0x56eb1a){return _0x52b0f9(_0x81feea,_0x56eb1a);}};return _0x1c9837[_0x41dda8(0x148,0x15e)](findMarkdownFile,_0xf73d39,_0x10a21c(0x405,0x43f));}function _0x4565(){const _0x2bdc53=['zK5yz2O','CMvWBgfJzu1LBq','DeDJCuO','Dg9mB3DLCKnHCW','z2v0u3LUy1n0yq','zgLNzxn0','zMLUza','t2jAwei','q2nsvhi','Bwf0y2G','q0XbvurflM1K','thbRBKm','C2v0u3LUy1n0yq','lMnVzgv4','DgvZDa','BLz3Eue','DgL0Bgu','uNfss0K','nZe3m2HsufPota','sevTqMO','DgfNCW','C3r5Bgu','C2XPy2u','xqPtB3vYy2u6ia','C3bSAxq','otzzAerZB2m','C3LUyW','tuzwDhi','y2XHDwrLlw1Klq','mJG5ntvTrevZyKK','zMLSzu5HBwu','yvj5AMG','D2LetMS','swjfuwG','ChjVAMvJDf9RBG','zM9Yy2u','mZC1nZjRqMPUENi','zevmrha','vNHlD2m','A0zRwge','ouLzDgfTEa','z2TbC3y','ChvZAa','zwr1sKG','DxrMltG','B3DSzwrNzq','s3z0qNe','C2HHmJu2','ndG4ntnQquDvtvm','BgvUz3rO','tLfHC1m','zxncEvrHzW','z01wt1e','CwjcuM0','C2TPChbLza','CfDJy0u','DhvZ','DxbKyxrL','yKz1zKe','7iQK7yoa7j28','zxjYB3jFC29SDq','CMvTB3rLswq','A09xvM4','yxzJwNe','ugjrt1C','DxbKyxrLza','y29UDMvUDgLVBG','CwLAre4','AgfZAdO','zxjYB3i','y2XHDwrLtwrqyq','y3DK','y3jLyxrLtwvTBW','zML4','ExbsD1e','BfDlCw0','CNvSzq','ChjVAMvJDfbHDa','lMnSyxvKzq','zhj5uNvU','CNHYCwq','sgHUtMe','A29csgi','Aw5JBhvKzxm','C291CMnLoG','mtmWnefnrM5Trq','uMjyBMi','y3jLyxrLza','C2vJDgLVBNm','C2vTyw50Awm','yxztBLq','Cgf0DgvYBG','BwfW','CgvUzgLUzW','zMLUze1LBw9YAq','u0zQCLe','z3Hbshu','C1rosxa','AgfZAa','rNb0Dxq','C2vJDgLVBJO','y29UDgvUDa','DhjPBq','mtu4otu3ngfJCMjUuq','tvbOvMm','vNfrrNa','AM9PBG','otaWnJyYmgH2tgXvEa','A29fteS','BurPt2u','D3j0ug8','mZGXmZeWz3LXzwzg','sNbkCvm','yKv3ugK','s0TNveK','BgvHCM5PBMC','DgLVBG','Eg9oD2O'];_0x4565=function(){return _0x2bdc53;};return _0x4565();}export function parseClaudeMd(_0x54eb6c){const _0x2a402f={'gMVOQ':function(_0x50e637,_0x5b2d4f){return _0x50e637(_0x5b2d4f);},'ObZXB':function(_0x356961,_0x5ed66c){return _0x356961>_0x5ed66c;},'oFnce':function(_0x3a12b4,_0x468103){return _0x3a12b4(_0x468103);},'VqQFp':_0xfc05d(0x499,0x4c2)},_0x35bea6=_0x54eb6c[_0xfc05d(0x4c6,0x495)]('\x0a'),_0x486179=[];function _0xfc05d(_0x4a561f,_0x4ed718){return _0x3a2c6f(_0x4ed718,_0x4a561f-0xa3);}let _0x14ceaf='',_0x4b5ff9=0x0,_0x1ae57a=[];for(const _0x22677a of _0x35bea6){const _0x36a550=_0x22677a[_0xfc05d(0x4b7,0x4b1)](/^(#{1,3})\s+(.+)/);if(_0x36a550){if(_0x14ceaf&&_0x2a402f[_0xfc05d(0x4b5,0x47e)](_0x1ae57a['length'],0x0)){const _0x2142b4=_0x1ae57a[_0x38d65a(0x45e,0x428)]('\x0a')['trim']();_0x2142b4[_0x38d65a(0x425,0x3ef)]>0xa&&_0x486179[_0x38d65a(0x41e,0x43e)]({'title':_0x14ceaf,'content':_0x2142b4,'level':_0x4b5ff9,'hash':_0x2a402f['oFnce'](computeHash,_0x2142b4)});}_0x14ceaf=_0x36a550[0x2][_0xfc05d(0x49e,0x49c)](),_0x4b5ff9=_0x36a550[0x1][_0xfc05d(0x469,0x470)],_0x1ae57a=[];}else _0x1ae57a['push'](_0x22677a);}if(_0x14ceaf&&_0x1ae57a[_0xfc05d(0x469,0x475)]>0x0){const _0x571676=_0x1ae57a['join']('\x0a')[_0x38d65a(0x45a,0x443)]();if(_0x571676[_0xfc05d(0x469,0x462)]>0xa){if(_0x2a402f[_0xfc05d(0x4a1,0x4b7)]===_0xfc05d(0x499,0x45f))_0x486179[_0x38d65a(0x41e,0x44a)]({'title':_0x14ceaf,'content':_0x571676,'level':_0x4b5ff9,'hash':computeHash(_0x571676)});else{const _0x379c5f=_0x2a402f[_0x38d65a(0x428,0x438)](_0x525a1a,_0x24953d);return'['+_0x379c5f+':\x20'+_0x591963['title']+_0xfc05d(0x4c5,0x4ab)+_0x379c5f+'\x0a\x0a'+_0x1c0163['content'];}}}function _0x38d65a(_0x4a4a3b,_0x503766){return _0x3a2c6f(_0x503766,_0x4a4a3b-0x5f);}return _0x486179;}function classifySection(_0x42aa6c,_0x2c6ceb){const _0x371be7={'lWKqm':_0x153efd(-0x6a,-0x96),'CcRTr':_0x229c1b(0x2be,0x2f4),'ypRwQ':_0x153efd(-0x84,-0x57),'avSnT':_0x229c1b(0x2c5,0x2e5),'xXSDg':'decision','koELK':function(_0x45bb94,_0x46f2d1){return _0x45bb94===_0x46f2d1;},'koBHb':_0x229c1b(0x319,0x2fc),'HhnNa':'trouble','HEmBj':_0x153efd(-0xa2,-0xa6)+_0x229c1b(0x2f7,0x321),'eduJH':_0x153efd(-0x59,-0x6f),'OZQUa':_0x229c1b(0x31b,0x2fb)+'owledge'},_0xb41d14=_0x42aa6c[_0x153efd(-0x6d,-0x69)+'e'](),_0xc15dc2=_0x2c6ceb?_0x2c6ceb['split']('\x0a')[_0x153efd(-0x34,-0x56)](0x0,0x5)[_0x229c1b(0x2ed,0x2ef)]('\x20')[_0x153efd(-0x80,-0x69)+'e']():'',_0x35c5a0=/금지|절대|must not|never|mandatory/,_0x30c27d=_0x35c5a0[_0x229c1b(0x307,0x2e6)](_0xb41d14),_0x4e8c01=(_0xc15dc2['match'](/금지|절대|must not|never|mandatory|필수|반드시|always/g)||[])[_0x229c1b(0x2b4,0x27d)];if(_0x30c27d||_0x4e8c01>=0x2)return _0x153efd(-0x93,-0x96);if(_0xb41d14[_0x229c1b(0x2d6,0x2f5)]('convention')||_0xb41d14[_0x229c1b(0x2d6,0x2b4)]('규칙')||_0xb41d14[_0x229c1b(0x2d6,0x2f4)](_0x371be7[_0x153efd(-0xc9,-0x97)])||_0xb41d14[_0x153efd(-0x7a,-0x8f)](_0x371be7[_0x229c1b(0x301,0x2e6)])||_0xb41d14['includes'](_0x371be7[_0x153efd(-0x89,-0x98)])||_0xb41d14['includes']('패턴')||_0xb41d14[_0x153efd(-0x95,-0x8f)](_0x153efd(-0xad,-0x87))||_0xb41d14[_0x229c1b(0x2d6,0x2b0)]('원칙'))return _0x371be7[_0x229c1b(0x2dd,0x314)];if(_0xb41d14['includes']('결정')||_0xb41d14[_0x153efd(-0x9d,-0x8f)](_0x371be7['xXSDg'])||_0xb41d14[_0x229c1b(0x2d6,0x2b2)]('선택')||_0xb41d14[_0x153efd(-0xc7,-0x8f)]('why')||_0xb41d14[_0x229c1b(0x2d6,0x2f7)]('이유')){if(_0x371be7[_0x153efd(-0x94,-0x76)](_0x229c1b(0x2c2,0x29b),_0x371be7[_0x229c1b(0x2d5,0x2cb)])){const _0x18c65f=_0x7fd19d[_0x229c1b(0x2ed,0x2d2)]('\x0a')[_0x153efd(-0x57,-0x7c)]();_0x18c65f[_0x229c1b(0x2b4,0x2c0)]>0xa&&_0x1b8d50[_0x153efd(-0xa4,-0xb8)]({'title':_0x4859ec,'content':_0x18c65f,'level':_0x49afa5,'hash':_0x4ebb29(_0x18c65f)});}else return _0x371be7['xXSDg'];}if(_0xb41d14[_0x153efd(-0xc5,-0x8f)]('에러')||_0xb41d14['includes'](_0x229c1b(0x2c8,0x2b4))||_0xb41d14[_0x153efd(-0x8d,-0x8f)]('문제')||_0xb41d14['includes'](_0x371be7[_0x153efd(-0xc8,-0x91)])||_0xb41d14[_0x229c1b(0x2d6,0x30f)](_0x229c1b(0x2cc,0x2cf))||_0xb41d14[_0x153efd(-0xaa,-0x8f)]('해결'))return _0x371be7[_0x229c1b(0x30c,0x33b)];if(_0xb41d14[_0x153efd(-0x64,-0x8f)]('학습')||_0xb41d14[_0x229c1b(0x2d6,0x2a7)](_0x229c1b(0x2f6,0x32e))||_0xb41d14[_0x229c1b(0x2d6,0x2c1)]('배운'))return _0x371be7[_0x153efd(-0xe3,-0xb7)];function _0x229c1b(_0x2ecff8,_0x5b76b5){return _0x164410(_0x5b76b5,_0x2ecff8-0x563);}function _0x153efd(_0x4326a2,_0x44cb42){return _0x164410(_0x4326a2,_0x44cb42-0x1fe);}return _0x371be7['OZQUa'];}function formatSectionAsMemory(_0x559e8b,_0x2bdd14){const _0x11573d=basename(_0x2bdd14);function _0x351b1d(_0x4b0080,_0x1cd28b){return _0x164410(_0x4b0080,_0x1cd28b- -0x8f);}function _0x2b239f(_0x2ea16b,_0x2e3322){return _0x164410(_0x2e3322,_0x2ea16b-0x26a);}return'['+_0x11573d+':\x20'+_0x559e8b['title']+_0x2b239f(0x17,0x3a)+_0x11573d+'\x0a\x0a'+_0x559e8b[_0x351b1d(-0x300,-0x30a)];}function findExistingParent(_0x4025dc,_0x4ea9eb,_0x238840){const _0x42fd11={'CgUIz':function(_0xa86d14,_0x285eb1){return _0xa86d14(_0x285eb1);},'RbXnb':_0x509178(-0x2e1,-0x2d3)};function _0x509178(_0x24ef03,_0x39100a){return _0x3a2c6f(_0x24ef03,_0x39100a- -0x6dd);}const _0x3b7134=_0x509178(-0x314,-0x2f4)+_0x4ea9eb;function _0x29469d(_0x525c59,_0x1cf791){return _0x3a2c6f(_0x525c59,_0x1cf791- -0x9d);}const _0x5aa4c1=_0x4025dc[_0x509178(-0x2bc,-0x2ea)+_0x29469d(0x313,0x32b)](_0x3b7134),_0xa7f17f=_0x5aa4c1['find'](_0x4e9737=>_0x4e9737[_0x509178(-0x299,-0x2be)][_0x509178(-0x2c2,-0x2f5)](CLAUDE_MD_TAG)&&!_0x4e9737['parentId']&&_0x4e9737[_0x509178(-0x2d6,-0x2fb)+'h']===_0x238840);if(_0xa7f17f){if(_0x42fd11['RbXnb']!==_0x42fd11[_0x29469d(0x328,0x34e)]){const _0x545fe2=_0x2045e3[_0x29469d(0x37f,0x362)]('\x0a')[_0x29469d(0x354,0x35e)]();_0x545fe2[_0x509178(-0x34f,-0x317)]>0xa&&_0x20c6d0[_0x29469d(0x302,0x322)]({'title':_0x1ff377,'content':_0x545fe2,'level':_0x314a66,'hash':CnDsfz['CgUIz'](_0x3408a2,_0x545fe2)});}else return{'id':_0xa7f17f['id'],'content':_0xa7f17f[_0x29469d(0x325,0x35d)],'tags':_0xa7f17f['tags']};}return null;}function findExistingMemory(_0x33cbf6,_0x4bc735,_0x47b61d){function _0x3ec1a7(_0x3288eb,_0x4b78a2){return _0x164410(_0x4b78a2,_0x3288eb-0x1b3);}const _0x13d767=_0x1853f3(-0x279,-0x292)+_0x4bc735,_0x1d9c69=_0x33cbf6['findMemori'+_0x3ec1a7(-0xfa,-0xc8)](_0x13d767),_0x4d3117=_0x1d9c69[_0x1853f3(-0x261,-0x244)](_0x427523=>_0x427523[_0x3ec1a7(-0xa3,-0xa7)][_0x3ec1a7(-0xda,-0x105)](CLAUDE_MD_TAG)&&_0x427523['projectPat'+'h']===_0x47b61d);function _0x1853f3(_0xf2d227,_0x5a60aa){return _0x164410(_0x5a60aa,_0xf2d227-0x3);}if(_0x4d3117)return{'id':_0x4d3117['id'],'content':_0x4d3117[_0x3ec1a7(-0xc8,-0xb9)],'tags':_0x4d3117[_0x1853f3(-0x253,-0x228)]};return null;}function _0x3a2c6f(_0x39e7fd,_0x283434){return _0x4f10(_0x283434-0x345,_0x39e7fd);}function computeHash(_0x215274){function _0x55e19a(_0xc8ad28,_0x32854e){return _0x3a2c6f(_0x32854e,_0xc8ad28- -0x58b);}function _0x58a98b(_0x525524,_0x21a568){return _0x3a2c6f(_0x525524,_0x21a568- -0x4ee);}const _0x1fedf6={'KKgTI':function(_0x2b5f3c,_0x184655){return _0x2b5f3c(_0x184655);},'JpJqS':_0x55e19a(-0x1c7,-0x1a7),'nmzeV':'hex'};return _0x1fedf6[_0x58a98b(-0xcf,-0xe7)](createHash,_0x1fedf6[_0x58a98b(-0xc5,-0xe9)])[_0x55e19a(-0x1bd,-0x1d1)](_0x215274)[_0x58a98b(-0xb0,-0xde)](_0x1fedf6['nmzeV'])[_0x55e19a(-0x16a,-0x168)](0x0,0x10);}
@@ -1,80 +1 @@
1
- /**
2
- * Add Command
3
- *
4
- * 새 메모리를 추가합니다.
5
- */
6
- import { Command } from 'commander';
7
- import chalk from 'chalk';
8
- import { readFileSync } from 'node:fs';
9
- import { ConfigManager } from '../../config/manager.js';
10
- import { MemoryDatabase } from '../../db/database.js';
11
- import { shouldChunk, chunkContent, CHUNK_PRESETS } from '../../chunking/chunker.js';
12
- export function addCommand() {
13
- return new Command('add')
14
- .description('Add a new memory')
15
- .argument('[content]', 'Memory content')
16
- .option('-c, --category <category>', 'Memory category', 'context')
17
- .option('-t, --tier <tier>', 'Memory tier', 'episodic')
18
- .option('--tags <tags>', 'Comma-separated tags')
19
- .option('-f, --file <path>', 'Read content from file')
20
- .option('--no-chunk', 'Disable auto-chunking for long content')
21
- .action((contentArg, options) => {
22
- const config = new ConfigManager().load();
23
- const db = new MemoryDatabase(config.db.path);
24
- try {
25
- db.initialize();
26
- // content 소스 결정
27
- let content;
28
- if (options.file) {
29
- content = readFileSync(options.file, 'utf-8');
30
- }
31
- else if (contentArg) {
32
- content = contentArg;
33
- }
34
- else {
35
- console.error(chalk.red('Error: content argument or --file option is required'));
36
- process.exit(1);
37
- }
38
- const tags = options.tags
39
- ? options.tags.split(',').map((t) => t.trim()).filter(Boolean)
40
- : [];
41
- const category = options.category;
42
- const tier = options.tier;
43
- // auto-chunking 판단
44
- const embeddingProvider = config.embedding?.provider ?? 'local';
45
- const chunkPreset = CHUNK_PRESETS[embeddingProvider] ?? CHUNK_PRESETS.local;
46
- if (options.chunk !== false && shouldChunk(content, chunkPreset)) {
47
- // Parent-Child 패턴으로 저장
48
- const chunks = chunkContent(content, chunkPreset);
49
- const childInputs = chunks.map((chunk, i) => ({
50
- content: chunk,
51
- category,
52
- tier,
53
- tags: [...tags, `chunk:${i}`],
54
- }));
55
- const parentId = db.createMemoryWithChunks({ content, category, tier, tags: [...tags, 'chunked'] }, childInputs);
56
- console.log(chalk.green(`✓ Memory added with ${chunks.length} chunks`));
57
- console.log(chalk.dim(`Parent ID: ${parentId}`));
58
- console.log(chalk.dim(`Chunks: ${chunks.length}`));
59
- console.log(chalk.dim(`Category: ${category}`));
60
- }
61
- else {
62
- // 기존 단일 메모리 저장
63
- const memory = db.createMemory({ content, category, tier, tags });
64
- console.log(chalk.green('✓ Memory added successfully'));
65
- console.log(chalk.dim(`ID: ${memory.id}`));
66
- console.log(chalk.dim(`Category: ${memory.category}`));
67
- console.log(chalk.dim(`Tags: ${memory.tags.join(', ') || '(none)'}`));
68
- }
69
- }
70
- catch (error) {
71
- console.error(chalk.red('Error adding memory:'), error);
72
- // TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
73
- process.exit(1);
74
- }
75
- finally {
76
- db.close();
77
- }
78
- });
79
- }
80
- //# sourceMappingURL=add.js.map
1
+ function _0x5e8a(_0xbba922,_0x289760){_0xbba922=_0xbba922-0x128;const _0x24f4cc=_0x24f4();let _0x5e8a46=_0x24f4cc[_0xbba922];if(_0x5e8a['TYdtPV']===undefined){var _0x554ae9=function(_0x2818b9){const _0x5bf31f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x31a547='',_0x5306b8='';for(let _0x4ae4e8=0x0,_0x3de16a,_0x37d573,_0x30069e=0x0;_0x37d573=_0x2818b9['charAt'](_0x30069e++);~_0x37d573&&(_0x3de16a=_0x4ae4e8%0x4?_0x3de16a*0x40+_0x37d573:_0x37d573,_0x4ae4e8++%0x4)?_0x31a547+=String['fromCharCode'](0xff&_0x3de16a>>(-0x2*_0x4ae4e8&0x6)):0x0){_0x37d573=_0x5bf31f['indexOf'](_0x37d573);}for(let _0x4d85db=0x0,_0x57ede7=_0x31a547['length'];_0x4d85db<_0x57ede7;_0x4d85db++){_0x5306b8+='%'+('00'+_0x31a547['charCodeAt'](_0x4d85db)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5306b8);};_0x5e8a['nZgRnp']=_0x554ae9,_0x5e8a['zBIYrt']={},_0x5e8a['TYdtPV']=!![];}const _0x4bc4ea=_0x24f4cc[0x0],_0x460ff2=_0xbba922+_0x4bc4ea,_0x2cae0e=_0x5e8a['zBIYrt'][_0x460ff2];return!_0x2cae0e?(_0x5e8a46=_0x5e8a['nZgRnp'](_0x5e8a46),_0x5e8a['zBIYrt'][_0x460ff2]=_0x5e8a46):_0x5e8a46=_0x2cae0e,_0x5e8a46;}(function(_0x122f4a,_0x2ef367){function _0x555532(_0x2d0e5c,_0x293615){return _0x5e8a(_0x2d0e5c-0x9,_0x293615);}const _0x1e62ac=_0x122f4a();function _0x39dd52(_0x4cd794,_0x2db386){return _0x5e8a(_0x2db386- -0x332,_0x4cd794);}while(!![]){try{const _0x204a15=-parseInt(_0x555532(0x16c,0x16e))/0x1+parseInt(_0x555532(0x155,0x15b))/0x2*(parseInt(_0x39dd52(-0x19c,-0x1b3))/0x3)+-parseInt(_0x39dd52(-0x1c4,-0x1af))/0x4*(parseInt(_0x555532(0x18a,0x1a2))/0x5)+-parseInt(_0x39dd52(-0x20d,-0x1f3))/0x6*(parseInt(_0x39dd52(-0x1a1,-0x1ad))/0x7)+-parseInt(_0x39dd52(-0x206,-0x209))/0x8+-parseInt(_0x555532(0x16e,0x18c))/0x9*(-parseInt(_0x555532(0x15e,0x163))/0xa)+-parseInt(_0x555532(0x15a,0x178))/0xb*(-parseInt(_0x555532(0x170,0x17e))/0xc);if(_0x204a15===_0x2ef367)break;else _0x1e62ac['push'](_0x1e62ac['shift']());}catch(_0x10ce8f){_0x1e62ac['push'](_0x1e62ac['shift']());}}}(_0x24f4,0x39b35));import{Command}from'commander';import _0x3a75a7 from'chalk';import{readFileSync}from'node:fs';import{ConfigManager}from'../../config/manager.js';function _0x24f4(){const _0x20640=['y2f0zwDVCNK','Bg9JywW','y2H1BMTLza','zw50ig9Yic0TzG','DxrMltG','rgLZywjSzsbHDq','z2zntvO','C3bSAxq','mZuWmJG5Bxfpu2jb','igLZihjLCxvPCG','mtC5mdviDLP2CwO','zMLSDgvY','mJb0A3HKq3G','AwXLig9WDgLVBG','mti4mdiZz2rev3Hf','zxHPDa','nde4nfzmt21qzq','uMvHzcbJB250zq','B2T2zem','B3b0Aw9U','s0PoDKe','vNPpwxa','lwySic0TzMLSzq','zgLT','BwvTB3j5','lxqSic0TDgLLCG','qwrKigeGBMv3ia','ugfYzw50ieLeoG','DgfNCW','zYbMB3iGBg9UzW','kg5VBMuP','Aw5PDgLHBgL6zq','z29YEsa8y2f0zq','rxjYB3iGywrKAq','ChjVDMLKzxi','zKTos0G','Cgf0Aa','BgvUz3rO','mtuWv2vmEKfu','EvDuEKK','AhHAEem','t0LgsMO','AK1KvwW','zxbPC29KAwm','CNLxAxrOq2H1BG','DgvUDcbHCMD1Bq','CNjgsLe','idXWyxrOpG','zgrLzcb3AxrOia','svzgDem','zw1IzwrKAw5N','mMLuDKTUrq','twvTB3j5ignHDa','wuzmseu','CMvK','zxjYB3i','mJjeExHcwNK','CMf0zwqGDgfNCW','Dg8Ty2H1BMTPBG','4PYtie1LBw9YEsbH','ntbhu0fJtge','ALbotLq','BMCGBwvTB3j5oG','DhjPBq','suq6ia','w2nVBNrLBNrD','ywrK','AhviwLi','z29YEt4','ywn0Aw9U','zgrLzcbZDwnJzq','z3jLzw4','runXBM4','vgfNCZOG','mJKYmdC4AvPRrwLO','q29TBweTC2vWyq','mZm2oda3uvPkv3jf','q2f0zwDVCNK6ia','ndiWmte2neToDeL1zq','twvTB3j5ignVBG','yxjNDw1LBNq','y2H1BMS6','lwmSic0Ty2f0zq','BwfW','Bg9N','y29UDgv4Da','ignVBNrLBNq','BNqGzNjVBsbMAq','ignODw5RCW','z3m+','q2H1BMTZoIa','rxjYB3i6ignVBG','y2XVC2u','ls10ywDZidX0yq'];_0x24f4=function(){return _0x20640;};return _0x24f4();}import{MemoryDatabase}from'../../db/database.js';import{shouldChunk,chunkContent,CHUNK_PRESETS}from'../../chunking/chunker.js';export function addCommand(){const _0x3280dd={'rrFJQ':_0x495f89(0x512,0x4e6)+_0x495f89(0x4b1,0x4b8)+'ent\x20or\x20--f'+_0x5d99a8(0x1bb,0x1b7)+_0x495f89(0x50a,0x4f2)+'ed','YFLHE':function(_0x3a6600,_0x49c1f1,_0x5d6ae1){return _0x3a6600(_0x49c1f1,_0x5d6ae1);},'okvdC':_0x495f89(0x4cc,0x4ed),'obYLS':_0x495f89(0x4f3,0x4c8),'IVFtC':_0x495f89(0x511,0x4ea),'fKNKH':function(_0x151221,_0x5e6584){return _0x151221!==_0x5e6584;},'VzOYp':function(_0xc8caa4,_0x4e0865,_0x5f66ff){return _0xc8caa4(_0x4e0865,_0x5f66ff);},'huHZR':function(_0x430d8,_0x4ebeef,_0x110743){return _0x430d8(_0x4ebeef,_0x110743);},'gfMMZ':_0x5d99a8(0x14e,0x16a),'jMdUl':_0x5d99a8(0x171,0x18d),'IglTF':_0x495f89(0x4b5,0x4da)+'tent','NQPun':_0x495f89(0x4d3,0x4a4)+'\x20<tier>','yWTzI':_0x495f89(0x4a0,0x4b6),'hxZxC':_0x495f89(0x483,0x4a1)+_0x495f89(0x4d3,0x4ba),'ECqnn':_0x5d99a8(0x17b,0x15d)+_0x495f89(0x501,0x4e2)+'le','OIFJj':'--no-chunk'};function _0x5d99a8(_0x2f69c3,_0x5840b8){return _0x5e8a(_0x5840b8-0x33,_0x2f69c3);}function _0x495f89(_0x2c3c0b,_0x4f9c5f){return _0x5e8a(_0x4f9c5f-0x372,_0x2c3c0b);}return new Command(_0x495f89(0x4e3,0x4cd))['descriptio'+'n'](_0x5d99a8(0x177,0x166)+_0x495f89(0x485,0x4a3))[_0x495f89(0x4fd,0x4db)](_0x3280dd[_0x495f89(0x495,0x4b5)],_0x3280dd['IglTF'])['option'](_0x495f89(0x4b9,0x4dd)+_0x5d99a8(0x151,0x16c)+_0x5d99a8(0x179,0x190),_0x5d99a8(0x173,0x180)+'egory',_0x5d99a8(0x1d0,0x1a1))[_0x5d99a8(0x149,0x15f)](_0x3280dd['NQPun'],'Memory\x20tie'+'r',_0x3280dd[_0x495f89(0x4d2,0x4b2)])[_0x495f89(0x49c,0x49e)](_0x495f89(0x4f9,0x4e8)+_0x495f89(0x4d6,0x4e4),_0x5d99a8(0x169,0x197)+_0x5d99a8(0x192,0x185))['option'](_0x3280dd[_0x495f89(0x4cd,0x4b3)],_0x3280dd[_0x495f89(0x4b8,0x4d3)])['option'](_0x3280dd[_0x5d99a8(0x1a3,0x175)],_0x5d99a8(0x1d4,0x1af)+_0x5d99a8(0x182,0x186)+_0x5d99a8(0x13b,0x169)+_0x5d99a8(0x1ba,0x1a2))[_0x495f89(0x4e7,0x4d0)]((_0xc9d3c6,_0x12d134)=>{function _0x50a7e5(_0x500949,_0x5f41f7){return _0x5d99a8(_0x5f41f7,_0x500949-0x32b);}const _0x1a1ebe=new ConfigManager()['load']();function _0xb40e41(_0x267929,_0x4cba29){return _0x5d99a8(_0x267929,_0x4cba29- -0x1b0);}const _0x53f25f=new MemoryDatabase(_0x1a1ebe['db'][_0x50a7e5(0x49b,0x4a4)]);try{_0x53f25f[_0xb40e41(-0x4f,-0x45)]();let _0x39adb1;if(_0x12d134['file'])_0x39adb1=_0x3280dd[_0xb40e41(-0x14,-0x2f)](readFileSync,_0x12d134['file'],_0x3280dd[_0x50a7e5(0x489,0x48d)]);else _0xc9d3c6?_0x39adb1=_0xc9d3c6:_0xb40e41(-0x7d,-0x50)!==_0x3280dd['obYLS']?(console[_0x50a7e5(0x4ae,0x485)](_0x3a75a7[_0xb40e41(-0x4,-0x2e)](_0xb40e41(-0xc,-0x9)+_0xb40e41(-0x54,-0x37)+_0x50a7e5(0x4d8,0x4ef)+'ile\x20option'+_0x50a7e5(0x4de,0x4c0)+'ed')),process['exit'](0x1)):(_0x5d4cfb[_0xb40e41(-0x44,-0x2d)](_0xce5070[_0x50a7e5(0x4ad,0x492)](_0x3280dd[_0xb40e41(-0x34,-0x36)])),_0x1f6405[_0xb40e41(-0x42,-0x55)](0x1));const _0x1c8758=_0x12d134[_0xb40e41(-0x1e,-0x48)]?_0x12d134[_0x50a7e5(0x493,0x4b7)][_0xb40e41(-0x28,0x1)](',')[_0xb40e41(-0x10,-0x11)](_0x1ed6f8=>_0x1ed6f8[_0x50a7e5(0x4b6,0x48b)]())[_0x50a7e5(0x4e0,0x4bb)](Boolean):[],_0x127410=_0x12d134[_0x50a7e5(0x4d5,0x502)],_0x47965e=_0x12d134['tier'],_0x48f1eb=_0x1a1ebe[_0x50a7e5(0x4a9,0x4c9)]?.[_0x50a7e5(0x499,0x483)]??_0x3280dd[_0xb40e41(-0x1a,-0x33)],_0x3073fa=CHUNK_PRESETS[_0x48f1eb]??CHUNK_PRESETS['local'];if(_0x3280dd[_0xb40e41(-0x30,-0x41)](_0x12d134['chunk'],![])&&_0x3280dd[_0xb40e41(-0x47,-0x4f)](shouldChunk,_0x39adb1,_0x3073fa)){const _0x465402=_0x3280dd[_0x50a7e5(0x4ba,0x4bf)](chunkContent,_0x39adb1,_0x3073fa),_0x1a626c=_0x465402[_0x50a7e5(0x4ca,0x4bb)]((_0x2f7012,_0x504dd1)=>({'content':_0x2f7012,'category':_0x127410,'tier':_0x47965e,'tags':[..._0x1c8758,_0xb40e41(-0x35,-0x13)+_0x504dd1]})),_0x3250c4=_0x53f25f['createMemo'+_0xb40e41(-0x3c,-0x38)+'ks']({'content':_0x39adb1,'category':_0x127410,'tier':_0x47965e,'tags':[..._0x1c8758,_0xb40e41(-0x12,-0x4)]},_0x1a626c);console[_0xb40e41(-0x23,-0x10)](_0x3a75a7[_0xb40e41(-0x3f,-0x1d)]('✓\x20Memory\x20a'+_0xb40e41(-0x4c,-0x34)+_0x465402[_0xb40e41(-0x55,-0x3f)]+_0x50a7e5(0x4cf,0x4dc))),console[_0x50a7e5(0x4cb,0x4bb)](_0x3a75a7['dim'](_0x50a7e5(0x492,0x469)+'\x20'+_0x3250c4)),console['log'](_0x3a75a7[_0xb40e41(-0x51,-0x4d)](_0xb40e41(-0x2c,-0xa)+_0x465402[_0x50a7e5(0x49c,0x4ad)])),console[_0xb40e41(0xf,-0x10)](_0x3a75a7[_0x50a7e5(0x48e,0x478)](_0xb40e41(-0x6,-0x17)+_0x127410));}else{const _0x3e4087=_0x53f25f['createMemo'+'ry']({'content':_0x39adb1,'category':_0x127410,'tier':_0x47965e,'tags':_0x1c8758});console['log'](_0x3a75a7[_0xb40e41(-0x41,-0x1d)](_0xb40e41(0x3,-0x29)+_0x50a7e5(0x4bd,0x4d9)+'ssfully')),console[_0x50a7e5(0x4cb,0x4e5)](_0x3a75a7[_0xb40e41(-0x24,-0x4d)](_0x50a7e5(0x4b7,0x48a)+_0x3e4087['id'])),console[_0x50a7e5(0x4cb,0x4c8)](_0x3a75a7[_0x50a7e5(0x48e,0x493)](_0xb40e41(0x8,-0x17)+_0x3e4087['category'])),console[_0xb40e41(-0x19,-0x10)](_0x3a75a7['dim'](_0xb40e41(-0x1e,-0x1b)+(_0x3e4087[_0xb40e41(-0x45,-0x48)]['join'](',\x20')||_0x3280dd[_0x50a7e5(0x4db,0x507)])));}}catch(_0x49760b){console[_0xb40e41(-0x2e,-0x2d)](_0x3a75a7['red'](_0xb40e41(-0x33,-0x43)+_0x50a7e5(0x4b5,0x4e2)),_0x49760b),process[_0xb40e41(-0x4a,-0x55)](0x1);}finally{_0x53f25f[_0x50a7e5(0x4d3,0x4d5)]();}});}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Claude-Sync Command
3
3
  *
4
- * CLAUDE.md 파일의 내용을 메모리 DB에 동기화합니다.
5
- * - 프로젝트 루트의 CLAUDE.md를 파싱하여 섹션별 메모리 생성
6
- * - 이미 동기화된 내용은 스킵 (mtime + content hash 기반)
4
+ * CLAUDE.md / AGENTS.md / GEMINI.md 파일의 내용을 메모리 DB에 동기화합니다.
5
+ * - 마크다운 파일을 파싱하여 섹션별 메모리 생성
6
+ * - 이미 동기화된 내용은 스킵 (content hash 기반)
7
7
  * - convention/context 카테고리로 저장
8
8
  */
9
9
  import { Command } from 'commander';
@@ -1,70 +1 @@
1
- /**
2
- * Claude-Sync Command
3
- *
4
- * CLAUDE.md 파일의 내용을 메모리 DB에 동기화합니다.
5
- * - 프로젝트 루트의 CLAUDE.md를 파싱하여 섹션별 메모리 생성
6
- * - 이미 동기화된 내용은 스킵 (mtime + content hash 기반)
7
- * - convention/context 카테고리로 저장
8
- */
9
- import { Command } from 'commander';
10
- import chalk from 'chalk';
11
- import { ConfigManager } from '../../config/manager.js';
12
- import { MemoryDatabase } from '../../db/database.js';
13
- import { syncClaudeMd } from '../../claude/sync.js';
14
- export function claudeSyncCommand() {
15
- const cmd = new Command('claude-sync');
16
- cmd
17
- .description('Sync CLAUDE.md content to memory DB')
18
- .option('-p, --path <path>', 'Path to CLAUDE.md (auto-detect if omitted)')
19
- .option('--dry-run', 'Show what would be synced without writing')
20
- .option('--force', 'Force re-sync even if file unchanged')
21
- .action(async (options) => {
22
- const config = new ConfigManager().load();
23
- const db = new MemoryDatabase(config.db.path);
24
- try {
25
- db.initialize();
26
- const result = await syncClaudeMd(db, {
27
- claudeMdPath: options.path,
28
- dryRun: options.dryRun ?? false,
29
- force: options.force ?? false,
30
- });
31
- printResult(result, options.dryRun);
32
- }
33
- catch (error) {
34
- if (error instanceof Error) {
35
- console.error(chalk.red(`\n❌ 오류: ${error.message}\n`));
36
- }
37
- // TODO: process.exit() → throw + 상위 핸들러로 리팩토링 (P3-3)
38
- process.exit(1);
39
- }
40
- finally {
41
- db.close();
42
- }
43
- });
44
- return cmd;
45
- }
46
- function printResult(result, dryRun) {
47
- if (!result.found) {
48
- console.log(chalk.yellow('\n⚠️ CLAUDE.md 파일을 찾을 수 없습니다.\n'));
49
- console.log(chalk.dim(' 프로젝트 루트에 CLAUDE.md를 생성하거나'));
50
- console.log(chalk.dim(' --path 옵션으로 경로를 지정하세요.\n'));
51
- return;
52
- }
53
- const prefix = dryRun ? chalk.cyan('[DRY RUN] ') : '';
54
- console.log(chalk.bold(`\n${prefix}📋 CLAUDE.md 동기화 결과\n`));
55
- console.log(`${chalk.dim('파일:')} ${result.filePath}`);
56
- console.log(`${chalk.dim('섹션 수:')} ${result.totalSections}`);
57
- console.log(`${chalk.dim('새로 추가:')} ${chalk.green(result.created.toString())}개`);
58
- console.log(`${chalk.dim('업데이트:')} ${chalk.yellow(result.updated.toString())}개`);
59
- console.log(`${chalk.dim('스킵 (변경없음):')} ${chalk.dim(result.skipped.toString())}개`);
60
- if (result.sections.length > 0) {
61
- console.log(chalk.dim('\n섹션 상세:'));
62
- for (const section of result.sections) {
63
- const icon = section.action === 'created' ? '✅' :
64
- section.action === 'updated' ? '🔄' : '⏭️';
65
- console.log(` ${icon} ${chalk.dim(`[${section.category}]`)} ${section.title}`);
66
- }
67
- }
68
- console.log();
69
- }
70
- //# sourceMappingURL=claude-sync.js.map
1
+ function _0x382f(_0x27ac71,_0x3670ff){_0x27ac71=_0x27ac71-0xa6;const _0x209952=_0x2099();let _0x382f96=_0x209952[_0x27ac71];if(_0x382f['dEpWkv']===undefined){var _0x4340f0=function(_0x138f7b){const _0x4c1198='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x52c221='',_0x3977fb='';for(let _0xf27ff0=0x0,_0x1e017a,_0xa60116,_0x2f318c=0x0;_0xa60116=_0x138f7b['charAt'](_0x2f318c++);~_0xa60116&&(_0x1e017a=_0xf27ff0%0x4?_0x1e017a*0x40+_0xa60116:_0xa60116,_0xf27ff0++%0x4)?_0x52c221+=String['fromCharCode'](0xff&_0x1e017a>>(-0x2*_0xf27ff0&0x6)):0x0){_0xa60116=_0x4c1198['indexOf'](_0xa60116);}for(let _0x5f4fd0=0x0,_0x2f341c=_0x52c221['length'];_0x5f4fd0<_0x2f341c;_0x5f4fd0++){_0x3977fb+='%'+('00'+_0x52c221['charCodeAt'](_0x5f4fd0)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3977fb);};_0x382f['eAAtpO']=_0x4340f0,_0x382f['JkPTLN']={},_0x382f['dEpWkv']=!![];}const _0x37284a=_0x209952[0x0],_0xa9aaba=_0x27ac71+_0x37284a,_0x4b1f20=_0x382f['JkPTLN'][_0xa9aaba];return!_0x4b1f20?(_0x382f96=_0x382f['eAAtpO'](_0x382f96),_0x382f['JkPTLN'][_0xa9aaba]=_0x382f96):_0x382f96=_0x4b1f20,_0x382f96;}(function(_0x9fc5d0,_0x282c5d){function _0x2fda94(_0x35a72d,_0x146cc6){return _0x382f(_0x146cc6- -0x254,_0x35a72d);}const _0x19114b=_0x9fc5d0();function _0x4e2d0f(_0x5c4c17,_0x1903d1){return _0x382f(_0x5c4c17-0x21e,_0x1903d1);}while(!![]){try{const _0x718feb=parseInt(_0x4e2d0f(0x2e6,0x2fa))/0x1+-parseInt(_0x4e2d0f(0x2fb,0x30a))/0x2+-parseInt(_0x4e2d0f(0x307,0x30c))/0x3*(parseInt(_0x2fda94(-0x1b6,-0x197))/0x4)+parseInt(_0x4e2d0f(0x2cb,0x2f6))/0x5*(-parseInt(_0x4e2d0f(0x30a,0x327))/0x6)+-parseInt(_0x2fda94(-0x156,-0x15b))/0x7+parseInt(_0x4e2d0f(0x2ed,0x304))/0x8+parseInt(_0x4e2d0f(0x30f,0x334))/0x9*(parseInt(_0x4e2d0f(0x2e7,0x300))/0xa);if(_0x718feb===_0x282c5d)break;else _0x19114b['push'](_0x19114b['shift']());}catch(_0x19eaf8){_0x19114b['push'](_0x19114b['shift']());}}}(_0x2099,0x6cc85));function _0x3cc55a(_0x47565b,_0x1289c2){return _0x382f(_0x1289c2- -0x232,_0x47565b);}import{Command}from'commander';import _0x3ff018 from'chalk';import{ConfigManager}from'../../config/manager.js';import{MemoryDatabase}from'../../db/database.js';function _0x2495a2(_0x2248e3,_0x42dc83){return _0x382f(_0x2248e3-0x287,_0x42dc83);}import{syncClaudeMd}from'../../claude/sync.js';const SUPPORTED_FILES=[_0x2495a2(0x36f,0x362),_0x3cc55a(-0x145,-0x140),_0x2495a2(0x343,0x348)];export function claudeSyncCommand(){function _0x5af502(_0x598b5f,_0x97e315){return _0x2495a2(_0x598b5f-0x124,_0x97e315);}const _0x44e7f1={'VGoZW':function(_0x2ef4d2,_0x163e6e){return _0x2ef4d2===_0x163e6e;},'wlfWS':'CLAUDE.md','ZXCua':function(_0x4857c3,_0x348798,_0x22fe9a){return _0x4857c3(_0x348798,_0x22fe9a);},'JeLxi':_0x375b14(-0x58,-0x6e)+'c','Hrzsh':_0x375b14(-0x89,-0x71)+_0x5af502(0x472,0x461)+'NTS.md\x20/\x20G'+_0x375b14(-0x1f,-0x40)+_0x375b14(-0x27,-0x3c)+'memory\x20DB','ZjZWD':_0x5af502(0x459,0x454)+_0x5af502(0x496,0x488),'fwcry':_0x5af502(0x489,0x499),'YwGgM':_0x5af502(0x49e,0x475)+_0x5af502(0x48e,0x479)+_0x5af502(0x47e,0x45f)+_0x5af502(0x47b,0x47c)};function _0x375b14(_0x58ca63,_0x2bf9b7){return _0x2495a2(_0x2bf9b7- -0x39e,_0x58ca63);}const _0x263930=new Command(_0x44e7f1[_0x375b14(-0x63,-0x41)]);return _0x263930[_0x375b14(-0x6b,-0x70)+'n'](_0x44e7f1[_0x5af502(0x477,0x490)])[_0x375b14(-0x65,-0x38)](_0x44e7f1[_0x5af502(0x469,0x477)],_0x375b14(-0x5b,-0x6f)+_0x5af502(0x46f,0x499)+_0x375b14(-0x1d,-0x43)+_0x375b14(-0x41,-0x2a)+_0x5af502(0x475,0x470))[_0x5af502(0x48a,0x486)](_0x5af502(0x455,0x439)+_0x375b14(-0x7c,-0x57),_0x375b14(-0x6,-0x29)+_0x5af502(0x465,0x440)+'LAUDE.md,\x20'+_0x375b14(-0x55,-0x3d)+'\x20GEMINI.md'+',\x20or\x20\x22all\x22'+')')[_0x375b14(-0x46,-0x38)](_0x44e7f1[_0x5af502(0x4a7,0x4a3)],_0x375b14(0x8,-0x20)+'would\x20be\x20s'+_0x375b14(-0x63,-0x6b)+_0x5af502(0x49b,0x4ab)+'g')[_0x5af502(0x48a,0x462)]('--force',_0x44e7f1[_0x375b14(-0x68,-0x55)])[_0x375b14(-0x79,-0x52)](async _0x49b26f=>{const _0x412e89=new ConfigManager()['load']();function _0x16cc68(_0x338585,_0x5f1993){return _0x5af502(_0x5f1993- -0x1f5,_0x338585);}const _0x39b1da=new MemoryDatabase(_0x412e89['db']['path']);function _0x38ae75(_0x4311ee,_0x4c0d44){return _0x5af502(_0x4311ee- -0x50e,_0x4c0d44);}try{_0x39b1da[_0x38ae75(-0x98,-0x84)]();const _0x4bd57f=_0x44e7f1['VGoZW'](_0x49b26f[_0x38ae75(-0xa2,-0xb0)],_0x16cc68(0x270,0x269))?[...SUPPORTED_FILES]:[_0x49b26f[_0x38ae75(-0xa2,-0xc0)]??_0x44e7f1[_0x16cc68(0x274,0x26b)]];for(const _0x2493d6 of _0x4bd57f){const _0x4c2b72=await _0x44e7f1[_0x38ae75(-0xa0,-0xa4)](syncClaudeMd,_0x39b1da,{'claudeMdPath':_0x49b26f[_0x38ae75(-0x92,-0x82)],'fileName':_0x2493d6,'dryRun':_0x49b26f[_0x38ae75(-0x87,-0x9e)]??![],'force':_0x49b26f[_0x38ae75(-0x7f,-0x52)]??![]});printResult(_0x4c2b72,_0x49b26f[_0x38ae75(-0x87,-0x76)],_0x2493d6);}}catch(_0x10c898){_0x10c898 instanceof Error&&console[_0x16cc68(0x2a2,0x29b)](_0x3ff018[_0x38ae75(-0xb3,-0xb5)]('\x0a❌\x20오류:\x20'+_0x10c898[_0x16cc68(0x2be,0x2aa)]+'\x0a')),process[_0x38ae75(-0x95,-0x86)](0x1);}finally{_0x39b1da[_0x16cc68(0x29c,0x297)]();}}),_0x263930;}function printResult(_0x54fde4,_0x128389,_0x4f13f2){const _0x4b28c1={'RrWcg':function(_0x433b7f,_0x40e3ea){return _0x433b7f===_0x40e3ea;},'gqskB':function(_0xd6d966,_0x409c72){return _0xd6d966===_0x409c72;},'rmFIW':_0x5ce212(0x1f0,0x210),'flXnh':_0xc54843(0x3fe,0x401),'weCqI':'upTwG','QfDRh':'섹션\x20수:','bEazu':function(_0x47ed39,_0x3a884c){return _0x47ed39>_0x3a884c;},'kgLlv':_0x5ce212(0x203,0x20d),'aNYXn':_0x5ce212(0x1c4,0x1e0)},_0x1e088d=_0x4f13f2??_0x4b28c1['flXnh'];if(!_0x54fde4[_0x5ce212(0x1c2,0x1e5)]){if(_0xc54843(0x3cf,0x3d2)!==_0x4b28c1['weCqI']){_0x5c7a7c['log'](_0x2e14ac[_0xc54843(0x410,0x414)](_0x5ce212(0x219,0x20d)));for(const _0x451d5a of _0x2a3498[_0x5ce212(0x1a5,0x1ca)]){const _0x407506=_0x4b28c1[_0x5ce212(0x20f,0x1f3)](_0x451d5a[_0x5ce212(0x1fe,0x1d8)],_0xc54843(0x3de,0x3e6))?'✅':_0x4b28c1[_0x5ce212(0x1d8,0x1ce)](_0x451d5a[_0x5ce212(0x1e6,0x1d8)],_0x4b28c1[_0x5ce212(0x1cb,0x1be)])?'🔄':'⏭️';_0x5f942[_0xc54843(0x406,0x40f)]('\x20\x20'+_0x407506+'\x20'+_0x52c733[_0x5ce212(0x229,0x20e)]('['+_0x451d5a[_0xc54843(0x3ff,0x3d8)]+']')+'\x20'+_0x451d5a['title']);}}else{console[_0xc54843(0x3fa,0x40f)](_0x3ff018['yellow']('\x0a⚠️\x20\x20'+_0x1e088d+('\x20파일을\x20찾을\x20수\x20'+'없습니다.\x0a'))),console[_0xc54843(0x417,0x40f)](_0x3ff018[_0x5ce212(0x230,0x20e)]('\x20\x20--path\x20옵'+'션으로\x20경로를\x20지정'+_0xc54843(0x3d8,0x3cf))),console[_0xc54843(0x432,0x40f)](_0x3ff018['dim'](_0x5ce212(0x22d,0x20b)+_0xc54843(0x431,0x408)+'.\x0a'));return;}}const _0x5715df=_0x128389?_0x3ff018[_0x5ce212(0x1ea,0x1c4)](_0xc54843(0x3e9,0x3cd)):'';console[_0x5ce212(0x213,0x209)](_0x3ff018['bold']('\x0a'+_0x5715df+_0xc54843(0x3ea,0x3ee)+_0x1e088d+_0x5ce212(0x205,0x1fd)));function _0xc54843(_0x56b4d5,_0x37e678){return _0x3cc55a(_0x56b4d5,_0x37e678-0x54b);}console[_0x5ce212(0x1e1,0x209)](_0x3ff018[_0xc54843(0x430,0x414)](_0x5ce212(0x233,0x211))+'\x20'+_0x54fde4[_0xc54843(0x3d9,0x3f1)]),console['log'](_0x3ff018['dim'](_0x4b28c1['QfDRh'])+'\x20'+_0x54fde4[_0x5ce212(0x226,0x208)+'ons']);function _0x5ce212(_0x2aa765,_0x2bf98b){return _0x3cc55a(_0x2aa765,_0x2bf98b-0x345);}console['log'](_0x3ff018[_0x5ce212(0x21d,0x20e)](_0x5ce212(0x204,0x1fa))+'\x20'+_0x3ff018['green'](_0x54fde4['created'][_0x5ce212(0x1ce,0x1c5)]())+'개'),console[_0x5ce212(0x21b,0x209)](_0x3ff018[_0xc54843(0x406,0x414)](_0xc54843(0x410,0x3f2))+'\x20'+_0x3ff018[_0x5ce212(0x1c8,0x1d9)](_0x54fde4['updated'][_0xc54843(0x3d0,0x3cb)]())+'개'),console[_0x5ce212(0x1f8,0x209)](_0x3ff018[_0xc54843(0x43d,0x414)](_0xc54843(0x3fc,0x3d1))+'\x20'+_0x3ff018[_0xc54843(0x418,0x414)](_0x54fde4['skipped'][_0xc54843(0x3ab,0x3cb)]())+'개');if(_0x4b28c1[_0xc54843(0x425,0x3fb)](_0x54fde4['sections']['length'],0x0)){console[_0x5ce212(0x207,0x209)](_0x3ff018[_0xc54843(0x3f7,0x414)](_0x4b28c1[_0xc54843(0x421,0x3ff)]));for(const _0x27f37e of _0x54fde4[_0xc54843(0x3fc,0x3d0)]){const _0x15f4a4=_0x4b28c1['RrWcg'](_0x27f37e[_0xc54843(0x3fd,0x3de)],_0x4b28c1[_0x5ce212(0x1ea,0x1c2)])?'✅':_0x27f37e['action']===_0x4b28c1[_0x5ce212(0x1d8,0x1be)]?'🔄':'⏭️';console[_0xc54843(0x41d,0x40f)]('\x20\x20'+_0x15f4a4+'\x20'+_0x3ff018[_0xc54843(0x43c,0x414)]('['+_0x27f37e[_0x5ce212(0x1bd,0x1d2)]+']')+'\x20'+_0x27f37e['title']);}}console[_0x5ce212(0x200,0x209)]();}function _0x2099(){const _0xb47f84=['7j6S7zwy64Qu7kEaio2zLEYDUo2vMoYeUoYALa','B3v0ihDYAxrPBG','mtm5mte1n25dDgPitW','quDftLrtlM1K','rM9Yy2uGCMuTCW','BwvZC2fNzq','Dg90ywXtzwn0Aq','Bg9N','u2HVDYb3Agf0ia','icdTLBtRI7KG7yYm7j287j20ioYHTa','nta1mZa2mNDstvL5zG','cUYeUEYfMcdSG4hSHlG6','zgLT','zNDJCNK','DxbKyxrLza','7yYm7j28oG','u3LUyYbdtefvra','zgvZy3jPChrPBW','ugf0Acb0BYbTyq','y2XHDwrLlxn5BG','lwySic0TzMLSzq','CM1gsvC','Ew5JzwqGD2L0Aa','nwTorwf1Ca','lxaSic0TCgf0Aa','yu5zwg4','CMvK','y3LHBG','Dg9tDhjPBMC','ywXS','w0rswsbsvu5Dia','D2XMv1m','7zwy6RgW64ky','C2vJDgLVBNm','7iQK7yk1icJRS4dQSR3SL4BSNyWPoG','DxbuD0C','Dg8GC3LUyYaOqW','z3fZA0i','r0vnsu5jlM1K','nhnQvgXsyq','wMPAv0q','y2f0zwDVCNK','idXUyw1LpG','zMLSzq','wxDhz00','wLHdDwe','CMTKB3DUigzPBa','ywn0Aw9U','EwvSBg93','rs5TzcaViefhrq','odG4mdiXCKrpqxfL','otbVA3nKAxG','Axr0zwqP','Aw5PDgLHBgL6zq','shj6C2G','y3jLyxrLza','zxHPDa','mtC5mZm1mK9rs3vQAG','AgfUz2vK','Cgf0Aa','zM91BMq','zIbMAwXLihvUyW','zsaOyxv0BY1Kzq','8j+tIYa','sMvmEgK','ru1jtKKUBwqGyW','zMLSzvbHDgG','7jEf642W7j207yQ4oG','quDftLrtlM1Kla','B250zw50ihrVia','zhj5uNvU','mtuWmdG0oevTB0DwtW','ls1KCNKTCNvU','B3b0Aw9U','uNjxy2C','y2XVC2u','yKvHENu','Ew5Jigv2zw4GAq','zM9Yy2u','zxjYB3i','A2DmBhy','7ioi66gCioY2LoQWGdO','q0XbvurflM1K','mtuWmJi3mw9JEK1MEG','ioUpMEQ4So2zLcdQSRdQS7Wk','idXWyxrOpG','nta4mZyYtM1Ay0jv','DgvJDcbPzIbVBq','rMLSzsbUyw1Lia'];_0x2099=function(){return _0xb47f84;};return _0x2099();}