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.
- package/README.md +17 -16
- package/bun.lock +13 -196
- package/changelog.md +52 -3
- package/examples/init_sample/websrc/api-service.ts +24 -24
- package/examples/init_sample/websrc/counter-card.com.html +5 -2
- package/examples/init_sample/websrc/hero-section.com.html +35 -5
- package/examples/init_sample/websrc/html-components-card.com.html +6 -2
- package/examples/init_sample/websrc/index.html +58 -25
- package/examples/init_sample/websrc/index.pre.ts +20 -15
- package/examples/init_sample/websrc/ts-components-card.com.html +7 -2
- package/examples/with_style_dedup/websrc/index.html +29 -0
- package/examples/with_style_dedup/websrc/tag-chip.com.ts +19 -0
- package/index.ts +15 -0
- package/package.json +10 -23
- package/skills/tkeron/SKILL.md +286 -0
- package/skills/tkeron-components/SKILL.md +785 -0
- package/skills/tkeron-organization/SKILL.md +230 -0
- package/skills/tkeron-patterns/SKILL.md +495 -0
- package/skills/tkeron-testing/SKILL.md +194 -0
- package/skills/tkeron-troubleshooting/SKILL.md +259 -0
- package/src/build.ts +7 -6
- package/src/deduplicateComStyles.ts +41 -0
- package/src/develop.ts +1 -2
- package/src/init.ts +1 -2
- package/src/processCom.ts +2 -2
- package/src/processComTs.ts +2 -2
- package/src/skills.ts +139 -0
- package/src/skillsWrapper.ts +79 -0
- package/docs/mcp-server.md +0 -240
- package/mcp-server.ts +0 -272
- package/src/cleanupOrphanedTempDirs.ts +0 -31
- package/src/promptUser.ts +0 -15
- package/src/setupSigintHandler.ts +0 -6
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
box-sizing: border-box;
|
|
13
13
|
}
|
|
14
14
|
body {
|
|
15
|
-
font-family:
|
|
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%,
|
|
75
|
-
|
|
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:
|
|
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:
|
|
122
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
222
|
-
|
|
223
|
-
|
|
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 {
|
|
3
|
+
import {
|
|
4
|
+
getRandomQuote,
|
|
5
|
+
getBuildMetadata,
|
|
6
|
+
getCryptoPrices,
|
|
7
|
+
} from "./api-service";
|
|
4
8
|
|
|
5
|
-
const buildTimeElement = document.getElementById(
|
|
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(
|
|
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(
|
|
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(
|
|
45
|
+
const cryptoPricesElement = document.getElementById("crypto-prices");
|
|
42
46
|
if (cryptoPricesElement) {
|
|
43
47
|
const prices = await getCryptoPrices();
|
|
44
|
-
|
|
45
|
-
const pricesHtml = prices
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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><tag-chip></code> component has its own
|
|
12
|
+
<code><style></code>. tkeron automatically keeps only one copy in
|
|
13
|
+
<code><head></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><style data-tk-com="tag-chip"></code> in
|
|
26
|
+
<code><head></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": "
|
|
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
|
-
"@
|
|
36
|
-
"@tkeron/
|
|
37
|
-
"@tkeron/
|
|
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.
|
|
42
|
-
"prettier": "^3.8.
|
|
43
|
-
"typescript": "^6.0.
|
|
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
|
-
"
|
|
54
|
-
"model-context-protocol",
|
|
55
|
-
"ai-integration"
|
|
42
|
+
"ai-agents"
|
|
56
43
|
],
|
|
57
44
|
"publishConfig": {
|
|
58
45
|
"access": "public"
|