tkeron 5.2.0 → 6.0.0

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.
@@ -12,7 +12,7 @@
12
12
  box-sizing: border-box;
13
13
  }
14
14
  body {
15
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
15
+ font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
16
16
  line-height: 1.6;
17
17
  color: #1a1a1a;
18
18
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
@@ -49,7 +49,7 @@
49
49
  backdrop-filter: blur(10px);
50
50
  padding: 1.5rem;
51
51
  border-radius: 12px;
52
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
52
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
53
53
  grid-row: span 2;
54
54
  }
55
55
  .hero .features {
@@ -67,17 +67,22 @@
67
67
  width: 200px;
68
68
  height: 200px;
69
69
  margin-bottom: 1rem;
70
- filter: drop-shadow(0 4px 6px rgba(0,0,0,0.2));
70
+ filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.2));
71
71
  animation: float 3s ease-in-out infinite;
72
72
  }
73
73
  @keyframes float {
74
- 0%, 100% { transform: translateY(0); }
75
- 50% { transform: translateY(-10px); }
74
+ 0%,
75
+ 100% {
76
+ transform: translateY(0);
77
+ }
78
+ 50% {
79
+ transform: translateY(-10px);
80
+ }
76
81
  }
77
82
  h1 {
78
83
  font-size: 2rem;
79
84
  margin-bottom: 0.25rem;
80
- text-shadow: 0 2px 4px rgba(0,0,0,0.2);
85
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
81
86
  }
82
87
  .subtitle {
83
88
  font-size: 0.9rem;
@@ -87,12 +92,14 @@
87
92
  background: white;
88
93
  padding: 1.25rem;
89
94
  border-radius: 12px;
90
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
91
- transition: transform 0.2s, box-shadow 0.2s;
95
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
96
+ transition:
97
+ transform 0.2s,
98
+ box-shadow 0.2s;
92
99
  }
93
100
  section:hover {
94
101
  transform: translateY(-4px);
95
- box-shadow: 0 8px 12px rgba(0,0,0,0.15);
102
+ box-shadow: 0 8px 12px rgba(0, 0, 0, 0.15);
96
103
  }
97
104
  h2 {
98
105
  color: #667eea;
@@ -118,12 +125,14 @@
118
125
  cursor: pointer;
119
126
  font-size: 1rem;
120
127
  font-weight: 600;
121
- transition: transform 0.1s, box-shadow 0.2s;
122
- box-shadow: 0 2px 4px rgba(0,0,0,0.2);
128
+ transition:
129
+ transform 0.1s,
130
+ box-shadow 0.2s;
131
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
123
132
  }
124
133
  button:hover {
125
134
  transform: scale(1.05);
126
- box-shadow: 0 4px 8px rgba(0,0,0,0.3);
135
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
127
136
  }
128
137
  button:active {
129
138
  transform: scale(0.98);
@@ -141,18 +150,20 @@
141
150
  background: #f0f0f0;
142
151
  padding: 0.2rem 0.4rem;
143
152
  border-radius: 4px;
144
- font-family: 'Courier New', monospace;
153
+ font-family: "Courier New", monospace;
145
154
  font-size: 0.9em;
146
155
  }
147
156
  p {
148
157
  margin-bottom: 0.5rem;
149
158
  }
150
159
  a {
151
- transition: transform 0.2s, box-shadow 0.2s;
160
+ transition:
161
+ transform 0.2s,
162
+ box-shadow 0.2s;
152
163
  }
153
164
  a:hover {
154
165
  transform: translateY(-2px);
155
- box-shadow: 0 4px 8px rgba(0,0,0,0.3);
166
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
156
167
  }
157
168
  .crypto-prices-container {
158
169
  display: grid;
@@ -165,7 +176,7 @@
165
176
  padding: 1.25rem;
166
177
  border-radius: 12px;
167
178
  color: white;
168
- box-shadow: 0 4px 6px rgba(0,0,0,0.1);
179
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
169
180
  transition: transform 0.2s;
170
181
  }
