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 CHANGED
@@ -84,37 +84,38 @@ document.getElementById("quote").textContent = data.content;
84
84
  tk init <name> # Initialize new project
85
85
  tk build # Build project (websrc → web)
86
86
  tk dev [port] [host] # Dev server with hot reload (default: localhost:3000)
87
+ tk skills [target] # Install AI agent skills into <target>/ (default: skills/)
87
88
  ```
88
89
 
89
90
  **Aliases:** `tk i`, `tk b`, `tk d`
90
91
 
91
92
  See [CLI Reference](./docs/cli-reference.md) for all options.
92
93
 
93
- ## MCP Server (AI Integration)
94
+ ## AI Agent Integration
94
95
 
95
- Tkeron includes a Model Context Protocol server for AI agents.
96
+ Tkeron ships with **AI agent skills** Markdown files an AI coding agent can read to understand the entire tkeron workflow (CLI, folder structure, file types, components, build lifecycle, testing, best practices and common pitfalls).
96
97
 
97
- **Setup:**
98
+ Install them into your project with:
98
99
 
99
100
  ```bash
100
- bun install -g tkeron
101
+ tk skills # copies skills into ./skills/
102
+ tk skills agent-skills # custom target directory
103
+ tk skills --force # overwrite existing files
101
104
  ```
102
105
 
103
- **Configure in VS Code** (`~/.config/Code/User/mcp.json`):
106
+ This drops the bundled skills into the chosen directory:
104
107
 
105
- ```json
106
- {
107
- "servers": {
108
- "tkeron": {
109
- "command": "tkeron-mcp"
110
- }
111
- }
112
- }
108
+ ```
109
+ skills/
110
+ ├── tkeron/
111
+ │ └── SKILL.md # Core: CLI, build, file types, testing
112
+ ├── tkeron-components/
113
+ │ └── SKILL.md # Components & pre/post-rendering deep dive
114
+ └── tkeron-best-practices/
115
+ └── SKILL.md # Patterns, anti-patterns, organization
113
116
  ```
114
117
 
115
- **Note:** Other editors may use different configuration formats.
116
-
117
- See [MCP Documentation](./docs/mcp-server.md) for details.
118
+ Point your agent's skill loader (e.g. `.github/skills/`, `~/.config/Code/User/prompts/`, or any equivalent) at the installed directory, or copy the folders into the location your agent expects.
118
119
 
119
120
  ## Testing API
120
121
 
package/bun.lock CHANGED
@@ -5,217 +5,34 @@
5
5
  "": {
6
6
  "name": "tkeron",
7
7
  "dependencies": {
8
- "@modelcontextprotocol/sdk": "^1.29.0",
9
- "@tkeron/commands": "0.4.7",
10
- "@tkeron/html-parser": "1.5.6",
11
- "@tkeron/tools": "^0.4.1",
8
+ "@tkeron/commands": "0.4.8",
9
+ "@tkeron/html-parser": "1.5.7",
10
+ "@tkeron/tools": "^0.5.0",
12
11
  },
13
12
  "devDependencies": {
14
- "@types/bun": "^1.3.11",
15
- "prettier": "^3.8.1",
16
- "typescript": "^6.0.2",
13
+ "@types/bun": "^1.3.14",
14
+ "prettier": "^3.8.3",
15
+ "typescript": "^6.0.3",
17
16
  },
18
17
  },
19
18
  },
