@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
package/cli/update.js ADDED
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Devkit Update - Update existing installation
5
+ *
6
+ * Re-detects project type and updates rules accordingly.
7
+ * Preserves user customizations where possible.
8
+ */
9
+
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { execSync } = require('child_process');
13
+
14
+ const { detectProjectType, getRulesForTypes } = require('./detect');
15
+ const { initProject } = require('./init');
16
+ const { copyDir, getDirSize, parseJsonFile } = require('./utils');
17
+
18
+ const VERSION = require('../package.json').version;
19
+ const PACKAGE_ROOT = path.join(__dirname, '..');
20
+
21
+ /**
22
+ * Check for npm package updates
23
+ */
24
+ function checkForUpdates() {
25
+ try {
26
+ const result = execSync('npm view @ngxtm/devkit version', {
27
+ encoding: 'utf-8',
28
+ stdio: ['pipe', 'pipe', 'pipe']
29
+ });
30
+ return result.trim();
31
+ } catch (e) {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Update devkit installation
38
+ */
39
+ function updateProject(options = {}) {
40
+ const projectDir = options.path || process.cwd();
41
+ const claudeDir = path.join(projectDir, '.claude');
42
+ const configPath = path.join(claudeDir, 'devkit.json');
43
+
44
+ console.log('\n' + '='.repeat(60));
45
+ console.log(' DEVKIT - UPDATE');
46
+ console.log('='.repeat(60));
47
+
48
+ // Check if devkit is installed
49
+ if (!fs.existsSync(configPath)) {
50
+ console.log('\n No devkit installation found.');
51
+ console.log(' Run: devkit init\n');
52
+ return { success: false, reason: 'not_installed' };
53
+ }
54
+
55
+ // Read current config with error handling
56
+ const config = parseJsonFile(configPath);
57
+ if (!config) {
58
+ console.log('\n Error: devkit.json is corrupted.');
59
+ console.log(' Try reinitializing with: devkit init --force\n');
60
+ return { success: false, reason: 'corrupted_config' };
61
+ }
62
+ console.log(`\n Current version: ${config.version}`);
63
+ console.log(` Installed: ${new Date(config.installedAt).toLocaleDateString()}`);
64
+
65
+ // Check for package updates
66
+ console.log('\n Checking for updates...');
67
+ const latestVersion = checkForUpdates();
68
+
69
+ if (latestVersion && latestVersion !== VERSION) {
70
+ console.log(` New version available: ${latestVersion}`);
71
+ console.log(' Run: npm update -g @ngxtm/devkit');
72
+ console.log(' Then: devkit update\n');
73
+ } else if (latestVersion) {
74
+ console.log(` Package is up to date (${VERSION})`);
75
+ } else {
76
+ console.log(' Could not check for updates (offline?)');
77
+ }
78
+
79
+ // Re-detect project type
80
+ console.log('\n Re-detecting project type...');
81
+ const newDetected = detectProjectType(projectDir);
82
+ const oldDetected = config.detectedTypes || [];
83
+
84
+ // Find differences
85
+ const added = newDetected.filter(t => !oldDetected.includes(t));
86
+ const removed = oldDetected.filter(t => !newDetected.includes(t));
87
+ const unchanged = newDetected.filter(t => oldDetected.includes(t));
88
+
89
+ if (added.length > 0) {
90
+ console.log(` New tech detected: ${added.join(', ')}`);
91
+ }
92
+ if (removed.length > 0) {
93
+ console.log(` Removed: ${removed.join(', ')}`);
94
+ }
95
+ if (unchanged.length > 0) {
96
+ console.log(` Unchanged: ${unchanged.join(', ')}`);
97
+ }
98
+ if (added.length === 0 && removed.length === 0) {
99
+ console.log(' No changes in detected technologies.');
100
+ }
101
+
102
+ // Update rules if needed
103
+ if (added.length > 0 || options.force) {
104
+ const newRules = getRulesForTypes(added);
105
+ const rulesDir = path.join(claudeDir, 'rules');
106
+
107
+ console.log('\n Installing new rules...');
108
+
109
+ for (const ruleType of newRules) {
110
+ const srcRulesDir = path.join(PACKAGE_ROOT, 'templates', ruleType, 'rules');
111
+ if (fs.existsSync(srcRulesDir)) {
112
+ const destRulesDir = path.join(rulesDir, ruleType);
113
+ const count = copyDir(srcRulesDir, destRulesDir);
114
+ console.log(` ${ruleType}: ${count} files`);
115
+ }
116
+ }
117
+ }
118
+
119
+ // Remove old rules if needed and user agrees
120
+ if (removed.length > 0 && options.clean) {
121
+ const rulesDir = path.join(claudeDir, 'rules');
122
+
123
+ console.log('\n Removing old rules...');
124
+
125
+ for (const ruleType of removed) {
126
+ const ruleDir = path.join(rulesDir, ruleType);
127
+ if (fs.existsSync(ruleDir)) {
128
+ fs.rmSync(ruleDir, { recursive: true, force: true });
129
+ console.log(` Removed: ${ruleType}`);
130
+ }
131
+ }
132
+ }
133
+
134
+ // Update commands if --force
135
+ if (options.force) {
136
+ console.log('\n Updating commands...');
137
+ const mergedCommandsDir = path.join(PACKAGE_ROOT, 'merged-commands');
138
+ const commandsDir = path.join(claudeDir, 'commands');
139
+
140
+ if (fs.existsSync(mergedCommandsDir)) {
141
+ // Backup existing
142
+ const backupDir = path.join(claudeDir, 'commands.backup');
143
+ if (fs.existsSync(commandsDir)) {
144
+ fs.renameSync(commandsDir, backupDir);
145
+ }
146
+
147
+ const count = copyDir(mergedCommandsDir, commandsDir);
148
+ console.log(` Commands: ${count} files`);
149
+
150
+ // Remove backup
151
+ if (fs.existsSync(backupDir)) {
152
+ fs.rmSync(backupDir, { recursive: true, force: true });
153
+ }
154
+ }
155
+ }
156
+
157
+ // Update config
158
+ const newConfig = {
159
+ ...config,
160
+ version: VERSION,
161
+ detectedTypes: newDetected,
162
+ installedRules: getRulesForTypes(newDetected),
163
+ updatedAt: new Date().toISOString(),
164
+ stats: {
165
+ totalFiles: config.stats?.totalFiles || 0,
166
+ sizeKB: Math.round(getDirSize(claudeDir) / 1024)
167
+ }
168
+ };
169
+
170
+ fs.writeFileSync(configPath, JSON.stringify(newConfig, null, 2));
171
+
172
+ console.log('\n' + '='.repeat(60));
173
+ console.log(' UPDATE COMPLETE');
174
+ console.log('='.repeat(60));
175
+ console.log(`\n Size: ${newConfig.stats.sizeKB} KB`);
176
+ console.log(` Detected: ${newDetected.join(', ') || 'generic'}\n`);
177
+
178
+ return {
179
+ success: true,
180
+ added,
181
+ removed,
182
+ detected: newDetected
183
+ };
184
+ }
185
+
186
+ /**
187
+ * Show project status
188
+ */
189
+ function showStatus(options = {}) {
190
+ const projectDir = options.path || process.cwd();
191
+ const claudeDir = path.join(projectDir, '.claude');
192
+ const configPath = path.join(claudeDir, 'devkit.json');
193
+
194
+ console.log('\n' + '='.repeat(60));
195
+ console.log(' DEVKIT - STATUS');
196
+ console.log('='.repeat(60));
197
+
198
+ if (!fs.existsSync(configPath)) {
199
+ console.log('\n No devkit installation found.');
200
+ console.log(' Run: devkit init\n');
201
+ return { installed: false };
202
+ }
203
+
204
+ const config = parseJsonFile(configPath);
205
+ if (!config) {
206
+ console.log('\n Error: devkit.json is corrupted.');
207
+ console.log(' Try reinitializing with: devkit init --force\n');
208
+ return { installed: false, corrupted: true };
209
+ }
210
+
211
+ console.log(`\n Version: ${config.version}`);
212
+ console.log(` Installed: ${new Date(config.installedAt).toLocaleDateString()}`);
213
+ if (config.updatedAt) {
214
+ console.log(` Updated: ${new Date(config.updatedAt).toLocaleDateString()}`);
215
+ }
216
+ console.log(`\n Detected: ${config.detectedTypes?.join(', ') || 'none'}`);
217
+ console.log(` Rules: ${config.installedRules?.join(', ') || 'none'}`);
218
+ console.log(` Size: ${config.stats?.sizeKB || 'unknown'} KB\n`);
219
+
220
+ return { installed: true, config };
221
+ }
222
+
223
+ module.exports = {
224
+ updateProject,
225
+ showStatus,
226
+ checkForUpdates
227
+ };
228
+
229
+ // Run if called directly
230
+ if (require.main === module) {
231
+ const args = process.argv.slice(2);
232
+ const options = {
233
+ force: args.includes('--force') || args.includes('-f'),
234
+ clean: args.includes('--clean') || args.includes('-c'),
235
+ path: args.find(a => !a.startsWith('-')) || process.cwd()
236
+ };
237
+
238
+ if (args.includes('--status')) {
239
+ showStatus(options);
240
+ } else {
241
+ updateProject(options);
242
+ }
243
+ }
package/cli/utils.js ADDED
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Shared Utilities for Devkit CLI
3
+ *
4
+ * Common functions used across CLI modules.
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+
10
+ /**
11
+ * Copy directory recursively
12
+ * @param {string} src - Source directory
13
+ * @param {string} dest - Destination directory
14
+ * @param {Object} options - Options
15
+ * @param {string[]} options.exclude - Patterns to exclude
16
+ * @param {Set} options.visited - Visited directories (for cycle detection)
17
+ * @param {number} options.depth - Current depth (max 50)
18
+ * @returns {number} - Number of files copied
19
+ */
20
+ function copyDir(src, dest, options = {}) {
21
+ const { exclude = [], visited = new Set(), depth = 0 } = options;
22
+
23
+ // Prevent infinite recursion
24
+ if (depth > 50) return 0;
25
+
26
+ if (!fs.existsSync(src)) return 0;
27
+
28
+ // Detect symlink cycles
29
+ try {
30
+ const realSrc = fs.realpathSync(src);
31
+ if (visited.has(realSrc)) return 0;
32
+ visited.add(realSrc);
33
+ } catch (e) {
34
+ return 0;
35
+ }
36
+
37
+ fs.mkdirSync(dest, { recursive: true });
38
+ let count = 0;
39
+
40
+ const entries = fs.readdirSync(src, { withFileTypes: true });
41
+
42
+ for (const entry of entries) {
43
+ // Skip hidden files, tests, node_modules by default
44
+ if (entry.name.startsWith('.') ||
45
+ entry.name === '__tests__' ||
46
+ entry.name === 'tests' ||
47
+ entry.name === 'node_modules') {
48
+ continue;
49
+ }
50
+
51
+ // Check custom exclusions
52
+ if (exclude.some(pattern => entry.name.includes(pattern))) {
53
+ continue;
54
+ }
55
+
56
+ const srcPath = path.join(src, entry.name);
57
+ const destPath = path.join(dest, entry.name);
58
+
59
+ if (entry.isDirectory()) {
60
+ count += copyDir(srcPath, destPath, { exclude, visited, depth: depth + 1 });
61
+ } else {
62
+ fs.copyFileSync(srcPath, destPath);
63
+ count++;
64
+ }
65
+ }
66
+
67
+ return count;
68
+ }
69
+
70
+ /**
71
+ * Get directory size in KB
72
+ * @param {string} dir - Directory path
73
+ * @param {Set} visited - Visited directories (for cycle detection)
74
+ * @param {number} depth - Current depth (max 50)
75
+ * @returns {number} - Size in bytes
76
+ */
77
+ function getDirSize(dir, visited = new Set(), depth = 0) {
78
+ // Prevent infinite recursion
79
+ if (depth > 50) return 0;
80
+
81
+ if (!fs.existsSync(dir)) return 0;
82
+
83
+ // Detect symlink cycles
84
+ try {
85
+ const realDir = fs.realpathSync(dir);
86
+ if (visited.has(realDir)) return 0;
87
+ visited.add(realDir);
88
+ } catch (e) {
89
+ return 0;
90
+ }
91
+
92
+ let size = 0;
93
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
94
+
95
+ for (const entry of entries) {
96
+ const entryPath = path.join(dir, entry.name);
97
+ try {
98
+ if (entry.isDirectory()) {
99
+ size += getDirSize(entryPath, visited, depth + 1);
100
+ } else {
101
+ size += fs.statSync(entryPath).size;
102
+ }
103
+ } catch (e) {
104
+ // Skip unreadable files
105
+ }
106
+ }
107
+
108
+ return size;
109
+ }
110
+
111
+ /**
112
+ * Safely parse JSON file
113
+ * @param {string} filePath - Path to JSON file
114
+ * @param {*} defaultValue - Default value if parsing fails
115
+ * @returns {*} - Parsed JSON or default value
116
+ */
117
+ function parseJsonFile(filePath, defaultValue = null) {
118
+ try {
119
+ if (!fs.existsSync(filePath)) {
120
+ return defaultValue;
121
+ }
122
+ const content = fs.readFileSync(filePath, 'utf-8');
123
+ return JSON.parse(content);
124
+ } catch (e) {
125
+ console.error(`Warning: Failed to parse ${path.basename(filePath)}: ${e.message}`);
126
+ return defaultValue;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Validate and resolve path
132
+ * @param {string} inputPath - User-provided path
133
+ * @param {boolean} mustExist - Whether path must exist
134
+ * @returns {string|null} - Resolved absolute path or null if invalid
135
+ */
136
+ function validatePath(inputPath, mustExist = false) {
137
+ if (!inputPath) return null;
138
+
139
+ try {
140
+ const resolved = path.resolve(inputPath);
141
+
142
+ if (mustExist && !fs.existsSync(resolved)) {
143
+ console.error(`Error: Path does not exist: ${resolved}`);
144
+ return null;
145
+ }
146
+
147
+ // Check if it's a directory when it exists
148
+ if (fs.existsSync(resolved) && !fs.statSync(resolved).isDirectory()) {
149
+ console.error(`Error: Path is not a directory: ${resolved}`);
150
+ return null;
151
+ }
152
+
153
+ return resolved;
154
+ } catch (e) {
155
+ console.error(`Error: Invalid path: ${inputPath}`);
156
+ return null;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Get all files and directories from a path recursively
162
+ * @param {string} dir - Directory to scan
163
+ * @param {string} basePath - Base path for relative paths
164
+ * @returns {{files: string[], dirs: string[]}} - Files and directories
165
+ */
166
+ function getAllEntries(dir, basePath = '') {
167
+ const entries = { files: [], dirs: [] };
168
+
169
+ if (!fs.existsSync(dir)) return entries;
170
+
171
+ const items = fs.readdirSync(dir, { withFileTypes: true });
172
+
173
+ for (const item of items) {
174
+ const relativePath = path.join(basePath, item.name);
175
+
176
+ if (item.isDirectory()) {
177
+ entries.dirs.push(relativePath);
178
+ const subEntries = getAllEntries(path.join(dir, item.name), relativePath);
179
+ entries.files.push(...subEntries.files);
180
+ entries.dirs.push(...subEntries.dirs);
181
+ } else {
182
+ entries.files.push(relativePath);
183
+ }
184
+ }
185
+
186
+ return entries;
187
+ }
188
+
189
+ module.exports = {
190
+ copyDir,
191
+ getDirSize,
192
+ parseJsonFile,
193
+ validatePath,
194
+ getAllEntries
195
+ };
@@ -505,6 +505,11 @@ test('getGitRoot from nested subdir returns correct root', () => {
505
505
  console.log('\n=== Symlinked directory tests ===\n');
506
506
 
507
507
  test('getGitRoot resolves through symlink to git repo', () => {
508
+ // Skip on Windows - symlinks require elevated privileges
509
+ if (process.platform === 'win32') {
510
+ console.log(' → Skipped: Symlinks require elevated privileges on Windows');
511
+ return;
512
+ }
508
513
  const realDir = path.join(os.tmpdir(), 'ck-test-real-' + Date.now());
509
514
  const linkDir = path.join(os.tmpdir(), 'ck-test-link-' + Date.now());
510
515
  fs.mkdirSync(realDir, { recursive: true });
@@ -529,6 +534,11 @@ test('getGitRoot resolves through symlink to git repo', () => {
529
534
  });
530
535
 
531
536
  test('getGitRoot with symlinked subdirectory', () => {
537
+ // Skip on Windows - symlinks require elevated privileges
538
+ if (process.platform === 'win32') {
539
+ console.log(' → Skipped: Symlinks require elevated privileges on Windows');
540
+ return;
541
+ }
532
542
  const realDir = path.join(os.tmpdir(), 'ck-test-real-sub-' + Date.now());
533
543
  const subDir = path.join(realDir, 'subdir');
534
544
  const linkToSub = path.join(os.tmpdir(), 'ck-test-link-sub-' + Date.now());