skillstore-cli 1.0.0

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 (231) hide show
  1. package/README.md +95 -0
  2. package/data/bundles/devflow-complete.json +19 -0
  3. package/data/free-skills/devflow-agile/manifest.json +19 -0
  4. package/data/free-skills/devflow-agile/plugin/commands/agile/retro.md +23 -0
  5. package/data/free-skills/devflow-agile/plugin/commands/agile/review.md +21 -0
  6. package/data/free-skills/devflow-agile/plugin/commands/agile/sprint.md +30 -0
  7. package/data/free-skills/devflow-agile/plugin/commands/agile/standup.md +20 -0
  8. package/data/free-skills/devflow-agile/plugin/commands/agile.md +35 -0
  9. package/data/free-skills/devflow-agile/plugin/commands/devflow.md +42 -0
  10. package/data/free-skills/devflow-agile/plugin/skills/developer/SKILL.md +93 -0
  11. package/data/free-skills/devflow-agile/plugin/skills/developer/assets/sample-output.md +182 -0
  12. package/data/free-skills/devflow-agile/plugin/skills/developer/references/clean-architecture.md +361 -0
  13. package/data/free-skills/devflow-agile/plugin/skills/developer/references/clean-code-guide.md +207 -0
  14. package/data/free-skills/devflow-agile/plugin/skills/developer/references/debugging-methodology.md +191 -0
  15. package/data/free-skills/devflow-agile/template/agents/agile-coach.md +76 -0
  16. package/data/free-skills/devflow-agile/template/workflows/agile-sprint-workflow.md +81 -0
  17. package/data/free-skills/devflow-bootstrap/manifest.json +8 -0
  18. package/data/free-skills/devflow-bootstrap/plugin/commands/bootstrap/auto.md +31 -0
  19. package/data/free-skills/devflow-bootstrap/plugin/commands/bootstrap.md +38 -0
  20. package/data/free-skills/devflow-bootstrap/plugin/commands/devflow.md +20 -0
  21. package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/SKILL.md +56 -0
  22. package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/assets/sample-output.md +216 -0
  23. package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/references/architecture-decisions.md +254 -0
  24. package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/references/stack-templates.md +400 -0
  25. package/data/free-skills/devflow-bootstrap/template/agents/bootstrap-specialist.md +56 -0
  26. package/data/free-skills/devflow-bootstrap/template/workflows/bootstrap-workflow.md +70 -0
  27. package/data/free-skills/devflow-docs/manifest.json +8 -0
  28. package/data/free-skills/devflow-docs/plugin/commands/devflow.md +20 -0
  29. package/data/free-skills/devflow-docs/plugin/commands/docs/generate.md +17 -0
  30. package/data/free-skills/devflow-docs/plugin/commands/docs/parse.md +19 -0
  31. package/data/free-skills/devflow-docs/plugin/commands/docs.md +26 -0
  32. package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/SKILL.md +59 -0
  33. package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/assets/sample-output.md +114 -0
  34. package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/references/extraction-techniques.md +115 -0
  35. package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/references/ocr-strategies.md +167 -0
  36. package/data/free-skills/devflow-docs/template/agents/docs-specialist.md +35 -0
  37. package/data/free-skills/devflow-docs/template/workflows/docs-workflow.md +70 -0
  38. package/data/free-skills/devflow-postproject/manifest.json +13 -0
  39. package/data/free-skills/devflow-postproject/plugin/commands/devflow.md +34 -0
  40. package/data/free-skills/devflow-postproject/plugin/commands/postproject/handover.md +21 -0
  41. package/data/free-skills/devflow-postproject/plugin/commands/postproject/retro.md +21 -0
  42. package/data/free-skills/devflow-postproject/plugin/commands/postproject/support.md +21 -0
  43. package/data/free-skills/devflow-postproject/plugin/commands/postproject.md +32 -0
  44. package/data/free-skills/devflow-postproject/plugin/skills/retrospective/SKILL.md +70 -0
  45. package/data/free-skills/devflow-postproject/plugin/skills/retrospective/assets/sample-output.md +79 -0
  46. package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/facilitation-techniques.md +178 -0
  47. package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/lessons-learned-template.md +118 -0
  48. package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/retro-techniques.md +100 -0
  49. package/data/free-skills/devflow-postproject/template/agents/transition-manager.md +71 -0
  50. package/data/free-skills/devflow-postproject/template/workflows/transition-workflow.md +72 -0
  51. package/data/free-skills/devflow-presale/manifest.json +15 -0
  52. package/data/free-skills/devflow-presale/plugin/commands/devflow.md +47 -0
  53. package/data/free-skills/devflow-presale/plugin/commands/presale/analyze.md +30 -0
  54. package/data/free-skills/devflow-presale/plugin/commands/presale/estimate.md +30 -0
  55. package/data/free-skills/devflow-presale/plugin/commands/presale/price.md +30 -0
  56. package/data/free-skills/devflow-presale/plugin/commands/presale/propose.md +30 -0
  57. package/data/free-skills/devflow-presale/plugin/commands/presale.md +42 -0
  58. package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/SKILL.md +63 -0
  59. package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/assets/sample-output.md +129 -0
  60. package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/references/extraction-framework.md +140 -0
  61. package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/references/output-template.md +132 -0
  62. package/data/free-skills/devflow-presale/template/agents/presale-lead.md +83 -0
  63. package/data/free-skills/devflow-presale/template/agents/proposal-reviewer.md +63 -0
  64. package/data/free-skills/devflow-presale/template/workflows/presale-workflow.md +70 -0
  65. package/data/registry/categories.json +7 -0
  66. package/data/registry/packages.json +184 -0
  67. package/data/shared/framework/agents/brainstormer.md +74 -0
  68. package/data/shared/framework/agents/code-reviewer.md +87 -0
  69. package/data/shared/framework/agents/debugger.md +84 -0
  70. package/data/shared/framework/agents/docs-manager.md +55 -0
  71. package/data/shared/framework/agents/git-manager.md +59 -0
  72. package/data/shared/framework/agents/planner.md +68 -0
  73. package/data/shared/framework/agents/researcher.md +66 -0
  74. package/data/shared/framework/agents/tester.md +65 -0
  75. package/data/shared/framework/commands/cook/auto.md +27 -0
  76. package/data/shared/framework/commands/cook.md +45 -0
  77. package/data/shared/framework/commands/fix/ci.md +21 -0
  78. package/data/shared/framework/commands/fix/test.md +26 -0
  79. package/data/shared/framework/commands/fix/types.md +29 -0
  80. package/data/shared/framework/commands/fix.md +26 -0
  81. package/data/shared/framework/commands/git/cm.md +37 -0
  82. package/data/shared/framework/commands/git/pr.md +40 -0
  83. package/data/shared/framework/config/CLAUDE.md.template +26 -0
  84. package/data/shared/framework/config/settings.json +41 -0
  85. package/data/shared/framework/config/skillstore.config.json +29 -0
  86. package/data/shared/framework/hooks/discord-notify.sh +85 -0
  87. package/data/shared/framework/hooks/docs-sync.sh +53 -0
  88. package/data/shared/framework/hooks/modularization-hook.js +103 -0
  89. package/data/shared/framework/hooks/notification.js +94 -0
  90. package/data/shared/framework/hooks/quality-gate.js +109 -0
  91. package/data/shared/framework/hooks/scout-block.js +77 -0
  92. package/data/shared/framework/hooks/telegram-notify.sh +77 -0
  93. package/data/shared/framework/protocols/error-recovery.md +80 -0
  94. package/data/shared/framework/protocols/orchestration-protocol.md +112 -0
  95. package/data/shared/framework/quality/review-protocol.md +76 -0
  96. package/data/shared/framework/quality/verification-protocol.md +66 -0
  97. package/data/shared/framework/rules/development-rules.md +75 -0
  98. package/data/shared/framework/skills/backend-development/SKILL.md +77 -0
  99. package/data/shared/framework/skills/backend-development/assets/sample-output.md +175 -0
  100. package/data/shared/framework/skills/backend-development/references/advanced-patterns.md +180 -0
  101. package/data/shared/framework/skills/backend-development/references/api-design-guide.md +160 -0
  102. package/data/shared/framework/skills/backend-development/references/architecture-patterns.md +183 -0
  103. package/data/shared/framework/skills/backend-development/references/observability-resilience.md +155 -0
  104. package/data/shared/framework/skills/backend-development/references/troubleshooting.md +199 -0
  105. package/data/shared/framework/skills/codebase-analysis/SKILL.md +72 -0
  106. package/data/shared/framework/skills/codebase-analysis/assets/sample-output.md +263 -0
  107. package/data/shared/framework/skills/codebase-analysis/references/analysis-techniques.md +241 -0
  108. package/data/shared/framework/skills/codebase-analysis/references/dependency-mapping.md +280 -0
  109. package/data/shared/framework/skills/codebase-analysis/references/tech-debt-assessment.md +208 -0
  110. package/data/shared/framework/skills/databases/SKILL.md +72 -0
  111. package/data/shared/framework/skills/databases/assets/sample-output.md +212 -0
  112. package/data/shared/framework/skills/databases/references/advanced-data-patterns.md +259 -0
  113. package/data/shared/framework/skills/databases/references/query-optimization.md +214 -0
  114. package/data/shared/framework/skills/databases/references/schema-design.md +159 -0
  115. package/data/shared/framework/skills/databases/references/troubleshooting.md +214 -0
  116. package/data/shared/framework/skills/debugging-investigation/SKILL.md +84 -0
  117. package/data/shared/framework/skills/debugging-investigation/assets/sample-output.md +314 -0
  118. package/data/shared/framework/skills/debugging-investigation/references/systematic-debugging.md +197 -0
  119. package/data/shared/framework/skills/debugging-investigation/references/tool-specific-guides.md +202 -0
  120. package/data/shared/framework/skills/debugging-investigation/references/troubleshooting-patterns.md +196 -0
  121. package/data/shared/framework/skills/frontend-development/SKILL.md +67 -0
  122. package/data/shared/framework/skills/frontend-development/assets/sample-output.md +110 -0
  123. package/data/shared/framework/skills/frontend-development/references/component-patterns.md +112 -0
  124. package/data/shared/framework/skills/frontend-development/references/performance-guide.md +169 -0
  125. package/data/shared/framework/skills/frontend-development/references/routing-forms-realtime.md +374 -0
  126. package/data/shared/framework/skills/frontend-development/references/ssr-rsc-patterns.md +284 -0
  127. package/data/shared/framework/skills/frontend-development/references/troubleshooting.md +154 -0
  128. package/data/shared/framework/skills/mobile-development/SKILL.md +67 -0
  129. package/data/shared/framework/skills/mobile-development/assets/sample-output.md +382 -0
  130. package/data/shared/framework/skills/mobile-development/references/mobile-patterns.md +681 -0
  131. package/data/shared/framework/skills/mobile-development/references/mobile-performance.md +524 -0
  132. package/data/shared/framework/skills/mobile-development/references/troubleshooting.md +158 -0
  133. package/data/shared/framework/skills/security-audit/SKILL.md +83 -0
  134. package/data/shared/framework/skills/security-audit/assets/sample-output.md +451 -0
  135. package/data/shared/framework/skills/security-audit/references/owasp-checklist.md +580 -0
  136. package/data/shared/framework/skills/security-audit/references/secure-coding-patterns.md +433 -0
  137. package/data/shared/framework/skills/security-audit/references/vulnerability-remediation.md +331 -0
  138. package/data/shared/framework/skills/ui-generation/SKILL.md +70 -0
  139. package/data/shared/framework/skills/ui-generation/assets/sample-output.md +139 -0
  140. package/data/shared/framework/skills/ui-generation/references/accessibility-responsive.md +127 -0
  141. package/data/shared/framework/skills/ui-generation/references/compound-components.md +252 -0
  142. package/data/shared/framework/skills/ui-generation/references/generation-patterns.md +110 -0
  143. package/data/shared/framework/skills/ui-generation/references/storybook-design-system.md +278 -0
  144. package/data/shared/framework/skills/ui-generation/references/troubleshooting.md +198 -0
  145. package/data/shared/framework/workflows/documentation-management.md +58 -0
  146. package/data/shared/framework/workflows/primary-workflow.md +88 -0
  147. package/dist/commands/activate.d.ts +3 -0
  148. package/dist/commands/activate.d.ts.map +1 -0
  149. package/dist/commands/activate.js +34 -0
  150. package/dist/commands/activate.js.map +1 -0
  151. package/dist/commands/bundle.d.ts +3 -0
  152. package/dist/commands/bundle.d.ts.map +1 -0
  153. package/dist/commands/bundle.js +64 -0
  154. package/dist/commands/bundle.js.map +1 -0
  155. package/dist/commands/install.d.ts +3 -0
  156. package/dist/commands/install.d.ts.map +1 -0
  157. package/dist/commands/install.js +99 -0
  158. package/dist/commands/install.js.map +1 -0
  159. package/dist/commands/list.d.ts +3 -0
  160. package/dist/commands/list.d.ts.map +1 -0
  161. package/dist/commands/list.js +37 -0
  162. package/dist/commands/list.js.map +1 -0
  163. package/dist/commands/search.d.ts +3 -0
  164. package/dist/commands/search.d.ts.map +1 -0
  165. package/dist/commands/search.js +30 -0
  166. package/dist/commands/search.js.map +1 -0
  167. package/dist/commands/status.d.ts +3 -0
  168. package/dist/commands/status.d.ts.map +1 -0
  169. package/dist/commands/status.js +35 -0
  170. package/dist/commands/status.js.map +1 -0
  171. package/dist/commands/update.d.ts +3 -0
  172. package/dist/commands/update.d.ts.map +1 -0
  173. package/dist/commands/update.js +68 -0
  174. package/dist/commands/update.js.map +1 -0
  175. package/dist/download/cache.d.ts +3 -0
  176. package/dist/download/cache.d.ts.map +1 -0
  177. package/dist/download/cache.js +18 -0
  178. package/dist/download/cache.js.map +1 -0
  179. package/dist/download/client.d.ts +2 -0
  180. package/dist/download/client.d.ts.map +1 -0
  181. package/dist/download/client.js +58 -0
  182. package/dist/download/client.js.map +1 -0
  183. package/dist/index.d.ts +3 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +23 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/installer/file-copier.d.ts +6 -0
  188. package/dist/installer/file-copier.d.ts.map +1 -0
  189. package/dist/installer/file-copier.js +32 -0
  190. package/dist/installer/file-copier.js.map +1 -0
  191. package/dist/installer/plugin-installer.d.ts +12 -0
  192. package/dist/installer/plugin-installer.d.ts.map +1 -0
  193. package/dist/installer/plugin-installer.js +33 -0
  194. package/dist/installer/plugin-installer.js.map +1 -0
  195. package/dist/installer/template-installer.d.ts +12 -0
  196. package/dist/installer/template-installer.d.ts.map +1 -0
  197. package/dist/installer/template-installer.js +45 -0
  198. package/dist/installer/template-installer.js.map +1 -0
  199. package/dist/license/crypto.d.ts +16 -0
  200. package/dist/license/crypto.d.ts.map +1 -0
  201. package/dist/license/crypto.js +50 -0
  202. package/dist/license/crypto.js.map +1 -0
  203. package/dist/license/license-store.d.ts +19 -0
  204. package/dist/license/license-store.d.ts.map +1 -0
  205. package/dist/license/license-store.js +99 -0
  206. package/dist/license/license-store.js.map +1 -0
  207. package/dist/license/validator.d.ts +32 -0
  208. package/dist/license/validator.d.ts.map +1 -0
  209. package/dist/license/validator.js +81 -0
  210. package/dist/license/validator.js.map +1 -0
  211. package/dist/registry/loader.d.ts +30 -0
  212. package/dist/registry/loader.d.ts.map +1 -0
  213. package/dist/registry/loader.js +22 -0
  214. package/dist/registry/loader.js.map +1 -0
  215. package/dist/registry/search-engine.d.ts +9 -0
  216. package/dist/registry/search-engine.d.ts.map +1 -0
  217. package/dist/registry/search-engine.js +30 -0
  218. package/dist/registry/search-engine.js.map +1 -0
  219. package/dist/utils/config.d.ts +14 -0
  220. package/dist/utils/config.d.ts.map +1 -0
  221. package/dist/utils/config.js +28 -0
  222. package/dist/utils/config.js.map +1 -0
  223. package/dist/utils/logger.d.ts +9 -0
  224. package/dist/utils/logger.d.ts.map +1 -0
  225. package/dist/utils/logger.js +22 -0
  226. package/dist/utils/logger.js.map +1 -0
  227. package/dist/utils/paths.d.ts +20 -0
  228. package/dist/utils/paths.d.ts.map +1 -0
  229. package/dist/utils/paths.js +79 -0
  230. package/dist/utils/paths.js.map +1 -0
  231. package/package.json +54 -0