20
19
  "packages": {
21
- "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],
20
+ "@tkeron/commands": ["@tkeron/commands@0.4.8", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-l8bqv0yYdDgeC/DtVgBAkvRaZm4nJvQA/X0gVkh6Qt+GNewMK0trRAa331XCumz4WsiH++Y68ZwXdQvZbd6cpA=="],
22
21
 
23
- "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="],
22
+ "@tkeron/html-parser": ["@tkeron/html-parser@1.5.7", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-fqc+c+QAzpEAEL6on/dLJX305HFHcP3Bs9Z29uRJ0w4/FEQQHDcZRo2e0hbpKRsIWUcCvwyQ1QmF1n5dlrHY4A=="],
24
23
 
25
- "@tkeron/commands": ["@tkeron/commands@0.4.7", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-QGYLnPcOFir5cMJpeUuLMZdW5IrcDyY/jjbML3o23yATI8Y3XzwYhRDW2l8kex0waLV7KsAwnGsb2zl8sRn1PQ=="],
24
+ "@tkeron/tools": ["@tkeron/tools@0.5.0", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-LDoc1jlEN/p0tBOd3NCC9mHv+4vBOCXqU3BnYAdVs0ZyXOFegFTNRK2thrQ4V0GpiQUbB8TE9F6sn/ALg6EuWg=="],
26
25
 
27
- "@tkeron/html-parser": ["@tkeron/html-parser@1.5.6", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-dATXoSjxOuUjyjde5ocrZdd5xKfpKf7R9dwRklXHVCAvGwPR2UlJfISWmfmYIwlwFuidg+jmujXmLlLwA7hQgA=="],
28
-
29
- "@tkeron/tools": ["@tkeron/tools@0.4.1", "", { "peerDependencies": { "typescript": "^5.9.3" } }, "sha512-nsmguSq/Ukx930ChwO11V433R786aJ/tniugzDdlfT/rzLrFxPJoHZerA71XGOIuD8/FRlvS7kJR9YI0CcxmqQ=="],
30
-
31
- "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="],
26
+ "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
32
27
 
33
28
  "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="],
34
29
 
35
- "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
36
-
37
- "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
38
-
39
- "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
40
-
41
- "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
42
-
43
- "bun-types": ["bun-types@1.3.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-1KGPpoxQWl9f6wcZh57LvrPIInQMn2TQ7jsgxqpRzg+l0QPOFvJVH7HmvHo/AiPgwXy+/Thf6Ov3EdVn1vOabg=="],
44
-
45
- "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
46
-
47
- "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
48
-
49
- "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
50
-
51
- "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
52
-
53
- "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
54
-
55
- "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
56
-
57
- "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
58
-
59
- "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
60
-
61
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
62
-
63
- "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
64
-
65
- "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
66
-
67
- "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
68
-
69
- "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
70
-
71
- "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
72
-
73
- "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
74
-
75
- "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
76
-
77
- "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
78
-
79
- "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
80
-
81
- "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
82
-
83
- "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
84
-
85
- "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
86
-
87
- "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
88
-
89
- "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],
90
-
91
- "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
92
-
93
- "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
94
-
95
- "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
96
-
97
- "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
98
-
99
- "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
100
-
101
- "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
102
-
103
- "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
104
-
105
- "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
106
-
107
- "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
108
-
109
- "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
110
-
111
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
112
-
113
- "hono": ["hono@4.12.1", "", {}, "sha512-hi9afu8g0lfJVLolxElAZGANCTTl6bewIdsRNhaywfP9K8BPf++F2z6OLrYGIinUwpRKzbZHMhPwvc0ZEpAwGw=="],
114
-
115
- "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
116
-
117
- "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
118
-
119
- "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
120
-
121
- "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="],
122
-
123
- "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
30
+ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
124
31
 
125
- "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
32
+ "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
126
33
 
127
- "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
128
-
129
- "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
130
-
131
- "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
132
-
133
- "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="],
134
-
135
- "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
136
-
137
- "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
138
-
139
- "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
140
-
141
- "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
142
-
143
- "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
144
-
145
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
146
-
147
- "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
148
-
149
- "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
150
-
151
- "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
152
-
153
- "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
154
-
155
- "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
156
-
157
- "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
158
-
159
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
160
-
161
- "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
162
-
163
- "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
164
-
165
- "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
166
-
167
- "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
168
-
169
- "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="],
170
-
171
- "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
172
-
173
- "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
174
-
175
- "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
176
-
177
- "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
178
-
179
- "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
180
-
181
- "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
182
-
183
- "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
184
-
185
- "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
186
-
187
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
188
-
189
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
190
-
191
- "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
192
-
193
- "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
194
-
195
- "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
196
-
197
- "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
198
-
199
- "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
200
-
201
- "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
202
-
203
- "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
204
-
205
- "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="],
34
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
206
35
 
