@agents-inc/cli 0.74.13 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/{chunk-SXGBPQY6.js → chunk-2I5SXGXR.js} +2 -2
  3. package/dist/{chunk-MYSIW4HY.js → chunk-36YW5E7G.js} +5 -5
  4. package/dist/{chunk-T5DJCIUP.js → chunk-3REKTRAN.js} +2 -2
  5. package/dist/{chunk-ICJV3JJF.js → chunk-6F3CZLD6.js} +32 -73
  6. package/dist/chunk-6F3CZLD6.js.map +1 -0
  7. package/dist/{chunk-GHBZ7NUI.js → chunk-7NACNRFG.js} +21 -9
  8. package/dist/chunk-7NACNRFG.js.map +1 -0
  9. package/dist/{chunk-RKZFLLER.js → chunk-7PMFIL5L.js} +3 -3
  10. package/dist/{chunk-TKNPMYKJ.js → chunk-7PZFDI46.js} +4 -4
  11. package/dist/{chunk-NKKYTCBH.js → chunk-7XUKTYVD.js} +706 -327
  12. package/dist/chunk-7XUKTYVD.js.map +1 -0
  13. package/dist/{chunk-4EPFKZB5.js → chunk-AE2QHAFO.js} +23 -17
  14. package/dist/chunk-AE2QHAFO.js.map +1 -0
  15. package/dist/{chunk-OZ4DXMRF.js → chunk-CBJTSEI2.js} +5 -5
  16. package/dist/{chunk-HT5KOOUQ.js → chunk-CCSU4R65.js} +3 -4
  17. package/dist/chunk-CCSU4R65.js.map +1 -0
  18. package/dist/{chunk-W6NWOYMS.js → chunk-CKU7FJNV.js} +4 -4
  19. package/dist/{chunk-SASGCSBZ.js → chunk-EEZSCHS2.js} +9 -9
  20. package/dist/{chunk-CBXMOWQY.js → chunk-ERHTXNIF.js} +3 -3
  21. package/dist/{chunk-2YFC7IJ6.js → chunk-EWBNSS5Y.js} +6 -6
  22. package/dist/{chunk-TQLDQ3XZ.js → chunk-EYFBODHL.js} +2 -2
  23. package/dist/{chunk-AUNBGZS4.js → chunk-FFMWFEUH.js} +2 -2
  24. package/dist/{chunk-EGMQ3SXN.js → chunk-FMYAYX6W.js} +1 -1
  25. package/dist/chunk-FMYAYX6W.js.map +1 -0
  26. package/dist/{chunk-7Q6RMYR3.js → chunk-I2SUTL7S.js} +5 -5
  27. package/dist/{chunk-RRBWNEG3.js → chunk-I534EWJQ.js} +3 -3
  28. package/dist/{chunk-2PZ7LBFT.js → chunk-IDN2OZJY.js} +2 -2
  29. package/dist/{chunk-NG2GGK6P.js → chunk-JWMYAJHD.js} +2974 -3454
  30. package/dist/chunk-JWMYAJHD.js.map +1 -0
  31. package/dist/{chunk-MWGDG4QN.js → chunk-K63OEZW7.js} +2 -2
  32. package/dist/{chunk-BM5Y6LIC.js → chunk-KPRCP3MZ.js} +3 -3
  33. package/dist/{chunk-746DCNGM.js → chunk-LO5QGAP2.js} +5 -5
  34. package/dist/{chunk-IJNNVCS4.js → chunk-M4ZDKHJV.js} +3 -3
  35. package/dist/{chunk-IJNNVCS4.js.map → chunk-M4ZDKHJV.js.map} +1 -1
  36. package/dist/{chunk-CXRVM7BA.js → chunk-M76LNKMY.js} +2 -2
  37. package/dist/{chunk-WF5PMBIR.js → chunk-MLXAZODL.js} +2 -2
  38. package/dist/{chunk-UFKDY45I.js → chunk-NWW3OJH5.js} +3 -3
  39. package/dist/{chunk-ARGCINJC.js → chunk-O5CPXIC4.js} +7 -9
  40. package/dist/chunk-O5CPXIC4.js.map +1 -0
  41. package/dist/{chunk-A5TTDOP4.js → chunk-ODVQXXEO.js} +45 -16
  42. package/dist/{chunk-A5TTDOP4.js.map → chunk-ODVQXXEO.js.map} +1 -1
  43. package/dist/{chunk-EWGFIBBU.js → chunk-PRG7PKZM.js} +5 -5
  44. package/dist/{chunk-SRIH4U5Y.js → chunk-Q4PJSAMP.js} +33 -13
  45. package/dist/chunk-Q4PJSAMP.js.map +1 -0
  46. package/dist/{chunk-Q3F36QZZ.js → chunk-R7F5YQMI.js} +2 -2
  47. package/dist/{chunk-JQSJH72Q.js → chunk-S6DKM6MJ.js} +6 -6
  48. package/dist/{chunk-XMLCXRTS.js → chunk-SQ7WINEU.js} +3 -3
  49. package/dist/{chunk-LVNNP7T4.js → chunk-UBNHVBSV.js} +4 -4
  50. package/dist/{chunk-NPMGVQM4.js → chunk-VQV3DSHD.js} +6 -6
  51. package/dist/{chunk-ZU7AOE3X.js → chunk-WMMU5FOO.js} +15 -16
  52. package/dist/chunk-WMMU5FOO.js.map +1 -0
  53. package/dist/{chunk-4CRWKTNQ.js → chunk-WN2TUP4M.js} +4 -10
  54. package/dist/chunk-WN2TUP4M.js.map +1 -0
  55. package/dist/{chunk-6W4H2K3Z.js → chunk-WS3TL2AO.js} +35 -21
  56. package/dist/chunk-WS3TL2AO.js.map +1 -0
  57. package/dist/{chunk-7X4F4HCO.js → chunk-WZ5S4LGX.js} +6 -6
  58. package/dist/{chunk-IJLAVOKZ.js → chunk-XYZ7B5BY.js} +2 -2
  59. package/dist/commands/build/marketplace.js +5 -5
  60. package/dist/commands/build/plugins.js +9 -9
  61. package/dist/commands/build/stack.js +9 -9
  62. package/dist/commands/compile.js +10 -10
  63. package/dist/commands/config/index.js +9 -9
  64. package/dist/commands/config/path.js +8 -8
  65. package/dist/commands/config/show.js +9 -9
  66. package/dist/commands/diff.js +8 -8
  67. package/dist/commands/doctor.js +8 -8
  68. package/dist/commands/edit.js +33 -33
  69. package/dist/commands/eject.js +8 -8
  70. package/dist/commands/import/skill.js +9 -9
  71. package/dist/commands/info.js +9 -17
  72. package/dist/commands/info.js.map +1 -1
  73. package/dist/commands/init.js +33 -33
  74. package/dist/commands/list.js +8 -8
  75. package/dist/commands/new/agent.js +9 -9
  76. package/dist/commands/new/marketplace.js +10 -10
  77. package/dist/commands/new/skill.js +9 -9
  78. package/dist/commands/outdated.js +8 -8
  79. package/dist/commands/search.js +14 -15
  80. package/dist/commands/search.js.map +1 -1
  81. package/dist/commands/uninstall.js +9 -9
  82. package/dist/commands/update.js +10 -10
  83. package/dist/commands/validate.js +9 -9
  84. package/dist/components/common/select-list.js +2 -2
  85. package/dist/components/skill-search/skill-search.js +3 -3
  86. package/dist/components/wizard/category-grid.js +4 -4
  87. package/dist/components/wizard/category-grid.test.js +18 -19
  88. package/dist/components/wizard/category-grid.test.js.map +1 -1
  89. package/dist/components/wizard/checkbox-grid.js +4 -4
  90. package/dist/components/wizard/checkbox-grid.test.js +4 -4
  91. package/dist/components/wizard/domain-selection.js +13 -13
  92. package/dist/components/wizard/help-modal.js +2 -2
  93. package/dist/components/wizard/menu-item.js +1 -1
  94. package/dist/components/wizard/search-modal.js +3 -3
  95. package/dist/components/wizard/search-modal.test.js +3 -3
  96. package/dist/components/wizard/section-progress.js +2 -2
  97. package/dist/components/wizard/section-progress.test.js +2 -2
  98. package/dist/components/wizard/selection-card.js +2 -2
  99. package/dist/components/wizard/source-grid.js +6 -6
  100. package/dist/components/wizard/source-grid.test.js +15 -15
  101. package/dist/components/wizard/stack-selection.js +11 -11
  102. package/dist/components/wizard/step-agents.js +12 -12
  103. package/dist/components/wizard/step-agents.test.js +15 -15
  104. package/dist/components/wizard/step-build.js +12 -12
  105. package/dist/components/wizard/step-build.test.js +14 -14
  106. package/dist/components/wizard/step-confirm.js +5 -5
  107. package/dist/components/wizard/step-confirm.test.js +11 -11
  108. package/dist/components/wizard/step-refine.js +2 -2
  109. package/dist/components/wizard/step-refine.test.js +2 -2
  110. package/dist/components/wizard/step-settings.js +10 -10
  111. package/dist/components/wizard/step-settings.test.js +13 -13
  112. package/dist/components/wizard/step-sources.js +14 -14
  113. package/dist/components/wizard/step-sources.test.js +17 -17
  114. package/dist/components/wizard/step-stack.js +16 -16
  115. package/dist/components/wizard/step-stack.test.js +17 -17
  116. package/dist/components/wizard/wizard-layout.js +11 -11
  117. package/dist/components/wizard/wizard-tabs.js +2 -2
  118. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  119. package/dist/components/wizard/wizard.js +30 -30
  120. package/dist/config-exports.js +1 -1
  121. package/dist/hooks/init.js +33 -33
  122. package/dist/{loader-NHUCFMFQ.js → loader-7RQ4G4TH.js} +5 -5
  123. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  124. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  125. package/dist/{source-loader-42GVUFZA.js → source-loader-CXCIDGWV.js} +8 -8
  126. package/dist/source-manager-TPLO2DVS.js +19 -0
  127. package/dist/src/agents/_templates/agent.liquid +24 -0
  128. package/dist/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
  129. package/dist/src/agents/_templates/methodologies/context-management.liquid +162 -0
  130. package/dist/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
  131. package/dist/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
  132. package/dist/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
  133. package/dist/src/agents/_templates/methodologies/write-verification.liquid +43 -0
  134. package/dist/src/agents/meta/agent-summoner/workflow.md +2 -2
  135. package/dist/src/agents/meta/skill-summoner/workflow.md +48 -3
  136. package/dist/stores/wizard-store.js +8 -8
  137. package/dist/stores/wizard-store.test.js +36 -36
  138. package/dist/stores/wizard-store.test.js.map +1 -1
  139. package/package.json +1 -1
  140. package/src/agents/_templates/agent.liquid +24 -0
  141. package/src/agents/_templates/methodologies/anti-over-engineering.liquid +121 -0
  142. package/src/agents/_templates/methodologies/context-management.liquid +162 -0
  143. package/src/agents/_templates/methodologies/improvement-protocol.liquid +150 -0
  144. package/src/agents/_templates/methodologies/investigation-requirements.liquid +49 -0
  145. package/src/agents/_templates/methodologies/success-criteria.liquid +111 -0
  146. package/src/agents/_templates/methodologies/write-verification.liquid +43 -0
  147. package/src/agents/meta/agent-summoner/workflow.md +2 -2
  148. package/src/agents/meta/skill-summoner/workflow.md +48 -3
  149. package/src/schemas/custom-metadata.schema.json +0 -7
  150. package/src/schemas/metadata.schema.json +0 -7
  151. package/dist/chunk-4CRWKTNQ.js.map +0 -1
  152. package/dist/chunk-4EPFKZB5.js.map +0 -1
  153. package/dist/chunk-6W4H2K3Z.js.map +0 -1
  154. package/dist/chunk-ARGCINJC.js.map +0 -1
  155. package/dist/chunk-EGMQ3SXN.js.map +0 -1
  156. package/dist/chunk-GHBZ7NUI.js.map +0 -1
  157. package/dist/chunk-HT5KOOUQ.js.map +0 -1
  158. package/dist/chunk-ICJV3JJF.js.map +0 -1
  159. package/dist/chunk-NG2GGK6P.js.map +0 -1
  160. package/dist/chunk-NKKYTCBH.js.map +0 -1
  161. package/dist/chunk-SRIH4U5Y.js.map +0 -1
  162. package/dist/chunk-ZU7AOE3X.js.map +0 -1
  163. package/dist/source-manager-WRZBOTEH.js +0 -19
  164. /package/dist/{chunk-SXGBPQY6.js.map → chunk-2I5SXGXR.js.map} +0 -0
  165. /package/dist/{chunk-MYSIW4HY.js.map → chunk-36YW5E7G.js.map} +0 -0
  166. /package/dist/{chunk-T5DJCIUP.js.map → chunk-3REKTRAN.js.map} +0 -0
  167. /package/dist/{chunk-RKZFLLER.js.map → chunk-7PMFIL5L.js.map} +0 -0
  168. /package/dist/{chunk-TKNPMYKJ.js.map → chunk-7PZFDI46.js.map} +0 -0
  169. /package/dist/{chunk-OZ4DXMRF.js.map → chunk-CBJTSEI2.js.map} +0 -0
  170. /package/dist/{chunk-W6NWOYMS.js.map → chunk-CKU7FJNV.js.map} +0 -0
  171. /package/dist/{chunk-SASGCSBZ.js.map → chunk-EEZSCHS2.js.map} +0 -0
  172. /package/dist/{chunk-CBXMOWQY.js.map → chunk-ERHTXNIF.js.map} +0 -0
  173. /package/dist/{chunk-2YFC7IJ6.js.map → chunk-EWBNSS5Y.js.map} +0 -0
  174. /package/dist/{chunk-TQLDQ3XZ.js.map → chunk-EYFBODHL.js.map} +0 -0
  175. /package/dist/{chunk-AUNBGZS4.js.map → chunk-FFMWFEUH.js.map} +0 -0
  176. /package/dist/{chunk-7Q6RMYR3.js.map → chunk-I2SUTL7S.js.map} +0 -0
  177. /package/dist/{chunk-RRBWNEG3.js.map → chunk-I534EWJQ.js.map} +0 -0
  178. /package/dist/{chunk-2PZ7LBFT.js.map → chunk-IDN2OZJY.js.map} +0 -0
  179. /package/dist/{chunk-MWGDG4QN.js.map → chunk-K63OEZW7.js.map} +0 -0
  180. /package/dist/{chunk-BM5Y6LIC.js.map → chunk-KPRCP3MZ.js.map} +0 -0
  181. /package/dist/{chunk-746DCNGM.js.map → chunk-LO5QGAP2.js.map} +0 -0
  182. /package/dist/{chunk-CXRVM7BA.js.map → chunk-M76LNKMY.js.map} +0 -0
  183. /package/dist/{chunk-WF5PMBIR.js.map → chunk-MLXAZODL.js.map} +0 -0
  184. /package/dist/{chunk-UFKDY45I.js.map → chunk-NWW3OJH5.js.map} +0 -0
  185. /package/dist/{chunk-EWGFIBBU.js.map → chunk-PRG7PKZM.js.map} +0 -0
  186. /package/dist/{chunk-Q3F36QZZ.js.map → chunk-R7F5YQMI.js.map} +0 -0
  187. /package/dist/{chunk-JQSJH72Q.js.map → chunk-S6DKM6MJ.js.map} +0 -0
  188. /package/dist/{chunk-XMLCXRTS.js.map → chunk-SQ7WINEU.js.map} +0 -0
  189. /package/dist/{chunk-LVNNP7T4.js.map → chunk-UBNHVBSV.js.map} +0 -0
  190. /package/dist/{chunk-NPMGVQM4.js.map → chunk-VQV3DSHD.js.map} +0 -0
  191. /package/dist/{chunk-7X4F4HCO.js.map → chunk-WZ5S4LGX.js.map} +0 -0
  192. /package/dist/{chunk-IJLAVOKZ.js.map → chunk-XYZ7B5BY.js.map} +0 -0
  193. /package/dist/{loader-NHUCFMFQ.js.map → loader-7RQ4G4TH.js.map} +0 -0
  194. /package/dist/{source-loader-42GVUFZA.js.map → source-loader-CXCIDGWV.js.map} +0 -0
  195. /package/dist/{source-manager-WRZBOTEH.js.map → source-manager-TPLO2DVS.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/info.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills/index.js\";\nimport { fileExists, readFile } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, STANDARD_FILES } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { STATUS_MESSAGES } from \"../utils/messages.js\";\nimport type { ResolvedSkill, SkillId, SkillSlug, SkillRequirement } from \"../types/index.js\";\n\nconst CONTENT_PREVIEW_LINES = 10;\nconst MAX_LINE_LENGTH = 80;\nconst MAX_SUGGESTIONS = 5;\n\nfunction stripFrontmatter(content: string): string {\n const lines = content.split(\"\\n\");\n let inFrontmatter = false;\n let frontmatterEndIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === \"---\") {\n if (!inFrontmatter) {\n inFrontmatter = true;\n } else {\n frontmatterEndIndex = i + 1;\n break;\n }\n }\n }\n\n return lines.slice(frontmatterEndIndex).join(\"\\n\");\n}\n\nfunction getPreviewLines(content: string, maxLines: number): string[] {\n const body = stripFrontmatter(content);\n const lines = body.split(\"\\n\");\n const result: string[] = [];\n\n for (const line of lines) {\n if (result.length >= maxLines) break;\n if (line.trim() || result.length > 0) {\n const truncated =\n line.length > MAX_LINE_LENGTH ? `${line.slice(0, MAX_LINE_LENGTH - 3)}...` : line;\n result.push(truncated);\n }\n }\n\n return result;\n}\n\nfunction formatRequirements(requirements: SkillRequirement[]): string {\n if (requirements.length === 0) {\n return \"(none)\";\n }\n return requirements\n .map((req) => {\n const prefix = req.needsAny ? \"any of: \" : \"\";\n return prefix + req.skillIds.join(\", \");\n })\n .join(\"; \");\n}\n\nfunction formatTags(tags: string[]): string {\n if (tags.length === 0) {\n return \"(none)\";\n }\n return tags.join(\", \");\n}\n\nfunction findSuggestions(\n skills: Partial<Record<SkillId, ResolvedSkill>>,\n query: string,\n maxSuggestions: number,\n): string[] {\n const lowerQuery = query.toLowerCase();\n const matches: string[] = [];\n\n for (const skill of Object.values(skills)) {\n if (!skill) continue;\n if (matches.length >= maxSuggestions) break;\n if (\n skill.id.toLowerCase().includes(lowerQuery) ||\n skill.displayName.toLowerCase().includes(lowerQuery) ||\n skill.slug.toLowerCase().includes(lowerQuery)\n ) {\n matches.push(skill.id);\n }\n }\n\n return matches;\n}\n\nfunction formatSkillInfo(skill: ResolvedSkill, isInstalled: boolean): string {\n const lines: string[] = [];\n\n lines.push(`Skill: ${skill.id}`);\n if (skill.slug) {\n lines.push(`Slug: ${skill.slug}`);\n }\n lines.push(`Display Name: ${skill.displayName}`);\n lines.push(`Author: ${skill.author}`);\n lines.push(`Category: ${skill.category}`);\n lines.push(\"\");\n lines.push(\"Description:\");\n lines.push(` ${skill.description}`);\n lines.push(\"\");\n lines.push(`Tags: ${formatTags(skill.tags)}`);\n lines.push(\"\");\n lines.push(`Requires: ${formatRequirements(skill.requires)}`);\n lines.push(\n `Conflicts with: ${skill.conflictsWith.length > 0 ? skill.conflictsWith.map((r) => r.skillId).join(\", \") : \"(none)\"}`,\n );\n lines.push(\n `Recommended: ${skill.isRecommended ? `Yes${skill.recommendedReason ? ` — ${skill.recommendedReason}` : \"\"}` : \"No\"}`,\n );\n\n if (skill.usageGuidance) {\n lines.push(\"\");\n lines.push(\"Usage Guidance:\");\n lines.push(` ${skill.usageGuidance}`);\n }\n\n lines.push(\"\");\n lines.push(`Local Status: ${isInstalled ? \"Installed\" : \"Not installed\"}`);\n\n return lines.join(\"\\n\");\n}\n\nexport default class Info extends BaseCommand {\n static summary = \"Show detailed information about a skill\";\n static description =\n \"Display comprehensive information about a skill including metadata, relationships, and content preview\";\n\n static examples = [\n {\n description: \"Show info for a skill by ID\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react\",\n },\n {\n description: \"Show info without content preview\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react --no-preview\",\n },\n {\n description: \"Show info from a custom source\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --source github:org/marketplace\",\n },\n ];\n\n static args = {\n skill: Args.string({\n description: \"Skill ID or alias to look up\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n preview: Flags.boolean({\n description: \"Show content preview from SKILL.md\",\n default: true,\n allowNo: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Info);\n\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n });\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n // CLI arg is an untyped string — try as skill ID first, then as slug\n const slugResolvedId = matrix.slugMap.slugToId[args.skill as SkillSlug];\n let skill =\n matrix.skills[args.skill as SkillId] ??\n (slugResolvedId ? matrix.skills[slugResolvedId] : undefined);\n\n if (!skill) {\n const suggestions = findSuggestions(matrix.skills, args.skill, MAX_SUGGESTIONS);\n\n this.log(\"\");\n this.error(`Skill \"${args.skill}\" not found.`, { exit: false });\n\n if (suggestions.length > 0) {\n this.log(\"\");\n this.log(\"Did you mean one of these?\");\n for (const suggestion of suggestions) {\n this.log(` - ${suggestion}`);\n }\n }\n\n this.log(\"\");\n this.logInfo(`Use '${CLI_BIN_NAME} search <query>' to find available skills.`);\n this.log(\"\");\n this.exit(EXIT_CODES.ERROR);\n }\n\n const localSkillsResult = await discoverLocalSkills(process.cwd());\n const localSkillIds = localSkillsResult?.skills.map((s) => s.id) || [];\n const isInstalled = localSkillIds.includes(skill.id);\n\n this.log(\"\");\n this.log(formatSkillInfo(skill, isInstalled));\n\n if (flags.preview) {\n let skillMdPath: string;\n\n if (skill.local && skill.localPath) {\n skillMdPath = path.join(process.cwd(), skill.localPath, STANDARD_FILES.SKILL_MD);\n } else {\n const sourceDir = isLocal ? sourcePath : path.dirname(sourcePath);\n skillMdPath = path.join(sourceDir, skill.path, STANDARD_FILES.SKILL_MD);\n }\n\n if (await fileExists(skillMdPath)) {\n const content = await readFile(skillMdPath);\n const previewLines = getPreviewLines(content, CONTENT_PREVIEW_LINES);\n\n if (previewLines.length > 0) {\n this.log(\"\");\n this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);\n for (const line of previewLines) {\n this.log(line);\n }\n }\n }\n }\n\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAO,UAAU;AAWjB,IAAM,wBAAwB;AAC9B,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,SAAS,iBAAiB,SAAyB;AACjD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,gBAAgB;AACpB,MAAI,sBAAsB;AAE1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,QAAI,SAAS,OAAO;AAClB,UAAI,CAAC,eAAe;AAClB,wBAAgB;AAAA,MAClB,OAAO;AACL,8BAAsB,IAAI;AAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,MAAM,mBAAmB,EAAE,KAAK,IAAI;AACnD;AAEA,SAAS,gBAAgB,SAAiB,UAA4B;AACpE,QAAM,OAAO,iBAAiB,OAAO;AACrC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,UAAU,SAAU;AAC/B,QAAI,KAAK,KAAK,KAAK,OAAO,SAAS,GAAG;AACpC,YAAM,YACJ,KAAK,SAAS,kBAAkB,GAAG,KAAK,MAAM,GAAG,kBAAkB,CAAC,CAAC,QAAQ;AAC/E,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,cAA0C;AACpE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,aACJ,IAAI,CAAC,QAAQ;AACZ,UAAM,SAAS,IAAI,WAAW,aAAa;AAC3C,WAAO,SAAS,IAAI,SAAS,KAAK,IAAI;AAAA,EACxC,CAAC,EACA,KAAK,IAAI;AACd;AAEA,SAAS,WAAW,MAAwB;AAC1C,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,KAAK,IAAI;AACvB;AAEA,SAAS,gBACP,QACA,OACA,gBACU;AACV,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,UAAoB,CAAC;AAE3B,aAAW,SAAS,OAAO,OAAO,MAAM,GAAG;AACzC,QAAI,CAAC,MAAO;AACZ,QAAI,QAAQ,UAAU,eAAgB;AACtC,QACE,MAAM,GAAG,YAAY,EAAE,SAAS,UAAU,KAC1C,MAAM,YAAY,YAAY,EAAE,SAAS,UAAU,KACnD,MAAM,KAAK,YAAY,EAAE,SAAS,UAAU,GAC5C;AACA,cAAQ,KAAK,MAAM,EAAE;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAsB,aAA8B;AAC3E,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,UAAU,MAAM,EAAE,EAAE;AAC/B,MAAI,MAAM,MAAM;AACd,UAAM,KAAK,SAAS,MAAM,IAAI,EAAE;AAAA,EAClC;AACA,QAAM,KAAK,iBAAiB,MAAM,WAAW,EAAE;AAC/C,QAAM,KAAK,WAAW,MAAM,MAAM,EAAE;AACpC,QAAM,KAAK,aAAa,MAAM,QAAQ,EAAE;AACxC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,KAAK,MAAM,WAAW,EAAE;AACnC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,SAAS,WAAW,MAAM,IAAI,CAAC,EAAE;AAC5C,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,aAAa,mBAAmB,MAAM,QAAQ,CAAC,EAAE;AAC5D,QAAM;AAAA,IACJ,mBAAmB,MAAM,cAAc,SAAS,IAAI,MAAM,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,QAAQ;AAAA,EACrH;AACA,QAAM;AAAA,IACJ,gBAAgB,MAAM,gBAAgB,MAAM,MAAM,oBAAoB,WAAM,MAAM,iBAAiB,KAAK,EAAE,KAAK,IAAI;AAAA,EACrH;AAEA,MAAI,MAAM,eAAe;AACvB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,KAAK,MAAM,aAAa,EAAE;AAAA,EACvC;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB,cAAc,cAAc,eAAe,EAAE;AAEzE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAAA,IACZ,OAAO,KAAK,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AAE7C,QAAI;AACF,WAAK,IAAI,gBAAgB,cAAc;AAEvC,YAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,2BAA2B;AAAA,QAC/D,YAAY,MAAM;AAAA,MACpB,CAAC;AAED,WAAK,IAAI,eAAe,UAAU,UAAU,QAAQ,KAAK,UAAU,EAAE;AAGrE,YAAM,iBAAiB,OAAO,QAAQ,SAAS,KAAK,KAAkB;AACtE,UAAI,QACF,OAAO,OAAO,KAAK,KAAgB,MAClC,iBAAiB,OAAO,OAAO,cAAc,IAAI;AAEpD,UAAI,CAAC,OAAO;AACV,cAAM,cAAc,gBAAgB,OAAO,QAAQ,KAAK,OAAO,eAAe;AAE9E,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,UAAU,KAAK,KAAK,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAE9D,YAAI,YAAY,SAAS,GAAG;AAC1B,eAAK,IAAI,EAAE;AACX,eAAK,IAAI,4BAA4B;AACrC,qBAAW,cAAc,aAAa;AACpC,iBAAK,IAAI,OAAO,UAAU,EAAE;AAAA,UAC9B;AAAA,QACF;AAEA,aAAK,IAAI,EAAE;AACX,aAAK,QAAQ,QAAQ,YAAY,4CAA4C;AAC7E,aAAK,IAAI,EAAE;AACX,aAAK,KAAK,WAAW,KAAK;AAAA,MAC5B;AAEA,YAAM,oBAAoB,MAAM,oBAAoB,QAAQ,IAAI,CAAC;AACjE,YAAM,gBAAgB,mBAAmB,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;AACrE,YAAM,cAAc,cAAc,SAAS,MAAM,EAAE;AAEnD,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB,OAAO,WAAW,CAAC;AAE5C,UAAI,MAAM,SAAS;AACjB,YAAI;AAEJ,YAAI,MAAM,SAAS,MAAM,WAAW;AAClC,wBAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,MAAM,WAAW,eAAe,QAAQ;AAAA,QACjF,OAAO;AACL,gBAAM,YAAY,UAAU,aAAa,KAAK,QAAQ,UAAU;AAChE,wBAAc,KAAK,KAAK,WAAW,MAAM,MAAM,eAAe,QAAQ;AAAA,QACxE;AAEA,YAAI,MAAM,WAAW,WAAW,GAAG;AACjC,gBAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,gBAAM,eAAe,gBAAgB,SAAS,qBAAqB;AAEnE,cAAI,aAAa,SAAS,GAAG;AAC3B,iBAAK,IAAI,EAAE;AACX,iBAAK,IAAI,8BAA8B,qBAAqB,aAAa;AACzE,uBAAW,QAAQ,cAAc;AAC/B,mBAAK,IAAI,IAAI;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,WAAK,IAAI,EAAE;AAAA,IACb,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/info.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { discoverLocalSkills } from \"../lib/skills/index.js\";\nimport { fileExists, readFile } from \"../utils/fs.js\";\nimport { CLI_BIN_NAME, STANDARD_FILES } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { STATUS_MESSAGES } from \"../utils/messages.js\";\nimport type { ResolvedSkill, SkillId, SkillSlug, SkillRequirement } from \"../types/index.js\";\n\nconst CONTENT_PREVIEW_LINES = 10;\nconst MAX_LINE_LENGTH = 80;\nconst MAX_SUGGESTIONS = 5;\n\nfunction stripFrontmatter(content: string): string {\n const lines = content.split(\"\\n\");\n let inFrontmatter = false;\n let frontmatterEndIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === \"---\") {\n if (!inFrontmatter) {\n inFrontmatter = true;\n } else {\n frontmatterEndIndex = i + 1;\n break;\n }\n }\n }\n\n return lines.slice(frontmatterEndIndex).join(\"\\n\");\n}\n\nfunction getPreviewLines(content: string, maxLines: number): string[] {\n const body = stripFrontmatter(content);\n const lines = body.split(\"\\n\");\n const result: string[] = [];\n\n for (const line of lines) {\n if (result.length >= maxLines) break;\n if (line.trim() || result.length > 0) {\n const truncated =\n line.length > MAX_LINE_LENGTH ? `${line.slice(0, MAX_LINE_LENGTH - 3)}...` : line;\n result.push(truncated);\n }\n }\n\n return result;\n}\n\nfunction formatRequirements(requirements: SkillRequirement[]): string {\n if (requirements.length === 0) {\n return \"(none)\";\n }\n return requirements\n .map((req) => {\n const prefix = req.needsAny ? \"any of: \" : \"\";\n return prefix + req.skillIds.join(\", \");\n })\n .join(\"; \");\n}\n\nfunction findSuggestions(\n skills: Partial<Record<SkillId, ResolvedSkill>>,\n query: string,\n maxSuggestions: number,\n): string[] {\n const lowerQuery = query.toLowerCase();\n const matches: string[] = [];\n\n for (const skill of Object.values(skills)) {\n if (!skill) continue;\n if (matches.length >= maxSuggestions) break;\n if (\n skill.id.toLowerCase().includes(lowerQuery) ||\n skill.displayName.toLowerCase().includes(lowerQuery) ||\n skill.slug.toLowerCase().includes(lowerQuery)\n ) {\n matches.push(skill.id);\n }\n }\n\n return matches;\n}\n\nfunction formatSkillInfo(skill: ResolvedSkill, isInstalled: boolean): string {\n const lines: string[] = [];\n\n lines.push(`Skill: ${skill.id}`);\n if (skill.slug) {\n lines.push(`Slug: ${skill.slug}`);\n }\n lines.push(`Display Name: ${skill.displayName}`);\n lines.push(`Author: ${skill.author}`);\n lines.push(`Category: ${skill.category}`);\n lines.push(\"\");\n lines.push(\"Description:\");\n lines.push(` ${skill.description}`);\n lines.push(\"\");\n lines.push(`Requires: ${formatRequirements(skill.requires)}`);\n lines.push(\n `Conflicts with: ${skill.conflictsWith.length > 0 ? skill.conflictsWith.map((r) => r.skillId).join(\", \") : \"(none)\"}`,\n );\n lines.push(\n `Recommended: ${skill.isRecommended ? `Yes${skill.recommendedReason ? ` — ${skill.recommendedReason}` : \"\"}` : \"No\"}`,\n );\n\n if (skill.usageGuidance) {\n lines.push(\"\");\n lines.push(\"Usage Guidance:\");\n lines.push(` ${skill.usageGuidance}`);\n }\n\n lines.push(\"\");\n lines.push(`Local Status: ${isInstalled ? \"Installed\" : \"Not installed\"}`);\n\n return lines.join(\"\\n\");\n}\n\nexport default class Info extends BaseCommand {\n static summary = \"Show detailed information about a skill\";\n static description =\n \"Display comprehensive information about a skill including metadata, relationships, and content preview\";\n\n static examples = [\n {\n description: \"Show info for a skill by ID\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react\",\n },\n {\n description: \"Show info without content preview\",\n command: \"<%= config.bin %> <%= command.id %> web-framework-react --no-preview\",\n },\n {\n description: \"Show info from a custom source\",\n command: \"<%= config.bin %> <%= command.id %> my-skill --source github:org/marketplace\",\n },\n ];\n\n static args = {\n skill: Args.string({\n description: \"Skill ID or alias to look up\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n preview: Flags.boolean({\n description: \"Show content preview from SKILL.md\",\n default: true,\n allowNo: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Info);\n\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n });\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n // CLI arg is an untyped string — try as skill ID first, then as slug\n const slugResolvedId = matrix.slugMap.slugToId[args.skill as SkillSlug];\n let skill =\n matrix.skills[args.skill as SkillId] ??\n (slugResolvedId ? matrix.skills[slugResolvedId] : undefined);\n\n if (!skill) {\n const suggestions = findSuggestions(matrix.skills, args.skill, MAX_SUGGESTIONS);\n\n this.log(\"\");\n this.error(`Skill \"${args.skill}\" not found.`, { exit: false });\n\n if (suggestions.length > 0) {\n this.log(\"\");\n this.log(\"Did you mean one of these?\");\n for (const suggestion of suggestions) {\n this.log(` - ${suggestion}`);\n }\n }\n\n this.log(\"\");\n this.logInfo(`Use '${CLI_BIN_NAME} search <query>' to find available skills.`);\n this.log(\"\");\n this.exit(EXIT_CODES.ERROR);\n }\n\n const localSkillsResult = await discoverLocalSkills(process.cwd());\n const localSkillIds = localSkillsResult?.skills.map((s) => s.id) || [];\n const isInstalled = localSkillIds.includes(skill.id);\n\n this.log(\"\");\n this.log(formatSkillInfo(skill, isInstalled));\n\n if (flags.preview) {\n let skillMdPath: string;\n\n if (skill.local && skill.localPath) {\n skillMdPath = path.join(process.cwd(), skill.localPath, STANDARD_FILES.SKILL_MD);\n } else {\n const sourceDir = isLocal ? sourcePath : path.dirname(sourcePath);\n skillMdPath = path.join(sourceDir, skill.path, STANDARD_FILES.SKILL_MD);\n }\n\n if (await fileExists(skillMdPath)) {\n const content = await readFile(skillMdPath);\n const previewLines = getPreviewLines(content, CONTENT_PREVIEW_LINES);\n\n if (previewLines.length > 0) {\n this.log(\"\");\n this.log(`--- Content Preview (first ${CONTENT_PREVIEW_LINES} lines) ---`);\n for (const line of previewLines) {\n this.log(line);\n }\n }\n }\n }\n\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,47 +4,47 @@ import {
4
4
  formatDashboardText,
5
5
  getDashboardData,
6
6
  showDashboard
7
- } from "../chunk-SASGCSBZ.js";
8
- import "../chunk-A5TTDOP4.js";
9
- import "../chunk-OZ4DXMRF.js";
10
- import "../chunk-SXGBPQY6.js";
11
- import "../chunk-746DCNGM.js";
12
- import "../chunk-7X4F4HCO.js";
7
+ } from "../chunk-EEZSCHS2.js";
8
+ import "../chunk-ODVQXXEO.js";
9
+ import "../chunk-CBJTSEI2.js";
10
+ import "../chunk-2I5SXGXR.js";
11
+ import "../chunk-LO5QGAP2.js";
12
+ import "../chunk-WZ5S4LGX.js";
13
13
  import "../chunk-V36FRPAU.js";
