@planu/cli 0.43.1 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/dist/cli/colors.d.ts +14 -0
  2. package/dist/cli/colors.d.ts.map +1 -0
  3. package/dist/cli/colors.js +26 -0
  4. package/dist/cli/colors.js.map +1 -0
  5. package/dist/cli/commands/audit.d.ts +3 -0
  6. package/dist/cli/commands/audit.d.ts.map +1 -0
  7. package/dist/cli/commands/audit.js +38 -0
  8. package/dist/cli/commands/audit.js.map +1 -0
  9. package/dist/cli/commands/create.d.ts +3 -0
  10. package/dist/cli/commands/create.d.ts.map +1 -0
  11. package/dist/cli/commands/create.js +50 -0
  12. package/dist/cli/commands/create.js.map +1 -0
  13. package/dist/cli/commands/dashboard.d.ts +3 -0
  14. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  15. package/dist/cli/commands/dashboard.js +29 -0
  16. package/dist/cli/commands/dashboard.js.map +1 -0
  17. package/dist/cli/commands/estimate.d.ts +3 -0
  18. package/dist/cli/commands/estimate.d.ts.map +1 -0
  19. package/dist/cli/commands/estimate.js +36 -0
  20. package/dist/cli/commands/estimate.js.map +1 -0
  21. package/dist/cli/commands/handoff.d.ts +3 -0
  22. package/dist/cli/commands/handoff.d.ts.map +1 -0
  23. package/dist/cli/commands/handoff.js +49 -0
  24. package/dist/cli/commands/handoff.js.map +1 -0
  25. package/dist/cli/commands/init.d.ts +3 -0
  26. package/dist/cli/commands/init.d.ts.map +1 -0
  27. package/dist/cli/commands/init.js +43 -0
  28. package/dist/cli/commands/init.js.map +1 -0
  29. package/dist/cli/commands/list.d.ts +3 -0
  30. package/dist/cli/commands/list.d.ts.map +1 -0
  31. package/dist/cli/commands/list.js +36 -0
  32. package/dist/cli/commands/list.js.map +1 -0
  33. package/dist/cli/commands/serve.d.ts +3 -0
  34. package/dist/cli/commands/serve.d.ts.map +1 -0
  35. package/dist/cli/commands/serve.js +34 -0
  36. package/dist/cli/commands/serve.js.map +1 -0
  37. package/dist/cli/commands/status.d.ts +3 -0
  38. package/dist/cli/commands/status.d.ts.map +1 -0
  39. package/dist/cli/commands/status.js +49 -0
  40. package/dist/cli/commands/status.js.map +1 -0
  41. package/dist/cli/commands/validate.d.ts +3 -0
  42. package/dist/cli/commands/validate.d.ts.map +1 -0
  43. package/dist/cli/commands/validate.js +36 -0
  44. package/dist/cli/commands/validate.js.map +1 -0
  45. package/dist/cli/commands/watch.d.ts +3 -0
  46. package/dist/cli/commands/watch.d.ts.map +1 -0
  47. package/dist/cli/commands/watch.js +156 -0
  48. package/dist/cli/commands/watch.js.map +1 -0
  49. package/dist/cli/formatter.d.ts +18 -0
  50. package/dist/cli/formatter.d.ts.map +1 -0
  51. package/dist/cli/formatter.js +78 -0
  52. package/dist/cli/formatter.js.map +1 -0
  53. package/dist/cli/index.d.ts +6 -0
  54. package/dist/cli/index.d.ts.map +1 -0
  55. package/dist/cli/index.js +7 -0
  56. package/dist/cli/index.js.map +1 -0
  57. package/dist/cli/interactive.d.ts +13 -0
  58. package/dist/cli/interactive.d.ts.map +1 -0
  59. package/dist/cli/interactive.js +42 -0
  60. package/dist/cli/interactive.js.map +1 -0
  61. package/dist/cli/project-detector.d.ts +6 -0
  62. package/dist/cli/project-detector.d.ts.map +1 -0
  63. package/dist/cli/project-detector.js +12 -0
  64. package/dist/cli/project-detector.js.map +1 -0
  65. package/dist/cli/router.d.ts +5 -0
  66. package/dist/cli/router.d.ts.map +1 -0
  67. package/dist/cli/router.js +104 -0
  68. package/dist/cli/router.js.map +1 -0
  69. package/dist/config/hook-defaults.json +19 -0
  70. package/dist/config/license-plans.json +16 -1
  71. package/dist/config/tool-groups.json +12 -1
  72. package/dist/engine/analyzer/analyze-project.d.ts +15 -0
  73. package/dist/engine/analyzer/analyze-project.d.ts.map +1 -0
  74. package/dist/engine/analyzer/analyze-project.js +101 -0
  75. package/dist/engine/analyzer/analyze-project.js.map +1 -0
  76. package/dist/engine/analyzer/completeness-checker.d.ts +6 -0
  77. package/dist/engine/analyzer/completeness-checker.d.ts.map +1 -0
  78. package/dist/engine/analyzer/completeness-checker.js +79 -0
  79. package/dist/engine/analyzer/completeness-checker.js.map +1 -0
  80. package/dist/engine/analyzer/db-engine.d.ts +9 -0
  81. package/dist/engine/analyzer/db-engine.d.ts.map +1 -0
  82. package/dist/engine/analyzer/db-engine.js +137 -0
  83. package/dist/engine/analyzer/db-engine.js.map +1 -0
  84. package/dist/engine/analyzer/detectors.d.ts +7 -0
  85. package/dist/engine/analyzer/detectors.d.ts.map +1 -0
  86. package/dist/engine/analyzer/detectors.js +234 -0
  87. package/dist/engine/analyzer/detectors.js.map +1 -0
  88. package/dist/engine/analyzer/env-setup.d.ts +6 -0
  89. package/dist/engine/analyzer/env-setup.d.ts.map +1 -0
  90. package/dist/engine/analyzer/env-setup.js +174 -0
  91. package/dist/engine/analyzer/env-setup.js.map +1 -0
  92. package/dist/engine/analyzer/index.d.ts +6 -0
  93. package/dist/engine/analyzer/index.d.ts.map +1 -0
  94. package/dist/engine/analyzer/index.js +8 -0
  95. package/dist/engine/analyzer/index.js.map +1 -0
  96. package/dist/engine/analyzer-db.d.ts +1 -8
  97. package/dist/engine/analyzer-db.d.ts.map +1 -1
  98. package/dist/engine/analyzer-db.js +3 -136
  99. package/dist/engine/analyzer-db.js.map +1 -1
  100. package/dist/engine/analyzer-detectors.d.ts +1 -6
  101. package/dist/engine/analyzer-detectors.d.ts.map +1 -1
  102. package/dist/engine/analyzer-detectors.js +3 -231
  103. package/dist/engine/analyzer-detectors.js.map +1 -1
  104. package/dist/engine/analyzer-env.d.ts +1 -5
  105. package/dist/engine/analyzer-env.d.ts.map +1 -1
  106. package/dist/engine/analyzer-env.js +3 -173
  107. package/dist/engine/analyzer-env.js.map +1 -1
  108. package/dist/engine/analyzer.d.ts +2 -18
  109. package/dist/engine/analyzer.d.ts.map +1 -1
  110. package/dist/engine/analyzer.js +4 -172
  111. package/dist/engine/analyzer.js.map +1 -1
  112. package/dist/engine/dashboard/data-loader.d.ts +16 -1
  113. package/dist/engine/dashboard/data-loader.d.ts.map +1 -1
  114. package/dist/engine/dashboard/data-loader.js +140 -2
  115. package/dist/engine/dashboard/data-loader.js.map +1 -1
  116. package/dist/engine/dashboard/index.d.ts +2 -0
  117. package/dist/engine/dashboard/index.d.ts.map +1 -1
  118. package/dist/engine/dashboard/index.js +2 -0
  119. package/dist/engine/dashboard/index.js.map +1 -1
  120. package/dist/engine/dashboard/kanban-logic.d.ts +31 -0
  121. package/dist/engine/dashboard/kanban-logic.d.ts.map +1 -0
  122. package/dist/engine/dashboard/kanban-logic.js +122 -0
  123. package/dist/engine/dashboard/kanban-logic.js.map +1 -0
  124. package/dist/engine/dashboard/routes.d.ts +2 -0
  125. package/dist/engine/dashboard/routes.d.ts.map +1 -1
  126. package/dist/engine/dashboard/routes.js +112 -23
  127. package/dist/engine/dashboard/routes.js.map +1 -1
  128. package/dist/engine/dashboard/server.d.ts +5 -0
  129. package/dist/engine/dashboard/server.d.ts.map +1 -1
  130. package/dist/engine/dashboard/server.js +48 -0
  131. package/dist/engine/dashboard/server.js.map +1 -1
  132. package/dist/engine/dashboard/spec-updater.d.ts +8 -0
  133. package/dist/engine/dashboard/spec-updater.d.ts.map +1 -0
  134. package/dist/engine/dashboard/spec-updater.js +37 -0
  135. package/dist/engine/dashboard/spec-updater.js.map +1 -0
  136. package/dist/engine/dashboard/templates-kanban.d.ts +6 -0
  137. package/dist/engine/dashboard/templates-kanban.d.ts.map +1 -0
  138. package/dist/engine/dashboard/templates-kanban.js +100 -0
  139. package/dist/engine/dashboard/templates-kanban.js.map +1 -0
  140. package/dist/engine/dashboard/templates-layout.d.ts +3 -3
  141. package/dist/engine/dashboard/templates-layout.d.ts.map +1 -1
  142. package/dist/engine/dashboard/templates-layout.js +167 -44
  143. package/dist/engine/dashboard/templates-layout.js.map +1 -1
  144. package/dist/engine/dashboard/templates-project.d.ts +1 -1
  145. package/dist/engine/dashboard/templates-project.d.ts.map +1 -1
  146. package/dist/engine/dashboard/templates-project.js +109 -3
  147. package/dist/engine/dashboard/templates-project.js.map +1 -1
  148. package/dist/engine/dashboard/templates.d.ts +1 -0
  149. package/dist/engine/dashboard/templates.d.ts.map +1 -1
  150. package/dist/engine/dashboard/templates.js +1 -0
  151. package/dist/engine/dashboard/templates.js.map +1 -1
  152. package/dist/engine/hooks/config-loader.d.ts +36 -0
  153. package/dist/engine/hooks/config-loader.d.ts.map +1 -0
  154. package/dist/engine/hooks/config-loader.js +142 -0
  155. package/dist/engine/hooks/config-loader.js.map +1 -0
  156. package/dist/engine/hooks/debouncer.d.ts +30 -0
  157. package/dist/engine/hooks/debouncer.d.ts.map +1 -0
  158. package/dist/engine/hooks/debouncer.js +124 -0
  159. package/dist/engine/hooks/debouncer.js.map +1 -0
  160. package/dist/engine/hooks/event-bus.d.ts +40 -0
  161. package/dist/engine/hooks/event-bus.d.ts.map +1 -0
  162. package/dist/engine/hooks/event-bus.js +83 -0
  163. package/dist/engine/hooks/event-bus.js.map +1 -0
  164. package/dist/engine/hooks/file-watcher.d.ts +48 -0
  165. package/dist/engine/hooks/file-watcher.d.ts.map +1 -0
  166. package/dist/engine/hooks/file-watcher.js +193 -0
  167. package/dist/engine/hooks/file-watcher.js.map +1 -0
  168. package/dist/engine/hooks/handlers/on-commit.d.ts +26 -0
  169. package/dist/engine/hooks/handlers/on-commit.d.ts.map +1 -0
  170. package/dist/engine/hooks/handlers/on-commit.js +198 -0
  171. package/dist/engine/hooks/handlers/on-commit.js.map +1 -0
  172. package/dist/engine/hooks/handlers/on-create.d.ts +8 -0
  173. package/dist/engine/hooks/handlers/on-create.d.ts.map +1 -0
  174. package/dist/engine/hooks/handlers/on-create.js +30 -0
  175. package/dist/engine/hooks/handlers/on-create.js.map +1 -0
  176. package/dist/engine/hooks/handlers/on-delete.d.ts +9 -0
  177. package/dist/engine/hooks/handlers/on-delete.d.ts.map +1 -0
  178. package/dist/engine/hooks/handlers/on-delete.js +33 -0
  179. package/dist/engine/hooks/handlers/on-delete.js.map +1 -0
  180. package/dist/engine/hooks/handlers/on-save.d.ts +29 -0
  181. package/dist/engine/hooks/handlers/on-save.d.ts.map +1 -0
  182. package/dist/engine/hooks/handlers/on-save.js +118 -0
  183. package/dist/engine/hooks/handlers/on-save.js.map +1 -0
  184. package/dist/engine/hooks/handlers/on-test-pass.d.ts +33 -0
  185. package/dist/engine/hooks/handlers/on-test-pass.d.ts.map +1 -0
  186. package/dist/engine/hooks/handlers/on-test-pass.js +103 -0
  187. package/dist/engine/hooks/handlers/on-test-pass.js.map +1 -0
  188. package/dist/engine/hooks/hook-engine.d.ts +50 -0
  189. package/dist/engine/hooks/hook-engine.d.ts.map +1 -0
  190. package/dist/engine/hooks/hook-engine.js +159 -0
  191. package/dist/engine/hooks/hook-engine.js.map +1 -0
  192. package/dist/engine/hooks/index.d.ts +10 -0
  193. package/dist/engine/hooks/index.d.ts.map +1 -1
  194. package/dist/engine/hooks/index.js +12 -0
  195. package/dist/engine/hooks/index.js.map +1 -1
  196. package/dist/engine/living-spec/annotation-parser.d.ts +18 -0
  197. package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -0
  198. package/dist/engine/living-spec/annotation-parser.js +105 -0
  199. package/dist/engine/living-spec/annotation-parser.js.map +1 -0
  200. package/dist/engine/living-spec/auto-reconciler.d.ts +28 -0
  201. package/dist/engine/living-spec/auto-reconciler.d.ts.map +1 -0
  202. package/dist/engine/living-spec/auto-reconciler.js +103 -0
  203. package/dist/engine/living-spec/auto-reconciler.js.map +1 -0
  204. package/dist/engine/living-spec/bidirectional-sync.d.ts +26 -0
  205. package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -0
  206. package/dist/engine/living-spec/bidirectional-sync.js +160 -0
  207. package/dist/engine/living-spec/bidirectional-sync.js.map +1 -0
  208. package/dist/engine/living-spec/dashboard-collector.d.ts +22 -0
  209. package/dist/engine/living-spec/dashboard-collector.d.ts.map +1 -0
  210. package/dist/engine/living-spec/dashboard-collector.js +97 -0
  211. package/dist/engine/living-spec/dashboard-collector.js.map +1 -0
  212. package/dist/engine/living-spec/drift-watcher.d.ts +15 -0
  213. package/dist/engine/living-spec/drift-watcher.d.ts.map +1 -0
  214. package/dist/engine/living-spec/drift-watcher.js +126 -0
  215. package/dist/engine/living-spec/drift-watcher.js.map +1 -0
  216. package/dist/engine/living-spec/hash-tracker.d.ts +24 -0
  217. package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -0
  218. package/dist/engine/living-spec/hash-tracker.js +123 -0
  219. package/dist/engine/living-spec/hash-tracker.js.map +1 -0
  220. package/dist/engine/living-spec/index.d.ts +9 -0
  221. package/dist/engine/living-spec/index.d.ts.map +1 -0
  222. package/dist/engine/living-spec/index.js +10 -0
  223. package/dist/engine/living-spec/index.js.map +1 -0
  224. package/dist/engine/living-spec/signature-tracker.d.ts +18 -0
  225. package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -0
  226. package/dist/engine/living-spec/signature-tracker.js +136 -0
  227. package/dist/engine/living-spec/signature-tracker.js.map +1 -0
  228. package/dist/engine/living-spec/test-coverage-correlator.d.ts +22 -0
  229. package/dist/engine/living-spec/test-coverage-correlator.d.ts.map +1 -0
  230. package/dist/engine/living-spec/test-coverage-correlator.js +130 -0
  231. package/dist/engine/living-spec/test-coverage-correlator.js.map +1 -0
  232. package/dist/engine/plugins/extensions/worker-extension.d.ts.map +1 -1
  233. package/dist/engine/plugins/extensions/worker-extension.js +3 -1
  234. package/dist/engine/plugins/extensions/worker-extension.js.map +1 -1
  235. package/dist/engine/safety/file-mutex.d.ts.map +1 -1
  236. package/dist/engine/safety/file-mutex.js +3 -0
  237. package/dist/engine/safety/file-mutex.js.map +1 -1
  238. package/dist/index.js +29 -0
  239. package/dist/index.js.map +1 -1
  240. package/dist/storage/hash-snapshot-store.d.ts +18 -0
  241. package/dist/storage/hash-snapshot-store.d.ts.map +1 -0
  242. package/dist/storage/hash-snapshot-store.js +43 -0
  243. package/dist/storage/hash-snapshot-store.js.map +1 -0
  244. package/dist/storage/index.d.ts +3 -0
  245. package/dist/storage/index.d.ts.map +1 -1
  246. package/dist/storage/index.js +3 -0
  247. package/dist/storage/index.js.map +1 -1
  248. package/dist/storage/living-dashboard-store.d.ts +10 -0
  249. package/dist/storage/living-dashboard-store.d.ts.map +1 -0
  250. package/dist/storage/living-dashboard-store.js +31 -0
  251. package/dist/storage/living-dashboard-store.js.map +1 -0
  252. package/dist/storage/sync-log-store.d.ts +26 -0
  253. package/dist/storage/sync-log-store.d.ts.map +1 -0
  254. package/dist/storage/sync-log-store.js +60 -0
  255. package/dist/storage/sync-log-store.js.map +1 -0
  256. package/dist/tools/auto-reconcile.d.ts +3 -0
  257. package/dist/tools/auto-reconcile.d.ts.map +1 -0
  258. package/dist/tools/auto-reconcile.js +81 -0
  259. package/dist/tools/auto-reconcile.js.map +1 -0
  260. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.d.ts.map +1 -1
  261. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js +6 -0
  262. package/dist/tools/challenge-spec/platform-challenge-scenarios-b2.js.map +1 -1
  263. package/dist/tools/create-spec/spec-builder.js +2 -0
  264. package/dist/tools/create-spec/spec-builder.js.map +1 -1
  265. package/dist/tools/dashboard.d.ts.map +1 -1
  266. package/dist/tools/dashboard.js +20 -13
  267. package/dist/tools/dashboard.js.map +1 -1
  268. package/dist/tools/generate-annotations.d.ts +3 -0
  269. package/dist/tools/generate-annotations.d.ts.map +1 -0
  270. package/dist/tools/generate-annotations.js +70 -0
  271. package/dist/tools/generate-annotations.js.map +1 -0
  272. package/dist/tools/generate-execution-plan.d.ts.map +1 -1
  273. package/dist/tools/generate-execution-plan.js +1 -0
  274. package/dist/tools/generate-execution-plan.js.map +1 -1
  275. package/dist/tools/github-pr-handler.d.ts.map +1 -1
  276. package/dist/tools/github-pr-handler.js +1 -0
  277. package/dist/tools/github-pr-handler.js.map +1 -1
  278. package/dist/tools/github-review-handler.d.ts.map +1 -1
  279. package/dist/tools/github-review-handler.js +1 -0
  280. package/dist/tools/github-review-handler.js.map +1 -1
  281. package/dist/tools/ide-config-handler.d.ts.map +1 -1
  282. package/dist/tools/ide-config-handler.js +3 -0
  283. package/dist/tools/ide-config-handler.js.map +1 -1
  284. package/dist/tools/init-project/handler.d.ts.map +1 -1
  285. package/dist/tools/init-project/handler.js +0 -3
  286. package/dist/tools/init-project/handler.js.map +1 -1
  287. package/dist/tools/living-spec-coverage.d.ts +3 -0
  288. package/dist/tools/living-spec-coverage.d.ts.map +1 -0
  289. package/dist/tools/living-spec-coverage.js +100 -0
  290. package/dist/tools/living-spec-coverage.js.map +1 -0
  291. package/dist/tools/living-spec-watch.d.ts +4 -0
  292. package/dist/tools/living-spec-watch.d.ts.map +1 -0
  293. package/dist/tools/living-spec-watch.js +94 -0
  294. package/dist/tools/living-spec-watch.js.map +1 -0
  295. package/dist/tools/manage-plugins-handler.d.ts.map +1 -1
  296. package/dist/tools/manage-plugins-handler.js +2 -1
  297. package/dist/tools/manage-plugins-handler.js.map +1 -1
  298. package/dist/tools/orchestrate-distribution.d.ts.map +1 -1
  299. package/dist/tools/orchestrate-distribution.js +1 -0
  300. package/dist/tools/orchestrate-distribution.js.map +1 -1
  301. package/dist/tools/orchestrate-runtime.js +2 -0
  302. package/dist/tools/orchestrate-runtime.js.map +1 -1
  303. package/dist/tools/plan-team-distribution.d.ts.map +1 -1
  304. package/dist/tools/plan-team-distribution.js +2 -0
  305. package/dist/tools/plan-team-distribution.js.map +1 -1
  306. package/dist/tools/register-dashboard-tools.d.ts.map +1 -1
  307. package/dist/tools/register-dashboard-tools.js +5 -1
  308. package/dist/tools/register-dashboard-tools.js.map +1 -1
  309. package/dist/tools/register-hooks-tools.d.ts.map +1 -1
  310. package/dist/tools/register-hooks-tools.js +82 -1
  311. package/dist/tools/register-hooks-tools.js.map +1 -1
  312. package/dist/tools/register-living-spec-advanced-tools.d.ts +6 -0
  313. package/dist/tools/register-living-spec-advanced-tools.d.ts.map +1 -0
  314. package/dist/tools/register-living-spec-advanced-tools.js +113 -0
  315. package/dist/tools/register-living-spec-advanced-tools.js.map +1 -0
  316. package/dist/tools/register-living-spec-tools.d.ts +6 -0
  317. package/dist/tools/register-living-spec-tools.d.ts.map +1 -0
  318. package/dist/tools/register-living-spec-tools.js +67 -0
  319. package/dist/tools/register-living-spec-tools.js.map +1 -0
  320. package/dist/tools/resolve-sync-conflict.d.ts +3 -0
  321. package/dist/tools/resolve-sync-conflict.d.ts.map +1 -0
  322. package/dist/tools/resolve-sync-conflict.js +38 -0
  323. package/dist/tools/resolve-sync-conflict.js.map +1 -0
  324. package/dist/tools/snapshot-spec-hashes.d.ts +3 -0
  325. package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -0
  326. package/dist/tools/snapshot-spec-hashes.js +100 -0
  327. package/dist/tools/snapshot-spec-hashes.js.map +1 -0
  328. package/dist/tools/spec-diff.d.ts +3 -0
  329. package/dist/tools/spec-diff.d.ts.map +1 -0
  330. package/dist/tools/spec-diff.js +58 -0
  331. package/dist/tools/spec-diff.js.map +1 -0
  332. package/dist/tools/start-hooks.d.ts +17 -0
  333. package/dist/tools/start-hooks.d.ts.map +1 -0
  334. package/dist/tools/start-hooks.js +209 -0
  335. package/dist/tools/start-hooks.js.map +1 -0
  336. package/dist/tools/sync-code-to-spec.d.ts +3 -0
  337. package/dist/tools/sync-code-to-spec.d.ts.map +1 -0
  338. package/dist/tools/sync-code-to-spec.js +51 -0
  339. package/dist/tools/sync-code-to-spec.js.map +1 -0
  340. package/dist/tools/sync-spec-to-code.d.ts +3 -0
  341. package/dist/tools/sync-spec-to-code.d.ts.map +1 -0
  342. package/dist/tools/sync-spec-to-code.js +58 -0
  343. package/dist/tools/sync-spec-to-code.js.map +1 -0
  344. package/dist/tools/validate-annotations.d.ts +3 -0
  345. package/dist/tools/validate-annotations.d.ts.map +1 -0
  346. package/dist/tools/validate-annotations.js +90 -0
  347. package/dist/tools/validate-annotations.js.map +1 -0
  348. package/dist/types/cli.d.ts +14 -0
  349. package/dist/types/cli.d.ts.map +1 -0
  350. package/dist/types/cli.js +3 -0
  351. package/dist/types/cli.js.map +1 -0
  352. package/dist/types/dashboard.d.ts +86 -1
  353. package/dist/types/dashboard.d.ts.map +1 -1
  354. package/dist/types/file-hooks.d.ts +230 -0
  355. package/dist/types/file-hooks.d.ts.map +1 -0
  356. package/dist/types/file-hooks.js +3 -0
  357. package/dist/types/file-hooks.js.map +1 -0
  358. package/dist/types/index.d.ts +3 -0
  359. package/dist/types/index.d.ts.map +1 -1
  360. package/dist/types/index.js +3 -0
  361. package/dist/types/index.js.map +1 -1
  362. package/dist/types/living-spec.d.ts +382 -0
  363. package/dist/types/living-spec.d.ts.map +1 -0
  364. package/dist/types/living-spec.js +3 -0
  365. package/dist/types/living-spec.js.map +1 -0
  366. package/package.json +1 -1
  367. package/src/config/hook-defaults.json +19 -0
  368. package/src/config/license-plans.json +16 -1
  369. package/src/config/tool-groups.json +12 -1
