@ngxtm/devkit 2.1.0 → 3.0.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 (539) hide show
  1. package/README.md +57 -197
  2. package/cli/detect.js +292 -0
  3. package/cli/index.js +204 -92
  4. package/cli/init.js +245 -0
  5. package/cli/update.js +243 -0
  6. package/cli/utils.js +195 -0
  7. package/hooks/lib/__tests__/ck-config-utils.test.cjs +10 -0
  8. package/hooks/lib/__tests__/statusline-integration.test.cjs +46 -75
  9. package/hooks/scout-block/tests/test-monorepo-scenarios.cjs +2 -2
  10. package/hooks/tests/test-ckignore.cjs +7 -2
  11. package/package.json +16 -20
  12. package/rules-index.json +76 -0
  13. package/scripts/generate-index.js +223 -0
  14. package/scripts/merge-commands.js +290 -0
  15. package/scripts/organize-rules.js +226 -0
  16. package/templates/base/hooks/lib/ck-config-utils.cjs +769 -0
  17. package/templates/base/hooks/lib/ck-paths.cjs +110 -0
  18. package/templates/base/hooks/lib/colors.cjs +95 -0
  19. package/templates/base/hooks/lib/config-counter.cjs +103 -0
  20. package/templates/base/hooks/lib/context-builder.cjs +600 -0
  21. package/templates/base/hooks/lib/context-tracker.cjs +335 -0
  22. package/templates/base/hooks/lib/privacy-checker.cjs +297 -0
  23. package/templates/base/hooks/lib/project-detector.cjs +430 -0
  24. package/templates/base/hooks/lib/scout-checker.cjs +172 -0
  25. package/templates/base/hooks/lib/transcript-parser.cjs +164 -0
  26. package/templates/base/hooks/privacy-block.cjs +145 -0
  27. package/agents/backend-engineer.md +0 -154
  28. package/agents/brainstormer.md +0 -169
  29. package/agents/business-analyst.md +0 -166
  30. package/agents/database-architect.md +0 -159
  31. package/agents/debugger.md +0 -155
  32. package/agents/designer.md +0 -150
  33. package/agents/devops-engineer.md +0 -155
  34. package/agents/docs-manager.md +0 -171
  35. package/agents/frontend-engineer.md +0 -159
  36. package/agents/game-engineer.md +0 -148
  37. package/agents/mobile-engineer.md +0 -149
  38. package/agents/performance-engineer.md +0 -152
  39. package/agents/planner.md +0 -161
  40. package/agents/project-manager.md +0 -160
  41. package/agents/researcher.md +0 -146
  42. package/agents/reviewer.md +0 -155
  43. package/agents/scouter.md +0 -157
  44. package/agents/security-engineer.md +0 -154
  45. package/agents/tech-lead.md +0 -159
  46. package/agents/tester.md +0 -157
  47. package/agents-claudekit/brainstormer.md +0 -113
  48. package/agents-claudekit/code-reviewer.md +0 -157
  49. package/agents-claudekit/code-simplifier.md +0 -42
  50. package/agents-claudekit/copywriter.md +0 -110
  51. package/agents-claudekit/database-admin.md +0 -92
  52. package/agents-claudekit/debugger.md +0 -137
  53. package/agents-claudekit/docs-manager.md +0 -208
  54. package/agents-claudekit/fullstack-developer.md +0 -95
  55. package/agents-claudekit/git-manager.md +0 -394
  56. package/agents-claudekit/journal-writer.md +0 -113
  57. package/agents-claudekit/mcp-manager.md +0 -93
  58. package/agents-claudekit/planner.md +0 -108
  59. package/agents-claudekit/project-manager.md +0 -125
  60. package/agents-claudekit/researcher.md +0 -38
  61. package/agents-claudekit/scout-external.md +0 -141
  62. package/agents-claudekit/scout.md +0 -107
  63. package/agents-claudekit/tester.md +0 -105
  64. package/agents-claudekit/ui-ux-designer.md +0 -236
  65. package/commands/ask.md +0 -64
  66. package/commands/brainstorm.md +0 -64
  67. package/commands/code.md +0 -64
  68. package/commands/cook.md +0 -64
  69. package/commands/debug.md +0 -64
  70. package/commands/design/fast.md +0 -134
  71. package/commands/fix/fast.md +0 -84
  72. package/commands/fix/hard.md +0 -116
  73. package/commands/fix.md +0 -64
  74. package/commands/plan/fast.md +0 -78
  75. package/commands/plan/hard.md +0 -131
  76. package/commands/plan.md +0 -64
  77. package/commands/test.md +0 -64
  78. package/hooks/tests/test-modularization-hook.cjs +0 -126
  79. package/matrix-skills/_index.yaml +0 -275
  80. package/matrix-skills/ai-ml.yaml +0 -353
  81. package/matrix-skills/architecture.yaml +0 -93
  82. package/matrix-skills/backend.yaml +0 -280
  83. package/matrix-skills/cloud.yaml +0 -112
  84. package/matrix-skills/data.yaml +0 -74
  85. package/matrix-skills/design.yaml +0 -98
  86. package/matrix-skills/devops.yaml +0 -200
  87. package/matrix-skills/frontend.yaml +0 -200
  88. package/matrix-skills/gaming.yaml +0 -39
  89. package/matrix-skills/languages.yaml +0 -160
  90. package/matrix-skills/management.yaml +0 -50
  91. package/matrix-skills/mcp.yaml +0 -82
  92. package/matrix-skills/mobile.yaml +0 -85
  93. package/matrix-skills/performance.yaml +0 -23
  94. package/matrix-skills/planning.yaml +0 -117
  95. package/matrix-skills/quality.yaml +0 -195
  96. package/matrix-skills/research.yaml +0 -106
  97. package/matrix-skills/security.yaml +0 -293
  98. package/matrix-skills/tools.yaml +0 -352
  99. package/output-styles/coding-level-0-eli5.md +0 -103
  100. package/output-styles/coding-level-1-junior.md +0 -124
  101. package/output-styles/coding-level-2-mid.md +0 -146
  102. package/output-styles/coding-level-3-senior.md +0 -148
  103. package/output-styles/coding-level-4-lead.md +0 -159
  104. package/output-styles/coding-level-5-god.md +0 -91
  105. package/rules/README.md +0 -141
  106. package/rules/metadata.json +0 -54
  107. package/settings.json +0 -3
  108. package/statusline.cjs +0 -500
  109. package/statusline.ps1 +0 -307
  110. package/statusline.sh +0 -237
  111. package/workflows/development-rules.md +0 -42
  112. package/workflows/documentation-management.md +0 -121
  113. package/workflows/orchestration-protocol.md +0 -16
  114. package/workflows/primary-workflow.md +0 -45
  115. /package/{commands → merged-commands}/ask/fast.md +0 -0
  116. /package/{commands → merged-commands}/ask/hard.md +0 -0
  117. /package/{commands-claudekit → merged-commands}/ask.md +0 -0
  118. /package/{commands → merged-commands}/auto.md +0 -0
  119. /package/{commands-claudekit → merged-commands}/bootstrap/auto/fast.md +0 -0
  120. /package/{commands-claudekit → merged-commands}/bootstrap/auto/parallel.md +0 -0
  121. /package/{commands-claudekit → merged-commands}/bootstrap/auto.md +0 -0
  122. /package/{commands-claudekit → merged-commands}/bootstrap.md +0 -0
  123. /package/{commands → merged-commands}/brainstorm/fast.md +0 -0
  124. /package/{commands → merged-commands}/brainstorm/hard.md +0 -0
  125. /package/{commands-claudekit → merged-commands}/brainstorm.md +0 -0
  126. /package/{commands-claudekit → merged-commands}/ck-help.md +0 -0
  127. /package/{commands-claudekit → merged-commands}/code/auto.md +0 -0
  128. /package/{commands → merged-commands}/code/fast.md +0 -0
  129. /package/{commands → merged-commands}/code/hard.md +0 -0
  130. /package/{commands-claudekit → merged-commands}/code/no-test.md +0 -0
  131. /package/{commands-claudekit → merged-commands}/code/parallel.md +0 -0
  132. /package/{commands-claudekit → merged-commands}/code.md +0 -0
  133. /package/{commands-claudekit → merged-commands}/coding-level.md +0 -0
  134. /package/{commands-claudekit → merged-commands}/content/cro.md +0 -0
  135. /package/{commands-claudekit → merged-commands}/content/enhance.md +0 -0
  136. /package/{commands-claudekit → merged-commands}/content/fast.md +0 -0
  137. /package/{commands-claudekit → merged-commands}/content/good.md +0 -0
  138. /package/{commands-claudekit → merged-commands}/cook/auto/fast.md +0 -0
  139. /package/{commands-claudekit → merged-commands}/cook/auto/parallel.md +0 -0
  140. /package/{commands-claudekit → merged-commands}/cook/auto.md +0 -0
  141. /package/{commands → merged-commands}/cook/fast.md +0 -0
  142. /package/{commands → merged-commands}/cook/hard.md +0 -0
  143. /package/{commands-claudekit → merged-commands}/cook.md +0 -0
  144. /package/{commands → merged-commands}/debug/fast.md +0 -0
  145. /package/{commands → merged-commands}/debug/hard.md +0 -0
  146. /package/{commands-claudekit → merged-commands}/debug.md +0 -0
  147. /package/{commands → merged-commands}/deploy/check.md +0 -0
  148. /package/{commands → merged-commands}/deploy/preview.md +0 -0
  149. /package/{commands → merged-commands}/deploy/production.md +0 -0
  150. /package/{commands → merged-commands}/deploy/rollback.md +0 -0
  151. /package/{commands → merged-commands}/deploy.md +0 -0
  152. /package/{commands-claudekit → merged-commands}/design/3d.md +0 -0
  153. /package/{commands-claudekit → merged-commands}/design/describe.md +0 -0
  154. /package/{commands-claudekit → merged-commands}/design/fast.md +0 -0
  155. /package/{commands-claudekit → merged-commands}/design/good.md +0 -0
  156. /package/{commands → merged-commands}/design/hard.md +0 -0
  157. /package/{commands-claudekit → merged-commands}/design/screenshot.md +0 -0
  158. /package/{commands-claudekit → merged-commands}/design/video.md +0 -0
  159. /package/{commands → merged-commands}/design.md +0 -0
  160. /package/{commands → merged-commands}/docs/audit.md +0 -0
  161. /package/{commands → merged-commands}/docs/business.md +0 -0
  162. /package/{commands → merged-commands}/docs/core.md +0 -0
  163. /package/{commands-claudekit → merged-commands}/docs/init.md +0 -0
  164. /package/{commands-claudekit → merged-commands}/docs/summarize.md +0 -0
  165. /package/{commands-claudekit → merged-commands}/docs/update.md +0 -0
  166. /package/{commands → merged-commands}/docs.md +0 -0
  167. /package/{commands-claudekit → merged-commands}/fix/ci.md +0 -0
  168. /package/{commands-claudekit → merged-commands}/fix/fast.md +0 -0
  169. /package/{commands-claudekit → merged-commands}/fix/hard.md +0 -0
  170. /package/{commands-claudekit → merged-commands}/fix/logs.md +0 -0
  171. /package/{commands-claudekit → merged-commands}/fix/parallel.md +0 -0
  172. /package/{commands-claudekit → merged-commands}/fix/test.md +0 -0
  173. /package/{commands-claudekit → merged-commands}/fix/types.md +0 -0
  174. /package/{commands-claudekit → merged-commands}/fix/ui.md +0 -0
  175. /package/{commands-claudekit → merged-commands}/fix.md +0 -0
  176. /package/{commands-claudekit → merged-commands}/git/cm.md +0 -0
  177. /package/{commands-claudekit → merged-commands}/git/cp.md +0 -0
  178. /package/{commands-claudekit → merged-commands}/git/merge.md +0 -0
  179. /package/{commands-claudekit → merged-commands}/git/pr.md +0 -0
  180. /package/{commands-claudekit → merged-commands}/integrate/polar.md +0 -0
  181. /package/{commands-claudekit → merged-commands}/integrate/sepay.md +0 -0
  182. /package/{commands-claudekit → merged-commands}/journal.md +0 -0
  183. /package/{commands-claudekit → merged-commands}/kanban.md +0 -0
  184. /package/{commands-claudekit → merged-commands}/plan/archive.md +0 -0
  185. /package/{commands-claudekit → merged-commands}/plan/ci.md +0 -0
  186. /package/{commands-claudekit → merged-commands}/plan/cro.md +0 -0
  187. /package/{commands-claudekit → merged-commands}/plan/fast.md +0 -0
  188. /package/{commands-claudekit → merged-commands}/plan/hard.md +0 -0
  189. /package/{commands-claudekit → merged-commands}/plan/parallel.md +0 -0
  190. /package/{commands-claudekit → merged-commands}/plan/two.md +0 -0
  191. /package/{commands-claudekit → merged-commands}/plan/validate.md +0 -0
  192. /package/{commands-claudekit → merged-commands}/plan.md +0 -0
  193. /package/{commands-claudekit → merged-commands}/preview.md +0 -0
  194. /package/{commands-claudekit → merged-commands}/review/codebase/parallel.md +0 -0
  195. /package/{commands-claudekit → merged-commands}/review/codebase.md +0 -0
  196. /package/{commands → merged-commands}/review/fast.md +0 -0
  197. /package/{commands → merged-commands}/review/hard.md +0 -0
  198. /package/{commands → merged-commands}/review.md +0 -0
  199. /package/{commands-claudekit → merged-commands}/scout/ext.md +0 -0
  200. /package/{commands-claudekit → merged-commands}/scout.md +0 -0
  201. /package/{commands-claudekit → merged-commands}/skill/add.md +0 -0
  202. /package/{commands-claudekit → merged-commands}/skill/create.md +0 -0
  203. /package/{commands-claudekit → merged-commands}/skill/fix-logs.md +0 -0
  204. /package/{commands-claudekit → merged-commands}/skill/optimize/auto.md +0 -0
  205. /package/{commands-claudekit → merged-commands}/skill/optimize.md +0 -0
  206. /package/{commands-claudekit → merged-commands}/skill/plan.md +0 -0
  207. /package/{commands-claudekit → merged-commands}/skill/update.md +0 -0
  208. /package/{commands → merged-commands}/test/fast.md +0 -0
  209. /package/{commands → merged-commands}/test/hard.md +0 -0
  210. /package/{commands-claudekit → merged-commands}/test/ui.md +0 -0
  211. /package/{commands-claudekit → merged-commands}/test.md +0 -0
  212. /package/{commands-claudekit → merged-commands}/use-mcp.md +0 -0
  213. /package/{commands-claudekit → merged-commands}/watzup.md +0 -0
  214. /package/{commands-claudekit → merged-commands}/worktree.md +0 -0
  215. /package/{rules → templates/dart/rules}/dart/best-practices/SKILL.md +0 -0
  216. /package/{rules → templates/dart/rules}/dart/language/SKILL.md +0 -0
  217. /package/{rules → templates/dart/rules}/dart/tooling/SKILL.md +0 -0
  218. /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/SKILL.md +0 -0
  219. /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/references/REFERENCE.md +0 -0
  220. /package/{rules → templates/flutter/rules}/flutter/auto-route-navigation/references/router-config.md +0 -0
  221. /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/SKILL.md +0 -0
  222. /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/REFERENCE.md +0 -0
  223. /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/auth-bloc-example.md +0 -0
  224. /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/equatable-usage.md +0 -0
  225. /package/{rules → templates/flutter/rules}/flutter/bloc-state-management/references/property-based-state.md +0 -0
  226. /package/{rules → templates/flutter/rules}/flutter/bloc.rule.md +0 -0
  227. /package/{rules → templates/flutter/rules}/flutter/cicd/SKILL.md +0 -0
  228. /package/{rules → templates/flutter/rules}/flutter/cicd/references/advanced-workflow.md +0 -0
  229. /package/{rules → templates/flutter/rules}/flutter/cicd/references/fastlane.md +0 -0
  230. /package/{rules → templates/flutter/rules}/flutter/cicd/references/github-actions.md +0 -0
  231. /package/{rules → templates/flutter/rules}/flutter/dependency-injection/SKILL.md +0 -0
  232. /package/{rules → templates/flutter/rules}/flutter/dependency-injection/references/REFERENCE.md +0 -0
  233. /package/{rules → templates/flutter/rules}/flutter/dependency-injection/references/modules.md +0 -0
  234. /package/{rules → templates/flutter/rules}/flutter/error-handling/SKILL.md +0 -0
  235. /package/{rules → templates/flutter/rules}/flutter/error-handling/references/REFERENCE.md +0 -0
  236. /package/{rules → templates/flutter/rules}/flutter/error-handling/references/error-mapping.md +0 -0
  237. /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/SKILL.md +0 -0
  238. /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/references/REFERENCE.md +0 -0
  239. /package/{rules → templates/flutter/rules}/flutter/feature-based-clean-architecture/references/folder-structure.md +0 -0
  240. /package/{rules → templates/flutter/rules}/flutter/getx-navigation/SKILL.md +0 -0
  241. /package/{rules → templates/flutter/rules}/flutter/getx-navigation/references/app-pages.md +0 -0
  242. /package/{rules → templates/flutter/rules}/flutter/getx-navigation/references/middleware-example.md +0 -0
  243. /package/{rules → templates/flutter/rules}/flutter/getx-state-management/SKILL.md +0 -0
  244. /package/{rules → templates/flutter/rules}/flutter/getx-state-management/references/binding-example.md +0 -0
  245. /package/{rules → templates/flutter/rules}/flutter/getx-state-management/references/reactive-vs-simple.md +0 -0
  246. /package/{rules → templates/flutter/rules}/flutter/go-router-navigation/SKILL.md +0 -0
  247. /package/{rules → templates/flutter/rules}/flutter/idiomatic-flutter/SKILL.md +0 -0
  248. /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/SKILL.md +0 -0
  249. /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/references/REFERENCE.md +0 -0
  250. /package/{rules → templates/flutter/rules}/flutter/layer-based-clean-architecture/references/repository-mapping.md +0 -0
  251. /package/{rules → templates/flutter/rules}/flutter/localization/SKILL.md +0 -0
  252. /package/{rules → templates/flutter/rules}/flutter/localization/references/REFERENCE.md +0 -0
  253. /package/{rules → templates/flutter/rules}/flutter/localization/references/sheet-loader.md +0 -0
  254. /package/{rules → templates/flutter/rules}/flutter/navigator-v1-navigation/SKILL.md +0 -0
  255. /package/{rules → templates/flutter/rules}/flutter/navigator-v1-navigation/references/on-generate-route.md +0 -0
  256. /package/{rules → templates/flutter/rules}/flutter/performance/SKILL.md +0 -0
  257. /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/SKILL.md +0 -0
  258. /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/references/REFERENCE.md +0 -0
  259. /package/{rules → templates/flutter/rules}/flutter/retrofit-networking/references/token-refresh.md +0 -0
  260. /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/SKILL.md +0 -0
  261. /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/architecture.md +0 -0
  262. /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/best-practices.md +0 -0
  263. /package/{rules → templates/flutter/rules}/flutter/riverpod-state-management/references/testing.md +0 -0
  264. /package/{rules → templates/flutter/rules}/flutter/riverpod.rule.md +0 -0
  265. /package/{rules → templates/flutter/rules}/flutter/security/SKILL.md +0 -0
  266. /package/{rules → templates/flutter/rules}/flutter/security/references/REFERENCE.md +0 -0
  267. /package/{rules → templates/flutter/rules}/flutter/security/references/network-security.md +0 -0
  268. /package/{rules → templates/flutter/rules}/flutter/testing/SKILL.md +0 -0
  269. /package/{rules → templates/flutter/rules}/flutter/testing/references/REFERENCE.md +0 -0
  270. /package/{rules → templates/flutter/rules}/flutter/testing/references/bloc-testing.md +0 -0
  271. /package/{rules → templates/flutter/rules}/flutter/testing/references/integration-testing.md +0 -0
  272. /package/{rules → templates/flutter/rules}/flutter/testing/references/robot-pattern.md +0 -0
  273. /package/{rules → templates/flutter/rules}/flutter/testing/references/unit-testing.md +0 -0
  274. /package/{rules → templates/flutter/rules}/flutter/testing/references/widget-testing.md +0 -0
  275. /package/{rules → templates/flutter/rules}/flutter/widgets/SKILL.md +0 -0
  276. /package/{rules → templates/golang/rules}/golang/chi-router/SKILL.md +0 -0
  277. /package/{rules → templates/golang/rules}/golang/chi-router/references/REFERENCE.md +0 -0
  278. /package/{rules → templates/golang/rules}/golang/chi-router/references/routing-patterns.md +0 -0
  279. /package/{rules → templates/golang/rules}/golang/cobra-cli/SKILL.md +0 -0
  280. /package/{rules → templates/golang/rules}/golang/cobra-cli/references/REFERENCE.md +0 -0
  281. /package/{rules → templates/golang/rules}/golang/cobra-cli/references/command-patterns.md +0 -0
  282. /package/{rules → templates/golang/rules}/golang/core/SKILL.md +0 -0
  283. /package/{rules → templates/golang/rules}/golang/core/references/REFERENCE.md +0 -0
  284. /package/{rules → templates/golang/rules}/golang/core/references/concurrency-patterns.md +0 -0
  285. /package/{rules → templates/golang/rules}/golang/core/references/error-handling.md +0 -0
  286. /package/{rules → templates/golang/rules}/golang/echo-framework/SKILL.md +0 -0
  287. /package/{rules → templates/golang/rules}/golang/echo-framework/references/REFERENCE.md +0 -0
  288. /package/{rules → templates/golang/rules}/golang/echo-framework/references/middleware-patterns.md +0 -0
  289. /package/{rules → templates/golang/rules}/golang/echo-framework/references/routing-patterns.md +0 -0
  290. /package/{rules → templates/golang/rules}/golang/ent-orm/SKILL.md +0 -0
  291. /package/{rules → templates/golang/rules}/golang/ent-orm/references/REFERENCE.md +0 -0
  292. /package/{rules → templates/golang/rules}/golang/ent-orm/references/schema-patterns.md +0 -0
  293. /package/{rules → templates/golang/rules}/golang/fiber-framework/SKILL.md +0 -0
  294. /package/{rules → templates/golang/rules}/golang/fiber-framework/references/REFERENCE.md +0 -0
  295. /package/{rules → templates/golang/rules}/golang/fiber-framework/references/routing-patterns.md +0 -0
  296. /package/{rules → templates/golang/rules}/golang/gin-framework/SKILL.md +0 -0
  297. /package/{rules → templates/golang/rules}/golang/gin-framework/references/REFERENCE.md +0 -0
  298. /package/{rules → templates/golang/rules}/golang/gin-framework/references/middleware-patterns.md +0 -0
  299. /package/{rules → templates/golang/rules}/golang/gorm-orm/SKILL.md +0 -0
  300. /package/{rules → templates/golang/rules}/golang/gorm-orm/references/REFERENCE.md +0 -0
  301. /package/{rules → templates/golang/rules}/golang/gorm-orm/references/model-definitions.md +0 -0
  302. /package/{rules → templates/golang/rules}/golang/gorm-orm/references/query-patterns.md +0 -0
  303. /package/{rules → templates/golang/rules}/golang/grpc/SKILL.md +0 -0
  304. /package/{rules → templates/golang/rules}/golang/grpc/references/REFERENCE.md +0 -0
  305. /package/{rules → templates/golang/rules}/golang/grpc/references/service-patterns.md +0 -0
  306. /package/{rules → templates/golang/rules}/golang/testify/SKILL.md +0 -0
  307. /package/{rules → templates/golang/rules}/golang/testify/references/REFERENCE.md +0 -0
  308. /package/{rules → templates/golang/rules}/golang/testify/references/assert-patterns.md +0 -0
  309. /package/{rules → templates/golang/rules}/golang/validator/SKILL.md +0 -0
  310. /package/{rules → templates/golang/rules}/golang/validator/references/REFERENCE.md +0 -0
  311. /package/{rules → templates/golang/rules}/golang/validator/references/validation-tags.md +0 -0
  312. /package/{rules → templates/golang/rules}/golang/viper-config/SKILL.md +0 -0
  313. /package/{rules → templates/golang/rules}/golang/viper-config/references/REFERENCE.md +0 -0
  314. /package/{rules → templates/golang/rules}/golang/viper-config/references/config-loading.md +0 -0
  315. /package/{rules → templates/golang/rules}/golang/wire-di/SKILL.md +0 -0
  316. /package/{rules → templates/golang/rules}/golang/wire-di/references/REFERENCE.md +0 -0
  317. /package/{rules → templates/golang/rules}/golang/wire-di/references/provider-patterns.md +0 -0
  318. /package/{rules → templates/golang/rules}/golang/zap-logging/SKILL.md +0 -0
  319. /package/{rules → templates/golang/rules}/golang/zap-logging/references/REFERENCE.md +0 -0
  320. /package/{rules → templates/golang/rules}/golang/zap-logging/references/logger-config.md +0 -0
  321. /package/{rules → templates/java/rules}/java/build-gradle/SKILL.md +0 -0
  322. /package/{rules → templates/java/rules}/java/build-gradle/references/REFERENCE.md +0 -0
  323. /package/{rules → templates/java/rules}/java/build-gradle/references/kotlin-dsl.md +0 -0
  324. /package/{rules → templates/java/rules}/java/build-gradle/references/task-configuration.md +0 -0
  325. /package/{rules → templates/java/rules}/java/build-maven/SKILL.md +0 -0
  326. /package/{rules → templates/java/rules}/java/build-maven/references/REFERENCE.md +0 -0
  327. /package/{rules → templates/java/rules}/java/build-maven/references/dependency-management.md +0 -0
  328. /package/{rules → templates/java/rules}/java/build-maven/references/lifecycle-phases.md +0 -0
  329. /package/{rules → templates/java/rules}/java/graalvm-native/SKILL.md +0 -0
  330. /package/{rules → templates/java/rules}/java/graalvm-native/references/REFERENCE.md +0 -0
  331. /package/{rules → templates/java/rules}/java/java-collections-streams/SKILL.md +0 -0
  332. /package/{rules → templates/java/rules}/java/java-collections-streams/references/REFERENCE.md +0 -0
  333. /package/{rules → templates/java/rules}/java/java-collections-streams/references/collectors-patterns.md +0 -0
  334. /package/{rules → templates/java/rules}/java/java-collections-streams/references/stream-pipelines.md +0 -0
  335. /package/{rules → templates/java/rules}/java/java-concurrency/SKILL.md +0 -0
  336. /package/{rules → templates/java/rules}/java/java-concurrency/references/REFERENCE.md +0 -0
  337. /package/{rules → templates/java/rules}/java/java-concurrency/references/completable-future.md +0 -0
  338. /package/{rules → templates/java/rules}/java/java-concurrency/references/executor-patterns.md +0 -0
  339. /package/{rules → templates/java/rules}/java/java-concurrency/references/virtual-threads.md +0 -0
  340. /package/{rules → templates/java/rules}/java/java-core-language/SKILL.md +0 -0
  341. /package/{rules → templates/java/rules}/java/java-core-language/references/REFERENCE.md +0 -0
  342. /package/{rules → templates/java/rules}/java/java-core-language/references/jvm-memory-model.md +0 -0
  343. /package/{rules → templates/java/rules}/java/java-core-language/references/modern-java-features.md +0 -0
  344. /package/{rules → templates/java/rules}/java/java-project-structure/SKILL.md +0 -0
  345. /package/{rules → templates/java/rules}/java/java-project-structure/references/REFERENCE.md +0 -0
  346. /package/{rules → templates/java/rules}/java/java-project-structure/references/maven-project-layout.md +0 -0
  347. /package/{rules → templates/java/rules}/java/java-project-structure/references/module-system.md +0 -0
  348. /package/{rules → templates/java/rules}/java/micronaut-core/SKILL.md +0 -0
  349. /package/{rules → templates/java/rules}/java/micronaut-core/references/REFERENCE.md +0 -0
  350. /package/{rules → templates/java/rules}/java/micronaut-reactive/SKILL.md +0 -0
  351. /package/{rules → templates/java/rules}/java/micronaut-reactive/references/REFERENCE.md +0 -0
  352. /package/{rules → templates/java/rules}/java/quarkus-core/SKILL.md +0 -0
  353. /package/{rules → templates/java/rules}/java/quarkus-core/references/REFERENCE.md +0 -0
  354. /package/{rules → templates/java/rules}/java/quarkus-reactive/SKILL.md +0 -0
  355. /package/{rules → templates/java/rules}/java/quarkus-reactive/references/REFERENCE.md +0 -0
  356. /package/{rules → templates/java/rules}/java/spring-batch/SKILL.md +0 -0
  357. /package/{rules → templates/java/rules}/java/spring-batch/references/REFERENCE.md +0 -0
  358. /package/{rules → templates/java/rules}/java/spring-boot-architecture/SKILL.md +0 -0
  359. /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/REFERENCE.md +0 -0
  360. /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/auto-configuration.md +0 -0
  361. /package/{rules → templates/java/rules}/java/spring-boot-architecture/references/configuration-properties.md +0 -0
  362. /package/{rules → templates/java/rules}/java/spring-boot-web/SKILL.md +0 -0
  363. /package/{rules → templates/java/rules}/java/spring-boot-web/references/REFERENCE.md +0 -0
  364. /package/{rules → templates/java/rules}/java/spring-cloud/SKILL.md +0 -0
  365. /package/{rules → templates/java/rules}/java/spring-cloud/references/REFERENCE.md +0 -0
  366. /package/{rules → templates/java/rules}/java/spring-data-jpa/SKILL.md +0 -0
  367. /package/{rules → templates/java/rules}/java/spring-data-jpa/references/REFERENCE.md +0 -0
  368. /package/{rules → templates/java/rules}/java/spring-security/SKILL.md +0 -0
  369. /package/{rules → templates/java/rules}/java/spring-security/references/REFERENCE.md +0 -0
  370. /package/{rules → templates/java/rules}/java/spring-security/references/jwt-auth-flow.md +0 -0
  371. /package/{rules → templates/java/rules}/java/testing-junit-mockito/SKILL.md +0 -0
  372. /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/REFERENCE.md +0 -0
  373. /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/junit5-patterns.md +0 -0
  374. /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/mockito-patterns.md +0 -0
  375. /package/{rules → templates/java/rules}/java/testing-junit-mockito/references/spring-boot-testing.md +0 -0
  376. /package/{rules → templates/javascript/rules}/javascript/best-practices/SKILL.md +0 -0
  377. /package/{rules → templates/javascript/rules}/javascript/best-practices/references/REFERENCE.md +0 -0
  378. /package/{rules → templates/javascript/rules}/javascript/language/SKILL.md +0 -0
  379. /package/{rules → templates/javascript/rules}/javascript/language/references/REFERENCE.md +0 -0
  380. /package/{rules → templates/javascript/rules}/javascript/tooling/SKILL.md +0 -0
  381. /package/{rules → templates/javascript/rules}/javascript/tooling/references/REFERENCE.md +0 -0
  382. /package/{rules → templates/nestjs/rules}/nestjs/api-standards/SKILL.md +0 -0
  383. /package/{rules → templates/nestjs/rules}/nestjs/api-standards/references/pagination-wrapper.md +0 -0
  384. /package/{rules → templates/nestjs/rules}/nestjs/architecture/SKILL.md +0 -0
  385. /package/{rules → templates/nestjs/rules}/nestjs/architecture/references/dynamic-module.md +0 -0
  386. /package/{rules → templates/nestjs/rules}/nestjs/caching/SKILL.md +0 -0
  387. /package/{rules → templates/nestjs/rules}/nestjs/caching/references/REFERENCE.md +0 -0
  388. /package/{rules → templates/nestjs/rules}/nestjs/caching/references/cache-patterns.md +0 -0
  389. /package/{rules → templates/nestjs/rules}/nestjs/configuration/SKILL.md +0 -0
  390. /package/{rules → templates/nestjs/rules}/nestjs/configuration/references/REFERENCE.md +0 -0
  391. /package/{rules → templates/nestjs/rules}/nestjs/configuration/references/config-patterns.md +0 -0
  392. /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/SKILL.md +0 -0
  393. /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/REFERENCE.md +0 -0
  394. /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/controller-patterns.md +0 -0
  395. /package/{rules → templates/nestjs/rules}/nestjs/controllers-services/references/service-patterns.md +0 -0
  396. /package/{rules → templates/nestjs/rules}/nestjs/database/SKILL.md +0 -0
  397. /package/{rules → templates/nestjs/rules}/nestjs/database/references/REFERENCE.md +0 -0
  398. /package/{rules → templates/nestjs/rules}/nestjs/database/references/typeorm-patterns.md +0 -0
  399. /package/{rules → templates/nestjs/rules}/nestjs/deployment/SKILL.md +0 -0
  400. /package/{rules → templates/nestjs/rules}/nestjs/deployment/references/REFERENCE.md +0 -0
  401. /package/{rules → templates/nestjs/rules}/nestjs/deployment/references/deployment-patterns.md +0 -0
  402. /package/{rules → templates/nestjs/rules}/nestjs/documentation/SKILL.md +0 -0
  403. /package/{rules → templates/nestjs/rules}/nestjs/documentation/references/REFERENCE.md +0 -0
  404. /package/{rules → templates/nestjs/rules}/nestjs/documentation/references/swagger-patterns.md +0 -0
  405. /package/{rules → templates/nestjs/rules}/nestjs/error-handling/SKILL.md +0 -0
  406. /package/{rules → templates/nestjs/rules}/nestjs/error-handling/references/REFERENCE.md +0 -0
  407. /package/{rules → templates/nestjs/rules}/nestjs/error-handling/references/exception-filters.md +0 -0
  408. /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/SKILL.md +0 -0
  409. /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/references/REFERENCE.md +0 -0
  410. /package/{rules → templates/nestjs/rules}/nestjs/file-uploads/references/upload-patterns.md +0 -0
  411. /package/{rules → templates/nestjs/rules}/nestjs/observability/SKILL.md +0 -0
  412. /package/{rules → templates/nestjs/rules}/nestjs/observability/references/REFERENCE.md +0 -0
  413. /package/{rules → templates/nestjs/rules}/nestjs/observability/references/logging-metrics.md +0 -0
  414. /package/{rules → templates/nestjs/rules}/nestjs/performance/SKILL.md +0 -0
  415. /package/{rules → templates/nestjs/rules}/nestjs/performance/references/REFERENCE.md +0 -0
  416. /package/{rules → templates/nestjs/rules}/nestjs/performance/references/performance-patterns.md +0 -0
  417. /package/{rules → templates/nestjs/rules}/nestjs/real-time/SKILL.md +0 -0
  418. /package/{rules → templates/nestjs/rules}/nestjs/real-time/references/REFERENCE.md +0 -0
  419. /package/{rules → templates/nestjs/rules}/nestjs/real-time/references/websocket-patterns.md +0 -0
  420. /package/{rules → templates/nestjs/rules}/nestjs/scheduling/SKILL.md +0 -0
  421. /package/{rules → templates/nestjs/rules}/nestjs/scheduling/references/REFERENCE.md +0 -0
  422. /package/{rules → templates/nestjs/rules}/nestjs/scheduling/references/scheduling-patterns.md +0 -0
  423. /package/{rules → templates/nestjs/rules}/nestjs/search/SKILL.md +0 -0
  424. /package/{rules → templates/nestjs/rules}/nestjs/search/references/REFERENCE.md +0 -0
  425. /package/{rules → templates/nestjs/rules}/nestjs/search/references/search-patterns.md +0 -0
  426. /package/{rules → templates/nestjs/rules}/nestjs/security/SKILL.md +0 -0
  427. /package/{rules → templates/nestjs/rules}/nestjs/security/references/REFERENCE.md +0 -0
  428. /package/{rules → templates/nestjs/rules}/nestjs/security/references/authentication.md +0 -0
  429. /package/{rules → templates/nestjs/rules}/nestjs/testing/SKILL.md +0 -0
  430. /package/{rules → templates/nestjs/rules}/nestjs/testing/references/REFERENCE.md +0 -0
  431. /package/{rules → templates/nestjs/rules}/nestjs/testing/references/unit-testing.md +0 -0
  432. /package/{rules → templates/nestjs/rules}/nestjs/transport/SKILL.md +0 -0
  433. /package/{rules → templates/nestjs/rules}/nestjs/transport/references/REFERENCE.md +0 -0
  434. /package/{rules → templates/nestjs/rules}/nestjs/transport/references/microservices-patterns.md +0 -0
  435. /package/{rules → templates/nextjs/rules}/nextjs/app-router/SKILL.md +0 -0
  436. /package/{rules → templates/nextjs/rules}/nextjs/app-router/references/REFERENCE.md +0 -0
  437. /package/{rules → templates/nextjs/rules}/nextjs/app-router/references/routing-patterns.md +0 -0
  438. /package/{rules → templates/nextjs/rules}/nextjs/architecture/SKILL.md +0 -0
  439. /package/{rules → templates/nextjs/rules}/nextjs/architecture/references/fsd-structure.md +0 -0
  440. /package/{rules → templates/nextjs/rules}/nextjs/authentication/SKILL.md +0 -0
  441. /package/{rules → templates/nextjs/rules}/nextjs/authentication/references/auth-implementation.md +0 -0
  442. /package/{rules → templates/nextjs/rules}/nextjs/caching/SKILL.md +0 -0
  443. /package/{rules → templates/nextjs/rules}/nextjs/caching/references/REFERENCE.md +0 -0
  444. /package/{rules → templates/nextjs/rules}/nextjs/caching/references/cache-strategies.md +0 -0
  445. /package/{rules → templates/nextjs/rules}/nextjs/data-access-layer/SKILL.md +0 -0
  446. /package/{rules → templates/nextjs/rules}/nextjs/data-access-layer/references/patterns.md +0 -0
  447. /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/SKILL.md +0 -0
  448. /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/references/REFERENCE.md +0 -0
  449. /package/{rules → templates/nextjs/rules}/nextjs/data-fetching/references/fetch-patterns.md +0 -0
  450. /package/{rules → templates/nextjs/rules}/nextjs/internationalization/SKILL.md +0 -0
  451. /package/{rules → templates/nextjs/rules}/nextjs/internationalization/references/REFERENCE.md +0 -0
  452. /package/{rules → templates/nextjs/rules}/nextjs/internationalization/references/i18n-patterns.md +0 -0
  453. /package/{rules → templates/nextjs/rules}/nextjs/optimization/SKILL.md +0 -0
  454. /package/{rules → templates/nextjs/rules}/nextjs/optimization/references/REFERENCE.md +0 -0
  455. /package/{rules → templates/nextjs/rules}/nextjs/optimization/references/optimization-patterns.md +0 -0
  456. /package/{rules → templates/nextjs/rules}/nextjs/rendering/SKILL.md +0 -0
  457. /package/{rules → templates/nextjs/rules}/nextjs/rendering/references/REFERENCE.md +0 -0
  458. /package/{rules → templates/nextjs/rules}/nextjs/rendering/references/rendering-modes.md +0 -0
  459. /package/{rules → templates/nextjs/rules}/nextjs/server-actions/SKILL.md +0 -0
  460. /package/{rules → templates/nextjs/rules}/nextjs/server-actions/references/REFERENCE.md +0 -0
  461. /package/{rules → templates/nextjs/rules}/nextjs/server-actions/references/action-patterns.md +0 -0
  462. /package/{rules → templates/nextjs/rules}/nextjs/server-components/SKILL.md +0 -0
  463. /package/{rules → templates/nextjs/rules}/nextjs/server-components/references/REFERENCE.md +0 -0
  464. /package/{rules → templates/nextjs/rules}/nextjs/server-components/references/component-patterns.md +0 -0
  465. /package/{rules → templates/nextjs/rules}/nextjs/state-management/SKILL.md +0 -0
  466. /package/{rules → templates/nextjs/rules}/nextjs/state-management/references/REFERENCE.md +0 -0
  467. /package/{rules → templates/nextjs/rules}/nextjs/state-management/references/state-patterns.md +0 -0
  468. /package/{rules → templates/nextjs/rules}/nextjs/styling/SKILL.md +0 -0
  469. /package/{rules → templates/nextjs/rules}/nextjs/styling/references/implementation.md +0 -0
  470. /package/{rules → templates/react/rules}/react/component-patterns/SKILL.md +0 -0
  471. /package/{rules → templates/react/rules}/react/component-patterns/references/REFERENCE.md +0 -0
  472. /package/{rules → templates/react/rules}/react/hooks/SKILL.md +0 -0
  473. /package/{rules → templates/react/rules}/react/hooks/references/REFERENCE.md +0 -0
  474. /package/{rules → templates/react/rules}/react/hooks.rule.md +0 -0
  475. /package/{rules → templates/react/rules}/react/performance/SKILL.md +0 -0
  476. /package/{rules → templates/react/rules}/react/performance/references/REFERENCE.md +0 -0
  477. /package/{rules → templates/react/rules}/react/security/SKILL.md +0 -0
  478. /package/{rules → templates/react/rules}/react/security/references/REFERENCE.md +0 -0
  479. /package/{rules → templates/react/rules}/react/state-management/SKILL.md +0 -0
  480. /package/{rules → templates/react/rules}/react/state-management/references/REFERENCE.md +0 -0
  481. /package/{rules → templates/react/rules}/react/testing/SKILL.md +0 -0
  482. /package/{rules → templates/react/rules}/react/testing/references/REFERENCE.md +0 -0
  483. /package/{rules → templates/react/rules}/react/tooling/SKILL.md +0 -0
  484. /package/{rules → templates/react/rules}/react/typescript/SKILL.md +0 -0
  485. /package/{rules → templates/rust/rules}/rust/actix-web/SKILL.md +0 -0
  486. /package/{rules → templates/rust/rules}/rust/actix-web/references/REFERENCE.md +0 -0
  487. /package/{rules → templates/rust/rules}/rust/actix-web/references/handler-patterns.md +0 -0
  488. /package/{rules → templates/rust/rules}/rust/async-graphql/SKILL.md +0 -0
  489. /package/{rules → templates/rust/rules}/rust/async-graphql/references/REFERENCE.md +0 -0
  490. /package/{rules → templates/rust/rules}/rust/async-graphql/references/schema-patterns.md +0 -0
  491. /package/{rules → templates/rust/rules}/rust/axum/SKILL.md +0 -0
  492. /package/{rules → templates/rust/rules}/rust/axum/references/REFERENCE.md +0 -0
  493. /package/{rules → templates/rust/rules}/rust/axum/references/handler-patterns.md +0 -0
  494. /package/{rules → templates/rust/rules}/rust/bevy/SKILL.md +0 -0
  495. /package/{rules → templates/rust/rules}/rust/bevy/references/REFERENCE.md +0 -0
  496. /package/{rules → templates/rust/rules}/rust/bevy/references/ecs-patterns.md +0 -0
  497. /package/{rules → templates/rust/rules}/rust/clap/SKILL.md +0 -0
  498. /package/{rules → templates/rust/rules}/rust/clap/references/REFERENCE.md +0 -0
  499. /package/{rules → templates/rust/rules}/rust/clap/references/derive-patterns.md +0 -0
  500. /package/{rules → templates/rust/rules}/rust/core/SKILL.md +0 -0
  501. /package/{rules → templates/rust/rules}/rust/core/references/REFERENCE.md +0 -0
  502. /package/{rules → templates/rust/rules}/rust/core/references/error-handling.md +0 -0
  503. /package/{rules → templates/rust/rules}/rust/diesel-orm/SKILL.md +0 -0
  504. /package/{rules → templates/rust/rules}/rust/diesel-orm/references/REFERENCE.md +0 -0
  505. /package/{rules → templates/rust/rules}/rust/diesel-orm/references/schema-patterns.md +0 -0
  506. /package/{rules → templates/rust/rules}/rust/rocket/SKILL.md +0 -0
  507. /package/{rules → templates/rust/rules}/rust/rocket/references/REFERENCE.md +0 -0
  508. /package/{rules → templates/rust/rules}/rust/rocket/references/handler-patterns.md +0 -0
  509. /package/{rules → templates/rust/rules}/rust/sea-orm/SKILL.md +0 -0
  510. /package/{rules → templates/rust/rules}/rust/sea-orm/references/REFERENCE.md +0 -0
  511. /package/{rules → templates/rust/rules}/rust/sea-orm/references/entity-patterns.md +0 -0
  512. /package/{rules → templates/rust/rules}/rust/serde-serialization/SKILL.md +0 -0
  513. /package/{rules → templates/rust/rules}/rust/serde-serialization/references/REFERENCE.md +0 -0
  514. /package/{rules → templates/rust/rules}/rust/serde-serialization/references/serialization-patterns.md +0 -0
  515. /package/{rules → templates/rust/rules}/rust/sqlx-database/SKILL.md +0 -0
  516. /package/{rules → templates/rust/rules}/rust/sqlx-database/references/REFERENCE.md +0 -0
  517. /package/{rules → templates/rust/rules}/rust/sqlx-database/references/query-patterns.md +0 -0
  518. /package/{rules → templates/rust/rules}/rust/tauri/SKILL.md +0 -0
  519. /package/{rules → templates/rust/rules}/rust/tauri/references/REFERENCE.md +0 -0
  520. /package/{rules → templates/rust/rules}/rust/tauri/references/command-patterns.md +0 -0
  521. /package/{rules → templates/rust/rules}/rust/tokio-runtime/SKILL.md +0 -0
  522. /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/REFERENCE.md +0 -0
  523. /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/async-patterns.md +0 -0
  524. /package/{rules → templates/rust/rules}/rust/tokio-runtime/references/synchronization.md +0 -0
  525. /package/{rules → templates/rust/rules}/rust/tonic/SKILL.md +0 -0
  526. /package/{rules → templates/rust/rules}/rust/tonic/references/REFERENCE.md +0 -0
  527. /package/{rules → templates/rust/rules}/rust/tonic/references/service-patterns.md +0 -0
  528. /package/{rules → templates/rust/rules}/rust/tracing/SKILL.md +0 -0
  529. /package/{rules → templates/rust/rules}/rust/tracing/references/REFERENCE.md +0 -0
  530. /package/{rules → templates/rust/rules}/rust/tracing/references/instrumentation.md +0 -0
  531. /package/{rules → templates/typescript/rules}/typescript/best-practices/SKILL.md +0 -0
  532. /package/{rules → templates/typescript/rules}/typescript/best-practices/references/REFERENCE.md +0 -0
  533. /package/{rules → templates/typescript/rules}/typescript/language/SKILL.md +0 -0
  534. /package/{rules → templates/typescript/rules}/typescript/language/references/REFERENCE.md +0 -0
  535. /package/{rules → templates/typescript/rules}/typescript/patterns.rule.md +0 -0
  536. /package/{rules → templates/typescript/rules}/typescript/security/SKILL.md +0 -0
  537. /package/{rules → templates/typescript/rules}/typescript/security/references/REFERENCE.md +0 -0
  538. /package/{rules → templates/typescript/rules}/typescript/tooling/SKILL.md +0 -0
  539. /package/{rules → templates/typescript/rules}/typescript/tooling/references/REFERENCE.md +0 -0