14
- import "../chunk-TKNPMYKJ.js";
15
- import "../chunk-2YFC7IJ6.js";
16
- import "../chunk-JQSJH72Q.js";
17
- import "../chunk-4EPFKZB5.js";
14
+ import "../chunk-7PZFDI46.js";
15
+ import "../chunk-EWBNSS5Y.js";
16
+ import "../chunk-S6DKM6MJ.js";
17
+ import "../chunk-AE2QHAFO.js";
18
18
  import "../chunk-K77I4XGL.js";
19
- import "../chunk-RKZFLLER.js";
20
- import "../chunk-MWGDG4QN.js";
21
- import "../chunk-7Q6RMYR3.js";
19
+ import "../chunk-7PMFIL5L.js";
20
+ import "../chunk-K63OEZW7.js";
21
+ import "../chunk-I2SUTL7S.js";
22
22
  import "../chunk-7SOPVGDV.js";
23
- import "../chunk-UFKDY45I.js";
24
- import "../chunk-GHBZ7NUI.js";
23
+ import "../chunk-NWW3OJH5.js";
24
+ import "../chunk-7NACNRFG.js";
25
25
  import "../chunk-P2FHS5IS.js";
26
- import "../chunk-MYSIW4HY.js";
27
- import "../chunk-LVNNP7T4.js";
28
- import "../chunk-CBXMOWQY.js";
29
- import "../chunk-XMLCXRTS.js";
26
+ import "../chunk-36YW5E7G.js";
27
+ import "../chunk-UBNHVBSV.js";
28
+ import "../chunk-ERHTXNIF.js";
29
+ import "../chunk-SQ7WINEU.js";
30
30
  import "../chunk-JNQKCZA3.js";