@@ -0,0 +1,174 @@
1
+ // Planu — Analyzer: Env Setup, MCP Discovery, and Stack Helpers
2
+ // Internal helpers extracted from analyzer.ts to keep file sizes manageable.
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { fileExists } from '../detection-utils.js';
6
+ // === Env Setup Analysis ===
7
+ export async function analyzeEnvSetup(projectPath, projectId) {
8
+ const variables = [];
9
+ const issues = [];
10
+ for (const envFile of ['.env.example', '.env.local.example', '.env.sample']) {
11
+ try {
12
+ const content = await readFile(join(projectPath, envFile), 'utf-8');
13
+ const parsed = parseEnvFile(content);
14
+ variables.push(...parsed);
15
+ break;
16
+ }
17
+ catch {
18
+ // File doesn't exist
19
+ }
20
+ }
21
+ const gitignoreHasEnv = await checkGitignoreForEnv(projectPath);
22
+ const noEnvInGit = !(await fileExists(projectPath, '.env'));
23
+ if (!gitignoreHasEnv) {
24
+ issues.push({
25
+ severity: 'critical',
26
+ issue: '.env files are not in .gitignore',
27
+ fix: 'Add .env* to .gitignore immediately',
28
+ });
29
+ }
30
+ const security = {
31
+ gitignoreHasEnv,
32
+ noSecretsInCode: true,
33
+ noEnvInGit,
34
+ noSecretsInLogs: true,
35
+ usesSecretManager: false,
36
+ issues,
37
+ };
38
+ const missing = variables.filter((v) => v.required);
39
+ return { projectId, variables, missing, security, setupSteps: [] };
40
+ }
41
+ function parseEnvFile(content) {
42
+ const variables = [];
43
+ for (const line of content.split('\n')) {
44
+ const trimmed = line.trim();
45
+ if (!trimmed || trimmed.startsWith('#')) {
46
+ continue;
47
+ }
48
+ const eqIndex = trimmed.indexOf('=');
49
+ if (eqIndex === -1) {
50
+ continue;
51
+ }
52
+ const name = trimmed.substring(0, eqIndex).trim();
53
+ const value = trimmed.substring(eqIndex + 1).trim();
54
+ const sensitive = /secret|key|password|token|api_key|private/i.test(name);
55
+ variables.push({
56
+ name,
57
+ service: inferServiceFromEnvName(name),
58
+ required: true,
59
+ sensitive,
60
+ description: '',
61
+ howToGet: '',
62
+ exampleValue: value || undefined,
63
+ environments: ['development', 'staging', 'production'],
64
+ });
65
+ }
66
+ return variables;
67
+ }
68
+ function inferServiceFromEnvName(name) {
69
+ const upper = name.toUpperCase();
70
+ if (upper.includes('SUPABASE')) {
71
+ return 'supabase';
72
+ }
73
+ if (upper.includes('STRIPE')) {
74
+ return 'stripe';
75
+ }
76
+ if (upper.includes('FIREBASE')) {
77
+ return 'firebase';
78
+ }
79
+ if (upper.includes('AWS')) {
80
+ return 'aws';
81
+ }
82
+ if (upper.includes('DATABASE') || upper.includes('DB_')) {
83
+ return 'database';
84
+ }
85
+ if (upper.includes('REDIS')) {
86
+ return 'redis';
87
+ }
88
+ if (upper.includes('SENTRY')) {
89
+ return 'sentry';
90
+ }
91
+ if (upper.includes('GITHUB')) {
92
+ return 'github';
93
+ }
94
+ if (upper.includes('OPENAI') || upper.includes('ANTHROPIC')) {
95
+ return 'ai';
96
+ }
97
+ return 'app';
98
+ }
99
+ async function checkGitignoreForEnv(projectPath) {
100
+ try {
101
+ const content = await readFile(join(projectPath, '.gitignore'), 'utf-8');
102
+ return content.includes('.env');
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ }
108
+ // === MCP Discovery ===
109
+ export async function discoverMcps(projectPath) {
110
+ const mcps = [];
111
+ const mcpConfigPaths = [
112
+ join(projectPath, '.claude', 'settings.json'),
113
+ join(projectPath, '.claude', 'settings.local.json'),
114
+ ];
115
+ for (const configPath of mcpConfigPaths) {
116
+ try {
117
+ const content = await readFile(configPath, 'utf-8');
118
+ const config = JSON.parse(content);
119
+ if (config.mcpServers && typeof config.mcpServers === 'object') {
120
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
121
+ const sc = serverConfig;
122
+ mcps.push({
123
+ name,
124
+ command: typeof sc.command === 'string' ? sc.command : '',
125
+ tools: Array.isArray(sc.tools) ? sc.tools : [],
126
+ relevantFor: [],
127
+ });
128
+ }
129
+ }
130
+ }
131
+ catch {
132
+ // Config doesn't exist or is invalid
133
+ }
134
+ }
135
+ return mcps;
136
+ }
137
+ // === Stack and Quality Helpers ===
138
+ export function buildStackList(language, framework, database, packageManager) {
139
+ const stack = [language];
140
+ if (framework) {
141
+ stack.push(framework);
142
+ }
143
+ if (database !== 'unknown') {
144
+ stack.push(database);
145
+ }
146
+ if (packageManager) {
147
+ stack.push(packageManager);
148
+ }
149
+ return stack;
150
+ }
151
+ export function buildQualityProfile(linting, conventions) {
152
+ const enabledCategories = [
153
+ 'solid',
154
+ 'clean-code',
155
+ 'architecture',
156
+ 'security',
157
+ 'error-handling',
158
+ ];
159
+ const principles = ['SOLID', 'Clean Code', 'Fail Fast', 'DRY'];
160
+ let strictness = 'standard';
161
+ // Auto-configure based on project rules
162
+ if (conventions['ai-rules'] ?? conventions['commit-convention']) {
163
+ strictness = 'strict';
164
+ }
165
+ if (linting.maturityScore >= 80) {
166
+ enabledCategories.push('testing', 'performance');
167
+ }
168
+ const configuredLinterCount = linting.detectedLinters.filter((l) => l.status === 'configured').length;
169
+ if (configuredLinterCount >= 3) {
170
+ strictness = 'strict';
171
+ }
172
+ return { enabledCategories, customRules: [], principles, strictness };
173
+ }
174
+ //# sourceMappingURL=env-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-setup.js","sourceRoot":"","sources":["../../../src/engine/analyzer/env-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { analyzeProject, quickAnalyze } from './analyze-project.js';
2
+ export { checkProjectCompleteness } from './completeness-checker.js';
3
+ export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './detectors.js';
4
+ export { analyzeEnvSetup, discoverMcps, buildStackList, buildQualityProfile } from './env-setup.js';
5
+ export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './db-engine.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/analyzer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Planu — Analyzer barrel re-exports
2
+ // All public API from the analyzer module
3
+ export { analyzeProject, quickAnalyze } from './analyze-project.js';
4
+ export { checkProjectCompleteness } from './completeness-checker.js';
5
+ export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './detectors.js';
6
+ export { analyzeEnvSetup, discoverMcps, buildStackList, buildQualityProfile } from './env-setup.js';
7
+ export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './db-engine.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/analyzer/index.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,0CAA0C;AAE1C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -1,9 +1,2 @@
1
- import type { DBEngine, DBEngineConfig, SQLSyntaxConfig } from '../types/tooling.js';
2
- /** Resets the in-memory cache — used in tests to force reload */
3
- export declare function resetDbRegistryCache(): void;
4
- export declare function detectDBEngine(projectPath: string): Promise<DBEngineConfig | null>;
5
- export declare function getSQLSyntaxForEngine(engine: DBEngine): SQLSyntaxConfig;
6
- export declare function generateFirestoreRules(collections: string[]): string;
7
- export declare function generateMongoSchema(collections: string[]): string;
8
- export declare function generateSupabaseRLS(tables: string[]): string;
1
+ export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './analyzer/db-engine.js';
9
2
  //# sourceMappingURL=analyzer-db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer-db.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAEd,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAO7B,iEAAiE;AACjE,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAqBD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmBxF;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,CA4DvE;AAID,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBpE;AAID,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjE;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAuB5D"}
