@mytechtoday/augment-extensions 0.7.0 → 1.2.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 (483) hide show
  1. package/AGENTS.md +265 -232
  2. package/README.md +956 -771
  3. package/augment-extensions/coding-standards/bash/README.md +196 -196
  4. package/augment-extensions/coding-standards/bash/module.json +163 -163
  5. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
  6. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
  7. package/augment-extensions/coding-standards/css/README.md +40 -40
  8. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
  9. package/augment-extensions/coding-standards/css/module.json +44 -44
  10. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
  11. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
  12. package/augment-extensions/coding-standards/html/README.md +40 -40
  13. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
  14. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
  15. package/augment-extensions/coding-standards/html/module.json +44 -44
  16. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
  17. package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
  18. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
  19. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
  20. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
  21. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
  22. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
  23. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
  24. package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
  25. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
  27. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
  28. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
  29. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
  30. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
  31. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
  32. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
  33. package/augment-extensions/coding-standards/js/README.md +46 -46
  34. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
  35. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
  36. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
  37. package/augment-extensions/coding-standards/js/module.json +49 -49
  38. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
  39. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
  40. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
  41. package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
  42. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
  43. package/augment-extensions/coding-standards/php/README.md +248 -248
  44. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
  45. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
  46. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
  47. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
  48. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
  49. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
  50. package/augment-extensions/coding-standards/php/module.json +166 -166
  51. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
  52. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
  53. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
  54. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
  55. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
  56. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
  57. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
  58. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
  59. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
  60. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
  61. package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
  62. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
  63. package/augment-extensions/coding-standards/php/rules/security.md +358 -358
  64. package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
  65. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
  66. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
  67. package/augment-extensions/coding-standards/powershell/README.md +154 -154
  68. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
  69. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
  70. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
  71. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
  72. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
  73. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
  74. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
  75. package/augment-extensions/coding-standards/powershell/module.json +165 -165
  76. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
  77. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
  78. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
  79. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
  80. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
  81. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
  82. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
  83. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
  84. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
  85. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
  86. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
  87. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
  88. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
  89. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
  90. package/augment-extensions/coding-standards/python/README.md +48 -48
  91. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
  92. package/augment-extensions/coding-standards/python/module.json +30 -30
  93. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
  94. package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
  95. package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
  96. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
  97. package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
  98. package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
  99. package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
  100. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
  101. package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
  102. package/augment-extensions/coding-standards/react/README.md +45 -45
  103. package/augment-extensions/coding-standards/react/module.json +27 -27
  104. package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
  105. package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
  106. package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
  107. package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
  108. package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
  109. package/augment-extensions/coding-standards/typescript/README.md +45 -45
  110. package/augment-extensions/coding-standards/typescript/module.json +27 -27
  111. package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
  112. package/augment-extensions/collections/html-css-js/README.md +82 -82
  113. package/augment-extensions/collections/html-css-js/collection.json +41 -41
  114. package/augment-extensions/domain-rules/api-design/README.md +41 -41
  115. package/augment-extensions/domain-rules/api-design/module.json +27 -27
  116. package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
  117. package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
  118. package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
  119. package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
  120. package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
  121. package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
  122. package/augment-extensions/domain-rules/database/README.md +161 -161
  123. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
  124. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
  125. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
  126. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
  127. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
  128. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
  129. package/augment-extensions/domain-rules/database/module.json +28 -28
  130. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
  131. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
  132. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
  133. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
  134. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
  135. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
  136. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
  137. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
  138. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
  139. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
  140. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
  141. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
  142. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
  143. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
  144. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
  145. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
  146. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
  147. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
  148. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
  149. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
  150. package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
  151. package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
  152. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
  153. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
  154. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
  155. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
  156. package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
  157. package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
  158. package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
  159. package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
  160. package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
  161. package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
  162. package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
  163. package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
  164. package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
  165. package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
  166. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
  167. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
  168. package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
  169. package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
  170. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
  171. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
  172. package/augment-extensions/domain-rules/mcp/README.md +150 -150
  173. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
  174. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
  175. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
  176. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
  177. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
  178. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
  179. package/augment-extensions/domain-rules/mcp/module.json +49 -49
  180. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
  181. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
  182. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
  183. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
  184. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
  185. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
  186. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
  187. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
  188. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
  189. package/augment-extensions/domain-rules/security/README.md +41 -41
  190. package/augment-extensions/domain-rules/security/module.json +28 -28
  191. package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
  192. package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
  193. package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
  194. package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
  195. package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
  196. package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
  197. package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
  198. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
  199. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
  200. package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
  201. package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
  202. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
  203. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
  204. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
  205. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
  206. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
  207. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
  208. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
  209. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
  210. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
  211. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
  212. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
  213. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
  214. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
  215. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
  216. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
  217. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
  218. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
  219. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
  220. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
  221. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
  222. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
  223. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
  224. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
  225. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
  226. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
  227. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
  228. package/augment-extensions/domain-rules/wordpress/README.md +163 -163
  229. package/augment-extensions/domain-rules/wordpress/module.json +32 -32
  230. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
  231. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
  232. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
  233. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
  234. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
  235. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
  236. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
  237. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
  238. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
  239. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
  240. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
  241. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
  242. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
  243. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
  244. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
  245. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
  246. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
  247. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
  248. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
  249. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
  250. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
  251. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
  252. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
  253. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
  254. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
  255. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
  256. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
  257. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
  258. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
  259. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
  260. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
  261. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
  262. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
  263. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
  264. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
  265. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
  266. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
  267. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
  268. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
  269. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
  270. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
  271. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
  272. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
  273. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
  274. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
  275. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
  276. package/augment-extensions/examples/design-patterns/README.md +37 -37
  277. package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
  278. package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
  279. package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
  280. package/augment-extensions/examples/design-patterns/module.json +27 -27
  281. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
  282. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
  283. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
  284. package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
  285. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
  286. package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
  287. package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
  288. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
  289. package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
  290. package/augment-extensions/workflows/beads/README.md +135 -135
  291. package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
  292. package/augment-extensions/workflows/beads/module.json +55 -55
  293. package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
  294. package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
  295. package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
  296. package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
  297. package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
  298. package/augment-extensions/workflows/beads-integration/README.md +143 -143
  299. package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
  300. package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
  301. package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
  302. package/augment-extensions/workflows/beads-integration/module.json +75 -75
  303. package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
  304. package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
  305. package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
  306. package/augment-extensions/workflows/database/README.md +195 -195
  307. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
  308. package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
  309. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
  310. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
  311. package/augment-extensions/workflows/database/module.json +42 -42
  312. package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
  313. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
  314. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
  315. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
  316. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
  317. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
  318. package/augment-extensions/workflows/database/rules/workflow.md +458 -458
  319. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
  320. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
  321. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
  322. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
  323. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
  324. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
  325. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
  326. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
  327. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
  328. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
  329. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
  330. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
  331. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
  332. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
  333. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
  334. package/augment-extensions/writing-standards/screenplay/README.md +339 -300
  335. package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
  336. package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
  337. package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
  338. package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
  339. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
  340. package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
  341. package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
  342. package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
  343. package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
  344. package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
  345. package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
  346. package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
  347. package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
  348. package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
  349. package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
  350. package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
  351. package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
  352. package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
  353. package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
  354. package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
  355. package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
  356. package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
  357. package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
  358. package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
  359. package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
  360. package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
  361. package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
  362. package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
  363. package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
  364. package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
  365. package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
  366. package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
  367. package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
  368. package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
  369. package/augment-extensions/writing-standards/screenplay/module.json +124 -124
  370. package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
  371. package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
  372. package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
  373. package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
  374. package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
  375. package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
  376. package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
  377. package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
  378. package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
  379. package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
  380. package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
  381. package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
  382. package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
  383. package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
  384. package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
  385. package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
  386. package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
  387. package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
  388. package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
  389. package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
  390. package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
  391. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
  392. package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
  393. package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
  394. package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
  395. package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
  396. package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
  397. package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
  398. package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
  399. package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
  400. package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
  401. package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
  402. package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
  403. package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
  404. package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
  405. package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
  406. package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
  407. package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
  408. package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
  409. package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
  410. package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
  411. package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
  412. package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
  413. package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
  414. package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
  415. package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
  416. package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
  417. package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
  418. package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
  419. package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
  420. package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
  421. package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
  422. package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
  423. package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
  424. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
  425. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
  426. package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
  427. package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
  428. package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
  429. package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
  430. package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
  431. package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
  432. package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
  433. package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
  434. package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
  435. package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
  436. package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
  437. package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
  438. package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
  439. package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
  440. package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
  441. package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
  442. package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
  443. package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
  444. package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
  445. package/cli/MODULES.md +302 -302
  446. package/cli/dist/cli.js +109 -22
  447. package/cli/dist/cli.js.map +1 -1
  448. package/cli/dist/commands/gui.d.ts.map +1 -1
  449. package/cli/dist/commands/gui.js +54 -6
  450. package/cli/dist/commands/gui.js.map +1 -1
  451. package/cli/dist/commands/init.d.ts.map +1 -1
  452. package/cli/dist/commands/init.js +76 -23
  453. package/cli/dist/commands/init.js.map +1 -1
  454. package/cli/dist/commands/self-remove.d.ts.map +1 -1
  455. package/cli/dist/commands/self-remove.js +48 -74
  456. package/cli/dist/commands/self-remove.js.map +1 -1
  457. package/cli/dist/commands/show.d.ts +11 -0
  458. package/cli/dist/commands/show.d.ts.map +1 -1
  459. package/cli/dist/commands/show.js +120 -0
  460. package/cli/dist/commands/show.js.map +1 -1
  461. package/cli/dist/commands/showCompleted.d.ts +21 -0
  462. package/cli/dist/commands/showCompleted.d.ts.map +1 -0
  463. package/cli/dist/commands/showCompleted.js +225 -0
  464. package/cli/dist/commands/showCompleted.js.map +1 -0
  465. package/cli/dist/commands/skill.js +88 -88
  466. package/cli/dist/commands/update.d.ts +2 -0
  467. package/cli/dist/commands/update.d.ts.map +1 -1
  468. package/cli/dist/commands/update.js +67 -1
  469. package/cli/dist/commands/update.js.map +1 -1
  470. package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
  471. package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
  472. package/cli/dist/utils/beadsCompletedChecker.js +198 -0
  473. package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
  474. package/cli/dist/utils/catalog-sync.js +13 -13
  475. package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
  476. package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
  477. package/cli/dist/utils/extractCommandHelp.js +250 -0
  478. package/cli/dist/utils/extractCommandHelp.js.map +1 -0
  479. package/cli/dist/utils/install-rules.js +55 -55
  480. package/cli/dist/utils/mcp-integration.js +44 -44
  481. package/cli/dist/utils/rule-install-hooks.js +8 -8
  482. package/modules.md +667 -630
  483. package/package.json +85 -85
