a2a-memory 0.10.8 → 0.10.10

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 (54) hide show
  1. package/dist/chunking/chunker.d.ts +32 -0
  2. package/dist/chunking/chunker.d.ts.map +1 -0
  3. package/dist/chunking/chunker.js +163 -0
  4. package/dist/chunking/chunker.js.map +1 -0
  5. package/dist/claude/sync.d.ts +1 -1
  6. package/dist/claude/sync.d.ts.map +1 -1
  7. package/dist/claude/sync.js +115 -39
  8. package/dist/claude/sync.js.map +1 -1
  9. package/dist/cli/commands/add.d.ts.map +1 -1
  10. package/dist/cli/commands/add.js +46 -12
  11. package/dist/cli/commands/add.js.map +1 -1
  12. package/dist/cli/commands/migrate-chunks.d.ts +15 -0
  13. package/dist/cli/commands/migrate-chunks.d.ts.map +1 -0
  14. package/dist/cli/commands/migrate-chunks.js +205 -0
  15. package/dist/cli/commands/migrate-chunks.js.map +1 -0
  16. package/dist/cli/index.js +2 -0
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/db/database.d.ts +26 -1
  19. package/dist/db/database.d.ts.map +1 -1
  20. package/dist/db/database.js +197 -8
  21. package/dist/db/database.js.map +1 -1
  22. package/dist/hooks/session-start.d.ts.map +1 -1
  23. package/dist/hooks/session-start.js +70 -8
  24. package/dist/hooks/session-start.js.map +1 -1
  25. package/dist/hooks/user-prompt-submit.d.ts.map +1 -1
  26. package/dist/hooks/user-prompt-submit.js +58 -8
  27. package/dist/hooks/user-prompt-submit.js.map +1 -1
  28. package/dist/lifecycle/cleanup.d.ts.map +1 -1
  29. package/dist/lifecycle/cleanup.js +38 -16
  30. package/dist/lifecycle/cleanup.js.map +1 -1
  31. package/dist/lifecycle/tiering.d.ts.map +1 -1
  32. package/dist/lifecycle/tiering.js +1 -0
  33. package/dist/lifecycle/tiering.js.map +1 -1
  34. package/dist/search/index.d.ts +3 -0
  35. package/dist/search/index.d.ts.map +1 -1
  36. package/dist/search/index.js +2 -0
  37. package/dist/search/index.js.map +1 -1
  38. package/dist/search/ranker.d.ts +1 -0
  39. package/dist/search/ranker.d.ts.map +1 -1
  40. package/dist/search/ranker.js +1 -0
  41. package/dist/search/ranker.js.map +1 -1
  42. package/dist/sync/client.d.ts +6 -0
  43. package/dist/sync/client.d.ts.map +1 -1
  44. package/dist/sync/client.js.map +1 -1
  45. package/dist/sync/queue.d.ts.map +1 -1
  46. package/dist/sync/queue.js +10 -0
  47. package/dist/sync/queue.js.map +1 -1
  48. package/dist/sync/synchronizer.d.ts.map +1 -1
  49. package/dist/sync/synchronizer.js +9 -0
  50. package/dist/sync/synchronizer.js.map +1 -1
  51. package/dist/types/index.d.ts +6 -0
  52. package/dist/types/index.d.ts.map +1 -1
  53. package/dist/types/index.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Content Chunker