31
- import "../chunk-AUNBGZS4.js";
32
- import "../chunk-2PZ7LBFT.js";
33
- import "../chunk-WF5PMBIR.js";
31
+ import "../chunk-FFMWFEUH.js";
32
+ import "../chunk-IDN2OZJY.js";
33
+ import "../chunk-MLXAZODL.js";
34
34
  import "../chunk-KUV24B5M.js";
35
- import "../chunk-EWGFIBBU.js";
36
- import "../chunk-T5DJCIUP.js";
35
+ import "../chunk-PRG7PKZM.js";
36
+ import "../chunk-3REKTRAN.js";
37
37
  import "../chunk-U3IGFMCY.js";
38
38
  import "../chunk-CBYRFAUN.js";
39
- import "../chunk-CXRVM7BA.js";
40
- import "../chunk-6W4H2K3Z.js";
41
- import "../chunk-RRBWNEG3.js";
42
- import "../chunk-NG2GGK6P.js";
43
- import "../chunk-IJLAVOKZ.js";
44
- import "../chunk-4CRWKTNQ.js";
45
- import "../chunk-SRIH4U5Y.js";
46
- import "../chunk-EGMQ3SXN.js";
47
- import "../chunk-NKKYTCBH.js";
39
+ import "../chunk-M76LNKMY.js";
40
+ import "../chunk-WS3TL2AO.js";
41
+ import "../chunk-I534EWJQ.js";
42
+ import "../chunk-JWMYAJHD.js";
43
+ import "../chunk-XYZ7B5BY.js";
44
+ import "../chunk-WN2TUP4M.js";
45
+ import "../chunk-Q4PJSAMP.js";
46
+ import "../chunk-FMYAYX6W.js";
47
+ import "../chunk-7XUKTYVD.js";
48
48
  import "../chunk-DHET7RCE.js";