@@ -1,496 +1,496 @@
1
- # Optimization Example: Slow Product Search Query
2
-
3
- ## Scenario
4
-
5
- The product search feature in the e-commerce platform (from schema-design-example.md) is experiencing performance issues.
6
-
7
- **Problem**:
8
- - Product search query takes 2-3 seconds to execute
9
- - Users complaining about slow search results
10
- - Database CPU usage spikes during search operations
11
- - Search is used frequently (1000+ searches per minute)
12
-
13
- **Requirements**:
14
- - Reduce search query time to < 100ms
15
- - Support full-text search on product names and descriptions
16
- - Filter by category and price range
17
- - Sort by relevance, price, or rating
18
-
19
- ---
20
-
21
- ## Step 1: Identify the Problem
22
-
23
- ### Current Query
24
-
25
- ```sql
26
- SELECT
27
- p.id,
28
- p.name,
29
- p.description,
30
- p.price,
31
- p.average_rating,
32
- c.name as category_name,
33
- (SELECT url FROM product_images WHERE product_id = p.id ORDER BY display_order LIMIT 1) as thumbnail
34
- FROM products p
35
- JOIN categories c ON p.category_id = c.id
36
- WHERE
37
- (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
38
- AND p.price BETWEEN 50 AND 200
39
- AND c.slug = 'electronics'
40
- ORDER BY p.average_rating DESC NULLS LAST
41
- LIMIT 20 OFFSET 0;
42
- ```
43
-
44
- ### Performance Metrics
45
-
46
- **Baseline Performance**:
47
- - Execution time: 2,345ms
48
- - Rows scanned: 50,000 (full table scan)
49
- - Frequency: 1,000 queries/minute
50
- - Database CPU: 80% during peak
51
-
52
- ---
53
-
54
- ## Step 2: Analyze Execution Plan
55
-
56
- ### Get Execution Plan
57
-
58
- ```sql
59
- EXPLAIN ANALYZE
60
- SELECT
61
- p.id,
62
- p.name,
63
- p.description,
64
- p.price,
65
- p.average_rating,
66
- c.name as category_name,
67
- (SELECT url FROM product_images WHERE product_id = p.id ORDER BY display_order LIMIT 1) as thumbnail
68
- FROM products p
69
- JOIN categories c ON p.category_id = c.id
70
- WHERE
71
- (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
72
- AND p.price BETWEEN 50 AND 200
73
- AND c.slug = 'electronics'
74
- ORDER BY p.average_rating DESC NULLS LAST
75
- LIMIT 20 OFFSET 0;
76
- ```
77
-
78
- ### Execution Plan Output
79
-
80
- ```
81
- Limit (cost=15234.56..15234.61 rows=20 width=256) (actual time=2345.123..2345.145 rows=20 loops=1)
82
- -> Sort (cost=15234.56..15359.78 rows=50087 width=256) (actual time=2345.121..2345.135 rows=20 loops=1)
83
- Sort Key: p.average_rating DESC NULLS LAST
84
- Sort Method: top-N heapsort Memory: 28kB
85
- -> Hash Join (cost=234.56..14123.45 rows=50087 width=256) (actual time=12.345..2234.567 rows=48234 loops=1)
86
- Hash Cond: (p.category_id = c.id)
87
- -> Seq Scan on products p (cost=0.00..13456.78 rows=50123 width=234) (actual time=0.123..2123.456 rows=48456 loops=1)
88
- Filter: ((LOWER(name) ~~ '%wireless%'::text OR LOWER(description) ~~ '%wireless%'::text) AND (price >= 50) AND (price <= 200))
89
- Rows Removed by Filter: 51544
90
- -> Hash (cost=234.45..234.45 rows=1 width=22) (actual time=0.234..0.234 rows=1 loops=1)
91
- Buckets: 1024 Batches: 1 Memory Usage: 9kB
92
- -> Index Scan using idx_categories_slug on categories c (cost=0.15..234.45 rows=1 width=22) (actual time=0.123..0.123 rows=1 loops=1)
93
- Index Cond: (slug = 'electronics'::text)
94
- Planning Time: 1.234 ms
95
- Execution Time: 2345.234 ms
96
- ```
97
-
98
- ### Issues Identified
99
-
100
- 1. **Sequential Scan on products**: Full table scan (50,000 rows)
101
- 2. **LOWER() function on columns**: Prevents index usage
102
- 3. **LIKE with leading wildcard**: Cannot use B-tree index
103
- 4. **Subquery for thumbnail**: Executed for each row (N+1 problem)
104
- 5. **No full-text search index**: Text search is inefficient
105
-
106
- ---
107
-
108
- ## Step 3: Implement Optimizations
109
-
110
- ### Optimization 1: Add Full-Text Search Index
111
-
112
- **Problem**: `LOWER(name) LIKE '%wireless%'` causes sequential scan
113
-
114
- **Solution**: Use PostgreSQL full-text search with GIN index
115
-
116
- ```sql
117
- -- Add tsvector column for full-text search
118
- ALTER TABLE products ADD COLUMN search_vector tsvector;
119
-
120
- -- Populate search vector
121
- UPDATE products
122
- SET search_vector = to_tsvector('english', coalesce(name, '') || ' ' || coalesce(description, ''));
123
-
124
- -- Create GIN index for full-text search
125
- CREATE INDEX idx_products_search_vector ON products USING gin(search_vector);
126
-
127
- -- Create trigger to keep search_vector updated
128
- CREATE OR REPLACE FUNCTION products_search_vector_update()
129
- RETURNS TRIGGER AS $$
130
- BEGIN
131
- NEW.search_vector = to_tsvector('english', coalesce(NEW.name, '') || ' ' || coalesce(NEW.description, ''));
132
- RETURN NEW;
133
- END;
134
- $$ LANGUAGE plpgsql;
135
-
136
- CREATE TRIGGER trigger_products_search_vector_update
137
- BEFORE INSERT OR UPDATE ON products
138
- FOR EACH ROW EXECUTE FUNCTION products_search_vector_update();
139
- ```
140
-
141
- ### Optimization 2: Add Composite Index for Filtering
142
-
143
- **Problem**: Filtering by category and price requires sequential scan
144
-
145
- **Solution**: Create composite index
146
-
147
- ```sql
148
- -- Composite index for category and price range queries
149
- CREATE INDEX idx_products_category_price ON products(category_id, price);
150
- ```
151
-
152
- ### Optimization 3: Denormalize Thumbnail URL
153
-
154
- **Problem**: Subquery for thumbnail executes for each row
155
-
156
- **Solution**: Add thumbnail column to products table
157
-
158
- ```sql
159
- -- Add thumbnail column
160
- ALTER TABLE products ADD COLUMN thumbnail_url VARCHAR(500);
161
-
162
- -- Populate thumbnail from first image
163
- UPDATE products p
164
- SET thumbnail_url = (
165
- SELECT url
166
- FROM product_images
167
- WHERE product_id = p.id
168
- ORDER BY display_order
169
- LIMIT 1
170
- );
171
-
172
- -- Create trigger to update thumbnail when images change
173
- CREATE OR REPLACE FUNCTION update_product_thumbnail()
174
- RETURNS TRIGGER AS $$
175
- BEGIN
176
- UPDATE products
177
- SET thumbnail_url = (
178
- SELECT url
179
- FROM product_images
180
- WHERE product_id = NEW.product_id
181
- ORDER BY display_order
182
- LIMIT 1
183
- )
184
- WHERE id = NEW.product_id;
185
- RETURN NEW;
186
- END;
187
- $$ LANGUAGE plpgsql;
188
-
189
- CREATE TRIGGER trigger_update_product_thumbnail
190
- AFTER INSERT OR UPDATE OR DELETE ON product_images
191
- FOR EACH ROW EXECUTE FUNCTION update_product_thumbnail();
192
- ```
193
-
194
- ### Optimization 4: Rewrite Query to Use Indexes
195
-
196
- **Problem**: Original query doesn't leverage new indexes
197
-
198
- **Solution**: Rewrite query to use full-text search and indexes
199
-
200
- ```sql
201
- -- Optimized query using full-text search
202
- SELECT
203
- p.id,
204
- p.name,
205
- p.description,
206
- p.price,
207
- p.average_rating,
208
- c.name as category_name,
209
- p.thumbnail_url,
210
- ts_rank(p.search_vector, query) as relevance
211
- FROM products p
212
- JOIN categories c ON p.category_id = c.id,
213
- to_tsquery('english', 'wireless') as query
214
- WHERE
215
- p.search_vector @@ query
216
- AND p.price BETWEEN 50 AND 200
217
- AND c.slug = 'electronics'
218
- ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
219
- LIMIT 20 OFFSET 0;
220
- ```
221
-
222
- ---
223
-
224
- ## Step 4: Benchmark and Validate
225
-
226
- ### Test Optimized Query
227
-
228
- ```sql
229
- EXPLAIN ANALYZE
230
- SELECT
231
- p.id,
232
- p.name,
233
- p.description,
234
- p.price,
235
- p.average_rating,
236
- c.name as category_name,
237
- p.thumbnail_url,
238
- ts_rank(p.search_vector, query) as relevance
239
- FROM products p
240
- JOIN categories c ON p.category_id = c.id,
241
- to_tsquery('english', 'wireless') as query
242
- WHERE
243
- p.search_vector @@ query
244
- AND p.price BETWEEN 50 AND 200
245
- AND c.slug = 'electronics'
246
- ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
247
- LIMIT 20 OFFSET 0;
248
- ```
249
-
250
- ### Optimized Execution Plan
251
-
252
- ```
253
- Limit (cost=234.56..234.61 rows=20 width=264) (actual time=45.123..45.145 rows=20 loops=1)
254
- -> Sort (cost=234.56..259.78 rows=10087 width=264) (actual time=45.121..45.135 rows=20 loops=1)
255
- Sort Key: (ts_rank(p.search_vector, query)) DESC, p.average_rating DESC NULLS LAST
256
- Sort Method: top-N heapsort Memory: 28kB
257
- -> Nested Loop (cost=12.45..123.45 rows=10087 width=264) (actual time=2.345..34.567 rows=8234 loops=1)
258
- -> Index Scan using idx_categories_slug on categories c (cost=0.15..8.17 rows=1 width=22) (actual time=0.123..0.123 rows=1 loops=1)
259
- Index Cond: (slug = 'electronics'::text)
260
- -> Bitmap Heap Scan on products p (cost=12.30..115.28 rows=10087 width=242) (actual time=2.222..33.444 rows=8234 loops=1)
261
- Recheck Cond: (search_vector @@ query)
262
- Filter: ((price >= 50) AND (price <= 200) AND (category_id = c.id))
263
- Rows Removed by Filter: 1766
264
- Heap Blocks: exact=1234
265
- -> Bitmap Index Scan on idx_products_search_vector (cost=0.00..9.78 rows=10000 width=0) (actual time=1.234..1.234 rows=10000 loops=1)
266
- Index Cond: (search_vector @@ query)
267
- Planning Time: 0.234 ms
268
- Execution Time: 45.234 ms
269
- ```
270
-
271
- ### Performance Comparison
272
-
273
- | Metric | Before | After | Improvement |
274
- |--------|--------|-------|-------------|
275
- | Execution Time | 2,345ms | 45ms | **98.1%** |
276
- | Rows Scanned | 50,000 | 10,000 | 80% |
277
- | Index Usage | None | GIN + B-tree | ✅ |
278
- | Subqueries | 1 per row | 0 | ✅ |
279
- | Database CPU | 80% | 15% | 81.3% |
280
-
281
- ### Validation Tests
282
-
283
- ```sql
284
- -- Test 1: Verify results are the same
285
- -- Compare original query results with optimized query results
286
- WITH original AS (
287
- SELECT p.id
288
- FROM products p
289
- JOIN categories c ON p.category_id = c.id
290
- WHERE
291
- (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
292
- AND p.price BETWEEN 50 AND 200
293
- AND c.slug = 'electronics'
294
- ORDER BY p.average_rating DESC NULLS LAST
295
- LIMIT 20
296
- ),
297
- optimized AS (
298
- SELECT p.id
299
- FROM products p
300
- JOIN categories c ON p.category_id = c.id,
301
- to_tsquery('english', 'wireless') as query
302
- WHERE
303
- p.search_vector @@ query
304
- AND p.price BETWEEN 50 AND 200
305
- AND c.slug = 'electronics'
306
- ORDER BY ts_rank(p.search_vector, query) DESC, p.average_rating DESC NULLS LAST
307
- LIMIT 20
308
- )
309
- SELECT
310
- COUNT(*) as matching_results,
311
- (SELECT COUNT(*) FROM original) as original_count,
312
- (SELECT COUNT(*) FROM optimized) as optimized_count
313
- FROM original
314
- INNER JOIN optimized ON original.id = optimized.id;
315
-
316
- -- Test 2: Verify index is being used
317
- SELECT
318
- schemaname,
319
- tablename,
320
- indexname,
321
- idx_scan as scans,
322
- idx_tup_read as tuples_read,
323
- idx_tup_fetch as tuples_fetched
324
- FROM pg_stat_user_indexes
325
- WHERE indexname = 'idx_products_search_vector';
326
-
327
- -- Test 3: Verify thumbnail denormalization
328
- SELECT COUNT(*)
329
- FROM products
330
- WHERE thumbnail_url IS NULL
331
- AND id IN (SELECT DISTINCT product_id FROM product_images);
332
- -- Should return 0
333
- ```
334
-
335
- ---
336
-
337
- ## Step 5: Monitor Ongoing Performance
338
-
339
- ### Monitoring Queries
340
-
341
- ```sql
342
- -- Monitor search query performance over time
343
- SELECT
344
- DATE_TRUNC('hour', query_start) as hour,
345
- COUNT(*) as query_count,
346
- AVG(total_exec_time) as avg_time_ms,
347
- MAX(total_exec_time) as max_time_ms
348
- FROM pg_stat_statements
349
- WHERE query LIKE '%search_vector%'
350
- GROUP BY DATE_TRUNC('hour', query_start)
351
- ORDER BY hour DESC
352
- LIMIT 24;
353
-
354
- -- Monitor index usage
355
- SELECT
356
- indexrelname as index_name,
357
- idx_scan as index_scans,
358
- idx_tup_read as tuples_read,
359
- idx_tup_fetch as tuples_fetched,
360
- pg_size_pretty(pg_relation_size(indexrelid)) as index_size
361
- FROM pg_stat_user_indexes
362
- WHERE schemaname = 'public'
363
- AND tablename = 'products'
364
- ORDER BY idx_scan DESC;
365
-
366
- -- Monitor index bloat
367
- SELECT
368
- schemaname,
369
- tablename,
370
- indexname,
371
- pg_size_pretty(pg_relation_size(indexrelid)) as index_size,
372
- idx_scan,
373
- CASE
374
- WHEN idx_scan = 0 THEN 'UNUSED'
375
- WHEN idx_scan < 100 THEN 'LOW USAGE'
376
- ELSE 'ACTIVE'
377
- END as usage_status
378
- FROM pg_stat_user_indexes
379
- WHERE schemaname = 'public'
380
- AND tablename = 'products';
381
- ```
382
-
383
- ### Performance Alerts
384
-
385
- Set up alerts for:
386
- - Search query time > 100ms (threshold exceeded)
387
- - Index not being used (idx_scan = 0 after 1 hour)
388
- - Database CPU > 70% (resource constraint)
389
- - Search query error rate > 1% (potential issues)
390
-
391
- ---
392
-
393
- ## Step 6: Additional Optimizations
394
-
395
- ### Optimization 5: Add Caching Layer
396
-
397
- **Problem**: Same searches executed repeatedly
398
-
399
- **Solution**: Cache search results in Redis
400
-
401
- ```javascript
402
- // Application-level caching
403
- const redis = require('redis');
404
- const client = redis.createClient();
405
-
406
- async function searchProducts(searchTerm, category, minPrice, maxPrice) {
407
- // Create cache key
408
- const cacheKey = `search:${searchTerm}:${category}:${minPrice}:${maxPrice}`;
409
-
410
- // Check cache
411
- const cached = await client.get(cacheKey);
412
- if (cached) {
413
- return JSON.parse(cached);
414
- }
415
-
416
- // Execute query
417
- const results = await db.query(`
418
- SELECT
419
- p.id,
420
- p.name,
421
- p.price,
422
- p.average_rating,
423
- c.name as category_name,
424
- p.thumbnail_url,
425
- ts_rank(p.search_vector, query) as relevance
426
- FROM products p
427
- JOIN categories c ON p.category_id = c.id,
428
- to_tsquery('english', $1) as query
429
- WHERE
430
- p.search_vector @@ query
431
- AND p.price BETWEEN $2 AND $3
432
- AND c.slug = $4
433
- ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
434
- LIMIT 20
435
- `, [searchTerm, minPrice, maxPrice, category]);
436
-
437
- // Cache results for 5 minutes
438
- await client.setex(cacheKey, 300, JSON.stringify(results.rows));
439
-
440
- return results.rows;
441
- }
442
- ```
443
-
444
- ### Optimization 6: Materialized View for Popular Searches
445
-
446
- **Problem**: Popular searches still hit database
447
-
448
- **Solution**: Create materialized view for top categories
449
-
450
- ```sql
451
- -- Materialized view for electronics category
452
- CREATE MATERIALIZED VIEW popular_electronics AS
453
- SELECT
454
- p.id,
455
- p.name,
456
- p.price,
457
- p.average_rating,
458
- p.thumbnail_url,
459
- p.search_vector
460
- FROM products p
461
- JOIN categories c ON p.category_id = c.id
462
- WHERE c.slug = 'electronics'
463
- AND p.inventory_count > 0
464
- ORDER BY p.average_rating DESC NULLS LAST;
465
-
466
- -- Index on materialized view
467
- CREATE INDEX idx_popular_electronics_search ON popular_electronics USING gin(search_vector);
468
-
469
- -- Refresh every hour
470
- CREATE EXTENSION IF NOT EXISTS pg_cron;
471
- SELECT cron.schedule('refresh-popular-electronics', '0 * * * *', 'REFRESH MATERIALIZED VIEW popular_electronics');
472
- ```
473
-
474
- ---
475
-
476
- ## Key Takeaways
477
-
478
- 1. **Measure First**: Used EXPLAIN ANALYZE to identify bottlenecks
479
- 2. **Full-Text Search**: Replaced LIKE with PostgreSQL full-text search (98% faster)
480
- 3. **Denormalization**: Added thumbnail_url to avoid N+1 subquery
481
- 4. **Composite Indexes**: Created indexes for common filter combinations
482
- 5. **Caching**: Added Redis caching for repeated searches
483
- 6. **Monitoring**: Set up continuous monitoring to track performance
484
- 7. **Validation**: Verified results are correct and performance improved
485
-
486
- **Result**: Query time reduced from 2,345ms to 45ms (98.1% improvement)
487
-
488
- ---
489
-
490
- ## Next Steps
491
-
492
- - See `../rules/optimization-workflow.md` for systematic optimization process
493
- - See `../rules/testing-patterns.md` for performance testing strategies
494
- - See `migration-example.md` for deploying optimizations safely
495
-
496
-
1
+ # Optimization Example: Slow Product Search Query
2
+
3
+ ## Scenario
4
+
5
+ The product search feature in the e-commerce platform (from schema-design-example.md) is experiencing performance issues.
6
+
7
+ **Problem**:
8
+ - Product search query takes 2-3 seconds to execute
9
+ - Users complaining about slow search results
10
+ - Database CPU usage spikes during search operations
11
+ - Search is used frequently (1000+ searches per minute)
12
+
13
+ **Requirements**:
14
+ - Reduce search query time to < 100ms
15
+ - Support full-text search on product names and descriptions
16
+ - Filter by category and price range
17
+ - Sort by relevance, price, or rating
18
+
19
+ ---
20
+
21
+ ## Step 1: Identify the Problem
22
+
23
+ ### Current Query
24
+
25
+ ```sql
26
+ SELECT
27
+ p.id,
28
+ p.name,
29
+ p.description,
30
+ p.price,
31
+ p.average_rating,
32
+ c.name as category_name,
33
+ (SELECT url FROM product_images WHERE product_id = p.id ORDER BY display_order LIMIT 1) as thumbnail
34
+ FROM products p
35
+ JOIN categories c ON p.category_id = c.id
36
+ WHERE
37
+ (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
38
+ AND p.price BETWEEN 50 AND 200
39
+ AND c.slug = 'electronics'
40
+ ORDER BY p.average_rating DESC NULLS LAST
41
+ LIMIT 20 OFFSET 0;
42
+ ```
43
+
44
+ ### Performance Metrics
45
+
46
+ **Baseline Performance**:
47
+ - Execution time: 2,345ms
48
+ - Rows scanned: 50,000 (full table scan)
49
+ - Frequency: 1,000 queries/minute
50
+ - Database CPU: 80% during peak
51
+
52
+ ---
53
+
54
+ ## Step 2: Analyze Execution Plan
55
+
56
+ ### Get Execution Plan
57
+
58
+ ```sql
59
+ EXPLAIN ANALYZE
60
+ SELECT
61
+ p.id,
62
+ p.name,
63
+ p.description,
64
+ p.price,
65
+ p.average_rating,
66
+ c.name as category_name,
67
+ (SELECT url FROM product_images WHERE product_id = p.id ORDER BY display_order LIMIT 1) as thumbnail
68
+ FROM products p
69
+ JOIN categories c ON p.category_id = c.id
70
+ WHERE
71
+ (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
72
+ AND p.price BETWEEN 50 AND 200
73
+ AND c.slug = 'electronics'
74
+ ORDER BY p.average_rating DESC NULLS LAST
75
+ LIMIT 20 OFFSET 0;
76
+ ```
77
+
78
+ ### Execution Plan Output
79
+
80
+ ```
81
+ Limit (cost=15234.56..15234.61 rows=20 width=256) (actual time=2345.123..2345.145 rows=20 loops=1)
82
+ -> Sort (cost=15234.56..15359.78 rows=50087 width=256) (actual time=2345.121..2345.135 rows=20 loops=1)
83
+ Sort Key: p.average_rating DESC NULLS LAST
84
+ Sort Method: top-N heapsort Memory: 28kB
85
+ -> Hash Join (cost=234.56..14123.45 rows=50087 width=256) (actual time=12.345..2234.567 rows=48234 loops=1)
86
+ Hash Cond: (p.category_id = c.id)
87
+ -> Seq Scan on products p (cost=0.00..13456.78 rows=50123 width=234) (actual time=0.123..2123.456 rows=48456 loops=1)
88
+ Filter: ((LOWER(name) ~~ '%wireless%'::text OR LOWER(description) ~~ '%wireless%'::text) AND (price >= 50) AND (price <= 200))
89
+ Rows Removed by Filter: 51544
90
+ -> Hash (cost=234.45..234.45 rows=1 width=22) (actual time=0.234..0.234 rows=1 loops=1)
91
+ Buckets: 1024 Batches: 1 Memory Usage: 9kB
92
+ -> Index Scan using idx_categories_slug on categories c (cost=0.15..234.45 rows=1 width=22) (actual time=0.123..0.123 rows=1 loops=1)
93
+ Index Cond: (slug = 'electronics'::text)
94
+ Planning Time: 1.234 ms
95
+ Execution Time: 2345.234 ms
96
+ ```
97
+
98
+ ### Issues Identified
99
+
100
+ 1. **Sequential Scan on products**: Full table scan (50,000 rows)
101
+ 2. **LOWER() function on columns**: Prevents index usage
102
+ 3. **LIKE with leading wildcard**: Cannot use B-tree index
103
+ 4. **Subquery for thumbnail**: Executed for each row (N+1 problem)
104
+ 5. **No full-text search index**: Text search is inefficient
105
+
106
+ ---
107
+
108
+ ## Step 3: Implement Optimizations
109
+
110
+ ### Optimization 1: Add Full-Text Search Index
111
+
112
+ **Problem**: `LOWER(name) LIKE '%wireless%'` causes sequential scan
113
+
114
+ **Solution**: Use PostgreSQL full-text search with GIN index
115
+
116
+ ```sql
117
+ -- Add tsvector column for full-text search
118
+ ALTER TABLE products ADD COLUMN search_vector tsvector;
119
+
120
+ -- Populate search vector
121
+ UPDATE products
122
+ SET search_vector = to_tsvector('english', coalesce(name, '') || ' ' || coalesce(description, ''));
123
+
124
+ -- Create GIN index for full-text search
125
+ CREATE INDEX idx_products_search_vector ON products USING gin(search_vector);
126
+
127
+ -- Create trigger to keep search_vector updated
128
+ CREATE OR REPLACE FUNCTION products_search_vector_update()
129
+ RETURNS TRIGGER AS $$
130
+ BEGIN
131
+ NEW.search_vector = to_tsvector('english', coalesce(NEW.name, '') || ' ' || coalesce(NEW.description, ''));
132
+ RETURN NEW;
133
+ END;
134
+ $$ LANGUAGE plpgsql;
135
+
136
+ CREATE TRIGGER trigger_products_search_vector_update
137
+ BEFORE INSERT OR UPDATE ON products
138
+ FOR EACH ROW EXECUTE FUNCTION products_search_vector_update();
139
+ ```
140
+
141
+ ### Optimization 2: Add Composite Index for Filtering
142
+
143
+ **Problem**: Filtering by category and price requires sequential scan
144
+
145
+ **Solution**: Create composite index
146
+
147
+ ```sql
148
+ -- Composite index for category and price range queries
149
+ CREATE INDEX idx_products_category_price ON products(category_id, price);
150
+ ```
151
+
152
+ ### Optimization 3: Denormalize Thumbnail URL
153
+
154
+ **Problem**: Subquery for thumbnail executes for each row
155
+
156
+ **Solution**: Add thumbnail column to products table
157
+
158
+ ```sql
159
+ -- Add thumbnail column
160
+ ALTER TABLE products ADD COLUMN thumbnail_url VARCHAR(500);
161
+
162
+ -- Populate thumbnail from first image
163
+ UPDATE products p
164
+ SET thumbnail_url = (
165
+ SELECT url
166
+ FROM product_images
167
+ WHERE product_id = p.id
168
+ ORDER BY display_order
169
+ LIMIT 1
170
+ );
171
+
172
+ -- Create trigger to update thumbnail when images change
173
+ CREATE OR REPLACE FUNCTION update_product_thumbnail()
174
+ RETURNS TRIGGER AS $$
175
+ BEGIN
176
+ UPDATE products
177
+ SET thumbnail_url = (
178
+ SELECT url
179
+ FROM product_images
180
+ WHERE product_id = NEW.product_id
181
+ ORDER BY display_order
182
+ LIMIT 1
183
+ )
184
+ WHERE id = NEW.product_id;
185
+ RETURN NEW;
186
+ END;
187
+ $$ LANGUAGE plpgsql;
188
+
189
+ CREATE TRIGGER trigger_update_product_thumbnail
190
+ AFTER INSERT OR UPDATE OR DELETE ON product_images
191
+ FOR EACH ROW EXECUTE FUNCTION update_product_thumbnail();
192
+ ```
193
+
194
+ ### Optimization 4: Rewrite Query to Use Indexes
195
+
196
+ **Problem**: Original query doesn't leverage new indexes
197
+
198
+ **Solution**: Rewrite query to use full-text search and indexes
199
+
200
+ ```sql
201
+ -- Optimized query using full-text search
202
+ SELECT
203
+ p.id,
204
+ p.name,
205
+ p.description,
206
+ p.price,
207
+ p.average_rating,
208
+ c.name as category_name,
209
+ p.thumbnail_url,
210
+ ts_rank(p.search_vector, query) as relevance
211
+ FROM products p
212
+ JOIN categories c ON p.category_id = c.id,
213
+ to_tsquery('english', 'wireless') as query
214
+ WHERE
215
+ p.search_vector @@ query
216
+ AND p.price BETWEEN 50 AND 200
217
+ AND c.slug = 'electronics'
218
+ ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
219
+ LIMIT 20 OFFSET 0;
220
+ ```
221
+
222
+ ---
223
+
224
+ ## Step 4: Benchmark and Validate
225
+
226
+ ### Test Optimized Query
227
+
228
+ ```sql
229
+ EXPLAIN ANALYZE
230
+ SELECT
231
+ p.id,
232
+ p.name,
233
+ p.description,
234
+ p.price,
235
+ p.average_rating,
236
+ c.name as category_name,
237
+ p.thumbnail_url,
238
+ ts_rank(p.search_vector, query) as relevance
239
+ FROM products p
240
+ JOIN categories c ON p.category_id = c.id,
241
+ to_tsquery('english', 'wireless') as query
242
+ WHERE
243
+ p.search_vector @@ query
244
+ AND p.price BETWEEN 50 AND 200
245
+ AND c.slug = 'electronics'
246
+ ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
247
+ LIMIT 20 OFFSET 0;
248
+ ```
249
+
250
+ ### Optimized Execution Plan
251
+
252
+ ```
253
+ Limit (cost=234.56..234.61 rows=20 width=264) (actual time=45.123..45.145 rows=20 loops=1)
254
+ -> Sort (cost=234.56..259.78 rows=10087 width=264) (actual time=45.121..45.135 rows=20 loops=1)
255
+ Sort Key: (ts_rank(p.search_vector, query)) DESC, p.average_rating DESC NULLS LAST
256
+ Sort Method: top-N heapsort Memory: 28kB
257
+ -> Nested Loop (cost=12.45..123.45 rows=10087 width=264) (actual time=2.345..34.567 rows=8234 loops=1)
258
+ -> Index Scan using idx_categories_slug on categories c (cost=0.15..8.17 rows=1 width=22) (actual time=0.123..0.123 rows=1 loops=1)
259
+ Index Cond: (slug = 'electronics'::text)
260
+ -> Bitmap Heap Scan on products p (cost=12.30..115.28 rows=10087 width=242) (actual time=2.222..33.444 rows=8234 loops=1)
261
+ Recheck Cond: (search_vector @@ query)
262
+ Filter: ((price >= 50) AND (price <= 200) AND (category_id = c.id))
263
+ Rows Removed by Filter: 1766
264
+ Heap Blocks: exact=1234
265
+ -> Bitmap Index Scan on idx_products_search_vector (cost=0.00..9.78 rows=10000 width=0) (actual time=1.234..1.234 rows=10000 loops=1)
266
+ Index Cond: (search_vector @@ query)
267
+ Planning Time: 0.234 ms
268
+ Execution Time: 45.234 ms
269
+ ```
270
+
271
+ ### Performance Comparison
272
+
273
+ | Metric | Before | After | Improvement |
274
+ |--------|--------|-------|-------------|
275
+ | Execution Time | 2,345ms | 45ms | **98.1%** |
276
+ | Rows Scanned | 50,000 | 10,000 | 80% |
277
+ | Index Usage | None | GIN + B-tree | ✅ |
278
+ | Subqueries | 1 per row | 0 | ✅ |
279
+ | Database CPU | 80% | 15% | 81.3% |
280
+
281
+ ### Validation Tests
282
+
283
+ ```sql
284
+ -- Test 1: Verify results are the same
285
+ -- Compare original query results with optimized query results
286
+ WITH original AS (
287
+ SELECT p.id
288
+ FROM products p
289
+ JOIN categories c ON p.category_id = c.id
290
+ WHERE
291
+ (LOWER(p.name) LIKE '%wireless%' OR LOWER(p.description) LIKE '%wireless%')
292
+ AND p.price BETWEEN 50 AND 200
293
+ AND c.slug = 'electronics'
294
+ ORDER BY p.average_rating DESC NULLS LAST
295
+ LIMIT 20
296
+ ),
297
+ optimized AS (
298
+ SELECT p.id
299
+ FROM products p
300
+ JOIN categories c ON p.category_id = c.id,
301
+ to_tsquery('english', 'wireless') as query
302
+ WHERE
303
+ p.search_vector @@ query
304
+ AND p.price BETWEEN 50 AND 200
305
+ AND c.slug = 'electronics'
306
+ ORDER BY ts_rank(p.search_vector, query) DESC, p.average_rating DESC NULLS LAST
307
+ LIMIT 20
308
+ )
309
+ SELECT
310
+ COUNT(*) as matching_results,
311
+ (SELECT COUNT(*) FROM original) as original_count,
312
+ (SELECT COUNT(*) FROM optimized) as optimized_count
313
+ FROM original
314
+ INNER JOIN optimized ON original.id = optimized.id;
315
+
316
+ -- Test 2: Verify index is being used
317
+ SELECT
318
+ schemaname,
319
+ tablename,
320
+ indexname,
321
+ idx_scan as scans,
322
+ idx_tup_read as tuples_read,
323
+ idx_tup_fetch as tuples_fetched
324
+ FROM pg_stat_user_indexes
325
+ WHERE indexname = 'idx_products_search_vector';
326
+
327
+ -- Test 3: Verify thumbnail denormalization
328
+ SELECT COUNT(*)
329
+ FROM products
330
+ WHERE thumbnail_url IS NULL
331
+ AND id IN (SELECT DISTINCT product_id FROM product_images);
332
+ -- Should return 0
333
+ ```
334
+
335
+ ---
336
+
337
+ ## Step 5: Monitor Ongoing Performance
338
+
339
+ ### Monitoring Queries
340
+
341
+ ```sql
342
+ -- Monitor search query performance over time
343
+ SELECT
344
+ DATE_TRUNC('hour', query_start) as hour,
345
+ COUNT(*) as query_count,
346
+ AVG(total_exec_time) as avg_time_ms,
347
+ MAX(total_exec_time) as max_time_ms
348
+ FROM pg_stat_statements
349
+ WHERE query LIKE '%search_vector%'
350
+ GROUP BY DATE_TRUNC('hour', query_start)
351
+ ORDER BY hour DESC
352
+ LIMIT 24;
353
+
354
+ -- Monitor index usage
355
+ SELECT
356
+ indexrelname as index_name,
357
+ idx_scan as index_scans,
358
+ idx_tup_read as tuples_read,
359
+ idx_tup_fetch as tuples_fetched,
360
+ pg_size_pretty(pg_relation_size(indexrelid)) as index_size
361
+ FROM pg_stat_user_indexes
362
+ WHERE schemaname = 'public'
363
+ AND tablename = 'products'
364
+ ORDER BY idx_scan DESC;
365
+
366
+ -- Monitor index bloat
367
+ SELECT
368
+ schemaname,
369
+ tablename,
370
+ indexname,
371
+ pg_size_pretty(pg_relation_size(indexrelid)) as index_size,
372
+ idx_scan,
373
+ CASE
374
+ WHEN idx_scan = 0 THEN 'UNUSED'
375
+ WHEN idx_scan < 100 THEN 'LOW USAGE'
376
+ ELSE 'ACTIVE'
377
+ END as usage_status
378
+ FROM pg_stat_user_indexes
379
+ WHERE schemaname = 'public'
380
+ AND tablename = 'products';
381
+ ```
382
+
383
+ ### Performance Alerts
384
+
385
+ Set up alerts for:
386
+ - Search query time > 100ms (threshold exceeded)
387
+ - Index not being used (idx_scan = 0 after 1 hour)
388
+ - Database CPU > 70% (resource constraint)
389
+ - Search query error rate > 1% (potential issues)
390
+
391
+ ---
392
+
393
+ ## Step 6: Additional Optimizations
394
+
395
+ ### Optimization 5: Add Caching Layer
396
+
397
+ **Problem**: Same searches executed repeatedly
398
+
399
+ **Solution**: Cache search results in Redis
400
+
401
+ ```javascript
402
+ // Application-level caching
403
+ const redis = require('redis');
404
+ const client = redis.createClient();
405
+
406
+ async function searchProducts(searchTerm, category, minPrice, maxPrice) {
407
+ // Create cache key
408
+ const cacheKey = `search:${searchTerm}:${category}:${minPrice}:${maxPrice}`;
409
+
410
+ // Check cache
411
+ const cached = await client.get(cacheKey);
412
+ if (cached) {
413
+ return JSON.parse(cached);
414
+ }
415
+
416
+ // Execute query
417
+ const results = await db.query(`
418
+ SELECT
419
+ p.id,
420
+ p.name,
421
+ p.price,
422
+ p.average_rating,
423
+ c.name as category_name,
424
+ p.thumbnail_url,
425
+ ts_rank(p.search_vector, query) as relevance
426
+ FROM products p
427
+ JOIN categories c ON p.category_id = c.id,
428
+ to_tsquery('english', $1) as query
429
+ WHERE
430
+ p.search_vector @@ query
431
+ AND p.price BETWEEN $2 AND $3
432
+ AND c.slug = $4
433
+ ORDER BY relevance DESC, p.average_rating DESC NULLS LAST
434
+ LIMIT 20
435
+ `, [searchTerm, minPrice, maxPrice, category]);
436
+
437
+ // Cache results for 5 minutes
438
+ await client.setex(cacheKey, 300, JSON.stringify(results.rows));
439
+
440
+ return results.rows;
441
+ }
442
+ ```
443
+
444
+ ### Optimization 6: Materialized View for Popular Searches
445
+
446
+ **Problem**: Popular searches still hit database
447
+
448
+ **Solution**: Create materialized view for top categories
449
+
450
+ ```sql
451
+ -- Materialized view for electronics category
452
+ CREATE MATERIALIZED VIEW popular_electronics AS
453
+ SELECT
454
+ p.id,
455
+ p.name,
456
+ p.price,
457
+ p.average_rating,
458
+ p.thumbnail_url,
459
+ p.search_vector
460
+ FROM products p
461
+ JOIN categories c ON p.category_id = c.id
462
+ WHERE c.slug = 'electronics'
463
+ AND p.inventory_count > 0
464
+ ORDER BY p.average_rating DESC NULLS LAST;
465
+
466
+ -- Index on materialized view
467
+ CREATE INDEX idx_popular_electronics_search ON popular_electronics USING gin(search_vector);
468
+
469
+ -- Refresh every hour
470
+ CREATE EXTENSION IF NOT EXISTS pg_cron;
471
+ SELECT cron.schedule('refresh-popular-electronics', '0 * * * *', 'REFRESH MATERIALIZED VIEW popular_electronics');
472
+ ```
473
+
474
+ ---
475
+
476
+ ## Key Takeaways
477
+
478
+ 1. **Measure First**: Used EXPLAIN ANALYZE to identify bottlenecks
479
+ 2. **Full-Text Search**: Replaced LIKE with PostgreSQL full-text search (98% faster)
480
+ 3. **Denormalization**: Added thumbnail_url to avoid N+1 subquery
481
+ 4. **Composite Indexes**: Created indexes for common filter combinations
482
+ 5. **Caching**: Added Redis caching for repeated searches
483
+ 6. **Monitoring**: Set up continuous monitoring to track performance
484
+ 7. **Validation**: Verified results are correct and performance improved
485
+
486
+ **Result**: Query time reduced from 2,345ms to 45ms (98.1% improvement)
487
+
488
+ ---
489
+
490
+ ## Next Steps
491
+
492
+ - See `../rules/optimization-workflow.md` for systematic optimization process
493
+ - See `../rules/testing-patterns.md` for performance testing strategies
494
+ - See `migration-example.md` for deploying optimizations safely
495
+
496
+