@batijs/cli 0.0.658 → 0.0.660

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.
Files changed (60) hide show
  1. package/dist/boilerplates/@batijs/auth0/bati.config.mjs +1 -1
  2. package/dist/boilerplates/@batijs/authjs/bati.config.mjs +2 -16
  3. package/dist/boilerplates/@batijs/aws/bati.config.mjs +1 -13
  4. package/dist/boilerplates/@batijs/better-auth/bati.config.mjs +2 -17
  5. package/dist/boilerplates/@batijs/biome/bati.config.mjs +2 -16
  6. package/dist/boilerplates/@batijs/cloudflare/bati.config.mjs +1 -15
  7. package/dist/boilerplates/@batijs/compiled/bati.config.mjs +1 -13
  8. package/dist/boilerplates/@batijs/d1/bati.config.mjs +1 -1
  9. package/dist/boilerplates/@batijs/d1-kysely/bati.config.mjs +1 -1
  10. package/dist/boilerplates/@batijs/d1-sqlite/bati.config.mjs +4 -18
  11. package/dist/boilerplates/@batijs/docker-compose/bati.config.mjs +2 -15
  12. package/dist/boilerplates/@batijs/dokploy/bati.config.mjs +2 -14
  13. package/dist/boilerplates/@batijs/drizzle/bati.config.mjs +1 -17
  14. package/dist/boilerplates/@batijs/edgeone/bati.config.mjs +2 -14
  15. package/dist/boilerplates/@batijs/elysia/bati.config.mjs +2 -15
  16. package/dist/boilerplates/@batijs/eslint/bati.config.mjs +2 -14
  17. package/dist/boilerplates/@batijs/express/bati.config.mjs +2 -15
  18. package/dist/boilerplates/@batijs/fastify/bati.config.mjs +2 -15
  19. package/dist/boilerplates/@batijs/google-analytics/bati.config.mjs +2 -14
  20. package/dist/boilerplates/@batijs/hono/bati.config.mjs +2 -15
  21. package/dist/boilerplates/@batijs/kysely/bati.config.mjs +2 -16
  22. package/dist/boilerplates/@batijs/mantine/bati.config.mjs +2 -14
  23. package/dist/boilerplates/@batijs/netlify/bati.config.mjs +4 -18
  24. package/dist/boilerplates/@batijs/oxlint/bati.config.mjs +2 -14
  25. package/dist/boilerplates/@batijs/plausible.io/bati.config.mjs +4 -18
  26. package/dist/boilerplates/@batijs/pnpm/bati.config.mjs +1 -1
  27. package/dist/boilerplates/@batijs/postgres/bati.config.mjs +1 -13
  28. package/dist/boilerplates/@batijs/prettier/bati.config.mjs +2 -14
  29. package/dist/boilerplates/@batijs/prisma/bati.config.mjs +2 -20
  30. package/dist/boilerplates/@batijs/react/bati.config.mjs +2 -14
  31. package/dist/boilerplates/@batijs/react-better-auth/bati.config.mjs +1 -1
  32. package/dist/boilerplates/@batijs/react-sentry/bati.config.mjs +1 -1
  33. package/dist/boilerplates/@batijs/sentry/bati.config.mjs +1 -14
  34. package/dist/boilerplates/@batijs/shadcn-ui/bati.config.mjs +4 -19
  35. package/dist/boilerplates/@batijs/shared/bati.config.mjs +1 -94
  36. package/dist/boilerplates/@batijs/shared-agents/bati.config.mjs +1 -1
  37. package/dist/boilerplates/@batijs/shared-agents/hooks/after.mjs +2 -2
  38. package/dist/boilerplates/@batijs/shared-agents/hooks/asset-boilerplates/shared-agents/compose.mjs +13 -20
  39. package/dist/boilerplates/@batijs/shared-agents/hooks/asset-packages/features/dist/{features-CPCPsYbg.mjs → features-H0oiz0KO.mjs} +106 -27
  40. package/dist/boilerplates/@batijs/shared-agents/hooks/asset-packages/features/dist/index.mjs +1 -1
  41. package/dist/boilerplates/@batijs/shared-db/bati.config.mjs +1 -1
  42. package/dist/boilerplates/@batijs/shared-env/bati.config.mjs +1 -1
  43. package/dist/boilerplates/@batijs/shared-server/bati.config.mjs +1 -1
  44. package/dist/boilerplates/@batijs/shared-todo/bati.config.mjs +1 -1
  45. package/dist/boilerplates/@batijs/solid/bati.config.mjs +4 -18
  46. package/dist/boilerplates/@batijs/solid-better-auth/bati.config.mjs +1 -1
  47. package/dist/boilerplates/@batijs/solid-sentry/bati.config.mjs +1 -1
  48. package/dist/boilerplates/@batijs/sqlite/bati.config.mjs +1 -13
  49. package/dist/boilerplates/@batijs/storybook/bati.config.mjs +2 -14
  50. package/dist/boilerplates/@batijs/tailwindcss/bati.config.mjs +2 -27
  51. package/dist/boilerplates/@batijs/telefunc/bati.config.mjs +4 -20
  52. package/dist/boilerplates/@batijs/trpc/bati.config.mjs +4 -19
  53. package/dist/boilerplates/@batijs/ts-rest/bati.config.mjs +2 -14
  54. package/dist/boilerplates/@batijs/universal-deploy/bati.config.mjs +4 -21
  55. package/dist/boilerplates/@batijs/vercel/bati.config.mjs +1 -13
  56. package/dist/boilerplates/@batijs/vue/bati.config.mjs +2 -14
  57. package/dist/boilerplates/@batijs/vue-better-auth/bati.config.mjs +1 -1
  58. package/dist/boilerplates/@batijs/vue-sentry/bati.config.mjs +1 -1
  59. package/dist/index.js +2 -3
  60. package/package.json +5 -5
@@ -1,27 +1,20 @@
1
+ import { features } from "../../asset-packages/features/dist/features-H0oiz0KO.mjs";
1
2
  import { SKILLS_DIR } from "../../asset-packages/features/dist/index.mjs";
2
3
  //#region compose.ts
