claude-code-history 0.2.2

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 (94) hide show
  1. package/README.md +400 -0
  2. package/dist/cli/commands/export.d.ts +11 -0
  3. package/dist/cli/commands/export.d.ts.map +1 -0
  4. package/dist/cli/commands/export.js +119 -0
  5. package/dist/cli/commands/export.js.map +1 -0
  6. package/dist/cli/commands/list.d.ts +11 -0
  7. package/dist/cli/commands/list.d.ts.map +1 -0
  8. package/dist/cli/commands/list.js +79 -0
  9. package/dist/cli/commands/list.js.map +1 -0
  10. package/dist/cli/commands/migrate.d.ts +11 -0
  11. package/dist/cli/commands/migrate.d.ts.map +1 -0
  12. package/dist/cli/commands/migrate.js +144 -0
  13. package/dist/cli/commands/migrate.js.map +1 -0
  14. package/dist/cli/commands/search.d.ts +11 -0
  15. package/dist/cli/commands/search.d.ts.map +1 -0
  16. package/dist/cli/commands/search.js +94 -0
  17. package/dist/cli/commands/search.js.map +1 -0
  18. package/dist/cli/commands/view.d.ts +11 -0
  19. package/dist/cli/commands/view.d.ts.map +1 -0
  20. package/dist/cli/commands/view.js +67 -0
  21. package/dist/cli/commands/view.js.map +1 -0
  22. package/dist/cli/formatters/pager.d.ts +25 -0
  23. package/dist/cli/formatters/pager.d.ts.map +1 -0
  24. package/dist/cli/formatters/pager.js +119 -0
  25. package/dist/cli/formatters/pager.js.map +1 -0
  26. package/dist/cli/formatters/search.d.ts +38 -0
  27. package/dist/cli/formatters/search.d.ts.map +1 -0
  28. package/dist/cli/formatters/search.js +119 -0
  29. package/dist/cli/formatters/search.js.map +1 -0
  30. package/dist/cli/formatters/session.d.ts +24 -0
  31. package/dist/cli/formatters/session.d.ts.map +1 -0
  32. package/dist/cli/formatters/session.js +247 -0
  33. package/dist/cli/formatters/session.js.map +1 -0
  34. package/dist/cli/formatters/table.d.ts +25 -0
  35. package/dist/cli/formatters/table.d.ts.map +1 -0
  36. package/dist/cli/formatters/table.js +126 -0
  37. package/dist/cli/formatters/table.js.map +1 -0
  38. package/dist/cli/index.d.ts +14 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +50 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/utils/config.d.ts +62 -0
  43. package/dist/cli/utils/config.d.ts.map +1 -0
  44. package/dist/cli/utils/config.js +65 -0
  45. package/dist/cli/utils/config.js.map +1 -0
  46. package/dist/cli/utils/errors.d.ts +86 -0
  47. package/dist/cli/utils/errors.d.ts.map +1 -0
  48. package/dist/cli/utils/errors.js +129 -0
  49. package/dist/cli/utils/errors.js.map +1 -0
  50. package/dist/cli/utils/output.d.ts +74 -0
  51. package/dist/cli/utils/output.d.ts.map +1 -0
  52. package/dist/cli/utils/output.js +113 -0
  53. package/dist/cli/utils/output.js.map +1 -0
  54. package/dist/lib/config.d.ts +44 -0
  55. package/dist/lib/config.d.ts.map +1 -0
  56. package/dist/lib/config.js +60 -0
  57. package/dist/lib/config.js.map +1 -0
  58. package/dist/lib/errors.d.ts +40 -0
  59. package/dist/lib/errors.d.ts.map +1 -0
  60. package/dist/lib/errors.js +61 -0
  61. package/dist/lib/errors.js.map +1 -0
  62. package/dist/lib/export.d.ts +70 -0
  63. package/dist/lib/export.d.ts.map +1 -0
  64. package/dist/lib/export.js +241 -0
  65. package/dist/lib/export.js.map +1 -0
  66. package/dist/lib/index.d.ts +16 -0
  67. package/dist/lib/index.d.ts.map +1 -0
  68. package/dist/lib/index.js +33 -0
  69. package/dist/lib/index.js.map +1 -0
  70. package/dist/lib/migrate.d.ts +50 -0
  71. package/dist/lib/migrate.d.ts.map +1 -0
  72. package/dist/lib/migrate.js +274 -0
  73. package/dist/lib/migrate.js.map +1 -0
  74. package/dist/lib/parser.d.ts +67 -0
  75. package/dist/lib/parser.d.ts.map +1 -0
  76. package/dist/lib/parser.js +321 -0
  77. package/dist/lib/parser.js.map +1 -0
  78. package/dist/lib/platform.d.ts +51 -0
  79. package/dist/lib/platform.d.ts.map +1 -0
  80. package/dist/lib/platform.js +94 -0
  81. package/dist/lib/platform.js.map +1 -0
  82. package/dist/lib/search.d.ts +39 -0
  83. package/dist/lib/search.d.ts.map +1 -0
  84. package/dist/lib/search.js +217 -0
  85. package/dist/lib/search.js.map +1 -0
  86. package/dist/lib/session.d.ts +59 -0
  87. package/dist/lib/session.d.ts.map +1 -0
  88. package/dist/lib/session.js +326 -0
  89. package/dist/lib/session.js.map +1 -0
  90. package/dist/lib/types.d.ts +280 -0
  91. package/dist/lib/types.d.ts.map +1 -0
  92. package/dist/lib/types.js +7 -0
  93. package/dist/lib/types.js.map +1 -0
  94. package/package.json +65 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Search result formatter for CLI display
