soliplex-skills 0.1__tar.gz

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 (63) hide show
  1. soliplex_skills-0.1/.cache/.gitignore +1 -0
  2. soliplex_skills-0.1/.cache/1341065934833703470 +4 -0
  3. soliplex_skills-0.1/.cache/14458439227437353872 +77 -0
  4. soliplex_skills-0.1/.cache/15013631285151685656 +4 -0
  5. soliplex_skills-0.1/.cache/15301951464655326190 +4 -0
  6. soliplex_skills-0.1/.cache/15775557769269003863 +61 -0
  7. soliplex_skills-0.1/.cache/16674389806758257204 +77 -0
  8. soliplex_skills-0.1/.cache/16888823630424376787 +125 -0
  9. soliplex_skills-0.1/.cache/17013724727304210895 +4 -0
  10. soliplex_skills-0.1/.cache/18269805174232206862 +4 -0
  11. soliplex_skills-0.1/.cache/3476900567878811119 +4 -0
  12. soliplex_skills-0.1/.cache/3541202890535126406 +77 -0
  13. soliplex_skills-0.1/.cache/4342386513543115542 +110 -0
  14. soliplex_skills-0.1/.cache/5506274665904272119 +4 -0
  15. soliplex_skills-0.1/.cache/5688691082311909351 +4 -0
  16. soliplex_skills-0.1/.cache/6805557853694729310 +157 -0
  17. soliplex_skills-0.1/.cache/7303143099698209838 +61 -0
  18. soliplex_skills-0.1/.cache/8261987556278277644 +4 -0
  19. soliplex_skills-0.1/.cache/8508732161607499548 +109 -0
  20. soliplex_skills-0.1/.github/workflows/docs.yaml +66 -0
  21. soliplex_skills-0.1/.github/workflows/gitleaks.yaml +55 -0
  22. soliplex_skills-0.1/.github/workflows/issue-opened.yaml +22 -0
  23. soliplex_skills-0.1/.github/workflows/pr-opened.yaml +22 -0
  24. soliplex_skills-0.1/.github/workflows/python-lint.yaml +65 -0
  25. soliplex_skills-0.1/.github/workflows/python-test.yaml +66 -0
  26. soliplex_skills-0.1/.github/workflows/trufflehog.yaml +44 -0
  27. soliplex_skills-0.1/.gitignore +33 -0
  28. soliplex_skills-0.1/.gitleaks.toml +16 -0
  29. soliplex_skills-0.1/.pre-commit-config.yaml +48 -0
  30. soliplex_skills-0.1/LICENSE +21 -0
  31. soliplex_skills-0.1/PKG-INFO +38 -0
  32. soliplex_skills-0.1/README.md +25 -0
  33. soliplex_skills-0.1/docs/index.md +76 -0
  34. soliplex_skills-0.1/docs/mechanisms/building.md +48 -0
  35. soliplex_skills-0.1/docs/mechanisms/installation.md +52 -0
  36. soliplex_skills-0.1/docs/mechanisms/publishing.md +57 -0
  37. soliplex_skills-0.1/docs/mechanisms/versions-cli.md +126 -0
  38. soliplex_skills-0.1/docs/overview/concepts.md +70 -0
  39. soliplex_skills-0.1/docs/overview/release-model.md +85 -0
  40. soliplex_skills-0.1/docs/overview/skill-anatomy.md +63 -0
  41. soliplex_skills-0.1/docs/reference/api.md +85 -0
  42. soliplex_skills-0.1/pyproject.toml +110 -0
  43. soliplex_skills-0.1/src/soliplex_skills/_archive.py +114 -0
  44. soliplex_skills-0.1/src/soliplex_skills/build.py +122 -0
  45. soliplex_skills-0.1/src/soliplex_skills/cli.py +170 -0
  46. soliplex_skills-0.1/src/soliplex_skills/config.py +127 -0
  47. soliplex_skills-0.1/src/soliplex_skills/install.py +86 -0
  48. soliplex_skills-0.1/src/soliplex_skills/manifest.py +63 -0
  49. soliplex_skills-0.1/src/soliplex_skills/metadata.py +76 -0
  50. soliplex_skills-0.1/src/soliplex_skills/releases.py +155 -0
  51. soliplex_skills-0.1/src/soliplex_skills/versions.py +298 -0
  52. soliplex_skills-0.1/tests/unit/conftest.py +83 -0
  53. soliplex_skills-0.1/tests/unit/test__archive.py +101 -0
  54. soliplex_skills-0.1/tests/unit/test_build.py +178 -0
  55. soliplex_skills-0.1/tests/unit/test_cli.py +230 -0
  56. soliplex_skills-0.1/tests/unit/test_config.py +95 -0
  57. soliplex_skills-0.1/tests/unit/test_install.py +119 -0
  58. soliplex_skills-0.1/tests/unit/test_manifest.py +74 -0
  59. soliplex_skills-0.1/tests/unit/test_metadata.py +75 -0
  60. soliplex_skills-0.1/tests/unit/test_releases.py +171 -0
  61. soliplex_skills-0.1/tests/unit/test_versions.py +374 -0
  62. soliplex_skills-0.1/uv.lock +668 -0
  63. soliplex_skills-0.1/zensical.toml +110 -0
