claude-code-templates 1.5.4 → 1.5.5

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/analytics.js +47 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-templates",
3
- "version": "1.5.4",
3
+ "version": "1.5.5",
4
4
  "description": "CLI tool to setup Claude Code configurations with framework-specific commands, automation hooks and MCP Servers for your projects",
5
5
  "main": "src/index.js",
6
6
  "bin": {
package/src/analytics.js CHANGED
@@ -377,7 +377,7 @@ class ClaudeAnalytics {
377
377
  // Read the actual conversation file
378
378
  const content = await fs.readFile(session.filePath, 'utf8');
379
379
  const lines = content.trim().split('\n').filter(line => line.trim());
380
- const messages = lines.map(line => {
380
+ const rawMessages = lines.map(line => {
381
381
  try {
382
382
  return JSON.parse(line);
383
383
  } catch {
@@ -385,6 +385,36 @@ class ClaudeAnalytics {
385
385
  }
386
386
  }).filter(Boolean);
387
387
 
388
+ // Extract actual messages from Claude Code format
389
+ const messages = rawMessages.map(item => {
390
+ if (item.message && item.message.role) {
391
+ let content = '';
392
+
393
+ if (typeof item.message.content === 'string') {
394
+ content = item.message.content;
395
+ } else if (Array.isArray(item.message.content)) {
396
+ content = item.message.content
397
+ .map(block => {
398
+ if (block.type === 'text') return block.text;
399
+ if (block.type === 'tool_use') return `[Tool: ${block.name}]`;
400
+ if (block.type === 'tool_result') return '[Tool Result]';
401
+ return block.content || '';
402
+ })
403
+ .join('\n');
404
+ } else if (item.message.content && item.message.content.length) {
405
+ content = item.message.content[0].text || '';
406
+ }
407
+
408
+ return {
409
+ role: item.message.role,
410
+ content: content || 'No content',
411
+ timestamp: item.timestamp,
412
+ type: item.type
413
+ };
414
+ }
415
+ return null;
416
+ }).filter(Boolean);
417
+
388
418
  res.json({
389
419
  session: session,
390
420
  messages: messages,
@@ -1006,6 +1036,16 @@ async function createWebDashboard() {
1006
1036
  return \`\${days}d ago\`;
1007
1037
  }
1008
1038
 
1039
+ function formatMessageTime(timestamp) {
1040
+ const date = new Date(timestamp);
1041
+ return date.toLocaleTimeString('en-US', {
1042
+ hour12: false,
1043
+ hour: '2-digit',
1044
+ minute: '2-digit',
1045
+ second: '2-digit'
1046
+ });
1047
+ }
1048
+
1009
1049
  // Filter button handlers
1010
1050
  document.addEventListener('DOMContentLoaded', function() {
1011
1051
  const filterButtons = document.querySelectorAll('.filter-btn');
@@ -1111,7 +1151,9 @@ async function createWebDashboard() {
1111
1151
  <div class="message">
1112
1152
  <div class="message-header">
1113
1153
  <div class="message-role \${message.role}">\${message.role}</div>
1114
- <div class="message-time">message #\${index + 1}</div>
1154
+ <div class="message-time">
1155
+ #\${index + 1} • \${message.timestamp ? formatMessageTime(message.timestamp) : 'unknown time'}
1156
+ </div>
1115
1157
  </div>
1116
1158
  <div class="message-content">\${truncateContent(message.content || 'no content')}</div>
1117
1159
  </div>
@@ -1124,10 +1166,11 @@ async function createWebDashboard() {
1124
1166
  }
1125
1167
  }
1126
1168
 
1127
- function truncateContent(content, maxLength = 500) {
1169
+ function truncateContent(content, maxLength = 1000) {
1128
1170
  if (typeof content !== 'string') return 'no content';
1171
+ if (!content.trim()) return 'empty message';
1129
1172
  if (content.length <= maxLength) return content;
1130
- return content.substring(0, maxLength) + '...';
1173
+ return content.substring(0, maxLength) + '\\n\\n[... message truncated ...]';
1131
1174
  }
1132
1175
 
1133
1176
  function formatBytes(bytes) {