49
49
  export {
50
50
  Init as default,
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  formatInstallationDisplay,
4
4
  getInstallationInfo
5
- } from "../chunk-6W4H2K3Z.js";
6
- import "../chunk-RRBWNEG3.js";
7
- import "../chunk-NG2GGK6P.js";
5
+ } from "../chunk-WS3TL2AO.js";
6
+ import "../chunk-I534EWJQ.js";
7
+ import "../chunk-JWMYAJHD.js";
8
8
  import {
9
9
  BaseCommand
10
- } from "../chunk-IJLAVOKZ.js";
11
- import "../chunk-4CRWKTNQ.js";
12
- import "../chunk-SRIH4U5Y.js";
10
+ } from "../chunk-XYZ7B5BY.js";
11
+ import "../chunk-WN2TUP4M.js";
12
+ import "../chunk-Q4PJSAMP.js";
13
13
  import {
14
14
  CLI_BIN_NAME,
15
15
  DEFAULT_BRANDING
16
- } from "../chunk-EGMQ3SXN.js";
17
- import "../chunk-NKKYTCBH.js";
16
+ } from "../chunk-FMYAYX6W.js";
17
+ import "../chunk-7XUKTYVD.js";
18
18
  import {
19
19
  init_esm_shims
20
20
  } from "../chunk-DHET7RCE.js";