@@ -0,0 +1 @@
1
+ *
@@ -0,0 +1,4 @@
1
+ {
2
+ "data": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n <head>\n \n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n \n <meta name=\"description\" content=\"Shared infrastructure for releasing and upgrading versioned filesystem skills (https://agentskills.io) across the Soliplex projects.\n\">\n \n \n <meta name=\"author\" content=\"Soliplex\">\n \n \n <link rel=\"canonical\" href=\"https://soliplex.github.io/soliplex-skills/reference/api/\">\n \n \n <link rel=\"prev\" href=\"../../mechanisms/installation/\">\n \n \n \n \n \n \n <link rel=\"icon\" href=\"../../assets/images/favicon.png\">\n <meta name=\"generator\" content=\"zensical-0.0.44\">\n \n \n \n <title>API reference - Soliplex Skills</title>\n \n \n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/main.fba56155.min.css\">\n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/palette.dfe2e883.min.css\">\n \n \n\n\n \n \n \n \n \n \n \n \n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&amp;display=fallback\">\n <style>:root{--md-text-font:\"Inter\";--md-code-font:\"JetBrains Mono\"}</style>\n \n \n \n <script>__md_scope=new URL(\"../..\",location),__md_scope.pathname.endsWith(\"/\")||(__md_scope=new URL(__md_scope.pathname+\"/\",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+\".\"+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+\".\"+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute(\"data-platform\",navigator.platform)</script>\n \n \n\n \n \n </head>\n \n \n \n \n \n \n \n \n \n <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\">\n \n \n <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n <label class=\"md-overlay\" for=\"__drawer\" aria-label=\"Navigation\"></label>\n <div data-md-component=\"skip\">\n \n \n <a href=\"#api-reference\" class=\"md-skip\">\n Skip to content\n </a>\n \n </div>\n <div data-md-component=\"announce\">\n \n </div>\n \n \n \n\n \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-header__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n <label class=\"md-header__button md-icon\" for=\"__drawer\" aria-label=\"Navigation\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-menu\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16M4 12h16M4 19h16\"/></svg>\n </label>\n <div class=\"md-header__title\" data-md-component=\"header-title\">\n <div class=\"md-header__ellipsis\">\n <div class=\"md-header__topic\">\n <span class=\"md-ellipsis\">\n Soliplex Skills\n </span>\n </div>\n <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n <span class=\"md-ellipsis\">\n \n API reference\n \n </span>\n </div>\n </div>\n </div>\n \n \n <form class=\"md-header__option\" data-md-component=\"palette\">\n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to dark mode\" type=\"radio\" name=\"__palette\" id=\"__palette_0\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to dark mode\" for=\"__palette_1\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-sun\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/></svg>\n </label>\n \n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"slate\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to light mode\" type=\"radio\" name=\"__palette\" id=\"__palette_1\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to light mode\" for=\"__palette_0\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-moon\" viewBox=\"0 0 24 24\"><path d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"/></svg>\n </label>\n \n \n</form>\n \n \n \n <script>var palette=__md_get(\"__palette\");if(palette&&palette.color){if(\"(prefers-color-scheme)\"===palette.color.media){var media=matchMedia(\"(prefers-color-scheme: light)\"),input=document.querySelector(media.matches?\"[data-md-color-media='(prefers-color-scheme: light)']\":\"[data-md-color-media='(prefers-color-scheme: dark)']\");palette.color.media=input.getAttribute(\"data-md-color-media\"),palette.color.scheme=input.getAttribute(\"data-md-color-scheme\"),palette.color.primary=input.getAttribute(\"data-md-color-primary\"),palette.color.accent=input.getAttribute(\"data-md-color-accent\")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute(\"data-md-color-\"+key,value)}</script>\n \n \n \n \n \n <label class=\"md-header__button md-icon\" for=\"__search\" aria-label=\"Search\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-search\" viewBox=\"0 0 24 24\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\n </label>\n <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\" aria-label=\"Search\">\n <button type=\"button\" class=\"md-search__button\">\n Search\n </button>\n</div>\n \n \n <div class=\"md-header__source\">\n \n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n \n </div>\n </nav>\n \n</header>\n \n <div class=\"md-container\" data-md-component=\"container\">\n \n \n \n \n \n \n <main class=\"md-main\" data-md-component=\"main\">\n <div class=\"md-main__inner md-grid\">\n \n \n \n <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n <div class=\"md-sidebar__scrollwrap\">\n <div class=\"md-sidebar__inner\">\n \n\n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n <label class=\"md-nav__title\" for=\"__drawer\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-nav__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n Soliplex Skills\n </label>\n \n <div class=\"md-nav__source\">\n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n </div>\n \n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../..\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Home\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Overview\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_2\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Overview\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/concepts/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Concepts &amp; vocabulary\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/release-model/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Release model\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/skill-anatomy/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Skill anatomy\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Mechanisms\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_3\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Mechanisms\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../mechanisms/building/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Building a skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../mechanisms/publishing/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Publishing a skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../mechanisms/versions-cli/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Managing an installed skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../mechanisms/installation/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Installing a published skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" checked>\n \n \n <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"true\">\n <label class=\"md-nav__title\" for=\"__nav_4\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n API reference\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active\">\n \n \n \n \n \n \n \n <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <a href=\"././\" class=\"md-nav__link md-nav__link--active\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n </a>\n \n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#manifest-release-manifest-schema\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>manifest</code> — release manifest schema\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#metadata-skillmd-frontmatter-identity\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>metadata</code> — <code>SKILL.md</code> frontmatter identity\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#releases-github-releases-access\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>releases</code> — GitHub releases access\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#versions-list-diff-upgrade\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>versions</code> — list / diff / upgrade\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#build-assemble-stamp-validate\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>build</code> — assemble / stamp / validate\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#install-first-time-install\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>install</code> — first-time install\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#config-load-specs-from-pyprojecttoml\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>config</code> — load specs from <code>pyproject.toml</code>\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#cli-console-entry-point\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>cli</code> — console entry point\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n \n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n </ul>\n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n <div class=\"md-sidebar__scrollwrap\">\n \n \n \n \n \n \n \n <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n <div class=\"md-sidebar-button__wrapper\">\n <label class=\"md-sidebar-button\" for=\"__toc\"></label>\n </div>\n \n \n <div class=\"md-sidebar__inner\">\n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#manifest-release-manifest-schema\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>manifest</code> — release manifest schema\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#metadata-skillmd-frontmatter-identity\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>metadata</code> — <code>SKILL.md</code> frontmatter identity\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#releases-github-releases-access\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>releases</code> — GitHub releases access\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#versions-list-diff-upgrade\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>versions</code> — list / diff / upgrade\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#build-assemble-stamp-validate\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>build</code> — assemble / stamp / validate\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#install-first-time-install\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>install</code> — first-time install\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#config-load-specs-from-pyprojecttoml\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>config</code> — load specs from <code>pyproject.toml</code>\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#cli-console-entry-point\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>cli</code> — console entry point\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-content\" data-md-component=\"content\">\n \n \n\n\n\n \n\n\n <nav class=\"md-path\" aria-label=\"Navigation\" >\n <ol class=\"md-path__list\">\n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"../..\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n Home\n </span>\n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"././\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n API reference\n </span>\n\n </a>\n </li>\n \n \n\n \n </ol>\n </nav>\n\n \n <article class=\"md-content__inner md-typeset\">\n \n \n \n \n\n\n<h1 id=\"api-reference\">API reference<a class=\"headerlink\" href=\"#api-reference\" title=\"Permanent link\">&para;</a></h1>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Implemented</p>\n<p>This is the library's public surface. Every member below is implemented\nand covered by the test suite (100% branch coverage); the modules under\n<code>src/soliplex_skills/</code> are the source of truth.</p>\n</div>\n<p>There is no re-exporting package <code>__init__</code> — <strong>client code imports the\nsubmodule and uses its members by dotted name</strong> (e.g. <code>from soliplex_skills\nimport versions</code> then <code>versions.SkillVersions(...)</code>). The headline types are:</p>\n<table>\n<thead>\n<tr>\n<th>Name</th>\n<th>Module</th>\n<th>Kind</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ReleaseManifest</code></td>\n<td><code>manifest</code></td>\n<td>dataclass</td>\n<td><code>version.json</code> / <code>latest.json</code> schema</td>\n</tr>\n<tr>\n<td><code>SkillSpec</code></td>\n<td><code>versions</code></td>\n<td>dataclass</td>\n<td>the per-skill constants that distinguish one published skill from another</td>\n</tr>\n<tr>\n<td><code>SkillVersions</code></td>\n<td><code>versions</code></td>\n<td>class</td>\n<td><code>list</code> / <code>diff</code> / <code>upgrade</code> over a published skill</td>\n</tr>\n<tr>\n<td><code>PublishedSkill</code></td>\n<td><code>install</code></td>\n<td>dataclass</td>\n<td>a skill published as a release tarball (first-time install)</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"manifest-release-manifest-schema\"><code>manifest</code> — release manifest schema<a class=\"headerlink\" href=\"#manifest-release-manifest-schema\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ReleaseManifest(tag, source_commit, generated, sha256, asset_url)</code></td>\n<td>the manifest carried by every published build</td>\n</tr>\n<tr>\n<td><code>ReleaseManifest.from_json(raw)</code></td>\n<td>parse from JSON text/bytes or a mapping</td>\n</tr>\n<tr>\n<td><code>ReleaseManifest.to_json(*, indent=None)</code></td>\n<td>serialize to the workflow's canonical JSON</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"metadata-skillmd-frontmatter-identity\"><code>metadata</code> — <code>SKILL.md</code> frontmatter identity<a class=\"headerlink\" href=\"#metadata-skillmd-frontmatter-identity\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>read_source_commit(skill_md)</code></td>\n<td>the 7-char <code>source_commit</code> recorded in a SKILL.md, or <code>None</code></td>\n</tr>\n<tr>\n<td><code>stamp_source_commit(skill_md, commit)</code></td>\n<td>idempotently record <code>metadata.source_commit</code></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"releases-github-releases-access\"><code>releases</code> — GitHub releases access<a class=\"headerlink\" href=\"#releases-github-releases-access\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>list_releases(owner, repo, *, token=None)</code></td>\n<td>paginate the repo's releases</td>\n</tr>\n<tr>\n<td><code>classify(release, *, rolling_re)</code></td>\n<td><code>(kind, commit)</code> — rolling vs. release</td>\n</tr>\n<tr>\n<td><code>has_asset(release, name)</code></td>\n<td>whether a release carries an asset called <code>name</code></td>\n</tr>\n<tr>\n<td><code>read_pointer(asset_url)</code></td>\n<td>resolve a <code>…-latest</code> manifest, or <code>None</code></td>\n</tr>\n<tr>\n<td><code>fetch(url, *, accept=…, auth_token=None)</code></td>\n<td>scheme-guarded GitHub fetch (<code>https</code>/<code>file</code>)</td>\n</tr>\n<tr>\n<td><code>token()</code></td>\n<td><code>GITHUB_TOKEN</code> / <code>GH_TOKEN</code> from the environment</td>\n</tr>\n<tr>\n<td><code>GitHubAPIError</code>, <code>UnsupportedURLScheme</code></td>\n<td>error types</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"versions-list-diff-upgrade\"><code>versions</code> — list / diff / upgrade<a class=\"headerlink\" href=\"#versions-list-diff-upgrade\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>SkillSpec(owner, repo, skill_name, asset_tarball, pointer_tag, rolling_re, compare_scope=\"tree\", pointer_manifest=\"latest.json\")</code></td>\n<td>per-skill configuration</td>\n</tr>\n<tr>\n<td><code>SkillVersions(spec).list(*, kind=None)</code></td>\n<td>published versions, newest first</td>\n</tr>\n<tr>\n<td><code>SkillVersions(spec).diff(installed_path, target=\"latest\", *, name_only=False)</code></td>\n<td>installed vs. published</td>\n</tr>\n<tr>\n<td><code>SkillVersions(spec).upgrade(installed_path, target=\"latest\", *, force=False, dry_run=False)</code></td>\n<td>install a version in place</td>\n</tr>\n<tr>\n<td><code>CompareScope</code></td>\n<td><code>\"tree\"</code> (whole skill) or <code>\"references\"</code> (docs only)</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"build-assemble-stamp-validate\"><code>build</code> — assemble / stamp / validate<a class=\"headerlink\" href=\"#build-assemble-stamp-validate\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>discover_skills(skills_dir)</code></td>\n<td>names of skill dirs (those with a <code>SKILL.md</code>)</td>\n</tr>\n<tr>\n<td><code>git_head_commit(repo_dir)</code></td>\n<td>the repo's current commit SHA, or <code>None</code></td>\n</tr>\n<tr>\n<td><code>build_skill(name, *, src, dist, commit=None, validate=True)</code></td>\n<td>build one skill into <code>dist/&lt;name&gt;/</code></td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"install-first-time-install\"><code>install</code> — first-time install<a class=\"headerlink\" href=\"#install-first-time-install\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>PublishedSkill(name, owner, repo, asset_tarball, pointer_tag, pointer_manifest=\"latest.json\")</code></td>\n<td>a release-published skill spec</td>\n</tr>\n<tr>\n<td><code>PublishedSkill.download_base</code></td>\n<td>base URL for the repo's release-download assets</td>\n</tr>\n<tr>\n<td><code>PublishedSkill.asset_url(tag)</code> / <code>.pointer_url()</code></td>\n<td>asset / pointer-manifest URLs</td>\n</tr>\n<tr>\n<td><code>download_skill(spec, version, dest)</code></td>\n<td>resolve → download → verify → extract; returns the skill root</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"config-load-specs-from-pyprojecttoml\"><code>config</code> — load specs from <code>pyproject.toml</code><a class=\"headerlink\" href=\"#config-load-specs-from-pyprojecttoml\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>load_skill_specs(pyproject_path)</code></td>\n<td><code>{name: SkillSpec}</code> from <code>[[tool.soliplex-skills.skill]]</code></td>\n</tr>\n<tr>\n<td><code>find_pyproject(start=None)</code></td>\n<td>nearest <code>pyproject.toml</code> at/above <code>start</code> (cwd default)</td>\n</tr>\n<tr>\n<td><code>SkillConfigError</code> (+ subclasses)</td>\n<td>raised on missing/invalid configuration</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"cli-console-entry-point\"><code>cli</code> — console entry point<a class=\"headerlink\" href=\"#cli-console-entry-point\" title=\"Permanent link\">&para;</a></h2>\n<table>\n<thead>\n<tr>\n<th>Member</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>main(argv=None)</code></td>\n<td>dispatch <code>list</code> / <code>diff</code> / <code>upgrade</code> / <code>build</code>; returns an exit code. Installed as the <code>soliplex-skills</code> console script.</td>\n</tr>\n</tbody>\n</table>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n </article>\n </div>\n \n \n <script>var tabs=__md_get(\"__tabs\");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(\".tabbed-set\")){var labels=set.querySelector(\".tabbed-labels\");for(var tab of tabs)for(var label of labels.getElementsByTagName(\"label\"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>\n\n<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith(\"__tabbed_\"))</script>\n </div>\n \n <button type=\"button\" class=\"md-top md-icon\" data-md-component=\"top\" hidden>\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-circle-arrow-up\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m16 12-4-4-4 4M12 16V8\"/></svg>\n Back to top\n</button>\n \n </main>\n \n <footer class=\"md-footer\">\n \n \n \n <nav class=\"md-footer__inner md-grid\" aria-label=\"Footer\" >\n \n \n <a href=\"../../mechanisms/installation/\" class=\"md-footer__link md-footer__link--prev\" aria-label=\"Previous: Installing a published skill\">\n <div class=\"md-footer__button md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-arrow-left\" viewBox=\"0 0 24 24\"><path d=\"m12 19-7-7 7-7M19 12H5\"/></svg>\n </div>\n <div class=\"md-footer__title\">\n <span class=\"md-footer__direction\">\n Previous\n </span>\n <div class=\"md-ellipsis\">\n Installing a published skill\n </div>\n </div>\n </a>\n \n \n </nav>\n \n \n <div class=\"md-footer-meta md-typeset\">\n <div class=\"md-footer-meta__inner md-grid\">\n <div class=\"md-copyright\">\n \n <div class=\"md-copyright__highlight\">\n Copyright &copy; Soliplex\n\n </div>\n \n \n Made with\n <a href=\"https://zensical.org/\" target=\"_blank\" rel=\"noopener\">\n Zensical\n </a>\n \n</div>\n \n </div>\n </div>\n</footer>\n \n </div>\n <div class=\"md-dialog\" data-md-component=\"dialog\">\n <div class=\"md-dialog__inner md-typeset\"></div>\n </div>\n \n \n \n \n \n <script id=\"__config\" type=\"application/json\">{\"annotate\":null,\"base\":\"../..\",\"features\":[\"announce.dismiss\",\"content.code.annotate\",\"content.code.copy\",\"content.code.select\",\"content.tabs.link\",\"navigation.footer\",\"navigation.indexes\",\"navigation.instant\",\"navigation.instant.prefetch\",\"navigation.path\",\"navigation.sections\",\"navigation.top\",\"navigation.tracking\",\"search.highlight\"],\"search\":\"../../assets/javascripts/workers/search.e2d2d235.min.js\",\"tags\":null,\"translations\":{\"clipboard.copied\":\"Copied to clipboard\",\"clipboard.copy\":\"Copy to clipboard\",\"search.result.more.one\":\"1 more on this page\",\"search.result.more.other\":\"# more on this page\",\"search.result.none\":\"No matching documents\",\"search.result.one\":\"1 matching document\",\"search.result.other\":\"# matching documents\",\"search.result.placeholder\":\"Type to start searching\",\"search.result.term.missing\":\"Missing\",\"select.version\":\"Select version\"},\"version\":null}</script>\n \n \n <script src=\"../../assets/javascripts/bundle.6e5f0216.min.js\"></script>\n \n \n </body>\n</html>",
3
+ "hash": 8424423541231418962
4
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "data": {
3
+ "meta": {},
4
+ "content": "<h1 id=\"skill-anatomy\">Skill anatomy<a class=\"headerlink\" href=\"#skill-anatomy\" title=\"Permanent link\">&para;</a></h1>\n<h2 id=\"on-disk-layout\">On-disk layout<a class=\"headerlink\" href=\"#on-disk-layout\" title=\"Permanent link\">&para;</a></h2>\n<p>A built, installed skill is a self-contained directory:</p>\n<div class=\"language-text highlight\"><pre><span></span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"></a>soliplex-docs/\n</span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"></a>├── SKILL.md # frontmatter + body the agent reads\n</span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"></a>├── references/ # documentation / supporting material\n</span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"></a>├── scripts/\n</span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"></a>│ └── skill_versions.py # bundled list/diff/upgrade helper\n</span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"></a>└── assets/ # templates, etc. (skill-dependent)\n</span></code></pre></div>\n<p><code>scripts/skill_versions.py</code> is the version-management helper bundled <em>inside</em>\nthe skill so it can manage its own installed copy without any external tooling.\nToday it is a standalone copy in every skill; the goal of this project is for\nit to become a thin shim over the shared library (see\n<a href=\"../../mechanisms/versions-cli/\">Managing an installed skill</a>).</p>\n<h2 id=\"skillmd-frontmatter\"><code>SKILL.md</code> frontmatter<a class=\"headerlink\" href=\"#skillmd-frontmatter\" title=\"Permanent link\">&para;</a></h2>\n<p><code>SKILL.md</code> opens with a YAML frontmatter block. The <code>metadata</code> table records\nthe build's identity:</p>\n<div class=\"language-yaml highlight\"><pre><span></span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"></a><span class=\"nn\">---</span>\n</span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"></a><span class=\"nt\">name</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">soliplex-docs</span>\n</span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"></a><span class=\"nt\">description</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;…&quot;</span>\n</span><span id=\"__span-1-4\"><a id=\"__codelineno-1-4\" name=\"__codelineno-1-4\" href=\"#__codelineno-1-4\"></a><span class=\"nt\">license</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">MIT</span>\n</span><span id=\"__span-1-5\"><a id=\"__codelineno-1-5\" name=\"__codelineno-1-5\" href=\"#__codelineno-1-5\"></a><span class=\"nt\">metadata</span><span class=\"p\">:</span>\n</span><span id=\"__span-1-6\"><a id=\"__codelineno-1-6\" name=\"__codelineno-1-6\" href=\"#__codelineno-1-6\"></a><span class=\"w\"> </span><span class=\"nt\">version</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;0.68dev0&quot;</span><span class=\"w\"> </span><span class=\"c1\"># the skill&#39;s own version</span>\n</span><span id=\"__span-1-7\"><a id=\"__codelineno-1-7\" name=\"__codelineno-1-7\" href=\"#__codelineno-1-7\"></a><span class=\"w\"> </span><span class=\"nt\">source_commit</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;cc9a290&quot;</span><span class=\"w\"> </span><span class=\"c1\"># 7-char commit the build was assembled from</span>\n</span><span id=\"__span-1-8\"><a id=\"__codelineno-1-8\" name=\"__codelineno-1-8\" href=\"#__codelineno-1-8\"></a><span class=\"w\"> </span><span class=\"nt\">generated</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;2026-05-29&quot;</span><span class=\"w\"> </span><span class=\"c1\"># ISO build date</span>\n</span><span id=\"__span-1-9\"><a id=\"__codelineno-1-9\" name=\"__codelineno-1-9\" href=\"#__codelineno-1-9\"></a><span class=\"w\"> </span><span class=\"nt\">source</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"l l-Scalar l-Scalar-Plain\">https://github.com/soliplex/soliplex</span>\n</span><span id=\"__span-1-10\"><a id=\"__codelineno-1-10\" name=\"__codelineno-1-10\" href=\"#__codelineno-1-10\"></a><span class=\"nn\">---</span>\n</span></code></pre></div>\n<ul>\n<li><strong><code>version</code></strong> — the skill's own version string. For a\n <a href=\"../concepts/#repo-coupled-vs-independently-versioned-skills\">repo-coupled skill</a>\n this tracks the repo; for an independently-versioned skill it advances on its\n own cadence.</li>\n<li><strong><code>source_commit</code></strong> — the installed identity (see\n <a href=\"../concepts/#source_commit-the-installed-identity\">Concepts</a>). Stamped at\n build time; read back by clients to detect drift and skip no-op upgrades.</li>\n<li><strong><code>generated</code></strong> — the build date, mirrored into the\n <a href=\"../release-model/#the-manifest\">release manifest</a>.</li>\n</ul>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Stamping is a build step</p>\n<p>The tracked source <code>SKILL.md</code> carries no <code>source_commit</code>. It is inserted\nonly into the built copy under <code>dist/</code>, by\n<a href=\"../../reference/api/\"><code>metadata.stamp_source_commit</code></a> during\n<a href=\"../../mechanisms/building/\">building</a>.</p>\n</div>\n<h2 id=\"where-skills-are-installed\">Where skills are installed<a class=\"headerlink\" href=\"#where-skills-are-installed\" title=\"Permanent link\">&para;</a></h2>\n<p>Filesystem skills are unpacked into an agent's skills directory — for Claude\nCode, <code>~/.claude/skills/&lt;skill-name&gt;/</code>. There is no special installer step for\ndiscovery: a running Soliplex scans its configured skill directories, reads\neach <code>SKILL.md</code>'s frontmatter, and exposes the <code>metadata</code> table — so an\noperator can see an installed skill's <code>source_commit</code> and compare it against\nwhat is published.</p>",
5
+ "search": [
6
+ {
7
+ "location": null,
8
+ "level": 1,
9
+ "title": "Skill anatomy",
10
+ "text": "",
11
+ "path": [],
12
+ "tags": []
13
+ },
14
+ {
15
+ "location": "on-disk-layout",
16
+ "level": 2,
17
+ "title": "On-disk layout",
18
+ "text": "<p>A built, installed skill is a self-contained directory:</p> <pre><code>soliplex-docs/\n├── SKILL.md # frontmatter + body the agent reads\n├── references/ # documentation / supporting material\n├── scripts/\n│ └── skill_versions.py # bundled list/diff/upgrade helper\n└── assets/ # templates, etc. (skill-dependent)\n</code></pre> <p><code>scripts/skill_versions.py</code> is the version-management helper bundled inside the skill so it can manage its own installed copy without any external tooling. Today it is a standalone copy in every skill; the goal of this project is for it to become a thin shim over the shared library (see Managing an installed skill).</p>",
19
+ "path": [],
20
+ "tags": []
21
+ },
22
+ {
23
+ "location": "skillmd-frontmatter",
24
+ "level": 2,
25
+ "title": "<code>SKILL.md</code> frontmatter",
26
+ "text": "<p><code>SKILL.md</code> opens with a YAML frontmatter block. The <code>metadata</code> table records the build's identity:</p> <pre><code>---\nname: soliplex-docs\ndescription: \"…\"\nlicense: MIT\nmetadata:\n version: \"0.68dev0\" # the skill's own version\n source_commit: \"cc9a290\" # 7-char commit the build was assembled from\n generated: \"2026-05-29\" # ISO build date\n source: https://github.com/soliplex/soliplex\n---\n</code></pre> <ul> <li><code>version</code> — the skill's own version string. For a repo-coupled skill this tracks the repo; for an independently-versioned skill it advances on its own cadence.</li> <li><code>source_commit</code> — the installed identity (see Concepts). Stamped at build time; read back by clients to detect drift and skip no-op upgrades.</li> <li><code>generated</code> — the build date, mirrored into the release manifest.</li> </ul> <p>Stamping is a build step</p> <p>The tracked source <code>SKILL.md</code> carries no <code>source_commit</code>. It is inserted only into the built copy under <code>dist/</code>, by <code>metadata.stamp_source_commit</code> during building.</p>",
27
+ "path": [],
28
+ "tags": []
29
+ },
30
+ {
31
+ "location": "where-skills-are-installed",
32
+ "level": 2,
33
+ "title": "Where skills are installed",
34
+ "text": "<p>Filesystem skills are unpacked into an agent's skills directory — for Claude Code, <code>~/.claude/skills/&lt;skill-name&gt;/</code>. There is no special installer step for discovery: a running Soliplex scans its configured skill directories, reads each <code>SKILL.md</code>'s frontmatter, and exposes the <code>metadata</code> table — so an operator can see an installed skill's <code>source_commit</code> and compare it against what is published.</p>",
35
+ "path": [],
36
+ "tags": []
37
+ }
38
+ ],
39
+ "title": "Skill anatomy",
40
+ "toc": [
41
+ {
42
+ "title": "Skill anatomy",
43
+ "content": "Skill anatomy",
44
+ "id": "skill-anatomy",
45
+ "url": "#skill-anatomy",
46
+ "children": [
47
+ {
48
+ "title": "On-disk layout",
49
+ "content": "On-disk layout",
50
+ "id": "on-disk-layout",
51
+ "url": "#on-disk-layout",
52
+ "children": [],
53
+ "level": 2
54
+ },
55
+ {
56
+ "title": "SKILL.md frontmatter",
57
+ "content": "<code>SKILL.md</code> frontmatter",
58
+ "id": "skillmd-frontmatter",
59
+ "url": "#skillmd-frontmatter",
60
+ "children": [],
61
+ "level": 2
62
+ },
63
+ {
64
+ "title": "Where skills are installed",
65
+ "content": "Where skills are installed",
66
+ "id": "where-skills-are-installed",
67
+ "url": "#where-skills-are-installed",
68
+ "children": [],
69
+ "level": 2
70
+ }
71
+ ],
72
+ "level": 1
73
+ }
74
+ ]
75
+ },
76
+ "hash": 2002719425668802882
77
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "data": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n <head>\n \n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n \n <meta name=\"description\" content=\"Shared infrastructure for releasing and upgrading versioned filesystem skills (https://agentskills.io) across the Soliplex projects.\n\">\n \n \n <meta name=\"author\" content=\"Soliplex\">\n \n \n <link rel=\"canonical\" href=\"https://soliplex.github.io/soliplex-skills/mechanisms/building/\">\n \n \n <link rel=\"prev\" href=\"../../overview/skill-anatomy/\">\n \n \n <link rel=\"next\" href=\"../publishing/\">\n \n \n \n \n \n <link rel=\"icon\" href=\"../../assets/images/favicon.png\">\n <meta name=\"generator\" content=\"zensical-0.0.44\">\n \n \n \n <title>Building a skill - Soliplex Skills</title>\n \n \n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/main.fba56155.min.css\">\n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/palette.dfe2e883.min.css\">\n \n \n\n\n \n \n \n \n \n \n \n \n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&amp;display=fallback\">\n <style>:root{--md-text-font:\"Inter\";--md-code-font:\"JetBrains Mono\"}</style>\n \n \n \n <script>__md_scope=new URL(\"../..\",location),__md_scope.pathname.endsWith(\"/\")||(__md_scope=new URL(__md_scope.pathname+\"/\",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+\".\"+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+\".\"+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute(\"data-platform\",navigator.platform)</script>\n \n \n\n \n \n </head>\n \n \n \n \n \n \n \n \n \n <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\">\n \n \n <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n <label class=\"md-overlay\" for=\"__drawer\" aria-label=\"Navigation\"></label>\n <div data-md-component=\"skip\">\n \n \n <a href=\"#building-a-skill\" class=\"md-skip\">\n Skip to content\n </a>\n \n </div>\n <div data-md-component=\"announce\">\n \n </div>\n \n \n \n\n \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-header__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n <label class=\"md-header__button md-icon\" for=\"__drawer\" aria-label=\"Navigation\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-menu\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16M4 12h16M4 19h16\"/></svg>\n </label>\n <div class=\"md-header__title\" data-md-component=\"header-title\">\n <div class=\"md-header__ellipsis\">\n <div class=\"md-header__topic\">\n <span class=\"md-ellipsis\">\n Soliplex Skills\n </span>\n </div>\n <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n <span class=\"md-ellipsis\">\n \n Building a skill\n \n </span>\n </div>\n </div>\n </div>\n \n \n <form class=\"md-header__option\" data-md-component=\"palette\">\n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to dark mode\" type=\"radio\" name=\"__palette\" id=\"__palette_0\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to dark mode\" for=\"__palette_1\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-sun\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/></svg>\n </label>\n \n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"slate\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to light mode\" type=\"radio\" name=\"__palette\" id=\"__palette_1\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to light mode\" for=\"__palette_0\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-moon\" viewBox=\"0 0 24 24\"><path d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"/></svg>\n </label>\n \n \n</form>\n \n \n \n <script>var palette=__md_get(\"__palette\");if(palette&&palette.color){if(\"(prefers-color-scheme)\"===palette.color.media){var media=matchMedia(\"(prefers-color-scheme: light)\"),input=document.querySelector(media.matches?\"[data-md-color-media='(prefers-color-scheme: light)']\":\"[data-md-color-media='(prefers-color-scheme: dark)']\");palette.color.media=input.getAttribute(\"data-md-color-media\"),palette.color.scheme=input.getAttribute(\"data-md-color-scheme\"),palette.color.primary=input.getAttribute(\"data-md-color-primary\"),palette.color.accent=input.getAttribute(\"data-md-color-accent\")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute(\"data-md-color-\"+key,value)}</script>\n \n \n \n \n \n <label class=\"md-header__button md-icon\" for=\"__search\" aria-label=\"Search\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-search\" viewBox=\"0 0 24 24\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\n </label>\n <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\" aria-label=\"Search\">\n <button type=\"button\" class=\"md-search__button\">\n Search\n </button>\n</div>\n \n \n <div class=\"md-header__source\">\n \n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n \n </div>\n </nav>\n \n</header>\n \n <div class=\"md-container\" data-md-component=\"container\">\n \n \n \n \n \n \n <main class=\"md-main\" data-md-component=\"main\">\n <div class=\"md-main__inner md-grid\">\n \n \n \n <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n <div class=\"md-sidebar__scrollwrap\">\n <div class=\"md-sidebar__inner\">\n \n\n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n <label class=\"md-nav__title\" for=\"__drawer\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-nav__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n Soliplex Skills\n </label>\n \n <div class=\"md-nav__source\">\n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n </div>\n \n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../..\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Home\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Overview\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_2\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Overview\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/concepts/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Concepts &amp; vocabulary\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/release-model/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Release model\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/skill-anatomy/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Skill anatomy\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n \n \n <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Mechanisms\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n <label class=\"md-nav__title\" for=\"__nav_3\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Mechanisms\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active\">\n \n \n \n \n \n \n \n <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Building a skill\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <a href=\"././\" class=\"md-nav__link md-nav__link--active\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Building a skill\n\n \n </span>\n \n \n\n </a>\n \n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#the-pipeline\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n The pipeline\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#api\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n API\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../publishing/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Publishing a skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../versions-cli/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Managing an installed skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../installation/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Installing a published skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_4\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n API reference\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../reference/api/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n </ul>\n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n <div class=\"md-sidebar__scrollwrap\">\n \n \n \n \n \n \n \n <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n <div class=\"md-sidebar-button__wrapper\">\n <label class=\"md-sidebar-button\" for=\"__toc\"></label>\n </div>\n \n \n <div class=\"md-sidebar__inner\">\n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#the-pipeline\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n The pipeline\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#api\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n API\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-content\" data-md-component=\"content\">\n \n \n\n\n\n \n\n\n <nav class=\"md-path\" aria-label=\"Navigation\" >\n <ol class=\"md-path__list\">\n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"../..\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n Home\n </span>\n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"././\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n Mechanisms\n </span>\n\n </a>\n </li>\n \n \n\n \n </ol>\n </nav>\n\n \n <article class=\"md-content__inner md-typeset\">\n \n \n \n \n\n\n<h1 id=\"building-a-skill\">Building a skill<a class=\"headerlink\" href=\"#building-a-skill\" title=\"Permanent link\">&para;</a></h1>\n<p>Before a skill can be published it is <strong>assembled, stamped, and validated</strong>\ninto a distribution directory. This is the step the per-repo\n<code>build_skill.py</code> / <code>build_skills.py</code> / <code>generate_docs_skill.py</code> scripts perform\ntoday; the <a href=\"../../reference/api/\"><code>build</code> module</a> consolidates it.</p>\n<h2 id=\"the-pipeline\">The pipeline<a class=\"headerlink\" href=\"#the-pipeline\" title=\"Permanent link\">&para;</a></h2>\n<pre class=\"mermaid\"><code>flowchart LR\n S[skills/&amp;lt;name&amp;gt;/] --&gt;|copytree| D[dist/&amp;lt;name&amp;gt;/]\n D --&gt;|stamp source_commit| D2[dist/&amp;lt;name&amp;gt;/ stamped]\n D2 --&gt;|agentskills validate| OK[validated build]</code></pre>\n<ol>\n<li><strong>Assemble</strong> — copy the skill's source tree into <code>dist/&lt;name&gt;/</code>, skipping\n <code>__pycache__</code>.</li>\n<li><strong>Stamp</strong> — write <code>metadata.source_commit</code> into the copied <code>SKILL.md</code> (the\n commit defaults to the repo's git <code>HEAD</code>). The tracked source is never\n modified.</li>\n<li><strong>Validate</strong> — run the agent-skills reference validator\n (<code>agentskills validate</code>) against the built directory.</li>\n</ol>\n<p>Packaging the validated <code>dist/&lt;name&gt;/</code> into release assets (a tarball and zip)\nis the <a href=\"../publishing/\">publishing workflow</a>'s job, not the build script's.</p>\n<h2 id=\"api\">API<a class=\"headerlink\" href=\"#api\" title=\"Permanent link\">&para;</a></h2>\n<p>The <a href=\"../../reference/api/\"><code>build</code> module</a>:</p>\n<ul>\n<li><strong><code>discover_skills(skills_dir)</code></strong> — return the names of every skill directory\n (those containing a <code>SKILL.md</code>) under <code>skills_dir</code>. Repos that ship several\n skills (e.g. <code>soliplex-concierge</code>) iterate over this.</li>\n<li><strong><code>git_head_commit(repo_dir)</code></strong> — the repo's current commit SHA, or <code>None</code>.</li>\n<li><strong><code>build_skill(name, *, src, dist, commit=None, validate=True)</code></strong> — run the\n three steps above and return the built <code>dist/&lt;name&gt;/</code> path.</li>\n</ul>\n<p>Stamping itself lives in <a href=\"../../reference/api/\"><code>metadata.stamp_source_commit</code></a>,\nshared with the version-management client so the <em>write</em> and the <em>read</em> of\n<code>source_commit</code> cannot drift apart.</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">What this de-duplicates</p>\n<p><code>stamp_source_commit()</code> is currently byte-for-byte identical in\n<code>soliplex-template/scripts/build_skill.py</code> and\n<code>soliplex-concierge/scripts/build_skills.py</code>, and <code>discover_skills()</code> /\n<code>build_skill()</code> are the same shape across all three repos. Centralizing\nthem here removes that copy-paste.</p>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n </article>\n </div>\n \n \n <script>var tabs=__md_get(\"__tabs\");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(\".tabbed-set\")){var labels=set.querySelector(\".tabbed-labels\");for(var tab of tabs)for(var label of labels.getElementsByTagName(\"label\"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>\n\n<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith(\"__tabbed_\"))</script>\n </div>\n \n <button type=\"button\" class=\"md-top md-icon\" data-md-component=\"top\" hidden>\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-circle-arrow-up\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m16 12-4-4-4 4M12 16V8\"/></svg>\n Back to top\n</button>\n \n </main>\n \n <footer class=\"md-footer\">\n \n \n \n <nav class=\"md-footer__inner md-grid\" aria-label=\"Footer\" >\n \n \n <a href=\"../../overview/skill-anatomy/\" class=\"md-footer__link md-footer__link--prev\" aria-label=\"Previous: Skill anatomy\">\n <div class=\"md-footer__button md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-arrow-left\" viewBox=\"0 0 24 24\"><path d=\"m12 19-7-7 7-7M19 12H5\"/></svg>\n </div>\n <div class=\"md-footer__title\">\n <span class=\"md-footer__direction\">\n Previous\n </span>\n <div class=\"md-ellipsis\">\n Skill anatomy\n </div>\n </div>\n </a>\n \n \n \n <a href=\"../publishing/\" class=\"md-footer__link md-footer__link--next\" aria-label=\"Next: Publishing a skill\">\n <div class=\"md-footer__title\">\n <span class=\"md-footer__direction\">\n Next\n </span>\n <div class=\"md-ellipsis\">\n Publishing a skill\n </div>\n </div>\n <div class=\"md-footer__button md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-arrow-right\" viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </div>\n </a>\n \n </nav>\n \n \n <div class=\"md-footer-meta md-typeset\">\n <div class=\"md-footer-meta__inner md-grid\">\n <div class=\"md-copyright\">\n \n <div class=\"md-copyright__highlight\">\n Copyright &copy; Soliplex\n\n </div>\n \n \n Made with\n <a href=\"https://zensical.org/\" target=\"_blank\" rel=\"noopener\">\n Zensical\n </a>\n \n</div>\n \n </div>\n </div>\n</footer>\n \n </div>\n <div class=\"md-dialog\" data-md-component=\"dialog\">\n <div class=\"md-dialog__inner md-typeset\"></div>\n </div>\n \n \n \n \n \n <script id=\"__config\" type=\"application/json\">{\"annotate\":null,\"base\":\"../..\",\"features\":[\"announce.dismiss\",\"content.code.annotate\",\"content.code.copy\",\"content.code.select\",\"content.tabs.link\",\"navigation.footer\",\"navigation.indexes\",\"navigation.instant\",\"navigation.instant.prefetch\",\"navigation.path\",\"navigation.sections\",\"navigation.top\",\"navigation.tracking\",\"search.highlight\"],\"search\":\"../../assets/javascripts/workers/search.e2d2d235.min.js\",\"tags\":null,\"translations\":{\"clipboard.copied\":\"Copied to clipboard\",\"clipboard.copy\":\"Copy to clipboard\",\"search.result.more.one\":\"1 more on this page\",\"search.result.more.other\":\"# more on this page\",\"search.result.none\":\"No matching documents\",\"search.result.one\":\"1 matching document\",\"search.result.other\":\"# matching documents\",\"search.result.placeholder\":\"Type to start searching\",\"search.result.term.missing\":\"Missing\",\"select.version\":\"Select version\"},\"version\":null}</script>\n \n \n <script src=\"../../assets/javascripts/bundle.6e5f0216.min.js\"></script>\n \n \n </body>\n</html>",
3
+ "hash": 8044783542817696646
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "data": "\n<!doctype html>\n<html lang=\"en\" class=\"no-js\">\n <head>\n \n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n \n <meta name=\"description\" content=\"Shared infrastructure for releasing and upgrading versioned filesystem skills (https://agentskills.io) across the Soliplex projects.\n\">\n \n \n <meta name=\"author\" content=\"Soliplex\">\n \n \n <link rel=\"canonical\" href=\"https://soliplex.github.io/soliplex-skills/mechanisms/versions-cli/\">\n \n \n <link rel=\"prev\" href=\"../publishing/\">\n \n \n <link rel=\"next\" href=\"../installation/\">\n \n \n \n \n \n <link rel=\"icon\" href=\"../../assets/images/favicon.png\">\n <meta name=\"generator\" content=\"zensical-0.0.44\">\n \n \n \n <title>Managing an installed skill - Soliplex Skills</title>\n \n \n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/main.fba56155.min.css\">\n \n \n \n \n <link rel=\"stylesheet\" href=\"../../assets/stylesheets/modern/palette.dfe2e883.min.css\">\n \n \n\n\n \n \n \n \n \n \n \n \n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,500,500i,700,700i%7CJetBrains+Mono:400,400i,700,700i&amp;display=fallback\">\n <style>:root{--md-text-font:\"Inter\";--md-code-font:\"JetBrains Mono\"}</style>\n \n \n \n <script>__md_scope=new URL(\"../..\",location),__md_scope.pathname.endsWith(\"/\")||(__md_scope=new URL(__md_scope.pathname+\"/\",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+\".\"+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+\".\"+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute(\"data-platform\",navigator.platform)</script>\n \n \n\n \n \n </head>\n \n \n \n \n \n \n \n \n \n <body dir=\"ltr\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\">\n \n \n <input class=\"md-toggle\" data-md-toggle=\"drawer\" type=\"checkbox\" id=\"__drawer\" autocomplete=\"off\">\n <input class=\"md-toggle\" data-md-toggle=\"search\" type=\"checkbox\" id=\"__search\" autocomplete=\"off\">\n <label class=\"md-overlay\" for=\"__drawer\" aria-label=\"Navigation\"></label>\n <div data-md-component=\"skip\">\n \n \n <a href=\"#managing-an-installed-skill\" class=\"md-skip\">\n Skip to content\n </a>\n \n </div>\n <div data-md-component=\"announce\">\n \n </div>\n \n \n \n\n \n\n<header class=\"md-header md-header--shadow\" data-md-component=\"header\">\n <nav class=\"md-header__inner md-grid\" aria-label=\"Header\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-header__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n <label class=\"md-header__button md-icon\" for=\"__drawer\" aria-label=\"Navigation\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-menu\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16M4 12h16M4 19h16\"/></svg>\n </label>\n <div class=\"md-header__title\" data-md-component=\"header-title\">\n <div class=\"md-header__ellipsis\">\n <div class=\"md-header__topic\">\n <span class=\"md-ellipsis\">\n Soliplex Skills\n </span>\n </div>\n <div class=\"md-header__topic\" data-md-component=\"header-topic\">\n <span class=\"md-ellipsis\">\n \n Managing an installed skill\n \n </span>\n </div>\n </div>\n </div>\n \n \n <form class=\"md-header__option\" data-md-component=\"palette\">\n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"default\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to dark mode\" type=\"radio\" name=\"__palette\" id=\"__palette_0\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to dark mode\" for=\"__palette_1\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-sun\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"/></svg>\n </label>\n \n \n \n \n \n <input class=\"md-option\" data-md-color-media=\"none\" data-md-color-scheme=\"slate\" data-md-color-primary=\"indigo\" data-md-color-accent=\"indigo\" aria-label=\"Switch to light mode\" type=\"radio\" name=\"__palette\" id=\"__palette_1\">\n \n <label class=\"md-header__button md-icon\" title=\"Switch to light mode\" for=\"__palette_0\" hidden>\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-moon\" viewBox=\"0 0 24 24\"><path d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"/></svg>\n </label>\n \n \n</form>\n \n \n \n <script>var palette=__md_get(\"__palette\");if(palette&&palette.color){if(\"(prefers-color-scheme)\"===palette.color.media){var media=matchMedia(\"(prefers-color-scheme: light)\"),input=document.querySelector(media.matches?\"[data-md-color-media='(prefers-color-scheme: light)']\":\"[data-md-color-media='(prefers-color-scheme: dark)']\");palette.color.media=input.getAttribute(\"data-md-color-media\"),palette.color.scheme=input.getAttribute(\"data-md-color-scheme\"),palette.color.primary=input.getAttribute(\"data-md-color-primary\"),palette.color.accent=input.getAttribute(\"data-md-color-accent\")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute(\"data-md-color-\"+key,value)}</script>\n \n \n \n \n \n <label class=\"md-header__button md-icon\" for=\"__search\" aria-label=\"Search\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-search\" viewBox=\"0 0 24 24\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\n </label>\n <div class=\"md-search\" data-md-component=\"search\" role=\"dialog\" aria-label=\"Search\">\n <button type=\"button\" class=\"md-search__button\">\n Search\n </button>\n</div>\n \n \n <div class=\"md-header__source\">\n \n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n \n </div>\n </nav>\n \n</header>\n \n <div class=\"md-container\" data-md-component=\"container\">\n \n \n \n \n \n \n <main class=\"md-main\" data-md-component=\"main\">\n <div class=\"md-main__inner md-grid\">\n \n \n \n <div class=\"md-sidebar md-sidebar--primary\" data-md-component=\"sidebar\" data-md-type=\"navigation\" >\n <div class=\"md-sidebar__scrollwrap\">\n <div class=\"md-sidebar__inner\">\n \n\n\n\n<nav class=\"md-nav md-nav--primary\" aria-label=\"Navigation\" data-md-level=\"0\">\n <label class=\"md-nav__title\" for=\"__drawer\">\n <a href=\"../..\" title=\"Soliplex Skills\" class=\"md-nav__button md-logo\" aria-label=\"Soliplex Skills\" data-md-component=\"logo\">\n \n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-book-open\" viewBox=\"0 0 24 24\"><path d=\"M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"/></svg>\n\n </a>\n Soliplex Skills\n </label>\n \n <div class=\"md-nav__source\">\n <a href=\"https://github.com/soliplex/soliplex-skills\" title=\"Go to repository\" class=\"md-source\" data-md-component=\"source\">\n <div class=\"md-source__icon md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill=\"currentColor\" d=\"M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4\"/></svg>\n </div>\n <div class=\"md-source__repository\">\n soliplex/soliplex-skills\n </div>\n</a>\n </div>\n \n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../..\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Home\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_2\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_2\" id=\"__nav_2_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Overview\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_2_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_2\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Overview\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/concepts/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Concepts &amp; vocabulary\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/release-model/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Release model\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../overview/skill-anatomy/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Skill anatomy\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_3\" checked>\n \n \n <label class=\"md-nav__link\" for=\"__nav_3\" id=\"__nav_3_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Mechanisms\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_3_label\" aria-expanded=\"true\">\n <label class=\"md-nav__title\" for=\"__nav_3\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n Mechanisms\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../building/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Building a skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../publishing/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Publishing a skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--active\">\n \n \n \n \n \n \n \n <label class=\"md-nav__link md-nav__link--active\" for=\"__toc\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Managing an installed skill\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <a href=\"././\" class=\"md-nav__link md-nav__link--active\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Managing an installed skill\n\n \n </span>\n \n \n\n </a>\n \n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#list-what-has-been-published\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>list</code> — what has been published?\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#diff-how-does-my-copy-differ\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>diff</code> — how does my copy differ?\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#upgrade-install-a-published-version\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>upgrade</code> — install a published version\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#the-soliplex-skills-cli\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n The <code>soliplex-skills</code> CLI\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#cli-configuration\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n CLI configuration\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#library-api\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n Library API\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../installation/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n Installing a published skill\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-nav__item md-nav__item--section md-nav__item--nested\">\n \n \n \n <input class=\"md-nav__toggle md-toggle \" type=\"checkbox\" id=\"__nav_4\" >\n \n \n <label class=\"md-nav__link\" for=\"__nav_4\" id=\"__nav_4_label\" tabindex=\"\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n <span class=\"md-nav__icon md-icon\"></span>\n </label>\n \n <nav class=\"md-nav\" data-md-level=\"1\" aria-labelledby=\"__nav_4_label\" aria-expanded=\"false\">\n <label class=\"md-nav__title\" for=\"__nav_4\">\n <span class=\"md-nav__icon md-icon\"></span>\n \n \n API reference\n\n </label>\n <ul class=\"md-nav__list\" data-md-scrollfix>\n \n \n \n \n \n \n \n <li class=\"md-nav__item\">\n <a href=\"../../reference/api/\" class=\"md-nav__link\">\n \n \n \n <span class=\"md-ellipsis\">\n \n \n API reference\n\n \n </span>\n \n \n\n </a>\n </li>\n \n\n \n \n </ul>\n </nav>\n \n </li>\n \n\n \n </ul>\n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-sidebar md-sidebar--secondary\" data-md-component=\"sidebar\" data-md-type=\"toc\" >\n <div class=\"md-sidebar__scrollwrap\">\n \n \n \n \n \n \n \n <input class=\"md-nav__toggle md-toggle\" type=\"checkbox\" id=\"__toc\">\n <div class=\"md-sidebar-button__wrapper\">\n <label class=\"md-sidebar-button\" for=\"__toc\"></label>\n </div>\n \n \n <div class=\"md-sidebar__inner\">\n \n\n\n<nav class=\"md-nav md-nav--secondary\" aria-label=\"On this page\">\n \n \n \n \n \n \n <label class=\"md-nav__title\" for=\"__toc\">\n <span class=\"md-nav__icon md-icon\"></span>\n On this page\n </label>\n <ul class=\"md-nav__list\" data-md-component=\"toc\" data-md-scrollfix>\n \n <li class=\"md-nav__item\">\n <a href=\"#list-what-has-been-published\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>list</code> — what has been published?\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#diff-how-does-my-copy-differ\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>diff</code> — how does my copy differ?\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#upgrade-install-a-published-version\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n <code>upgrade</code> — install a published version\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#the-soliplex-skills-cli\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n The <code>soliplex-skills</code> CLI\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#cli-configuration\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n CLI configuration\n </span>\n </span>\n </a>\n \n</li>\n \n <li class=\"md-nav__item\">\n <a href=\"#library-api\" class=\"md-nav__link\">\n <span class=\"md-ellipsis\">\n <span class=\"md-typeset\">\n Library API\n </span>\n </span>\n </a>\n \n</li>\n \n </ul>\n \n</nav>\n </div>\n </div>\n </div>\n \n \n \n <div class=\"md-content\" data-md-component=\"content\">\n \n \n\n\n\n \n\n\n <nav class=\"md-path\" aria-label=\"Navigation\" >\n <ol class=\"md-path__list\">\n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"../..\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n Home\n </span>\n\n </a>\n </li>\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n <li class=\"md-path__item\">\n <a href=\"../building/\" class=\"md-path__link\">\n \n \n <span class=\"md-ellipsis\">\n Mechanisms\n </span>\n\n </a>\n </li>\n \n \n\n \n </ol>\n </nav>\n\n \n <article class=\"md-content__inner md-typeset\">\n \n \n \n \n\n\n<h1 id=\"managing-an-installed-skill\">Managing an installed skill<a class=\"headerlink\" href=\"#managing-an-installed-skill\" title=\"Permanent link\">&para;</a></h1>\n<p>Every skill bundles a <code>scripts/skill_versions.py</code> helper so you can manage your\ninstalled copy against what has been published — without leaving the skill or\ninstalling anything extra. It offers three subcommands.</p>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Network &amp; auth</p>\n<p>These commands reach <code>api.github.com</code> / <code>github.com</code>. Set <code>GITHUB_TOKEN</code>\n(or <code>GH_TOKEN</code>) to raise the API rate limit. Only <code>https</code> (and a\n<code>file://</code> testing override) URLs are honored.</p>\n</div>\n<h2 id=\"list-what-has-been-published\"><code>list</code> — what has been published?<a class=\"headerlink\" href=\"#list-what-has-been-published\" title=\"Permanent link\">&para;</a></h2>\n<p>Shows the skill's published versions newest-first — both\n<a href=\"../../overview/concepts/#rolling-build-vs-tagged-release\">rolling builds</a> and\ntagged releases — marking your installed copy and the current <code>latest</code> pointer.</p>\n<div class=\"language-console highlight\"><pre><span></span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"></a><span class=\"gp\">$ </span>python<span class=\"w\"> </span>scripts/skill_versions.py<span class=\"w\"> </span>list\n</span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"></a><span class=\"go\">TAG DATE KIND COMMIT</span>\n</span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"></a><span class=\"go\">docs-2026.05.29-cc9a290f 2026-05-29 rolling cc9a290 ← installed, latest</span>\n</span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"></a><span class=\"go\">v0.68 2026-05-20 release a1b2c3d</span>\n</span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"></a><span class=\"go\">docs-2026.05.18-a1b2c3d 2026-05-18 rolling a1b2c3d</span>\n</span></code></pre></div>\n<p>Filter with <code>--kind {rolling,release}</code>, or get machine-readable output with\n<code>--json</code>.</p>\n<h2 id=\"diff-how-does-my-copy-differ\"><code>diff</code> — how does my copy differ?<a class=\"headerlink\" href=\"#diff-how-does-my-copy-differ\" title=\"Permanent link\">&para;</a></h2>\n<p>Compares your installed skill against a published version (default <code>latest</code>).</p>\n<div class=\"language-console highlight\"><pre><span></span><code><span id=\"__span-1-1\"><a id=\"__codelineno-1-1\" name=\"__codelineno-1-1\" href=\"#__codelineno-1-1\"></a><span class=\"go\">python scripts/skill_versions.py diff # vs. latest</span>\n</span><span id=\"__span-1-2\"><a id=\"__codelineno-1-2\" name=\"__codelineno-1-2\" href=\"#__codelineno-1-2\"></a><span class=\"go\">python scripts/skill_versions.py diff v0.68 # vs. a specific tag</span>\n</span><span id=\"__span-1-3\"><a id=\"__codelineno-1-3\" name=\"__codelineno-1-3\" href=\"#__codelineno-1-3\"></a><span class=\"go\">python scripts/skill_versions.py diff --name-only</span>\n</span></code></pre></div>\n<p>What gets compared depends on the skill's <strong>compare scope</strong>:</p>\n<ul>\n<li><code>references</code> — only the <code>references/</code> Markdown (used by <code>soliplex-docs</code>,\n whose payload is documentation);</li>\n<li><code>tree</code> — the whole skill tree: <code>SKILL.md</code>, <code>scripts/</code>, <code>assets/</code>,\n <code>references/</code> (used by <code>soliplex-template</code> and the concierge skills).</li>\n</ul>\n<h2 id=\"upgrade-install-a-published-version\"><code>upgrade</code> — install a published version<a class=\"headerlink\" href=\"#upgrade-install-a-published-version\" title=\"Permanent link\">&para;</a></h2>\n<p>Downloads a version (default <code>latest</code>) and installs it <strong>in place</strong>.</p>\n<div class=\"language-console highlight\"><pre><span></span><code><span id=\"__span-2-1\"><a id=\"__codelineno-2-1\" name=\"__codelineno-2-1\" href=\"#__codelineno-2-1\"></a><span class=\"go\">python scripts/skill_versions.py upgrade # to latest</span>\n</span><span id=\"__span-2-2\"><a id=\"__codelineno-2-2\" name=\"__codelineno-2-2\" href=\"#__codelineno-2-2\"></a><span class=\"go\">python scripts/skill_versions.py upgrade v0.68 # to a specific tag</span>\n</span><span id=\"__span-2-3\"><a id=\"__codelineno-2-3\" name=\"__codelineno-2-3\" href=\"#__codelineno-2-3\"></a><span class=\"go\">python scripts/skill_versions.py upgrade --dry-run # show the plan only</span>\n</span><span id=\"__span-2-4\"><a id=\"__codelineno-2-4\" name=\"__codelineno-2-4\" href=\"#__codelineno-2-4\"></a><span class=\"go\">python scripts/skill_versions.py upgrade --force # reinstall same commit</span>\n</span></code></pre></div>\n<ul>\n<li>The download's <strong><code>sha256</code> is verified</strong> against the manifest when known.</li>\n<li>Files are replaced in place, <strong>removing directories first</strong>, so files deleted\n upstream do not linger.</li>\n<li>If your installed <code>source_commit</code> already matches the target, it is a no-op\n unless you pass <code>--force</code>. (Downgrading is just upgrading to an older tag.)</li>\n</ul>\n<h2 id=\"the-soliplex-skills-cli\">The <code>soliplex-skills</code> CLI<a class=\"headerlink\" href=\"#the-soliplex-skills-cli\" title=\"Permanent link\">&para;</a></h2>\n<p>The same three operations are available from the installed console script,\nwhich reads each skill's configuration from a <code>[tool.soliplex-skills]</code> stanza\nin <code>pyproject.toml</code> (see <a href=\"#cli-configuration\">CLI configuration</a>) so you don't\nrepeat the constants on the command line:</p>\n<div class=\"language-console highlight\"><pre><span></span><code><span id=\"__span-3-1\"><a id=\"__codelineno-3-1\" name=\"__codelineno-3-1\" href=\"#__codelineno-3-1\"></a><span class=\"go\">soliplex-skills list --skill soliplex-docs</span>\n</span><span id=\"__span-3-2\"><a id=\"__codelineno-3-2\" name=\"__codelineno-3-2\" href=\"#__codelineno-3-2\"></a><span class=\"go\">soliplex-skills diff --skill soliplex-docs --skill-dir path/to/installed</span>\n</span><span id=\"__span-3-3\"><a id=\"__codelineno-3-3\" name=\"__codelineno-3-3\" href=\"#__codelineno-3-3\"></a><span class=\"go\">soliplex-skills upgrade --skill soliplex-docs --skill-dir path/to/installed --dry-run</span>\n</span></code></pre></div>\n<p><code>--skill</code> is optional when the config defines a single skill; <code>--pyproject</code>\noverrides the default upward search for <code>pyproject.toml</code>.</p>\n<h2 id=\"cli-configuration\">CLI configuration<a class=\"headerlink\" href=\"#cli-configuration\" title=\"Permanent link\">&para;</a></h2>\n<p>Each skill records its <a href=\"../../reference/api/\"><code>SkillSpec</code></a> once, as an array of\ntables. The <code>rolling_prefix</code> is expanded into the rolling-tag regex, and\n<code>compare_scope</code> defaults to <code>\"tree\"</code>:</p>\n<div class=\"language-toml highlight\"><pre><span></span><code><span id=\"__span-4-1\"><a id=\"__codelineno-4-1\" name=\"__codelineno-4-1\" href=\"#__codelineno-4-1\"></a><span class=\"k\">[[tool.soliplex-skills.skill]]</span>\n</span><span id=\"__span-4-2\"><a id=\"__codelineno-4-2\" name=\"__codelineno-4-2\" href=\"#__codelineno-4-2\"></a><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;soliplex-docs&quot;</span>\n</span><span id=\"__span-4-3\"><a id=\"__codelineno-4-3\" name=\"__codelineno-4-3\" href=\"#__codelineno-4-3\"></a><span class=\"n\">owner</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;soliplex&quot;</span>\n</span><span id=\"__span-4-4\"><a id=\"__codelineno-4-4\" name=\"__codelineno-4-4\" href=\"#__codelineno-4-4\"></a><span class=\"n\">repo</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;soliplex&quot;</span>\n</span><span id=\"__span-4-5\"><a id=\"__codelineno-4-5\" name=\"__codelineno-4-5\" href=\"#__codelineno-4-5\"></a><span class=\"n\">asset_tarball</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;soliplex-docs-skill.tar.gz&quot;</span>\n</span><span id=\"__span-4-6\"><a id=\"__codelineno-4-6\" name=\"__codelineno-4-6\" href=\"#__codelineno-4-6\"></a><span class=\"n\">pointer_tag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;docs-latest&quot;</span>\n</span><span id=\"__span-4-7\"><a id=\"__codelineno-4-7\" name=\"__codelineno-4-7\" href=\"#__codelineno-4-7\"></a><span class=\"n\">rolling_prefix</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;docs&quot;</span><span class=\"w\"> </span><span class=\"c1\"># -&gt; ^docs-\\d{4}\\.\\d{2}\\.\\d{2}-[0-9a-f]+$</span>\n</span><span id=\"__span-4-8\"><a id=\"__codelineno-4-8\" name=\"__codelineno-4-8\" href=\"#__codelineno-4-8\"></a><span class=\"n\">compare_scope</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">&quot;references&quot;</span><span class=\"w\"> </span><span class=\"c1\"># optional, default &quot;tree&quot;</span>\n</span></code></pre></div>\n<h2 id=\"library-api\">Library API<a class=\"headerlink\" href=\"#library-api\" title=\"Permanent link\">&para;</a></h2>\n<p>The three subcommands are methods on <strong><code>SkillVersions</code></strong>, configured by a\n<strong><code>SkillSpec</code></strong> that captures exactly the constants that differ between skills:</p>\n<div class=\"language-python highlight\"><pre><span></span><code><span id=\"__span-5-1\"><a id=\"__codelineno-5-1\" name=\"__codelineno-5-1\" href=\"#__codelineno-5-1\"></a><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">re</span>\n</span><span id=\"__span-5-2\"><a id=\"__codelineno-5-2\" name=\"__codelineno-5-2\" href=\"#__codelineno-5-2\"></a><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">soliplex_skills</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">versions</span>\n</span><span id=\"__span-5-3\"><a id=\"__codelineno-5-3\" name=\"__codelineno-5-3\" href=\"#__codelineno-5-3\"></a>\n</span><span id=\"__span-5-4\"><a id=\"__codelineno-5-4\" name=\"__codelineno-5-4\" href=\"#__codelineno-5-4\"></a><span class=\"n\">spec</span> <span class=\"o\">=</span> <span class=\"n\">versions</span><span class=\"o\">.</span><span class=\"n\">SkillSpec</span><span class=\"p\">(</span>\n</span><span id=\"__span-5-5\"><a id=\"__codelineno-5-5\" name=\"__codelineno-5-5\" href=\"#__codelineno-5-5\"></a> <span class=\"n\">owner</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-5-6\"><a id=\"__codelineno-5-6\" name=\"__codelineno-5-6\" href=\"#__codelineno-5-6\"></a> <span class=\"n\">repo</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-5-7\"><a id=\"__codelineno-5-7\" name=\"__codelineno-5-7\" href=\"#__codelineno-5-7\"></a> <span class=\"n\">skill_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex-docs&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-5-8\"><a id=\"__codelineno-5-8\" name=\"__codelineno-5-8\" href=\"#__codelineno-5-8\"></a> <span class=\"n\">asset_tarball</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex-docs-skill.tar.gz&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-5-9\"><a id=\"__codelineno-5-9\" name=\"__codelineno-5-9\" href=\"#__codelineno-5-9\"></a> <span class=\"n\">pointer_tag</span><span class=\"o\">=</span><span class=\"s2\">&quot;docs-latest&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-5-10\"><a id=\"__codelineno-5-10\" name=\"__codelineno-5-10\" href=\"#__codelineno-5-10\"></a> <span class=\"n\">rolling_re</span><span class=\"o\">=</span><span class=\"n\">re</span><span class=\"o\">.</span><span class=\"n\">compile</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^docs-\\d</span><span class=\"si\">{4}</span><span class=\"s2\">\\.\\d</span><span class=\"si\">{2}</span><span class=\"s2\">\\.\\d</span><span class=\"si\">{2}</span><span class=\"s2\">-[0-9a-f]+$&quot;</span><span class=\"p\">),</span>\n</span><span id=\"__span-5-11\"><a id=\"__codelineno-5-11\" name=\"__codelineno-5-11\" href=\"#__codelineno-5-11\"></a> <span class=\"n\">compare_scope</span><span class=\"o\">=</span><span class=\"s2\">&quot;references&quot;</span><span class=\"p\">,</span> <span class=\"c1\"># docs compares references/ only</span>\n</span><span id=\"__span-5-12\"><a id=\"__codelineno-5-12\" name=\"__codelineno-5-12\" href=\"#__codelineno-5-12\"></a><span class=\"p\">)</span>\n</span><span id=\"__span-5-13\"><a id=\"__codelineno-5-13\" name=\"__codelineno-5-13\" href=\"#__codelineno-5-13\"></a>\n</span><span id=\"__span-5-14\"><a id=\"__codelineno-5-14\" name=\"__codelineno-5-14\" href=\"#__codelineno-5-14\"></a><span class=\"n\">sv</span> <span class=\"o\">=</span> <span class=\"n\">versions</span><span class=\"o\">.</span><span class=\"n\">SkillVersions</span><span class=\"p\">(</span><span class=\"n\">spec</span><span class=\"p\">)</span>\n</span><span id=\"__span-5-15\"><a id=\"__codelineno-5-15\" name=\"__codelineno-5-15\" href=\"#__codelineno-5-15\"></a><span class=\"n\">sv</span><span class=\"o\">.</span><span class=\"n\">list</span><span class=\"p\">()</span> <span class=\"c1\"># -&gt; [{tag, date, kind, commit, prerelease}, …]</span>\n</span><span id=\"__span-5-16\"><a id=\"__codelineno-5-16\" name=\"__codelineno-5-16\" href=\"#__codelineno-5-16\"></a><span class=\"n\">sv</span><span class=\"o\">.</span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"n\">installed_path</span><span class=\"p\">,</span> <span class=\"s2\">&quot;latest&quot;</span><span class=\"p\">)</span>\n</span><span id=\"__span-5-17\"><a id=\"__codelineno-5-17\" name=\"__codelineno-5-17\" href=\"#__codelineno-5-17\"></a><span class=\"n\">sv</span><span class=\"o\">.</span><span class=\"n\">upgrade</span><span class=\"p\">(</span><span class=\"n\">installed_path</span><span class=\"p\">,</span> <span class=\"s2\">&quot;latest&quot;</span><span class=\"p\">,</span> <span class=\"n\">dry_run</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</span></code></pre></div>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">What this de-duplicates</p>\n<p>The ~575-line <code>skill_versions.py</code> is vendored verbatim into five or more\nskills, differing only in those <code>SkillSpec</code> fields and the <code>compare_scope</code>\ntoggle. Consuming this library, the vendored script collapses to a thin\nshim that fills in a <code>SkillSpec</code> and delegates to <code>SkillVersions</code> (see\n<a href=\"../../#future-adoption\">future adoption</a>).</p>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n </article>\n </div>\n \n \n <script>var tabs=__md_get(\"__tabs\");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(\".tabbed-set\")){var labels=set.querySelector(\".tabbed-labels\");for(var tab of tabs)for(var label of labels.getElementsByTagName(\"label\"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>\n\n<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith(\"__tabbed_\"))</script>\n </div>\n \n <button type=\"button\" class=\"md-top md-icon\" data-md-component=\"top\" hidden>\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-circle-arrow-up\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m16 12-4-4-4 4M12 16V8\"/></svg>\n Back to top\n</button>\n \n </main>\n \n <footer class=\"md-footer\">\n \n \n \n <nav class=\"md-footer__inner md-grid\" aria-label=\"Footer\" >\n \n \n <a href=\"../publishing/\" class=\"md-footer__link md-footer__link--prev\" aria-label=\"Previous: Publishing a skill\">\n <div class=\"md-footer__button md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-arrow-left\" viewBox=\"0 0 24 24\"><path d=\"m12 19-7-7 7-7M19 12H5\"/></svg>\n </div>\n <div class=\"md-footer__title\">\n <span class=\"md-footer__direction\">\n Previous\n </span>\n <div class=\"md-ellipsis\">\n Publishing a skill\n </div>\n </div>\n </a>\n \n \n \n <a href=\"../installation/\" class=\"md-footer__link md-footer__link--next\" aria-label=\"Next: Installing a published skill\">\n <div class=\"md-footer__title\">\n <span class=\"md-footer__direction\">\n Next\n </span>\n <div class=\"md-ellipsis\">\n Installing a published skill\n </div>\n </div>\n <div class=\"md-footer__button md-icon\">\n \n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"lucide lucide-arrow-right\" viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"/></svg>\n </div>\n </a>\n \n </nav>\n \n \n <div class=\"md-footer-meta md-typeset\">\n <div class=\"md-footer-meta__inner md-grid\">\n <div class=\"md-copyright\">\n \n <div class=\"md-copyright__highlight\">\n Copyright &copy; Soliplex\n\n </div>\n \n \n Made with\n <a href=\"https://zensical.org/\" target=\"_blank\" rel=\"noopener\">\n Zensical\n </a>\n \n</div>\n \n </div>\n </div>\n</footer>\n \n </div>\n <div class=\"md-dialog\" data-md-component=\"dialog\">\n <div class=\"md-dialog__inner md-typeset\"></div>\n </div>\n \n \n \n \n \n <script id=\"__config\" type=\"application/json\">{\"annotate\":null,\"base\":\"../..\",\"features\":[\"announce.dismiss\",\"content.code.annotate\",\"content.code.copy\",\"content.code.select\",\"content.tabs.link\",\"navigation.footer\",\"navigation.indexes\",\"navigation.instant\",\"navigation.instant.prefetch\",\"navigation.path\",\"navigation.sections\",\"navigation.top\",\"navigation.tracking\",\"search.highlight\"],\"search\":\"../../assets/javascripts/workers/search.e2d2d235.min.js\",\"tags\":null,\"translations\":{\"clipboard.copied\":\"Copied to clipboard\",\"clipboard.copy\":\"Copy to clipboard\",\"search.result.more.one\":\"1 more on this page\",\"search.result.more.other\":\"# more on this page\",\"search.result.none\":\"No matching documents\",\"search.result.one\":\"1 matching document\",\"search.result.other\":\"# matching documents\",\"search.result.placeholder\":\"Type to start searching\",\"search.result.term.missing\":\"Missing\",\"select.version\":\"Select version\"},\"version\":null}</script>\n \n \n <script src=\"../../assets/javascripts/bundle.6e5f0216.min.js\"></script>\n \n \n </body>\n</html>",
3
+ "hash": 5289686980595230440
4
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "data": {
3
+ "meta": {},
4
+ "content": "<h1 id=\"installing-a-published-skill\">Installing a published skill<a class=\"headerlink\" href=\"#installing-a-published-skill\" title=\"Permanent link\">&para;</a></h1>\n<p>Where <a href=\"../versions-cli/\">managing an installed skill</a> upgrades a copy that is\n<em>already</em> on disk, this mechanism covers the <strong>first-time install</strong>: resolving\na published skill to an asset, downloading and verifying it, and extracting its\nskill root. It generalizes the <code>PublishedSkill</code> dataclass and <code>download_skill</code>\nhelper found in the <code>soliplex-concierge</code> installer.</p>\n<h2 id=\"resolving-and-downloading\">Resolving and downloading<a class=\"headerlink\" href=\"#resolving-and-downloading\" title=\"Permanent link\">&para;</a></h2>\n<p>A skill is identified by a small spec (owner, repo, asset tarball, pointer\ntag). To install it:</p>\n<ol>\n<li><strong>Resolve the target.</strong></li>\n<li>No explicit version → read the skill's <code>…-latest</code>\n <a href=\"../../overview/release-model/#the-manifest\">pointer manifest</a> and use its\n <code>asset_url</code> (and its recorded <code>sha256</code>).</li>\n<li>An explicit tag → build the asset URL by name from the tag.</li>\n<li><strong>Download</strong> the tarball.</li>\n<li><strong>Verify</strong> its <code>sha256</code> against the manifest when one is known.</li>\n<li><strong>Extract</strong> and return the skill root — the directory containing <code>SKILL.md</code>.</li>\n</ol>\n<h2 id=\"api\">API<a class=\"headerlink\" href=\"#api\" title=\"Permanent link\">&para;</a></h2>\n<p>The <a href=\"../../reference/api/\"><code>install</code> module</a>:</p>\n<div class=\"language-python highlight\"><pre><span></span><code><span id=\"__span-0-1\"><a id=\"__codelineno-0-1\" name=\"__codelineno-0-1\" href=\"#__codelineno-0-1\"></a><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">soliplex_skills</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">install</span>\n</span><span id=\"__span-0-2\"><a id=\"__codelineno-0-2\" name=\"__codelineno-0-2\" href=\"#__codelineno-0-2\"></a>\n</span><span id=\"__span-0-3\"><a id=\"__codelineno-0-3\" name=\"__codelineno-0-3\" href=\"#__codelineno-0-3\"></a><span class=\"n\">docs</span> <span class=\"o\">=</span> <span class=\"n\">install</span><span class=\"o\">.</span><span class=\"n\">PublishedSkill</span><span class=\"p\">(</span>\n</span><span id=\"__span-0-4\"><a id=\"__codelineno-0-4\" name=\"__codelineno-0-4\" href=\"#__codelineno-0-4\"></a> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex-docs&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-0-5\"><a id=\"__codelineno-0-5\" name=\"__codelineno-0-5\" href=\"#__codelineno-0-5\"></a> <span class=\"n\">owner</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-0-6\"><a id=\"__codelineno-0-6\" name=\"__codelineno-0-6\" href=\"#__codelineno-0-6\"></a> <span class=\"n\">repo</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-0-7\"><a id=\"__codelineno-0-7\" name=\"__codelineno-0-7\" href=\"#__codelineno-0-7\"></a> <span class=\"n\">asset_tarball</span><span class=\"o\">=</span><span class=\"s2\">&quot;soliplex-docs-skill.tar.gz&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-0-8\"><a id=\"__codelineno-0-8\" name=\"__codelineno-0-8\" href=\"#__codelineno-0-8\"></a> <span class=\"n\">pointer_tag</span><span class=\"o\">=</span><span class=\"s2\">&quot;docs-latest&quot;</span><span class=\"p\">,</span>\n</span><span id=\"__span-0-9\"><a id=\"__codelineno-0-9\" name=\"__codelineno-0-9\" href=\"#__codelineno-0-9\"></a><span class=\"p\">)</span>\n</span><span id=\"__span-0-10\"><a id=\"__codelineno-0-10\" name=\"__codelineno-0-10\" href=\"#__codelineno-0-10\"></a>\n</span><span id=\"__span-0-11\"><a id=\"__codelineno-0-11\" name=\"__codelineno-0-11\" href=\"#__codelineno-0-11\"></a><span class=\"c1\"># install.download_skill(docs, version=None, dest=…) -&gt; Path to the skill root</span>\n</span></code></pre></div>\n<ul>\n<li><strong><code>PublishedSkill</code></strong> — the spec, with a <code>download_base</code> property for the\n repo's release-download URLs.</li>\n<li><strong><code>download_skill(spec, version, dest)</code></strong> — resolve → download → verify →\n extract; returns the extracted skill root.</li>\n</ul>\n<div class=\"admonition note\">\n<p class=\"admonition-title\">Out of scope (for now)</p>\n<p>The <code>soliplex-concierge</code> installer does more than fetch a skill — it\n<em>wires</em> it into a target Soliplex stack by surgically editing\n<code>pyproject.toml</code>, <code>installation.yaml</code>, and room configs. That\nstack-editing logic is <strong>intentionally left out</strong> of this initial library;\nit belongs in a later, installer-specific module built on top of\n<code>download_skill</code>.</p>\n</div>",
5
+ "search": [
6
+ {
7
+ "location": null,
8
+ "level": 1,
9
+ "title": "Installing a published skill",
10
+ "text": "<p>Where managing an installed skill upgrades a copy that is already on disk, this mechanism covers the first-time install: resolving a published skill to an asset, downloading and verifying it, and extracting its skill root. It generalizes the <code>PublishedSkill</code> dataclass and <code>download_skill</code> helper found in the <code>soliplex-concierge</code> installer.</p>",
11
+ "path": [],
12
+ "tags": []
13
+ },
14
+ {
15
+ "location": "resolving-and-downloading",
16
+ "level": 2,
17
+ "title": "Resolving and downloading",
18
+ "text": "<p>A skill is identified by a small spec (owner, repo, asset tarball, pointer tag). To install it:</p> <ol> <li>Resolve the target.</li> <li>No explicit version → read the skill's <code>…-latest</code> pointer manifest and use its <code>asset_url</code> (and its recorded <code>sha256</code>).</li> <li>An explicit tag → build the asset URL by name from the tag.</li> <li>Download the tarball.</li> <li>Verify its <code>sha256</code> against the manifest when one is known.</li> <li>Extract and return the skill root — the directory containing <code>SKILL.md</code>.</li> </ol>",
19
+ "path": [],
20
+ "tags": []
21
+ },
22
+ {
23
+ "location": "api",
24
+ "level": 2,
25
+ "title": "API",
26
+ "text": "<p>The <code>install</code> module:</p> <pre><code>from soliplex_skills import install\n\ndocs = install.PublishedSkill(\n name=\"soliplex-docs\",\n owner=\"soliplex\",\n repo=\"soliplex\",\n asset_tarball=\"soliplex-docs-skill.tar.gz\",\n pointer_tag=\"docs-latest\",\n)\n\n# install.download_skill(docs, version=None, dest=…) -&gt; Path to the skill root\n</code></pre> <ul> <li><code>PublishedSkill</code> — the spec, with a <code>download_base</code> property for the repo's release-download URLs.</li> <li><code>download_skill(spec, version, dest)</code> — resolve → download → verify → extract; returns the extracted skill root.</li> </ul> <p>Out of scope (for now)</p> <p>The <code>soliplex-concierge</code> installer does more than fetch a skill — it wires it into a target Soliplex stack by surgically editing <code>pyproject.toml</code>, <code>installation.yaml</code>, and room configs. That stack-editing logic is intentionally left out of this initial library; it belongs in a later, installer-specific module built on top of <code>download_skill</code>.</p>",
27
+ "path": [],
28
+ "tags": []
29
+ }
30
+ ],
31
+ "title": "Installing a published skill",
32
+ "toc": [
33
+ {
34
+ "title": "Installing a published skill",
35
+ "content": "Installing a published skill",
36
+ "id": "installing-a-published-skill",
37
+ "url": "#installing-a-published-skill",
38
+ "children": [
39
+ {
40
+ "title": "Resolving and downloading",
41
+ "content": "Resolving and downloading",
42
+ "id": "resolving-and-downloading",
43
+ "url": "#resolving-and-downloading",
44
+ "children": [],
45
+ "level": 2
46
+ },
47
+ {
48
+ "title": "API",
49
+ "content": "API",
50
+ "id": "api",
51
+ "url": "#api",
52
+ "children": [],
53
+ "level": 2
54
+ }
55
+ ],
56
+ "level": 1
57
+ }
58
+ ]
59
+ },
60
+ "hash": 7342637010695813816
61
+ }