skillspace 0.7.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 (106) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +57 -0
  3. package/bin/skillspace.js +2 -0
  4. package/dist/browserAuth.d.ts +20 -0
  5. package/dist/browserAuth.js +156 -0
  6. package/dist/browserAuth.js.map +1 -0
  7. package/dist/cli/authToken.d.ts +2 -0
  8. package/dist/cli/authToken.js +13 -0
  9. package/dist/cli/authToken.js.map +1 -0
  10. package/dist/cli/buildInfo.d.ts +3 -0
  11. package/dist/cli/buildInfo.js +103 -0
  12. package/dist/cli/buildInfo.js.map +1 -0
  13. package/dist/cli/clawdbotConfig.d.ts +6 -0
  14. package/dist/cli/clawdbotConfig.js +156 -0
  15. package/dist/cli/clawdbotConfig.js.map +1 -0
  16. package/dist/cli/commands/auth.d.ts +9 -0
  17. package/dist/cli/commands/auth.js +74 -0
  18. package/dist/cli/commands/auth.js.map +1 -0
  19. package/dist/cli/commands/delete.d.ts +28 -0
  20. package/dist/cli/commands/delete.js +94 -0
  21. package/dist/cli/commands/delete.js.map +1 -0
  22. package/dist/cli/commands/inspect.d.ts +12 -0
  23. package/dist/cli/commands/inspect.js +281 -0
  24. package/dist/cli/commands/inspect.js.map +1 -0
  25. package/dist/cli/commands/moderation.d.ts +19 -0
  26. package/dist/cli/commands/moderation.js +161 -0
  27. package/dist/cli/commands/moderation.js.map +1 -0
  28. package/dist/cli/commands/publish.d.ts +9 -0
  29. package/dist/cli/commands/publish.js +85 -0
  30. package/dist/cli/commands/publish.js.map +1 -0
  31. package/dist/cli/commands/skills.d.ts +26 -0
  32. package/dist/cli/commands/skills.js +387 -0
  33. package/dist/cli/commands/skills.js.map +1 -0
  34. package/dist/cli/commands/star.d.ts +8 -0
  35. package/dist/cli/commands/star.js +31 -0
  36. package/dist/cli/commands/star.js.map +1 -0
  37. package/dist/cli/commands/sync.d.ts +3 -0
  38. package/dist/cli/commands/sync.js +157 -0
  39. package/dist/cli/commands/sync.js.map +1 -0
  40. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  41. package/dist/cli/commands/syncHelpers.js +369 -0
  42. package/dist/cli/commands/syncHelpers.js.map +1 -0
  43. package/dist/cli/commands/syncTypes.d.ts +24 -0
  44. package/dist/cli/commands/syncTypes.js +2 -0
  45. package/dist/cli/commands/syncTypes.js.map +1 -0
  46. package/dist/cli/commands/transfer.d.ts +50 -0
  47. package/dist/cli/commands/transfer.js +133 -0
  48. package/dist/cli/commands/transfer.js.map +1 -0
  49. package/dist/cli/commands/unstar.d.ts +8 -0
  50. package/dist/cli/commands/unstar.js +31 -0
  51. package/dist/cli/commands/unstar.js.map +1 -0
  52. package/dist/cli/helpStyle.d.ts +13 -0
  53. package/dist/cli/helpStyle.js +38 -0
  54. package/dist/cli/helpStyle.js.map +1 -0
  55. package/dist/cli/registry.d.ts +7 -0
  56. package/dist/cli/registry.js +31 -0
  57. package/dist/cli/registry.js.map +1 -0
  58. package/dist/cli/scanSkills.d.ts +7 -0
  59. package/dist/cli/scanSkills.js +84 -0
  60. package/dist/cli/scanSkills.js.map +1 -0
  61. package/dist/cli/slug.d.ts +2 -0
  62. package/dist/cli/slug.js +16 -0
  63. package/dist/cli/slug.js.map +1 -0
  64. package/dist/cli/types.d.ts +15 -0
  65. package/dist/cli/types.js +2 -0
  66. package/dist/cli/types.js.map +1 -0
  67. package/dist/cli/ui.d.ts +7 -0
  68. package/dist/cli/ui.js +82 -0
  69. package/dist/cli/ui.js.map +1 -0
  70. package/dist/cli.d.ts +2 -0
  71. package/dist/cli.js +384 -0
  72. package/dist/cli.js.map +1 -0
  73. package/dist/config.d.ts +4 -0
  74. package/dist/config.js +66 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/discovery.d.ts +5 -0
  77. package/dist/discovery.js +25 -0
  78. package/dist/discovery.js.map +1 -0
  79. package/dist/homedir.d.ts +7 -0
  80. package/dist/homedir.js +29 -0
  81. package/dist/homedir.js.map +1 -0
  82. package/dist/http.d.ts +43 -0
  83. package/dist/http.js +501 -0
  84. package/dist/http.js.map +1 -0
  85. package/dist/schema/ark.d.ts +4 -0
  86. package/dist/schema/ark.js +26 -0
  87. package/dist/schema/ark.js.map +1 -0
  88. package/dist/schema/index.d.ts +6 -0
  89. package/dist/schema/index.js +6 -0
  90. package/dist/schema/index.js.map +1 -0
  91. package/dist/schema/routes.d.ts +24 -0
  92. package/dist/schema/routes.js +25 -0
  93. package/dist/schema/routes.js.map +1 -0
  94. package/dist/schema/schemas.d.ts +343 -0
  95. package/dist/schema/schemas.js +308 -0
  96. package/dist/schema/schemas.js.map +1 -0
  97. package/dist/schema/textFiles.d.ts +5 -0
  98. package/dist/schema/textFiles.js +66 -0
  99. package/dist/schema/textFiles.js.map +1 -0
  100. package/dist/skills.d.ts +43 -0
  101. package/dist/skills.js +166 -0
  102. package/dist/skills.js.map +1 -0
  103. package/dist/types.d.ts +7 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +41 -0
