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.
- package/README.md +400 -0
- package/dist/cli/commands/export.d.ts +11 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +119 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/list.d.ts +11 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +79 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +11 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +144 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/search.d.ts +11 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +94 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/view.d.ts +11 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +67 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/formatters/pager.d.ts +25 -0
- package/dist/cli/formatters/pager.d.ts.map +1 -0
- package/dist/cli/formatters/pager.js +119 -0
- package/dist/cli/formatters/pager.js.map +1 -0
- package/dist/cli/formatters/search.d.ts +38 -0
- package/dist/cli/formatters/search.d.ts.map +1 -0
- package/dist/cli/formatters/search.js +119 -0
- package/dist/cli/formatters/search.js.map +1 -0
- package/dist/cli/formatters/session.d.ts +24 -0
- package/dist/cli/formatters/session.d.ts.map +1 -0
- package/dist/cli/formatters/session.js +247 -0
- package/dist/cli/formatters/session.js.map +1 -0
- package/dist/cli/formatters/table.d.ts +25 -0
- package/dist/cli/formatters/table.d.ts.map +1 -0
- package/dist/cli/formatters/table.js +126 -0
- package/dist/cli/formatters/table.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +62 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +65 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/errors.d.ts +86 -0
- package/dist/cli/utils/errors.d.ts.map +1 -0
- package/dist/cli/utils/errors.js +129 -0
- package/dist/cli/utils/errors.js.map +1 -0
- package/dist/cli/utils/output.d.ts +74 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +113 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/lib/config.d.ts +44 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +60 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +40 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +61 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/export.d.ts +70 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +241 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/index.d.ts +16 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +33 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/migrate.d.ts +50 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +274 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/parser.d.ts +67 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +321 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/platform.d.ts +51 -0
- package/dist/lib/platform.d.ts.map +1 -0
- package/dist/lib/platform.js +94 -0
- package/dist/lib/platform.js.map +1 -0
- package/dist/lib/search.d.ts +39 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +217 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/session.d.ts +59 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +326 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/types.d.ts +280 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +7 -0
- package/dist/lib/types.js.map +1 -0
- 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"}
|