claude-code-templates 1.28.11 → 1.28.13

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-templates",
3
- "version": "1.28.11",
3
+ "version": "1.28.13",
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": {
@@ -52,11 +52,12 @@
52
52
  top: 20px;
53
53
  left: 20px;
54
54
  background: rgba(10, 10, 15, 0.8);
55
- padding: 20px;
56
- border-radius: 8px;
55
+ padding: 30px;
56
+ border-radius: 12px;
57
57
  border: 1px solid rgba(255,255,255,0.1);
58
58
  backdrop-filter: blur(10px);
59
59
  pointer-events: auto;
60
+ min-width: 280px;
60
61
  }
61
62
 
62
63
  .current-date {
@@ -64,14 +65,15 @@
64
65
  }
65
66
 
66
67
  .stat-line {
67
- font-size: 13px;
68
- margin: 5px 0;
68
+ font-size: 16px;
69
+ margin: 8px 0;
69
70
  opacity: 0.9;
70
71
  }
71
72
 
72
73
  .stat-value {
73
74
  color: var(--text-accent);
74
75
  font-weight: 600;
76
+ font-size: 18px;
75
77
  }
76
78
 
77
79
  .legend {
@@ -412,6 +414,8 @@
412
414
  let startTime = null;
413
415
  let currentDayIndex = 0;
414
416
  let stats = { conversations: 0, components: 0, tools: 0 };
417
+ let statsTarget = { conversations: 0, components: 0, tools: 0 }; // Target values for animation
418
+ let statsDisplay = { conversations: 0, components: 0, tools: 0 }; // Current animated values
415
419
  let processedEvents = new Set();
416
420
  let shownMilestones = new Set();
417
421
  let toolNodes = new Map(); // Map of tool name -> tool node
@@ -1915,7 +1919,7 @@
1915
1919
 
1916
1920
  if (event.type === 'conversation') {
1917
1921
  console.log(`🎬 Processing conversation: ${event.count} conversations`);
1918
- stats.conversations += event.count;
1922
+ statsTarget.conversations += event.count;
1919
1923
 
1920
1924
  // Process models using actual counts
1921
1925
  if (event.models && event.models.length > 0) {
@@ -1958,8 +1962,8 @@
1958
1962
  node.addUse();
1959
1963
  }
1960
1964
 
1961
- // Update stats
1962
- stats.tools += event.count;
1965
+ // Update stats target (will animate gradually)
1966
+ statsTarget.tools += event.count;
1963
1967
 
1964
1968
  // Create beam - OPTIMIZED: Add to queue instead of directly to beams
1965
1969
  const beam = new Beam(node, event.toolName);
@@ -1976,8 +1980,8 @@
1976
1980
  node.addUse();
1977
1981
  }
1978
1982
 
1979
- // Update stats
1980
- stats.components += useCount;
1983
+ // Update stats target (will animate gradually)
1984
+ statsTarget.components += useCount;
1981
1985
 
1982
1986
  // Create beam to this component node - OPTIMIZED: Add to queue
1983
1987
  const beam = new Beam(node, event.name);
@@ -1997,10 +2001,16 @@
1997
2001
  recalculateModelPercentages();
1998
2002
  }
1999
2003
 
2000
- // Update stats
2001
- document.getElementById('statConversations').textContent = stats.conversations;
2002
- document.getElementById('statComponents').textContent = stats.components;
2003
- document.getElementById('statTools').textContent = stats.tools;
2004
+ // Animate stats display towards target values (smooth counting up)
2005
+ const animationSpeed = 0.1; // Speed of counter animation
2006
+ statsDisplay.conversations += (statsTarget.conversations - statsDisplay.conversations) * animationSpeed;
2007
+ statsDisplay.components += (statsTarget.components - statsDisplay.components) * animationSpeed;
2008
+ statsDisplay.tools += (statsTarget.tools - statsDisplay.tools) * animationSpeed;
2009
+
2010
+ // Update stats display (rounded to integers)
2011
+ document.getElementById('statConversations').textContent = Math.floor(statsDisplay.conversations);
2012
+ document.getElementById('statComponents').textContent = Math.floor(statsDisplay.components);
2013
+ document.getElementById('statTools').textContent = Math.floor(statsDisplay.tools);
2004
2014
 
2005
2015
  // Check milestones
2006
2016
  const milestones = [
@@ -2011,7 +2021,7 @@
2011
2021
  ];
2012
2022
 
2013
2023
  milestones.forEach(m => {
2014
- if (stats.conversations >= m.threshold && !shownMilestones.has(m.threshold)) {
2024
+ if (statsTarget.conversations >= m.threshold && !shownMilestones.has(m.threshold)) {
2015
2025
  shownMilestones.add(m.threshold);
2016
2026
  // showEvent(m.msg); // Disabled - notifications removed
2017
2027
  }
@@ -2128,6 +2138,8 @@
2128
2138
  // Controls
2129
2139
  function restartAnimation() {
2130
2140
  stats = { conversations: 0, components: 0, tools: 0 };
2141
+ statsTarget = { conversations: 0, components: 0, tools: 0 };
2142
+ statsDisplay = { conversations: 0, components: 0, tools: 0 };
2131
2143
  processedEvents.clear();
2132
2144
  shownMilestones.clear();
2133
2145
  currentDayIndex = 0;
package/src/index.js CHANGED
@@ -1105,6 +1105,24 @@ async function installIndividualHook(hookName, targetDir, options) {
1105
1105
  // Python file is optional, silently continue if not found
1106
1106
  }
1107
1107
 
1108
+ // Check if there's a corresponding Bash script for ANY hook
1109
+ const bashUrl = githubUrl.replace('.json', '.sh');
1110
+
1111
+ try {
1112
+ console.log(chalk.gray(`📥 Checking for additional bash script...`));
1113
+ const bashResponse = await fetch(bashUrl);
1114
+ if (bashResponse.ok) {
1115
+ const bashContent = await bashResponse.text();
1116
+ additionalFiles[`.claude/hooks/${hookBaseName}.sh`] = {
1117
+ content: bashContent,
1118
+ executable: true
1119
+ };
1120
+ console.log(chalk.green(`✓ Found bash script: ${hookBaseName}.sh`));
1121
+ }
1122
+ } catch (error) {
1123
+ // Bash file is optional, silently continue if not found
1124
+ }
1125
+
1108
1126
  // Remove description field before merging
1109
1127
  if (hookConfig && typeof hookConfig === 'object') {
1110
1128
  delete hookConfig.description;