[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FE4Q9AV6BDVEB1PCP08W0":3,"skill-same:01M70FE4Q9AV6BDVEB1PCP08W0":66},{"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":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":48,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M70FE4Q9AV6BDVEB1PCP08W0","garden-plugin-author",null,"Create, test, and publish plugins for the Digital Garden Eleventy template (oleeskild\u002Fdigitalgarden, used by the obsidian-digital-garden plugin and Forestry.md). Use when asked to build a garden plugin, add a feature to a digital garden as a plugin, write or edit a garden-plugin.json manifest, or publish a plugin to the community registry.","aj-gman\u002Fcyberpunk","aj-gman","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F268577103?v=4","01M70FDEZSCJ90G66S9ZJAPPRB","g-man","01M70FDF0DJZPTAGRAYQVHGYGP",0,"MIT","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002Fskills\u002Fgarden-plugin-author\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"plugin","garden plugin author","author","json","template","build","digital-garden","eleventy","digitalgarden","test","create","publish","manifest","when","use","obsidian","for","feature","as","community","2026-11-10 10:12:30",false,"---\nname: garden-plugin-author\ndescription: Create, test, and publish plugins for the Digital Garden Eleventy template (oleeskild\u002Fdigitalgarden, used by the obsidian-digital-garden plugin and Forestry.md). Use when asked to build a garden plugin, add a feature to a digital garden as a plugin, write or edit a garden-plugin.json manifest, or publish a plugin to the community registry.\n---\n\n# Authoring a Digital Garden plugin\n\nA garden plugin is a directory that extends a Digital Garden site: markup\ninjected into named layout slots, site-wide styles\u002Fscripts, and build-time\nEleventy\u002Fmarkdown-it hooks. Plugins are distributed as public GitHub repos\nwith a `garden-plugin.json` manifest at the repo root, and installed into\n`src\u002Fplugins\u002F\u003Cid>\u002F` of a garden repo. Follow this skill end to end; do not\ninvent extension points that are not listed here.\n\n## Where to work\n\n- **Inside a garden or template checkout** (a repo with `.eleventy.js` and\n  `src\u002Fsite\u002F`): create your plugin directly at `src\u002Fplugins\u002F\u003Cid>\u002F` and it\n  runs immediately.\n- **Standalone plugin repo**: develop the plugin as its own directory, and\n  for testing clone https:\u002F\u002Fgithub.com\u002Foleeskild\u002Fdigitalgarden, run\n  `npm install`, and symlink or copy your plugin into `src\u002Fplugins\u002F\u003Cid>\u002F`.\n\nThe plugin id must match `^[a-z0-9][a-z0-9-]*$`, must equal the directory\nname, and must NOT start with `dg-` (reserved for first-party plugins).\n\n## Minimal viable plugin\n\n```\nsrc\u002Fplugins\u002Freading-time\u002F\n  garden-plugin.json\n  templates\u002Fbadge.njk\n```\n\n```json\n{\n  \"id\": \"reading-time\",\n  \"name\": \"Reading Time\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Shows an estimated reading time under the note title.\",\n  \"author\": \"Your Name\",\n  \"slots\": { \"notes.header\": \"templates\u002Fbadge.njk\" },\n  \"noteSettings\": [\"dgReadingTime\"]\n}\n```\n\n```njk\n{% if settings.dgReadingTime === true %}\n\u003Cdiv class=\"reading-time\">{{ ((content | striptags).split(\" \").length \u002F 200) | round }} min read\u003C\u002Fdiv>\n{% endif %}\n```\n\n`id`, `name`, `version`, `description`, `author` are required. Everything\nelse is optional. All declared paths must be relative, use `\u002F`, and\ncontain no `..` — a violation makes the loader (and installers) reject\nthe plugin.\n\n## Slots\n\nSlot templates are plain Nunjucks fragments (no front matter). They are\nrendered with the **full Eleventy data cascade** — `meta`, `settings`,\n`title`, `tags`, `created`, `updated`, `content`, `collections`, `graph`,\n`filetree`, `page` — plus `pluginSettings` (this plugin's resolved\nsettings). Always self-gate on your own setting: every enabled plugin's\nslots render unconditionally.\n\n| Slot | Renders |\n|---|---|\n| `common.head` \u002F `notes.head` \u002F `index.head` | in `\u003Chead>` (all pages \u002F notes \u002F home page) |\n| `common.header` \u002F `notes.header` \u002F `index.header` | in `\u003Cheader>` after title and tags |\n| `common.beforeContent` \u002F `notes.beforeContent` \u002F `index.beforeContent` | in `\u003Cmain>` before the content |\n| `common.afterContent` \u002F `notes.afterContent` \u002F `index.afterContent` | in `\u003Cmain>` after the content |\n| `common.footer` \u002F `notes.footer` \u002F `index.footer` | end of `\u003Cbody>` (scripts, overlays, tooltips) |\n| `navbar.actions` | navbar, where the search button sits |\n| `filetree.actions` | filetree sidebar below the site title |\n| `filetree.beforeTitle` \u002F `filetree.afterTitle` | around the filetree site title |\n| `sidebar.top` \u002F `sidebar.bottom` | right-hand sidebar |\n| `floating.bottomRight` | fixed stack in the bottom-right corner, filled from the corner upward; core's page panel toggle sits nearest the corner. Render **one element** per template (a button or link), it becomes a flex item and stacks above the previous one |\n\nManifest form: `\"slots\": { \"\u003Cslot>\": \"file.njk\" }` or a list of files.\nUse `common.footer` for anything with a `\u003Cscript>` or overlay markup.\n\nRender order within a slot is the site owner's call, not the plugin's:\nplugins render by the `order` number on their entry in\n`src\u002Fplugins\u002Fplugins.json` (lower first, default 0), then by id. In\n`floating.bottomRight` a lower order sits nearer the corner. Example:\n`{\"plugins\": {\"theme-switcher\": {\"order\": 10}, \"random-note\": {\"order\": 20}}}`.\n\n## Regions (exclusive replacement)\n\nA region replaces a core UI area instead of adding to it — at most one\nenabled plugin provides each region (first by id wins; conflicts warn).\nCurrently: `navigation` (default: the core navbar; the shipped\n`dg-filetree` plugin claims it to render the folder-tree sidebar).\n\n```jsonc\n\"regions\": { \"navigation\": \"templates\u002Fmy-nav.njk\" }\n```\n\nA custom navigation plugin gets the full data cascade, including the\ncore-computed `filetree` data structure, and may include core components\n(e.g. fall back to `{% include \"components\u002Fnavbar.njk\" %}`) and render\nsub-slots via `components\u002FpluginSlot.njk`. Users switch navigations by\ndisabling `dg-filetree` and enabling yours. Read\n`src\u002Fplugins\u002Fdg-filetree\u002F` in the template as the reference.\n\nA navigation plugin MUST render the surfaces other extensions rely on,\nin its own markup: the `navbar.actions` and `filetree.actions` plugin\nslots (the search button lives there), and the site owner's custom\nfiletree components —\n`{% for imp in dynamics.filetree.beforeTitle %}{% include imp %}{% endfor %}`\nplus the same for `dynamics.filetree.afterTitle`. `dg-filetree` does\nboth; copy its template as the starting point.\n\n## Build hooks (`\"hooks\": \"index.js\"`)\n\n```js\nmodule.exports = {\n  \u002F\u002F Both optional. context = { settings, manifest, pluginDir }\n  setupMarkdown(md, context) { md.use(require(\"markdown-it-footnote\")); },\n  setupEleventy(eleventyConfig, context) {\n    eleventyConfig.addFilter(\"myFilter\", (v) => v);\n    \u002F\u002F To emit a page (needs collections), register a virtual template:\n    \u002F\u002F eleventyConfig.addTemplate(\"my-page.njk\",\n    \u002F\u002F   require(\"fs\").readFileSync(require(\"path\").join(context.pluginDir, \"templates\u002Fpage.njk\"), \"utf8\"),\n    \u002F\u002F   { permalink: \"\u002Fmy-page.json\", eleventyExcludeFromCollections: true });\n  },\n};\n```\n\nRules: hooks run at config time in Node; they may only `require` packages\nthe template already ships (check the template's `package.json`) or pure\nJS files vendored inside the plugin dir — plugins cannot add npm\ndependencies. Hook changes need a dev-server restart. Thrown errors are\ncaught and the hook is skipped with a `[plugins]` warning.\n\n## Settings and per-note flags\n\n```json\n\"settings\": [\n  { \"key\": \"label\", \"name\": \"Label\", \"description\": \"…\",\n    \"type\": \"text\",              \u002F\u002F text | boolean | number | select\n    \"default\": \"Hello\",\n    \"options\": [\"a\", \"b\"],       \u002F\u002F select only\n    \"env\": \"MY_ENV_VAR\" }        \u002F\u002F optional env fallback\n],\n\"noteSettings\": [\"dgMyFlag\"]\n```\n\n- Setting resolution: stored value in `src\u002Fplugins\u002Fplugins.json` → env var\n  (`env` or the key) from the garden's `.env` → `default`. Read them as\n  `pluginSettings.\u003Ckey>` in templates, `context.settings.\u003Ckey>` in hooks.\n- `noteSettings` keys (camelCase, `dg`-prefixed by convention) resolve\n  like core note settings: env var of the same name is the global default,\n  a note's frontmatter `dg-my-flag: true\u002Ffalse` overrides per note. Read\n  as `settings.\u003Ckey>` in templates.\n\n## Styles, scripts, assets\n\n- `\"styles\": [\"styles\u002Fx.scss\"]` — `.scss` compiled per file (`_partials`\n  skipped) to `\u002Fplugins\u002F\u003Cid>\u002Fstyles\u002Fx.css` and linked in `\u003Chead>`; plain\n  `.css` copied and linked as-is. Prefer the garden's `--dg-*` CSS\n  variables for colors\u002Fspacing so themes keep working.\n- `\"scripts\": [\"assets\u002Fclient.js\"]` — copied and loaded via\n  `\u003Cscript defer>` in `\u003Chead>`.\n- `\"assets\": [\"assets\u002F\"]` — copied to `\u002Fplugins\u002F\u003Cid>\u002F…`, referenced only\n  by your own code.\n\n## Test before publishing\n\nFrom the template\u002Fgarden checkout:\n\n1. `npm install` once, then `npm run dev` — slot template, style, and\n   `plugins.json` edits hot-reload; restart after hook or manifest\n   changes.\n2. Watch for `[plugins] …` warnings in the build log — each one is a\n   manifest or runtime problem in your plugin.\n3. Build once with the plugin disabled\n   (`src\u002Fplugins\u002Fplugins.json` → `{\"plugins\": {\"\u003Cid>\": {\"enabled\": false}}}`)\n   and confirm the site is unchanged.\n4. If the template has a test suite, `npm test` must stay green.\n\n## Publish\n\n1. Put the plugin at the **root** of a public GitHub repo\n   (`garden-plugin.json` at top level). Suggested repo name:\n   `garden-plugin-\u003Cid>`.\n2. Add a README (what it does, a screenshot, settings) and a screenshot\n   file — the community directory shows it.\n3. Tag a release matching the manifest version: `git tag v1.0.0 && git push --tags`.\n   Installers fetch the latest release tag, falling back to the default\n   branch only when no release exists. Every future change: bump\n   `version`, tag again.\n4. Users can now install it by pasting the repo URL, or manually by\n   copying the directory into `src\u002Fplugins\u002F\u003Cid>\u002F`.\n5. To list it in the community directory, open a PR against\n   `oleeskild\u002Fdigitalgarden-plugins` adding one entry to\n   `community-plugins.json`:\n   `{ \"id\": \"\u003Cid>\", \"name\": \"…\", \"author\": \"…\", \"description\": \"…\", \"repo\": \"you\u002Fgarden-plugin-\u003Cid>\", \"screenshot\": \"screenshot.png\" }`.\n\n## Hard rules\n\n- Never require install-time execution: no postinstall steps, no \"run\n  this script to finish setup\". Installation is file copying only.\n- A plugin must never break the build when misconfigured — the loader\n  warns and skips, but keep your own code defensive too.\n- Don't touch files outside your plugin directory or claim another\n  plugin's id. Don't use the `dg-` prefix.\n- Plugin code runs in the site build and in visitors' browsers — keep it\n  small, readable, and dependency-light so users can audit it.\n\nFor deeper reference, read the first-party plugins under `src\u002Fplugins\u002F`\nin the template repo — `dg-link-preview` is the smallest, `dg-search`\nthe most complete, and `dg-filetree` the navigation reference.\n","# Authoring a Digital Garden plugin\n\nA garden plugin is a directory that extends a Digital Garden site: markup\ninjected into named layout slots, site-wide styles\u002Fscripts, and build-time\nEleventy\u002Fmarkdown-it hooks. Plugins are distributed as public GitHub repos\nwith a `garden-plugin.json` manifest at the repo root, and installed into\n`src\u002Fplugins\u002F\u003Cid>\u002F` of a garden repo. Follow this skill end to end; do not\ninvent extension points that are not listed here.\n\n## Where to work\n\n- **Inside a garden or template checkout** (a repo with `.eleventy.js` and\n  `src\u002Fsite\u002F`): create your plugin directly at `src\u002Fplugins\u002F\u003Cid>\u002F` and it\n  runs immediately.\n- **Standalone plugin repo**: develop the plugin as its own directory, and\n  for testing clone https:\u002F\u002Fgithub.com\u002Foleeskild\u002Fdigitalgarden, run\n  `npm install`, and symlink or copy your plugin into `src\u002Fplugins\u002F\u003Cid>\u002F`.\n\nThe plugin id must match `^[a-z0-9][a-z0-9-]*$`, must equal the directory\nname, and must NOT start with `dg-` (reserved for first-party plugins).\n\n## Minimal viable plugin\n\n```\nsrc\u002Fplugins\u002Freading-time\u002F\n  garden-plugin.json\n  templates\u002Fbadge.njk\n```\n\n```json\n{\n  \"id\": \"reading-time\",\n  \"name\": \"Reading Time\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Shows an estimated reading time under the note title.\",\n  \"author\": \"Your Name\",\n  \"slots\": { \"notes.header\": \"templates\u002Fbadge.njk\" },\n  \"noteSettings\": [\"dgReadingTime\"]\n}\n```\n\n```njk\n{% if settings.dgReadingTime === true %}\n\u003Cdiv class=\"reading-time\">{{ ((content | striptags).split(\" \").length \u002F 200) | round }} min read\u003C\u002Fdiv>\n{% endif %}\n```\n\n`id`, `name`, `version`, `description`, `author` are required. Everything\nelse is optional. All declared paths must be relative, use `\u002F`, and\ncontain no `..` — a violation makes the loader (and installers) reject\nthe plugin.\n\n## Slots\n\nSlot templates are plain Nunjucks fragments (no front matter). They are\nrendered with the **full Eleventy data cascade** — `meta`, `settings`,\n`title`, `tags`, `created`, `updated`, `content`, `collections`, `graph`,\n`filetree`, `page` — plus `pluginSettings` (this plugin's resolved\nsettings). Always self-gate on your own setting: every enabled plugin's\nslots render unconditionally.\n\n| Slot | Renders |\n|---|---|\n| `common.head` \u002F `notes.head` \u002F `index.head` | in `\u003Chead>` (all pages \u002F notes \u002F home page) |\n| `common.header` \u002F `notes.header` \u002F `index.header` | in `\u003Cheader>` after title and tags |\n| `common.beforeContent` \u002F `notes.beforeContent` \u002F `index.beforeContent` | in `\u003Cmain>` before the content |\n| `common.afterContent` \u002F `notes.afterContent` \u002F `index.afterContent` | in `\u003Cmain>` after the content |\n| `common.footer` \u002F `notes.footer` \u002F `index.footer` | end of `\u003Cbody>` (scripts, overlays, tooltips) |\n| `navbar.actions` | navbar, where the search button sits |\n| `filetree.actions` | filetree sidebar below the site title |\n| `filetree.beforeTitle` \u002F `filetree.afterTitle` | around the filetree site title |\n| `sidebar.top` \u002F `sidebar.bottom` | right-hand sidebar |\n| `floating.bottomRight` | fixed stack in the bottom-right corner, filled from the corner upward; core's page panel toggle sits nearest the corner. Render **one element** per template (a button or link), it becomes a flex item and stacks above the previous one |\n\nManifest form: `\"slots\": { \"\u003Cslot>\": \"file.njk\" }` or a list of files.\nUse `common.footer` for anything with a `\u003Cscript>` or overlay markup.\n\nRender order within a slot is the site owner's call, not the plugin's:\nplugins render by the `order` number on their entry in\n`src\u002Fplugins\u002Fplugins.json` (lower first, default 0), then by id. In\n`floating.bottomRight` a lower order sits nearer the corner. Example:\n`{\"plugins\": {\"theme-switcher\": {\"order\": 10}, \"random-note\": {\"order\": 20}}}`.\n\n## Regions (exclusive replacement)\n\nA region replaces a core UI area instead of adding to it — at most one\nenabled plugin provides each region (first by id wins; conflicts warn).\nCurrently: `navigation` (default: the core navbar; the shipped\n`dg-filetree` plugin claims it to render the folder-tree sidebar).\n\n```jsonc\n\"regions\": { \"navigation\": \"templates\u002Fmy-nav.njk\" }\n```\n\nA custom navigation plugin gets the full data cascade, including the\ncore-computed `filetree` data structure, and may include core components\n(e.g. fall back to `{% include \"components\u002Fnavbar.njk\" %}`) and render\nsub-slots via `components\u002FpluginSlot.njk`. Users switch navigations by\ndisabling `dg-filetree` and enabling yours. Read\n`src\u002Fplugins\u002Fdg-filetree\u002F` in the template as the reference.\n\nA navigation plugin MUST render the surfaces other extensions rely on,\nin its own markup: the `navbar.actions` and `filetree.actions` plugin\nslots (the search button lives there), and the site owner's custom\nfiletree components —\n`{% for imp in dynamics.filetree.beforeTitle %}{% include imp %}{% endfor %}`\nplus the same for `dynamics.filetree.afterTitle`. `dg-filetree` does\nboth; copy its template as the starting point.\n\n## Build hooks (`\"hooks\": \"index.js\"`)\n\n```js\nmodule.exports = {\n  \u002F\u002F Both optional. context = { settings, manifest, pluginDir }\n  setupMarkdown(md, context) { md.use(require(\"markdown-it-footnote\")); },\n  setupEleventy(eleventyConfig, context) {\n    eleventyConfig.addFilter(\"myFilter\", (v) => v);\n    \u002F\u002F To emit a page (needs collections), register a virtual template:\n    \u002F\u002F eleventyConfig.addTemplate(\"my-page.njk\",\n    \u002F\u002F   require(\"fs\").readFileSync(require(\"path\").join(context.pluginDir, \"templates\u002Fpage.njk\"), \"utf8\"),\n    \u002F\u002F   { permalink: \"\u002Fmy-page.json\", eleventyExcludeFromCollections: true });\n  },\n};\n```\n\nRules: hooks run at config time in Node; they may only `require` packages\nthe template already ships (check the template's `package.json`) or pure\nJS files vendored inside the plugin dir — plugins cannot add npm\ndependencies. Hook changes need a dev-server restart. Thrown errors are\ncaught and the hook is skipped with a `[plugins]` warning.\n\n## Settings and per-note flags\n\n```json\n\"settings\": [\n  { \"key\": \"label\", \"name\": \"Label\", \"description\": \"…\",\n    \"type\": \"text\",              \u002F\u002F text | boolean | number | select\n    \"default\": \"Hello\",\n    \"options\": [\"a\", \"b\"],       \u002F\u002F select only\n    \"env\": \"MY_ENV_VAR\" }        \u002F\u002F optional env fallback\n],\n\"noteSettings\": [\"dgMyFlag\"]\n```\n\n- Setting resolution: stored value in `src\u002Fplugins\u002Fplugins.json` → env var\n  (`env` or the key) from the garden's `.env` → `default`. Read them as\n  `pluginSettings.\u003Ckey>` in templates, `context.settings.\u003Ckey>` in hooks.\n- `noteSettings` keys (camelCase, `dg`-prefixed by convention) resolve\n  like core note settings: env var of the same name is the global default,\n  a note's frontmatter `dg-my-flag: true\u002Ffalse` overrides per note. Read\n  as `settings.\u003Ckey>` in templates.\n\n## Styles, scripts, assets\n\n- `\"styles\": [\"styles\u002Fx.scss\"]` — `.scss` compiled per file (`_partials`\n  skipped) to `\u002Fplugins\u002F\u003Cid>\u002Fstyles\u002Fx.css` and linked in `\u003Chead>`; plain\n  `.css` copied and linked as-is. Prefer the garden's `--dg-*` CSS\n  variables for colors\u002Fspacing so themes keep working.\n- `\"scripts\": [\"assets\u002Fclient.js\"]` — copied and loaded via\n  `\u003Cscript defer>` in `\u003Chead>`.\n- `\"assets\": [\"assets\u002F\"]` — copied to `\u002Fplugins\u002F\u003Cid>\u002F…`, referenced only\n  by your own code.\n\n## Test before publishing\n\nFrom the template\u002Fgarden checkout:\n\n1. `npm install` once, then `npm run dev` — slot template, style, and\n   `plugins.json` edits hot-reload; restart after hook or manifest\n   changes.\n2. Watch for `[plugins] …` warnings in the build log — each one is a\n   manifest or runtime problem in your plugin.\n3. Build once with the plugin disabled\n   (`src\u002Fplugins\u002Fplugins.json` → `{\"plugins\": {\"\u003Cid>\": {\"enabled\": false}}}`)\n   and confirm the site is unchanged.\n4. If the template has a test suite, `npm test` must stay green.\n\n## Publish\n\n1. Put the plugin at the **root** of a public GitHub repo\n   (`garden-plugin.json` at top level). Suggested repo name:\n   `garden-plugin-\u003Cid>`.\n2. Add a README (what it does, a screenshot, settings) and a screenshot\n   file — the community directory shows it.\n3. Tag a release matching the manifest version: `git tag v1.0.0 && git push --tags`.\n   Installers fetch the latest release tag, falling back to the default\n   branch only when no release exists. Every future change: bump\n   `version`, tag again.\n4. Users can now install it by pasting the repo URL, or manually by\n   copying the directory into `src\u002Fplugins\u002F\u003Cid>\u002F`.\n5. To list it in the community directory, open a PR against\n   `oleeskild\u002Fdigitalgarden-plugins` adding one entry to\n   `community-plugins.json`:\n   `{ \"id\": \"\u003Cid>\", \"name\": \"…\", \"author\": \"…\", \"description\": \"…\", \"repo\": \"you\u002Fgarden-plugin-\u003Cid>\", \"screenshot\": \"screenshot.png\" }`.\n\n## Hard rules\n\n- Never require install-time execution: no postinstall steps, no \"run\n  this script to finish setup\". Installation is file copying only.\n- A plugin must never break the build when misconfigured — the loader\n  warns and skips, but keep your own code defensive too.\n- Don't touch files outside your plugin directory or claim another\n  plugin's id. Don't use the `dg-` prefix.\n- Plugin code runs in the site build and in visitors' browsers — keep it\n  small, readable, and dependency-light so users can audit it.\n\nFor deeper reference, read the first-party plugins under `src\u002Fplugins\u002F`\nin the template repo — `dg-link-preview` is the smallest, `dg-search`\nthe most complete, and `dg-filetree` the navigation reference.\n",{"name":5,"description":7},"main","789435a30934e92aa018d0b8a2f396862c2f6418","skills\u002Fgarden-plugin-author","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk","https:\u002F\u002Faj-gman.github.io\u002Fcyberpunk\u002F","https:\u002F\u002Fgithub.com\u002Faj-gman","lowkey turning my dreams into reality thanks to this ai coding bs","2026-11-09 19:20:38",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add aj-gman\u002Fcyberpunk --skill garden-plugin-author",{"tool":58,"command":59},"bunx","bunx skills add aj-gman\u002Fcyberpunk --skill garden-plugin-author",{"tool":61,"command":62},"pnpm","pnpm dlx skills add aj-gman\u002Fcyberpunk --skill garden-plugin-author","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002Fskills\u002Fgarden-plugin-author\u002FSKILL.md",true,[],[67,90,118,134,151,159],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":78,"publishedAt":39},"01M70FE2HEMXMMJQ80YA7G7XZW","obsidian-markdown","Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fobsidian-markdown\u002FSKILL.md",[73],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[34,79,80,33,81,82,83,84,85,86,29,87,88,32,89],"obsidian markdown","markdown","user","frontmatter","syntax","edit","properties","notes","with","tags","files",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":101,"publishedAt":39},"01M70FE04JHVDZ0DCY3HGXGBW8","obsidian-cli","Interact with Obsidian vaults using the Obsidian CLI to read, create, search, and manage notes, tasks, properties, and more. Also supports plugin and theme development with commands to reload plugins, run JavaScript, capture errors, take screenshots, and inspect the DOM. Use when the user asks to interact with their Obsidian vault, manage notes, search vault content, perform vault operations from the command line, or develop and debug Obsidian plugins and themes.","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fobsidian-cli\u002FSKILL.md",[96],{"categoryNo":97,"categoryName":98,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[102,103,34,29,104,105,32,106,107,108,86,109,110,111,112,113,114,115,116,117],"obsidian cli","cli","themes","errors","tasks","search","inspect","theme","screenshots","vaults","take","commands","read","line","run","command",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":39},"01M70FDY30T7J1Z1Z4CG9MWR4D","obsidian-bases","Create and edit Obsidian Bases (.base files) with views, filters, formulas, and summaries. Use when working with .base files, creating database-like views of notes, or when the user mentions Bases, table views, card views, filters, or formulas in Obsidian.","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fobsidian-bases\u002FSKILL.md",[],[34,125,126,84,81,127,128,87,33,129,130,131,29,32,132,89,133,86],"obsidian bases","bases","base","summaries","formulas","table","filters","database","card",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":39},"01M70FDVCS9NH6RXS2JPKGNS7R","json-canvas","Create and edit JSON Canvas files (.canvas) with nodes, edges, groups, and connections. Use when working with .canvas files, creating visual canvases, mind maps, flowcharts, or when the user mentions Canvas files in Obsidian.","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fjson-canvas\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000015","视觉设计",[144,145,22,87,81,146,84,147,29,148,149,32,33,150,89,34],"json canvas","canvas","groups","Nodes","maps","visual","connections",{"skillNo":152,"name":27,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":39},"01M70FDT75Q9AR9GGWPEJS42X7","AI is knowledgeable about the inner workings of the Digital Garden plugin for Obsidian","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdigitalgarden\u002FSKILL.md",[],[27,35,19,157,34,158],"inner","about",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":168,"publishedAt":39},"01M70FDR83DTVHTZT9T7THEM73","defuddle","Extract clean markdown content from web pages using Defuddle CLI, removing clutter and navigation to save tokens. Use instead of WebFetch when the user provides a URL to read or analyze, for online documentation, articles, blog posts, or any standard web page. Do NOT use for URLs ending in .md — those are already markdown, use WebFetch directly.","https:\u002F\u002Fgithub.com\u002Faj-gman\u002Fcyberpunk\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdefuddle\u002FSKILL.md",[165],{"categoryNo":166,"categoryName":167,"taxonomyType":99,"taxonomyTypeDesc":100},"01JBSEEDCAT000000000000036","内容创作者",[161,169,80,170,171,172,103,173,174,175,176,32,33,177,178,179,180,35,181,182],"standard","webfetch","blog","web","documentation","analyze","markdown content","URL","pages","clean","tokens","page","posts","do"]