207
36
  "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
208
-
209
- "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
210
-
211
- "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
212
-
213
- "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
214
-
215
- "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
216
-
217
- "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
218
-
219
- "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
220
37
  }
221
38
  }
package/changelog.md CHANGED
@@ -1,3 +1,52 @@
1
+ # v6.0.0
2
+
3
+ ## BREAKING: remove MCP server
4
+
5
+ - Removed the `tkeron-mcp` bin and the entire MCP server implementation (`mcp-server.ts`, `docs/mcp-server.md`, `tests/mcp-server.test.ts`)
6
+ - Removed `@modelcontextprotocol/sdk` dependency
7
+ - AI agent integration is now provided through the new `tk skills` command (see below)
8
+ - Migration: replace any `tkeron-mcp` MCP server configuration with `tk skills` to drop the skill files directly into your project
9
+
10
+ ## Feature: `tk skills` command
11
+
12
+ - New CLI subcommand: `tk skills [target] [--force] [--dry-run]`
13
+ - Installs bundled AI agent skills (Markdown `SKILL.md` files) into the chosen directory (default `./skills/`)
14
+ - Auto-detects target environment (Copilot, Cursor, Claude) and applies environment-specific transforms (e.g. Cursor frontmatter `alwaysApply: false`)
15
+ - Bundled skills: `tkeron`, `tkeron-components`, `tkeron-organization`, `tkeron-patterns`, `tkeron-testing`, `tkeron-troubleshooting`
16
+
17
+ ## Refactor: extract generic utilities to @tkeron/tools
18
+
19
+ - Five internal helpers moved to `@tkeron/tools@0.5.0`: `addFrontmatterField`, `promptUser`, `setupSigintHandler`, `detectEnvironments`, `cleanupOrphanedTempDirs`
20
+ - All imports now resolve through `@tkeron/tools`
21
+ - `TEMP_DIR_PREFIX` stays in `build.ts` (still `.tktmp_build-`) and is now passed explicitly to `cleanupOrphanedTempDirs`
22
+
23
+ ## Dependencies
24
+
25
+ - `@tkeron/commands` 0.4.7 → 0.4.8
26
+ - `@tkeron/html-parser` 1.5.6 → 1.5.7
27
+ - `@tkeron/tools` ^0.4.1 → ^0.5.0
28
+ - Removed `@modelcontextprotocol/sdk`
29
+ - Dev: `@types/bun` ^1.3.11 → ^1.3.14, `prettier` ^3.8.1 → ^3.8.3, `typescript` ^6.0.2 → ^6.0.3
30
+
31
+ ## Docs & packaging
32
+
33
+ - README rewritten: MCP section replaced with `tk skills` usage and AI agent integration docs
34
+ - Package keywords updated to reflect new direction (`ai-agents` replaces `mcp`, `model-context-protocol`, `ai-integration`)
35
+
36
+ ---
37
+
38
+ # v5.3.0
39
+
40
+ ## Feature: Automatic component style deduplication
41
+
42
+ - Component `<style data-tk-com>` elements are now automatically deduplicated at build time
43
+ - When a component is used multiple times, only one copy of its `<style>` is kept — moved to `<head>`
44
+ - Runs as a new build step (`deduplicateComStyles`) between component resolution and `.post.ts` execution
45
+ - The `.post.ts` script now receives an already-clean DOM with no duplicate styles
46
+ - Added example `with_style_dedup` demonstrating the feature
47
+
48
+ ---
49
+
1
50
  # v5.2.0
2
51
 
3
52
  ## Feature: `.post.ts` post-processing support
@@ -8,10 +57,10 @@
8
57
  - Useful for final DOM manipulation, injecting metadata, or any transformation after components are resolved
9
58
  - `processPost` returns `false` when no `.post.ts` files are found (no-op)
10
59
 
11
- ## Feature: `data-tk-id` attribute on component `<style>` elements
60
+ ## Feature: `data-tk-com` attribute on component `<style>` elements
12
61
 
