@mytechtoday/augment-extensions 0.1.2 → 0.4.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 (316) hide show
  1. package/README.md +614 -39
  2. package/augment-extensions/coding-standards/bash/README.md +196 -0
  3. package/augment-extensions/coding-standards/bash/module.json +163 -0
  4. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
  5. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
  6. package/augment-extensions/coding-standards/css/README.md +40 -0
  7. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
  8. package/augment-extensions/coding-standards/css/module.json +44 -0
  9. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
  10. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
  11. package/augment-extensions/coding-standards/html/README.md +40 -0
  12. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
  13. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
  14. package/augment-extensions/coding-standards/html/module.json +44 -0
  15. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
  16. package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
  17. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
  18. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
  19. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
  20. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
  21. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
  22. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
  23. package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
  24. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
  25. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
  27. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
  28. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
  29. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
  30. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
  31. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
  32. package/augment-extensions/coding-standards/js/README.md +46 -0
  33. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
  34. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
  35. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
  36. package/augment-extensions/coding-standards/js/module.json +49 -0
  37. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
  38. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
  39. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
  40. package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
  41. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
  42. package/augment-extensions/coding-standards/php/README.md +248 -0
  43. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
  44. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
  45. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
  46. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
  47. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
  48. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
  49. package/augment-extensions/coding-standards/php/module.json +166 -0
  50. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
  51. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
  52. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
  53. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
  54. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
  55. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
  56. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
  57. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
  58. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
  59. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
  60. package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
  61. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
  62. package/augment-extensions/coding-standards/php/rules/security.md +358 -0
  63. package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
  64. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
  65. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
  66. package/augment-extensions/coding-standards/powershell/README.md +154 -0
  67. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
  68. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
  69. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
  70. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
  71. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
  72. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
  73. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
  74. package/augment-extensions/coding-standards/powershell/module.json +165 -0
  75. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
  76. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
  77. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
  78. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
  79. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
  80. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
  81. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
  82. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
  83. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
  84. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
  85. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
  86. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
  87. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
  88. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
  89. package/augment-extensions/coding-standards/python/README.md +12 -8
  90. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
  91. package/augment-extensions/coding-standards/python/module.json +8 -4
  92. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
  93. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
  94. package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
  95. package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
  96. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
  97. package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
  98. package/augment-extensions/collections/html-css-js/README.md +82 -0
  99. package/augment-extensions/collections/html-css-js/collection.json +41 -0
  100. package/augment-extensions/domain-rules/database/README.md +161 -0
  101. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
  102. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
  103. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
  104. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
  105. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
  106. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
  107. package/augment-extensions/domain-rules/database/module.json +28 -0
  108. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
  109. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
  110. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
  111. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
  112. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
  113. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
  114. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
  115. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
  116. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
  117. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
  118. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
  119. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
  120. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
  121. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
  122. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
  123. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
  124. package/augment-extensions/domain-rules/mcp/README.md +150 -0
  125. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
  126. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
  127. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
  128. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
  129. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
  130. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
  131. package/augment-extensions/domain-rules/mcp/module.json +49 -0
  132. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
  133. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
  134. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
  135. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
  136. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
  137. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
  138. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
  139. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
  140. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
  141. package/augment-extensions/domain-rules/wordpress/README.md +163 -0
  142. package/augment-extensions/domain-rules/wordpress/module.json +32 -0
  143. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
  144. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
  145. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
  146. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
  147. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
  148. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
  149. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
  150. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
  151. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
  152. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
  153. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
  154. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
  155. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
  156. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
  157. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
  158. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
  159. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
  160. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
  161. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
  162. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
  163. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
  164. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
  165. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
  166. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
  167. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
  168. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
  169. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
  170. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
  171. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
  172. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
  173. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
  174. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
  175. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
  176. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
  177. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
  178. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
  179. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
  180. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
  181. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
  182. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
  183. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
  184. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
  185. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
  186. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
  187. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
  188. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
  189. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
  190. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
  191. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
  192. package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
  193. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
  194. package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
  195. package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
  196. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
  197. package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
  198. package/augment-extensions/workflows/beads/module.json +4 -3
  199. package/augment-extensions/workflows/database/README.md +195 -0
  200. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
  201. package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
  202. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
  203. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
  204. package/augment-extensions/workflows/database/module.json +42 -0
  205. package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
  206. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
  207. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
  208. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
  209. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
  210. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
  211. package/augment-extensions/workflows/database/rules/workflow.md +458 -0
  212. package/augment-extensions/workflows/openspec/module.json +4 -3
  213. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
  214. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
  215. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
  216. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
  217. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
  218. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
  219. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
  220. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
  221. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
  222. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
  223. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
  224. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
  225. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
  226. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
  227. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
  228. package/augment-extensions/writing-standards/screenplay/README.md +171 -0
  229. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
  230. package/augment-extensions/writing-standards/screenplay/module.json +124 -0
  231. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
  232. package/cli/MODULES.md +302 -0
  233. package/cli/dist/cli.js +142 -9
  234. package/cli/dist/cli.js.map +1 -1
  235. package/cli/dist/commands/catalog.d.ts +13 -0
  236. package/cli/dist/commands/catalog.d.ts.map +1 -0
  237. package/cli/dist/commands/catalog.js +104 -0
  238. package/cli/dist/commands/catalog.js.map +1 -0
  239. package/cli/dist/commands/gui.d.ts +6 -0
  240. package/cli/dist/commands/gui.d.ts.map +1 -0
  241. package/cli/dist/commands/gui.js +211 -0
  242. package/cli/dist/commands/gui.js.map +1 -0
  243. package/cli/dist/commands/init.d.ts.map +1 -1
  244. package/cli/dist/commands/init.js +12 -0
  245. package/cli/dist/commands/init.js.map +1 -1
  246. package/cli/dist/commands/install-rules.d.ts +14 -0
  247. package/cli/dist/commands/install-rules.d.ts.map +1 -0
  248. package/cli/dist/commands/install-rules.js +127 -0
  249. package/cli/dist/commands/install-rules.js.map +1 -0
  250. package/cli/dist/commands/link.d.ts.map +1 -1
  251. package/cli/dist/commands/link.js +9 -11
  252. package/cli/dist/commands/link.js.map +1 -1
  253. package/cli/dist/commands/list.d.ts.map +1 -1
  254. package/cli/dist/commands/list.js +11 -28
  255. package/cli/dist/commands/list.js.map +1 -1
  256. package/cli/dist/commands/mcp.d.ts +48 -0
  257. package/cli/dist/commands/mcp.d.ts.map +1 -0
  258. package/cli/dist/commands/mcp.js +229 -0
  259. package/cli/dist/commands/mcp.js.map +1 -0
  260. package/cli/dist/commands/self-remove.d.ts +7 -0
  261. package/cli/dist/commands/self-remove.d.ts.map +1 -0
  262. package/cli/dist/commands/self-remove.js +179 -0
  263. package/cli/dist/commands/self-remove.js.map +1 -0
  264. package/cli/dist/commands/show.d.ts.map +1 -1
  265. package/cli/dist/commands/show.js +42 -71
  266. package/cli/dist/commands/show.js.map +1 -1
  267. package/cli/dist/commands/skill.d.ts +67 -0
  268. package/cli/dist/commands/skill.d.ts.map +1 -0
  269. package/cli/dist/commands/skill.js +513 -0
  270. package/cli/dist/commands/skill.js.map +1 -0
  271. package/cli/dist/commands/unlink.d.ts +6 -0
  272. package/cli/dist/commands/unlink.d.ts.map +1 -0
  273. package/cli/dist/commands/unlink.js +115 -0
  274. package/cli/dist/commands/unlink.js.map +1 -0
  275. package/cli/dist/commands/validate.d.ts +6 -0
  276. package/cli/dist/commands/validate.d.ts.map +1 -0
  277. package/cli/dist/commands/validate.js +159 -0
  278. package/cli/dist/commands/validate.js.map +1 -0
  279. package/cli/dist/utils/catalog-sync.d.ts +22 -0
  280. package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
  281. package/cli/dist/utils/catalog-sync.js +157 -0
  282. package/cli/dist/utils/catalog-sync.js.map +1 -0
  283. package/cli/dist/utils/character-count.d.ts +56 -0
  284. package/cli/dist/utils/character-count.d.ts.map +1 -0
  285. package/cli/dist/utils/character-count.js +190 -0
  286. package/cli/dist/utils/character-count.js.map +1 -0
  287. package/cli/dist/utils/documentation-validator.d.ts +18 -0
  288. package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
  289. package/cli/dist/utils/documentation-validator.js +233 -0
  290. package/cli/dist/utils/documentation-validator.js.map +1 -0
  291. package/cli/dist/utils/install-rules.d.ts +32 -0
  292. package/cli/dist/utils/install-rules.d.ts.map +1 -0
  293. package/cli/dist/utils/install-rules.js +375 -0
  294. package/cli/dist/utils/install-rules.js.map +1 -0
  295. package/cli/dist/utils/mcp-integration.d.ts +70 -0
  296. package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
  297. package/cli/dist/utils/mcp-integration.js +292 -0
  298. package/cli/dist/utils/mcp-integration.js.map +1 -0
  299. package/cli/dist/utils/module-system.d.ts +153 -0
  300. package/cli/dist/utils/module-system.d.ts.map +1 -0
  301. package/cli/dist/utils/module-system.js +528 -0
  302. package/cli/dist/utils/module-system.js.map +1 -0
  303. package/cli/dist/utils/modules-catalog.d.ts +33 -0
  304. package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
  305. package/cli/dist/utils/modules-catalog.js +163 -0
  306. package/cli/dist/utils/modules-catalog.js.map +1 -0
  307. package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
  308. package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
  309. package/cli/dist/utils/rule-install-hooks.js +224 -0
  310. package/cli/dist/utils/rule-install-hooks.js.map +1 -0
  311. package/cli/dist/utils/skill-system.d.ts +95 -0
  312. package/cli/dist/utils/skill-system.d.ts.map +1 -0
  313. package/cli/dist/utils/skill-system.js +313 -0
  314. package/cli/dist/utils/skill-system.js.map +1 -0
  315. package/modules.md +534 -70
  316. package/package.json +12 -3
