skilld 1.5.4 → 1.6.2
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 +3 -3
- package/dist/_chunks/agent.mjs +10 -78
- package/dist/_chunks/agent.mjs.map +1 -1
- package/dist/_chunks/assemble.mjs +0 -17
- package/dist/_chunks/assemble.mjs.map +1 -1
- package/dist/_chunks/author.mjs +0 -18
- package/dist/_chunks/author.mjs.map +1 -1
- package/dist/_chunks/cache.mjs +0 -72
- package/dist/_chunks/cache.mjs.map +1 -1
- package/dist/_chunks/cache2.mjs +84 -17
- package/dist/_chunks/cache2.mjs.map +1 -1
- package/dist/_chunks/cli-helpers.mjs +2 -49
- package/dist/_chunks/cli-helpers.mjs.map +1 -1
- package/dist/_chunks/cli-helpers2.mjs +0 -11
- package/dist/_chunks/config.mjs +0 -27
- package/dist/_chunks/config.mjs.map +1 -1
- package/dist/_chunks/core.mjs +9 -0
- package/dist/_chunks/detect.mjs +29 -226
- package/dist/_chunks/detect.mjs.map +1 -1
- package/dist/_chunks/embedding-cache.mjs +0 -5
- package/dist/_chunks/embedding-cache2.mjs +1 -2
- package/dist/_chunks/formatting.mjs +0 -6
- package/dist/_chunks/formatting.mjs.map +1 -1
- package/dist/_chunks/index.d.mts +0 -10
- package/dist/_chunks/index.d.mts.map +1 -1
- package/dist/_chunks/index2.d.mts +3 -6
- package/dist/_chunks/index2.d.mts.map +1 -1
- package/dist/_chunks/index3.d.mts +2 -31
- package/dist/_chunks/index3.d.mts.map +1 -1
- package/dist/_chunks/install.mjs +0 -15
- package/dist/_chunks/install.mjs.map +1 -1
- package/dist/_chunks/libs/@sinclair/typebox.mjs +0 -444
- package/dist/_chunks/libs/@sinclair/typebox.mjs.map +1 -1
- package/dist/_chunks/list.mjs +0 -16
- package/dist/_chunks/list.mjs.map +1 -1
- package/dist/_chunks/lockfile.mjs +1 -10
- package/dist/_chunks/lockfile.mjs.map +1 -1
- package/dist/_chunks/markdown.mjs +0 -9
- package/dist/_chunks/markdown.mjs.map +1 -1
- package/dist/_chunks/package-json.mjs +0 -25
- package/dist/_chunks/package-json.mjs.map +1 -1
- package/dist/_chunks/pool2.mjs +0 -2
- package/dist/_chunks/pool2.mjs.map +1 -1
- package/dist/_chunks/prepare.mjs +8 -7
- package/dist/_chunks/prepare.mjs.map +1 -1
- package/dist/_chunks/prepare2.mjs +0 -18
- package/dist/_chunks/prepare2.mjs.map +1 -1
- package/dist/_chunks/prompts.mjs +1 -102
- package/dist/_chunks/prompts.mjs.map +1 -1
- package/dist/_chunks/retriv.mjs +23 -24
- package/dist/_chunks/retriv.mjs.map +1 -1
- package/dist/_chunks/rolldown-runtime.mjs +0 -2
- package/dist/_chunks/sanitize.mjs +0 -78
- package/dist/_chunks/sanitize.mjs.map +1 -1
- package/dist/_chunks/search-interactive.mjs +0 -17
- package/dist/_chunks/search-interactive.mjs.map +1 -1
- package/dist/_chunks/search.mjs +0 -19
- package/dist/_chunks/search2.mjs +3 -12
- package/dist/_chunks/search2.mjs.map +1 -1
- package/dist/_chunks/setup.mjs +0 -13
- package/dist/_chunks/setup.mjs.map +1 -1
- package/dist/_chunks/shared.mjs +0 -10
- package/dist/_chunks/shared.mjs.map +1 -1
- package/dist/_chunks/skills.mjs +2 -2
- package/dist/_chunks/skills.mjs.map +1 -1
- package/dist/_chunks/sources.mjs +3 -453
- package/dist/_chunks/sources.mjs.map +1 -1
- package/dist/_chunks/sync-shared.mjs +0 -16
- package/dist/_chunks/sync-shared2.mjs +0 -42
- package/dist/_chunks/sync-shared2.mjs.map +1 -1
- package/dist/_chunks/sync.mjs +1 -21
- package/dist/_chunks/sync.mjs.map +1 -1
- package/dist/_chunks/sync2.mjs +0 -20
- package/dist/_chunks/types.d.mts +0 -2
- package/dist/_chunks/types.d.mts.map +1 -1
- package/dist/_chunks/uninstall.mjs +0 -25
- package/dist/_chunks/uninstall.mjs.map +1 -1
- package/dist/_chunks/validate.mjs +0 -7
- package/dist/_chunks/validate.mjs.map +1 -1
- package/dist/_chunks/wizard.mjs +15 -12
- package/dist/_chunks/wizard.mjs.map +1 -1
- package/dist/_chunks/yaml.mjs +0 -21
- package/dist/_chunks/yaml.mjs.map +1 -1
- package/dist/agent/index.d.mts +0 -24
- package/dist/agent/index.d.mts.map +1 -1
- package/dist/agent/index.mjs +0 -8
- package/dist/cache/index.mjs +0 -2
- package/dist/cli-entry.mjs +0 -6
- package/dist/cli-entry.mjs.map +1 -1
- package/dist/cli.mjs +37 -44
- package/dist/cli.mjs.map +1 -1
- package/dist/index.mjs +0 -6
- package/dist/prepare.mjs +0 -12
- package/dist/prepare.mjs.map +1 -1
- package/dist/retriv/index.mjs +0 -2
- package/dist/retriv/worker.d.mts +0 -3
- package/dist/retriv/worker.d.mts.map +1 -1
- package/dist/retriv/worker.mjs +0 -2
- package/dist/retriv/worker.mjs.map +1 -1
- package/dist/sources/index.mjs +0 -4
- package/package.json +17 -17
|
@@ -1,35 +1,16 @@
|
|
|
1
1
|
import { t as CACHE_DIR } from "./config.mjs";
|
|
2
|
-
import "./package-json.mjs";
|
|
3
|
-
import "./prepare.mjs";
|
|
4
|
-
import "./sanitize.mjs";
|
|
5
2
|
import "./cache.mjs";
|
|
6
|
-
import "./yaml.mjs";
|
|
7
|
-
import "./markdown.mjs";
|
|
8
|
-
import "./retriv.mjs";
|
|
9
3
|
import { r as mapInsert, t as SHARED_SKILLS_DIR } from "./shared.mjs";
|
|
10
|
-
import "./sources.mjs";
|
|
11
4
|
import { a as targets } from "./detect.mjs";
|
|
12
|
-
import "./prompts.mjs";
|
|
13
5
|
import "./agent.mjs";
|
|
14
|
-
import "./libs/@sinclair/typebox.mjs";
|
|
15
6
|
import { A as unregisterProject, T as getRegisteredProjects, p as isInteractive, x as sharedArgs } from "./cli-helpers.mjs";
|
|
16
7
|
import { i as readLock } from "./lockfile.mjs";
|
|
17
|
-
import "./skills.mjs";
|
|
18
|
-
import "./formatting.mjs";
|
|
19
|
-
import "./wizard.mjs";
|
|
20
8
|
import { i as SKILLD_MARKER_START, r as SKILLD_MARKER_END } from "./sync-shared2.mjs";
|
|
21
|
-
import "./pool2.mjs";
|
|
22
9
|
import "./sync.mjs";
|
|
23
10
|
import { join } from "pathe";
|
|
24
11
|
import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
25
12
|
import * as p from "@clack/prompts";
|
|
26
13
|
import { defineCommand } from "citty";
|
|
27
|
-
//#region src/commands/uninstall.ts
|
|
28
|
-
/**
|
|
29
|
-
* Remove the skilld marker block from an agent's instruction file.
|
|
30
|
-
* For .mdc files (dedicated skilld files), delete the entire file.
|
|
31
|
-
* Also cleans up legacy .cursorrules markers for backwards compat.
|
|
32
|
-
*/
|
|
33
14
|
function removeAgentInstructions(agent, projectPath) {
|
|
34
15
|
const agentConfig = targets[agent];
|
|
35
16
|
if (!agentConfig.instructionFile) return false;
|
|
@@ -58,11 +39,6 @@ function removeMarkerBlock(filePath) {
|
|
|
58
39
|
else writeFileSync(filePath, updated.endsWith("\n") ? updated : `${updated}\n`);
|
|
59
40
|
return true;
|
|
60
41
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Uninstall skilld skills by scope:
|
|
63
|
-
* - project: Remove project skills (cwd)
|
|
64
|
-
* - all: All registered projects + global skills + cache
|
|
65
|
-
*/
|
|
66
42
|
async function uninstallCommand(opts) {
|
|
67
43
|
let scope = opts.scope;
|
|
68
44
|
const registeredProjects = getRegisteredProjects();
|
|
@@ -226,7 +202,6 @@ const uninstallCommandDef = defineCommand({
|
|
|
226
202
|
});
|
|
227
203
|
}
|
|
228
204
|
});
|
|
229
|
-
//#endregion
|
|
230
205
|
export { uninstallCommandDef };
|
|
231
206
|
|
|
232
207
|
//# sourceMappingURL=uninstall.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.mjs","names":["agents"],"sources":["../../src/commands/uninstall.ts"],"sourcesContent":["import type { AgentType } from '../agent/index.ts'\nimport { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join } from 'pathe'\nimport { agents } from '../agent/index.ts'\nimport { CACHE_DIR } from '../cache/index.ts'\nimport { isInteractive, sharedArgs } from '../cli-helpers.ts'\nimport { getRegisteredProjects, unregisterProject } from '../core/config.ts'\nimport { readLock } from '../core/lockfile.ts'\nimport { mapInsert, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { SKILLD_MARKER_END, SKILLD_MARKER_START } from './sync.ts'\n\n/**\n * Remove the skilld marker block from an agent's instruction file.\n * For .mdc files (dedicated skilld files), delete the entire file.\n * Also cleans up legacy .cursorrules markers for backwards compat.\n */\nfunction removeAgentInstructions(agent: AgentType, projectPath: string): boolean {\n const agentConfig = agents[agent]\n if (!agentConfig.instructionFile)\n return false\n\n let removed = false\n\n // Handle current instruction file\n const filePath = join(projectPath, agentConfig.instructionFile)\n if (agentConfig.instructionFile.endsWith('.mdc')) {\n // MDC files are dedicated skilld files - just delete\n if (existsSync(filePath)) {\n rmSync(filePath)\n removed = true\n }\n // Also clean up legacy .cursorrules markers (cursor-specific)\n if (agent === 'cursor')\n removed = removeMarkerBlock(join(projectPath, '.cursorrules')) || removed\n }\n else if (existsSync(filePath)) {\n removed = removeMarkerBlock(filePath)\n }\n\n return removed\n}\n\nfunction removeMarkerBlock(filePath: string): boolean {\n if (!existsSync(filePath))\n return false\n\n const content = readFileSync(filePath, 'utf-8')\n const startIdx = content.indexOf(SKILLD_MARKER_START)\n if (startIdx === -1)\n return false\n\n const endIdx = content.indexOf(SKILLD_MARKER_END, startIdx)\n if (endIdx === -1)\n return false\n\n // Remove marker block plus surrounding blank lines\n const before = content.slice(0, startIdx).replace(/\\n+$/, '')\n const after = content.slice(endIdx + SKILLD_MARKER_END.length).replace(/^\\n+/, '')\n const updated = before + (before && after ? '\\n' : '') + after\n\n if (updated.trim() === '') {\n rmSync(filePath)\n }\n else {\n writeFileSync(filePath, updated.endsWith('\\n') ? updated : `${updated}\\n`)\n }\n return true\n}\n\nexport interface UninstallOptions {\n scope?: 'project' | 'all'\n agent?: AgentType\n yes: boolean\n}\n\n/**\n * Uninstall skilld skills by scope:\n * - project: Remove project skills (cwd)\n * - all: All registered projects + global skills + cache\n */\nexport async function uninstallCommand(opts: UninstallOptions): Promise<void> {\n let scope = opts.scope\n const registeredProjects = getRegisteredProjects()\n\n // Prompt for scope if not provided\n if (!scope) {\n if (!isInteractive()) {\n scope = 'project'\n }\n else {\n const allHint = registeredProjects.length > 0\n ? `${registeredProjects.length} projects + global + cache`\n : 'global skills + cache'\n\n const selected = await p.select({\n message: 'What do you want to uninstall?',\n options: [\n { label: 'This project', value: 'project', hint: 'current project only' },\n { label: 'Everything', value: 'all', hint: allHint },\n ],\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return\n }\n scope = selected as 'project' | 'all'\n }\n }\n\n interface RemoveItem { label: string, path: string, version?: string }\n const toRemove: RemoveItem[] = []\n const seenPaths = new Set<string>()\n const projectsToUnregister: string[] = []\n const agentFilter = opts.agent ? [opts.agent] : undefined\n\n const addToRemove = (label: string, path: string, version?: string) => {\n if (seenPaths.has(path))\n return\n seenPaths.add(path)\n toRemove.push({ label, path, version })\n }\n\n // Helper to add skills from a lockfile\n const addSkillsFromLock = (skillsDir: string, label: string): string[] => {\n const trackedNames: string[] = []\n const lock = readLock(skillsDir)\n\n if (lock?.skills) {\n for (const [skillName, info] of Object.entries(lock.skills)) {\n trackedNames.push(skillName)\n const skillDir = join(skillsDir, skillName)\n if (existsSync(skillDir)) {\n const version = info.version ? `${info.version.split('.').slice(0, 2).join('.')}.x` : undefined\n addToRemove(`${label}: ${skillName}`, skillDir, version)\n }\n }\n\n // Also add the lockfile itself\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n if (existsSync(lockPath)) {\n addToRemove(`${label}: skilld-lock.yaml`, lockPath)\n }\n }\n\n return trackedNames\n }\n\n // Helper to find untracked skills in a directory\n const findUntrackedSkills = (skillsDir: string, trackedNames: string[]): string[] => {\n if (!existsSync(skillsDir))\n return []\n const tracked = new Set(trackedNames)\n return readdirSync(skillsDir)\n .filter(f => !f.startsWith('.') && f !== 'skilld-lock.yaml' && !tracked.has(f))\n }\n\n // Track untracked skills per directory (dedupe by path)\n const untrackedByDir = new Map<string, { label: string, skills: string[] }>()\n const processedDirs = new Set<string>()\n\n // Helper to process a skills directory (with deduping)\n const processSkillsDir = (skillsDir: string, label: string) => {\n if (processedDirs.has(skillsDir))\n return\n processedDirs.add(skillsDir)\n\n const tracked = addSkillsFromLock(skillsDir, label)\n const untracked = findUntrackedSkills(skillsDir, tracked)\n if (untracked.length > 0) {\n untrackedByDir.set(skillsDir, { label, skills: untracked })\n }\n }\n\n // Project skills\n if (scope === 'project') {\n // Shared dir\n const sharedDir = join(process.cwd(), SHARED_SKILLS_DIR)\n if (existsSync(sharedDir))\n processSkillsDir(sharedDir, 'project (.skills)')\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(process.cwd(), agent.skillsDir), 'project')\n }\n projectsToUnregister.push(process.cwd())\n }\n\n // All registered projects + global\n if (scope === 'all') {\n const projectPaths = registeredProjects.length > 0 ? registeredProjects : [process.cwd()]\n\n // Show which projects will be affected\n if (registeredProjects.length > 0) {\n p.log.info('Projects to uninstall from:')\n for (const proj of projectPaths) {\n p.log.message(` ${proj}`)\n }\n }\n\n // Project skills from lockfiles\n for (const projectPath of projectPaths) {\n if (!existsSync(projectPath))\n continue\n\n const shortPath = projectPath.replace(process.env.HOME || '', '~')\n\n // Shared dir\n const sharedDir = join(projectPath, SHARED_SKILLS_DIR)\n if (existsSync(sharedDir))\n processSkillsDir(sharedDir, `${shortPath} (.skills)`)\n\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(projectPath, agent.skillsDir), shortPath)\n }\n\n projectsToUnregister.push(projectPath)\n }\n\n // Global skills from lockfiles\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n if (!agent.globalSkillsDir)\n continue\n processSkillsDir(agent.globalSkillsDir, 'user')\n }\n\n // Cache directory\n if (existsSync(CACHE_DIR)) {\n addToRemove('~/.skilld cache', CACHE_DIR)\n }\n }\n\n // Warn about untracked skills that will remain (grouped by label, deduped)\n if (untrackedByDir.size > 0) {\n const groupedUntracked = new Map<string, Set<string>>()\n for (const [_dir, { label, skills }] of untrackedByDir) {\n const set = mapInsert(groupedUntracked, label, () => new Set())\n for (const s of skills) set.add(s)\n }\n\n const totalUntracked = [...groupedUntracked.values()].reduce((sum, s) => sum + s.size, 0)\n p.log.warn(`${totalUntracked} untracked skill(s) will remain (not managed by skilld):`)\n for (const [label, skills] of groupedUntracked) {\n p.log.message(` ${label}: ${[...skills].join(', ')}`)\n }\n }\n\n if (toRemove.length === 0) {\n p.log.info('Nothing to uninstall')\n return\n }\n\n // Group by prefix for display\n const groups = new Map<string, Array<{ name: string, version?: string }>>()\n for (const item of toRemove) {\n const [prefix, name] = item.label.includes(': ')\n ? item.label.split(': ', 2)\n : ['other', item.label]\n mapInsert(groups, prefix!, () => []).push({ name: name!, version: item.version })\n }\n\n const formatGroup = (items: Array<{ name: string, version?: string }>) =>\n items.map(i => i.version ? `${i.name}@${i.version}` : i.name).join(', ')\n\n p.log.info(`Will remove ${toRemove.length} items:`)\n for (const [prefix, items] of groups) {\n p.log.message(` ${prefix}: ${formatGroup(items)}`)\n }\n\n if (!opts.yes && isInteractive()) {\n const confirmed = await p.confirm({\n message: 'Proceed with uninstall?',\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Remove all items\n for (const item of toRemove) {\n rmSync(item.path, { recursive: true, force: true })\n }\n\n // Show grouped removal summary\n for (const [prefix, items] of groups) {\n p.log.success(`Removed ${prefix}: ${formatGroup(items)}`)\n }\n\n // Remove skilld instructions from agent instruction files\n const agentTypes = agentFilter || (Object.keys(agents) as AgentType[])\n for (const proj of projectsToUnregister) {\n for (const agent of agentTypes) {\n if (removeAgentInstructions(agent, proj)) {\n const file = agents[agent].instructionFile!\n p.log.success(`Cleaned ${file}`)\n }\n }\n }\n\n // Unregister projects from config (skip if cache dir was removed — config is gone)\n if (scope !== 'all') {\n for (const proj of projectsToUnregister) {\n unregisterProject(proj)\n }\n }\n\n p.outro('skilld uninstalled')\n}\n\nexport const uninstallCommandDef = defineCommand({\n meta: { name: 'uninstall', description: 'Remove skilld data' },\n args: {\n ...sharedArgs,\n },\n async run({ args }) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m uninstall`)\n return uninstallCommand({\n scope: args.global ? 'all' : undefined,\n agent: args.agent as AgentType | undefined,\n yes: args.yes,\n })\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,SAAS,wBAAwB,OAAkB,aAA8B;CAC/E,MAAM,cAAcA,QAAO;AAC3B,KAAI,CAAC,YAAY,gBACf,QAAO;CAET,IAAI,UAAU;CAGd,MAAM,WAAW,KAAK,aAAa,YAAY,gBAAgB;AAC/D,KAAI,YAAY,gBAAgB,SAAS,OAAO,EAAE;AAEhD,MAAI,WAAW,SAAS,EAAE;AACxB,UAAO,SAAS;AAChB,aAAU;;AAGZ,MAAI,UAAU,SACZ,WAAU,kBAAkB,KAAK,aAAa,eAAe,CAAC,IAAI;YAE7D,WAAW,SAAS,CAC3B,WAAU,kBAAkB,SAAS;AAGvC,QAAO;;AAGT,SAAS,kBAAkB,UAA2B;AACpD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;CAET,MAAM,UAAU,aAAa,UAAU,QAAQ;CAC/C,MAAM,WAAW,QAAQ,QAAQ,oBAAoB;AACrD,KAAI,aAAa,GACf,QAAO;CAET,MAAM,SAAS,QAAQ,QAAQ,mBAAmB,SAAS;AAC3D,KAAI,WAAW,GACb,QAAO;CAGT,MAAM,SAAS,QAAQ,MAAM,GAAG,SAAS,CAAC,QAAQ,QAAQ,GAAG;CAC7D,MAAM,QAAQ,QAAQ,MAAM,SAAS,kBAAkB,OAAO,CAAC,QAAQ,QAAQ,GAAG;CAClF,MAAM,UAAU,UAAU,UAAU,QAAQ,OAAO,MAAM;AAEzD,KAAI,QAAQ,MAAM,KAAK,GACrB,QAAO,SAAS;KAGhB,eAAc,UAAU,QAAQ,SAAS,KAAK,GAAG,UAAU,GAAG,QAAQ,IAAI;AAE5E,QAAO;;;;;;;AAcT,eAAsB,iBAAiB,MAAuC;CAC5E,IAAI,QAAQ,KAAK;CACjB,MAAM,qBAAqB,uBAAuB;AAGlD,KAAI,CAAC,MACH,KAAI,CAAC,eAAe,CAClB,SAAQ;MAEL;EACH,MAAM,UAAU,mBAAmB,SAAS,IACxC,GAAG,mBAAmB,OAAO,8BAC7B;EAEJ,MAAM,WAAW,MAAM,EAAE,OAAO;GAC9B,SAAS;GACT,SAAS,CACP;IAAE,OAAO;IAAgB,OAAO;IAAW,MAAM;IAAwB,EACzE;IAAE,OAAO;IAAc,OAAO;IAAO,MAAM;IAAS,CAAA;GAEvD,CAAC;AAEF,MAAI,EAAE,SAAS,SAAS,EAAE;AACxB,KAAE,OAAO,YAAY;AACrB;;AAEF,UAAQ;;CAKZ,MAAM,WAAyB,EAAE;CACjC,MAAM,4BAAY,IAAI,KAAa;CACnC,MAAM,uBAAiC,EAAE;CACzC,MAAM,cAAc,KAAK,QAAQ,CAAC,KAAK,MAAM,GAAG,KAAA;CAEhD,MAAM,eAAe,OAAe,MAAc,YAAqB;AACrE,MAAI,UAAU,IAAI,KAAK,CACrB;AACF,YAAU,IAAI,KAAK;AACnB,WAAS,KAAK;GAAE;GAAO;GAAM;GAAS,CAAC;;CAIzC,MAAM,qBAAqB,WAAmB,UAA4B;EACxE,MAAM,eAAyB,EAAE;EACjC,MAAM,OAAO,SAAS,UAAU;AAEhC,MAAI,MAAM,QAAQ;AAChB,QAAK,MAAM,CAAC,WAAW,SAAS,OAAO,QAAQ,KAAK,OAAO,EAAE;AAC3D,iBAAa,KAAK,UAAU;IAC5B,MAAM,WAAW,KAAK,WAAW,UAAU;AAC3C,QAAI,WAAW,SAAS,EAAE;KACxB,MAAM,UAAU,KAAK,UAAU,GAAG,KAAK,QAAQ,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,KAAA;AACtF,iBAAY,GAAG,MAAM,IAAI,aAAa,UAAU,QAAQ;;;GAK5D,MAAM,WAAW,KAAK,WAAW,mBAAmB;AACpD,OAAI,WAAW,SAAS,CACtB,aAAY,GAAG,MAAM,qBAAqB,SAAS;;AAIvD,SAAO;;CAIT,MAAM,uBAAuB,WAAmB,iBAAqC;AACnF,MAAI,CAAC,WAAW,UAAU,CACxB,QAAO,EAAE;EACX,MAAM,UAAU,IAAI,IAAI,aAAa;AACrC,SAAO,YAAY,UAAU,CAC1B,QAAO,MAAK,CAAC,EAAE,WAAW,IAAI,IAAI,MAAM,sBAAsB,CAAC,QAAQ,IAAI,EAAE,CAAC;;CAInF,MAAM,iCAAiB,IAAI,KAAkD;CAC7E,MAAM,gCAAgB,IAAI,KAAa;CAGvC,MAAM,oBAAoB,WAAmB,UAAkB;AAC7D,MAAI,cAAc,IAAI,UAAU,CAC9B;AACF,gBAAc,IAAI,UAAU;EAG5B,MAAM,YAAY,oBAAoB,WADtB,kBAAkB,WAAW,MAAM,CACM;AACzD,MAAI,UAAU,SAAS,EACrB,gBAAe,IAAI,WAAW;GAAE;GAAO,QAAQ;GAAW,CAAC;;AAK/D,KAAI,UAAU,WAAW;EAEvB,MAAM,YAAY,KAAK,QAAQ,KAAK,EAAE,kBAAkB;AACxD,MAAI,WAAW,UAAU,CACvB,kBAAiB,WAAW,oBAAoB;AAClD,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQA,QAAO,EAAE;AAClD,OAAI,eAAe,CAAC,YAAY,SAAS,KAAkB,CACzD;AACF,oBAAiB,KAAK,QAAQ,KAAK,EAAE,MAAM,UAAU,EAAE,UAAU;;AAEnE,uBAAqB,KAAK,QAAQ,KAAK,CAAC;;AAI1C,KAAI,UAAU,OAAO;EACnB,MAAM,eAAe,mBAAmB,SAAS,IAAI,qBAAqB,CAAC,QAAQ,KAAK,CAAC;AAGzF,MAAI,mBAAmB,SAAS,GAAG;AACjC,KAAE,IAAI,KAAK,8BAA8B;AACzC,QAAK,MAAM,QAAQ,aACjB,GAAE,IAAI,QAAQ,KAAK,OAAO;;AAK9B,OAAK,MAAM,eAAe,cAAc;AACtC,OAAI,CAAC,WAAW,YAAY,CAC1B;GAEF,MAAM,YAAY,YAAY,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI;GAGlE,MAAM,YAAY,KAAK,aAAa,kBAAkB;AACtD,OAAI,WAAW,UAAU,CACvB,kBAAiB,WAAW,GAAG,UAAU,YAAY;AAEvD,QAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQA,QAAO,EAAE;AAClD,QAAI,eAAe,CAAC,YAAY,SAAS,KAAkB,CACzD;AACF,qBAAiB,KAAK,aAAa,MAAM,UAAU,EAAE,UAAU;;AAGjE,wBAAqB,KAAK,YAAY;;AAIxC,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQA,QAAO,EAAE;AAClD,OAAI,eAAe,CAAC,YAAY,SAAS,KAAkB,CACzD;AACF,OAAI,CAAC,MAAM,gBACT;AACF,oBAAiB,MAAM,iBAAiB,OAAO;;AAIjD,MAAI,WAAW,UAAU,CACvB,aAAY,mBAAmB,UAAU;;AAK7C,KAAI,eAAe,OAAO,GAAG;EAC3B,MAAM,mCAAmB,IAAI,KAA0B;AACvD,OAAK,MAAM,CAAC,MAAM,EAAE,OAAO,aAAa,gBAAgB;GACtD,MAAM,MAAM,UAAU,kBAAkB,6BAAa,IAAI,KAAK,CAAC;AAC/D,QAAK,MAAM,KAAK,OAAQ,KAAI,IAAI,EAAE;;EAGpC,MAAM,iBAAiB,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,KAAK,MAAM,MAAM,EAAE,MAAM,EAAE;AACzF,IAAE,IAAI,KAAK,GAAG,eAAe,0DAA0D;AACvF,OAAK,MAAM,CAAC,OAAO,WAAW,iBAC5B,GAAE,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,GAAG;;AAI1D,KAAI,SAAS,WAAW,GAAG;AACzB,IAAE,IAAI,KAAK,uBAAuB;AAClC;;CAIF,MAAM,yBAAS,IAAI,KAAwD;AAC3E,MAAK,MAAM,QAAQ,UAAU;EAC3B,MAAM,CAAC,QAAQ,QAAQ,KAAK,MAAM,SAAS,KAAK,GAC5C,KAAK,MAAM,MAAM,MAAM,EAAE,GACzB,CAAC,SAAS,KAAK,MAAM;AACzB,YAAU,QAAQ,cAAe,EAAE,CAAC,CAAC,KAAK;GAAQ;GAAO,SAAS,KAAK;GAAS,CAAC;;CAGnF,MAAM,eAAe,UACnB,MAAM,KAAI,MAAK,EAAE,UAAU,GAAG,EAAE,KAAK,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,KAAK;AAE1E,GAAE,IAAI,KAAK,eAAe,SAAS,OAAO,SAAS;AACnD,MAAK,MAAM,CAAC,QAAQ,UAAU,OAC5B,GAAE,IAAI,QAAQ,KAAK,OAAO,IAAI,YAAY,MAAM,GAAG;AAGrD,KAAI,CAAC,KAAK,OAAO,eAAe,EAAE;EAChC,MAAM,YAAY,MAAM,EAAE,QAAQ,EAChC,SAAS,2BACV,CAAC;AAEF,MAAI,EAAE,SAAS,UAAU,IAAI,CAAC,WAAW;AACvC,KAAE,OAAO,YAAY;AACrB;;;AAKJ,MAAK,MAAM,QAAQ,SACjB,QAAO,KAAK,MAAM;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAIrD,MAAK,MAAM,CAAC,QAAQ,UAAU,OAC5B,GAAE,IAAI,QAAQ,WAAW,OAAO,IAAI,YAAY,MAAM,GAAG;CAI3D,MAAM,aAAa,eAAgB,OAAO,KAAKA,QAAO;AACtD,MAAK,MAAM,QAAQ,qBACjB,MAAK,MAAM,SAAS,WAClB,KAAI,wBAAwB,OAAO,KAAK,EAAE;EACxC,MAAM,OAAOA,QAAO,OAAO;AAC3B,IAAE,IAAI,QAAQ,WAAW,OAAO;;AAMtC,KAAI,UAAU,MACZ,MAAK,MAAM,QAAQ,qBACjB,mBAAkB,KAAK;AAI3B,GAAE,MAAM,qBAAqB;;AAG/B,MAAa,sBAAsB,cAAc;CAC/C,MAAM;EAAE,MAAM;EAAa,aAAa;EAAsB;CAC9D,MAAM,EACJ,GAAG,YACJ;CACD,MAAM,IAAI,EAAE,QAAQ;AAClB,IAAE,MAAM,yCAAyC;AACjD,SAAO,iBAAiB;GACtB,OAAO,KAAK,SAAS,QAAQ,KAAA;GAC7B,OAAO,KAAK;GACZ,KAAK,KAAK;GACX,CAAC;;CAEL,CAAC"}
|
|
1
|
+
{"version":3,"file":"uninstall.mjs","names":["agents"],"sources":["../../src/commands/uninstall.ts"],"sourcesContent":["import type { AgentType } from '../agent/index.ts'\nimport { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join } from 'pathe'\nimport { agents } from '../agent/index.ts'\nimport { CACHE_DIR } from '../cache/index.ts'\nimport { isInteractive, sharedArgs } from '../cli-helpers.ts'\nimport { getRegisteredProjects, unregisterProject } from '../core/config.ts'\nimport { readLock } from '../core/lockfile.ts'\nimport { mapInsert, SHARED_SKILLS_DIR } from '../core/shared.ts'\nimport { SKILLD_MARKER_END, SKILLD_MARKER_START } from './sync.ts'\n\n/**\n * Remove the skilld marker block from an agent's instruction file.\n * For .mdc files (dedicated skilld files), delete the entire file.\n * Also cleans up legacy .cursorrules markers for backwards compat.\n */\nfunction removeAgentInstructions(agent: AgentType, projectPath: string): boolean {\n const agentConfig = agents[agent]\n if (!agentConfig.instructionFile)\n return false\n\n let removed = false\n\n // Handle current instruction file\n const filePath = join(projectPath, agentConfig.instructionFile)\n if (agentConfig.instructionFile.endsWith('.mdc')) {\n // MDC files are dedicated skilld files - just delete\n if (existsSync(filePath)) {\n rmSync(filePath)\n removed = true\n }\n // Also clean up legacy .cursorrules markers (cursor-specific)\n if (agent === 'cursor')\n removed = removeMarkerBlock(join(projectPath, '.cursorrules')) || removed\n }\n else if (existsSync(filePath)) {\n removed = removeMarkerBlock(filePath)\n }\n\n return removed\n}\n\nfunction removeMarkerBlock(filePath: string): boolean {\n if (!existsSync(filePath))\n return false\n\n const content = readFileSync(filePath, 'utf-8')\n const startIdx = content.indexOf(SKILLD_MARKER_START)\n if (startIdx === -1)\n return false\n\n const endIdx = content.indexOf(SKILLD_MARKER_END, startIdx)\n if (endIdx === -1)\n return false\n\n // Remove marker block plus surrounding blank lines\n const before = content.slice(0, startIdx).replace(/\\n+$/, '')\n const after = content.slice(endIdx + SKILLD_MARKER_END.length).replace(/^\\n+/, '')\n const updated = before + (before && after ? '\\n' : '') + after\n\n if (updated.trim() === '') {\n rmSync(filePath)\n }\n else {\n writeFileSync(filePath, updated.endsWith('\\n') ? updated : `${updated}\\n`)\n }\n return true\n}\n\nexport interface UninstallOptions {\n scope?: 'project' | 'all'\n agent?: AgentType\n yes: boolean\n}\n\n/**\n * Uninstall skilld skills by scope:\n * - project: Remove project skills (cwd)\n * - all: All registered projects + global skills + cache\n */\nexport async function uninstallCommand(opts: UninstallOptions): Promise<void> {\n let scope = opts.scope\n const registeredProjects = getRegisteredProjects()\n\n // Prompt for scope if not provided\n if (!scope) {\n if (!isInteractive()) {\n scope = 'project'\n }\n else {\n const allHint = registeredProjects.length > 0\n ? `${registeredProjects.length} projects + global + cache`\n : 'global skills + cache'\n\n const selected = await p.select({\n message: 'What do you want to uninstall?',\n options: [\n { label: 'This project', value: 'project', hint: 'current project only' },\n { label: 'Everything', value: 'all', hint: allHint },\n ],\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return\n }\n scope = selected as 'project' | 'all'\n }\n }\n\n interface RemoveItem { label: string, path: string, version?: string }\n const toRemove: RemoveItem[] = []\n const seenPaths = new Set<string>()\n const projectsToUnregister: string[] = []\n const agentFilter = opts.agent ? [opts.agent] : undefined\n\n const addToRemove = (label: string, path: string, version?: string) => {\n if (seenPaths.has(path))\n return\n seenPaths.add(path)\n toRemove.push({ label, path, version })\n }\n\n // Helper to add skills from a lockfile\n const addSkillsFromLock = (skillsDir: string, label: string): string[] => {\n const trackedNames: string[] = []\n const lock = readLock(skillsDir)\n\n if (lock?.skills) {\n for (const [skillName, info] of Object.entries(lock.skills)) {\n trackedNames.push(skillName)\n const skillDir = join(skillsDir, skillName)\n if (existsSync(skillDir)) {\n const version = info.version ? `${info.version.split('.').slice(0, 2).join('.')}.x` : undefined\n addToRemove(`${label}: ${skillName}`, skillDir, version)\n }\n }\n\n // Also add the lockfile itself\n const lockPath = join(skillsDir, 'skilld-lock.yaml')\n if (existsSync(lockPath)) {\n addToRemove(`${label}: skilld-lock.yaml`, lockPath)\n }\n }\n\n return trackedNames\n }\n\n // Helper to find untracked skills in a directory\n const findUntrackedSkills = (skillsDir: string, trackedNames: string[]): string[] => {\n if (!existsSync(skillsDir))\n return []\n const tracked = new Set(trackedNames)\n return readdirSync(skillsDir)\n .filter(f => !f.startsWith('.') && f !== 'skilld-lock.yaml' && !tracked.has(f))\n }\n\n // Track untracked skills per directory (dedupe by path)\n const untrackedByDir = new Map<string, { label: string, skills: string[] }>()\n const processedDirs = new Set<string>()\n\n // Helper to process a skills directory (with deduping)\n const processSkillsDir = (skillsDir: string, label: string) => {\n if (processedDirs.has(skillsDir))\n return\n processedDirs.add(skillsDir)\n\n const tracked = addSkillsFromLock(skillsDir, label)\n const untracked = findUntrackedSkills(skillsDir, tracked)\n if (untracked.length > 0) {\n untrackedByDir.set(skillsDir, { label, skills: untracked })\n }\n }\n\n // Project skills\n if (scope === 'project') {\n // Shared dir\n const sharedDir = join(process.cwd(), SHARED_SKILLS_DIR)\n if (existsSync(sharedDir))\n processSkillsDir(sharedDir, 'project (.skills)')\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(process.cwd(), agent.skillsDir), 'project')\n }\n projectsToUnregister.push(process.cwd())\n }\n\n // All registered projects + global\n if (scope === 'all') {\n const projectPaths = registeredProjects.length > 0 ? registeredProjects : [process.cwd()]\n\n // Show which projects will be affected\n if (registeredProjects.length > 0) {\n p.log.info('Projects to uninstall from:')\n for (const proj of projectPaths) {\n p.log.message(` ${proj}`)\n }\n }\n\n // Project skills from lockfiles\n for (const projectPath of projectPaths) {\n if (!existsSync(projectPath))\n continue\n\n const shortPath = projectPath.replace(process.env.HOME || '', '~')\n\n // Shared dir\n const sharedDir = join(projectPath, SHARED_SKILLS_DIR)\n if (existsSync(sharedDir))\n processSkillsDir(sharedDir, `${shortPath} (.skills)`)\n\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n processSkillsDir(join(projectPath, agent.skillsDir), shortPath)\n }\n\n projectsToUnregister.push(projectPath)\n }\n\n // Global skills from lockfiles\n for (const [name, agent] of Object.entries(agents)) {\n if (agentFilter && !agentFilter.includes(name as AgentType))\n continue\n if (!agent.globalSkillsDir)\n continue\n processSkillsDir(agent.globalSkillsDir, 'user')\n }\n\n // Cache directory\n if (existsSync(CACHE_DIR)) {\n addToRemove('~/.skilld cache', CACHE_DIR)\n }\n }\n\n // Warn about untracked skills that will remain (grouped by label, deduped)\n if (untrackedByDir.size > 0) {\n const groupedUntracked = new Map<string, Set<string>>()\n for (const [_dir, { label, skills }] of untrackedByDir) {\n const set = mapInsert(groupedUntracked, label, () => new Set())\n for (const s of skills) set.add(s)\n }\n\n const totalUntracked = [...groupedUntracked.values()].reduce((sum, s) => sum + s.size, 0)\n p.log.warn(`${totalUntracked} untracked skill(s) will remain (not managed by skilld):`)\n for (const [label, skills] of groupedUntracked) {\n p.log.message(` ${label}: ${[...skills].join(', ')}`)\n }\n }\n\n if (toRemove.length === 0) {\n p.log.info('Nothing to uninstall')\n return\n }\n\n // Group by prefix for display\n const groups = new Map<string, Array<{ name: string, version?: string }>>()\n for (const item of toRemove) {\n const [prefix, name] = item.label.includes(': ')\n ? item.label.split(': ', 2)\n : ['other', item.label]\n mapInsert(groups, prefix!, () => []).push({ name: name!, version: item.version })\n }\n\n const formatGroup = (items: Array<{ name: string, version?: string }>) =>\n items.map(i => i.version ? `${i.name}@${i.version}` : i.name).join(', ')\n\n p.log.info(`Will remove ${toRemove.length} items:`)\n for (const [prefix, items] of groups) {\n p.log.message(` ${prefix}: ${formatGroup(items)}`)\n }\n\n if (!opts.yes && isInteractive()) {\n const confirmed = await p.confirm({\n message: 'Proceed with uninstall?',\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Remove all items\n for (const item of toRemove) {\n rmSync(item.path, { recursive: true, force: true })\n }\n\n // Show grouped removal summary\n for (const [prefix, items] of groups) {\n p.log.success(`Removed ${prefix}: ${formatGroup(items)}`)\n }\n\n // Remove skilld instructions from agent instruction files\n const agentTypes = agentFilter || (Object.keys(agents) as AgentType[])\n for (const proj of projectsToUnregister) {\n for (const agent of agentTypes) {\n if (removeAgentInstructions(agent, proj)) {\n const file = agents[agent].instructionFile!\n p.log.success(`Cleaned ${file}`)\n }\n }\n }\n\n // Unregister projects from config (skip if cache dir was removed — config is gone)\n if (scope !== 'all') {\n for (const proj of projectsToUnregister) {\n unregisterProject(proj)\n }\n }\n\n p.outro('skilld uninstalled')\n}\n\nexport const uninstallCommandDef = defineCommand({\n meta: { name: 'uninstall', description: 'Remove skilld data' },\n args: {\n ...sharedArgs,\n },\n async run({ args }) {\n p.intro(`\\x1B[1m\\x1B[35mskilld\\x1B[0m uninstall`)\n return uninstallCommand({\n scope: args.global ? 'all' : undefined,\n agent: args.agent as AgentType | undefined,\n yes: args.yes,\n })\n },\n})\n"],"mappings":"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"}
|
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
import "./sanitize.mjs";
|
|
2
|
-
import "./yaml.mjs";
|
|
3
|
-
import "./shared.mjs";
|
|
4
|
-
import "./detect.mjs";
|
|
5
1
|
import { f as getSectionValidator } from "./prompts.mjs";
|
|
6
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
3
|
import { defineCommand } from "citty";
|
|
8
|
-
//#region src/commands/validate.ts
|
|
9
4
|
const SECTION_HEADINGS = {
|
|
10
5
|
"## API Changes": "api-changes",
|
|
11
6
|
"## Best Practices": "best-practices"
|
|
12
7
|
};
|
|
13
|
-
/** Infer section type from content headings */
|
|
14
8
|
function inferSection(content) {
|
|
15
9
|
for (const [heading, section] of Object.entries(SECTION_HEADINGS)) if (content.includes(heading)) return section;
|
|
16
10
|
return "custom";
|
|
@@ -61,7 +55,6 @@ const validateCommandDef = defineCommand({
|
|
|
61
55
|
process.exit(1);
|
|
62
56
|
}
|
|
63
57
|
});
|
|
64
|
-
//#endregion
|
|
65
58
|
export { validateCommandDef };
|
|
66
59
|
|
|
67
60
|
//# sourceMappingURL=validate.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.mjs","names":[],"sources":["../../src/commands/validate.ts"],"sourcesContent":["/**\n * skilld validate <file> [--section <type>]\n *\n * Validates a generated skill section file against quality heuristics.\n * Exits non-zero on warnings so the LLM agent detects issues via exit code.\n */\n\nimport type { SkillSection } from '../agent/prompts/index.ts'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { defineCommand } from 'citty'\nimport { getSectionValidator } from '../agent/prompts/index.ts'\n\nconst SECTION_HEADINGS: Record<string, SkillSection> = {\n '## API Changes': 'api-changes',\n '## Best Practices': 'best-practices',\n}\n\n/** Infer section type from content headings */\nfunction inferSection(content: string): SkillSection | null {\n for (const [heading, section] of Object.entries(SECTION_HEADINGS)) {\n if (content.includes(heading))\n return section\n }\n // Custom sections don't have a fixed heading — fall back\n return 'custom'\n}\n\nexport const validateCommandDef = defineCommand({\n meta: { name: 'validate', description: 'Validate a generated skill section' },\n args: {\n file: {\n type: 'positional',\n description: 'Path to the section file to validate',\n required: true,\n },\n section: {\n type: 'string',\n description: 'Section type (api-changes, best-practices, custom). Auto-detected from heading if omitted.',\n },\n },\n\n /* eslint-disable no-console */\n async run({ args }) {\n const filePath = args.file as string\n if (!existsSync(filePath)) {\n console.error(`File not found: ${filePath}`)\n process.exit(1)\n }\n\n const content = readFileSync(filePath, 'utf-8').trim()\n if (!content) {\n console.error('File is empty')\n process.exit(1)\n }\n\n const section = (args.section as SkillSection) || inferSection(content)\n if (!section) {\n console.error('Could not infer section type — use --section flag')\n process.exit(1)\n }\n\n const validator = getSectionValidator(section)\n if (!validator) {\n console.log('OK: No validator for section type:', section)\n process.exit(0)\n }\n\n const warnings = validator(content)\n\n if (warnings.length === 0) {\n console.log('OK: No validation warnings')\n process.exit(0)\n }\n\n for (const w of warnings)\n console.log(`WARNING: ${w.warning}`)\n\n process.exit(1)\n },\n})\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.mjs","names":[],"sources":["../../src/commands/validate.ts"],"sourcesContent":["/**\n * skilld validate <file> [--section <type>]\n *\n * Validates a generated skill section file against quality heuristics.\n * Exits non-zero on warnings so the LLM agent detects issues via exit code.\n */\n\nimport type { SkillSection } from '../agent/prompts/index.ts'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { defineCommand } from 'citty'\nimport { getSectionValidator } from '../agent/prompts/index.ts'\n\nconst SECTION_HEADINGS: Record<string, SkillSection> = {\n '## API Changes': 'api-changes',\n '## Best Practices': 'best-practices',\n}\n\n/** Infer section type from content headings */\nfunction inferSection(content: string): SkillSection | null {\n for (const [heading, section] of Object.entries(SECTION_HEADINGS)) {\n if (content.includes(heading))\n return section\n }\n // Custom sections don't have a fixed heading — fall back\n return 'custom'\n}\n\nexport const validateCommandDef = defineCommand({\n meta: { name: 'validate', description: 'Validate a generated skill section' },\n args: {\n file: {\n type: 'positional',\n description: 'Path to the section file to validate',\n required: true,\n },\n section: {\n type: 'string',\n description: 'Section type (api-changes, best-practices, custom). Auto-detected from heading if omitted.',\n },\n },\n\n /* eslint-disable no-console */\n async run({ args }) {\n const filePath = args.file as string\n if (!existsSync(filePath)) {\n console.error(`File not found: ${filePath}`)\n process.exit(1)\n }\n\n const content = readFileSync(filePath, 'utf-8').trim()\n if (!content) {\n console.error('File is empty')\n process.exit(1)\n }\n\n const section = (args.section as SkillSection) || inferSection(content)\n if (!section) {\n console.error('Could not infer section type — use --section flag')\n process.exit(1)\n }\n\n const validator = getSectionValidator(section)\n if (!validator) {\n console.log('OK: No validator for section type:', section)\n process.exit(0)\n }\n\n const warnings = validator(content)\n\n if (warnings.length === 0) {\n console.log('OK: No validation warnings')\n process.exit(0)\n }\n\n for (const w of warnings)\n console.log(`WARNING: ${w.warning}`)\n\n process.exit(1)\n },\n})\n"],"mappings":";;;AAYA,MAAM,mBAAiD;CACrD,kBAAkB;CAClB,qBAAqB;CACtB;AAGD,SAAS,aAAa,SAAsC;AAC1D,MAAK,MAAM,CAAC,SAAS,YAAY,OAAO,QAAQ,iBAAiB,CAC/D,KAAI,QAAQ,SAAS,QAAQ,CAC3B,QAAO;AAGX,QAAO;;AAGT,MAAa,qBAAqB,cAAc;CAC9C,MAAM;EAAE,MAAM;EAAY,aAAa;EAAsC;CAC7E,MAAM;EACJ,MAAM;GACJ,MAAM;GACN,aAAa;GACb,UAAU;GACX;EACD,SAAS;GACP,MAAM;GACN,aAAa;;EAEhB;CAGD,MAAM,IAAI,EAAE,QAAQ;EAClB,MAAM,WAAW,KAAK;AACtB,MAAI,CAAC,WAAW,SAAS,EAAE;AACzB,WAAQ,MAAM,mBAAmB,WAAW;AAC5C,WAAQ,KAAK,EAAE;;EAGjB,MAAM,UAAU,aAAa,UAAU,QAAQ,CAAC,MAAM;AACtD,MAAI,CAAC,SAAS;AACZ,WAAQ,MAAM,gBAAgB;AAC9B,WAAQ,KAAK,EAAE;;EAGjB,MAAM,UAAW,KAAK,WAA4B,aAAa,QAAQ;AACvE,MAAI,CAAC,SAAS;AACZ,WAAQ,MAAM,oDAAoD;AAClE,WAAQ,KAAK,EAAE;;EAGjB,MAAM,YAAY,oBAAoB,QAAQ;AAC9C,MAAI,CAAC,WAAW;AACd,WAAQ,IAAI,sCAAsC,QAAQ;AAC1D,WAAQ,KAAK,EAAE;;EAGjB,MAAM,WAAW,UAAU,QAAQ;AAEnC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAQ,IAAI,6BAA6B;AACzC,WAAQ,KAAK,EAAE;;AAGjB,OAAK,MAAM,KAAK,SACd,SAAQ,IAAI,YAAY,EAAE,UAAU;AAEtC,UAAQ,KAAK,EAAE;;CAElB,CAAC"}
|
package/dist/_chunks/wizard.mjs
CHANGED
|
@@ -3,7 +3,6 @@ import { c as getOAuthProviderList, i as getAvailableModels, l as loginOAuthProv
|
|
|
3
3
|
import { g as pickModel, j as updateConfig, n as NO_MODELS_MESSAGE, p as isInteractive, r as OAUTH_NOTE, w as defaultFeatures } from "./cli-helpers.mjs";
|
|
4
4
|
import { execSync } from "node:child_process";
|
|
5
5
|
import * as p from "@clack/prompts";
|
|
6
|
-
//#region src/commands/wizard.ts
|
|
7
6
|
function hasGhCli() {
|
|
8
7
|
if (process.env.SKILLD_NO_GH) return false;
|
|
9
8
|
try {
|
|
@@ -73,7 +72,7 @@ every session - no hallucinated APIs.
|
|
|
73
72
|
discussions: selected.includes("discussions"),
|
|
74
73
|
releases: selected.includes("releases")
|
|
75
74
|
};
|
|
76
|
-
p.note("An LLM can optionally summarize raw docs into a focused reference\nhighlighting best practices, gotchas, and migrations.\n\n\x1B[1mWithout LLM:\x1B[0m ~2 KB skill with package metadata, types, and links\n\x1B[1mWith LLM:\x1B[0m ~5 KB skill with curated gotchas, patterns, and migration notes\n\n\x1B[1mThis is a one-time build step\x1B[0m - it generates the SKILL.md, then your\ncoding agent reads the result every session. Can be a different model.\n\n\x1B[90mWorks with API keys
|
|
75
|
+
p.note("An LLM can optionally summarize raw docs into a focused reference\nhighlighting best practices, gotchas, and migrations.\n\n\x1B[1mWithout LLM:\x1B[0m ~2 KB skill with package metadata, types, and links\n\x1B[1mWith LLM:\x1B[0m ~5 KB skill with curated gotchas, patterns, and migration notes\n\n\x1B[1mThis is a one-time build step\x1B[0m - it generates the SKILL.md, then your\ncoding agent reads the result every session. Can be a different model.\n\n\x1B[90mWorks with API keys (ANTHROPIC_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY)\nor CLI tools (claude, gemini, codex).\x1B[0m", "Enhancement model (optional)");
|
|
77
76
|
let modelId;
|
|
78
77
|
let skippedEnhancement = false;
|
|
79
78
|
let oauthJustConnected = false;
|
|
@@ -91,21 +90,26 @@ every session - no hallucinated APIs.
|
|
|
91
90
|
}
|
|
92
91
|
if (providers.size > 0) p.log.success(`Found: ${[...providers].join(", ")}`);
|
|
93
92
|
}
|
|
93
|
+
const afterOptions = getOAuthProviderList().length > 0 ? [{
|
|
94
|
+
label: "⚠ Connect OAuth provider...",
|
|
95
|
+
value: "_connect",
|
|
96
|
+
hint: "may violate provider ToS"
|
|
97
|
+
}, {
|
|
98
|
+
label: "Skip enhancement",
|
|
99
|
+
value: "_skip",
|
|
100
|
+
hint: "base skill with docs, issues, and types, add LLM later via `skilld config`"
|
|
101
|
+
}] : [{
|
|
102
|
+
label: "Skip enhancement",
|
|
103
|
+
value: "_skip",
|
|
104
|
+
hint: "base skill with docs, issues, and types, add LLM later via `skilld config`"
|
|
105
|
+
}];
|
|
94
106
|
const choice = await pickModel(allModels, {
|
|
95
107
|
before: allModels.length > 0 ? [{
|
|
96
108
|
label: "Auto",
|
|
97
109
|
value: "_auto",
|
|
98
110
|
hint: "picks best available model from connected providers"
|
|
99
111
|
}] : [],
|
|
100
|
-
after:
|
|
101
|
-
label: "Connect OAuth provider...",
|
|
102
|
-
value: "_connect",
|
|
103
|
-
hint: "use existing Claude Pro, ChatGPT Plus, etc."
|
|
104
|
-
}, {
|
|
105
|
-
label: "Skip enhancement",
|
|
106
|
-
value: "_skip",
|
|
107
|
-
hint: "base skill with docs, issues, and types - add LLM later via `skilld config`"
|
|
108
|
-
}]
|
|
112
|
+
after: afterOptions
|
|
109
113
|
});
|
|
110
114
|
if (choice === null) {
|
|
111
115
|
p.cancel("Setup cancelled");
|
|
@@ -180,7 +184,6 @@ async function wizardConnectProvider() {
|
|
|
180
184
|
p.log.success(`Connected to ${name}`);
|
|
181
185
|
}
|
|
182
186
|
}
|
|
183
|
-
//#endregion
|
|
184
187
|
export { runWizard as t };
|
|
185
188
|
|
|
186
189
|
//# sourceMappingURL=wizard.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.mjs","names":["agents"],"sources":["../../src/commands/wizard.ts"],"sourcesContent":["import type { AgentType, OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { getOAuthProviderList, loginOAuthProvider } from '../agent/clis/pi-ai.ts'\nimport { agents, getAvailableModels, getModelName } from '../agent/index.ts'\nimport { isInteractive, NO_MODELS_MESSAGE, OAUTH_NOTE, pickModel } from '../cli-helpers.ts'\nimport { defaultFeatures, updateConfig } from '../core/config.ts'\n\nfunction hasGhCli(): boolean {\n if (process.env.SKILLD_NO_GH)\n return false\n try {\n execSync('gh --version', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n}\n\nexport interface WizardOptions {\n /** Resolved target agent, if known */\n agent?: AgentType\n /** Show next-steps outro when done (default: true) */\n showOutro?: boolean\n}\n\nexport async function runWizard(opts: WizardOptions = {}): Promise<boolean> {\n if (!isInteractive())\n return false\n\n const agentLabel = opts.agent ? agents[opts.agent].displayName : null\n const skillsDir = opts.agent ? agents[opts.agent].skillsDir : '.claude/skills'\n const agentLine = agentLabel\n ? `\\n\\x1B[90mTarget agent: ${agentLabel}\\x1B[0m`\n : ''\n\n p.note(\n `Your AI agent reads docs from its training data - but APIs change,\\n`\n + `versions drift, and patterns go stale. Skilld fixes this.\\n`\n + `\\n`\n + `It generates a \\x1B[1mSKILL.md\\x1B[0m - a markdown reference card built from\\n`\n + `the \\x1B[1mactual docs, issues, and release notes\\x1B[0m for the exact\\n`\n + `package versions in your project. Your agent reads this file\\n`\n + `every session - no hallucinated APIs.\\n`\n + `\\n`\n + `\\x1B[1mHow it works:\\x1B[0m\\n`\n + ` 1. Fetch docs, issues, and types for your packages\\n`\n + ` 2. Optionally compress with an LLM into a concise cheat sheet\\n`\n + `\\n`\n + `\\x1B[90mExample: \\`skilld add vue\\` creates ${skillsDir}/vue-skilld/SKILL.md\\n`\n + `Your agent then knows the right APIs, gotchas, and patterns\\n`\n + `for your exact version.\\x1B[0m${\n agentLine}`,\n 'Welcome to skilld',\n )\n\n const ghInstalled = hasGhCli()\n\n if (ghInstalled) {\n p.log.success(\n 'GitHub CLI detected — will use it to pull issues and discussions.',\n )\n }\n else {\n p.log.info(\n '\\x1B[90mGitHub CLI not installed — issues and discussions disabled.\\n'\n + ' Install later to enable: \\x1B[36mhttps://cli.github.com\\x1B[0m',\n )\n }\n\n // Feature toggles\n const selected = await p.multiselect({\n message: 'What data sources should skills include?',\n options: [\n { label: 'Local search', value: 'search' as const, hint: 'query engine for `skilld search` across all skill docs' },\n { label: 'Release notes', value: 'releases' as const, hint: 'changelogs and migration notes per version' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'common bugs, workarounds, and solutions', disabled: !ghInstalled },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'community Q&A and usage examples', disabled: !ghInstalled },\n ],\n initialValues: [\n ...Object.entries(defaultFeatures)\n .filter(([, v]) => v)\n .map(([k]) => k),\n ...(ghInstalled ? ['issues', 'discussions'] as const : []),\n ] as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Setup cancelled')\n return false\n }\n\n const features: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n\n // Enhancement model - optional, independent of target agent\n p.note(\n 'An LLM can optionally summarize raw docs into a focused reference\\n'\n + 'highlighting best practices, gotchas, and migrations.\\n'\n + '\\n'\n + '\\x1B[1mWithout LLM:\\x1B[0m ~2 KB skill with package metadata, types, and links\\n'\n + '\\x1B[1mWith LLM:\\x1B[0m ~5 KB skill with curated gotchas, patterns, and migration notes\\n'\n + '\\n'\n + '\\x1B[1mThis is a one-time build step\\x1B[0m - it generates the SKILL.md, then your\\n'\n + 'coding agent reads the result every session. Can be a different model.\\n'\n + '\\n'\n + '\\x1B[90mWorks with API keys, existing subscriptions (Claude Pro, ChatGPT Plus,\\n'\n + 'Copilot, Gemini) via OAuth, or CLI tools (claude, gemini, codex).\\x1B[0m',\n 'Enhancement model (optional)',\n )\n\n let modelId: OptimizeModel | undefined\n let skippedEnhancement = false\n let oauthJustConnected = false\n\n // Loop so user can connect OAuth then come back to pick a model\n while (true) {\n const allModels = process.env.SKILLD_NO_AGENTS ? [] : await getAvailableModels()\n\n if (allModels.length === 0) {\n p.log.warn(NO_MODELS_MESSAGE)\n }\n else if (oauthJustConnected) {\n p.log.step(`${allModels.length} models now available. Select one below.`)\n }\n else {\n // Show which providers were found by name (e.g. \"Anthropic via CLI, OpenAI via API key\")\n const providers = new Set<string>()\n for (const m of allModels) {\n const vendor = m.vendorGroup ?? m.providerName\n if (!m.id.startsWith('pi:'))\n providers.add(`${vendor} via CLI`)\n else if (m.hint?.includes('API key'))\n providers.add(`${vendor} via API key`)\n else if (m.hint?.includes('OAuth'))\n providers.add(`${vendor} via OAuth`)\n }\n if (providers.size > 0)\n p.log.success(`Found: ${[...providers].join(', ')}`)\n }\n\n const choice = await pickModel(allModels, {\n before: allModels.length > 0\n ? [{ label: 'Auto', value: '_auto', hint: 'picks best available model from connected providers' }]\n : [],\n after: [\n { label: 'Connect OAuth provider...', value: '_connect', hint: 'use existing Claude Pro, ChatGPT Plus, etc.' },\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types - add LLM later via `skilld config`' },\n ],\n })\n\n if (choice === null) {\n p.cancel('Setup cancelled')\n return false\n }\n\n if (choice === '_connect') {\n await wizardConnectProvider()\n oauthJustConnected = true\n continue\n }\n\n if (choice === '_skip') {\n skippedEnhancement = true\n break\n }\n if (choice === '_auto')\n break\n\n modelId = choice as OptimizeModel\n break\n }\n\n updateConfig({\n features,\n ...(modelId\n ? { model: modelId, skipLlm: false }\n : { model: undefined, skipLlm: skippedEnhancement }),\n })\n\n // Summary of what was saved\n const modelSummary = modelId\n ? getModelName(modelId)\n : skippedEnhancement\n ? 'none (raw docs)'\n : 'auto'\n const featureList = Object.entries(features).filter(([, v]) => v).map(([k]) => k).join(', ') || 'none'\n p.log.success(`Model: ${modelSummary} · Features: ${featureList}`)\n\n if (opts.showOutro !== false) {\n p.note(\n 'Run \\x1B[36mskilld add <pkg>\\x1B[0m to generate skills for specific packages\\n'\n + 'Run \\x1B[36mskilld\\x1B[0m to scan your project and pick packages interactively\\n'\n + 'Run \\x1B[36mskilld config\\x1B[0m to change settings later',\n 'Setup complete',\n )\n }\n return true\n}\n\nasync function wizardConnectProvider(): Promise<void> {\n p.note(OAUTH_NOTE, 'How OAuth works')\n\n const providers = getOAuthProviderList()\n const provider = await p.select({\n message: 'Connect provider',\n options: providers.map(pr => ({\n label: pr.name,\n value: pr.id,\n hint: pr.loggedIn ? 'connected' : undefined,\n })),\n })\n\n if (p.isCancel(provider))\n return\n\n const spinner = p.spinner()\n spinner.start('Connecting...')\n\n const success = await loginOAuthProvider(provider as string, {\n onAuth: (url, instructions) => {\n spinner.stop('Open this URL in your browser:')\n p.log.info(` \\x1B[36m${url}\\x1B[0m`)\n if (instructions)\n p.log.info(` \\x1B[90m${instructions}\\x1B[0m`)\n spinner.start('Waiting for authentication...')\n },\n onPrompt: async (message, placeholder) => {\n const value = await p.text({ message, placeholder })\n if (p.isCancel(value))\n return ''\n return value as string\n },\n onProgress: msg => p.log.step(msg),\n }).catch((err: Error) => {\n spinner.stop(`Login failed: ${err.message}`)\n return false\n })\n\n spinner.stop()\n\n if (success) {\n const name = providers.find(pr => pr.id === provider)?.name ?? provider\n p.log.success(`Connected to ${name}`)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wizard.mjs","names":["agents"],"sources":["../../src/commands/wizard.ts"],"sourcesContent":["import type { AgentType, OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { getOAuthProviderList, loginOAuthProvider } from '../agent/clis/pi-ai.ts'\nimport { agents, getAvailableModels, getModelName } from '../agent/index.ts'\nimport { isInteractive, NO_MODELS_MESSAGE, OAUTH_NOTE, pickModel } from '../cli-helpers.ts'\nimport { defaultFeatures, updateConfig } from '../core/config.ts'\n\nfunction hasGhCli(): boolean {\n if (process.env.SKILLD_NO_GH)\n return false\n try {\n execSync('gh --version', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n}\n\nexport interface WizardOptions {\n /** Resolved target agent, if known */\n agent?: AgentType\n /** Show next-steps outro when done (default: true) */\n showOutro?: boolean\n}\n\nexport async function runWizard(opts: WizardOptions = {}): Promise<boolean> {\n if (!isInteractive())\n return false\n\n const agentLabel = opts.agent ? agents[opts.agent].displayName : null\n const skillsDir = opts.agent ? agents[opts.agent].skillsDir : '.claude/skills'\n const agentLine = agentLabel\n ? `\\n\\x1B[90mTarget agent: ${agentLabel}\\x1B[0m`\n : ''\n\n p.note(\n `Your AI agent reads docs from its training data - but APIs change,\\n`\n + `versions drift, and patterns go stale. Skilld fixes this.\\n`\n + `\\n`\n + `It generates a \\x1B[1mSKILL.md\\x1B[0m - a markdown reference card built from\\n`\n + `the \\x1B[1mactual docs, issues, and release notes\\x1B[0m for the exact\\n`\n + `package versions in your project. Your agent reads this file\\n`\n + `every session - no hallucinated APIs.\\n`\n + `\\n`\n + `\\x1B[1mHow it works:\\x1B[0m\\n`\n + ` 1. Fetch docs, issues, and types for your packages\\n`\n + ` 2. Optionally compress with an LLM into a concise cheat sheet\\n`\n + `\\n`\n + `\\x1B[90mExample: \\`skilld add vue\\` creates ${skillsDir}/vue-skilld/SKILL.md\\n`\n + `Your agent then knows the right APIs, gotchas, and patterns\\n`\n + `for your exact version.\\x1B[0m${\n agentLine}`,\n 'Welcome to skilld',\n )\n\n const ghInstalled = hasGhCli()\n\n if (ghInstalled) {\n p.log.success(\n 'GitHub CLI detected — will use it to pull issues and discussions.',\n )\n }\n else {\n p.log.info(\n '\\x1B[90mGitHub CLI not installed — issues and discussions disabled.\\n'\n + ' Install later to enable: \\x1B[36mhttps://cli.github.com\\x1B[0m',\n )\n }\n\n // Feature toggles\n const selected = await p.multiselect({\n message: 'What data sources should skills include?',\n options: [\n { label: 'Local search', value: 'search' as const, hint: 'query engine for `skilld search` across all skill docs' },\n { label: 'Release notes', value: 'releases' as const, hint: 'changelogs and migration notes per version' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'common bugs, workarounds, and solutions', disabled: !ghInstalled },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'community Q&A and usage examples', disabled: !ghInstalled },\n ],\n initialValues: [\n ...Object.entries(defaultFeatures)\n .filter(([, v]) => v)\n .map(([k]) => k),\n ...(ghInstalled ? ['issues', 'discussions'] as const : []),\n ] as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Setup cancelled')\n return false\n }\n\n const features: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n\n // Enhancement model - optional, independent of target agent\n p.note(\n 'An LLM can optionally summarize raw docs into a focused reference\\n'\n + 'highlighting best practices, gotchas, and migrations.\\n'\n + '\\n'\n + '\\x1B[1mWithout LLM:\\x1B[0m ~2 KB skill with package metadata, types, and links\\n'\n + '\\x1B[1mWith LLM:\\x1B[0m ~5 KB skill with curated gotchas, patterns, and migration notes\\n'\n + '\\n'\n + '\\x1B[1mThis is a one-time build step\\x1B[0m - it generates the SKILL.md, then your\\n'\n + 'coding agent reads the result every session. Can be a different model.\\n'\n + '\\n'\n + '\\x1B[90mWorks with API keys (ANTHROPIC_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY)\\n'\n + 'or CLI tools (claude, gemini, codex).\\x1B[0m',\n 'Enhancement model (optional)',\n )\n\n let modelId: OptimizeModel | undefined\n let skippedEnhancement = false\n let oauthJustConnected = false\n\n // Loop so user can connect OAuth then come back to pick a model\n while (true) {\n const allModels = process.env.SKILLD_NO_AGENTS ? [] : await getAvailableModels()\n\n if (allModels.length === 0) {\n p.log.warn(NO_MODELS_MESSAGE)\n }\n else if (oauthJustConnected) {\n p.log.step(`${allModels.length} models now available. Select one below.`)\n }\n else {\n // Show which providers were found by name (e.g. \"Anthropic via CLI, OpenAI via API key\")\n const providers = new Set<string>()\n for (const m of allModels) {\n const vendor = m.vendorGroup ?? m.providerName\n if (!m.id.startsWith('pi:'))\n providers.add(`${vendor} via CLI`)\n else if (m.hint?.includes('API key'))\n providers.add(`${vendor} via API key`)\n else if (m.hint?.includes('OAuth'))\n providers.add(`${vendor} via OAuth`)\n }\n if (providers.size > 0)\n p.log.success(`Found: ${[...providers].join(', ')}`)\n }\n\n const oauthProviders = getOAuthProviderList()\n const afterOptions = oauthProviders.length > 0\n ? [\n { label: '⚠ Connect OAuth provider...', value: '_connect', hint: 'may violate provider ToS' },\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types, add LLM later via `skilld config`' },\n ]\n : [\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types, add LLM later via `skilld config`' },\n ]\n\n const choice = await pickModel(allModels, {\n before: allModels.length > 0\n ? [{ label: 'Auto', value: '_auto', hint: 'picks best available model from connected providers' }]\n : [],\n after: afterOptions,\n })\n\n if (choice === null) {\n p.cancel('Setup cancelled')\n return false\n }\n\n if (choice === '_connect') {\n await wizardConnectProvider()\n oauthJustConnected = true\n continue\n }\n\n if (choice === '_skip') {\n skippedEnhancement = true\n break\n }\n if (choice === '_auto')\n break\n\n modelId = choice as OptimizeModel\n break\n }\n\n updateConfig({\n features,\n ...(modelId\n ? { model: modelId, skipLlm: false }\n : { model: undefined, skipLlm: skippedEnhancement }),\n })\n\n // Summary of what was saved\n const modelSummary = modelId\n ? getModelName(modelId)\n : skippedEnhancement\n ? 'none (raw docs)'\n : 'auto'\n const featureList = Object.entries(features).filter(([, v]) => v).map(([k]) => k).join(', ') || 'none'\n p.log.success(`Model: ${modelSummary} · Features: ${featureList}`)\n\n if (opts.showOutro !== false) {\n p.note(\n 'Run \\x1B[36mskilld add <pkg>\\x1B[0m to generate skills for specific packages\\n'\n + 'Run \\x1B[36mskilld\\x1B[0m to scan your project and pick packages interactively\\n'\n + 'Run \\x1B[36mskilld config\\x1B[0m to change settings later',\n 'Setup complete',\n )\n }\n return true\n}\n\nasync function wizardConnectProvider(): Promise<void> {\n p.note(OAUTH_NOTE, 'How OAuth works')\n\n const providers = getOAuthProviderList()\n const provider = await p.select({\n message: 'Connect provider',\n options: providers.map(pr => ({\n label: pr.name,\n value: pr.id,\n hint: pr.loggedIn ? 'connected' : undefined,\n })),\n })\n\n if (p.isCancel(provider))\n return\n\n const spinner = p.spinner()\n spinner.start('Connecting...')\n\n const success = await loginOAuthProvider(provider as string, {\n onAuth: (url, instructions) => {\n spinner.stop('Open this URL in your browser:')\n p.log.info(` \\x1B[36m${url}\\x1B[0m`)\n if (instructions)\n p.log.info(` \\x1B[90m${instructions}\\x1B[0m`)\n spinner.start('Waiting for authentication...')\n },\n onPrompt: async (message, placeholder) => {\n const value = await p.text({ message, placeholder })\n if (p.isCancel(value))\n return ''\n return value as string\n },\n onProgress: msg => p.log.step(msg),\n }).catch((err: Error) => {\n spinner.stop(`Login failed: ${err.message}`)\n return false\n })\n\n spinner.stop()\n\n if (success) {\n const name = providers.find(pr => pr.id === provider)?.name ?? provider\n p.log.success(`Connected to ${name}`)\n }\n}\n"],"mappings":"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"}
|
package/dist/_chunks/yaml.mjs
CHANGED
|
@@ -1,24 +1,8 @@
|
|
|
1
|
-
//#region src/core/yaml.ts
|
|
2
|
-
/**
|
|
3
|
-
* Minimal YAML value escaping/unescaping for our hand-rolled parsers.
|
|
4
|
-
*
|
|
5
|
-
* Handles the characters that break naive `:` splitting and quote stripping:
|
|
6
|
-
* colons, quotes, newlines, backslashes.
|
|
7
|
-
*/
|
|
8
|
-
/** Characters that require double-quoting in YAML values */
|
|
9
1
|
const NEEDS_QUOTING = /[:"'\\\n\r\t#{}[\],&*!|>%@`]/;
|
|
10
|
-
/**
|
|
11
|
-
* Escape a value for safe YAML emission. Always double-quotes if the value
|
|
12
|
-
* contains any special characters; returns unquoted for simple values.
|
|
13
|
-
*/
|
|
14
2
|
function yamlEscape(value) {
|
|
15
3
|
if (!NEEDS_QUOTING.test(value)) return value;
|
|
16
4
|
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")}"`;
|
|
17
5
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Parse a raw YAML value string back to its actual value.
|
|
20
|
-
* Handles double-quoted (with escapes), single-quoted, and unquoted values.
|
|
21
|
-
*/
|
|
22
6
|
function yamlUnescape(raw) {
|
|
23
7
|
const trimmed = raw.trim();
|
|
24
8
|
if (!trimmed) return "";
|
|
@@ -35,10 +19,6 @@ function yamlUnescape(raw) {
|
|
|
35
19
|
if (trimmed.startsWith("'") && trimmed.endsWith("'")) return trimmed.slice(1, -1);
|
|
36
20
|
return trimmed;
|
|
37
21
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Parse a YAML `key: value` line, correctly handling colons inside quoted values.
|
|
40
|
-
* Returns [key, value] or null if not a valid KV line.
|
|
41
|
-
*/
|
|
42
22
|
function yamlParseKV(line) {
|
|
43
23
|
const trimmed = line.trim();
|
|
44
24
|
const colonIdx = trimmed.indexOf(":");
|
|
@@ -48,7 +28,6 @@ function yamlParseKV(line) {
|
|
|
48
28
|
if (!key) return null;
|
|
49
29
|
return [key, yamlUnescape(rawValue)];
|
|
50
30
|
}
|
|
51
|
-
//#endregion
|
|
52
31
|
export { yamlParseKV as n, yamlUnescape as r, yamlEscape as t };
|
|
53
32
|
|
|
54
33
|
//# sourceMappingURL=yaml.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yaml.mjs","names":[],"sources":["../../src/core/yaml.ts"],"sourcesContent":["/**\n * Minimal YAML value escaping/unescaping for our hand-rolled parsers.\n *\n * Handles the characters that break naive `:` splitting and quote stripping:\n * colons, quotes, newlines, backslashes.\n */\n\n/** Characters that require double-quoting in YAML values */\nconst NEEDS_QUOTING = /[:\"'\\\\\\n\\r\\t#{}[\\],&*!|>%@`]/\n\n/**\n * Escape a value for safe YAML emission. Always double-quotes if the value\n * contains any special characters; returns unquoted for simple values.\n */\nexport function yamlEscape(value: string): string {\n if (!NEEDS_QUOTING.test(value))\n return value\n // Escape backslashes first, then double quotes, then control chars\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n return `\"${escaped}\"`\n}\n\n/**\n * Parse a raw YAML value string back to its actual value.\n * Handles double-quoted (with escapes), single-quoted, and unquoted values.\n */\nexport function yamlUnescape(raw: string): string {\n const trimmed = raw.trim()\n if (!trimmed)\n return ''\n\n // Double-quoted: single-pass escape processing to handle backslashes correctly\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1)\n .replace(/\\\\([\\\\nrt\"])/g, (_, c) => {\n switch (c) {\n case '\\\\': return '\\\\'\n case 'n': return '\\n'\n case 'r': return '\\r'\n case 't': return '\\t'\n case '\"': return '\"'\n default: return c\n }\n })\n }\n\n // Single-quoted: no escape processing, just strip quotes\n if (trimmed.startsWith('\\'') && trimmed.endsWith('\\''))\n return trimmed.slice(1, -1)\n\n return trimmed\n}\n\n/**\n * Parse a YAML `key: value` line, correctly handling colons inside quoted values.\n * Returns [key, value] or null if not a valid KV line.\n */\nexport function yamlParseKV(line: string): [string, string] | null {\n const trimmed = line.trim()\n // Find the first `: ` or `:\\n` or `:$` — the YAML key-value separator\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx === -1)\n return null\n const key = trimmed.slice(0, colonIdx).trim()\n const rawValue = trimmed.slice(colonIdx + 1)\n if (!key)\n return null\n return [key, yamlUnescape(rawValue)]\n}\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"yaml.mjs","names":[],"sources":["../../src/core/yaml.ts"],"sourcesContent":["/**\n * Minimal YAML value escaping/unescaping for our hand-rolled parsers.\n *\n * Handles the characters that break naive `:` splitting and quote stripping:\n * colons, quotes, newlines, backslashes.\n */\n\n/** Characters that require double-quoting in YAML values */\nconst NEEDS_QUOTING = /[:\"'\\\\\\n\\r\\t#{}[\\],&*!|>%@`]/\n\n/**\n * Escape a value for safe YAML emission. Always double-quotes if the value\n * contains any special characters; returns unquoted for simple values.\n */\nexport function yamlEscape(value: string): string {\n if (!NEEDS_QUOTING.test(value))\n return value\n // Escape backslashes first, then double quotes, then control chars\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n return `\"${escaped}\"`\n}\n\n/**\n * Parse a raw YAML value string back to its actual value.\n * Handles double-quoted (with escapes), single-quoted, and unquoted values.\n */\nexport function yamlUnescape(raw: string): string {\n const trimmed = raw.trim()\n if (!trimmed)\n return ''\n\n // Double-quoted: single-pass escape processing to handle backslashes correctly\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1)\n .replace(/\\\\([\\\\nrt\"])/g, (_, c) => {\n switch (c) {\n case '\\\\': return '\\\\'\n case 'n': return '\\n'\n case 'r': return '\\r'\n case 't': return '\\t'\n case '\"': return '\"'\n default: return c\n }\n })\n }\n\n // Single-quoted: no escape processing, just strip quotes\n if (trimmed.startsWith('\\'') && trimmed.endsWith('\\''))\n return trimmed.slice(1, -1)\n\n return trimmed\n}\n\n/**\n * Parse a YAML `key: value` line, correctly handling colons inside quoted values.\n * Returns [key, value] or null if not a valid KV line.\n */\nexport function yamlParseKV(line: string): [string, string] | null {\n const trimmed = line.trim()\n // Find the first `: ` or `:\\n` or `:$` — the YAML key-value separator\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx === -1)\n return null\n const key = trimmed.slice(0, colonIdx).trim()\n const rawValue = trimmed.slice(colonIdx + 1)\n if (!key)\n return null\n return [key, yamlUnescape(rawValue)]\n}\n"],"mappings":";;;;;;;;AAcA,KAAA,QAAgB,WAAW,KAAuB,IAAA,QAAA,SAAA,KAAA,CAAA,QAAA,QAAA,MAAA,GAAA,GAAA,CAAA,QAAA,kBAAA,GAAA,MAAA;AAChD,UAAK,GAAL;GASA,KAAO,KANS,QACb;;;;;;;GAaH;AACA,KAAI,QAAC,WACI,IAAA,IAAA,QAAA,SAAA,IAAA,CAAA,QAAA,QAAA,MAAA,GAAA,GAAA;AAGT,QAAI;;SAKS,YAAY,MAAA;OACjB,UAAU,KAAO,MAAA;OACjB,WAAU,QAAO,QAAA,IAAA;KACjB,aAAU,GAAO,QAAA;OACjB,MAAS,QAAO,MAAA,GAAA,SAAA,CAAA,MAAA;;KAElB,CAAA,IAAA,QAAA;AAIN,QAAI,CAAA,KAAQ,aAAW,SAAS,CAAA"}
|
package/dist/agent/index.d.mts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
//#region src/core/config.d.ts
|
|
2
1
|
interface FeaturesConfig {
|
|
3
2
|
search: boolean;
|
|
4
3
|
issues: boolean;
|
|
5
4
|
discussions: boolean;
|
|
6
5
|
releases: boolean;
|
|
7
6
|
}
|
|
8
|
-
//#endregion
|
|
9
|
-
//#region src/agent/prompts/optional/types.d.ts
|
|
10
7
|
interface SectionValidationWarning {
|
|
11
8
|
warning: string;
|
|
12
9
|
}
|
|
@@ -14,8 +11,6 @@ interface CustomPrompt {
|
|
|
14
11
|
heading: string;
|
|
15
12
|
body: string;
|
|
16
13
|
}
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/agent/prompts/prompt.d.ts
|
|
19
14
|
type SkillSection = 'api-changes' | 'best-practices' | 'custom';
|
|
20
15
|
/** Output file per section (inside .skilld/) */
|
|
21
16
|
declare const SECTION_OUTPUT_FILES: Record<SkillSection, string>;
|
|
@@ -85,8 +80,6 @@ declare function buildAllSectionPrompts(opts: BuildSkillPromptOptions & {
|
|
|
85
80
|
* - Strips agent-specific rules
|
|
86
81
|
*/
|
|
87
82
|
declare function portabilizePrompt(prompt: string, section?: SkillSection): string;
|
|
88
|
-
//#endregion
|
|
89
|
-
//#region src/agent/prompts/skill.d.ts
|
|
90
83
|
interface SkillOptions {
|
|
91
84
|
name: string;
|
|
92
85
|
version?: string;
|
|
@@ -125,8 +118,6 @@ interface SkillOptions {
|
|
|
125
118
|
eject?: boolean;
|
|
126
119
|
}
|
|
127
120
|
declare function generateSkillMd(opts: SkillOptions): string;
|
|
128
|
-
//#endregion
|
|
129
|
-
//#region src/agent/types.d.ts
|
|
130
121
|
/**
|
|
131
122
|
* Agent types and interfaces
|
|
132
123
|
*/
|
|
@@ -138,8 +129,6 @@ interface SkillMetadata {
|
|
|
138
129
|
releasedAt?: string;
|
|
139
130
|
description?: string;
|
|
140
131
|
}
|
|
141
|
-
//#endregion
|
|
142
|
-
//#region src/agent/clis/types.d.ts
|
|
143
132
|
type OptimizeModel = 'opus' | 'sonnet' | 'haiku' | 'gemini-3.1-pro' | 'gemini-3-flash' | 'gpt-5.3-codex' | 'gpt-5.3-codex-spark' | 'gpt-5.2-codex' | `pi:${string}`;
|
|
144
133
|
interface ModelInfo {
|
|
145
134
|
id: OptimizeModel;
|
|
@@ -204,8 +193,6 @@ interface OptimizeResult {
|
|
|
204
193
|
cost?: number;
|
|
205
194
|
debugLogsDir?: string;
|
|
206
195
|
}
|
|
207
|
-
//#endregion
|
|
208
|
-
//#region src/agent/clis/index.d.ts
|
|
209
196
|
interface ToolProgressLog {
|
|
210
197
|
message: (msg: string) => void;
|
|
211
198
|
}
|
|
@@ -215,8 +202,6 @@ declare function getModelName(id: OptimizeModel): string;
|
|
|
215
202
|
declare function getModelLabel(id: OptimizeModel): string;
|
|
216
203
|
declare function getAvailableModels(): Promise<ModelInfo[]>;
|
|
217
204
|
declare function optimizeDocs(opts: OptimizeDocsOptions): Promise<OptimizeResult>;
|
|
218
|
-
//#endregion
|
|
219
|
-
//#region src/agent/detect-imports.d.ts
|
|
220
205
|
/**
|
|
221
206
|
* Detect directly-used npm packages by scanning source files
|
|
222
207
|
* Uses mlly for proper ES module parsing + tinyglobby for file discovery
|
|
@@ -235,8 +220,6 @@ interface DetectResult {
|
|
|
235
220
|
* Async with gitignore support for proper spinner animation
|
|
236
221
|
*/
|
|
237
222
|
declare function detectImportedPackages(cwd?: string): Promise<DetectResult>;
|
|
238
|
-
//#endregion
|
|
239
|
-
//#region src/agent/detect.d.ts
|
|
240
223
|
/**
|
|
241
224
|
* Detect which agents are installed on the system
|
|
242
225
|
*/
|
|
@@ -259,8 +242,6 @@ declare function detectProjectAgents(): AgentType[];
|
|
|
259
242
|
* Get the version of an agent's CLI (if available)
|
|
260
243
|
*/
|
|
261
244
|
declare function getAgentVersion(agentType: AgentType): string | null;
|
|
262
|
-
//#endregion
|
|
263
|
-
//#region src/agent/install.d.ts
|
|
264
245
|
/**
|
|
265
246
|
* Sanitize skill name for filesystem
|
|
266
247
|
*/
|
|
@@ -304,8 +285,6 @@ declare function linkSkillToAgents(skillName: string, sharedDir: string, cwd: st
|
|
|
304
285
|
* Remove per-agent symlinks for a skill when removing from shared dir.
|
|
305
286
|
*/
|
|
306
287
|
declare function unlinkSkillFromAgents(skillName: string, cwd: string, agentType?: AgentType): void;
|
|
307
|
-
//#endregion
|
|
308
|
-
//#region src/agent/targets/types.d.ts
|
|
309
288
|
interface FrontmatterField {
|
|
310
289
|
/** Field name in YAML frontmatter */
|
|
311
290
|
name: string;
|
|
@@ -360,9 +339,6 @@ interface AgentTarget {
|
|
|
360
339
|
/** Agent-specific instruction text for skill activation (written to instructionFile) */
|
|
361
340
|
skillActivationHint?: string;
|
|
362
341
|
}
|
|
363
|
-
//#endregion
|
|
364
|
-
//#region src/agent/targets/registry.d.ts
|
|
365
342
|
declare const targets: Record<AgentType, AgentTarget>;
|
|
366
|
-
//#endregion
|
|
367
343
|
export { type AgentTarget, type AgentType, type CustomPrompt, type FrontmatterField, type ModelInfo, type OptimizeDocsOptions, type OptimizeModel, type OptimizeResult, SECTION_MERGE_ORDER, SECTION_OUTPUT_FILES, type SkillMetadata, type SkillOptions, type SkillSection, type StreamProgress, targets as agents, buildAllSectionPrompts, buildSectionPrompt, computeSkillDirName, createToolProgress, detectImportedPackages, detectInstalledAgents, detectProjectAgents, detectTargetAgent, extractMarkedSections, generateSkillMd, getAgentVersion, getAvailableModels, getModelLabel, getModelName, getSectionValidator, installSkillForAgents, linkSkillToAgents, optimizeDocs, portabilizePrompt, sanitizeName, unlinkSkillFromAgents, wrapSection };
|
|
368
344
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/core/config.ts","../../src/agent/prompts/optional/types.ts","../../src/agent/prompts/prompt.ts","../../src/agent/prompts/skill.ts","../../src/agent/types.ts","../../src/agent/clis/types.ts","../../src/agent/clis/index.ts","../../src/agent/detect-imports.ts","../../src/agent/detect.ts","../../src/agent/install.ts","../../src/agent/targets/types.ts","../../src/agent/targets/registry.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/core/config.ts","../../src/agent/prompts/optional/types.ts","../../src/agent/prompts/prompt.ts","../../src/agent/prompts/skill.ts","../../src/agent/types.ts","../../src/agent/clis/types.ts","../../src/agent/clis/index.ts","../../src/agent/detect-imports.ts","../../src/agent/detect.ts","../../src/agent/install.ts","../../src/agent/targets/types.ts","../../src/agent/targets/registry.ts"],"mappings":"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"}
|
package/dist/agent/index.mjs
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import "../_chunks/config.mjs";
|
|
2
|
-
import "../_chunks/package-json.mjs";
|
|
3
|
-
import "../_chunks/prepare.mjs";
|
|
4
|
-
import "../_chunks/sanitize.mjs";
|
|
5
|
-
import "../_chunks/cache.mjs";
|
|
6
|
-
import "../_chunks/yaml.mjs";
|
|
7
|
-
import "../_chunks/shared.mjs";
|
|
8
1
|
import { a as targets, i as getAgentVersion, n as detectProjectAgents, r as detectTargetAgent, t as detectInstalledAgents } from "../_chunks/detect.mjs";
|
|
9
2
|
import { a as sanitizeName, c as SECTION_OUTPUT_FILES, d as extractMarkedSections, f as getSectionValidator, i as linkSkillToAgents, l as buildAllSectionPrompts, m as wrapSection, n as computeSkillDirName, o as unlinkSkillFromAgents, p as portabilizePrompt, r as installSkillForAgents, s as SECTION_MERGE_ORDER, t as generateSkillMd, u as buildSectionPrompt } from "../_chunks/prompts.mjs";
|
|
10
3
|
import { a as getModelLabel, i as getAvailableModels, o as getModelName, r as createToolProgress, s as optimizeDocs, t as detectImportedPackages } from "../_chunks/agent.mjs";
|
|
11
|
-
import "../_chunks/libs/@sinclair/typebox.mjs";
|
|
12
4
|
export { SECTION_MERGE_ORDER, SECTION_OUTPUT_FILES, targets as agents, buildAllSectionPrompts, buildSectionPrompt, computeSkillDirName, createToolProgress, detectImportedPackages, detectInstalledAgents, detectProjectAgents, detectTargetAgent, extractMarkedSections, generateSkillMd, getAgentVersion, getAvailableModels, getModelLabel, getModelName, getSectionValidator, installSkillForAgents, linkSkillToAgents, optimizeDocs, portabilizePrompt, sanitizeName, unlinkSkillFromAgents, wrapSection };
|
package/dist/cache/index.mjs
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { a as getRepoCacheDir, c as getVersionKey, i as getPackageDbPath, n as REFERENCES_DIR, o as getCacheDir, r as REPOS_DIR, s as getCacheKey, t as CACHE_DIR } from "../_chunks/config.mjs";
|
|
2
|
-
import "../_chunks/package-json.mjs";
|
|
3
2
|
import { n as linkShippedSkill, r as resolvePkgDir, t as getShippedSkills } from "../_chunks/prepare.mjs";
|
|
4
|
-
import "../_chunks/sanitize.mjs";
|
|
5
3
|
import { _ as writeToRepoCache, a as hasShippedDocs, c as linkPkg, d as listCached, f as listReferenceFiles, g as writeToCache, h as writeSections, i as getPkgKeyFiles, l as linkPkgNamed, m as readCachedSection, n as clearCache, o as isCached, p as readCachedDocs, r as ensureCacheDir, s as linkCachedDir, t as clearAllCache, u as linkRepoCachedDir } from "../_chunks/cache.mjs";
|
|
6
4
|
export { CACHE_DIR, REFERENCES_DIR, REPOS_DIR, clearAllCache, clearCache, ensureCacheDir, getCacheDir, getCacheKey, getPackageDbPath, getPkgKeyFiles, getRepoCacheDir, getShippedSkills, getVersionKey, hasShippedDocs, isCached, linkCachedDir, linkPkg, linkPkgNamed, linkRepoCachedDir, linkShippedSkill, listCached, listReferenceFiles, readCachedDocs, readCachedSection, resolvePkgDir, writeSections, writeToCache, writeToRepoCache };
|
package/dist/cli-entry.mjs
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
//#region src/cli-entry.ts
|
|
3
|
-
/**
|
|
4
|
-
* CLI entry point. Intercepts `skilld prepare` to run the fast path (~45ms)
|
|
5
|
-
* before the full CLI loads (~200ms of module imports).
|
|
6
|
-
*/
|
|
7
2
|
await (process.argv[2] === "prepare" && process.argv.length <= 3 ? import("./prepare.mjs") : import("./cli.mjs"));
|
|
8
|
-
//#endregion
|
|
9
3
|
export {};
|
|
10
4
|
|
|
11
5
|
//# sourceMappingURL=cli-entry.mjs.map
|
package/dist/cli-entry.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-entry.mjs","names":[],"sources":["../src/cli-entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry point. Intercepts `skilld prepare` to run the fast path (~45ms)\n * before the full CLI loads (~200ms of module imports).\n */\n\n// eslint-disable-next-line antfu/no-top-level-await\nawait import(process.argv[2] === 'prepare' && process.argv.length <= 3\n ? './prepare.ts'\n : './cli.ts',\n)\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-entry.mjs","names":[],"sources":["../src/cli-entry.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * CLI entry point. Intercepts `skilld prepare` to run the fast path (~45ms)\n * before the full CLI loads (~200ms of module imports).\n */\n\n// eslint-disable-next-line antfu/no-top-level-await\nawait import(process.argv[2] === 'prepare' && process.argv.length <= 3\n ? './prepare.ts'\n : './cli.ts',\n)\n"],"mappings":""}
|