13
- - Root-level `<style>` elements in component output now receive a `data-tk-id="component-name"` attribute
14
- - Nested `<style>` elements (inside wrappers) also receive `data-tk-id`
62
+ - Root-level `<style>` elements in component output now receive a `data-tk-com="component-name"` attribute
63
+ - Nested `<style>` elements (inside wrappers) also receive `data-tk-com`
15
64
  - Applies to both `.com.html` and `.com.ts` components
16
65
  - Enables per-component style scoping and identification in the final HTML
17
66
 
@@ -13,21 +13,21 @@ export interface Quote {
13
13
  */
14
14
  export async function getRandomQuote(): Promise<Quote> {
15
15
  try {
16
- const response = await fetch('https://dummyjson.com/quotes/random');
17
-
16
+ const response = await fetch("https://dummyjson.com/quotes/random");
17
+
18
18
  if (!response.ok) {
19
19
  throw new Error(`HTTP error! status: ${response.status}`);
20
20
  }
21
-
21
+
22
22
  const data = await response.json();
23
23
  return data as Quote;
24
24
  } catch (error) {
25
25
  // Fallback quote if API fails
26
- console.warn('API call failed, using fallback quote');
26
+ console.warn("API call failed, using fallback quote");
27
27
  return {
28
28
  id: 0,
29
29
  quote: "The only way to do great work is to love what you do.",
30
- author: "Steve Jobs"
30
+ author: "Steve Jobs",
31
31
  };
32
32
  }
33
33
  }
@@ -39,8 +39,8 @@ export async function getBuildMetadata() {
39
39
  return {
40
40
  timestamp: new Date().toLocaleString(),
41
41
  runtime: `Bun ${Bun.version}`,
42
- tkeron: process.env.TKERON_VERSION || 'unknown',
43
- platform: process.platform
42
+ tkeron: process.env.TKERON_VERSION || "unknown",
43
+ platform: process.platform,
44
44
  };
45
45
  }
46
46
 
@@ -59,40 +59,40 @@ export interface CryptoPrice {
59
59
  export async function getCryptoPrices(): Promise<CryptoPrice[]> {
60
60
  try {
61
61
  const response = await fetch(
62
- 'https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=bitcoin,ethereum,solana&order=market_cap_desc&sparkline=false'
62
+ "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=bitcoin,ethereum,solana&order=market_cap_desc&sparkline=false",
63
63
  );
64
-
64
+
65
65
  if (!response.ok) {
66
66
  throw new Error(`HTTP error! status: ${response.status}`);
67
67
  }
68
-
68
+
69
69
  const data = await response.json();
70
70
  return data as CryptoPrice[];
71
71
  } catch (error) {
72
72
  // Fallback data if API fails
73
- console.warn('Crypto API call failed, using fallback data');
73
+ console.warn("Crypto API call failed, using fallback data");
74
74
  return [
75
75
  {
76
- id: 'bitcoin',
77
- symbol: 'btc',
78
- name: 'Bitcoin',
76
+ id: "bitcoin",
77
+ symbol: "btc",
78
+ name: "Bitcoin",
79
79
  current_price: 95000,
80
- price_change_percentage_24h: 2.5
80
+ price_change_percentage_24h: 2.5,
81
81
  },
82
82
  {
83
- id: 'ethereum',
84
- symbol: 'eth',
85
- name: 'Ethereum',
83
+ id: "ethereum",
84
+ symbol: "eth",
85
+ name: "Ethereum",
86
86
  current_price: 3500,
87
- price_change_percentage_24h: -1.2
87
+ price_change_percentage_24h: -1.2,
88
88
  },
89
89
  {
90
- id: 'solana',
91
- symbol: 'sol',
92
- name: 'Solana',
90
+ id: "solana",
91
+ symbol: "sol",
92
+ name: "Solana",
93
93
  current_price: 180,
94
- price_change_percentage_24h: 5.8
95
- }
94
+ price_change_percentage_24h: 5.8,
95
+ },
96
96
  ];
97
97
  }
98
98
  }
@@ -1,9 +1,12 @@
1
1
  <section>
2
2
  <h2>🎯 Client-side TypeScript</h2>
3
- <p style="margin-bottom: 0.75rem;">Interactive features in the browser:</p>
3
+ <p style="margin-bottom: 0.75rem">Interactive features in the browser:</p>
4
4
  <div class="counter">
5
5
  <button id="increment">Click me!</button>
6
6
  <div class="count">Clicks: <span id="count">0</span></div>
7
7
  </div>
8
- <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem;">✓ Event handling & DOM manipulation<br>✓ Regular TypeScript for interactivity</p>
8
+ <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem">
9
+ ✓ Event handling & DOM manipulation<br />✓ Regular TypeScript for
10
+ interactivity
11
+ </p>
9
12
  </section>
@@ -1,22 +1,52 @@
1
1
  <div class="hero">
2
2
  <div>
3
- <img src="./profile.png" alt="tkeron logo" class="logo">
3
+ <img src="./profile.png" alt="tkeron logo" class="logo" />
4
4
  <h1>tkeron</h1>
5
5
  <p class="subtitle">Build-time TypeScript for modern web development</p>
6
6
  </div>
7
7
  <div class="features">
8
- <ul style="list-style: none;">
8
+ <ul style="list-style: none">
9
9
  <li>⚡ Fast builds with Bun</li>
10
10
  <li>🎯 Build-time HTML generation</li>
11
11
  <li>🧩 HTML & TypeScript components</li>
12
12
  <li>🔧 Pure TypeScript & HTML</li>
13
13
  </ul>
14
14
  </div>
15
- <div style="margin-top: 1.5rem; display: flex; gap: 0.75rem; width: 100%;">
16
- <a href="https://www.npmjs.com/package/tkeron" target="_blank" style="flex: 1; padding: 0.65rem; background: rgba(203, 56, 55, 0.9); color: white; text-decoration: none; border-radius: 6px; text-align: center; font-weight: 600; font-size: 0.85rem; transition: background 0.2s;">
15
+ <div style="margin-top: 1.5rem; display: flex; gap: 0.75rem; width: 100%">
16
+ <a
17
+ href="https://www.npmjs.com/package/tkeron"
18
+ target="_blank"
19
+ style="
20
+ flex: 1;
21
+ padding: 0.65rem;
22
+ background: rgba(203, 56, 55, 0.9);
23
+ color: white;
24
+ text-decoration: none;
25
+ border-radius: 6px;
26
+ text-align: center;
27
+ font-weight: 600;
28
+ font-size: 0.85rem;
29
+ transition: background 0.2s;
30
+ "
31
+ >
17
32
  📦 npm
18
33
  </a>
19
- <a href="https://github.com/tkeron/tkeron" target="_blank" style="flex: 1; padding: 0.65rem; background: rgba(36, 41, 46, 0.9); color: white; text-decoration: none; border-radius: 6px; text-align: center; font-weight: 600; font-size: 0.85rem; transition: background 0.2s;">
34
+ <a
35
+ href="https://github.com/tkeron/tkeron"
36
+ target="_blank"
37
+ style="
38
+ flex: 1;
39
+ padding: 0.65rem;
40
+ background: rgba(36, 41, 46, 0.9);
41
+ color: white;
42
+ text-decoration: none;
43
+ border-radius: 6px;
44
+ text-align: center;
45
+ font-weight: 600;
46
+ font-size: 0.85rem;
47
+ transition: background 0.2s;
48
+ "
49
+ >
20
50
  ⭐ GitHub
21
51
  </a>
22
52
  </div>
@@ -1,6 +1,10 @@
1
1
  <section>
2
2
  <h2>🧩 HTML Components</h2>
3
- <p style="margin-bottom: 0.75rem;">Reusable components with <code>.com.html</code>:</p>
3
+ <p style="margin-bottom: 0.75rem">
4
+ Reusable components with <code>.com.html</code>:
5
+ </p>
4
6
  <info-card></info-card>
5
- <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem;">✓ Nested components support<br>✓ Build-time replacement</p>
7
+ <p style="font-size: 0.85rem; color: #666; margin-top: 0.75rem">
8
+ ✓ Nested components support<br />✓ Build-time replacement
9
+ </p>
6
10
  </section>