@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,980 @@
1
+ # Database Security Standards
2
+
3
+ ## Overview
4
+
5
+ This document covers comprehensive security standards for database development, including SQL injection prevention, input validation, encryption strategies, access control, and compliance requirements.
6
+
7
+ ---
8
+
9
+ ## SQL Injection Prevention
10
+
11
+ ### Parameterized Queries (Prepared Statements)
12
+
13
+ **ALWAYS use parameterized queries to prevent SQL injection:**
14
+
15
+ ```javascript
16
+ // ❌ BAD: String concatenation (SQL injection vulnerability)
17
+ const userId = req.query.id;
18
+ const query = `SELECT * FROM users WHERE id = ${userId}`;
19
+ const result = await db.query(query);
20
+
21
+ // ❌ BAD: Template literals (SQL injection vulnerability)
22
+ const email = req.body.email;
23
+ const query = `SELECT * FROM users WHERE email = '${email}'`;
24
+ const result = await db.query(query);
25
+
26
+ // ✅ GOOD: Parameterized query (PostgreSQL)
27
+ const userId = req.query.id;
28
+ const query = 'SELECT * FROM users WHERE id = $1';
29
+ const result = await db.query(query, [userId]);
30
+
31
+ // ✅ GOOD: Named parameters (MySQL)
32
+ const email = req.body.email;
33
+ const query = 'SELECT * FROM users WHERE email = ?';
34
+ const result = await db.query(query, [email]);
35
+
36
+ // ✅ GOOD: ORM (Prisma)
37
+ const user = await prisma.user.findUnique({
38
+ where: { id: parseInt(userId) }
39
+ });
40
+
41
+ // ✅ GOOD: Query builder (Knex)
42
+ const users = await knex('users')
43
+ .where('email', email)
44
+ .select('*');
45
+ ```
46
+
47
+ ### Dynamic Query Construction
48
+
49
+ **When building dynamic queries, use query builders or ORMs:**
50
+
51
+ ```javascript
52
+ // ❌ BAD: Dynamic query with string concatenation
53
+ function searchUsers(filters) {
54
+ let query = 'SELECT * FROM users WHERE 1=1';
55
+
56
+ if (filters.name) {
57
+ query += ` AND name = '${filters.name}'`; // SQL injection!
58
+ }
59
+
60
+ if (filters.email) {
61
+ query += ` AND email = '${filters.email}'`; // SQL injection!
62
+ }
63
+
64
+ return db.query(query);
65
+ }
66
+
67
+ // ✅ GOOD: Query builder (Knex)
68
+ function searchUsers(filters) {
69
+ let query = knex('users').select('*');
70
+
71
+ if (filters.name) {
72
+ query = query.where('name', filters.name);
73
+ }
74
+
75
+ if (filters.email) {
76
+ query = query.where('email', filters.email);
77
+ }
78
+
79
+ return query;
80
+ }
81
+
82
+ // ✅ GOOD: ORM (Prisma)
83
+ function searchUsers(filters) {
84
+ const where = {};
85
+
86
+ if (filters.name) where.name = filters.name;
87
+ if (filters.email) where.email = filters.email;
88
+
89
+ return prisma.user.findMany({ where });
90
+ }
91
+ ```
92
+
93
+ ### Stored Procedures
94
+
95
+ **Use stored procedures for complex operations:**
96
+
97
+ ```sql
98
+ -- Create stored procedure with parameterized inputs
99
+ CREATE OR REPLACE FUNCTION get_user_orders(
100
+ p_user_id INTEGER,
101
+ p_start_date DATE,
102
+ p_end_date DATE
103
+ )
104
+ RETURNS TABLE (
105
+ order_id INTEGER,
106
+ order_date TIMESTAMP,
107
+ total_amount DECIMAL
108
+ ) AS $$
109
+ BEGIN
110
+ RETURN QUERY
111
+ SELECT id, created_at, total
112
+ FROM orders
113
+ WHERE user_id = p_user_id
114
+ AND created_at BETWEEN p_start_date AND p_end_date
115
+ ORDER BY created_at DESC;
116
+ END;
117
+ $$ LANGUAGE plpgsql;
118
+ ```
119
+
120
+ ```javascript
121
+ // Call stored procedure
122
+ const result = await db.query(
123
+ 'SELECT * FROM get_user_orders($1, $2, $3)',
124
+ [userId, startDate, endDate]
125
+ );
126
+ ```
127
+
128
+ ---
129
+
130
+ ## Input Validation & Sanitization
131
+
132
+ ### Validation Before Database Operations
133
+
134
+ **Always validate input before database operations:**
135
+
136
+ ```javascript
137
+ const { z } = require('zod');
138
+
139
+ // Define validation schema
140
+ const userSchema = z.object({
141
+ email: z.string().email().max(255),
142
+ name: z.string().min(1).max(255),
143
+ age: z.number().int().min(0).max(150),
144
+ role: z.enum(['user', 'admin', 'moderator'])
145
+ });
146
+
147
+ // Validate input
148
+ async function createUser(input) {
149
+ // Validate
150
+ const validated = userSchema.parse(input);
151
+
152
+ // Insert with validated data
153
+ const result = await db.query(
154
+ 'INSERT INTO users (email, name, age, role) VALUES ($1, $2, $3, $4) RETURNING *',
155
+ [validated.email, validated.name, validated.age, validated.role]
156
+ );
157
+
158
+ return result.rows[0];
159
+ }
160
+ ```
161
+
162
+ ### Type Coercion
163
+
164
+ **Ensure proper type coercion:**
165
+
166
+ ```javascript
167
+ // ❌ BAD: No type validation
168
+ const userId = req.query.id; // Could be "1 OR 1=1"
169
+ const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
170
+
171
+ // ✅ GOOD: Type validation and coercion
172
+ const userId = parseInt(req.query.id, 10);
173
+ if (isNaN(userId)) {
174
+ throw new Error('Invalid user ID');
175
+ }
176
+ const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
177
+ ```
178
+
179
+ ### Whitelist Validation
180
+
181
+ **Use whitelist validation for limited options:**
182
+
183
+ ```javascript
184
+ // ❌ BAD: No validation on sort column
185
+ const sortBy = req.query.sort; // Could be "id; DROP TABLE users--"
186
+ const query = `SELECT * FROM users ORDER BY ${sortBy}`;
187
+
188
+ // ✅ GOOD: Whitelist validation
189
+ const ALLOWED_SORT_COLUMNS = ['id', 'name', 'email', 'created_at'];
190
+ const sortBy = req.query.sort;
191
+
192
+ if (!ALLOWED_SORT_COLUMNS.includes(sortBy)) {
193
+ throw new Error('Invalid sort column');
194
+ }
195
+
196
+ const query = `SELECT * FROM users ORDER BY ${sortBy}`;
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Output Encoding
202
+
203
+ ### Prevent Data Leakage
204
+
205
+ **Sanitize output to prevent sensitive data exposure:**
206
+
207
+ ```javascript
208
+ // ❌ BAD: Exposing sensitive fields
209
+ async function getUser(userId) {
210
+ const result = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
211
+ return result.rows[0]; // Includes password_hash, ssn, etc.
212
+ }
213
+
214
+ // ✅ GOOD: Select only necessary fields
215
+ async function getUser(userId) {
216
+ const result = await db.query(
217
+ 'SELECT id, email, name, created_at FROM users WHERE id = $1',
218
+ [userId]
219
+ );
220
+ return result.rows[0];
221
+ }
222
+
223
+ // ✅ BETTER: Use DTOs (Data Transfer Objects)
224
+ async function getUser(userId) {
225
+ const result = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
226
+ const user = result.rows[0];
227
+
228
+ return {
229
+ id: user.id,
230
+ email: user.email,
231
+ name: user.name,
232
+ createdAt: user.created_at
233
+ };
234
+ }
235
+ ```
236
+
237
+ ---
238
+
239
+ ## Least Privilege Access
240
+
241
+ ### Role-Based Access Control (RBAC)
242
+
243
+ **Create roles with minimum necessary permissions:**
244
+
245
+ ```sql
246
+ -- PostgreSQL: Create application roles
247
+
248
+ -- Read-only role
249
+ CREATE ROLE app_readonly;
250
+ GRANT CONNECT ON DATABASE mydb TO app_readonly;
251
+ GRANT USAGE ON SCHEMA public TO app_readonly;
252
+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;
253
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_readonly;
254
+
255
+ -- Read-write role (no DELETE)
256
+ CREATE ROLE app_readwrite;
257
+ GRANT CONNECT ON DATABASE mydb TO app_readwrite;
258
+ GRANT USAGE ON SCHEMA public TO app_readwrite;
259
+ GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_readwrite;
260
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE ON TABLES TO app_readwrite;
261
+
262
+ -- Admin role (full access)
263
+ CREATE ROLE app_admin;
264
+ GRANT ALL PRIVILEGES ON DATABASE mydb TO app_admin;
265
+
266
+ -- Create users with specific roles
267
+ CREATE USER app_reader WITH PASSWORD 'secure-password-1';
268
+ GRANT app_readonly TO app_reader;
269
+
270
+ CREATE USER app_writer WITH PASSWORD 'secure-password-2';
271
+ GRANT app_readwrite TO app_writer;
272
+ ```
273
+
274
+ ### Row-Level Security (RLS)
275
+
276
+ **Implement row-level security for multi-tenant applications:**
277
+
278
+ ```sql
279
+ -- PostgreSQL: Enable row-level security
280
+ ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
281
+
282
+ -- Policy: Users can only see their own documents
283
+ CREATE POLICY user_documents ON documents
284
+ FOR SELECT
285
+ USING (user_id = current_setting('app.user_id')::INTEGER);
286
+
287
+ -- Policy: Users can only update their own documents
288
+ CREATE POLICY user_documents_update ON documents
289
+ FOR UPDATE
290
+ USING (user_id = current_setting('app.user_id')::INTEGER);
291
+
292
+ -- Policy: Admins can see all documents
293
+ CREATE POLICY admin_documents ON documents
294
+ FOR ALL
295
+ USING (current_setting('app.user_role') = 'admin');
296
+ ```
297
+
298
+ ```javascript
299
+ // Set user context before queries
300
+ async function getUserDocuments(userId) {
301
+ await db.query('SET app.user_id = $1', [userId]);
302
+ await db.query('SET app.user_role = $1', ['user']);
303
+
304
+ // RLS automatically filters results
305
+ const result = await db.query('SELECT * FROM documents');
306
+ return result.rows;
307
+ }
308
+ ```
309
+
310
+ ### Column-Level Security
311
+
312
+ **Restrict access to sensitive columns:**
313
+
314
+ ```sql
315
+ -- PostgreSQL: Grant column-level permissions
316
+ GRANT SELECT (id, email, name) ON users TO app_readonly;
317
+ -- app_readonly cannot access password_hash, ssn, etc.
318
+
319
+ -- Grant specific columns for updates
320
+ GRANT UPDATE (name, email) ON users TO app_readwrite;
321
+ -- app_readwrite cannot update password_hash, role, etc.
322
+ ```
323
+
324
+ ---
325
+
326
+ ## Encryption Strategies
327
+
328
+ ### Encryption at Rest
329
+
330
+ **Database-level encryption:**
331
+
332
+ ```sql
333
+ -- PostgreSQL: Use pgcrypto for column-level encryption
334
+ CREATE EXTENSION IF NOT EXISTS pgcrypto;
335
+
336
+ -- Encrypt sensitive data
337
+ CREATE TABLE users (
338
+ id SERIAL PRIMARY KEY,
339
+ email VARCHAR(255) NOT NULL,
340
+ ssn BYTEA, -- Encrypted
341
+ credit_card BYTEA, -- Encrypted
342
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
343
+ );
344
+
345
+ -- Insert encrypted data
346
+ INSERT INTO users (email, ssn, credit_card)
347
+ VALUES (
348
+ 'user@example.com',
349
+ pgp_sym_encrypt('123-45-6789', current_setting('app.encryption_key')),
350
+ pgp_sym_encrypt('4111-1111-1111-1111', current_setting('app.encryption_key'))
351
+ );
352
+
353
+ -- Query encrypted data
354
+ SELECT
355
+ id,
356
+ email,
357
+ pgp_sym_decrypt(ssn, current_setting('app.encryption_key')) AS ssn,
358
+ pgp_sym_decrypt(credit_card, current_setting('app.encryption_key')) AS credit_card
359
+ FROM users
360
+ WHERE id = 1;
361
+ ```
362
+
363
+ **Application-level encryption:**
364
+
365
+ ```javascript
366
+ const crypto = require('crypto');
367
+
368
+ // Encryption configuration
369
+ const ALGORITHM = 'aes-256-gcm';
370
+ const KEY = Buffer.from(process.env.ENCRYPTION_KEY, 'hex'); // 32 bytes
371
+
372
+ function encrypt(text) {
373
+ const iv = crypto.randomBytes(16);
374
+ const cipher = crypto.createCipheriv(ALGORITHM, KEY, iv);
375
+
376
+ let encrypted = cipher.update(text, 'utf8', 'hex');
377
+ encrypted += cipher.final('hex');
378
+
379
+ const authTag = cipher.getAuthTag();
380
+
381
+ return {
382
+ encrypted,
383
+ iv: iv.toString('hex'),
384
+ authTag: authTag.toString('hex')
385
+ };
386
+ }
387
+
388
+ function decrypt(encrypted, iv, authTag) {
389
+ const decipher = crypto.createDecipheriv(
390
+ ALGORITHM,
391
+ KEY,
392
+ Buffer.from(iv, 'hex')
393
+ );
394
+
395
+ decipher.setAuthTag(Buffer.from(authTag, 'hex'));
396
+
397
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
398
+ decrypted += decipher.final('utf8');
399
+
400
+ return decrypted;
401
+ }
402
+
403
+ // Usage
404
+ async function createUser(userData) {
405
+ const encryptedSSN = encrypt(userData.ssn);
406
+
407
+ await db.query(
408
+ 'INSERT INTO users (email, ssn, ssn_iv, ssn_auth_tag) VALUES ($1, $2, $3, $4)',
409
+ [userData.email, encryptedSSN.encrypted, encryptedSSN.iv, encryptedSSN.authTag]
410
+ );
411
+ }
412
+ ```
413
+
414
+ ### Encryption in Transit
415
+
416
+ **Always use SSL/TLS connections:**
417
+
418
+ ```javascript
419
+ // PostgreSQL with SSL
420
+ const { Pool } = require('pg');
421
+
422
+ const pool = new Pool({
423
+ host: process.env.DB_HOST,
424
+ database: process.env.DB_NAME,
425
+ user: process.env.DB_USER,
426
+ password: process.env.DB_PASSWORD,
427
+ ssl: {
428
+ rejectUnauthorized: true,
429
+ ca: fs.readFileSync('/path/to/ca-cert.pem').toString(),
430
+ key: fs.readFileSync('/path/to/client-key.pem').toString(),
431
+ cert: fs.readFileSync('/path/to/client-cert.pem').toString()
432
+ }
433
+ });
434
+ ```
435
+
436
+ ```python
437
+ # MySQL with SSL (Python)
438
+ import mysql.connector
439
+
440
+ connection = mysql.connector.connect(
441
+ host='db.example.com',
442
+ user='dbuser',
443
+ password=os.environ['DB_PASSWORD'],
444
+ database='mydb',
445
+ ssl_ca='/path/to/ca-cert.pem',
446
+ ssl_cert='/path/to/client-cert.pem',
447
+ ssl_key='/path/to/client-key.pem',
448
+ ssl_verify_cert=True
449
+ )
450
+ ```
451
+
452
+ ---
453
+
454
+ ## Secure Connection Strings
455
+
456
+ ### Environment Variables
457
+
458
+ **Store connection strings in environment variables:**
459
+
460
+ ```javascript
461
+ // ❌ BAD: Hardcoded connection string
462
+ const pool = new Pool({
463
+ connectionString: 'postgresql://admin:password123@db.example.com:5432/mydb'
464
+ });
465
+
466
+ // ✅ GOOD: Environment variable
467
+ const pool = new Pool({
468
+ connectionString: process.env.DATABASE_URL
469
+ });
470
+
471
+ // ✅ BETTER: Individual environment variables
472
+ const pool = new Pool({
473
+ host: process.env.DB_HOST,
474
+ port: parseInt(process.env.DB_PORT, 10),
475
+ database: process.env.DB_NAME,
476
+ user: process.env.DB_USER,
477
+ password: process.env.DB_PASSWORD
478
+ });
479
+ ```
480
+
481
+ ### Secrets Management
482
+
483
+ **Use dedicated secrets management systems:**
484
+
485
+ ```javascript
486
+ // AWS Secrets Manager
487
+ const AWS = require('aws-sdk');
488
+ const secretsManager = new AWS.SecretsManager({ region: 'us-east-1' });
489
+
490
+ async function getDatabaseCredentials() {
491
+ const secret = await secretsManager.getSecretValue({
492
+ SecretId: 'prod/database/credentials'
493
+ }).promise();
494
+
495
+ return JSON.parse(secret.SecretString);
496
+ }
497
+
498
+ async function createDatabasePool() {
499
+ const credentials = await getDatabaseCredentials();
500
+
501
+ return new Pool({
502
+ host: credentials.host,
503
+ database: credentials.database,
504
+ user: credentials.username,
505
+ password: credentials.password,
506
+ ssl: { rejectUnauthorized: true }
507
+ });
508
+ }
509
+ ```
510
+
511
+ ```javascript
512
+ // HashiCorp Vault
513
+ const vault = require('node-vault')({
514
+ endpoint: process.env.VAULT_ADDR,
515
+ token: process.env.VAULT_TOKEN
516
+ });
517
+
518
+ async function getDatabaseCredentials() {
519
+ const result = await vault.read('secret/data/database/prod');
520
+ return result.data.data;
521
+ }
522
+ ```
523
+
524
+ ---
525
+
526
+ ## Audit Logging
527
+
528
+ ### Comprehensive Audit Trail
529
+
530
+ **Log all database operations for sensitive data:**
531
+
532
+ ```sql
533
+ -- Create audit log table
534
+ CREATE TABLE audit_log (
535
+ id BIGSERIAL PRIMARY KEY,
536
+ table_name VARCHAR(255) NOT NULL,
537
+ record_id BIGINT NOT NULL,
538
+ operation VARCHAR(10) NOT NULL, -- INSERT, UPDATE, DELETE, SELECT
539
+ user_id BIGINT,
540
+ user_ip INET,
541
+ user_agent TEXT,
542
+ old_values JSONB,
543
+ new_values JSONB,
544
+ changed_fields TEXT[],
545
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
546
+ INDEX idx_audit_table_record (table_name, record_id),
547
+ INDEX idx_audit_user (user_id),
548
+ INDEX idx_audit_timestamp (timestamp)
549
+ );
550
+
551
+ -- Audit trigger function
552
+ CREATE OR REPLACE FUNCTION audit_trigger()
553
+ RETURNS TRIGGER AS $$
554
+ DECLARE
555
+ old_data JSONB;
556
+ new_data JSONB;
557
+ changed_fields TEXT[];
558
+ BEGIN
559
+ IF (TG_OP = 'DELETE') THEN
560
+ old_data = to_jsonb(OLD);
561
+ new_data = NULL;
562
+ ELSIF (TG_OP = 'UPDATE') THEN
563
+ old_data = to_jsonb(OLD);
564
+ new_data = to_jsonb(NEW);
565
+
566
+ -- Identify changed fields
567
+ SELECT array_agg(key)
568
+ INTO changed_fields
569
+ FROM jsonb_each(old_data)
570
+ WHERE old_data->key IS DISTINCT FROM new_data->key;
571
+ ELSIF (TG_OP = 'INSERT') THEN
572
+ old_data = NULL;
573
+ new_data = to_jsonb(NEW);
574
+ END IF;
575
+
576
+ INSERT INTO audit_log (
577
+ table_name,
578
+ record_id,
579
+ operation,
580
+ user_id,
581
+ user_ip,
582
+ old_values,
583
+ new_values,
584
+ changed_fields
585
+ ) VALUES (
586
+ TG_TABLE_NAME,
587
+ COALESCE(NEW.id, OLD.id),
588
+ TG_OP,
589
+ current_setting('app.user_id', true)::BIGINT,
590
+ current_setting('app.user_ip', true)::INET,
591
+ old_data,
592
+ new_data,
593
+ changed_fields
594
+ );
595
+
596
+ RETURN COALESCE(NEW, OLD);
597
+ END;
598
+ $$ LANGUAGE plpgsql;
599
+
600
+ -- Apply audit trigger to sensitive tables
601
+ CREATE TRIGGER audit_users
602
+ AFTER INSERT OR UPDATE OR DELETE ON users
603
+ FOR EACH ROW EXECUTE FUNCTION audit_trigger();
604
+
605
+ CREATE TRIGGER audit_transactions
606
+ AFTER INSERT OR UPDATE OR DELETE ON transactions
607
+ FOR EACH ROW EXECUTE FUNCTION audit_trigger();
608
+ ```
609
+
610
+ ### Application-Level Audit Logging
611
+
612
+ ```javascript
613
+ // Middleware for audit logging
614
+ async function auditLog(req, res, next) {
615
+ const originalQuery = db.query.bind(db);
616
+
617
+ db.query = async function(query, params) {
618
+ const result = await originalQuery(query, params);
619
+
620
+ // Log query execution
621
+ await originalQuery(
622
+ 'INSERT INTO query_audit_log (user_id, query, params, ip_address, user_agent) VALUES ($1, $2, $3, $4, $5)',
623
+ [
624
+ req.user?.id,
625
+ query,
626
+ JSON.stringify(params),
627
+ req.ip,
628
+ req.get('user-agent')
629
+ ]
630
+ );
631
+
632
+ return result;
633
+ };
634
+
635
+ next();
636
+ }
637
+ ```
638
+
639
+ ---
640
+
641
+ ## Compliance Requirements
642
+
643
+ ### GDPR (General Data Protection Regulation)
644
+
645
+ **Key Requirements:**
646
+ - ✅ Data minimization: Collect only necessary data
647
+ - ✅ Purpose limitation: Use data only for stated purposes
648
+ - ✅ Storage limitation: Delete data when no longer needed
649
+ - ✅ Right to access: Provide user data on request
650
+ - ✅ Right to erasure: Delete user data on request
651
+ - ✅ Data portability: Export user data in machine-readable format
652
+ - ✅ Consent management: Track and honor user consent
653
+
654
+ ```sql
655
+ -- GDPR: Right to access
656
+ CREATE OR REPLACE FUNCTION export_user_data(p_user_id INTEGER)
657
+ RETURNS JSONB AS $$
658
+ DECLARE
659
+ user_data JSONB;
660
+ BEGIN
661
+ SELECT jsonb_build_object(
662
+ 'user', (SELECT row_to_json(u.*) FROM users u WHERE u.id = p_user_id),
663
+ 'orders', (SELECT jsonb_agg(o.*) FROM orders o WHERE o.user_id = p_user_id),
664
+ 'preferences', (SELECT row_to_json(p.*) FROM user_preferences p WHERE p.user_id = p_user_id),
665
+ 'audit_log', (SELECT jsonb_agg(a.*) FROM audit_log a WHERE a.user_id = p_user_id)
666
+ ) INTO user_data;
667
+
668
+ RETURN user_data;
669
+ END;
670
+ $$ LANGUAGE plpgsql;
671
+
672
+ -- GDPR: Right to erasure
673
+ CREATE OR REPLACE FUNCTION delete_user_data(p_user_id INTEGER)
674
+ RETURNS VOID AS $$
675
+ BEGIN
676
+ -- Anonymize instead of delete (for audit trail)
677
+ UPDATE users
678
+ SET
679
+ email = 'deleted_' || id || '@example.com',
680
+ name = 'DELETED',
681
+ phone = NULL,
682
+ address = NULL,
683
+ deleted_at = CURRENT_TIMESTAMP
684
+ WHERE id = p_user_id;
685
+
686
+ -- Delete related data
687
+ DELETE FROM user_preferences WHERE user_id = p_user_id;
688
+ DELETE FROM sessions WHERE user_id = p_user_id;
689
+
690
+ -- Keep orders for legal/accounting purposes but anonymize
691
+ UPDATE orders
692
+ SET user_id = NULL
693
+ WHERE user_id = p_user_id;
694
+ END;
695
+ $$ LANGUAGE plpgsql;
696
+ ```
697
+
698
+ ### HIPAA (Health Insurance Portability and Accountability Act)
699
+
700
+ **Key Requirements:**
701
+ - ✅ Access controls: Limit access to PHI (Protected Health Information)
702
+ - ✅ Audit controls: Log all access to PHI
703
+ - ✅ Integrity controls: Ensure PHI is not altered or destroyed
704
+ - ✅ Transmission security: Encrypt PHI in transit
705
+ - ✅ Encryption: Encrypt PHI at rest
706
+
707
+ ```sql
708
+ -- HIPAA: Audit all PHI access
709
+ CREATE TABLE phi_access_log (
710
+ id BIGSERIAL PRIMARY KEY,
711
+ user_id BIGINT NOT NULL,
712
+ patient_id BIGINT NOT NULL,
713
+ access_type VARCHAR(50) NOT NULL, -- VIEW, EDIT, DELETE
714
+ accessed_fields TEXT[],
715
+ ip_address INET,
716
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
717
+ INDEX idx_phi_patient (patient_id),
718
+ INDEX idx_phi_user (user_id),
719
+ INDEX idx_phi_timestamp (timestamp)
720
+ );
721
+
722
+ -- Trigger to log PHI access
723
+ CREATE OR REPLACE FUNCTION log_phi_access()
724
+ RETURNS TRIGGER AS $$
725
+ BEGIN
726
+ INSERT INTO phi_access_log (user_id, patient_id, access_type, accessed_fields)
727
+ VALUES (
728
+ current_setting('app.user_id')::BIGINT,
729
+ NEW.id,
730
+ TG_OP,
731
+ ARRAY['medical_record_number', 'diagnosis', 'treatment']
732
+ );
733
+
734
+ RETURN NEW;
735
+ END;
736
+ $$ LANGUAGE plpgsql;
737
+
738
+ CREATE TRIGGER log_patient_access
739
+ AFTER SELECT OR UPDATE ON patients
740
+ FOR EACH ROW EXECUTE FUNCTION log_phi_access();
741
+ ```
742
+
743
+ ### PCI DSS (Payment Card Industry Data Security Standard)
744
+
745
+ **Key Requirements:**
746
+ - ✅ Never store full magnetic stripe, CVV2, or PIN data
747
+ - ✅ Encrypt cardholder data at rest
748
+ - ✅ Encrypt cardholder data in transit
749
+ - ✅ Implement strong access controls
750
+ - ✅ Regularly test security systems
751
+
752
+ ```sql
753
+ -- PCI DSS: Store only necessary card data
754
+ CREATE TABLE payment_methods (
755
+ id BIGSERIAL PRIMARY KEY,
756
+ user_id BIGINT NOT NULL,
757
+ card_last_four CHAR(4) NOT NULL, -- Only last 4 digits
758
+ card_brand VARCHAR(20) NOT NULL, -- Visa, Mastercard, etc.
759
+ expiry_month SMALLINT NOT NULL,
760
+ expiry_year SMALLINT NOT NULL,
761
+ billing_zip VARCHAR(10),
762
+ token VARCHAR(255) NOT NULL, -- Payment gateway token
763
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
764
+ -- DO NOT store: full card number, CVV, magnetic stripe data
765
+ INDEX idx_payment_user (user_id)
766
+ );
767
+ ```
768
+
769
+ ---
770
+
771
+ ## Security Best Practices Summary
772
+
773
+ ### Input Security
774
+
775
+ ✅ **DO:**
776
+ - Use parameterized queries/prepared statements
777
+ - Validate all input (type, format, range)
778
+ - Use whitelist validation for limited options
779
+ - Use ORMs or query builders for dynamic queries
780
+ - Sanitize input before database operations
781
+
782
+ ❌ **DON'T:**
783
+ - Concatenate user input into SQL queries
784
+ - Trust user input without validation
785
+ - Use dynamic SQL without parameterization
786
+ - Skip input validation
787
+
788
+ ### Access Control
789
+
790
+ ✅ **DO:**
791
+ - Implement least privilege access
792
+ - Use role-based access control (RBAC)
793
+ - Enable row-level security for multi-tenant apps
794
+ - Use column-level permissions for sensitive data
795
+ - Regularly audit and review permissions
796
+
797
+ ❌ **DON'T:**
798
+ - Use superuser accounts for applications
799
+ - Share credentials between environments
800
+ - Grant excessive permissions
801
+ - Skip access control reviews
802
+
803
+ ### Encryption
804
+
805
+ ✅ **DO:**
806
+ - Encrypt sensitive data at rest
807
+ - Use SSL/TLS for all connections
808
+ - Store encryption keys in secure key management systems
809
+ - Rotate encryption keys regularly
810
+ - Use strong encryption algorithms (AES-256)
811
+
812
+ ❌ **DON'T:**
813
+ - Store encryption keys in code or version control
814
+ - Use weak encryption algorithms
815
+ - Skip encryption for sensitive data
816
+ - Allow unencrypted connections
817
+
818
+ ### Audit & Compliance
819
+
820
+ ✅ **DO:**
821
+ - Log all access to sensitive data
822
+ - Implement comprehensive audit trails
823
+ - Understand compliance requirements (GDPR, HIPAA, PCI DSS)
824
+ - Regularly review audit logs
825
+ - Implement data retention policies
826
+
827
+ ❌ **DON'T:**
828
+ - Skip audit logging for sensitive operations
829
+ - Ignore compliance requirements
830
+ - Store data longer than necessary
831
+ - Fail to implement user data export/deletion
832
+
833
+ ### Secrets Management
834
+
835
+ ✅ **DO:**
836
+ - Use environment variables for connection strings
837
+ - Use dedicated secrets management systems (AWS Secrets Manager, Vault)
838
+ - Rotate credentials regularly
839
+ - Use different credentials per environment
840
+ - Implement credential rotation
841
+
842
+ ❌ **DON'T:**
843
+ - Hardcode credentials in code
844
+ - Commit credentials to version control
845
+ - Share credentials via email or chat
846
+ - Use same credentials across environments
847
+
848
+ ---
849
+
850
+ ## Common Security Vulnerabilities
851
+
852
+ ### SQL Injection
853
+
854
+ **Vulnerability:**
855
+ ```javascript
856
+ // ❌ VULNERABLE
857
+ const query = `SELECT * FROM users WHERE email = '${req.body.email}'`;
858
+ ```
859
+
860
+ **Attack:**
861
+ ```
862
+ email = "' OR '1'='1' --"
863
+ Result: SELECT * FROM users WHERE email = '' OR '1'='1' --'
864
+ ```
865
+
866
+ **Fix:**
867
+ ```javascript
868
+ // ✅ SECURE
869
+ const query = 'SELECT * FROM users WHERE email = $1';
870
+ const result = await db.query(query, [req.body.email]);
871
+ ```
872
+
873
+ ### NoSQL Injection
874
+
875
+ **Vulnerability:**
876
+ ```javascript
877
+ // ❌ VULNERABLE
878
+ const user = await db.users.findOne({
879
+ email: req.body.email,
880
+ password: req.body.password
881
+ });
882
+ ```
883
+
884
+ **Attack:**
885
+ ```json
886
+ {
887
+ "email": "admin@example.com",
888
+ "password": { "$ne": null }
889
+ }
890
+ ```
891
+
892
+ **Fix:**
893
+ ```javascript
894
+ // ✅ SECURE
895
+ const email = String(req.body.email);
896
+ const password = String(req.body.password);
897
+
898
+ const user = await db.users.findOne({ email, password });
899
+ ```
900
+
901
+ ### Insufficient Access Controls
902
+
903
+ **Vulnerability:**
904
+ ```javascript
905
+ // ❌ VULNERABLE: No authorization check
906
+ async function deleteUser(userId) {
907
+ await db.query('DELETE FROM users WHERE id = $1', [userId]);
908
+ }
909
+ ```
910
+
911
+ **Fix:**
912
+ ```javascript
913
+ // ✅ SECURE: Check authorization
914
+ async function deleteUser(userId, requestingUserId) {
915
+ // Check if requesting user is admin or deleting their own account
916
+ const requestingUser = await getUser(requestingUserId);
917
+
918
+ if (requestingUser.role !== 'admin' && requestingUserId !== userId) {
919
+ throw new Error('Unauthorized');
920
+ }
921
+
922
+ await db.query('DELETE FROM users WHERE id = $1', [userId]);
923
+ }
924
+ ```
925
+
926
+ ---
927
+
928
+ ## Security Checklist
929
+
930
+ ### Development
931
+
932
+ - [ ] Use parameterized queries for all database operations
933
+ - [ ] Validate and sanitize all input
934
+ - [ ] Implement least privilege access
935
+ - [ ] Encrypt sensitive data at rest
936
+ - [ ] Use SSL/TLS for all connections
937
+ - [ ] Store secrets in secure management systems
938
+ - [ ] Implement comprehensive audit logging
939
+ - [ ] Follow compliance requirements (GDPR, HIPAA, PCI DSS)
940
+
941
+ ### Deployment
942
+
943
+ - [ ] Use different credentials per environment
944
+ - [ ] Enable database firewall rules
945
+ - [ ] Restrict database access to application servers only
946
+ - [ ] Enable SSL/TLS certificate verification
947
+ - [ ] Configure automatic security updates
948
+ - [ ] Set up intrusion detection
949
+ - [ ] Implement rate limiting
950
+ - [ ] Enable query logging for production
951
+
952
+ ### Monitoring
953
+
954
+ - [ ] Monitor failed login attempts
955
+ - [ ] Alert on suspicious query patterns
956
+ - [ ] Review audit logs regularly
957
+ - [ ] Track access to sensitive data
958
+ - [ ] Monitor for SQL injection attempts
959
+ - [ ] Set up security incident response procedures
960
+
961
+ ---
962
+
963
+ ## Summary
964
+
965
+ **Key Security Principles:**
966
+
967
+ 1. **Defense in Depth**: Multiple layers of security (input validation, parameterized queries, access controls, encryption)
968
+ 2. **Least Privilege**: Grant minimum necessary permissions
969
+ 3. **Encryption Everywhere**: Encrypt data at rest and in transit
970
+ 4. **Audit Everything**: Log all access to sensitive data
971
+ 5. **Compliance First**: Understand and implement regulatory requirements
972
+
973
+ **Critical Rules:**
974
+ - ❌ NEVER concatenate user input into SQL queries
975
+ - ❌ NEVER store credentials in code or version control
976
+ - ❌ NEVER use superuser accounts for applications
977
+ - ❌ NEVER skip input validation
978
+ - ❌ NEVER allow unencrypted connections to production databases
979
+
980
+