@@ -4,7 +4,7 @@
4
4
  /**
5
5
  * Integration Tests for Statusline Main Script
6
6
  * Tests the complete statusline.cjs with sample JSON input
7
- * Run: node .claude/hooks/lib/__tests__/statusline-integration.test.cjs
7
+ * Run: node hooks/lib/__tests__/statusline-integration.test.cjs
8
8
  */
9
9
 
10
10
  const fs = require('fs');
@@ -12,6 +12,12 @@ const path = require('path');
12
12
  const os = require('os');
13
13
  const { execSync } = require('child_process');
14
14
 
15
+ // Determine the correct statusline.cjs path (at project root)
16
+ const statuslinePath = path.resolve(__dirname, '..', '..', '..', 'statusline.cjs');
17
+
18
+ // Check if running on Windows
19
+ const isWindows = process.platform === 'win32';
20
+
15
21
  let passed = 0;
16
22
  let failed = 0;
17
23
  const failures = [];
@@ -47,6 +53,29 @@ function assertContains(actual, search, msg = '') {
47
53
  }
48
54
  }
49
55
 
56
+ /**
57
+ * Cross-platform helper to run statusline with JSON input
58
+ * Uses temp file approach to avoid shell quoting issues on Windows
59
+ */
60
+ function runStatusline(jsonInput, extraEnv = {}, options = {}) {
61
+ const tmpFile = path.join(os.tmpdir(), `statusline-test-${Date.now()}-${Math.random().toString(36).substring(7)}.json`);
62
+ try {
63
+ fs.writeFileSync(tmpFile, jsonInput);
64
+ const cmd = isWindows
65
+ ? `type "${tmpFile}" | node "${statuslinePath}"`
66
+ : `cat "${tmpFile}" | node "${statuslinePath}"`;
67
+ return execSync(cmd, {
68
+ encoding: 'utf8',
69
+ stdio: ['pipe', 'pipe', 'pipe'],
70
+ env: { ...process.env, ...extraEnv },
71
+ shell: true,
72
+ ...options
73
+ });
74
+ } finally {
75
+ try { fs.unlinkSync(tmpFile); } catch {}
76
+ }
77
+ }
78
+
50
79
  console.log('\n═══════════════════════════════════════════════════════');
