{"_id":"@dsh-next/dsh-next-skills","_rev":"3-ca2b139ad994da8dbe51a6fc1b080acf","name":"@dsh-next/dsh-next-skills","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@dsh-next/dsh-next-skills","version":"0.1.0","author":"Rok Grabnar <sitegroove>","license":"MIT","_id":"@dsh-next/dsh-next-skills@0.1.0","maintainers":[{"name":"sitegroove","email":"grabnarrok@gmail.com"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime"],"platform":"web"},"engines":{"dsh":">=0.1.1-rc.1"}},"dist":{"shasum":"31c453efaa913cd3e3790727cb867372c733f8f1","tarball":"https://registry.npmjs.org/@dsh-next/dsh-next-skills/-/dsh-next-skills-0.1.0.tgz","fileCount":9,"integrity":"sha512-jqN99smwjmtOdDMAQ+yLcM+VjN1hMXcJMM0CENMrDvrAiBQkldycW8OKhUg7Gf2hvhRWCc4peDi/mLGJR3Cb7Q==","signatures":[{"sig":"MEUCIQCitt4wDpmMXfj+AbywravFHWuWeqh26fcdDGSMgjCPLgIgfpIJm5CiE0LGgJYFRxcrMA8zFjHXQBViINvJTc4Mhi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":247306},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && tsdown","watch":"tsdown --watch","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sitegroove","email":"grabnarrok@gmail.com"},"description":"DeepSeek Harness plugin: manage agent skills - browse provider catalogs, install globally, and control per-workspace enablement from shared settings.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"js-yaml":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"29.1.1","react":"^18.3.1","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.3.1","typescript":"~5.7.2","@types/node":"^22.10.0","@types/react":"~18.3.1","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.5","@deepseek-ai/cordis":"^4.0.1","vite-tsconfig-paths":"^6.1.1","@deepseek-ai/dsh-skill":"^0.1.1-rc.2","@deepseek-ai/schemastery":"^3.18.1","@deepseek-ai/dsh-settings":"^0.1.1-rc.2","@deepseek-ai/dsh-client-locale":"0.1.1-rc.2","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-settings-plugins":"^0.1.1-rc.2"},"peerDependencies":{"react":"^18.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-next-skills_0.1.0_1788424108106_0.3752204056473307","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dsh-next/dsh-next-skills","version":"0.2.0","author":"Rok Grabnar <sitegroove>","license":"MIT","_id":"@dsh-next/dsh-next-skills@0.2.0","maintainers":[{"name":"sitegroove","email":"grabnarrok@gmail.com"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime"],"platform":"web"},"engines":{"dsh":">=0.1.1-rc.1"}},"dist":{"shasum":"38bed25cc0b83432c12e6ab8cf67b09694ac0053","tarball":"https://registry.npmjs.org/@dsh-next/dsh-next-skills/-/dsh-next-skills-0.2.0.tgz","fileCount":9,"integrity":"sha512-fNpOcRI15qadLr/LsGXnyVfbZEEEb/uwXheKNa/DBXH/EOmrCEBjtAaBIAZJ4+XsbTmsoC1dw9GngGttsfgH8w==","signatures":[{"sig":"MEUCIQChxzoZXiRH+FL0DrbS+vyJ+z4sTdDLYjYeBKgqhzoJsgIgFAJwdQb/M3X557mdAtHLFTBpf5nyCN7e6UVCiiUNpaY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIATKE5ZPj3MeoqfoDrSUjpoto/0MKeFrjgSA/gTgYpi4AiEAnuRQoxOIq5ISXInvsAXRdtVM1k2PjmKRShPwm/wnJJA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304397},"main":"lib/index.js","type":"module","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && tsdown","watch":"tsdown --watch","typecheck":"tsc --noEmit"},"_npmUser":{"name":"sitegroove","email":"grabnarrok@gmail.com"},"description":"DeepSeek Harness plugin: manage agent skills - browse provider catalogs, install globally, and control per-workspace enablement from shared settings.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"js-yaml":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"29.1.1","react":"^18.3.1","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.3.1","typescript":"~5.7.2","@types/node":"^22.10.0","@types/react":"~18.3.1","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.5","@deepseek-ai/cordis":"^4.0.2","vite-tsconfig-paths":"^6.1.1","@deepseek-ai/dsh-skill":"^0.1.2-rc.1","@deepseek-ai/schemastery":"^3.18.2","@deepseek-ai/dsh-settings":"^0.1.2-rc.1","@deepseek-ai/dsh-client-locale":"^0.1.2-rc.1","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.2-rc.1","@deepseek-ai/dsh-client-ui-settings-plugins":"^0.1.2-rc.1"},"peerDependencies":{"react":"^18.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-next-skills_0.2.0_1788518183988_0.10351163578621825","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@dsh-next/dsh-next-skills@0.3.0","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime"],"platform":"web"},"engines":{"dsh":">=0.1.1-rc.1"}},"dist":{"shasum":"5b42e117b79a3a9b4e592ff8fd5a9ca3fbdd0b05","tarball":"https://registry.npmjs.org/@dsh-next/dsh-next-skills/-/dsh-next-skills-0.3.0.tgz","fileCount":37,"integrity":"sha512-t2n7hIcSZrQ/yi46mbfJteL5qCMarHtw0+yOGx8OQZHKGr3p3rdsF79BdfVhQZCyJ29UEIReZ2kYXVtsG4uMaw==","signatures":[{"sig":"MEUCICnUOnopBqBpse1n62wvZxUhPVQb7u2EPsV7HfotNmDWAiEAirAfzO13uf0KH7yhIgFJ7nXRaCKKP+2NRrUNQxNHLgk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC5fQQvDr1LZlZLb3UCijPsEbnYK/VxtZYYCJz8l+VD0QIga989C0r9YmE2OpbvAfIvLrAMXni7oxIkV0wTh2Gxdgo="}],"unpackedSize":362750},"main":"lib/index.js","name":"@dsh-next/dsh-next-skills","type":"module","types":"lib/types/index.d.ts","author":"Rok Grabnar <sitegroove>","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./src/*":"./src/*","./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && tsdown","watch":"tsdown --watch","typecheck":"tsc --noEmit"},"version":"0.3.0","_npmUser":{"name":"sitegroove","email":"grabnarrok@gmail.com"},"description":"DeepSeek Harness plugin: manage agent skills - browse provider catalogs, install globally, and control per-workspace enablement from shared settings.","directories":{},"maintainers":[{"name":"sitegroove","email":"grabnarrok@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"js-yaml":"^4.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"29.1.1","react":"^18.3.1","tsdown":"^0.22.2","vitest":"^4.1.8","react-dom":"^18.3.1","typescript":"~5.7.2","@types/node":"^22.10.0","@types/react":"~18.3.1","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.5","@deepseek-ai/cordis":"^4.0.2","vite-tsconfig-paths":"^6.1.1","@deepseek-ai/dsh-skill":"^0.1.2-rc.1","@deepseek-ai/schemastery":"^3.18.2","@deepseek-ai/dsh-settings":"^0.1.2-rc.1","@deepseek-ai/dsh-client-locale":"^0.1.2-rc.1","@deepseek-ai/dsh-client-runtime":"^0.1.1-rc.2","@deepseek-ai/dsh-client-ui-slots":"^0.1.2-rc.1","@deepseek-ai/dsh-client-ui-settings-plugins":"^0.1.2-rc.1"},"peerDependencies":{"react":"^18.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-next-skills_0.3.0_1789087537289_0.36564176181740127"}}},"time":{"created":"2026-09-03T08:28:27.708Z","modified":"2026-09-11T00:45:37.548Z","0.1.0":"2026-09-03T08:28:28.238Z","0.2.0":"2026-09-04T10:36:24.139Z","0.3.0":"2026-09-11T00:45:37.392Z"},"author":"Rok Grabnar <sitegroove>","license":"MIT","description":"DeepSeek Harness plugin: manage agent skills - browse provider catalogs, install globally, and control per-workspace enablement from shared settings.","maintainers":[{"name":"sitegroove","email":"grabnarrok@gmail.com"}],"readme":"# @dsh-next/dsh-next-skills\n\nEnglish | [中文](README.zh.md)\n\nDeepSeek Harness plugin that manages agent skills from the Web GUI: add\nGitHub repositories as skill providers, install their skills globally, and\ncontrol per workspace — through configuration — which skills are enabled\nwhere. Skills install once, into the global skill root; projects keep only\nhand-created, version-controlled skills, and enable/disable never writes\nskill files.\n\nA **Skills** section appears in the main settings navigation (the same level\nas General, Models, and Plugins — registered through the official\n`settings.section` slot), styled after the Claude Plugins page, with two\ntabs:\n\n- **Skills** — one card grid holding every skill in the global roots\n  (`~/.dsh/skills` and `~/.agents/skills`) plus every provider catalog skill\n  that is not already installed. Project/workspace skills are deliberately\n  absent: they are hand-managed in the project and discovered natively by DSH,\n  so this panel lists nothing it cannot manage. A relevance-ranked search box\n  (name matches above description-only matches, so typing a skill's name\n  surfaces it instead of alphabetically-earlier description hits), a provider\n  filter, an installed-only toggle, and a Show more button (30 cards per page)\n  keep large catalogs fast; changing the search returns to page one. A skill that exists in several roots shows **one\n  card per copy**, so per-copy actions are unambiguous: each carries an origin\n  chip (`user .dsh`, `user .agents`), the recorded provider spec, and per-copy\n  **Delete** (recoverable), **Scopes**, **Providers**, and **Update**. Update\n  refreshes the copy from its recorded provider only (same-name skills from\n  other providers never show as updates, so the button cannot cycle between\n  vendors). A name that is installed renders only its copy cards — every\n  provider offering collapses into the copy's **Providers** button (labeled\n  with how many providers offer the name). The source switcher lists Local\n  plus each provider with its content parity (\"matches your copy\" / \"differs\n  from your copy\"), marks the current source, and switching to a provider\n  requires an overwrite confirm: the copy's files are rewritten in place,\n  files that are not part of the provider copy are removed permanently (not\n  moved to trash), and visibility scopes are kept. Choosing Local detaches the\n  copy from its provider (files stay, updates stop) and applies directly.\n  Externally-owned skills (installed by the cc-plugins bridge) show no\n  Providers switcher — their source is the owning plugin's business. The\n  **presence badge** (`Everywhere`, `N workspaces`, or `Off`) reflects the\n  skill's scope, and clicking a name opens the full SKILL.md rendered as\n  markdown. Installed skills sort first, and a name installed into several\n  roots shares one bordered group box. The **Use/Scopes** button opens the\n  scope modal: a radio picks where the skill is enabled — Global (the default,\n  every workspace) or only in a checklist of registered workspaces — and\n  installing or saving applies that scope as pure configuration.\n- **Providers** — manages GitHub skill repositories: add by URL\n  (`https://github.com/owner/repo` or `owner/repo`), Refresh all, remove.\n  Each row shows the repository description, the number of cached skills,\n  the last sync age, and any sync error. Refresh all runs one provider at a\n  time: the downloading row swaps its Remove button for a spinner reading\n  \"Refreshing…\" until the next provider starts (so the active provider is\n  always identifiable), the button shows the progress (\"Refreshing 2/9…\"),\n  and a failing provider shows its error on its own row while the rest\n  continue. Default providers seed on a fresh install and sync once shortly\n  after boot; removals persist.\n\n## How it works\n\n**Global-only installs.** Installing copies a skill's files into the global\nroot (`~/.agents/skills/<name>/`) and records the provenance in settings. The\nplugin never writes skill files into a project — and it does not list, scope,\nor manage project skills either: a workspace's `.agents/skills/` (or\n`.dsh/skills/`) belongs to the project alone, hand-created and\nversion-controlled there.\n\n**Enablement is configuration.** Per skill name, a scope setting decides\nwhere the skill is enabled: absent means enabled in every workspace; a list\nof workspace directory names enables it only inside workspaces whose folder\nmatches one of those names; an empty list disables it everywhere. Scopes\nstore folder names — not absolute paths — so the settings section keeps\nworking when teammates check the repos out somewhere else. (Two registered\nworkspaces sharing a folder name share their enablement.) A git worktree\nsession under that repo inherits the same enablement; worktree folders do\nnot appear in the scope checklist. The plugin publishes\nthe global-root skill catalog through its own `ctx.skills` provider (each\ncandidate one rank above the filesystem provider's equal entry) and resolves\nthe invocation flags per lookup from the scope — a disabled skill simply\ncarries both invocation flags off, so it disappears from every model and\ncommand surface. Project skills stay with the native filesystem provider,\nuntouched by this config. No frontmatter edits, no shadow copies, no file\nwrites.\n\n**Settings-backed state.** Providers, the install-provenance ledger\n(`installations`), and scopes persist in the plugin's own namespace of the\nharness settings file (`$DSH_HOME/settings.yaml`, key `dsh-next-skills:`) —\nreadable, hand-editable, and easy to share between developers. That section\nis the single source managing the plugin's state: a provider exists because\nthe section lists it, and a skill's provenance is whatever the section\nrecords — never a cache file or a per-skill sidecar (the provider catalog\ncache under `$DSH_HOME/skills-market/` is a replica: a cache entry without a\nsettings record does not exist as far as the panel is concerned). After the\nprovider caches sync, a skill recorded in settings whose files are missing is\nreinstalled from the cache, so copying the settings section to a teammate (or\na new machine) reproduces the same skill set: providers configure immediately,\nthe first boot syncs the caches and installs the recorded skills, and scopes\napply as-is (they are folder names). Every Refresh all ends with the same\nreconcile, so a provider that failed during a first boot's sync self-corrects\non the next refresh.\n\nDeletion is recoverable: a copy's Delete button moves that copy into the\n`.trash` directory of its root (skipped by discovery), so an accidental\nremoval can be undone by hand. Any copy in the global roots can be removed —\nnot just plugin-installed ones — and when the last copy of a name is removed,\nthe provenance record and scope entry are dropped together. Scope entries\nwhose name no longer resolves to any copy or catalog skill are pruned\nautomatically.\n\n## Providers and the cache\n\nA provider is any public GitHub repository containing skills: any directory\nwith a `SKILL.md` counts, at any depth, so both flat layouts\n(`skills/<name>/SKILL.md`, e.g. vercel-labs/skills) and nested ones\n(`native-skills/default/<group>/<name>/SKILL.md`, e.g. holistics/skills) work.\n`.git`, `.github`, and `node_modules` subtrees are ignored.\n\nOn first launch the plugin seeds a set of default providers (anthropics/skills,\nmattpocock/skills, muratcankoylan/Agent-Skills-for-Context-Engineering,\nnextlevelbuilder/ui-ux-pro-max-skill, addyosmani/agent-skills,\nLeonxlnx/taste-skill) and syncs them once shortly after boot, so the Skills tab\nis populated without any setup. Removing a default persists — they never come\nback.\n\n**Rate limits.** Metadata calls authenticate with `DSH_GITHUB_TOKEN` or\n`GITHUB_TOKEN` (either environment variable, read again on every sync) when\nset — 5000 requests/hour instead of the 60/hour unauthenticated budget the\nwhole machine shares. The snapshot download itself is CDN-backed and outside\nthat budget either way.\n\nAdding a provider downloads every skill into a plugin-owned cache at\n`$DSH_HOME/skills-market/` — deliberately outside `$DSH_HOME/skills`, which the\nDSH filesystem provider scans, so cached skills never activate by themselves.\nThe Skills tab reads that cache; installing copies the files into the global\nroot and records the provenance in settings. A provider may expose any number\nof skills — there is no cap (the grid paginates, and syncing is content-hash\nincremental), so even repositories with hundreds of skills sync and browse\nfine.\n\n**Fast syncs via repository snapshots.** Instead of one request per file, a\nsync downloads the repository's default-branch snapshot in a single request\n(`codeload.github.com`, CDN-backed and outside the API rate limit), extracts\nit in memory, and copies out every `SKILL.md` directory. Skill versions are\ncontent hashes, so a refresh re-copies only skills whose files changed.\nMetadata (repository description and star count) comes from one cheap API\ncall. That keeps even large default providers well within GitHub's 60\nreq/hr unauthenticated budget and makes first syncs a matter of seconds.\n\n**Change detection** fingerprints each local copy with the same content-hash\nrecipe used for catalog versions and compares it against every same-name\ncatalog skill. A copy's recorded provider drives the Update button: when its\ncontent differs, Update rewrites the copy in place (pruning files that\ndisappeared upstream) and re-pins the provenance record, leaving the scope\nuntouched. Every other provider's offering — including adopting a\nhand-managed copy — goes through the Providers source switcher, which\nrequires an explicit overwrite confirm before rewriting anything.\nRefresh is manual (Refresh all) and detect-only: nothing is installed or\noverwritten without a click.\n\n## Install\n\n```sh\ndsh plugin --profile <name> add @dsh-next/dsh-next-skills\n```\n\n## Development\n\n```sh\npnpm install\npnpm typecheck\npnpm test\npnpm build\n```\n\nRun the real-mount smoke from the repository root with `mise run e2e`.\n","readmeFilename":""}