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