pulse-line 1.0.3 → 1.0.4

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 (90) hide show
  1. package/.claude-plugin/plugin.json +1 -0
  2. package/README.md +35 -5
  3. package/commands/disable.md +1 -1
  4. package/commands/enable.md +1 -1
  5. package/commands/timeline.md +31 -0
  6. package/dist/src/cli.js +187 -2
  7. package/dist/src/cli.js.map +1 -1
  8. package/dist/src/config/loader.js +5 -2
  9. package/dist/src/config/loader.js.map +1 -1
  10. package/dist/src/config/migrate-config.js +28 -1
  11. package/dist/src/config/migrate-config.js.map +1 -1
  12. package/dist/src/extractors/index.d.ts +2 -0
  13. package/dist/src/extractors/index.js +10 -1
  14. package/dist/src/extractors/index.js.map +1 -1
  15. package/dist/src/extractors/tool-timeline.d.ts +29 -0
  16. package/dist/src/extractors/tool-timeline.js +732 -0
  17. package/dist/src/extractors/tool-timeline.js.map +1 -0
  18. package/dist/src/formatters/index.d.ts +1 -1
  19. package/dist/src/formatters/index.js +2 -1
  20. package/dist/src/formatters/index.js.map +1 -1
  21. package/dist/src/formatters/layout.d.ts +2 -0
  22. package/dist/src/formatters/layout.js +69 -6
  23. package/dist/src/formatters/layout.js.map +1 -1
  24. package/dist/src/i18n/locales/en.js +14 -0
  25. package/dist/src/i18n/locales/en.js.map +1 -1
  26. package/dist/src/i18n/locales/zh.js +31 -17
  27. package/dist/src/i18n/locales/zh.js.map +1 -1
  28. package/dist/src/index.js +37 -2
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/themes/builtin/cyberpunk.js +1 -0
  31. package/dist/src/themes/builtin/cyberpunk.js.map +1 -1
  32. package/dist/src/themes/builtin/dark.js +1 -0
  33. package/dist/src/themes/builtin/dark.js.map +1 -1
  34. package/dist/src/themes/builtin/forest.js +1 -0
  35. package/dist/src/themes/builtin/forest.js.map +1 -1
  36. package/dist/src/themes/builtin/light.js +1 -0
  37. package/dist/src/themes/builtin/light.js.map +1 -1
  38. package/dist/src/themes/builtin/ocean.js +1 -0
  39. package/dist/src/themes/builtin/ocean.js.map +1 -1
  40. package/dist/src/themes/icon-sets/nerd.d.ts +1 -0
  41. package/dist/src/themes/icon-sets/nerd.js +2 -1
  42. package/dist/src/themes/icon-sets/nerd.js.map +1 -1
  43. package/dist/src/themes/icon-sets/text.d.ts +1 -0
  44. package/dist/src/themes/icon-sets/text.js +2 -1
  45. package/dist/src/themes/icon-sets/text.js.map +1 -1
  46. package/dist/src/themes/index.js +1 -0
  47. package/dist/src/themes/index.js.map +1 -1
  48. package/dist/src/tool-timeline/cache.d.ts +17 -0
  49. package/dist/src/tool-timeline/cache.js +407 -0
  50. package/dist/src/tool-timeline/cache.js.map +1 -0
  51. package/dist/src/types/pulse-config.d.ts +17 -0
  52. package/dist/src/types/pulse-config.js +21 -2
  53. package/dist/src/types/pulse-config.js.map +1 -1
  54. package/dist/src/types/theme.d.ts +1 -0
  55. package/dist/src/types/tool-timeline.d.ts +101 -0
  56. package/dist/src/types/tool-timeline.js +3 -0
  57. package/dist/src/types/tool-timeline.js.map +1 -0
  58. package/dist/src/utils/cache.js +4 -1
  59. package/dist/src/utils/cache.js.map +1 -1
  60. package/dist/src/utils/display-sanitize.js +2 -1
  61. package/dist/src/utils/display-sanitize.js.map +1 -1
  62. package/dist/src/utils/terminal-width.d.ts +12 -0
  63. package/dist/src/utils/terminal-width.js +89 -0
  64. package/dist/src/utils/terminal-width.js.map +1 -0
  65. package/dist/test/formatters.test.js +40 -0
  66. package/dist/test/formatters.test.js.map +1 -1
  67. package/dist/test/migrate-config.test.js +38 -1
  68. package/dist/test/migrate-config.test.js.map +1 -1
  69. package/dist/test/terminal-width.test.d.ts +1 -0
  70. package/dist/test/terminal-width.test.js +98 -0
  71. package/dist/test/terminal-width.test.js.map +1 -0
  72. package/dist/test/themes.test.js +6 -1
  73. package/dist/test/themes.test.js.map +1 -1
  74. package/dist/test/tool-analytics-index.test.d.ts +1 -0
  75. package/dist/test/tool-analytics-index.test.js +163 -0
  76. package/dist/test/tool-analytics-index.test.js.map +1 -0
  77. package/dist/test/tool-timeline-cache.test.d.ts +1 -0
  78. package/dist/test/tool-timeline-cache.test.js +239 -0
  79. package/dist/test/tool-timeline-cache.test.js.map +1 -0
  80. package/dist/test/tool-timeline-cli.test.d.ts +1 -0
  81. package/dist/test/tool-timeline-cli.test.js +146 -0
  82. package/dist/test/tool-timeline-cli.test.js.map +1 -0
  83. package/dist/test/tool-timeline-normalize.test.d.ts +1 -0
  84. package/dist/test/tool-timeline-normalize.test.js +205 -0
  85. package/dist/test/tool-timeline-normalize.test.js.map +1 -0
  86. package/dist/test/tool-timeline-render.test.d.ts +1 -0
  87. package/dist/test/tool-timeline-render.test.js +243 -0
  88. package/dist/test/tool-timeline-render.test.js.map +1 -0
  89. package/hooks/hooks.json +36 -0
  90. package/package.json +1 -1
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const fs = __importStar(require("fs"));
42
+ const os = __importStar(require("os"));
43
+ const path = __importStar(require("path"));
44
+ const cache_1 = require("../src/tool-timeline/cache");
45
+ function withTimelineCache(fn) {
46
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pulse-timeline-cache-'));
47
+ const prev = process.env.PULSE_CACHE_DIR_OVERRIDE;
48
+ process.env.PULSE_CACHE_DIR_OVERRIDE = dir;
49
+ try {
50
+ return fn(dir);
51
+ }
52
+ finally {
53
+ if (prev === undefined)
54
+ delete process.env.PULSE_CACHE_DIR_OVERRIDE;
55
+ else
56
+ process.env.PULSE_CACHE_DIR_OVERRIDE = prev;
57
+ fs.rmSync(dir, { recursive: true, force: true });
58
+ }
59
+ }
60
+ function event(overrides = {}) {
61
+ return {
62
+ id: overrides.id || `claude-code:s1:${overrides.toolUseId || Math.random()}`,
63
+ provider: 'claude-code',
64
+ sessionId: 's1',
65
+ toolUseId: overrides.toolUseId,
66
+ toolName: overrides.toolName || 'Bash',
67
+ displayName: overrides.displayName || overrides.toolName || 'Bash',
68
+ summary: overrides.summary || 'npm test',
69
+ status: overrides.status || 'success',
70
+ endedAt: overrides.endedAt || new Date().toISOString(),
71
+ durationMs: overrides.durationMs,
72
+ ...overrides
73
+ };
74
+ }
75
+ (0, node_test_1.test)('readToolTimelineCache returns null when file does not exist', () => {
76
+ withTimelineCache(() => {
77
+ node_assert_1.default.strictEqual((0, cache_1.readToolTimelineCache)('missing'), null);
78
+ });
79
+ });
80
+ (0, node_test_1.test)('appendToolTimelineEvent creates cache file and stats', () => {
81
+ withTimelineCache(() => {
82
+ (0, cache_1.appendToolTimelineEvent)(event({ toolUseId: 'a', durationMs: 100 }));
83
+ (0, cache_1.appendToolTimelineEvent)(event({ toolUseId: 'b', status: 'failure', durationMs: 300 }));
84
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
85
+ node_assert_1.default.ok(cache);
86
+ node_assert_1.default.strictEqual(cache.version, 2);
87
+ node_assert_1.default.strictEqual(cache.events.length, 2);
88
+ node_assert_1.default.strictEqual(cache.stats.total, 2);
89
+ node_assert_1.default.strictEqual(cache.stats.success, 1);
90
+ node_assert_1.default.strictEqual(cache.stats.failure, 1);
91
+ node_assert_1.default.strictEqual(cache.stats.avgDurationMs, 200);
92
+ node_assert_1.default.strictEqual(cache.stats.slowest?.durationMs, 300);
93
+ node_assert_1.default.strictEqual(cache.analyticsStats?.totalToolCalls, 2);
94
+ node_assert_1.default.ok(fs.existsSync((0, cache_1.getToolTimelineCachePath)('s1')));
95
+ });
96
+ });
97
+ (0, node_test_1.test)('appendToolTimelineEvent keeps only latest maxEvents', () => {
98
+ withTimelineCache(() => {
99
+ (0, cache_1.appendToolTimelineEvent)(event({ id: '1', summary: 'one' }), { maxEvents: 2 });
100
+ (0, cache_1.appendToolTimelineEvent)(event({ id: '2', summary: 'two' }), { maxEvents: 2 });
101
+ (0, cache_1.appendToolTimelineEvent)(event({ id: '3', summary: 'three' }), { maxEvents: 2 });
102
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
103
+ node_assert_1.default.ok(cache);
104
+ node_assert_1.default.deepStrictEqual(cache.events.map((e) => e.summary), ['two', 'three']);
105
+ });
106
+ });
107
+ (0, node_test_1.test)('appendToolTimelineEvent deduplicates by toolUseId', () => {
108
+ withTimelineCache(() => {
109
+ (0, cache_1.appendToolTimelineEvent)(event({ toolUseId: 'same', summary: 'old' }));
110
+ (0, cache_1.appendToolTimelineEvent)(event({ toolUseId: 'same', summary: 'new' }));
111
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
112
+ node_assert_1.default.ok(cache);
113
+ node_assert_1.default.strictEqual(cache.events.length, 1);
114
+ node_assert_1.default.strictEqual(cache.events[0].summary, 'new');
115
+ });
116
+ });
117
+ (0, node_test_1.test)('corrupt cache is ignored and append rebuilds it', () => {
118
+ withTimelineCache(() => {
119
+ const cachePath = (0, cache_1.getToolTimelineCachePath)('s1');
120
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
121
+ fs.writeFileSync(cachePath, '{not-json');
122
+ node_assert_1.default.strictEqual((0, cache_1.readToolTimelineCache)('s1'), null);
123
+ (0, cache_1.appendToolTimelineEvent)(event({ summary: 'rebuilt' }));
124
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
125
+ node_assert_1.default.ok(cache);
126
+ node_assert_1.default.strictEqual(cache.events[0].summary, 'rebuilt');
127
+ });
128
+ });
129
+ (0, node_test_1.test)('clearToolTimelineCache removes a session file', () => {
130
+ withTimelineCache(() => {
131
+ (0, cache_1.appendToolTimelineEvent)(event());
132
+ node_assert_1.default.ok((0, cache_1.readToolTimelineCache)('s1'));
133
+ (0, cache_1.clearToolTimelineCache)('s1');
134
+ node_assert_1.default.strictEqual((0, cache_1.readToolTimelineCache)('s1'), null);
135
+ });
136
+ });
137
+ (0, node_test_1.test)('listToolTimelineSessions sorts by mtime descending', () => {
138
+ withTimelineCache(() => {
139
+ (0, cache_1.appendToolTimelineEvent)(event({ sessionId: 'older', id: 'older' }));
140
+ const olderPath = (0, cache_1.getToolTimelineCachePath)('older');
141
+ fs.utimesSync(olderPath, new Date(1000), new Date(1000));
142
+ (0, cache_1.appendToolTimelineEvent)(event({ sessionId: 'newer', id: 'newer' }));
143
+ const sessions = (0, cache_1.listToolTimelineSessions)();
144
+ node_assert_1.default.strictEqual(sessions[0].sessionId, 'newer');
145
+ node_assert_1.default.strictEqual(sessions[1].sessionId, 'older');
146
+ });
147
+ });
148
+ (0, node_test_1.test)('computeToolTimelineStats ignores missing durations', () => {
149
+ const stats = (0, cache_1.computeToolTimelineStats)([
150
+ event({ id: '1', durationMs: 100 }),
151
+ event({ id: '2', durationMs: undefined, status: 'unknown' })
152
+ ]);
153
+ node_assert_1.default.strictEqual(stats.total, 2);
154
+ node_assert_1.default.strictEqual(stats.unknown, 1);
155
+ node_assert_1.default.strictEqual(stats.avgDurationMs, 100);
156
+ node_assert_1.default.strictEqual(stats.totalDurationMs, 100);
157
+ });
158
+ (0, node_test_1.test)('computeToolAnalyticsStats aggregates main and subagent calls', () => {
159
+ const stats = (0, cache_1.computeToolAnalyticsStats)([
160
+ event({ id: '1', toolName: 'Read', displayName: 'Read', durationMs: 40 }),
161
+ event({
162
+ id: '2',
163
+ toolName: 'Agent',
164
+ displayName: 'Agent',
165
+ summary: 'Explore',
166
+ actorName: 'Explore',
167
+ agentId: 'agent_1',
168
+ durationMs: 18000,
169
+ subagentMetrics: {
170
+ totalToolUseCount: 7,
171
+ totalTokens: 42100,
172
+ totalDurationMs: 18400
173
+ }
174
+ }),
175
+ event({ id: '3', toolName: 'Bash', displayName: 'Bash', status: 'failure', durationMs: 9000 })
176
+ ]);
177
+ node_assert_1.default.strictEqual(stats.mainAgentToolCalls, 3);
178
+ node_assert_1.default.strictEqual(stats.subagentToolCalls, 7);
179
+ node_assert_1.default.strictEqual(stats.totalToolCalls, 10);
180
+ node_assert_1.default.strictEqual(stats.subagentCount, 1);
181
+ node_assert_1.default.strictEqual(stats.bySubagent.Explore.toolCalls, 7);
182
+ node_assert_1.default.strictEqual(stats.bySubagent.Explore.tokens, 42100);
183
+ node_assert_1.default.strictEqual(stats.subagentTokens, 42100);
184
+ node_assert_1.default.strictEqual(stats.slowest?.toolName, 'Agent');
185
+ node_assert_1.default.strictEqual(stats.slowest?.durationMs, 18400);
186
+ node_assert_1.default.strictEqual(stats.successRate, 67);
187
+ });
188
+ (0, node_test_1.test)('upsertToolTimelineAgentMeta adds and updates agent metadata', () => {
189
+ withTimelineCache(() => {
190
+ (0, cache_1.appendToolTimelineEvent)(event({
191
+ id: 'agent-call',
192
+ toolName: 'Agent',
193
+ displayName: 'Agent',
194
+ agentId: 'agent_1',
195
+ actorName: 'Explore',
196
+ subagentMetrics: { totalToolUseCount: 3 }
197
+ }));
198
+ (0, cache_1.upsertToolTimelineAgentMeta)('s1', {
199
+ agentId: 'agent_1',
200
+ agentType: 'Explore',
201
+ displayName: 'Explore',
202
+ transcriptPath: 'old.jsonl',
203
+ lastSeenAt: '2026-05-15T00:00:00.000Z'
204
+ });
205
+ (0, cache_1.upsertToolTimelineAgentMeta)('s1', {
206
+ agentId: 'agent_1',
207
+ agentType: 'Review',
208
+ displayName: 'Review',
209
+ transcriptPath: 'new.jsonl',
210
+ lastSeenAt: '2026-05-15T00:01:00.000Z'
211
+ });
212
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
213
+ node_assert_1.default.ok(cache);
214
+ node_assert_1.default.strictEqual(cache.version, 2);
215
+ node_assert_1.default.strictEqual(cache.agents?.agent_1.displayName, 'Review');
216
+ node_assert_1.default.strictEqual(cache.agents?.agent_1.transcriptPath, 'new.jsonl');
217
+ node_assert_1.default.strictEqual(cache.analyticsStats?.subagentToolCalls, 3);
218
+ });
219
+ });
220
+ (0, node_test_1.test)('readToolTimelineCache accepts legacy version 1 cache', () => {
221
+ withTimelineCache(() => {
222
+ const cachePath = (0, cache_1.getToolTimelineCachePath)('s1');
223
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
224
+ fs.writeFileSync(cachePath, JSON.stringify({
225
+ version: 1,
226
+ provider: 'claude-code',
227
+ sessionId: 's1',
228
+ updatedAt: new Date().toISOString(),
229
+ events: [event({ id: 'legacy', durationMs: 100 })],
230
+ stats: { total: 1, success: 1, failure: 0, unknown: 0, byTool: { Bash: 1 } }
231
+ }));
232
+ const cache = (0, cache_1.readToolTimelineCache)('s1');
233
+ node_assert_1.default.ok(cache);
234
+ node_assert_1.default.strictEqual(cache.version, 1);
235
+ node_assert_1.default.strictEqual(cache.events.length, 1);
236
+ node_assert_1.default.strictEqual(cache.analyticsStats?.totalToolCalls, 1);
237
+ });
238
+ });
239
+ //# sourceMappingURL=tool-timeline-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-timeline-cache.test.js","sourceRoot":"","sources":["../../test/tool-timeline-cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const fs = __importStar(require("fs"));
42
+ const os = __importStar(require("os"));
43
+ const path = __importStar(require("path"));
44
+ const child_process_1 = require("child_process");
45
+ const cache_1 = require("../src/tool-timeline/cache");
46
+ function withTimelineCache(fn) {
47
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pulse-timeline-cli-'));
48
+ const prev = process.env.PULSE_CACHE_DIR_OVERRIDE;
49
+ process.env.PULSE_CACHE_DIR_OVERRIDE = dir;
50
+ try {
51
+ return fn(dir);
52
+ }
53
+ finally {
54
+ if (prev === undefined)
55
+ delete process.env.PULSE_CACHE_DIR_OVERRIDE;
56
+ else
57
+ process.env.PULSE_CACHE_DIR_OVERRIDE = prev;
58
+ fs.rmSync(dir, { recursive: true, force: true });
59
+ }
60
+ }
61
+ function runCli(args, input) {
62
+ return (0, child_process_1.spawnSync)('node', ['dist/src/cli.js', ...args], {
63
+ cwd: path.resolve(__dirname, '..', '..'),
64
+ input,
65
+ encoding: 'utf8',
66
+ env: { ...process.env }
67
+ });
68
+ }
69
+ const hookInput = JSON.stringify({
70
+ session_id: 'cli-session',
71
+ hook_event_name: 'PostToolUse',
72
+ tool_name: 'Bash',
73
+ tool_input: { command: 'npm test' },
74
+ tool_response: { stdout: 'ok' },
75
+ tool_use_id: 'toolu_cli_1',
76
+ duration_ms: 50
77
+ });
78
+ (0, node_test_1.test)('CLI hook collect-tool-event writes cache and prints no stdout', () => {
79
+ withTimelineCache(() => {
80
+ const result = runCli(['hook', 'collect-tool-event', '--provider', 'claude-code'], hookInput);
81
+ node_assert_1.default.strictEqual(result.status, 0);
82
+ node_assert_1.default.strictEqual(result.stdout, '');
83
+ const cache = (0, cache_1.readToolTimelineCache)('cli-session');
84
+ node_assert_1.default.ok(cache);
85
+ node_assert_1.default.strictEqual(cache.events.length, 1);
86
+ node_assert_1.default.strictEqual(cache.events[0].summary, 'npm test');
87
+ });
88
+ });
89
+ (0, node_test_1.test)('CLI hook ignores invalid JSON with exit code 0', () => {
90
+ withTimelineCache(() => {
91
+ const result = runCli(['hook', 'collect-tool-event', '--provider', 'claude-code'], '{bad');
92
+ node_assert_1.default.strictEqual(result.status, 0);
93
+ node_assert_1.default.strictEqual((0, cache_1.readToolTimelineCache)('cli-session'), null);
94
+ });
95
+ });
96
+ (0, node_test_1.test)('CLI hook collect-subagent-event writes metadata and prints no stdout', () => {
97
+ withTimelineCache(() => {
98
+ const input = JSON.stringify({
99
+ session_id: 'cli-session',
100
+ hook_event_name: 'SubagentStop',
101
+ agent_id: 'agent_cli_1',
102
+ agent_type: 'Explore',
103
+ agent_transcript_path: 'D:\\tmp\\agent.jsonl'
104
+ });
105
+ const result = runCli(['hook', 'collect-subagent-event', '--provider', 'claude-code'], input);
106
+ node_assert_1.default.strictEqual(result.status, 0);
107
+ node_assert_1.default.strictEqual(result.stdout, '');
108
+ const cache = (0, cache_1.readToolTimelineCache)('cli-session');
109
+ node_assert_1.default.ok(cache);
110
+ node_assert_1.default.strictEqual(cache.agents?.agent_cli_1.displayName, 'Explore');
111
+ node_assert_1.default.strictEqual(cache.events.length, 0);
112
+ });
113
+ });
114
+ (0, node_test_1.test)('CLI hook collect-subagent-event ignores invalid JSON with exit code 0', () => {
115
+ withTimelineCache(() => {
116
+ const result = runCli(['hook', 'collect-subagent-event', '--provider', 'claude-code'], '{bad');
117
+ node_assert_1.default.strictEqual(result.status, 0);
118
+ node_assert_1.default.strictEqual(result.stdout, '');
119
+ });
120
+ });
121
+ (0, node_test_1.test)('CLI timeline supports json, last, and clear', () => {
122
+ withTimelineCache(() => {
123
+ runCli(['hook', 'collect-tool-event', '--provider', 'claude-code'], hookInput);
124
+ runCli(['hook', 'collect-tool-event', '--provider', 'claude-code'], JSON.stringify({
125
+ ...JSON.parse(hookInput),
126
+ tool_use_id: 'toolu_cli_2',
127
+ tool_input: { command: 'npm run build' }
128
+ }));
129
+ const json = runCli(['timeline', '--session', 'cli-session', '--last', '1', '--json']);
130
+ node_assert_1.default.strictEqual(json.status, 0);
131
+ const parsed = JSON.parse(json.stdout);
132
+ node_assert_1.default.strictEqual(parsed.events.length, 1);
133
+ node_assert_1.default.strictEqual(parsed.events[0].summary, 'npm run build');
134
+ node_assert_1.default.ok(parsed.analyticsStats);
135
+ node_assert_1.default.strictEqual(parsed.analyticsStats.totalToolCalls, 1);
136
+ const table = runCli(['timeline', '--session', 'cli-session', '--last', '1']);
137
+ node_assert_1.default.strictEqual(table.status, 0);
138
+ node_assert_1.default.ok(table.stdout.includes('Session: cli-session'));
139
+ node_assert_1.default.ok(table.stdout.includes('npm run build'));
140
+ node_assert_1.default.ok(!table.stdout.includes('npm test'));
141
+ const clear = runCli(['timeline', 'clear', '--session', 'cli-session']);
142
+ node_assert_1.default.strictEqual(clear.status, 0);
143
+ node_assert_1.default.strictEqual((0, cache_1.readToolTimelineCache)('cli-session'), null);
144
+ });
145
+ });
146
+ //# sourceMappingURL=tool-timeline-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-timeline-cli.test.js","sourceRoot":"","sources":["../../test/tool-timeline-cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const node_assert_1 = __importDefault(require("node:assert"));
41
+ const path = __importStar(require("path"));
42
+ const tool_timeline_1 = require("../src/extractors/tool-timeline");
43
+ (0, node_test_1.test)('normalizeClaudeToolHook accepts successful Bash hook', () => {
44
+ const event = (0, tool_timeline_1.normalizeClaudeToolHook)({
45
+ session_id: 's1',
46
+ hook_event_name: 'PostToolUse',
47
+ tool_name: 'Bash',
48
+ tool_input: { command: 'npm test\nsecond line', description: 'run tests' },
49
+ tool_response: { stdout: 'ok\nnext' },
50
+ tool_use_id: 'toolu_1',
51
+ duration_ms: 1280
52
+ });
53
+ node_assert_1.default.ok(event);
54
+ node_assert_1.default.strictEqual(event.id, 'claude-code:s1:toolu_1');
55
+ node_assert_1.default.strictEqual(event.status, 'success');
56
+ node_assert_1.default.strictEqual(event.displayName, 'Bash');
57
+ node_assert_1.default.strictEqual(event.actorKind, 'main-agent');
58
+ node_assert_1.default.strictEqual(event.summary, 'run tests: npm test');
59
+ node_assert_1.default.strictEqual(event.target?.kind, 'command');
60
+ node_assert_1.default.strictEqual(event.durationMs, 1280);
61
+ node_assert_1.default.strictEqual(event.responseSummary, 'stdout: ok');
62
+ });
63
+ (0, node_test_1.test)('normalizeClaudeToolHook extracts Agent telemetry', () => {
64
+ const event = (0, tool_timeline_1.normalizeClaudeToolHook)({
65
+ session_id: 's1',
66
+ hook_event_name: 'PostToolUse',
67
+ tool_name: 'Agent',
68
+ tool_input: {
69
+ subagent_type: 'Explore',
70
+ description: 'Explore codebase'
71
+ },
72
+ tool_response: {
73
+ agentId: 'agent_explore_1',
74
+ status: 'success',
75
+ totalToolUseCount: 7,
76
+ totalTokens: 42100,
77
+ totalDurationMs: 18400
78
+ },
79
+ tool_use_id: 'toolu_agent_1',
80
+ duration_ms: 19000
81
+ });
82
+ node_assert_1.default.ok(event);
83
+ node_assert_1.default.strictEqual(event.displayName, 'Agent');
84
+ node_assert_1.default.strictEqual(event.summary, 'Explore');
85
+ node_assert_1.default.strictEqual(event.actorKind, 'main-agent');
86
+ node_assert_1.default.strictEqual(event.actorName, 'Explore');
87
+ node_assert_1.default.strictEqual(event.agentId, 'agent_explore_1');
88
+ node_assert_1.default.strictEqual(event.subagentType, 'Explore');
89
+ node_assert_1.default.strictEqual(event.subagentMetrics?.totalToolUseCount, 7);
90
+ node_assert_1.default.strictEqual(event.subagentMetrics?.totalTokens, 42100);
91
+ node_assert_1.default.strictEqual(event.subagentMetrics?.totalDurationMs, 18400);
92
+ node_assert_1.default.strictEqual(event.durationMs, 18400);
93
+ });
94
+ (0, node_test_1.test)('normalizeClaudeToolHook handles Agent without telemetry', () => {
95
+ const event = (0, tool_timeline_1.normalizeClaudeToolHook)({
96
+ session_id: 's1',
97
+ hook_event_name: 'PostToolUse',
98
+ tool_name: 'Agent',
99
+ tool_input: { description: 'Review changes' },
100
+ tool_response: {},
101
+ duration_ms: 1200
102
+ });
103
+ node_assert_1.default.ok(event);
104
+ node_assert_1.default.strictEqual(event.summary, 'Review changes');
105
+ node_assert_1.default.strictEqual(event.subagentMetrics, undefined);
106
+ node_assert_1.default.strictEqual(event.durationMs, 1200);
107
+ });
108
+ (0, node_test_1.test)('normalizeClaudeSubagentStopHook extracts agent metadata', () => {
109
+ const meta = (0, tool_timeline_1.normalizeClaudeSubagentStopHook)({
110
+ session_id: 's1',
111
+ hook_event_name: 'SubagentStop',
112
+ agent_id: 'agent_explore_1',
113
+ agent_type: 'Explore',
114
+ agent_transcript_path: 'D:\\tmp\\agent.jsonl'
115
+ });
116
+ node_assert_1.default.ok(meta);
117
+ node_assert_1.default.strictEqual(meta.agentId, 'agent_explore_1');
118
+ node_assert_1.default.strictEqual(meta.agentType, 'Explore');
119
+ node_assert_1.default.strictEqual(meta.displayName, 'Explore');
120
+ node_assert_1.default.strictEqual(meta.transcriptPath, 'D:\\tmp\\agent.jsonl');
121
+ });
122
+ (0, node_test_1.test)('normalizeClaudeSubagentStopHook rejects missing agent id', () => {
123
+ node_assert_1.default.strictEqual((0, tool_timeline_1.normalizeClaudeSubagentStopHook)({
124
+ session_id: 's1',
125
+ hook_event_name: 'SubagentStop'
126
+ }), null);
127
+ });
128
+ (0, node_test_1.test)('normalizeClaudeToolHook accepts failed Bash hook', () => {
129
+ const event = (0, tool_timeline_1.normalizeClaudeToolHook)({
130
+ session_id: 's1',
131
+ hook_event_name: 'PostToolUseFailure',
132
+ tool_name: 'Bash',
133
+ tool_input: { command: 'npm test' },
134
+ error: 'failed hard\nsecret line'
135
+ });
136
+ node_assert_1.default.ok(event);
137
+ node_assert_1.default.strictEqual(event.status, 'failure');
138
+ node_assert_1.default.strictEqual(event.errorSummary, 'failed hard');
139
+ });
140
+ (0, node_test_1.test)('normalizeClaudeToolHook rejects missing required fields', () => {
141
+ node_assert_1.default.strictEqual((0, tool_timeline_1.normalizeClaudeToolHook)({
142
+ hook_event_name: 'PostToolUse',
143
+ tool_name: 'Bash'
144
+ }), null);
145
+ node_assert_1.default.strictEqual((0, tool_timeline_1.normalizeClaudeToolHook)({
146
+ hook_event_name: 'PostToolUse',
147
+ session_id: 's1'
148
+ }), null);
149
+ node_assert_1.default.strictEqual((0, tool_timeline_1.normalizeClaudeToolHook)({
150
+ hook_event_name: 'PreToolUse',
151
+ session_id: 's1',
152
+ tool_name: 'Bash'
153
+ }), null);
154
+ });
155
+ (0, node_test_1.test)('normalizeClaudeToolHook ignores invalid duration', () => {
156
+ const event = (0, tool_timeline_1.normalizeClaudeToolHook)({
157
+ session_id: 's1',
158
+ hook_event_name: 'PostToolUse',
159
+ tool_name: 'Bash',
160
+ tool_input: { command: 'npm test' },
161
+ duration_ms: -1
162
+ });
163
+ node_assert_1.default.ok(event);
164
+ node_assert_1.default.strictEqual(event.durationMs, undefined);
165
+ });
166
+ (0, node_test_1.test)('summarizeTool extracts file and query targets', () => {
167
+ const read = (0, tool_timeline_1.summarizeTool)('Read', { file_path: 'D:\\code\\status-bar-cc\\src\\index.ts' }, 'D:\\code\\status-bar-cc');
168
+ node_assert_1.default.strictEqual(read.target?.kind, 'file');
169
+ node_assert_1.default.strictEqual(read.summary, 'src\\index.ts');
170
+ const edit = (0, tool_timeline_1.summarizeTool)('Edit', { file_path: '/repo/src/index.ts' }, '/repo');
171
+ node_assert_1.default.strictEqual(edit.summary, `edit ${path.join('src', 'index.ts')}`);
172
+ const multi = (0, tool_timeline_1.summarizeTool)('MultiEdit', {
173
+ file_path: '/repo/src/index.ts',
174
+ edits: [{}, {}]
175
+ }, '/repo');
176
+ node_assert_1.default.strictEqual(multi.summary, `multi-edit ${path.join('src', 'index.ts')} (2)`);
177
+ const grep = (0, tool_timeline_1.summarizeTool)('Grep', { pattern: 'TODO', path: 'src' });
178
+ node_assert_1.default.strictEqual(grep.target?.kind, 'query');
179
+ node_assert_1.default.ok(grep.summary.includes('grep TODO'));
180
+ });
181
+ (0, node_test_1.test)('summarizeTool extracts web and MCP targets', () => {
182
+ const fetch = (0, tool_timeline_1.summarizeTool)('WebFetch', { url: 'https://example.com/docs/page?q=1' });
183
+ node_assert_1.default.strictEqual(fetch.target?.kind, 'url');
184
+ node_assert_1.default.strictEqual(fetch.summary, 'fetch example.com/docs/page');
185
+ const search = (0, tool_timeline_1.summarizeTool)('WebSearch', { query: 'claude code hooks' });
186
+ node_assert_1.default.strictEqual(search.summary, 'search claude code hooks');
187
+ const mcp = (0, tool_timeline_1.summarizeTool)('mcp__fs__read', {});
188
+ node_assert_1.default.strictEqual(mcp.displayName, 'MCP');
189
+ node_assert_1.default.strictEqual(mcp.summary, 'mcp fs.read');
190
+ node_assert_1.default.strictEqual(mcp.target?.kind, 'mcp');
191
+ });
192
+ (0, node_test_1.test)('summaries remove ANSI, newlines, and truncate long commands', () => {
193
+ const summary = (0, tool_timeline_1.summarizeTool)('Bash', {
194
+ command: `\x1b[31m${'a'.repeat(120)}\x1b[0m\nnext`
195
+ });
196
+ node_assert_1.default.ok(!summary.summary.includes('\x1b'));
197
+ node_assert_1.default.ok(!summary.summary.includes('\n'));
198
+ node_assert_1.default.ok(summary.summary.length <= 80);
199
+ node_assert_1.default.ok(summary.summary.endsWith('...'));
200
+ });
201
+ (0, node_test_1.test)('relativeToCwd keeps outside paths unchanged', () => {
202
+ node_assert_1.default.strictEqual((0, tool_timeline_1.relativeToCwd)('/repo/src/index.ts', '/repo'), path.join('src', 'index.ts'));
203
+ node_assert_1.default.strictEqual((0, tool_timeline_1.relativeToCwd)('/other/file.ts', '/repo'), '/other/file.ts');
204
+ });
205
+ //# sourceMappingURL=tool-timeline-normalize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-timeline-normalize.test.js","sourceRoot":"","sources":["../../test/tool-timeline-normalize.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};