51
80
  console.log('STATUSLINE INTEGRATION TESTS');
52
81
  console.log('═══════════════════════════════════════════════════════\n');
@@ -64,10 +93,7 @@ const minimalInput = JSON.stringify({
64
93
  });
65
94
 
66
95
  try {
67
- const result = execSync(`echo '${minimalInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
68
- encoding: 'utf8',
69
- stdio: ['pipe', 'pipe', 'pipe']
70
- });
96
+ const result = runStatusline(minimalInput);
71
97
 
72
98
  test('Minimal input produces output', () => {
73
99
  assertTrue(result.length > 0, 'Should produce some output');
@@ -109,11 +135,7 @@ try {
109
135
  context_window: { context_window_size: 200000 }
110
136
  });
111
137
 
112
- const gitResult = execSync(`echo '${gitInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
113
- encoding: 'utf8',
114
- cwd: tmpDir,
115
- stdio: ['pipe', 'pipe', 'pipe']
116
- });
138
+ const gitResult = runStatusline(gitInput);
117
139
 
118
140
  test('Git input processed without error', () => {
119
141
  assertTrue(gitResult.length > 0, 'Should produce output for git repo');
@@ -153,10 +175,7 @@ const contextInput = JSON.stringify({
153
175
  });
154
176
 
155
177
  try {
156
- const contextResult = execSync(`echo '${contextInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
157
- encoding: 'utf8',
158
- stdio: ['pipe', 'pipe', 'pipe']
159
- });
178
+ const contextResult = runStatusline(contextInput);
160
179
 
161
180
  test('Context window data processed', () => {
162
181
  assertTrue(contextResult.length > 0, 'Should process context window data');
@@ -180,8 +199,6 @@ try {
180
199
 
181
200
  console.log('\nTEST 4: JSON with Cost Info\n');
182
201
 
183
- process.env.CLAUDE_BILLING_MODE = 'api';
184
-
185
202
  const costInput = JSON.stringify({
186
203
  model: { display_name: 'Claude' },
187
204
  workspace: { current_dir: '/home/user' },
@@ -194,11 +211,7 @@ const costInput = JSON.stringify({
194
211
  });
195
212
 
196
213
  try {
197
- const costResult = execSync(`echo '${costInput.replace(/'/g, "'\\''")}' | CLAUDE_BILLING_MODE=api node .claude/statusline.cjs`, {
198
- encoding: 'utf8',
199
- stdio: ['pipe', 'pipe', 'pipe'],
200
- env: { ...process.env, CLAUDE_BILLING_MODE: 'api' }
201
- });
214
+ const costResult = runStatusline(costInput, { CLAUDE_BILLING_MODE: 'api' });
202
215
 
