pilot-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/dist/agent/claude.d.ts +45 -0
  2. package/dist/agent/claude.d.ts.map +1 -0
  3. package/dist/agent/claude.js +114 -0
  4. package/dist/agent/claude.js.map +1 -0
  5. package/dist/agent/core.d.ts +17 -0
  6. package/dist/agent/core.d.ts.map +1 -0
  7. package/dist/agent/core.js +129 -0
  8. package/dist/agent/core.js.map +1 -0
  9. package/dist/agent/heartbeat.d.ts +51 -0
  10. package/dist/agent/heartbeat.d.ts.map +1 -0
  11. package/dist/agent/heartbeat.js +253 -0
  12. package/dist/agent/heartbeat.js.map +1 -0
  13. package/dist/agent/memory-commands.d.ts +11 -0
  14. package/dist/agent/memory-commands.d.ts.map +1 -0
  15. package/dist/agent/memory-commands.js +55 -0
  16. package/dist/agent/memory-commands.js.map +1 -0
  17. package/dist/agent/memory.d.ts +11 -0
  18. package/dist/agent/memory.d.ts.map +1 -0
  19. package/dist/agent/memory.js +109 -0
  20. package/dist/agent/memory.js.map +1 -0
  21. package/dist/agent/multi-agent.d.ts +47 -0
  22. package/dist/agent/multi-agent.d.ts.map +1 -0
  23. package/dist/agent/multi-agent.js +117 -0
  24. package/dist/agent/multi-agent.js.map +1 -0
  25. package/dist/agent/pipeline.d.ts +27 -0
  26. package/dist/agent/pipeline.d.ts.map +1 -0
  27. package/dist/agent/pipeline.js +52 -0
  28. package/dist/agent/pipeline.js.map +1 -0
  29. package/dist/agent/planner.d.ts +21 -0
  30. package/dist/agent/planner.d.ts.map +1 -0
  31. package/dist/agent/planner.js +51 -0
  32. package/dist/agent/planner.js.map +1 -0
  33. package/dist/agent/preference-detector.d.ts +6 -0
  34. package/dist/agent/preference-detector.d.ts.map +1 -0
  35. package/dist/agent/preference-detector.js +50 -0
  36. package/dist/agent/preference-detector.js.map +1 -0
  37. package/dist/agent/project-analyzer.d.ts +6 -0
  38. package/dist/agent/project-analyzer.d.ts.map +1 -0
  39. package/dist/agent/project-analyzer.js +108 -0
  40. package/dist/agent/project-analyzer.js.map +1 -0
  41. package/dist/agent/project.d.ts +28 -0
  42. package/dist/agent/project.d.ts.map +1 -0
  43. package/dist/agent/project.js +121 -0
  44. package/dist/agent/project.js.map +1 -0
  45. package/dist/agent/queue.d.ts +61 -0
  46. package/dist/agent/queue.d.ts.map +1 -0
  47. package/dist/agent/queue.js +167 -0
  48. package/dist/agent/queue.js.map +1 -0
  49. package/dist/agent/safety.d.ts +25 -0
  50. package/dist/agent/safety.d.ts.map +1 -0
  51. package/dist/agent/safety.js +77 -0
  52. package/dist/agent/safety.js.map +1 -0
  53. package/dist/agent/semantic-search.d.ts +34 -0
  54. package/dist/agent/semantic-search.d.ts.map +1 -0
  55. package/dist/agent/semantic-search.js +183 -0
  56. package/dist/agent/semantic-search.js.map +1 -0
  57. package/dist/agent/skills.d.ts +59 -0
  58. package/dist/agent/skills.d.ts.map +1 -0
  59. package/dist/agent/skills.js +161 -0
  60. package/dist/agent/skills.js.map +1 -0
  61. package/dist/agent/tool-descriptions.d.ts +7 -0
  62. package/dist/agent/tool-descriptions.d.ts.map +1 -0
  63. package/dist/agent/tool-descriptions.js +51 -0
  64. package/dist/agent/tool-descriptions.js.map +1 -0
  65. package/dist/agent/worktree.d.ts +28 -0
  66. package/dist/agent/worktree.d.ts.map +1 -0
  67. package/dist/agent/worktree.js +59 -0
  68. package/dist/agent/worktree.js.map +1 -0
  69. package/dist/api/server.d.ts +30 -0
  70. package/dist/api/server.d.ts.map +1 -0
  71. package/dist/api/server.js +135 -0
  72. package/dist/api/server.js.map +1 -0
  73. package/dist/cli/connection-test.d.ts +14 -0
  74. package/dist/cli/connection-test.d.ts.map +1 -0
  75. package/dist/cli/connection-test.js +82 -0
  76. package/dist/cli/connection-test.js.map +1 -0
  77. package/dist/cli/init.d.ts +2 -0
  78. package/dist/cli/init.d.ts.map +1 -0
  79. package/dist/cli/init.js +287 -0
  80. package/dist/cli/init.js.map +1 -0
  81. package/dist/cli/logs.d.ts +5 -0
  82. package/dist/cli/logs.d.ts.map +1 -0
  83. package/dist/cli/logs.js +32 -0
  84. package/dist/cli/logs.js.map +1 -0
  85. package/dist/cli/project.d.ts +3 -0
  86. package/dist/cli/project.d.ts.map +1 -0
  87. package/dist/cli/project.js +58 -0
  88. package/dist/cli/project.js.map +1 -0
  89. package/dist/cli/start.d.ts +5 -0
  90. package/dist/cli/start.d.ts.map +1 -0
  91. package/dist/cli/start.js +82 -0
  92. package/dist/cli/start.js.map +1 -0
  93. package/dist/cli/status.d.ts +8 -0
  94. package/dist/cli/status.d.ts.map +1 -0
  95. package/dist/cli/status.js +39 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/stop.d.ts +2 -0
  98. package/dist/cli/stop.d.ts.map +1 -0
  99. package/dist/cli/stop.js +28 -0
  100. package/dist/cli/stop.js.map +1 -0
  101. package/dist/config/keychain.d.ts +4 -0
  102. package/dist/config/keychain.d.ts.map +1 -0
  103. package/dist/config/keychain.js +54 -0
  104. package/dist/config/keychain.js.map +1 -0
  105. package/dist/config/schema.d.ts +60 -0
  106. package/dist/config/schema.d.ts.map +1 -0
  107. package/dist/config/schema.js +88 -0
  108. package/dist/config/schema.js.map +1 -0
  109. package/dist/config/store.d.ts +8 -0
  110. package/dist/config/store.d.ts.map +1 -0
  111. package/dist/config/store.js +48 -0
  112. package/dist/config/store.js.map +1 -0
  113. package/dist/index.d.ts +3 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +47 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/messenger/adapter.d.ts +30 -0
  118. package/dist/messenger/adapter.d.ts.map +1 -0
  119. package/dist/messenger/adapter.js +2 -0
  120. package/dist/messenger/adapter.js.map +1 -0
  121. package/dist/messenger/factory.d.ts +4 -0
  122. package/dist/messenger/factory.d.ts.map +1 -0
  123. package/dist/messenger/factory.js +19 -0
  124. package/dist/messenger/factory.js.map +1 -0
  125. package/dist/messenger/slack.d.ts +21 -0
  126. package/dist/messenger/slack.d.ts.map +1 -0
  127. package/dist/messenger/slack.js +127 -0
  128. package/dist/messenger/slack.js.map +1 -0
  129. package/dist/messenger/telegram.d.ts +21 -0
  130. package/dist/messenger/telegram.d.ts.map +1 -0
  131. package/dist/messenger/telegram.js +118 -0
  132. package/dist/messenger/telegram.js.map +1 -0
  133. package/dist/security/audit.d.ts +15 -0
  134. package/dist/security/audit.d.ts.map +1 -0
  135. package/dist/security/audit.js +41 -0
  136. package/dist/security/audit.js.map +1 -0
  137. package/dist/security/auth.d.ts +8 -0
  138. package/dist/security/auth.d.ts.map +1 -0
  139. package/dist/security/auth.js +15 -0
  140. package/dist/security/auth.js.map +1 -0
  141. package/dist/security/prompt-guard.d.ts +11 -0
  142. package/dist/security/prompt-guard.d.ts.map +1 -0
  143. package/dist/security/prompt-guard.js +30 -0
  144. package/dist/security/prompt-guard.js.map +1 -0
  145. package/dist/security/sandbox.d.ts +11 -0
  146. package/dist/security/sandbox.d.ts.map +1 -0
  147. package/dist/security/sandbox.js +76 -0
  148. package/dist/security/sandbox.js.map +1 -0
  149. package/dist/tools/browser.d.ts +61 -0
  150. package/dist/tools/browser.d.ts.map +1 -0
  151. package/dist/tools/browser.js +196 -0
  152. package/dist/tools/browser.js.map +1 -0
  153. package/dist/tools/calendar.d.ts +36 -0
  154. package/dist/tools/calendar.d.ts.map +1 -0
  155. package/dist/tools/calendar.js +146 -0
  156. package/dist/tools/calendar.js.map +1 -0
  157. package/dist/tools/clipboard.d.ts +13 -0
  158. package/dist/tools/clipboard.d.ts.map +1 -0
  159. package/dist/tools/clipboard.js +47 -0
  160. package/dist/tools/clipboard.js.map +1 -0
  161. package/dist/tools/email.d.ts +52 -0
  162. package/dist/tools/email.d.ts.map +1 -0
  163. package/dist/tools/email.js +211 -0
  164. package/dist/tools/email.js.map +1 -0
  165. package/dist/tools/figma-mcp.d.ts +30 -0
  166. package/dist/tools/figma-mcp.d.ts.map +1 -0
  167. package/dist/tools/figma-mcp.js +58 -0
  168. package/dist/tools/figma-mcp.js.map +1 -0
  169. package/dist/tools/figma.d.ts +52 -0
  170. package/dist/tools/figma.d.ts.map +1 -0
  171. package/dist/tools/figma.js +62 -0
  172. package/dist/tools/figma.js.map +1 -0
  173. package/dist/tools/filesystem.d.ts +9 -0
  174. package/dist/tools/filesystem.d.ts.map +1 -0
  175. package/dist/tools/filesystem.js +62 -0
  176. package/dist/tools/filesystem.js.map +1 -0
  177. package/dist/tools/github.d.ts +36 -0
  178. package/dist/tools/github.d.ts.map +1 -0
  179. package/dist/tools/github.js +93 -0
  180. package/dist/tools/github.js.map +1 -0
  181. package/dist/tools/image.d.ts +14 -0
  182. package/dist/tools/image.d.ts.map +1 -0
  183. package/dist/tools/image.js +57 -0
  184. package/dist/tools/image.js.map +1 -0
  185. package/dist/tools/linear.d.ts +41 -0
  186. package/dist/tools/linear.d.ts.map +1 -0
  187. package/dist/tools/linear.js +87 -0
  188. package/dist/tools/linear.js.map +1 -0
  189. package/dist/tools/notification.d.ts +8 -0
  190. package/dist/tools/notification.d.ts.map +1 -0
  191. package/dist/tools/notification.js +49 -0
  192. package/dist/tools/notification.js.map +1 -0
  193. package/dist/tools/notion.d.ts +23 -0
  194. package/dist/tools/notion.d.ts.map +1 -0
  195. package/dist/tools/notion.js +91 -0
  196. package/dist/tools/notion.js.map +1 -0
  197. package/dist/tools/obsidian.d.ts +17 -0
  198. package/dist/tools/obsidian.d.ts.map +1 -0
  199. package/dist/tools/obsidian.js +100 -0
  200. package/dist/tools/obsidian.js.map +1 -0
  201. package/dist/tools/shell.d.ts +10 -0
  202. package/dist/tools/shell.d.ts.map +1 -0
  203. package/dist/tools/shell.js +37 -0
  204. package/dist/tools/shell.js.map +1 -0
  205. package/dist/tools/voice.d.ts +28 -0
  206. package/dist/tools/voice.d.ts.map +1 -0
  207. package/dist/tools/voice.js +88 -0
  208. package/dist/tools/voice.js.map +1 -0
  209. package/dist/tools/vscode.d.ts +42 -0
  210. package/dist/tools/vscode.d.ts.map +1 -0
  211. package/dist/tools/vscode.js +80 -0
  212. package/dist/tools/vscode.js.map +1 -0
  213. package/package.json +51 -0
