@skillbase/spm 0.1.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 (160) hide show
  1. package/CHANGELOG.md +341 -0
  2. package/LICENSE +21 -0
  3. package/README.md +90 -0
  4. package/dist/cli/commands/connect.d.ts +3 -0
  5. package/dist/cli/commands/connect.d.ts.map +1 -0
  6. package/dist/cli/commands/connect.js +95 -0
  7. package/dist/cli/commands/connect.js.map +1 -0
  8. package/dist/cli/commands/convert.d.ts +9 -0
  9. package/dist/cli/commands/convert.d.ts.map +1 -0
  10. package/dist/cli/commands/convert.js +189 -0
  11. package/dist/cli/commands/convert.js.map +1 -0
  12. package/dist/cli/commands/create.d.ts +4 -0
  13. package/dist/cli/commands/create.d.ts.map +1 -0
  14. package/dist/cli/commands/create.js +104 -0
  15. package/dist/cli/commands/create.js.map +1 -0
  16. package/dist/cli/commands/info.d.ts +2 -0
  17. package/dist/cli/commands/info.d.ts.map +1 -0
  18. package/dist/cli/commands/info.js +51 -0
  19. package/dist/cli/commands/info.js.map +1 -0
  20. package/dist/cli/commands/init.d.ts +4 -0
  21. package/dist/cli/commands/init.d.ts.map +1 -0
  22. package/dist/cli/commands/init.js +53 -0
  23. package/dist/cli/commands/init.js.map +1 -0
  24. package/dist/cli/commands/install.d.ts +6 -0
  25. package/dist/cli/commands/install.d.ts.map +1 -0
  26. package/dist/cli/commands/install.js +272 -0
  27. package/dist/cli/commands/install.js.map +1 -0
  28. package/dist/cli/commands/list.d.ts +4 -0
  29. package/dist/cli/commands/list.d.ts.map +1 -0
  30. package/dist/cli/commands/list.js +29 -0
  31. package/dist/cli/commands/list.js.map +1 -0
  32. package/dist/cli/commands/login.d.ts +10 -0
  33. package/dist/cli/commands/login.d.ts.map +1 -0
  34. package/dist/cli/commands/login.js +141 -0
  35. package/dist/cli/commands/login.js.map +1 -0
  36. package/dist/cli/commands/publish.d.ts +6 -0
  37. package/dist/cli/commands/publish.d.ts.map +1 -0
  38. package/dist/cli/commands/publish.js +109 -0
  39. package/dist/cli/commands/publish.js.map +1 -0
  40. package/dist/cli/commands/rate.d.ts +5 -0
  41. package/dist/cli/commands/rate.d.ts.map +1 -0
  42. package/dist/cli/commands/rate.js +22 -0
  43. package/dist/cli/commands/rate.js.map +1 -0
  44. package/dist/cli/commands/search.d.ts +5 -0
  45. package/dist/cli/commands/search.d.ts.map +1 -0
  46. package/dist/cli/commands/search.js +70 -0
  47. package/dist/cli/commands/search.js.map +1 -0
  48. package/dist/cli/commands/stats.d.ts +2 -0
  49. package/dist/cli/commands/stats.d.ts.map +1 -0
  50. package/dist/cli/commands/stats.js +33 -0
  51. package/dist/cli/commands/stats.js.map +1 -0
  52. package/dist/cli/commands/uninstall.d.ts +2 -0
  53. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  54. package/dist/cli/commands/uninstall.js +37 -0
  55. package/dist/cli/commands/uninstall.js.map +1 -0
  56. package/dist/cli/commands/update.d.ts +5 -0
  57. package/dist/cli/commands/update.d.ts.map +1 -0
  58. package/dist/cli/commands/update.js +97 -0
  59. package/dist/cli/commands/update.js.map +1 -0
  60. package/dist/cli/commands/validate.d.ts +2 -0
  61. package/dist/cli/commands/validate.d.ts.map +1 -0
  62. package/dist/cli/commands/validate.js +72 -0
  63. package/dist/cli/commands/validate.js.map +1 -0
  64. package/dist/cli/index.d.ts +3 -0
  65. package/dist/cli/index.d.ts.map +1 -0
  66. package/dist/cli/index.js +159 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/core/config.d.ts +7 -0
  69. package/dist/core/config.d.ts.map +1 -0
  70. package/dist/core/config.js +72 -0
  71. package/dist/core/config.js.map +1 -0
  72. package/dist/core/feedback.d.ts +22 -0
  73. package/dist/core/feedback.d.ts.map +1 -0
  74. package/dist/core/feedback.js +93 -0
  75. package/dist/core/feedback.js.map +1 -0
  76. package/dist/core/github/client.d.ts +18 -0
  77. package/dist/core/github/client.d.ts.map +1 -0
  78. package/dist/core/github/client.js +141 -0
  79. package/dist/core/github/client.js.map +1 -0
  80. package/dist/core/indexer.d.ts +4 -0
  81. package/dist/core/indexer.d.ts.map +1 -0
  82. package/dist/core/indexer.js +90 -0
  83. package/dist/core/indexer.js.map +1 -0
  84. package/dist/core/loader.d.ts +3 -0
  85. package/dist/core/loader.d.ts.map +1 -0
  86. package/dist/core/loader.js +37 -0
  87. package/dist/core/loader.js.map +1 -0
  88. package/dist/core/lock.d.ts +4 -0
  89. package/dist/core/lock.d.ts.map +1 -0
  90. package/dist/core/lock.js +86 -0
  91. package/dist/core/lock.js.map +1 -0
  92. package/dist/core/manifest.d.ts +6 -0
  93. package/dist/core/manifest.d.ts.map +1 -0
  94. package/dist/core/manifest.js +33 -0
  95. package/dist/core/manifest.js.map +1 -0
  96. package/dist/core/paths.d.ts +8 -0
  97. package/dist/core/paths.d.ts.map +1 -0
  98. package/dist/core/paths.js +30 -0
  99. package/dist/core/paths.js.map +1 -0
  100. package/dist/core/plugins/index.d.ts +8 -0
  101. package/dist/core/plugins/index.d.ts.map +1 -0
  102. package/dist/core/plugins/index.js +30 -0
  103. package/dist/core/plugins/index.js.map +1 -0
  104. package/dist/core/plugins/loader.d.ts +9 -0
  105. package/dist/core/plugins/loader.d.ts.map +1 -0
  106. package/dist/core/plugins/loader.js +57 -0
  107. package/dist/core/plugins/loader.js.map +1 -0
  108. package/dist/core/plugins/types.d.ts +79 -0
  109. package/dist/core/plugins/types.d.ts.map +1 -0
  110. package/dist/core/plugins/types.js +3 -0
  111. package/dist/core/plugins/types.js.map +1 -0
  112. package/dist/core/registry-client.d.ts +80 -0
  113. package/dist/core/registry-client.d.ts.map +1 -0
  114. package/dist/core/registry-client.js +166 -0
  115. package/dist/core/registry-client.js.map +1 -0
  116. package/dist/core/registry.d.ts +11 -0
  117. package/dist/core/registry.d.ts.map +1 -0
  118. package/dist/core/registry.js +44 -0
  119. package/dist/core/registry.js.map +1 -0
  120. package/dist/core/resolver.d.ts +17 -0
  121. package/dist/core/resolver.d.ts.map +1 -0
  122. package/dist/core/resolver.js +44 -0
  123. package/dist/core/resolver.js.map +1 -0
  124. package/dist/core/storage/index.d.ts +9 -0
  125. package/dist/core/storage/index.d.ts.map +1 -0
  126. package/dist/core/storage/index.js +34 -0
  127. package/dist/core/storage/index.js.map +1 -0
  128. package/dist/core/storage/local-provider.d.ts +12 -0
  129. package/dist/core/storage/local-provider.d.ts.map +1 -0
  130. package/dist/core/storage/local-provider.js +44 -0
  131. package/dist/core/storage/local-provider.js.map +1 -0
  132. package/dist/core/storage/packager.d.ts +10 -0
  133. package/dist/core/storage/packager.d.ts.map +1 -0
  134. package/dist/core/storage/packager.js +185 -0
  135. package/dist/core/storage/packager.js.map +1 -0
  136. package/dist/core/storage/s3-provider.d.ts +12 -0
  137. package/dist/core/storage/s3-provider.d.ts.map +1 -0
  138. package/dist/core/storage/s3-provider.js +84 -0
  139. package/dist/core/storage/s3-provider.js.map +1 -0
  140. package/dist/core/storage/types.d.ts +27 -0
  141. package/dist/core/storage/types.d.ts.map +1 -0
  142. package/dist/core/storage/types.js +4 -0
  143. package/dist/core/storage/types.js.map +1 -0
  144. package/dist/mcp/server.d.ts +3 -0
  145. package/dist/mcp/server.d.ts.map +1 -0
  146. package/dist/mcp/server.js +349 -0
  147. package/dist/mcp/server.js.map +1 -0
  148. package/dist/schema/skill-schema.d.ts +6 -0
  149. package/dist/schema/skill-schema.d.ts.map +1 -0
  150. package/dist/schema/skill-schema.js +147 -0
  151. package/dist/schema/skill-schema.js.map +1 -0
  152. package/dist/scripts/reindex.d.ts +3 -0
  153. package/dist/scripts/reindex.d.ts.map +1 -0
  154. package/dist/scripts/reindex.js +37 -0
  155. package/dist/scripts/reindex.js.map +1 -0
  156. package/dist/types/index.d.ts +191 -0
  157. package/dist/types/index.d.ts.map +1 -0
  158. package/dist/types/index.js +3 -0
  159. package/dist/types/index.js.map +1 -0
  160. package/package.json +62 -0