@@ -0,0 +1,161 @@
1
+ import { isCancel, select } from "@clack/prompts";
2
+ import { apiRequest, registryUrl } from "../../http.js";
3
+ import { ApiRoutes, ApiV1BanUserResponseSchema, ApiV1SetRoleResponseSchema, ApiV1UserSearchResponseSchema, parseArk, } from "../../schema/index.js";
4
+ import { requireAuthToken } from "../authToken.js";
5
+ import { getRegistry } from "../registry.js";
6
+ import { createSpinner, fail, formatError, isInteractive, promptConfirm } from "../ui.js";
7
+ export async function cmdBanUser(opts, identifierArg, options, inputAllowed) {
8
+ const raw = identifierArg.trim();
9
+ if (!raw)
10
+ fail("Handle or user id required");
11
+ const reason = options.reason?.trim() || undefined;
12
+ const token = await requireAuthToken();
13
+ const registry = await getRegistry(opts, { cache: true });
14
+ const allowPrompt = isInteractive() && inputAllowed !== false;
15
+ const resolved = await resolveUserIdentifier(registry, token, raw, { id: options.id, fuzzy: options.fuzzy }, allowPrompt);
16
+ if (!resolved)
17
+ return;
18
+ if (!options.yes) {
19
+ if (!allowPrompt)
20
+ fail("Pass --yes (no input)");
21
+ const ok = await promptConfirm(`Ban ${resolved.label}? (requires moderator/admin; deletes owned skills)`);
22
+ if (!ok)
23
+ return;
24
+ }
25
+ const spinner = createSpinner(`Banning ${resolved.label}`);
26
+ try {
27
+ const result = await apiRequest(registry, {
28
+ method: "POST",
29
+ path: `${ApiRoutes.users}/ban`,
30
+ token,
31
+ body: resolved.userId
32
+ ? { userId: resolved.userId, reason }
33
+ : { handle: resolved.handle, reason },
34
+ }, ApiV1BanUserResponseSchema);
35
+ const parsed = parseArk(ApiV1BanUserResponseSchema, result, "Ban user response");
36
+ if (parsed.alreadyBanned) {
37
+ spinner.succeed(`OK. ${resolved.label} already banned`);
38
+ return parsed;
39
+ }
40
+ spinner.succeed(`OK. Banned ${resolved.label} (${formatDeletedSkills(parsed.deletedSkills)})`);
41
+ return parsed;
42
+ }
43
+ catch (error) {
44
+ spinner.fail(formatError(error));
45
+ throw error;
46
+ }
47
+ }
48
+ export async function cmdSetRole(opts, identifierArg, roleArg, options, inputAllowed) {
49
+ const raw = identifierArg.trim();
50
+ if (!raw)
51
+ fail("Handle or user id required");
52
+ const role = normalizeRole(roleArg);
53
+ const token = await requireAuthToken();
54
+ const registry = await getRegistry(opts, { cache: true });
55
+ const allowPrompt = isInteractive() && inputAllowed !== false;
56
+ const resolved = await resolveUserIdentifier(registry, token, raw, { id: options.id, fuzzy: options.fuzzy }, allowPrompt);
57
+ if (!resolved)
58
+ return;
59
+ if (!options.yes) {
60
+ if (!allowPrompt)
61
+ fail("Pass --yes (no input)");
62
+ const ok = await promptConfirm(`Set role for ${resolved.label} to ${role}? (admin only)`);
63
+ if (!ok)
64
+ return;
65
+ }
66
+ const spinner = createSpinner(`Setting role for ${resolved.label}`);
67
+ try {
68
+ const result = await apiRequest(registry, {
69
+ method: "POST",
70
+ path: `${ApiRoutes.users}/role`,
71
+ token,
72
+ body: resolved.userId
73
+ ? { userId: resolved.userId, role }
74
+ : { handle: resolved.handle, role },
75
+ }, ApiV1SetRoleResponseSchema);
76
+ const parsed = parseArk(ApiV1SetRoleResponseSchema, result, "Set role response");
77
+ spinner.succeed(`OK. ${resolved.label} is now ${parsed.role}`);
78
+ return parsed;
79
+ }
80
+ catch (error) {
81
+ spinner.fail(formatError(error));
82
+ throw error;
83
+ }
84
+ }
85
+ function normalizeHandle(value) {
86
+ const trimmed = value.trim();
87
+ return trimmed.startsWith("@") ? trimmed.slice(1).toLowerCase() : trimmed.toLowerCase();
88
+ }
89
+ async function resolveUserIdentifier(registry, token, raw, options, allowPrompt) {
90
+ const usesId = Boolean(options.id);
91
+ if (usesId) {
92
+ return { handle: null, userId: raw, label: raw };
93
+ }
94
+ const handle = normalizeHandle(raw);
95
+ if (!options.fuzzy) {
96
+ return { handle, userId: null, label: `@${handle}` };
97
+ }
98
+ const matches = await searchUsers(registry, token, raw);
99
+ if (matches.items.length === 0) {
100
+ fail(`No users matched "${raw}".`);
101
+ }
102
+ if (matches.items.length === 1) {
103
+ const match = matches.items[0];
104
+ return {
105
+ handle: match.handle ?? null,
106
+ userId: match.userId,
107
+ label: formatUserLabel(match),
108
+ };
109
+ }
110
+ if (!allowPrompt) {
111
+ fail(`Multiple users matched "${raw}". Use --id.\n${formatUserList(matches.items)}`);
112
+ }
113
+ const choice = await select({
114
+ message: `Select a user for "${raw}"`,
115
+ options: matches.items.map((item) => ({
116
+ value: item.userId,
117
+ label: formatUserLabel(item),
118
+ })),
119
+ });
120
+ if (isCancel(choice))
121
+ return null;
122
+ const selected = matches.items.find((item) => item.userId === choice);
123
+ if (!selected)
124
+ return null;
125
+ return {
126
+ handle: selected.handle ?? null,
127
+ userId: selected.userId,
128
+ label: formatUserLabel(selected),
129
+ };
130
+ }
131
+ async function searchUsers(registry, token, query) {
132
+ const url = registryUrl(ApiRoutes.users, registry);
133
+ url.searchParams.set("q", query.trim());
134
+ url.searchParams.set("limit", "10");
135
+ const result = await apiRequest(registry, { method: "GET", url: url.toString(), token }, ApiV1UserSearchResponseSchema);
136
+ return parseArk(ApiV1UserSearchResponseSchema, result, "User search response");
137
+ }
138
+ function formatUserLabel(user) {
139
+ const handle = user.handle ? `@${user.handle}` : "unknown";
140
+ const name = user.displayName ?? user.name;
141
+ const role = user.role ? ` (${user.role})` : "";
142
+ const label = name ? `${handle} — ${name}` : handle;
143
+ return `${label}${role} · ${user.userId}`;
144
+ }
145
+ function formatUserList(users) {
146
+ return users.map((user) => `- ${formatUserLabel(user)}`).join("\n");
147
+ }
148
+ function normalizeRole(value) {
149
+ const role = value.trim().toLowerCase();
150
+ if (role === "user" || role === "moderator" || role === "admin")
151
+ return role;
152
+ fail("Role must be user|moderator|admin");
153
+ }
154
+ function formatDeletedSkills(count) {
155
+ if (!Number.isFinite(count))
156
+ return "deleted skills unknown";
157
+ if (count === 1)
158
+ return "deleted 1 skill";
159
+ return `deleted ${count} skills`;
160
+ }
161
+ //# sourceMappingURL=moderation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moderation.js","sourceRoot":"","sources":["../../../src/cli/commands/moderation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { GlobalOpts } from "../types.js";
2
+ export declare function cmdPublish(opts: GlobalOpts, folderArg: string, options: {
3
+ slug?: string;
4
+ name?: string;
5
+ version?: string;
6
+ changelog?: string;
7
+ tags?: string;
8
+ forkOf?: string;
9
+ }): Promise<void>;
@@ -0,0 +1,85 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { basename, resolve } from "node:path";
3
+ import semver from "semver";
4
+ import { apiRequestForm } from "../../http.js";
5
+ import { ApiRoutes, ApiV1PublishResponseSchema } from "../../schema/index.js";
6
+ import { listTextFiles } from "../../skills.js";
7
+ import { requireAuthToken } from "../authToken.js";
8
+ import { getRegistry } from "../registry.js";
9
+ import { sanitizeSlug, titleCase } from "../slug.js";
10
+ import { createSpinner, fail, formatError } from "../ui.js";
11
+ export async function cmdPublish(opts, folderArg, options) {
12
+ const folder = folderArg ? resolve(opts.workdir, folderArg) : null;
13
+ if (!folder)
14
+ fail("Path required");
15
+ const folderStat = await stat(folder).catch(() => null);
16
+ if (!folderStat || !folderStat.isDirectory())
17
+ fail("Path must be a folder");
18
+ const token = await requireAuthToken();
19
+ const registry = await getRegistry(opts, { cache: true });
20
+ const slug = options.slug ?? sanitizeSlug(basename(folder));
21
+ const displayName = options.name ?? titleCase(basename(folder));
22
+ const version = options.version;
23
+ const changelog = options.changelog ?? "";
24
+ const tagsValue = options.tags ?? "latest";
25
+ const tags = tagsValue
26
+ .split(",")
27
+ .map((tag) => tag.trim())
28
+ .filter(Boolean);
29
+ const forkOfRaw = options.forkOf?.trim();
30
+ const forkOf = forkOfRaw ? parseForkOf(forkOfRaw) : undefined;
31
+ if (!slug)
32
+ fail("--slug required");
33
+ if (!displayName)
34
+ fail("--name required");
35
+ if (!version || !semver.valid(version))
36
+ fail("--version must be valid semver");
37
+ const spinner = createSpinner(`Preparing ${slug}@${version}`);
38
+ try {
39
+ const filesOnDisk = await listTextFiles(folder);
40
+ if (filesOnDisk.length === 0)
41
+ fail("No files found");
42
+ if (!filesOnDisk.some((file) => {
43
+ const lower = file.relPath.toLowerCase();
44
+ return lower === "skill.md" || lower === "skills.md";
45
+ })) {
46
+ fail("SKILL.md required");
47
+ }
48
+ const form = new FormData();
49
+ form.set("payload", JSON.stringify({
50
+ slug,
51
+ displayName,
52
+ version,
53
+ changelog,
54
+ acceptLicenseTerms: true,
55
+ tags,
56
+ ...(forkOf ? { forkOf } : {}),
57
+ }));
58
+ let index = 0;
59
+ for (const file of filesOnDisk) {
60
+ index += 1;
61
+ spinner.text = `Uploading ${file.relPath} (${index}/${filesOnDisk.length})`;
62
+ const blob = new Blob([Buffer.from(file.bytes)], { type: file.contentType ?? "text/plain" });
63
+ form.append("files", blob, file.relPath);
64
+ }
65
+ spinner.text = `Publishing ${slug}@${version}`;
66
+ const result = await apiRequestForm(registry, { method: "POST", path: ApiRoutes.skills, token, form }, ApiV1PublishResponseSchema);
67
+ spinner.succeed(`OK. Published ${slug}@${version} (${result.versionId})`);
68
+ }
69
+ catch (error) {
70
+ spinner.fail(formatError(error));
71
+ throw error;
72
+ }
73
+ }
74
+ function parseForkOf(value) {
75
+ const trimmed = value.trim();
76
+ const [slugRaw, versionRaw] = trimmed.split("@");
77
+ const slug = (slugRaw ?? "").trim().toLowerCase();
78
+ if (!slug)
79
+ fail("--fork-of must be <slug> or <slug@version>");
80
+ const version = (versionRaw ?? "").trim();
81
+ if (version && !semver.valid(version))
82
+ fail("--fork-of version must be valid semver");
83
+ return { slug, version: version || undefined };
84
+ }
85
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { GlobalOpts } from "../types.js";
2
+ export declare function cmdSearch(opts: GlobalOpts, query: string, limit?: number): Promise<void>;
3
+ export declare function cmdInstall(opts: GlobalOpts, slug: string, versionFlag?: string, force?: boolean): Promise<void>;
4
+ export declare function cmdUpdate(opts: GlobalOpts, slugArg: string | undefined, options: {
5
+ all?: boolean;
6
+ version?: string;
7
+ force?: boolean;
8
+ }, inputAllowed: boolean): Promise<void>;
9
+ export declare function cmdList(opts: GlobalOpts): Promise<void>;
10
+ export declare function cmdUninstall(opts: GlobalOpts, slug: string, options: {
11
+ yes?: boolean;
12
+ } | undefined, inputAllowed: boolean): Promise<void>;
13
+ export declare function cmdExplore(opts: GlobalOpts, options?: {
14
+ limit?: number;
15
+ sort?: string;
16
+ json?: boolean;
17
+ }): Promise<void>;
18
+ export declare function formatExploreLine(item: {
19
+ slug: string;
20
+ summary?: string | null;
21
+ updatedAt: number;
22
+ latestVersion?: {
23
+ version: string;
24
+ } | null;
25
+ }): string;
26
+ export declare function clampLimit(limit: number, fallback?: number): number;