@@ -1,31 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getAgentDefinitions
4
- } from "../../chunk-NPMGVQM4.js";
4
+ } from "../../chunk-VQV3DSHD.js";
5
5
  import {
6
6
  isClaudeCLIAvailable,
7
7
  loadConfigTypesDataInBackground,
8
8
  regenerateConfigTypes,
9
9
  resolveSource
10
- } from "../../chunk-6W4H2K3Z.js";
11
- import "../../chunk-RRBWNEG3.js";
12
- import "../../chunk-NG2GGK6P.js";
10
+ } from "../../chunk-WS3TL2AO.js";
11
+ import "../../chunk-I534EWJQ.js";
12
+ import "../../chunk-JWMYAJHD.js";
13
13
  import {
14
14
  BaseCommand,
15
15
  EXIT_CODES
16
- } from "../../chunk-IJLAVOKZ.js";
16
+ } from "../../chunk-XYZ7B5BY.js";
17
17
  import {
18
18
  fileExists,
19
19
  getErrorMessage,
20
20
  readFile
21
- } from "../../chunk-4CRWKTNQ.js";
22
- import "../../chunk-SRIH4U5Y.js";
21
+ } from "../../chunk-WN2TUP4M.js";
22
+ import "../../chunk-Q4PJSAMP.js";
23
23
  import {
24
24
  CLAUDE_DIR,
25
25
  CLI_COLORS,
26
26
  STANDARD_FILES
27
- } from "../../chunk-EGMQ3SXN.js";
28
- import "../../chunk-NKKYTCBH.js";
27
+ } from "../../chunk-FMYAYX6W.js";
28
+ import "../../chunk-7XUKTYVD.js";
29
29
  import {
30
30
  init_esm_shims
31
31
  } from "../../chunk-DHET7RCE.js";
@@ -2,31 +2,31 @@
2
2
  import {
3
3
  generateSkillCategoriesTs,
4
4
  generateSkillRulesTs
5
- } from "../../chunk-ARGCINJC.js";
5
+ } from "../../chunk-O5CPXIC4.js";
6
6
  import {
7
7
  generateMarketplace,
8
8
  writeMarketplace
9
- } from "../../chunk-BM5Y6LIC.js";
9
+ } from "../../chunk-KPRCP3MZ.js";
10
10
  import {
11
11
  LOCAL_DEFAULTS,
12
12
  compileAllSkillPlugins,
13
13
  generateConfigSource,
14
14
  loadConfigTypesDataInBackground,
15
15
  regenerateConfigTypes
16
- } from "../../chunk-6W4H2K3Z.js";
17
- import "../../chunk-RRBWNEG3.js";
18
- import "../../chunk-NG2GGK6P.js";
16
+ } from "../../chunk-WS3TL2AO.js";
17
+ import "../../chunk-I534EWJQ.js";
18
+ import "../../chunk-JWMYAJHD.js";
19
19
  import {
20
20
  BaseCommand,
21
21
  EXIT_CODES
22
- } from "../../chunk-IJLAVOKZ.js";
22
+ } from "../../chunk-XYZ7B5BY.js";
23
23
  import {
24
24
  directoryExists,
25
25
  ensureDir,
26
26
  getErrorMessage,
27
27
  writeFile
28
- } from "../../chunk-4CRWKTNQ.js";
29
- import "../../chunk-SRIH4U5Y.js";
28
+ } from "../../chunk-WN2TUP4M.js";
29
+ import "../../chunk-Q4PJSAMP.js";
30
30
  import {
31
31
  CLAUDE_SRC_DIR,
32
32
  CLI_BIN_NAME,
@@ -37,8 +37,8 @@ import {
37
37
  SKILL_RULES_PATH,
38
38
  STACKS_FILE_PATH,
39
39
  STANDARD_FILES
40
- } from "../../chunk-EGMQ3SXN.js";
41
- import "../../chunk-NKKYTCBH.js";
40
+ } from "../../chunk-FMYAYX6W.js";
41
+ import "../../chunk-7XUKTYVD.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "../../chunk-DHET7RCE.js";
@@ -7,15 +7,15 @@ import {
7
7
  generateSkillRulesTs,
8
8
  toTitleCase,
9
9
  validateSkillName
10
- } from "../../chunk-ARGCINJC.js";
11
- import "../../chunk-6W4H2K3Z.js";
12
- import "../../chunk-RRBWNEG3.js";
13
- import "../../chunk-NG2GGK6P.js";
14
- import "../../chunk-IJLAVOKZ.js";
15
- import "../../chunk-4CRWKTNQ.js";
16
- import "../../chunk-SRIH4U5Y.js";
17
- import "../../chunk-EGMQ3SXN.js";
18
- import "../../chunk-NKKYTCBH.js";
10
+ } from "../../chunk-O5CPXIC4.js";
11
+ import "../../chunk-WS3TL2AO.js";
12
+ import "../../chunk-I534EWJQ.js";
13
+ import "../../chunk-JWMYAJHD.js";
14
+ import "../../chunk-XYZ7B5BY.js";
15
+ import "../../chunk-WN2TUP4M.js";
16
+ import "../../chunk-Q4PJSAMP.js";
17
+ import "../../chunk-FMYAYX6W.js";
18
+ import "../../chunk-7XUKTYVD.js";
19
19
  import "../../chunk-DHET7RCE.js";