203
216
  test('Cost info displayed in API mode', () => {
204
217
  assertTrue(costResult.length > 0, 'Should display cost info');
@@ -222,10 +235,7 @@ try {
222
235
  console.log('\nTEST 5: Invalid JSON Handling\n');
223
236
 
224
237
  try {
225
- const invalidResult = execSync(`echo 'not valid json' | node .claude/statusline.cjs`, {
226
- encoding: 'utf8',
227
- stdio: ['pipe', 'pipe', 'pipe']
228
- });
238
+ const invalidResult = runStatusline('not valid json');
229
239
 
230
240
  test('Invalid JSON produces fallback output', () => {
231
241
  assertTrue(invalidResult.length > 0, 'Should produce fallback output');
@@ -247,10 +257,7 @@ try {
247
257
  console.log('\nTEST 6: Empty Input Handling\n');
248
258
 
249
259
  try {
250
- const emptyResult = execSync(`echo '' | node .claude/statusline.cjs`, {
251
- encoding: 'utf8',
252
- stdio: ['pipe', 'pipe', 'pipe']
253
- });
260
+ const emptyResult = runStatusline('');
254
261
 
255
262
  test('Empty input handled', () => {
256
263
  // Should either error gracefully or produce fallback
@@ -281,10 +288,7 @@ const multilineInput = JSON.stringify({
281
288
  });
282
289
 
283
290
  try {
284
- const multilineResult = execSync(`echo '${multilineInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
285
- encoding: 'utf8',
286
- stdio: ['pipe', 'pipe', 'pipe']
287
- });
291
+ const multilineResult = runStatusline(multilineInput);
288
292
 
289
293
  test('Multi-line output generates content', () => {
290
294
  assertTrue(multilineResult.length > 0, 'Should generate output');
@@ -322,10 +326,7 @@ const expandInput = JSON.stringify({
322
326
  });
323
327
 
324
328
  try {
325
- const expandResult = execSync(`echo '${expandInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
326
- encoding: 'utf8',
327
- stdio: ['pipe', 'pipe', 'pipe']
328
- });
329
+ const expandResult = runStatusline(expandInput);
329
330
 
330
331
  test('Home directory expanded to tilde', () => {
331
332
  assertTrue(expandResult.includes('~') || expandResult.includes('projects'), 'Should expand or contain path');
@@ -352,11 +353,7 @@ const colorInput = JSON.stringify({
352
353
 
353
354
  try {
354
355
  // Test with NO_COLOR=1
355
- const noColorResult = execSync(`echo '${colorInput.replace(/'/g, "'\\''")}' | NO_COLOR=1 node .claude/statusline.cjs`, {
356
- encoding: 'utf8',
357
- stdio: ['pipe', 'pipe', 'pipe'],
358
- env: { ...process.env, NO_COLOR: '1' }
359
- });
356
+ const noColorResult = runStatusline(colorInput, { NO_COLOR: '1' });
360
357
 
361
358
  test('NO_COLOR=1 produces output', () => {
362
359
  assertTrue(noColorResult.length > 0, 'Should produce output with NO_COLOR=1');
@@ -390,11 +387,7 @@ const wideInput = JSON.stringify({
390
387
 
391
388
  let wideLines = 0;
392
389
  try {
393
- const wideResult = execSync(`echo '${wideInput.replace(/'/g, "'\\''")}' | COLUMNS=160 node .claude/statusline.cjs`, {
394
- encoding: 'utf8',
395
- stdio: ['pipe', 'pipe', 'pipe'],
396
- env: { ...process.env, COLUMNS: '160' }
397
- });
390
+ const wideResult = runStatusline(wideInput, { COLUMNS: '160' });
398
391
  wideLines = wideResult.trim().split('\n').length;
399
392
 
400
393
  test('Wide terminal (160 cols) produces output', () => {
@@ -425,11 +418,7 @@ const narrowInput = JSON.stringify({
425
418
  });
426
419
 
427
420
  try {
428
- const narrowResult = execSync(`echo '${narrowInput.replace(/'/g, "'\\''")}' | COLUMNS=80 node .claude/statusline.cjs`, {
429
- encoding: 'utf8',
430
- stdio: ['pipe', 'pipe', 'pipe'],
431
- env: { ...process.env, COLUMNS: '80' }
432
- });
421
+ const narrowResult = runStatusline(narrowInput, { COLUMNS: '80' });
433
422
  const narrowLines = narrowResult.trim().split('\n').length;
434
423
 
435
424
  test('Narrow terminal (80 cols) produces output', () => {
@@ -463,11 +452,7 @@ const longPathInput = JSON.stringify({
463
452
  });
464
453
 
465
454
  try {
466
- const longPathResult = execSync(`echo '${longPathInput.replace(/'/g, "'\\''")}' | COLUMNS=100 node .claude/statusline.cjs`, {
467
- encoding: 'utf8',
468
- stdio: ['pipe', 'pipe', 'pipe'],
469
- env: { ...process.env, COLUMNS: '100' }
470
- });
455
+ const longPathResult = runStatusline(longPathInput, { COLUMNS: '100' });
471
456
 
472
457
  test('Long path produces output without crash', () => {
473
458
  assertTrue(longPathResult.length > 0, 'Should produce output');
@@ -497,11 +482,7 @@ const longModelInput = JSON.stringify({
497
482
  });
498
483
 
499
484
  try {
500
- const longModelResult = execSync(`echo '${longModelInput.replace(/'/g, "'\\''")}' | COLUMNS=100 node .claude/statusline.cjs`, {
501
- encoding: 'utf8',
502
- stdio: ['pipe', 'pipe', 'pipe'],
503
- env: { ...process.env, COLUMNS: '100' }
504
- });
485
+ const longModelResult = runStatusline(longModelInput, { COLUMNS: '100' });
505
486
 
506
487
  test('Long model name produces output', () => {
507
488
  assertTrue(longModelResult.length > 0, 'Should produce output');
@@ -580,10 +561,7 @@ const agentTodoInput = JSON.stringify({
580
561
  });
581
562
 
582
563
  try {
583
- const agentTodoResult = execSync(`echo '${agentTodoInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
584
- encoding: 'utf8',
585
- stdio: ['pipe', 'pipe', 'pipe']
586
- });
564
+ const agentTodoResult = runStatusline(agentTodoInput);
587
565
 
588
566
  test('Agent/Todo tracking produces output', () => {
589
567
  assertTrue(agentTodoResult.length > 0, 'Should produce output');
@@ -624,10 +602,7 @@ const zeroContextInput = JSON.stringify({
624
602
  });
625
603
 
626
604
  try {
627
- const zeroResult = execSync(`echo '${zeroContextInput.replace(/'/g, "'\\''")}' | node .claude/statusline.cjs`, {
628
- encoding: 'utf8',
629
- stdio: ['pipe', 'pipe', 'pipe']
630
- });
605
+ const zeroResult = runStatusline(zeroContextInput);
631
606
 
632
607
  test('Zero context produces output', () => {
633
608
  assertTrue(zeroResult.length > 0, 'Should produce output');
@@ -638,11 +613,7 @@ try {
638
613
 
639
614
  // Test with very small terminal
640
615
  try {
641
- const tinyResult = execSync(`echo '${wideInput.replace(/'/g, "'\\''")}' | COLUMNS=40 node .claude/statusline.cjs`, {
642
- encoding: 'utf8',
643
- stdio: ['pipe', 'pipe', 'pipe'],
644
- env: { ...process.env, COLUMNS: '40' }
645
- });
616
+ const tinyResult = runStatusline(wideInput, { COLUMNS: '40' });
646
617
 
647
618
  test('Very narrow terminal (40 cols) handles gracefully', () => {
648
619
  assertTrue(tinyResult.length > 0, 'Should produce output even at 40 cols');
@@ -138,9 +138,9 @@ const scenarios = [
138
138
  desc: 'Grep in src'
139
139
  },
140
140
  {
141
- input: { tool_name: 'Glob', tool_input: { pattern: '**/*.ts' } },
141
+ input: { tool_name: 'Glob', tool_input: { pattern: 'src/**/*.ts' } },
142
142
  expected: 'ALLOWED',
143
- desc: 'Glob all .ts files'
143
+ desc: 'Glob scoped .ts files in src'
144
144
  },
145
145
  {
146
146
  input: { tool_name: 'Bash', tool_input: { command: 'find packages -name "*.json" | head' } },
@@ -9,7 +9,7 @@ const { execSync } = require('child_process');
9
9
  const fs = require('fs');
10
10
  const path = require('path');
11
11
 
12
- const scriptPath = path.join(__dirname, '..', 'scout-block', 'scout-block.sh');
12
+ const scriptPath = path.join(__dirname, '..', 'scout-block.cjs');
13
13
  const ckignorePath = path.join(__dirname, '..', '..', '.ckignore');
14
14
  const ckignoreBackupPath = ckignorePath + '.backup';
15
15
 
@@ -23,7 +23,7 @@ if (fs.existsSync(ckignorePath)) {
23
23
  function runTest(name, input, expected) {
24
24
  try {
25
25
  const inputJson = JSON.stringify(input);
26
- execSync(`bash "${scriptPath}"`, {
26
+ execSync(`node "${scriptPath}"`, {
27
27
  input: inputJson,
28
28
  encoding: 'utf-8',
29
29
  stdio: ['pipe', 'pipe', 'pipe']
@@ -48,6 +48,11 @@ function restoreCkignore() {
48
48
  if (fs.existsSync(ckignoreBackupPath)) {
49
49
  fs.unlinkSync(ckignoreBackupPath);
50
50
  }
51
+ } else {
52
+ // If there was no original .ckignore, remove the test-created one
53
+ if (fs.existsSync(ckignorePath)) {
54
+ fs.unlinkSync(ckignorePath);
55
+ }
51
56
  }
52
57
  }
53
58
 
package/package.json CHANGED
@@ -1,36 +1,32 @@
1
1
  {
2
2
  "name": "@ngxtm/devkit",
3
- "version": "2.1.0",
4
- "description": "Unified multi-agent system with auto-synced skills from multiple sources",
5
- "main": "cli/install.js",
3
+ "version": "3.0.1",
4
+ "description": "Per-project AI skills with smart tech detection - lightweight and context-optimized",
5
+ "main": "cli/index.js",
6
6
  "bin": {
7
7
  "devkit": "cli/index.js"
8
8
  },
9
9
  "scripts": {
10
- "install-global": "node cli/install.js",
10
+ "build": "npm run merge-commands && npm run organize-rules && npm run generate-index",
11
+ "merge-commands": "node scripts/merge-commands.js",
12
+ "organize-rules": "node scripts/organize-rules.js",
11
13
  "generate-index": "node scripts/generate-index.js",
14
+ "test": "node cli/index.js detect",
12
15
  "sync": "python scripts/sync_all.py",
13
- "validate": "python scripts/validate_skills.py",
14
- "update-matrix": "python scripts/update_matrix.py"
16
+ "validate": "python scripts/validate_skills.py"
15
17
  },
16
18
  "files": [
17
19
  "cli/",
18
- "agents/",
19
- "agents-claudekit/",
20
- "commands/",
21
- "commands-claudekit/",
20
+ "merged-commands/",
21
+ "templates/",
22
22
  "skills/",
23
- "matrix-skills/",
24
- "rules/",
23
+ "scripts/merge-commands.js",
24
+ "scripts/organize-rules.js",
25
+ "scripts/generate-index.js",
25
26
  "hooks/",
26
- "output-styles/",
27
- "workflows/",
28
- "settings.json",
29
- "statusline.cjs",
30
- "statusline.ps1",
31
- "statusline.sh",
32
- "SKILLS_INDEX.md",
33
- "skills-index.json"
27
+ "skills-index.json",
28
+ "rules-index.json",
29
+ "SKILLS_INDEX.md"
34
30
  ],
35
31
  "keywords": [
36
32
  "ai",
@@ -0,0 +1,76 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "generatedAt": "2026-01-28T15:40:42.094Z",
4
+ "templates": {
5
+ "dart": {
6
+ "path": "templates/dart/rules",
7
+ "rules": [
8
+ "dart"
9
+ ],
10
+ "sizeKB": 4
11
+ },
12
+ "flutter": {
13
+ "path": "templates/flutter/rules",
14
+ "rules": [
15
+ "flutter"
16
+ ],
17
+ "sizeKB": 89
18
+ },
19
+ "golang": {
20
+ "path": "templates/golang/rules",
21
+ "rules": [
22
+ "golang"
23
+ ],
24
+ "sizeKB": 141
25
+ },
26
+ "java": {
27
+ "path": "templates/java/rules",
28
+ "rules": [
29
+ "java"
30
+ ],
31
+ "sizeKB": 150
32
+ },
33
+ "javascript": {
34
+ "path": "templates/javascript/rules",
35
+ "rules": [
36
+ "javascript"
37
+ ],
38
+ "sizeKB": 12
39
+ },
40
+ "nestjs": {
41
+ "path": "templates/nestjs/rules",
42
+ "rules": [
43
+ "nestjs"
44
+ ],
45
+ "sizeKB": 105
46
+ },
47
+ "nextjs": {
48
+ "path": "templates/nextjs/rules",
49
+ "rules": [
50
+ "nextjs"
51
+ ],
52
+ "sizeKB": 74
53
+ },
54
+ "react": {
55
+ "path": "templates/react/rules",
56
+ "rules": [
57
+ "react"
58
+ ],
59
+ "sizeKB": 34
60
+ },
61
+ "rust": {
62
+ "path": "templates/rust/rules",
63
+ "rules": [
64
+ "rust"
65
+ ],
66
+ "sizeKB": 134
67
+ },
68
+ "typescript": {
69
+ "path": "templates/typescript/rules",
70
+ "rules": [
71
+ "typescript"
72
+ ],
73
+ "sizeKB": 17
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Generate Skills Index
5
+ *
6
+ * Scans all skills and creates a single SKILLS_INDEX.md file
7
+ * containing summaries of all available skills.
8
+ *
9
+ * This allows Claude to know what skills exist without loading
10
+ * all 3500+ files into context.
11
+ */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+
16
+ const SKILLS_DIR = path.join(__dirname, '..', 'skills');
17
+ const OUTPUT_FILE = path.join(__dirname, '..', 'SKILLS_INDEX.md');
18
+
19
+ /**
20
+ * Parse YAML frontmatter from markdown file
21
+ */
22
+ function parseFrontmatter(content) {
23
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
24
+ if (!match) return {};
25
+
26
+ const yaml = match[1];
27
+ const result = {};
28
+
29
+ // Simple YAML parser for name/description
30
+ const lines = yaml.split('\n');
31
+ for (const line of lines) {
32
+ const colonIndex = line.indexOf(':');
33
+ if (colonIndex > 0) {
34
+ const key = line.slice(0, colonIndex).trim();
35
+ let value = line.slice(colonIndex + 1).trim();
36
+ // Remove quotes if present
37
+ if ((value.startsWith('"') && value.endsWith('"')) ||
38
+ (value.startsWith("'") && value.endsWith("'"))) {
39
+ value = value.slice(1, -1);
40
+ }
41
+ result[key] = value;
42
+ }
43
+ }
44
+
45
+ return result;
46
+ }
47
+
48
+ /**
49
+ * Get first paragraph after frontmatter as description fallback
50
+ */
51
+ function getFirstParagraph(content) {
52
+ // Remove frontmatter
53
+ const withoutFrontmatter = content.replace(/^---[\s\S]*?---\n*/, '');
54
+ // Remove title
55
+ const withoutTitle = withoutFrontmatter.replace(/^#[^\n]*\n*/, '');
56
+ // Get first non-empty paragraph
57
+ const paragraphs = withoutTitle.split(/\n\n+/);
58
+ for (const p of paragraphs) {
59
+ const trimmed = p.trim();
60
+ if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('```')) {
61
+ // Limit to 200 chars
62
+ return trimmed.slice(0, 200) + (trimmed.length > 200 ? '...' : '');
63
+ }
64
+ }
65
+ return '';
66
+ }
67
+
68
+ /**
69
+ * Scan a skill directory and extract metadata
70
+ */
71
+ function scanSkill(skillPath, skillName) {
72
+ const skillFile = path.join(skillPath, 'SKILL.md');
73
+ const agentsFile = path.join(skillPath, 'AGENTS.md');
74
+
75
+ let content = '';
76
+ let sourceFile = '';
77
+
78
+ if (fs.existsSync(skillFile)) {
79
+ content = fs.readFileSync(skillFile, 'utf-8');
80
+ sourceFile = 'SKILL.md';
81
+ } else if (fs.existsSync(agentsFile)) {
82
+ content = fs.readFileSync(agentsFile, 'utf-8');
83
+ sourceFile = 'AGENTS.md';
84
+ } else {
85
+ // Try to find any .md file
86
+ const files = fs.readdirSync(skillPath).filter(f => f.endsWith('.md'));
87
+ if (files.length > 0) {
88
+ content = fs.readFileSync(path.join(skillPath, files[0]), 'utf-8');
89
+ sourceFile = files[0];
90
+ }
91
+ }
92
+
93
+ if (!content) {
94
+ return null;
95
+ }
96
+
97
+ const frontmatter = parseFrontmatter(content);
98
+
99
+ return {
100
+ name: frontmatter.name || skillName,
101
+ description: frontmatter.description || getFirstParagraph(content),
102
+ path: `skills/${skillName}`,
103
+ sourceFile
104
+ };
105
+ }
106
+
107
+ /**
108
+ * Categorize skills based on name patterns
109
+ */
110
+ function categorizeSkill(name) {
111
+ const lowerName = name.toLowerCase();
112
+
113
+ if (/react|next|remix|vue|angular|svelte/.test(lowerName)) return 'Frontend Frameworks';
114
+ if (/node|express|nest|fastify|hono/.test(lowerName)) return 'Backend/Node.js';
115
+ if (/python|django|flask|fastapi/.test(lowerName)) return 'Python';
116
+ if (/database|postgres|mysql|mongo|redis|sql/.test(lowerName)) return 'Databases';
117
+ if (/docker|kubernetes|k8s|ci|cd|deploy|aws|cloud|terraform/.test(lowerName)) return 'DevOps/Cloud';
118
+ if (/test|jest|playwright|cypress|vitest/.test(lowerName)) return 'Testing';
119
+ if (/security|auth|owasp|crypto/.test(lowerName)) return 'Security';
120
+ if (/ai|agent|llm|mcp|prompt|openai|anthropic/.test(lowerName)) return 'AI/Agents';
121
+ if (/mobile|react-native|flutter|ios|android/.test(lowerName)) return 'Mobile';
122
+ if (/git|review|debug|refactor|documentation/.test(lowerName)) return 'Development Tools';
123
+ if (/api|rest|graphql|grpc/.test(lowerName)) return 'API Design';
124
+ if (/css|tailwind|style|animation|ui|ux/.test(lowerName)) return 'UI/Styling';
125
+ if (/typescript|javascript|js|ts/.test(lowerName)) return 'TypeScript/JavaScript';
126
+
127
+ return 'Other';
128
+ }
129
+
130
+ /**
131
+ * Main function
132
+ */
133
+ function generateIndex() {
134
+ console.log('Scanning skills directory...');
135
+
136
+ if (!fs.existsSync(SKILLS_DIR)) {
137
+ console.error('Skills directory not found:', SKILLS_DIR);
138
+ process.exit(1);
139
+ }
140
+
141
+ const skillDirs = fs.readdirSync(SKILLS_DIR, { withFileTypes: true })
142
+ .filter(d => d.isDirectory() && !d.name.startsWith('.'))
143
+ .map(d => d.name)
144
+ .sort();
145
+
146
+ console.log(`Found ${skillDirs.length} skill directories`);
147
+
148
+ const skills = [];
149
+ const categorized = {};
150
+
151
+ for (const skillName of skillDirs) {
152
+ const skillPath = path.join(SKILLS_DIR, skillName);
153
+ const skillInfo = scanSkill(skillPath, skillName);
154
+
155
+ if (skillInfo) {
156
+ skills.push(skillInfo);
157
+
158
+ const category = categorizeSkill(skillName);
159
+ if (!categorized[category]) {
160
+ categorized[category] = [];
161
+ }
162
+ categorized[category].push(skillInfo);
163
+ }
164
+ }
165
+
166
+ console.log(`Extracted metadata from ${skills.length} skills`);
167
+
168
+ // Generate markdown
169
+ let output = `# Skills Index
170
+
171
+ > Auto-generated index of ${skills.length} available skills.
172
+ > Use this to discover skills without loading all files into context.
173
+ >
174
+ > **To use a skill**: Read the full skill at \`~/.claude/skills/<skill-name>/SKILL.md\`
175
+
176
+ ## Quick Reference
177
+
178
+ | Category | Count |
179
+ |----------|-------|
180
+ `;
181
+
182
+ // Sort categories by count
183
+ const sortedCategories = Object.entries(categorized)
184
+ .sort((a, b) => b[1].length - a[1].length);
185
+
186
+ for (const [category, categorySkills] of sortedCategories) {
187
+ output += `| ${category} | ${categorySkills.length} |\n`;
188
+ }
189
+
190
+ output += `\n---\n\n`;
191
+
192
+ // Output by category
193
+ for (const [category, categorySkills] of sortedCategories) {
194
+ output += `## ${category}\n\n`;
195
+
196
+ for (const skill of categorySkills) {
197
+ const desc = skill.description
198
+ ? skill.description.replace(/\n/g, ' ').slice(0, 150)
199
+ : 'No description';
200
+ output += `### ${skill.name}\n`;
201
+ output += `\`${skill.path}\`\n\n`;
202
+ output += `${desc}${skill.description && skill.description.length > 150 ? '...' : ''}\n\n`;
203
+ }
204
+ }
205
+
206
+ // Write output
207
+ fs.writeFileSync(OUTPUT_FILE, output);
208
+ console.log(`\nGenerated: ${OUTPUT_FILE}`);
209
+ console.log(`File size: ${(fs.statSync(OUTPUT_FILE).size / 1024).toFixed(1)} KB`);
210
+
211
+ // Also generate a compact JSON version for programmatic use
212
+ const jsonOutput = path.join(__dirname, '..', 'skills-index.json');
213
+ const jsonData = skills.map(s => ({
214
+ name: s.name,
215
+ path: s.path,
216
+ description: s.description ? s.description.slice(0, 200) : ''
217
+ }));
218
+ fs.writeFileSync(jsonOutput, JSON.stringify(jsonData, null, 2));
219
+ console.log(`Generated: ${jsonOutput}`);
220
+ }
221
+
222
+ // Run
223
+ generateIndex();