3
- /** One `SKILL.md` per skill under {@link SKILLS_DIR}, sorted by name so the output is deterministic. */
4
- function composeSkills(skills) {
5
- assertUniqueNames(skills);
6
- return [...skills].sort((a, b) => a.name.localeCompare(b.name)).map((skill) => ({
7
- path: `${SKILLS_DIR}/${skill.name}/SKILL.md`,
8
- content: renderSkillMd(skill)
4
+ /**
5
+ * One `SKILL.md` per in-stack feature that publishes an `llms.txt`, under {@link SKILLS_DIR}, sorted by
6
+ * flag (deterministic output). Each skill is a pointer to the live docs — no how-to is stored, so it never
7
+ * goes stale. Flags are unique, so names never collide. `readonly` features (e.g. Vike) are always in the
8
+ * stack, so their skill is emitted regardless of selection.
9
+ */
10
+ function composeSkills(isSelected) {
11
+ return features.filter((f) => Boolean(f.skill) && (f.readonly || isSelected(f.flag))).sort((a, b) => a.flag.localeCompare(b.flag)).map((f) => ({
12
+ path: `${SKILLS_DIR}/${f.flag}/SKILL.md`,
13
+ content: renderSkillMd(f.flag, f.label, f.skill)
9
14
  }));
10
15
  }
11
- function renderSkillMd(skill) {
12
- const frontmatter = [`name: ${yamlString(skill.name)}`, `description: ${yamlString(skill.description)}`];
13
- if (skill.allowedTools?.length) frontmatter.push(`allowed-tools: [${skill.allowedTools.map(yamlString).join(", ")}]`);
14
- return `---\n${frontmatter.join("\n")}\n---\n\n${ensureTrailingNewline(skill.body)}`;
15
- }
16
- function assertUniqueNames(skills) {
17
- const seen = /* @__PURE__ */ new Set();
18
- for (const { name } of skills) {
19
- if (seen.has(name)) throw new Error(`Duplicate skill name '${name}' — skill names must be unique.`);
20
- seen.add(name);
21
- }
22
- }
23
- function ensureTrailingNewline(s) {
24
- return s.endsWith("\n") ? s : `${s}\n`;
16
+ function renderSkillMd(flag, label, skill) {
17
+ return `---\n${`name: ${yamlString(flag)}\ndescription: ${yamlString(skill.description)}`}\n---\n\n${`Up-to-date ${label} documentation for this project. Read it before working with ${label}:\n\n${skill.llms}`}\n`;
25
18
  }
26
19
  function yamlString(s) {
27
20
  return `"${s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"`;
@@ -1,4 +1,4 @@
1
- //#region ../../packages/features/dist/features-CPCPsYbg.js
1
+ //#region ../../packages/features/dist/features-H0oiz0KO.js
2
2
  /**
3
3
  * In forder to have an icon that has different colors based on dark/light mode:
4
4
  *
@@ -15,7 +15,10 @@ const features = [
15
15
  category: "Frontend Framework",
16
16
  label: "Vike",
17
17
  flag: "vike",
18
- llms: "https://vike.dev/llms.txt",
18
+ skill: {
19
+ description: "Vike — the full-stack framework this app runs on. Use when working with pages and file-based routing (`+Page`/`+route`/`+config`/`+data`/`+guard`), data fetching, navigation, rendering modes (SSR/SSG/SPA/streaming), `pageContext`, lifecycle hooks, `<head>`/SEO, or error pages.",
20
+ llms: "https://vike.dev/llms.txt"
21
+ },
19
22
  image: "data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iaGFtbWVyIiB3aWR0aD0iNDcuMjE3IiBoZWlnaHQ9IjQ3LjIxNyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSItNTAgLTUwIDQ3LjIxNyA0Ny4yMTciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzAuMjksLTIxLjMpIj4KICA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICA8cGF0aCBkPSJtLTguNTExLTEwLjQ0OSAxLjEyNiA0LjA2NCAyLjcwNy0yLjc2NXoiIGZpbGw9IiNhYmFiYWIiLz4KICAgPHBhdGggZD0ibS0yLjI3My0yNC40OTYtNi4yMzggMTQuMDQ3IDMuODMzIDEuMjk5IDYuMjM4LTE0LjA0OHoiIGZpbGw9IiM5NDk0OTQiLz4KICAgPHBhdGggZD0ibS0yLjI3My0yNC40OTYgMy40NjUtMS4yMDQuMzY4IDIuNTAyeiIgZmlsbD0iI2FiYWJhYiIvPgogICA8cGF0aCBkPSJtMTcuNTExIDQuNjc0LTIuNzA3IDIuNzY2LTIyLjE4OS0xMy44MjUgMi43MDctMi43NjV6IiBmaWxsPSIjOTQ5NDk0Ii8+CiAgPC9nPgogIDxnIHN0cm9rZT0iIzgyODI4MiI+CiAgIDxwYXRoIGQ9Im0tMTAuNTI2IDIzLjcwNS0xLjE3IDIuNjM0IiBzdHJva2Utd2lkdGg9IjkuNiIvPgogICA8cGF0aCBkPSJtLTEzLjg5OSAyNi41MjhjLTEuODUxLTEuMTUzLTIuMzI2LTIuMTMzLTEuMDg3LTIuMjM5IDEuMjQtLjEwNiAzLjY0My43MDkgNS40OTQgMS44NjIgMS44NSAxLjE1MyAyLjMyNiAyLjEzMiAxLjA4NiAyLjIzOC0xLjIzOS4xMDYtMy42NDItLjcwOC01LjQ5My0xLjg2MSIgZmlsbD0iIzgyODI4MiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgIDxwYXRoIGQ9Im0tMTIuNzMgMjMuODk0YzEuODUxIDEuMTUzIDQuMjU1IDEuOTY3IDUuNDk0IDEuODYxcy43NjQtMS4wODUtMS4wODctMi4yMzhjLTEuODUtMS4xNTMtNC4yNTQtMS45NjctNS40OTMtMS44NjEtMS4yNC4xMDYtLjc2NCAxLjA4NSAxLjA4NiAyLjIzOCIgZmlsbD0iIzgyODI4MiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CiAgPC9nPgogIDxnIHN0cm9rZT0iIzdhN2E3YSI+CiAgIDxwYXRoIGQ9Im0tOS44NDQgMjIuMTY5LS4zOS44NzgiIHN0cm9rZS13aWR0aD0iOS4xIi8+CiAgIDxwYXRoIGQ9Im0tMTIuNDM3IDIzLjIzNWMtMS44NTEtMS4xNTMtMi4zMjYtMi4xMzItMS4wODctMi4yMzggMS4yNC0uMTA2IDMuNjQzLjcwOCA1LjQ5NCAxLjg2MSAxLjg1IDEuMTUzIDIuMzI2IDIuMTMzIDEuMDg2IDIuMjM5LTEuMjM5LjEwNi0zLjY0Mi0uNzA5LTUuNDkzLTEuODYyIiBmaWxsPSIjN2E3YTdhIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjUiLz4KICAgPHBhdGggZD0ibS0xMi4wNDcgMjIuMzU3YzEuODUgMS4xNTMgNC4yNTQgMS45NjggNS40OTMgMS44NjIgMS4yNC0uMTA2Ljc2NC0xLjA4Ni0xLjA4Ny0yLjIzOS0xLjg1LTEuMTUzLTQuMjU0LTEuOTY3LTUuNDkzLTEuODYxcy0uNzY0IDEuMDg1IDEuMDg3IDIuMjM4IiBmaWxsPSIjN2E3YTdhIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjUiLz4KICA8L2c+CiAgPGcgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgPHBhdGggZD0ibS0xNi43MS05Ljc0OCA4LjE5OS0uNzAxIDEuMTI2IDQuMDY0LTguMTk5LjcwMXoiIGZpbGw9IiM5NDk0OTQiLz4KICAgPHBhdGggZD0ibTIzLjc0OS05LjM3My02LjIzOCAxNC4wNDctMjIuMTg5LTEzLjgyNCA2LjIzOC0xNC4wNDh6IiBmaWxsPSIjNzU3NTc1Ii8+CiAgIDxwYXRoIGQ9Im0xMC4yNzEtMTYuMDczIDMuNzUxIDMuNTM0Yy4wNjIuMDU4LjA4My4xNTYuMDUyLjIzOGwtMS45NSA1LjEyOGMtLjA0Ni4xMjEtLjE4LjE1My0uMjY4LjA2NWwtMS4wMjQtMS4wM2MtLjA5NS0uMDk2LS4yNDItLjA0OC0uMjc1LjA5MWwtLjUxNiAyLjE1MmMtLjAzNC4xNDUtLjE5MS4xOS0uMjg0LjA4MiAwIDAtLjYwNi0uNjk2LS42MDYtLjY5Ni0uMDk0LS4xMDgtLjI1LS4wNjMtLjI4NS4wODJsLS44MDMgMy4zODRjLS4wNS4yMTItLjMxNy4xNzgtLjMzNi0uMDQzbC0uMDE0LS4xNDdzLjA1OC05Ljg5Mi4wNTgtOS44OTJjLjAwMS0uMTY1LjE2NS0uMjUzLjI3Ny0uMTQ4bDEuMDc3IDEuMDA5Yy4xMDEuMDk1LjI1LjAzNC4yNzQtLjExMWwuNTk3LTMuNTg3Yy4wMjUtLjE0Ni4xNzQtLjIwNi4yNzUtLjExMXoiIGZpbGw9IiNmYmJmMjgiIHN0cm9rZT0iI2ZiYmYyOCIgc3Ryb2tlLXdpZHRoPSIuNiIvPgogICA8cGF0aCBkPSJtLTE2LjcxLTkuNzQ4IDguMTk5LS43MDEgNi4yMzgtMTQuMDQ3LTguMTk5LjcwMXoiIGZpbGw9IiM3NTc1NzUiLz4KICA8L2c+CiAgPHBhdGggZD0ibS0xLjc1NCAzLjk1MS03Ljk5MiAxNy45OTgiIHN0cm9rZT0iIzkxNTEyYiIgc3Ryb2tlLXdpZHRoPSI4LjYiLz4KICA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICA8cGF0aCBkPSJtLTExLjk1IDIyLjEzOGMtMS44NTEtMS4xNTMtMi4zMjYtMi4xMzItMS4wODctMi4yMzggMS4yNC0uMTA2IDMuNjQzLjcwOCA1LjQ5NCAxLjg2MXMyLjMyNiAyLjEzMiAxLjA4NyAyLjIzOGMtMS4yNC4xMDYtMy42NDMtLjcwOC01LjQ5NC0xLjg2MSIgZmlsbD0iIzkxNTEyYiIvPgogICA8cGF0aCBkPSJtLTMuOTU4IDQuMTM5YzEuODUxIDEuMTUzIDQuMjU0IDEuOTY4IDUuNDk0IDEuODYyIDEuMjM5LS4xMDYuNzY0LTEuMDg2LTEuMDg3LTIuMjM5cy00LjI1NC0xLjk2Ny01LjQ5My0xLjg2MWMtMS4yNC4xMDYtLjc2NCAxLjA4NSAxLjA4NiAyLjIzOCIgZmlsbD0iIzkxNTEyYiIvPgogICA8cGF0aCBkPSJtMS4xOTItMjUuNy4zNjggMi41MDIgMjIuMTg5IDEzLjgyNS0uMzY4LTIuNTAzeiIgZmlsbD0iIzk0OTQ5NCIvPgogICA8cGF0aCBkPSJtLTEwLjQ3Mi0yMy43OTUgOC4xOTktLjcwMSAzLjQ2NS0xLjIwNC04LjE5OS43MDF6IiBmaWxsPSIjOTQ5NDk0Ii8+CiAgPC9nPgogIDxnIHN0cm9rZT0iIzZlNmU2ZSI+CiAgIDxwYXRoIGQ9Im0tLjQ4NyAxLjA5Ny0xLjE3IDIuNjM0IiBzdHJva2Utd2lkdGg9IjkuMSIvPgogICA8cGF0aCBkPSJtLTMuODYgMy45MmMtMS44NTEtMS4xNTMtMi4zMjYtMi4xMzItMS4wODctMi4yMzhzMy42NDMuNzA4IDUuNDkzIDEuODYxYzEuODUxIDEuMTUzIDIuMzI3IDIuMTMyIDEuMDg3IDIuMjM4LTEuMjM5LjEwNi0zLjY0My0uNzA4LTUuNDkzLTEuODYxIiBmaWxsPSIjNmU2ZTZlIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iLjUiLz4KICAgPHBhdGggZD0ibS0yLjY5MSAxLjI4NmMxLjg1MSAxLjE1MyA0LjI1NCAxLjk2NyA1LjQ5NCAxLjg2MSAxLjIzOS0uMTA2Ljc2NC0xLjA4NS0xLjA4Ny0yLjIzOHMtNC4yNTQtMS45NjctNS40OTMtMS44NjFjLTEuMjQuMTA2LS43NjQgMS4wODUgMS4wODYgMi4yMzgiIGZpbGw9IiM2ZTZlNmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIuNSIvPgogIDwvZz4KICA8ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICA8cGF0aCBkPSJtMTguMjY5IDYuMjM2LTMuNDY1IDEuMjA0IDIuNzA3LTIuNzY2eiIgZmlsbD0iI2FiYWJhYiIvPgogICA8cGF0aCBkPSJtMTQuODA0IDcuNDQtOC4xOTkuNzAxLTIyLjE4OS0xMy44MjUgOC4xOTktLjcwMXoiIGZpbGw9IiM3NTc1NzUiLz4KICAgPHBhdGggZD0ibS0xNi43MS05Ljc0OCAxLjEyNiA0LjA2NC0uMzY3LTIuNTAyeiIgZmlsbD0iI2FiYWJhYiIvPgogICA8cGF0aCBkPSJtMjQuNTA3LTcuODEyLTYuMjM4IDE0LjA0OC0uNzU4LTEuNTYyIDYuMjM4LTE0LjA0N3oiIGZpbGw9IiM5NDk0OTQiLz4KICAgPHBhdGggZD0ibS0xMC40NzItMjMuNzk1LTYuMjM4IDE0LjA0Ny43NTkgMS41NjIgNi4yMzctMTQuMDQ4eiIgZmlsbD0iIzk0OTQ5NCIvPgogICA8cGF0aCBkPSJtMjQuNTA3LTcuODEyLTEuMTI2LTQuMDY0LjM2OCAyLjUwM3oiIGZpbGw9IiNhYmFiYWIiLz4KICAgPHBhdGggZD0ibTIzLjM4MS0xMS44NzYtOC4xOTkuNzAxLTIyLjE4OS0xMy44MjQgOC4xOTktLjcwMXoiIGZpbGw9IiM3NTc1NzUiLz4KICAgPHBhdGggZD0ibS0xMC40NzItMjMuNzk1IDMuNDY1LTEuMjA0LTIuNzA3IDIuNzY1eiIgZmlsbD0iI2FiYWJhYiIvPgogICA8cGF0aCBkPSJtMTguMjY5IDYuMjM2LTguMTk5LjcwMS0zLjQ2NSAxLjIwNCA4LjE5OS0uNzAxeiIgZmlsbD0iIzk0OTQ5NCIvPgogICA8cGF0aCBkPSJtLTE1Ljk1MS04LjE4Ni4zNjcgMi41MDIgMjIuMTg5IDEzLjgyNS0uMzY3LTIuNTAzeiIgZmlsbD0iIzk0OTQ5NCIvPgogICA8cGF0aCBkPSJtMTguMjY5IDYuMjM2LTguMTk5LjcwMSA2LjIzOC0xNC4wNDggOC4xOTktLjcwMXoiIGZpbGw9IiM3NTc1NzUiLz4KICAgPHBhdGggZD0ibS05LjcxNC0yMi4yMzQtNi4yMzcgMTQuMDQ4IDIyLjE4OSAxMy44MjQgNi4yMzctMTQuMDQ3eiIgZmlsbD0iIzc1NzU3NSIvPgogICA8cGF0aCBkPSJtMi41NDUtMTIuNzktNC41ODMtMS42NTljLS4wNzYtLjAyNy0uMTU2LjAwOC0uMTk1LjA4NSAwIDAtMi40NjMgNC44MDgtMi40NjMgNC44MDgtLjA1OC4xMTQtLjAwNS4yNjMuMTA3LjI5OGwxLjI5Ni40MTZjLjEyMi4wMzkuMTcxLjIxLjA5My4zMjEgMCAwLTEuMjA1IDEuNzIyLTEuMjA1IDEuNzIyLS4wODEuMTE2LS4wMjQuMjk0LjEwNS4zMjVsLjgyNy4xOTZjLjEyOC4wMzEuMTg2LjIwOS4xMDQuMzI1IDAgMC0xLjg5OSAyLjcwMS0xLjg5OSAyLjcwMS0uMTE4LjE2OS4wNTYuNDEuMjIuMzA0bC4xMS0uMDcgNi44NDktNS42NjFjLjExNS0uMDk1LjA4My0uMzA0LS4wNTQtLjM1NGwtMS4zMTItLjQ4Yy0uMTIzLS4wNDUtLjE2NS0uMjI0LS4wNzgtLjMzMSAwIDAgMi4xNTctMi42MTUgMi4xNTctMi42MTUuMDg3LS4xMDYuMDQ1LS4yODYtLjA3OS0uMzMxeiIgZmlsbD0iI2ZiYmYyOCIgc3Ryb2tlPSIjZmJiZjI4IiBzdHJva2Utd2lkdGg9Ii42Ii8+CiAgIDxwYXRoIGQ9Im0yNC41MDctNy44MTItOC4xOTkuNzAxLTEuMTI2LTQuMDY0IDguMTk5LS43MDF6IiBmaWxsPSIjOTQ5NDk0Ii8+CiAgIDxwYXRoIGQ9Im0xNS4xODItMTEuMTc1LTIuNzA3IDIuNzY2LTIyLjE4OS0xMy44MjUgMi43MDctMi43NjV6IiBmaWxsPSIjOTQ5NDk0Ii8+CiAgIDxwYXRoIGQ9Im0xMC4wNyA2LjkzNy0zLjQ2NSAxLjIwNC0uMzY3LTIuNTAzeiIgZmlsbD0iI2FiYWJhYiIvPgogICA8cGF0aCBkPSJtMTYuMzA4LTcuMTExLTYuMjM4IDE0LjA0OC0zLjgzMi0xLjI5OSA2LjIzNy0xNC4wNDd6IiBmaWxsPSIjOTQ5NDk0Ii8+CiAgIDxwYXRoIGQ9Im0xNi4zMDgtNy4xMTEtMS4xMjYtNC4wNjQtMi43MDcgMi43NjZ6IiBmaWxsPSIjYWJhYmFiIi8+CiAgPC9nPgogPC9nPgo8L3N2Zz4K",
20
23
  url: "https://vike.dev",
21
24
  tagline: "Flexible, lean, reliable, community-driven, fast Vite-based frontend framework",
@@ -29,13 +32,17 @@ const features = [
29
32
  }],
30
33
  tooltip: "Vike cannot be disabled. It is the foundation that allows all others tools to work cohesively",
31
34
  invisibleCli: true,
35
+ invisibleWeb: true,
32
36
  readonly: true
33
37
  },
34
38
  {
35
39
  category: "UI Framework",
36
40
  label: "React",
37
41
  flag: "react",
38
- llms: "https://react.dev/llms.txt",
42
+ skill: {
43
+ description: "React (via `vike-react`) — the UI library this app renders with. Use when writing or debugging components, hooks (`useState`/`useEffect`/`useContext`), refs, context, or fixing SSR/hydration mismatches.",
44
+ llms: "https://react.dev/llms.txt"
45
+ },
39
46
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxLjEzZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDIyOCI+PHBhdGggZmlsbD0iIzAwRDhGRiIgZD0iTTIxMC40ODMgNzMuODI0YTE3MS40OSAxNzEuNDkgMCAwIDAtOC4yNC0yLjU5N2MuNDY1LTEuOS44OTMtMy43NzcgMS4yNzMtNS42MjFjNi4yMzgtMzAuMjgxIDIuMTYtNTQuNjc2LTExLjc2OS02Mi43MDhjLTEzLjM1NS03LjctMzUuMTk2LjMyOS01Ny4yNTQgMTkuNTI2YTE3MS4yMyAxNzEuMjMgMCAwIDAtNi4zNzUgNS44NDhhMTU1Ljg2NiAxNTUuODY2IDAgMCAwLTQuMjQxLTMuOTE3QzEwMC43NTkgMy44MjkgNzcuNTg3LTQuODIyIDYzLjY3MyAzLjIzM0M1MC4zMyAxMC45NTcgNDYuMzc5IDMzLjg5IDUxLjk5NSA2Mi41ODhhMTcwLjk3NCAxNzAuOTc0IDAgMCAwIDEuODkyIDguNDhjLTMuMjguOTMyLTYuNDQ1IDEuOTI0LTkuNDc0IDIuOThDMTcuMzA5IDgzLjQ5OCAwIDk4LjMwNyAwIDExMy42NjhjMCAxNS44NjUgMTguNTgyIDMxLjc3OCA0Ni44MTIgNDEuNDI3YTE0NS41MiAxNDUuNTIgMCAwIDAgNi45MjEgMi4xNjVhMTY3LjQ2NyAxNjcuNDY3IDAgMCAwLTIuMDEgOS4xMzhjLTUuMzU0IDI4LjItMS4xNzMgNTAuNTkxIDEyLjEzNCA1OC4yNjZjMTMuNzQ0IDcuOTI2IDM2LjgxMi0uMjIgNTkuMjczLTE5Ljg1NWExNDUuNTY3IDE0NS41NjcgMCAwIDAgNS4zNDItNC45MjNhMTY4LjA2NCAxNjguMDY0IDAgMCAwIDYuOTIgNi4zMTRjMjEuNzU4IDE4LjcyMiA0My4yNDYgMjYuMjgyIDU2LjU0IDE4LjU4NmMxMy43MzEtNy45NDkgMTguMTk0LTMyLjAwMyAxMi40LTYxLjI2OGExNDUuMDE2IDE0NS4wMTYgMCAwIDAtMS41MzUtNi44NDJjMS42Mi0uNDggMy4yMS0uOTc0IDQuNzYtMS40ODhjMjkuMzQ4LTkuNzIzIDQ4LjQ0My0yNS40NDMgNDguNDQzLTQxLjUyYzAtMTUuNDE3LTE3Ljg2OC0zMC4zMjYtNDUuNTE3LTM5Ljg0NFptLTYuMzY1IDcwLjk4NGMtMS40LjQ2My0yLjgzNi45MS00LjMgMS4zNDVjLTMuMjQtMTAuMjU3LTcuNjEyLTIxLjE2My0xMi45NjMtMzIuNDMyYzUuMTA2LTExIDkuMzEtMjEuNzY3IDEyLjQ1OS0zMS45NTdjMi42MTkuNzU4IDUuMTYgMS41NTcgNy42MSAyLjRjMjMuNjkgOC4xNTYgMzguMTQgMjAuMjEzIDM4LjE0IDI5LjUwNGMwIDkuODk2LTE1LjYwNiAyMi43NDMtNDAuOTQ2IDMxLjE0Wm0tMTAuNTE0IDIwLjgzNGMyLjU2MiAxMi45NCAyLjkyNyAyNC42NCAxLjIzIDMzLjc4N2MtMS41MjQgOC4yMTktNC41OSAxMy42OTgtOC4zODIgMTUuODkzYy04LjA2NyA0LjY3LTI1LjMyLTEuNC00My45MjctMTcuNDEyYTE1Ni43MjYgMTU2LjcyNiAwIDAgMS02LjQzNy01Ljg3YzcuMjE0LTcuODg5IDE0LjQyMy0xNy4wNiAyMS40NTktMjcuMjQ2YzEyLjM3Ni0xLjA5OCAyNC4wNjgtMi44OTQgMzQuNjcxLTUuMzQ1YTEzNC4xNyAxMzQuMTcgMCAwIDEgMS4zODYgNi4xOTNaTTg3LjI3NiAyMTQuNTE1Yy03Ljg4MiAyLjc4My0xNC4xNiAyLjg2My0xNy45NTUuNjc1Yy04LjA3NS00LjY1Ny0xMS40MzItMjIuNjM2LTYuODUzLTQ2Ljc1MmExNTYuOTIzIDE1Ni45MjMgMCAwIDEgMS44NjktOC40OTljMTAuNDg2IDIuMzIgMjIuMDkzIDMuOTg4IDM0LjQ5OCA0Ljk5NGM3LjA4NCA5Ljk2NyAxNC41MDEgMTkuMTI4IDIxLjk3NiAyNy4xNWExMzQuNjY4IDEzNC42NjggMCAwIDEtNC44NzcgNC40OTJjLTkuOTMzIDguNjgyLTE5Ljg4NiAxNC44NDItMjguNjU4IDE3Ljk0Wk01MC4zNSAxNDQuNzQ3Yy0xMi40ODMtNC4yNjctMjIuNzkyLTkuODEyLTI5Ljg1OC0xNS44NjNjLTYuMzUtNS40MzctOS41NTUtMTAuODM2LTkuNTU1LTE1LjIxNmMwLTkuMzIyIDEzLjg5Ny0yMS4yMTIgMzcuMDc2LTI5LjI5M2MyLjgxMy0uOTggNS43NTctMS45MDUgOC44MTItMi43NzNjMy4yMDQgMTAuNDIgNy40MDYgMjEuMzE1IDEyLjQ3NyAzMi4zMzJjLTUuMTM3IDExLjE4LTkuMzk5IDIyLjI0OS0xMi42MzQgMzIuNzkyYTEzNC43MTggMTM0LjcxOCAwIDAgMS02LjMxOC0xLjk3OVptMTIuMzc4LTg0LjI2Yy00LjgxMS0yNC41ODctMS42MTYtNDMuMTM0IDYuNDI1LTQ3Ljc4OWM4LjU2NC00Ljk1OCAyNy41MDIgMi4xMTEgNDcuNDYzIDE5LjgzNWExNDQuMzE4IDE0NC4zMTggMCAwIDEgMy44NDEgMy41NDVjLTcuNDM4IDcuOTg3LTE0Ljc4NyAxNy4wOC0yMS44MDggMjYuOTg4Yy0xMi4wNCAxLjExNi0yMy41NjUgMi45MDgtMzQuMTYxIDUuMzA5YTE2MC4zNDIgMTYwLjM0MiAwIDAgMS0xLjc2LTcuODg3Wm0xMTAuNDI3IDI3LjI2OGEzNDcuOCAzNDcuOCAwIDAgMC03Ljc4NS0xMi44MDNjOC4xNjggMS4wMzMgMTUuOTk0IDIuNDA0IDIzLjM0MyA0LjA4Yy0yLjIwNiA3LjA3Mi00Ljk1NiAxNC40NjUtOC4xOTMgMjIuMDQ1YTM4MS4xNTEgMzgxLjE1MSAwIDAgMC03LjM2NS0xMy4zMjJabS00NS4wMzItNDMuODYxYzUuMDQ0IDUuNDY1IDEwLjA5NiAxMS41NjYgMTUuMDY1IDE4LjE4NmEzMjIuMDQgMzIyLjA0IDAgMCAwLTMwLjI1Ny0uMDA2YzQuOTc0LTYuNTU5IDEwLjA2OS0xMi42NTIgMTUuMTkyLTE4LjE4Wk04Mi44MDIgODcuODNhMzIzLjE2NyAzMjMuMTY3IDAgMCAwLTcuMjI3IDEzLjIzOGMtMy4xODQtNy41NTMtNS45MDktMTQuOTgtOC4xMzQtMjIuMTUyYzcuMzA0LTEuNjM0IDE1LjA5My0yLjk3IDIzLjIwOS0zLjk4NGEzMjEuNTI0IDMyMS41MjQgMCAwIDAtNy44NDggMTIuODk3Wm04LjA4MSA2NS4zNTJjLTguMzg1LS45MzYtMTYuMjkxLTIuMjAzLTIzLjU5My0zLjc5M2MyLjI2LTcuMyA1LjA0NS0xNC44ODUgOC4yOTgtMjIuNmEzMjEuMTg3IDMyMS4xODcgMCAwIDAgNy4yNTcgMTMuMjQ2YzIuNTk0IDQuNDggNS4yOCA4Ljg2OCA4LjAzOCAxMy4xNDdabTM3LjU0MiAzMS4wM2MtNS4xODQtNS41OTItMTAuMzU0LTExLjc3OS0xNS40MDMtMTguNDMzYzQuOTAyLjE5MiA5Ljg5OS4yOSAxNC45NzguMjljNS4yMTggMCAxMC4zNzYtLjExNyAxNS40NTMtLjM0M2MtNC45ODUgNi43NzQtMTAuMDE4IDEyLjk3LTE1LjAyOCAxOC40ODZabTUyLjE5OC01Ny44MTdjMy40MjIgNy44IDYuMzA2IDE1LjM0NSA4LjU5NiAyMi41MmMtNy40MjIgMS42OTQtMTUuNDM2IDMuMDU4LTIzLjg4IDQuMDcxYTM4Mi40MTcgMzgyLjQxNyAwIDAgMCA3Ljg1OS0xMy4wMjZhMzQ3LjQwMyAzNDcuNDAzIDAgMCAwIDcuNDI1LTEzLjU2NVptLTE2Ljg5OCA4LjEwMWEzNTguNTU3IDM1OC41NTcgMCAwIDEtMTIuMjgxIDE5LjgxNWEzMjkuNCAzMjkuNCAwIDAgMS0yMy40NDQuODIzYy03Ljk2NyAwLTE1LjcxNi0uMjQ4LTIzLjE3OC0uNzMyYTMxMC4yMDIgMzEwLjIwMiAwIDAgMS0xMi41MTMtMTkuODQ2aC4wMDFhMzA3LjQxIDMwNy40MSAwIDAgMS0xMC45MjMtMjAuNjI3YTMxMC4yNzggMzEwLjI3OCAwIDAgMSAxMC44OS0yMC42MzdsLS4wMDEuMDAxYTMwNy4zMTggMzA3LjMxOCAwIDAgMSAxMi40MTMtMTkuNzYxYzcuNjEzLS41NzYgMTUuNDItLjg3NiAyMy4zMS0uODc2SDEyOGM3LjkyNiAwIDE1Ljc0My4zMDMgMjMuMzU0Ljg4M2EzMjkuMzU3IDMyOS4zNTcgMCAwIDEgMTIuMzM1IDE5LjY5NWEzNTguNDg5IDM1OC40ODkgMCAwIDEgMTEuMDM2IDIwLjU0YTMyOS40NzIgMzI5LjQ3MiAwIDAgMS0xMSAyMC43MjJabTIyLjU2LTEyMi4xMjRjOC41NzIgNC45NDQgMTEuOTA2IDI0Ljg4MSA2LjUyIDUxLjAyNmMtLjM0NCAxLjY2OC0uNzMgMy4zNjctMS4xNSA1LjA5Yy0xMC42MjItMi40NTItMjIuMTU1LTQuMjc1LTM0LjIzLTUuNDA4Yy03LjAzNC0xMC4wMTctMTQuMzIzLTE5LjEyNC0yMS42NC0yNy4wMDhhMTYwLjc4OSAxNjAuNzg5IDAgMCAxIDUuODg4LTUuNGMxOC45LTE2LjQ0NyAzNi41NjQtMjIuOTQxIDQ0LjYxMi0xOC4zWk0xMjggOTAuODA4YzEyLjYyNSAwIDIyLjg2IDEwLjIzNSAyMi44NiAyMi44NnMtMTAuMjM1IDIyLjg2LTIyLjg2IDIyLjg2cy0yMi44Ni0xMC4yMzUtMjIuODYtMjIuODZzMTAuMjM1LTIyLjg2IDIyLjg2LTIyLjg2WiIvPjwvc3ZnPg==",
40
47
  url: "https://react.dev",
41
48
  spectrum: "beaten_path",
@@ -54,7 +61,10 @@ const features = [
54
61
  category: "UI Framework",
55
62
  label: "Vue",
56
63
  flag: "vue",
57
- llms: "https://vuejs.org/llms.txt",
64
+ skill: {
65
+ description: "Vue 3 (via `vike-vue`) — the UI framework this app renders with. Use when writing Single-File Components, using the Composition API (`ref`/`reactive`/`computed`/`watch`), lifecycle, or fixing SSR/hydration mismatches.",
66
+ llms: "https://vuejs.org/llms.txt"
67
+ },
58
68
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxLjE2ZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDIyMSI+PHBhdGggZmlsbD0iIzQxQjg4MyIgZD0iTTIwNC44IDBIMjU2TDEyOCAyMjAuOEwwIDBoOTcuOTJMMTI4IDUxLjJMMTU3LjQ0IDBoNDcuMzZaIi8+PHBhdGggZmlsbD0iIzQxQjg4MyIgZD0ibTAgMGwxMjggMjIwLjhMMjU2IDBoLTUxLjJMMTI4IDEzMi40OEw1MC41NiAwSDBaIi8+PHBhdGggZmlsbD0iIzM1NDk1RSIgZD0iTTUwLjU2IDBMMTI4IDEzMy4xMkwyMDQuOCAwaC00Ny4zNkwxMjggNTEuMkw5Ny45MiAwSDUwLjU2WiIvPjwvc3ZnPg==",
59
69
  url: "https://vuejs.org",
60
70
  tagline: "The Progressive JavaScript Framework",
@@ -78,7 +88,10 @@ const features = [
78
88
  category: "UI Framework",
79
89
  label: "SolidJS",
80
90
  flag: "solid",
81
- llms: "https://docs.solidjs.com/llms.txt",
91
+ skill: {
92
+ description: "SolidJS (via `vike-solid`) — the UI framework this app renders with. Use when writing components with signals/stores, fine-grained reactivity (`createSignal`/`createEffect`/`createMemo`), control flow (`<Show>`/`<For>`), or fixing SSR/hydration issues.",
93
+ llms: "https://docs.solidjs.com/llms.txt"
94
+ },
82
95
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxLjA4ZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIyNTYgMjM5IDI1NiAyMzkiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0ibG9nb3NTb2xpZGpzSWNvbjAiIHgxPSIyNy41IiB4Mj0iMTUyIiB5MT0iMyIgeTI9IjYzLjUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQ5LjU2IDIzMy4xMikgc2NhbGUoMS42MTAwNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9Ii4xIiBzdG9wLWNvbG9yPSIjNzZiM2UxIi8+PHN0b3Agb2Zmc2V0PSIuMyIgc3RvcC1jb2xvcj0iI2RjZjJmZCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzc2YjNlMSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsb2dvc1NvbGlkanNJY29uMSIgeDE9Ijk1LjgiIHgyPSI3NCIgeTE9IjMyLjYiIHkyPSIxMDUuMiIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyNDkuNTYgMjMzLjEyKSBzY2FsZSgxLjYxMDA2KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzc2YjNlMSIvPjxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9IiM0Mzc3YmIiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMxZjNiNzciLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibG9nb3NTb2xpZGpzSWNvbjIiIHgxPSIxOC40IiB4Mj0iMTQ0LjMiIHkxPSI2NC4yIiB5Mj0iMTQ5LjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQ5LjU2IDIzMy4xMikgc2NhbGUoMS42MTAwNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMzMTVhYTkiLz48c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjNTE4YWM4Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE1YWE5Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImxvZ29zU29saWRqc0ljb24zIiB4MT0iNzUuMiIgeDI9IjI0LjQiIHkxPSI3NC41IiB5Mj0iMjYwLjgiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQ5LjU2IDIzMy4xMikgc2NhbGUoMS42MTAwNikiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM0Mzc3YmIiLz48c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSIjMWEzMzZiIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMWEzMzZiIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHBhdGggZmlsbD0iIzc2YjNlMSIgZD0iTTUxMiAyODkuNDcycy04NS4zMzMtNjIuNzkxLTE1MS4zNDctNDguMzAxbC00LjgyOSAxLjYxYy05LjY2IDMuMjIxLTE3LjcxMSA4LjA1LTIyLjU0MiAxNC40OTFsLTMuMjE5IDQuODI5bC0yNC4xNTIgNDEuODYybDQxLjg2MyA4LjA1MWMxNy43MSAxMS4yNyA0MC4yNTEgMTYuMTAxIDYxLjE4MiAxMS4yN2w3NC4wNjMgMTQuNDkxTDUxMiAyODkuNDcyWiIvPjxwYXRoIGZpbGw9InVybCgjbG9nb3NTb2xpZGpzSWNvbjApIiBkPSJNNTEyIDI4OS40NzJzLTg1LjMzMy02Mi43OTEtMTUxLjM0Ny00OC4zMDFsLTQuODI5IDEuNjFjLTkuNjYgMy4yMjEtMTcuNzExIDguMDUtMjIuNTQyIDE0LjQ5MWwtMy4yMTkgNC44MjlsLTI0LjE1MiA0MS44NjJsNDEuODYzIDguMDUxYzE3LjcxIDExLjI3IDQwLjI1MSAxNi4xMDEgNjEuMTgyIDExLjI3bDc0LjA2MyAxNC40OTFMNTEyIDI4OS40NzJaIiBvcGFjaXR5PSIuMyIvPjxwYXRoIGZpbGw9IiM1MThhYzgiIGQ9Im0zMzMuMjgyIDI4OS40NzJsLTYuNDM5IDEuNjExYy0yNy4zNzEgOC4wNS0zNS40MjEgMzMuODExLTIwLjkzMiA1Ni4zNTJjMTYuMTAxIDIwLjkzMSA0OS45MTMgMzIuMjAxIDc3LjI4NCAyNC4xNTFsOTkuODI0LTMzLjgxMXMtODUuMzM0LTYyLjc5Mi0xNDkuNzM3LTQ4LjMwM1oiLz48cGF0aCBmaWxsPSJ1cmwoI2xvZ29zU29saWRqc0ljb24xKSIgZD0ibTMzMy4yODIgMjg5LjQ3MmwtNi40MzkgMS42MTFjLTI3LjM3MSA4LjA1LTM1LjQyMSAzMy44MTEtMjAuOTMyIDU2LjM1MmMxNi4xMDEgMjAuOTMxIDQ5LjkxMyAzMi4yMDEgNzcuMjg0IDI0LjE1MWw5OS44MjQtMzMuODExcy04NS4zMzQtNjIuNzkyLTE0OS43MzctNDguMzAzWiIgb3BhY2l0eT0iLjMiLz48cGF0aCBmaWxsPSJ1cmwoI2xvZ29zU29saWRqc0ljb24yKSIgZD0iTTQ2NS4zMDggMzYxLjkyNWMtMTguNDM5LTIzLjAzNi00OS4wMDgtMzIuNTg4LTc3LjI4My0yNC4xNWwtOTkuODIzIDMyLjIwMUwyNTYgNDI2LjMyOGwxODAuMzI3IDMwLjU5MmwzMi4yMDEtNTcuOTYzYzYuNDQxLTExLjI3MSA0LjgzMS0yNC4xNS0zLjIyLTM3LjAzMloiLz48cGF0aCBmaWxsPSJ1cmwoI2xvZ29zU29saWRqc0ljb24zKSIgZD0iTTQzMy4xMDYgNDE4LjI3N2MtMTguNDM5LTIzLjAzNi00OS4wMDYtMzIuNTg4LTc3LjI4Mi0yNC4xNUwyNTYgNDI2LjMyOHM4NS4zMzMgNjQuNDAyIDE1MS4zNDYgNDguMzAzbDQuODMtMS42MTJjMjcuMzcxLTguMDQ5IDM3LjAzMS0zMy44MSAyMC45My01NC43NDJaIi8+PC9zdmc+",
83
96
  url: "https://www.solidjs.com",
84
97
  spectrum: "bleeding_edge",
@@ -130,7 +143,10 @@ const features = [
130
143
  category: "UI Component Libraries",
131
144
  label: "daisyUI",
132
145
  flag: "daisyui",
133
- llms: "https://daisyui.com/llms.txt",
146
+ skill: {
147
+ description: "daisyUI — semantic component classes on top of Tailwind (`btn`, `card`, `modal`, `alert`, …). Use when building UI with daisyUI components, using its color names, or configuring and switching themes.",
148
+ llms: "https://daisyui.com/llms.txt"
149
+ },
134
150
  dependsOn: ["tailwindcss"],
135
151
  image: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCA0MTUgNDE1JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxyZWN0IHg9JzgyLjUnIHk9JzI5MCcgd2lkdGg9JzI1MCcgaGVpZ2h0PScxMjUnIHJ4PSc2Mi41JyBmaWxsPScjMUFEMUE1Jz48L3JlY3Q+PGNpcmNsZSBjeD0nMjA3LjUnIGN5PScxMzUnIHI9JzEzMCcgZmlsbD0nYmxhY2snIGZpbGwtb3BhY2l0eT0nLjMnPjwvY2lyY2xlPjxjaXJjbGUgY3g9JzIwNy41JyBjeT0nMTM1JyByPScxMjUnIGZpbGw9J3doaXRlJz48L2NpcmNsZT48Y2lyY2xlIGN4PScyMDcuNScgY3k9JzEzNScgcj0nNTYnIGZpbGw9JyNGRjk5MDMnPjwvY2lyY2xlPjwvc3ZnPg==",
136
152
  url: "https://daisyui.com",
@@ -145,7 +161,10 @@ const features = [
145
161
  category: "UI Component Libraries",
146
162
  label: "shadcn/ui",
147
163
  flag: "shadcn-ui",
148
- llms: "https://ui.shadcn.com/llms.txt",
164
+ skill: {
165
+ description: "shadcn/ui — accessible Radix-based components copied into the app via its CLI. Use when adding a component (`shadcn add`), building forms, theming or dark mode, or working with `components.json` / the registry.",
166
+ llms: "https://ui.shadcn.com/llms.txt"
167
+ },
149
168
  dependsOn: ["tailwindcss", "react"],
150
169
  image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+IHBhdGh7ZmlsbDpibGFjazt9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXtwYXRoe2ZpbGw6d2hpdGU7fX08L3N0eWxlPjxwYXRoIGQ9Ik0yMi4yMTkgMTEuNzg0IDExLjc4NCAyMi4yMTljLS40MDcuNDA3LS40MDcgMS4wNjggMCAxLjQ3Ni40MDcuNDA3IDEuMDY4LjQwNyAxLjQ3NiAwTDIzLjY5NSAxMy4yNmMuNDA3LS40MDguNDA3LTEuMDY5IDAtMS40NzYtLjQwOC0uNDA3LTEuMDY5LS40MDctMS40NzYgMFpNMjAuMTMyLjMwNS4zMDUgMjAuMTMyYy0uNDA3LjQwNy0uNDA3IDEuMDY4IDAgMS40NzYuNDA4LjQwNyAxLjA2OS40MDcgMS40NzYgMEwyMS42MDggMS43ODFjLjQwNy0uNDA3LjQwNy0xLjA2OCAwLTEuNDc2LS40MDgtLjQwNy0xLjA2OS0uNDA3LTEuNDc2IDBaIi8+PC9zdmc+",
151
170
  url: "https://ui.shadcn.com",
@@ -160,7 +179,10 @@ const features = [
160
179
  category: "UI Component Libraries",
161
180
  label: "Mantine",
162
181
  flag: "mantine",
163
- llms: "https://mantine.dev/llms.txt",
182
+ skill: {
183
+ description: "Mantine — a React components and hooks library. Use when building UI with `@mantine/*` components, using Mantine hooks, `@mantine/form`, dates or charts, or customizing the theme via `MantineProvider`.",
184
+ llms: "https://mantine.dev/llms.txt"
185
+ },
164
186
  dependsOn: ["react"],
165
187
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAxNjMgMTYzIj48cGF0aCBmaWxsPSIjMzM5QUYwIiBkPSJNMTYyLjE2MiA4MS41YzAtNDUuMDExLTM2LjMwMS04MS41LTgxLjA4LTgxLjVDMzYuMzAxIDAgMCAzNi40ODkgMCA4MS41IDAgMTI2LjUxIDM2LjMwMSAxNjMgODEuMDgxIDE2M3M4MS4wODEtMzYuNDkgODEuMDgxLTgxLjUiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNNjUuOTgzIDQzLjA0OWE2LjIzIDYuMjMgMCAwIDAtLjMzNiA2Ljg4NCA2LjEgNi4xIDAgMCAwIDEuNjE4IDEuNzg2YzkuNDQ0IDcuMDM2IDE0Ljg2NiAxNy43OTQgMTQuODY2IDI5LjUycy01LjQyMiAyMi40ODQtMTQuODY2IDI5LjUyYTYuMiA2LjIgMCAwIDAtMS42MTYgMS43ODYgNi4yIDYuMiAwIDAgMC0uNjk0IDQuNjkzIDYuMiA2LjIgMCAwIDAgMS4wMjggMi4xODYgNi4xNSA2LjE1IDAgMCAwIDYuNDU3IDIuMzE5IDYuMiA2LjIgMCAwIDAgMi4xNzctMS4wMzUgNTAgNTAgMCAwIDAgNy45NDctNy4zOWgxNy40OTNjMy40MDYgMCA2LjE3NC0yLjc3MiA2LjE3NC02LjE5NHMtMi43NjItNi4xOTQtNi4xNzQtNi4xOTRoLTkuNjU1YTQ5LjIgNDkuMiAwIDAgMCA0LjA3MS0xOS42OSA0OS4yIDQ5LjIgMCAwIDAtNC4wNy0xOS42OTJoOS42NmMzLjQwNiAwIDYuMTczLTIuNzcxIDYuMTczLTYuMTk0cy0yLjc2Mi02LjE5My02LjE3My02LjE5M0g4Mi41NzRhNTAgNTAgMCAwIDAtNy45NTItNy4zOTcgNi4xNSA2LjE1IDAgMCAwLTQuNTc4LTEuMTUzIDYuMiA2LjIgMCAwIDAtNC4wNTUgMi40Mzh6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTYuMjM2IDc5LjM5MWE5LjMgOS4zIDAgMCAxIC42MzItMy42MDggOS4zIDkuMyAwIDAgMSAxLjk2Ny0zLjA3NyA5LjEgOS4xIDAgMCAxIDIuOTk0LTIuMDYzIDkuMDYgOS4wNiAwIDAgMSA3LjEwMyAwIDkuMTUgOS4xNSAwIDAgMSAyLjk5NSAyLjA2MyA5LjMgOS4zIDAgMCAxIDEuOTY3IDMuMDc3IDkuMzQgOS4zNCAwIDAgMS0yLjEyNSAxMC4wMDMgOS4xIDkuMSAwIDAgMS02LjM4OCAyLjYzIDkuMSA5LjEgMCAwIDEtNi4zOS0yLjYzIDkuMyA5LjMgMCAwIDEtMi43NTUtNi4zOTUiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==",
166
188
  url: "https://mantine.dev",
@@ -175,7 +197,10 @@ const features = [
175
197
  category: "Auth",
176
198
  label: "Better Auth",
177
199
  flag: "better-auth",
178
- llms: "https://www.better-auth.com/llms.txt",
200
+ skill: {
201
+ description: "Better Auth — the authentication framework this app uses. Use when reading the signed-in user or session, protecting routes, building sign-in/sign-up flows, configuring providers (email/password, OAuth/social), or adding plugins (2FA, organizations, magic link).",
202
+ llms: "https://www.better-auth.com/llms.txt"
203
+ },
179
204
  image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+IHBhdGh7ZmlsbDpibGFjazt9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXtwYXRoe2ZpbGw6d2hpdGU7fX08L3N0eWxlPjxwYXRoIGQ9Ik0wIDMuMzl2MTcuMjJoNS43ODNWMTUuMDZoNi40MzRWOC45MzlINS43ODNWMy4zOVpNMTIuMjE3IDguOTRoNS42Mzh2Ni4xMjJoLTUuNjM4djUuNTQ4SDI0VjMuMzkxSDEyLjIxN1oiLz48L3N2Zz4=",
180
205
  url: "https://better-auth.com",
181
206
  spectrum: "bleeding_edge",
@@ -236,7 +261,10 @@ const features = [
236
261
  category: "Data fetching",
237
262
  label: "tRPC",
238
263
  flag: "trpc",
239
- llms: "https://trpc.io/llms.txt",
264
+ skill: {
265
+ description: "tRPC — end-to-end typesafe APIs between this app's server and client. Use when adding a procedure (query/mutation) to the router, validating inputs, calling procedures from the client, or wiring server context.",
266
+ llms: "https://trpc.io/llms.txt"
267
+ },
240
268
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIwLjg0ZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDMwNSI+PHBhdGggZmlsbD0iIzM5OENDQiIgZD0iTTI4LjU3IDI0NC40ODRoMjEuOTgydjExLjE1M0gyOC41NzF2MjUuMzA4YTE2Ljg4IDE2Ljg4IDAgMCAwIC43MzggNS4zNjRhOC4xNTIgOC4xNTIgMCAwIDAgMi4wODggMy40YTcuODE1IDcuODE1IDAgMCAwIDMuMyAxLjg1MWMxLjIzNS4zMyAyLjUwNC41MSAzLjc4LjUzNmwuNTQ3LjAwMmMxLjE1IDAgMi4zMzggMCAzLjU2My0uMTYybC43MjctLjA5bDEuNDA5LS4xNmMuNDYxLS4wNTQuOTE1LS4xMTMgMS4zNjYtLjE4OGwuNjYtLjEwNWwxLjI0LS4xODRjLjQwMS0uMDYuNzktLjEyNCAxLjE3NS0uMTk5bC45MTgtLjE4NGwuNDI3LS4wOWwuNzktLjE3NmwuMzY2LS4wODdsMS40NzYgMTAuMzlhMTguNTA1IDE4LjUwNSAwIDAgMS0zLjc1MiAxLjZhMzUuOSAzNS45IDAgMCAxLTQuNTEzIDEuMTEzYy0xLjYuMy0zLjI2NC41MjYtNS4wMDIuNjg4YTU0LjI4IDU0LjI4IDAgMCAxLTUuMDg5LjIzOGEyOC4zOTYgMjguMzk2IDAgMCAxLTguNzUyLTEuMjVhMTYuODMgMTYuODMgMCAwIDEtNi43MjctNC4wMDJhMTcuMzQzIDE3LjM0MyAwIDAgMS00LjMwMi02Ljg1MmEyOS4xOTYgMjkuMTk2IDAgMCAxLTEuNTI1LTEwLjAwM3YtMjYuNzU4SDB2LTExLjE1M2gxMy40NDF2LTE0LjQxN2gxNS4xM3YxNC40MTdabTUzLjg4IDI5LjI3MXYyOS42MDlINjcuMTU2di03OS4yMzZoMjYuNjJhNDIuNTIgNDIuNTIgMCAwIDEgMTEuOTE2IDEuNTVhMjYuNjcgMjYuNjcgMCAwIDEgOS4xNCA0LjU1MmExOS44OCAxOS44OCAwIDAgMSA1Ljc5IDcuNTAyYTI0LjU3IDI0LjU3IDAgMCAxIDIuMDUgMTAuMzRhMjYuNzIgMjYuNzIgMCAwIDEtMS4wMTIgNy42NGEyMC4zMzEgMjAuMzMxIDAgMCAxLTcuNDAzIDEwLjgwNGEzMC4wOTYgMzAuMDk2IDAgMCAxLTUuOTAxIDMuNDg4bDE3LjAzIDMyLjY5N3YuNzEzaC0xNi40NDNMOTQuMDQgMjczLjc1NUg4Mi40NVptLjAxMi0xMi40MjhoMTEuMzE1YTE3Ljg2OCAxNy44NjggMCAwIDAgNi4yNTItMWExMC44NjYgMTAuODY2IDAgMCAwIDQuMzktMi45MTRhMTAuNTI4IDEwLjUyOCAwIDAgMCAyLjExMi0zLjU4OWMuNDQ4LTEuMzU4LjY5Mi0yLjc3NS43MjMtNC4yMDNsLjAwMi0uNTM2YTE1LjEwNCAxNS4xMDQgMCAwIDAtLjk1LTUuNTc2YTkuODY1IDkuODY1IDAgMCAwLTIuODUtNC4wMDFhMTIuMDY2IDEyLjA2NiAwIDAgMC00LjE0LTIuMTc2YTE5LjE0MyAxOS4xNDMgMCAwIDAtNC45Ny0uNzZsLTExLjg4NC0uMDAzdjI0Ljc1OFptNjcuODQ1IDQyLjAzN0gxMzUuMDR2LTc5LjIzNmgyNy4wOTVhMzQuNDEgMzQuNDEgMCAwIDEgMTEuNzAzIDEuODc2YTI2LjYzMyAyNi42MzMgMCAwIDEgOC45MjggNS4yMDFhMjMuMzA3IDIzLjMwNyAwIDAgMSA1LjYyNyA4LjA1M2EyNi4zNTggMjYuMzU4IDAgMCAxIDEuOTg4IDkuNzIzdi42NjdhMjQuMTcgMjQuMTcgMCAwIDEtMS45ODggOS44NTNhMjIuNTA3IDIyLjUwNyAwIDAgMS01LjYyNyA3Ljc3N2EyNi4zNyAyNi4zNyAwIDAgMS04Ljk2NSA1LjE3N2EzNC43MjMgMzQuNzIzIDAgMCAxLTExLjcwNCAxLjg1aC0xMS44MDNsLjAxMyAyOS4wNTlabTAtNDEuNDYyaDExLjgwM2ExNS4wMDQgMTUuMDA0IDAgMCAwIDUuNjY0LS45ODhhMTEuNTUzIDExLjU1MyAwIDAgMCA0LjAyNi0yLjY2M2ExMS4xNzggMTEuMTc4IDAgMCAwIDIuMzY0LTMuODg5Yy41My0xLjQ3Ni44LTMuMDMzLjgtNC42MDFhMTYuMzY3IDE2LjM2NyAwIDAgMC0uOC01LjE2NGExMS45NjYgMTEuOTY2IDAgMCAwLTIuMzY0LTQuMjAyYTExLjU5IDExLjU5IDAgMCAwLTQuMDI2LTIuODI1YTE0LjI2NyAxNC4yNjcgMCAwIDAtNS42NjQtMS4wMzhoLTExLjgwM3YyNS4zN1ptMTAzLjA0MiAyNy40MmEyNS4zMDcgMjUuMzA3IDAgMCAxLTUuOTAyIDguMTY1YTI2LjA0NSAyNi4wNDUgMCAwIDEtOC44MTUgNS4yMDJhMzMuNjQ3IDMzLjY0NyAwIDAgMS0xMC41NTggMS44MTRsLS43Ny0uMDAxYTMwLjc1OSAzMC43NTkgMCAwIDEtOS4wNTMtMS4yNWEyNS4zNDUgMjUuMzQ1IDAgMCAxLTcuNTAyLTMuNjc3YTI1LjcwNyAyNS43MDcgMCAwIDEtNS40MTQtNS4zODlhMzMuNjcyIDMzLjY3MiAwIDAgMS00LjAwMS02Ljk2NGE0MS41NzUgNDEuNTc1IDAgMCAxLTIuNDEzLTguMzc4YTUzLjQwOCA1My40MDggMCAwIDEtLjg1MS05LjY5di0xMC42NjZhNTMuNDMgNTMuNDMgMCAwIDEgLjc2My05LjExNWEzOS40MTEgMzkuNDExIDAgMCAxIDEuOTUtNy4xNjFsLjMzOC0uODY2YTMwLjQwOSAzMC40MDkgMCAwIDEgNC41NzctOC4wNTNhMjkuMjcxIDI5LjI3MSAwIDAgMSA2LjQxNC01Ljk3NmEyNi4xNTggMjYuMTU4IDAgMCAxIDcuMDUyLTMuMTg5YTI5LjEwOCAyOS4xMDggMCAwIDEgNy40OC0xLjExbC43Ni0uMDAzYTMzLjc2IDMzLjc2IDAgMCAxIDExLjYxNiAxLjg1YTIzLjc1NyAyMy43NTcgMCAwIDEgMTQuMzQyIDEzLjY1NWEzNy40MTEgMzcuNDExIDAgMCAxIDIuNjEzIDExLjE1M2gtMTUuMjNjLS4wOS0yLjEyLS40NDItNC4yMi0xLjA1LTYuMjUyYTEyLjM1NCAxMi4zNTQgMCAwIDAtMi40MjUtNC40NjNhMTAuNDE2IDEwLjQxNiAwIDAgMC00LjA1Mi0yLjYzOWExNi43MyAxNi43MyAwIDAgMC01LjgwMS0uOWExNC4yNDIgMTQuMjQyIDAgMCAwLTMuMzUxLjM4OGMtMSAuMjQzLTEuOTU5LjYyNi0yLjg1MSAxLjEzN2ExMS4zMjggMTEuMzI4IDAgMCAwLTMuNzUxIDMuNzUyYTIxLjk2OSAyMS45NjkgMCAwIDAtMi41MDEgNS42MzlhMzQuMDEgMzQuMDEgMCAwIDAtMS4wMjUgNS41MjZhNTguNzY3IDU4Ljc2NyAwIDAgMC0uMzI1IDYuNTAydjEwLjc2NmE2MS4yOCA2MS4yOCAwIDAgMCAuNTEyIDguNDY1YTI4LjkyIDI4LjkyIDAgMCAwIDEuNiA2LjUwMmExNS45OTIgMTUuOTkyIDAgMCAwIDEuODI2IDMuMzc2Yy42NjcuOTYgMS40ODcgMS44MDQgMi40MjYgMi41YTEwLjAwMyAxMC4wMDMgMCAwIDAgMy4yODggMS42YTE0LjU2IDE0LjU2IDAgMCAwIDQuMDUyLjUyNmExNy45MTggMTcuOTE4IDAgMCAwIDUuMzg5LS43NjNhMTAuMzAzIDEwLjMwMyAwIDAgMCA0LjA4OC0yLjRhMTEuMjUzIDExLjI1MyAwIDAgMCAyLjY2NC00LjE5YTIwLjk2OSAyMC45NjkgMCAwIDAgMS4yNS02LjE1SDI1NmEzMC4zOTYgMzAuMzk2IDAgMCAxLTIuNjUgMTAuNzI3Wk0xODYuMzggOTIuNDAybDM4LjQ4NiAyMi4yMnY0NC40NjJsLTM4LjQ4NiAyMi4yMmwtMTcuMDg1LTkuODgxbC00MS41NDUgMjMuOTg0bC00MS4yOTYtMjMuODQ3bC0xNi44NDYgOS43NDNsLTM4LjQ4Ni0yMi4yNTZWMTE0LjYybDM4LjQ4Ni0yMi4yMTlsMzguNDg2IDIyLjIydjQ0LjQyNWwtMTEuNjQzIDYuNzMzbDMxLjI5OSAxOC4wNzRsMzEuNTQ4LTE4LjIxMmwtMTEuNDA1LTYuNTk1VjExNC42MmwzOC40ODctMjIuMjE5Wk0xNTcuODk2IDEyNi4ydjI3LjEybDIzLjQ4MiAxMy41NTV2LTI3LjEyTDE1Ny44OTYgMTI2LjJabTU2Ljk2Ny0uMDM3bC0yMy40ODIgMTMuNTU0djI3LjE1OGwyMy40ODItMTMuNTkydi0yNy4xMlptLTE3My43MzggMHYyNy4xMmwyMy40ODEgMTMuNTU0di0yNy4xMmwtMjMuNDgxLTEzLjU1NFptNTYuOTY2IDBMNzQuNjEgMTM5LjcxNnYyNy4xMmwyMy40ODItMTMuNTU0di0yNy4xMlptODguMjg5LTIyLjE4MmwtMjMuNDgyIDEzLjU1NGwyMy40ODIgMTMuNTY3bDIzLjQ4MS0xMy41NjdsLTIzLjQ4MS0xMy41NTRabS0xMTYuNzcyLS4wMzdsLTIzLjQ4MiAxMy41OTFsMjMuNDgyIDEzLjUzbDIzLjQ4Mi0xMy41M2wtMjMuNDgyLTEzLjU5MVptMTkuMTQzLTY4LjkydjExLjU0bC0zNS42MSAyMC41N3YzNC43NzJsLTEwLjAwMyA1Ljc3N1Y2MS4zNTVMODguNzUgMzUuMDIzWk0xMjcuMjM3IDBsMzguNTEyIDIyLjIxOXYxMi4yMTlsNDYuNjEzIDI2LjkxN3Y0Ni4wMzlsLTEwLjAwMy01Ljc3N1Y2Ny4xMzJsLTM2LjYxLTIxLjE0MXYyMC42NjZsLTM4LjQ4NyAyMi4yMTlsLTM4LjQ4Ni0yMi4yMTlWMjIuMjE5TDEyNy4yMzcgMFpNOTguNzggMzMuNzZ2MjcuMTJsMjMuNDU3IDEzLjU1NFY0Ny4zMjZMOTguNzc5IDMzLjc2Wm01Ni45NDIgMGwtMjMuNDU3IDEzLjU2NnYyNy4wOTZMMTU1LjcyIDYwLjg4VjMzLjc2Wm0tMjguNDg0LTIyLjIwN0wxMDMuNzggMjUuMTA3bDIzLjQ1NyAxMy41NTRsMjMuNDgyLTEzLjU1NGwtMjMuNDgyLTEzLjU1NFoiLz48L3N2Zz4=",
241
269
  url: "https://trpc.io",
242
270
  spectrum: "beaten_path",
@@ -270,7 +298,10 @@ const features = [
270
298
  category: "Server",
271
299
  label: "Hono",
272
300
  flag: "hono",
273
- llms: "https://hono.dev/llms.txt",
301
+ skill: {
302
+ description: "Hono — the Web-Standards server framework powering this app's backend. Use when adding API routes or middleware, validating requests, handling cookies/headers, or changing server and runtime behavior.",
303
+ llms: "https://hono.dev/llms.txt"
304
+ },
274
305
  image: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjUwMHB4IiBoZWlnaHQ9IjUwMHB4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjAuOTkzIiBmaWxsPSIjZmY1YjExIiBkPSJNIDI1Ny41LDAuNSBDIDI1OC44MjIsMC4zMzAwMzQgMjU5Ljk4OSwwLjY2MzM2OCAyNjEsMS41QyAyOTguMTkzLDQ2Ljg5MzYgMzMzLjE5Myw5My44OTM2IDM2NiwxNDIuNUMgMzkwLjI4OSwxNzkuMDY5IDQxMC45NTUsMjE3LjczNSA0MjgsMjU4LjVDIDQ1NS4yMjEsMzMxLjEwNCA0NDEuMDU0LDM5NC4yNzEgMzg1LjUsNDQ4QyAzMzYuODkyLDQ4OS4wODIgMjgwLjg5Miw1MDUuMDgyIDIxNy41LDQ5NkMgMTQxLjcyNyw0ODAuNTUxIDkwLjIyNjUsNDM2LjcxOCA2MywzNjQuNUMgNTUuOTA4MSwzNDAuOTg5IDUzLjU3NDgsMzE2Ljk4OSA1NiwyOTIuNUMgNjAuMDM4NCwyNTAuMzQ3IDcwLjAzODQsMjA5LjY4IDg2LDE3MC41QyA5Mi42NTA5LDE1NC41MTQgMTAxLjMxOCwxMzkuODQ4IDExMiwxMjYuNUMgMTIwLjcxNSwxMzYuODggMTI5LjA0OCwxNDcuNTQ3IDEzNywxNTguNUMgMTQwLjY4MiwxNjIuMzQ5IDE0NC41MTUsMTY2LjAxNiAxNDguNSwxNjkuNUMgMTc4LjkxNywxMDkuMTM2IDIxNS4yNTEsNTIuODAyOCAyNTcuNSwwLjUgWiIvPjwvZz4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2ZmOTc1OCIgZD0iTSAyNTAuNSw4MS41IEMgMjg3LjE5MywxMjQuMDYgMzIwLjM2LDE2OS4zOTMgMzUwLDIxNy41QyAzNTkuMjkzLDIzMy40MTggMzY2Ljk1OSwyNTAuMDg1IDM3MywyNjcuNUMgMzg1LjU4NCwzMTcuMDA4IDM3Mi4wODQsMzU3Ljg0MiAzMzIuNSwzOTBDIDI5NC4yMTYsNDE2LjkzOSAyNTIuMjE2LDQyNC45MzkgMjA2LjUsNDE0QyAxNTcuMjAxLDM5OC43MDIgMTI4LjcwMSwzNjUuNTM1IDEyMSwzMTQuNUMgMTE5LjEzMSwyOTguNDA5IDEyMC43OTgsMjgyLjc0MiAxMjYsMjY3LjVDIDEzMy40MTgsMjQ4LjY2MyAxNDIuNDE4LDIzMC42NjMgMTUzLDIxMy41QyAxNjMsMTk4LjgzMyAxNzMsMTg0LjE2NyAxODMsMTY5LjVDIDIwNS43MTYsMTQwLjI5IDIyOC4yMTYsMTEwLjk1NyAyNTAuNSw4MS41IFoiLz48L2c+Cjwvc3ZnPgo=",
275
306
  url: "https://hono.dev",
276
307
  tagline: "Fast, lightweight, built on web standards. Support for any JavaScript runtime.",
@@ -287,7 +318,10 @@ const features = [
287
318
  category: "Server",
288
319
  label: "Express",
289
320
  flag: "express",
290
- llms: "https://expressjs.com/llms.txt",
321
+ skill: {
322
+ description: "Express — the Node.js server framework powering this app's backend. Use when adding API routes or middleware, handling requests and responses, or changing server behavior.",
323
+ llms: "https://expressjs.com/llms.txt"
324
+ },
291
325
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+PHN0eWxlPiBwYXRoe2ZpbGw6YmxhY2s7fUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7cGF0aHtmaWxsOndoaXRlO319PC9zdHlsZT48cGF0aCBkPSJNMTI2LjY3IDk4LjQ0Yy00LjU2IDEuMTYtNy4zOC4wNS05LjkxLTMuNzUtNS42OC04LjUxLTExLjk1LTE2LjYzLTE4LTI0LjktLjc4LTEuMDctMS41OS0yLjEyLTIuNi0zLjQ1Qzg5IDc2IDgxLjg1IDg1LjIgNzUuMTQgOTQuNzdjLTIuNCAzLjQyLTQuOTIgNC45MS05LjQgMy43bDI2LjkyLTM2LjEzTDY3LjYgMjkuNzFjNC4zMS0uODQgNy4yOS0uNDEgOS45MyAzLjQ1IDUuODMgOC41MiAxMi4yNiAxNi42MyAxOC42NyAyNS4yMSA2LjQ1LTguNTUgMTIuOC0xNi42NyAxOC44LTI1LjExIDIuNDEtMy40MiA1LTQuNzIgOS4zMy0zLjQ2LTMuMjggNC4zNS02LjQ5IDguNjMtOS43MiAxMi44OC00LjM2IDUuNzMtOC42NCAxMS41My0xMy4xNiAxNy4xNC0xLjYxIDItMS4zNSAzLjMuMDkgNS4xOUMxMDkuOSA3NiAxMTguMTYgODcuMSAxMjYuNjcgOTguNDR6TTEuMzMgNjEuNzRjLjcyLTMuNjEgMS4yLTcuMjkgMi4yLTEwLjgzIDYtMjEuNDMgMzAuNi0zMC4zNCA0Ny41LTE3LjA2QzYwLjkzIDQxLjY0IDYzLjM5IDUyLjYyIDYyLjkgNjVINy4xYy0uODQgMjIuMjEgMTUuMTUgMzUuNjIgMzUuNTMgMjguNzggNy4xNS0yLjQgMTEuMzYtOCAxMy40Ny0xNSAxLjA3LTMuNTEgMi44NC00LjA2IDYuMTQtMy4wNi0xLjY5IDguNzYtNS41MiAxNi4wOC0xMy41MiAyMC42Ni0xMiA2Ljg2LTI5LjEzIDQuNjQtMzguMTQtNC44OUM1LjI2IDg1Ljg5IDMgNzguOTIgMiA3MS4zOWMtLjE1LTEuMi0uNDYtMi4zOC0uNy0zLjU3cS4wMy0zLjA0LjAzLTYuMDh6bTUuODctMS40OWg1MC40M2MtLjMzLTE2LjA2LTEwLjMzLTI3LjQ3LTI0LTI3LjU3LTE1LS4xMi0yNS43OCAxMS4wMi0yNi40MyAyNy41N3oiIC8+PC9zdmc+",
292
326
  url: "https://expressjs.com",
293
327
  spectrum: "beaten_path",
@@ -305,7 +339,10 @@ const features = [
305
339
  category: "Server",
306
340
  label: "Fastify",
307
341
  flag: "fastify",
308
- llms: "https://fastify.dev/llms.txt",
342
+ skill: {
343
+ description: "Fastify — the high-performance Node.js server framework powering this app's backend. Use when adding routes, plugins or hooks, validating with schemas, or changing server and lifecycle behavior.",
344
+ llms: "https://fastify.dev/llms.txt"
345
+ },
309
346
  image: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nODQ5JyBoZWlnaHQ9JzU0NScgdmlld0JveD0nMCAwIDg0OSA1NDUnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTgyMi4xOCA3Ny4zMkw4NDguOSA4LjExTDg0Ny43NSAzLjgzTDU4My40MSA3My40OEM2MTEuNTUgMzIuNyA2MDEuOSAwIDYwMS45IDBDNjAxLjkgMCA1MTcuNDkgNTMuOTEgNDUzLjY0IDUyLjQ5QzM4OS43OSA1MS4wNyAzNjkuMjMgMzQuMDUgMjcxLjMzIDY1LjI2QzE3My40MyA5Ni40NyAxNDUuNzcgMTkyLjI2IDExNy40IDIxMi44MUM4OS4wMyAyMzMuMzYgMCAzMDAuNDIgMCAzMDAuNDJMMC4xOTAwMDIgMzAxLjYyTDgwLjQ1IDI3Ni4wNkM4MC40NSAyNzYuMDYgNTguNDUgMjk2LjgxIDExLjY4IDM1OS44M0MxMS42OCAzNTkuODMgMTAuODYgMzU5LjA4IDkuNSAzNTcuODNMOS41NyAzNTguMjZDOS41NyAzNTguMjYgNDcuMTcgNDE1LjcyIDg0LjA2IDQwNS4wOEM4OC4zNzQ0IDQwMy43MzkgOTIuNTU1NSA0MDIuMDAxIDk2LjU1IDM5OS44OUMxMTEuNCA0MDguMTYgMTMwLjc5IDQxNi4yOSAxNTIuMiA0MTguNTNDMTQyLjU2OCA0MDcuMTIgMTMzLjY4OSAzOTUuMDk0IDEyNS42MiAzODIuNTNMMTM1LjYyIDM3Ni4wMkwxMzQuMDYgMzc3LjE0TDE2NC42MyAzODguMzZMMTYxLjIzIDM1OS42TDE2MS41MyAzNTkuNDFMMTkxLjUzIDM3MC40MUwxODcuNzkgMzQ0LjI4QzE5MS41OSAzNDIuMjggMTk1LjQgMzQwLjQxIDE5OS4xOSAzMzguNjVMMjMwLjU1IDIyMC4yNkwzNjAuMDEgMTMxLjk0TDM0OS43MyAxNTcuODNDMzIzLjQ3IDIyMi4zOSAyNzQuMTcgMjM3LjYgMjc0LjE3IDIzNy42TDI1My42IDI0NS40QzIzOC4yOSAyNjMuNDkgMjMxLjg2IDI2Ny45NCAyMjYuNiAzMjguNjVDMjM4LjkzIDMyNS41NCAyNTAuNzIgMzI0LjgyIDI2MS40IDMyNy42NUMzMTYuNzMgMzQyLjU1IDMzNS44OSA0MDkuMjMgMzIwLjk5IDQyNy42NUMzMTcuMjYgNDMyLjI3IDMwOC4zOCA0NDAuMTcgMjk3LjE3IDQ0OS40MkgyNzQuNzJMMjc0LjQzIDQ2Ny42MUwyNzIuMTIgNDY5LjQxSDI0OS4yOEwyNDguOTkgNDg3LjE2QzI0Ni45OSA0ODguNyAyNDQuOTkgNDkwLjIxIDI0Mi45OSA0OTEuNjhDMjIxLjUyIDQ5Mi4xMyAxOTQuMzQgNDczLjQxIDE5NC4zNCA0NzMuNDFDMTk0LjM0IDQ5MC40MSAyMDguNTMgNTE2LjY4IDIwOC41MyA1MTYuNjhMMjExLjA0IDUxNS40NkwyMDguODkgNTE3LjAzQzIwOC44OSA1MTcuMDMgMjY2LjM1IDU1NS4zNCAzMDIuNTIgNTQxLjE1QzMzNC43MiA1MjguNiA0MTcuOTkgNDYyLjk3IDQ4OS44OCA0MzEuOUw3MDcuNDIgMzc0LjZMNzM2LjExIDMwMC4yOUw1NzAuMzMgMzQzLjk1VjI3Ny4xOUw3NjQuOCAyMjUuOTVMNzkzLjQ5IDE1MS42TDU3MC4zMyAyMTAuNFYxNDMuNjhMODIyLjE4IDc3LjMyWk00MjcuMzYgMjE4Ljc5TDQ3OC45OCAyMDUuMTlMNDc5LjY3IDIwNy43OEw0NjMuNTUgMjQ5LjVMNDEwLjA3IDI2My42TDQyNy4zNiAyMTguNzlaTTQ0NS4xOCAzMDguMDlMMzkxLjY4IDMyMi4xOUw0MDguOTcgMjc3LjM4TDQ2MC41NSAyNjMuNzhMNDYxLjI0IDI2Ni4zN0w0NDUuMTggMzA4LjA5Wk01MTQuODkgMjkzLjA5TDQ2MS4zOCAzMDcuMTlMNDc4LjY4IDI2Mi4zOUw1MzAuMyAyNDguNzhMNTMwLjk5IDI1MS4zN0w1MTQuODkgMjkzLjA5WicgZmlsbD0nIzIxNUZGNicvPjwvc3ZnPgo=",
310
347
  url: "https://fastify.dev",
311
348
  tagline: "Fast and low overhead web framework, for Node.js",
@@ -322,7 +359,10 @@ const features = [
322
359
  category: "Server",
323
360
  label: "Elysia",
324
361
  flag: "elysia",
325
- llms: "https://elysiajs.com/llms.txt",
362
+ skill: {
363
+ description: "Elysia — the Bun-first, end-to-end typesafe server framework powering this app's backend. Use when adding routes or plugins, validating and typing requests, or changing server behavior.",
364
+ llms: "https://elysiajs.com/llms.txt"
365
+ },
326
366
  image: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MjQuNDA0IDQ3MC44MTZDNDc4LjA4OSA0MjMuODg5IDUxMiAzNTQuOTA1IDUxMiAyNzhDNTEyIDEzNi42MTUgMzk3LjM4NSAyMiAyNTYgMjJDMTE0LjYxNSAyMiAwIDEzNi42MTUgMCAyNzhDMCAzNTIuNjU4IDMxLjk1ODMgNDE5Ljg1MSA4Mi45NDA5IDQ2Ni42NDZMODMuMTc2NyA0NjVMNDE5LjE0NCAzNTVMNDI0LjQwNCA0NzAuODE2WiIgZmlsbD0iIzMzMzMzMyIvPjxwYXRoIGQ9Ik0xODkuOTE1IDUyLjc0MTJMMTQ0LjUgNDZMMTUxLjMwMyA0My45MDY5QzE1NS40MDIgNDIuNjQ1NSAxNTkuMjQ4IDQwLjY3MTkgMTYyLjY2MiAzOC4wNzY1TDE2My43MyAzNy4yNjU0QzE2Ny44NDUgMzQuMTM3NSAxNzEuMTIgMzAuMDM2NCAxNzMuMjU5IDI1LjMzMDRDMTc0LjQxNCAyMi43ODgzIDE3NS4yMjQgMjAuMTAyNyAxNzUuNjY1IDE3LjM0NTRMMTc2LjE3MyAxNC4xNjk4QzE3Ni43MiAxMC43NDczIDE3Ni42OTIgNy4yNTc0MSAxNzYuMDkgMy44NDQxNkMxNzUuODM0IDIuMzk0MjkgMTc3LjI3OSAxLjIzMjM5IDE3OC42NCAxLjc5Mjk2TDE4MC40OTggMi41NTgxNUMxODIuODI5IDMuNTE3OTggMTg1LjA4NCA0LjY1NDM0IDE4Ny4yNDIgNS45NTczMkwxOTQuOTY1IDEwLjYyMDVDMjA1LjIyOSAxNi44MTc0IDIxNC4yMjYgMjQuOTAyMyAyMjEuNDggMzQuNDQ3N0wyMjYuNjE2IDQxLjIwNTFDMjI4LjUyOSA0My43MjI4IDIzMC43ODMgNDUuOTYyNSAyMzMuMzEzIDQ3Ljg1OTlDMjM2LjA4OCA0OS45NDExIDIzOS4xNjQgNTEuNTg3NCAyNDIuNDM1IDUyLjc0MThMMjQ2IDU0TDIyNy4yNzQgNTQuNzQ5QzIxNC43ODUgNTUuMjQ4NiAyMDIuMjc4IDU0LjU3NjQgMTg5LjkxNSA1Mi43NDEyWiIgZmlsbD0iI0NDQ0NDQyIvPjxwYXRoIGQ9Ik0xNzguMzIxIDkzLjAwNkwxOTEuNzkgNjguMzg0NEMxOTEuOTIyIDY4LjE0MyAxOTEuOTMgNjcuODUyOCAxOTEuODEyIDY3LjYwNDJMMTg3LjIyIDU3LjkzNjFDMTg0LjMzNyA1MS44NjczIDE3OC4yMTkgNDggMTcxLjUgNDhMMTcwLjIzIDQ3Ljk1NjJDMTYxLjQzNyA0Ny42NTMgMTUyLjcwNCA0Ni4zODI5IDE0NC4xODggNDQuMTY5TDE0Mi41MDQgNDMuNzMxQzEzNS41MjEgNDEuOTE1MyAxMjguNzQ2IDM5LjM3MzIgMTIyLjI5MyAzNi4xNDYzTDExOS40NDYgMzQuNzIzQzExNS4xNTkgMzIuNTc5NyAxMTEuMDk5IDMwLjAxMiAxMDcuMzI1IDI3LjA1ODRMMTAzLjU1IDI0LjEwNDNDMTAyLjQyOCAyMy4yMjY1IDEwMC44MDMgMjMuNDUwNiA5OS45NjA2IDI0LjU5OTJDOTcuMzY1MSAyOC4xMzg0IDk1LjczNzkgMzIuMjkzNSA5NS4yMzk1IDM2LjY1NDFMOTQuNTUzNSA0Mi42NTcxQzk0LjE4NTQgNDUuODc3NCA5NC4xNDQ2IDQ5LjEyNjcgOTQuNDMxNiA1Mi4zNTUyTDk2LjEwMzEgNzEuMTU5NUM5Ny4zNDY3IDg1LjE1MDEgMTAyLjE3NSA5OC41ODQgMTEwLjEyMyAxMTAuMTY1TDExMS44MjUgMTEyLjY0NUMxMTQuMjY3IDExNi4yMDMgMTE3LjExMyAxMTkuNDY2IDEyMC4zMDYgMTIyLjM2OUMxMjAuNzU2IDEyMi43NzggMTIxLjMyOSAxMjMuMDMgMTIxLjkzNiAxMjMuMDg0QzE0NS4wMjkgMTI1LjE1NiAxNjcuMTk0IDExMy4zNDggMTc4LjMyMSA5My4wMDZaIiBmaWxsPSIjQ0NDQ0NDIi8+PHBhdGggZD0iTTEyNy4zNzggMTIzLjUzOEwxNDMuMzc2IDExNi42MTNDMTUwLjQzOCAxMTMuNTU3IDE1Mi41ODggMTA0LjU3NyAxNDcuNjc2IDk4LjY1MzNDMTQzLjY4MyA5My44Mzc4IDEzNi41OCA5My4wODAzIDEzMS42NjEgOTYuOTQ1M0wxMjcuODY3IDk5LjkyNTZDMTI2Ljk1OCAxMDAuNjQgMTI2LjEyNyAxMDEuNDQ4IDEyNS4zODcgMTAyLjMzNkwxMTYuMjYzIDExMy4yODRDMTE0Ljk4MiAxMTQuODIyIDExNS4wODQgMTE3LjA4NCAxMTYuNSAxMTguNUwxMTkuMzE4IDEyMS43MjFDMTE5Ljc3IDEyMi4yMzcgMTIwLjI5NiAxMjIuNjg1IDEyMC44NzggMTIzLjA0OUMxMjIuODMzIDEyNC4yNzEgMTI1LjI2MyAxMjQuNDUzIDEyNy4zNzggMTIzLjUzOFoiIGZpbGw9IiNFREVERUQiLz48cGF0aCBkPSJNMTQ3Ljk4OCA0NC44NDM3TDE0Ny41IDQ1TDE0OC45NjIgNDUuNDY1MUMxNTUuMjk0IDQ3LjQ3OTggMTYxLjg2MSA0OC42NiAxNjguNDk4IDQ4Ljk3NjFDMTY4LjgzIDQ4Ljk5MTkgMTY5LjE2MyA0OC45NTM0IDE2OS40ODMgNDguODYxOUwxNzIuNSA0OEwxNzQgNDcuNUwxNjQuNDE5IDQ1LjQxNzJDMTYzLjE1OCA0NS4xNDMxIDE2MS45ODIgNDQuNTY4NyAxNjAuOTkxIDQzLjc0MjZDMTYwLjIxOCA0My4wOTgxIDE2MC4yMjMgNDEuOTA4NCAxNjEuMDAyIDQxLjI3MDhMMTYyLjQyMyA0MC4xMDg0QzE2NC4xMiAzOC43MTk3IDE2NS40OTMgMzYuOTc2IDE2Ni40NDQgMzVDMTYwLjkzNCAzOS4zNjQyIDE1NC42ODIgNDIuNjk4OCAxNDcuOTg4IDQ0Ljg0MzdaIiBmaWxsPSIjQjJCMkIyIi8+PHBhdGggZD0iTTIwMi43NzYgMjE5LjQyOEw3Mi4yOTA1IDQ1Mi42OTNDNzEuNjQzIDQ1My44NTEgNzAuMDY4NyA0NTQuMDY5IDY5LjEzMDggNDUzLjEzMUw2Ni41IDQ1MC41TDU1LjUgNDM4TDQ4LjQ4ODggNDI4LjkyN0M0MS44NDA3IDQyMC4zMjMgMzUuOTA1MiA0MTEuMTkyIDMwLjc0MTQgNDAxLjYyNEwyOS43NDM0IDM5OS43NzVDMjQuMjU4MSAzODkuNjExIDE5LjY2MzUgMzc4Ljk5MSAxNi4wMTEyIDM2OC4wMzRMMTIuNSAzNTcuNUM3LjIyNTE5IDMzOC4zNzkgNi4wMTQ0NyAzMTguMzY1IDguOTQ1ODMgMjk4Ljc0N0w5LjA2OTYxIDI5Ny45MTlDMTAuMzU0IDI4OS4zMjMgMTIuNDAzNCAyODAuODYgMTUuMTkzNSAyNzIuNjI5TDIxIDI1NS41TDI1LjMzMzQgMjQ2LjM4NUMzMi4wNTM3IDIzMi4yNDkgNDEuMzE5MyAyMTkuNDcyIDUyLjY2NjkgMjA4LjY5MUw1OC4xNzE5IDIwMy40NjJDNjkuNTUyOSAxOTIuNjUgODMuMzkzNyAxODQuNzY5IDk4LjUgMTgwLjVDOTQuOTY3IDE4MS40OTggOTEuMzYwOCAxODIuMjE2IDg3LjcxNDkgMTgyLjY0N0w4MC41IDE4My41TDc1IDE4NEw2OSAxODVMNjMgMTg1LjU2MUw1OSAxODZMNTYuMTE4NiAxODYuMThDNTUuMTkyNyAxODYuMjM4IDU0Ljc1NzYgMTg1LjA1NyA1NS40OTk4IDE4NC41TDU1LjUwMDIgMTg0LjVMNTkuNTI3MyAxODIuNTdDNzIuNTA2NiAxNzYuMzUxIDgzLjE3NjYgMTY2LjE3MiA5MCAxNTMuNUw5NC40NDc1IDE0Ni41NjJDOTkuNzUxMSAxMzguMjg4IDEwNi44MDcgMTMxLjI4IDExNS4xMTYgMTI2LjAzMkwxMTYuODMzIDEyNC45NDhDMTE5LjkzNSAxMjIuOTg5IDEyMy4yNDYgMTIxLjM4NCAxMjYuNzA1IDEyMC4xNjNMMTQyLjQ0NiAxMTQuNjA3QzE0NS4zNDggMTEzLjU4MyAxNDcuNjkgMTExLjM5IDE0OC45MDMgMTA4LjU2MUwxNDkuMTQzIDEwOEMxNDkuNzA1IDEwNi42ODcgMTQ5LjkzMiAxMDUuMjU1IDE0OS44MDMgMTAzLjgzM0MxNDkuNjA4IDEwMS42ODkgMTQ4LjYxNiA5OS42OTY2IDE0Ny4wMjMgOTguMjQ4NUwxNDQuMjU2IDk1LjczMjhDMTQ0LjA4NiA5NS41Nzc5IDE0My45MyA5NS40MDczIDE0My43OTIgOTUuMjIzMkwxMjYgNzEuNUwxMTEuODAzIDUxLjkzMTVDMTA4Ljk5NCA0OC4wNTkyIDEwNy4zNTkgNDMuNDU5OSAxMDcuMDk0IDM4LjY4MzJDMTA3LjA1MSAzNy45MjYzIDEwNy44MzYgMzcuNDAxNSAxMDguNTIgMzcuNzI5NUwxMjMuODgxIDQ1LjEwMjhDMTM3LjE3NCA1MS40ODM0IDE1Mi4zMyA1Mi44MjUgMTY2LjUzNyA0OC44Nzg2QzE2OS44NCA0Ny45NjEyIDE3My4yMTQgNDcuMzI0MiAxNzYuNjI0IDQ2Ljk3NDVMMTgzLjY3NSA0Ni4yNTEzQzIwMS40MDYgNDQuNDMyOCAyMTkuMzIgNDUuOTA1NCAyMzYuNTE2IDUwLjU5NTNMMjM4IDUxTDI1NC43OTggNTcuMDQ3MkMyNzUuODY5IDY0LjYzMjkgMjkyLjU2NyA4MS4wNTcxIDMwMC41IDEwMkwzMDQuMDIyIDExNS43MzRDMzA1LjAwNCAxMTkuNTY3IDMwNi4zOTIgMTIzLjI4NSAzMDguMTYyIDEyNi44MjRDMzEyLjMyMSAxMzUuMTQyIDMxOC40OTUgMTQyLjI4OSAzMjYuMTIxIDE0Ny42MTNMMzM1LjA4NCAxNTMuODdDMzM5LjAyMyAxNTYuNjIgMzQzLjE1NyAxNTkuMDc4IDM0Ny40NTMgMTYxLjIyN0wzNjcuMjg5IDE3MS4xNDVDMzY4LjE3OCAxNzEuNTg5IDM2OC40NDQgMTcyLjczMiAzNjcuODQzIDE3My41MjNDMzYyLjM3MiAxODAuNzIxIDM1NS4xNDggMTg2LjM5NSAzNDYuODU5IDE5MC4wMDVMMzM1LjM3MSAxOTUuMDA4QzMzMC43OTcgMTk3IDMyNi4wODEgMTk4LjY1IDMyMS4yNjIgMTk5Ljk0NUwzMTIuODIyIDIwMi4yMTJDMzAwLjk5MiAyMDUuMzkgMjg4Ljc5NiAyMDcgMjc2LjU0NiAyMDdIMjU2LjMzM0MyNTIuMTQ4IDIwNyAyNDguMDAxIDIwNi4yMTMgMjQ0LjEwOCAyMDQuNjc5QzIyOC41ODEgMTk4LjU2MiAyMTAuOTIzIDIwNC44NjMgMjAyLjc3NiAyMTkuNDI4WiIgZmlsbD0id2hpdGUiLz48cGF0aCBkPSJNMjcxLjE4NSAxMzUuMzE2TDI3OS45ODcgMTM1LjQxOEMyODEuMTgyIDEzNS40MzIgMjgxLjQ1MiAxMzMuNzQ4IDI4MC4zMTIgMTMzLjM4OEMyNzguNDQxIDEzMi43OTcgMjc2LjYyMyAxMzIuMDQ4IDI3NC44NzkgMTMxLjE1TDI2OC4wMDggMTI3LjYxQzI2My4zNSAxMjUuMjExIDI1OC45NjkgMTIyLjMwOCAyNTQuOTQ0IDExOC45NTNMMjUzLjU5MiAxMTcuODI3QzI1MC41NCAxMTUuMjgzIDI0Ny43NyAxMTIuNDE4IDI0NS4zMyAxMDkuMjgyTDI0My43NjggMTA3LjI3M0MyNDMuMjM0IDEwNi41ODYgMjQyLjEzNCAxMDcuMDA1IDI0Mi4xOTIgMTA3Ljg3M0MyNDMuMjEyIDEyMy4xODYgMjU1LjgzOSAxMzUuMTM4IDI3MS4xODUgMTM1LjMxNloiIGZpbGw9IiM2NjY2NjYiLz48cGF0aCBkPSJNODIuMjIzMSA0NTYuMzk1TDIzMS4zMTMgMzIzLjRDMjQ1LjM2NyAzMTAuODYzIDI1Ny41OCAyOTYuNDAzIDI2Ny41OSAyODAuNDVMMjY4LjUgMjc5QzI3My40MDQgMjY5LjE5MiAyNzUuNDk3IDI1OC4yMTcgMjc0LjU0NyAyNDcuMjkzTDI3My4yNCAyMzIuMjU4QzI3Mi40MzYgMjIzLjAwOSAyNjguNjE4IDIxNC4yOCAyNjIuMzczIDIwNy40MUMyNjIuMTMxIDIwNy4xNDQgMjYxLjgxIDIwNi45NjEgMjYxLjQ1NyAyMDYuODg5TDIzNy41IDIwMkMyMjAuMTE3IDE5Ni43NTIgMjAxLjY4OCAxOTUuOTk1IDE4My45MzMgMTk5LjhMMTgzIDIwMEwxNjkuMDYgMjAzLjI1OUMxMjguNDA1IDIxMi43NjMgOTIuNTc0MiAyMzYuNjg1IDY4LjIxMTYgMjcwLjU5Mkw2Ny41OTcgMjcxLjQ0N0M2MC44ODQ2IDI4MC43ODkgNTUuMTgyMiAyOTAuODE3IDUwLjU4NTYgMzAxLjM2Mkw0OS43NjUgMzAzLjI0NUMzOC4xNTQ0IDMyOS44ODEgMzQuMjQwOSAzNTkuMjM4IDM4LjQ2ODQgMzg3Ljk4NUwzOS44NTExIDM5Ny4zODdDNDEuMjc1MSA0MDcuMDcgNDQuMTkzMSA0MTYuNDc0IDQ4LjUwMTEgNDI1LjI2MkM1Mi40Nzk4IDQzMy4zNzkgNTcuNjAxNCA0NDAuODgzIDYzLjcwOTUgNDQ3LjU0N0w3MS4zMTc3IDQ1NS44NDdDNzQuMTkxMSA0NTguOTgxIDc5LjA0OTggNDU5LjIyNSA4Mi4yMjMxIDQ1Ni4zOTVaIiBmaWxsPSIjQ0NDQ0NDIi8+PHBhdGggZD0iTTIxMi43NDkgMjc4Ljg1OEwyMTIuMjY3IDI3OS4xMzNDMTk5LjY4NiAyODYuMzIyIDE5Mi45MTggMjk5Ljg5MiAxOTMuNTggMzE0LjM2N0MxOTMuNzY4IDMxOC40ODQgMTk3Ljg5MyAzMjIuMjU1IDIwMS44NTggMzIxLjEzMkwyMDkuMTYzIDMxOS4wNjJDMjE4LjYwNyAzMTYuMzg2IDIyNy4zNTMgMzExLjY4MSAyMzQuNzg5IDMwNS4yNzRMMjU2IDI4N0wyNjIuMjkyIDI4Mi4zNDNDMjk4Ljg3MSAyNTUuMjY5IDM0NC44MzMgMjQ0LjExMyAzODkuNzU0IDI1MS40MDVDMzkxLjE0IDI1MS42MyAzOTEuMTg0IDI1My42MDcgMzg5LjgxIDI1My44OTRMMzg0LjUgMjU1TDM4Mi4wOTMgMjU1Ljg0MkMzNzcuMTUgMjU3LjU3MiAzNzIuODU2IDI2MC43NzYgMzY5Ljc5IDI2NS4wMjJDMzY5LjIxNCAyNjUuODE5IDM2OS45ODIgMjY2Ljg5IDM3MC45MjIgMjY2LjYwMUwzNzIuNjYzIDI2Ni4wNjVDMzgyLjQ2NyAyNjMuMDQ5IDM5Mi43NTEgMjYxLjkwNCA0MDIuOTc4IDI2Mi42OTFMNDA3IDI2M0M0MjguODQzIDI2My45NSA0NDkuMTE0IDI3NC42MjYgNDYyLjI1NCAyOTIuMUw0NjcuMTc5IDI5OC42NUM0ODEuNzc2IDMxOC4wNjMgNDg3Ljk1MyAzNDIuNTMgNDg0LjMxOSAzNjYuNTQ1TDQ4Mi40MjEgMzc5LjA4N0M0NzkuODM3IDM5Ni4xNjMgNDczLjYxOCA0MTIuNDg2IDQ2NC4xODQgNDI2Ljk1Mkw0NjMuNSA0MjhMNDUzIDQ0Mkw0NDEuNSA0NTVMNDMwLjk2NSA0NjUuMTE0QzQyMS4zNDYgNDc0LjM0OCA0MTAuODI3IDQ4Mi41OTcgMzk5LjU2NyA0ODkuNzM4TDM5NiA0OTJMMzg5LjE3NSA0OTUuMjVDMzg3LjQxNyA0OTYuMDg3IDM4NS45NSA0OTMuNjc4IDM4Ny41IDQ5Mi41TDM5NyA0ODMuNUwzOTguOTUzIDQ4MS40NDlDNDA0LjIzMiA0NzUuOTA2IDQwOC4wMjcgNDY5LjEyIDQwOS45ODYgNDYxLjcyMUw0MTAuODg5IDQ1OC4zMDlDNDExLjI5NSA0NTYuNzc2IDQxMS41IDQ1NS4xNzQgNDExLjUgNDUzLjU4OEM0MTEuNSA0NDQuOTA5IDQwNS4zNTQgNDM3LjI5OCAzOTYuODM2IDQzNS42MzFDMzkxLjU1NCA0MzQuNTk3IDM4Ni4wODUgNDM1Ljk2MiAzODEuOTA3IDQzOS4zNTZMMzcyLjUgNDQ3TDM1NS44OTQgNDYwLjU4N0MzNDQuOTk1IDQ2OS41MDQgMzMzLjE4NSA0NzcuMjQ1IDMyMC42NiA0ODMuNjgyTDMwMy41IDQ5Mi41TDI3NC41IDUwMy41TDI2OC40MTIgNTA1LjE2QzI1Ny44MjIgNTA4LjA0OSAyNDcuMDEyIDUxMC4wNiAyMzYuMDkyIDUxMS4xNzRMMjI4IDUxMkgyMDJMMTY3LjUgNTA4LjI1TDE0OC44MzIgNTA0LjIxQzEzOC45ODUgNTAyLjA3OSAxMjkuNDU2IDQ5OC42ODIgMTIwLjQ4MiA0OTQuMTAzQzExMy4xODEgNDkwLjM3OCAxMDYuMjkzIDQ4NS44OTQgOTkuOTMxIDQ4MC43MjVMODUuNSA0NjlDNjguMDA1IDQ1NS42NCA1Ny4wNDQ5IDQzNS40NDggNTUuMzc0OSA0MTMuNDk4TDU0LjUgNDAyTDU1LjUyOTUgMzg1LjgyMkM1Ny4xMzQgMzYwLjYwOCA2Ni43OTExIDMzNi41NzYgODMuMDc5MiAzMTcuMjYzQzg5LjY2NTIgMzA5LjQ1NCA5Ny4yMzc2IDMwMi41MzQgMTA1LjYwNiAyOTYuNjc1TDEwOC42NzcgMjk0LjUyNkMxMjEuNDU4IDI4NS41NzkgMTM1LjcyIDI3OC45NjEgMTUwLjgwNSAyNzQuOTc2TDE2MC45NDcgMjcyLjI5N0MxNzQuMTM1IDI2OC44MTMgMTg3Ljk1MiAyNjguNDQ1IDIwMS4zMDcgMjcxLjIyTDIxMS44ODcgMjczLjQxOEMyMTQuNTQyIDI3My45NyAyMTUuMTAzIDI3Ny41MTMgMjEyLjc0OSAyNzguODU4WiIgZmlsbD0iIzVFNUU1RSIvPjwvc3ZnPg==",
327
367
  url: "https://elysiajs.com",
328
368
  tagline: "Ergonomic web framework for building backend servers, fast and type-safe.",
@@ -368,7 +408,10 @@ const features = [
368
408
  category: "ORM / Query builder",
369
409
  label: "Drizzle",
370
410
  flag: "drizzle",
371
- llms: "https://orm.drizzle.team/llms.txt",
411
+ skill: {
412
+ description: "Drizzle ORM — the typed SQL ORM for this app's database. Use when defining or changing the schema/tables, generating and running migrations, or writing queries (select/insert/update, joins, relations).",
413
+ llms: "https://orm.drizzle.team/llms.txt"
414
+ },
372
415
  image: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI4MHB4IiBoZWlnaHQ9IjI4MHB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iIzAwMDAwMCIgZD0iTSAtMC41LC0wLjUgQyA5Mi44MzMzLC0wLjUgMTg2LjE2NywtMC41IDI3OS41LC0wLjVDIDI3OS41LDkyLjgzMzMgMjc5LjUsMTg2LjE2NyAyNzkuNSwyNzkuNUMgMTg2LjE2NywyNzkuNSA5Mi44MzMzLDI3OS41IC0wLjUsMjc5LjVDIC0wLjUsMTg2LjE2NyAtMC41LDkyLjgzMzMgLTAuNSwtMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTMzLjUsODQuNSBDIDE0Mi44MTQsODIuNzI2OSAxNDYuNjQ3LDg2LjM5MzUgMTQ1LDk1LjVDIDEzNS45MDYsMTEyLjAyOCAxMjYuNTcyLDEyOC4zNjIgMTE3LDE0NC41QyAxMTEuMjQ5LDE0OS45ODQgMTA2LjI0OSwxNDkuMzE3IDEwMiwxNDIuNUMgMTAxLjMzMywxNDAuODMzIDEwMS4zMzMsMTM5LjE2NyAxMDIsMTM3LjVDIDExMS41NDcsMTE5LjA0MSAxMjIuMDQ3LDEwMS4zNzUgMTMzLjUsODQuNSBaIi8+PC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjYzBmMTRkIiBkPSJNIDIyMy41LDg0LjUgQyAyMzMuNTM5LDgzLjY5NzIgMjM3LjAzOSw4OC4wMzA1IDIzNCw5Ny41QyAyMjUuMzQ3LDExMi44MDEgMjE2LjY4MSwxMjguMTM1IDIwOCwxNDMuNUMgMjAzLjM4NywxNDkuNzM3IDE5OC4zODcsMTUwLjA3MSAxOTMsMTQ0LjVDIDE5MS41NzgsMTQxLjk3IDE5MS4yNDUsMTM5LjMwMyAxOTIsMTM2LjVDIDIwMC41MiwxMjIuNzk0IDIwOC41MiwxMDguNzk0IDIxNiw5NC41QyAyMTguMjg5LDkwLjg4MTIgMjIwLjc4OSw4Ny41NDc5IDIyMy41LDg0LjUgWiIvPjwvZz4KPGc+PHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2MwZjE0ZCIgZD0iTSA3NS41LDEyMC41IEMgODMuOTg4NSwxMTkuNjE4IDg3LjgyMTgsMTIzLjI4NSA4NywxMzEuNUMgNzcuOTA1NywxNDguMDI4IDY4LjU3MjQsMTY0LjM2MiA1OSwxODAuNUMgNTYuMDQ1MywxODQuMjc3IDUyLjIxMiwxODUuNDQzIDQ3LjUsMTg0QyA0My44Njk3LDE4MC45NSA0Mi43MDMsMTc3LjExNyA0NCwxNzIuNUMgNTMsMTU2LjUgNjIsMTQwLjUgNzEsMTI0LjVDIDcyLjM5NjgsMTIyLjkzIDczLjg5NjgsMTIxLjU5NiA3NS41LDEyMC41IFoiLz48L2c+CjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNjMWYyNGQiIGQ9Ik0gMTY1LjUsMTIwLjUgQyAxNzQuMTY0LDExOS4zMzIgMTc3Ljk5NywxMjIuOTk5IDE3NywxMzEuNUMgMTY3LjQxNCwxNDcuNjcxIDE1OC4wOCwxNjQuMDA0IDE0OSwxODAuNUMgMTQ2LjM5OCwxODQuMjEyIDE0Mi44OTgsMTg1LjM3OCAxMzguNSwxODRDIDEzMy45MzEsMTgxLjQ1OSAxMzIuNDMxLDE3Ny42MjUgMTM0LDE3Mi41QyAxNDMuNTcyLDE1Ni4zNjIgMTUyLjkwNiwxNDAuMDI4IDE2MiwxMjMuNUMgMTYzLjE0NSwxMjIuMzY0IDE2NC4zMTIsMTIxLjM2NCAxNjUuNSwxMjAuNSBaIi8+PC9nPgo8L3N2Zz4K",
373
416
  url: "https://orm.drizzle.team/",
374
417
  tagline: "Headless TypeScript ORM that feels like SPA with SSR",
@@ -382,7 +425,10 @@ const features = [
382
425
  category: "ORM / Query builder",
383
426
  label: "Kysely",
384
427
  flag: "kysely",
385
- llms: "https://kysely.dev/llms.txt",
428
+ skill: {
429
+ description: "Kysely — the typesafe SQL query builder for this app's database. Use when adding a table or migration, writing typed queries (joins, subqueries, transactions), or updating the generated database types.",
430
+ llms: "https://kysely.dev/llms.txt"
431
+ },
386
432
  image: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMTMyJyBoZWlnaHQ9JzEzMicgdmlld0JveD0nMCAwIDEzMiAxMzInIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGcgY2xpcC1wYXRoPSd1cmwoI2NsaXAwXzhfMyknPjxyZWN0IHg9JzInIHk9JzInIHdpZHRoPScxMjgnIGhlaWdodD0nMTI4JyByeD0nMTYnIGZpbGw9J3doaXRlJy8+PHBhdGggZD0nTTQxLjI5ODMgMTA5VjIzLjkwOTFINDYuNDkxOFY3My4zMUg0Ny4wNzM1TDkxLjk0NTcgMjMuOTA5MUg5OC44NDI3TDYxLjkwNjIgNjQuMTY5NEw5OC41MTAzIDEwOUg5Mi4wMjg4TDU4LjU4MjQgNjcuOTA4N0w0Ni40OTE4IDgxLjI4NzNWMTA5SDQxLjI5ODNaJyBmaWxsPSdibGFjaycvPjwvZz48cmVjdCB4PScyJyB5PScyJyB3aWR0aD0nMTI4JyBoZWlnaHQ9JzEyOCcgcng9JzE2JyBzdHJva2U9JyMxMjEyMTInIHN0cm9rZS13aWR0aD0nNCcvPjxkZWZzPjxjbGlwUGF0aCBpZD0nY2xpcDBfOF8zJz48cmVjdCB4PScyJyB5PScyJyB3aWR0aD0nMTI4JyBoZWlnaHQ9JzEyOCcgcng9JzE2JyBmaWxsPSd3aGl0ZScvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPgo=",
387
433
  url: "https://kysely.dev/",
388
434
  tagline: "The type-safe SQL query builder for TypeScript",
@@ -396,7 +442,10 @@ const features = [
396
442
  category: "ORM / Query builder",
397
443
  label: "Prisma",
398
444
  flag: "prisma",
399
- llms: "https://www.prisma.io/docs/llms.txt",
445
+ skill: {
446
+ description: "Prisma — the ORM for this app's database. Use when defining models in `schema.prisma`, creating or running migrations, or querying through the Prisma Client (CRUD, relations, transactions).",
447
+ llms: "https://www.prisma.io/docs/llms.txt"
448
+ },
400
449
  image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+IHBhdGh7ZmlsbDpibGFjazt9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXtwYXRoe2ZpbGw6d2hpdGU7fX08L3N0eWxlPjxwYXRoIGQ9Ik0yMS44MDY4IDE4LjI4NDhMMTMuNTUyOC43NTY1Yy0uMjA3LS40MzgyLS42MzktLjcyNzMtMS4xMjg2LS43NTQxLS41MDIzLS4wMjkzLS45NTIzLjIxMy0xLjIwNjIuNjI1M0wyLjI2NiAxNS4xMjcxYy0uMjc3My40NTE4LS4yNzE4IDEuMDA5MS4wMTU4IDEuNDU1NWw0LjM3NTkgNi43Nzg2Yy4yNjA4LjQwNDYuNzEyNy42Mzg4IDEuMTgyMy42Mzg4LjEzMzIgMCAuMjY3LS4wMTg4LjM5ODctLjA1NzdsMTIuNzAxOS0zLjc1NjhjLjM4OTEtLjExNTEuNzA3Mi0uMzkwNC44NzM3LS43NTUzcy4xNjMzLS43ODI4LS4wMDc1LTEuMTQ1NHptLTEuODQ4MS43NTE5TDkuMTgxNCAyMi4yMjQyYy0uMzI5Mi4wOTc1LS42NDQ4LS4xODczLS41NzU2LS41MTk0bDMuODUwMS0xOC40Mzg2Yy4wNzItLjM0NDguNTQ4Ni0uMzk5Ni42OTktLjA4MDNsNy4xMjg4IDE1LjEzOGMuMTM0NC4yODU2LS4wMTkuNjIyNC0uMzI1LjcxMjh6Ii8+PC9zdmc+",
401
450
  url: "https://www.prisma.io",
402
451
  spectrum: "beaten_path",
@@ -448,7 +497,10 @@ const features = [
448
497
  category: "Hosting",
449
498
  label: "Cloudflare",
450
499
  flag: "cloudflare",
451
- llms: "https://developers.cloudflare.com/workers/llms.txt",
500
+ skill: {
501
+ description: "Cloudflare Workers — the platform this app deploys to. Use when deploying, editing `wrangler.jsonc`, adding bindings (KV, D1, R2, secrets/env), using Workers runtime APIs, or debugging the build and deploy.",
502
+ llms: "https://developers.cloudflare.com/workers/llms.txt"
503
+ },
452
504
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyLjE5ZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDExNyI+PHBhdGggZmlsbD0iI2ZiYWQ0MSIgZD0iTTIwNS41MiA1MC44MTNjLS44NTggMC0xLjcwNS4wMy0yLjU1MS4wNThxLS4yMDcuMDEyLS4zOTguMDk0YTEuNDIgMS40MiAwIDAgMC0uOTIuOTk0bC0zLjYyOCAxMi42NzJjLTEuNTY1IDUuNDQ5LS45ODMgMTAuNDggMS42NDYgMTQuMTc0YzIuNDEgMy40MTYgNi40MiA1LjQyMSAxMS4yODkgNS42NTVsMTkuNjc5IDEuMTk0Yy41ODUuMDMgMS4wOTIuMzEyIDEuNC43NzZhMS45MiAxLjkyIDAgMCAxIC4yIDEuNjkyYTIuNSAyLjUgMCAwIDEtMi4xMzQgMS42NjJsLTIwLjQ0OCAxLjE5M2MtMTEuMTEuNTE1LTIzLjA2MiA5LjU4LTI3LjI1NSAyMC42MzNsLTEuNDc0IDMuOWExLjA5MiAxLjA5MiAwIDAgMCAuOTY3IDEuNDloNzAuNDI1YTEuODcgMS44NyAwIDAgMCAxLjgxLTEuMzY1QTUxLjIgNTEuMiAwIDAgMCAyNTYgMTAxLjgyOGMwLTI4LjE2LTIyLjU4Mi01MC45ODQtNTAuNDQ5LTUwLjk4NCIvPjxwYXRoIGZpbGw9IiNmNjgyMWYiIGQ9Im0xNzQuNzgyIDExNS4zNjJsMS4zMDMtNC41ODNjMS41NjgtNS40NDkuOTg3LTEwLjQ4LTEuNjM5LTE0LjE3M2MtMi40MTgtMy40MTctNi40MjQtNS40MjItMTEuMjk2LTUuNjU2bC05Mi4zMTItMS4xOTNhMS44MiAxLjgyIDAgMCAxLTEuNDU5LS43NzZhMS45MiAxLjkyIDAgMCAxLS4yMDMtMS42OTNhMi41IDIuNSAwIDAgMSAyLjE1NC0xLjY2Mmw5My4xNzMtMS4xOTNjMTEuMDYzLS41MTEgMjMuMDE1LTkuNTggMjcuMjA4LTIwLjYzM2w1LjMxMy0xNC4wNGMuMjE0LS41OTYuMjctMS4yMzguMTU2LTEuODZDMTkxLjEyNiAyMC41MSAxNjYuOTEgMCAxMzcuOTYgMEMxMTEuMjY5IDAgODguNjI2IDE3LjQwMyA4MC41IDQxLjU5NmEyNyAyNyAwIDAgMC0xOS4xNTYtNS4zNTlDNDguNTQ5IDM3LjUyNCAzOC4yNSA0Ny45NDYgMzYuOTc5IDYwLjg4YTI3LjkgMjcuOSAwIDAgMCAuNzAyIDkuNjQyQzE2Ljc3MyA3MS4xNDUgMCA4OC40NTQgMCAxMDkuNzI2YzAgMS45MjMuMTM3IDMuODE4LjQxMyA1LjY2N2MuMTE1Ljg5Ny44NzkgMS41NyAxLjc4MyAxLjU2OGgxNzAuNDhhMi4yMiAyLjIyIDAgMCAwIDIuMTA2LTEuNjMiLz48L3N2Zz4=",
453
505
  url: "https://developers.cloudflare.com/",
454
506
  tagline: "Create full-stack applications that are instantly deployed to the Cloudflare global network",
@@ -465,7 +517,10 @@ const features = [
465
517
  category: "Hosting",
466
518
  label: "EdgeOne Pages",
467
519
  flag: "edgeone",
468
- llms: "https://edgeone.ai/llms.txt",
520
+ skill: {
521
+ description: "Tencent EdgeOne Pages — the platform this app deploys to. Use when deploying, configuring the project, managing environment variables, or working with edge functions and KV storage.",
522
+ llms: "https://edgeone.ai/llms.txt"
523
+ },
469
524
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyOCAyOCI+CiAgPHBhdGggZmlsbD0idXJsKCNhKSIgZD0iTTI3Ljc3OCAxNi40OTRhMTQuMSAxNC4xIDAgMCAwIC4wNjMtNC42MTEuNTQ1LjU0NSAwIDAgMC0uNTQzLS40NTloLTkuMDA0YS40NDguNDQ4IDAgMCAxLS40MzMtLjU2NGwxLjA2Ni0zLjk3OGEuNjcuNjcgMCAwIDEgLjY0OS0uNDk4aDUuMzQ4Yy4zNTUgMCAuNTY2LS4zOTIuMzU1LS42NzhBMTMuOTggMTMuOTggMCAwIDAgMTQgMEM2LjI2OCAwIDAgNi4yNjggMCAxNGMwIDMuNTIgMS4zIDYuNzM3IDMuNDQ0IDkuMTk3LjIyOS4yNjIuNjQ4LjE1My43MzgtLjE4MmwzLjA5Ny0xMS42MTZhLjMzNi4zMzYgMCAwIDAtLjMyNC0uNDIzaC0yLjY5YS40NDguNDQ4IDAgMCAxLS40MzQtLjU2M2wuODc0LTMuMjc2YS41Ny41NyAwIDAgMSAuNTQzLS40MiAxOC40IDE4LjQgMCAwIDAgOC4zOTktMi4yMzNjLjI2Ni0uMTQ1LjU4Ny4wOTguNTEuMzlsLTUuNyAyMS4zNjlhLjY1LjY1IDAgMCAwIC4zOC43NzZjMS41OTguNjM0IDMuMzQuOTgyIDUuMTYyLjk4MiA0LjQyIDAgOC4zNi0yLjA0NyAxMC45MjYtNS4yNDUuMjI3LS4yODQuMDE4LS42OTEtLjM0NS0uNjkxaC05LjEzOGEuNDQ4LjQ0OCAwIDAgMS0uNDMzLS41NjRsMS4wNjYtMy45NzhhLjY3LjY3IDAgMCAxIC42NDktLjQ5OGgxMC40MDdhLjY1LjY1IDAgMCAwIC42NDYtLjUzIi8+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0LjgxNiIgeDI9IjIyLjI4OCIgeTE9IjIuMzUyIiB5Mj0iMjMuMTg0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZGYiLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMGM2MGYyIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KPC9zdmc+Cg==",
470
525
  url: "https://pages.edgeone.ai",
471
526
  tagline: "A better way to build full-stack Web",
@@ -481,7 +536,10 @@ const features = [
481
536
  category: "Hosting",
482
537
  label: "Vercel",
483
538
  flag: "vercel",
484
- llms: "https://vercel.com/llms.txt",
539
+ skill: {
540
+ description: "Vercel — the platform this app deploys to. Use when deploying, configuring the project (build output, routing, regions), managing environment variables, or using the Vercel CLI.",
541
+ llms: "https://vercel.com/llms.txt"
542
+ },
485
543
  image: "data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48c3R5bGU+IHBhdGh7ZmlsbDpibGFjazt9QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTpkYXJrKXtwYXRoe2ZpbGw6d2hpdGU7fX08L3N0eWxlPjxwYXRoIGQ9Im0xMiAxLjYwOCAxMiAyMC43ODRIMFoiLz48L3N2Zz4=",
486
544
  url: "https://vercel.com",
487
545
  tagline: "Develop with your favorite tools. Launch globally, instantly. Keep pushing",
@@ -498,7 +556,10 @@ const features = [
498
556
  category: "Hosting",
499
557
  label: "Netlify",
500
558
  flag: "netlify",
501
- llms: "https://docs.netlify.com/llms.txt",
559
+ skill: {
560
+ description: "Netlify — the platform this app deploys to. Use when deploying, configuring the build, managing environment variables, redirects and headers, serverless/edge functions, or domains.",
561
+ llms: "https://docs.netlify.com/llms.txt"
562
+ },
502
563
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxLjE0ZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDIyNiI+PHBhdGggZmlsbD0iIzA1QkRCQSIgZD0iTTY5LjE4MSAxODguMDg3aC0yLjQxN2wtMTIuMDY1LTEyLjA2NXYtMi40MTdsMTguNDQ0LTE4LjQ0NGgxMi43NzhsMS43MDQgMS43MDR2MTIuNzc4ek01NC42OTkgNTEuNjI4di0yLjQxN2wxMi4wNjUtMTIuMDY1aDIuNDE3TDg3LjYyNSA1NS41OXYxMi43NzhsLTEuNzA0IDEuNzA0SDczLjE0M3oiLz48cGF0aCBmaWxsPSIjMDE0ODQ3IiBkPSJNMTYwLjkwNiAxNDkuMTk4aC0xNy41NTJsLTEuNDY2LTEuNDY2di00MS4wODljMC03LjMxLTIuODczLTEyLjk3Ni0xMS42ODktMTMuMTc0Yy00LjUzNy0uMTE5LTkuNzI3IDAtMTUuMjc0LjIxOGwtLjgzMy44NTJ2NTMuMTczbC0xLjQ2NiAxLjQ2Nkg5NS4wNzRsLTEuNDY2LTEuNDY2di03MC4xOWwxLjQ2Ni0xLjQ2N2gzOS41MDNjMTUuMzU0IDAgMjcuNzk1IDEyLjQ0MSAyNy43OTUgMjcuNzk1djQzLjg4MmwtMS40NjYgMS40NjZaIi8+PHBhdGggZmlsbD0iIzA1QkRCQSIgZD0iTTcxLjY3NyAxMjIuODg5SDEuNDY2TDAgMTIxLjQyM1YxMDMuODNsMS40NjYtMS40NjZoNzAuMjExbDEuNDY2IDEuNDY2djE3LjU5M3ptMTgyLjg1NyAwaC03MC4yMTFsLTEuNDY2LTEuNDY2VjEwMy44M2wxLjQ2Ni0xLjQ2Nmg3MC4yMTFMMjU2IDEwMy44M3YxNy41OTN6TTExNy44NzYgNTQuMTI0VjEuNDY2TDExOS4zNDIgMGgxNy41OTNsMS40NjYgMS40NjZ2NTIuNjU4bC0xLjQ2NiAxLjQ2NmgtMTcuNTkzem0wIDE2OS42NjN2LTUyLjY1OGwxLjQ2Ni0xLjQ2NmgxNy41OTNsMS40NjYgMS40NjZ2NTIuNjU4bC0xLjQ2NiAxLjQ2NWgtMTcuNTkzeiIvPjwvc3ZnPg==",
503
564
  url: "https://www.netlify.com",
504
565
  tagline: "Push your ideas to the web",
@@ -525,7 +586,10 @@ const features = [
525
586
  category: "Hosting",
526
587
  label: "Docker",
527
588
  flag: "docker",
528
- llms: "https://docs.docker.com/llms.txt",
589
+ skill: {
590
+ description: "Docker — used to containerize and run this app. Use when editing the `Dockerfile` or Compose file, building or running images, managing env and volumes, or debugging the container build.",
591
+ llms: "https://docs.docker.com/llms.txt"
592
+ },
529
593
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNMTI0LjggNTIuMWMtNC4zLTIuNS0xMC0yLjgtMTQuOC0xLjQtLjYtNS4yLTQtOS43LTgtMTIuOWwtMS42LTEuMy0xLjQgMS42Yy0yLjcgMy4xLTMuNSA4LjMtMy4xIDEyLjMuMyAyLjkgMS4yIDUuOSAzIDguMy0xLjQuOC0yLjkgMS45LTQuMyAyLjQtMi44IDEtNS45IDItOC45IDJINzlWNDlINjZWMjRINTF2MTJIMjZ2MTNIMTN2MTRIMS44bC0uMiAxLjVjLS41IDYuNC4zIDEyLjYgMyAxOC41bDEuMSAyLjIuMS4yYzcuOSAxMy40IDIxLjcgMTkgMzYuOCAxOSAyOS4yIDAgNTMuMy0xMy4xIDY0LjMtNDAuNiA3LjQuNCAxNS0xLjggMTguNi04LjlsLjktMS44LTEuNi0xek0yOCAzOWgxMHYxMUgyOFYzOXptMTMuMSA0NC4yYzAgMS43LTEuNCAzLjEtMy4xIDMuMS0xLjcgMC0zLjEtMS40LTMuMS0zLjEgMC0xLjcgMS40LTMuMSAzLjEtMy4xIDEuNy4xIDMuMSAxLjQgMy4xIDMuMXpNMjggNTJoMTB2MTFIMjhWNTJ6bS0xMyAwaDExdjExSDE1VjUyem0yNy43IDUwLjJjLTE1LjgtLjEtMjQuMy01LjQtMzEuMy0xMi40IDIuMS4xIDQuMS4yIDUuOS4yIDEuNiAwIDMuMiAwIDQuNy0uMSAzLjktLjIgNy4zLS43IDEwLjEtMS41IDIuMyA1LjMgNi41IDEwLjIgMTQgMTMuOGgtMy40ek01MSA2M0g0MFY1MmgxMXYxMXptMC0xM0g0MFYzOWgxMXYxMXptMTMgMTNINTNWNTJoMTF2MTF6bTAtMTNINTNWMzloMTF2MTF6bTAtMTNINTNWMjZoMTF2MTF6bTEzIDI2SDY2VjUyaDExdjExek0zOC44IDgxLjJjLS4yLS4xLS41LS4yLS44LS4yLTEuMiAwLTIuMiAxLTIuMiAyLjIgMCAxLjIgMSAyLjIgMi4yIDIuMnMyLjItMSAyLjItMi4yYzAtLjMtLjEtLjYtLjItLjgtLjIuMy0uNC41LS44LjUtLjUgMC0uOS0uNC0uOS0uOS4xLS40LjMtLjcuNS0uOHoiIGZpbGw9IiMwMTlCQzYiPjwvcGF0aD48L3N2Zz4=",
530
594
  url: "https://www.docker.com/",
531
595
  tagline: "A safer container ecosystem, for everyone",
@@ -538,7 +602,10 @@ const features = [
538
602
  category: "Hosting",
539
603
  label: "Dokploy",
540
604
  flag: "dokploy",
541
- llms: "https://docs.dokploy.com/llms.txt",
605
+ skill: {
606
+ description: "Dokploy — the self-hosted PaaS this app deploys to (it builds the app's Docker image). Use when deploying, configuring the application or environment variables, setting up domains, or auto-deploy from Git.",
607
+ llms: "https://docs.dokploy.com/llms.txt"
608
+ },
542
609
  dependsOn: ["docker"],
543
610
  image: "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNjAwLDYwMCIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI2MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHN0eWxlPiBwYXRoe2ZpbGw6YmxhY2s7fUBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ZGFyayl7cGF0aHtmaWxsOndoaXRlO319PC9zdHlsZT48cGF0aCBkPSJtIDQxNS42NDY5NCwxMzUuMTMwNTggYyAtNC4xMzAyNSwwLjg4NzE2IC00LjcwODgyLDQuOTgzMTUgLTQuMTMwMTUsMTUuODg3OTUgMC42MTU2LDExLjYwMDQgNS4zOTg1MywyOC4xMTAxMiAyNi45NTM2MSw0My42ODAzMiA5LjM3NTc5LDcuMDA3MyAyMC4yODU3NSw1LjE0NTUyIDE2Ljg0Mzk2LDExLjQ4MzM1IC05LjQxNzExLDE0LjQ3OTI1IC0xMy44NDk5NywxNy4wNzIxMyAtMzMuMTMzODMsMjMuMDI3NDMgLTguOTUyNzMsMi43NjQ4MSAtMjQuMDU2NDIsMS41NDQ0IC00MS42MDkwNSwtMy4zNDg2OCAtMTcuNTUyNjIsLTQuODkzMDcgLTM3LjQ2OTcxLC0xMy4wMzI2NCAtNTYuOTk3MzYsLTIxLjgyNjk4IC0xOS41Mjc2LC04Ljc5NDM1IC0zOC42ODEwMiwtMTguMjI1MzIgLTU1LjIxNTIzLC0yNS43MzAwMiAtMTYuNTM0MTYsLTcuNTA0NjggLTI5LjUzNjUsLTEzLjM0MzU4IC00MS4yODQ2MywtMTQuMjk2MDUgLTYuMTE2MjIsLTAuNDk1ODUgLTEyLjM0OTU2LC0wLjcyMjQgLTE4LjgzOTY3LC0wLjc4NDI5IC0xOS40NzAzMiwtMC4xODU2OCAtNDEuMjQ4NjksMS4xMTY5MSAtNjkuMDk2NTQsMS4xMTY5MSAtMTguODcwNjcsMCAtMzIuOTE0NjMsNi4zMTU3OCAtMzkuNzE4MDg4LDE3LjgyMzM1IC02LjgwMzQ1OCwxMS41MDc1NiAtNi44NDI2MTksMjQuNTI3ODkgLTcuMjEyNjk5LDM4LjU5MDkxIC0wLjM2MTUzNCwxMy43MzgyOSAtMS4wMjQyLDIzLjk2MzMgLTAuMzQ0OTI4LDMzLjIxMTY4IDAuNjc5MjczLDkuMjQ4MzYgMy4xOTMyODUsMTguMDQ2NDUgOS4wMDA5ODUsMjUuNDQyNTcgMi42MjE0MywzLjMzODQgNS4zMTAxNyw1LjI5NzAxIDkuMzA4OTYsOC4yMjY5NiAzLjk5ODc5LDIuOTI5OTIgOS4wNjM4OCw2LjI5MDYxIDE1LjEwNSw5Ljk3MDA2IDEyLjA4MjIyLDcuMzU4ODkgMjguMDQwMjMsMTUuOTY3MTYgNDYuNDMxODcsMjQuMjM1MzMgMzYuNzgzMjcsMTYuNTM2MzQgODMuMTY4MjksMzEuODQ0MjggMTI3LjY5OTQ1LDMxLjg0NDI4IDEwMy4xNzAxMywwIDIwMi42MzMxMSwtNzkuODI2MjggMjAyLjYzMzExLC03OS44MjYyOCA0LjU2MTc2LC0zLjU5MTEyIDUuMzQ4NjIsLTEwLjIwMDM1IDEuNzU3NDksLTE0Ljc2MjEyIC0zLjU5MTEyLC00LjU2MTc2IC0xMC4yMDAzNSwtNS4zNDg2MiAtMTQuNzYyMTEsLTEuNzU3NDggMCwwIC05Ny41OTg2Myw3NS4zMjE2NyAtMTg5LjYyODQ5LDc1LjMyMTY3IC0zOS42MTQyNiwwIC04My45NjIxOSwtMTQuMjA5NjEgLTExOS4wNzgzLC0yOS45OTY0NSAtMTcuNTU4MDUsLTcuODkzNDEgLTMyLjg0MzE5LC0xNi4xNDk4OSAtNDQuMTE1OTMsLTIzLjAxNTc2IC01LjYzNjM3LC0zLjQzMjkyIC0xMC4yNzgxLC02LjUyNjIyIC0xMy42MTY0NSwtOC45NzIyMyAtMy4zMzgzNSwtMi40NDYwMyAtNS42MTc1OSwtNC43ODU3MiAtNS4xOTg1NywtNC4yNTIwNyAtMS4yODA5OCwtMS42MzEzNyAtMi4xNTM3NSwtMy4xOTg2MSAtMi44MzUzOSwtNC45NTAxMyBoIDUzLjg0NTc4IGMgMTkuMTA2NzksMCAzMi44MzI1OCw3Ljc0Njc1IDUyLjMyNDQsMTYuNzIwODIgMTkuNDkxODIsOC45NzQwNSA0NC4xNDQwOCwxOC4zNTQwMSA4MS4wNjQzMywxNy42NzM0NyA1Mi44NDgxNywtMC45NzQxNyA4NC41OTQ1OCwtMTEuNDI0OSAxMTQuODI4MywtMjguODQ2NyAxNy40ODAyOSwtMTAuMDcyOCAzMC40NjM0NSwtMTguNTg5OSA0MS43NTQ3MiwtMzEuMDk4NTcgNy4zMTgyNSwtOC41NjAyNCAxMS43NDM5MiwtMTQuNTEyIDE3LjQwNDI4LC0yNC4yNTc3MyAzLjQ2MjExLC02LjA4NzU0IDkuOTc4ODcsLTYuNzc0NCAxOC4wNjA1OCwtNi43MTcxMiAxNS4zOTk1LDAuMTA5MTUgMzUuMTM5NjEsLTE5LjIwMjg4IDQxLjcxNzY4LC0zMC4zMzQwNSA2LjU3ODA5LC0xMS4xMzExOCA5Ljk5NjgsLTIyLjIxODc2IDAuNDA5MzIsLTIyLjI2NjYxIC05LjU4NzQ3LC0wLjA0NzggLTkuMTg0NjksOS42NjY5NiAtMjMuMjI2NywxMC45MDE5NCAtMTMuOTk2MjksMC40NTczOCAtMzEuODQ0ODEsMi4zNjIwNyAtMzkuNTI5MDUsMTcuMjczMTUgLTEuMzcyMTksLTUuNDg4NzQgLTguMTA5OTIsLTIxLjQwNDU4IC0zMC4yNTEwMywtMjcuMDY4NjcgLTIyLjE0MTEyLC01LjY2NDA4IC0xMy41MjU4OSwtMjEuMjg2OTcgLTI3LjMxOTYzLC0xOC4zMjQxNiB6IG0gLTIwNy42MTk3MSw0OS4xNDgwNCBjIDE4LjU1OTM3LC0xLjMxODc3IDM0Ljk4NDMzLDUuNzU0NzYgNTEuNjQyNzYsMTMuMTcwOTEgMTYuMDU0NjIsNy4yODcwMiAzNS4zMDkxNCwxNi43NjQ5MSA1NS4yNzA2NiwyNS43NTQ2NSAxOS45NjE1Miw4Ljk4OTc1IDQwLjYxNywxNy41MDk5NSA1OS45ODQ2OSwyMi45MDkgOS4xNTc3MywyLjU1Mjg2IDE4LjAxNjM0LDQuNDE4NzkgMjYuNTI2NjMsNS4yNDU3OCAtMjYuMzY2MzgsMTQuNDkyOTQgLTUyLjQ5MTYxLDIyLjYxMzU0IC0xMDAuMDQxNTUsMjMuNDkwMDQgLTMzLjMyNjQsMC42MTQzIC01My4zMTY5MywtNy4yMDQwNCAtNzEuODgyNjYsLTE1Ljc1MTc0IC0xOC41NjU3MywtOC41NDc2OSAtMzYuMzE0OTEsLTE4LjY0NjY1IC02MS4xMTgwMiwtMTguNjQ2NjUgaCAtNTUuNzAxODMgYyAwLjEwNjc3LC01LjM4Mjk0IDAuMzE3MTMsLTExLjYxMTI2IDAuNTE1MzUsLTE5LjE0MzU0IDAuMzYxNzUsLTEzLjc0NjU3IDEuNTU4MTMsLTIzLjgxNDc1IDQuMjk1MTgsLTI4LjQ0NDI3IDIuNzM3MDMsLTQuNjI5NTEgNi41NDA4NiwtNy40OTgwOCAyMS42MTk2MSwtNy40OTgwOCAyOC40NzU3NSwwIDUwLjQ2MjMyLC0xLjIyMjUgNjguODg5MTgsLTEuMDg2MSB6IG0gLTI1LjcxMTU1LDIwLjIxMzIgYyAtNS45NjE1NSwtNWUtNCAtMTAuNzk0OCw0LjgzMTgyIC0xMC43OTU0MywxMC43OTMzOSAtNWUtNCw1Ljk2MjM1IDQuODMzMDgsMTAuNzk1OTQgMTAuNzk1NDMsMTAuNzk1NDMgNS45NjE1NywtNi4zZS00IDEwLjc5MzksLTQuODMzODggMTAuNzkzNCwtMTAuNzk1NDMgLTYuM2UtNCwtNS45NjA3NyAtNC44MzI2MywtMTAuNzkyNzYgLTEwLjc5MzQsLTEwLjc5MzM5IHogbSAtNzIuMTcwMDksMTAxLjc0MzYgYyAtMC42NzU3OSwtMC4wMTggLTEuMzU2MDQsMC4wMDIgLTIuMDM2NzIsMC4wNjE3IC00Ljc0NDEsMC40MTcwNCAtOS4yNDU1NDYsMy4wOTcxNiAtMTEuODY1MTI0LDYuNjQ4MDkgLTIuNjE5NTc3LDMuNTUwOTMgLTMuNjU4NzA0LDcuNjgxNzEgLTMuNjU4NzA0LDExLjczNzgzIC00LjgxZS00LDEwNy43OTU1NiA5Mi44MzU5MTgsMTg4Ljc1OTg2IDIwNy40MTQ4NjgsMTg4Ljc2IDExNC41Nzg5NCwtMS40ZS00IDIwNy40MTUzNiwtODAuOTY0NDQgMjA3LjQxNDg3LC0xODguNzYgMCwtNC4wNTYxMiAtMS4wMzkxMiwtOC4xODY5IC0zLjY1ODY5LC0xMS43Mzc4MyAtMi42MTk1OSwtMy41NTA5MyAtNy4xMjEwMywtNi4yMzEwNSAtMTEuODY1MTMsLTYuNjQ4MDkgLTEuMzYxMzYsLTAuMTE5NzMgLTIuNzE4OTQsLTAuMDc2NiAtNC4wNDg4LDAuMTAwNiAtMy41NTc0MywwLjQ3MzYgLTYuODk1MywxLjg3NTc1IC0xMC4wODcxLDMuOTIxNTEgLTMyLjYzMzc3LDIwLjkxNjQ1IC05NS41MDU3OSw3My41NTE4MiAtMTc3Ljc1NTE1LDczLjU1MTgyIC04Mi4yNDkzNSwwIC0xNDUuMTIxMzgsLTUyLjYzNTM3IC0xNzcuNzU1MTMsLTczLjU1MTg2IC0zLjE5MTgsLTIuMDQ1NzYgLTYuNTI5NjgsLTMuNDQ3OSAtMTAuMDg3MSwtMy45MjE1MSAtMC42NjQ5MywtMC4wODg1IC0xLjMzNjI5LC0wLjE0NDIyIC0yLjAxMjA5LC0wLjE2MjIgeiBtIDEuNTY2NTUsMTkuOTk5NjkgYyAwLjEzNzksMC4wODA3IDAuMTAzMTMsMC4wMTk5IDAuMjU0NiwwLjExNzAzIDI5LjQxMjQ4LDE4Ljg1MTgzIDk3LjU0MTU4LDc2LjU2MTc4IDE4OC4wMzMxNyw3Ni41NjE3OCA5MC40OTE1OSwwIDE1OC42MjA3MSwtNTcuNzA5OTUgMTg4LjAzMzE5LC03Ni41NjE3OCAwLjE1MTQ3LC0wLjA5NyAwLjExNjcsLTAuMDM2MiAwLjI1NDU5LC0wLjExNzAzIC0wLjA2ODEsNy4zNTMxMyAtMC4yMDg5OCwxMC40Mjg2MSAtMS4yMDMxNCwxNy40Nzg0MyAtNy4zNTgwNyw5LjkxODUyIC04Ny40MjM3MSw5Ni45NDEyOSAtMTg3LjA4NDY0LDk2Ljk0MTI5IC05OS42NjA5NCwwIC0xNzkuNzI2NTYsLTg3LjAyMjc3IC0xODcuMDg0NjMsLTk2Ljk0MTI5IC0wLjk5NDE2LC03LjA0OTgyIC0xLjEzNTA1LC0xMC4xMjUzIC0xLjIwMzE0LC0xNy40Nzg0MyB6IG0gMTEuNDkxNDYsNTguNjkzMjYgYyAzNC4wNzAzNSwzMS4zMTkxNSAxMDAuNjAwOTksNzcuMDYyNzUgMTc2Ljc5NjMxLDc3LjA2Mjc1IDc2LjE5NTMxLDAgMTQyLjcyNTk4LC00NS43NDM2IDE3Ni43OTYzMywtNzcuMDYyNzUgLTI2LjE5NDM4LDY1LjMwNTMgLTk0LjQ3NTA2LDEwOS40NzE1MSAtMTc2Ljc5NjMzLDEwOS40NzE2NSAtODIuMzIxMjgsLTEuMWUtNCAtMTUwLjYwMTk0LC00NC4xNjYzNSAtMTc2Ljc5NjMxLC0xMDkuNDcxNjUgeiIgLz48L3N2Zz4=",
544
611
  url: "https://dokploy.com",
@@ -566,7 +633,10 @@ const features = [
566
633
  category: "Linter",
567
634
  label: "Oxlint",
568
635
  flag: "oxlint",
569
- llms: "https://oxc.rs/llms.txt",
636
+ skill: {
637
+ description: "Oxlint — the fast Rust-based linter for this project. Use when running the linter, fixing lint errors, configuring `.oxlintrc.json`, or enabling and disabling rules or plugins.",
638
+ llms: "https://oxc.rs/llms.txt"
639
+ },
570
640
  image: "data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQwIDI0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2EpIj4KPHBhdGggZD0iTTIwIDIwaDIwMHYyMDBIMjB6IiBmaWxsPSIjOTFFREU5Ii8+CjxwYXRoIGQ9Ik0yMjkgMjIzSDEzdi00My41czE5LjE4LTE1LjggMjguNS0xNi41YzExLjg0LS44OSAxNC43OCAzLjYgMjYuNSA1LjUgMTIuMzMgMiAyMC4yNS0xMC45IDMyLjUtOC41IDEyLjUgMi40NCAyOC42NyAxMS44NiAzOSAxMS41IDIxLjg0LS43NiAyMC41NS00Ljg3IDM4LjUtMSA3LjYzIDEuNjUgMTUuNzctMTQuNDIgMjguNS0xMiA2LjQ1IDEuMjIgMjIuNSAyLjUgMjIuNSAyLjV2NjJaIiBmaWxsPSIjNDhBQ0JBIi8+CjxwYXRoIGQ9Ik0yMjIgMjIzSDEwdi00MHMxOS42OC0xMC44IDI5LTExLjVjMTEuODQtLjg5IDE0LjI4IDcuOTMgMjYgOS44NCAxMi4zMyAyIDE2Ljc1LTEwLjI0IDI5LTcuODQgMTIuNSAyLjQ0IDIyLjY3IDE0LjM2IDMzIDE0IDIxLjg0LS43NiAyMy4wNS0xMS4zNyA0MS03LjUgNy42MyAxLjY1IDkuNSA1LjUgMjcuNSAxLjM0UzIyMiAxODMgMjIyIDE4M3Y0MFoiIGZpbGw9IiMyQjNDNUEiLz4KPC9nPgo8cGF0aCBkPSJNMTI3LjAyIDQyLjQ5YTE3IDE3IDAgMSAwLTE0LjA0IDBMMTEyLjU1IDU1aC0uMDVsLTIzLjczIDEuNzlhMyAzIDAgMCAwLTIuNzcgM3Y2LjQzYTMgMyAwIDAgMCAyLjc3IDNMMTEyIDcxbC0xLjEgNDEuNzdjLS4zNCAxMi42MS0yLjQgMjguMDctMTQuNzEgMzAuNzctMS4zNy4zLTIuNzcuNDYtNC4xOS40Ni03LjM5IDAtMTUuOTEtOS4xLTIxLjM3LTE4LjQyYTYyLjcgNjIuNyAwIDAgMSA2LjY0LTIuNDRjMS4zLS40IDEuNTUtMi4yMi40Mi0yLjk3LTguMTgtNS40LTE0LjY3LTEyLjY3LTE4LjY1LTIxLjA2LS41NS0xLjE2LTIuMi0xLjI0LTIuNzUtLjA5YTY1LjA3IDY1LjA3IDAgMCAwLTMuNTIgOSA2Mi40IDYyLjQgMCAwIDAtMi4wOCAyNy42NGwuMS42Yy4yIDEuMiAxLjY4IDEuNjMgMi41Ni43OGE1NS40MyA1NS40MyAwIDAgMSA1LjIzLTQuNDdDNjguNjMgMTY0LjIgMTAyLjIyIDE4MCAxMjAgMTgwYzE3Ljc5IDAgNTEuMzktMTUuODIgNjEuNDItNDcuNDVhNTUuMzggNTUuMzggMCAwIDEgNS4yNCA0LjQ4Yy44Ny44NSAyLjM3LjQyIDIuNTYtLjc4bC4wNS0uMzIuMDQtLjI3YTYyLjU3IDYyLjU3IDAgMCAwLTIuMDctMjcuNjMgNjUuMjEgNjUuMjEgMCAwIDAtMy41LTljLS41NC0xLjE1LTIuMi0xLjA2LTIuNzQuMS0zLjk3IDguMzgtMTAuNDMgMTUuNjQtMTguNTcgMjEuMDQtMS4xMy43NS0uODcgMi41Ny40MyAyLjk3YTYxLjk4IDYxLjk4IDAgMCAxIDYuNTMgMi40MWMtNS40NiA5LjM0LTE0IDE4LjQ1LTIxLjM5IDE4LjQ1YTE5LjQgMTkuNCAwIDAgMS00LjE4LS40NmMtMTIuMzMtMi43LTE0LjM4LTE4LjE2LTE0LjcyLTMwLjc3TDEyOCA3MWwyMy4yMy0xLjc5YTMgMyAwIDAgMCAyLjc3LTIuOTl2LTYuNDRhMyAzIDAgMCAwLTIuNzctMi45OUwxMjcuNSA1NWgtLjA1bC0uNDMtMTIuNTFaTTEzMCAyN2ExMCAxMCAwIDEgMS0yMCAwIDEwIDEwIDAgMCAxIDIwIDBaIiBmaWxsPSIjRkY5MTVDIiBzdHJva2U9IiMyQjNDNUEiIHN0cm9rZS13aWR0aD0iOCIgcGFpbnQtb3JkZXI9InN0cm9rZSIvPgo8cGF0aCBkPSJNODYgNjcuMTVhMiAyIDAgMCAwIDEuODUgMkwxMTIgNzFsNi42My02LjYzYS44LjggMCAwIDAtLjU2LTEuMzdIODZ2NC4xNVpNMTgyLjEyIDk4LjgxYS45LjkgMCAwIDEgMS41Ny4xIDY1LjI2IDY1LjI2IDAgMCAxIDMuNTUgOS4xMiA2Mi41NyA2Mi41NyAwIDAgMSAxLjk4IDI4LjIyYy0uMiAxLjItMS42OSAxLjYzLTIuNTcuNzhhNTYuNjkgNTYuNjkgMCAwIDAtMTEuMDktOC4zNiAxLjU1IDEuNTUgMCAwIDEtLjY0LTEuOThjMy4zNy03LjU4IDUuODUtMTYuNjcgNy4wNS0yNy40N2EuOTQuOTQgMCAwIDEgLjE1LS40WiIgZmlsbD0iIzhBMzgwRiIvPgo8cGF0aCBkPSJtMTI3IDQyIC41IDEzLTUuODIgNS40M2ExIDEgMCAwIDEtMS42OC0uNzNWNDJoN1ptNTcgNzhjLTQgNDAtNDQgNjAtNjQgNjBWNjQuNWExLjUgMS41IDAgMCAxIDEuNS0xLjVIMTU0djMuMjlhMyAzIDAgMCAxLTIuNyAyLjk4TDEyOCA3MWwxLjEgNDEuNzdjLjM0IDEyLjYxIDIuMzcgMjguMSAxNC43IDMwLjc4YTE5IDE5IDAgMCAwIDQuMTMuNDUgNSA1IDAgMCAwLTMuNjUgMS42MmMtNC44NyA1LjgtMTAuNCAxMS42NC0xOC41NyAxNC4yOCAyMS41IDEgNTEuMS0xMy42MyA1Ni4yOS02MC45bDIgMjFaIiBmaWxsPSIjOEEzODBGIi8+CjxwYXRoIGQ9Ik0xMjIgMzkuOWMtMS4xLjExLTIgMS0yIDIuMXMuOSAyLjAxIDIgMS44OGExNyAxNyAwIDAgMCAxMC4wMi00Ljg2QTE3IDE3IDAgMCAwIDEzNyAyNy4wOGEuMDguMDggMCAwIDAtLjA4LS4wOC4wOC4wOCAwIDAgMC0uMDguMDdDMTM1Ljc5IDMzLjggMTI5LjY3IDM5LjEgMTIyIDM5LjlaIiBmaWxsPSIjOEEzODBGIi8+CjxjbGlwUGF0aCBpZD0iYSI+CjxyZWN0IHg9IjIwIiB5PSIyMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIxMDAiLz4KPC9jbGlwUGF0aD4KPC9zdmc+Cg==",
571
641
  url: "https://oxc.rs/docs/guide/usage/linter.html",
572
642
  spectrum: "bleeding_edge"
@@ -583,7 +653,10 @@ const features = [
583
653
  category: "Linter",
584
654
  label: "Prettier",
585
655
  flag: "prettier",
586
- llms: "https://prettier.io/llms.txt",
656
+ skill: {
657
+ description: "Prettier — the code formatter for this project. Use when formatting code, configuring `prettier.config.js` options, ignoring files, or adding a Prettier plugin.",
658
+ llms: "https://prettier.io/llms.txt"
659
+ },
587
660
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDI1NiI+PHJlY3Qgd2lkdGg9IjI0LjM4MSIgaGVpZ2h0PSIxMi4xOSIgeD0iMTgyLjg1NyIgeT0iNDguNzYyIiBmaWxsPSIjNTZCM0I0IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI3My4xNDMiIGhlaWdodD0iMTIuMTkiIHk9IjI0My44MSIgZmlsbD0iI0VBNUU1RSIgcng9IjUiLz48cmVjdCB3aWR0aD0iNDguNzYyIiBoZWlnaHQ9IjEyLjE5IiB4PSIxNDYuMjg2IiB5PSIxNDYuMjg2IiBmaWxsPSIjQkY4NUJGIiByeD0iNSIvPjxyZWN0IHdpZHRoPSI2MC45NTIiIGhlaWdodD0iMTIuMTkiIHg9IjczLjE0MyIgeT0iMTQ2LjI4NiIgZmlsbD0iI0VBNUU1RSIgcng9IjUiLz48cmVjdCB3aWR0aD0iNjAuOTUyIiBoZWlnaHQ9IjEyLjE5IiB5PSIxNDYuMjg2IiBmaWxsPSIjNTZCM0I0IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI3My4xNDMiIGhlaWdodD0iMTIuMTkiIHk9IjE5NS4wNDgiIGZpbGw9IiNCRjg1QkYiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjczLjE0MyIgaGVpZ2h0PSIxMi4xOSIgeT0iOTcuNTI0IiBmaWxsPSIjQkY4NUJGIiByeD0iNSIvPjxyZWN0IHdpZHRoPSIxMzQuMDk1IiBoZWlnaHQ9IjEyLjE5IiB4PSI2MC45NTIiIHk9IjI0LjM4MSIgZmlsbD0iI0Y3QkEzRSIgcng9IjUiLz48cmVjdCB3aWR0aD0iNDguNzYyIiBoZWlnaHQ9IjEyLjE5IiB5PSIyNC4zODEiIGZpbGw9IiNFQTVFNUUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjI0LjM4MSIgaGVpZ2h0PSIxMi4xOSIgeD0iNDguNzYyIiB5PSIyMTkuNDI5IiBmaWxsPSIjRjdCQTNFIiByeD0iNSIvPjxyZWN0IHdpZHRoPSIyNC4zODEiIGhlaWdodD0iMTIuMTkiIHg9IjQ4Ljc2MiIgeT0iNzMuMTQzIiBmaWxsPSIjNTZCM0I0IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIzNi41NzEiIGhlaWdodD0iMTIuMTkiIHk9IjIxOS40MjkiIGZpbGw9IiM1NkIzQjQiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjM2LjU3MSIgaGVpZ2h0PSIxMi4xOSIgeT0iNzMuMTQzIiBmaWxsPSIjRjdCQTNFIiByeD0iNSIvPjxyZWN0IHdpZHRoPSIyNC4zODEiIGhlaWdodD0iMTIuMTkiIHg9IjE1OC40NzYiIHk9IjIxOS40MjkiIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI2MC45NTIiIGhlaWdodD0iMTIuMTkiIHg9Ijg1LjMzMyIgeT0iMjE5LjQyOSIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjYwLjk1MiIgaGVpZ2h0PSIxMi4xOSIgeD0iMTk1LjA0OCIgeT0iMjE5LjQyOSIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjEwOS43MTQiIGhlaWdodD0iMTIuMTkiIHg9Ijk3LjUyNCIgeT0iMTIxLjkwNSIgZmlsbD0iIzU2QjNCNCIgcng9IjUiLz48cmVjdCB3aWR0aD0iNDguNzYyIiBoZWlnaHQ9IjEyLjE5IiB4PSIzNi41NzEiIHk9IjEyMS45MDUiIGZpbGw9IiNGN0JBM0UiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjI0LjM4MSIgaGVpZ2h0PSIxMi4xOSIgeT0iMTIxLjkwNSIgZmlsbD0iI0VBNUU1RSIgcng9IjUiLz48cmVjdCB3aWR0aD0iNjAuOTUyIiBoZWlnaHQ9IjEyLjE5IiB4PSIxMDkuNzE0IiB5PSI0OC43NjIiIGZpbGw9IiNCRjg1QkYiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9Ijk3LjUyNCIgaGVpZ2h0PSIxMi4xOSIgeT0iNDguNzYyIiBmaWxsPSIjNTZCM0I0IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIxMjEuOTA1IiBoZWlnaHQ9IjEyLjE5IiB4PSIzNi41NzEiIHk9IjE3MC42NjciIGZpbGw9IiNGN0JBM0UiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjI0LjM4MSIgaGVpZ2h0PSIxMi4xOSIgeT0iMTcwLjY2NyIgZmlsbD0iI0JGODVCRiIgcng9IjUiLz48cmVjdCB3aWR0aD0iNzMuMTQzIiBoZWlnaHQ9IjEyLjE5IiB4PSIxNDYuMjg2IiB5PSI3My4xNDMiIGZpbGw9IiNFQTVFNUUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjczLjE0MyIgaGVpZ2h0PSIxMi4xOSIgeD0iMTQ2LjI4NiIgeT0iOTcuNTI0IiBmaWxsPSIjRjdCQTNFIiByeD0iNSIvPjxyZWN0IHdpZHRoPSIxNTguNDc2IiBoZWlnaHQ9IjEyLjE5IiBmaWxsPSIjNTZCM0I0IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI4NS4zMzMiIGhlaWdodD0iMTIuMTkiIHg9IjE3MC42NjciIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIzNi41NzEiIGhlaWdodD0iMTIuMTkiIHg9IjE3MC42NjciIHk9IjE3MC42NjciIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIzNi41NzEiIGhlaWdodD0iMTIuMTkiIHg9IjIxOS40MjkiIHk9IjE3MC42NjciIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI0OC43NjIiIGhlaWdodD0iMTIuMTkiIHg9IjIwNy4yMzgiIHk9IjE0Ni4yODYiIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI0OC43NjIiIGhlaWdodD0iMTIuMTkiIHg9IjIwNy4yMzgiIHk9IjI0LjM4MSIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjM2LjU3MSIgaGVpZ2h0PSIxMi4xOSIgeD0iMjE5LjQyOSIgeT0iMTIxLjkwNSIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjM2LjU3MSIgaGVpZ2h0PSIxMi4xOSIgeD0iMjE5LjQyOSIgeT0iNDguNzYyIiBmaWxsPSIjRDBENEQ4IiBvcGFjaXR5PSIuNSIgcng9IjUiLz48cmVjdCB3aWR0aD0iMjQuMzgxIiBoZWlnaHQ9IjEyLjE5IiB4PSIyMzEuNjE5IiB5PSI3My4xNDMiIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIyNC4zODEiIGhlaWdodD0iMTIuMTkiIHg9IjIzMS42MTkiIHk9Ijk3LjUyNCIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjEyMS45MDUiIGhlaWdodD0iMTIuMTkiIHg9IjEzNC4wOTUiIHk9IjE5NS4wNDgiIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSIzNi41NzEiIGhlaWdodD0iMTIuMTkiIHg9Ijg1LjMzMyIgeT0iMTk1LjA0OCIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjczLjE0MyIgaGVpZ2h0PSIxMi4xOSIgeD0iMTgyLjg1NyIgeT0iMjQzLjgxIiBmaWxsPSIjRDBENEQ4IiBvcGFjaXR5PSIuNSIgcng9IjUiLz48cmVjdCB3aWR0aD0iODUuMzMzIiBoZWlnaHQ9IjEyLjE5IiB4PSI4NS4zMzMiIHk9IjI0My44MSIgZmlsbD0iI0QwRDREOCIgb3BhY2l0eT0iLjUiIHJ4PSI1Ii8+PHJlY3Qgd2lkdGg9IjQ4Ljc2MiIgaGVpZ2h0PSIxMi4xOSIgeD0iODUuMzMzIiB5PSI3My4xNDMiIGZpbGw9IiNEMEQ0RDgiIG9wYWNpdHk9Ii41IiByeD0iNSIvPjxyZWN0IHdpZHRoPSI0OC43NjIiIGhlaWdodD0iMTIuMTkiIHg9Ijg1LjMzMyIgeT0iOTcuNTI0IiBmaWxsPSIjRDBENEQ4IiBvcGFjaXR5PSIuNSIgcng9IjUiLz48L3N2Zz4=",
588
661
  url: "https://prettier.io",
589
662
  tagline: "An opinionated code formatter",
@@ -597,7 +670,10 @@ const features = [
597
670
  category: "Error tracking",
598
671
  label: "Sentry",
599
672
  flag: "sentry",
600
- llms: "https://docs.sentry.io/llms.txt",
673
+ skill: {
674
+ description: "Sentry — error and performance monitoring for this app. Use when capturing or handling exceptions, configuring the SDK and DSN, or setting up tracing, session replay, or source maps.",
675
+ llms: "https://docs.sentry.io/llms.txt"
676
+ },
601
677
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxLjEzZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjU2IDIyNyI+PHBhdGggZmlsbD0iIzM2MkQ1OSIgZD0iTTE0OC4zNjggMTIuNDAzYTIzLjkzNSAyMy45MzUgMCAwIDAtNDEuMDAzIDBMNzMuNjQgNzAuMTY1YzUyLjQyNiAyNi4xNzQgODcuMDUgNzguMTc3IDkwLjk3NSAxMzYuNjQyaC0yMy42NzljLTMuOTE4LTUwLjExMy0zNC4wNjEtOTQuNDEtNzkuMjM4LTExNi40NDhsLTMxLjIxMyA1My45N2E4MS41OTUgODEuNTk1IDAgMCAxIDQ3LjMwNyA2Mi4zNzVoLTU0LjM4YTMuODk1IDMuODk1IDAgMCAxLTMuMTc4LTUuNjlsMTUuMDY5LTI1LjYyNmE1NS4wNDYgNTUuMDQ2IDAgMCAwLTE3LjIyMS05LjczOEwzLjE2NyAxOTEuMjc3YTIzLjI2OSAyMy4yNjkgMCAwIDAgOC42NjIgMzEuOTgyYTIzLjg4NCAyMy44ODQgMCAwIDAgMTEuNTgzIDMuMDc1aDc0LjQ3MWE5OS40MzIgOTkuNDMyIDAgMCAwLTQxLjAwMy04OC43MmwxMS44NC0yMC41YzM1LjY3OSAyNC41MDQgNTUuNzU0IDY2LjAzOCA1Mi43OSAxMDkuMjJoNjMuMDk0YzIuOTktNjUuNDMtMjkuMDQ3LTEyNy41MTItODQuMTA3LTE2Mi45ODZsMjMuOTM1LTQxLjAwMmEzLjk0NyAzLjk0NyAwIDAgMSA1LjM4Mi0xLjM4NGMyLjcxNiAxLjQ4NiAxMDMuOTkzIDE3OC4yMDggMTA1Ljg5IDE4MC4yNThhMy44OTUgMy44OTUgMCAwIDEtMy40ODYgNS43OTJoLTI0LjM5NmMuMzA3IDYuNTI2LjMwNyAxMy4wMzUgMCAxOS41MjhoMjQuNDk5QTIzLjUyOCAyMy41MjggMCAwIDAgMjU2IDIwMi45MWEyMy4wMTUgMjMuMDE1IDAgMCAwLTMuMTc4LTExLjY4NUwxNDguMzY4IDEyLjQwM1oiLz48L3N2Zz4=",
602
678
  url: "https://sentry.io"
603
679
  },
@@ -613,7 +689,10 @@ const features = [
613
689
  category: "Tooling",
614
690
  label: "Storybook",
615
691
  flag: "storybook",
616
- llms: "https://storybook.js.org/llms.txt",
692
+ skill: {
693
+ description: "Storybook — a workshop for building and testing UI components in isolation. Use when writing or updating stories (`*.stories.*`), configuring Storybook, or documenting and testing components.",
694
+ llms: "https://storybook.js.org/llms.txt"
695
+ },
617
696
  image: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDY0IDY0Ij48dGl0bGU+aWNvbi1zdG9yeWJvb2stc3F1YXJlPC90aXRsZT48ZGVmcz48cGF0aCBpZD0icGF0aC0xIiBkPSJNMS45NDY0OTk1NSw1Ny4xMzA5NDcyIEwwLjAwMjI1OTczMTE2LDUuOTU0NzY2NjMgQy0wLjA2MTk1MDg4MzMsNC4yNjQ2MTgxNCAxLjI0OTkyMjg4LDIuODMyMjM2OTcgMi45NTg3MTUxOSwyLjcyNjczNDE4IEw0Ny4wMjI2NTM4LDAuMDA2MTc2Mjg0OTEgQzQ4Ljc2MjAwMDUsLTAuMTAxMjEyOTYgNTAuMjYwMTQ1OCwxLjIwNDYyOTggNTAuMzY4ODU1LDIuOTIyODU3NzEgQzUwLjM3Mjk1MDUsMi45ODc1OTM5MSA1MC4zNzUsMy4wNTI0NDA2MyA1MC4zNzUsMy4xMTczMDMxNSBMNTAuMzc1LDU4Ljg4MjgwMjggQzUwLjM3NSw2MC42MDQzODMxIDQ4Ljk2MjIyOTYsNjIgNDcuMjE5NDg5NCw2MiBDNDcuMTcyMjc3Niw2MiA0Ny4xMjUwNzIxLDYxLjk5ODk1MzQgNDcuMDc3OTA4LDYxLjk5Njg2MDYgTDQuOTU4MjA5MDQsNjAuMTI4MDk5NyBDMy4zMTc4MTMzMyw2MC4wNTUzMTg5IDIuMDA4MDgyMDMsNTguNzUxOTE4IDEuOTQ2NDk5NTUsNTcuMTMwOTQ3MiBaIi8+PC9kZWZzPjxnIGlkPSJpY29uLXN0b3J5Ym9vay1zcXVhcmUiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiPjxnIGlkPSJpY29uIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3LjAwMDAwMCwgMS4wMDAwMDApIj48cGF0aCBpZD0iQ29tYmluZWQtU2hhcGUiIGZpbGw9IiNGRjQ3ODUiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTUwLjM2ODg1NSwyLjkyMjg1NzcxIEM1MC4zNzI5NTA1LDIuOTg3NTkzOTEgNTAuMzc1LDMuMDUyNDQwNjMgNTAuMzc1LDMuMTE3MzAzMTUgTDUwLjM3NSw1OC44ODI4MDI4IEM1MC4zNzUsNjAuNjA0MzgzMSA0OC45NjIyMjk2LDYyIDQ3LjIxOTQ4OTQsNjIgQzQ3LjE3MjI3NzYsNjIgNDcuMTI1MDcyMSw2MS45OTg5NTM0IDQ3LjA3NzkwOCw2MS45OTY4NjA2IEw0Ljk1ODIwOTA0LDYwLjEyODA5OTcgQzMuMzE3ODEzMzMsNjAuMDU1MzE4OSAyLjAwODA4MjAzLDU4Ljc1MTkxOCAxLjk0NjQ5OTU1LDU3LjEzMDk0NzIgTDAuMDAyMjU5NzMxMTYsNS45NTQ3NjY2MyBDLTAuMDYxOTUwODgzMyw0LjI2NDYxODE0IDEuMjQ5OTIyODgsMi44MzIyMzY5NyAyLjk1ODcxNTE5LDIuNzI2NzM0MTggTDM3LjQ5OSwwLjU5NCBMMzcuMTk4MTMyNCw3LjYyMDc4NzY2IEMzNy4xOTQ3MjI3LDcuNzAxNzk2NjQgMzcuMjEyODIyNCw3Ljc4MTc4NzMxIDM3LjI0OTk4NjksNy44NTMwNTUyNSBMMzcuMjkzNDE1OCw3LjkyMTEzMDI2IEMzNy40NTA1Mjk2LDguMTI1NzM2MzcgMzcuNzQ1ODAwMiw4LjE2NTc4Mjg4IDM3Ljk1MjkyMDksOC4wMTA1NzY3IEwzNy45NTI5MjA5LDguMDEwNTc2NyBMNDAuNzE1ODE5NSw1Ljk0MDE5Njc4IEw0My4wNDkzOTY1LDcuNzU2MTg1MzcgQzQzLjEzNjgzODgsNy44MjQyMzI3OSA0My4yNDU4NjM0LDcuODU5NDY1ODQgNDMuMzU3MTEwNiw3Ljg1NTYyODEzIEM0My42MTY5MjEzLDcuODQ2NjY1NTMgNDMuODIwMTg0NCw3LjYzMTMzOTEgNDMuODExMTExNSw3LjM3NDY4MzE2IEw0My44MTExMTE1LDcuMzc0NjgzMTYgTDQzLjU1LDAuMjIgTDQ3LjAyMjY1MzgsMC4wMDYxNzYyODQ5MSBDNDguNzYyMDAwNSwtMC4xMDEyMTI5NiA1MC4yNjAxNDU4LDEuMjA0NjI5OCA1MC4zNjg4NTUsMi45MjI4NTc3MSBaIi8+PG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0iI2ZmZiI+PHVzZSB4bGluazpocmVmPSIjcGF0aC0xIi8+PC9tYXNrPjxwYXRoIGlkPSJTIiBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0yOC45MzM4Mzc0LDIzLjQ4MTQzMzEgQzI4LjkzMzgzNzQsMjQuNjk0ODAyOCAzNy4xMzAwNTExLDI0LjExMzI2NjQgMzguMjMwMzIwNiwyMy4yNjA5NTc4IEMzOC4yMzAzMjA2LDE0Ljk5ODE5OTUgMzMuNzg0MTc2NCwxMC42NTYyNSAyNS42NDI1MzU5LDEwLjY1NjI1IEMxNy41MDA4OTUyLDEwLjY1NjI1IDEyLjkzOTI2NjgsMTUuMDY1NzU0MiAxMi45MzkyNjY4LDIxLjY4MDAxNCBDMTIuOTM5MjY2OCwzMy4xOTk4NDk5IDI4LjUyOTY0MjQsMzMuNDIwMzI1MSAyOC41Mjk2NDI0LDM5LjcwMzg3MiBDMjguNTI5NjQyNCw0MS40Njc2NzQ1IDI3LjY2MzUxMDUsNDIuNTE0OTMyMyAyNS43NTgwMjAxLDQyLjUxNDkzMjMgQzIzLjI3NTEwODQsNDIuNTE0OTMyMyAyMi4yOTM0OTIyLDQxLjI1MDQ2OTIgMjIuNDA4OTc2NSwzNi45NTEyMDA0IEMyMi40MDg5NzY1LDM2LjAxODUzMDQgMTIuOTM5MjY2OCwzNS43Mjc3NjIxIDEyLjY1MDU1NjEsMzYuOTUxMjAwNCBDMTEuOTE1MzgxMiw0Ny4zNjk4NTkxIDE4LjQyNDc2OTMsNTAuMzc1IDI1Ljg3MzUwNDQsNTAuMzc1IEMzMy4wOTEyNzA5LDUwLjM3NSAzOC43NSw0Ni41Mzg2MDY5IDM4Ljc1LDM5LjU5MzYzNDEgQzM4Ljc1LDI3LjI0NzAxNTkgMjIuOTI4NjU1NiwyNy41Nzc3Mjg5IDIyLjkyODY1NTYsMjEuNDU5NTM4NyBDMjIuOTI4NjU1NiwxOC45NzkxOTEyIDI0Ljc3NjQwMzksMTguNjQ4NDc4MyAyNS44NzM1MDQ0LDE4LjY0ODQ3ODMgQzI3LjAyODM0NywxOC42NDg0NzgzIDI5LjEwNzA2MzgsMTguODUxNDUxMyAyOC45MzM4Mzc0LDIzLjQ4MTQzMzEgWiIgbWFzaz0idXJsKCNtYXNrLTIpIi8+PHBhdGggaWQ9ImJvb2ttYXJrIiBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zNi44MTI5MTY5LDcuMjc0MDYxMDYgTDM3LjEyMTUyMzMsMC4zNjY4MTQ5NzQgTDQzLjMyNjE1MDMsMCBMNDMuNTkzNDUwMyw3LjAzMjIyNjUzIEM0My42MDI3NTMxLDcuMjg0NDI5NDMgNDMuMzk0MzM5OSw3LjQ5NjAxOTkxIDQzLjEyNzk0NjQsNy41MDQ4MjcgQzQzLjAxMzg4MDQsNy41MDg1OTgxMiA0Mi45MDIwOTM1LDcuNDczOTc2MzcgNDIuODEyNDM1Niw3LjQwNzEwOTU5IEw0MC40MTk3MzIzLDUuNjIyNjI4ODEgTDM3LjU4NjgyOTYsNy42NTcwODcxOCBDMzcuMzc0NDYxMSw3LjgwOTYwMDUgMzcuMDcxNzA5Miw3Ljc3MDI0ODggMzYuOTEwNjE0Niw3LjU2OTE5MjY2IEMzNi44NDI4MDE4LDcuNDg0NTU4MDQgMzYuODA4MjU1NSw3LjM4MDE5OSAzNi44MTI5MTY5LDcuMjc0MDYxMDYgWiIgbWFzaz0idXJsKCNtYXNrLTIpIi8+PC9nPjwvZz48L3N2Zz4=",
618
697
  url: "https://storybook.js.org",
619
698
  tagline: "Build, test & document components",
@@ -1,4 +1,4 @@
1
- import "./features-CPCPsYbg.mjs";
1
+ import "./features-H0oiz0KO.mjs";
2
2
  //#region ../../packages/features/dist/index.js
3
3
  /** Skills are written to the cross-tool `.agents/` standard, read by Codex/Gemini/Cursor/Copilot. */
4
4
  const SKILLS_DIR = ".agents/skills";
@@ -3,7 +3,7 @@ function e(e, t) {
3
3
  if (!e) throw Error(t);
4
4
  }
5
5
  function t(t) {
6
- return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), `skills` in t && e(typeof t.skills == `function`, `'skills' must be a function of meta`), t;
6
+ return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), t;
7
7
  }
8
8
  //#endregion
9
9
  //#region bati.config.ts
@@ -3,7 +3,7 @@ function e(e, t) {
3
3
  if (!e) throw Error(t);
4
4
  }
5
5
  function t(t) {
6
- return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), `skills` in t && e(typeof t.skills == `function`, `'skills' must be a function of meta`), t;
6
+ return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), t;
7
7
  }
8
8
  //#endregion
9
9
  //#region bati.config.ts
@@ -3,7 +3,7 @@ function e(e, t) {
3
3
  if (!e) throw Error(t);
4
4
  }
5
5
  function t(t) {
6
- return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), `skills` in t && e(typeof t.skills == `function`, `'skills' must be a function of meta`), t;
6
+ return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), t;
7
7
  }