20
20
  export {
21
21
  NewSkill as default,
@@ -3,25 +3,25 @@ import {
3
3
  compareLocalSkillsWithSource,
4
4
  detectInstallation,
5
5
  loadSkillsMatrixFromSource
6
- } from "../chunk-6W4H2K3Z.js";
7
- import "../chunk-RRBWNEG3.js";
6
+ } from "../chunk-WS3TL2AO.js";
7
+ import "../chunk-I534EWJQ.js";
8
8
  import {
9
9
  typedEntries
10
- } from "../chunk-NG2GGK6P.js";
10
+ } from "../chunk-JWMYAJHD.js";
11
11
  import {
12
12
  BaseCommand,
13
13
  EXIT_CODES
14
- } from "../chunk-IJLAVOKZ.js";
14
+ } from "../chunk-XYZ7B5BY.js";
15
15
  import {
16
16
  fileExists,
17
17
  getErrorMessage
18
- } from "../chunk-4CRWKTNQ.js";
19
- import "../chunk-SRIH4U5Y.js";
18
+ } from "../chunk-WN2TUP4M.js";
19
+ import "../chunk-Q4PJSAMP.js";
20
20
  import {
21
21
  CLI_BIN_NAME,
22
22
  LOCAL_SKILLS_PATH
23
- } from "../chunk-EGMQ3SXN.js";
24
- import "../chunk-NKKYTCBH.js";
23
+ } from "../chunk-FMYAYX6W.js";
24
+ import "../chunk-7XUKTYVD.js";
25
25
  import {
26
26
  init_esm_shims
27
27
  } from "../chunk-DHET7RCE.js";
@@ -1,42 +1,42 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SkillSearch
4
- } from "../chunk-HT5KOOUQ.js";
5
- import "../chunk-T5DJCIUP.js";
4
+ } from "../chunk-CCSU4R65.js";
5
+ import "../chunk-3REKTRAN.js";
6
6
  import "../chunk-U3IGFMCY.js";
7
7
  import "../chunk-CBYRFAUN.js";
8
8
  import {
9
9
  INFO_MESSAGES,
10
10
  STATUS_MESSAGES,
11
11
  SUCCESS_MESSAGES
12
- } from "../chunk-CXRVM7BA.js";
12
+ } from "../chunk-M76LNKMY.js";
13
13
  import {
14
14
  fetchFromSource,
15
15
  loadSkillsMatrixFromSource,
16
16
  resolveAllSources
17
- } from "../chunk-6W4H2K3Z.js";
17
+ } from "../chunk-WS3TL2AO.js";
18
18
  import {
19
19
  parseFrontmatter
20
- } from "../chunk-RRBWNEG3.js";
21
- import "../chunk-NG2GGK6P.js";
20
+ } from "../chunk-I534EWJQ.js";
21
+ import "../chunk-JWMYAJHD.js";
22
22
  import {
23
23
  BaseCommand,
24
24
  EXIT_CODES
25
- } from "../chunk-IJLAVOKZ.js";
25
+ } from "../chunk-XYZ7B5BY.js";
26
26
  import {
27
27
  copy,
28
28
  ensureDir,
29
29
  fileExists,
30
30
  listDirectories,
31
31
  readFile
32
- } from "../chunk-4CRWKTNQ.js";
33
- import "../chunk-SRIH4U5Y.js";
32
+ } from "../chunk-WN2TUP4M.js";
33
+ import "../chunk-Q4PJSAMP.js";
34
34
  import {
35
35
  DEFAULT_SKILLS_SUBDIR,
36
36
  LOCAL_SKILLS_PATH,
37
37
  STANDARD_FILES
38
- } from "../chunk-EGMQ3SXN.js";
39
- import "../chunk-NKKYTCBH.js";
38
+ } from "../chunk-FMYAYX6W.js";
39
+ import "../chunk-7XUKTYVD.js";
40
40
  import {
41
41
  init_esm_shims
42
42
  } from "../chunk-DHET7RCE.js";
@@ -66,7 +66,7 @@ function matchesQuery(skill, query) {
66
66
  if (skill.slug.toLowerCase().includes(lowerQuery)) return true;
67
67
  if (skill.description.toLowerCase().includes(lowerQuery)) return true;
68
68
  if (skill.category.toLowerCase().includes(lowerQuery)) return true;
69
- return skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery));
69
+ return false;
70
70
  }
