@aexol/opencode-wizard 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -60,7 +60,7 @@ Published skill fetches still support `refresh: true`, but normal cache entries
|
|
|
60
60
|
|
|
61
61
|
Use `opencode_wizard_artifact_preference_set` or compatibility `opencode_wizard_published_skill_preference_set` for preference actions (`install`, `uninstall`, `ignore`, `unignore`); the TUI panel stays information-only and does not expose those mutations.
|
|
62
62
|
|
|
63
|
-
Editors can import external artifacts without writing project files via `opencode_wizard_artifact_import`: use `source: "npx getdesign@latest add bmw-m"` for a `DESIGN_DOC`, or `source: "https://github.com/vercel-labs/skills --skill
|
|
63
|
+
Editors can import external artifacts without writing project files via `opencode_wizard_artifact_import`: use `source: "npx getdesign@latest add bmw-m"` for a `DESIGN_DOC`, or `source: "https://github.com/vercel-labs/agent-skills --skill react-best-practices"` for a `SKILL`. The plugin import path is a command/raw-source bridge into generic backend artifact persistence: it fetches markdown or a zip-backed `SKILL.md`/`README.md`, sends it to the backend import mutation, records the importing editor in existing created/published actor fields plus source metadata, and the imported backend artifact becomes the runtime authority. The admin Skills Catalog UI can browse Vercel, Skillta, and Design Docs sources and unzip archives in the browser; the plugin keeps generic `artifact` tool naming because the same backend artifact flow supports both `SKILL` and `DESIGN_DOC`.
|
|
64
64
|
|
|
65
65
|
`GLOBAL_CONTEXT` skills are active context skills and are not meant to be installed per project. `PROJECT_INSTALLABLE` skills are gallery/installable skills that may be attached globally or to a workspace/path through assignment records; those assignments remain the source of truth for what is active in a catalog response.
|
|
66
66
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { strFromU8, unzipSync } from 'fflate';
|
|
1
2
|
const GETDESIGN_RAW_BASE = 'https://raw.githubusercontent.com/VoltAgent/awesome-design-md/main/design-md';
|
|
3
|
+
const ZIP_MARKDOWN_FILE_PRIORITY = ['SKILL.md', 'skill.md', 'Skill.md', 'README.md', 'readme.md'];
|
|
2
4
|
const tokenizeCommandLikeInput = input => {
|
|
3
5
|
const tokens = input.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) ?? [];
|
|
4
6
|
return tokens.map(token => token.replace(/^("|')|("|')$/g, ''));
|
|
@@ -34,8 +36,46 @@ const toRawGithubUrl = inputUrl => {
|
|
|
34
36
|
}
|
|
35
37
|
return null;
|
|
36
38
|
};
|
|
39
|
+
const isZipUrl = inputUrl => {
|
|
40
|
+
try {
|
|
41
|
+
return new URL(inputUrl).pathname.toLowerCase().endsWith('.zip');
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
const zipSourceRef = (sourceRef, markdownPath) => {
|
|
47
|
+
const separator = sourceRef.includes('#') ? '&' : '#';
|
|
48
|
+
return `${sourceRef}${separator}path=${encodeURIComponent(markdownPath)}`;
|
|
49
|
+
};
|
|
50
|
+
const zipPathDepth = entryPath => entryPath.split('/').filter(Boolean).length;
|
|
51
|
+
const selectZipMarkdownEntry = archive => {
|
|
52
|
+
const candidates = Object.entries(archive).map(([entryPath, bytes]) => {
|
|
53
|
+
const fileName = entryPath.split('/').filter(Boolean).at(-1) ?? '';
|
|
54
|
+
const priority = ZIP_MARKDOWN_FILE_PRIORITY.indexOf(fileName);
|
|
55
|
+
if (priority < 0) return null;
|
|
56
|
+
return {
|
|
57
|
+
path: entryPath,
|
|
58
|
+
content: strFromU8(bytes),
|
|
59
|
+
priority,
|
|
60
|
+
depth: zipPathDepth(entryPath)
|
|
61
|
+
};
|
|
62
|
+
}).filter(candidate => candidate !== null).sort((left, right) => {
|
|
63
|
+
if (left.priority !== right.priority) return left.priority - right.priority;
|
|
64
|
+
if (left.depth !== right.depth) return left.depth - right.depth;
|
|
65
|
+
if (left.path.length !== right.path.length) return left.path.length - right.path.length;
|
|
66
|
+
return left.path.localeCompare(right.path);
|
|
67
|
+
});
|
|
68
|
+
return candidates[0] ?? null;
|
|
69
|
+
};
|
|
70
|
+
const extractMarkdownFromZip = bytes => {
|
|
71
|
+
const archive = unzipSync(new Uint8Array(bytes));
|
|
72
|
+
const selectedEntry = selectZipMarkdownEntry(archive);
|
|
73
|
+
if (!selectedEntry) throw new Error('No SKILL.md or README.md markdown file found in zip archive.');
|
|
74
|
+
return selectedEntry;
|
|
75
|
+
};
|
|
37
76
|
const buildGithubSkillCandidateUrls = (sourceUrl, skill) => {
|
|
38
77
|
const parsedUrl = new URL(sourceUrl);
|
|
78
|
+
if (isZipUrl(sourceUrl)) return [sourceUrl];
|
|
39
79
|
if (parsedUrl.hostname === 'raw.githubusercontent.com') return [parsedUrl.toString()];
|
|
40
80
|
if (parsedUrl.hostname !== 'github.com') return [sourceUrl];
|
|
41
81
|
const rawUrl = toRawGithubUrl(sourceUrl);
|
|
@@ -101,6 +141,15 @@ export const fetchWizardArtifactImportSource = async input => {
|
|
|
101
141
|
errors.push(`${candidateUrl}: HTTP ${response.status}`);
|
|
102
142
|
continue;
|
|
103
143
|
}
|
|
144
|
+
if (isZipUrl(candidateUrl)) {
|
|
145
|
+
const zipMarkdown = extractMarkdownFromZip(await response.arrayBuffer());
|
|
146
|
+
return {
|
|
147
|
+
...plan,
|
|
148
|
+
markdownContent: zipMarkdown.content,
|
|
149
|
+
fetchedUrl: candidateUrl,
|
|
150
|
+
sourceRef: zipSourceRef(plan.sourceRef, zipMarkdown.path)
|
|
151
|
+
};
|
|
152
|
+
}
|
|
104
153
|
return {
|
|
105
154
|
...plan,
|
|
106
155
|
markdownContent: await response.text(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["GETDESIGN_RAW_BASE","tokenizeCommandLikeInput","input","tokens","match","map","token","replace","normalizeSlug","value","trim","toLowerCase","parseOptionValue","optionName","inlinePrefix","inlineToken","find","startsWith","slice","length","optionIndex","indexOf","toWizardArtifactKind","normalized","toUpperCase","Error","firstUrlToken","test","toRawGithubUrl","inputUrl","parsedUrl","URL","hostname","toString","parts","pathname","split","filter","Boolean","owner","repo","marker","branch","rest","join","buildGithubSkillCandidateUrls","sourceUrl","skill","rawUrl","endsWith","treePathParts","branches","treePath","skillSlug","paths","Set","add","flatMap","candidateBranch","candidatePath","planWizardArtifactImport","source","optionSkill","getdesignSlug","index","inferredKind","includes","artifactKind","rawSlug","slug","directUrl","candidateUrls","sourceRef","fetchWizardArtifactImportSource","plan","errors","candidateUrl","response","fetch","signal","ok","push","status","markdownContent","text","fetchedUrl","error","message"],"sources":["../../src/server/import-sources.ts"],"sourcesContent":["import type { WizardArtifactKind } from './types.js';\n\ntype ImportSourcePlan = {\n artifactKind: WizardArtifactKind;\n slug: string | null;\n skill: string | null;\n source: string;\n sourceRef: string;\n candidateUrls: string[];\n};\n\nexport type ResolvedImportSource = ImportSourcePlan & {\n markdownContent: string;\n fetchedUrl: string;\n};\n\nconst GETDESIGN_RAW_BASE = 'https://raw.githubusercontent.com/VoltAgent/awesome-design-md/main/design-md';\n\nconst tokenizeCommandLikeInput = (input: string): string[] => {\n const tokens = input.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) ?? [];\n return tokens.map((token) => token.replace(/^(\"|')|(\"|')$/g, ''));\n};\n\nconst normalizeSlug = (value: string): string => {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\nconst parseOptionValue = (tokens: string[], optionName: string): string | null => {\n const inlinePrefix = `${optionName}=`;\n const inlineToken = tokens.find((token) => token.startsWith(inlinePrefix));\n if (inlineToken) return inlineToken.slice(inlinePrefix.length) || null;\n\n const optionIndex = tokens.indexOf(optionName);\n if (optionIndex < 0) return null;\n return tokens[optionIndex + 1] ?? null;\n};\n\nconst toWizardArtifactKind = (value: string): WizardArtifactKind => {\n const normalized = value.trim().toUpperCase();\n if (normalized === 'SKILL' || normalized === 'DESIGN_DOC') return normalized;\n throw new Error('artifactKind must be SKILL or DESIGN_DOC.');\n};\n\nconst firstUrlToken = (tokens: string[]): string | null => {\n return tokens.find((token) => /^https?:\\/\\//i.test(token)) ?? null;\n};\n\nconst toRawGithubUrl = (inputUrl: string): string | null => {\n const parsedUrl = new URL(inputUrl);\n if (parsedUrl.hostname === 'raw.githubusercontent.com') return parsedUrl.toString();\n if (parsedUrl.hostname !== 'github.com') return null;\n\n const parts = parsedUrl.pathname.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const [owner, repo, marker, branch, ...rest] = parts;\n if (marker === 'blob' || marker === 'tree') {\n return `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${rest.join('/')}`;\n }\n\n return null;\n};\n\nconst buildGithubSkillCandidateUrls = (sourceUrl: string, skill: string | null): string[] => {\n const parsedUrl = new URL(sourceUrl);\n if (parsedUrl.hostname === 'raw.githubusercontent.com') return [parsedUrl.toString()];\n if (parsedUrl.hostname !== 'github.com') return [sourceUrl];\n\n const rawUrl = toRawGithubUrl(sourceUrl);\n if (rawUrl?.endsWith('/SKILL.md')) return [rawUrl];\n\n const parts = parsedUrl.pathname.split('/').filter(Boolean);\n const [owner, repo, marker, branch, ...treePathParts] = parts;\n const branches = marker === 'tree' && branch ? [branch] : ['main', 'master'];\n const treePath = marker === 'tree' ? treePathParts.join('/') : '';\n const skillSlug = skill ? normalizeSlug(skill) : null;\n const paths = new Set<string>();\n\n if (treePath) paths.add(`${treePath}/SKILL.md`);\n if (!treePath) paths.add('SKILL.md');\n if (skillSlug) {\n paths.add(`skills/${skillSlug}/SKILL.md`);\n paths.add(`.agents/skills/${skillSlug}/SKILL.md`);\n if (treePath) paths.add(`${treePath}/skills/${skillSlug}/SKILL.md`);\n if (treePath) paths.add(`${treePath}/.agents/skills/${skillSlug}/SKILL.md`);\n }\n\n return branches.flatMap((candidateBranch) =>\n [...paths].map((candidatePath) => `https://raw.githubusercontent.com/${owner}/${repo}/${candidateBranch}/${candidatePath}`),\n );\n};\n\nexport const planWizardArtifactImport = (input: {\n artifactKind?: string;\n source: string;\n slug?: string;\n skill?: string;\n}): ImportSourcePlan => {\n const source = input.source.trim();\n const tokens = tokenizeCommandLikeInput(source);\n const optionSkill = parseOptionValue(tokens, '--skill');\n const skill = input.skill?.trim() || optionSkill || null;\n const getdesignSlug = tokens.find((token, index) => tokens[index - 1] === 'add' && !token.startsWith('-')) ?? null;\n const inferredKind: WizardArtifactKind = source.includes('getdesign') ? 'DESIGN_DOC' : 'SKILL';\n const artifactKind = input.artifactKind ? toWizardArtifactKind(input.artifactKind) : inferredKind;\n\n if (artifactKind === 'DESIGN_DOC') {\n const rawSlug = input.slug?.trim() || getdesignSlug;\n if (!rawSlug) throw new Error('DESIGN_DOC import requires a slug or a getdesign `add <slug>` input.');\n const slug = normalizeSlug(rawSlug);\n const directUrl = firstUrlToken(tokens);\n const candidateUrls = directUrl ? [toRawGithubUrl(directUrl) ?? directUrl] : [`${GETDESIGN_RAW_BASE}/${slug}/DESIGN.md`];\n return { artifactKind, slug, skill: null, source, sourceRef: directUrl ?? `getdesign:${slug}`, candidateUrls };\n }\n\n const sourceUrl = firstUrlToken(tokens) ?? source;\n return {\n artifactKind: 'SKILL',\n slug: input.slug ? normalizeSlug(input.slug) : null,\n skill,\n source,\n sourceRef: skill ? `${sourceUrl}#skill=${skill}` : sourceUrl,\n candidateUrls: buildGithubSkillCandidateUrls(sourceUrl, skill),\n };\n};\n\nexport const fetchWizardArtifactImportSource = async (input: {\n artifactKind?: string;\n source: string;\n slug?: string;\n skill?: string;\n signal: AbortSignal;\n}): Promise<ResolvedImportSource> => {\n const plan = planWizardArtifactImport(input);\n const errors: string[] = [];\n\n for (const candidateUrl of plan.candidateUrls) {\n try {\n const response = await fetch(candidateUrl, { signal: input.signal });\n if (!response.ok) {\n errors.push(`${candidateUrl}: HTTP ${response.status}`);\n continue;\n }\n\n return { ...plan, markdownContent: await response.text(), fetchedUrl: candidateUrl };\n } catch (error) {\n errors.push(`${candidateUrl}: ${error instanceof Error ? error.message : 'Unknown fetch error'}`);\n }\n }\n\n throw new Error(`Could not fetch import source. Tried: ${errors.join('; ')}`);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["strFromU8","unzipSync","GETDESIGN_RAW_BASE","ZIP_MARKDOWN_FILE_PRIORITY","tokenizeCommandLikeInput","input","tokens","match","map","token","replace","normalizeSlug","value","trim","toLowerCase","parseOptionValue","optionName","inlinePrefix","inlineToken","find","startsWith","slice","length","optionIndex","indexOf","toWizardArtifactKind","normalized","toUpperCase","Error","firstUrlToken","test","toRawGithubUrl","inputUrl","parsedUrl","URL","hostname","toString","parts","pathname","split","filter","Boolean","owner","repo","marker","branch","rest","join","isZipUrl","endsWith","zipSourceRef","sourceRef","markdownPath","separator","includes","encodeURIComponent","zipPathDepth","entryPath","selectZipMarkdownEntry","archive","candidates","Object","entries","bytes","fileName","at","priority","path","content","depth","candidate","sort","left","right","localeCompare","extractMarkdownFromZip","Uint8Array","selectedEntry","buildGithubSkillCandidateUrls","sourceUrl","skill","rawUrl","treePathParts","branches","treePath","skillSlug","paths","Set","add","flatMap","candidateBranch","candidatePath","planWizardArtifactImport","source","optionSkill","getdesignSlug","index","inferredKind","artifactKind","rawSlug","slug","directUrl","candidateUrls","fetchWizardArtifactImportSource","plan","errors","candidateUrl","response","fetch","signal","ok","push","status","zipMarkdown","arrayBuffer","markdownContent","fetchedUrl","text","error","message"],"sources":["../../src/server/import-sources.ts"],"sourcesContent":["import { strFromU8, unzipSync } from 'fflate';\nimport type { WizardArtifactKind } from './types.js';\n\ntype ImportSourcePlan = {\n artifactKind: WizardArtifactKind;\n slug: string | null;\n skill: string | null;\n source: string;\n sourceRef: string;\n candidateUrls: string[];\n};\n\nexport type ResolvedImportSource = ImportSourcePlan & {\n markdownContent: string;\n fetchedUrl: string;\n};\n\nconst GETDESIGN_RAW_BASE = 'https://raw.githubusercontent.com/VoltAgent/awesome-design-md/main/design-md';\nconst ZIP_MARKDOWN_FILE_PRIORITY = ['SKILL.md', 'skill.md', 'Skill.md', 'README.md', 'readme.md'] as const;\n\nconst tokenizeCommandLikeInput = (input: string): string[] => {\n const tokens = input.match(/(?:[^\\s\"']+|\"[^\"]*\"|'[^']*')+/g) ?? [];\n return tokens.map((token) => token.replace(/^(\"|')|(\"|')$/g, ''));\n};\n\nconst normalizeSlug = (value: string): string => {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n};\n\nconst parseOptionValue = (tokens: string[], optionName: string): string | null => {\n const inlinePrefix = `${optionName}=`;\n const inlineToken = tokens.find((token) => token.startsWith(inlinePrefix));\n if (inlineToken) return inlineToken.slice(inlinePrefix.length) || null;\n\n const optionIndex = tokens.indexOf(optionName);\n if (optionIndex < 0) return null;\n return tokens[optionIndex + 1] ?? null;\n};\n\nconst toWizardArtifactKind = (value: string): WizardArtifactKind => {\n const normalized = value.trim().toUpperCase();\n if (normalized === 'SKILL' || normalized === 'DESIGN_DOC') return normalized;\n throw new Error('artifactKind must be SKILL or DESIGN_DOC.');\n};\n\nconst firstUrlToken = (tokens: string[]): string | null => {\n return tokens.find((token) => /^https?:\\/\\//i.test(token)) ?? null;\n};\n\nconst toRawGithubUrl = (inputUrl: string): string | null => {\n const parsedUrl = new URL(inputUrl);\n if (parsedUrl.hostname === 'raw.githubusercontent.com') return parsedUrl.toString();\n if (parsedUrl.hostname !== 'github.com') return null;\n\n const parts = parsedUrl.pathname.split('/').filter(Boolean);\n if (parts.length < 2) return null;\n\n const [owner, repo, marker, branch, ...rest] = parts;\n if (marker === 'blob' || marker === 'tree') {\n return `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${rest.join('/')}`;\n }\n\n return null;\n};\n\nconst isZipUrl = (inputUrl: string): boolean => {\n try {\n return new URL(inputUrl).pathname.toLowerCase().endsWith('.zip');\n } catch {\n return false;\n }\n};\n\nconst zipSourceRef = (sourceRef: string, markdownPath: string): string => {\n const separator = sourceRef.includes('#') ? '&' : '#';\n return `${sourceRef}${separator}path=${encodeURIComponent(markdownPath)}`;\n};\n\nconst zipPathDepth = (entryPath: string): number => entryPath.split('/').filter(Boolean).length;\n\nconst selectZipMarkdownEntry = (archive: Record<string, Uint8Array>): { path: string; content: string } | null => {\n const candidates = Object.entries(archive)\n .map(([entryPath, bytes]) => {\n const fileName = entryPath.split('/').filter(Boolean).at(-1) ?? '';\n const priority = ZIP_MARKDOWN_FILE_PRIORITY.indexOf(fileName as (typeof ZIP_MARKDOWN_FILE_PRIORITY)[number]);\n if (priority < 0) return null;\n\n return {\n path: entryPath,\n content: strFromU8(bytes),\n priority,\n depth: zipPathDepth(entryPath),\n };\n })\n .filter((candidate): candidate is { path: string; content: string; priority: number; depth: number } => candidate !== null)\n .sort((left, right) => {\n if (left.priority !== right.priority) return left.priority - right.priority;\n if (left.depth !== right.depth) return left.depth - right.depth;\n if (left.path.length !== right.path.length) return left.path.length - right.path.length;\n return left.path.localeCompare(right.path);\n });\n\n return candidates[0] ?? null;\n};\n\nconst extractMarkdownFromZip = (bytes: ArrayBuffer): { path: string; content: string } => {\n const archive = unzipSync(new Uint8Array(bytes));\n const selectedEntry = selectZipMarkdownEntry(archive);\n if (!selectedEntry) throw new Error('No SKILL.md or README.md markdown file found in zip archive.');\n return selectedEntry;\n};\n\nconst buildGithubSkillCandidateUrls = (sourceUrl: string, skill: string | null): string[] => {\n const parsedUrl = new URL(sourceUrl);\n if (isZipUrl(sourceUrl)) return [sourceUrl];\n if (parsedUrl.hostname === 'raw.githubusercontent.com') return [parsedUrl.toString()];\n if (parsedUrl.hostname !== 'github.com') return [sourceUrl];\n\n const rawUrl = toRawGithubUrl(sourceUrl);\n if (rawUrl?.endsWith('/SKILL.md')) return [rawUrl];\n\n const parts = parsedUrl.pathname.split('/').filter(Boolean);\n const [owner, repo, marker, branch, ...treePathParts] = parts;\n const branches = marker === 'tree' && branch ? [branch] : ['main', 'master'];\n const treePath = marker === 'tree' ? treePathParts.join('/') : '';\n const skillSlug = skill ? normalizeSlug(skill) : null;\n const paths = new Set<string>();\n\n if (treePath) paths.add(`${treePath}/SKILL.md`);\n if (!treePath) paths.add('SKILL.md');\n if (skillSlug) {\n paths.add(`skills/${skillSlug}/SKILL.md`);\n paths.add(`.agents/skills/${skillSlug}/SKILL.md`);\n if (treePath) paths.add(`${treePath}/skills/${skillSlug}/SKILL.md`);\n if (treePath) paths.add(`${treePath}/.agents/skills/${skillSlug}/SKILL.md`);\n }\n\n return branches.flatMap((candidateBranch) =>\n [...paths].map((candidatePath) => `https://raw.githubusercontent.com/${owner}/${repo}/${candidateBranch}/${candidatePath}`),\n );\n};\n\nexport const planWizardArtifactImport = (input: {\n artifactKind?: string;\n source: string;\n slug?: string;\n skill?: string;\n}): ImportSourcePlan => {\n const source = input.source.trim();\n const tokens = tokenizeCommandLikeInput(source);\n const optionSkill = parseOptionValue(tokens, '--skill');\n const skill = input.skill?.trim() || optionSkill || null;\n const getdesignSlug = tokens.find((token, index) => tokens[index - 1] === 'add' && !token.startsWith('-')) ?? null;\n const inferredKind: WizardArtifactKind = source.includes('getdesign') ? 'DESIGN_DOC' : 'SKILL';\n const artifactKind = input.artifactKind ? toWizardArtifactKind(input.artifactKind) : inferredKind;\n\n if (artifactKind === 'DESIGN_DOC') {\n const rawSlug = input.slug?.trim() || getdesignSlug;\n if (!rawSlug) throw new Error('DESIGN_DOC import requires a slug or a getdesign `add <slug>` input.');\n const slug = normalizeSlug(rawSlug);\n const directUrl = firstUrlToken(tokens);\n const candidateUrls = directUrl ? [toRawGithubUrl(directUrl) ?? directUrl] : [`${GETDESIGN_RAW_BASE}/${slug}/DESIGN.md`];\n return { artifactKind, slug, skill: null, source, sourceRef: directUrl ?? `getdesign:${slug}`, candidateUrls };\n }\n\n const sourceUrl = firstUrlToken(tokens) ?? source;\n return {\n artifactKind: 'SKILL',\n slug: input.slug ? normalizeSlug(input.slug) : null,\n skill,\n source,\n sourceRef: skill ? `${sourceUrl}#skill=${skill}` : sourceUrl,\n candidateUrls: buildGithubSkillCandidateUrls(sourceUrl, skill),\n };\n};\n\nexport const fetchWizardArtifactImportSource = async (input: {\n artifactKind?: string;\n source: string;\n slug?: string;\n skill?: string;\n signal: AbortSignal;\n}): Promise<ResolvedImportSource> => {\n const plan = planWizardArtifactImport(input);\n const errors: string[] = [];\n\n for (const candidateUrl of plan.candidateUrls) {\n try {\n const response = await fetch(candidateUrl, { signal: input.signal });\n if (!response.ok) {\n errors.push(`${candidateUrl}: HTTP ${response.status}`);\n continue;\n }\n\n if (isZipUrl(candidateUrl)) {\n const zipMarkdown = extractMarkdownFromZip(await response.arrayBuffer());\n return {\n ...plan,\n markdownContent: zipMarkdown.content,\n fetchedUrl: candidateUrl,\n sourceRef: zipSourceRef(plan.sourceRef, zipMarkdown.path),\n };\n }\n\n return { ...plan, markdownContent: await response.text(), fetchedUrl: candidateUrl };\n } catch (error) {\n errors.push(`${candidateUrl}: ${error instanceof Error ? error.message : 'Unknown fetch error'}`);\n }\n }\n\n throw new Error(`Could not fetch import source. Tried: ${errors.join('; ')}`);\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aexol/opencode-wizard",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "OpenCode plugin for opencode-wizard published skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"oc-plugin": [
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"@opencode-ai/plugin": "^1.14.18",
|
|
50
50
|
"@opentui/core": "0.1.103",
|
|
51
51
|
"@opentui/solid": "0.1.103",
|
|
52
|
+
"fflate": "^0.8.2",
|
|
52
53
|
"solid-js": "1.9.11"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|