171
182
  .crypto-card:hover {
@@ -182,7 +193,7 @@
182
193
  font-size: 1rem;
183
194
  }
184
195
  .crypto-symbol {
185
- background: rgba(255,255,255,0.2);
196
+ background: rgba(255, 255, 255, 0.2);
186
197
  padding: 0.25rem 0.5rem;
187
198
  border-radius: 4px;
188
199
  font-size: 0.75rem;
@@ -207,20 +218,42 @@
207
218
  <html-components-card></html-components-card>
208
219
  <ts-components-card></ts-components-card>
209
220
  <counter-card></counter-card>
210
-
221
+
211
222
  <!-- Crypto Prices - fetched at build time -->
212
- <section style="grid-column: span 3;">
223
+ <section style="grid-column: span 3">
213
224
  <h2>💰 Asset Prices (Build Time)</h2>
214
- <p style="font-size: 0.85rem; margin-bottom: 0.75rem;">Real cryptocurrency prices fetched from CoinGecko API at build time:</p>
225
+ <p style="font-size: 0.85rem; margin-bottom: 0.75rem">
226
+ Real cryptocurrency prices fetched from CoinGecko API at build time:
227
+ </p>
215
228
  <div id="crypto-prices" class="crypto-prices-container"></div>
216
229
  </section>
217
-
230
+
218
231
  <!-- Pre-rendered content with external API data -->
219
- <section style="grid-column: span 3;">
232
+ <section style="grid-column: span 3">
220
233
  <h2>💬 Quote of the Build</h2>
221
- <p style="font-size: 0.85rem; margin-bottom: 0.75rem;">This content was fetched from an external API at build time:</p>
222
- <div id="pre-rendered-quote" style="margin: 1rem 0; padding: 0.75rem; background: #f8f9fa; border-radius: 8px; border-left: 4px solid #667eea;"></div>
223
- <div id="build-metadata" style="margin-top: 1rem; padding-top: 0.75rem; border-top: 1px solid #eee; font-size: 0.75rem; color: #999;"></div>
234
+ <p style="font-size: 0.85rem; margin-bottom: 0.75rem">
235
+ This content was fetched from an external API at build time:
236
+ </p>
237
+ <div
238
+ id="pre-rendered-quote"
239
+ style="
240
+ margin: 1rem 0;
241
+ padding: 0.75rem;
242
+ background: #f8f9fa;
243
+ border-radius: 8px;
244
+ border-left: 4px solid #667eea;
245
+ "
246
+ ></div>
247
+ <div
248
+ id="build-metadata"
249
+ style="
250
+ margin-top: 1rem;
251
+ padding-top: 0.75rem;
252
+ border-top: 1px solid #eee;
253
+ font-size: 0.75rem;
254
+ color: #999;
255
+ "
256
+ ></div>
224
257
  </section>
225
258
  </div>
226
259
  </div>
@@ -1,8 +1,12 @@
1
1
  // Pre-rendering - runs at build time
2
2
  // Demonstrates importing any TypeScript module for pre-rendering
3
- import { getRandomQuote, getBuildMetadata, getCryptoPrices } from './api-service';
3
+ import {
4
+ getRandomQuote,
5
+ getBuildMetadata,
6
+ getCryptoPrices,
7
+ } from "./api-service";
4
8
 
5
- const buildTimeElement = document.getElementById('build-time');
9
+ const buildTimeElement = document.getElementById("build-time");
6
10
 
7
11
  if (buildTimeElement) {
8
12
  const now = new Date();
@@ -10,7 +14,7 @@ if (buildTimeElement) {
10
14
  }
11
15
 
12
16
  // Fetch data from external API at build time
13
- const quoteElement = document.getElementById('pre-rendered-quote');
17
+ const quoteElement = document.getElementById("pre-rendered-quote");
14
18
  if (quoteElement) {
15
19
  const quote = await getRandomQuote();
16
20
  quoteElement.innerHTML = `
@@ -22,7 +26,7 @@ if (quoteElement) {
22
26
  }
23
27
 
24
28
  // Add build metadata
25
- const metadataElement = document.getElementById('build-metadata');
29
+ const metadataElement = document.getElementById("build-metadata");
26
30
  if (metadataElement) {
27
31
  const metadata = await getBuildMetadata();
28
32
  metadataElement.innerHTML = `
@@ -38,15 +42,17 @@ if (metadataElement) {
38
42
  }
39
43
 
40
44
  // Fetch crypto prices at build time
41
- const cryptoPricesElement = document.getElementById('crypto-prices');
45
+ const cryptoPricesElement = document.getElementById("crypto-prices");
42
46
  if (cryptoPricesElement) {
43
47
  const prices = await getCryptoPrices();
44
-
45
- const pricesHtml = prices.map(crypto => {
46
- const changeColor = crypto.price_change_percentage_24h >= 0 ? '#10b981' : '#ef4444';
47
- const changeSymbol = crypto.price_change_percentage_24h >= 0 ? '▲' : '▼';
48
-
49
- return `
48
+
49
+ const pricesHtml = prices
50
+ .map((crypto) => {
51
+ const changeColor =
52
+ crypto.price_change_percentage_24h >= 0 ? "#10b981" : "#ef4444";
53
+ const changeSymbol = crypto.price_change_percentage_24h >= 0 ? "▲" : "▼";
54
+
55
+ return `
50
56
  <div class="crypto-card">
51
57
  <div class="crypto-header">
52
58
  <span class="crypto-name">${crypto.name}</span>
@@ -58,9 +64,8 @@ if (cryptoPricesElement) {
58
64
  </div>
59
65
  </div>
60
66
  `;
61
- }).join('');
62
-
67
+ })
68
+ .join("");
69
+
63
70
  cryptoPricesElement.innerHTML = pricesHtml;
64
71
  }
65
-
66
-
@@ -1,6 +1,11 @@
1
1
  <section>
2
2
  <h2>⚡ TypeScript Components</h2>
3
- <p style="margin-bottom: 0.75rem;">Dynamic generation with <code>.com.ts</code>:</p>
3
+ <p style="margin-bottom: 0.75rem">
4
+ Dynamic generation with <code>.com.ts</code>:
5
+ </p>
4
6
  <user-badge count="3"></user-badge>
5
- <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem;">✓ Loops & conditionals<br>✓ Read attributes dynamically<br>✓ Build-time code execution</p>
7
+ <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem">
8
+ ✓ Loops & conditionals<br />✓ Read attributes dynamically<br />✓ Build-time
9
+ code execution
10
+ </p>
6
11
  </section>
@@ -0,0 +1,29 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Style Deduplication Example</title>
7
+ </head>
8
+ <body>
9
+ <h1>Auto Style Deduplication</h1>
10
+ <p>
11
+ Each <code>&lt;tag-chip&gt;</code> component has its own
12
+ <code>&lt;style&gt;</code>. tkeron automatically keeps only one copy in
13
+ <code>&lt;head&gt;</code> — no matter how many times the component is
14
+ used.
15
+ </p>
16
+
17
+ <tag-chip label="TypeScript"></tag-chip>
18
+ <tag-chip label="HTML"></tag-chip>
19
+ <tag-chip label="CSS"></tag-chip>
20
+ <tag-chip label="Bun"></tag-chip>
21
+ <tag-chip label="tkeron"></tag-chip>
22
+ <tag-chip label="zero deps"></tag-chip>
23
+
24
+ <p>
25
+ 6 chips above → 1 <code>&lt;style data-tk-com="tag-chip"&gt;</code> in
26
+ <code>&lt;head&gt;</code>.
27
+ </p>
28
+ </body>
29
+ </html>
@@ -0,0 +1,19 @@
1
+ const label = com.getAttribute("label") || "tag";
2
+
3
+ com.innerHTML = `
4
+ <style>
5
+ .tag-chip {
6
+ display: inline-block;
7
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
8
+ color: white;
9
+ padding: 0.2rem 0.65rem;
10
+ border-radius: 999px;
11
+ font-size: 0.75rem;
12
+ font-weight: 600;
13
+ margin: 0.2rem;
14
+ font-family: monospace;
15
+ letter-spacing: 0.02em;
16
+ }
17
+ </style>
18
+ <span class="tag-chip">${label}</span>
19
+ `;
package/index.ts CHANGED
@@ -3,6 +3,7 @@ import { getCommands } from "@tkeron/commands";
3
3
  import { buildWrapper } from "./src/buildWrapper";
4
4
  import { develop } from "./src/develop";
5
5
  import { initWrapper } from "./src/initWrapper";
6
+ import { skillsWrapper } from "./src/skillsWrapper";
6
7
  import { showBanner } from "./src/banner";
7
8
  import packageJson from "./package.json";
8
9
 
@@ -36,5 +37,19 @@ getCommands("tkeron", packageJson.version)
36
37
  .addOption("force")
37
38
  .setCallback(initWrapper)
38
39
 
40
+ .commands()
41
+
42
+ .addCommand("skills")
43
+ .addDescription("Install AI agent skills into the current project")
44
+ .addPositionedArgument("target")
45
+ .addOption("force")
46
+ .addOption({
47
+ name: "dryRun",
48
+ aliases: ["dry-run"],
49
+ type: "boolean",
50
+ description: "Preview what would be installed without making changes",
51
+ })
52
+ .setCallback(skillsWrapper)
53
+
39
54
  .commands()
40
55
  .start();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tkeron",
3
- "version": "5.2.0",
3
+ "version": "6.0.0",
4
4
  "description": "CLI build tool for vanilla web development with TypeScript.",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -12,35 +12,24 @@
12
12
  },
13
13
  "bin": {
14
14
  "tkeron": "./index.ts",
15
- "tk": "./index.ts",
16
- "tkeron-mcp": "./mcp-server.ts"
15
+ "tk": "./index.ts"
17
16
  },
18
17
  "scripts": {
19
18
  "tk": "bun index.ts ",
20
19
  "test": "bun test --concurrent",
21
- "lint": "prettier --write .",
22
- "sample1": "bun . build examples/basic_build/src",
23
- "sample2": "bun . build examples/with_assets/src",
24
- "sample3": "bun . build examples/with_pre/src",
25
- "sample4": "bun . build examples/with_com_html_priority/src",
26
- "sample5": "bun . build examples/with_com_ts/src",
27
- "sample6": "bun . build examples/with_com_ts_priority/src",
28
- "sample7": "bun . build examples/with_com_mixed_priority/src",
29
- "sample8": "bun . build examples/with_com_html_in_ts/src",
30
- "build_examples": "bun run sample1 && bun run sample2 && bun run sample3 && bun run sample4 && bun run sample5 && bun run sample6 && bun run sample7 && bun run sample8"
20
+ "lint": "prettier --write ."
31
21
  },
32
22
  "author": "tkeron",
33
23
  "license": "MIT",
34
24
  "dependencies": {
35
- "@modelcontextprotocol/sdk": "^1.29.0",
36
- "@tkeron/commands": "0.4.7",
37
- "@tkeron/html-parser": "1.5.6",
38
- "@tkeron/tools": "^0.4.1"
25
+ "@tkeron/commands": "0.4.8",
26
+ "@tkeron/html-parser": "1.5.7",
27
+ "@tkeron/tools": "^0.5.0"
39
28
  },
40
29
  "devDependencies": {
41
- "@types/bun": "^1.3.11",
42
- "prettier": "^3.8.1",
43
- "typescript": "^6.0.2"
30
+ "@types/bun": "^1.3.14",
31
+ "prettier": "^3.8.3",
32
+ "typescript": "^6.0.3"
44
33
  },
45
34
  "keywords": [
46
35
  "cli",
@@ -50,9 +39,7 @@
50
39
  "pre-rendering",
51
40
  "static-site-generator",
52
41
  "backend-driven",
53
- "mcp",
54
- "model-context-protocol",
55
- "ai-integration"
42
+ "ai-agents"
56
43
  ],
57
44
  "publishConfig": {
58
45
  "access": "public"