71
71
  function matchesCategory(skill, category) {
72
72
  const lowerCategory = category.toLowerCase();
@@ -102,7 +102,6 @@ async function fetchSkillsFromSource(source, forceRefresh) {
102
102
  displayName: skillDir,
103
103
  // Boundary cast: external source skills have no real category; "imported" is a display-only placeholder
104
104
  category: "imported",
105
- tags: [],
106
105
  author: `@${source.name}`,
107
106
  conflictsWith: [],
108
107
  isRecommended: false,
@@ -122,7 +121,7 @@ async function fetchSkillsFromSource(source, forceRefresh) {
122
121
  }
123
122
  var Search = class _Search extends BaseCommand {
124
123
  static summary = "Search available skills";
125
- static description = "Search skills by ID, alias, description, category, or tags. Run without arguments or with -i for interactive mode with multi-select.";
124
+ static description = "Search skills by ID, alias, description, or category. Run without arguments or with -i for interactive mode with multi-select.";
126
125
  static examples = [
127
126
  {
128
127
  description: "Search for React skills",
@@ -143,7 +142,7 @@ var Search = class _Search extends BaseCommand {
143
142
  ];
144
143
  static args = {
145
144
  query: Args.string({
146
- description: "Search query (matches name, description, category, tags)",
145
+ description: "Search query (matches name, description, category)",
147
146
  required: false
148
147
  })
149
148
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/search.tsx","../../src/cli/components/skill-search/index.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport { render } from \"ink\";\nimport path from \"path\";\nimport { sortBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { SkillSearch, type SkillSearchResult } from \"../components/skill-search/index.js\";\nimport type { SourcedSkill } from \"../components/skill-search/skill-search.js\";\nimport { DEFAULT_SKILLS_SUBDIR, LOCAL_SKILLS_PATH, STANDARD_FILES } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { resolveAllSources, type SourceEntry } from \"../lib/configuration/index.js\";\nimport {\n loadSkillsMatrixFromSource,\n fetchFromSource,\n parseFrontmatter,\n} from \"../lib/loading/index.js\";\nimport type { CategoryPath, ResolvedSkill, SkillSlug } from \"../types/index.js\";\nimport { listDirectories, fileExists, readFile, copy, ensureDir } from \"../utils/fs.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES, INFO_MESSAGES } from \"../utils/messages.js\";\n\nconst MAX_DESCRIPTION_WIDTH = 50;\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength - 3)}...`;\n}\n\nfunction matchesQuery(skill: ResolvedSkill, query: string): boolean {\n const lowerQuery = query.toLowerCase();\n\n if (skill.id.toLowerCase().includes(lowerQuery)) return true;\n if (skill.displayName.toLowerCase().includes(lowerQuery)) return true;\n if (skill.slug.toLowerCase().includes(lowerQuery)) return true;\n if (skill.description.toLowerCase().includes(lowerQuery)) return true;\n if (skill.category.toLowerCase().includes(lowerQuery)) return true;\n\n return skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery));\n}\n\nfunction matchesCategory(skill: ResolvedSkill, category: string): boolean {\n const lowerCategory = category.toLowerCase();\n return skill.category.toLowerCase().includes(lowerCategory);\n}\n\nfunction toSourcedSkill(\n skill: ResolvedSkill,\n sourceName: string,\n sourceUrl?: string,\n): SourcedSkill {\n return {\n ...skill,\n sourceName,\n sourceUrl,\n };\n}\n\nasync function fetchSkillsFromSource(\n source: SourceEntry,\n forceRefresh: boolean,\n): Promise<SourcedSkill[]> {\n try {\n const result = await fetchFromSource(source.url, { forceRefresh });\n const skillsDir = path.join(result.path, DEFAULT_SKILLS_SUBDIR);\n\n if (!(await fileExists(skillsDir))) {\n return [];\n }\n\n const skillDirs = await listDirectories(skillsDir);\n const skills: SourcedSkill[] = [];\n\n for (const skillDir of skillDirs) {\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n if (!(await fileExists(skillMdPath))) continue;\n\n const content = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(content, skillMdPath);\n if (!frontmatter) continue;\n\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n // Boundary cast: directory name used as slug for third-party source skill\n slug: skillDir as SkillSlug,\n displayName: skillDir,\n // Boundary cast: external source skills have no real category; \"imported\" is a display-only placeholder\n category: \"imported\" as CategoryPath,\n tags: [],\n author: `@${source.name}`,\n conflictsWith: [],\n isRecommended: false,\n requires: [],\n alternatives: [],\n discourages: [],\n compatibleWith: [],\n sourceName: source.name,\n sourceUrl: source.url,\n path: path.join(skillsDir, skillDir),\n });\n }\n\n return skills;\n } catch {\n // Source unavailable, return empty\n return [];\n }\n}\n\nexport default class Search extends BaseCommand {\n static summary = \"Search available skills\";\n static description =\n \"Search skills by ID, alias, description, category, or tags. \" +\n \"Run without arguments or with -i for interactive mode with multi-select.\";\n\n static examples = [\n {\n description: \"Search for React skills\",\n command: \"<%= config.bin %> search react\",\n },\n {\n description: \"Interactive search mode\",\n command: \"<%= config.bin %> search\",\n },\n {\n description: \"Interactive with pre-filled query\",\n command: \"<%= config.bin %> search -i react\",\n },\n {\n description: \"Search with category filter\",\n command: \"<%= config.bin %> search state -c frontend\",\n },\n ];\n\n static args = {\n query: Args.string({\n description: \"Search query (matches name, description, category, tags)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n interactive: Flags.boolean({\n char: \"i\",\n description: \"Launch interactive search with multi-select\",\n default: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Filter by category\",\n required: false,\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Search);\n const projectDir = process.cwd();\n\n const isInteractive = flags.interactive || !args.query;\n\n if (isInteractive) {\n await this.runInteractive(args.query, flags.refresh, projectDir);\n } else {\n await this.runStatic(args.query!, flags);\n }\n }\n\n private async runInteractive(\n initialQuery: string | undefined,\n forceRefresh: boolean,\n projectDir: string,\n ): Promise<void> {\n this.log(\"Loading skills from all sources...\");\n\n try {\n const { matrix, sourcePath } = await loadSkillsMatrixFromSource({\n sourceFlag: undefined,\n projectDir,\n forceRefresh,\n });\n\n const primarySkills = Object.values(matrix.skills)\n .filter((skill): skill is ResolvedSkill => skill !== undefined)\n .map((skill) => toSourcedSkill(skill, \"marketplace\", sourcePath));\n\n const { extras } = await resolveAllSources(projectDir);\n\n const extraSkillArrays = await Promise.all(\n extras.map((source) => fetchSkillsFromSource(source, forceRefresh)),\n );\n\n const allSkills: SourcedSkill[] = [...primarySkills, ...extraSkillArrays.flat()];\n const sourceCount = 1 + extras.length;\n\n this.log(`Loaded ${allSkills.length} skills from ${sourceCount} source(s)`);\n this.log(\"\");\n\n const searchResultPromise = new Promise<SkillSearchResult>((resolve) => {\n const { waitUntilExit } = render(\n <SkillSearch\n skills={allSkills}\n sourceCount={sourceCount}\n initialQuery={initialQuery}\n onComplete={(result) => {\n resolve(result);\n }}\n onCancel={() => {\n resolve({ selectedSkills: [], cancelled: true });\n }}\n />,\n );\n\n waitUntilExit().then(() => {\n resolve({ selectedSkills: [], cancelled: true });\n });\n });\n\n const searchResult = await searchResultPromise;\n\n if (searchResult.cancelled) {\n this.log(\"Search cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (searchResult.selectedSkills.length === 0) {\n this.log(\"No skills selected\");\n return;\n }\n\n this.log(\"\");\n this.log(`Importing ${searchResult.selectedSkills.length} skill(s)...`);\n\n const destDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n\n for (const skill of searchResult.selectedSkills) {\n if (skill.path) {\n const destPath = path.join(destDir, skill.id);\n await ensureDir(path.dirname(destPath));\n await copy(skill.path, destPath);\n this.logSuccess(`Imported: ${skill.id}`);\n } else {\n this.warn(`Skipping ${skill.id}: No source path available`);\n }\n }\n\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.IMPORT_COMPLETE);\n this.log(`Skills location: ${destDir}`);\n this.log(INFO_MESSAGES.RUN_COMPILE);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async runStatic(\n query: string,\n flags: { source?: string; category?: string },\n ): Promise<void> {\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n });\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n const allSkills = Object.values(matrix.skills).filter(\n (skill): skill is ResolvedSkill => skill !== undefined,\n );\n\n let results = allSkills.filter((skill) => matchesQuery(skill, query));\n\n if (flags.category) {\n results = results.filter((skill) => matchesCategory(skill, flags.category!));\n }\n\n results = sortBy(results, (r) => r.displayName.toLowerCase());\n\n this.log(\"\");\n if (results.length === 0) {\n this.warn(`No skills found matching \"${query}\"`);\n if (flags.category) {\n this.logInfo(`Category filter: ${flags.category}`);\n }\n } else {\n this.logInfo(\n `Found ${results.length} skill${results.length === 1 ? \"\" : \"s\"} matching \"${query}\"`,\n );\n if (flags.category) {\n this.logInfo(`Category filter: ${flags.category}`);\n }\n this.log(\"\");\n\n printTable({\n data: results.map((skill) => ({\n id: skill.displayName,\n category: skill.category,\n description: truncate(skill.description, MAX_DESCRIPTION_WIDTH),\n })),\n columns: [\n { key: \"id\", name: \"ID\" },\n { key: \"category\", name: \"Category\" },\n { key: \"description\", name: \"Description\" },\n ],\n headerOptions: { bold: true },\n });\n }\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","export { SkillSearch, type SkillSearchResult } from \"./skill-search.js\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/search.tsx","../../src/cli/components/skill-search/index.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport { printTable } from \"@oclif/table\";\nimport { render } from \"ink\";\nimport path from \"path\";\nimport { sortBy } from \"remeda\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { SkillSearch, type SkillSearchResult } from \"../components/skill-search/index.js\";\nimport type { SourcedSkill } from \"../components/skill-search/skill-search.js\";\nimport { DEFAULT_SKILLS_SUBDIR, LOCAL_SKILLS_PATH, STANDARD_FILES } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { resolveAllSources, type SourceEntry } from \"../lib/configuration/index.js\";\nimport {\n loadSkillsMatrixFromSource,\n fetchFromSource,\n parseFrontmatter,\n} from \"../lib/loading/index.js\";\nimport type { CategoryPath, ResolvedSkill, SkillSlug } from \"../types/index.js\";\nimport { listDirectories, fileExists, readFile, copy, ensureDir } from \"../utils/fs.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES, INFO_MESSAGES } from \"../utils/messages.js\";\n\nconst MAX_DESCRIPTION_WIDTH = 50;\n\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return `${str.slice(0, maxLength - 3)}...`;\n}\n\nfunction matchesQuery(skill: ResolvedSkill, query: string): boolean {\n const lowerQuery = query.toLowerCase();\n\n if (skill.id.toLowerCase().includes(lowerQuery)) return true;\n if (skill.displayName.toLowerCase().includes(lowerQuery)) return true;\n if (skill.slug.toLowerCase().includes(lowerQuery)) return true;\n if (skill.description.toLowerCase().includes(lowerQuery)) return true;\n if (skill.category.toLowerCase().includes(lowerQuery)) return true;\n\n return false;\n}\n\nfunction matchesCategory(skill: ResolvedSkill, category: string): boolean {\n const lowerCategory = category.toLowerCase();\n return skill.category.toLowerCase().includes(lowerCategory);\n}\n\nfunction toSourcedSkill(\n skill: ResolvedSkill,\n sourceName: string,\n sourceUrl?: string,\n): SourcedSkill {\n return {\n ...skill,\n sourceName,\n sourceUrl,\n };\n}\n\nasync function fetchSkillsFromSource(\n source: SourceEntry,\n forceRefresh: boolean,\n): Promise<SourcedSkill[]> {\n try {\n const result = await fetchFromSource(source.url, { forceRefresh });\n const skillsDir = path.join(result.path, DEFAULT_SKILLS_SUBDIR);\n\n if (!(await fileExists(skillsDir))) {\n return [];\n }\n\n const skillDirs = await listDirectories(skillsDir);\n const skills: SourcedSkill[] = [];\n\n for (const skillDir of skillDirs) {\n const skillMdPath = path.join(skillsDir, skillDir, STANDARD_FILES.SKILL_MD);\n if (!(await fileExists(skillMdPath))) continue;\n\n const content = await readFile(skillMdPath);\n const frontmatter = parseFrontmatter(content, skillMdPath);\n if (!frontmatter) continue;\n\n skills.push({\n id: frontmatter.name,\n description: frontmatter.description,\n // Boundary cast: directory name used as slug for third-party source skill\n slug: skillDir as SkillSlug,\n displayName: skillDir,\n // Boundary cast: external source skills have no real category; \"imported\" is a display-only placeholder\n category: \"imported\" as CategoryPath,\n author: `@${source.name}`,\n conflictsWith: [],\n isRecommended: false,\n requires: [],\n alternatives: [],\n discourages: [],\n compatibleWith: [],\n sourceName: source.name,\n sourceUrl: source.url,\n path: path.join(skillsDir, skillDir),\n });\n }\n\n return skills;\n } catch {\n // Source unavailable, return empty\n return [];\n }\n}\n\nexport default class Search extends BaseCommand {\n static summary = \"Search available skills\";\n static description =\n \"Search skills by ID, alias, description, or category. \" +\n \"Run without arguments or with -i for interactive mode with multi-select.\";\n\n static examples = [\n {\n description: \"Search for React skills\",\n command: \"<%= config.bin %> search react\",\n },\n {\n description: \"Interactive search mode\",\n command: \"<%= config.bin %> search\",\n },\n {\n description: \"Interactive with pre-filled query\",\n command: \"<%= config.bin %> search -i react\",\n },\n {\n description: \"Search with category filter\",\n command: \"<%= config.bin %> search state -c frontend\",\n },\n ];\n\n static args = {\n query: Args.string({\n description: \"Search query (matches name, description, category)\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n interactive: Flags.boolean({\n char: \"i\",\n description: \"Launch interactive search with multi-select\",\n default: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Filter by category\",\n required: false,\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote sources\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Search);\n const projectDir = process.cwd();\n\n const isInteractive = flags.interactive || !args.query;\n\n if (isInteractive) {\n await this.runInteractive(args.query, flags.refresh, projectDir);\n } else {\n await this.runStatic(args.query!, flags);\n }\n }\n\n private async runInteractive(\n initialQuery: string | undefined,\n forceRefresh: boolean,\n projectDir: string,\n ): Promise<void> {\n this.log(\"Loading skills from all sources...\");\n\n try {\n const { matrix, sourcePath } = await loadSkillsMatrixFromSource({\n sourceFlag: undefined,\n projectDir,\n forceRefresh,\n });\n\n const primarySkills = Object.values(matrix.skills)\n .filter((skill): skill is ResolvedSkill => skill !== undefined)\n .map((skill) => toSourcedSkill(skill, \"marketplace\", sourcePath));\n\n const { extras } = await resolveAllSources(projectDir);\n\n const extraSkillArrays = await Promise.all(\n extras.map((source) => fetchSkillsFromSource(source, forceRefresh)),\n );\n\n const allSkills: SourcedSkill[] = [...primarySkills, ...extraSkillArrays.flat()];\n const sourceCount = 1 + extras.length;\n\n this.log(`Loaded ${allSkills.length} skills from ${sourceCount} source(s)`);\n this.log(\"\");\n\n const searchResultPromise = new Promise<SkillSearchResult>((resolve) => {\n const { waitUntilExit } = render(\n <SkillSearch\n skills={allSkills}\n sourceCount={sourceCount}\n initialQuery={initialQuery}\n onComplete={(result) => {\n resolve(result);\n }}\n onCancel={() => {\n resolve({ selectedSkills: [], cancelled: true });\n }}\n />,\n );\n\n waitUntilExit().then(() => {\n resolve({ selectedSkills: [], cancelled: true });\n });\n });\n\n const searchResult = await searchResultPromise;\n\n if (searchResult.cancelled) {\n this.log(\"Search cancelled\");\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (searchResult.selectedSkills.length === 0) {\n this.log(\"No skills selected\");\n return;\n }\n\n this.log(\"\");\n this.log(`Importing ${searchResult.selectedSkills.length} skill(s)...`);\n\n const destDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n\n for (const skill of searchResult.selectedSkills) {\n if (skill.path) {\n const destPath = path.join(destDir, skill.id);\n await ensureDir(path.dirname(destPath));\n await copy(skill.path, destPath);\n this.logSuccess(`Imported: ${skill.id}`);\n } else {\n this.warn(`Skipping ${skill.id}: No source path available`);\n }\n }\n\n this.log(\"\");\n this.logSuccess(SUCCESS_MESSAGES.IMPORT_COMPLETE);\n this.log(`Skills location: ${destDir}`);\n this.log(INFO_MESSAGES.RUN_COMPILE);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async runStatic(\n query: string,\n flags: { source?: string; category?: string },\n ): Promise<void> {\n try {\n this.log(STATUS_MESSAGES.LOADING_SKILLS);\n\n const { matrix, sourcePath, isLocal } = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n });\n\n this.log(`Loaded from ${isLocal ? \"local\" : \"remote\"}: ${sourcePath}`);\n\n const allSkills = Object.values(matrix.skills).filter(\n (skill): skill is ResolvedSkill => skill !== undefined,\n );\n\n let results = allSkills.filter((skill) => matchesQuery(skill, query));\n\n if (flags.category) {\n results = results.filter((skill) => matchesCategory(skill, flags.category!));\n }\n\n results = sortBy(results, (r) => r.displayName.toLowerCase());\n\n this.log(\"\");\n if (results.length === 0) {\n this.warn(`No skills found matching \"${query}\"`);\n if (flags.category) {\n this.logInfo(`Category filter: ${flags.category}`);\n }\n } else {\n this.logInfo(\n `Found ${results.length} skill${results.length === 1 ? \"\" : \"s\"} matching \"${query}\"`,\n );\n if (flags.category) {\n this.logInfo(`Category filter: ${flags.category}`);\n }\n this.log(\"\");\n\n printTable({\n data: results.map((skill) => ({\n id: skill.displayName,\n category: skill.category,\n description: truncate(skill.description, MAX_DESCRIPTION_WIDTH),\n })),\n columns: [\n { key: \"id\", name: \"ID\" },\n { key: \"category\", name: \"Category\" },\n { key: \"description\", name: \"Description\" },\n ],\n headerOptions: { bold: true },\n });\n }\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","export { SkillSearch, type SkillSearchResult } from \"./skill-search.js\";\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  INFO_MESSAGES,
7
7
  SUCCESS_MESSAGES
8
- } from "../chunk-CXRVM7BA.js";
8
+ } from "../chunk-M76LNKMY.js";
9
9
  import {
10
10
  claudePluginUninstall,
11
11
  getProjectPluginsDir,
@@ -13,27 +13,27 @@ import {
13
13
  listPluginNames,
14
14
  loadProjectSourceConfig,
15
15
  readForkedFromMetadata
16
- } from "../chunk-6W4H2K3Z.js";
17
- import "../chunk-RRBWNEG3.js";
18
- import "../chunk-NG2GGK6P.js";
16
+ } from "../chunk-WS3TL2AO.js";
17
+ import "../chunk-I534EWJQ.js";
18
+ import "../chunk-JWMYAJHD.js";
19
19
  import {
20
20
  BaseCommand,
21
21
  EXIT_CODES
22
- } from "../chunk-IJLAVOKZ.js";
22
+ } from "../chunk-XYZ7B5BY.js";
23
23
  import {
24
24
  directoryExists,
25
25
  getErrorMessage,
26
26
  listDirectories,
27
27
  remove
28
- } from "../chunk-4CRWKTNQ.js";
29
- import "../chunk-SRIH4U5Y.js";
28
+ } from "../chunk-WN2TUP4M.js";
29
+ import "../chunk-Q4PJSAMP.js";
30
30
  import {
31
31
  CLAUDE_DIR,
32
32
  CLAUDE_SRC_DIR,
33
33
  CLI_COLORS,
34
34
  DEFAULT_BRANDING
35
- } from "../chunk-EGMQ3SXN.js";
36
- import "../chunk-NKKYTCBH.js";
35
+ } from "../chunk-FMYAYX6W.js";
36
+ import "../chunk-7XUKTYVD.js";
37
37
  import {
38
38
  init_esm_shims
39
39
  } from "../chunk-DHET7RCE.js";
@@ -4,37 +4,37 @@ import {
4
4
  } from "../chunk-N6S7ZRIL.js";
5
5
  import {
6
6
  recompileAgents
7
- } from "../chunk-NPMGVQM4.js";
7
+ } from "../chunk-VQV3DSHD.js";
8
8
  import {
9
9
  ERROR_MESSAGES,
10
10
  INFO_MESSAGES,
11
11
  STATUS_MESSAGES,
12
12
  SUCCESS_MESSAGES
13
- } from "../chunk-CXRVM7BA.js";
13
+ } from "../chunk-M76LNKMY.js";
14
14
  import {
15
15
  compareLocalSkillsWithSource,
16
16
  injectForkedFromMetadata,
17
17
  loadSkillsMatrixFromSource
18
- } from "../chunk-6W4H2K3Z.js";
19
- import "../chunk-RRBWNEG3.js";
18
+ } from "../chunk-WS3TL2AO.js";
19
+ import "../chunk-I534EWJQ.js";
20
20
  import {
21
21
  matrix
22
- } from "../chunk-NG2GGK6P.js";
22
+ } from "../chunk-JWMYAJHD.js";
23
23
  import {
24
24
  BaseCommand,
25
25
  EXIT_CODES
26
- } from "../chunk-IJLAVOKZ.js";
26
+ } from "../chunk-XYZ7B5BY.js";
27
27
  import {
28
28
  copy,
29
29
  fileExists,
30
30
  getErrorMessage
31
- } from "../chunk-4CRWKTNQ.js";
32
- import "../chunk-SRIH4U5Y.js";
31
+ } from "../chunk-WN2TUP4M.js";
32
+ import "../chunk-Q4PJSAMP.js";
33
33
  import {
34
34
  CLI_BIN_NAME,
35
35
  LOCAL_SKILLS_PATH
36
- } from "../chunk-EGMQ3SXN.js";
37
- import "../chunk-NKKYTCBH.js";
36
+ } from "../chunk-FMYAYX6W.js";
37
+ import "../chunk-7XUKTYVD.js";
38
38
  import {
39
39
  init_esm_shims
40
40
  } from "../chunk-DHET7RCE.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ERROR_MESSAGES
