@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
@@ -7,45 +7,57 @@ import {
7
7
  init_esm_shims();
8
8
  var SKILL_SLUGS = [
9
9
  "angular-standalone",
10
- "anti-over-engineering",
10
+ "ant-design",
11
11
  "api-performance",
12
+ "astro",
12
13
  "auth-security",
13
14
  "axiom-pino-sentry",
14
15
  "better-auth-drizzle-hono",
16
+ "biome",
17
+ "clerk",
15
18
  "cli-commander",
16
19
  "cli-reviewing",
17
- "context-management",
20
+ "cloudflare-workers",
18
21
  "css-animations",
19
22
  "cva",
20
23
  "cypress-e2e",
21
24
  "date-fns",
25
+ "docker",
22
26
  "drizzle",
23
27
  "error-boundaries",
28
+ "eslint-prettier",
24
29
  "expo",
25
30
  "express",
26
31
  "fastify",
27
32
  "file-upload-patterns",
33
+ "firebase",
28
34
  "framer-motion",
35
+ "git-hooks",
29
36
  "github-actions",
30
37
  "graphql-apollo",
31
38
  "graphql-urql",
39
+ "headless-ui",
32
40
  "hono",
33
41
  "image-handling",
34
- "improvement-protocol",
35
- "investigation-requirements",
36
42
  "jotai",
37
43
  "mobx",
44
+ "mongodb",
38
45
  "msw",
46
+ "mui",
39
47
  "native-js",
48
+ "nestjs",
40
49
  "next-intl",
41
- "nextjs-app-router",
42
- "nextjs-server-actions",
50
+ "nextauth",
51
+ "nextjs",
43
52
  "ngrx-signalstore",
44
53
  "nuxt",
54
+ "nx",
45
55
  "oclif-ink",
46
56
  "offline-first",
57
+ "openai-sdk",
47
58
  "pinia",
48
59
  "playwright-e2e",
60
+ "pnpm-workspaces",
49
61
  "posthog-analytics",
50
62
  "posthog-flags",
51
63
  "prisma",
@@ -56,6 +68,7 @@ var SKILL_SLUGS = [
56
68
  "react-native",
57
69
  "react-query",
58
70
  "react-testing-library",
71
+ "redis",
59
72
  "redux-toolkit",
60
73
  "remix",
61
74
  "research-methodology",
@@ -68,20 +81,25 @@ var SKILL_SLUGS = [
68
81
  "setup-env",
69
82
  "setup-posthog",
70
83
  "setup-resend",
71
- "setup-tooling",
72
84
  "shadcn-ui",
73
85
  "socket-io",
74
86
  "solidjs",
75
87
  "sse",
76
88
  "storybook",
77
- "success-criteria",
89
+ "supabase",
90
+ "svelte",
91
+ "sveltekit",
78
92
  "swr",
79
93
  "tailwind",
94
+ "tanstack-router",
80
95
  "tanstack-table",
81
96
  "trpc",
82
97
  "turborepo",
98
+ "typescript-config",
83
99
  "vee-validate",
100
+ "vercel-ai-sdk",
84
101
  "view-transitions",
102
+ "vite",
85
103
  "vitest",
86
104
  "vue-composition-api",
87
105
  "vue-i18n",
@@ -89,14 +107,15 @@ var SKILL_SLUGS = [
89
107
  "web-accessibility",
90
108
  "web-performance",
91
109
  "websockets",
92
- "write-verification",
93
110
  "zod-validation",
94
111
  "zustand"
95
112
  ];
96
113
  var CATEGORIES = [
114
+ "api-ai",
97
115
  "api-analytics",
98
116
  "api-api",
99
117
  "api-auth",
118
+ "api-baas",
100
119
  "api-database",
101
120
  "api-email",
102
121
  "api-observability",
@@ -104,10 +123,9 @@ var CATEGORIES = [
104
123
  "cli-framework",
105
124
  "mobile-framework",
106
125
  "shared-ci-cd",
107
- "shared-methodology",
126
+ "shared-infra",
127
+ "shared-meta",
108
128
  "shared-monorepo",
109
- "shared-research",
110
- "shared-reviewing",
111
129
  "shared-security",
112
130
  "shared-tooling",
113
131
  "web-accessibility",
@@ -119,6 +137,7 @@ var CATEGORIES = [
119
137
  "web-forms",
120
138
  "web-framework",
121
139
  "web-i18n",
140
+ "web-meta-framework",
122
141
  "web-mocking",
123
142
  "web-performance",
124
143
  "web-pwa",
@@ -126,6 +145,7 @@ var CATEGORIES = [
126
145
  "web-server-state",
127
146
  "web-styling",
128
147
  "web-testing",
148
+ "web-tooling",
129
149
  "web-ui-components",
130
150
  "web-utilities"
131
151
  ];
@@ -156,4 +176,4 @@ export {
156
176
  DOMAINS,
157
177
  AGENT_NAMES
158
178
  };
159
- //# sourceMappingURL=chunk-SRIH4U5Y.js.map
179
+ //# sourceMappingURL=chunk-Q4PJSAMP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/types/generated/source-types.ts"],"sourcesContent":["// AUTO-GENERATED from skills source and agent metadata — do not edit manually\n// Run: bun run generate:types\n\n// ── Skill Map (slug → ID) ─────────────────────────────────────\n\nexport const SKILL_MAP = {\n \"angular-standalone\": \"web-framework-angular-standalone\",\n \"ant-design\": \"web-ui-ant-design\",\n \"api-performance\": \"api-performance-api-performance\",\n astro: \"web-meta-framework-astro\",\n \"auth-security\": \"shared-security-auth-security\",\n \"axiom-pino-sentry\": \"api-observability-axiom-pino-sentry\",\n \"better-auth-drizzle-hono\": \"api-auth-better-auth-drizzle-hono\",\n biome: \"shared-tooling-biome\",\n clerk: \"api-auth-clerk\",\n \"cli-commander\": \"cli-framework-cli-commander\",\n \"cli-reviewing\": \"shared-meta-cli-reviewing\",\n \"cloudflare-workers\": \"shared-ci-cd-cloudflare-workers\",\n \"css-animations\": \"web-animation-css-animations\",\n cva: \"web-styling-cva\",\n \"cypress-e2e\": \"web-testing-cypress-e2e\",\n \"date-fns\": \"web-utilities-date-fns\",\n docker: \"shared-ci-cd-docker\",\n drizzle: \"api-database-drizzle\",\n \"error-boundaries\": \"web-error-handling-error-boundaries\",\n \"eslint-prettier\": \"shared-tooling-eslint-prettier\",\n expo: \"mobile-framework-expo\",\n express: \"api-framework-express\",\n fastify: \"api-framework-fastify\",\n \"file-upload-patterns\": \"web-files-file-upload-patterns\",\n firebase: \"api-baas-firebase\",\n \"framer-motion\": \"web-animation-framer-motion\",\n \"git-hooks\": \"shared-tooling-git-hooks\",\n \"github-actions\": \"shared-ci-cd-github-actions\",\n \"graphql-apollo\": \"web-data-fetching-graphql-apollo\",\n \"graphql-urql\": \"web-data-fetching-graphql-urql\",\n \"headless-ui\": \"web-ui-headless-ui\",\n hono: \"api-framework-hono\",\n \"image-handling\": \"web-files-image-handling\",\n jotai: \"web-state-jotai\",\n mobx: \"web-state-mobx\",\n mongodb: \"api-database-mongodb\",\n msw: \"web-mocks-msw\",\n mui: \"web-ui-mui\",\n \"native-js\": \"web-utilities-native-js\",\n nestjs: \"api-framework-nestjs\",\n \"next-intl\": \"web-i18n-next-intl\",\n nextauth: \"api-auth-nextauth\",\n nextjs: \"web-meta-framework-nextjs\",\n \"ngrx-signalstore\": \"web-state-ngrx-signalstore\",\n nuxt: \"web-meta-framework-nuxt\",\n nx: \"shared-monorepo-nx\",\n \"oclif-ink\": \"cli-framework-oclif-ink\",\n \"offline-first\": \"web-pwa-offline-first\",\n \"openai-sdk\": \"api-ai-openai-sdk\",\n pinia: \"web-state-pinia\",\n \"playwright-e2e\": \"web-testing-playwright-e2e\",\n \"pnpm-workspaces\": \"shared-monorepo-pnpm-workspaces\",\n \"posthog-analytics\": \"api-analytics-posthog-analytics\",\n \"posthog-flags\": \"api-flags-posthog-flags\",\n prisma: \"api-database-prisma\",\n \"radix-ui\": \"web-ui-radix-ui\",\n react: \"web-framework-react\",\n \"react-hook-form\": \"web-forms-react-hook-form\",\n \"react-intl\": \"web-i18n-react-intl\",\n \"react-native\": \"mobile-framework-react-native\",\n \"react-query\": \"web-server-state-react-query\",\n \"react-testing-library\": \"web-testing-react-testing-library\",\n redis: \"api-database-redis\",\n \"redux-toolkit\": \"web-state-redux-toolkit\",\n remix: \"web-meta-framework-remix\",\n \"research-methodology\": \"shared-meta-research-methodology\",\n \"resend-react-email\": \"api-email-resend-react-email\",\n \"result-types\": \"web-error-handling-result-types\",\n reviewing: \"shared-meta-reviewing\",\n \"scss-modules\": \"web-styling-scss-modules\",\n \"service-workers\": \"web-pwa-service-workers\",\n \"setup-axiom-pino-sentry\": \"api-observability-setup-axiom-pino-sentry\",\n \"setup-env\": \"shared-infra-setup-env\",\n \"setup-posthog\": \"api-analytics-setup-posthog\",\n \"setup-resend\": \"api-email-setup-resend\",\n \"shadcn-ui\": \"web-ui-shadcn-ui\",\n \"socket-io\": \"web-realtime-socket-io\",\n solidjs: \"web-framework-solidjs\",\n sse: \"web-realtime-sse\",\n storybook: \"web-tooling-storybook\",\n supabase: \"api-baas-supabase\",\n svelte: \"web-framework-svelte\",\n sveltekit: \"web-meta-framework-sveltekit\",\n swr: \"web-data-fetching-swr\",\n tailwind: \"web-styling-tailwind\",\n \"tanstack-router\": \"web-framework-tanstack-router\",\n \"tanstack-table\": \"web-ui-tanstack-table\",\n trpc: \"web-data-fetching-trpc\",\n turborepo: \"shared-monorepo-turborepo\",\n \"typescript-config\": \"shared-tooling-typescript-config\",\n \"vee-validate\": \"web-forms-vee-validate\",\n \"vercel-ai-sdk\": \"api-ai-vercel-ai-sdk\",\n \"view-transitions\": \"web-animation-view-transitions\",\n vite: \"web-tooling-vite\",\n vitest: \"web-testing-vitest\",\n \"vue-composition-api\": \"web-framework-vue-composition-api\",\n \"vue-i18n\": \"web-i18n-vue-i18n\",\n \"vue-test-utils\": \"web-testing-vue-test-utils\",\n \"web-accessibility\": \"web-accessibility-web-accessibility\",\n \"web-performance\": \"web-performance-web-performance\",\n websockets: \"web-realtime-websockets\",\n \"zod-validation\": \"web-forms-zod-validation\",\n zustand: \"web-state-zustand\",\n} as const;\n\nexport type SkillSlug = keyof typeof SKILL_MAP;\nexport type SkillId = (typeof SKILL_MAP)[SkillSlug];\n\n// Derived arrays for Zod enum compatibility\n// (z.enum() requires a readonly tuple, not Object.keys/values)\nexport const SKILL_SLUGS = [\n \"angular-standalone\",\n \"ant-design\",\n \"api-performance\",\n \"astro\",\n \"auth-security\",\n \"axiom-pino-sentry\",\n \"better-auth-drizzle-hono\",\n \"biome\",\n \"clerk\",\n \"cli-commander\",\n \"cli-reviewing\",\n \"cloudflare-workers\",\n \"css-animations\",\n \"cva\",\n \"cypress-e2e\",\n \"date-fns\",\n \"docker\",\n \"drizzle\",\n \"error-boundaries\",\n \"eslint-prettier\",\n \"expo\",\n \"express\",\n \"fastify\",\n \"file-upload-patterns\",\n \"firebase\",\n \"framer-motion\",\n \"git-hooks\",\n \"github-actions\",\n \"graphql-apollo\",\n \"graphql-urql\",\n \"headless-ui\",\n \"hono\",\n \"image-handling\",\n \"jotai\",\n \"mobx\",\n \"mongodb\",\n \"msw\",\n \"mui\",\n \"native-js\",\n \"nestjs\",\n \"next-intl\",\n \"nextauth\",\n \"nextjs\",\n \"ngrx-signalstore\",\n \"nuxt\",\n \"nx\",\n \"oclif-ink\",\n \"offline-first\",\n \"openai-sdk\",\n \"pinia\",\n \"playwright-e2e\",\n \"pnpm-workspaces\",\n \"posthog-analytics\",\n \"posthog-flags\",\n \"prisma\",\n \"radix-ui\",\n \"react\",\n \"react-hook-form\",\n \"react-intl\",\n \"react-native\",\n \"react-query\",\n \"react-testing-library\",\n \"redis\",\n \"redux-toolkit\",\n \"remix\",\n \"research-methodology\",\n \"resend-react-email\",\n \"result-types\",\n \"reviewing\",\n \"scss-modules\",\n \"service-workers\",\n \"setup-axiom-pino-sentry\",\n \"setup-env\",\n \"setup-posthog\",\n \"setup-resend\",\n \"shadcn-ui\",\n \"socket-io\",\n \"solidjs\",\n \"sse\",\n \"storybook\",\n \"supabase\",\n \"svelte\",\n \"sveltekit\",\n \"swr\",\n \"tailwind\",\n \"tanstack-router\",\n \"tanstack-table\",\n \"trpc\",\n \"turborepo\",\n \"typescript-config\",\n \"vee-validate\",\n \"vercel-ai-sdk\",\n \"view-transitions\",\n \"vite\",\n \"vitest\",\n \"vue-composition-api\",\n \"vue-i18n\",\n \"vue-test-utils\",\n \"web-accessibility\",\n \"web-performance\",\n \"websockets\",\n \"zod-validation\",\n \"zustand\",\n] as const satisfies readonly SkillSlug[];\n\nexport const SKILL_IDS = [\n \"api-ai-openai-sdk\",\n \"api-ai-vercel-ai-sdk\",\n \"api-analytics-posthog-analytics\",\n \"api-analytics-setup-posthog\",\n \"api-auth-better-auth-drizzle-hono\",\n \"api-auth-clerk\",\n \"api-auth-nextauth\",\n \"api-baas-firebase\",\n \"api-baas-supabase\",\n \"api-database-drizzle\",\n \"api-database-mongodb\",\n \"api-database-prisma\",\n \"api-database-redis\",\n \"api-email-resend-react-email\",\n \"api-email-setup-resend\",\n \"api-flags-posthog-flags\",\n \"api-framework-express\",\n \"api-framework-fastify\",\n \"api-framework-hono\",\n \"api-framework-nestjs\",\n \"api-observability-axiom-pino-sentry\",\n \"api-observability-setup-axiom-pino-sentry\",\n \"api-performance-api-performance\",\n \"cli-framework-cli-commander\",\n \"cli-framework-oclif-ink\",\n \"mobile-framework-expo\",\n \"mobile-framework-react-native\",\n \"shared-ci-cd-cloudflare-workers\",\n \"shared-ci-cd-docker\",\n \"shared-ci-cd-github-actions\",\n \"shared-infra-setup-env\",\n \"shared-meta-cli-reviewing\",\n \"shared-meta-research-methodology\",\n \"shared-meta-reviewing\",\n \"shared-monorepo-nx\",\n \"shared-monorepo-pnpm-workspaces\",\n \"shared-monorepo-turborepo\",\n \"shared-security-auth-security\",\n \"shared-tooling-biome\",\n \"shared-tooling-eslint-prettier\",\n \"shared-tooling-git-hooks\",\n \"shared-tooling-typescript-config\",\n \"web-accessibility-web-accessibility\",\n \"web-animation-css-animations\",\n \"web-animation-framer-motion\",\n \"web-animation-view-transitions\",\n \"web-data-fetching-graphql-apollo\",\n \"web-data-fetching-graphql-urql\",\n \"web-data-fetching-swr\",\n \"web-data-fetching-trpc\",\n \"web-error-handling-error-boundaries\",\n \"web-error-handling-result-types\",\n \"web-files-file-upload-patterns\",\n \"web-files-image-handling\",\n \"web-forms-react-hook-form\",\n \"web-forms-vee-validate\",\n \"web-forms-zod-validation\",\n \"web-framework-angular-standalone\",\n \"web-framework-react\",\n \"web-framework-solidjs\",\n \"web-framework-svelte\",\n \"web-framework-tanstack-router\",\n \"web-framework-vue-composition-api\",\n \"web-i18n-next-intl\",\n \"web-i18n-react-intl\",\n \"web-i18n-vue-i18n\",\n \"web-meta-framework-astro\",\n \"web-meta-framework-nextjs\",\n \"web-meta-framework-nuxt\",\n \"web-meta-framework-remix\",\n \"web-meta-framework-sveltekit\",\n \"web-mocks-msw\",\n \"web-performance-web-performance\",\n \"web-pwa-offline-first\",\n \"web-pwa-service-workers\",\n \"web-realtime-socket-io\",\n \"web-realtime-sse\",\n \"web-realtime-websockets\",\n \"web-server-state-react-query\",\n \"web-state-jotai\",\n \"web-state-mobx\",\n \"web-state-ngrx-signalstore\",\n \"web-state-pinia\",\n \"web-state-redux-toolkit\",\n \"web-state-zustand\",\n \"web-styling-cva\",\n \"web-styling-scss-modules\",\n \"web-styling-tailwind\",\n \"web-testing-cypress-e2e\",\n \"web-testing-playwright-e2e\",\n \"web-testing-react-testing-library\",\n \"web-testing-vitest\",\n \"web-testing-vue-test-utils\",\n \"web-tooling-storybook\",\n \"web-tooling-vite\",\n \"web-ui-ant-design\",\n \"web-ui-headless-ui\",\n \"web-ui-mui\",\n \"web-ui-radix-ui\",\n \"web-ui-shadcn-ui\",\n \"web-ui-tanstack-table\",\n \"web-utilities-date-fns\",\n \"web-utilities-native-js\",\n] as const satisfies readonly SkillId[];\n\n// ── Categories ─────────────────────────────────────────────────\n\nexport const CATEGORIES = [\n \"api-ai\",\n \"api-analytics\",\n \"api-api\",\n \"api-auth\",\n \"api-baas\",\n \"api-database\",\n \"api-email\",\n \"api-observability\",\n \"api-performance\",\n \"cli-framework\",\n \"mobile-framework\",\n \"shared-ci-cd\",\n \"shared-infra\",\n \"shared-meta\",\n \"shared-monorepo\",\n \"shared-security\",\n \"shared-tooling\",\n \"web-accessibility\",\n \"web-animation\",\n \"web-client-state\",\n \"web-error-handling\",\n \"web-file-upload\",\n \"web-files\",\n \"web-forms\",\n \"web-framework\",\n \"web-i18n\",\n \"web-meta-framework\",\n \"web-mocking\",\n \"web-performance\",\n \"web-pwa\",\n \"web-realtime\",\n \"web-server-state\",\n \"web-styling\",\n \"web-testing\",\n \"web-tooling\",\n \"web-ui-components\",\n \"web-utilities\",\n] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\n// ── Domains ────────────────────────────────────────────────────\n\nexport const DOMAINS = [\"api\", \"cli\", \"mobile\", \"shared\", \"web\"] as const;\n\nexport type Domain = (typeof DOMAINS)[number];\n\n// ── Agent Names ────────────────────────────────────────────────\n\nexport const AGENT_NAMES = [\n \"agent-summoner\",\n \"api-developer\",\n \"api-researcher\",\n \"api-reviewer\",\n \"cli-developer\",\n \"cli-reviewer\",\n \"cli-tester\",\n \"documentor\",\n \"pattern-scout\",\n \"skill-summoner\",\n \"web-architecture\",\n \"web-developer\",\n \"web-pattern-critique\",\n \"web-pm\",\n \"web-researcher\",\n \"web-reviewer\",\n \"web-tester\",\n] as const;\n\nexport type AgentName = (typeof AGENT_NAMES)[number];\n"],"mappings":";;;;;;AAAA;AAoHO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA8GO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,IAAM,UAAU,CAAC,OAAO,OAAO,UAAU,UAAU,KAAK;AAMxD,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  CLI_COLORS,
12
12
  DEFAULT_BRANDING
13
- } from "./chunk-EGMQ3SXN.js";
13
+ } from "./chunk-FMYAYX6W.js";
14
14
  import {
15
15
  init_esm_shims
16
16
  } from "./chunk-DHET7RCE.js";
@@ -119,4 +119,4 @@ var StepRefine = ({
119
119
  export {
120
120
  StepRefine
121
121
  };
122
- //# sourceMappingURL=chunk-Q3F36QZZ.js.map
122
+ //# sourceMappingURL=chunk-R7F5YQMI.js.map
@@ -5,24 +5,24 @@ import {
5
5
  import {
6
6
  getDomainDisplayName,
7
7
  isAgentName
8
- } from "./chunk-LVNNP7T4.js";
8
+ } from "./chunk-UBNHVBSV.js";
9
9
  import {
10
10
  useRowScroll
11
- } from "./chunk-XMLCXRTS.js";
11
+ } from "./chunk-SQ7WINEU.js";
12
12
  import {
13
13
  ViewTitle
14
14
  } from "./chunk-JNQKCZA3.js";
15
15
  import {
16
16
  useWizardStore
17
- } from "./chunk-EWGFIBBU.js";
17
+ } from "./chunk-PRG7PKZM.js";
18
18
  import {
19
19
  matrix,
20
20
  typedKeys
21
- } from "./chunk-NG2GGK6P.js";
21
+ } from "./chunk-JWMYAJHD.js";
22
22
  import {
23
23
  CLI_COLORS,
24
24
  UI_SYMBOLS
25
- } from "./chunk-EGMQ3SXN.js";
25
+ } from "./chunk-FMYAYX6W.js";
26
26
  import {
27
27
  init_esm_shims
28
28
  } from "./chunk-DHET7RCE.js";
@@ -275,4 +275,4 @@ var StepAgents = () => {
275
275
  export {
276
276
  StepAgents
277
277
  };
278
- //# sourceMappingURL=chunk-JQSJH72Q.js.map
278
+ //# sourceMappingURL=chunk-S6DKM6MJ.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  computeRowScrollTop
4
- } from "./chunk-AUNBGZS4.js";
4
+ } from "./chunk-FFMWFEUH.js";
5
5
  import {
6
6
  SCROLL_VIEWPORT
7
- } from "./chunk-EGMQ3SXN.js";
7
+ } from "./chunk-FMYAYX6W.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -28,4 +28,4 @@ function useRowScroll({
28
28
  export {
29
29
  useRowScroll
30
30
  };
31
- //# sourceMappingURL=chunk-XMLCXRTS.js.map
31
+ //# sourceMappingURL=chunk-SQ7WINEU.js.map
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  findStack
4
- } from "./chunk-NG2GGK6P.js";
4
+ } from "./chunk-JWMYAJHD.js";
5
5
  import {
6
6
  AGENT_NAMES,
7
7
  DOMAINS
8
- } from "./chunk-SRIH4U5Y.js";
8
+ } from "./chunk-Q4PJSAMP.js";
9
9
  import {
10
10
  BUILT_IN_DOMAIN_ORDER
11
- } from "./chunk-EGMQ3SXN.js";
11
+ } from "./chunk-FMYAYX6W.js";
12
12
  import {
13
13
  init_esm_shims
14
14
  } from "./chunk-DHET7RCE.js";