3
+ *
4
+ * 긴 콘텐츠를 의미 단위로 분할합니다.
5
+ * 전략: Header-based + Recursive Character Splitting 하이브리드
6
+ */
7
+ export interface ChunkConfig {
8
+ /** Child 최대 크기 (characters) */
9
+ maxChunkChars: number;
10
+ /** 청크 간 오버랩 (characters) */
11
+ overlapChars: number;
12
+ /** 최소 크기 — 이하면 이전 청크에 병합 */
13
+ minChunkChars: number;
14
+ /** 이 길이 이하면 chunking 안 함 */
15
+ chunkThreshold: number;
16
+ }
17
+ /** 임베딩 모델별 프리셋 */
18
+ export declare const CHUNK_PRESETS: Record<string, ChunkConfig>;
19
+ /**
20
+ * 콘텐츠를 chunking해야 하는지 판단
21
+ */
22
+ export declare function shouldChunk(content: string, config?: Partial<ChunkConfig>): boolean;
23
+ /**
24
+ * 콘텐츠를 의미 단위 청크로 분할
25
+ *
26
+ * 1. Markdown 헤더(#, ##, ###) 기반 1차 분할
27
+ * 2. 각 섹션이 maxChunkChars 초과 시 → Recursive Character Splitting
28
+ * 3. minChunkChars 미만 청크 → 이전 청크에 병합
29
+ * 4. 각 청크에 오버랩 추가
30
+ */
31
+ export declare function chunkContent(content: string, config?: Partial<ChunkConfig>): string[];
32
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/chunking/chunker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,kBAAkB;AAClB,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAIrD,CAAC;AAIF;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAGnF;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,EAAE,CAkCrF"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Content Chunker
3
+ *
4
+ * 긴 콘텐츠를 의미 단위로 분할합니다.
5
+ * 전략: Header-based + Recursive Character Splitting 하이브리드
6
+ */
7
+ /** 임베딩 모델별 프리셋 */
8
+ export const CHUNK_PRESETS = {
9
+ local: { maxChunkChars: 200, overlapChars: 20, minChunkChars: 30, chunkThreshold: 300 },
10
+ e5: { maxChunkChars: 800, overlapChars: 80, minChunkChars: 50, chunkThreshold: 1000 },
11
+ openai: { maxChunkChars: 1500, overlapChars: 150, minChunkChars: 100, chunkThreshold: 2000 },
12
+ };
13
+ const DEFAULT_CONFIG = CHUNK_PRESETS.local;
14
+ /**
15
+ * 콘텐츠를 chunking해야 하는지 판단
16
+ */
17
+ export function shouldChunk(content, config) {
18
+ const cfg = { ...DEFAULT_CONFIG, ...config };
19
+ return content.length > cfg.chunkThreshold;
20
+ }
21
+ /**
22
+ * 콘텐츠를 의미 단위 청크로 분할
23
+ *
24
+ * 1. Markdown 헤더(#, ##, ###) 기반 1차 분할
25
+ * 2. 각 섹션이 maxChunkChars 초과 시 → Recursive Character Splitting
26
+ * 3. minChunkChars 미만 청크 → 이전 청크에 병합
27
+ * 4. 각 청크에 오버랩 추가
28
+ */
29
+ export function chunkContent(content, config) {
30
+ const cfg = { ...DEFAULT_CONFIG, ...config };
31
+ if (!shouldChunk(content, config)) {
32
+ return [content];
33
+ }
34
+ // Step 1: Markdown 헤더 기반 1차 분할
35
+ const sections = splitByHeaders(content);
36
+ // Step 2: 큰 섹션 재분할
37
+ const rawChunks = [];
38
+ for (const section of sections) {
39
+ if (section.length <= cfg.maxChunkChars) {
40
+ rawChunks.push(section);
41
+ }
42
+ else {
43
+ rawChunks.push(...recursiveSplit(section, cfg.maxChunkChars));
44
+ }
45
+ }
46
+ // Step 3: 작은 청크 병합
47
+ const merged = mergeSmallChunks(rawChunks, cfg.minChunkChars, cfg.maxChunkChars);
48
+ // merged가 비어있으면 원본 반환 (헤더만 있는 콘텐츠 등)
49
+ if (merged.length === 0) {
50
+ return [content];
51
+ }
52
+ // Step 4: 오버랩 추가
53
+ if (cfg.overlapChars > 0 && merged.length > 1) {
54
+ return addOverlap(merged, cfg.overlapChars);
55
+ }
56
+ return merged;
57
+ }
58
+ /**
59
+ * Markdown 헤더 기반 분할
60
+ */
61
+ function splitByHeaders(content) {
62
+ const lines = content.split('\n');
63
+ const sections = [];
64
+ let current = [];
65
+ for (const line of lines) {
66
+ if (/^#{1,3}\s+/.test(line) && current.length > 0) {
67
+ const text = current.join('\n').trim();
68
+ if (text)
69
+ sections.push(text);
70
+ current = [line];
71
+ }
72
+ else {
73
+ current.push(line);
74
+ }
75
+ }
76
+ const last = current.join('\n').trim();
77
+ if (last)
78
+ sections.push(last);
79
+ return sections;
80
+ }
81
+ /**
82
+ * Recursive Character Splitting (단락 → 문장 → 단어 경계)
83
+ */
84
+ function recursiveSplit(text, maxChars) {
85
+ if (text.length <= maxChars)
86
+ return [text];
87
+ // 분할 구분자 우선순위: 빈 줄 → 줄바꿈 → 문장 끝 → 단어 경계
88
+ const separators = ['\n\n', '\n', '. ', '? ', '! ', ', ', ' '];
89
+ for (const sep of separators) {
90
+ const parts = text.split(sep);
91
+ if (parts.length <= 1)
92
+ continue;
93
+ const chunks = [];
94
+ let buffer = '';
95
+ for (const part of parts) {
96
+ const candidate = buffer ? buffer + sep + part : part;
97
+ if (candidate.length > maxChars && buffer) {
98
+ chunks.push(buffer);
99
+ buffer = part;
100
+ }
101
+ else {
102
+ buffer = candidate;
103
+ }
104
+ }
105
+ if (buffer)
106
+ chunks.push(buffer);
107
+ // 모든 청크가 maxChars 이하인지 확인
108
+ if (chunks.every(c => c.length <= maxChars)) {
109
+ return chunks;
110
+ }
111
+ // 아직 큰 청크가 있으면 재귀 분할
112
+ const result = [];
113
+ for (const chunk of chunks) {
114
+ if (chunk.length > maxChars) {
115
+ result.push(...recursiveSplit(chunk, maxChars));
116
+ }
117
+ else {
118
+ result.push(chunk);
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ // 어떤 구분자로도 분할 불가 → 강제 분할
124
+ const result = [];
125
+ for (let i = 0; i < text.length; i += maxChars) {
126
+ result.push(text.slice(i, i + maxChars));
127
+ }
128
+ return result;
129
+ }
130
+ /**
131
+ * 작은 청크를 이전 청크에 병합
132
+ */
133
+ function mergeSmallChunks(chunks, minChars, maxChars) {
134
+ if (chunks.length <= 1)
135
+ return chunks;
136
+ const result = [];
137
+ for (const chunk of chunks) {
138
+ if (result.length > 0 && chunk.length < minChars) {
139
+ const prev = result[result.length - 1];
140
+ if (prev.length + chunk.length + 1 <= maxChars) {
141
+ result[result.length - 1] = prev + '\n' + chunk;
142
+ continue;
143
+ }
144
+ }
145
+ result.push(chunk);
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * 청크 간 오버랩 추가
151
+ */
152
+ function addOverlap(chunks, overlapChars) {
153
+ if (chunks.length <= 1)
154
+ return chunks;
155
+ return chunks.map((chunk, i) => {
156
+ if (i === 0)
157
+ return chunk;
158
+ const prev = chunks[i - 1];
159
+ const overlap = prev.slice(-overlapChars);
160
+ return overlap + chunk;
161
+ });
162
+ }
163
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/chunking/chunker.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * 동작:
7
7
  * 1. CLAUDE.md 파일 탐색 (프로젝트 루트, .claude/ 등)
8
8
  * 2. 마크다운 헤딩(##) 기준으로 섹션 분리
9
- * 3. 섹션을 convention/context 카테고리 메모리로 저장
9
+ * 3. Parent-Child 패턴: 파일 전체 Parent, 섹션별 → Child
10
10
  * 4. content hash로 중복/변경 감지
11
11
  */
12
12
  import type { MemoryDatabase } from '../db/database.js';
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/claude/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CA4E3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CA8C9D"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/claude/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAuJ3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CA8C9D"}
@@ -6,7 +6,7 @@
6
6
  * 동작:
7
7
  * 1. CLAUDE.md 파일 탐색 (프로젝트 루트, .claude/ 등)
8
8
  * 2. 마크다운 헤딩(##) 기준으로 섹션 분리
9
- * 3. 섹션을 convention/context 카테고리 메모리로 저장
9
+ * 3. Parent-Child 패턴: 파일 전체 Parent, 섹션별 → Child
10
10
  * 4. content hash로 중복/변경 감지
11
11
  */
12
12
  import { readFileSync, existsSync } from 'node:fs';
@@ -47,6 +47,8 @@ export async function syncClaudeMd(db, options = {}) {
47
47
  }
48
48
  const content = readFileSync(filePath, 'utf-8');
49
49
  const sections = parseClaudeMd(content);
50
+ const filename = basename(filePath);
51
+ const contentHash = computeHash(content);
50
52
  const result = {
51
53
  found: true,
52
54
  filePath,
@@ -57,45 +59,107 @@ export async function syncClaudeMd(db, options = {}) {
57
59
  sections: [],
58
60
  };
59
61
  const projectPath = options.projectPath ?? process.cwd();
60
- for (const section of sections) {
61
- const category = classifySection(section.title);
62
- const memoryContent = formatSectionAsMemory(section, filePath);
63
- const sectionTags = [CLAUDE_MD_TAG, `section:${section.title}`, `hash:${section.hash}`];
64
- // 기존 메모리 탐색 (태그 + 제목 기반)
65
- const existing = findExistingMemory(db, section.title);
66
- if (existing) {
67
- // hash 태그에서 기존 해시 추출하여 비교
68
- const existingHashTag = existing.tags.find(t => t.startsWith('hash:'));
69
- const existingHash = existingHashTag?.slice(5) ?? '';
70
- if (existingHash === section.hash && !options.force) {
71
- result.skipped++;
72
- result.sections.push({ title: section.title, category, action: 'skipped' });
73
- continue;
62
+ // Parent-Child 패턴: Parent 탐색
63
+ const existingParent = findExistingParent(db, filename);
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' });
74
73
  }
75
- // 업데이트
76
- if (!options.dryRun) {
77
- db.updateMemory(existing.id, {
78
- content: memoryContent,
79
- category,
80
- tags: sectionTags,
81
- });
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) !== 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);
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
+ }
82
138
  }
83
- result.updated++;
84
- result.sections.push({ title: section.title, category, action: 'updated' });
85
139
  }
86
140
  else {
87
- // 새로 생성
141
+ // 신규 Parent-Child 패턴
88
142
  if (!options.dryRun) {
89
- db.createMemory({
90
- content: memoryContent,
91
- category,
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',
92
154
  tier: 'semantic',
93
- tags: sectionTags,
155
+ tags: parentTags,
94
156
  projectPath,
95
- });
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' });
96
162
  }
97
- result.created++;
98
- result.sections.push({ title: section.title, category, action: 'created' });
99
163
  }
100
164
  }
101
165
  return result;
@@ -192,18 +256,30 @@ function formatSectionAsMemory(section, filePath) {
192
256
  return `[CLAUDE.md: ${section.title}]\nSource: ${basename(filePath)}\n\n${section.content}`;
193
257
  }
194
258
  /**
195
- * 기존 claude-md-sync 태그 메모리 탐색
259
+ * 기존 Parent 메모리 탐색 (source:{filename} 태그 기반)
260
+ *
261
+ * listMemories(limit=1000) 대신 tag 인덱스 JOIN을 활용하여 전체 조회합니다.
262
+ */
263
+ function findExistingParent(db, filename) {
264
+ const sourceTag = `source:${filename}`;
265
+ const candidates = db.findMemoriesByTag(sourceTag);
266
+ const existing = candidates.find(m => m.tags.includes(CLAUDE_MD_TAG) &&
267
+ !m.parentId);
268
+ if (existing) {
269
+ return { id: existing.id, content: existing.content, tags: existing.tags };
270
+ }
271
+ return null;
272
+ }
273
+ /**
274
+ * 기존 claude-md-sync 태그 메모리 탐색 (레거시 호환용)
196
275
  *
197
- * FTS 검색 대신 listMemories() claude-md-sync 태그 메모리를 전체 조회 후
198
- * `section:{title}` 태그로 정확히 매칭합니다.
276
+ * listMemories(limit=1000) 대신 tag 인덱스 JOIN을 활용하여 전체 조회합니다.
199
277
  * FTS 기반 접근은 섹션 제목 오매칭/미매칭으로 중복 생성을 유발하므로 사용하지 않습니다.
200
278
  */
201
279
  function findExistingMemory(db, sectionTitle) {
202
280
  const sectionTag = `section:${sectionTitle}`;
203
- // limit을 넉넉하게 설정하여 다수 섹션이 있어도 모두 조회
204
- const allMemories = db.listMemories({ limit: 1000 });
205
- const existing = allMemories.find(m => m.tags.includes(CLAUDE_MD_TAG) &&
206
- m.tags.includes(sectionTag));
281
+ const candidates = db.findMemoriesByTag(sectionTag);
282
+ const existing = candidates.find(m => m.tags.includes(CLAUDE_MD_TAG));
207
283
  if (existing) {
208
284
  return { id: existing.id, content: existing.content, tags: existing.tags };
209
285
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/claude/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsCzC,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,wCAAwC;IACxC,IAAI,iDAAiD,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAClF,sBAAsB;IACtB,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAkB,EAClB,UAA6B,EAAE;IAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3E,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,aAAa,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,MAAM,GAAqB;QAC/B,KAAK,EAAE,IAAI;QACX,QAAQ;QACR,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE/D,MAAM,WAAW,GAAG,CAAC,aAAa,EAAE,WAAW,OAAO,CAAC,KAAK,EAAE,EAAE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAExF,yBAAyB;QACzB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,QAAQ,EAAE,CAAC;YACb,0BAA0B;YAC1B,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,YAAY,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpD,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC5E,SAAS;YACX,CAAC;YAED,OAAO;YACP,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAC3B,OAAO,EAAE,aAAa;oBACtB,QAAQ;oBACR,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,QAAQ;YACR,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,EAAE,CAAC,YAAY,CAAC;oBACd,OAAO,EAAE,aAAa;oBACtB,QAAQ;oBACR,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,WAAW;oBACjB,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACxB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEpD,IAAI,YAAY,EAAE,CAAC;YACjB,WAAW;YACX,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtD,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW;oBAC3C,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,YAAY;wBACnB,OAAO,EAAE,cAAc;wBACvB,KAAK,EAAE,YAAY;wBACnB,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC;qBAClC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACtC,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,SAAS;IACT,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,cAAc;gBACvB,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9E,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1E,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,OAAsB,EAAE,QAAgB;IACrE,OAAO,eAAe,OAAO,CAAC,KAAK,cAAc,QAAQ,CAAC,QAAQ,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC9F,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,EAAkB,EAClB,YAAoB;IAEpB,MAAM,UAAU,GAAG,WAAW,YAAY,EAAE,CAAC;IAC7C,oCAAoC;IACpC,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACpC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC5B,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/claude/sync.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,UAAU,IAAI,OAAO,CAqCpC"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,UAAU,IAAI,OAAO,CAyEpC"}
@@ -5,33 +5,67 @@
5
5
  */
6
6
  import { Command } from 'commander';
7
7
  import chalk from 'chalk';
8
+ import { readFileSync } from 'node:fs';
8
9
  import { ConfigManager } from '../../config/manager.js';
9
10
  import { MemoryDatabase } from '../../db/database.js';
11
+ import { shouldChunk, chunkContent, CHUNK_PRESETS } from '../../chunking/chunker.js';
10
12
  export function addCommand() {
11
13
  return new Command('add')
12
14
  .description('Add a new memory')
13
- .argument('<content>', 'Memory content')
15
+ .argument('[content]', 'Memory content')
14
16
  .option('-c, --category <category>', 'Memory category', 'context')
15
17
  .option('-t, --tier <tier>', 'Memory tier', 'episodic')
16
18
  .option('--tags <tags>', 'Comma-separated tags')
17
- .action((content, options) => {
19
+ .option('-f, --file <path>', 'Read content from file')
20
+ .option('--no-chunk', 'Disable auto-chunking for long content')
21
+ .action((contentArg, options) => {
18
22
  const config = new ConfigManager().load();
19
23
  const db = new MemoryDatabase(config.db.path);
20
24
  try {
21
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
+ }
22
38
  const tags = options.tags
23
39
  ? options.tags.split(',').map((t) => t.trim()).filter(Boolean)
24
40
  : [];
25
- const memory = db.createMemory({
26
- content,
27
- category: options.category,
28
- tier: options.tier,
29
- tags,
30
- });
31
- console.log(chalk.green('✓ Memory added successfully'));
32
- console.log(chalk.dim(`ID: ${memory.id}`));
33
- console.log(chalk.dim(`Category: ${memory.category}`));
34
- console.log(chalk.dim(`Tags: ${memory.tags.join(', ') || '(none)'}`));
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
+ }
35
69
  }
36
70
  catch (error) {
37
71
  console.error(chalk.red('Error adding memory:'), error);
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;SACtB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;SACvC,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,CAAC;SACjE,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,UAAU,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,CAAC,OAAe,EAAE,OAAO,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,EAAE,CAAC;YAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI;gBACvB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACtE,CAAC,CAAC,EAAE,CAAC;YAEP,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC;gBAC7B,OAAO;gBACP,QAAQ,EAAE,OAAO,CAAC,QAA0B;gBAC5C,IAAI,EAAE,OAAO,CAAC,IAAkB;gBAChC,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,CAAC;YACxD,qDAAqD;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Migrate-Chunks Command
3
+ *
4
+ * 레거시 claude-md-sync 메모리(독립 섹션)를 Parent-Child 구조로 마이그레이션합니다.
5
+ *
6
+ * 동작:
7
+ * 1. claude-md-sync 태그 + section:* 태그 + parent_id=NULL인 레거시 메모리 탐색
8
+ * 2. source 파일별로 그룹핑
9
+ * 3. 원본 파일 읽기 → Parent 생성
10
+ * 4. 섹션 재파싱 → Children 생성
11
+ * 5. 레거시 메모리 삭제 (tombstone + sync 상태 보존)
12
+ */
13
+ import { Command } from 'commander';
14
+ export declare function migrateChunksCommand(): Command;
15
+ //# sourceMappingURL=migrate-chunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-chunks.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate-chunks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgLpC,wBAAgB,oBAAoB,IAAI,OAAO,CA8D9C"}