4
- } from "../chunk-CXRVM7BA.js";
4
+ } from "../chunk-M76LNKMY.js";
5
5
  import {
6
6
  checkMatrixHealth,
7
7
  loadProjectSourceConfig,
@@ -11,17 +11,17 @@ import {
11
11
  validateAllPlugins,
12
12
  validateAllSchemas,
13
13
  validatePlugin
14
- } from "../chunk-6W4H2K3Z.js";
14
+ } from "../chunk-WS3TL2AO.js";
15
15
  import {
16
16
  parseFrontmatter
17
- } from "../chunk-RRBWNEG3.js";
17
+ } from "../chunk-I534EWJQ.js";
18
18
  import {
19
19
  matrix
20
- } from "../chunk-NG2GGK6P.js";
20
+ } from "../chunk-JWMYAJHD.js";
21
21
  import {
22
22
  BaseCommand,
23
23
  EXIT_CODES
24
- } from "../chunk-IJLAVOKZ.js";
24
+ } from "../chunk-XYZ7B5BY.js";
25
25
  import {
26
26
  SKILL_ID_PATTERN,
27
27
  directoryExists,
@@ -31,14 +31,14 @@ import {
31
31
  metadataValidationSchema,
32
32
  readFile,
33
33
  setVerbose
34
- } from "../chunk-4CRWKTNQ.js";
35
- import "../chunk-SRIH4U5Y.js";
34
+ } from "../chunk-WN2TUP4M.js";
35
+ import "../chunk-Q4PJSAMP.js";
36
36
  import {
37
37
  SKILLS_DIR_PATH,
38
38
  SKILL_CATEGORIES_PATH,
39
39
  STANDARD_FILES
40
- } from "../chunk-EGMQ3SXN.js";
41
- import "../chunk-NKKYTCBH.js";
40
+ } from "../chunk-FMYAYX6W.js";
41
+ import "../chunk-7XUKTYVD.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "../chunk-DHET7RCE.js";