@@ -51,4 +51,4 @@ export {
51
51
  getStackName,
52
52
  orderDomains
53
53
  };
54
- //# sourceMappingURL=chunk-LVNNP7T4.js.map
54
+ //# sourceMappingURL=chunk-UBNHVBSV.js.map
@@ -17,15 +17,15 @@ import {
17
17
  resolveAgents,
18
18
  writeContentHash,
19
19
  writePluginManifest
20
- } from "./chunk-6W4H2K3Z.js";
20
+ } from "./chunk-WS3TL2AO.js";
21
21
  import {
22
22
  loadAllAgents,
23
23
  loadProjectAgents
24
- } from "./chunk-RRBWNEG3.js";
24
+ } from "./chunk-I534EWJQ.js";
25
25
  import {
26
26
  typedEntries,
27
27
  typedKeys
28
- } from "./chunk-NG2GGK6P.js";
28
+ } from "./chunk-JWMYAJHD.js";
29
29
  import {
30
30
  agentFrontmatterValidationSchema,
31
31
  copy,
@@ -39,12 +39,12 @@ import {
39
39
  verbose,
40
40
  warn,
41
41
  writeFile
42
- } from "./chunk-4CRWKTNQ.js";
42
+ } from "./chunk-WN2TUP4M.js";
43
43
  import {
44
44
  CLAUDE_DIR,
45
45
  DIRS,
46
46
  PROJECT_ROOT
47
- } from "./chunk-EGMQ3SXN.js";
47
+ } from "./chunk-FMYAYX6W.js";
48
48
  import {
49
49
  init_esm_shims
50
50
  } from "./chunk-DHET7RCE.js";