3
+ *
4
+ * Formats SearchMatch arrays into human-readable search results.
5
+ */
6
+ /**
7
+ * Get a short display name for the project path
8
+ */
9
+ function getProjectName(projectPath) {
10
+ const parts = projectPath.split(/[/\\]/);
11
+ return parts[parts.length - 1] ?? projectPath;
12
+ }
13
+ /**
14
+ * Truncate a string to a maximum length
15
+ */
16
+ function truncate(str, maxLength) {
17
+ if (str.length <= maxLength) {
18
+ return str;
19
+ }
20
+ return str.slice(0, maxLength - 3) + '...';
21
+ }
22
+ /**
23
+ * Format context lines with line numbers and highlighting
24
+ */
25
+ function formatContext(context, matchLineNumber, contextLines) {
26
+ if (context.length === 0) {
27
+ return '';
28
+ }
29
+ const lines = [];
30
+ const startLine = Math.max(1, matchLineNumber - contextLines);
31
+ for (let i = 0; i < context.length; i++) {
32
+ const lineNum = startLine + i;
33
+ const lineContent = context[i] ?? '';
34
+ const isMatchLine = lineNum === matchLineNumber;
35
+ const prefix = isMatchLine ? '>' : ' ';
36
+ const lineNumStr = String(lineNum).padStart(4, ' ');
37
+ // Truncate very long lines
38
+ const displayContent = truncate(lineContent, 120);
39
+ lines.push(`${prefix} ${lineNumStr} │ ${displayContent}`);
40
+ }
41
+ return lines.join('\n');
42
+ }
43
+ /**
44
+ * Format a single search match
45
+ */
46
+ function formatMatch(match, contextLines) {
47
+ const lines = [];
48
+ // Header: session info
49
+ const project = getProjectName(match.projectPath);
50
+ const summary = match.sessionSummary
51
+ ? truncate(match.sessionSummary, 50)
52
+ : '(no summary)';
53
+ const role = match.messageType.toUpperCase();
54
+ lines.push(`[${project}] ${summary}`);
55
+ lines.push(` Session: ${match.sessionId}`);
56
+ lines.push(` ${role} message, line ${match.lineNumber}`);
57
+ lines.push('');
58
+ // Context with the match highlighted
59
+ const contextStr = formatContext(match.context, match.lineNumber, contextLines);
60
+ if (contextStr) {
61
+ lines.push(contextStr);
62
+ }
63
+ return lines.join('\n');
64
+ }
65
+ /**
66
+ * Create a separator line
67
+ */
68
+ function separator() {
69
+ return '─'.repeat(80);
70
+ }
71
+ /**
72
+ * Format search results for human-readable display
73
+ *
74
+ * @param matches - Array of search matches
75
+ * @param query - The search query (for display)
76
+ * @param contextLines - Number of context lines shown
77
+ * @param pagination - Pagination info
78
+ * @returns Formatted search results string
79
+ */
80
+ export function formatSearchResults(matches, query, contextLines, pagination) {
81
+ if (matches.length === 0) {
82
+ return `No matches found for "${query}".`;
83
+ }
84
+ const parts = [];
85
+ // Header
86
+ const showing = pagination.total > matches.length
87
+ ? `Showing ${pagination.offset + 1}-${pagination.offset + matches.length} of ${pagination.total}`
88
+ : `Found ${pagination.total}`;
89
+ parts.push(`${showing} matches for "${query}":`);
90
+ parts.push('');
91
+ parts.push(separator());
92
+ // Matches
93
+ for (const match of matches) {
94
+ parts.push('');
95
+ parts.push(formatMatch(match, contextLines));
96
+ parts.push('');
97
+ parts.push(separator());
98
+ }
99
+ // Pagination hint
100
+ if (pagination.hasMore) {
101
+ parts.push('');
102
+ parts.push(`Use --offset ${pagination.offset + pagination.limit} to see more results.`);
103
+ }
104
+ return parts.join('\n');
105
+ }
106
+ /**
107
+ * Format search results for JSON output
108
+ *
109
+ * @param matches - Array of search matches
110
+ * @param pagination - Pagination info
111
+ * @returns Structured data for JSON serialization
112
+ */
113
+ export function formatSearchResultsForJson(matches, pagination) {
114
+ return {
115
+ matches,
116
+ pagination,
117
+ };
118
+ }
119
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/formatters/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Session formatter for detailed view display
3
+ *
4
+ * Formats Session objects into human-readable conversation view.
5
+ * Tool calls are paired with their results for better readability.
6
+ */
7
+ import type { Session } from '../../lib/index.js';
8
+ /**
9
+ * Format a session for detailed view
10
+ *
11
+ * Tool calls are paired with their results for better readability.
12
+ * Messages that are purely tool results are skipped since their
13
+ * content is shown inline with the tool call.
14
+ *
15
+ * @param session - Full session object with messages
16
+ * @returns Formatted session string
17
+ */
18
+ export declare function formatSession(session: Session): string;
19
+ /**
20
+ * Format session for JSON output
21
+ * Returns the session as-is since it's already structured
22
+ */
23
+ export declare function formatSessionForJson(session: Session): Session;
24
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,OAAO,EASR,MAAM,oBAAoB,CAAC;AAyP5B;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAqCtD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Session formatter for detailed view display
3
+ *
4
+ * Formats Session objects into human-readable conversation view.
5
+ * Tool calls are paired with their results for better readability.
6
+ */
7
+ /**
8
+ * Format a date for display
9
+ */
10
+ function formatTime(date) {
11
+ const hours = String(date.getHours()).padStart(2, '0');
12
+ const minutes = String(date.getMinutes()).padStart(2, '0');
13
+ const seconds = String(date.getSeconds()).padStart(2, '0');
14
+ return `${hours}:${minutes}:${seconds}`;
15
+ }
16
+ /**
17
+ * Format a full date for display
18
+ */
19
+ function formatDate(date) {
20
+ const year = date.getFullYear();
21
+ const month = String(date.getMonth() + 1).padStart(2, '0');
22
+ const day = String(date.getDate()).padStart(2, '0');
23
+ return `${year}-${month}-${day} ${formatTime(date)}`;
24
+ }
25
+ /**
26
+ * Format token usage for display
27
+ */
28
+ function formatTokenUsage(usage) {
29
+ const total = usage.inputTokens + usage.outputTokens;
30
+ return `[${total.toLocaleString()} tokens]`;
31
+ }
32
+ /**
33
+ * Format tool result content with proper indentation
34
+ */
35
+ function formatToolResult(result) {
36
+ const lines = [];
37
+ // Add error indicator if applicable
38
+ if (result.is_error) {
39
+ lines.push(' ⚠ ERROR:');
40
+ }
41
+ else {
42
+ lines.push(' → Result:');
43
+ }
44
+ // Format the content with indentation
45
+ const content = result.content;
46
+ if (content.length > 500) {
47
+ // Truncate long results but show more than before
48
+ const truncated = content.slice(0, 497) + '...';
49
+ const indented = truncated.split('\n').map(line => ' ' + line).join('\n');
50
+ lines.push(indented);
51
+ }
52
+ else {
53
+ const indented = content.split('\n').map(line => ' ' + line).join('\n');
54
+ lines.push(indented);
55
+ }
56
+ return lines.join('\n');
57
+ }
58
+ /**
59
+ * Format tool use content with its result (if available)
60
+ */
61
+ function formatToolUseWithResult(content, toolResults) {
62
+ const lines = [];
63
+ // Format the tool call
64
+ const inputStr = JSON.stringify(content.input, null, 2);
65
+ const truncatedInput = inputStr.length > 300 ? inputStr.slice(0, 297) + '...' : inputStr;
66
+ lines.push(`[Tool: ${content.name}]`);
67
+ // Add input parameters with indentation
68
+ const indentedInput = truncatedInput.split('\n').map(line => ' ' + line).join('\n');
69
+ lines.push(indentedInput);
70
+ // Add the result if we have it
71
+ const result = toolResults.get(content.id);
72
+ if (result) {
73
+ lines.push('');
74
+ lines.push(formatToolResult(result));
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ /**
79
+ * Format a single content item from assistant message
80
+ */
81
+ function formatContentItem(item, toolResults) {
82
+ if (item.type === 'text') {
83
+ return item.text;
84
+ }
85
+ if (item.type === 'tool_use') {
86
+ return formatToolUseWithResult(item, toolResults);
87
+ }
88
+ if (item.type === 'thinking') {
89
+ const thinking = item.thinking;
90
+ const preview = thinking.length > 100 ? thinking.slice(0, 97) + '...' : thinking;
91
+ return `[Thinking] ${preview}`;
92
+ }
93
+ return '[Unknown content type]';
94
+ }
95
+ /**
96
+ * Check if a user message is purely tool results
97
+ */
98
+ function isToolResultMessage(msg) {
99
+ if (typeof msg.content === 'string') {
100
+ return false;
101
+ }
102
+ if (!Array.isArray(msg.content)) {
103
+ return false;
104
+ }
105
+ // Check if all content items are tool results
106
+ return msg.content.every((item) => item &&
107
+ typeof item === 'object' &&
108
+ 'type' in item &&
109
+ item.type === 'tool_result');
110
+ }
111
+ /**
112
+ * Format user message content (only for non-tool-result messages)
113
+ */
114
+ function formatUserContent(content) {
115
+ if (typeof content === 'string') {
116
+ return content;
117
+ }
118
+ // This shouldn't happen for regular user messages
119
+ // Tool results are now handled separately
120
+ if (Array.isArray(content)) {
121
+ return content
122
+ .map((item) => {
123
+ if (item.type === 'tool_result') {
124
+ // Fallback formatting if we somehow get here
125
+ const preview = item.content.length > 200
126
+ ? item.content.slice(0, 197) + '...'
127
+ : item.content;
128
+ return `[Tool Result] ${preview}`;
129
+ }
130
+ return JSON.stringify(item);
131
+ })
132
+ .join('\n');
133
+ }
134
+ return String(content);
135
+ }
136
+ /**
137
+ * Format a user message for display
138
+ */
139
+ function formatUserMessage(msg) {
140
+ const time = formatTime(msg.timestamp);
141
+ const content = formatUserContent(msg.content);
142
+ return `[${time}] USER\n${content}`;
143
+ }
144
+ /**
145
+ * Format an assistant message for display
146
+ */
147
+ function formatAssistantMessage(msg, toolResults) {
148
+ const time = formatTime(msg.timestamp);
149
+ const model = msg.model || 'assistant';
150
+ const tokens = formatTokenUsage(msg.usage);
151
+ const contentParts = msg.content.map((item) => formatContentItem(item, toolResults));
152
+ const content = contentParts.join('\n\n');
153
+ return `[${time}] ASSISTANT (${model}) ${tokens}\n${content}`;
154
+ }
155
+ /**
156
+ * Build a map of tool_use_id to tool results from all messages
157
+ */
158
+ function buildToolResultMap(messages) {
159
+ const map = new Map();
160
+ for (const msg of messages) {
161
+ if (msg.type === 'user') {
162
+ const userMsg = msg;
163
+ if (Array.isArray(userMsg.content)) {
164
+ for (const item of userMsg.content) {
165
+ if (item.type === 'tool_result') {
166
+ map.set(item.tool_use_id, item);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return map;
173
+ }
174
+ /**
175
+ * Create a separator line
176
+ */
177
+ function separator() {
178
+ return '─'.repeat(80);
179
+ }
180
+ /**
181
+ * Format session header
182
+ */
183
+ function formatSessionHeader(session) {
184
+ const lines = [
185
+ `Session: ${session.id}`,
186
+ `Project: ${session.projectPath}`,
187
+ `Started: ${formatDate(session.timestamp)}`,
188
+ `Messages: ${session.messageCount}`,
189
+ ];
190
+ if (session.gitBranch) {
191
+ lines.push(`Branch: ${session.gitBranch}`);
192
+ }
193
+ if (session.summary) {
194
+ lines.push(`Summary: ${session.summary}`);
195
+ }
196
+ return lines.join('\n');
197
+ }
198
+ /**
199
+ * Format a session for detailed view
200
+ *
201
+ * Tool calls are paired with their results for better readability.
202
+ * Messages that are purely tool results are skipped since their
203
+ * content is shown inline with the tool call.
204
+ *
205
+ * @param session - Full session object with messages
206
+ * @returns Formatted session string
207
+ */
208
+ export function formatSession(session) {
209
+ const parts = [];
210
+ // Build tool result map for pairing
211
+ const toolResults = buildToolResultMap(session.messages);
212
+ // Header
213
+ parts.push(formatSessionHeader(session));
214
+ parts.push('');
215
+ parts.push(separator());
216
+ // Messages
217
+ for (const msg of session.messages) {
218
+ // Skip summary and file-history-snapshot messages
219
+ if (msg.type !== 'user' && msg.type !== 'assistant') {
220
+ continue;
221
+ }
222
+ // Skip pure tool result messages (they're shown inline with tool calls)
223
+ if (msg.type === 'user' && isToolResultMessage(msg)) {
224
+ continue;
225
+ }
226
+ let formatted;
227
+ if (msg.type === 'user') {
228
+ formatted = formatUserMessage(msg);
229
+ }
230
+ else {
231
+ formatted = formatAssistantMessage(msg, toolResults);
232
+ }
233
+ parts.push('');
234
+ parts.push(formatted);
235
+ parts.push('');
236
+ parts.push(separator());
237
+ }
238
+ return parts.join('\n');
239
+ }
240
+ /**
241
+ * Format session for JSON output
242
+ * Returns the session as-is since it's already structured
243
+ */
244
+ export function formatSessionForJson(session) {
245
+ return session;
246
+ }
247
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/formatters/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Table formatter for session list display
3
+ *
4
+ * Formats SessionSummary arrays into human-readable tables.
5
+ */
6
+ import type { SessionSummary } from '../../lib/index.js';
7
+ /**
8
+ * Format session list as a table
9
+ *
10
+ * @param sessions - Array of session summaries
11
+ * @param offset - Starting index offset for display
12
+ * @returns Formatted table string
13
+ */
14
+ export declare function formatSessionTable(sessions: SessionSummary[], offset?: number): string;
15
+ /**
16
+ * Format session list for JSON output
17
+ *
18
+ * @param sessions - Array of session summaries
19
+ * @param offset - Starting index offset
20
+ * @returns Array of formatted session objects with index
21
+ */
22
+ export declare function formatSessionsForJson(sessions: SessionSummary[], offset?: number): (SessionSummary & {
23
+ index: number;
24
+ })[];
25
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/table.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAyEzD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EAAE,EAC1B,MAAM,SAAI,GACT,MAAM,CAmDR;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EAAE,EAC1B,MAAM,SAAI,GACT,CAAC,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAKxC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Table formatter for session list display
3
+ *
4
+ * Formats SessionSummary arrays into human-readable tables.
5
+ */
6
+ /**
7
+ * Column widths for table display
8
+ */
9
+ const COLUMN_WIDTHS = {
10
+ idx: 4,
11
+ timestamp: 20,
12
+ project: 28,
13
+ summary: 40,
14
+ msgs: 5,
15
+ };
16
+ /**
17
+ * Truncate a string to a maximum length, adding ellipsis if needed
18
+ */
19
+ function truncate(str, maxLength) {
20
+ if (str.length <= maxLength) {
21
+ return str;
22
+ }
23
+ return str.slice(0, maxLength - 3) + '...';
24
+ }
25
+ /**
26
+ * Pad a string to a fixed width (right-aligned for numbers)
27
+ */
28
+ function padLeft(str, width) {
29
+ return str.padStart(width);
30
+ }
31
+ /**
32
+ * Pad a string to a fixed width (left-aligned for text)
33
+ */
34
+ function padRight(str, width) {
35
+ return str.padEnd(width);
36
+ }
37
+ /**
38
+ * Format a date for display
39
+ */
40
+ function formatDate(date) {
41
+ const year = date.getFullYear();
42
+ const month = String(date.getMonth() + 1).padStart(2, '0');
43
+ const day = String(date.getDate()).padStart(2, '0');
44
+ const hours = String(date.getHours()).padStart(2, '0');
45
+ const minutes = String(date.getMinutes()).padStart(2, '0');
46
+ const seconds = String(date.getSeconds()).padStart(2, '0');
47
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
48
+ }
49
+ /**
50
+ * Get a display summary for a session.
51
+ * Uses the session summary if available, otherwise uses first user message.
52
+ */
53
+ function getDisplaySummary(session) {
54
+ if (session.summary) {
55
+ return session.summary;
56
+ }
57
+ // The lib layer should provide a fallback summary
58
+ // For now, return a placeholder
59
+ return '(No summary)';
60
+ }
61
+ /**
62
+ * Extract just the project name from a full path
63
+ */
64
+ function getProjectName(projectPath) {
65
+ // Get the last component of the path
66
+ const parts = projectPath.split(/[/\\]/);
67
+ return parts[parts.length - 1] ?? projectPath;
68
+ }
69
+ /**
70
+ * Format session list as a table
71
+ *
72
+ * @param sessions - Array of session summaries
73
+ * @param offset - Starting index offset for display
74
+ * @returns Formatted table string
75
+ */
76
+ export function formatSessionTable(sessions, offset = 0) {
77
+ if (sessions.length === 0) {
78
+ return 'No sessions found.';
79
+ }
80
+ const lines = [];
81
+ // Header
82
+ const header = [
83
+ padLeft('IDX', COLUMN_WIDTHS.idx),
84
+ padRight('TIMESTAMP', COLUMN_WIDTHS.timestamp),
85
+ padRight('PROJECT', COLUMN_WIDTHS.project),
86
+ padRight('SUMMARY', COLUMN_WIDTHS.summary),
87
+ padLeft('MSGS', COLUMN_WIDTHS.msgs),
88
+ ].join(' ');
89
+ lines.push(header);
90
+ // Separator
91
+ const separator = [
92
+ '─'.repeat(COLUMN_WIDTHS.idx),
93
+ '─'.repeat(COLUMN_WIDTHS.timestamp),
94
+ '─'.repeat(COLUMN_WIDTHS.project),
95
+ '─'.repeat(COLUMN_WIDTHS.summary),
96
+ '─'.repeat(COLUMN_WIDTHS.msgs),
97
+ ].join(' ');
98
+ lines.push(separator);
99
+ // Rows
100
+ for (const session of sessions) {
101
+ const displayIndex = offset + sessions.indexOf(session);
102
+ const row = [
103
+ padLeft(String(displayIndex), COLUMN_WIDTHS.idx),
104
+ padRight(formatDate(session.timestamp), COLUMN_WIDTHS.timestamp),
105
+ padRight(truncate(getProjectName(session.projectPath), COLUMN_WIDTHS.project), COLUMN_WIDTHS.project),
106
+ padRight(truncate(getDisplaySummary(session), COLUMN_WIDTHS.summary), COLUMN_WIDTHS.summary),
107
+ padLeft(String(session.messageCount), COLUMN_WIDTHS.msgs),
108
+ ].join(' ');
109
+ lines.push(row);
110
+ }
111
+ return lines.join('\n');
112
+ }
113
+ /**
114
+ * Format session list for JSON output
115
+ *
116
+ * @param sessions - Array of session summaries
117
+ * @param offset - Starting index offset
118
+ * @returns Array of formatted session objects with index
119
+ */
120
+ export function formatSessionsForJson(sessions, offset = 0) {
121
+ return sessions.map((session, i) => ({
122
+ index: offset + i,
123
+ ...session,
124
+ }));
125
+ }
126
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/cli/formatters/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code History CLI
4
+ *
5
+ * Browse, search, export, and manage your Claude Code conversation history.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { Command } from 'commander';
10
+ import type { GlobalOptions } from './utils/config.js';
11
+ declare const program: Command;
12
+ export { program };
13
+ export type { GlobalOptions };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD,QAAA,MAAM,OAAO,SAAgB,CAAC;AA0C9B,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code History CLI
4
+ *
5
+ * Browse, search, export, and manage your Claude Code conversation history.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { Command } from 'commander';
10
+ import { handleError } from './utils/errors.js';
11
+ import { registerListCommand } from './commands/list.js';
12
+ import { registerViewCommand } from './commands/view.js';
13
+ import { registerSearchCommand } from './commands/search.js';
14
+ import { registerExportCommand } from './commands/export.js';
15
+ import { registerMigrateCommand } from './commands/migrate.js';
16
+ const program = new Command();
17
+ program
18
+ .name('cch')
19
+ .description('Claude Code History CLI - Browse, search, export, and manage your Claude Code conversation history')
20
+ .version('0.1.0')
21
+ .option('-d, --data-path <path>', 'Custom Claude Code data directory')
22
+ .option('-j, --json', 'Output in JSON format', false)
23
+ .option('-f, --full', 'Output full content without pagination', false);
24
+ // Register commands
25
+ registerListCommand(program);
26
+ registerViewCommand(program);
27
+ registerSearchCommand(program);
28
+ registerExportCommand(program);
29
+ registerMigrateCommand(program);
30
+ // - migrate (T056) - DONE
31
+ // Handle uncaught errors
32
+ process.on('uncaughtException', (error) => {
33
+ const globalOpts = program.opts();
34
+ const exitCode = handleError(error, globalOpts.json);
35
+ process.exit(exitCode);
36
+ });
37
+ process.on('unhandledRejection', (reason) => {
38
+ const globalOpts = program.opts();
39
+ const error = reason instanceof Error ? reason : new Error(String(reason));
40
+ const exitCode = handleError(error, globalOpts.json);
41
+ process.exit(exitCode);
42
+ });
43
+ // Parse and execute
44
+ program.parse();
45
+ // If no command was provided, show help
46
+ if (!process.argv.slice(2).length) {
47
+ program.outputHelp();
48
+ }
49
+ export { program };
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CACV,oGAAoG,CACrG;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,wBAAwB,EAAE,mCAAmC,CAAC;KACrE,MAAM,CAAC,YAAY,EAAE,uBAAuB,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,YAAY,EAAE,wCAAwC,EAAE,KAAK,CAAC,CAAC;AAEzE,oBAAoB;AACpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,0BAA0B;AAE1B,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;IACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAmB,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,wCAAwC;AACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}