[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PQ9JKMF9ZDQWNVSA38VCTT":3,"skill-same:01M6PQ9JKMF9ZDQWNVSA38VCTT":102},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6PQ9JKMF9ZDQWNVSA38VCTT","create-html-app",null,"Create or update a Hubble HTML App: a folder-local .html file Hubble runs as a self-contained interactive UI, with Alpine, Tailwind, Hubble theme tokens, and the injected hubble runtime API.","bholmesdev\u002Fhubble.md","bholmesdev","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F51384119?v=4","01M6CP8SJ3N9W8FYVCGV41QT3G","Ben Holmes","01M6CP8SP3A84K1TFMVS8BEBDW",1523,"MIT","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"create html app","app","html","create","tokens","folder","with","theme","as","alpine","theme tokens","runtime","local","self","interactive","Tailwind","api","ui","file","update","2026-11-10 10:12:30",false,"---\nname: create-html-app\ndescription: \"Create or update a Hubble HTML App: a folder-local .html file\n  Hubble runs as a self-contained interactive UI, with Alpine, Tailwind, Hubble\n  theme tokens, and the injected hubble runtime API.\"\n---\n# Create HTML App\n\nA Hubble HTML App is a folder-local `.html` file Hubble runs as a self-contained interactive UI. Opening it shows the app in the main content panel. Build any interactive experience — a tool, dashboard, or app — as a single `.html` file in the Folder.\n\nTo embed an HTML App inline inside a Markdown File, see `create-embed`.\n\n## Runtime\n\nHubble provides the app runtime. Write plain HTML that assumes these globals are already available:\n\n- `hubble`\n- `Alpine`\n- Tailwind browser v4\n- Hubble theme tokens\n\nUse Alpine and Tailwind by default. Do not add dependency `\u003Cscript>` tags or set up package files, lockfiles, or `node_modules`.\n\nHTML Apps run in a sandboxed iframe. Hubble allows:\n\n- `allow-scripts`: Alpine, Tailwind browser, and the Hubble runtime can execute.\n- `allow-forms`: native HTML form semantics work when paired with Alpine handlers such as `@submit.prevent`.\n\nHubble does not allow:\n\n- `allow-same-origin`: apps keep an opaque origin and cannot use app-origin storage, cookies, or same-origin access.\n- `allow-top-navigation`: apps cannot navigate the desktop app frame.\n- `allow-popups` \u002F `allow-popups-to-escape-sandbox`: apps cannot open unsandboxed popup windows.\n- `allow-downloads`: apps cannot start downloads directly.\n- `allow-modals`: apps cannot use modal browser dialogs.\n\n## Files API\n\nApps reach Workspace files through `hubble.files`, an async broker rather than direct filesystem access. All paths are Workspace-relative and point to Markdown files.\n\n```\nawait hubble.files.list(\"todos\u002F*.md\")\n\u002F\u002F → [{ name, path, modified_at, size }], sorted by path\nawait hubble.files.read(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path, body, properties }\nawait hubble.files.open(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path }, navigates the editor to the file\nawait hubble.files.create({ path, body, properties, open })\n\u002F\u002F → { path, body, properties }\nawait hubble.files.update(path, { body, properties })\n\u002F\u002F → { path, body, properties }, patch\nawait hubble.files.remove(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path }\n```\n\nMethods throw on failure; each has a `safe*` variant. See [Files API](references\u002Ffiles-api.md) for shapes, patch semantics, and error handling.\n\n## Template\n\n```\n\u003C!doctype html>\n\u003Chtml lang=\"en\">\n\t\u003Chead>\n\t\t\u003Cmeta charset=\"utf-8\" \u002F>\n\t\t\u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \u002F>\n\t\t\u003Ctitle>Folder files\u003C\u002Ftitle>\n\t\u003C\u002Fhead>\n\t\u003Cbody class=\"m-0 bg-background p-3 font-sans text-foreground\">\n\t\t\u003Cmain\n\t\t\tclass=\"grid gap-3 rounded-md border border-border bg-card p-3 text-card-foreground\"\n\t\t\tx-data=\"{\n\t\t\t\tfiles: [],\n\t\t\t\terror: '',\n\t\t\t\tasync init() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.files = await hubble.files.list('**\u002F*.md')\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.error = error.message || 'Could not load files'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\"\n\t\t>\n\t\t\t\u003Cheader class=\"flex items-center justify-between gap-3\">\n\t\t\t\t\u003Ch1 class=\"m-0 text-base font-semibold\">Folder files\u003C\u002Fh1>\n\t\t\t\t\u003Cspan class=\"text-sm text-muted-foreground\" x-text=\"`${files.length} files`\">\u003C\u002Fspan>\n\t\t\t\u003C\u002Fheader>\n\n\t\t\t\u003Cp class=\"m-0 text-sm text-muted-foreground\" x-show=\"!error && files.length === 0\">\n\t\t\t\tLoading files...\n\t\t\t\u003C\u002Fp>\n\t\t\t\u003Cp class=\"m-0 text-sm text-destructive\" x-show=\"error\" x-text=\"error\">\u003C\u002Fp>\n\n\t\t\t\u003Cul class=\"m-0 grid list-none gap-2 p-0\" x-show=\"!error && files.length > 0\">\n\t\t\t\t\u003Ctemplate x-for=\"file in files\" :key=\"file.path\">\n\t\t\t\t\t\u003Cli class=\"rounded-sm border border-border bg-background px-3 py-2\">\n\t\t\t\t\t\t\u003Cspan class=\"text-sm font-medium\" x-text=\"file.path\">\u003C\u002Fspan>\n\t\t\t\t\t\u003C\u002Fli>\n\t\t\t\t\u003C\u002Ftemplate>\n\t\t\t\u003C\u002Ful>\n\t\t\u003C\u002Fmain>\n\t\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n## Structuring Logic\n\nInline `x-data` is fine for simple state (a flag, a counter, a current tab). For anything more, like async loaders, multiple methods, or computed logic, register an `Alpine.data()` component in a `\u003Cscript>` and reference it by name.\n\n```ts\n\u003Cscript>\n\tdocument.addEventListener('alpine:init', () => {\n\t\tAlpine.data('fileList', () => ({\n\t\t\tfiles: [],\n\t\t\terror: '',\n\t\t\tasync init() {\n\t\t\t\ttry {\n\t\t\t\t\tthis.files = await hubble.files.list('**\u002F*.md')\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.error = error.message || 'Could not load files'\n\t\t\t\t}\n\t\t\t},\n\t\t}))\n\t})\n\u003C\u002Fscript>\n\n\u003Cmain x-data=\"fileList\">…\u003C\u002Fmain>\n```\n\nWhy this beats large inline expressions:\n\n- Alpine parses `x-data` as a single expression. Multi-line bodies with arrow functions, object methods, or `\u003C`\u002F`>`\u002F`&` get HTML-escaped or mis-parsed, surfacing as silent \"Alpine Expression Error\" failures.\n- Logic lives in real JavaScript with syntax highlighting and normal quoting, not inside an attribute string.\n- Components are reusable and testable, and keep markup readable.\n\nRegister components inside `alpine:init` so they exist before Alpine scans the DOM.\n\n## Native Feel\n\nUse Hubble tokens through Tailwind classes so the app feels native:\n\n- Surfaces: `bg-background`, `bg-card`, `bg-popover`\n- Text: `text-foreground`, `text-muted-foreground`, `text-card-foreground`\n- Borders\u002Frings: `border-border`, `border-input`, `ring-ring`, `focus-visible:ring-ring`\n- Actions: `bg-primary text-primary-foreground`, `bg-secondary text-secondary-foreground`\n- States: `hover:bg-accent`, `bg-selected text-selected-foreground`\n\nKeep spacing compact: `gap-2`, `gap-3`, `p-2`, `p-3`, `px-3`, `py-2`. Use `rounded-sm` or `rounded-md` for controls.\n\nAvoid one-off palettes, oversized cards, hero layouts, and decorative gradients unless the user asks for a themed visual.\n\n## References\n\nRead only the patterns you need:\n\n- [Files API](references\u002Ffiles-api.md)\n- [Buttons](references\u002Fbuttons.md)\n- [Radio selects](references\u002Fradio-selects.md)\n- [Tabs](references\u002Ftabs.md)\n- [Forms](references\u002Fforms.md)\n- [Lists and empty states](references\u002Flists-and-empty-states.md)\n\n","# Create HTML App\n\nA Hubble HTML App is a folder-local `.html` file Hubble runs as a self-contained interactive UI. Opening it shows the app in the main content panel. Build any interactive experience — a tool, dashboard, or app — as a single `.html` file in the Folder.\n\nTo embed an HTML App inline inside a Markdown File, see `create-embed`.\n\n## Runtime\n\nHubble provides the app runtime. Write plain HTML that assumes these globals are already available:\n\n- `hubble`\n- `Alpine`\n- Tailwind browser v4\n- Hubble theme tokens\n\nUse Alpine and Tailwind by default. Do not add dependency `\u003Cscript>` tags or set up package files, lockfiles, or `node_modules`.\n\nHTML Apps run in a sandboxed iframe. Hubble allows:\n\n- `allow-scripts`: Alpine, Tailwind browser, and the Hubble runtime can execute.\n- `allow-forms`: native HTML form semantics work when paired with Alpine handlers such as `@submit.prevent`.\n\nHubble does not allow:\n\n- `allow-same-origin`: apps keep an opaque origin and cannot use app-origin storage, cookies, or same-origin access.\n- `allow-top-navigation`: apps cannot navigate the desktop app frame.\n- `allow-popups` \u002F `allow-popups-to-escape-sandbox`: apps cannot open unsandboxed popup windows.\n- `allow-downloads`: apps cannot start downloads directly.\n- `allow-modals`: apps cannot use modal browser dialogs.\n\n## Files API\n\nApps reach Workspace files through `hubble.files`, an async broker rather than direct filesystem access. All paths are Workspace-relative and point to Markdown files.\n\n```\nawait hubble.files.list(\"todos\u002F*.md\")\n\u002F\u002F → [{ name, path, modified_at, size }], sorted by path\nawait hubble.files.read(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path, body, properties }\nawait hubble.files.open(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path }, navigates the editor to the file\nawait hubble.files.create({ path, body, properties, open })\n\u002F\u002F → { path, body, properties }\nawait hubble.files.update(path, { body, properties })\n\u002F\u002F → { path, body, properties }, patch\nawait hubble.files.remove(\"notes\u002Ftoday.md\")\n\u002F\u002F → { path }\n```\n\nMethods throw on failure; each has a `safe*` variant. See [Files API](references\u002Ffiles-api.md) for shapes, patch semantics, and error handling.\n\n## Template\n\n```\n\u003C!doctype html>\n\u003Chtml lang=\"en\">\n\t\u003Chead>\n\t\t\u003Cmeta charset=\"utf-8\" \u002F>\n\t\t\u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \u002F>\n\t\t\u003Ctitle>Folder files\u003C\u002Ftitle>\n\t\u003C\u002Fhead>\n\t\u003Cbody class=\"m-0 bg-background p-3 font-sans text-foreground\">\n\t\t\u003Cmain\n\t\t\tclass=\"grid gap-3 rounded-md border border-border bg-card p-3 text-card-foreground\"\n\t\t\tx-data=\"{\n\t\t\t\tfiles: [],\n\t\t\t\terror: '',\n\t\t\t\tasync init() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.files = await hubble.files.list('**\u002F*.md')\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.error = error.message || 'Could not load files'\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\"\n\t\t>\n\t\t\t\u003Cheader class=\"flex items-center justify-between gap-3\">\n\t\t\t\t\u003Ch1 class=\"m-0 text-base font-semibold\">Folder files\u003C\u002Fh1>\n\t\t\t\t\u003Cspan class=\"text-sm text-muted-foreground\" x-text=\"`${files.length} files`\">\u003C\u002Fspan>\n\t\t\t\u003C\u002Fheader>\n\n\t\t\t\u003Cp class=\"m-0 text-sm text-muted-foreground\" x-show=\"!error && files.length === 0\">\n\t\t\t\tLoading files...\n\t\t\t\u003C\u002Fp>\n\t\t\t\u003Cp class=\"m-0 text-sm text-destructive\" x-show=\"error\" x-text=\"error\">\u003C\u002Fp>\n\n\t\t\t\u003Cul class=\"m-0 grid list-none gap-2 p-0\" x-show=\"!error && files.length > 0\">\n\t\t\t\t\u003Ctemplate x-for=\"file in files\" :key=\"file.path\">\n\t\t\t\t\t\u003Cli class=\"rounded-sm border border-border bg-background px-3 py-2\">\n\t\t\t\t\t\t\u003Cspan class=\"text-sm font-medium\" x-text=\"file.path\">\u003C\u002Fspan>\n\t\t\t\t\t\u003C\u002Fli>\n\t\t\t\t\u003C\u002Ftemplate>\n\t\t\t\u003C\u002Ful>\n\t\t\u003C\u002Fmain>\n\t\u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\n## Structuring Logic\n\nInline `x-data` is fine for simple state (a flag, a counter, a current tab). For anything more, like async loaders, multiple methods, or computed logic, register an `Alpine.data()` component in a `\u003Cscript>` and reference it by name.\n\n```ts\n\u003Cscript>\n\tdocument.addEventListener('alpine:init', () => {\n\t\tAlpine.data('fileList', () => ({\n\t\t\tfiles: [],\n\t\t\terror: '',\n\t\t\tasync init() {\n\t\t\t\ttry {\n\t\t\t\t\tthis.files = await hubble.files.list('**\u002F*.md')\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.error = error.message || 'Could not load files'\n\t\t\t\t}\n\t\t\t},\n\t\t}))\n\t})\n\u003C\u002Fscript>\n\n\u003Cmain x-data=\"fileList\">…\u003C\u002Fmain>\n```\n\nWhy this beats large inline expressions:\n\n- Alpine parses `x-data` as a single expression. Multi-line bodies with arrow functions, object methods, or `\u003C`\u002F`>`\u002F`&` get HTML-escaped or mis-parsed, surfacing as silent \"Alpine Expression Error\" failures.\n- Logic lives in real JavaScript with syntax highlighting and normal quoting, not inside an attribute string.\n- Components are reusable and testable, and keep markup readable.\n\nRegister components inside `alpine:init` so they exist before Alpine scans the DOM.\n\n## Native Feel\n\nUse Hubble tokens through Tailwind classes so the app feels native:\n\n- Surfaces: `bg-background`, `bg-card`, `bg-popover`\n- Text: `text-foreground`, `text-muted-foreground`, `text-card-foreground`\n- Borders\u002Frings: `border-border`, `border-input`, `ring-ring`, `focus-visible:ring-ring`\n- Actions: `bg-primary text-primary-foreground`, `bg-secondary text-secondary-foreground`\n- States: `hover:bg-accent`, `bg-selected text-selected-foreground`\n\nKeep spacing compact: `gap-2`, `gap-3`, `p-2`, `p-3`, `px-3`, `py-2`. Use `rounded-sm` or `rounded-md` for controls.\n\nAvoid one-off palettes, oversized cards, hero layouts, and decorative gradients unless the user asks for a themed visual.\n\n## References\n\nRead only the patterns you need:\n\n- [Files API](references\u002Ffiles-api.md)\n- [Buttons](references\u002Fbuttons.md)\n- [Radio selects](references\u002Fradio-selects.md)\n- [Tabs](references\u002Ftabs.md)\n- [Forms](references\u002Fforms.md)\n- [Lists and empty states](references\u002Flists-and-empty-states.md)\n\n",{"name":5,"description":7},"main","cf633b3221b9572f22604168ac77c1ffa921debe",".agents\u002Fskills\u002Fcreate-html-app",99,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md","https:\u002F\u002Fhubble.md","https:\u002F\u002Fgithub.com\u002Fbholmesdev","https:\u002F\u002Fbholmes.dev","Web developer, teacher, whiteboardist. Building the next terminal @warpdotdev ","2026-11-06 02:02:39",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add bholmesdev\u002Fhubble.md --skill create-html-app",{"tool":68,"command":69},"bunx","bunx skills add bholmesdev\u002Fhubble.md --skill create-html-app",{"tool":71,"command":72},"pnpm","pnpm dlx skills add bholmesdev\u002Fhubble.md --skill create-html-app","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002FSKILL.md",true,[76,82,86,90,94,98],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Fbuttons.md","REFERENCE","参考文档",1071,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Fbuttons.md",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Ffiles-api.md",3067,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Ffiles-api.md",{"path":87,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fforms.md",1332,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Fforms.md",{"path":91,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Flists-and-empty-states.md",1202,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Flists-and-empty-states.md",{"path":95,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Fradio-selects.md",1037,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Fradio-selects.md",{"path":99,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":100,"sourceHtmlUrl":101},"references\u002Ftabs.md",1378,"https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcreate-html-app\u002Freferences\u002Ftabs.md",[103,120,137,152,170,180],{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":112,"publishedAt":47},"01M6PQAVS5DTTVEV9VA313YSYM","review-markdown-comments","Reply to, resolve, or reopen Hubble review comments stored as CriticMarkup in Markdown files. Use when asked to address a Hubble review comment.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Freview-markdown-comments\u002FSKILL.md",[109],{"categoryNo":110,"categoryName":111,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[113,114,115,116,117,118,119,35],"review markdown comments","comments","markdown","review","use","reply","files",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":47},"01M6PQAH29FCQB6921Y94CA8F4","merge-risk","Use when assessing the risk of merging a PR","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmerge-risk\u002FSKILL.md",[],[127,128,129,117,130,131,132,133,134,52,135,136],"merge risk","risk","merge","github","pr","https","engineering","matt pocock","true","blob",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":145,"publishedAt":47},"01M6PQA0ADFHMANPW4KRAV7EA6","embed-html-app","Embed a Hubble HTML App inline inside a Markdown File using an iframe block. Use when an app should be viewed in the context of a document.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fembed-html-app\u002FSKILL.md",[143,144],{"categoryNo":110,"categoryName":111,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[146,147,28,29,148,149,45,115,150,117,151],"embed html app","embed","block","inline","context","document",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":47},"01M6PQ9WQM5HF4QQ1J750346NY","edit-diagram","Create or edit a Hubble diagram: a .tldr file Hubble opens in its built-in tldraw canvas. With this skill installed, any diagram, canvas, whiteboard, or .tldr file is a Hubble diagram: use this skill instead of tldraw-offline, unless the user names the tldraw offline app or the file is a .tldraw archive.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fedit-diagram\u002FSKILL.md",[],[159,160,161,162,163,30,164,45,165,166,167,117,28,168,33,169],"edit diagram","edit","diagram","user","canvas","offline","tldraw offline","archive","tldr","tldraw","whiteboard",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":47},"01M6CPAR6ECFN9P9H1S4XWDCB1","convex","Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002Fpackages\u002Fsync-backend\u002F.agents\u002Fskills\u002Fconvex\u002FSKILL.md",[],[172,177,178,117,162,179],"general","task","project skill",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":47},"01M6CPAN2D6X1VYW8CDT2NAY5N","convex-setup-auth","Sets up Convex auth, identity mapping, and access control. Use for login, auth providers, users tables, protected functions, or roles in a Convex app.","https:\u002F\u002Fgithub.com\u002Fbholmesdev\u002Fhubble.md\u002Fblob\u002Fmain\u002Fpackages\u002Fsync-backend\u002F.agents\u002Fskills\u002Fconvex-setup-auth\u002FSKILL.md",[],[187,172,188,189,190,117,191,192,193,194,195,196],"convex setup auth","auth","setup","setup auth","access","Providers","up","identity","convex auth","functions"]