@@ -325,4 +325,4 @@ export {
325
325
  compileAllAgentPlugins,
326
326
  printAgentCompilationSummary
327
327
  };
328
- //# sourceMappingURL=chunk-NPMGVQM4.js.map
328
+ //# sourceMappingURL=chunk-VQV3DSHD.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  typedEntries
4
- } from "./chunk-NG2GGK6P.js";
4
+ } from "./chunk-JWMYAJHD.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -106,15 +106,18 @@ function getCanonicalSkillCategories() {
106
106
  "infra-ci-cd-gitlab-ci": "shared-ci-cd",
107
107
  "web-accessibility-a11y": "web-accessibility",
108
108
  "web-animation-framer": "web-animation",
109
- "meta-methodology-investigation": "shared-methodology",
110
- "meta-methodology-success-criteria": "shared-methodology",
111
- "meta-methodology-investigation-requirements": "shared-methodology",
112
- "meta-methodology-anti-over-engineering": "shared-methodology",
113
- "meta-methodology-write-verification": "shared-methodology",
114
- "meta-methodology-improvement-protocol": "shared-methodology",
115
- "meta-methodology-context-management": "shared-methodology",
109
+ "meta-methodology-investigation": "shared-meta",
110
+ "meta-methodology-success-criteria": "shared-meta",
111
+ "meta-methodology-investigation-requirements": "shared-meta",
112
+ "meta-methodology-anti-over-engineering": "shared-meta",
113
+ "meta-methodology-write-verification": "shared-meta",
114
+ "meta-methodology-improvement-protocol": "shared-meta",
115
+ "meta-methodology-context-management": "shared-meta",
116
+ "shared-meta-research-methodology": "shared-meta",
117
+ "shared-meta-reviewing": "shared-meta",
118
+ "shared-meta-cli-reviewing": "shared-meta",
116
119
  "meta-company-patterns": "local",
117
- "meta-test-skill": "shared-methodology",
120
+ "meta-test-skill": "shared-meta",
118
121
  "web-framework-nonexistent": "web-framework",
119
122
  "web-framework-react-pro": "web-framework",
120
123
  "web-framework-react-strict": "web-framework",
@@ -144,7 +147,6 @@ function createTestSkill(id, description, overrides) {
144
147
  category,
145
148
  author: "@test",
146
149
  domain,
147
- tags: [],
148
150
  ...overrides
149
151
  };
150
152
  }
