opendevbrowser 0.0.21 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +13 -3
  2. package/dist/{chunk-4KVXCXV3.js → chunk-2MG7BRPF.js} +521 -84
  3. package/dist/{chunk-4KVXCXV3.js.map → chunk-2MG7BRPF.js.map} +1 -1
  4. package/dist/chunk-3ILXPKSJ.js +86 -0
  5. package/dist/chunk-3ILXPKSJ.js.map +1 -0
  6. package/dist/{chunk-ZE2E7ZGH.js → chunk-K2TEHJCV.js} +240 -33
  7. package/dist/chunk-K2TEHJCV.js.map +1 -0
  8. package/dist/chunk-QVWOPIZJ.js +612 -0
  9. package/dist/chunk-QVWOPIZJ.js.map +1 -0
  10. package/dist/{chunk-3VA6XR25.js → chunk-STGGGVYT.js} +23 -100
  11. package/dist/chunk-STGGGVYT.js.map +1 -0
  12. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  13. package/dist/cli/commands/uninstall.d.ts +1 -0
  14. package/dist/cli/commands/uninstall.d.ts.map +1 -1
  15. package/dist/cli/daemon-commands.d.ts.map +1 -1
  16. package/dist/cli/help.d.ts.map +1 -1
  17. package/dist/cli/index.js +298 -618
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/installers/postinstall-skill-sync.d.ts +15 -0
  20. package/dist/cli/installers/postinstall-skill-sync.d.ts.map +1 -0
  21. package/dist/cli/installers/postinstall-skill-sync.js +48 -0
  22. package/dist/cli/installers/postinstall-skill-sync.js.map +1 -0
  23. package/dist/cli/installers/skills.d.ts +9 -14
  24. package/dist/cli/installers/skills.d.ts.map +1 -1
  25. package/dist/cli/skill-lifecycle.d.ts +26 -0
  26. package/dist/cli/skill-lifecycle.d.ts.map +1 -0
  27. package/dist/cli/update-skill-modes.d.ts +3 -0
  28. package/dist/cli/update-skill-modes.d.ts.map +1 -0
  29. package/dist/cli/utils/workflow-message.d.ts +1 -0
  30. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  31. package/dist/index.js +25 -9
  32. package/dist/index.js.map +1 -1
  33. package/dist/opendevbrowser.js +25 -9
  34. package/dist/opendevbrowser.js.map +1 -1
  35. package/dist/providers/social/platform.d.ts.map +1 -1
  36. package/dist/providers/social/search-quality.d.ts.map +1 -1
  37. package/dist/providers/social/youtube.d.ts.map +1 -1
  38. package/dist/providers/workflow-handoff.d.ts +27 -3
  39. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  40. package/dist/providers/workflows.d.ts +1 -0
  41. package/dist/providers/workflows.d.ts.map +1 -1
  42. package/dist/{providers-ZIVHHH4F.js → providers-6YVHKTOJ.js} +2 -2
  43. package/dist/public-surface/generated-manifest.d.ts +162 -4
  44. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  45. package/dist/public-surface/source.d.ts +12 -6
  46. package/dist/public-surface/source.d.ts.map +1 -1
  47. package/dist/skills/skill-loader.js +2 -1
  48. package/dist/tools/macro_resolve.d.ts.map +1 -1
  49. package/extension/manifest.json +1 -1
  50. package/package.json +6 -4
  51. package/scripts/postinstall-sync-skills.mjs +33 -0
  52. package/dist/chunk-3VA6XR25.js.map +0 -1
  53. package/dist/chunk-ZE2E7ZGH.js.map +0 -1
  54. /package/dist/{providers-ZIVHHH4F.js.map → providers-6YVHKTOJ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/installers/skills.ts","../src/cli/utils/config.ts","../src/cli/utils/skills.ts"],"sourcesContent":["import * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ensureDir } from \"../utils/config\";\nimport { getBundledSkillsDir, getGlobalSkillTargets, getLocalSkillTargets, type SkillTarget } from \"../utils/skills\";\nimport { listBundledSkillDirectories } from \"../../skills/bundled-skill-directories\";\n\nexport type SkillInstallMode = \"global\" | \"local\";\ntype ManagedSkillTarget = SkillTarget & {\n managedPackNames?: string[];\n};\n\ntype SyncOutcome = \"installed\" | \"refreshed\" | \"unchanged\";\nconst MANAGED_SKILLS_MARKER = \".opendevbrowser-managed-skills.json\";\nconst MANAGED_SKILL_SENTINEL = \".opendevbrowser-managed-skill.json\";\nconst MANAGED_SKILL_OWNER = \"opendevbrowser\";\nconst MANAGED_PACK_PREFIX = \"opendevbrowser-\";\n\ninterface ManagedSkillsMarker {\n managedPacks: string[];\n managesAllCanonicalPacks: boolean;\n}\n\ninterface ManagedSkillSentinel {\n managedBy: string;\n packName: string;\n fingerprint: string;\n}\n\ninterface SkillLifecycleTargetOptions {\n includeLegacyArtifacts: boolean;\n}\n\ninterface ManagedPackScope {\n managedPackNames: string[];\n activePackNames: string[];\n managesAllCanonicalPacks: boolean;\n}\n\nexport interface SkillTargetSyncResult {\n agents: string[];\n targetDir: string;\n installed: string[];\n refreshed: string[];\n unchanged: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface SkillSyncResult {\n success: boolean;\n message: string;\n mode: SkillInstallMode;\n targets: SkillTargetSyncResult[];\n installed: string[];\n refreshed: string[];\n unchanged: string[];\n}\n\nexport interface SkillTargetRemovalResult {\n agents: string[];\n targetDir: string;\n removed: string[];\n missing: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface SkillRemovalResult {\n success: boolean;\n message: string;\n mode: SkillInstallMode;\n targets: SkillTargetRemovalResult[];\n removed: string[];\n missing: string[];\n}\n\nfunction getTargets(mode: SkillInstallMode): SkillTarget[] {\n return mode === \"global\" ? getGlobalSkillTargets() : getLocalSkillTargets();\n}\n\nfunction getCanonicalBundledSkillNames(): string[] {\n return listBundledSkillDirectories().map((entry) => entry.name);\n}\n\nfunction getManagedSkillsMarkerPath(targetDir: string): string {\n return path.join(targetDir, MANAGED_SKILLS_MARKER);\n}\n\nfunction getManagedSkillSentinelPath(targetPath: string): string {\n return path.join(targetPath, MANAGED_SKILL_SENTINEL);\n}\n\nfunction snapshotManagedSkillsMarker(targetDir: string): string | null {\n const markerPath = getManagedSkillsMarkerPath(targetDir);\n return fs.existsSync(markerPath) ? fs.readFileSync(markerPath, \"utf8\") : null;\n}\n\nfunction restoreManagedSkillsMarker(targetDir: string, previousMarker: string | null): void {\n if (previousMarker === null) {\n removeManagedSkillsMarker(targetDir);\n return;\n }\n fs.writeFileSync(getManagedSkillsMarkerPath(targetDir), previousMarker, \"utf8\");\n}\n\nfunction hasManagedSkillsMarker(targetDir: string): boolean {\n return fs.existsSync(getManagedSkillsMarkerPath(targetDir));\n}\n\nfunction isSafePathSegment(value: string): boolean {\n return value.length > 0\n && value !== \".\"\n && value !== \"..\"\n && !value.includes(\"/\")\n && !value.includes(\"\\\\\")\n && path.basename(value) === value;\n}\n\nfunction isManagedPackName(value: string): boolean {\n return isSafePathSegment(value) && value.startsWith(MANAGED_PACK_PREFIX);\n}\n\nfunction readManagedSkillsMarker(targetDir: string): ManagedSkillsMarker | null {\n if (!hasManagedSkillsMarker(targetDir)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(getManagedSkillsMarkerPath(targetDir), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ManagedSkillsMarker>;\n return Array.isArray(parsed.managedPacks)\n ? {\n managedPacks: parsed.managedPacks.filter(\n (value): value is string => typeof value === \"string\" && isManagedPackName(value)\n ),\n managesAllCanonicalPacks: parsed.managesAllCanonicalPacks !== false\n }\n : null;\n } catch {\n return null;\n }\n}\n\nfunction writeManagedSkillsMarker(\n targetDir: string,\n packNames: readonly string[],\n managesAllCanonicalPacks: boolean\n): void {\n const marker: ManagedSkillsMarker = {\n managedPacks: Array.from(new Set(packNames)),\n managesAllCanonicalPacks\n };\n fs.writeFileSync(\n getManagedSkillsMarkerPath(targetDir),\n `${JSON.stringify(marker, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nfunction removeManagedSkillsMarker(targetDir: string): void {\n fs.rmSync(getManagedSkillsMarkerPath(targetDir), { force: true });\n}\n\nfunction writeManagedSkillSentinel(targetPath: string, packName: string, fingerprint: string): void {\n const sentinel: ManagedSkillSentinel = {\n managedBy: MANAGED_SKILL_OWNER,\n packName,\n fingerprint\n };\n fs.writeFileSync(\n getManagedSkillSentinelPath(targetPath),\n `${JSON.stringify(sentinel, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nfunction readManagedSkillFingerprint(targetPath: string): string | null {\n const sentinelPath = getManagedSkillSentinelPath(targetPath);\n if (!fs.existsSync(sentinelPath)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(sentinelPath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ManagedSkillSentinel>;\n return parsed.managedBy === MANAGED_SKILL_OWNER\n && parsed.packName === path.basename(targetPath)\n && typeof parsed.fingerprint === \"string\"\n ? parsed.fingerprint\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getSentinelManagedPackNames(targetDir: string, packNames: readonly string[]): string[] {\n const canonicalPackNames = new Set(packNames);\n const candidatePackNames = new Set(packNames);\n if (fs.existsSync(targetDir) && isDirectoryPath(targetDir)) {\n for (const entry of fs.readdirSync(targetDir, { withFileTypes: true })) {\n if (entry.isDirectory() && isManagedPackName(entry.name)) {\n candidatePackNames.add(entry.name);\n }\n }\n }\n\n return Array.from(candidatePackNames).filter((packName) => {\n const targetPath = path.join(targetDir, packName);\n if (!fs.existsSync(targetPath) || readManagedSkillFingerprint(targetPath) === null) {\n return false;\n }\n return canonicalPackNames.has(packName) || shouldRemoveRetiredManagedPack(targetPath);\n });\n}\n\nfunction hasManagedCanonicalBundledSkillInTarget(targetDir: string, packNames: readonly string[]): boolean {\n return getSentinelManagedPackNames(targetDir, packNames).length > 0;\n}\n\nfunction removeManagedPackArtifacts(\n targetDir: string,\n packNames: readonly string[]\n): { removed: string[]; missing: string[] } {\n const removed: string[] = [];\n const missing: string[] = [];\n\n for (const packName of packNames) {\n const targetPath = path.join(targetDir, packName);\n if (fs.existsSync(targetPath)) {\n fs.rmSync(targetPath, { recursive: true, force: true });\n removed.push(packName);\n continue;\n }\n missing.push(packName);\n }\n\n return { removed, missing };\n}\n\nfunction formatSummary(parts: string[], totalTargets: number, failures: number): string {\n const summary = parts.length > 0 ? parts.join(\", \") : \"no lifecycle changes\";\n const failureSummary = failures > 0 ? `, ${failures} failed` : \"\";\n return `${summary} across ${totalTargets} targets${failureSummary}`;\n}\n\nfunction hashDirectoryTree(dirPath: string): string {\n const hash = crypto.createHash(\"sha256\");\n\n const visit = (currentPath: string, relativePath: string): void => {\n const entries = fs.readdirSync(currentPath, { withFileTypes: true })\n .sort((left, right) => left.name.localeCompare(right.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentPath, entry.name);\n const entryRelativePath = relativePath\n ? path.posix.join(relativePath, entry.name)\n : entry.name;\n\n if (entry.isFile() && entry.name === MANAGED_SKILL_SENTINEL) {\n continue;\n }\n\n if (entry.isDirectory()) {\n hash.update(`D:${entryRelativePath}\\0`);\n visit(absolutePath, entryRelativePath);\n continue;\n }\n\n if (entry.isFile()) {\n hash.update(`F:${entryRelativePath}\\0`);\n hash.update(fs.readFileSync(absolutePath));\n hash.update(\"\\0\");\n continue;\n }\n\n if (entry.isSymbolicLink()) {\n hash.update(`L:${entryRelativePath}\\0${fs.readlinkSync(absolutePath)}\\0`);\n }\n }\n };\n\n visit(dirPath, \"\");\n return hash.digest(\"hex\");\n}\n\nfunction isDirectoryPath(targetPath: string): boolean {\n return fs.lstatSync(targetPath).isDirectory();\n}\n\nfunction shouldRemoveRetiredManagedPack(targetPath: string): boolean {\n if (!fs.existsSync(targetPath) || !isDirectoryPath(targetPath)) {\n return false;\n }\n const fingerprint = readManagedSkillFingerprint(targetPath);\n return fingerprint !== null && hashDirectoryTree(targetPath) === fingerprint;\n}\n\nfunction syncSkillDirectory(sourcePath: string, targetPath: string, sourceFingerprint: string): SyncOutcome {\n if (!fs.existsSync(targetPath)) {\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n return \"installed\";\n }\n\n if (isDirectoryPath(targetPath)) {\n const targetFingerprint = hashDirectoryTree(targetPath);\n if (targetFingerprint === sourceFingerprint) {\n return \"unchanged\";\n }\n }\n\n const parentDir = path.dirname(targetPath);\n const targetName = path.basename(targetPath);\n const stagingRoot = fs.mkdtempSync(path.join(parentDir, `.${targetName}-sync-`));\n const stagedPath = path.join(stagingRoot, targetName);\n const backupPath = path.join(stagingRoot, `${targetName}-backup`);\n\n try {\n fs.cpSync(sourcePath, stagedPath, { recursive: true });\n fs.renameSync(targetPath, backupPath);\n try {\n fs.renameSync(stagedPath, targetPath);\n } catch (error) {\n if (fs.existsSync(backupPath) && !fs.existsSync(targetPath)) {\n fs.renameSync(backupPath, targetPath);\n }\n throw error;\n }\n fs.rmSync(backupPath, { recursive: true, force: true });\n return \"refreshed\";\n } finally {\n if (fs.existsSync(stagedPath)) {\n fs.rmSync(stagedPath, { recursive: true, force: true });\n }\n if (fs.existsSync(backupPath)) {\n fs.rmSync(backupPath, { recursive: true, force: true });\n }\n fs.rmSync(stagingRoot, { recursive: true, force: true });\n }\n}\n\nfunction buildSyncMessage(mode: SkillInstallMode, result: SkillSyncResult): string {\n return `Skills ${mode} sync: ${formatSummary(\n [\n result.installed.length > 0 ? `${result.installed.length} installed` : \"\",\n result.refreshed.length > 0 ? `${result.refreshed.length} refreshed` : \"\",\n result.unchanged.length > 0 ? `${result.unchanged.length} unchanged` : \"\"\n ].filter(Boolean),\n result.targets.length,\n result.targets.filter((entry) => !entry.success).length\n )}`;\n}\n\nfunction buildRemovalMessage(mode: SkillInstallMode, result: SkillRemovalResult): string {\n return `Skills ${mode} removal: ${formatSummary(\n [\n result.removed.length > 0 ? `${result.removed.length} removed` : \"\",\n result.missing.length > 0 ? `${result.missing.length} already absent` : \"\"\n ].filter(Boolean),\n result.targets.length,\n result.targets.filter((entry) => !entry.success).length\n )}`;\n}\n\nfunction resolveManagedPackScope(\n target: ManagedSkillTarget,\n marker: ManagedSkillsMarker | null,\n packNames: readonly string[]\n): ManagedPackScope {\n const requestedAllCanonicalPacks = target.managedPackNames === undefined;\n const managesAllCanonicalPacks = requestedAllCanonicalPacks || marker?.managesAllCanonicalPacks === true;\n const managedPackNames = managesAllCanonicalPacks\n ? Array.from(new Set([...(marker?.managedPacks ?? []), ...packNames]))\n : Array.from(new Set(target.managedPackNames ?? marker?.managedPacks ?? []));\n const activePackNames = managesAllCanonicalPacks\n ? [...packNames]\n : managedPackNames.filter((packName) => packNames.includes(packName));\n\n return {\n managedPackNames,\n activePackNames,\n managesAllCanonicalPacks\n };\n}\n\nexport function createNoOpSkillRemovalResult(mode: SkillInstallMode): SkillRemovalResult {\n const result: SkillRemovalResult = {\n success: true,\n message: \"\",\n mode,\n targets: [],\n removed: [],\n missing: []\n };\n result.message = buildRemovalMessage(mode, result);\n return result;\n}\n\nexport function getBundledSkillLifecycleTargets(\n mode: SkillInstallMode,\n options: SkillLifecycleTargetOptions\n): SkillTarget[] {\n const packNames = getCanonicalBundledSkillNames();\n return getTargets(mode).flatMap((target) => {\n const marker = readManagedSkillsMarker(target.dir);\n if (marker) {\n if (marker.managesAllCanonicalPacks || !options.includeLegacyArtifacts) {\n return marker.managesAllCanonicalPacks\n ? [target]\n : [{ ...target, managedPackNames: marker.managedPacks }];\n }\n const managedPackNames = Array.from(new Set([\n ...marker.managedPacks,\n ...getSentinelManagedPackNames(target.dir, packNames)\n ]));\n return managedPackNames.length > 0 ? [{ ...target, managedPackNames }] : [];\n }\n if (!options.includeLegacyArtifacts) {\n return [];\n }\n const managedPackNames = getSentinelManagedPackNames(target.dir, packNames);\n return managedPackNames.length > 0 ? [{ ...target, managedPackNames }] : [];\n });\n}\n\nexport function getBundledSkillTargets(mode: SkillInstallMode): SkillTarget[] {\n return getTargets(mode);\n}\n\nexport function syncBundledSkillsForTargets(\n mode: SkillInstallMode,\n targets: readonly SkillTarget[]\n): SkillSyncResult {\n const targetResults: SkillTargetSyncResult[] = [];\n\n try {\n const sourceDir = getBundledSkillsDir();\n const packNames = getCanonicalBundledSkillNames();\n const bundledFingerprints = new Map<string, string>();\n\n for (const packName of packNames) {\n const sourcePath = path.join(sourceDir, packName);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Bundled skill directory missing: ${packName}`);\n }\n bundledFingerprints.set(packName, hashDirectoryTree(sourcePath));\n }\n\n for (const target of targets) {\n const installed: string[] = [];\n const refreshed: string[] = [];\n const unchanged: string[] = [];\n const previousMarker = snapshotManagedSkillsMarker(target.dir);\n\n try {\n ensureDir(target.dir);\n const managedTarget = target as ManagedSkillTarget;\n const marker = readManagedSkillsMarker(target.dir);\n const { managedPackNames, activePackNames, managesAllCanonicalPacks } = resolveManagedPackScope(\n managedTarget,\n marker,\n packNames\n );\n const activePackNameSet = new Set(activePackNames);\n writeManagedSkillsMarker(target.dir, managedPackNames, managesAllCanonicalPacks);\n\n for (const packName of activePackNames) {\n const sourcePath = path.join(sourceDir, packName);\n const targetPath = path.join(target.dir, packName);\n const sourceFingerprint = bundledFingerprints.get(packName);\n if (!sourceFingerprint) {\n throw new Error(`Bundled fingerprint missing: ${packName}`);\n }\n\n const outcome = syncSkillDirectory(sourcePath, targetPath, sourceFingerprint);\n writeManagedSkillSentinel(targetPath, packName, sourceFingerprint);\n if (outcome === \"installed\") {\n installed.push(packName);\n } else if (outcome === \"refreshed\") {\n refreshed.push(packName);\n } else {\n unchanged.push(packName);\n }\n }\n\n const retiredPackNames = managedPackNames.filter((packName) => {\n return !activePackNameSet.has(packName)\n && shouldRemoveRetiredManagedPack(path.join(target.dir, packName));\n });\n removeManagedPackArtifacts(target.dir, retiredPackNames);\n if (activePackNames.length > 0 || managesAllCanonicalPacks) {\n writeManagedSkillsMarker(target.dir, activePackNames, managesAllCanonicalPacks);\n } else {\n removeManagedSkillsMarker(target.dir);\n }\n\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n installed,\n refreshed,\n unchanged,\n success: true\n });\n } catch (error) {\n restoreManagedSkillsMarker(target.dir, previousMarker);\n const message = error instanceof Error ? error.message : String(error);\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n installed,\n refreshed,\n unchanged,\n success: false,\n error: message\n });\n }\n }\n\n const result: SkillSyncResult = {\n success: targetResults.every((entry) => entry.success),\n message: \"\",\n mode,\n targets: targetResults,\n installed: targetResults.flatMap((entry) => entry.installed),\n refreshed: targetResults.flatMap((entry) => entry.refreshed),\n unchanged: targetResults.flatMap((entry) => entry.unchanged)\n };\n result.message = buildSyncMessage(mode, result);\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const result: SkillSyncResult = {\n success: false,\n message: \"\",\n mode,\n targets: targetResults,\n installed: targetResults.flatMap((entry) => entry.installed),\n refreshed: targetResults.flatMap((entry) => entry.refreshed),\n unchanged: targetResults.flatMap((entry) => entry.unchanged)\n };\n result.message = `Failed to sync skills (${mode}): ${message}`;\n return result;\n }\n}\n\nexport function syncBundledSkills(mode: SkillInstallMode): SkillSyncResult {\n return syncBundledSkillsForTargets(mode, getTargets(mode));\n}\n\nexport function removeBundledSkillsForTargets(\n mode: SkillInstallMode,\n targets: readonly SkillTarget[]\n): SkillRemovalResult {\n const packNames = getCanonicalBundledSkillNames();\n const targetResults: SkillTargetRemovalResult[] = [];\n\n for (const target of targets) {\n const removed: string[] = [];\n const missing: string[] = [];\n\n try {\n const managedTarget = target as ManagedSkillTarget;\n const marker = readManagedSkillsMarker(target.dir);\n const { managedPackNames, activePackNames } = resolveManagedPackScope(\n managedTarget,\n marker,\n packNames\n );\n const currentRemoval = removeManagedPackArtifacts(\n target.dir,\n activePackNames\n );\n removed.push(...currentRemoval.removed);\n missing.push(...currentRemoval.missing);\n const retiredPackNames = managedPackNames.filter((packName) => {\n return !packNames.includes(packName)\n && shouldRemoveRetiredManagedPack(path.join(target.dir, packName));\n });\n const retiredRemoval = removeManagedPackArtifacts(target.dir, retiredPackNames);\n removed.push(...retiredRemoval.removed);\n missing.push(...retiredRemoval.missing);\n removeManagedSkillsMarker(target.dir);\n\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n removed,\n missing,\n success: true\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n removed,\n missing,\n success: false,\n error: message\n });\n }\n }\n\n const result: SkillRemovalResult = {\n success: targetResults.every((entry) => entry.success),\n message: \"\",\n mode,\n targets: targetResults,\n removed: targetResults.flatMap((entry) => entry.removed),\n missing: targetResults.flatMap((entry) => entry.missing)\n };\n result.message = buildRemovalMessage(mode, result);\n return result;\n}\n\nexport function removeBundledSkills(mode: SkillInstallMode): SkillRemovalResult {\n return removeBundledSkillsForTargets(mode, getTargets(mode));\n}\n\nexport function hasBundledSkillArtifacts(mode: SkillInstallMode): boolean {\n const packNames = getCanonicalBundledSkillNames();\n const targets = getTargets(mode);\n\n return targets.some((target) => hasManagedCanonicalBundledSkillInTarget(target.dir, packNames));\n}\n\nexport function hasManagedBundledSkillInstall(mode: SkillInstallMode): boolean {\n return getTargets(mode).some((target) => readManagedSkillsMarker(target.dir) !== null);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst SCHEMA_URL = \"https://opencode.ai/config.json\";\n\nexport interface OpenCodeConfig {\n $schema?: string;\n plugin?: string[];\n [key: string]: unknown;\n}\n\nexport function getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opencode.json\");\n}\n\nexport function getLocalConfigPath(): string {\n return path.join(process.cwd(), \"opencode.json\");\n}\n\nexport function ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\nexport function readConfig(configPath: string): { content: string; config: OpenCodeConfig } {\n if (!fs.existsSync(configPath)) {\n return { content: \"\", config: {} };\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n\n if (errors.length > 0) {\n const firstError = errors[0];\n throw new Error(`Invalid JSONC at ${configPath}: parse error at offset ${firstError?.offset ?? 0}`);\n }\n\n return { content, config: (parsed ?? {}) as OpenCodeConfig };\n}\n\nexport function writeConfig(configPath: string, config: OpenCodeConfig): void {\n ensureDir(path.dirname(configPath));\n const content = JSON.stringify(config, null, 2) + \"\\n\";\n writeFileAtomic(configPath, content);\n}\n\nexport function addPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (!result.$schema) {\n result.$schema = SCHEMA_URL;\n }\n\n if (!result.plugin) {\n result.plugin = [pluginName];\n } else if (!result.plugin.includes(pluginName)) {\n result.plugin = [...result.plugin, pluginName];\n }\n\n return result;\n}\n\nexport function removePlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (result.plugin) {\n result.plugin = result.plugin.filter((p) => p !== pluginName);\n if (result.plugin.length === 0) {\n delete result.plugin;\n }\n }\n\n return result;\n}\n\nexport function hasPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): boolean {\n return config.plugin?.includes(pluginName) ?? false;\n}\n\nexport function createConfigWithPlugin(pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n return {\n $schema: SCHEMA_URL,\n plugin: [pluginName]\n };\n}\n\nexport function updateConfigContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return JSON.stringify(createConfigWithPlugin(pluginName), null, 2) + \"\\n\";\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n let result = content;\n\n if (!parsed.$schema) {\n const edits = modify(result, [\"$schema\"], SCHEMA_URL, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n }\n\n const newPlugins = parsed.plugin ? [...parsed.plugin, pluginName] : [pluginName];\n const edits = modify(result, [\"plugin\"], newPlugins, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n\n return result;\n}\n\nexport function removePluginFromContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return content;\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (!parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n const newPlugins = parsed.plugin.filter((p) => p !== pluginName);\n const edits = modify(content, [\"plugin\"], newPlugins.length > 0 ? newPlugins : undefined, {\n formattingOptions: { tabSize: 2, insertSpaces: true }\n });\n\n return applyEdits(content, edits);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nexport { getBundledSkillsDir } from \"../../utils/package-assets\";\n\nconst SKILL_DIR_NAME = \"skill\";\nconst SKILLS_DIR_NAME = \"skills\";\n\nexport type SkillTargetAgent = \"opencode\" | \"codex\" | \"claudecode\" | \"ampcli\";\n\nexport interface SkillTarget {\n agents: SkillTargetAgent[];\n dir: string;\n}\n\nexport function getGlobalSkillDir(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, SKILL_DIR_NAME);\n}\n\nexport function getLocalSkillDir(): string {\n return path.join(process.cwd(), \".opencode\", SKILL_DIR_NAME);\n}\n\nfunction getCodexHomeDir(): string {\n return process.env.CODEX_HOME\n || path.join(os.homedir(), \".codex\");\n}\n\nfunction getClaudeCodeHomeDir(): string {\n return process.env.CLAUDECODE_HOME\n || path.join(os.homedir(), \".claude\");\n}\n\nfunction getAmpHomeDir(): string {\n return process.env.AMP_CLI_HOME\n || path.join(os.homedir(), \".amp\");\n}\n\nfunction dedupeTargets(targets: Array<{ agent: SkillTargetAgent; dir: string }>): SkillTarget[] {\n const deduped = new Map<string, SkillTarget>();\n\n for (const target of targets) {\n const key = path.resolve(target.dir);\n const existing = deduped.get(key);\n if (existing) {\n if (!existing.agents.includes(target.agent)) {\n existing.agents.push(target.agent);\n }\n continue;\n }\n deduped.set(key, { agents: [target.agent], dir: target.dir });\n }\n\n return Array.from(deduped.values());\n}\n\nexport function getGlobalSkillTargets(): SkillTarget[] {\n const claudeSkillsDir = path.join(getClaudeCodeHomeDir(), SKILLS_DIR_NAME);\n const ampSkillsDir = path.join(getAmpHomeDir(), SKILLS_DIR_NAME);\n\n return dedupeTargets([\n { agent: \"opencode\", dir: getGlobalSkillDir() },\n { agent: \"codex\", dir: path.join(getCodexHomeDir(), SKILLS_DIR_NAME) },\n { agent: \"claudecode\", dir: claudeSkillsDir },\n { agent: \"ampcli\", dir: ampSkillsDir }\n ]);\n}\n\nexport function getLocalSkillTargets(): SkillTarget[] {\n const localClaudeSkillsDir = path.join(process.cwd(), \".claude\", SKILLS_DIR_NAME);\n const localAmpSkillsDir = path.join(process.cwd(), \".amp\", SKILLS_DIR_NAME);\n\n return dedupeTargets([\n { agent: \"opencode\", dir: getLocalSkillDir() },\n { agent: \"codex\", dir: path.join(process.cwd(), \".codex\", SKILLS_DIR_NAME) },\n { agent: \"claudecode\", dir: localClaudeSkillsDir },\n { agent: \"ampcli\", dir: localAmpSkillsDir }\n ]);\n}\n"],"mappings":"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","names":["fs","path","edits","path","os","managedPackNames"]}
