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 +1 -1
- package/src/analytics-web/2025.html +26 -14
- package/src/index.js +18 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-code-templates",
|
|
3
|
-
"version": "1.28.
|
|
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:
|
|
56
|
-
border-radius:
|
|
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:
|
|
68
|
-
margin:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
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 (
|
|
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;
|