@@ -0,0 +1,11 @@
1
+ export interface MemoryCommandResult {
2
+ handled: boolean;
3
+ response?: string;
4
+ }
5
+ /**
6
+ * Checks if a message is a memory command and handles it.
7
+ * Returns { handled: true, response } if it was a memory command,
8
+ * or { handled: false } if it should be passed to Claude.
9
+ */
10
+ export declare function handleMemoryCommand(text: string): Promise<MemoryCommandResult>;
11
+ //# sourceMappingURL=memory-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-commands.d.ts","sourceRoot":"","sources":["../../src/agent/memory-commands.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8CpF"}
@@ -0,0 +1,55 @@
1
+ import { readUserMemory, writeUserMemory, appendUserMemory, readProjectMemory, resetMemory, } from './memory.js';
2
+ const MEMORY_PATTERNS = {
3
+ showUserMemory: /^(내\s*메모리|my\s*memory|메모리\s*보여|show\s*memory)/i,
4
+ showProjectMemory: /^(.+?)\s*(프로젝트\s*메모리|project\s*memory)\s*(보여|show)?/i,
5
+ updateMemory: /^(메모리\s*(?:업데이트|수정|변경|바꿔)|(?:update|change)\s*memory)[:\s]+(.+)/i,
6
+ addMemory: /^(메모리\s*(?:추가|저장)|(?:add|save)\s*(?:to\s*)?memory)[:\s]+(.+)/i,
7
+ resetMemory: /^(메모리\s*초기화|reset\s*memory)/i,
8
+ };
9
+ /**
10
+ * Checks if a message is a memory command and handles it.
11
+ * Returns { handled: true, response } if it was a memory command,
12
+ * or { handled: false } if it should be passed to Claude.
13
+ */
14
+ export async function handleMemoryCommand(text) {
15
+ const trimmed = text.trim();
16
+ // Show user memory
17
+ if (MEMORY_PATTERNS.showUserMemory.test(trimmed)) {
18
+ const memory = await readUserMemory();
19
+ if (!memory) {
20
+ return { handled: true, response: 'No saved memory yet.' };
21
+ }
22
+ return { handled: true, response: `**MEMORY.md**\n\`\`\`\n${memory}\n\`\`\`` };
23
+ }
24
+ // Show project memory
25
+ const projectMatch = trimmed.match(MEMORY_PATTERNS.showProjectMemory);
26
+ if (projectMatch) {
27
+ const projectName = projectMatch[1].trim();
28
+ const memory = await readProjectMemory(projectName);
29
+ if (!memory) {
30
+ return { handled: true, response: `No memory found for project "${projectName}".` };
31
+ }
32
+ return { handled: true, response: `**${projectName} memory**\n\`\`\`\n${memory}\n\`\`\`` };
33
+ }
34
+ // Update memory (replace)
35
+ const updateMatch = trimmed.match(MEMORY_PATTERNS.updateMemory);
36
+ if (updateMatch) {
37
+ const newContent = updateMatch[2].trim();
38
+ await writeUserMemory(newContent);
39
+ return { handled: true, response: `Memory updated:\n${newContent}` };
40
+ }
41
+ // Add to memory
42
+ const addMatch = trimmed.match(MEMORY_PATTERNS.addMemory);
43
+ if (addMatch) {
44
+ const entry = addMatch[2].trim();
45
+ await appendUserMemory(`- ${entry}`);
46
+ return { handled: true, response: `Added to memory: ${entry}` };
47
+ }
48
+ // Reset memory
49
+ if (MEMORY_PATTERNS.resetMemory.test(trimmed)) {
50
+ await resetMemory();
51
+ return { handled: true, response: 'All memory has been reset.' };
52
+ }
53
+ return { handled: false };
54
+ }
55
+ //# sourceMappingURL=memory-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-commands.js","sourceRoot":"","sources":["../../src/agent/memory-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GACZ,MAAM,aAAa,CAAC;AAOrB,MAAM,eAAe,GAAG;IACtB,cAAc,EAAE,gDAAgD;IAChE,iBAAiB,EAAE,sDAAsD;IACzE,YAAY,EAAE,kEAAkE;IAChF,SAAS,EAAE,+DAA+D;IAC1E,WAAW,EAAE,8BAA8B;CAC5C,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,mBAAmB;IACnB,IAAI,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,0BAA0B,MAAM,UAAU,EAAE,CAAC;IACjF,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACtE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gCAAgC,WAAW,IAAI,EAAE,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,WAAW,sBAAsB,MAAM,UAAU,EAAE,CAAC;IAC7F,CAAC;IAED,0BAA0B;IAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAChE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,UAAU,EAAE,EAAE,CAAC;IACvE,CAAC;IAED,gBAAgB;IAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,oBAAoB,KAAK,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,eAAe;IACf,IAAI,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC;IACnE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function readUserMemory(): Promise<string>;
2
+ export declare function writeUserMemory(content: string): Promise<void>;
3
+ export declare function appendUserMemory(entry: string): Promise<void>;
4
+ export declare function readProjectMemory(projectName: string): Promise<string>;
5
+ export declare function writeProjectMemory(projectName: string, content: string): Promise<void>;
6
+ export declare function appendHistory(entry: string): Promise<void>;
7
+ export declare function readHistory(date?: Date): Promise<string>;
8
+ export declare function getRecentHistory(days?: number): Promise<string>;
9
+ export declare function buildMemoryContext(projectName?: string): Promise<string>;
10
+ export declare function resetMemory(): Promise<void>;
11
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"AA0BA,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAMtD;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInE;AAID,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM5E;AAED,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAID,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhE;AAED,wBAAsB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAexE;AAID,wBAAsB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB9E;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAKjD"}
@@ -0,0 +1,109 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { getPilotDir } from '../config/store.js';
4
+ const MAX_MEMORY_LINES = 200;
5
+ function getMemoryDir() {
6
+ return path.join(getPilotDir(), 'memory');
7
+ }
8
+ function getMemoryPath() {
9
+ return path.join(getMemoryDir(), 'MEMORY.md');
10
+ }
11
+ function getProjectMemoryPath(projectName) {
12
+ return path.join(getMemoryDir(), 'projects', `${projectName}.md`);
13
+ }
14
+ function getHistoryPath(date) {
15
+ const d = date ?? new Date();
16
+ const dateStr = d.toISOString().split('T')[0];
17
+ return path.join(getMemoryDir(), 'history', `${dateStr}.md`);
18
+ }
19
+ // --- MEMORY.md (사용자 선호) ---
20
+ export async function readUserMemory() {
21
+ try {
22
+ return await fs.readFile(getMemoryPath(), 'utf-8');
23
+ }
24
+ catch {
25
+ return '';
26
+ }
27
+ }
28
+ export async function writeUserMemory(content) {
29
+ const lines = content.split('\n');
30
+ const trimmed = lines.slice(0, MAX_MEMORY_LINES).join('\n');
31
+ await fs.mkdir(getMemoryDir(), { recursive: true });
32
+ await fs.writeFile(getMemoryPath(), trimmed);
33
+ }
34
+ export async function appendUserMemory(entry) {
35
+ const existing = await readUserMemory();
36
+ const updated = existing ? `${existing}\n${entry}` : entry;
37
+ await writeUserMemory(updated);
38
+ }
39
+ // --- 프로젝트 메모리 ---
40
+ export async function readProjectMemory(projectName) {
41
+ try {
42
+ return await fs.readFile(getProjectMemoryPath(projectName), 'utf-8');
43
+ }
44
+ catch {
45
+ return '';
46
+ }
47
+ }
48
+ export async function writeProjectMemory(projectName, content) {
49
+ const memPath = getProjectMemoryPath(projectName);
50
+ await fs.mkdir(path.dirname(memPath), { recursive: true });
51
+ await fs.writeFile(memPath, content);
52
+ }
53
+ // --- 히스토리 ---
54
+ export async function appendHistory(entry) {
55
+ const histPath = getHistoryPath();
56
+ await fs.mkdir(path.dirname(histPath), { recursive: true });
57
+ const timestamp = new Date().toLocaleTimeString('ko-KR', { hour: '2-digit', minute: '2-digit' });
58
+ const line = `- ${timestamp}: ${entry}\n`;
59
+ await fs.appendFile(histPath, line);
60
+ }
61
+ export async function readHistory(date) {
62
+ try {
63
+ return await fs.readFile(getHistoryPath(date), 'utf-8');
64
+ }
65
+ catch {
66
+ return '';
67
+ }
68
+ }
69
+ export async function getRecentHistory(days = 3) {
70
+ const entries = [];
71
+ const now = new Date();
72
+ for (let i = 0; i < days; i++) {
73
+ const d = new Date(now);
74
+ d.setDate(d.getDate() - i);
75
+ const content = await readHistory(d);
76
+ if (content) {
77
+ const dateStr = d.toISOString().split('T')[0];
78
+ entries.push(`### ${dateStr}\n${content}`);
79
+ }
80
+ }
81
+ return entries.join('\n\n');
82
+ }
83
+ // --- 프롬프트용 메모리 조립 ---
84
+ export async function buildMemoryContext(projectName) {
85
+ const parts = [];
86
+ const userMemory = await readUserMemory();
87
+ if (userMemory) {
88
+ parts.push(`<USER_PREFERENCES>\n${userMemory}\n</USER_PREFERENCES>`);
89
+ }
90
+ if (projectName) {
91
+ const projectMemory = await readProjectMemory(projectName);
92
+ if (projectMemory) {
93
+ parts.push(`<PROJECT_CONTEXT project="${projectName}">\n${projectMemory}\n</PROJECT_CONTEXT>`);
94
+ }
95
+ }
96
+ const history = await getRecentHistory(3);
97
+ if (history) {
98
+ parts.push(`<RECENT_HISTORY>\n${history}\n</RECENT_HISTORY>`);
99
+ }
100
+ return parts.join('\n\n');
101
+ }
102
+ // --- 메모리 초기화 ---
103
+ export async function resetMemory() {
104
+ const memDir = getMemoryDir();
105
+ await fs.rm(memDir, { recursive: true, force: true });
106
+ await fs.mkdir(path.join(memDir, 'projects'), { recursive: true });
107
+ await fs.mkdir(path.join(memDir, 'history'), { recursive: true });
108
+ }
109
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type AgentRole = 'research' | 'planning' | 'coding' | 'review';
2
+ export interface SubAgent {
3
+ role: AgentRole;
4
+ systemPrompt: string;
5
+ }
6
+ export interface AgentTask {
7
+ agent: SubAgent;
8
+ prompt: string;
9
+ cwd?: string;
10
+ maxRetries?: number;
11
+ }
12
+ export interface AgentResult {
13
+ role: AgentRole;
14
+ success: boolean;
15
+ output: string;
16
+ error?: string;
17
+ retries: number;
18
+ }
19
+ export declare const AGENTS: Record<AgentRole, SubAgent>;
20
+ /**
21
+ * Shared context that agents can read from and write to.
22
+ */
23
+ export declare class SharedContext {
24
+ private data;
25
+ set(key: string, value: unknown): void;
26
+ get<T = unknown>(key: string): T | undefined;
27
+ toPromptContext(): string;
28
+ }
29
+ /**
30
+ * Executes a sub-agent task with retry logic.
31
+ */
32
+ export declare function executeAgent(task: AgentTask, context: SharedContext, mode: {
33
+ type: 'cli';
34
+ } | {
35
+ type: 'api';
36
+ apiKey: string;
37
+ }): Promise<AgentResult>;
38
+ /**
39
+ * Orchestrates a multi-agent workflow: research → plan → code → review.
40
+ */
41
+ export declare function orchestrate(task: string, cwd: string, mode: {
42
+ type: 'cli';
43
+ } | {
44
+ type: 'api';
45
+ apiKey: string;
46
+ }): Promise<AgentResult[]>;
47
+ //# sourceMappingURL=multi-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-agent.d.ts","sourceRoot":"","sources":["../../src/agent/multi-agent.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAqB9C,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAA8B;IAE1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI5C,eAAe,IAAI,MAAM;CAU1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,WAAW,CAAC,CAyCtB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,WAAW,EAAE,CAAC,CAwCxB"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Multi-agent orchestration for role-based sub-agent delegation.
3
+ * Each agent has a role and is invoked as an independent Claude session.
4
+ */
5
+ import { invokeClaudeCli, invokeClaudeApi } from './claude.js';
6
+ // Predefined agent roles with system prompts
7
+ export const AGENTS = {
8
+ research: {
9
+ role: 'research',
10
+ systemPrompt: 'You are a research agent. Gather information, read documentation, search codebases, and summarize findings. Do not modify any files.',
11
+ },
12
+ planning: {
13
+ role: 'planning',
14
+ systemPrompt: 'You are a planning agent. Analyze requirements, design implementation strategies, and produce step-by-step plans. Do not write code.',
15
+ },
16
+ coding: {
17
+ role: 'coding',
18
+ systemPrompt: 'You are a coding agent. Implement features, fix bugs, and write tests based on the provided plan. Follow existing code conventions.',
19
+ },
20
+ review: {
21
+ role: 'review',
22
+ systemPrompt: 'You are a code review agent. Review code changes for bugs, security issues, performance problems, and style violations. Provide actionable feedback.',
23
+ },
24
+ };
25
+ /**
26
+ * Shared context that agents can read from and write to.
27
+ */
28
+ export class SharedContext {
29
+ data = new Map();
30
+ set(key, value) {
31
+ this.data.set(key, value);
32
+ }
33
+ get(key) {
34
+ return this.data.get(key);
35
+ }
36
+ toPromptContext() {
37
+ if (this.data.size === 0)
38
+ return '';
39
+ const lines = ['<SHARED_CONTEXT>'];
40
+ for (const [key, value] of this.data) {
41
+ const val = typeof value === 'string' ? value : JSON.stringify(value);
42
+ lines.push(`<context key="${key}">${val}</context>`);
43
+ }
44
+ lines.push('</SHARED_CONTEXT>');
45
+ return lines.join('\n');
46
+ }
47
+ }
48
+ /**
49
+ * Executes a sub-agent task with retry logic.
50
+ */
51
+ export async function executeAgent(task, context, mode) {
52
+ const maxRetries = task.maxRetries ?? 1;
53
+ let lastError = '';
54
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
55
+ try {
56
+ const contextStr = context.toPromptContext();
57
+ const fullPrompt = [
58
+ task.agent.systemPrompt,
59
+ contextStr,
60
+ `<TASK>\n${task.prompt}\n</TASK>`,
61
+ ]
62
+ .filter(Boolean)
63
+ .join('\n\n');
64
+ let output;
65
+ if (mode.type === 'cli') {
66
+ const result = await invokeClaudeCli({ prompt: fullPrompt, cwd: task.cwd });
67
+ output = result.result;
68
+ }
69
+ else {
70
+ output = await invokeClaudeApi({ prompt: fullPrompt, apiKey: mode.apiKey });
71
+ }
72
+ return {
73
+ role: task.agent.role,
74
+ success: true,
75
+ output,
76
+ retries: attempt,
77
+ };
78
+ }
79
+ catch (err) {
80
+ lastError = err instanceof Error ? err.message : String(err);
81
+ }
82
+ }
83
+ return {
84
+ role: task.agent.role,
85
+ success: false,
86
+ output: '',
87
+ error: lastError,
88
+ retries: maxRetries,
89
+ };
90
+ }
91
+ /**
92
+ * Orchestrates a multi-agent workflow: research → plan → code → review.
93
+ */
94
+ export async function orchestrate(task, cwd, mode) {
95
+ const context = new SharedContext();
96
+ const results = [];
97
+ // 1. Research
98
+ const researchResult = await executeAgent({ agent: AGENTS.research, prompt: `Research for: ${task}`, cwd }, context, mode);
99
+ results.push(researchResult);
100
+ if (researchResult.success)
101
+ context.set('research', researchResult.output);
102
+ // 2. Planning
103
+ const planResult = await executeAgent({ agent: AGENTS.planning, prompt: `Create implementation plan for: ${task}`, cwd }, context, mode);
104
+ results.push(planResult);
105
+ if (planResult.success)
106
+ context.set('plan', planResult.output);
107
+ // 3. Coding
108
+ const codeResult = await executeAgent({ agent: AGENTS.coding, prompt: `Implement: ${task}`, cwd, maxRetries: 2 }, context, mode);
109
+ results.push(codeResult);
110
+ if (codeResult.success)
111
+ context.set('implementation', codeResult.output);
112
+ // 4. Review
113
+ const reviewResult = await executeAgent({ agent: AGENTS.review, prompt: `Review the implementation of: ${task}`, cwd }, context, mode);
114
+ results.push(reviewResult);
115
+ return results;
116
+ }
117
+ //# sourceMappingURL=multi-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-agent.js","sourceRoot":"","sources":["../../src/agent/multi-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Multi-step task pipeline for composing tool operations.
3
+ * Each step receives the output of the previous step.
4
+ */
5
+ export interface PipelineStep {
6
+ name: string;
7
+ execute: (input: unknown) => Promise<unknown>;
8
+ }
9
+ export interface PipelineResult {
10
+ success: boolean;
11
+ steps: Array<{
12
+ name: string;
13
+ output: unknown;
14
+ error?: string;
15
+ }>;
16
+ finalOutput: unknown;
17
+ }
18
+ /**
19
+ * Executes a sequence of steps, passing each step's output to the next.
20
+ * Stops on first failure.
21
+ */
22
+ export declare function executePipeline(steps: PipelineStep[], initialInput?: unknown): Promise<PipelineResult>;
23
+ /**
24
+ * Formats pipeline results for display.
25
+ */
26
+ export declare function formatPipelineResult(result: PipelineResult): string;
27
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/agent/pipeline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAyB5G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgBnE"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Multi-step task pipeline for composing tool operations.
3
+ * Each step receives the output of the previous step.
4
+ */
5
+ /**
6
+ * Executes a sequence of steps, passing each step's output to the next.
7
+ * Stops on first failure.
8
+ */
9
+ export async function executePipeline(steps, initialInput) {
10
+ const results = [];
11
+ let currentInput = initialInput;
12
+ for (const step of steps) {
13
+ try {
14
+ const output = await step.execute(currentInput);
15
+ results.push({ name: step.name, output });
16
+ currentInput = output;
17
+ }
18
+ catch (err) {
19
+ const errorMsg = err instanceof Error ? err.message : String(err);
20
+ results.push({ name: step.name, output: null, error: errorMsg });
21
+ return {
22
+ success: false,
23
+ steps: results,
24
+ finalOutput: null,
25
+ };
26
+ }
27
+ }
28
+ return {
29
+ success: true,
30
+ steps: results,
31
+ finalOutput: currentInput,
32
+ };
33
+ }
34
+ /**
35
+ * Formats pipeline results for display.
36
+ */
37
+ export function formatPipelineResult(result) {
38
+ const lines = [];
39
+ const status = result.success ? '✅ Pipeline completed' : '❌ Pipeline failed';
40
+ lines.push(status);
41
+ for (const step of result.steps) {
42
+ const icon = step.error ? '❌' : '✅';
43
+ const output = step.error
44
+ ? `Error: ${step.error}`
45
+ : typeof step.output === 'string'
46
+ ? step.output.slice(0, 200)
47
+ : JSON.stringify(step.output).slice(0, 200);
48
+ lines.push(` ${icon} ${step.name}: ${output}`);
49
+ }
50
+ return lines.join('\n');
51
+ }
52
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/agent/pipeline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAqB,EAAE,YAAsB;IACjF,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,YAAY,GAAG,YAAY,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO;gBACd,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK;YACvB,CAAC,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE;YACxB,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAC/B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC3B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type SafetyLevel } from './safety.js';
2
+ export interface PlanStep {
3
+ description: string;
4
+ tool: string;
5
+ safetyLevel: SafetyLevel;
6
+ }
7
+ export interface ExecutionPlan {
8
+ summary: string;
9
+ steps: PlanStep[];
10
+ hasDangerousSteps: boolean;
11
+ }
12
+ /**
13
+ * Claude의 응답을 실행 계획으로 파싱한다.
14
+ * Claude에게 구조화된 계획을 요청하고 결과를 파싱한다.
15
+ */
16
+ export declare function parsePlan(claudeResponse: string): ExecutionPlan;
17
+ /**
18
+ * 계획을 사람이 읽을 수 있는 형태로 포맷한다.
19
+ */
20
+ export declare function formatPlanForUser(plan: ExecutionPlan): string;
21
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/agent/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,CAiC/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAgB7D"}
@@ -0,0 +1,51 @@
1
+ import { classifySafety } from './safety.js';
2
+ /**
3
+ * Claude의 응답을 실행 계획으로 파싱한다.
4
+ * Claude에게 구조화된 계획을 요청하고 결과를 파싱한다.
5
+ */
6
+ export function parsePlan(claudeResponse) {
7
+ const steps = [];
8
+ const lines = claudeResponse.split('\n');
9
+ let summary = '';
10
+ for (const line of lines) {
11
+ const trimmed = line.trim();
12
+ // "1. [tool] description" 형태 파싱
13
+ const stepMatch = trimmed.match(/^\d+\.\s*\[(\w+)\]\s*(.+)$/);
14
+ if (stepMatch) {
15
+ const tool = stepMatch[1];
16
+ const description = stepMatch[2];
17
+ steps.push({
18
+ description,
19
+ tool,
20
+ safetyLevel: classifySafety(description),
21
+ });
22
+ continue;
23
+ }
24
+ // 첫 번째 비어있지 않은 줄이 summary
25
+ if (!summary && trimmed && !trimmed.startsWith('#')) {
26
+ summary = trimmed;
27
+ }
28
+ }
29
+ return {
30
+ summary: summary || '작업 실행',
31
+ steps,
32
+ hasDangerousSteps: steps.some((s) => s.safetyLevel === 'dangerous'),
33
+ };
34
+ }
35
+ /**
36
+ * 계획을 사람이 읽을 수 있는 형태로 포맷한다.
37
+ */
38
+ export function formatPlanForUser(plan) {
39
+ const lines = [`**${plan.summary}**\n`];
40
+ for (let i = 0; i < plan.steps.length; i++) {
41
+ const step = plan.steps[i];
42
+ const icon = step.safetyLevel === 'dangerous' ? '🔴' :
43
+ step.safetyLevel === 'moderate' ? '🟡' : '🟢';
44
+ lines.push(`${i + 1}. ${icon} [${step.tool}] ${step.description}`);
45
+ }
46
+ if (plan.hasDangerousSteps) {
47
+ lines.push('\n⚠️ 위험한 작업이 포함되어 있습니다. 승인이 필요합니다.');
48
+ }
49
+ return lines.join('\n');
50
+ }
51
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/agent/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAoB,MAAM,aAAa,CAAC;AAc/D;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,cAAsB;IAC9C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC9D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC;gBACT,WAAW;gBACX,IAAI;gBACJ,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC;aACzC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,IAAI,OAAO;QAC3B,KAAK;QACL,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC;KACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAmB;IACnD,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GACR,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Detects user preferences from a message and saves them to MEMORY.md.
3
+ * Returns the detected preference string if found, null otherwise.
4
+ */
5
+ export declare function detectAndSavePreference(text: string): Promise<string | null>;
6
+ //# sourceMappingURL=preference-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preference-detector.d.ts","sourceRoot":"","sources":["../../src/agent/preference-detector.ts"],"names":[],"mappings":"AAgCA;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBlF"}
@@ -0,0 +1,50 @@
1
+ import { readUserMemory, appendUserMemory } from './memory.js';
2
+ /**
3
+ * Patterns that indicate user preferences expressed in commands.
4
+ * Each pattern has a regex to match and an extractor to produce a memory entry.
5
+ */
6
+ const PREFERENCE_PATTERNS = [
7
+ {
8
+ pattern: /(?:항상|always)\s+(.+?)(?:로|으로|해줘|해|하자|please)/i,
9
+ extract: (m) => m[1].trim(),
10
+ },
11
+ {
12
+ pattern: /(?:앞으로|from now on)\s+(.+?)(?:해줘|해|하자|please)?$/i,
13
+ extract: (m) => m[1].trim(),
14
+ },
15
+ {
16
+ pattern: /(?:커밋\s*메시지|commit\s*message).*(?:한국어|korean|영어|english)/i,
17
+ extract: (m) => m[0].trim(),
18
+ },
19
+ {
20
+ pattern: /(?:PR|pull request).*(?:항상|always)\s+(.+)/i,
21
+ extract: (m) => `PR: ${m[1].trim()}`,
22
+ },
23
+ {
24
+ pattern: /(?:테스트|test).*(?:항상|always|반드시|must)\s+(.+)/i,
25
+ extract: (m) => `Test: ${m[1].trim()}`,
26
+ },
27
+ ];
28
+ /**
29
+ * Detects user preferences from a message and saves them to MEMORY.md.
30
+ * Returns the detected preference string if found, null otherwise.
31
+ */
32
+ export async function detectAndSavePreference(text) {
33
+ for (const { pattern, extract } of PREFERENCE_PATTERNS) {
34
+ const match = text.match(pattern);
35
+ if (match) {
36
+ const preference = extract(match);
37
+ if (!preference || preference.length < 3)
38
+ continue;
39
+ // Check for duplicates
40
+ const existing = await readUserMemory();
41
+ if (existing.includes(preference)) {
42
+ return null;
43
+ }
44
+ await appendUserMemory(`- ${preference}`);
45
+ return preference;
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+ //# sourceMappingURL=preference-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preference-detector.js","sourceRoot":"","sources":["../../src/agent/preference-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D;;;GAGG;AACH,MAAM,mBAAmB,GAGpB;IACH;QACE,OAAO,EAAE,+CAA+C;QACxD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KAC5B;IACD;QACE,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KAC5B;IACD;QACE,OAAO,EAAE,2DAA2D;QACpE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KAC5B;IACD;QACE,OAAO,EAAE,4CAA4C;QACrD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;KACrC;IACD;QACE,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;KACvC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,mBAAmB,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAEnD,uBAAuB;YACvB,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,gBAAgB,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;YAC1C,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Analyzes a project directory and generates a summary.
3
+ * Only runs if project memory is empty (first time).
4
+ */
5
+ export declare function analyzeProjectIfNew(projectName: string, projectPath: string): Promise<string | null>;
6
+ //# sourceMappingURL=project-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-analyzer.d.ts","sourceRoot":"","sources":["../../src/agent/project-analyzer.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB1G"}