@planu/cli 0.24.0 → 0.26.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 (374) hide show
  1. package/dist/config/ai-model-pricing.json +81 -0
  2. package/dist/config/framework-registry/csharp-aspnet.json +67 -0
  3. package/dist/config/framework-registry/dart-flutter.json +61 -0
  4. package/dist/config/framework-registry/go-gin.json +62 -0
  5. package/dist/config/framework-registry/index.json +164 -0
  6. package/dist/config/framework-registry/java-springboot.json +67 -0
  7. package/dist/config/framework-registry/php-laravel.json +67 -0
  8. package/dist/config/framework-registry/python-django.json +72 -0
  9. package/dist/config/framework-registry/python-fastapi.json +72 -0
  10. package/dist/config/framework-registry/ruby-rails.json +67 -0
  11. package/dist/config/framework-registry/rust-actix.json +61 -0
  12. package/dist/config/framework-registry/swift-swiftui.json +67 -0
  13. package/dist/config/framework-registry/typescript-angular.json +67 -0
  14. package/dist/config/framework-registry/typescript-astro.json +61 -0
  15. package/dist/config/framework-registry/typescript-express.json +67 -0
  16. package/dist/config/framework-registry/typescript-nestjs.json +62 -0
  17. package/dist/config/framework-registry/typescript-nextjs.json +82 -0
  18. package/dist/config/framework-registry/typescript-nuxt.json +67 -0
  19. package/dist/config/framework-registry/typescript-react.json +77 -0
  20. package/dist/config/framework-registry/typescript-remix.json +61 -0
  21. package/dist/config/framework-registry/typescript-sveltekit.json +67 -0
  22. package/dist/config/framework-registry/typescript-vue.json +72 -0
  23. package/dist/config/license-plans.json +23 -3
  24. package/dist/engine/agile-config-builder.d.ts.map +1 -1
  25. package/dist/engine/agile-config-builder.js +3 -0
  26. package/dist/engine/agile-config-builder.js.map +1 -1
  27. package/dist/engine/ai-cost-estimator/core.d.ts +8 -0
  28. package/dist/engine/ai-cost-estimator/core.d.ts.map +1 -0
  29. package/dist/engine/ai-cost-estimator/core.js +257 -0
  30. package/dist/engine/ai-cost-estimator/core.js.map +1 -0
  31. package/dist/engine/ai-cost-estimator/index.d.ts +4 -0
  32. package/dist/engine/ai-cost-estimator/index.d.ts.map +1 -0
  33. package/dist/engine/ai-cost-estimator/index.js +5 -0
  34. package/dist/engine/ai-cost-estimator/index.js.map +1 -0
  35. package/dist/engine/ai-cost-estimator/model-pricing.d.ts +31 -0
  36. package/dist/engine/ai-cost-estimator/model-pricing.d.ts.map +1 -0
  37. package/dist/engine/ai-cost-estimator/model-pricing.js +96 -0
  38. package/dist/engine/ai-cost-estimator/model-pricing.js.map +1 -0
  39. package/dist/engine/ai-cost-estimator/token-estimator.d.ts +37 -0
  40. package/dist/engine/ai-cost-estimator/token-estimator.d.ts.map +1 -0
  41. package/dist/engine/ai-cost-estimator/token-estimator.js +194 -0
  42. package/dist/engine/ai-cost-estimator/token-estimator.js.map +1 -0
  43. package/dist/engine/ci-generator/context-builders.d.ts +4 -0
  44. package/dist/engine/ci-generator/context-builders.d.ts.map +1 -0
  45. package/dist/engine/ci-generator/context-builders.js +129 -0
  46. package/dist/engine/ci-generator/context-builders.js.map +1 -0
  47. package/dist/engine/ci-generator/index.d.ts +7 -0
  48. package/dist/engine/ci-generator/index.d.ts.map +1 -0
  49. package/dist/engine/ci-generator/index.js +44 -0
  50. package/dist/engine/ci-generator/index.js.map +1 -0
  51. package/dist/engine/ci-generator/stack-detector.d.ts +21 -0
  52. package/dist/engine/ci-generator/stack-detector.d.ts.map +1 -0
  53. package/dist/engine/ci-generator/stack-detector.js +203 -0
  54. package/dist/engine/ci-generator/stack-detector.js.map +1 -0
  55. package/dist/engine/ci-generator/yaml-builder.d.ts +8 -0
  56. package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -0
  57. package/dist/engine/ci-generator/yaml-builder.js +285 -0
  58. package/dist/engine/ci-generator/yaml-builder.js.map +1 -0
  59. package/dist/engine/dashboard/data-loader.d.ts +21 -0
  60. package/dist/engine/dashboard/data-loader.d.ts.map +1 -0
  61. package/dist/engine/dashboard/data-loader.js +196 -0
  62. package/dist/engine/dashboard/data-loader.js.map +1 -0
  63. package/dist/engine/dashboard/index.d.ts +5 -0
  64. package/dist/engine/dashboard/index.d.ts.map +1 -0
  65. package/dist/engine/dashboard/index.js +6 -0
  66. package/dist/engine/dashboard/index.js.map +1 -0
  67. package/dist/engine/dashboard/routes.d.ts +4 -0
  68. package/dist/engine/dashboard/routes.d.ts.map +1 -0
  69. package/dist/engine/dashboard/routes.js +120 -0
  70. package/dist/engine/dashboard/routes.js.map +1 -0
  71. package/dist/engine/dashboard/server.d.ts +14 -0
  72. package/dist/engine/dashboard/server.d.ts.map +1 -0
  73. package/dist/engine/dashboard/server.js +88 -0
  74. package/dist/engine/dashboard/server.js.map +1 -0
  75. package/dist/engine/dashboard/templates-layout.d.ts +11 -0
  76. package/dist/engine/dashboard/templates-layout.d.ts.map +1 -0
  77. package/dist/engine/dashboard/templates-layout.js +305 -0
  78. package/dist/engine/dashboard/templates-layout.js.map +1 -0
  79. package/dist/engine/dashboard/templates-project.d.ts +10 -0
  80. package/dist/engine/dashboard/templates-project.d.ts.map +1 -0
  81. package/dist/engine/dashboard/templates-project.js +163 -0
  82. package/dist/engine/dashboard/templates-project.js.map +1 -0
  83. package/dist/engine/dashboard/templates.d.ts +3 -0
  84. package/dist/engine/dashboard/templates.d.ts.map +1 -0
  85. package/dist/engine/dashboard/templates.js +4 -0
  86. package/dist/engine/dashboard/templates.js.map +1 -0
  87. package/dist/engine/focus-tracker.d.ts.map +1 -1
  88. package/dist/engine/focus-tracker.js +1 -0
  89. package/dist/engine/focus-tracker.js.map +1 -1
  90. package/dist/engine/hooks/core.d.ts +26 -0
  91. package/dist/engine/hooks/core.d.ts.map +1 -0
  92. package/dist/engine/hooks/core.js +164 -0
  93. package/dist/engine/hooks/core.js.map +1 -0
  94. package/dist/engine/hooks/git-hook-generator.d.ts +14 -0
  95. package/dist/engine/hooks/git-hook-generator.d.ts.map +1 -0
  96. package/dist/engine/hooks/git-hook-generator.js +119 -0
  97. package/dist/engine/hooks/git-hook-generator.js.map +1 -0
  98. package/dist/engine/hooks/index.d.ts +5 -0
  99. package/dist/engine/hooks/index.d.ts.map +1 -0
  100. package/dist/engine/hooks/index.js +6 -0
  101. package/dist/engine/hooks/index.js.map +1 -0
  102. package/dist/engine/hooks/templates.d.ts +14 -0
  103. package/dist/engine/hooks/templates.d.ts.map +1 -0
  104. package/dist/engine/hooks/templates.js +138 -0
  105. package/dist/engine/hooks/templates.js.map +1 -0
  106. package/dist/engine/hooks/triggers.d.ts +27 -0
  107. package/dist/engine/hooks/triggers.d.ts.map +1 -0
  108. package/dist/engine/hooks/triggers.js +104 -0
  109. package/dist/engine/hooks/triggers.js.map +1 -0
  110. package/dist/engine/registry/core.d.ts +32 -0
  111. package/dist/engine/registry/core.d.ts.map +1 -0
  112. package/dist/engine/registry/core.js +85 -0
  113. package/dist/engine/registry/core.js.map +1 -0
  114. package/dist/engine/registry/index.d.ts +6 -0
  115. package/dist/engine/registry/index.d.ts.map +1 -0
  116. package/dist/engine/registry/index.js +8 -0
  117. package/dist/engine/registry/index.js.map +1 -0
  118. package/dist/engine/registry/loader.d.ts +18 -0
  119. package/dist/engine/registry/loader.d.ts.map +1 -0
  120. package/dist/engine/registry/loader.js +81 -0
  121. package/dist/engine/registry/loader.js.map +1 -0
  122. package/dist/engine/registry/matcher.d.ts +19 -0
  123. package/dist/engine/registry/matcher.d.ts.map +1 -0
  124. package/dist/engine/registry/matcher.js +150 -0
  125. package/dist/engine/registry/matcher.js.map +1 -0
  126. package/dist/engine/registry/reporter.d.ts +10 -0
  127. package/dist/engine/registry/reporter.d.ts.map +1 -0
  128. package/dist/engine/registry/reporter.js +132 -0
  129. package/dist/engine/registry/reporter.js.map +1 -0
  130. package/dist/engine/registry/validator.d.ts +17 -0
  131. package/dist/engine/registry/validator.d.ts.map +1 -0
  132. package/dist/engine/registry/validator.js +103 -0
  133. package/dist/engine/registry/validator.js.map +1 -0
  134. package/dist/engine/spec-changelog/core.d.ts +16 -0
  135. package/dist/engine/spec-changelog/core.d.ts.map +1 -0
  136. package/dist/engine/spec-changelog/core.js +175 -0
  137. package/dist/engine/spec-changelog/core.js.map +1 -0
  138. package/dist/engine/spec-changelog/diff.d.ts +18 -0
  139. package/dist/engine/spec-changelog/diff.d.ts.map +1 -0
  140. package/dist/engine/spec-changelog/diff.js +116 -0
  141. package/dist/engine/spec-changelog/diff.js.map +1 -0
  142. package/dist/engine/spec-changelog/index.d.ts +3 -0
  143. package/dist/engine/spec-changelog/index.d.ts.map +1 -0
  144. package/dist/engine/spec-changelog/index.js +4 -0
  145. package/dist/engine/spec-changelog/index.js.map +1 -0
  146. package/dist/engine/spec-coverage/core.d.ts +14 -0
  147. package/dist/engine/spec-coverage/core.d.ts.map +1 -0
  148. package/dist/engine/spec-coverage/core.js +132 -0
  149. package/dist/engine/spec-coverage/core.js.map +1 -0
  150. package/dist/engine/spec-coverage/criteria-mapper.d.ts +18 -0
  151. package/dist/engine/spec-coverage/criteria-mapper.d.ts.map +1 -0
  152. package/dist/engine/spec-coverage/criteria-mapper.js +306 -0
  153. package/dist/engine/spec-coverage/criteria-mapper.js.map +1 -0
  154. package/dist/engine/spec-coverage/index.d.ts +4 -0
  155. package/dist/engine/spec-coverage/index.d.ts.map +1 -0
  156. package/dist/engine/spec-coverage/index.js +5 -0
  157. package/dist/engine/spec-coverage/index.js.map +1 -0
  158. package/dist/engine/spec-coverage/test-finder.d.ts +17 -0
  159. package/dist/engine/spec-coverage/test-finder.d.ts.map +1 -0
  160. package/dist/engine/spec-coverage/test-finder.js +250 -0
  161. package/dist/engine/spec-coverage/test-finder.js.map +1 -0
  162. package/dist/engine/spec-templates/catalog-extra.d.ts +4 -0
  163. package/dist/engine/spec-templates/catalog-extra.d.ts.map +1 -0
  164. package/dist/engine/spec-templates/catalog-extra.js +367 -0
  165. package/dist/engine/spec-templates/catalog-extra.js.map +1 -0
  166. package/dist/engine/spec-templates/catalog.d.ts +4 -0
  167. package/dist/engine/spec-templates/catalog.d.ts.map +1 -0
  168. package/dist/engine/spec-templates/catalog.js +386 -0
  169. package/dist/engine/spec-templates/catalog.js.map +1 -0
  170. package/dist/engine/spec-templates/index.d.ts +4 -0
  171. package/dist/engine/spec-templates/index.d.ts.map +1 -0
  172. package/dist/engine/spec-templates/index.js +5 -0
  173. package/dist/engine/spec-templates/index.js.map +1 -0
  174. package/dist/engine/spec-templates/query.d.ts +14 -0
  175. package/dist/engine/spec-templates/query.d.ts.map +1 -0
  176. package/dist/engine/spec-templates/query.js +56 -0
  177. package/dist/engine/spec-templates/query.js.map +1 -0
  178. package/dist/engine/spec-templates/renderer.d.ts +19 -0
  179. package/dist/engine/spec-templates/renderer.d.ts.map +1 -0
  180. package/dist/engine/spec-templates/renderer.js +45 -0
  181. package/dist/engine/spec-templates/renderer.js.map +1 -0
  182. package/dist/engine/usage-tracker/trial.d.ts +4 -4
  183. package/dist/engine/usage-tracker/trial.d.ts.map +1 -1
  184. package/dist/engine/usage-tracker/trial.js +4 -4
  185. package/dist/engine/usage-tracker/trial.js.map +1 -1
  186. package/dist/engine/webhook/event-handlers.d.ts +25 -0
  187. package/dist/engine/webhook/event-handlers.d.ts.map +1 -0
  188. package/dist/engine/webhook/event-handlers.js +89 -0
  189. package/dist/engine/webhook/event-handlers.js.map +1 -0
  190. package/dist/engine/webhook/index.d.ts +4 -0
  191. package/dist/engine/webhook/index.d.ts.map +1 -0
  192. package/dist/engine/webhook/index.js +5 -0
  193. package/dist/engine/webhook/index.js.map +1 -0
  194. package/dist/engine/webhook/server.d.ts +18 -0
  195. package/dist/engine/webhook/server.d.ts.map +1 -0
  196. package/dist/engine/webhook/server.js +187 -0
  197. package/dist/engine/webhook/server.js.map +1 -0
  198. package/dist/engine/webhook/signature.d.ts +16 -0
  199. package/dist/engine/webhook/signature.d.ts.map +1 -0
  200. package/dist/engine/webhook/signature.js +49 -0
  201. package/dist/engine/webhook/signature.js.map +1 -0
  202. package/dist/index.js +18 -0
  203. package/dist/index.js.map +1 -1
  204. package/dist/storage/hooks-store.d.ts +34 -0
  205. package/dist/storage/hooks-store.d.ts.map +1 -0
  206. package/dist/storage/hooks-store.js +128 -0
  207. package/dist/storage/hooks-store.js.map +1 -0
  208. package/dist/storage/index.d.ts +1 -0
  209. package/dist/storage/index.d.ts.map +1 -1
  210. package/dist/storage/index.js +1 -0
  211. package/dist/storage/index.js.map +1 -1
  212. package/dist/tools/check-spec-accuracy.d.ts +7 -0
  213. package/dist/tools/check-spec-accuracy.d.ts.map +1 -0
  214. package/dist/tools/check-spec-accuracy.js +28 -0
  215. package/dist/tools/check-spec-accuracy.js.map +1 -0
  216. package/dist/tools/ci-generator.d.ts +7 -0
  217. package/dist/tools/ci-generator.d.ts.map +1 -0
  218. package/dist/tools/ci-generator.js +49 -0
  219. package/dist/tools/ci-generator.js.map +1 -0
  220. package/dist/tools/create-spec.d.ts.map +1 -1
  221. package/dist/tools/create-spec.js +4 -0
  222. package/dist/tools/create-spec.js.map +1 -1
  223. package/dist/tools/dashboard.d.ts +6 -0
  224. package/dist/tools/dashboard.d.ts.map +1 -0
  225. package/dist/tools/dashboard.js +48 -0
  226. package/dist/tools/dashboard.js.map +1 -0
  227. package/dist/tools/detect-drift.d.ts.map +1 -1
  228. package/dist/tools/detect-drift.js +6 -0
  229. package/dist/tools/detect-drift.js.map +1 -1
  230. package/dist/tools/estimate-ai-cost.d.ts +8 -0
  231. package/dist/tools/estimate-ai-cost.d.ts.map +1 -0
  232. package/dist/tools/estimate-ai-cost.js +29 -0
  233. package/dist/tools/estimate-ai-cost.js.map +1 -0
  234. package/dist/tools/list-specs.d.ts.map +1 -1
  235. package/dist/tools/list-specs.js +15 -0
  236. package/dist/tools/list-specs.js.map +1 -1
  237. package/dist/tools/manage-hooks.d.ts +5 -0
  238. package/dist/tools/manage-hooks.d.ts.map +1 -0
  239. package/dist/tools/manage-hooks.js +247 -0
  240. package/dist/tools/manage-hooks.js.map +1 -0
  241. package/dist/tools/reconcile-spec.d.ts.map +1 -1
  242. package/dist/tools/reconcile-spec.js +24 -0
  243. package/dist/tools/reconcile-spec.js.map +1 -1
  244. package/dist/tools/register-ai-cost-tools.d.ts +3 -0
  245. package/dist/tools/register-ai-cost-tools.d.ts.map +1 -0
  246. package/dist/tools/register-ai-cost-tools.js +25 -0
  247. package/dist/tools/register-ai-cost-tools.js.map +1 -0
  248. package/dist/tools/register-changelog-tools.d.ts +3 -0
  249. package/dist/tools/register-changelog-tools.d.ts.map +1 -0
  250. package/dist/tools/register-changelog-tools.js +23 -0
  251. package/dist/tools/register-changelog-tools.js.map +1 -0
  252. package/dist/tools/register-ci-tools.d.ts +3 -0
  253. package/dist/tools/register-ci-tools.d.ts.map +1 -0
  254. package/dist/tools/register-ci-tools.js +50 -0
  255. package/dist/tools/register-ci-tools.js.map +1 -0
  256. package/dist/tools/register-coverage-tools.d.ts +7 -0
  257. package/dist/tools/register-coverage-tools.d.ts.map +1 -0
  258. package/dist/tools/register-coverage-tools.js +27 -0
  259. package/dist/tools/register-coverage-tools.js.map +1 -0
  260. package/dist/tools/register-dashboard-tools.d.ts +3 -0
  261. package/dist/tools/register-dashboard-tools.d.ts.map +1 -0
  262. package/dist/tools/register-dashboard-tools.js +29 -0
  263. package/dist/tools/register-dashboard-tools.js.map +1 -0
  264. package/dist/tools/register-hooks-tools.d.ts +3 -0
  265. package/dist/tools/register-hooks-tools.d.ts.map +1 -0
  266. package/dist/tools/register-hooks-tools.js +107 -0
  267. package/dist/tools/register-hooks-tools.js.map +1 -0
  268. package/dist/tools/register-registry-tools.d.ts +3 -0
  269. package/dist/tools/register-registry-tools.d.ts.map +1 -0
  270. package/dist/tools/register-registry-tools.js +43 -0
  271. package/dist/tools/register-registry-tools.js.map +1 -0
  272. package/dist/tools/register-template-tools.d.ts +8 -0
  273. package/dist/tools/register-template-tools.d.ts.map +1 -0
  274. package/dist/tools/register-template-tools.js +71 -0
  275. package/dist/tools/register-template-tools.js.map +1 -0
  276. package/dist/tools/register-webhook-tools.d.ts +3 -0
  277. package/dist/tools/register-webhook-tools.d.ts.map +1 -0
  278. package/dist/tools/register-webhook-tools.js +49 -0
  279. package/dist/tools/register-webhook-tools.js.map +1 -0
  280. package/dist/tools/schemas/index.d.ts +1 -0
  281. package/dist/tools/schemas/index.d.ts.map +1 -1
  282. package/dist/tools/schemas/index.js +1 -0
  283. package/dist/tools/schemas/index.js.map +1 -1
  284. package/dist/tools/schemas/registry.d.ts +41 -0
  285. package/dist/tools/schemas/registry.d.ts.map +1 -0
  286. package/dist/tools/schemas/registry.js +62 -0
  287. package/dist/tools/schemas/registry.js.map +1 -0
  288. package/dist/tools/spec-coverage.d.ts +3 -0
  289. package/dist/tools/spec-coverage.d.ts.map +1 -0
  290. package/dist/tools/spec-coverage.js +176 -0
  291. package/dist/tools/spec-coverage.js.map +1 -0
  292. package/dist/tools/spec-history.d.ts +3 -0
  293. package/dist/tools/spec-history.d.ts.map +1 -0
  294. package/dist/tools/spec-history.js +67 -0
  295. package/dist/tools/spec-history.js.map +1 -0
  296. package/dist/tools/spec-templates.d.ts +10 -0
  297. package/dist/tools/spec-templates.d.ts.map +1 -0
  298. package/dist/tools/spec-templates.js +155 -0
  299. package/dist/tools/spec-templates.js.map +1 -0
  300. package/dist/tools/update-registry.d.ts +8 -0
  301. package/dist/tools/update-registry.d.ts.map +1 -0
  302. package/dist/tools/update-registry.js +53 -0
  303. package/dist/tools/update-registry.js.map +1 -0
  304. package/dist/tools/update-status.d.ts.map +1 -1
  305. package/dist/tools/update-status.js +24 -0
  306. package/dist/tools/update-status.js.map +1 -1
  307. package/dist/tools/webhook.d.ts +6 -0
  308. package/dist/tools/webhook.d.ts.map +1 -0
  309. package/dist/tools/webhook.js +150 -0
  310. package/dist/tools/webhook.js.map +1 -0
  311. package/dist/types/ai-cost.d.ts +98 -0
  312. package/dist/types/ai-cost.d.ts.map +1 -0
  313. package/dist/types/ai-cost.js +4 -0
  314. package/dist/types/ai-cost.js.map +1 -0
  315. package/dist/types/analysis.d.ts +64 -0
  316. package/dist/types/analysis.d.ts.map +1 -1
  317. package/dist/types/changelog.d.ts +49 -0
  318. package/dist/types/changelog.d.ts.map +1 -0
  319. package/dist/types/changelog.js +3 -0
  320. package/dist/types/changelog.js.map +1 -0
  321. package/dist/types/ci.d.ts +105 -0
  322. package/dist/types/ci.d.ts.map +1 -0
  323. package/dist/types/ci.js +3 -0
  324. package/dist/types/ci.js.map +1 -0
  325. package/dist/types/coverage.d.ts +95 -0
  326. package/dist/types/coverage.d.ts.map +1 -0
  327. package/dist/types/coverage.js +4 -0
  328. package/dist/types/coverage.js.map +1 -0
  329. package/dist/types/hooks.d.ts +139 -0
  330. package/dist/types/hooks.d.ts.map +1 -0
  331. package/dist/types/hooks.js +3 -0
  332. package/dist/types/hooks.js.map +1 -0
  333. package/dist/types/index.d.ts +8 -0
  334. package/dist/types/index.d.ts.map +1 -1
  335. package/dist/types/index.js +8 -0
  336. package/dist/types/index.js.map +1 -1
  337. package/dist/types/registry.d.ts +90 -0
  338. package/dist/types/registry.d.ts.map +1 -0
  339. package/dist/types/registry.js +5 -0
  340. package/dist/types/registry.js.map +1 -0
  341. package/dist/types/spec-templates.d.ts +87 -0
  342. package/dist/types/spec-templates.d.ts.map +1 -0
  343. package/dist/types/spec-templates.js +3 -0
  344. package/dist/types/spec-templates.js.map +1 -0
  345. package/dist/types/ui.d.ts +76 -0
  346. package/dist/types/ui.d.ts.map +1 -1
  347. package/dist/types/webhook.d.ts +62 -0
  348. package/dist/types/webhook.d.ts.map +1 -0
  349. package/dist/types/webhook.js +4 -0
  350. package/dist/types/webhook.js.map +1 -0
  351. package/package.json +1 -1
  352. package/src/config/ai-model-pricing.json +81 -0
  353. package/src/config/framework-registry/csharp-aspnet.json +67 -0
  354. package/src/config/framework-registry/dart-flutter.json +61 -0
  355. package/src/config/framework-registry/go-gin.json +62 -0
  356. package/src/config/framework-registry/index.json +164 -0
  357. package/src/config/framework-registry/java-springboot.json +67 -0
  358. package/src/config/framework-registry/php-laravel.json +67 -0
  359. package/src/config/framework-registry/python-django.json +72 -0
  360. package/src/config/framework-registry/python-fastapi.json +72 -0
  361. package/src/config/framework-registry/ruby-rails.json +67 -0
  362. package/src/config/framework-registry/rust-actix.json +61 -0
  363. package/src/config/framework-registry/swift-swiftui.json +67 -0
  364. package/src/config/framework-registry/typescript-angular.json +67 -0
  365. package/src/config/framework-registry/typescript-astro.json +61 -0
  366. package/src/config/framework-registry/typescript-express.json +67 -0
  367. package/src/config/framework-registry/typescript-nestjs.json +62 -0
  368. package/src/config/framework-registry/typescript-nextjs.json +82 -0
  369. package/src/config/framework-registry/typescript-nuxt.json +67 -0
  370. package/src/config/framework-registry/typescript-react.json +77 -0
  371. package/src/config/framework-registry/typescript-remix.json +61 -0
  372. package/src/config/framework-registry/typescript-sveltekit.json +67 -0
  373. package/src/config/framework-registry/typescript-vue.json +72 -0
  374. package/src/config/license-plans.json +23 -3
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12",
3
+ "version": "1.0.0",
4
+ "lastUpdated": "2026-03-04",
5
+ "models": [
6
+ {
7
+ "id": "claude-opus-4",
8
+ "displayName": "Claude Opus 4",
9
+ "provider": "Anthropic",
10
+ "inputPricePerMillion": 15.0,
11
+ "outputPricePerMillion": 75.0,
12
+ "avgThroughputLOCPerTurn": 150,
13
+ "contextWindowK": 200
14
+ },
15
+ {
16
+ "id": "claude-sonnet-4",
17
+ "displayName": "Claude Sonnet 4",
18
+ "provider": "Anthropic",
19
+ "inputPricePerMillion": 3.0,
20
+ "outputPricePerMillion": 15.0,
21
+ "avgThroughputLOCPerTurn": 120,
22
+ "contextWindowK": 200
23
+ },
24
+ {
25
+ "id": "claude-haiku-3-5",
26
+ "displayName": "Claude Haiku 3.5",
27
+ "provider": "Anthropic",
28
+ "inputPricePerMillion": 0.25,
29
+ "outputPricePerMillion": 1.25,
30
+ "avgThroughputLOCPerTurn": 80,
31
+ "contextWindowK": 200
32
+ },
33
+ {
34
+ "id": "gpt-4o",
35
+ "displayName": "GPT-4o",
36
+ "provider": "OpenAI",
37
+ "inputPricePerMillion": 2.5,
38
+ "outputPricePerMillion": 10.0,
39
+ "avgThroughputLOCPerTurn": 110,
40
+ "contextWindowK": 128
41
+ },
42
+ {
43
+ "id": "gpt-4-1",
44
+ "displayName": "GPT-4.1",
45
+ "provider": "OpenAI",
46
+ "inputPricePerMillion": 2.0,
47
+ "outputPricePerMillion": 8.0,
48
+ "avgThroughputLOCPerTurn": 110,
49
+ "contextWindowK": 128
50
+ },
51
+ {
52
+ "id": "gemini-2-5-pro",
53
+ "displayName": "Gemini 2.5 Pro",
54
+ "provider": "Google",
55
+ "inputPricePerMillion": 1.25,
56
+ "outputPricePerMillion": 10.0,
57
+ "avgThroughputLOCPerTurn": 100,
58
+ "contextWindowK": 1000
59
+ }
60
+ ],
61
+ "languageTokenRatios": {
62
+ "typescript": 3.5,
63
+ "javascript": 3.5,
64
+ "python": 3.2,
65
+ "go": 3.0,
66
+ "rust": 3.3,
67
+ "java": 3.1,
68
+ "kotlin": 3.1,
69
+ "swift": 3.2,
70
+ "ruby": 3.0,
71
+ "php": 3.0,
72
+ "csharp": 3.1,
73
+ "dart": 3.1,
74
+ "default": 3.2
75
+ },
76
+ "constants": {
77
+ "toolDefinitionsOverheadTokens": 4000,
78
+ "charsPerToken": 3.5,
79
+ "avgLOCChars": 45
80
+ }
81
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "framework": "aspnet",
3
+ "displayName": "ASP.NET Core",
4
+ "frameworkVersion": "8.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "csharp",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "Minimal APIs para endpoints simples en .NET 8",
11
+ "example": "app.MapGet('/users', async (AppDbContext db) => await db.Users.ToListAsync());",
12
+ "since": "6.0"
13
+ },
14
+ {
15
+ "pattern": "Dependency Injection via constructor en controllers",
16
+ "example": "public class UserController : ControllerBase { public UserController(IUserService svc) { _svc = svc; } }",
17
+ "since": "1.0"
18
+ },
19
+ {
20
+ "pattern": "IActionResult o ActionResult<T> para respuestas tipadas",
21
+ "example": "public async Task<ActionResult<User>> GetUser(int id) { var user = await _db.Users.FindAsync(id); return user is null ? NotFound() : Ok(user); }",
22
+ "since": "2.1"
23
+ },
24
+ {
25
+ "pattern": "appsettings.json con IConfiguration para configuracion",
26
+ "example": "var conn = builder.Configuration.GetConnectionString('Default');",
27
+ "since": "1.0"
28
+ },
29
+ {
30
+ "pattern": "Middleware pipeline con app.Use() y app.Map()",
31
+ "example": "app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();",
32
+ "since": "1.0"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "System.Web namespace de ASP.NET Framework clasico",
38
+ "replacedBy": "Microsoft.AspNetCore namespace en ASP.NET Core",
39
+ "severity": "error"
40
+ },
41
+ {
42
+ "pattern": "Global.asax para startup en ASP.NET MVC clasico",
43
+ "replacedBy": "Program.cs con WebApplication.CreateBuilder() en ASP.NET Core",
44
+ "severity": "error"
45
+ }
46
+ ],
47
+ "commonMistakes": [
48
+ {
49
+ "pattern": "Registrar servicios como Singleton cuando deben ser Scoped",
50
+ "example": "builder.Services.AddSingleton<DbContext>() — DbContext debe ser Scoped",
51
+ "replacedBy": "builder.Services.AddDbContext<AppDbContext>() — AddDbContext usa Scoped por defecto",
52
+ "severity": "error"
53
+ },
54
+ {
55
+ "pattern": "No usar async/await en controladores con operaciones de I/O",
56
+ "example": "public IActionResult GetData() { return Ok(_db.Users.ToList()); } — bloquea el thread",
57
+ "replacedBy": "public async Task<IActionResult> GetData() { return Ok(await _db.Users.ToListAsync()); }",
58
+ "severity": "warning"
59
+ },
60
+ {
61
+ "pattern": "Poner logica de negocio en el controller",
62
+ "example": "Validaciones complejas, calculos de negocio directo en el action method",
63
+ "replacedBy": "Usar Service Layer o Command/Query handlers (CQRS)",
64
+ "severity": "warning"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "framework": "flutter",
3
+ "displayName": "Flutter",
4
+ "frameworkVersion": "3.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "dart",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "StatefulWidget con setState() para estado local",
11
+ "example": "class CounterPage extends StatefulWidget { ... } class _CounterPageState extends State<CounterPage> { int _count = 0; void _inc() { setState(() { _count++; }); } }",
12
+ "since": "1.0"
13
+ },
14
+ {
15
+ "pattern": "Navigator 2.0 con GoRouter para navegacion",
16
+ "example": "GoRouter(routes: [GoRoute(path: '/', builder: (ctx, state) => const HomePage())]);",
17
+ "since": "2.0"
18
+ },
19
+ {
20
+ "pattern": "BuildContext para acceder a Theme y MediaQuery",
21
+ "example": "Theme.of(context).colorScheme.primary; MediaQuery.of(context).size.width;",
22
+ "since": "1.0"
23
+ },
24
+ {
25
+ "pattern": "const widgets para performance — evitar rebuilds innecesarios",
26
+ "example": "const Text('Hello'); const SizedBox(height: 16);",
27
+ "since": "1.0"
28
+ },
29
+ {
30
+ "pattern": "Riverpod o Bloc para estado global",
31
+ "example": "final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) => CounterNotifier());",
32
+ "since": "2.0"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "Navigator 1.0 para navegacion en apps complejas",
38
+ "replacedBy": "GoRouter o Router 2.0 para deep linking y web support",
39
+ "severity": "warning"
40
+ },
41
+ {
42
+ "pattern": "setState() para estado global compartido entre widgets",
43
+ "replacedBy": "Riverpod, Bloc, o Provider para estado global",
44
+ "severity": "warning"
45
+ }
46
+ ],
47
+ "commonMistakes": [
48
+ {
49
+ "pattern": "Llamar setState() en un widget desmontado",
50
+ "example": "await Future.delayed(duration); setState(() { ... }); — puede correr despues del dispose",
51
+ "replacedBy": "Verificar mounted antes: if (mounted) setState(() { ... });",
52
+ "severity": "error"
53
+ },
54
+ {
55
+ "pattern": "Crear objetos en build() sin memoizacion",
56
+ "example": "Widget build(ctx) { final style = TextStyle(fontSize: 16); ... } — se crea en cada rebuild",
57
+ "replacedBy": "Definir como constante de clase o usar const TextStyle(fontSize: 16)",
58
+ "severity": "warning"
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "framework": "gin",
3
+ "displayName": "Gin",
4
+ "frameworkVersion": "1.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "go",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "gin.New() con middleware explicito para produccion",
11
+ "example": "r := gin.New(); r.Use(gin.Logger()); r.Use(gin.Recovery());",
12
+ "since": "1.0"
13
+ },
14
+ {
15
+ "pattern": "ShouldBindJSON para parsear request body",
16
+ "example": "var req CreateUserRequest; if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{\"error\": err.Error()}); return }",
17
+ "since": "1.0"
18
+ },
19
+ {
20
+ "pattern": "RouterGroup para agrupar rutas con prefijo",
21
+ "example": "api := r.Group('/api/v1'); api.GET('/users', handler);",
22
+ "since": "1.0"
23
+ },
24
+ {
25
+ "pattern": "c.JSON() para respuestas JSON",
26
+ "example": "c.JSON(http.StatusOK, gin.H{\"data\": users})",
27
+ "since": "1.0"
28
+ },
29
+ {
30
+ "pattern": "Middleware personalizado como HandlerFunc",
31
+ "example": "func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { ...; c.Next() } }",
32
+ "since": "1.0"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "gin.Default() en produccion (incluye Logger y Recovery por defecto)",
38
+ "replacedBy": "gin.New() con middleware explicito para control total",
39
+ "severity": "info"
40
+ }
41
+ ],
42
+ "commonMistakes": [
43
+ {
44
+ "pattern": "No llamar c.Next() en middleware — la chain se interrumpe",
45
+ "example": "func(c *gin.Context) { authenticate(c); } — sin c.Next() el handler no se ejecuta",
46
+ "replacedBy": "func(c *gin.Context) { if !authenticate(c) { return }; c.Next() }",
47
+ "severity": "error"
48
+ },
49
+ {
50
+ "pattern": "Pasar c *gin.Context a goroutines — unsafe",
51
+ "example": "go func() { processData(c) }() — c no es seguro para uso concurrente",
52
+ "replacedBy": "Copiar los datos necesarios antes de lanzar la goroutine",
53
+ "severity": "error"
54
+ },
55
+ {
56
+ "pattern": "Olvidar return despues de c.JSON() en error paths",
57
+ "example": "c.JSON(400, gin.H{\"error\": \"bad req\"}); // falta return; handler continua",
58
+ "replacedBy": "c.JSON(400, gin.H{\"error\": \"bad req\"}); return",
59
+ "severity": "error"
60
+ }
61
+ ]
62
+ }
@@ -0,0 +1,164 @@
1
+ {
2
+ "frameworks": [
3
+ {
4
+ "id": "nextjs",
5
+ "displayName": "Next.js",
6
+ "ecosystem": "typescript",
7
+ "frameworkVersion": "14.x",
8
+ "lastUpdated": "2026-03-04",
9
+ "file": "typescript-nextjs.json"
10
+ },
11
+ {
12
+ "id": "react",
13
+ "displayName": "React",
14
+ "ecosystem": "typescript",
15
+ "frameworkVersion": "18.x",
16
+ "lastUpdated": "2026-03-04",
17
+ "file": "typescript-react.json"
18
+ },
19
+ {
20
+ "id": "vue",
21
+ "displayName": "Vue",
22
+ "ecosystem": "typescript",
23
+ "frameworkVersion": "3.x",
24
+ "lastUpdated": "2026-03-04",
25
+ "file": "typescript-vue.json"
26
+ },
27
+ {
28
+ "id": "nuxt",
29
+ "displayName": "Nuxt",
30
+ "ecosystem": "typescript",
31
+ "frameworkVersion": "3.x",
32
+ "lastUpdated": "2026-03-04",
33
+ "file": "typescript-nuxt.json"
34
+ },
35
+ {
36
+ "id": "angular",
37
+ "displayName": "Angular",
38
+ "ecosystem": "typescript",
39
+ "frameworkVersion": "17.x",
40
+ "lastUpdated": "2026-03-04",
41
+ "file": "typescript-angular.json"
42
+ },
43
+ {
44
+ "id": "sveltekit",
45
+ "displayName": "SvelteKit",
46
+ "ecosystem": "typescript",
47
+ "frameworkVersion": "2.x",
48
+ "lastUpdated": "2026-03-04",
49
+ "file": "typescript-sveltekit.json"
50
+ },
51
+ {
52
+ "id": "astro",
53
+ "displayName": "Astro",
54
+ "ecosystem": "typescript",
55
+ "frameworkVersion": "4.x",
56
+ "lastUpdated": "2026-03-04",
57
+ "file": "typescript-astro.json"
58
+ },
59
+ {
60
+ "id": "remix",
61
+ "displayName": "Remix",
62
+ "ecosystem": "typescript",
63
+ "frameworkVersion": "2.x",
64
+ "lastUpdated": "2026-03-04",
65
+ "file": "typescript-remix.json"
66
+ },
67
+ {
68
+ "id": "express",
69
+ "displayName": "Express",
70
+ "ecosystem": "typescript",
71
+ "frameworkVersion": "4.x",
72
+ "lastUpdated": "2026-03-04",
73
+ "file": "typescript-express.json"
74
+ },
75
+ {
76
+ "id": "nestjs",
77
+ "displayName": "NestJS",
78
+ "ecosystem": "typescript",
79
+ "frameworkVersion": "10.x",
80
+ "lastUpdated": "2026-03-04",
81
+ "file": "typescript-nestjs.json"
82
+ },
83
+ {
84
+ "id": "django",
85
+ "displayName": "Django",
86
+ "ecosystem": "python",
87
+ "frameworkVersion": "5.x",
88
+ "lastUpdated": "2026-03-04",
89
+ "file": "python-django.json"
90
+ },
91
+ {
92
+ "id": "fastapi",
93
+ "displayName": "FastAPI",
94
+ "ecosystem": "python",
95
+ "frameworkVersion": "0.100+",
96
+ "lastUpdated": "2026-03-04",
97
+ "file": "python-fastapi.json"
98
+ },
99
+ {
100
+ "id": "springboot",
101
+ "displayName": "Spring Boot",
102
+ "ecosystem": "java",
103
+ "frameworkVersion": "3.x",
104
+ "lastUpdated": "2026-03-04",
105
+ "file": "java-springboot.json"
106
+ },
107
+ {
108
+ "id": "rails",
109
+ "displayName": "Rails",
110
+ "ecosystem": "ruby",
111
+ "frameworkVersion": "7.x",
112
+ "lastUpdated": "2026-03-04",
113
+ "file": "ruby-rails.json"
114
+ },
115
+ {
116
+ "id": "laravel",
117
+ "displayName": "Laravel",
118
+ "ecosystem": "php",
119
+ "frameworkVersion": "11.x",
120
+ "lastUpdated": "2026-03-04",
121
+ "file": "php-laravel.json"
122
+ },
123
+ {
124
+ "id": "gin",
125
+ "displayName": "Gin",
126
+ "ecosystem": "go",
127
+ "frameworkVersion": "1.x",
128
+ "lastUpdated": "2026-03-04",
129
+ "file": "go-gin.json"
130
+ },
131
+ {
132
+ "id": "actix",
133
+ "displayName": "Actix-web",
134
+ "ecosystem": "rust",
135
+ "frameworkVersion": "4.x",
136
+ "lastUpdated": "2026-03-04",
137
+ "file": "rust-actix.json"
138
+ },
139
+ {
140
+ "id": "aspnet",
141
+ "displayName": "ASP.NET Core",
142
+ "ecosystem": "csharp",
143
+ "frameworkVersion": "8.x",
144
+ "lastUpdated": "2026-03-04",
145
+ "file": "csharp-aspnet.json"
146
+ },
147
+ {
148
+ "id": "flutter",
149
+ "displayName": "Flutter",
150
+ "ecosystem": "dart",
151
+ "frameworkVersion": "3.x",
152
+ "lastUpdated": "2026-03-04",
153
+ "file": "dart-flutter.json"
154
+ },
155
+ {
156
+ "id": "swiftui",
157
+ "displayName": "SwiftUI",
158
+ "ecosystem": "swift",
159
+ "frameworkVersion": "5.x",
160
+ "lastUpdated": "2026-03-04",
161
+ "file": "swift-swiftui.json"
162
+ }
163
+ ]
164
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "framework": "springboot",
3
+ "displayName": "Spring Boot",
4
+ "frameworkVersion": "3.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "java",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "@SpringBootApplication para clase principal",
11
+ "example": "@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }",
12
+ "since": "1.2"
13
+ },
14
+ {
15
+ "pattern": "@RestController con @RequestMapping para REST endpoints",
16
+ "example": "@RestController @RequestMapping('/api/users') public class UserController { @GetMapping public List<User> list() { ... } }",
17
+ "since": "4.0"
18
+ },
19
+ {
20
+ "pattern": "application.properties / application.yml con perfiles",
21
+ "example": "spring.datasource.url=${DATABASE_URL} — usar variables de entorno en produccion",
22
+ "since": "1.0"
23
+ },
24
+ {
25
+ "pattern": "@Transactional para operaciones de base de datos",
26
+ "example": "@Transactional public void createUser(UserDto dto) { userRepository.save(new User(dto)); }",
27
+ "since": "1.0"
28
+ },
29
+ {
30
+ "pattern": "Spring Data JPA con JpaRepository",
31
+ "example": "public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByEmail(String email); }",
32
+ "since": "1.0"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "XML bean configuration en lugar de anotaciones",
38
+ "replacedBy": "@Bean en @Configuration classes o component scanning",
39
+ "severity": "warning"
40
+ },
41
+ {
42
+ "pattern": "spring.datasource.url formato antiguo Spring Boot 2 con driver legacy",
43
+ "replacedBy": "Usar drivers JDBC modernos y URL de formato estandar JDBC 4.x",
44
+ "severity": "warning"
45
+ }
46
+ ],
47
+ "commonMistakes": [
48
+ {
49
+ "pattern": "Exponer entidades JPA directamente como Response body",
50
+ "example": "@GetMapping public User getUser() { return userRepository.findById(1); } — expone lazily-loaded relations",
51
+ "replacedBy": "Usar DTOs con MapStruct o ModelMapper para mapear la respuesta",
52
+ "severity": "error"
53
+ },
54
+ {
55
+ "pattern": "No usar @Transactional en operaciones de escritura",
56
+ "example": "public void updateUser(User user) { userRepo.save(user); } — sin @Transactional no hay rollback",
57
+ "replacedBy": "@Transactional public void updateUser(User user) { ... }",
58
+ "severity": "warning"
59
+ },
60
+ {
61
+ "pattern": "Inyectar dependencias por campo en lugar de constructor",
62
+ "example": "@Autowired private UserService userService; — dificil de testear",
63
+ "replacedBy": "Constructor injection: private final UserService userService; @Autowired public Controller(UserService s) { this.userService = s; }",
64
+ "severity": "warning"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "framework": "laravel",
3
+ "displayName": "Laravel",
4
+ "frameworkVersion": "11.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "php",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "Eloquent ORM para acceso a base de datos",
11
+ "example": "$users = User::where('active', true)->with('posts')->get();",
12
+ "since": "4.0"
13
+ },
14
+ {
15
+ "pattern": "Route model binding para inyeccion automatica de modelos",
16
+ "example": "Route::get('/users/{user}', function (User $user) { return $user; });",
17
+ "since": "5.0"
18
+ },
19
+ {
20
+ "pattern": "Form Requests para validacion de inputs",
21
+ "example": "class StoreUserRequest extends FormRequest { public function rules(): array { return ['name' => 'required|string']; } }",
22
+ "since": "5.0"
23
+ },
24
+ {
25
+ "pattern": "Artisan commands para CLI tasks",
26
+ "example": "php artisan make:command SendEmails && php artisan send:emails",
27
+ "since": "4.0"
28
+ },
29
+ {
30
+ "pattern": "Folio para page-based routing en Laravel 11",
31
+ "example": "pages/users/[User].php — ruta automatica /users/{user} con Folio",
32
+ "since": "11.0"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "Route::resource con el formato antiguo de Laravel 5",
38
+ "replacedBy": "Route::apiResource para APIs o Route::resource actualizado",
39
+ "severity": "info"
40
+ },
41
+ {
42
+ "pattern": "$request->input() para validacion sin Form Request",
43
+ "replacedBy": "Form Request classes con rules()",
44
+ "severity": "warning"
45
+ }
46
+ ],
47
+ "commonMistakes": [
48
+ {
49
+ "pattern": "N+1 queries con Eloquent sin eager loading",
50
+ "example": "User::all()->each(fn($u) => $u->posts->count()) — N+1",
51
+ "replacedBy": "User::withCount('posts')->get()",
52
+ "severity": "warning"
53
+ },
54
+ {
55
+ "pattern": "Poner logica en rutas en lugar de controllers",
56
+ "example": "Route::get('/users', function() { return User::all(); }) — no escala",
57
+ "replacedBy": "Route::get('/users', [UserController::class, 'index'])",
58
+ "severity": "warning"
59
+ },
60
+ {
61
+ "pattern": "Usar DB::statement() para queries sin bindings parametrizados",
62
+ "example": "DB::statement('SELECT * FROM users WHERE id = ' . $id) — SQL injection",
63
+ "replacedBy": "DB::select('SELECT * FROM users WHERE id = ?', [$id])",
64
+ "severity": "error"
65
+ }
66
+ ]
67
+ }
@@ -0,0 +1,72 @@
1
+ {
2
+ "framework": "django",
3
+ "displayName": "Django",
4
+ "frameworkVersion": "5.x",
5
+ "lastUpdated": "2026-03-04",
6
+ "ecosystem": "python",
7
+ "customEntry": false,
8
+ "correctPatterns": [
9
+ {
10
+ "pattern": "Class-based views con ListView, DetailView, CreateView",
11
+ "example": "class PostListView(ListView): model = Post; template_name = 'posts/list.html'",
12
+ "since": "3.0"
13
+ },
14
+ {
15
+ "pattern": "ORM queryset con select_related y prefetch_related para N+1",
16
+ "example": "Post.objects.select_related('author').prefetch_related('tags').all()",
17
+ "since": "1.0"
18
+ },
19
+ {
20
+ "pattern": "settings.py con SECRET_KEY en variable de entorno",
21
+ "example": "SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'fallback-for-dev-only')",
22
+ "since": "1.0"
23
+ },
24
+ {
25
+ "pattern": "DATABASES con dj-database-url para produccion",
26
+ "example": "DATABASES = {'default': dj_database_url.config(default=os.environ.get('DATABASE_URL'))}",
27
+ "since": "3.0"
28
+ },
29
+ {
30
+ "pattern": "Migraciones con makemigrations y migrate",
31
+ "example": "python manage.py makemigrations && python manage.py migrate",
32
+ "since": "1.7"
33
+ }
34
+ ],
35
+ "deprecatedPatterns": [
36
+ {
37
+ "pattern": "from django.utils.encoding import force_text",
38
+ "replacedBy": "from django.utils.encoding import force_str",
39
+ "severity": "error"
40
+ },
41
+ {
42
+ "pattern": "url() en URLconf de Django < 4",
43
+ "replacedBy": "path() y re_path() en urls.py",
44
+ "severity": "error"
45
+ },
46
+ {
47
+ "pattern": "ugettext() y ugettext_lazy()",
48
+ "replacedBy": "gettext() y gettext_lazy()",
49
+ "severity": "error"
50
+ }
51
+ ],
52
+ "commonMistakes": [
53
+ {
54
+ "pattern": "DEBUG=True en produccion",
55
+ "example": "DEBUG = True en settings.py de produccion — expone stack traces y datos sensibles",
56
+ "replacedBy": "DEBUG = os.environ.get('DEBUG', 'False') == 'True'",
57
+ "severity": "error"
58
+ },
59
+ {
60
+ "pattern": "Queryset evaluation en bucles (N+1 problem)",
61
+ "example": "for post in Post.objects.all(): print(post.author.name) — N+1 queries",
62
+ "replacedBy": "Post.objects.select_related('author').all()",
63
+ "severity": "warning"
64
+ },
65
+ {
66
+ "pattern": "Usar models sin null=True ni blank=True para CharField opcional",
67
+ "example": "description = models.CharField(max_length=200) — si puede estar vacio necesita blank=True",
68
+ "replacedBy": "description = models.CharField(max_length=200, blank=True, default='')",
69
+ "severity": "warning"
70
+ }
71
+ ]
72
+ }