@@ -0,0 +1,272 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getGlobalSkillsDir, getProjectSkillsDir, getInstalledDir } from "../../core/paths.js";
4
+ import { validateSkillManifest } from "../../schema/skill-schema.js";
5
+ import { writeIndex } from "../../core/indexer.js";
6
+ import { writeLock } from "../../core/lock.js";
7
+ import { readConfig } from "../../core/config.js";
8
+ import { getClientForSkill } from "../../core/registry-client.js";
9
+ import { downloadSkillFiles, parseGitHubUrl } from "../../core/github/client.js";
10
+ import { unpackSkill, computeIntegrity } from "../../core/storage/packager.js";
11
+ import { resolveDependencies } from "../../core/resolver.js";
12
+ import { readManifest, addDependency } from "../../core/manifest.js";
13
+ async function copyDir(src, dest) {
14
+ await fs.mkdir(dest, { recursive: true });
15
+ const entries = await fs.readdir(src, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const srcPath = path.join(src, entry.name);
18
+ const destPath = path.join(dest, entry.name);
19
+ if (entry.isDirectory()) {
20
+ await copyDir(srcPath, destPath);
21
+ }
22
+ else {
23
+ await fs.copyFile(srcPath, destPath);
24
+ }
25
+ }
26
+ }
27
+ function isRemoteSource(source) {
28
+ // author/name pattern
29
+ if (/^[a-z0-9-]+\/[a-z0-9-]+$/.test(source))
30
+ return true;
31
+ // GitHub URLs
32
+ if (source.includes("github.com") || source.startsWith("github:"))
33
+ return true;
34
+ return false;
35
+ }
36
+ /** Parse "author/name" ref into parts. */
37
+ function parseSkillRef(ref) {
38
+ const match = ref.match(/^([a-z0-9-]+)\/([a-z0-9-]+)$/);
39
+ if (!match)
40
+ return null;
41
+ return { author: match[1], name: match[2] };
42
+ }
43
+ /** Determine the skills directory: project-local if .skills/ exists, otherwise global. */
44
+ async function resolveSkillsDir(forceGlobal) {
45
+ if (forceGlobal) {
46
+ return { skillsDir: getGlobalSkillsDir(), isProject: false };
47
+ }
48
+ const cwd = process.cwd();
49
+ const projectDir = getProjectSkillsDir(cwd);
50
+ try {
51
+ const stat = await fs.stat(projectDir);
52
+ if (stat.isDirectory()) {
53
+ return { skillsDir: projectDir, isProject: true };
54
+ }
55
+ }
56
+ catch {
57
+ // no project .skills/ — fall through to global
58
+ }
59
+ return { skillsDir: getGlobalSkillsDir(), isProject: false };
60
+ }
61
+ async function installFromLocal(skillPath, skillsDir) {
62
+ const src = path.resolve(skillPath);
63
+ const manifestPath = path.join(src, "skill.json");
64
+ let manifest;
65
+ try {
66
+ const raw = await fs.readFile(manifestPath, "utf-8");
67
+ const data = JSON.parse(raw);
68
+ const result = validateSkillManifest(data);
69
+ if (!result.valid) {
70
+ console.error("Invalid skill.json:");
71
+ for (const error of result.errors) {
72
+ console.error(` - ${error}`);
73
+ }
74
+ process.exit(1);
75
+ }
76
+ manifest = data;
77
+ }
78
+ catch (err) {
79
+ if (err instanceof Error && "code" in err) {
80
+ console.error(`Error: cannot read skill.json in "${skillPath}".`);
81
+ }
82
+ else {
83
+ throw err;
84
+ }
85
+ process.exit(1);
86
+ }
87
+ const author = manifest.author;
88
+ const installedDir = getInstalledDir(skillsDir);
89
+ const dest = path.join(installedDir, author, manifest.name);
90
+ await fs.rm(dest, { recursive: true, force: true });
91
+ await copyDir(src, dest);
92
+ const index = await writeIndex(skillsDir);
93
+ const lock = await writeLock(skillsDir);
94
+ console.log(`Installed ${author}/${manifest.name}@${manifest.version}`);
95
+ console.log(` ${index.skills.length} skill(s) indexed, ${lock.total_tokens_estimate} tokens total`);
96
+ }
97
+ async function installSingleFromRegistry(author, skillName, skillsDir, client, version) {
98
+ console.log(`Fetching ${author}/${skillName}${version ? `@${version}` : ""} from registry...`);
99
+ const downloadResult = await client.getDownloadUrl(author, skillName, version);
100
+ const manifest = downloadResult.manifest;
101
+ const installedDir = getInstalledDir(skillsDir);
102
+ const dest = path.join(installedDir, author, manifest.name);
103
+ await fs.rm(dest, { recursive: true, force: true });
104
+ if (!downloadResult.download_url) {
105
+ console.error("Error: registry returned no download URL. The skill may have been published without an archive.");
106
+ process.exit(1);
107
+ }
108
+ console.log("Downloading package...");
109
+ const archiveRes = await fetch(downloadResult.download_url);
110
+ if (!archiveRes.ok) {
111
+ throw new Error(`Failed to download package: ${archiveRes.status} ${archiveRes.statusText}`);
112
+ }
113
+ const archiveData = Buffer.from(await archiveRes.arrayBuffer());
114
+ if (downloadResult.integrity) {
115
+ const actual = computeIntegrity(archiveData);
116
+ if (actual !== downloadResult.integrity) {
117
+ console.error(`Error: integrity mismatch.`);
118
+ console.error(` Expected: ${downloadResult.integrity}`);
119
+ console.error(` Got: ${actual}`);
120
+ process.exit(1);
121
+ }
122
+ }
123
+ const files = await unpackSkill(archiveData, dest);
124
+ console.log(` Unpacked ${files.length} file(s), ${(archiveData.length / 1024).toFixed(1)} KB`);
125
+ return manifest;
126
+ }
127
+ async function installFromRegistry(skillRef, skillsDir, isProject, version) {
128
+ const parsed = parseSkillRef(skillRef);
129
+ if (!parsed) {
130
+ console.error(`Error: invalid skill reference "${skillRef}". Expected author/name.`);
131
+ process.exit(1);
132
+ }
133
+ const config = await readConfig();
134
+ const client = getClientForSkill(config, skillRef);
135
+ if (!client) {
136
+ console.error(`Error: no registry configured for "${skillRef}".`);
137
+ console.error("Use 'spm login <registry-url>' or 'spm registry add <url>' first.");
138
+ process.exit(1);
139
+ }
140
+ const manifest = await installSingleFromRegistry(parsed.author, parsed.name, skillsDir, client, version);
141
+ // Resolve and install dependencies
142
+ const deps = manifest.dependencies;
143
+ if (deps && Object.keys(deps).length > 0) {
144
+ const visited = new Set([`${parsed.author}/${manifest.name}`]);
145
+ const result = await resolveDependencies(deps, client, visited);
146
+ for (const dep of result.resolved) {
147
+ const depRef = parseSkillRef(dep.name);
148
+ if (!depRef)
149
+ continue;
150
+ console.log(` Dependency: ${dep.name}@${dep.resolved} (${dep.range})`);
151
+ const depClient = getClientForSkill(config, dep.name) ?? client;
152
+ const depManifest = await installSingleFromRegistry(depRef.author, depRef.name, skillsDir, depClient, dep.resolved);
153
+ // Recursively resolve nested dependencies
154
+ visited.add(dep.name);
155
+ if (depManifest.dependencies && Object.keys(depManifest.dependencies).length > 0) {
156
+ const nested = await resolveDependencies(depManifest.dependencies, depClient, visited);
157
+ for (const nd of nested.resolved) {
158
+ const ndRef = parseSkillRef(nd.name);
159
+ if (!ndRef)
160
+ continue;
161
+ console.log(` Dependency: ${nd.name}@${nd.resolved} (${nd.range})`);
162
+ const ndClient = getClientForSkill(config, nd.name) ?? client;
163
+ visited.add(nd.name);
164
+ await installSingleFromRegistry(ndRef.author, ndRef.name, skillsDir, ndClient, nd.resolved);
165
+ }
166
+ for (const m of nested.missing) {
167
+ console.warn(` Warning: dependency ${m.name} (${m.range}): ${m.reason}`);
168
+ }
169
+ }
170
+ }
171
+ for (const m of result.missing) {
172
+ console.warn(` Warning: dependency ${m.name} (${m.range}): ${m.reason}`);
173
+ }
174
+ }
175
+ // Add to skills.json when in project context
176
+ if (isProject) {
177
+ await addDependency(process.cwd(), skillRef, manifest.version);
178
+ }
179
+ const index = await writeIndex(skillsDir);
180
+ const lock = await writeLock(skillsDir);
181
+ console.log(`Installed ${parsed.author}/${manifest.name}@${manifest.version} from registry`);
182
+ console.log(` ${index.skills.length} skill(s) indexed, ${lock.total_tokens_estimate} tokens total`);
183
+ }
184
+ async function installFromGitHub(source, skillsDir, githubToken) {
185
+ const ghSource = parseGitHubUrl(source);
186
+ console.log(`Fetching from GitHub: ${ghSource.owner}/${ghSource.repo}${ghSource.path ? `/${ghSource.path}` : ""}...`);
187
+ const config = await readConfig();
188
+ const token = githubToken ?? config.github?.token;
189
+ const files = await downloadSkillFiles(ghSource, token);
190
+ // Parse manifest from downloaded files
191
+ const manifestRaw = files.get("skill.json");
192
+ if (!manifestRaw) {
193
+ console.error("Error: skill.json not found in GitHub source.");
194
+ process.exit(1);
195
+ }
196
+ const manifest = JSON.parse(manifestRaw);
197
+ const validation = validateSkillManifest(manifest);
198
+ if (!validation.valid) {
199
+ console.error("Invalid skill.json from GitHub:");
200
+ for (const error of validation.errors) {
201
+ console.error(` - ${error}`);
202
+ }
203
+ process.exit(1);
204
+ }
205
+ const author = manifest.author;
206
+ const installedDir = getInstalledDir(skillsDir);
207
+ const dest = path.join(installedDir, author, manifest.name);
208
+ await fs.rm(dest, { recursive: true, force: true });
209
+ await fs.mkdir(dest, { recursive: true });
210
+ // Write all files
211
+ for (const [filePath, content] of files) {
212
+ const fullPath = path.join(dest, filePath);
213
+ await fs.mkdir(path.dirname(fullPath), { recursive: true });
214
+ await fs.writeFile(fullPath, content, "utf-8");
215
+ }
216
+ const index = await writeIndex(skillsDir);
217
+ const lock = await writeLock(skillsDir);
218
+ console.log(`Installed ${author}/${manifest.name}@${manifest.version} from GitHub`);
219
+ console.log(` ${index.skills.length} skill(s) indexed, ${lock.total_tokens_estimate} tokens total`);
220
+ }
221
+ async function installAllFromManifest(skillsDir) {
222
+ const cwd = process.cwd();
223
+ const manifest = await readManifest(cwd);
224
+ if (!manifest) {
225
+ console.error("Error: no skill.json found. Run 'spm init --project' first.");
226
+ process.exit(1);
227
+ }
228
+ const entries = Object.entries(manifest.dependencies);
229
+ if (entries.length === 0) {
230
+ console.log("No dependencies in skill.json.");
231
+ return;
232
+ }
233
+ const config = await readConfig();
234
+ console.log(`Installing ${entries.length} skill(s) from skill.json...`);
235
+ for (const [skillRef] of entries) {
236
+ const parsed = parseSkillRef(skillRef);
237
+ if (!parsed) {
238
+ console.warn(` Skipping invalid ref: ${skillRef}`);
239
+ continue;
240
+ }
241
+ const client = getClientForSkill(config, skillRef);
242
+ if (!client) {
243
+ console.warn(` No registry for ${skillRef}, skipping.`);
244
+ continue;
245
+ }
246
+ await installSingleFromRegistry(parsed.author, parsed.name, skillsDir, client);
247
+ }
248
+ const index = await writeIndex(skillsDir);
249
+ const lock = await writeLock(skillsDir);
250
+ console.log(`Done. ${index.skills.length} skill(s) indexed, ${lock.total_tokens_estimate} tokens total`);
251
+ }
252
+ export async function installCommand(source, options) {
253
+ const { skillsDir, isProject } = await resolveSkillsDir(options.global);
254
+ // No source — install all from skill.json
255
+ if (!source) {
256
+ await installAllFromManifest(skillsDir);
257
+ return;
258
+ }
259
+ // GitHub URL
260
+ if (source.includes("github.com") || source.startsWith("github:")) {
261
+ await installFromGitHub(source, skillsDir, options.github);
262
+ return;
263
+ }
264
+ // Remote registry (author/name)
265
+ if (isRemoteSource(source)) {
266
+ await installFromRegistry(source, skillsDir, isProject, options.version);
267
+ return;
268
+ }
269
+ // Local path
270
+ await installFromLocal(source, skillsDir);
271
+ }
272
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAkB,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGrE,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,sBAAsB;IACtB,IAAI,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,cAAc;IACd,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0CAA0C;AAC1C,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,0FAA0F;AAC1F,KAAK,UAAU,gBAAgB,CAAC,WAAqB;IACnD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAElD,IAAI,QAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QACxC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,GAAG,IAAqB,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,qCAAqC,SAAS,IAAI,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,sBAAsB,IAAI,CAAC,qBAAqB,eAAe,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,MAAc,EACd,SAAiB,EACjB,SAAiB,EACjB,MAAsB,EACtB,OAAgB;IAEhB,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC/F,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/E,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAoC,CAAC;IAErE,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACjH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhE,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,cAAc,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,eAAe,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,aAAa,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEhG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,SAAiB,EACjB,SAAkB,EAClB,OAAgB;IAEhB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,QAAQ,0BAA0B,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEzG,mCAAmC;IACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;IACnC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEhE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACxE,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;YAChE,MAAM,WAAW,GAAG,MAAM,yBAAyB,CACjD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,IAAI,EACX,SAAS,EACT,SAAS,EACT,GAAG,CAAC,QAAQ,CACb,CAAC;YAEF,0CAA0C;YAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,WAAW,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBACvF,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACjC,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,CAAC,KAAK;wBAAE,SAAS;oBACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;oBACrE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;oBAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACrB,MAAM,yBAAyB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAC9F,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,sBAAsB,IAAI,CAAC,qBAAqB,eAAe,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAc,EACd,SAAiB,EACjB,WAAoB;IAEpB,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEtH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAElD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAExD,uCAAuC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAkB,CAAC;IAC1D,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,kBAAkB;IAClB,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,sBAAsB,IAAI,CAAC,qBAAqB,eAAe,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,SAAiB;IAEjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,aAAa,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,MAAM,yBAAyB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,MAAM,sBAAsB,IAAI,CAAC,qBAAqB,eAAe,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA0B,EAC1B,OAAgE;IAEhE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExE,0CAA0C;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,aAAa;IACb,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClE,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,gCAAgC;IAChC,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,aAAa;IACb,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function listCommand(options: {
2
+ verbose?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E"}
@@ -0,0 +1,29 @@
1
+ import { getSkillIndex } from "../../core/registry.js";
2
+ export async function listCommand(options) {
3
+ const index = await getSkillIndex();
4
+ if (index.skills.length === 0) {
5
+ console.log("No skills installed.");
6
+ return;
7
+ }
8
+ if (options.verbose) {
9
+ for (const skill of index.skills) {
10
+ console.log(`${skill.name}@${skill.v}`);
11
+ console.log(` trigger: ${skill.trigger}`);
12
+ console.log(` tags: ${skill.tags.join(", ")}`);
13
+ console.log(` priority: ${skill.priority}`);
14
+ console.log(` tokens: ~${skill.tokens_estimate}`);
15
+ if (skill.file_patterns) {
16
+ console.log(` patterns: ${skill.file_patterns.join(", ")}`);
17
+ }
18
+ console.log();
19
+ }
20
+ }
21
+ else {
22
+ for (const skill of index.skills) {
23
+ const tokens = String(skill.tokens_estimate).padStart(5);
24
+ console.log(` ${skill.name}@${skill.v} ${tokens} tokens [${skill.tags.join(", ")}]`);
25
+ }
26
+ console.log(`\n${index.skills.length} skill(s) installed`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA8B;IAC9D,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IAEpC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function loginCommand(registryUrl: string | undefined, options: {
2
+ name?: string;
3
+ github?: boolean;
4
+ }): Promise<void>;
5
+ export declare function addRegistryCommand(registryUrl: string, options: {
6
+ name?: string;
7
+ token?: string;
8
+ scope?: string;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAqDA,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAQf;AAyFD,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,141 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readConfig, writeConfig } from "../../core/config.js";
3
+ import { RegistryClient } from "../../core/registry-client.js";
4
+ function resolveRegistryName(registryUrl) {
5
+ const urlObj = new URL(registryUrl);
6
+ return urlObj.hostname.replace(/\./g, "-");
7
+ }
8
+ async function saveTokenToConfig(registryUrl, token) {
9
+ const config = await readConfig();
10
+ const registryName = resolveRegistryName(registryUrl);
11
+ const existingIdx = config.registries.findIndex((r) => r.url === registryUrl);
12
+ if (existingIdx >= 0) {
13
+ config.registries[existingIdx].token = token;
14
+ }
15
+ else {
16
+ config.registries.push({ name: registryName, url: registryUrl, token });
17
+ }
18
+ if (!config.scopes["*"] || config.scopes["*"] === "public") {
19
+ config.scopes["*"] = registryName;
20
+ }
21
+ await writeConfig(config);
22
+ return registryName;
23
+ }
24
+ async function resolveRegistryUrl(registryUrl) {
25
+ if (registryUrl)
26
+ return registryUrl;
27
+ const config = await readConfig();
28
+ if (config.registries.length === 0) {
29
+ console.error("Error: no registries configured. Specify a registry URL or run: skills registry add <url>");
30
+ process.exit(1);
31
+ }
32
+ if (config.registries.length === 1) {
33
+ return config.registries[0].url;
34
+ }
35
+ console.log("Available registries:");
36
+ for (let i = 0; i < config.registries.length; i++) {
37
+ console.log(` [${i + 1}] ${config.registries[i].name} (${config.registries[i].url})`);
38
+ }
39
+ console.error("Error: multiple registries configured. Specify the URL: skills login <registry-url>");
40
+ process.exit(1);
41
+ }
42
+ export async function loginCommand(registryUrl, options) {
43
+ const url = await resolveRegistryUrl(registryUrl);
44
+ if (options.github) {
45
+ await loginWithGithub(url);
46
+ }
47
+ else {
48
+ await loginWithName(url, options.name);
49
+ }
50
+ }
51
+ async function loginWithName(registryUrl, name) {
52
+ if (!name) {
53
+ console.error("Error: --name is required for direct registration.");
54
+ console.error("Or use --github to authenticate via GitHub.");
55
+ process.exit(1);
56
+ }
57
+ const client = new RegistryClient(registryUrl);
58
+ try {
59
+ const result = await client.register(name);
60
+ console.log(`Registered as "${result.author.name}" (id: ${result.author.id})`);
61
+ const registryName = await saveTokenToConfig(registryUrl, result.token);
62
+ console.log(`Token saved to config (registry: ${registryName})`);
63
+ console.log(`\nYou can now publish skills with: skills publish <path>`);
64
+ }
65
+ catch (err) {
66
+ const message = err instanceof Error ? err.message : String(err);
67
+ console.error(`Login failed: ${message}`);
68
+ process.exit(1);
69
+ }
70
+ }
71
+ function openBrowser(url) {
72
+ const cmd = process.platform === "darwin"
73
+ ? "open"
74
+ : process.platform === "win32"
75
+ ? "cmd"
76
+ : "xdg-open";
77
+ const args = process.platform === "win32" ? ["/c", "start", url] : [url];
78
+ try {
79
+ execFile(cmd, args, () => { });
80
+ }
81
+ catch {
82
+ // Best-effort, user can open manually
83
+ }
84
+ }
85
+ async function loginWithGithub(registryUrl) {
86
+ const client = new RegistryClient(registryUrl);
87
+ try {
88
+ const device = await client.startDeviceAuth();
89
+ console.log(`\nOpen this URL in your browser:\n`);
90
+ console.log(` ${device.verification_uri}\n`);
91
+ console.log(`And enter the code: ${device.user_code}\n`);
92
+ openBrowser(device.verification_uri);
93
+ console.log("Waiting for authorization...");
94
+ let interval = device.interval * 1000;
95
+ while (true) {
96
+ await new Promise((resolve) => setTimeout(resolve, interval));
97
+ const poll = await client.pollDeviceAuth(device.session_id);
98
+ if (poll.status === "complete" && poll.author && poll.token) {
99
+ console.log(`\nAuthenticated as "${poll.author.name}" (id: ${poll.author.id})`);
100
+ const registryName = await saveTokenToConfig(registryUrl, poll.token);
101
+ console.log(`Token saved to config (registry: ${registryName})`);
102
+ console.log(`\nYou can now publish skills with: skills publish <path>`);
103
+ return;
104
+ }
105
+ if (poll.interval) {
106
+ interval = poll.interval * 1000;
107
+ }
108
+ }
109
+ }
110
+ catch (err) {
111
+ const message = err instanceof Error ? err.message : String(err);
112
+ console.error(`GitHub login failed: ${message}`);
113
+ process.exit(1);
114
+ }
115
+ }
116
+ export async function addRegistryCommand(registryUrl, options) {
117
+ const config = await readConfig();
118
+ const urlObj = new URL(registryUrl);
119
+ const registryName = options.name ?? urlObj.hostname.replace(/\./g, "-");
120
+ const existingIdx = config.registries.findIndex((r) => r.name === registryName);
121
+ if (existingIdx >= 0) {
122
+ config.registries[existingIdx].url = registryUrl;
123
+ if (options.token)
124
+ config.registries[existingIdx].token = options.token;
125
+ console.log(`Updated registry "${registryName}"`);
126
+ }
127
+ else {
128
+ config.registries.push({
129
+ name: registryName,
130
+ url: registryUrl,
131
+ token: options.token,
132
+ });
133
+ console.log(`Added registry "${registryName}" (${registryUrl})`);
134
+ }
135
+ if (options.scope) {
136
+ config.scopes[options.scope] = registryName;
137
+ console.log(`Scope "${options.scope}" → "${registryName}"`);
138
+ }
139
+ await writeConfig(config);
140
+ }
141
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function publishCommand(source: string, options: {
2
+ registry?: string;
3
+ github?: boolean;
4
+ dryRun?: boolean;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AAeA,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CAmHf"}
@@ -0,0 +1,109 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { readConfig } from "../../core/config.js";
4
+ import { validateSkillManifest } from "../../schema/skill-schema.js";
5
+ import { RegistryClient } from "../../core/registry-client.js";
6
+ import { packSkill } from "../../core/storage/index.js";
7
+ import { parseGitHubUrl } from "../../core/github/client.js";
8
+ function formatSize(bytes) {
9
+ if (bytes < 1024)
10
+ return `${bytes} B`;
11
+ if (bytes < 1024 * 1024)
12
+ return `${(bytes / 1024).toFixed(1)} KB`;
13
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
14
+ }
15
+ export async function publishCommand(source, options) {
16
+ const config = await readConfig();
17
+ let registryName = options.registry;
18
+ if (!registryName) {
19
+ registryName = config.scopes["*"];
20
+ }
21
+ if (!registryName) {
22
+ console.error("Error: no default registry configured. Use 'skills login <url>' first.");
23
+ process.exit(1);
24
+ }
25
+ const reg = config.registries.find((r) => r.name === registryName);
26
+ if (!reg) {
27
+ console.error(`Error: registry "${registryName}" not found in config.`);
28
+ process.exit(1);
29
+ }
30
+ if (!reg.token) {
31
+ console.error(`Error: no token for registry "${registryName}". Use 'skills login' first.`);
32
+ process.exit(1);
33
+ }
34
+ const client = new RegistryClient(reg.url, reg.token);
35
+ const isGitHub = options.github || source.includes("github.com") || source.startsWith("github:");
36
+ if (isGitHub) {
37
+ console.log(`Publishing from GitHub: ${source}`);
38
+ const ghSource = parseGitHubUrl(source);
39
+ const result = await client.publish({
40
+ manifest: {},
41
+ content: "",
42
+ source: {
43
+ type: "github",
44
+ url: source,
45
+ ref: ghSource.ref,
46
+ path: ghSource.path,
47
+ },
48
+ });
49
+ console.log(result.updated
50
+ ? `Updated ${result.name}@${result.version}`
51
+ : `Published ${result.name}@${result.version}`);
52
+ return;
53
+ }
54
+ const skillDir = path.resolve(source);
55
+ const manifestPath = path.join(skillDir, "skill.json");
56
+ let manifest;
57
+ try {
58
+ const raw = await fs.readFile(manifestPath, "utf-8");
59
+ const data = JSON.parse(raw);
60
+ const validation = validateSkillManifest(data);
61
+ if (!validation.valid) {
62
+ console.error("Invalid skill.json:");
63
+ for (const error of validation.errors) {
64
+ console.error(` - ${error}`);
65
+ }
66
+ process.exit(1);
67
+ }
68
+ manifest = data;
69
+ }
70
+ catch (err) {
71
+ if (err.code === "ENOENT") {
72
+ console.error(`Error: cannot read skill.json in "${source}".`);
73
+ process.exit(1);
74
+ }
75
+ throw err;
76
+ }
77
+ if (!manifest.entry) {
78
+ console.error("Error: skill.json has no 'entry' field. Bundles cannot be published — only skills with an entry point.");
79
+ process.exit(1);
80
+ }
81
+ const entryPath = path.join(skillDir, manifest.entry);
82
+ const content = await fs.readFile(entryPath, "utf-8");
83
+ let compactContent;
84
+ if (manifest.compact_entry) {
85
+ try {
86
+ compactContent = await fs.readFile(path.join(skillDir, manifest.compact_entry), "utf-8");
87
+ }
88
+ catch {
89
+ // Optional
90
+ }
91
+ }
92
+ // Package skill directory into .tar.gz
93
+ console.log(`Packaging ${manifest.name}@${manifest.version}...`);
94
+ const pkg = await packSkill(skillDir);
95
+ if (options.dryRun) {
96
+ console.log(`[dry-run] Would publish ${manifest.name}@${manifest.version} to ${reg.name}`);
97
+ console.log(` Package size: ${formatSize(pkg.size)} (${pkg.filesCount} files)`);
98
+ console.log(` Integrity: ${pkg.integrity}`);
99
+ return;
100
+ }
101
+ console.log(`Publishing ${manifest.name}@${manifest.version} to ${reg.name}...`);
102
+ const result = await client.publishWithArchive({ manifest, content, compact_content: compactContent }, pkg.data);
103
+ console.log(result.updated
104
+ ? `Updated ${result.name}@${result.version}`
105
+ : `Published ${result.name}@${result.version}`);
106
+ console.log(` Size: ${formatSize(result.size ?? pkg.size)}`);
107
+ console.log(` Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
108
+ }
109
+ //# 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,5 @@
1
+ export declare function rateCommand(name: string, options: {
2
+ score: string;
3
+ comment?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=rate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rate.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CAuBf"}