@@ -0,0 +1,907 @@
1
+ # Relational Schema Design
2
+
3
+ ## Overview
4
+
5
+ This document covers relational database schema design principles, including entity-relationship modeling, normalization, denormalization strategies, keys, constraints, data types, naming conventions, and schema evolution.
6
+
7
+ ---
8
+
9
+ ## Entity-Relationship Modeling
10
+
11
+ ### Identifying Entities
12
+
13
+ **Entity**: A thing or object in the real world with independent existence
14
+
15
+ **Examples:**
16
+ - User
17
+ - Product
18
+ - Order
19
+ - Category
20
+ - Payment
21
+
22
+ **Guidelines:**
23
+ - ✅ Entities should represent distinct concepts
24
+ - ✅ Entities should have attributes
25
+ - ✅ Entities should have a unique identifier
26
+ - ❌ Avoid creating entities for simple attributes
27
+
28
+ ### Identifying Relationships
29
+
30
+ **Relationship types:**
31
+ - **One-to-One (1:1)**: User ↔ Profile
32
+ - **One-to-Many (1:N)**: User → Orders
33
+ - **Many-to-Many (M:N)**: Products ↔ Categories
34
+
35
+ **Example: E-commerce ERD**
36
+ ```
37
+ User (1) ──→ (N) Order
38
+ Order (1) ──→ (N) OrderItem
39
+ Product (1) ──→ (N) OrderItem
40
+ Category (1) ──→ (N) Product
41
+ Product (N) ←──→ (N) Tag [via ProductTag junction table]
42
+ ```
43
+
44
+ ### Cardinality and Participation
45
+
46
+ **Cardinality**: Number of instances in relationship
47
+ - Minimum cardinality: 0 (optional) or 1 (mandatory)
48
+ - Maximum cardinality: 1 or N (many)
49
+
50
+ **Example:**
51
+ - User (1) → (0..N) Orders: User can have zero or many orders
52
+ - Order (1) → (1..N) OrderItems: Order must have at least one item
53
+
54
+ ---
55
+
56
+ ## Normalization
57
+
58
+ ### Purpose of Normalization
59
+
60
+ **Goals:**
61
+ - ✅ Eliminate data redundancy
62
+ - ✅ Ensure data integrity
63
+ - ✅ Reduce update anomalies
64
+ - ✅ Improve data consistency
65
+
66
+ ### First Normal Form (1NF)
67
+
68
+ **Rules:**
69
+ - Each column contains atomic (indivisible) values
70
+ - Each column contains values of a single type
71
+ - Each column has a unique name
72
+ - Order of rows doesn't matter
73
+
74
+ **Violation Example:**
75
+ ```sql
76
+ -- ❌ NOT in 1NF (phone_numbers contains multiple values)
77
+ CREATE TABLE users (
78
+ id INT PRIMARY KEY,
79
+ name VARCHAR(255),
80
+ phone_numbers VARCHAR(255) -- "555-1234, 555-5678"
81
+ );
82
+ ```
83
+
84
+ **1NF Solution:**
85
+ ```sql
86
+ -- ✅ 1NF compliant
87
+ CREATE TABLE users (
88
+ id INT PRIMARY KEY,
89
+ name VARCHAR(255)
90
+ );
91
+
92
+ CREATE TABLE user_phones (
93
+ id INT PRIMARY KEY,
94
+ user_id INT REFERENCES users(id),
95
+ phone_number VARCHAR(20)
96
+ );
97
+ ```
98
+
99
+ ### Second Normal Form (2NF)
100
+
101
+ **Rules:**
102
+ - Must be in 1NF
103
+ - All non-key attributes must depend on the entire primary key (no partial dependencies)
104
+
105
+ **Violation Example:**
106
+ ```sql
107
+ -- ❌ NOT in 2NF (product_name depends only on product_id, not on order_id)
108
+ CREATE TABLE order_items (
109
+ order_id INT,
110
+ product_id INT,
111
+ product_name VARCHAR(255), -- Partial dependency
112
+ quantity INT,
113
+ PRIMARY KEY (order_id, product_id)
114
+ );
115
+ ```
116
+
117
+ **2NF Solution:**
118
+ ```sql
119
+ -- ✅ 2NF compliant
120
+ CREATE TABLE products (
121
+ id INT PRIMARY KEY,
122
+ name VARCHAR(255)
123
+ );
124
+
125
+ CREATE TABLE order_items (
126
+ order_id INT,
127
+ product_id INT REFERENCES products(id),
128
+ quantity INT,
129
+ PRIMARY KEY (order_id, product_id)
130
+ );
131
+ ```
132
+
133
+ ### Third Normal Form (3NF)
134
+
135
+ **Rules:**
136
+ - Must be in 2NF
137
+ - No transitive dependencies (non-key attributes depend only on primary key)
138
+
139
+ **Violation Example:**
140
+ ```sql
141
+ -- ❌ NOT in 3NF (city and state depend on zip_code, not on user_id)
142
+ CREATE TABLE users (
143
+ id INT PRIMARY KEY,
144
+ name VARCHAR(255),
145
+ zip_code VARCHAR(10),
146
+ city VARCHAR(100), -- Transitive dependency
147
+ state VARCHAR(50) -- Transitive dependency
148
+ );
149
+ ```
150
+
151
+ **3NF Solution:**
152
+ ```sql
153
+ -- ✅ 3NF compliant
154
+ CREATE TABLE zip_codes (
155
+ zip_code VARCHAR(10) PRIMARY KEY,
156
+ city VARCHAR(100),
157
+ state VARCHAR(50)
158
+ );
159
+
160
+ CREATE TABLE users (
161
+ id INT PRIMARY KEY,
162
+ name VARCHAR(255),
163
+ zip_code VARCHAR(10) REFERENCES zip_codes(zip_code)
164
+ );
165
+ ```
166
+
167
+ ### Boyce-Codd Normal Form (BCNF)
168
+
169
+ **Rules:**
170
+ - Must be in 3NF
171
+ - Every determinant must be a candidate key
172
+
173
+ **When to use:**
174
+ - Rare cases where 3NF still has anomalies
175
+ - Most applications don't need BCNF
176
+
177
+ ### Normalization Trade-offs
178
+
179
+ **Advantages:**
180
+ - ✅ Reduces data redundancy
181
+ - ✅ Improves data integrity
182
+ - ✅ Easier to maintain
183
+ - ✅ Smaller database size
184
+
185
+ **Disadvantages:**
186
+ - ❌ More complex queries (more JOINs)
187
+ - ❌ Potentially slower reads
188
+ - ❌ More tables to manage
189
+
190
+ ---
191
+
192
+ ## Denormalization Strategies
193
+
194
+ ### When to Denormalize
195
+
196
+ **Consider denormalization when:**
197
+ - ✅ Read performance is critical
198
+ - ✅ Data is read much more than written
199
+ - ✅ Complex JOINs are causing performance issues
200
+ - ✅ Aggregations are expensive
201
+ - ✅ Reporting queries are slow
202
+
203
+ **Avoid denormalization when:**
204
+ - ❌ Data changes frequently
205
+ - ❌ Data consistency is critical
206
+ - ❌ Storage space is limited
207
+ - ❌ Write performance is more important than read performance
208
+
209
+ ### Denormalization Techniques
210
+
211
+ #### 1. Add Redundant Columns
212
+
213
+ **Example: Store user name in orders table**
214
+ ```sql
215
+ -- Normalized (requires JOIN)
216
+ CREATE TABLE users (
217
+ id INT PRIMARY KEY,
218
+ name VARCHAR(255)
219
+ );
220
+
221
+ CREATE TABLE orders (
222
+ id INT PRIMARY KEY,
223
+ user_id INT REFERENCES users(id)
224
+ );
225
+
226
+ -- Denormalized (no JOIN needed)
227
+ CREATE TABLE orders (
228
+ id INT PRIMARY KEY,
229
+ user_id INT REFERENCES users(id),
230
+ user_name VARCHAR(255) -- Redundant, but faster reads
231
+ );
232
+ ```
233
+
234
+ #### 2. Precompute Aggregations
235
+
236
+ **Example: Store order count and total in users table**
237
+ ```sql
238
+ -- Normalized (requires aggregation)
239
+ SELECT u.*, COUNT(o.id) AS order_count, SUM(o.total) AS total_spent
240
+ FROM users u
241
+ LEFT JOIN orders o ON o.user_id = u.id
242
+ GROUP BY u.id;
243
+
244
+ -- Denormalized (precomputed)
245
+ CREATE TABLE users (
246
+ id INT PRIMARY KEY,
247
+ name VARCHAR(255),
248
+ order_count INT DEFAULT 0,
249
+ total_spent DECIMAL(10, 2) DEFAULT 0
250
+ );
251
+
252
+ -- Update with triggers
253
+ CREATE TRIGGER update_user_stats
254
+ AFTER INSERT ON orders
255
+ FOR EACH ROW
256
+ BEGIN
257
+ UPDATE users
258
+ SET order_count = order_count + 1,
259
+ total_spent = total_spent + NEW.total
260
+ WHERE id = NEW.user_id;
261
+ END;
262
+ ```
263
+
264
+ #### 3. Materialized Views
265
+
266
+ **Example: Precompute complex aggregations**
267
+ ```sql
268
+ -- PostgreSQL: Materialized view
269
+ CREATE MATERIALIZED VIEW user_order_stats AS
270
+ SELECT
271
+ u.id AS user_id,
272
+ u.name,
273
+ u.email,
274
+ COUNT(o.id) AS total_orders,
275
+ SUM(o.total) AS total_spent,
276
+ MAX(o.created_at) AS last_order_date
277
+ FROM users u
278
+ LEFT JOIN orders o ON o.user_id = u.id
279
+ GROUP BY u.id, u.name, u.email;
280
+
281
+ -- Create index on materialized view
282
+ CREATE INDEX idx_user_order_stats_user_id ON user_order_stats(user_id);
283
+
284
+ -- Refresh materialized view
285
+ REFRESH MATERIALIZED VIEW user_order_stats;
286
+ ```
287
+
288
+ ---
289
+
290
+ ## Primary and Foreign Keys
291
+
292
+ ### Primary Keys
293
+
294
+ **Definition**: Unique identifier for each row in a table
295
+
296
+ **Types:**
297
+ - **Natural key**: Existing attribute (e.g., email, SSN)
298
+ - **Surrogate key**: Artificial identifier (e.g., auto-increment ID)
299
+
300
+ **Best Practices:**
301
+ - ✅ Use surrogate keys (auto-increment integers or UUIDs)
302
+ - ✅ Keep primary keys immutable
303
+ - ✅ Use smallest data type that fits
304
+ - ❌ Avoid composite primary keys unless necessary
305
+ - ❌ Avoid using business data as primary keys
306
+
307
+ **Example:**
308
+ ```sql
309
+ -- Auto-increment integer (most common)
310
+ CREATE TABLE users (
311
+ id SERIAL PRIMARY KEY, -- PostgreSQL
312
+ -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL
313
+ name VARCHAR(255)
314
+ );
315
+
316
+ -- UUID (for distributed systems)
317
+ CREATE TABLE users (
318
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- PostgreSQL
319
+ name VARCHAR(255)
320
+ );
321
+
322
+ -- Composite primary key (for junction tables)
323
+ CREATE TABLE product_tags (
324
+ product_id INT REFERENCES products(id),
325
+ tag_id INT REFERENCES tags(id),
326
+ PRIMARY KEY (product_id, tag_id)
327
+ );
328
+ ```
329
+
330
+ ### Foreign Keys
331
+
332
+ **Definition**: Column that references primary key in another table
333
+
334
+ **Benefits:**
335
+ - ✅ Enforces referential integrity
336
+ - ✅ Prevents orphaned records
337
+ - ✅ Documents relationships
338
+
339
+ **Example:**
340
+ ```sql
341
+ CREATE TABLE orders (
342
+ id SERIAL PRIMARY KEY,
343
+ user_id INT NOT NULL REFERENCES users(id),
344
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
345
+ );
346
+
347
+ -- With ON DELETE and ON UPDATE actions
348
+ CREATE TABLE orders (
349
+ id SERIAL PRIMARY KEY,
350
+ user_id INT NOT NULL REFERENCES users(id)
351
+ ON DELETE CASCADE -- Delete orders when user is deleted
352
+ ON UPDATE CASCADE, -- Update orders when user ID changes
353
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
354
+ );
355
+ ```
356
+
357
+ **ON DELETE actions:**
358
+ - `CASCADE`: Delete child rows when parent is deleted
359
+ - `SET NULL`: Set foreign key to NULL when parent is deleted
360
+ - `SET DEFAULT`: Set foreign key to default value when parent is deleted
361
+ - `RESTRICT`: Prevent deletion of parent if children exist (default)
362
+ - `NO ACTION`: Same as RESTRICT
363
+
364
+ **ON UPDATE actions:**
365
+ - Same options as ON DELETE
366
+
367
+ ---
368
+
369
+ ## Constraints
370
+
371
+ ### NOT NULL Constraint
372
+
373
+ **Ensures column cannot contain NULL values:**
374
+
375
+ ```sql
376
+ CREATE TABLE users (
377
+ id SERIAL PRIMARY KEY,
378
+ email VARCHAR(255) NOT NULL,
379
+ name VARCHAR(255) NOT NULL,
380
+ bio TEXT -- Can be NULL
381
+ );
382
+ ```
383
+
384
+ ### UNIQUE Constraint
385
+
386
+ **Ensures column values are unique:**
387
+
388
+ ```sql
389
+ CREATE TABLE users (
390
+ id SERIAL PRIMARY KEY,
391
+ email VARCHAR(255) UNIQUE NOT NULL,
392
+ username VARCHAR(50) UNIQUE NOT NULL
393
+ );
394
+
395
+ -- Composite unique constraint
396
+ CREATE TABLE user_preferences (
397
+ user_id INT REFERENCES users(id),
398
+ preference_key VARCHAR(50),
399
+ preference_value TEXT,
400
+ UNIQUE (user_id, preference_key)
401
+ );
402
+ ```
403
+
404
+ ### CHECK Constraint
405
+
406
+ **Ensures column values meet specific conditions:**
407
+
408
+ ```sql
409
+ CREATE TABLE products (
410
+ id SERIAL PRIMARY KEY,
411
+ name VARCHAR(255) NOT NULL,
412
+ price DECIMAL(10, 2) CHECK (price >= 0),
413
+ stock INT CHECK (stock >= 0),
414
+ status VARCHAR(20) CHECK (status IN ('active', 'inactive', 'discontinued'))
415
+ );
416
+
417
+ -- Named constraint
418
+ CREATE TABLE accounts (
419
+ id SERIAL PRIMARY KEY,
420
+ balance DECIMAL(10, 2),
421
+ CONSTRAINT check_positive_balance CHECK (balance >= 0)
422
+ );
423
+ ```
424
+
425
+ ### DEFAULT Constraint
426
+
427
+ **Provides default value for column:**
428
+
429
+ ```sql
430
+ CREATE TABLE orders (
431
+ id SERIAL PRIMARY KEY,
432
+ status VARCHAR(20) DEFAULT 'pending',
433
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
434
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
435
+ );
436
+ ```
437
+
438
+ ---
439
+
440
+ ## Data Types Selection
441
+
442
+ ### Numeric Types
443
+
444
+ **Integers:**
445
+ ```sql
446
+ -- PostgreSQL
447
+ SMALLINT -- -32,768 to 32,767 (2 bytes)
448
+ INTEGER -- -2,147,483,648 to 2,147,483,647 (4 bytes)
449
+ BIGINT -- -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (8 bytes)
450
+
451
+ -- MySQL
452
+ TINYINT -- -128 to 127 (1 byte)
453
+ SMALLINT -- -32,768 to 32,767 (2 bytes)
454
+ MEDIUMINT -- -8,388,608 to 8,388,607 (3 bytes)
455
+ INT -- -2,147,483,648 to 2,147,483,647 (4 bytes)
456
+ BIGINT -- -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (8 bytes)
457
+ ```
458
+
459
+ **Decimals:**
460
+ ```sql
461
+ -- Fixed-point (exact)
462
+ DECIMAL(precision, scale) -- e.g., DECIMAL(10, 2) for money
463
+ NUMERIC(precision, scale) -- Same as DECIMAL
464
+
465
+ -- Floating-point (approximate)
466
+ REAL -- 4 bytes
467
+ DOUBLE PRECISION -- 8 bytes
468
+ ```
469
+
470
+ **Best Practices:**
471
+ - ✅ Use DECIMAL for money (exact precision)
472
+ - ✅ Use smallest integer type that fits
473
+ - ✅ Use BIGINT for IDs in large tables
474
+ - ❌ Avoid FLOAT/REAL for financial data
475
+
476
+ ### String Types
477
+
478
+ ```sql
479
+ -- Fixed-length (padded with spaces)
480
+ CHAR(n) -- e.g., CHAR(2) for state codes
481
+
482
+ -- Variable-length (up to n characters)
483
+ VARCHAR(n) -- e.g., VARCHAR(255) for email
484
+
485
+ -- Unlimited length
486
+ TEXT -- PostgreSQL, MySQL
487
+ ```
488
+
489
+ **Best Practices:**
490
+ - ✅ Use VARCHAR for variable-length strings
491
+ - ✅ Use TEXT for long content
492
+ - ✅ Use CHAR for fixed-length codes
493
+ - ✅ Set appropriate VARCHAR length (not always 255)
494
+ - ❌ Don't use CHAR for variable-length data
495
+
496
+ ### Date and Time Types
497
+
498
+ ```sql
499
+ DATE -- Date only (YYYY-MM-DD)
500
+ TIME -- Time only (HH:MM:SS)
501
+ TIMESTAMP -- Date and time with timezone
502
+ TIMESTAMPTZ -- Timestamp with timezone (PostgreSQL)
503
+ INTERVAL -- Time interval (PostgreSQL)
504
+ ```
505
+
506
+ **Best Practices:**
507
+ - ✅ Use TIMESTAMP for created_at/updated_at
508
+ - ✅ Use TIMESTAMPTZ for timezone-aware timestamps
509
+ - ✅ Store dates in UTC
510
+ - ❌ Don't store dates as strings
511
+
512
+ ### Boolean Type
513
+
514
+ ```sql
515
+ BOOLEAN -- TRUE, FALSE, NULL
516
+ ```
517
+
518
+ ### JSON Types
519
+
520
+ ```sql
521
+ -- PostgreSQL
522
+ JSON -- Text-based JSON (slower)
523
+ JSONB -- Binary JSON (faster, indexable)
524
+
525
+ -- MySQL
526
+ JSON -- Binary JSON (MySQL 5.7+)
527
+ ```
528
+
529
+ **Best Practices:**
530
+ - ✅ Use JSONB in PostgreSQL (faster and indexable)
531
+ - ✅ Use JSON for semi-structured data
532
+ - ❌ Don't use JSON for structured relational data
533
+
534
+ ---
535
+
536
+ ## Naming Conventions
537
+
538
+ ### Table Names
539
+
540
+ **Best Practices:**
541
+ - ✅ Use plural nouns: `users`, `orders`, `products`
542
+ - ✅ Use snake_case: `order_items`, `user_preferences`
543
+ - ✅ Be descriptive: `product_categories` not `prod_cats`
544
+ - ❌ Avoid prefixes: `tbl_users` (unnecessary)
545
+
546
+ ### Column Names
547
+
548
+ **Best Practices:**
549
+ - ✅ Use snake_case: `first_name`, `created_at`
550
+ - ✅ Be descriptive: `email_address` not `email_addr`
551
+ - ✅ Use consistent naming: `created_at`, `updated_at` (not `creation_date`)
552
+ - ❌ Avoid reserved words: `user`, `order`, `select`
553
+ - ❌ Don't repeat table name: `users.user_name` → `users.name`
554
+
555
+ ### Primary Key Names
556
+
557
+ **Best Practices:**
558
+ - ✅ Use `id` for primary key
559
+ - ✅ Or use `{table_name}_id`: `user_id`, `order_id`
560
+
561
+ ### Foreign Key Names
562
+
563
+ **Best Practices:**
564
+ - ✅ Use `{referenced_table}_id`: `user_id`, `product_id`
565
+ - ✅ Be explicit for multiple references: `author_id`, `reviewer_id`
566
+
567
+ ### Index Names
568
+
569
+ **Best Practices:**
570
+ - ✅ Use `idx_{table}_{columns}`: `idx_users_email`
571
+ - ✅ Use `idx_{table}_{columns}_{type}`: `idx_users_name_gin`
572
+
573
+ ### Constraint Names
574
+
575
+ **Best Practices:**
576
+ - ✅ Use `{table}_{column}_{type}`: `users_email_unique`
577
+ - ✅ Use `fk_{table}_{referenced_table}`: `fk_orders_users`
578
+ - ✅ Use `check_{table}_{column}`: `check_products_price`
579
+
580
+ ---
581
+
582
+ ## Schema Evolution
583
+
584
+ ### Migration Strategies
585
+
586
+ **Best Practices:**
587
+ - ✅ Use migration tools (Flyway, Liquibase, Alembic, Prisma Migrate)
588
+ - ✅ Version all schema changes
589
+ - ✅ Make migrations reversible (up/down migrations)
590
+ - ✅ Test migrations in staging before production
591
+ - ✅ Include migrations in version control
592
+ - ❌ Never manually modify production schemas
593
+
594
+ ### Adding Columns
595
+
596
+ **Safe approach:**
597
+ ```sql
598
+ -- Add nullable column (safe, no downtime)
599
+ ALTER TABLE users ADD COLUMN phone VARCHAR(20);
600
+
601
+ -- Add column with default (may lock table)
602
+ ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
603
+
604
+ -- PostgreSQL: Add column with default (no lock in PG 11+)
605
+ ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
606
+ ```
607
+
608
+ **Best Practices:**
609
+ - ✅ Add columns as nullable first
610
+ - ✅ Backfill data in separate step
611
+ - ✅ Add NOT NULL constraint after backfill
612
+ - ❌ Don't add NOT NULL columns directly (causes downtime)
613
+
614
+ ### Removing Columns
615
+
616
+ **Safe approach:**
617
+ ```sql
618
+ -- Step 1: Stop using column in application code
619
+ -- Step 2: Deploy application
620
+ -- Step 3: Remove column
621
+ ALTER TABLE users DROP COLUMN phone;
622
+ ```
623
+
624
+ **Best Practices:**
625
+ - ✅ Remove column usage from code first
626
+ - ✅ Wait for deployment before dropping column
627
+ - ✅ Consider soft delete (rename to `deprecated_column`)
628
+ - ❌ Don't drop columns still in use
629
+
630
+ ### Renaming Columns
631
+
632
+ **Safe approach:**
633
+ ```sql
634
+ -- Step 1: Add new column
635
+ ALTER TABLE users ADD COLUMN email_address VARCHAR(255);
636
+
637
+ -- Step 2: Backfill data
638
+ UPDATE users SET email_address = email;
639
+
640
+ -- Step 3: Update application to use new column
641
+ -- Step 4: Deploy application
642
+ -- Step 5: Drop old column
643
+ ALTER TABLE users DROP COLUMN email;
644
+ ```
645
+
646
+ **Best Practices:**
647
+ - ✅ Use add + backfill + drop approach
648
+ - ✅ Avoid direct renames (causes downtime)
649
+ - ❌ Don't use ALTER TABLE RENAME COLUMN in production
650
+
651
+ ### Changing Column Types
652
+
653
+ **Safe approach:**
654
+ ```sql
655
+ -- Step 1: Add new column with new type
656
+ ALTER TABLE products ADD COLUMN price_new DECIMAL(10, 2);
657
+
658
+ -- Step 2: Backfill data
659
+ UPDATE products SET price_new = CAST(price AS DECIMAL(10, 2));
660
+
661
+ -- Step 3: Update application to use new column
662
+ -- Step 4: Deploy application
663
+ -- Step 5: Drop old column and rename new column
664
+ ALTER TABLE products DROP COLUMN price;
665
+ ALTER TABLE products RENAME COLUMN price_new TO price;
666
+ ```
667
+
668
+ **Best Practices:**
669
+ - ✅ Use add + backfill + drop approach
670
+ - ✅ Test type conversion thoroughly
671
+ - ❌ Don't use ALTER TABLE ALTER COLUMN TYPE directly (locks table)
672
+
673
+ ### Adding Indexes
674
+
675
+ **Safe approach:**
676
+ ```sql
677
+ -- PostgreSQL: Create index concurrently (no lock)
678
+ CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
679
+
680
+ -- MySQL: Create index (locks table)
681
+ CREATE INDEX idx_users_email ON users(email);
682
+ ```
683
+
684
+ **Best Practices:**
685
+ - ✅ Use CONCURRENTLY in PostgreSQL
686
+ - ✅ Create indexes during low-traffic periods
687
+ - ✅ Monitor index creation progress
688
+ - ❌ Don't create indexes on large tables during peak hours
689
+
690
+ ### Adding Foreign Keys
691
+
692
+ **Safe approach:**
693
+ ```sql
694
+ -- Step 1: Add column
695
+ ALTER TABLE orders ADD COLUMN user_id INT;
696
+
697
+ -- Step 2: Backfill data
698
+ UPDATE orders SET user_id = (SELECT id FROM users WHERE users.email = orders.user_email);
699
+
700
+ -- Step 3: Add NOT NULL constraint
701
+ ALTER TABLE orders ALTER COLUMN user_id SET NOT NULL;
702
+
703
+ -- Step 4: Add foreign key constraint
704
+ ALTER TABLE orders ADD CONSTRAINT fk_orders_users
705
+ FOREIGN KEY (user_id) REFERENCES users(id);
706
+ ```
707
+
708
+ **Best Practices:**
709
+ - ✅ Add column first, then constraint
710
+ - ✅ Validate data before adding constraint
711
+ - ✅ Use NOT VALID in PostgreSQL for large tables
712
+ - ❌ Don't add foreign keys without validating data
713
+
714
+ ---
715
+
716
+ ## Schema Design Checklist
717
+
718
+ ### Planning Phase
719
+
720
+ - [ ] Identify all entities and relationships
721
+ - [ ] Define cardinality and participation
722
+ - [ ] Choose primary key strategy (surrogate vs natural)
723
+ - [ ] Identify all attributes
724
+ - [ ] Determine data types
725
+ - [ ] Plan for schema evolution
726
+
727
+ ### Normalization Phase
728
+
729
+ - [ ] Ensure 1NF (atomic values)
730
+ - [ ] Ensure 2NF (no partial dependencies)
731
+ - [ ] Ensure 3NF (no transitive dependencies)
732
+ - [ ] Consider BCNF if needed
733
+ - [ ] Document denormalization decisions
734
+
735
+ ### Constraints Phase
736
+
737
+ - [ ] Add NOT NULL constraints
738
+ - [ ] Add UNIQUE constraints
739
+ - [ ] Add CHECK constraints
740
+ - [ ] Add DEFAULT values
741
+ - [ ] Add foreign key constraints
742
+ - [ ] Define ON DELETE/ON UPDATE actions
743
+
744
+ ### Indexing Phase
745
+
746
+ - [ ] Index primary keys (automatic)
747
+ - [ ] Index foreign keys
748
+ - [ ] Index frequently queried columns
749
+ - [ ] Index columns used in JOINs
750
+ - [ ] Index columns used in WHERE clauses
751
+ - [ ] Consider composite indexes
752
+
753
+ ### Documentation Phase
754
+
755
+ - [ ] Document entity relationships (ERD)
756
+ - [ ] Document constraints and their purpose
757
+ - [ ] Document denormalization decisions
758
+ - [ ] Document migration strategy
759
+ - [ ] Document naming conventions
760
+
761
+ ---
762
+
763
+ ## Common Schema Patterns
764
+
765
+ ### Soft Delete
766
+
767
+ **Pattern: Mark records as deleted instead of removing them**
768
+
769
+ ```sql
770
+ CREATE TABLE users (
771
+ id SERIAL PRIMARY KEY,
772
+ email VARCHAR(255) UNIQUE NOT NULL,
773
+ name VARCHAR(255),
774
+ deleted_at TIMESTAMP,
775
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
776
+ );
777
+
778
+ -- Query active users
779
+ SELECT * FROM users WHERE deleted_at IS NULL;
780
+
781
+ -- Soft delete
782
+ UPDATE users SET deleted_at = CURRENT_TIMESTAMP WHERE id = 1;
783
+
784
+ -- Restore
785
+ UPDATE users SET deleted_at = NULL WHERE id = 1;
786
+ ```
787
+
788
+ ### Audit Trail
789
+
790
+ **Pattern: Track all changes to records**
791
+
792
+ ```sql
793
+ CREATE TABLE users (
794
+ id SERIAL PRIMARY KEY,
795
+ email VARCHAR(255) UNIQUE NOT NULL,
796
+ name VARCHAR(255),
797
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
798
+ created_by INT REFERENCES users(id),
799
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
800
+ updated_by INT REFERENCES users(id)
801
+ );
802
+
803
+ -- Separate audit table
804
+ CREATE TABLE user_audit (
805
+ id SERIAL PRIMARY KEY,
806
+ user_id INT REFERENCES users(id),
807
+ action VARCHAR(20), -- INSERT, UPDATE, DELETE
808
+ old_values JSONB,
809
+ new_values JSONB,
810
+ changed_by INT REFERENCES users(id),
811
+ changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
812
+ );
813
+ ```
814
+
815
+ ### Polymorphic Associations
816
+
817
+ **Pattern: Associate records with multiple table types**
818
+
819
+ ```sql
820
+ -- Comments can belong to posts or products
821
+ CREATE TABLE comments (
822
+ id SERIAL PRIMARY KEY,
823
+ commentable_type VARCHAR(50), -- 'post' or 'product'
824
+ commentable_id INT,
825
+ content TEXT,
826
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
827
+ );
828
+
829
+ -- Better approach: Use separate foreign keys
830
+ CREATE TABLE comments (
831
+ id SERIAL PRIMARY KEY,
832
+ post_id INT REFERENCES posts(id),
833
+ product_id INT REFERENCES products(id),
834
+ content TEXT,
835
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
836
+ CHECK (
837
+ (post_id IS NOT NULL AND product_id IS NULL) OR
838
+ (post_id IS NULL AND product_id IS NOT NULL)
839
+ )
840
+ );
841
+ ```
842
+
843
+ ### Self-Referencing Tables
844
+
845
+ **Pattern: Hierarchical data (categories, org charts)**
846
+
847
+ ```sql
848
+ CREATE TABLE categories (
849
+ id SERIAL PRIMARY KEY,
850
+ name VARCHAR(255) NOT NULL,
851
+ parent_id INT REFERENCES categories(id),
852
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
853
+ );
854
+
855
+ -- Query with recursive CTE
856
+ WITH RECURSIVE category_tree AS (
857
+ -- Base case: root categories
858
+ SELECT id, name, parent_id, 0 AS level
859
+ FROM categories
860
+ WHERE parent_id IS NULL
861
+
862
+ UNION ALL
863
+
864
+ -- Recursive case: child categories
865
+ SELECT c.id, c.name, c.parent_id, ct.level + 1
866
+ FROM categories c
867
+ JOIN category_tree ct ON c.parent_id = ct.id
868
+ )
869
+ SELECT * FROM category_tree ORDER BY level, name;
870
+ ```
871
+
872
+ ### Many-to-Many with Attributes
873
+
874
+ **Pattern: Junction table with additional attributes**
875
+
876
+ ```sql
877
+ CREATE TABLE students (
878
+ id SERIAL PRIMARY KEY,
879
+ name VARCHAR(255)
880
+ );
881
+
882
+ CREATE TABLE courses (
883
+ id SERIAL PRIMARY KEY,
884
+ name VARCHAR(255)
885
+ );
886
+
887
+ -- Junction table with enrollment date and grade
888
+ CREATE TABLE enrollments (
889
+ student_id INT REFERENCES students(id),
890
+ course_id INT REFERENCES courses(id),
891
+ enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
892
+ grade VARCHAR(2),
893
+ PRIMARY KEY (student_id, course_id)
894
+ );
895
+ ```
896
+
897
+ ---
898
+
899
+ ## Related Documentation
900
+
901
+ - **relational-databases.md**: Relational database fundamentals
902
+ - **relational-indexing.md**: Indexing strategies
903
+ - **relational-query-optimization.md**: Query optimization
904
+ - **relational-transactions.md**: Transaction management
905
+ - **data-migration.md**: Migration strategies
906
+ - **universal-best-practices.md**: General database best practices
907
+