@agents-inc/cli 0.50.0 → 0.60.1

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 (237) hide show
  1. package/CHANGELOG.md +155 -5
  2. package/dist/{chunk-YDYRAXSY.js → chunk-52M2XF3W.js} +6 -6
  3. package/dist/{chunk-2BWCR762.js → chunk-52XO4ULK.js} +6 -8
  4. package/dist/chunk-52XO4ULK.js.map +1 -0
  5. package/dist/{chunk-KQOU4POU.js → chunk-6G3KZSO4.js} +72 -51
  6. package/dist/chunk-6G3KZSO4.js.map +1 -0
  7. package/dist/{chunk-AWP5A6IM.js → chunk-6OWHQ7HM.js} +14 -12
  8. package/dist/chunk-6OWHQ7HM.js.map +1 -0
  9. package/dist/{chunk-D72AFYQR.js → chunk-7FMEMXJ4.js} +71 -71
  10. package/dist/chunk-7FMEMXJ4.js.map +1 -0
  11. package/dist/{chunk-RA2IPRO2.js → chunk-AJJJE7F7.js} +2 -2
  12. package/dist/{chunk-4R52TQ3K.js → chunk-AX3SZZWA.js} +2 -2
  13. package/dist/{chunk-U2W5SENM.js → chunk-BFD5NZQ4.js} +5 -4
  14. package/dist/chunk-BFD5NZQ4.js.map +1 -0
  15. package/dist/{chunk-HYEUETIC.js → chunk-BKJHAJQW.js} +2 -2
  16. package/dist/{chunk-HYEUETIC.js.map → chunk-BKJHAJQW.js.map} +1 -1
  17. package/dist/{chunk-DCE423KO.js → chunk-BMJZBLP7.js} +5 -5
  18. package/dist/{chunk-GBOW6FUW.js → chunk-BNQ5O6LE.js} +2 -2
  19. package/dist/{chunk-KAO3LKB5.js → chunk-C577AJE7.js} +3 -3
  20. package/dist/{chunk-C3Q43WLC.js → chunk-CIG7IKX3.js} +4 -4
  21. package/dist/chunk-EC3UJRKZ.js +1534 -0
  22. package/dist/chunk-EC3UJRKZ.js.map +1 -0
  23. package/dist/{chunk-I6IOGZSZ.js → chunk-EMIUPGPL.js} +11 -15
  24. package/dist/chunk-EMIUPGPL.js.map +1 -0
  25. package/dist/{chunk-4QWDB2MD.js → chunk-G6WHCALR.js} +127 -105
  26. package/dist/chunk-G6WHCALR.js.map +1 -0
  27. package/dist/{chunk-JFF7P4LC.js → chunk-H7WJK7NJ.js} +22 -6
  28. package/dist/chunk-H7WJK7NJ.js.map +1 -0
  29. package/dist/chunk-HGTC76BX.js +16 -0
  30. package/dist/chunk-HGTC76BX.js.map +1 -0
  31. package/dist/{chunk-RDWGYKDY.js → chunk-K6OLORQL.js} +6 -6
  32. package/dist/{chunk-XDSVV5GZ.js → chunk-KIWFEBKH.js} +41 -11
  33. package/dist/chunk-KIWFEBKH.js.map +1 -0
  34. package/dist/{chunk-WBHPCBVN.js → chunk-LWXRUR6B.js} +66 -94
  35. package/dist/chunk-LWXRUR6B.js.map +1 -0
  36. package/dist/{chunk-CMNKHDOX.js → chunk-MGNYPVOJ.js} +2 -2
  37. package/dist/{chunk-5FPIKTSA.js → chunk-MKCHLXMY.js} +7 -7
  38. package/dist/{chunk-U7X4V4HE.js → chunk-MMFQNJPE.js} +2 -2
  39. package/dist/{chunk-WLZHCM7O.js → chunk-MR6OBL3B.js} +3 -11
  40. package/dist/{chunk-WLZHCM7O.js.map → chunk-MR6OBL3B.js.map} +1 -1
  41. package/dist/{chunk-RFKDGJAJ.js → chunk-O6BA7Q2B.js} +6 -6
  42. package/dist/chunk-O6BA7Q2B.js.map +1 -0
  43. package/dist/chunk-OCEFD7V6.js +201 -0
  44. package/dist/chunk-OCEFD7V6.js.map +1 -0
  45. package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
  46. package/dist/chunk-PUT7X3GA.js.map +1 -0
  47. package/dist/{chunk-WFFV254H.js → chunk-RO6LX3UV.js} +110 -82
  48. package/dist/chunk-RO6LX3UV.js.map +1 -0
  49. package/dist/{chunk-QYLCINGC.js → chunk-SDKCQXWE.js} +2 -2
  50. package/dist/{chunk-M3GQ2R3E.js → chunk-SEJF7CGJ.js} +19 -7
  51. package/dist/chunk-SEJF7CGJ.js.map +1 -0
  52. package/dist/{chunk-SPFHPHYL.js → chunk-SZRK3VOR.js} +24 -14
  53. package/dist/chunk-SZRK3VOR.js.map +1 -0
  54. package/dist/{chunk-QB5HHTAA.js → chunk-TC3NHO34.js} +28 -12
  55. package/dist/chunk-TC3NHO34.js.map +1 -0
  56. package/dist/{chunk-5L724R4C.js → chunk-TGLRDEEL.js} +8 -13
  57. package/dist/chunk-TGLRDEEL.js.map +1 -0
  58. package/dist/{chunk-HMSHB5EQ.js → chunk-TZXYBG3R.js} +3544 -3037
  59. package/dist/chunk-TZXYBG3R.js.map +1 -0
  60. package/dist/{chunk-PGY5XROM.js → chunk-VR3CDXDT.js} +2 -6
  61. package/dist/chunk-VR3CDXDT.js.map +1 -0
  62. package/dist/{chunk-5FCHJLM7.js → chunk-WF6RM73R.js} +252 -38
  63. package/dist/chunk-WF6RM73R.js.map +1 -0
  64. package/dist/{chunk-3VOL4WEG.js → chunk-WYVDNGJB.js} +3 -3
  65. package/dist/{chunk-WJHFV6RI.js → chunk-X5EG4EFP.js} +2 -2
  66. package/dist/{chunk-JWYRXE6C.js → chunk-XUDTFI4M.js} +2 -2
  67. package/dist/{chunk-7LV4V6A4.js → chunk-YHCYKUA3.js} +14 -10
  68. package/dist/chunk-YHCYKUA3.js.map +1 -0
  69. package/dist/commands/build/marketplace.js +4 -4
  70. package/dist/commands/build/plugins.js +9 -7
  71. package/dist/commands/build/plugins.js.map +1 -1
  72. package/dist/commands/build/stack.js +13 -10
  73. package/dist/commands/build/stack.js.map +1 -1
  74. package/dist/commands/compile.js +42 -71
  75. package/dist/commands/compile.js.map +1 -1
  76. package/dist/commands/config/index.js +7 -5
  77. package/dist/commands/config/index.js.map +1 -1
  78. package/dist/commands/config/path.js +8 -6
  79. package/dist/commands/config/path.js.map +1 -1
  80. package/dist/commands/config/show.js +7 -5
  81. package/dist/commands/diff.js +9 -7
  82. package/dist/commands/diff.js.map +1 -1
  83. package/dist/commands/doctor.js +20 -16
  84. package/dist/commands/doctor.js.map +1 -1
  85. package/dist/commands/edit.js +175 -79
  86. package/dist/commands/edit.js.map +1 -1
  87. package/dist/commands/eject.js +20 -41
  88. package/dist/commands/eject.js.map +1 -1
  89. package/dist/commands/import/skill.js +10 -18
  90. package/dist/commands/import/skill.js.map +1 -1
  91. package/dist/commands/info.js +21 -20
  92. package/dist/commands/info.js.map +1 -1
  93. package/dist/commands/init.js +32 -31
  94. package/dist/commands/list.js +8 -6
  95. package/dist/commands/list.js.map +1 -1
  96. package/dist/commands/new/agent.js +23 -11
  97. package/dist/commands/new/agent.js.map +1 -1
  98. package/dist/commands/new/marketplace.js +63 -46
  99. package/dist/commands/new/marketplace.js.map +1 -1
  100. package/dist/commands/new/skill.js +11 -9
  101. package/dist/commands/outdated.js +9 -7
  102. package/dist/commands/outdated.js.map +1 -1
  103. package/dist/commands/search.js +45 -35
  104. package/dist/commands/search.js.map +1 -1
  105. package/dist/commands/uninstall.js +93 -123
  106. package/dist/commands/uninstall.js.map +1 -1
  107. package/dist/commands/update.js +11 -9
  108. package/dist/commands/update.js.map +1 -1
  109. package/dist/commands/validate.js +23 -27
  110. package/dist/commands/validate.js.map +1 -1
  111. package/dist/components/common/confirm.test.js +4 -4
  112. package/dist/components/skill-search/skill-search.js +3 -3
  113. package/dist/components/wizard/category-grid.js +3 -3
  114. package/dist/components/wizard/category-grid.test.js +4 -4
  115. package/dist/components/wizard/category-grid.test.js.map +1 -1
  116. package/dist/components/wizard/checkbox-grid.js +5 -5
  117. package/dist/components/wizard/checkbox-grid.test.js +6 -6
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +2 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +2 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -3
  123. package/dist/components/wizard/search-modal.test.js.map +1 -1
  124. package/dist/components/wizard/section-progress.js +2 -2
  125. package/dist/components/wizard/section-progress.test.js +4 -4
  126. package/dist/components/wizard/section-progress.test.js.map +1 -1
  127. package/dist/components/wizard/selection-card.js +2 -2
  128. package/dist/components/wizard/source-grid.js +4 -4
  129. package/dist/components/wizard/source-grid.test.js +5 -5
  130. package/dist/components/wizard/source-grid.test.js.map +1 -1
  131. package/dist/components/wizard/stack-selection.js +9 -8
  132. package/dist/components/wizard/step-agents.js +11 -10
  133. package/dist/components/wizard/step-agents.test.js +13 -12
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +11 -9
  136. package/dist/components/wizard/step-build.test.js +18 -22
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +4 -4
  139. package/dist/components/wizard/step-confirm.test.js +83 -23
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +2 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -3
  143. package/dist/components/wizard/step-settings.js +9 -7
  144. package/dist/components/wizard/step-settings.test.js +13 -11
  145. package/dist/components/wizard/step-settings.test.js.map +1 -1
  146. package/dist/components/wizard/step-sources.js +13 -11
  147. package/dist/components/wizard/step-sources.test.js +19 -17
  148. package/dist/components/wizard/step-sources.test.js.map +1 -1
  149. package/dist/components/wizard/step-stack.js +15 -14
  150. package/dist/components/wizard/step-stack.test.js +17 -16
  151. package/dist/components/wizard/step-stack.test.js.map +1 -1
  152. package/dist/components/wizard/view-title.js +2 -2
  153. package/dist/components/wizard/wizard-layout.js +10 -8
  154. package/dist/components/wizard/wizard-tabs.js +2 -2
  155. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  156. package/dist/components/wizard/wizard.js +29 -27
  157. package/dist/config-exports.js +20 -0
  158. package/dist/config-exports.js.map +1 -0
  159. package/dist/hooks/init.js +34 -33
  160. package/dist/hooks/init.js.map +1 -1
  161. package/dist/loader-2O32KKAQ.js +19 -0
  162. package/dist/source-loader-A6B3NDI4.js +16 -0
  163. package/dist/source-loader-A6B3NDI4.js.map +1 -0
  164. package/dist/source-manager-Q7IQSGIX.js +18 -0
  165. package/dist/source-manager-Q7IQSGIX.js.map +1 -0
  166. package/dist/src/agents/meta/agent-summoner/workflow.md +3 -3
  167. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  168. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  169. package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
  170. package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
  171. package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
  172. package/dist/stores/wizard-store.js +6 -5
  173. package/dist/stores/wizard-store.test.js +299 -59
  174. package/dist/stores/wizard-store.test.js.map +1 -1
  175. package/package.json +5 -1
  176. package/src/agents/meta/agent-summoner/workflow.md +3 -3
  177. package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  178. package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  179. package/src/agents/meta/skill-summoner/intro.md +1 -1
  180. package/src/agents/meta/skill-summoner/output-format.md +3 -3
  181. package/src/agents/meta/skill-summoner/workflow.md +8 -8
  182. package/src/schemas/metadata.schema.json +6 -0
  183. package/src/schemas/stacks.schema.json +1 -1
  184. package/config/skill-categories.yaml +0 -344
  185. package/config/skill-rules.yaml +0 -740
  186. package/config/stacks.yaml +0 -1864
  187. package/dist/chunk-26MXZUHU.js +0 -183
  188. package/dist/chunk-26MXZUHU.js.map +0 -1
  189. package/dist/chunk-2BWCR762.js.map +0 -1
  190. package/dist/chunk-4QWDB2MD.js.map +0 -1
  191. package/dist/chunk-5FCHJLM7.js.map +0 -1
  192. package/dist/chunk-5L724R4C.js.map +0 -1
  193. package/dist/chunk-7LV4V6A4.js.map +0 -1
  194. package/dist/chunk-AWP5A6IM.js.map +0 -1
  195. package/dist/chunk-D72AFYQR.js.map +0 -1
  196. package/dist/chunk-HMSHB5EQ.js.map +0 -1
  197. package/dist/chunk-I6IOGZSZ.js.map +0 -1
  198. package/dist/chunk-JFF7P4LC.js.map +0 -1
  199. package/dist/chunk-KQOU4POU.js.map +0 -1
  200. package/dist/chunk-M3GQ2R3E.js.map +0 -1
  201. package/dist/chunk-PGY5XROM.js.map +0 -1
  202. package/dist/chunk-QB5HHTAA.js.map +0 -1
  203. package/dist/chunk-RFKDGJAJ.js.map +0 -1
  204. package/dist/chunk-SPFHPHYL.js.map +0 -1
  205. package/dist/chunk-U2W5SENM.js.map +0 -1
  206. package/dist/chunk-UAD3SC27.js +0 -107
  207. package/dist/chunk-UAD3SC27.js.map +0 -1
  208. package/dist/chunk-WBHPCBVN.js.map +0 -1
  209. package/dist/chunk-WFFV254H.js.map +0 -1
  210. package/dist/chunk-XDSVV5GZ.js.map +0 -1
  211. package/dist/chunk-YZTWZVGX.js.map +0 -1
  212. package/dist/commands/config/get.js +0 -61
  213. package/dist/commands/config/get.js.map +0 -1
  214. package/dist/commands/config/set-project.js +0 -61
  215. package/dist/commands/config/set-project.js.map +0 -1
  216. package/dist/commands/config/unset-project.js +0 -57
  217. package/dist/commands/config/unset-project.js.map +0 -1
  218. package/dist/config/skill-categories.yaml +0 -344
  219. package/dist/config/skill-rules.yaml +0 -740
  220. package/dist/config/stacks.yaml +0 -1864
  221. package/dist/source-manager-BVB2SG73.js +0 -16
  222. /package/dist/{chunk-YDYRAXSY.js.map → chunk-52M2XF3W.js.map} +0 -0
  223. /package/dist/{chunk-RA2IPRO2.js.map → chunk-AJJJE7F7.js.map} +0 -0
  224. /package/dist/{chunk-4R52TQ3K.js.map → chunk-AX3SZZWA.js.map} +0 -0
  225. /package/dist/{chunk-DCE423KO.js.map → chunk-BMJZBLP7.js.map} +0 -0
  226. /package/dist/{chunk-GBOW6FUW.js.map → chunk-BNQ5O6LE.js.map} +0 -0
  227. /package/dist/{chunk-KAO3LKB5.js.map → chunk-C577AJE7.js.map} +0 -0
  228. /package/dist/{chunk-C3Q43WLC.js.map → chunk-CIG7IKX3.js.map} +0 -0
  229. /package/dist/{chunk-RDWGYKDY.js.map → chunk-K6OLORQL.js.map} +0 -0
  230. /package/dist/{chunk-CMNKHDOX.js.map → chunk-MGNYPVOJ.js.map} +0 -0
  231. /package/dist/{chunk-5FPIKTSA.js.map → chunk-MKCHLXMY.js.map} +0 -0
  232. /package/dist/{chunk-U7X4V4HE.js.map → chunk-MMFQNJPE.js.map} +0 -0
  233. /package/dist/{chunk-QYLCINGC.js.map → chunk-SDKCQXWE.js.map} +0 -0
  234. /package/dist/{chunk-3VOL4WEG.js.map → chunk-WYVDNGJB.js.map} +0 -0
  235. /package/dist/{chunk-WJHFV6RI.js.map → chunk-X5EG4EFP.js.map} +0 -0
  236. /package/dist/{chunk-JWYRXE6C.js.map → chunk-XUDTFI4M.js.map} +0 -0
  237. /package/dist/{source-manager-BVB2SG73.js.map → loader-2O32KKAQ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/new/skill.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport { resolveAuthor } from \"../../lib/configuration/index.js\";\nimport { writeFile, readFile, directoryExists, fileExists, ensureDir } from \"../../utils/fs.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport { verbose } from \"../../utils/logger.js\";\nimport {\n CLI_BIN_NAME,\n KEBAB_CASE_PATTERN,\n LOCAL_SKILLS_PATH,\n PLUGIN_MANIFEST_DIR,\n SKILL_CATEGORIES_YAML_PATH,\n SKILL_RULES_YAML_PATH,\n SKILLS_DIR_PATH,\n STANDARD_FILES,\n} from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { LOCAL_DEFAULTS } from \"../../lib/metadata-keys.js\";\nimport { computeSkillFolderHash } from \"../../lib/versioning.js\";\nimport type { CategoryPath } from \"../../types/index.js\";\n\nexport function validateSkillName(name: string): string | null {\n if (!name || name.trim() === \"\") {\n return \"Skill name is required\";\n }\n\n if (!KEBAB_CASE_PATTERN.test(name)) {\n return \"Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)\";\n }\n\n return null;\n}\n\nexport function toTitleCase(kebabCase: string): string {\n return kebabCase\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function generateSkillMd(name: string): string {\n const titleName = toTitleCase(name);\n\n return `---\nname: ${name}\ndescription: Brief description of this skill\n---\n\n# ${titleName}\n\n> **Quick Guide:** Add a brief summary of what this skill teaches.\n\n---\n\n<critical_requirements>\n\n## CRITICAL: Before Using This Skill\n\n**(Add critical requirements here)**\n\n</critical_requirements>\n\n---\n\n**When to use:**\n\n- Add use cases here\n\n**Key patterns covered:**\n\n- Add patterns here\n\n---\n\n<patterns>\n\n## Core Patterns\n\n### Pattern 1: Example Pattern\n\nAdd your patterns here.\n\n</patterns>\n\n---\n\n<critical_reminders>\n\n## CRITICAL REMINDERS\n\n**(Repeat critical requirements here)**\n\n</critical_reminders>\n`;\n}\n\nexport function generateMetadataYaml(\n name: string,\n author: string,\n category: CategoryPath,\n contentHash: string,\n): string {\n const titleName = toTitleCase(name);\n\n return `custom: true\ncategory: ${category}\nauthor: \"${author}\"\ndisplayName: ${titleName}\ncliDescription: Brief description\nusageGuidance: Use when <guidance>.\ncontentHash: ${contentHash}\ntags:\n - local\n - custom\n`;\n}\n\nconst KNOWN_DOMAINS = new Set([\"web\", \"api\", \"mobile\", \"cli\", \"shared\"]);\nconst DEFAULT_CATEGORY_ORDER = 99;\n\nexport function generateSkillCategoriesYaml(category: CategoryPath): string {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const displayName = toTitleCase(subcategoryPart);\n const domainLine = KNOWN_DOMAINS.has(prefix) ? `\\n domain: ${prefix}` : \"\";\n\n return `version: \"1.0.0\"\n\ncategories:\n ${category}:\n id: ${category}\n displayName: ${displayName}\n description: Skills for ${displayName}${domainLine}\n exclusive: true\n required: false\n order: ${DEFAULT_CATEGORY_ORDER}\n custom: true\n`;\n}\n\nexport function generateSkillRulesYaml(skillName: string): string {\n return `version: \"1.0.0\"\n\n# Short aliases mapping to canonical skill IDs\n# Example: react: \"web-framework-react\"\naliases:\n ${skillName}: \"${skillName}\"\n`;\n}\n\nexport default class NewSkill extends BaseCommand {\n static summary = \"Create a new local skill with proper structure\";\n static description = \"Create a new local skill scaffold with SKILL.md and metadata.yaml files\";\n\n static args = {\n name: Args.string({\n description: \"Name of the skill to create (kebab-case)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n author: Flags.string({\n char: \"a\",\n description: \"Author identifier (e.g., @myhandle)\",\n required: false,\n }),\n category: Flags.string({\n char: \"c\",\n description: \"Skill category\",\n default: LOCAL_DEFAULTS.CATEGORY,\n }),\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing skill directory\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory for the skill (overrides marketplace detection)\",\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(NewSkill);\n const projectDir = process.cwd();\n\n this.log(\"\");\n this.log(\"Create New Skill\");\n this.log(\"\");\n\n const validationError = validateSkillName(args.name);\n if (validationError) {\n this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n // Determine author: flag > project config > default\n let author = flags.author;\n if (!author) {\n author = (await resolveAuthor(projectDir)) || LOCAL_DEFAULTS.AUTHOR;\n }\n\n // CLI flag is an untyped string — cast at data boundary\n const category = flags.category as CategoryPath;\n\n // Determine skill output path: --output flag > marketplace detection > local default\n let skillsBasePath: string;\n if (flags.output) {\n skillsBasePath = path.resolve(flags.output);\n } else {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);\n skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);\n } else {\n skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);\n }\n }\n\n const skillDir = path.join(skillsBasePath, args.name);\n\n if (await directoryExists(skillDir)) {\n if (!flags.force) {\n this.error(`Skill directory already exists: ${skillDir}\\nUse --force to overwrite.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n this.warn(`Overwriting existing skill at ${skillDir}`);\n }\n\n this.log(`Skill name: ${args.name}`);\n this.log(`Author: ${author}`);\n this.log(`Category: ${category}`);\n this.log(`Directory: ${skillDir}`);\n this.log(\"\");\n\n if (flags[\"dry-run\"]) {\n this.log(\"[DRY RUN] Would create skill files\");\n return;\n }\n\n this.log(\"Creating skill files...\");\n\n try {\n const skillMdContent = generateSkillMd(args.name);\n\n const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n\n await writeFile(skillMdPath, skillMdContent);\n\n const contentHash = await computeSkillFolderHash(skillDir);\n const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);\n await writeFile(metadataPath, metadataContent);\n\n this.log(\"\");\n this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);\n this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);\n\n // Update config files when in marketplace context\n if (!flags.output) {\n const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, \"marketplace.json\");\n if (await fileExists(marketplacePath)) {\n try {\n await this.updateConfigFiles(projectDir, args.name, category);\n } catch (error) {\n this.warn(`Could not update config files: ${getErrorMessage(error)}`);\n }\n }\n }\n\n this.log(\"\");\n this.log(\n `Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`,\n );\n this.log(\"\");\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async updateConfigFiles(\n projectRoot: string,\n skillName: string,\n category: CategoryPath,\n ): Promise<void> {\n const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);\n const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);\n\n // Update skill-categories.yaml\n if (await fileExists(categoriesPath)) {\n const content = await readFile(categoriesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const categories = (parsed.categories ?? {}) as Record<string, unknown>;\n if (!categories[category]) {\n const prefix = category.split(\"-\")[0];\n const subcategoryPart = category.includes(\"-\")\n ? category.slice(category.indexOf(\"-\") + 1)\n : category;\n const entry: Record<string, unknown> = {\n id: category,\n displayName: toTitleCase(subcategoryPart),\n description: `Skills for ${toTitleCase(subcategoryPart)}`,\n exclusive: true,\n required: false,\n order: DEFAULT_CATEGORY_ORDER,\n custom: true,\n };\n if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;\n categories[category] = entry;\n parsed.categories = categories;\n await writeFile(categoriesPath, stringifyYaml(parsed));\n verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(categoriesPath));\n await writeFile(categoriesPath, generateSkillCategoriesYaml(category));\n verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);\n }\n\n // Update skill-rules.yaml\n if (await fileExists(rulesPath)) {\n const content = await readFile(rulesPath);\n const parsed = parseYaml(content) as Record<string, unknown>;\n const aliases = (parsed.aliases ?? {}) as Record<string, unknown>;\n if (!aliases[skillName]) {\n aliases[skillName] = skillName;\n parsed.aliases = aliases;\n await writeFile(rulesPath, stringifyYaml(parsed));\n verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);\n }\n } else {\n await ensureDir(path.dirname(rulesPath));\n await writeFile(rulesPath, generateSkillRulesYaml(skillName));\n verbose(`Created ${SKILL_RULES_YAML_PATH}`);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { Domain, DomainSelections } from \"../../types/index.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n stackName?: string;\n selectedDomains?: Domain[];\n domainSelections?: DomainSelections;\n technologyCount?: number;\n skillCount?: number;\n agentCount?: number;\n installMode?: \"plugin\" | \"local\";\n onBack?: () => void;\n};\n\nexport const StepConfirm: React.FC<StepConfirmProps> = ({\n onComplete,\n stackName,\n selectedDomains,\n domainSelections,\n technologyCount,\n skillCount,\n agentCount,\n installMode,\n onBack,\n}) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape && onBack) {\n onBack();\n }\n });\n\n const domainsText = selectedDomains?.map(getDomainDisplayName).join(\" + \") || \"\";\n const title = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>{title}</ViewTitle>\n <Text> </Text>\n\n {domainSelections && selectedDomains && !stackName && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {selectedDomains.map((domain) => {\n const selections = domainSelections[domain] || {};\n const techs = Object.values(selections).flat();\n if (techs.length === 0) return null;\n return (\n <Text key={domain}>\n <Text bold>{getDomainDisplayName(domain)}:</Text> <Text>{techs.join(\", \")}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1}>\n {technologyCount !== undefined && (\n <Text>\n <Text dimColor>Technologies:</Text> <Text bold>{technologyCount}</Text>\n </Text>\n )}\n {skillCount !== undefined && (\n <Text>\n <Text dimColor>Skills:</Text> <Text bold>{skillCount}</Text>{\" \"}\n <Text color={CLI_COLORS.PRIMARY}>(all verified)</Text>\n </Text>\n )}\n {agentCount !== undefined && (\n <Text>\n <Text dimColor>Agents:</Text> <Text bold>{agentCount}</Text>\n </Text>\n )}\n {installMode && (\n <Text>\n <Text dimColor>Install mode:</Text>{\" \"}\n <Text bold>{installMode === \"plugin\" ? \"Plugin\" : \"Local\"}</Text>\n </Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>ENTER install ESC go back</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,MAAM,gBAAgB;AA8C9B,cAWU,YAXV;AA3BC,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,UAAU,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,cAAc,iBAAiB,IAAI,oBAAoB,EAAE,KAAK,KAAK,KAAK;AAC9E,QAAM,QAAQ,YACV,oBAAoB,SAAS,KAC7B,qCAAqC,cAAc,KAAK,WAAW,MAAM,EAAE;AAE/E,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GACpC;AAAA,wBAAC,aAAW,iBAAM;AAAA,IAClB,oBAAC,QAAK,eAAC;AAAA,IAEN,oBAAoB,mBAAmB,CAAC,aACvC,oBAAC,OAAI,eAAc,UAAS,cAAc,GACvC,0BAAgB,IAAI,CAAC,WAAW;AAC/B,YAAM,aAAa,iBAAiB,MAAM,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,OAAO,UAAU,EAAE,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,aACE,qBAAC,QACC;AAAA,6BAAC,QAAK,MAAI,MAAE;AAAA,+BAAqB,MAAM;AAAA,UAAE;AAAA,WAAC;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAM,gBAAM,KAAK,IAAI,GAAE;AAAA,WADjE,MAEX;AAAA,IAEJ,CAAC,GACH;AAAA,IAGF,qBAAC,OAAI,eAAc,UAAS,SAAS,GAClC;AAAA,0BAAoB,UACnB,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,2BAAgB;AAAA,SAClE;AAAA,MAED,eAAe,UACd,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,qBAAO;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,sBAAW;AAAA,QAAQ;AAAA,QAC7D,oBAAC,QAAK,OAAO,WAAW,SAAS,4BAAc;AAAA,SACjD;AAAA,MAED,eAAe,UACd,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,qBAAO;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,sBAAW;AAAA,SACvD;AAAA,MAED,eACC,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAQ;AAAA,QACpC,oBAAC,QAAK,MAAI,MAAE,0BAAgB,WAAW,WAAW,SAAQ;AAAA,SAC5D;AAAA,OAEJ;AAAA,IAEA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,UAAQ,MAAC,uCAAyB,GAC1C;AAAA,KACF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/lib/__tests__/test-constants.ts"],"sourcesContent":["// Keyboard escape sequences\nexport const ARROW_UP = \"\\x1B[A\";\nexport const ARROW_DOWN = \"\\x1B[B\";\nexport const ARROW_LEFT = \"\\x1B[D\";\nexport const ARROW_RIGHT = \"\\x1B[C\";\nexport const ENTER = \"\\r\";\nexport const ESCAPE = \"\\x1B\";\nexport const CTRL_C = \"\\x03\";\nexport const TAB = \"\\t\";\nexport const SPACE = \" \";\nexport const BACKSPACE = \"\\x7F\";\nexport const KEY_Y = \"y\";\nexport const KEY_N = \"n\";\n\n// Timing constants (ms)\nexport const INPUT_DELAY_MS = 50;\nexport const RENDER_DELAY_MS = 100;\nexport const SELECT_NAV_DELAY_MS = 100;\nexport const CONFIRM_INPUT_DELAY_MS = 100;\nexport const OPERATION_DELAY_MS = 150;\nexport const STEP_TRANSITION_DELAY_MS = 150;\n\nexport const delay = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\n// Realistic pool of available skills across domains for agent-skill mapping tests\nexport const TEST_AVAILABLE_SKILLS = [\n \"web-framework-react\",\n \"web-framework-vue\",\n \"web-styling-scss-modules\",\n \"web-state-zustand\",\n \"web-testing-vitest\",\n \"web-mocks-msw\",\n \"api-framework-hono\",\n \"api-database-drizzle\",\n \"api-auth-better-auth\",\n \"api-testing-api-testing\",\n \"cli-framework-cli-commander\",\n \"cli-framework-oclif\",\n \"mobile-framework-react-native\",\n \"mobile-framework-expo\",\n \"infra-monorepo-turborepo\",\n \"infra-env-setup\",\n \"security-web-security\",\n \"meta-methodology-investigation-requirements\",\n \"meta-methodology-anti-over-engineering\",\n \"meta-reviewing-reviewing\",\n \"meta-research-research-methodology\",\n] as const;\n"],"mappings":";;;;;;AAAA;AACO,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,QAAQ;AACd,IAAM,SAAS;AAEf,IAAM,MAAM;AACZ,IAAM,QAAQ;AAEd,IAAM,QAAQ;AACd,IAAM,QAAQ;AAGd,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAI/B,IAAM,QAAQ,CAAC,OACpB,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;","names":[]}
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- BaseCommand,
4
- EXIT_CODES
5
- } from "../../chunk-PGY5XROM.js";
6
- import {
7
- loadProjectSourceConfig,
8
- resolveAgentsSource,
9
- resolveSource
10
- } from "../../chunk-HMSHB5EQ.js";
11
- import "../../chunk-T4EXUIBY.js";
12
- import "../../chunk-WBHPCBVN.js";
13
- import "../../chunk-AWP5A6IM.js";
14
- import {
15
- init_esm_shims
16
- } from "../../chunk-DHET7RCE.js";
17
-
18
- // src/cli/commands/config/get.ts
19
- init_esm_shims();
20
- import { Args } from "@oclif/core";
21
- var ConfigGet = class _ConfigGet extends BaseCommand {
22
- static summary = "Get a configuration value";
23
- static description = "Get the effective value of a configuration key (source, author, marketplace, agentsSource)";
24
- static args = {
25
- key: Args.string({
26
- description: "Configuration key (source, author, marketplace, agentsSource)",
27
- required: true
28
- })
29
- };
30
- static flags = {
31
- ...BaseCommand.baseFlags
32
- };
33
- async run() {
34
- const { args } = await this.parse(_ConfigGet);
35
- const projectDir = process.cwd();
36
- const { key } = args;
37
- if (key === "source") {
38
- const resolved = await resolveSource(void 0, projectDir);
39
- this.log(resolved.source);
40
- } else if (key === "author") {
41
- const projectConfig = await loadProjectSourceConfig(projectDir);
42
- this.log(projectConfig?.author || "");
43
- } else if (key === "marketplace") {
44
- const resolved = await resolveSource(void 0, projectDir);
45
- this.log(resolved.marketplace || "");
46
- } else if (key === "agentsSource") {
47
- const resolved = await resolveAgentsSource(void 0, projectDir);
48
- this.log(resolved.agentsSource || "");
49
- } else {
50
- this.error(
51
- `Unknown configuration key: ${key}
52
- Valid keys: source, author, marketplace, agentsSource`,
53
- { exit: EXIT_CODES.INVALID_ARGS }
54
- );
55
- }
56
- }
57
- };
58
- export {
59
- ConfigGet as default
60
- };
61
- //# sourceMappingURL=get.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/cli/commands/config/get.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport {\n resolveSource,\n resolveAgentsSource,\n loadProjectSourceConfig,\n} from \"../../lib/configuration/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\n\nexport default class ConfigGet extends BaseCommand {\n static summary = \"Get a configuration value\";\n static description =\n \"Get the effective value of a configuration key (source, author, marketplace, agentsSource)\";\n\n static args = {\n key: Args.string({\n description: \"Configuration key (source, author, marketplace, agentsSource)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigGet);\n const projectDir = process.cwd();\n\n const { key } = args;\n\n if (key === \"source\") {\n const resolved = await resolveSource(undefined, projectDir);\n this.log(resolved.source);\n } else if (key === \"author\") {\n const projectConfig = await loadProjectSourceConfig(projectDir);\n this.log(projectConfig?.author || \"\");\n } else if (key === \"marketplace\") {\n const resolved = await resolveSource(undefined, projectDir);\n this.log(resolved.marketplace || \"\");\n } else if (key === \"agentsSource\") {\n const resolved = await resolveAgentsSource(undefined, projectDir);\n this.log(resolved.agentsSource || \"\");\n } else {\n this.error(\n `Unknown configuration key: ${key}\\nValid keys: source, author, marketplace, agentsSource`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,YAAY;AAUrB,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,KAAK,KAAK,OAAO;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,UAAS;AAC3C,UAAM,aAAa,QAAQ,IAAI;AAE/B,UAAM,EAAE,IAAI,IAAI;AAEhB,QAAI,QAAQ,UAAU;AACpB,YAAM,WAAW,MAAM,cAAc,QAAW,UAAU;AAC1D,WAAK,IAAI,SAAS,MAAM;AAAA,IAC1B,WAAW,QAAQ,UAAU;AAC3B,YAAM,gBAAgB,MAAM,wBAAwB,UAAU;AAC9D,WAAK,IAAI,eAAe,UAAU,EAAE;AAAA,IACtC,WAAW,QAAQ,eAAe;AAChC,YAAM,WAAW,MAAM,cAAc,QAAW,UAAU;AAC1D,WAAK,IAAI,SAAS,eAAe,EAAE;AAAA,IACrC,WAAW,QAAQ,gBAAgB;AACjC,YAAM,WAAW,MAAM,oBAAoB,QAAW,UAAU;AAChE,WAAK,IAAI,SAAS,gBAAgB,EAAE;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,QACH,8BAA8B,GAAG;AAAA;AAAA,QACjC,EAAE,MAAM,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- BaseCommand,
4
- EXIT_CODES
5
- } from "../../chunk-PGY5XROM.js";
6
- import {
7
- getProjectConfigPath,
8
- loadProjectSourceConfig,
9
- saveProjectConfig
10
- } from "../../chunk-HMSHB5EQ.js";
11
- import "../../chunk-T4EXUIBY.js";
12
- import "../../chunk-WBHPCBVN.js";
13
- import "../../chunk-AWP5A6IM.js";
14
- import {
15
- init_esm_shims
16
- } from "../../chunk-DHET7RCE.js";
17
-
18
- // src/cli/commands/config/set-project.ts
19
- init_esm_shims();
20
- import { Args } from "@oclif/core";
21
- var ConfigSetProject = class _ConfigSetProject extends BaseCommand {
22
- static summary = "Set a project-level configuration value";
23
- static description = "Set a project-level configuration value (source, marketplace, agentsSource)";
24
- static args = {
25
- key: Args.string({
26
- description: "Configuration key (source, marketplace, agentsSource)",
27
- required: true
28
- }),
29
- value: Args.string({
30
- description: "Configuration value",
31
- required: true
32
- })
33
- };
34
- static flags = {
35
- ...BaseCommand.baseFlags
36
- };
37
- async run() {
38
- const { args } = await this.parse(_ConfigSetProject);
39
- const projectDir = process.cwd();
40
- const { key, value } = args;
41
- const validKeys = ["source", "marketplace", "agentsSource"];
42
- if (!validKeys.includes(key)) {
43
- this.error(`Unknown configuration key: ${key}
44
- Valid keys: ${validKeys.join(", ")}`, {
45
- exit: EXIT_CODES.INVALID_ARGS
46
- });
47
- }
48
- const existingConfig = await loadProjectSourceConfig(projectDir) || {};
49
- const newConfig = {
50
- ...existingConfig,
51
- [key]: value
52
- };
53
- await saveProjectConfig(projectDir, newConfig);
54
- this.logSuccess(`Set ${key} = ${value} (project-level)`);
55
- this.logInfo(`Saved to ${getProjectConfigPath(projectDir)}`);
56
- }
57
- };
58
- export {
59
- ConfigSetProject as default
60
- };
61
- //# sourceMappingURL=set-project.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/cli/commands/config/set-project.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport {\n loadProjectSourceConfig,\n saveProjectConfig,\n getProjectConfigPath,\n type ProjectSourceConfig,\n} from \"../../lib/configuration/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\n\nexport default class ConfigSetProject extends BaseCommand {\n static summary = \"Set a project-level configuration value\";\n static description =\n \"Set a project-level configuration value (source, marketplace, agentsSource)\";\n\n static args = {\n key: Args.string({\n description: \"Configuration key (source, marketplace, agentsSource)\",\n required: true,\n }),\n value: Args.string({\n description: \"Configuration value\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigSetProject);\n const projectDir = process.cwd();\n const { key, value } = args;\n\n const validKeys = [\"source\", \"marketplace\", \"agentsSource\"];\n\n if (!validKeys.includes(key)) {\n this.error(`Unknown configuration key: ${key}\\nValid keys: ${validKeys.join(\", \")}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n const existingConfig = (await loadProjectSourceConfig(projectDir)) || {};\n\n const newConfig: ProjectSourceConfig = {\n ...existingConfig,\n [key]: value,\n };\n\n await saveProjectConfig(projectDir, newConfig);\n\n this.logSuccess(`Set ${key} = ${value} (project-level)`);\n this.logInfo(`Saved to ${getProjectConfigPath(projectDir)}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,YAAY;AAUrB,IAAqB,mBAArB,MAAqB,0BAAyB,YAAY;AAAA,EACxD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,KAAK,KAAK,OAAO;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,OAAO,KAAK,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,iBAAgB;AAClD,UAAM,aAAa,QAAQ,IAAI;AAC/B,UAAM,EAAE,KAAK,MAAM,IAAI;AAEvB,UAAM,YAAY,CAAC,UAAU,eAAe,cAAc;AAE1D,QAAI,CAAC,UAAU,SAAS,GAAG,GAAG;AAC5B,WAAK,MAAM,8BAA8B,GAAG;AAAA,cAAiB,UAAU,KAAK,IAAI,CAAC,IAAI;AAAA,QACnF,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,iBAAkB,MAAM,wBAAwB,UAAU,KAAM,CAAC;AAEvE,UAAM,YAAiC;AAAA,MACrC,GAAG;AAAA,MACH,CAAC,GAAG,GAAG;AAAA,IACT;AAEA,UAAM,kBAAkB,YAAY,SAAS;AAE7C,SAAK,WAAW,OAAO,GAAG,MAAM,KAAK,kBAAkB;AACvD,SAAK,QAAQ,YAAY,qBAAqB,UAAU,CAAC,EAAE;AAAA,EAC7D;AACF;","names":[]}
@@ -1,57 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- BaseCommand,
4
- EXIT_CODES
5
- } from "../../chunk-PGY5XROM.js";
6
- import {
7
- loadProjectSourceConfig,
8
- saveProjectConfig
9
- } from "../../chunk-HMSHB5EQ.js";
10
- import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-WBHPCBVN.js";
12
- import "../../chunk-AWP5A6IM.js";
13
- import {
14
- init_esm_shims
15
- } from "../../chunk-DHET7RCE.js";
16
-
17
- // src/cli/commands/config/unset-project.ts
18
- init_esm_shims();
19
- import { Args } from "@oclif/core";
20
- var ConfigUnsetProject = class _ConfigUnsetProject extends BaseCommand {
21
- static summary = "Remove a project-level configuration value";
22
- static description = "Remove a project-level configuration value";
23
- static args = {
24
- key: Args.string({
25
- description: "Configuration key to remove",
26
- required: true
27
- })
28
- };
29
- static flags = {
30
- ...BaseCommand.baseFlags
31
- };
32
- async run() {
33
- const { args } = await this.parse(_ConfigUnsetProject);
34
- const projectDir = process.cwd();
35
- const { key } = args;
36
- const validKeys = ["source", "marketplace", "agentsSource"];
37
- if (!validKeys.includes(key)) {
38
- this.error(`Unknown configuration key: ${key}
39
- Valid keys: ${validKeys.join(", ")}`, {
40
- exit: EXIT_CODES.INVALID_ARGS
41
- });
42
- }
43
- const existingConfig = await loadProjectSourceConfig(projectDir);
44
- if (!existingConfig) {
45
- this.logInfo("No project configuration exists.");
46
- return;
47
- }
48
- const newConfig = { ...existingConfig };
49
- delete newConfig[key];
50
- await saveProjectConfig(projectDir, newConfig);
51
- this.logSuccess(`Removed ${key} from project configuration`);
52
- }
53
- };
54
- export {
55
- ConfigUnsetProject as default
56
- };
57
- //# sourceMappingURL=unset-project.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/cli/commands/config/unset-project.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\nimport { BaseCommand } from \"../../base-command.js\";\nimport {\n loadProjectSourceConfig,\n saveProjectConfig,\n type ProjectSourceConfig,\n} from \"../../lib/configuration/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\n\nexport default class ConfigUnsetProject extends BaseCommand {\n static summary = \"Remove a project-level configuration value\";\n static description = \"Remove a project-level configuration value\";\n\n static args = {\n key: Args.string({\n description: \"Configuration key to remove\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(ConfigUnsetProject);\n const projectDir = process.cwd();\n const { key } = args;\n\n const validKeys = [\"source\", \"marketplace\", \"agentsSource\"];\n\n if (!validKeys.includes(key)) {\n this.error(`Unknown configuration key: ${key}\\nValid keys: ${validKeys.join(\", \")}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n const existingConfig = await loadProjectSourceConfig(projectDir);\n\n if (!existingConfig) {\n this.logInfo(\"No project configuration exists.\");\n return;\n }\n\n const newConfig: ProjectSourceConfig = { ...existingConfig };\n delete newConfig[key as keyof ProjectSourceConfig];\n\n await saveProjectConfig(projectDir, newConfig);\n\n this.logSuccess(`Removed ${key} from project configuration`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,YAAY;AASrB,IAAqB,qBAArB,MAAqB,4BAA2B,YAAY;AAAA,EAC1D,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACZ,KAAK,KAAK,OAAO;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,mBAAkB;AACpD,UAAM,aAAa,QAAQ,IAAI;AAC/B,UAAM,EAAE,IAAI,IAAI;AAEhB,UAAM,YAAY,CAAC,UAAU,eAAe,cAAc;AAE1D,QAAI,CAAC,UAAU,SAAS,GAAG,GAAG;AAC5B,WAAK,MAAM,8BAA8B,GAAG;AAAA,cAAiB,UAAU,KAAK,IAAI,CAAC,IAAI;AAAA,QACnF,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,MAAM,wBAAwB,UAAU;AAE/D,QAAI,CAAC,gBAAgB;AACnB,WAAK,QAAQ,kCAAkC;AAC/C;AAAA,IACF;AAEA,UAAM,YAAiC,EAAE,GAAG,eAAe;AAC3D,WAAO,UAAU,GAAgC;AAEjD,UAAM,kBAAkB,YAAY,SAAS;AAE7C,SAAK,WAAW,WAAW,GAAG,6BAA6B;AAAA,EAC7D;AACF;","names":[]}
@@ -1,344 +0,0 @@
1
- version: "1.0.0"
2
-
3
- categories:
4
- web-framework:
5
- id: web-framework
6
- displayName: Framework
7
- description: UI framework (React, Vue, Angular, SolidJS, Next.js, Remix, Nuxt)
8
- domain: web
9
- exclusive: true
10
- required: true
11
- order: 1
12
-
13
- web-styling:
14
- id: web-styling
15
- displayName: Styling
16
- description: CSS approach (SCSS Modules, Tailwind, CVA)
17
- domain: web
18
- exclusive: false
19
- required: true
20
- order: 3
21
-
22
- web-client-state:
23
- id: web-client-state
24
- displayName: Client State Management
25
- description: UI state, forms, local data (Zustand, Redux, MobX)
26
- domain: web
27
- exclusive: true
28
- required: false
29
- order: 4
30
-
31
- web-server-state:
32
- id: web-server-state
33
- displayName: Server State / Data Fetching
34
- description: API data caching (React Query, SWR)
35
- domain: web
36
- exclusive: true
37
- required: false
38
- order: 5
39
-
40
- web-forms:
41
- id: web-forms
42
- displayName: Forms & Validation
43
- description: Form handling and schema validation
44
- domain: web
45
- exclusive: false
46
- required: false
47
- order: 6
48
-
49
- web-testing:
50
- id: web-testing
51
- displayName: Testing
52
- description: Unit, integration, and E2E testing
53
- domain: web
54
- exclusive: false
55
- required: false
56
- order: 7
57
-
58
- web-ui-components:
59
- id: web-ui-components
60
- displayName: UI Component Library
61
- description: Pre-built component systems (Radix, shadcn)
62
- domain: web
63
- exclusive: false
64
- required: false
65
- order: 8
66
-
67
- web-mocking:
68
- id: web-mocking
69
- displayName: API Mocking
70
- description: Mock Service Worker for development and testing
71
- domain: web
72
- exclusive: false
73
- required: false
74
- order: 10
75
-
76
- web-error-handling:
77
- id: web-error-handling
78
- displayName: Error Handling
79
- description: Error boundaries, result types, and error patterns
80
- domain: web
81
- exclusive: false
82
- required: false
83
- order: 11
84
-
85
- web-i18n:
86
- id: web-i18n
87
- displayName: Internationalization
88
- description: i18n libraries (next-intl, react-intl, vue-i18n)
89
- domain: web
90
- exclusive: true
91
- required: false
92
- order: 12
93
-
94
- web-file-upload:
95
- id: web-file-upload
96
- displayName: File Upload
97
- description: File upload patterns and handling
98
- domain: web
99
- exclusive: false
100
- required: false
101
- order: 13
102
-
103
- web-files:
104
- id: web-files
105
- displayName: Files & Images
106
- description: Image handling and file processing
107
- domain: web
108
- exclusive: false
109
- required: false
110
- order: 14
111
-
112
- web-utilities:
113
- id: web-utilities
114
- displayName: Utilities
115
- description: Utility libraries (date-fns, native JS patterns)
116
- domain: web
117
- exclusive: false
118
- required: false
119
- order: 15
120
-
121
- web-realtime:
122
- id: web-realtime
123
- displayName: Realtime
124
- description: WebSockets, SSE, and real-time communication
125
- domain: web
126
- exclusive: true
127
- required: false
128
- order: 16
129
-
130
- web-animation:
131
- id: web-animation
132
- displayName: Animation
133
- description: Animation libraries and CSS animations
134
- domain: web
135
- exclusive: false
136
- required: false
137
- order: 17
138
-
139
- web-pwa:
140
- id: web-pwa
141
- displayName: Progressive Web App
142
- description: Service workers, offline-first patterns, and PWA features
143
- domain: web
144
- exclusive: false
145
- required: false
146
- order: 18
147
-
148
- web-accessibility:
149
- id: web-accessibility
150
- displayName: Accessibility
151
- description: WCAG compliance, ARIA, and keyboard navigation
152
- domain: web
153
- exclusive: false
154
- required: false
155
- order: 19
156
-
157
- web-performance:
158
- id: web-performance
159
- displayName: Web Performance
160
- description: Bundle optimization, render performance, and code splitting
161
- domain: web
162
- exclusive: false
163
- required: false
164
- order: 20
165
-
166
- web-base-framework:
167
- id: web-base-framework
168
- displayName: Base Framework
169
- description: Base framework setup and configuration
170
- domain: web
171
- exclusive: false
172
- required: false
173
- order: 21
174
-
175
- api-api:
176
- id: api-api
177
- displayName: API Framework
178
- description: Backend framework (Hono, Express, Fastify)
179
- domain: api
180
- exclusive: true
181
- required: true
182
- order: 1
183
-
184
- api-database:
185
- id: api-database
186
- displayName: Database ORM
187
- description: Database access layer (Drizzle, Prisma)
188
- domain: api
189
- exclusive: true
190
- required: false
191
- order: 2
192
-
193
- api-auth:
194
- id: api-auth
195
- displayName: Authentication
196
- description: Auth solution (Better Auth, Auth.js)
197
- domain: api
198
- exclusive: true
199
- required: false
200
- order: 3
201
-
202
- api-observability:
203
- id: api-observability
204
- displayName: Observability
205
- description: Logging, monitoring, error tracking
206
- domain: api
207
- exclusive: false
208
- required: false
209
- order: 4
210
-
211
- api-analytics:
212
- id: api-analytics
213
- displayName: Analytics
214
- description: Product analytics and tracking
215
- domain: api
216
- exclusive: false
217
- required: false
218
- order: 5
219
-
220
- api-email:
221
- id: api-email
222
- displayName: Email
223
- description: Transactional email (Resend, Sendgrid)
224
- domain: api
225
- exclusive: true
226
- required: false
227
- order: 6
228
-
229
- api-performance:
230
- id: api-performance
231
- displayName: Performance
232
- description: API performance patterns and optimization
233
- domain: api
234
- exclusive: false
235
- required: false
236
- order: 7
237
-
238
- mobile-framework:
239
- id: mobile-framework
240
- displayName: Mobile Framework
241
- description: Native mobile framework (React Native, Expo)
242
- domain: mobile
243
- exclusive: true
244
- required: true
245
- order: 1
246
-
247
- mobile-platform:
248
- id: mobile-platform
249
- displayName: Mobile Platform
250
- description: Mobile platform tooling and configuration
251
- domain: mobile
252
- exclusive: false
253
- required: false
254
- order: 2
255
-
256
- shared-monorepo:
257
- id: shared-monorepo
258
- displayName: Monorepo
259
- description: Monorepo tooling (Turborepo, Nx)
260
- domain: shared
261
- exclusive: true
262
- required: false
263
- order: 1
264
-
265
- shared-tooling:
266
- id: shared-tooling
267
- displayName: Build Tooling
268
- description: ESLint, Prettier, TypeScript, Vite
269
- domain: shared
270
- exclusive: false
271
- required: false
272
- order: 2
273
-
274
- shared-security:
275
- id: shared-security
276
- displayName: Security
277
- description: Authentication security patterns and best practices
278
- domain: shared
279
- exclusive: false
280
- required: false
281
- order: 3
282
-
283
- shared-methodology:
284
- id: shared-methodology
285
- displayName: Methodology
286
- description: Development methodology and engineering principles
287
- domain: shared
288
- exclusive: false
289
- required: false
290
- order: 4
291
-
292
- shared-research:
293
- id: shared-research
294
- displayName: Research
295
- description: Codebase investigation and research methodology
296
- domain: shared
297
- exclusive: false
298
- required: false
299
- order: 5
300
-
301
- shared-reviewing:
302
- id: shared-reviewing
303
- displayName: Code Review
304
- description: Code review patterns and guidance
305
- domain: shared
306
- exclusive: false
307
- required: false
308
- order: 6
309
-
310
- shared-ci-cd:
311
- id: shared-ci-cd
312
- displayName: CI/CD
313
- description: Continuous integration and deployment pipelines
314
- domain: shared
315
- exclusive: false
316
- required: false
317
- order: 7
318
-
319
- cli-framework:
320
- id: cli-framework
321
- displayName: CLI Framework
322
- description: CLI application framework (Commander, oclif)
323
- domain: cli
324
- exclusive: true
325
- required: true
326
- order: 1
327
-
328
- cli-prompts:
329
- id: cli-prompts
330
- displayName: CLI Prompts
331
- description: Interactive prompts and UI
332
- domain: cli
333
- exclusive: true
334
- required: false
335
- order: 2
336
-
337
- cli-testing:
338
- id: cli-testing
339
- displayName: CLI Testing
340
- description: CLI testing utilities
341
- domain: cli
342
- exclusive: false
343
- required: false
344
- order: 3