@sdsrs/codeagent 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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -0
  3. package/dist/adapters/code-graph.d.ts +18 -0
  4. package/dist/adapters/code-graph.d.ts.map +1 -0
  5. package/dist/adapters/code-graph.js +151 -0
  6. package/dist/adapters/code-graph.js.map +1 -0
  7. package/dist/adapters/memory.d.ts +13 -0
  8. package/dist/adapters/memory.d.ts.map +1 -0
  9. package/dist/adapters/memory.js +110 -0
  10. package/dist/adapters/memory.js.map +1 -0
  11. package/dist/adapters/orchestration/gsd.d.ts +20 -0
  12. package/dist/adapters/orchestration/gsd.d.ts.map +1 -0
  13. package/dist/adapters/orchestration/gsd.js +78 -0
  14. package/dist/adapters/orchestration/gsd.js.map +1 -0
  15. package/dist/adapters/orchestration/interface.d.ts +32 -0
  16. package/dist/adapters/orchestration/interface.d.ts.map +1 -0
  17. package/dist/adapters/orchestration/interface.js +2 -0
  18. package/dist/adapters/orchestration/interface.js.map +1 -0
  19. package/dist/adapters/orchestration/superpowers.d.ts +33 -0
  20. package/dist/adapters/orchestration/superpowers.d.ts.map +1 -0
  21. package/dist/adapters/orchestration/superpowers.js +117 -0
  22. package/dist/adapters/orchestration/superpowers.js.map +1 -0
  23. package/dist/broker/broker.d.ts +40 -0
  24. package/dist/broker/broker.d.ts.map +1 -0
  25. package/dist/broker/broker.js +181 -0
  26. package/dist/broker/broker.js.map +1 -0
  27. package/dist/broker/compressor.d.ts +7 -0
  28. package/dist/broker/compressor.d.ts.map +1 -0
  29. package/dist/broker/compressor.js +61 -0
  30. package/dist/broker/compressor.js.map +1 -0
  31. package/dist/broker/context-pack.d.ts +126 -0
  32. package/dist/broker/context-pack.d.ts.map +1 -0
  33. package/dist/broker/context-pack.js +103 -0
  34. package/dist/broker/context-pack.js.map +1 -0
  35. package/dist/broker/query-parser.d.ts +17 -0
  36. package/dist/broker/query-parser.d.ts.map +1 -0
  37. package/dist/broker/query-parser.js +127 -0
  38. package/dist/broker/query-parser.js.map +1 -0
  39. package/dist/cli/commands/chat.d.ts +13 -0
  40. package/dist/cli/commands/chat.d.ts.map +1 -0
  41. package/dist/cli/commands/chat.js +264 -0
  42. package/dist/cli/commands/chat.js.map +1 -0
  43. package/dist/cli/commands/config.d.ts +14 -0
  44. package/dist/cli/commands/config.d.ts.map +1 -0
  45. package/dist/cli/commands/config.js +94 -0
  46. package/dist/cli/commands/config.js.map +1 -0
  47. package/dist/cli/commands/memory.d.ts +10 -0
  48. package/dist/cli/commands/memory.d.ts.map +1 -0
  49. package/dist/cli/commands/memory.js +52 -0
  50. package/dist/cli/commands/memory.js.map +1 -0
  51. package/dist/cli/commands/search.d.ts +9 -0
  52. package/dist/cli/commands/search.d.ts.map +1 -0
  53. package/dist/cli/commands/search.js +45 -0
  54. package/dist/cli/commands/search.js.map +1 -0
  55. package/dist/cli/commands/session.d.ts +9 -0
  56. package/dist/cli/commands/session.d.ts.map +1 -0
  57. package/dist/cli/commands/session.js +86 -0
  58. package/dist/cli/commands/session.js.map +1 -0
  59. package/dist/cli/index.d.ts +3 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +77 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/tui/renderer.d.ts +47 -0
  64. package/dist/cli/tui/renderer.d.ts.map +1 -0
  65. package/dist/cli/tui/renderer.js +237 -0
  66. package/dist/cli/tui/renderer.js.map +1 -0
  67. package/dist/hooks/session-start.d.ts +11 -0
  68. package/dist/hooks/session-start.d.ts.map +1 -0
  69. package/dist/hooks/session-start.js +51 -0
  70. package/dist/hooks/session-start.js.map +1 -0
  71. package/dist/hooks/stop.d.ts +11 -0
  72. package/dist/hooks/stop.d.ts.map +1 -0
  73. package/dist/hooks/stop.js +93 -0
  74. package/dist/hooks/stop.js.map +1 -0
  75. package/dist/hooks/user-prompt.d.ts +12 -0
  76. package/dist/hooks/user-prompt.d.ts.map +1 -0
  77. package/dist/hooks/user-prompt.js +46 -0
  78. package/dist/hooks/user-prompt.js.map +1 -0
  79. package/dist/providers/anthropic-api.d.ts +25 -0
  80. package/dist/providers/anthropic-api.d.ts.map +1 -0
  81. package/dist/providers/anthropic-api.js +93 -0
  82. package/dist/providers/anthropic-api.js.map +1 -0
  83. package/dist/providers/claude-cli.d.ts +16 -0
  84. package/dist/providers/claude-cli.d.ts.map +1 -0
  85. package/dist/providers/claude-cli.js +72 -0
  86. package/dist/providers/claude-cli.js.map +1 -0
  87. package/dist/providers/claude-sdk.d.ts +18 -0
  88. package/dist/providers/claude-sdk.d.ts.map +1 -0
  89. package/dist/providers/claude-sdk.js +141 -0
  90. package/dist/providers/claude-sdk.js.map +1 -0
  91. package/dist/providers/interface.d.ts +36 -0
  92. package/dist/providers/interface.d.ts.map +1 -0
  93. package/dist/providers/interface.js +2 -0
  94. package/dist/providers/interface.js.map +1 -0
  95. package/dist/scripts/install-hooks.d.ts +11 -0
  96. package/dist/scripts/install-hooks.d.ts.map +1 -0
  97. package/dist/scripts/install-hooks.js +86 -0
  98. package/dist/scripts/install-hooks.js.map +1 -0
  99. package/dist/session/manager.d.ts +65 -0
  100. package/dist/session/manager.d.ts.map +1 -0
  101. package/dist/session/manager.js +143 -0
  102. package/dist/session/manager.js.map +1 -0
  103. package/dist/session/schema.d.ts +7 -0
  104. package/dist/session/schema.d.ts.map +1 -0
  105. package/dist/session/schema.js +82 -0
  106. package/dist/session/schema.js.map +1 -0
  107. package/dist/utils/exec.d.ts +20 -0
  108. package/dist/utils/exec.d.ts.map +1 -0
  109. package/dist/utils/exec.js +28 -0
  110. package/dist/utils/exec.js.map +1 -0
  111. package/dist/utils/tokens.d.ts +12 -0
  112. package/dist/utils/tokens.d.ts.map +1 -0
  113. package/dist/utils/tokens.js +38 -0
  114. package/dist/utils/tokens.js.map +1 -0
  115. package/package.json +90 -0
  116. package/src/skills/brainstorm.md +33 -0
  117. package/src/skills/review.md +41 -0