@@ -0,0 +1,30 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { loadRegistry } from "../registry/loader.js";
4
+ import { searchPackages } from "../registry/search-engine.js";
5
+ export const searchCommand = new Command("search")
6
+ .description("Search for skill packages")
7
+ .argument("<query>", "Search query")
8
+ .action(async (query) => {
9
+ const { packages } = await loadRegistry();
10
+ const results = searchPackages(packages, query);
11
+ if (results.length === 0) {
12
+ console.log(chalk.yellow(`No results for "${query}".`));
13
+ return;
14
+ }
15
+ console.log(chalk.bold(`\n🔍 Search results for "${query}"\n`));
16
+ for (const result of results) {
17
+ const pkg = result.package;
18
+ console.log(chalk.bold.cyan(pkg.displayName) +
19
+ chalk.dim(` (${pkg.name})`));
20
+ console.log(` ${pkg.description}`);
21
+ if (result.matchedSkills.length > 0) {
22
+ console.log(chalk.dim(" Matched skills:"));
23
+ for (const skill of result.matchedSkills) {
24
+ console.log(` - ${skill.name}: ${skill.description}`);
25
+ }
26
+ }
27
+ console.log();
28
+ }
29
+ });
30
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;KACnC,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,KAAK,KAAK,CAAC,CAAC,CAAC;IAEhE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAC9B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA2CtB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { loadConfig } from "../utils/config.js";
4
+ import { getActiveTier, loadLicenseStore } from "../license/license-store.js";
5
+ export const statusCommand = new Command("status")
6
+ .description("Show license and installed packages status")
7
+ .action(async () => {
8
+ const [config, tier, store] = await Promise.all([
9
+ loadConfig(),
10
+ getActiveTier(),
11
+ loadLicenseStore(),
12
+ ]);
13
+ console.log(chalk.bold("\n📊 SkillStore Status\n"));
14
+ // License info
15
+ console.log(chalk.bold("License"));
16
+ console.log(` Tier: ${chalk.cyan.bold(tier)}`);
17
+ console.log(` Active licenses: ${store.licenses.length}`);
18
+ for (const lic of store.licenses) {
19
+ console.log(chalk.dim(` - ${lic.tier} (activated: ${new Date(lic.activatedAt).toLocaleDateString()})`));
20
+ }
21
+ // Installed packages
22
+ console.log(chalk.bold("\nInstalled Packages"));
23
+ if (config.installedPackages.length === 0) {
24
+ console.log(chalk.dim(" No packages installed."));
25
+ }
26
+ else {
27
+ for (const pkg of config.installedPackages) {
28
+ console.log(` ${chalk.cyan(pkg.name)} v${pkg.version} [${pkg.mode}]`);
29
+ console.log(chalk.dim(` Dir: ${pkg.projectDir}`));
30
+ console.log(chalk.dim(` Installed: ${new Date(pkg.installedAt).toLocaleDateString()}`));
31
+ }
32
+ }
33
+ console.log();
34
+ });
35
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,UAAU,EAAE;QACZ,aAAa,EAAE;QACf,gBAAgB,EAAE;KACnB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,SAAS,GAAG,CAAC,IAAI,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,GAAG,CACnF,CACF,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG,CAC1D,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,kBAAkB,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,EAAE,CACnE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const updateCommand: Command;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,aAAa,SAyEtB,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { loadConfig } from "../utils/config.js";
5
+ import { getPackage } from "../registry/loader.js";
6
+ import { installPlugin } from "../installer/plugin-installer.js";
7
+ import { installTemplate } from "../installer/template-installer.js";
8
+ import { logger } from "../utils/logger.js";
9
+ import { checkPackageAccess } from "../license/validator.js";
10
+ import { isNpmMode } from "../utils/paths.js";
11
+ import { downloadPackage } from "../download/client.js";
12
+ import { loadLicenseStore } from "../license/license-store.js";
13
+ export const updateCommand = new Command("update")
14
+ .description("Update all installed packages to latest versions")
15
+ .action(async () => {
16
+ const config = await loadConfig();
17
+ if (config.installedPackages.length === 0) {
18
+ logger.info("No packages installed. Nothing to update.");
19
+ return;
20
+ }
21
+ console.log(chalk.bold("\nUpdating packages...\n"));
22
+ for (const installed of config.installedPackages) {
23
+ const pkg = await getPackage(installed.name);
24
+ if (!pkg) {
25
+ logger.warn(`Package ${installed.name} not found in registry, skipping.`);
26
+ continue;
27
+ }
28
+ if (pkg.version === installed.version) {
29
+ logger.dim(`${installed.name} is up to date (v${pkg.version})`);
30
+ continue;
31
+ }
32
+ // License check before updating
33
+ const access = await checkPackageAccess(pkg.name, pkg.skills.map((s) => s.name), pkg.freeSkills || []);
34
+ if (!access.allowed) {
35
+ logger.warn(`Skipping ${installed.name}: license required. Run 'skillstore activate <license-key>' to unlock.`);
36
+ continue;
37
+ }
38
+ // Download from Supabase if in npm mode
39
+ let sourceDir;
40
+ if (isNpmMode()) {
41
+ const store = await loadLicenseStore();
42
+ if (store.licenses.length > 0) {
43
+ const license = store.licenses.find((l) => l.tier === "BUNDLE") ||
44
+ store.licenses[0];
45
+ const spinner = ora(`Downloading ${installed.name}...`).start();
46
+ try {
47
+ const name = installed.name.replace("@skillstore/", "");
48
+ sourceDir = await downloadPackage(name, pkg.version, license.key);
49
+ spinner.succeed(`Downloaded ${installed.name}`);
50
+ }
51
+ catch (err) {
52
+ spinner.fail(`Download failed: ${err.message}`);
53
+ continue;
54
+ }
55
+ }
56
+ }
57
+ logger.info(`Updating ${installed.name} v${installed.version} → v${pkg.version}...`);
58
+ const name = installed.name.replace("@skillstore/", "");
59
+ const result = installed.mode === "plugin"
60
+ ? await installPlugin(name, installed.projectDir, sourceDir)
61
+ : await installTemplate(name, installed.projectDir, sourceDir);
62
+ if (result.success) {
63
+ logger.success(`Updated ${installed.name}`);
64
+ }
65
+ }
66
+ console.log();
67
+ });
68
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getCache(packageName: string, version: string): string | null;
2
+ export declare function setCache(packageName: string, version: string): string;
3
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/download/cache.ts"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5E;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIrE"}
@@ -0,0 +1,18 @@
1
+ import { existsSync, mkdirSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { SKILLSTORE_HOME } from "../utils/paths.js";
4
+ function getCacheDir() {
5
+ return resolve(SKILLSTORE_HOME, "cache");
6
+ }
7
+ export function getCache(packageName, version) {
8
+ const contentDir = resolve(getCacheDir(), packageName, version, "content");
9
+ if (existsSync(contentDir))
10
+ return contentDir;
11
+ return null;
12
+ }
13
+ export function setCache(packageName, version) {
14
+ const dir = resolve(getCacheDir(), packageName, version);
15
+ mkdirSync(dir, { recursive: true });
16
+ return dir;
17
+ }
18
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/download/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,OAAe;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,OAAe;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACzD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function downloadPackage(packageName: string, version: string, licenseKey: string): Promise<string>;
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/download/client.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
@@ -0,0 +1,58 @@
1
+ import { writeFileSync, mkdirSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { extract } from "tar";
4
+ import { getCache, setCache } from "./cache.js";
5
+ const EDGE_FUNCTION_URL = "https://yywbaujeotyoevxthgvy.supabase.co/functions/v1/download-package";
6
+ const MAX_RETRIES = 2;
7
+ export async function downloadPackage(packageName, version, licenseKey) {
8
+ // 1. Check cache
9
+ const cached = getCache(packageName, version);
10
+ if (cached)
11
+ return cached;
12
+ // 2. Request signed URL from Edge Function
13
+ const signedUrl = await requestSignedUrl(packageName, version, licenseKey);
14
+ // 3. Download .tar.gz with retry
15
+ const buffer = await downloadWithRetry(signedUrl);
16
+ // 4. Save + extract to cache dir
17
+ const cacheDir = setCache(packageName, version);
18
+ const tarPath = resolve(cacheDir, "package.tar.gz");
19
+ writeFileSync(tarPath, buffer);
20
+ const contentDir = resolve(cacheDir, "content");
21
+ mkdirSync(contentDir, { recursive: true });
22
+ await extract({ file: tarPath, cwd: contentDir });
23
+ return contentDir;
24
+ }
25
+ async function requestSignedUrl(packageName, version, licenseKey) {
26
+ const res = await fetch(EDGE_FUNCTION_URL, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/json" },
29
+ body: JSON.stringify({ packageName, version, licenseKey }),
30
+ });
31
+ if (!res.ok) {
32
+ const body = await res.json().catch(() => ({}));
33
+ const msg = body.error ||
34
+ `License verification failed (${res.status})`;
35
+ throw new Error(msg);
36
+ }
37
+ const { signedUrl } = (await res.json());
38
+ return signedUrl;
39
+ }
40
+ async function downloadWithRetry(url) {
41
+ let lastError = null;
42
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
43
+ try {
44
+ const res = await fetch(url);
45
+ if (!res.ok)
46
+ throw new Error(`Download failed (${res.status})`);
47
+ return Buffer.from(await res.arrayBuffer());
48
+ }
49
+ catch (err) {
50
+ lastError = err;
51
+ if (attempt < MAX_RETRIES) {
52
+ await new Promise((r) => setTimeout(r, 1000 * (attempt + 1)));
53
+ }
54
+ }
55
+ }
56
+ throw new Error(`Download failed after ${MAX_RETRIES + 1} attempts: ${lastError?.message}`);
57
+ }
58
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/download/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { listCommand } from "./commands/list.js";
4
+ import { searchCommand } from "./commands/search.js";
5
+ import { installCommand } from "./commands/install.js";
6
+ import { activateCommand } from "./commands/activate.js";
7
+ import { statusCommand } from "./commands/status.js";
8
+ import { updateCommand } from "./commands/update.js";
9
+ import { bundleCommand } from "./commands/bundle.js";
10
+ const program = new Command();
11
+ program
12
+ .name("skillstore")
13
+ .description("SkillStore — Install and manage Claude Code skill packages")
14
+ .version("1.0.0");
15
+ program.addCommand(listCommand);
16
+ program.addCommand(searchCommand);
17
+ program.addCommand(installCommand);
18
+ program.addCommand(activateCommand);
19
+ program.addCommand(statusCommand);
20
+ program.addCommand(updateCommand);
21
+ program.addCommand(bundleCommand);
22
+ program.parse();
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface CopyResult {
2
+ copied: string[];
3
+ skipped: string[];
4
+ }
5
+ export declare function copyDirectory(src: string, dest: string, overwrite?: boolean): Promise<CopyResult>;
6
+ //# sourceMappingURL=file-copier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-copier.d.ts","sourceRoot":"","sources":["../../src/installer/file-copier.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,UAAQ,GAChB,OAAO,CAAC,UAAU,CAAC,CA8BrB"}
@@ -0,0 +1,32 @@
1
+ import fse from "fs-extra";
2
+ import { join } from "node:path";
3
+ import { logger } from "../utils/logger.js";
4
+ export async function copyDirectory(src, dest, overwrite = false) {
5
+ const result = { copied: [], skipped: [] };
6
+ if (!(await fse.pathExists(src))) {
7
+ logger.warn(`Source not found: ${src}`);
8
+ return result;
9
+ }
10
+ await fse.ensureDir(dest);
11
+ const entries = await fse.readdir(src, { withFileTypes: true });
12
+ for (const entry of entries) {
13
+ const srcPath = join(src, entry.name);
14
+ const destPath = join(dest, entry.name);
15
+ if (entry.isDirectory()) {
16
+ const subResult = await copyDirectory(srcPath, destPath, overwrite);
17
+ result.copied.push(...subResult.copied);
18
+ result.skipped.push(...subResult.skipped);
19
+ }
20
+ else {
21
+ if (!overwrite && (await fse.pathExists(destPath))) {
22
+ result.skipped.push(destPath);
23
+ }
24
+ else {
25
+ await fse.copy(srcPath, destPath);
26
+ result.copied.push(destPath);
27
+ }
28
+ }
29
+ }
30
+ return result;
31
+ }
32
+ //# sourceMappingURL=file-copier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-copier.js","sourceRoot":"","sources":["../../src/installer/file-copier.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAO5C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,IAAY,EACZ,SAAS,GAAG,KAAK;IAEjB,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEvD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface InstallResult {
2
+ success: boolean;
3
+ copied: string[];
4
+ skipped: string[];
5
+ message: string;
6
+ }
7
+ /**
8
+ * Install as plugin: copies skills/ and commands/ to project's .claude/
9
+ * @param sourceDir - optional override: use this dir instead of getPackagesPath()
10
+ */
11
+ export declare function installPlugin(packageName: string, projectDir: string, sourceDir?: string): Promise<InstallResult>;
12
+ //# sourceMappingURL=plugin-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-installer.d.ts","sourceRoot":"","sources":["../../src/installer/plugin-installer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,33 @@
1
+ import { join } from "node:path";
2
+ import { getPackagesPath, getSkillsDir, getCommandsDir } from "../utils/paths.js";
3
+ import { logger } from "../utils/logger.js";
4
+ import { copyDirectory } from "./file-copier.js";
5
+ /**
6
+ * Install as plugin: copies skills/ and commands/ to project's .claude/
7
+ * @param sourceDir - optional override: use this dir instead of getPackagesPath()
8
+ */
9
+ export async function installPlugin(packageName, projectDir, sourceDir) {
10
+ const packageDir = sourceDir
11
+ ? join(sourceDir, packageName, "plugin")
12
+ : join(getPackagesPath(), packageName, "plugin");
13
+ const skillsSrc = join(packageDir, "skills");
14
+ const commandsSrc = join(packageDir, "commands");
15
+ const skillsDest = getSkillsDir(projectDir);
16
+ const commandsDest = getCommandsDir(projectDir);
17
+ const allCopied = [];
18
+ const allSkipped = [];
19
+ logger.info(`Installing ${packageName} as plugin...`);
20
+ const [skillsResult, commandsResult] = await Promise.all([
21
+ copyDirectory(skillsSrc, skillsDest),
22
+ copyDirectory(commandsSrc, commandsDest),
23
+ ]);
24
+ allCopied.push(...skillsResult.copied, ...commandsResult.copied);
25
+ allSkipped.push(...skillsResult.skipped, ...commandsResult.skipped);
26
+ return {
27
+ success: true,
28
+ copied: allCopied,
29
+ skipped: allSkipped,
30
+ message: `Installed ${allCopied.length} files (${allSkipped.length} skipped)`,
31
+ };
32
+ }
33
+ //# sourceMappingURL=plugin-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-installer.js","sourceRoot":"","sources":["../../src/installer/plugin-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AASlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,UAAkB,EAClB,SAAkB;IAElB,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,cAAc,WAAW,eAAe,CAAC,CAAC;IAEtD,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvD,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC;QACpC,aAAa,CAAC,WAAW,EAAE,YAAY,CAAC;KACzC,CAAC,CAAC;IAEH,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACjE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEpE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,aAAa,SAAS,CAAC,MAAM,WAAW,UAAU,CAAC,MAAM,WAAW;KAC9E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface InstallResult {
2
+ success: boolean;
3
+ copied: string[];
4
+ skipped: string[];
5
+ message: string;
6
+ }
7
+ /**
8
+ * Install as template: copies agents/ + skills/ + commands/ + workflows/ to project's .claude/
9
+ * @param sourceDir - optional override: use this dir instead of getPackagesPath()
10
+ */
11
+ export declare function installTemplate(packageName: string, projectDir: string, sourceDir?: string): Promise<InstallResult>;
12
+ //# sourceMappingURL=template-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-installer.d.ts","sourceRoot":"","sources":["../../src/installer/template-installer.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CA4CxB"}
@@ -0,0 +1,45 @@
1
+ import { join } from "node:path";
2
+ import { getPackagesPath, getSharedFrameworkPath, getSkillsDir, getCommandsDir, getAgentsDir, getWorkflowsDir, getConfigDir, getRulesDir, getHooksDir, getProtocolsDir, getQualityDir, } from "../utils/paths.js";
3
+ import { logger } from "../utils/logger.js";
4
+ import { copyDirectory } from "./file-copier.js";
5
+ /**
6
+ * Install as template: copies agents/ + skills/ + commands/ + workflows/ to project's .claude/
7
+ * @param sourceDir - optional override: use this dir instead of getPackagesPath()
8
+ */
9
+ export async function installTemplate(packageName, projectDir, sourceDir) {
10
+ const packageDir = sourceDir
11
+ ? join(sourceDir, packageName, "template")
12
+ : join(getPackagesPath(), packageName, "template");
13
+ const sharedDir = getSharedFrameworkPath();
14
+ const dirMappings = [
15
+ { src: join(packageDir, "skills"), dest: getSkillsDir(projectDir) },
16
+ { src: join(packageDir, "commands"), dest: getCommandsDir(projectDir) },
17
+ { src: join(packageDir, "agents"), dest: getAgentsDir(projectDir) },
18
+ { src: join(packageDir, "workflows"), dest: getWorkflowsDir(projectDir) },
19
+ // Framework directories (shared)
20
+ { src: join(sharedDir, "config"), dest: getConfigDir(projectDir) },
21
+ { src: join(sharedDir, "rules"), dest: getRulesDir(projectDir) },
22
+ { src: join(sharedDir, "hooks"), dest: getHooksDir(projectDir) },
23
+ { src: join(sharedDir, "protocols"), dest: getProtocolsDir(projectDir) },
24
+ { src: join(sharedDir, "quality"), dest: getQualityDir(projectDir) },
25
+ { src: join(sharedDir, "agents"), dest: getAgentsDir(projectDir) },
26
+ { src: join(sharedDir, "workflows"), dest: getWorkflowsDir(projectDir) },
27
+ { src: join(sharedDir, "skills"), dest: getSkillsDir(projectDir) },
28
+ { src: join(sharedDir, "commands"), dest: getCommandsDir(projectDir) },
29
+ ];
30
+ const allCopied = [];
31
+ const allSkipped = [];
32
+ logger.info(`Installing ${packageName} as template...`);
33
+ const results = await Promise.all(dirMappings.map(({ src, dest }) => copyDirectory(src, dest)));
34
+ for (const result of results) {
35
+ allCopied.push(...result.copied);
36
+ allSkipped.push(...result.skipped);
37
+ }
38
+ return {
39
+ success: true,
40
+ copied: allCopied,
41
+ skipped: allSkipped,
42
+ message: `Installed ${allCopied.length} files (${allSkipped.length} skipped)`,
43
+ };
44
+ }
45
+ //# sourceMappingURL=template-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-installer.js","sourceRoot":"","sources":["../../src/installer/template-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type LicenseTier = "FREE" | "SINGLE" | "BUNDLE";
2
+ export interface LicenseParts {
3
+ tier: LicenseTier;
4
+ packageHash: string;
5
+ timestamp: string;
6
+ signature: string;
7
+ }
8
+ /**
9
+ * License format: SS-{tier}-{packageHash}-{timestamp}-{hmacSignature}
10
+ * Validate offline using HMAC-SHA256
11
+ */
12
+ export declare function parseLicenseKey(key: string): LicenseParts | null;
13
+ export declare function validateLicenseKey(key: string): boolean;
14
+ export declare function generateLicenseKey(tier: LicenseTier, packageHash: string): string;
15
+ export declare function getPackageHash(packageName: string): string;
16
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/license/crypto.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAahE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CASR;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAK1D"}
@@ -0,0 +1,50 @@
1
+ import { createHmac } from "node:crypto";
2
+ const DEFAULT_SECRET = "skillstore-v1-hmac-secret";
3
+ function getHmacSecret() {
4
+ return process.env.SKILLSTORE_HMAC_SECRET || DEFAULT_SECRET;
5
+ }
6
+ /**
7
+ * License format: SS-{tier}-{packageHash}-{timestamp}-{hmacSignature}
8
+ * Validate offline using HMAC-SHA256
9
+ */
10
+ export function parseLicenseKey(key) {
11
+ const parts = key.split("-");
12
+ if (parts.length !== 5 || parts[0] !== "SS")
13
+ return null;
14
+ const tier = parts[1];
15
+ if (!["FREE", "SINGLE", "BUNDLE"].includes(tier))
16
+ return null;
17
+ return {
18
+ tier,
19
+ packageHash: parts[2],
20
+ timestamp: parts[3],
21
+ signature: parts[4],
22
+ };
23
+ }
24
+ export function validateLicenseKey(key) {
25
+ const parts = parseLicenseKey(key);
26
+ if (!parts)
27
+ return false;
28
+ const payload = `SS-${parts.tier}-${parts.packageHash}-${parts.timestamp}`;
29
+ const expectedSig = createHmac("sha256", getHmacSecret())
30
+ .update(payload)
31
+ .digest("hex")
32
+ .substring(0, 16);
33
+ return parts.signature === expectedSig;
34
+ }
35
+ export function generateLicenseKey(tier, packageHash) {
36
+ const timestamp = Date.now().toString(36);
37
+ const payload = `SS-${tier}-${packageHash}-${timestamp}`;
38
+ const signature = createHmac("sha256", getHmacSecret())
39
+ .update(payload)
40
+ .digest("hex")
41
+ .substring(0, 16);
42
+ return `${payload}-${signature}`;
43
+ }
44
+ export function getPackageHash(packageName) {
45
+ return createHmac("sha256", getHmacSecret())
46
+ .update(packageName)
47
+ .digest("hex")
48
+ .substring(0, 8);
49
+ }
50
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/license/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,cAAc,CAAC;AAC9D,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEzD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAgB,CAAC;IACrC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9D,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QACrB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACnB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3E,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;SACtD,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC;SACb,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,WAAmB;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;SACpD,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC;SACb,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpB,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;SACzC,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC;SACb,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type LicenseTier } from "./crypto.js";
2
+ export interface LicenseEntry {
3
+ key: string;
4
+ tier: LicenseTier;
5
+ packageHash: string;
6
+ activatedAt: string;
7
+ }
8
+ export interface LicenseStore {
9
+ licenses: LicenseEntry[];
10
+ }
11
+ export declare function loadLicenseStore(): Promise<LicenseStore>;
12
+ export declare function activateLicense(key: string): Promise<{
13
+ success: boolean;
14
+ message: string;
15
+ tier?: LicenseTier;
16
+ }>;
17
+ export declare function hasLicenseForPackage(packageHash: string): Promise<boolean>;
18
+ export declare function getActiveTier(): Promise<LicenseTier>;
19
+ //# sourceMappingURL=license-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-store.d.ts","sourceRoot":"","sources":["../../src/license/license-store.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAC;AA6BrB,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CAyB9D;AASD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CA+BpE;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAK1D"}