siteskills 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 (69) hide show
  1. package/dist/commands/info.d.ts +2 -0
  2. package/dist/commands/info.d.ts.map +1 -0
  3. package/dist/commands/info.js +59 -0
  4. package/dist/commands/info.js.map +1 -0
  5. package/dist/commands/init.d.ts +2 -0
  6. package/dist/commands/init.d.ts.map +1 -0
  7. package/dist/commands/init.js +125 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/commands/install.d.ts +4 -0
  10. package/dist/commands/install.d.ts.map +1 -0
  11. package/dist/commands/install.js +75 -0
  12. package/dist/commands/install.js.map +1 -0
  13. package/dist/commands/list.d.ts +2 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +59 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/login.d.ts +2 -0
  18. package/dist/commands/login.d.ts.map +1 -0
  19. package/dist/commands/login.js +62 -0
  20. package/dist/commands/login.js.map +1 -0
  21. package/dist/commands/logout.d.ts +2 -0
  22. package/dist/commands/logout.d.ts.map +1 -0
  23. package/dist/commands/logout.js +12 -0
  24. package/dist/commands/logout.js.map +1 -0
  25. package/dist/commands/publish.d.ts +4 -0
  26. package/dist/commands/publish.d.ts.map +1 -0
  27. package/dist/commands/publish.js +87 -0
  28. package/dist/commands/publish.js.map +1 -0
  29. package/dist/commands/search.d.ts +4 -0
  30. package/dist/commands/search.d.ts.map +1 -0
  31. package/dist/commands/search.js +48 -0
  32. package/dist/commands/search.js.map +1 -0
  33. package/dist/commands/uninstall.d.ts +2 -0
  34. package/dist/commands/uninstall.d.ts.map +1 -0
  35. package/dist/commands/uninstall.js +44 -0
  36. package/dist/commands/uninstall.js.map +1 -0
  37. package/dist/commands/unpublish.d.ts +2 -0
  38. package/dist/commands/unpublish.d.ts.map +1 -0
  39. package/dist/commands/unpublish.js +56 -0
  40. package/dist/commands/unpublish.js.map +1 -0
  41. package/dist/commands/update.d.ts +2 -0
  42. package/dist/commands/update.d.ts.map +1 -0
  43. package/dist/commands/update.js +103 -0
  44. package/dist/commands/update.js.map +1 -0
  45. package/dist/commands/validate.d.ts +2 -0
  46. package/dist/commands/validate.d.ts.map +1 -0
  47. package/dist/commands/validate.js +27 -0
  48. package/dist/commands/validate.js.map +1 -0
  49. package/dist/commands/whoami.d.ts +2 -0
  50. package/dist/commands/whoami.d.ts.map +1 -0
  51. package/dist/commands/whoami.js +45 -0
  52. package/dist/commands/whoami.js.map +1 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +120 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/lib/api.d.ts +54 -0
  58. package/dist/lib/api.d.ts.map +1 -0
  59. package/dist/lib/api.js +148 -0
  60. package/dist/lib/api.js.map +1 -0
  61. package/dist/lib/config.d.ts +11 -0
  62. package/dist/lib/config.d.ts.map +1 -0
  63. package/dist/lib/config.js +54 -0
  64. package/dist/lib/config.js.map +1 -0
  65. package/dist/lib/manifest.d.ts +29 -0
  66. package/dist/lib/manifest.d.ts.map +1 -0
  67. package/dist/lib/manifest.js +141 -0
  68. package/dist/lib/manifest.js.map +1 -0
  69. package/package.json +52 -0
