claude_stream_viewer 1.0.16 → 1.0.18

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 (59) hide show
  1. package/README.md +38 -10
  2. package/demo_vhs/claude_stream_viewer.gif +0 -0
  3. package/dist/cli.js +46 -364
  4. package/dist/cli.js.map +1 -1
  5. package/dist/libs/colors.d.ts +15 -0
  6. package/dist/libs/colors.d.ts.map +1 -0
  7. package/dist/libs/colors.js +16 -0
  8. package/dist/libs/colors.js.map +1 -0
  9. package/dist/libs/terminal_output.d.ts +8 -0
  10. package/dist/libs/terminal_output.d.ts.map +1 -0
  11. package/dist/libs/terminal_output.js +13 -0
  12. package/dist/libs/terminal_output.js.map +1 -0
  13. package/dist/log_viewer/log_renderer.d.ts +28 -0
  14. package/dist/log_viewer/log_renderer.d.ts.map +1 -0
  15. package/dist/log_viewer/log_renderer.js +163 -0
  16. package/dist/log_viewer/log_renderer.js.map +1 -0
  17. package/dist/log_viewer/tool_input_formatter.d.ts +31 -0
  18. package/dist/log_viewer/tool_input_formatter.d.ts.map +1 -0
  19. package/dist/log_viewer/tool_input_formatter.js +190 -0
  20. package/dist/log_viewer/tool_input_formatter.js.map +1 -0
  21. package/dist/stats/stats_collector.d.ts +28 -0
  22. package/dist/stats/stats_collector.d.ts.map +1 -0
  23. package/dist/stats/stats_collector.js +165 -0
  24. package/dist/stats/stats_collector.js.map +1 -0
  25. package/dist/stats/stats_renderer.d.ts +13 -0
  26. package/dist/stats/stats_renderer.d.ts.map +1 -0
  27. package/dist/stats/stats_renderer.js +193 -0
  28. package/dist/stats/stats_renderer.js.map +1 -0
  29. package/dist/types/claude_event.d.ts +75 -0
  30. package/dist/types/claude_event.d.ts.map +1 -0
  31. package/dist/types/claude_event.js +2 -0
  32. package/dist/types/claude_event.js.map +1 -0
  33. package/dist/types/stats_report.d.ts +68 -0
  34. package/dist/types/stats_report.d.ts.map +1 -0
  35. package/dist/types/stats_report.js +2 -0
  36. package/dist/types/stats_report.js.map +1 -0
  37. package/package.json +4 -5
  38. package/src/cli.ts +53 -409
  39. package/src/libs/colors.ts +16 -0
  40. package/src/libs/terminal_output.ts +14 -0
  41. package/src/log_viewer/log_renderer.ts +160 -0
  42. package/src/log_viewer/tool_input_formatter.ts +183 -0
  43. package/src/stats/stats_collector.ts +175 -0
  44. package/src/stats/stats_renderer.ts +185 -0
  45. package/src/types/claude_event.ts +74 -0
  46. package/src/types/stats_report.ts +66 -0
  47. package/dist/claude-stream-viewer.d.ts +0 -3
  48. package/dist/claude-stream-viewer.d.ts.map +0 -1
  49. package/dist/claude-stream-viewer.js +0 -100
  50. package/dist/claude-stream-viewer.js.map +0 -1
  51. package/dist/claude_stream_viewer copy.d.ts +0 -3
  52. package/dist/claude_stream_viewer copy.d.ts.map +0 -1
  53. package/dist/claude_stream_viewer copy.js +0 -228
  54. package/dist/claude_stream_viewer copy.js.map +0 -1
  55. package/dist/claude_stream_viewer.d.ts +0 -3
  56. package/dist/claude_stream_viewer.d.ts.map +0 -1
  57. package/dist/claude_stream_viewer.js +0 -155
  58. package/dist/claude_stream_viewer.js.map +0 -1
  59. package/src/claude_stream_viewer copy.ts +0 -287