@@ -0,0 +1,237 @@
1
+ // --- ANSI color codes ---
2
+ const RESET = '\x1b[0m';
3
+ const BOLD = '\x1b[1m';
4
+ const DIM = '\x1b[2m';
5
+ const ITALIC = '\x1b[3m';
6
+ const CYAN = '\x1b[36m';
7
+ const GREEN = '\x1b[32m';
8
+ const YELLOW = '\x1b[33m';
9
+ const RED = '\x1b[31m';
10
+ const MAGENTA = '\x1b[35m';
11
+ const BLUE = '\x1b[34m';
12
+ const WHITE = '\x1b[37m';
13
+ const BG_DIM = '\x1b[48;5;236m';
14
+ // --- Spinner ---
15
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
16
+ // --- Stage icons ---
17
+ const STAGE_ICONS = {
18
+ brainstorm: '💡',
19
+ plan: '📋',
20
+ implement: '⚡',
21
+ review: '🔍',
22
+ debug: '🐛',
23
+ general: '💬',
24
+ };
25
+ export class TuiRenderer {
26
+ spinnerInterval = null;
27
+ spinnerFrame = 0;
28
+ currentStage = null;
29
+ totalCost = 0;
30
+ turnCount = 0;
31
+ /** Render the welcome banner */
32
+ banner() {
33
+ console.log(`${BOLD}${CYAN}
34
+ ╔═══════════════════════════════════╗
35
+ ║ CodeAgent v0.1.0 ║
36
+ ║ Context-Aware Coding Assistant ║
37
+ ╚═══════════════════════════════════╝${RESET}
38
+ `);
39
+ }
40
+ /** Show the prompt for user input */
41
+ prompt() {
42
+ const icon = this.currentStage
43
+ ? STAGE_ICONS[this.currentStage] || '💬'
44
+ : '💬';
45
+ const stageTag = this.currentStage
46
+ ? `${DIM}[${this.currentStage}]${RESET} `
47
+ : '';
48
+ process.stdout.write(`${stageTag}${icon} ${BOLD}${GREEN}> ${RESET}`);
49
+ }
50
+ /** Start a thinking spinner */
51
+ startSpinner(label = 'Thinking') {
52
+ this.stopSpinner();
53
+ this.spinnerFrame = 0;
54
+ this.spinnerInterval = setInterval(() => {
55
+ const frame = SPINNER_FRAMES[this.spinnerFrame % SPINNER_FRAMES.length];
56
+ process.stdout.write(`\r${CYAN}${frame}${RESET} ${DIM}${label}...${RESET}`);
57
+ this.spinnerFrame++;
58
+ }, 80);
59
+ }
60
+ /** Stop the spinner */
61
+ stopSpinner() {
62
+ if (this.spinnerInterval) {
63
+ clearInterval(this.spinnerInterval);
64
+ this.spinnerInterval = null;
65
+ process.stdout.write('\r\x1b[K'); // Clear line
66
+ }
67
+ }
68
+ /** Render a turn event from the provider */
69
+ renderEvent(event) {
70
+ switch (event.type) {
71
+ case 'text':
72
+ process.stdout.write(renderMarkdownInline(event.content));
73
+ break;
74
+ case 'tool_use': {
75
+ const toolName = event.metadata?.tool || 'tool';
76
+ console.log(`\n${YELLOW}▸ [${toolName}]${RESET} ${DIM}${truncate(event.content, 150)}${RESET}`);
77
+ break;
78
+ }
79
+ case 'tool_result':
80
+ if (event.content) {
81
+ console.log(`${DIM} ${truncate(event.content, 200)}${RESET}`);
82
+ }
83
+ break;
84
+ case 'stage_change':
85
+ this.currentStage = event.content;
86
+ const icon = STAGE_ICONS[event.content] || '◆';
87
+ console.log(`\n${MAGENTA}${icon} Stage → ${BOLD}${event.content}${RESET}`);
88
+ break;
89
+ case 'error':
90
+ console.log(`\n${RED}✗ Error: ${event.content}${RESET}`);
91
+ break;
92
+ case 'done': {
93
+ this.turnCount++;
94
+ const cost = event.metadata?.cost;
95
+ if (cost && typeof cost === 'number') {
96
+ this.totalCost += cost;
97
+ }
98
+ const inputTokens = event.metadata?.inputTokens;
99
+ const outputTokens = event.metadata?.outputTokens;
100
+ const parts = [];
101
+ if (cost && typeof cost === 'number')
102
+ parts.push(`$${cost.toFixed(4)}`);
103
+ if (inputTokens)
104
+ parts.push(`in:${inputTokens}`);
105
+ if (outputTokens)
106
+ parts.push(`out:${outputTokens}`);
107
+ if (parts.length > 0) {
108
+ console.log(`\n${DIM}[${parts.join(' | ')}]${RESET}`);
109
+ }
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ /** Render context injection indicator */
115
+ contextIndicator(pack) {
116
+ const parts = [];
117
+ if (pack.relevantFiles.length > 0)
118
+ parts.push(`${pack.relevantFiles.length} files`);
119
+ if (pack.relatedSymbols.length > 0)
120
+ parts.push(`${pack.relatedSymbols.length} symbols`);
121
+ if (pack.priorMemories.length > 0)
122
+ parts.push(`${pack.priorMemories.length} memories`);
123
+ if (pack.bugWarnings.length > 0)
124
+ parts.push(`${RED}${pack.bugWarnings.length} bugs${CYAN}`);
125
+ if (pack.pendingTasks.length > 0)
126
+ parts.push(`${pack.pendingTasks.length} tasks`);
127
+ if (parts.length > 0) {
128
+ console.log(`${CYAN}◈ Context: ${parts.join(', ')}${RESET}`);
129
+ }
130
+ }
131
+ /** Render a stage panel with pending tasks */
132
+ stagePanel(stage, tasks, specTitle) {
133
+ const icon = STAGE_ICONS[stage] || '◆';
134
+ const width = 40;
135
+ const line = '─'.repeat(width);
136
+ console.log(`${DIM}┌${line}┐${RESET}`);
137
+ console.log(`${DIM}│${RESET} ${icon} ${BOLD}${stage.toUpperCase()}${RESET}${' '.repeat(Math.max(0, width - stage.length - 3))}${DIM}│${RESET}`);
138
+ if (specTitle) {
139
+ const truncSpec = truncate(specTitle, width - 4);
140
+ console.log(`${DIM}│${RESET} ${ITALIC}${truncSpec}${RESET}${' '.repeat(Math.max(0, width - truncSpec.length - 3))}${DIM}│${RESET}`);
141
+ }
142
+ if (tasks.length > 0) {
143
+ console.log(`${DIM}│${' '.repeat(width)}│${RESET}`);
144
+ for (const t of tasks.slice(0, 5)) {
145
+ const statusIcon = t.status === 'completed' ? `${GREEN}✓${RESET}` :
146
+ t.status === 'in_progress' ? `${YELLOW}▸${RESET}` : `${DIM}○${RESET}`;
147
+ const taskLine = `${statusIcon} ${truncate(t.title, width - 6)}`;
148
+ // Approximate visible length (ignoring ANSI codes)
149
+ console.log(`${DIM}│${RESET} ${taskLine}${DIM} │${RESET}`);
150
+ }
151
+ if (tasks.length > 5) {
152
+ console.log(`${DIM}│ +${tasks.length - 5} more${' '.repeat(Math.max(0, width - 10))}│${RESET}`);
153
+ }
154
+ }
155
+ console.log(`${DIM}└${line}┘${RESET}`);
156
+ }
157
+ /** Render session info */
158
+ sessionInfo(info) {
159
+ console.log(`${DIM}Session: ${info.id}${RESET}`);
160
+ if (info.title)
161
+ console.log(`${DIM}Title: ${info.title}${RESET}`);
162
+ if (info.stage) {
163
+ this.currentStage = info.stage;
164
+ const icon = STAGE_ICONS[info.stage] || '◆';
165
+ console.log(`${DIM}Stage: ${icon} ${info.stage}${RESET}`);
166
+ }
167
+ if (info.provider)
168
+ console.log(`${DIM}Provider: ${info.provider}${RESET}`);
169
+ console.log();
170
+ }
171
+ /** Render cost summary */
172
+ costSummary() {
173
+ if (this.totalCost > 0) {
174
+ console.log(`${DIM}Total: ${this.turnCount} turns, $${this.totalCost.toFixed(4)}${RESET}`);
175
+ }
176
+ }
177
+ /** Render the help message */
178
+ help() {
179
+ console.log(`
180
+ ${BOLD}Commands:${RESET}
181
+ ${GREEN}/quit${RESET}, ${GREEN}/exit${RESET}, ${GREEN}/q${RESET} — End session
182
+ ${GREEN}/status${RESET} — Show session info
183
+ ${GREEN}/stage${RESET} — Show current stage
184
+ ${GREEN}/cost${RESET} — Show cost summary
185
+ ${GREEN}/context${RESET} — Show last injected context
186
+ ${GREEN}/help${RESET} — Show this help
187
+
188
+ ${BOLD}Stage Shortcuts:${RESET}
189
+ ${MAGENTA}/brainstorm${RESET} — Switch to brainstorm mode
190
+ ${MAGENTA}/plan${RESET} — Switch to planning mode
191
+ ${MAGENTA}/implement${RESET} — Switch to implementation mode
192
+ ${MAGENTA}/review${RESET} — Switch to review mode
193
+ ${MAGENTA}/debug${RESET} — Switch to debug mode
194
+ `);
195
+ }
196
+ /** Render a system message */
197
+ system(msg) {
198
+ console.log(`${BLUE}ℹ ${msg}${RESET}`);
199
+ }
200
+ /** Render an error message */
201
+ error(msg) {
202
+ console.error(`${RED}✗ ${msg}${RESET}`);
203
+ }
204
+ /** Render a success message */
205
+ success(msg) {
206
+ console.log(`${GREEN}✓ ${msg}${RESET}`);
207
+ }
208
+ /** Render a warning message */
209
+ warn(msg) {
210
+ console.log(`${YELLOW}⚠ ${msg}${RESET}`);
211
+ }
212
+ /** Set the current stage */
213
+ setStage(stage) {
214
+ this.currentStage = stage;
215
+ }
216
+ /** Cleanup */
217
+ cleanup() {
218
+ this.stopSpinner();
219
+ }
220
+ }
221
+ // --- Helpers ---
222
+ function truncate(str, max) {
223
+ if (str.length <= max)
224
+ return str;
225
+ return str.slice(0, max - 3) + '...';
226
+ }
227
+ /**
228
+ * Basic inline markdown rendering for terminal:
229
+ * **bold** → BOLD, `code` → highlighted, _italic_ → italic
230
+ */
231
+ function renderMarkdownInline(text) {
232
+ return text
233
+ .replace(/\*\*(.+?)\*\*/g, `${BOLD}$1${RESET}`)
234
+ .replace(/`([^`]+)`/g, `${BG_DIM}${WHITE} $1 ${RESET}`)
235
+ .replace(/(?<!\w)_(.+?)_(?!\w)/g, `${ITALIC}$1${RESET}`);
236
+ }
237
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/cli/tui/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SessionStart hook — inject repo overview + active state at session start.
4
+ *
5
+ * Input: none (no stdin for SessionStart)
6
+ * Output: stdout plain text
7
+ *
8
+ * Runs once per session. Can be slower than UserPromptSubmit (5s budget).
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SessionStart hook — inject repo overview + active state at session start.
4
+ *
5
+ * Input: none (no stdin for SessionStart)
6
+ * Output: stdout plain text
7
+ *
8
+ * Runs once per session. Can be slower than UserPromptSubmit (5s budget).
9
+ */
10
+ import { ContextBroker } from '../broker/broker.js';
11
+ import { execQuiet } from '../utils/exec.js';
12
+ import { truncateToTokenBudget } from '../utils/tokens.js';
13
+ async function main() {
14
+ const repoRoot = process.cwd();
15
+ const broker = new ContextBroker(repoRoot);
16
+ // Get session context (repo map + orchestration state)
17
+ const pack = await broker.buildSessionContext();
18
+ // Also get recent memory summary
19
+ const recentMem = execQuiet('claude-mem-lite search "" --limit 5', { timeout: 2000 });
20
+ const sections = [];
21
+ // Repo overview
22
+ if (pack.repoSummary) {
23
+ sections.push(`## Project Overview\n${truncateToTokenBudget(pack.repoSummary, 500)}`);
24
+ }
25
+ // Active orchestration state
26
+ const orchLines = [];
27
+ if (pack.currentStage)
28
+ orchLines.push(`- Current Stage: ${pack.currentStage}`);
29
+ if (pack.activeSpec)
30
+ orchLines.push(`- Active Spec: ${pack.activeSpec.title}`);
31
+ if (pack.pendingTasks.length > 0) {
32
+ orchLines.push(`- Pending Tasks:`);
33
+ for (const t of pack.pendingTasks.slice(0, 5)) {
34
+ orchLines.push(` - [${t.status}] ${t.title}`);
35
+ }
36
+ }
37
+ if (orchLines.length > 0) {
38
+ sections.push(`## Active Work\n${orchLines.join('\n')}`);
39
+ }
40
+ // Recent memories
41
+ if (recentMem) {
42
+ sections.push(`## Recent Memory\n${truncateToTokenBudget(recentMem, 300)}`);
43
+ }
44
+ if (sections.length > 0) {
45
+ process.stdout.write(`<codeagent-session>\n${sections.join('\n\n')}\n</codeagent-session>`);
46
+ }
47
+ }
48
+ main().catch(() => {
49
+ process.exit(0);
50
+ });
51
+ //# sourceMappingURL=session-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAEhD,iCAAiC;IACjC,MAAM,SAAS,GAAG,SAAS,CACzB,qCAAqC,EACrC,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,gBAAgB;IAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,wBAAwB,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,YAAY;QAAE,SAAS,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,UAAU;QAAE,SAAS,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,kBAAkB;IAClB,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,qBAAqB,qBAAqB,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stop hook — extract key discoveries from the session and save to memory.
4
+ *
5
+ * Input: stdin JSON { stop_hook_active: boolean, transcript_summary?: string }
6
+ * Output: none (writes to memory, no stdout)
7
+ *
8
+ * Extracts: file modifications, error resolutions, architecture decisions.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Stop hook — extract key discoveries from the session and save to memory.
4
+ *
5
+ * Input: stdin JSON { stop_hook_active: boolean, transcript_summary?: string }
6
+ * Output: none (writes to memory, no stdout)
7
+ *
8
+ * Extracts: file modifications, error resolutions, architecture decisions.
9
+ */
10
+ import fs from 'node:fs';
11
+ import { execSafe } from '../utils/exec.js';
12
+ async function main() {
13
+ // Read input from stdin
14
+ let input;
15
+ try {
16
+ const raw = fs.readFileSync('/dev/stdin', 'utf8');
17
+ input = JSON.parse(raw);
18
+ }
19
+ catch {
20
+ process.exit(0);
21
+ }
22
+ const summary = input.transcript_summary;
23
+ if (!summary || summary.length < 50) {
24
+ // Not enough content to extract memories
25
+ process.exit(0);
26
+ }
27
+ // Extract potential memories using simple heuristics
28
+ const memories = extractMemories(summary);
29
+ // Save each memory
30
+ for (const mem of memories) {
31
+ execSafe(`claude-mem-lite save --type "${mem.type}" --title "${escapeShell(mem.title)}" --body "${escapeShell(mem.body)}"`, { timeout: 3000 });
32
+ }
33
+ }
34
+ function extractMemories(summary) {
35
+ const memories = [];
36
+ // Detect bug fixes
37
+ const bugPatterns = [
38
+ /(?:fixed|resolved|debugged|solved)\s+(.+?)(?:\.|$)/gi,
39
+ /(?:bug|error|issue)\s*(?:was|:)\s*(.+?)(?:\.|$)/gi,
40
+ /(?:修复|解决|排查)\s*[了]?\s*(.+?)(?:。|$)/gi,
41
+ ];
42
+ for (const pattern of bugPatterns) {
43
+ const match = pattern.exec(summary);
44
+ if (match?.[1]) {
45
+ memories.push({
46
+ type: 'bugfix',
47
+ title: match[1].trim().slice(0, 100),
48
+ body: `Extracted from session summary: ${match[0].trim()}`,
49
+ });
50
+ break; // One bug memory per session max
51
+ }
52
+ }
53
+ // Detect architecture decisions
54
+ const decisionPatterns = [
55
+ /(?:decided|chose|selected|went with)\s+(.+?)(?:\.|$)/gi,
56
+ /(?:决定|选择|采用)\s*[了]?\s*(.+?)(?:。|$)/gi,
57
+ ];
58
+ for (const pattern of decisionPatterns) {
59
+ const match = pattern.exec(summary);
60
+ if (match?.[1]) {
61
+ memories.push({
62
+ type: 'decision',
63
+ title: match[1].trim().slice(0, 100),
64
+ body: `Extracted from session summary: ${match[0].trim()}`,
65
+ });
66
+ break;
67
+ }
68
+ }
69
+ // Detect discoveries
70
+ const discoveryPatterns = [
71
+ /(?:discovered|found out|learned|realized)\s+(.+?)(?:\.|$)/gi,
72
+ /(?:发现|了解到|学到)\s*[了]?\s*(.+?)(?:。|$)/gi,
73
+ ];
74
+ for (const pattern of discoveryPatterns) {
75
+ const match = pattern.exec(summary);
76
+ if (match?.[1]) {
77
+ memories.push({
78
+ type: 'discovery',
79
+ title: match[1].trim().slice(0, 100),
80
+ body: `Extracted from session summary: ${match[0].trim()}`,
81
+ });
82
+ break;
83
+ }
84
+ }
85
+ return memories;
86
+ }
87
+ function escapeShell(str) {
88
+ return str.replace(/["\\$`!]/g, '\\$&').replace(/\n/g, ' ');
89
+ }
90
+ main().catch(() => {
91
+ process.exit(0);
92
+ });
93
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * UserPromptSubmit hook — the core hook for CodeAgent.
4
+ *
5
+ * Input: stdin JSON { message: string }
6
+ * Output: stdout plain text (injected into Claude Code prompt)
7
+ *
8
+ * Pipeline: parse query → Context Broker → format → output
9
+ * Total execution time target: < 3s
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=user-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-prompt.d.ts","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * UserPromptSubmit hook — the core hook for CodeAgent.
4
+ *
5
+ * Input: stdin JSON { message: string }
6
+ * Output: stdout plain text (injected into Claude Code prompt)
7
+ *
8
+ * Pipeline: parse query → Context Broker → format → output
9
+ * Total execution time target: < 3s
10
+ */
11
+ import fs from 'node:fs';
12
+ import { ContextBroker, formatContextPack } from '../broker/broker.js';
13
+ import { hasContent } from '../broker/context-pack.js';
14
+ async function main() {
15
+ // Read user message from stdin
16
+ let message;
17
+ try {
18
+ const raw = fs.readFileSync('/dev/stdin', 'utf8');
19
+ const input = JSON.parse(raw);
20
+ message = input?.message || '';
21
+ }
22
+ catch {
23
+ process.exit(0);
24
+ }
25
+ if (!message || message.trim().length < 8) {
26
+ process.exit(0);
27
+ }
28
+ // Build context pack
29
+ const broker = new ContextBroker(process.cwd());
30
+ const pack = await broker.buildContextPack({
31
+ repoRoot: process.cwd(),
32
+ userQuery: message,
33
+ });
34
+ // Output if there's content
35
+ if (hasContent(pack)) {
36
+ const formatted = formatContextPack(pack);
37
+ if (formatted) {
38
+ process.stdout.write(formatted);
39
+ }
40
+ }
41
+ }
42
+ main().catch(() => {
43
+ // Silent failure — never block the user
44
+ process.exit(0);
45
+ });
46
+ //# sourceMappingURL=user-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-prompt.js","sourceRoot":"","sources":["../../src/hooks/user-prompt.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,KAAK,UAAU,IAAI;IACjB,+BAA+B;IAC/B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE;QACvB,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;IAChB,wCAAwC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { AgentProvider, SessionHandle, SessionOpts, TurnEvent, TurnInput } from './interface.js';
2
+ /**
3
+ * Anthropic API provider.
4
+ * Direct API calls — no tool execution, no agent loop.
5
+ *
6
+ * Best for:
7
+ * - Structured output (JSON schema)
8
+ * - Lightweight analysis/summary tasks
9
+ * - When you don't need file editing or bash execution
10
+ */
11
+ export declare class AnthropicAPIProvider implements AgentProvider {
12
+ readonly name = "anthropic-api";
13
+ private client;
14
+ private model;
15
+ private messageHistory;
16
+ constructor(opts?: {
17
+ apiKey?: string;
18
+ model?: string;
19
+ });
20
+ startSession(opts?: SessionOpts): Promise<SessionHandle>;
21
+ resumeSession(providerSessionId: string, opts?: SessionOpts): Promise<SessionHandle>;
22
+ sendTurn(handle: SessionHandle, input: TurnInput): AsyncIterable<TurnEvent>;
23
+ endSession(handle: SessionHandle): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=anthropic-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-api.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAA6E;gBAEvF,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOhD,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAO5D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,aAAa,CAAC;IASlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IAyDrB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvD"}
@@ -0,0 +1,93 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { formatContextPack } from '../broker/broker.js';
3
+ import { hasContent } from '../broker/context-pack.js';
4
+ /**
5
+ * Anthropic API provider.
6
+ * Direct API calls — no tool execution, no agent loop.
7
+ *
8
+ * Best for:
9
+ * - Structured output (JSON schema)
10
+ * - Lightweight analysis/summary tasks
11
+ * - When you don't need file editing or bash execution
12
+ */
13
+ export class AnthropicAPIProvider {
14
+ name = 'anthropic-api';
15
+ client;
16
+ model;
17
+ messageHistory = new Map();
18
+ constructor(opts) {
19
+ this.client = new Anthropic({
20
+ apiKey: opts?.apiKey || process.env.ANTHROPIC_API_KEY,
21
+ });
22
+ this.model = opts?.model || 'claude-sonnet-4-20250514';
23
+ }
24
+ async startSession(opts = {}) {
25
+ const sessionId = `api-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
26
+ this.messageHistory.set(sessionId, []);
27
+ if (opts.model)
28
+ this.model = opts.model;
29
+ return { sessionId };
30
+ }
31
+ async resumeSession(providerSessionId, opts = {}) {
32
+ // For API provider, resume just means we have existing history
33
+ if (opts.model)
34
+ this.model = opts.model;
35
+ if (!this.messageHistory.has(providerSessionId)) {
36
+ this.messageHistory.set(providerSessionId, []);
37
+ }
38
+ return { sessionId: providerSessionId, providerSessionId };
39
+ }
40
+ async *sendTurn(handle, input) {
41
+ // Build message with context
42
+ let userMessage = input.userMessage;
43
+ if (input.contextPack && hasContent(input.contextPack)) {
44
+ const contextStr = formatContextPack(input.contextPack);
45
+ if (contextStr) {
46
+ userMessage = `${contextStr}\n\n${input.userMessage}`;
47
+ }
48
+ }
49
+ // Get or create message history
50
+ const history = this.messageHistory.get(handle.sessionId) || [];
51
+ history.push({ role: 'user', content: userMessage });
52
+ try {
53
+ // Stream the response
54
+ const stream = this.client.messages.stream({
55
+ model: this.model,
56
+ max_tokens: 4096,
57
+ system: input.systemPrompt || 'You are a helpful coding assistant with deep project context.',
58
+ messages: history,
59
+ });
60
+ let fullResponse = '';
61
+ for await (const event of stream) {
62
+ if (event.type === 'content_block_delta' &&
63
+ event.delta.type === 'text_delta') {
64
+ yield { type: 'text', content: event.delta.text };
65
+ fullResponse += event.delta.text;
66
+ }
67
+ }
68
+ // Get final message for usage
69
+ const finalMessage = await stream.finalMessage();
70
+ history.push({ role: 'assistant', content: fullResponse });
71
+ this.messageHistory.set(handle.sessionId, history);
72
+ yield {
73
+ type: 'done',
74
+ content: fullResponse,
75
+ metadata: {
76
+ inputTokens: finalMessage.usage.input_tokens,
77
+ outputTokens: finalMessage.usage.output_tokens,
78
+ model: finalMessage.model,
79
+ },
80
+ };
81
+ }
82
+ catch (err) {
83
+ yield {
84
+ type: 'error',
85
+ content: err instanceof Error ? err.message : String(err),
86
+ };
87
+ }
88
+ }
89
+ async endSession(handle) {
90
+ this.messageHistory.delete(handle.sessionId);
91
+ }
92
+ }
93
+ //# sourceMappingURL=anthropic-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"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"}