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.
- package/README.md +95 -0
- package/data/bundles/devflow-complete.json +19 -0
- package/data/free-skills/devflow-agile/manifest.json +19 -0
- package/data/free-skills/devflow-agile/plugin/commands/agile/retro.md +23 -0
- package/data/free-skills/devflow-agile/plugin/commands/agile/review.md +21 -0
- package/data/free-skills/devflow-agile/plugin/commands/agile/sprint.md +30 -0
- package/data/free-skills/devflow-agile/plugin/commands/agile/standup.md +20 -0
- package/data/free-skills/devflow-agile/plugin/commands/agile.md +35 -0
- package/data/free-skills/devflow-agile/plugin/commands/devflow.md +42 -0
- package/data/free-skills/devflow-agile/plugin/skills/developer/SKILL.md +93 -0
- package/data/free-skills/devflow-agile/plugin/skills/developer/assets/sample-output.md +182 -0
- package/data/free-skills/devflow-agile/plugin/skills/developer/references/clean-architecture.md +361 -0
- package/data/free-skills/devflow-agile/plugin/skills/developer/references/clean-code-guide.md +207 -0
- package/data/free-skills/devflow-agile/plugin/skills/developer/references/debugging-methodology.md +191 -0
- package/data/free-skills/devflow-agile/template/agents/agile-coach.md +76 -0
- package/data/free-skills/devflow-agile/template/workflows/agile-sprint-workflow.md +81 -0
- package/data/free-skills/devflow-bootstrap/manifest.json +8 -0
- package/data/free-skills/devflow-bootstrap/plugin/commands/bootstrap/auto.md +31 -0
- package/data/free-skills/devflow-bootstrap/plugin/commands/bootstrap.md +38 -0
- package/data/free-skills/devflow-bootstrap/plugin/commands/devflow.md +20 -0
- package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/SKILL.md +56 -0
- package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/assets/sample-output.md +216 -0
- package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/references/architecture-decisions.md +254 -0
- package/data/free-skills/devflow-bootstrap/plugin/skills/project-scaffold/references/stack-templates.md +400 -0
- package/data/free-skills/devflow-bootstrap/template/agents/bootstrap-specialist.md +56 -0
- package/data/free-skills/devflow-bootstrap/template/workflows/bootstrap-workflow.md +70 -0
- package/data/free-skills/devflow-docs/manifest.json +8 -0
- package/data/free-skills/devflow-docs/plugin/commands/devflow.md +20 -0
- package/data/free-skills/devflow-docs/plugin/commands/docs/generate.md +17 -0
- package/data/free-skills/devflow-docs/plugin/commands/docs/parse.md +19 -0
- package/data/free-skills/devflow-docs/plugin/commands/docs.md +26 -0
- package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/SKILL.md +59 -0
- package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/assets/sample-output.md +114 -0
- package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/references/extraction-techniques.md +115 -0
- package/data/free-skills/devflow-docs/plugin/skills/pdf-processor/references/ocr-strategies.md +167 -0
- package/data/free-skills/devflow-docs/template/agents/docs-specialist.md +35 -0
- package/data/free-skills/devflow-docs/template/workflows/docs-workflow.md +70 -0
- package/data/free-skills/devflow-postproject/manifest.json +13 -0
- package/data/free-skills/devflow-postproject/plugin/commands/devflow.md +34 -0
- package/data/free-skills/devflow-postproject/plugin/commands/postproject/handover.md +21 -0
- package/data/free-skills/devflow-postproject/plugin/commands/postproject/retro.md +21 -0
- package/data/free-skills/devflow-postproject/plugin/commands/postproject/support.md +21 -0
- package/data/free-skills/devflow-postproject/plugin/commands/postproject.md +32 -0
- package/data/free-skills/devflow-postproject/plugin/skills/retrospective/SKILL.md +70 -0
- package/data/free-skills/devflow-postproject/plugin/skills/retrospective/assets/sample-output.md +79 -0
- package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/facilitation-techniques.md +178 -0
- package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/lessons-learned-template.md +118 -0
- package/data/free-skills/devflow-postproject/plugin/skills/retrospective/references/retro-techniques.md +100 -0
- package/data/free-skills/devflow-postproject/template/agents/transition-manager.md +71 -0
- package/data/free-skills/devflow-postproject/template/workflows/transition-workflow.md +72 -0
- package/data/free-skills/devflow-presale/manifest.json +15 -0
- package/data/free-skills/devflow-presale/plugin/commands/devflow.md +47 -0
- package/data/free-skills/devflow-presale/plugin/commands/presale/analyze.md +30 -0
- package/data/free-skills/devflow-presale/plugin/commands/presale/estimate.md +30 -0
- package/data/free-skills/devflow-presale/plugin/commands/presale/price.md +30 -0
- package/data/free-skills/devflow-presale/plugin/commands/presale/propose.md +30 -0
- package/data/free-skills/devflow-presale/plugin/commands/presale.md +42 -0
- package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/SKILL.md +63 -0
- package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/assets/sample-output.md +129 -0
- package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/references/extraction-framework.md +140 -0
- package/data/free-skills/devflow-presale/plugin/skills/requirement-analysis/references/output-template.md +132 -0
- package/data/free-skills/devflow-presale/template/agents/presale-lead.md +83 -0
- package/data/free-skills/devflow-presale/template/agents/proposal-reviewer.md +63 -0
- package/data/free-skills/devflow-presale/template/workflows/presale-workflow.md +70 -0
- package/data/registry/categories.json +7 -0
- package/data/registry/packages.json +184 -0
- package/data/shared/framework/agents/brainstormer.md +74 -0
- package/data/shared/framework/agents/code-reviewer.md +87 -0
- package/data/shared/framework/agents/debugger.md +84 -0
- package/data/shared/framework/agents/docs-manager.md +55 -0
- package/data/shared/framework/agents/git-manager.md +59 -0
- package/data/shared/framework/agents/planner.md +68 -0
- package/data/shared/framework/agents/researcher.md +66 -0
- package/data/shared/framework/agents/tester.md +65 -0
- package/data/shared/framework/commands/cook/auto.md +27 -0
- package/data/shared/framework/commands/cook.md +45 -0
- package/data/shared/framework/commands/fix/ci.md +21 -0
- package/data/shared/framework/commands/fix/test.md +26 -0
- package/data/shared/framework/commands/fix/types.md +29 -0
- package/data/shared/framework/commands/fix.md +26 -0
- package/data/shared/framework/commands/git/cm.md +37 -0
- package/data/shared/framework/commands/git/pr.md +40 -0
- package/data/shared/framework/config/CLAUDE.md.template +26 -0
- package/data/shared/framework/config/settings.json +41 -0
- package/data/shared/framework/config/skillstore.config.json +29 -0
- package/data/shared/framework/hooks/discord-notify.sh +85 -0
- package/data/shared/framework/hooks/docs-sync.sh +53 -0
- package/data/shared/framework/hooks/modularization-hook.js +103 -0
- package/data/shared/framework/hooks/notification.js +94 -0
- package/data/shared/framework/hooks/quality-gate.js +109 -0
- package/data/shared/framework/hooks/scout-block.js +77 -0
- package/data/shared/framework/hooks/telegram-notify.sh +77 -0
- package/data/shared/framework/protocols/error-recovery.md +80 -0
- package/data/shared/framework/protocols/orchestration-protocol.md +112 -0
- package/data/shared/framework/quality/review-protocol.md +76 -0
- package/data/shared/framework/quality/verification-protocol.md +66 -0
- package/data/shared/framework/rules/development-rules.md +75 -0
- package/data/shared/framework/skills/backend-development/SKILL.md +77 -0
- package/data/shared/framework/skills/backend-development/assets/sample-output.md +175 -0
- package/data/shared/framework/skills/backend-development/references/advanced-patterns.md +180 -0
- package/data/shared/framework/skills/backend-development/references/api-design-guide.md +160 -0
- package/data/shared/framework/skills/backend-development/references/architecture-patterns.md +183 -0
- package/data/shared/framework/skills/backend-development/references/observability-resilience.md +155 -0
- package/data/shared/framework/skills/backend-development/references/troubleshooting.md +199 -0
- package/data/shared/framework/skills/codebase-analysis/SKILL.md +72 -0
- package/data/shared/framework/skills/codebase-analysis/assets/sample-output.md +263 -0
- package/data/shared/framework/skills/codebase-analysis/references/analysis-techniques.md +241 -0
- package/data/shared/framework/skills/codebase-analysis/references/dependency-mapping.md +280 -0
- package/data/shared/framework/skills/codebase-analysis/references/tech-debt-assessment.md +208 -0
- package/data/shared/framework/skills/databases/SKILL.md +72 -0
- package/data/shared/framework/skills/databases/assets/sample-output.md +212 -0
- package/data/shared/framework/skills/databases/references/advanced-data-patterns.md +259 -0
- package/data/shared/framework/skills/databases/references/query-optimization.md +214 -0
- package/data/shared/framework/skills/databases/references/schema-design.md +159 -0
- package/data/shared/framework/skills/databases/references/troubleshooting.md +214 -0
- package/data/shared/framework/skills/debugging-investigation/SKILL.md +84 -0
- package/data/shared/framework/skills/debugging-investigation/assets/sample-output.md +314 -0
- package/data/shared/framework/skills/debugging-investigation/references/systematic-debugging.md +197 -0
- package/data/shared/framework/skills/debugging-investigation/references/tool-specific-guides.md +202 -0
- package/data/shared/framework/skills/debugging-investigation/references/troubleshooting-patterns.md +196 -0
- package/data/shared/framework/skills/frontend-development/SKILL.md +67 -0
- package/data/shared/framework/skills/frontend-development/assets/sample-output.md +110 -0
- package/data/shared/framework/skills/frontend-development/references/component-patterns.md +112 -0
- package/data/shared/framework/skills/frontend-development/references/performance-guide.md +169 -0
- package/data/shared/framework/skills/frontend-development/references/routing-forms-realtime.md +374 -0
- package/data/shared/framework/skills/frontend-development/references/ssr-rsc-patterns.md +284 -0
- package/data/shared/framework/skills/frontend-development/references/troubleshooting.md +154 -0
- package/data/shared/framework/skills/mobile-development/SKILL.md +67 -0
- package/data/shared/framework/skills/mobile-development/assets/sample-output.md +382 -0
- package/data/shared/framework/skills/mobile-development/references/mobile-patterns.md +681 -0
- package/data/shared/framework/skills/mobile-development/references/mobile-performance.md +524 -0
- package/data/shared/framework/skills/mobile-development/references/troubleshooting.md +158 -0
- package/data/shared/framework/skills/security-audit/SKILL.md +83 -0
- package/data/shared/framework/skills/security-audit/assets/sample-output.md +451 -0
- package/data/shared/framework/skills/security-audit/references/owasp-checklist.md +580 -0
- package/data/shared/framework/skills/security-audit/references/secure-coding-patterns.md +433 -0
- package/data/shared/framework/skills/security-audit/references/vulnerability-remediation.md +331 -0
- package/data/shared/framework/skills/ui-generation/SKILL.md +70 -0
- package/data/shared/framework/skills/ui-generation/assets/sample-output.md +139 -0
- package/data/shared/framework/skills/ui-generation/references/accessibility-responsive.md +127 -0
- package/data/shared/framework/skills/ui-generation/references/compound-components.md +252 -0
- package/data/shared/framework/skills/ui-generation/references/generation-patterns.md +110 -0
- package/data/shared/framework/skills/ui-generation/references/storybook-design-system.md +278 -0
- package/data/shared/framework/skills/ui-generation/references/troubleshooting.md +198 -0
- package/data/shared/framework/workflows/documentation-management.md +58 -0
- package/data/shared/framework/workflows/primary-workflow.md +88 -0
- package/dist/commands/activate.d.ts +3 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +34 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/bundle.d.ts +3 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +64 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +99 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +37 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +30 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +35 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +68 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/download/cache.d.ts +3 -0
- package/dist/download/cache.d.ts.map +1 -0
- package/dist/download/cache.js +18 -0
- package/dist/download/cache.js.map +1 -0
- package/dist/download/client.d.ts +2 -0
- package/dist/download/client.d.ts.map +1 -0
- package/dist/download/client.js +58 -0
- package/dist/download/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/file-copier.d.ts +6 -0
- package/dist/installer/file-copier.d.ts.map +1 -0
- package/dist/installer/file-copier.js +32 -0
- package/dist/installer/file-copier.js.map +1 -0
- package/dist/installer/plugin-installer.d.ts +12 -0
- package/dist/installer/plugin-installer.d.ts.map +1 -0
- package/dist/installer/plugin-installer.js +33 -0
- package/dist/installer/plugin-installer.js.map +1 -0
- package/dist/installer/template-installer.d.ts +12 -0
- package/dist/installer/template-installer.d.ts.map +1 -0
- package/dist/installer/template-installer.js +45 -0
- package/dist/installer/template-installer.js.map +1 -0
- package/dist/license/crypto.d.ts +16 -0
- package/dist/license/crypto.d.ts.map +1 -0
- package/dist/license/crypto.js +50 -0
- package/dist/license/crypto.js.map +1 -0
- package/dist/license/license-store.d.ts +19 -0
- package/dist/license/license-store.d.ts.map +1 -0
- package/dist/license/license-store.js +99 -0
- package/dist/license/license-store.js.map +1 -0
- package/dist/license/validator.d.ts +32 -0
- package/dist/license/validator.d.ts.map +1 -0
- package/dist/license/validator.js +81 -0
- package/dist/license/validator.js.map +1 -0
- package/dist/registry/loader.d.ts +30 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +22 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/search-engine.d.ts +9 -0
- package/dist/registry/search-engine.d.ts.map +1 -0
- package/dist/registry/search-engine.js +30 -0
- package/dist/registry/search-engine.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +28 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +20 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +79 -0
- package/dist/utils/paths.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|