@@ -1,228 +0,0 @@
1
- #!/usr/bin/env node
2
- // Reads Claude Code stream-json events line-by-line from stdin and pretty-prints
3
- // the consolidated event layer (system/assistant/user/result). The fine-grained
4
- // `stream_event` SSE envelopes are ignored — the consolidated events already
5
- // carry fully assembled content blocks.
6
- //
7
- // Usage:
8
- // claude --output-format stream-json --verbose --permission-mode auto -p "explain quantum computing like I'm 5" | npx claude_stream_viewer
9
- import Readline from 'node:readline';
10
- import Fs from 'node:fs';
11
- import * as Commander from 'commander';
12
- import Chalk from 'chalk';
13
- import Path from 'node:path';
14
- const __dirname = new URL('.', import.meta.url).pathname;
15
- const MAX_TOOL_RESULT_LINES = 40;
16
- const colors = {
17
- text: Chalk.white,
18
- tool: Chalk.cyan,
19
- system: Chalk.gray,
20
- error: Chalk.red,
21
- json: Chalk.dim,
22
- header: Chalk.yellow.bold,
23
- thinking: Chalk.gray.italic,
24
- };
25
- ///////////////////////////////////////////////////////////////////////////////
26
- ///////////////////////////////////////////////////////////////////////////////
27
- // class MainHelper
28
- ///////////////////////////////////////////////////////////////////////////////
29
- ///////////////////////////////////////////////////////////////////////////////
30
- class MainHelper {
31
- constructor() {
32
- this.toolNamesById = new Map();
33
- }
34
- printHeader(label) {
35
- console.log(colors.header(`\n=== ${label} ===`));
36
- }
37
- printJSON(obj) {
38
- console.log(colors.json(JSON.stringify(obj, null, 2)));
39
- }
40
- ///////////////////////////////////////////////////////////////////////////////
41
- ///////////////////////////////////////////////////////////////////////////////
42
- // per-event-type renderers
43
- ///////////////////////////////////////////////////////////////////////////////
44
- ///////////////////////////////////////////////////////////////////////////////
45
- renderSystem(event) {
46
- if (event.subtype !== 'init') {
47
- this.printHeader(`SYSTEM: ${event.subtype ?? 'unknown'}`);
48
- this.printJSON(event);
49
- return;
50
- }
51
- this.printHeader('SESSION');
52
- const sessionPrefix = event.session_id !== undefined ? event.session_id.slice(0, 8) : 'unknown';
53
- const toolsCount = event.tools !== undefined ? event.tools.length : 0;
54
- console.log(colors.system(`model: ${event.model ?? 'unknown'}`));
55
- console.log(colors.system(`cwd: ${event.cwd ?? 'unknown'}`));
56
- console.log(colors.system(`tools: ${toolsCount}`));
57
- console.log(colors.system(`session: ${sessionPrefix}`));
58
- if (event.claude_code_version !== undefined) {
59
- console.log(colors.system(`claude-code: v${event.claude_code_version}`));
60
- }
61
- }
62
- renderAssistant(event) {
63
- const content = event.message?.content;
64
- if (content === undefined)
65
- return;
66
- for (const block of content) {
67
- this.renderAssistantBlock(block);
68
- }
69
- }
70
- renderAssistantBlock(block) {
71
- if (block.type === 'thinking') {
72
- console.log(colors.system('\n--- thinking ---'));
73
- console.log(colors.thinking(block.thinking ?? ''));
74
- return;
75
- }
76
- if (block.type === 'text') {
77
- console.log(colors.text(`\n${block.text ?? ''}`));
78
- return;
79
- }
80
- if (block.type === 'tool_use') {
81
- const name = block.name ?? 'tool';
82
- if (block.id !== undefined) {
83
- this.toolNamesById.set(block.id, name);
84
- }
85
- console.log(colors.tool(`\n→ ${name}`));
86
- console.log(colors.json(JSON.stringify(block.input ?? {}, null, 2)));
87
- return;
88
- }
89
- console.log(colors.system(`\n[assistant block: ${block.type ?? 'unknown'}]`));
90
- this.printJSON(block);
91
- }
92
- renderUser(event) {
93
- const content = event.message?.content;
94
- if (content === undefined)
95
- return;
96
- for (const block of content) {
97
- if (block.type === 'tool_result') {
98
- this.renderToolResult(block);
99
- continue;
100
- }
101
- console.log(colors.system(`\n[user block: ${block.type ?? 'unknown'}]`));
102
- this.printJSON(block);
103
- }
104
- }
105
- renderToolResult(block) {
106
- const toolName = block.tool_use_id !== undefined
107
- ? this.toolNamesById.get(block.tool_use_id) ?? block.tool_use_id.slice(0, 12)
108
- : 'unknown';
109
- const isError = block.is_error === true;
110
- const label = isError ? `← ${toolName} ERROR` : `← ${toolName} result`;
111
- console.log(colors.tool(`\n${label}`));
112
- const text = MainHelper.toolResultToText(block.content);
113
- const lines = text.split('\n');
114
- const colorFn = isError ? colors.error : colors.text;
115
- if (lines.length <= MAX_TOOL_RESULT_LINES) {
116
- console.log(colorFn(text));
117
- return;
118
- }
119
- const head = lines.slice(0, MAX_TOOL_RESULT_LINES).join('\n');
120
- const moreCount = lines.length - MAX_TOOL_RESULT_LINES;
121
- console.log(colorFn(head));
122
- console.log(colors.system(`… (truncated, ${moreCount} more lines)`));
123
- }
124
- static toolResultToText(content) {
125
- if (content === undefined)
126
- return '';
127
- if (typeof content === 'string')
128
- return content;
129
- return content.map((b) => b.text ?? '').join('');
130
- }
131
- renderRateLimit(event) {
132
- const status = event.rate_limit_info?.status ?? 'unknown';
133
- console.log(colors.system(`\n[rate_limit] ${status}`));
134
- }
135
- renderResult(event) {
136
- this.printHeader('RESULT');
137
- if (event.terminal_reason !== undefined)
138
- console.log(colors.system(`terminal_reason: ${event.terminal_reason}`));
139
- if (event.num_turns !== undefined)
140
- console.log(colors.system(`turns: ${event.num_turns}`));
141
- if (event.duration_ms !== undefined)
142
- console.log(colors.system(`duration: ${(event.duration_ms / 1000).toFixed(2)}s`));
143
- if (event.total_cost_usd !== undefined)
144
- console.log(colors.system(`cost: $${event.total_cost_usd.toFixed(4)}`));
145
- const usage = event.usage;
146
- if (usage !== undefined) {
147
- console.log(colors.system(`tokens: in=${usage.input_tokens ?? 0} out=${usage.output_tokens ?? 0} cache_read=${usage.cache_read_input_tokens ?? 0} cache_create=${usage.cache_creation_input_tokens ?? 0}`));
148
- }
149
- }
150
- ///////////////////////////////////////////////////////////////////////////////
151
- ///////////////////////////////////////////////////////////////////////////////
152
- // dispatcher
153
- ///////////////////////////////////////////////////////////////////////////////
154
- ///////////////////////////////////////////////////////////////////////////////
155
- handleEvent(claudeEvent) {
156
- try {
157
- const type = claudeEvent.type;
158
- if (type === 'stream_event')
159
- return;
160
- if (type === 'system')
161
- return this.renderSystem(claudeEvent);
162
- if (type === 'assistant')
163
- return this.renderAssistant(claudeEvent);
164
- if (type === 'user')
165
- return this.renderUser(claudeEvent);
166
- if (type === 'rate_limit_event')
167
- return this.renderRateLimit(claudeEvent);
168
- if (type === 'result')
169
- return this.renderResult(claudeEvent);
170
- this.printHeader(`${type ?? 'unknown'}`);
171
- this.printJSON(claudeEvent);
172
- }
173
- catch (err) {
174
- console.error(colors.error('Error processing event:'), err);
175
- this.printJSON(claudeEvent);
176
- }
177
- }
178
- }
179
- ///////////////////////////////////////////////////////////////////////////////
180
- ///////////////////////////////////////////////////////////////////////////////
181
- // function main
182
- ///////////////////////////////////////////////////////////////////////////////
183
- ///////////////////////////////////////////////////////////////////////////////
184
- async function main() {
185
- const packageJsonPath = Path.join(__dirname, '..', 'package.json');
186
- const packageJson = JSON.parse(await Fs.promises.readFile(packageJsonPath, 'utf-8'));
187
- const packageVersion = packageJson.version ?? 'unknown';
188
- const program = new Commander.Command();
189
- program
190
- .name('claude_stream_viewer')
191
- .description('Pretty-prints Claude Code consolidated stream-json events from stdin with colorized output.')
192
- .version(packageVersion)
193
- .option('--no-color', 'disable colored output')
194
- .parse(process.argv);
195
- const options = program.opts();
196
- if (options.color === false) {
197
- Chalk.level = 0;
198
- }
199
- const helper = new MainHelper();
200
- const readline = Readline.createInterface({
201
- input: process.stdin,
202
- crlfDelay: Infinity,
203
- });
204
- readline.on('line', (line) => {
205
- if (line.trim() === '')
206
- return;
207
- try {
208
- const parsed = JSON.parse(line);
209
- helper.handleEvent(parsed);
210
- }
211
- catch (err) {
212
- console.error(colors.error('Invalid JSON:'), line);
213
- }
214
- });
215
- await new Promise((resolve) => {
216
- readline.on('close', () => {
217
- console.log(colors.system('\n[stream ended]'));
218
- resolve();
219
- });
220
- });
221
- }
222
- ///////////////////////////////////////////////////////////////////////////////
223
- ///////////////////////////////////////////////////////////////////////////////
224
- //
225
- ///////////////////////////////////////////////////////////////////////////////
226
- ///////////////////////////////////////////////////////////////////////////////
227
- await main();
228
- //# sourceMappingURL=claude_stream_viewer%20copy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude_stream_viewer copy.js","sourceRoot":"","sources":["../src/claude_stream_viewer copy.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=claude_stream_viewer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude_stream_viewer.d.ts","sourceRoot":"","sources":["../src/claude_stream_viewer.ts"],"names":[],"mappings":""}
@@ -1,155 +0,0 @@
1
- #!/usr/bin/env node
2
- // Reads Claude API stream-json events line-by-line from stdin and pretty-prints
3
- // them with colorized output. Designed to wrap an upstream `claude --stream-json`
4
- // pipe, e.g. `claude … | npx claude_stream_viewer`.
5
- // Usage:
6
- // claude --stream-json | npx claude_stream_viewer
7
- //
8
- // claude --output-format stream-json --verbose --include-partial-messages --permission-mode auto -p "explain quantum computing like I'm 5" | npx claude_stream_viewer
9
- import Readline from 'node:readline';
10
- import Fs from 'node:fs';
11
- import * as Commander from 'commander';
12
- import Chalk from 'chalk';
13
- import Path from 'node:path';
14
- const __dirname = new URL('.', import.meta.url).pathname;
15
- const colors = {
16
- text: Chalk.white,
17
- tool: Chalk.cyan,
18
- system: Chalk.gray,
19
- error: Chalk.red,
20
- json: Chalk.dim,
21
- header: Chalk.yellow.bold,
22
- };
23
- ///////////////////////////////////////////////////////////////////////////////
24
- ///////////////////////////////////////////////////////////////////////////////
25
- // class MainHelper
26
- ///////////////////////////////////////////////////////////////////////////////
27
- ///////////////////////////////////////////////////////////////////////////////
28
- class MainHelper {
29
- static printText(text) {
30
- process.stdout.write(colors.text(text));
31
- }
32
- static printNewline() {
33
- process.stdout.write('\n');
34
- }
35
- static printHeader(label) {
36
- MainHelper.printNewline();
37
- console.log(colors.header(`\n=== ${label} ===`));
38
- }
39
- static printJSON(obj) {
40
- console.log(colors.json(JSON.stringify(obj, null, 2)));
41
- }
42
- static handleEvent(data) {
43
- try {
44
- // Newer SDKs wrap each event in a `stream_event` envelope.
45
- if (data.type === 'stream_event' && data.event) {
46
- const evt = data.event;
47
- if (evt.delta?.type === 'text_delta' && evt.delta.text) {
48
- MainHelper.printText(evt.delta.text);
49
- return;
50
- }
51
- if (evt.type === 'tool_use') {
52
- MainHelper.printHeader('TOOL USE');
53
- MainHelper.printJSON(evt);
54
- return;
55
- }
56
- // `content_block_delta` is the parent envelope of `text_delta` —
57
- // already rendered above, so skip it here to avoid duplicating
58
- // the text stream as a JSON dump.
59
- if (evt.type && evt.type !== 'content_block_delta') {
60
- MainHelper.printHeader(`EVENT: ${evt.type}`);
61
- MainHelper.printJSON(evt);
62
- return;
63
- }
64
- }
65
- // Legacy format: pre-`stream_event` SDKs emit raw `message_delta`
66
- // events with the text delta hanging off the root.
67
- if (data.type === 'message_delta') {
68
- const text = data.delta?.text;
69
- if (text) {
70
- MainHelper.printText(text);
71
- return;
72
- }
73
- }
74
- // Final assistant message bundling all content blocks for the turn.
75
- if (data.message?.content) {
76
- MainHelper.printHeader('FINAL MESSAGE');
77
- for (const block of data.message.content) {
78
- if (block.text) {
79
- console.log(colors.text(block.text));
80
- }
81
- }
82
- return;
83
- }
84
- // Unrecognized shape — dump it raw so the user can extend ClaudeEvent.
85
- MainHelper.printHeader('UNKNOWN EVENT');
86
- MainHelper.printJSON(data);
87
- }
88
- catch (err) {
89
- // Never let a single malformed event take down the stream — log and move on.
90
- console.error(colors.error('Error processing event:'), err);
91
- MainHelper.printJSON(data);
92
- }
93
- }
94
- }
95
- ///////////////////////////////////////////////////////////////////////////////
96
- ///////////////////////////////////////////////////////////////////////////////
97
- // function main
98
- ///////////////////////////////////////////////////////////////////////////////
99
- ///////////////////////////////////////////////////////////////////////////////
100
- async function main() {
101
- const packageJsonPath = Path.join(__dirname, '..', 'package.json');
102
- const packageJson = JSON.parse(await Fs.promises.readFile(packageJsonPath, 'utf-8'));
103
- const packageVersion = packageJson.version ?? 'unknown';
104
- ///////////////////////////////////////////////////////////////////////////////
105
- ///////////////////////////////////////////////////////////////////////////////
106
- //
107
- ///////////////////////////////////////////////////////////////////////////////
108
- ///////////////////////////////////////////////////////////////////////////////
109
- const program = new Commander.Command();
110
- program
111
- .name('claude_stream_viewer')
112
- .description('Pretty-prints Claude API stream-json events from stdin with colorized output.')
113
- .version(packageVersion)
114
- .option('--no-color', 'disable colored output')
115
- .parse(process.argv);
116
- const options = program.opts();
117
- ///////////////////////////////////////////////////////////////////////////////
118
- ///////////////////////////////////////////////////////////////////////////////
119
- //
120
- ///////////////////////////////////////////////////////////////////////////////
121
- ///////////////////////////////////////////////////////////////////////////////
122
- if (options.color === false) {
123
- Chalk.level = 0;
124
- }
125
- const readline = Readline.createInterface({
126
- input: process.stdin,
127
- crlfDelay: Infinity,
128
- });
129
- readline.on('line', (line) => {
130
- // stream-json pipes occasionally pad with blank lines between events.
131
- if (line.trim() === '')
132
- return;
133
- try {
134
- const parsed = JSON.parse(line);
135
- MainHelper.handleEvent(parsed);
136
- }
137
- catch (err) {
138
- console.error(colors.error('Invalid JSON:'), line);
139
- }
140
- });
141
- await new Promise((resolve) => {
142
- readline.on('close', () => {
143
- MainHelper.printNewline();
144
- console.log(colors.system('\n[stream ended]'));
145
- resolve();
146
- });
147
- });
148
- }
149
- ///////////////////////////////////////////////////////////////////////////////
150
- ///////////////////////////////////////////////////////////////////////////////
151
- //
152
- ///////////////////////////////////////////////////////////////////////////////
153
- ///////////////////////////////////////////////////////////////////////////////
154
- await main();
155
- //# sourceMappingURL=claude_stream_viewer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude_stream_viewer.js","sourceRoot":"","sources":["../src/claude_stream_viewer.ts"],"names":[],"mappings":"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"}