8
8
  //#endregion
9
9
  //#region bati.config.ts
@@ -3,7 +3,7 @@ function e(e, t) {
3
3
  if (!e) throw Error(t);
4
4
  }
5
5
  function t(t) {
6
- return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), `skills` in t && e(typeof t.skills == `function`, `'skills' must be a function of meta`), t;
6
+ return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), t;
7
7
  }
8
8
  //#endregion
9
9
  //#region bati.config.ts
@@ -3,26 +3,12 @@ function e(e, t) {
3
3
  if (!e) throw Error(t);
4
4
  }
5
5
  function t(t) {
6
- return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), `skills` in t && e(typeof t.skills == `function`, `'skills' must be a function of meta`), t;
6
+ return `enforce` in t && e(t.enforce === `pre` || t.enforce === `post`, `'enforce' must be 'pre' or 'post', was ${t.enforce}`), `if` in t && e(typeof t.if == `function`, `'if' must be a function`), `nextSteps` in t && e(typeof t.nextSteps == `function`, `'nextSteps' must be a function`), `knip` in t && (e(typeof t.knip == `object` && t.knip !== null, `'knip' must be an object`), `entry` in t.knip && e(Array.isArray(t.knip.entry), `'knip.entry' must be an array`), `ignoreDependencies` in t.knip && e(Array.isArray(t.knip.ignoreDependencies), `'knip.ignoreDependencies' must be an array`), `ignore` in t.knip && e(Array.isArray(t.knip.ignore), `'knip.ignore' must be an array`), `vite` in t.knip && e(typeof t.knip.vite == `boolean`, `'knip.vite' must be a boolean`)), `env` in t && e(typeof t.env == `function`, `'env' must be a function of meta`), `deploy` in t && e(Array.isArray(t.deploy) || typeof t.deploy == `function`, `'deploy' must be an array or a function of meta`), t;
7
7
  }
8
8
  //#endregion
9
9
  //#region bati.config.ts
10
- var bati_config_default = t({
11
- if(meta) {
12
- return meta.BATI.has("solid");
13
- },
14
- skills() {
15
- return [{
16
- name: "ui-framework",
17
- description: "Solid conventions in this app. Use when writing components or handling SSR/hydration.",
18
- body: `This app renders with SolidJS via \`vike-solid\`. Components are \`.tsx\` files built around Solid signals.
19
-
20
- - **SSR-safe:** components render on the server first — run browser-only code inside \`onMount\` and guard \`window\`/\`document\` access to avoid hydration mismatches.
21
- - **Page data:** read it with \`useData()\` (see the \`vike-data-fetching\` skill).
22
-
23
- See https://vike.dev/solid.`
24
- }];
25
- }
26
- });
10
+ var bati_config_default = t({ if(meta) {
11
+ return meta.BATI.has("solid");
12
+ } });
27
13
  //#endregion
28
14
  export { bati_config_default as default };