@@ -0,0 +1,48 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { getApiUrl } from "../lib/config.js";
4
+ export async function searchCommand(query, options) {
5
+ if (!query || query.trim().length === 0) {
6
+ console.error(chalk.red("Please provide a search query. Usage: siteskills search <query>"));
7
+ process.exit(1);
8
+ }
9
+ const baseUrl = getApiUrl();
10
+ const limit = parseInt(options.limit || "10", 10);
11
+ const spinner = ora(`Searching for "${query}"...`).start();
12
+ try {
13
+ const params = new URLSearchParams({
14
+ q: query.trim(),
15
+ limit: String(limit),
16
+ });
17
+ const res = await fetch(`${baseUrl}/api/skills?${params}`);
18
+ if (!res.ok) {
19
+ spinner.fail(chalk.red(`Search failed (HTTP ${res.status}).`));
20
+ process.exit(1);
21
+ }
22
+ const body = (await res.json());
23
+ const skills = body.data || [];
24
+ spinner.stop();
25
+ if (skills.length === 0) {
26
+ console.log(chalk.yellow(`\nNo skills found for "${query}".\n`));
27
+ console.log(chalk.dim(" Try a different search term, or browse all skills at https://siteskills.ai/skills"));
28
+ return;
29
+ }
30
+ console.log(chalk.bold(`\n${skills.length} skill${skills.length !== 1 ? "s" : ""} found:\n`));
31
+ for (const skill of skills) {
32
+ const stars = skill.rating ? `${skill.rating}` : "-";
33
+ const dl = skill.downloads?.toLocaleString() || "0";
34
+ const domains = skill.targetDomains?.slice(0, 3).join(", ") || "";
35
+ console.log(` ${chalk.bold.cyan(skill.slug)} ${chalk.dim(`v${skill.version}`)}`);
36
+ console.log(` ${skill.description || skill.displayName}`);
37
+ console.log(chalk.dim(` ${dl} downloads | ${stars} rating | ${domains}`));
38
+ console.log(chalk.dim(` Install: `) + chalk.green(`siteskills install ${skill.slug}`));
39
+ console.log();
40
+ }
41
+ }
42
+ catch (err) {
43
+ spinner.fail(chalk.red("Search failed."));
44
+ console.error(chalk.red(` ${err.message}`));
45
+ process.exit(1);
46
+ }
47
+ }
48
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function uninstallCommand(slug: string): Promise<void>;
2
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAyBA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
@@ -0,0 +1,44 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import chalk from "chalk";
5
+ /** Find where a skill is installed. */
6
+ function findSkillDir(slug) {
7
+ const home = os.homedir();
8
+ const candidates = [
9
+ path.join(home, ".claude", "skills", slug),
10
+ path.join(home, ".openclaw", "skills", slug),
11
+ ];
12
+ // Check env override
13
+ const envDir = process.env.SITESKILLS_DIR;
14
+ if (envDir) {
15
+ candidates.unshift(path.join(envDir, slug));
16
+ }
17
+ for (const dir of candidates) {
18
+ if (fs.existsSync(dir))
19
+ return dir;
20
+ }
21
+ return null;
22
+ }
23
+ export async function uninstallCommand(slug) {
24
+ if (!slug || slug.trim().length === 0) {
25
+ console.error(chalk.red("Please provide a skill name. Usage: siteskills uninstall <name>"));
26
+ process.exit(1);
27
+ }
28
+ const skillDir = findSkillDir(slug);
29
+ if (!skillDir) {
30
+ console.error(chalk.yellow(`Skill "${slug}" is not installed.`));
31
+ process.exit(1);
32
+ }
33
+ try {
34
+ fs.rmSync(skillDir, { recursive: true, force: true });
35
+ console.log(chalk.green(`Uninstalled ${chalk.bold(slug)}`));
36
+ console.log(chalk.dim(` Removed ${skillDir}`));
37
+ }
38
+ catch (err) {
39
+ console.error(chalk.red(`Failed to uninstall "${slug}".`));
40
+ console.error(chalk.red(` ${err.message}`));
41
+ process.exit(1);
42
+ }
43
+ }
44
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,uCAAuC;AACvC,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC;KAC7C,CAAC;IAEF,qBAAqB;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,iEAAiE,CAClE,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,qBAAqB,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function unpublishCommand(slug: string): Promise<void>;
2
+ //# sourceMappingURL=unpublish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.d.ts","sourceRoot":"","sources":["../../src/commands/unpublish.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDlE"}
@@ -0,0 +1,56 @@
1
+ import chalk from "chalk";
2
+ import inquirer from "inquirer";
3
+ import ora from "ora";
4
+ import { requireAuth } from "../lib/config.js";
5
+ import { unpublishSkill } from "../lib/api.js";
6
+ export async function unpublishCommand(slug) {
7
+ if (!slug || slug.trim().length === 0) {
8
+ console.error(chalk.red("Please provide a skill slug. Usage: siteskills unpublish <slug>"));
9
+ process.exit(1);
10
+ }
11
+ let apiKey;
12
+ try {
13
+ apiKey = requireAuth();
14
+ }
15
+ catch (err) {
16
+ console.error(chalk.red(err.message));
17
+ process.exit(1);
18
+ }
19
+ // Confirmation prompt
20
+ const { confirm } = await inquirer.prompt([
21
+ {
22
+ type: "confirm",
23
+ name: "confirm",
24
+ message: `Are you sure you want to unpublish "${slug}"? This action cannot be undone.`,
25
+ default: false,
26
+ },
27
+ ]);
28
+ if (!confirm) {
29
+ console.log(chalk.yellow("Unpublish cancelled."));
30
+ return;
31
+ }
32
+ const spinner = ora(`Unpublishing "${slug}"...`).start();
33
+ try {
34
+ const response = await unpublishSkill(apiKey, slug);
35
+ if (response.ok) {
36
+ spinner.succeed(chalk.green(`Skill "${slug}" has been unpublished.`));
37
+ }
38
+ else {
39
+ spinner.fail(chalk.red(`Failed to unpublish "${slug}".`));
40
+ const errorData = response.data;
41
+ if (response.status === 404) {
42
+ console.error(chalk.red(` Skill "${slug}" not found.`));
43
+ }
44
+ else {
45
+ console.error(chalk.red(` Error: ${errorData.message || `HTTP ${response.status}`}`));
46
+ }
47
+ process.exit(1);
48
+ }
49
+ }
50
+ catch (err) {
51
+ spinner.fail(chalk.red(`Failed to unpublish "${slug}".`));
52
+ console.error(chalk.red(` Error: ${err.message}`));
53
+ process.exit(1);
54
+ }
55
+ }
56
+ //# sourceMappingURL=unpublish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.js","sourceRoot":"","sources":["../../src/commands/unpublish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC9D;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,uCAAuC,IAAI,kCAAkC;YACtF,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEpD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,yBAAyB,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,IAA+B,CAAC;YAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,YAAa,SAAS,CAAC,OAAkB,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CACpF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAkCA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiFnD"}
@@ -0,0 +1,103 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import archiver from "archiver";
6
+ import { requireAuth } from "../lib/config.js";
7
+ import { updateSkill } from "../lib/api.js";
8
+ import { validateManifest, loadManifest } from "../lib/manifest.js";
9
+ function zipProject(dir, outputPath) {
10
+ return new Promise((resolve, reject) => {
11
+ const output = fs.createWriteStream(outputPath);
12
+ const archive = archiver("zip", { zlib: { level: 9 } });
13
+ output.on("close", () => resolve());
14
+ archive.on("error", (err) => reject(err));
15
+ archive.pipe(output);
16
+ archive.glob("**/*", {
17
+ cwd: dir,
18
+ ignore: [
19
+ "node_modules/**",
20
+ ".git/**",
21
+ "*.zip",
22
+ ".siteskills/**",
23
+ ],
24
+ dot: false,
25
+ });
26
+ archive.finalize();
27
+ });
28
+ }
29
+ export async function updateCommand() {
30
+ const cwd = process.cwd();
31
+ console.log(chalk.bold("\nUpdating skill on SiteSkills...\n"));
32
+ // Require authentication
33
+ let apiKey;
34
+ try {
35
+ apiKey = requireAuth();
36
+ }
37
+ catch (err) {
38
+ console.error(chalk.red(err.message));
39
+ process.exit(1);
40
+ }
41
+ // Validate first
42
+ const validation = validateManifest(cwd);
43
+ if (!validation.valid) {
44
+ console.log(chalk.red("Skill validation failed. Fix the following errors first:\n"));
45
+ for (const error of validation.errors) {
46
+ console.log(chalk.red(` ✗ ${error}`));
47
+ }
48
+ process.exit(1);
49
+ }
50
+ const manifest = loadManifest(cwd);
51
+ if (!manifest) {
52
+ console.error(chalk.red("Could not load manifest.json."));
53
+ process.exit(1);
54
+ }
55
+ console.log(chalk.dim(` Name: ${manifest.name}`));
56
+ console.log(chalk.dim(` Slug: ${manifest.slug}`));
57
+ console.log(chalk.dim(` Version: ${manifest.version}\n`));
58
+ // Create zip file
59
+ const zipFileName = `${manifest.slug}-${manifest.version}.zip`;
60
+ const zipPath = path.join(cwd, zipFileName);
61
+ const spinnerZip = ora("Packaging skill...").start();
62
+ try {
63
+ await zipProject(cwd, zipPath);
64
+ spinnerZip.succeed("Skill packaged successfully.");
65
+ }
66
+ catch (err) {
67
+ spinnerZip.fail("Failed to package skill.");
68
+ console.error(chalk.red(` Error: ${err.message}`));
69
+ process.exit(1);
70
+ }
71
+ // Upload new version
72
+ const spinnerUpload = ora("Uploading new version to SiteSkills...").start();
73
+ try {
74
+ const response = await updateSkill(apiKey, manifest.slug, zipPath);
75
+ // Clean up zip file
76
+ if (fs.existsSync(zipPath)) {
77
+ fs.unlinkSync(zipPath);
78
+ }
79
+ if (response.ok) {
80
+ spinnerUpload.succeed(chalk.green("Skill updated successfully!"));
81
+ if (response.data.skill) {
82
+ console.log(chalk.dim(`\n Slug: ${response.data.skill.slug}`));
83
+ console.log(chalk.dim(` Version: ${response.data.skill.version}`));
84
+ }
85
+ }
86
+ else {
87
+ spinnerUpload.fail(chalk.red("Failed to update skill."));
88
+ const errorData = response.data;
89
+ console.error(chalk.red(` Error: ${errorData.message || `HTTP ${response.status}`}`));
90
+ process.exit(1);
91
+ }
92
+ }
93
+ catch (err) {
94
+ // Clean up zip file on error
95
+ if (fs.existsSync(zipPath)) {
96
+ fs.unlinkSync(zipPath);
97
+ }
98
+ spinnerUpload.fail(chalk.red("Failed to update skill."));
99
+ console.error(chalk.red(` Error: ${err.message}`));
100
+ process.exit(1);
101
+ }
102
+ }
103
+ //# 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,2 @@
1
+ export declare function validateCommand(): Promise<void>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BrD"}
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ import { validateManifest } from "../lib/manifest.js";
3
+ export async function validateCommand() {
4
+ const cwd = process.cwd();
5
+ console.log(chalk.bold("\nValidating skill project...\n"));
6
+ const result = validateManifest(cwd);
7
+ if (result.errors.length > 0) {
8
+ console.log(chalk.red.bold("Errors:"));
9
+ for (const error of result.errors) {
10
+ console.log(chalk.red(` ✗ ${error}`));
11
+ }
12
+ }
13
+ if (result.warnings.length > 0) {
14
+ console.log(chalk.yellow.bold("\nWarnings:"));
15
+ for (const warning of result.warnings) {
16
+ console.log(chalk.yellow(` ! ${warning}`));
17
+ }
18
+ }
19
+ if (result.valid) {
20
+ console.log(chalk.green.bold("\nValidation passed. Your skill project is valid.\n"));
21
+ }
22
+ else {
23
+ console.log(chalk.red.bold(`\nValidation failed with ${result.errors.length} error(s).\n`));
24
+ process.exit(1);
25
+ }
26
+ }
27
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,4BAA4B,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,CAC/D,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function whoamiCommand(): Promise<void>;
2
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CA8CnD"}
@@ -0,0 +1,45 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { requireAuth } from "../lib/config.js";
4
+ import { getDashboard } from "../lib/api.js";
5
+ export async function whoamiCommand() {
6
+ let apiKey;
7
+ try {
8
+ apiKey = requireAuth();
9
+ }
10
+ catch (err) {
11
+ console.error(chalk.red(err.message));
12
+ process.exit(1);
13
+ }
14
+ const spinner = ora("Fetching user info...").start();
15
+ try {
16
+ const response = await getDashboard(apiKey);
17
+ if (!response.ok) {
18
+ spinner.fail(chalk.red("Failed to fetch user info."));
19
+ const errorData = response.data;
20
+ if (response.status === 401) {
21
+ console.error(chalk.red(" Your session has expired. Run `siteskills login` to re-authenticate."));
22
+ }
23
+ else {
24
+ console.error(chalk.red(` Error: ${errorData.message || `HTTP ${response.status}`}`));
25
+ }
26
+ process.exit(1);
27
+ }
28
+ spinner.stop();
29
+ const user = response.data.user;
30
+ console.log(chalk.bold("\nCurrent User:\n"));
31
+ console.log(` ${chalk.dim("Name:")} ${user.name || "N/A"}`);
32
+ console.log(` ${chalk.dim("Email:")} ${user.email || "N/A"}`);
33
+ if (user.username) {
34
+ console.log(` ${chalk.dim("Username:")} ${user.username}`);
35
+ }
36
+ console.log(` ${chalk.dim("ID:")} ${user.id || "N/A"}`);
37
+ console.log();
38
+ }
39
+ catch (err) {
40
+ spinner.fail(chalk.red("Failed to fetch user info."));
41
+ console.error(chalk.red(` Error: ${err.message}`));
42
+ process.exit(1);
43
+ }
44
+ }
45
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAA+B,CAAC;YAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CACpF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,YAAa,SAAS,CAAC,OAAkB,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CACpF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -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,120 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import chalk from "chalk";
4
+ import { installCommand } from "./commands/install.js";
5
+ import { searchCommand } from "./commands/search.js";
6
+ import { uninstallCommand } from "./commands/uninstall.js";
7
+ import { loginCommand } from "./commands/login.js";
8
+ import { logoutCommand } from "./commands/logout.js";
9
+ import { initCommand } from "./commands/init.js";
10
+ import { validateCommand } from "./commands/validate.js";
11
+ import { publishCommand } from "./commands/publish.js";
12
+ import { updateCommand } from "./commands/update.js";
13
+ import { listCommand } from "./commands/list.js";
14
+ import { infoCommand } from "./commands/info.js";
15
+ import { unpublishCommand } from "./commands/unpublish.js";
16
+ import { whoamiCommand } from "./commands/whoami.js";
17
+ const program = new Command();
18
+ program
19
+ .name("siteskills")
20
+ .description("Install and share AI browser agent navigation skills — works with Claude Code, OpenClaw, and more")
21
+ .version("1.0.0");
22
+ // -------------------------------------------------------------------------
23
+ // Consumer commands (no auth required)
24
+ // -------------------------------------------------------------------------
25
+ program
26
+ .command("install <name>")
27
+ .description("Download and install a skill for your AI agent")
28
+ .option("-d, --dir <path>", "Custom install directory")
29
+ .action(async (name, options) => {
30
+ await installCommand(name, options);
31
+ });
32
+ program
33
+ .command("search <query>")
34
+ .description("Search the SiteSkills marketplace")
35
+ .option("-l, --limit <n>", "Max results to show", "10")
36
+ .action(async (query, options) => {
37
+ await searchCommand(query, options);
38
+ });
39
+ program
40
+ .command("uninstall <name>")
41
+ .description("Remove an installed skill")
42
+ .action(async (name) => {
43
+ await uninstallCommand(name);
44
+ });
45
+ program
46
+ .command("info <slug>")
47
+ .description("Show details about a specific skill")
48
+ .action(async (slug) => {
49
+ await infoCommand(slug);
50
+ });
51
+ // -------------------------------------------------------------------------
52
+ // Publisher commands (auth required)
53
+ // -------------------------------------------------------------------------
54
+ program
55
+ .command("login")
56
+ .description("Authenticate with the SiteSkills platform via API key")
57
+ .action(async () => {
58
+ await loginCommand();
59
+ });
60
+ program
61
+ .command("logout")
62
+ .description("Clear stored authentication credentials")
63
+ .action(async () => {
64
+ await logoutCommand();
65
+ });
66
+ program
67
+ .command("init")
68
+ .description("Initialize a new skill project in the current directory")
69
+ .action(async () => {
70
+ await initCommand();
71
+ });
72
+ program
73
+ .command("validate")
74
+ .description("Validate the current skill project")
75
+ .action(async () => {
76
+ await validateCommand();
77
+ });
78
+ program
79
+ .command("publish")
80
+ .description("Upload a SKILL.md to the SiteSkills platform")
81
+ .option("-f, --file <path>", "Path to SKILL.md file (default: ./SKILL.md)")
82
+ .action(async (options) => {
83
+ await publishCommand(options);
84
+ });
85
+ program
86
+ .command("update")
87
+ .description("Upload a new version of an existing skill")
88
+ .action(async () => {
89
+ await updateCommand();
90
+ });
91
+ program
92
+ .command("list")
93
+ .description("List your published skills")
94
+ .action(async () => {
95
+ await listCommand();
96
+ });
97
+ program
98
+ .command("unpublish <slug>")
99
+ .description("Unpublish/remove a skill from the platform")
100
+ .action(async (slug) => {
101
+ await unpublishCommand(slug);
102
+ });
103
+ program
104
+ .command("whoami")
105
+ .description("Show the current authenticated user")
106
+ .action(async () => {
107
+ await whoamiCommand();
108
+ });
109
+ // Handle unknown commands
110
+ program.on("command:*", () => {
111
+ console.error(chalk.red(`\nUnknown command: ${program.args.join(" ")}`));
112
+ console.error(chalk.dim("Run `siteskills --help` to see available commands.\n"));
113
+ process.exit(1);
114
+ });
115
+ program.parse(process.argv);
116
+ // Show help if no command is provided
117
+ if (!process.argv.slice(2).length) {
118
+ program.outputHelp();
119
+ }
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export interface ApiResponse<T = unknown> {
2
+ ok: boolean;
3
+ status: number;
4
+ data: T;
5
+ }
6
+ export interface UserInfo {
7
+ id: string;
8
+ email: string;
9
+ name: string;
10
+ username?: string;
11
+ }
12
+ export interface SkillSummary {
13
+ id: string;
14
+ slug: string;
15
+ name: string;
16
+ version: string;
17
+ status: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ }
21
+ export interface SkillDetail extends SkillSummary {
22
+ description: string;
23
+ author: string;
24
+ downloads?: number;
25
+ versions?: Array<{
26
+ version: string;
27
+ createdAt: string;
28
+ }>;
29
+ }
30
+ export declare function login(apiKey: string): Promise<ApiResponse<{
31
+ message: string;
32
+ user: UserInfo;
33
+ }>>;
34
+ export declare function getDashboard(apiKey: string): Promise<ApiResponse<{
35
+ user: UserInfo;
36
+ }>>;
37
+ export declare function listSkills(apiKey: string): Promise<ApiResponse<{
38
+ skills: SkillSummary[];
39
+ }>>;
40
+ export declare function getSkillInfo(apiKey: string, slug: string): Promise<ApiResponse<{
41
+ skill: SkillDetail;
42
+ }>>;
43
+ export declare function publishSkill(apiKey: string, skillMdPath: string): Promise<ApiResponse<{
44
+ skill: SkillSummary;
45
+ message: string;
46
+ }>>;
47
+ export declare function updateSkill(apiKey: string, slug: string, zipFilePath: string): Promise<ApiResponse<{
48
+ skill: SkillSummary;
49
+ message: string;
50
+ }>>;
51
+ export declare function unpublishSkill(apiKey: string, slug: string): Promise<ApiResponse<{
52
+ message: string;
53
+ }>>;
54
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAgDD,wBAAsB,KAAK,CACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,CAM3D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,CAI1C;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAAC,CAIlD;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,CAI9C;AAqDD,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA4BhE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgBhE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAK3C"}