1
+ {"version":3,"file":"analyzer-db.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -1,137 +1,4 @@
1
- // Planu — DB Engine Detection (SPEC-025)
2
- // Detects database engine from project dependencies and generates adapted SQL syntax
3
- import { readFile } from 'node:fs/promises';
4
- import { collectDependencies } from './detection-utils.js';
5
- // === Registry loading ===
6
- let registryCache = null;
7
- /** Resets the in-memory cache — used in tests to force reload */
8
- export function resetDbRegistryCache() {
9
- registryCache = null;
10
- }
11
- async function loadDbRegistry() {
12
- if (registryCache) {
13
- return registryCache;
14
- }
15
- try {
16
- const configPath = new URL('../config/db-engines.json', import.meta.url);
17
- const content = await readFile(configPath, 'utf-8');
18
- registryCache = JSON.parse(content);
19
- return registryCache;
20
- }
21
- catch {
22
- return {
23
- engines: {},
24
- sqlSyntax: { createTable: {}, primaryKeyConstraint: {}, autoTimestamps: {} },
25
- };
26
- }
27
- }
28
- // === DB Engine detection ===
29
- export async function detectDBEngine(projectPath) {
30
- const registry = await loadDbRegistry();
31
- const deps = await collectDependencies(projectPath);
32
- for (const [engineKey, engine] of Object.entries(registry.engines)) {
33
- const allDeps = [...engine.detectionDeps, ...(engine.prismaDeps ?? [])];
34
- for (const dep of allDeps) {
35
- if (deps.has(dep)) {
36
- return {
37
- engine: engineKey,
38
- detectedFrom: dep,
39
- features: engine.features,
40
- securityRules: engine.securityRules,
41
- };
42
- }
43
- }
44
- }
45
- return null;
46
- }
47
- // === SQL syntax adapters ===
48
- export function getSQLSyntaxForEngine(engine) {
49
- const defaults = {
50
- createTable: 'CREATE TABLE IF NOT EXISTS',
51
- primaryKey: 'PRIMARY KEY',
52
- autoTimestamp: 'DEFAULT now()',
53
- idType: 'uuid DEFAULT gen_random_uuid()',
54
- jsonType: 'jsonb',
55
- autoIncrement: 'GENERATED ALWAYS AS IDENTITY',
56
- };
57
- switch (engine) {
58
- case 'supabase':
59
- case 'postgresql':
60
- return {
61
- createTable: 'CREATE TABLE IF NOT EXISTS',
62
- primaryKey: 'PRIMARY KEY',
63
- autoTimestamp: 'DEFAULT now()',
64
- idType: 'uuid DEFAULT gen_random_uuid()',
65
- jsonType: 'jsonb',
66
- autoIncrement: 'GENERATED ALWAYS AS IDENTITY',
67
- };
68
- case 'mysql':
69
- return {
70
- createTable: 'CREATE TABLE IF NOT EXISTS',
71
- primaryKey: 'PRIMARY KEY',
72
- autoTimestamp: 'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
73
- idType: 'CHAR(36) DEFAULT (UUID())',
74
- jsonType: 'JSON',
75
- autoIncrement: 'AUTO_INCREMENT',
76
- };
77
- case 'sqlite':
78
- return {
79
- createTable: 'CREATE TABLE IF NOT EXISTS',
80
- primaryKey: 'PRIMARY KEY',
81
- autoTimestamp: "DEFAULT (datetime('now'))",
82
- idType: 'TEXT DEFAULT (lower(hex(randomblob(16))))',
83
- jsonType: 'TEXT',
84
- autoIncrement: 'AUTOINCREMENT',
85
- };
86
- case 'mongodb':
87
- return {
88
- createTable: 'db.createCollection',
89
- primaryKey: '_id',
90
- autoTimestamp: 'ISODate()',
91
- idType: 'ObjectId',
92
- jsonType: 'BSON',
93
- autoIncrement: 'ObjectId()',
94
- };
95
- case 'firebase':
96
- return {
97
- createTable: '// Firestore collection (no DDL)',
98
- primaryKey: 'document.id',
99
- autoTimestamp: 'FieldValue.serverTimestamp()',
100
- idType: 'string (auto-generated)',
101
- jsonType: 'Map<string, any>',
102
- autoIncrement: 'Firestore auto-ID',
103
- };
104
- default:
105
- return defaults;
106
- }
107
- }
108
- // === Firestore security rules generation ===
109
- export function generateFirestoreRules(collections) {
110
- const rules = [
111
- "rules_version = '2';",
112
- 'service cloud.firestore {',
113
- ' match /databases/{database}/documents {',
114
- ];
115
- for (const collection of collections) {
116
- rules.push(` match /${collection}/{document=**} {`, ` allow read: if request.auth != null;`, ` allow write: if request.auth != null && request.auth.uid == resource.data.userId;`, ` }`);
117
- }
118
- rules.push(' }', '}');
119
- return rules.join('\n');
120
- }
121
- // === MongoDB schema generation ===
122
- export function generateMongoSchema(collections) {
123
- const lines = ['// MongoDB Collection Schemas', ''];
124
- for (const collection of collections) {
125
- lines.push(`// ${collection} collection`, `db.createCollection("${collection}", {`, ` validator: {`, ` $jsonSchema: {`, ` bsonType: "object",`, ` required: ["_id", "createdAt", "updatedAt"],`, ` properties: {`, ` _id: { bsonType: "objectId", description: "Primary key" },`, ` createdAt: { bsonType: "date", description: "Creation timestamp" },`, ` updatedAt: { bsonType: "date", description: "Last update timestamp" }`, ` }`, ` }`, ` }`, `});`, ``, `db.${collection}.createIndex({ createdAt: -1 });`, ``);
126
- }
127
- return lines.join('\n');
128
- }
129
- // === Supabase RLS helper ===
130
- export function generateSupabaseRLS(tables) {
131
- const lines = ['-- Supabase RLS Policies', ''];
132
- for (const table of tables) {
133
- lines.push(`-- Enable RLS on ${table}`, `ALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;`, ``, `-- Allow authenticated users to read`, `CREATE POLICY "${table}_select_authenticated"`, ` ON ${table} FOR SELECT`, ` USING (auth.role() = 'authenticated');`, ``, `-- Allow users to manage their own records`, `CREATE POLICY "${table}_all_owner"`, ` ON ${table} FOR ALL`, ` USING (auth.uid() = user_id)`, ` WITH CHECK (auth.uid() = user_id);`, ``);
134
- }
135
- return lines.join('\n');
136
- }
1
+ // Planu — Analyzer DB barrel re-export (SOLID split)
2
+ // Implementation moved to src/engine/analyzer/ subdirectory
3
+ export { resetDbRegistryCache, detectDBEngine, getSQLSyntaxForEngine, generateFirestoreRules, generateMongoSchema, generateSupabaseRLS, } from './analyzer/db-engine.js';
137
4
  //# sourceMappingURL=analyzer-db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer-db.js","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzer-db.js","sourceRoot":"","sources":["../../src/engine/analyzer-db.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -1,7 +1,2 @@
1
- import type { LintingAnalysis } from '../types/index.js';
2
- export declare function analyzeLinting(projectPath: string): Promise<LintingAnalysis>;
3
- export declare function detectConventions(projectPath: string): Promise<Record<string, string>>;
4
- export declare function detectEnvironments(projectPath: string): Promise<string[]>;
5
- export declare function detectExternalServices(projectPath: string): Promise<string[]>;
6
- export declare function detectTooling(projectPath: string): Promise<Record<string, string>>;
1
+ export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './analyzer/detectors.js';
7
2
  //# sourceMappingURL=analyzer-detectors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer-detectors.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-detectors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMzD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAElF;AAID,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiG5F;AAID,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB/E;AAID,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsCnF;AAID,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgExF"}
1
+ {"version":3,"file":"analyzer-detectors.d.ts","sourceRoot":"","sources":["../../src/engine/analyzer-detectors.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,GACd,MAAM,yBAAyB,CAAC"}
@@ -1,232 +1,4 @@
1
- // Planu — Analyzer: Linting, Conventions, Environments, Tooling, External Services
2
- // Internal helpers extracted from analyzer.ts to keep file sizes manageable.
3
- import { fileExists, hasAnyFile, collectDependencies } from './detection-utils.js';
4
- import { analyzeLintingEnhanced } from './analyzer-linting.js';
5
- // === Linting Analysis — delegates to enhanced module (SPEC-025) ===
6
- export async function analyzeLinting(projectPath) {
7
- return analyzeLintingEnhanced(projectPath);
8
- }
9
- // === Convention Detection ===
10
- export async function detectConventions(projectPath) {
11
- const conventions = {};
12
- // AI agent configs — detect all major AI coding platforms
13
- if (await fileExists(projectPath, 'CLAUDE.md')) {
14
- conventions['ai-rules'] = 'CLAUDE.md';
15
- }
16
- if (await fileExists(projectPath, '.cursorrules')) {
17
- conventions['cursor-rules'] = '.cursorrules';
18
- }
19
- if (await fileExists(projectPath, '.windsurfrules')) {
20
- conventions['windsurf-rules'] = '.windsurfrules';
21
- }
22
- if (await fileExists(projectPath, '.clinerules')) {
23
- conventions['cline-rules'] = '.clinerules';
24
- }
25
- if (await fileExists(projectPath, '.github/copilot-instructions.md')) {
26
- conventions['copilot-rules'] = '.github/copilot-instructions.md';
27
- }
28
- if (await fileExists(projectPath, 'AGENTS.md')) {
29
- conventions['codex-rules'] = 'AGENTS.md';
30
- }
31
- if (await fileExists(projectPath, 'devin.md')) {
32
- conventions['devin-rules'] = 'devin.md';
33
- }
34
- if (await hasAnyFile(projectPath, ['.continue/config.json', '.continuerc.json'])) {
35
- conventions['continue-rules'] = '.continue/config.json';
36
- }
37
- if (await hasAnyFile(projectPath, ['.aider.conf.yml'])) {
38
- conventions['aider-rules'] = '.aider.conf.yml';
39
- }
40
- if (await hasAnyFile(projectPath, ['.gemini/settings.json', '.idx/dev.nix'])) {
41
- conventions['gemini-rules'] = '.gemini/settings.json';
42
- }
43
- if (await hasAnyFile(projectPath, ['.amazonq/rules.md', '.amazonq/settings.json'])) {
44
- conventions['amazon-q-rules'] = '.amazonq/rules.md';
45
- }
46
- if (await fileExists(projectPath, '.junie/guidelines.md')) {
47
- conventions['junie-rules'] = '.junie/guidelines.md';
48
- }
49
- if (await fileExists(projectPath, '.sourcegraph/cody.json')) {
50
- conventions['cody-rules'] = '.sourcegraph/cody.json';
51
- }
52
- if (await fileExists(projectPath, '.replit')) {
53
- conventions['replit-rules'] = '.replit';
54
- }
55
- if (await hasAnyFile(projectPath, ['.zed/settings.json'])) {
56
- conventions['zed-rules'] = '.zed/settings.json';
57
- }
58
- if (await hasAnyFile(projectPath, ['.augment/config.json', '.augmentignore'])) {
59
- conventions['augment-rules'] = '.augment/config.json';
60
- }
61
- if (await fileExists(projectPath, '.qodo/config.json')) {
62
- conventions['qodo-rules'] = '.qodo/config.json';
63
- }
64
- if (await fileExists(projectPath, '.kilocode/rules')) {
65
- conventions['kilo-code-rules'] = '.kilocode/rules';
66
- }
67
- if (await fileExists(projectPath, '.tabnine/config.json')) {
68
- conventions['tabnine-rules'] = '.tabnine/config.json';
69
- }
70
- if (await hasAnyFile(projectPath, ['.agent/rules/*', '.agent/workflows/*'])) {
71
- conventions['antigravity-rules'] = '.agent/rules/';
72
- }
73
- if (await fileExists(projectPath, 'GEMINI.md')) {
74
- // GEMINI.md is used by both Antigravity and Gemini CLI
75
- conventions['antigravity-rules'] ??= 'GEMINI.md';
76
- conventions['gemini-rules'] = 'GEMINI.md';
77
- }
78
- // Editor config
79
- if (await fileExists(projectPath, '.editorconfig')) {
80
- conventions['editor-config'] = '.editorconfig';
81
- }
82
- // Commit conventions
83
- if (await hasAnyFile(projectPath, ['commitlint.config.*', '.commitlintrc*'])) {
84
- conventions['commit-convention'] = 'conventional-commits';
85
- }
86
- // Git hooks
87
- if (await fileExists(projectPath, '.husky')) {
88
- conventions['git-hooks'] = 'husky';
89
- }
90
- if (await hasAnyFile(projectPath, ['.lefthook.yml', 'lefthook.yml'])) {
91
- conventions['git-hooks'] = 'lefthook';
92
- }
93
- if (await hasAnyFile(projectPath, ['.pre-commit-config.yaml'])) {
94
- conventions['git-hooks'] = 'pre-commit';
95
- }
96
- // Lint-staged
97
- if (await hasAnyFile(projectPath, ['.lintstagedrc*', 'lint-staged.config.*'])) {
98
- conventions['lint-staged'] = 'lint-staged';
99
- }
100
- return conventions;
101
- }
102
- // === Environment Detection ===
103
- export async function detectEnvironments(projectPath) {
104
- const environments = ['development'];
105
- if (await hasAnyFile(projectPath, ['.env.staging', '.env.test', '.env.production'])) {
106
- if (await fileExists(projectPath, '.env.staging')) {
107
- environments.push('staging');
108
- }
109
- if (await fileExists(projectPath, '.env.test')) {
110
- environments.push('test');
111
- }
112
- if (await fileExists(projectPath, '.env.production')) {
113
- environments.push('production');
114
- }
115
- }
116
- else {
117
- environments.push('staging', 'production');
118
- }
119
- return environments;
120
- }
121
- // === External Services Detection ===
122
- export async function detectExternalServices(projectPath) {
123
- const services = new Set();
124
- const deps = await collectDependencies(projectPath);
125
- const serviceMap = {
126
- stripe: ['stripe', '@stripe/stripe-js'],
127
- aws: ['aws-sdk', '@aws-sdk/client-s3', '@aws-sdk/client-ses'],
128
- 'google-cloud': ['@google-cloud/storage', '@google-cloud/pubsub', '@google-cloud/firestore'],
129
- azure: ['@azure/storage-blob', '@azure/cosmos'],
130
- supabase: ['@supabase/supabase-js', '@supabase/ssr'],
131
- firebase: ['firebase', 'firebase-admin'],
132
- twilio: ['twilio'],
133
- sendgrid: ['@sendgrid/mail'],
134
- resend: ['resend'],
135
- cloudflare: ['@cloudflare/workers-types', 'wrangler'],
136
- vercel: ['@vercel/analytics', '@vercel/og'],
137
- sentry: ['@sentry/node', '@sentry/nextjs', '@sentry/react'],
138
- datadog: ['dd-trace'],
139
- 'new-relic': ['newrelic'],
140
- redis: ['redis', 'ioredis'],
141
- elasticsearch: ['@elastic/elasticsearch'],
142
- algolia: ['algoliasearch'],
143
- openai: ['openai'],
144
- anthropic: ['@anthropic-ai/sdk'],
145
- auth0: ['@auth0/nextjs-auth0', 'auth0'],
146
- clerk: ['@clerk/nextjs', '@clerk/clerk-sdk-node'],
147
- };
148
- for (const [service, packages] of Object.entries(serviceMap)) {
149
- for (const pkg of packages) {
150
- if (deps.has(pkg)) {
151
- services.add(service);
152
- break;
153
- }
154
- }
155
- }
156
- return [...services];
157
- }
158
- // === Tooling Detection ===
159
- export async function detectTooling(projectPath) {
160
- const tooling = {};
161
- // CI/CD
162
- if (await hasAnyFile(projectPath, ['.github/workflows/*'])) {
163
- tooling.ci = 'github-actions';
164
- }
165
- else if (await fileExists(projectPath, '.gitlab-ci.yml')) {
166
- tooling.ci = 'gitlab-ci';
167
- }
168
- else if (await fileExists(projectPath, 'Jenkinsfile')) {
169
- tooling.ci = 'jenkins';
170
- }
171
- else if (await hasAnyFile(projectPath, ['.circleci/config.yml'])) {
172
- tooling.ci = 'circleci';
173
- }
174
- // Containers
175
- if (await fileExists(projectPath, 'Dockerfile')) {
176
- tooling.container = 'docker';
177
- }
178
- if (await hasAnyFile(projectPath, ['docker-compose.yml', 'docker-compose.yaml'])) {
179
- tooling.orchestration = 'docker-compose';
180
- }
181
- if (await hasAnyFile(projectPath, ['k8s/**/*', 'kubernetes/**/*'])) {
182
- tooling.orchestration = 'kubernetes';
183
- }
184
- // Build tools / task runners
185
- if (await fileExists(projectPath, 'turbo.json')) {
186
- tooling.monorepo = 'turborepo';
187
- }
188
- else if (await fileExists(projectPath, 'nx.json')) {
189
- tooling.monorepo = 'nx';
190
- }
191
- else if (await fileExists(projectPath, 'lerna.json')) {
192
- tooling.monorepo = 'lerna';
193
- }
194
- // Bundlers
195
- const deps = await collectDependencies(projectPath);
196
- if (deps.has('vite')) {
197
- tooling.bundler = 'vite';
198
- }
199
- else if (deps.has('webpack')) {
200
- tooling.bundler = 'webpack';
201
- }
202
- else if (deps.has('esbuild')) {
203
- tooling.bundler = 'esbuild';
204
- }
205
- else if (deps.has('rollup')) {
206
- tooling.bundler = 'rollup';
207
- }
208
- else if (deps.has('tsup')) {
209
- tooling.bundler = 'tsup';
210
- }
211
- else if (deps.has('turbopack')) {
212
- tooling.bundler = 'turbopack';
213
- }
214
- // Testing
215
- if (deps.has('vitest')) {
216
- tooling.testing = 'vitest';
217
- }
218
- else if (deps.has('jest')) {
219
- tooling.testing = 'jest';
220
- }
221
- else if (deps.has('mocha')) {
222
- tooling.testing = 'mocha';
223
- }
224
- else if (await fileExists(projectPath, 'pytest.ini')) {
225
- tooling.testing = 'pytest';
226
- }
227
- else if (await fileExists(projectPath, 'Cargo.toml')) {
228
- tooling.testing = 'cargo-test';
229
- }
230
- return tooling;
231
- }
1
+ // Planu — Analyzer Detectors barrel re-export (SOLID split)
2
+ // Implementation moved to src/engine/analyzer/ subdirectory
3
+ export { analyzeLinting, detectConventions, detectEnvironments, detectExternalServices, detectTooling, } from './analyzer/detectors.js';
232
4
  //# sourceMappingURL=analyzer-detectors.js.map