@@ -164,7 +166,6 @@ function createMockSkill(id, overrides) {
164
166
  displayName: defaultDisplayName,
165
167
  description: `${id} skill`,
166
168
  category,
167
- tags: [],
168
169
  author: "@test",
169
170
  conflictsWith: [],
170
171
  isRecommended: false,
@@ -188,7 +189,6 @@ function createMockExtractedSkill(id, overrides) {
188
189
  description: `${id} skill`,
189
190
  category: `${domain}-${category}`,
190
191
  author: "@test",
191
- tags: [],
192
192
  path: `skills/${directoryPath}/`,
193
193
  domain,
194
194
  displayName: name,
@@ -297,7 +297,6 @@ function createMockCompileConfig(agents, overrides) {
297
297
  function testSkillToResolvedSkill(skill, overrides) {
298
298
  return createMockSkill(skill.id, {
299
299
  description: skill.description,
300
- ...skill.tags?.length ? { tags: skill.tags } : {},
301
300
  ...overrides
302
301
  });
303
302
  }
@@ -320,7 +319,7 @@ var SKILLS = {
320
319
  hono: createMockSkill("api-framework-hono"),
321
320
  drizzle: createMockSkill("api-database-drizzle"),
322
321
  // Methodology
323
- antiOverEng: createMockSkill("meta-methodology-anti-over-engineering", {
322
+ antiOverEng: createMockSkill("shared-meta-reviewing", {
324
323
  description: "Surgical implementation, not architectural innovation"
325
324
  })
326
325
  };
@@ -338,7 +337,7 @@ var TEST_CATEGORIES = {
338
337
  database: createMockCategory("api-database", "Database"),
339
338
  observability: createMockCategory("api-observability", "Observability"),
340
339
  // Shared domain
341
- methodology: createMockCategory("shared-methodology", "Methodology"),
340
+ methodology: createMockCategory("shared-meta", "Meta"),
342
341
  tooling: createMockCategory("shared-tooling", "Tooling"),
343
342
  security: createMockCategory("shared-security", "Security"),
344
343
  // CLI domain
@@ -363,4 +362,4 @@ export {
363
362
  createMockCompileConfig,
364
363
  testSkillToResolvedSkill
365
364
  };
366
- //# sourceMappingURL=chunk-ZU7AOE3X.js.map
365
+ //# sourceMappingURL=chunk-WMMU5FOO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/test-fixtures.ts","../src/cli/lib/__tests__/helpers.ts","../src/cli/lib/__tests__/content-generators.ts"],"sourcesContent":["import type { ResolvedSkill } from \"../../types\";\nimport { createMockSkill, createMockCategory } from \"./helpers\";\n\n// ---------------------------------------------------------------------------\n// Canonical SKILLS registry — single source of truth for all test ResolvedSkills.\n// Use SKILLS.react, SKILLS.hono etc. directly in new test code.\n// ---------------------------------------------------------------------------\n\nexport const SKILLS = {\n // Web domain\n react: createMockSkill(\"web-framework-react\"),\n vue: createMockSkill(\"web-framework-vue-composition-api\"),\n zustand: createMockSkill(\"web-state-zustand\", {\n compatibleWith: [\"web-framework-react\"],\n }),\n pinia: createMockSkill(\"web-state-pinia\", {\n compatibleWith: [\"web-framework-vue-composition-api\"],\n }),\n scss: createMockSkill(\"web-styling-scss-modules\"),\n tailwind: createMockSkill(\"web-styling-tailwind\"),\n vitest: createMockSkill(\"web-testing-vitest\"),\n // API domain\n hono: createMockSkill(\"api-framework-hono\"),\n drizzle: createMockSkill(\"api-database-drizzle\"),\n // Methodology\n antiOverEng: createMockSkill(\"shared-meta-reviewing\", {\n description: \"Surgical implementation, not architectural innovation\",\n }),\n} satisfies Record<string, ResolvedSkill>;\n\n// ---------------------------------------------------------------------------\n// Shared base category fixtures — canonical defaults with no overrides.\n// Use spread for per-test customization: `{ ...TEST_CATEGORIES.framework, required: true }`\n// ---------------------------------------------------------------------------\n\nexport const TEST_CATEGORIES = {\n // Web domain\n framework: createMockCategory(\"web-framework\", \"Framework\"),\n clientState: createMockCategory(\"web-client-state\", \"Client State\"),\n styling: createMockCategory(\"web-styling\", \"Styling\"),\n testing: createMockCategory(\"web-testing\", \"Testing\"),\n serverState: createMockCategory(\"web-server-state\", \"Server State\"),\n animation: createMockCategory(\"web-animation\", \"Animation\"),\n accessibility: createMockCategory(\"web-accessibility\", \"Accessibility\"),\n // API domain\n api: createMockCategory(\"api-api\", \"Backend Framework\"),\n database: createMockCategory(\"api-database\", \"Database\"),\n observability: createMockCategory(\"api-observability\", \"Observability\"),\n // Shared domain\n methodology: createMockCategory(\"shared-meta\", \"Meta\"),\n tooling: createMockCategory(\"shared-tooling\", \"Tooling\"),\n security: createMockCategory(\"shared-security\", \"Security\"),\n // CLI domain\n cliFramework: createMockCategory(\"cli-framework\", \"CLI Framework\"),\n // Mobile domain\n mobileFramework: createMockCategory(\"mobile-framework\", \"Mobile Framework\"),\n};\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { mkdir, writeFile, readFile } from \"fs/promises\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { run, Errors } from \"@oclif/core\";\nimport ansis from \"ansis\";\nimport { createJiti } from \"jiti\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n DEFAULT_PLUGIN_NAME,\n PLUGINS_SUBDIR,\n STANDARD_DIRS,\n STANDARD_FILES,\n} from \"../../consts\";\nimport { matrix } from \"../matrix/matrix-provider\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { computeSkillFolderHash } from \"../versioning\";\nimport { renderSkillMd, renderAgentYaml, renderConfigTs } from \"./content-generators\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const CLI_ROOT = path.resolve(__dirname, \"../../../..\");\n\n/** Resolve @agents-inc/cli/config to the source config-exports.ts so jiti can load it in dev. */\nconst CONFIG_EXPORTS_PATH = path.resolve(__dirname, \"../../config-exports.ts\");\n\n/**\n * Run a CLI command and capture its output.\n *\n * Bun's `console.log` does not go through `process.stdout.write`, so\n * `@oclif/test`'s `runCommand` (which only intercepts `process.stdout.write`)\n * returns empty stdout/stderr in bun. This helper intercepts both layers\n * to work correctly in both Node.js and bun environments.\n */\nexport async function runCliCommand(args: string[]) {\n const origStdoutWrite = process.stdout.write;\n const origStderrWrite = process.stderr.write;\n const origLog = console.log;\n const origWarn = console.warn;\n const origError = console.error;\n\n const stdoutBuf: string[] = [];\n const stderrBuf: string[] = [];\n\n // Intercept process.stdout/stderr.write (Node.js path)\n process.stdout.write = function (str: unknown, encoding?: unknown, cb?: unknown): boolean {\n stdoutBuf.push(String(str));\n if (typeof encoding === \"function\") {\n (encoding as () => void)();\n } else if (typeof cb === \"function\") {\n (cb as () => void)();\n }\n return true;\n } as typeof process.stdout.write;\n\n process.stderr.write = function (str: unknown, encoding?: unknown, cb?: unknown): boolean {\n stderrBuf.push(String(str));\n if (typeof encoding === \"function\") {\n (encoding as () => void)();\n } else if (typeof cb === \"function\") {\n (cb as () => void)();\n }\n return true;\n } as typeof process.stderr.write;\n\n // Intercept console methods (bun path — console.log bypasses process.stdout.write)\n console.log = (...logArgs: unknown[]) => {\n stdoutBuf.push(logArgs.map(String).join(\" \") + \"\\n\");\n };\n console.warn = (...warnArgs: unknown[]) => {\n stderrBuf.push(warnArgs.map(String).join(\" \") + \"\\n\");\n };\n console.error = (...errArgs: unknown[]) => {\n stderrBuf.push(errArgs.map(String).join(\" \") + \"\\n\");\n };\n\n let error: (Error & Partial<Errors.CLIError>) | undefined;\n try {\n await run(args, { root: CLI_ROOT });\n } catch (e) {\n if (e instanceof Error) {\n error = Object.assign(e, { message: ansis.strip(e.message) }) as Error &\n Partial<Errors.CLIError>;\n }\n } finally {\n process.stdout.write = origStdoutWrite;\n process.stderr.write = origStderrWrite;\n console.log = origLog;\n console.warn = origWarn;\n console.error = origError;\n }\n\n return {\n stdout: stdoutBuf.map((s) => ansis.strip(s)).join(\"\"),\n stderr: stderrBuf.map((s) => ansis.strip(s)).join(\"\"),\n error,\n };\n}\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n AgentScopeConfig,\n CategoryDefinition,\n CategoryPath,\n CompiledAgentData,\n CompileAgentConfig,\n CompileConfig,\n CompileContext,\n Domain,\n DomainSelections,\n ExtractedSkillMetadata,\n Marketplace,\n MarketplacePlugin,\n MergedSkillsMatrix,\n ProjectConfig,\n ResolvedSkill,\n ResolvedStack,\n Skill,\n SkillAssignment,\n SkillConfig,\n SkillDefinition,\n SkillSlug,\n SkillSlugMap,\n SkillId,\n SkillSource,\n SkillSourceType,\n RelationshipDefinitions,\n RawStacksConfig,\n Stack,\n StackAgentConfig,\n Category,\n} from \"../../types\";\nimport type { CompiledStackPlugin } from \"../stacks/stack-plugin-compiler\";\nimport type { WizardResultV2 } from \"../../components/wizard/wizard\";\nimport type { SourceLoadResult } from \"../loading/source-loader\";\nimport type { ResolvedConfig } from \"../configuration/config\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { resolveAlias, validateSelection } from \"../matrix\";\nimport type { TestProjectConfig, TestSkill } from \"./fixtures/create-test-source\";\nimport { SKILLS, TEST_CATEGORIES } from \"./test-fixtures\";\n\nexport { fileExists, directoryExists } from \"./test-fs-utils\";\n\nexport async function readTestYaml<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n // Boundary cast: YAML parse returns `unknown`, caller provides expected type\n return parseYaml(content) as T;\n}\n\n/**\n * Load a config file using jiti. Handles defineConfig(), satisfies, and plain exports.\n */\nexport async function readTestTsConfig<T>(filePath: string): Promise<T> {\n const jiti = createJiti(import.meta.url, {\n moduleCache: false,\n interopDefault: true,\n alias: { \"@agents-inc/cli/config\": CONFIG_EXPORTS_PATH },\n });\n // Boundary cast: jiti returns unknown, caller provides expected type\n const result = await jiti.import(filePath, { default: true });\n return result as T;\n}\n\n/** Writes a config file with the given object into the given subdirectory (defaults to CLAUDE_SRC_DIR) */\nexport async function writeTestTsConfig(\n projectDir: string,\n config: Record<string, unknown>,\n configSubdir: string = CLAUDE_SRC_DIR,\n): Promise<void> {\n const configDir = path.join(projectDir, configSubdir);\n await mkdir(configDir, { recursive: true });\n await writeFile(path.join(configDir, STANDARD_FILES.CONFIG_TS), renderConfigTs(config));\n}\n\nexport function buildSourceConfig(overrides?: Record<string, unknown>): Record<string, unknown> {\n return {\n source: \"github:test-org/skills\",\n ...overrides,\n };\n}\n\nexport function buildProjectConfig(overrides?: Partial<ProjectConfig>): ProjectConfig {\n return {\n name: \"test-project\",\n agents: [{ name: \"web-developer\", scope: \"project\" }],\n skills: buildSkillConfigs([\"web-framework-react\"]),\n ...overrides,\n };\n}\n\nexport function buildWizardResult(\n skills: SkillConfig[],\n overrides?: Partial<WizardResultV2>,\n): WizardResultV2 {\n return {\n skills,\n selectedAgents: [],\n agentConfigs: [],\n selectedStackId: null,\n domainSelections: {} as DomainSelections,\n selectedDomains: [],\n cancelled: false,\n validation: { valid: true, errors: [], warnings: [] },\n ...overrides,\n };\n}\n\n/** Build a SkillConfig array from skill IDs with default scope and source */\nexport function buildSkillConfigs(\n skillIds: SkillId[],\n overrides?: Partial<Omit<SkillConfig, \"id\">>,\n): SkillConfig[] {\n return skillIds.map((id) => ({\n id,\n scope: overrides?.scope ?? \"project\",\n source: overrides?.source ?? \"local\",\n }));\n}\n\nexport function buildAgentConfigs(\n agentNames: string[],\n overrides?: Partial<Omit<AgentScopeConfig, \"name\">>,\n): AgentScopeConfig[] {\n return agentNames.map((name) => ({\n // Boundary cast: test factory accepts arbitrary agent names for test isolation\n name: name as AgentName,\n scope: overrides?.scope ?? \"project\",\n }));\n}\n\nexport function buildSourceResult(\n matrix: MergedSkillsMatrix,\n sourcePath: string,\n overrides?: Partial<SourceLoadResult>,\n): SourceLoadResult {\n const sourceConfig: ResolvedConfig = {\n source: sourcePath,\n sourceOrigin: \"flag\",\n };\n return {\n matrix,\n sourceConfig,\n sourcePath,\n isLocal: true,\n ...overrides,\n };\n}\n\n/**\n * Lightweight frontmatter parser for test assertions.\n * Returns raw key-value pairs (unlike the production parseFrontmatter which\n * returns typed SkillFrontmatter with Zod validation).\n */\nexport function parseTestFrontmatter(content: string): Record<string, unknown> | null {\n if (!content.startsWith(\"---\")) {\n return null;\n }\n\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex === -1) {\n return null;\n }\n\n const yamlContent = content.slice(3, endIndex).trim();\n try {\n // Boundary cast: YAML parse returns `unknown`\n return parseYaml(yamlContent) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nimport { createTempDir, cleanupTempDir } from \"./test-fs-utils\";\nexport { createTempDir, cleanupTempDir };\n\nexport interface PluginTestDirs {\n tempDir: string;\n projectDir: string;\n pluginDir: string;\n skillsDir: string;\n agentsDir: string;\n}\n\nexport async function createTestDirs(prefix = \"ai-test-\"): Promise<PluginTestDirs> {\n const tempDir = await createTempDir(prefix);\n const projectDir = path.join(tempDir, \"project\");\n const pluginDir = path.join(projectDir, CLAUDE_DIR, PLUGINS_SUBDIR, DEFAULT_PLUGIN_NAME);\n const skillsDir = path.join(pluginDir, STANDARD_DIRS.SKILLS);\n const agentsDir = path.join(pluginDir, \"agents\");\n\n await mkdir(skillsDir, { recursive: true });\n await mkdir(agentsDir, { recursive: true });\n\n return { tempDir, projectDir, pluginDir, skillsDir, agentsDir };\n}\n\nexport async function cleanupTestDirs(dirs: PluginTestDirs): Promise<void> {\n await cleanupTempDir(dirs.tempDir);\n}\n\n/**\n * Canonical category for known test skills.\n * createMockSkill() looks up from here when no category override is provided.\n * Custom/novel skills must pass { category } in overrides.\n *\n * Uses a lazy singleton to avoid circular initialization issues:\n * test-fixtures.ts calls createMockSkill() at module level during import,\n * and ESM hoists all imports before evaluating any `const` declarations.\n */\n// eslint-disable-next-line no-var -- `var` avoids TDZ in circular ESM imports (let/const would throw)\n// Boundary cast: test factory maps arbitrary skill IDs to category strings (not all are valid Category union members)\nvar _canonicalSkillCategories: Record<string, string> | undefined;\nfunction getCanonicalSkillCategories(): Record<string, string> {\n if (!_canonicalSkillCategories) {\n _canonicalSkillCategories = {\n \"web-framework-react\": \"web-framework\",\n \"web-framework-vue-composition-api\": \"web-framework\",\n \"web-framework-original\": \"web-framework\",\n \"web-framework-simple\": \"web-framework\",\n \"web-framework-arbitrary\": \"web-framework\",\n \"web-framework-unknown\": \"web-framework\",\n \"web-styling-tailwind\": \"web-styling\",\n \"web-styling-scss-modules\": \"web-styling\",\n \"web-styling-custom\": \"web-styling\",\n \"web-state-zustand\": \"web-client-state\",\n \"web-state-pinia\": \"web-client-state\",\n \"web-state-mobx\": \"web-client-state\",\n \"web-testing-vitest\": \"web-testing\",\n \"web-testing-copier\": \"web-testing\",\n \"web-testing-metadata\": \"web-testing\",\n \"web-testing-playwright\": \"web-testing\",\n \"web-testing-cypress-e2e\": \"web-testing\",\n \"web-testing-playwright-e2e\": \"web-testing\",\n \"web-server-state-react-query\": \"web-server-state\",\n \"web-data-fetching-react-query\": \"web-server-state\",\n \"web-tooling-vite\": \"shared-tooling\",\n \"web-tooling-acme\": \"web-tooling\",\n \"web-tooling-custom\": \"web-tooling\",\n \"web-tooling-nometadata\": \"web-tooling\",\n \"web-tooling-personal\": \"web-tooling\",\n \"web-tooling-valid\": \"web-tooling\",\n \"web-tooling-incomplete\": \"web-tooling\",\n \"web-tooling-my-skill\": \"web-tooling\",\n \"web-tooling-forked-skill\": \"web-tooling\",\n \"web-tooling-test-minimal\": \"web-tooling\",\n \"web-tooling-local-skill\": \"web-tooling\",\n \"web-skill-a\": \"web-framework\",\n \"web-skill-a-v\": \"web-framework\",\n \"web-skill-b\": \"web-framework\",\n \"web-skill-b-v\": \"web-framework\",\n \"web-skill-c\": \"web-framework\",\n \"web-skill-d\": \"web-framework\",\n \"web-skill-setup\": \"web-framework\",\n \"web-skill-usage\": \"web-framework\",\n \"web-local-skill\": \"local\",\n \"web-custom-skill\": \"web-framework\",\n \"web-missing-skill\": \"web-framework\",\n \"web-unknown-skill\": \"web-framework\",\n \"web-nonexistent-skill\": \"web-framework\",\n \"api-framework-hono\": \"api-api\",\n \"api-framework-express\": \"api-api\",\n \"api-database-drizzle\": \"api-database\",\n \"api-security-auth-patterns\": \"api-security\",\n \"api-observability-datadog\": \"api-observability\",\n \"cli-framework-commander\": \"cli-framework\",\n \"infra-setup-env\": \"shared-tooling\",\n \"infra-tooling-linter\": \"unmapped-category\",\n \"infra-tooling-docker\": \"shared-tooling\",\n \"infra-ci-cd-github-actions\": \"shared-ci-cd\",\n \"infra-ci-cd-gitlab-ci\": \"shared-ci-cd\",\n \"web-accessibility-a11y\": \"web-accessibility\",\n \"web-animation-framer\": \"web-animation\",\n \"meta-methodology-investigation\": \"shared-meta\",\n \"meta-methodology-success-criteria\": \"shared-meta\",\n \"meta-methodology-investigation-requirements\": \"shared-meta\",\n \"meta-methodology-anti-over-engineering\": \"shared-meta\",\n \"meta-methodology-write-verification\": \"shared-meta\",\n \"meta-methodology-improvement-protocol\": \"shared-meta\",\n \"meta-methodology-context-management\": \"shared-meta\",\n \"shared-meta-research-methodology\": \"shared-meta\",\n \"shared-meta-reviewing\": \"shared-meta\",\n \"shared-meta-cli-reviewing\": \"shared-meta\",\n \"meta-company-patterns\": \"local\",\n \"meta-test-skill\": \"shared-meta\",\n \"web-framework-nonexistent\": \"web-framework\",\n \"web-framework-react-pro\": \"web-framework\",\n \"web-framework-react-strict\": \"web-framework\",\n \"web-framework-react-minimal\": \"web-framework\",\n };\n }\n return _canonicalSkillCategories;\n}\n\n/** Maps non-domain SkillIdPrefix values to their corresponding Domain */\nconst DOMAIN_PREFIX_MAP: Record<string, Domain> = {\n meta: \"shared\",\n infra: \"shared\",\n security: \"shared\",\n};\n\n/**\n * Creates a TestSkill for disk-based integration tests (createTestSource).\n * Derives slug, displayName, domain, and category from the skill ID,\n * using the canonical category registry for correct category mapping.\n */\nexport function createTestSkill(\n id: SkillId,\n description: string,\n overrides?: Partial<TestSkill>,\n): TestSkill {\n const segments = id.split(\"-\");\n const rawPrefix = segments[0] ?? \"web\";\n const domain = (DOMAIN_PREFIX_MAP[rawPrefix] ?? rawPrefix) as Domain;\n const canonicalCategories = getCanonicalSkillCategories();\n // Boundary cast: category registry returns arbitrary strings for non-canonical IDs\n const category = (canonicalCategories[id] ?? `${segments[0]}-${segments[1]}`) as CategoryPath;\n const slug = (segments.length >= 3 ? segments.slice(2).join(\"-\") : id) as SkillSlug;\n const displayName = slug\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return {\n id,\n slug,\n displayName,\n description,\n category,\n author: \"@test\",\n domain,\n ...overrides,\n };\n}\n\nexport function createMockSkill(id: SkillId, overrides?: Partial<ResolvedSkill>): ResolvedSkill {\n // Boundary cast: category registry returns arbitrary strings for non-canonical IDs\n const category = (overrides?.category ?? getCanonicalSkillCategories()[id]) as\n | CategoryPath\n | undefined;\n\n if (!category) {\n throw new Error(\n `createMockSkill: \"${id}\" not in canonical registry — provide { category } in overrides`,\n );\n }\n\n // Derive slug from skill ID: strip domain-category prefix to get the last segment(s)\n // e.g., \"web-framework-react\" -> \"react\", \"shared-meta-reviewing\" -> \"reviewing\"\n const segments = id.split(\"-\");\n const defaultSlug = (segments.length >= 3 ? segments.slice(2).join(\"-\") : id) as SkillSlug;\n\n // Derive display name from slug: title-case each segment\n const defaultDisplayName = defaultSlug\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n\n return {\n id,\n slug: defaultSlug,\n displayName: defaultDisplayName,\n description: `${id} skill`,\n category,\n author: \"@test\",\n conflictsWith: [],\n isRecommended: false,\n requires: [],\n alternatives: [],\n discourages: [],\n compatibleWith: [],\n path: `skills/${category}/${id}/`,\n ...overrides,\n };\n}\n\nexport function createMockSkillSource(\n type: SkillSourceType,\n overrides?: Partial<SkillSource>,\n): SkillSource {\n const defaults: Record<SkillSourceType, SkillSource> = {\n public: { name: \"public\", type: \"public\", installed: false },\n private: {\n name: \"private-source\",\n type: \"private\",\n url: \"github:org/skills\",\n installed: false,\n },\n local: { name: \"local\", type: \"local\", installed: true, installMode: \"local\" },\n };\n return { ...defaults[type], ...overrides };\n}\n\n/**\n * Creates a mock ExtractedSkillMetadata for testing.\n * Used when mocking extractAllSkills() return values.\n */\nexport function createMockExtractedSkill(\n id: SkillId,\n overrides?: Partial<ExtractedSkillMetadata>,\n): ExtractedSkillMetadata {\n // Derive directory path and category from the skill ID convention: \"domain-category-name\"\n const segments = id.split(\"-\");\n const domain = segments[0] ?? \"web\";\n const category = segments[1] ?? \"framework\";\n const name = segments.slice(2).join(\"-\") || \"skill\";\n const directoryPath = `${domain}/${category}/${name}`;\n\n return {\n id,\n directoryPath,\n description: `${id} skill`,\n category: `${domain}-${category}` as CategoryPath,\n author: \"@test\",\n path: `skills/${directoryPath}/`,\n domain: domain as Domain,\n displayName: name,\n slug: name as SkillSlug,\n ...overrides,\n };\n}\n\nexport function createMockMatrix(\n skillsOrFirstSkill?: Record<string, ResolvedSkill> | ResolvedSkill,\n ...rest: (ResolvedSkill | Partial<MergedSkillsMatrix>)[]\n): MergedSkillsMatrix {\n let skillsRecord: Record<string, ResolvedSkill>;\n let overrides: Partial<MergedSkillsMatrix> | undefined;\n\n if (skillsOrFirstSkill === undefined) {\n // Empty call: createMockMatrix()\n skillsRecord = {};\n } else if (\n \"id\" in skillsOrFirstSkill &&\n typeof (skillsOrFirstSkill as ResolvedSkill).id === \"string\" &&\n \"slug\" in skillsOrFirstSkill\n ) {\n // New spread syntax: createMockMatrix(skill1, skill2, ..., optionalOverrides?)\n const allArgs = [skillsOrFirstSkill, ...rest];\n const lastArg = allArgs[allArgs.length - 1];\n\n // Detect if last arg is overrides (has no 'id' + 'slug' properties)\n if (lastArg && !(\"id\" in lastArg && \"slug\" in lastArg)) {\n overrides = lastArg as Partial<MergedSkillsMatrix>;\n const skills = allArgs.slice(0, -1) as ResolvedSkill[];\n skillsRecord = {};\n for (const skill of skills) {\n skillsRecord[skill.id] = skill;\n }\n } else {\n const skills = allArgs as ResolvedSkill[];\n skillsRecord = {};\n for (const skill of skills) {\n skillsRecord[skill.id] = skill;\n }\n }\n } else {\n // Old record syntax: createMockMatrix({ \"id\": skill }, overrides?)\n skillsRecord = skillsOrFirstSkill as Record<string, ResolvedSkill>;\n overrides = rest[0] as Partial<MergedSkillsMatrix> | undefined;\n }\n\n // Boundary cast: empty objects are populated in the loop below\n const autoSlugToId = {} as Record<SkillSlug, SkillId>;\n const autoIdToSlug = {} as Record<SkillId, SkillSlug>;\n for (const [, skill] of typedEntries(skillsRecord)) {\n if (skill.slug) {\n autoSlugToId[skill.slug] = skill.id;\n autoIdToSlug[skill.id] = skill.slug;\n }\n }\n\n return {\n version: \"1.0.0\",\n categories: {} as Record<Category, import(\"../../types\").CategoryDefinition>,\n skills: skillsRecord,\n suggestedStacks: [],\n slugMap: { slugToId: autoSlugToId, idToSlug: autoIdToSlug },\n generatedAt: new Date().toISOString(),\n ...overrides,\n };\n}\n\nexport function createMockAgent(\n name: string,\n overrides?: Partial<AgentDefinition>,\n): AgentDefinition {\n return {\n title: name,\n description: `${name} agent`,\n tools: [\"Read\", \"Write\", \"Edit\", \"Grep\", \"Glob\", \"Bash\"],\n model: \"opus\",\n permissionMode: \"default\",\n ...overrides,\n };\n}\n\nexport function createMockAgentConfig(\n name: string,\n skills: Skill[] = [],\n overrides?: Partial<AgentConfig>,\n): AgentConfig {\n return {\n name,\n title: `${name} agent`,\n description: `Test ${name}`,\n tools: [\"Read\", \"Write\"],\n skills,\n path: name,\n ...overrides,\n };\n}\n\nexport function createMockSkillEntry(\n id: SkillId,\n preloaded = false,\n overrides?: Partial<Skill>,\n): Skill {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n usage: `when working with ${id}`,\n preloaded,\n ...overrides,\n };\n}\n\nexport function createCompileContext(overrides?: Partial<CompileContext>): CompileContext {\n return {\n stackId: \"test-stack\",\n verbose: false,\n projectRoot: \"/project\",\n outputDir: `/project/${CLAUDE_DIR}/${PLUGINS_SUBDIR}/${DEFAULT_PLUGIN_NAME}`,\n ...overrides,\n };\n}\n\nexport async function writeTestSkill(\n skillsDir: string,\n skillId: SkillId,\n options?: {\n /** Extra fields to merge into metadata.yaml (e.g., forkedFrom, displayName) */\n extraMetadata?: Record<string, unknown>;\n /** Skip metadata.yaml creation entirely */\n skipMetadata?: boolean;\n /** Custom SKILL.md content (overrides default generated content) */\n skillContent?: string;\n },\n): Promise<string> {\n const skill = matrix.skills[skillId];\n\n if (!options?.skipMetadata && !skill) {\n throw new Error(\n `writeTestSkill: \"${skillId}\" not found in matrix store — populate the store in beforeEach`,\n );\n }\n\n const skillDir = path.join(skillsDir, skillId);\n await mkdir(skillDir, { recursive: true });\n\n await writeFile(\n path.join(skillDir, STANDARD_FILES.SKILL_MD),\n options?.skillContent ?? renderSkillMd(skillId, skill?.description),\n );\n\n if (!options?.skipMetadata && skill) {\n const { slug, category, author } = skill;\n const domain = category.split(\"-\")[0];\n\n const contentHash = await computeSkillFolderHash(skillDir);\n const baseMetadata = {\n author,\n category,\n domain,\n slug,\n contentHash,\n };\n await writeFile(\n path.join(skillDir, STANDARD_FILES.METADATA_YAML),\n stringifyYaml({ ...baseMetadata, ...options?.extraMetadata }),\n );\n }\n\n return skillDir;\n}\n\n/**\n * Creates a source-level skill directory with SKILL.md and rich metadata.yaml.\n * Use this when testing `extractAllSkills()` and `mergeMatrixWithSkills()`.\n *\n * Unlike `writeTestSkill()` which creates installed skills, this writes skills\n * in the source directory layout (under `src/skills/<domain>/<category>/<name>/`).\n */\nexport async function writeSourceSkill(\n skillsDir: string,\n directoryPath: string,\n config: TestSkill,\n): Promise<string> {\n const skillDir = path.join(skillsDir, directoryPath);\n await mkdir(skillDir, { recursive: true });\n\n await writeFile(\n path.join(skillDir, STANDARD_FILES.SKILL_MD),\n renderSkillMd(config.id, config.description),\n );\n\n const domain = config.domain;\n const slug = config.slug;\n const metadata: Record<string, unknown> = {\n displayName: config.id,\n slug,\n category: config.category,\n domain,\n author: config.author ?? \"@test\",\n };\n\n await writeFile(path.join(skillDir, STANDARD_FILES.METADATA_YAML), stringifyYaml(metadata));\n\n return skillDir;\n}\n\nexport async function writeTestAgent(\n agentsDir: string,\n agentName: string,\n options?: { description?: string },\n): Promise<string> {\n const agentDir = path.join(agentsDir, agentName);\n await mkdir(agentDir, { recursive: true });\n\n await writeFile(\n path.join(agentDir, STANDARD_FILES.AGENT_METADATA_YAML),\n renderAgentYaml(agentName, options?.description),\n );\n\n return agentDir;\n}\n\nexport function createMockCategory(\n id: string,\n displayName: string,\n overrides?: Partial<CategoryDefinition>,\n): CategoryDefinition {\n // Boundary cast: test factory accepts arbitrary category IDs for test isolation\n return {\n id: id as Category,\n displayName,\n description: `${displayName} category`,\n domain: \"web\",\n exclusive: true,\n required: false,\n order: 0,\n ...overrides,\n };\n}\n\nexport function createMockResolvedStack(\n id: string,\n name: string,\n overrides?: Partial<ResolvedStack>,\n): ResolvedStack {\n return {\n id,\n name,\n description: `${name} stack`,\n skills: {},\n allSkillIds: [],\n philosophy: \"\",\n ...overrides,\n };\n}\n\n/**\n * Builds a comprehensive test matrix with 8 skills across 7 categories,\n * 2 suggested stacks, display name mappings, and relationship data\n * (conflicts, recommends). Includes anti-over-engineering methodology skill.\n * @returns A fully populated MergedSkillsMatrix with realistic test data\n */\nexport function createComprehensiveMatrix(\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n // Skill categories use domain-prefixed Category IDs (matching production\n // metadata.yaml and the categories map keys, e.g., \"web-framework\", \"api-api\").\n const skills = {\n \"web-framework-react\": SKILLS.react,\n \"web-framework-vue-composition-api\": {\n ...SKILLS.vue,\n conflictsWith: [{ skillId: \"web-framework-react\", reason: \"Choose one framework\" }],\n } satisfies ResolvedSkill,\n \"web-state-zustand\": SKILLS.zustand,\n \"web-styling-scss-modules\": SKILLS.scss,\n \"api-framework-hono\": SKILLS.hono,\n \"api-database-drizzle\": SKILLS.drizzle,\n \"web-testing-vitest\": SKILLS.vitest,\n // Methodology skill\n \"shared-meta-reviewing\": SKILLS.antiOverEng,\n };\n\n const categories = {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\",\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\", order: 1 },\n \"web-styling\": { ...TEST_CATEGORIES.styling, domain: \"web\", order: 2 },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\", exclusive: true, required: true },\n \"api-database\": { ...TEST_CATEGORIES.database, domain: \"api\", order: 1 },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n domain: \"shared\",\n exclusive: false,\n order: 10,\n },\n \"shared-meta\": {\n ...TEST_CATEGORIES.methodology,\n domain: \"shared\",\n exclusive: false,\n required: false,\n order: 11,\n },\n } as Record<Category, CategoryDefinition>;\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"nextjs-fullstack\", \"Next.js Fullstack\", {\n description: \"Complete Next.js stack with React and Hono\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-react\"],\n \"web-client-state\": [\"web-state-zustand\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n \"api-developer\": {\n \"api-api\": [\"api-framework-hono\"],\n \"api-database\": [\"api-database-drizzle\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\n \"web-framework-react\",\n \"web-state-zustand\",\n \"web-styling-scss-modules\",\n \"api-framework-hono\",\n \"api-database-drizzle\",\n ],\n philosophy: \"Modern, type-safe fullstack development\",\n }),\n createMockResolvedStack(\"vue-stack\", \"Vue Stack\", {\n description: \"Vue.js frontend stack\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-vue-composition-api\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\"web-framework-vue-composition-api\"],\n philosophy: \"Progressive framework approach\",\n }),\n ];\n\n // Boundary cast: test matrix only contains a subset of all possible slugs\n const slugToId = {\n react: \"web-framework-react\",\n \"vue-composition-api\": \"web-framework-vue-composition-api\",\n zustand: \"web-state-zustand\",\n \"scss-modules\": \"web-styling-scss-modules\",\n hono: \"api-framework-hono\",\n drizzle: \"api-database-drizzle\",\n vitest: \"web-testing-vitest\",\n reviewing: \"shared-meta-reviewing\",\n } as unknown as Record<SkillSlug, SkillId>;\n\n // Boundary cast: Object.fromEntries returns { [k: string]: string }\n const idToSlug = Object.fromEntries(\n typedEntries(slugToId).map(([slug, fullId]) => [fullId, slug]),\n ) as SkillSlugMap[\"idToSlug\"];\n\n return createMockMatrix(skills, {\n categories,\n suggestedStacks,\n slugMap: { slugToId, idToSlug },\n ...overrides,\n });\n}\n\n/**\n * Builds a lightweight test matrix with 5 skills, 5 categories, and 2 stacks.\n * Use instead of createComprehensiveMatrix when relationship data is not needed.\n * @returns A minimal MergedSkillsMatrix for basic integration tests\n */\nexport function createBasicMatrix(overrides?: Partial<MergedSkillsMatrix>): MergedSkillsMatrix {\n // Domain-prefixed Category IDs — see createComprehensiveMatrix comment\n const skills = {\n \"web-framework-react\": SKILLS.react,\n \"web-state-zustand\": SKILLS.zustand,\n \"api-framework-hono\": SKILLS.hono,\n \"web-testing-vitest\": SKILLS.vitest,\n // Methodology skill\n \"shared-meta-reviewing\": SKILLS.antiOverEng,\n };\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"testing-stack\", \"Testing Stack\", {\n allSkillIds: [\"web-testing-vitest\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\",\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\", order: 1 },\n \"api-api\": {\n ...TEST_CATEGORIES.api,\n domain: \"api\",\n exclusive: true,\n required: true,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n displayName: \"Testing Framework\",\n domain: \"shared\",\n exclusive: false,\n },\n \"shared-meta\": {\n ...TEST_CATEGORIES.methodology,\n domain: \"shared\",\n exclusive: false,\n required: false,\n },\n } as Record<Category, CategoryDefinition>,\n ...overrides,\n });\n}\n\n/**\n * Replicates `handleComplete` from wizard.tsx for the \"customize\" path.\n *\n * Given the wizard store state (after simulated user selections), this\n * builds the same WizardResultV2 that the real wizard produces:\n * 1. Collects all selected technologies from domainSelections\n * 2. Resolves aliases to canonical skill IDs\n * 3. Runs validation\n */\nexport function buildWizardResultFromStore(\n matrix: MergedSkillsMatrix,\n overrides?: Partial<WizardResultV2>,\n): WizardResultV2 {\n const store = useWizardStore.getState();\n\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => resolveAlias(tech));\n }\n\n const validation = validateSelection(allSkills);\n\n return {\n skills: store.skillConfigs.length > 0 ? store.skillConfigs : buildSkillConfigs(allSkills),\n selectedAgents: store.selectedAgents,\n agentConfigs: store.agentConfigs,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n cancelled: false,\n validation,\n ...overrides,\n };\n}\n\n/**\n * Simulates a user selecting specific skills via the wizard store.\n *\n * Sets up domainSelections as if the user toggled each skill in the build step,\n * using the matrix to look up the correct domain and category per skill.\n */\nexport function simulateSkillSelections(\n skillIds: SkillId[],\n matrix: MergedSkillsMatrix,\n selectedDomains: string[],\n): void {\n const domainSelections = skillIds.reduce<DomainSelections>((acc, skillId) => {\n const skill = matrix.skills[skillId];\n if (!skill) return acc;\n // Boundary cast: skill.category is a Category at runtime\n const category = skill.category as Category;\n const domain = matrix.categories[category]?.domain;\n if (!domain) return acc;\n const domainObj = acc[domain] ?? {};\n const subcatList = domainObj[category] ?? [];\n if (subcatList.includes(skillId)) return acc;\n return {\n ...acc,\n [domain]: { ...domainObj, [category]: [...subcatList, skillId] },\n };\n }, {});\n\n useWizardStore.setState({\n domainSelections,\n selectedDomains: selectedDomains as Domain[],\n approach: \"scratch\",\n step: \"confirm\",\n });\n}\n\n/**\n * Extracts skill IDs from a stack assignment value, which may be:\n * - A bare string (e.g., \"web-framework-react\")\n * - An object with .id (e.g., { id: \"web-framework-react\", preloaded: true })\n * - An array of strings or objects\n */\nexport function extractSkillIdsFromAssignment(assignment: unknown): string[] {\n if (typeof assignment === \"string\") {\n return [assignment];\n }\n if (Array.isArray(assignment)) {\n return assignment.flatMap((item) => extractSkillIdsFromAssignment(item));\n }\n if (typeof assignment === \"object\" && assignment !== null && \"id\" in assignment) {\n return [String((assignment as { id: string }).id)];\n }\n return [];\n}\n\nexport function buildTestProjectConfig(\n agents: string[],\n skills: Array<string | { id: string }>,\n overrides?: Partial<TestProjectConfig>,\n): TestProjectConfig {\n return {\n name: \"test-project\",\n description: \"Test project\",\n agents,\n skills,\n ...overrides,\n };\n}\n\nexport function createMockSkillDefinition(\n id: SkillId,\n overrides?: Partial<SkillDefinition>,\n): SkillDefinition {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n ...overrides,\n };\n}\n\n/** Decomposed matrix config returned by createMockMatrixConfig (replaces SkillsMatrixConfig) */\nexport type MockMatrixConfig = {\n categories: Record<string, CategoryDefinition>;\n relationships: RelationshipDefinitions;\n};\n\nexport function createMockMatrixConfig(\n categories: Record<string, CategoryDefinition>,\n overrides?: {\n relationships?: Partial<RelationshipDefinitions>;\n },\n): MockMatrixConfig {\n const defaultRelationships: RelationshipDefinitions = {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n };\n return {\n categories,\n relationships: overrides?.relationships\n ? { ...defaultRelationships, ...overrides.relationships }\n : defaultRelationships,\n };\n}\n\nexport function createMockStack(\n id: string,\n config: {\n name: string;\n description?: string;\n agents: Record<string, StackAgentConfig>;\n philosophy?: string;\n },\n): Stack {\n return {\n id,\n name: config.name,\n description: config.description ?? \"\",\n // Boundary cast: test callers may pass arbitrary agent names (e.g., \"nonexistent-agent\")\n agents: config.agents as Stack[\"agents\"],\n philosophy: config.philosophy,\n };\n}\n\nexport function createMockCompileConfig(\n agents: Record<string, CompileAgentConfig>,\n overrides?: Partial<CompileConfig>,\n): CompileConfig {\n return {\n name: \"Test Plugin\",\n description: \"Test description\",\n agents,\n ...overrides,\n };\n}\n\nexport function createMockCompiledStackPlugin(\n overrides?: Partial<CompiledStackPlugin>,\n): CompiledStackPlugin {\n return {\n pluginPath: \"/tmp/cc-stack-123456/test-stack\",\n manifest: { name: \"test-stack\", version: \"1.0.0\" },\n stackName: \"Test Stack\",\n agents: [\"web-developer\"],\n skillPlugins: [\"web-framework-react\"],\n hasHooks: false,\n ...overrides,\n };\n}\n\nexport function createMockSkillAssignment(id: SkillId, preloaded = false): SkillAssignment {\n return { id, preloaded };\n}\n\nexport function createMockRawStacksConfig(): RawStacksConfig {\n return {\n stacks: [\n {\n id: \"nextjs-fullstack\",\n name: \"Next.js Fullstack\",\n description: \"Full-stack Next.js with Hono API\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-react\",\n \"web-styling\": \"web-styling-scss-modules\",\n },\n \"api-developer\": {\n \"api-api\": \"api-framework-hono\",\n \"api-database\": \"api-database-drizzle\",\n },\n },\n },\n {\n id: \"vue-spa\",\n name: \"Vue SPA\",\n description: \"Vue single-page application\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-vue-composition-api\",\n \"web-styling\": \"web-styling-tailwind\",\n },\n },\n },\n ],\n };\n}\n\nexport function createMockRawStacksConfigWithArrays(): RawStacksConfig {\n return {\n stacks: [\n {\n id: \"multi-select-stack\",\n name: \"Multi-Select Stack\",\n description: \"Stack with array-valued categories\",\n agents: {\n \"web-developer\": {\n \"web-framework\": \"web-framework-react\",\n \"shared-meta\": [\n \"shared-meta-research-methodology\",\n \"shared-meta-reviewing\",\n \"shared-meta-cli-reviewing\",\n ],\n },\n \"pattern-scout\": {\n \"shared-meta\": [\"shared-meta-research-methodology\"],\n },\n },\n },\n ],\n };\n}\n\nexport function createMockRawStacksConfigWithObjects(): RawStacksConfig {\n return {\n stacks: [\n {\n id: \"object-stack\",\n name: \"Object Stack\",\n description: \"Stack with object-form skill assignments\",\n agents: {\n \"web-developer\": {\n \"web-framework\": [{ id: \"web-framework-react\", preloaded: true }],\n \"web-styling\": \"web-styling-scss-modules\",\n \"shared-meta\": [\n { id: \"shared-meta-research-methodology\", preloaded: true },\n \"shared-meta-reviewing\",\n ],\n },\n },\n },\n ],\n };\n}\n\nexport function createMockMarketplace(plugins: MarketplacePlugin[] = []): Marketplace {\n return {\n name: \"test-marketplace\",\n version: \"1.0.0\",\n owner: { name: \"Test Owner\" },\n plugins,\n };\n}\n\nexport function createMockMarketplacePlugin(\n name: string,\n source: MarketplacePlugin[\"source\"] = \"local\",\n): MarketplacePlugin {\n return {\n name,\n source,\n };\n}\n\n/** Convert a TestSkill (disk-based) to a ResolvedSkill (in-memory) for matrix creation. */\nexport function testSkillToResolvedSkill(\n skill: TestSkill,\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n // Boundary cast: TestSkill.id is string, but in practice always a valid SkillId\n return createMockSkill(skill.id as SkillId, {\n description: skill.description,\n ...overrides,\n });\n}\n\n/**\n * Creates a ResolvedSkill with availableSources annotation for multi-source testing.\n * Simulates what multi-source-loader.ts does after tagging.\n */\nexport function createMockMultiSourceSkill(\n id: SkillId,\n sources: SkillSource[],\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n const activeSource = sources.find((s) => s.installed) ?? sources[0];\n return createMockSkill(id, {\n availableSources: sources,\n activeSource,\n ...overrides,\n });\n}\n\nexport function createMockCompiledAgentData(overrides?: Partial<AgentConfig>): CompiledAgentData {\n const agent = createMockAgentConfig(\"test-agent\", [], {\n title: \"Test Agent\",\n description: \"A test agent\",\n ...overrides,\n });\n\n return {\n agent,\n intro: \"Test intro\",\n workflow: \"Test workflow\",\n examples: \"Test examples\",\n criticalRequirementsTop: \"\",\n criticalReminders: \"\",\n outputFormat: \"\",\n skills: agent.skills,\n preloadedSkills: [],\n dynamicSkills: [],\n preloadedSkillIds: [],\n };\n}\n\nexport { SKILLS, TEST_CATEGORIES } from \"./test-fixtures\";\n","/**\n * Pure content renderers for test file generation.\n * Single source of truth for all test content templates.\n */\n\nexport function renderSkillMd(id: string, description?: string, body?: string): string {\n const desc = description ?? `${id} skill`;\n const content = body ?? `# ${id}\\n\\n${desc}`;\n return `---\nname: ${id}\ndescription: ${desc}\n---\n\n${content}\n`;\n}\n\nexport function renderConfigTs(config: Record<string, unknown>): string {\n return `export default ${JSON.stringify(config, null, 2)};\\n`;\n}\n\nexport function renderAgentYaml(\n name: string,\n description?: string,\n options?: { title?: string; tools?: string[] },\n): string {\n const desc = description ?? `Test ${name} agent`;\n const title = options?.title ?? `${name} Agent`;\n const tools = options?.tools ?? [\"Read\", \"Write\"];\n return `id: ${name}\ntitle: ${title}\ndescription: ${desc}\ntools:\n${tools.map((t) => ` - ${t}`).join(\"\\n\")}`;\n}\n\nexport function renderCategoriesTs(categories: Record<string, unknown>): string {\n return renderConfigTs(categories);\n}\n\nexport function renderRulesTs(rules: Record<string, unknown>): string {\n return renderConfigTs(rules);\n}\n"],"mappings":"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","names":["__filename","__dirname"]}
@@ -4,10 +4,10 @@ import {
4
4
  CATEGORIES,
5
5
  DOMAINS,
6
6
  SKILL_SLUGS
7
- } from "./chunk-SRIH4U5Y.js";
7
+ } from "./chunk-Q4PJSAMP.js";
8
8
  import {
9
9
  KEBAB_CASE_PATTERN
10
- } from "./chunk-EGMQ3SXN.js";
10
+ } from "./chunk-FMYAYX6W.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -151,7 +151,7 @@ var permissionModeSchema = z.enum([
151
151
  "delegate"
152
152
  ]);
153
153
  var skillSlugSchema = z.enum(SKILL_SLUGS);
154
- var SKILL_ID_PATTERN = /^(web|api|cli|mobile|infra|meta|security)-.+-.+$/;
154
+ var SKILL_ID_PATTERN = /^(web|api|cli|mobile|infra|meta|security|shared)-.+-.+$/;
155
155
  var skillIdSchema = z.string().regex(
156
156
  SKILL_ID_PATTERN,
157
157
  "Must be a valid skill ID (e.g., 'web-framework-react')"
@@ -220,7 +220,6 @@ var skillMetadataLoaderSchema = z.object({
220
220
  // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
221
221
  category: z.string().optional(),
222
222
  author: z.string().optional(),
223
- tags: z.array(z.string()).optional(),
224
223
  domain: z.string(),
225
224
  custom: z.boolean().optional()
226
225
  }).passthrough().superRefine(validateCategoryField);
@@ -371,7 +370,6 @@ var localRawMetadataSchema = z.object({
371
370
  category: z.string(),
372
371
  /** When an AI agent should invoke this skill */
373
372
  usageGuidance: z.string().optional(),
374
- tags: z.array(z.string()).optional(),
375
373
  /** Domain this skill belongs to (e.g., "web", "api", "cli") */
376
374
  domain: z.string(),
377
375
  /** True if this skill was created outside the CLI's built-in vocabulary */
@@ -556,8 +554,6 @@ var metadataValidationSchema = z.object({
556
554
  usageGuidance: z.string().min(10),
557
555
  /** Kebab-case short key — must be a known built-in slug */
558
556
  slug: z.enum(SKILL_SLUGS),
559
- /** Searchable tags — kebab-case only */
560
- tags: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/)).optional(),
561
557
  /** 7-char hex SHA of skill content (for change detection) */
562
558
  contentHash: z.string().regex(/^[a-f0-9]{7}$/).optional(),
563
559
  /** ISO date of last update */
@@ -593,8 +589,6 @@ var customMetadataValidationSchema = z.object({
593
589
  usageGuidance: z.string().min(10),
594
590
  /** Kebab-case short key for alias resolution, search, and relationship rules */
595
591
  slug: z.string().regex(/^[a-z][a-z0-9-]*$/).min(1).max(50),
596
- /** Searchable tags — kebab-case only */
597
- tags: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/)).optional(),
598
592
  /** 7-char hex SHA of skill content (for change detection) */
599
593
  contentHash: z.string().regex(/^[a-f0-9]{7}$/).optional(),
600
594
  /** ISO date of last update */
@@ -745,4 +739,4 @@ export {
745
739
  validateNestingDepth,
746
740
  warnUnknownFields
747
741
  };
748
- //# sourceMappingURL=chunk-4CRWKTNQ.js.map
742
+ //# sourceMappingURL=chunk-WN2TUP4M.js.map