@@ -1,87 +1,12 @@
1
+ import {
2
+ findBundledSkillsDir,
3
+ isBundledSkillName
4
+ } from "./chunk-3ILXPKSJ.js";
5
+
1
6
  // src/skills/skill-loader.ts
2
7
  import { readFile, readdir } from "fs/promises";
3
- import { join as join2 } from "path";
8
+ import { join } from "path";
4
9
  import * as os from "os";
5
-
6
- // src/utils/package-assets.ts
7
- import * as fs from "fs";
8
- import * as path from "path";
9
- import { fileURLToPath } from "url";
10
- var PACKAGE_NAME = "opendevbrowser";
11
- var SKILLS_DIR_NAME = "skills";
12
- var cachedPackageRoot = null;
13
- function findPackageRoot(startDir) {
14
- let current = startDir;
15
- while (true) {
16
- const pkgPath = path.join(current, "package.json");
17
- if (fs.existsSync(pkgPath)) {
18
- try {
19
- const parsed = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
20
- if (parsed.name === PACKAGE_NAME) {
21
- return current;
22
- }
23
- } catch {
24
- }
25
- }
26
- const parent = path.dirname(current);
27
- if (parent === current) {
28
- break;
29
- }
30
- current = parent;
31
- }
32
- return null;
33
- }
34
- function getPackageRoot() {
35
- if (cachedPackageRoot) {
36
- return cachedPackageRoot;
37
- }
38
- const moduleDir = path.dirname(fileURLToPath(import.meta.url));
39
- const packageRoot = findPackageRoot(moduleDir);
40
- if (!packageRoot) {
41
- throw new Error(`Unable to locate ${PACKAGE_NAME} package root.`);
42
- }
43
- cachedPackageRoot = packageRoot;
44
- return cachedPackageRoot;
45
- }
46
- function findBundledSkillsDir() {
47
- try {
48
- const skillsDir = path.join(getPackageRoot(), SKILLS_DIR_NAME);
49
- return fs.existsSync(skillsDir) ? skillsDir : null;
50
- } catch {
51
- return null;
52
- }
53
- }
54
- function getBundledSkillsDir() {
55
- const skillsDir = findBundledSkillsDir();
56
- if (!skillsDir) {
57
- throw new Error(`Bundled skills directory not found in ${PACKAGE_NAME} package.`);
58
- }
59
- return skillsDir;
60
- }
61
-
62
- // src/skills/bundled-skill-directories.ts
63
- var bundledSkillDirectories = [
64
- { name: "opendevbrowser-best-practices" },
65
- { name: "opendevbrowser-continuity-ledger" },
66
- { name: "opendevbrowser-data-extraction" },
67
- { name: "opendevbrowser-design-agent" },
68
- { name: "opendevbrowser-form-testing" },
69
- { name: "opendevbrowser-login-automation" },
70
- { name: "opendevbrowser-product-presentation-asset" },
71
- { name: "opendevbrowser-research" },
72
- { name: "opendevbrowser-shopping" }
73
- ];
74
- var bundledSkillDirectoryByName = new Map(
75
- bundledSkillDirectories.map((entry) => [entry.name, entry])
76
- );
77
- function listBundledSkillDirectories() {
78
- return [...bundledSkillDirectories];
79
- }
80
- function isBundledSkillName(name) {
81
- return bundledSkillDirectoryByName.has(name);
82
- }
83
-
84
- // src/skills/skill-loader.ts
85
10
  var SkillLoader = class {
86
11
  rootDir;
87
12
  additionalPaths;
@@ -95,18 +20,18 @@ var SkillLoader = class {
95
20
  }
96
21
  expandPath(p) {
97
22
  if (p.startsWith("~")) {
98
- return join2(os.homedir(), p.slice(1));
23
+ return join(os.homedir(), p.slice(1));
99
24
  }
100
25
  return p;
101
26
  }
102
27
  getCodexHome() {
103
- return process.env.CODEX_HOME || join2(os.homedir(), ".codex");
28
+ return process.env.CODEX_HOME || join(os.homedir(), ".codex");
104
29
  }
105
30
  getClaudeCodeHome() {
106
- return process.env.CLAUDECODE_HOME || join2(os.homedir(), ".claude");
31
+ return process.env.CLAUDECODE_HOME || join(os.homedir(), ".claude");
107
32
  }
108
33
  getAmpHome() {
109
- return process.env.AMP_CLI_HOME || join2(os.homedir(), ".amp");
34
+ return process.env.AMP_CLI_HOME || join(os.homedir(), ".amp");
110
35
  }
111
36
  async loadBestPractices(topic) {
112
37
  return this.loadSkill("opendevbrowser-best-practices", topic);
@@ -169,50 +94,50 @@ var SkillLoader = class {
169
94
  return this.discoveryReportCache;
170
95
  }
171
96
  getSearchPaths() {
172
- const configDir = process.env.OPENCODE_CONFIG_DIR || join2(os.homedir(), ".config", "opencode");
97
+ const configDir = process.env.OPENCODE_CONFIG_DIR || join(os.homedir(), ".config", "opencode");
173
98
  const searchPaths = [
174
99
  {
175
- path: join2(this.rootDir, ".opencode", "skill"),
100
+ path: join(this.rootDir, ".opencode", "skill"),
176
101
  sourceFamily: "project-opencode",
177
102
  isBundled: false
178
103
  },
179
104
  {
180
- path: join2(configDir, "skill"),
105
+ path: join(configDir, "skill"),
181
106
  sourceFamily: "global-opencode",
182
107
  isBundled: false
183
108
  },
184
109
  {
185
- path: join2(this.rootDir, ".codex", "skills"),
110
+ path: join(this.rootDir, ".codex", "skills"),
186
111
  sourceFamily: "project-codex",
187
112
  isBundled: false
188
113
  },
189
114
  {
190
- path: join2(this.getCodexHome(), "skills"),
115
+ path: join(this.getCodexHome(), "skills"),
191
116
  sourceFamily: "global-codex",
192
117
  isBundled: false
193
118
  },
194
119
  {
195
- path: join2(this.rootDir, ".claude", "skills"),
120
+ path: join(this.rootDir, ".claude", "skills"),
196
121
  sourceFamily: "project-claudecode",
197
122
  isBundled: false
198
123
  },
199
124
  {
200
- path: join2(this.getClaudeCodeHome(), "skills"),
125
+ path: join(this.getClaudeCodeHome(), "skills"),
201
126
  sourceFamily: "global-claudecode",
202
127
  isBundled: false
203
128
  },
204
129
  {
205
- path: join2(this.rootDir, ".amp", "skills"),
130
+ path: join(this.rootDir, ".amp", "skills"),
206
131
  sourceFamily: "project-ampcli",
207
132
  isBundled: false
208
133
  },
209
134
  {
210
- path: join2(this.getAmpHome(), "skills"),
135
+ path: join(this.getAmpHome(), "skills"),
211
136
  sourceFamily: "global-ampcli",
212
137
  isBundled: false
213
138
  },
214
- ...this.additionalPaths.map((path2) => ({
215
- path: path2,
139
+ ...this.additionalPaths.map((path) => ({
140
+ path,
216
141
  sourceFamily: "custom",
217
142
  isBundled: false
218
143
  })),
@@ -243,7 +168,7 @@ var SkillLoader = class {
243
168
  continue;
244
169
  }
245
170
  }
246
- const skillPath = join2(searchPath.path, entry.name, "SKILL.md");
171
+ const skillPath = join(searchPath.path, entry.name, "SKILL.md");
247
172
  try {
248
173
  const content = await readFile(skillPath, "utf8");
249
174
  const metadata = this.parseSkillMetadata(content, entry.name);
@@ -402,8 +327,6 @@ function filterSections(content, topic) {
402
327
  }
403
328
 
404
329
  export {
405
- getBundledSkillsDir,
406
- listBundledSkillDirectories,
407
330
  SkillLoader
408
331
  };
409
- //# sourceMappingURL=chunk-3VA6XR25.js.map
332
+ //# sourceMappingURL=chunk-STGGGVYT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skills/skill-loader.ts"],"sourcesContent":["import { readFile, readdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport * as os from \"os\";\nimport type {\n SkillAlternative,\n SkillDiscoveryIssue,\n SkillDiscoveryReport,\n SkillInfo,\n SkillMetadata,\n SkillSearchPath\n} from \"./types\";\nimport { findBundledSkillsDir } from \"../utils/package-assets\";\nimport { isBundledSkillName } from \"./bundled-skill-directories\";\n\nexport class SkillLoader {\n private rootDir: string;\n private additionalPaths: string[];\n private bundledSkillsDir: string | null;\n private discoveryReportCache: SkillDiscoveryReport | null = null;\n private skillCache: SkillInfo[] | null = null;\n\n constructor(rootDir: string, additionalPaths: string[] = []) {\n this.rootDir = rootDir;\n this.additionalPaths = additionalPaths.map((p) => this.expandPath(p));\n this.bundledSkillsDir = findBundledSkillsDir();\n }\n\n private expandPath(p: string): string {\n if (p.startsWith(\"~\")) {\n return join(os.homedir(), p.slice(1));\n }\n return p;\n }\n\n private getCodexHome(): string {\n return process.env.CODEX_HOME || join(os.homedir(), \".codex\");\n }\n\n private getClaudeCodeHome(): string {\n return process.env.CLAUDECODE_HOME || join(os.homedir(), \".claude\");\n }\n\n private getAmpHome(): string {\n return process.env.AMP_CLI_HOME || join(os.homedir(), \".amp\");\n }\n\n async loadBestPractices(topic?: string): Promise<string> {\n return this.loadSkill(\"opendevbrowser-best-practices\", topic);\n }\n\n async loadSkill(name: string, topic?: string): Promise<string> {\n const skills = await this.listSkills();\n const skill = skills.find((s) => s.name === name);\n\n if (!skill) {\n const available = skills.map((s) => s.name).join(\", \") || \"none\";\n throw new Error(`Skill \"${name}\" not found. Available: ${available}`);\n }\n\n const content = await readFile(skill.path, \"utf8\");\n const trimmed = content.trim();\n\n if (!topic || !topic.trim()) {\n return trimmed;\n }\n\n const filtered = filterSections(trimmed, topic);\n return filtered || trimmed;\n }\n\n async listSkills(): Promise<SkillInfo[]> {\n if (this.skillCache) {\n return this.skillCache;\n }\n\n const report = await this.getDiscoveryReport();\n this.skillCache = report.skills;\n return report.skills;\n }\n\n async getDiscoveryReport(): Promise<SkillDiscoveryReport> {\n if (this.discoveryReportCache) {\n return this.discoveryReportCache;\n }\n\n const skills: SkillInfo[] = [];\n const issues: SkillDiscoveryIssue[] = [];\n const byName = new Map<string, SkillInfo>();\n const searchPaths = this.getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const discovered = await this.discoverSkillsInPath(searchPath);\n issues.push(...discovered.issues);\n for (const skill of discovered.skills) {\n const alternative = this.toAlternative(skill);\n const existing = byName.get(skill.name);\n if (!existing) {\n const winner: SkillInfo = {\n ...skill,\n shadowedAlternatives: []\n };\n byName.set(skill.name, winner);\n skills.push(winner);\n continue;\n }\n existing.shadowedAlternatives?.push(alternative);\n }\n }\n\n this.discoveryReportCache = {\n skills,\n issues,\n searchOrder: searchPaths\n };\n this.skillCache = skills;\n return this.discoveryReportCache;\n }\n\n private getSearchPaths(): SkillSearchPath[] {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || join(os.homedir(), \".config\", \"opencode\");\n\n const searchPaths: SkillSearchPath[] = [\n {\n path: join(this.rootDir, \".opencode\", \"skill\"),\n sourceFamily: \"project-opencode\",\n isBundled: false\n },\n {\n path: join(configDir, \"skill\"),\n sourceFamily: \"global-opencode\",\n isBundled: false\n },\n {\n path: join(this.rootDir, \".codex\", \"skills\"),\n sourceFamily: \"project-codex\",\n isBundled: false\n },\n {\n path: join(this.getCodexHome(), \"skills\"),\n sourceFamily: \"global-codex\",\n isBundled: false\n },\n {\n path: join(this.rootDir, \".claude\", \"skills\"),\n sourceFamily: \"project-claudecode\",\n isBundled: false\n },\n {\n path: join(this.getClaudeCodeHome(), \"skills\"),\n sourceFamily: \"global-claudecode\",\n isBundled: false\n },\n {\n path: join(this.rootDir, \".amp\", \"skills\"),\n sourceFamily: \"project-ampcli\",\n isBundled: false\n },\n {\n path: join(this.getAmpHome(), \"skills\"),\n sourceFamily: \"global-ampcli\",\n isBundled: false\n },\n ...this.additionalPaths.map((path) => ({\n path,\n sourceFamily: \"custom\" as const,\n isBundled: false\n })),\n ...(this.bundledSkillsDir\n ? [{\n path: this.bundledSkillsDir,\n sourceFamily: \"bundled\" as const,\n isBundled: true\n }]\n : [])\n ];\n\n const uniquePaths = new Set<string>();\n return searchPaths.filter((entry) => {\n if (uniquePaths.has(entry.path)) {\n return false;\n }\n uniquePaths.add(entry.path);\n return true;\n });\n }\n\n private async discoverSkillsInPath(searchPath: SkillSearchPath): Promise<{\n skills: SkillInfo[];\n issues: SkillDiscoveryIssue[];\n }> {\n const skills: SkillInfo[] = [];\n const issues: SkillDiscoveryIssue[] = [];\n\n try {\n const entries = await readdir(searchPath.path, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (searchPath.isBundled) {\n if (!isBundledSkillName(entry.name)) {\n continue;\n }\n }\n\n const skillPath = join(searchPath.path, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf8\");\n const metadata = this.parseSkillMetadata(content, entry.name);\n if (metadata.name !== entry.name) {\n issues.push({\n kind: \"skill_entry\",\n code: \"metadata_name_mismatch\",\n detail: `Frontmatter name \"${metadata.name}\" does not match directory \"${entry.name}\".`,\n searchPath: searchPath.path,\n sourceFamily: searchPath.sourceFamily,\n dirName: entry.name,\n skillPath\n });\n }\n\n skills.push({\n name: metadata.name,\n description: metadata.description,\n version: metadata.version ?? \"1.0.0\",\n path: skillPath,\n searchPath: searchPath.path,\n sourceFamily: searchPath.sourceFamily,\n isBundled: searchPath.isBundled,\n shadowedAlternatives: []\n });\n } catch (error) {\n issues.push(this.createDiscoveryIssue(searchPath, entry.name, skillPath, error));\n }\n }\n } catch (error) {\n if (this.readErrorCode(error) !== \"ENOENT\") {\n issues.push(this.createSearchPathIssue(searchPath, error));\n }\n }\n\n return { skills, issues };\n }\n\n parseSkillMetadata(content: string, dirName: string): SkillMetadata {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!frontmatterMatch) {\n return {\n name: dirName,\n description: this.extractFirstParagraph(content) || `Skill: ${dirName}`\n };\n }\n\n const frontmatter = frontmatterMatch[1] || \"\";\n const metadata: SkillMetadata = {\n name: dirName,\n description: \"\"\n };\n\n const nameMatch = frontmatter.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch?.[1]) {\n metadata.name = nameMatch[1].trim();\n }\n\n const descMatch = frontmatter.match(/^description:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (descMatch?.[1]) {\n metadata.description = descMatch[1].trim();\n }\n\n const versionMatch = frontmatter.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch?.[1]) {\n metadata.version = versionMatch[1].trim();\n }\n\n if (!metadata.description) {\n const afterFrontmatter = content.slice(frontmatterMatch[0].length);\n metadata.description = this.extractFirstParagraph(afterFrontmatter) || `Skill: ${metadata.name}`;\n }\n\n return metadata;\n }\n\n private extractFirstParagraph(content: string): string | null {\n const lines = content.trim().split(/\\n/);\n const paragraphLines: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith(\"#\")) continue;\n if (trimmedLine === \"\" && paragraphLines.length > 0) break;\n if (trimmedLine !== \"\") {\n paragraphLines.push(trimmedLine);\n }\n }\n\n const paragraph = paragraphLines.join(\" \").trim();\n return paragraph.length > 0 ? paragraph.slice(0, 200) : null;\n }\n\n clearCache(): void {\n this.discoveryReportCache = null;\n this.skillCache = null;\n }\n\n private createSearchPathIssue(searchPath: SkillSearchPath, error: unknown): SkillDiscoveryIssue {\n return {\n kind: \"search_path\",\n code: this.readErrorCode(error),\n detail: this.readErrorDetail(error),\n searchPath: searchPath.path,\n sourceFamily: searchPath.sourceFamily\n };\n }\n\n private createDiscoveryIssue(\n searchPath: SkillSearchPath,\n dirName: string,\n skillPath: string,\n error: unknown\n ): SkillDiscoveryIssue {\n return {\n kind: \"skill_entry\",\n code: this.readErrorCode(error),\n detail: this.readErrorDetail(error),\n searchPath: searchPath.path,\n sourceFamily: searchPath.sourceFamily,\n dirName,\n skillPath\n };\n }\n\n private readErrorCode(error: unknown): string {\n if (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") {\n return error.code;\n }\n return \"unknown\";\n }\n\n private readErrorDetail(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n return String(error);\n }\n\n private toAlternative(skill: SkillInfo): SkillAlternative {\n return {\n name: skill.name,\n path: skill.path,\n searchPath: skill.searchPath ?? \"\",\n sourceFamily: skill.sourceFamily ?? \"custom\",\n isBundled: skill.isBundled ?? false\n };\n }\n}\n\nfunction filterSections(content: string, topic: string): string | null {\n const normalized = topic.trim().toLowerCase();\n const lines = content.split(/\\r?\\n/);\n const sections: Array<{ heading: string; body: string[] }> = [];\n let currentHeading = \"\";\n let currentBody: string[] = [];\n\n const flush = () => {\n if (currentHeading || currentBody.length > 0) {\n sections.push({ heading: currentHeading, body: [...currentBody] });\n }\n currentHeading = \"\";\n currentBody = [];\n };\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.*)$/);\n if (headingMatch) {\n flush();\n currentHeading = (headingMatch[2] || \"\").trim();\n currentBody.push(line);\n continue;\n }\n currentBody.push(line);\n }\n flush();\n\n const matches = sections.filter((section) => section.heading.toLowerCase().includes(normalized));\n if (matches.length === 0) {\n return null;\n }\n return matches.map((section) => section.body.join(\"\\n\")).join(\"\\n\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"macro-resolve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/macro-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjG,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD,CAAC;AA8GF,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU;;;;GAyBrD;AAED,eAAO,MAAM,QAAQ;qCAhGmB,MAAM,EAAE,KAAG,gBAAgB;CAkGlE,CAAC"}
1
+ {"version":3,"file":"macro-resolve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/macro-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjG,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD,CAAC;AAyIF,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU;;;;GAyBrD;AAED,eAAO,MAAM,QAAQ;qCAhGmB,MAAM,EAAE,KAAG,gBAAgB;CAkGlE,CAAC"}
@@ -6,6 +6,7 @@ export interface UninstallResult {
6
6
  removed: boolean;
7
7
  configFileDeleted: boolean;
8
8
  }
9
+ export declare function hasInstalledConfig(mode: InstallMode): boolean;
9
10
  export declare function runUninstall(mode: InstallMode, deleteConfigFile?: boolean): UninstallResult;
10
11
  export declare function findInstalledConfigs(): {
11
12
  global: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAoBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,gBAAgB,GAAE,OAAe,GAChC,eAAe,CA0CjB;AAED,wBAAgB,oBAAoB,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAmB1E"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAS7D;AAoBD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,gBAAgB,GAAE,OAAe,GAChC,eAAe,CA0CjB;AAED,wBAAgB,oBAAoB,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAS1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-commands.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA+ClD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAaF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6zBnH"}
1
+ {"version":3,"file":"daemon-commands.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAgDlD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAaF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA6zBnH"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAgB,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EACL,wBAAwB,EAGzB,MAAM,sCAAsC,CAAC;AAE9C,KAAK,QAAQ,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;AAE5E,UAAU,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAChC;AAaD,eAAO,MAAM,kBAAkB,QAAO,UAAU,EAE/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,MAAM,EAI/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAIpD,CAAC;AAEJ,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAqE,CAAC;AAE7I,eAAO,MAAM,gBAAgB,EAAE,SAAS,SAAS,EA8JhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,gDAAuB,CAAC;AAEtD,eAAO,MAAM,uBAAuB,EAAE,SAAS,cAAc,EA8B5D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,cAAc,EAmE5D,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,SAAS,cAAc,EAgB3D,CAAC;AAkJF,wBAAgB,WAAW,IAAI,MAAM,CA+BpC"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAgB,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EACL,wBAAwB,EAGzB,MAAM,sCAAsC,CAAC;AAE9C,KAAK,QAAQ,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;AAE5E,UAAU,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAChC;AAaD,eAAO,MAAM,kBAAkB,QAAO,UAAU,EAE/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,QAAO,MAAM,EAI/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,YAAY,EAIpD,CAAC;AAEJ,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAqE,CAAC;AAE7I,eAAO,MAAM,gBAAgB,EAAE,SAAS,SAAS,EA8JhD,CAAC;AAEF,eAAO,MAAM,iBAAiB,gDAAuB,CAAC;AAEtD,eAAO,MAAM,uBAAuB,EAAE,SAAS,cAAc,EA8B5D,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,cAAc,EAmE5D,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,SAAS,cAAc,EAgB3D,CAAC;AA8JF,wBAAgB,WAAW,IAAI,MAAM,CA+BpC"}