@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.
- 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/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/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- 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/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- 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.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- 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/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/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 +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -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 +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,687 @@
|
|
|
1
|
+
# Graph-Augmented MCP Guidelines
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
**Graph-augmented MCP** uses knowledge graphs to model entities, relationships, and temporal dynamics. This enables structured reasoning, relationship traversal, and context-aware retrieval.
|
|
6
|
+
|
|
7
|
+
**Key Challenge**: Extracting entities and relationships accurately, maintaining graph consistency, and efficiently traversing large graphs.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Entity Extraction
|
|
12
|
+
|
|
13
|
+
### Named Entity Recognition (NER)
|
|
14
|
+
|
|
15
|
+
Extract entities using NER models:
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import spacy
|
|
19
|
+
|
|
20
|
+
def extract_entities_ner(text: str):
|
|
21
|
+
"""Extract entities using spaCy NER"""
|
|
22
|
+
nlp = spacy.load("en_core_web_sm")
|
|
23
|
+
doc = nlp(text)
|
|
24
|
+
|
|
25
|
+
entities = []
|
|
26
|
+
for ent in doc.ents:
|
|
27
|
+
entities.append({
|
|
28
|
+
'text': ent.text,
|
|
29
|
+
'type': ent.label_,
|
|
30
|
+
'start': ent.start_char,
|
|
31
|
+
'end': ent.end_char
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
return entities
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### LLM-Based Extraction
|
|
38
|
+
|
|
39
|
+
Use LLMs for complex entity extraction:
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
def extract_entities_llm(text: str):
|
|
43
|
+
"""Extract entities using LLM"""
|
|
44
|
+
prompt = f"""
|
|
45
|
+
Extract all entities from the following text.
|
|
46
|
+
For each entity, provide:
|
|
47
|
+
- name: The entity name
|
|
48
|
+
- type: The entity type (PERSON, ORG, LOCATION, PRODUCT, etc.)
|
|
49
|
+
- description: Brief description
|
|
50
|
+
|
|
51
|
+
Text: {text}
|
|
52
|
+
|
|
53
|
+
Return as JSON array: [{{"name": "...", "type": "...", "description": "..."}}, ...]
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
response = llm_call(prompt)
|
|
57
|
+
entities = json.loads(response)
|
|
58
|
+
|
|
59
|
+
return entities
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Hybrid Extraction
|
|
63
|
+
|
|
64
|
+
Combine NER and LLM:
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
def extract_entities_hybrid(text: str):
|
|
68
|
+
"""Hybrid entity extraction"""
|
|
69
|
+
# Stage 1: NER for common entities
|
|
70
|
+
ner_entities = extract_entities_ner(text)
|
|
71
|
+
|
|
72
|
+
# Stage 2: LLM for domain-specific entities
|
|
73
|
+
llm_entities = extract_entities_llm(text)
|
|
74
|
+
|
|
75
|
+
# Merge and deduplicate
|
|
76
|
+
all_entities = {}
|
|
77
|
+
|
|
78
|
+
for entity in ner_entities:
|
|
79
|
+
key = entity['text'].lower()
|
|
80
|
+
all_entities[key] = entity
|
|
81
|
+
|
|
82
|
+
for entity in llm_entities:
|
|
83
|
+
key = entity['name'].lower()
|
|
84
|
+
if key not in all_entities:
|
|
85
|
+
all_entities[key] = {
|
|
86
|
+
'text': entity['name'],
|
|
87
|
+
'type': entity['type'],
|
|
88
|
+
'description': entity.get('description', '')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return list(all_entities.values())
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Best Practices**:
|
|
95
|
+
- Use NER for speed and common entities
|
|
96
|
+
- Use LLM for domain-specific entities
|
|
97
|
+
- Combine both for best results
|
|
98
|
+
- Validate and deduplicate entities
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 2. Relationship Extraction
|
|
103
|
+
|
|
104
|
+
### Pattern-Based Extraction
|
|
105
|
+
|
|
106
|
+
Use dependency parsing:
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
def extract_relationships_pattern(text: str):
|
|
110
|
+
"""Extract relationships using dependency parsing"""
|
|
111
|
+
nlp = spacy.load("en_core_web_sm")
|
|
112
|
+
doc = nlp(text)
|
|
113
|
+
|
|
114
|
+
relationships = []
|
|
115
|
+
|
|
116
|
+
for token in doc:
|
|
117
|
+
if token.dep_ in ['nsubj', 'dobj']:
|
|
118
|
+
# Subject-Verb-Object pattern
|
|
119
|
+
subject = token.text
|
|
120
|
+
verb = token.head.text
|
|
121
|
+
|
|
122
|
+
# Find object
|
|
123
|
+
for child in token.head.children:
|
|
124
|
+
if child.dep_ == 'dobj':
|
|
125
|
+
obj = child.text
|
|
126
|
+
relationships.append({
|
|
127
|
+
'subject': subject,
|
|
128
|
+
'predicate': verb,
|
|
129
|
+
'object': obj
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
return relationships
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### LLM-Based Extraction
|
|
136
|
+
|
|
137
|
+
Use LLMs for complex relationships:
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
def extract_relationships_llm(text: str, entities: list):
|
|
141
|
+
"""Extract relationships using LLM"""
|
|
142
|
+
entity_names = [e['text'] for e in entities]
|
|
143
|
+
|
|
144
|
+
prompt = f"""
|
|
145
|
+
Given these entities: {', '.join(entity_names)}
|
|
146
|
+
|
|
147
|
+
Extract all relationships from the text.
|
|
148
|
+
For each relationship, provide:
|
|
149
|
+
- subject: Entity 1
|
|
150
|
+
- predicate: Relationship type
|
|
151
|
+
- object: Entity 2
|
|
152
|
+
- confidence: 0-1 score
|
|
153
|
+
|
|
154
|
+
Text: {text}
|
|
155
|
+
|
|
156
|
+
Return as JSON array: [{{"subject": "...", "predicate": "...", "object": "...", "confidence": 0.9}}, ...]
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
response = llm_call(prompt)
|
|
160
|
+
relationships = json.loads(response)
|
|
161
|
+
|
|
162
|
+
return relationships
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Best Practices**:
|
|
166
|
+
- Extract entities first, then relationships
|
|
167
|
+
- Use pattern-based for simple relationships
|
|
168
|
+
- Use LLM for complex, domain-specific relationships
|
|
169
|
+
- Validate relationship consistency
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 3. Graph Modeling
|
|
174
|
+
|
|
175
|
+
### Graph Schema
|
|
176
|
+
|
|
177
|
+
Define graph schema:
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from pydantic import BaseModel
|
|
181
|
+
from typing import List, Dict, Optional
|
|
182
|
+
from datetime import datetime
|
|
183
|
+
|
|
184
|
+
class Entity(BaseModel):
|
|
185
|
+
id: str
|
|
186
|
+
name: str
|
|
187
|
+
type: str
|
|
188
|
+
properties: Dict[str, any] = {}
|
|
189
|
+
created_at: datetime
|
|
190
|
+
updated_at: datetime
|
|
191
|
+
|
|
192
|
+
class Relationship(BaseModel):
|
|
193
|
+
id: str
|
|
194
|
+
subject_id: str
|
|
195
|
+
predicate: str
|
|
196
|
+
object_id: str
|
|
197
|
+
properties: Dict[str, any] = {}
|
|
198
|
+
confidence: float = 1.0
|
|
199
|
+
created_at: datetime
|
|
200
|
+
updated_at: datetime
|
|
201
|
+
|
|
202
|
+
class KnowledgeGraph(BaseModel):
|
|
203
|
+
entities: Dict[str, Entity] = {}
|
|
204
|
+
relationships: List[Relationship] = []
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Graph Construction
|
|
208
|
+
|
|
209
|
+
Build graph from text:
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
class GraphBuilder:
|
|
213
|
+
"""Build knowledge graph from text"""
|
|
214
|
+
|
|
215
|
+
def __init__(self):
|
|
216
|
+
self.graph = KnowledgeGraph()
|
|
217
|
+
|
|
218
|
+
def add_text(self, text: str):
|
|
219
|
+
"""Add text to graph"""
|
|
220
|
+
# Extract entities
|
|
221
|
+
entities = extract_entities_hybrid(text)
|
|
222
|
+
|
|
223
|
+
# Add entities to graph
|
|
224
|
+
for entity in entities:
|
|
225
|
+
entity_id = self.generate_id(entity['text'])
|
|
226
|
+
if entity_id not in self.graph.entities:
|
|
227
|
+
self.graph.entities[entity_id] = Entity(
|
|
228
|
+
id=entity_id,
|
|
229
|
+
name=entity['text'],
|
|
230
|
+
type=entity['type'],
|
|
231
|
+
created_at=datetime.now(),
|
|
232
|
+
updated_at=datetime.now()
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
# Extract relationships
|
|
236
|
+
relationships = extract_relationships_llm(text, entities)
|
|
237
|
+
|
|
238
|
+
# Add relationships to graph
|
|
239
|
+
for rel in relationships:
|
|
240
|
+
subject_id = self.generate_id(rel['subject'])
|
|
241
|
+
object_id = self.generate_id(rel['object'])
|
|
242
|
+
|
|
243
|
+
if subject_id in self.graph.entities and object_id in self.graph.entities:
|
|
244
|
+
self.graph.relationships.append(Relationship(
|
|
245
|
+
id=self.generate_id(f"{subject_id}-{rel['predicate']}-{object_id}"),
|
|
246
|
+
subject_id=subject_id,
|
|
247
|
+
predicate=rel['predicate'],
|
|
248
|
+
object_id=object_id,
|
|
249
|
+
confidence=rel.get('confidence', 1.0),
|
|
250
|
+
created_at=datetime.now(),
|
|
251
|
+
updated_at=datetime.now()
|
|
252
|
+
))
|
|
253
|
+
|
|
254
|
+
def generate_id(self, text: str) -> str:
|
|
255
|
+
"""Generate stable ID from text"""
|
|
256
|
+
import hashlib
|
|
257
|
+
return hashlib.md5(text.lower().encode()).hexdigest()[:8]
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Best Practices**:
|
|
261
|
+
- Use stable IDs (hash-based)
|
|
262
|
+
- Version graph schema
|
|
263
|
+
- Validate graph consistency
|
|
264
|
+
- Support incremental updates
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 4. Graph Traversal
|
|
269
|
+
|
|
270
|
+
### Breadth-First Search (BFS)
|
|
271
|
+
|
|
272
|
+
Find related entities:
|
|
273
|
+
|
|
274
|
+
```python
|
|
275
|
+
from collections import deque
|
|
276
|
+
|
|
277
|
+
def bfs_traverse(graph: KnowledgeGraph, start_entity_id: str, max_depth=2):
|
|
278
|
+
"""BFS traversal from start entity"""
|
|
279
|
+
visited = set()
|
|
280
|
+
queue = deque([(start_entity_id, 0)])
|
|
281
|
+
results = []
|
|
282
|
+
|
|
283
|
+
while queue:
|
|
284
|
+
entity_id, depth = queue.popleft()
|
|
285
|
+
|
|
286
|
+
if entity_id in visited or depth > max_depth:
|
|
287
|
+
continue
|
|
288
|
+
|
|
289
|
+
visited.add(entity_id)
|
|
290
|
+
|
|
291
|
+
# Add entity to results
|
|
292
|
+
if entity_id in graph.entities:
|
|
293
|
+
results.append({
|
|
294
|
+
'entity': graph.entities[entity_id],
|
|
295
|
+
'depth': depth
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
# Find connected entities
|
|
299
|
+
for rel in graph.relationships:
|
|
300
|
+
if rel.subject_id == entity_id and rel.object_id not in visited:
|
|
301
|
+
queue.append((rel.object_id, depth + 1))
|
|
302
|
+
elif rel.object_id == entity_id and rel.subject_id not in visited:
|
|
303
|
+
queue.append((rel.subject_id, depth + 1))
|
|
304
|
+
|
|
305
|
+
return results
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Path Finding
|
|
309
|
+
|
|
310
|
+
Find paths between entities:
|
|
311
|
+
|
|
312
|
+
```python
|
|
313
|
+
def find_paths(graph: KnowledgeGraph, start_id: str, end_id: str, max_depth=3):
|
|
314
|
+
"""Find all paths between two entities"""
|
|
315
|
+
paths = []
|
|
316
|
+
|
|
317
|
+
def dfs(current_id, target_id, path, visited, depth):
|
|
318
|
+
if depth > max_depth:
|
|
319
|
+
return
|
|
320
|
+
|
|
321
|
+
if current_id == target_id:
|
|
322
|
+
paths.append(path.copy())
|
|
323
|
+
return
|
|
324
|
+
|
|
325
|
+
visited.add(current_id)
|
|
326
|
+
|
|
327
|
+
# Explore neighbors
|
|
328
|
+
for rel in graph.relationships:
|
|
329
|
+
next_id = None
|
|
330
|
+
if rel.subject_id == current_id and rel.object_id not in visited:
|
|
331
|
+
next_id = rel.object_id
|
|
332
|
+
elif rel.object_id == current_id and rel.subject_id not in visited:
|
|
333
|
+
next_id = rel.subject_id
|
|
334
|
+
|
|
335
|
+
if next_id:
|
|
336
|
+
path.append((rel, next_id))
|
|
337
|
+
dfs(next_id, target_id, path, visited, depth + 1)
|
|
338
|
+
path.pop()
|
|
339
|
+
|
|
340
|
+
visited.remove(current_id)
|
|
341
|
+
|
|
342
|
+
dfs(start_id, end_id, [], set(), 0)
|
|
343
|
+
return paths
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Subgraph Extraction
|
|
347
|
+
|
|
348
|
+
Extract relevant subgraph:
|
|
349
|
+
|
|
350
|
+
```python
|
|
351
|
+
def extract_subgraph(graph: KnowledgeGraph, entity_ids: list, max_depth=1):
|
|
352
|
+
"""Extract subgraph around entities"""
|
|
353
|
+
subgraph_entities = set(entity_ids)
|
|
354
|
+
subgraph_relationships = []
|
|
355
|
+
|
|
356
|
+
# BFS from each entity
|
|
357
|
+
for entity_id in entity_ids:
|
|
358
|
+
neighbors = bfs_traverse(graph, entity_id, max_depth)
|
|
359
|
+
for neighbor in neighbors:
|
|
360
|
+
subgraph_entities.add(neighbor['entity'].id)
|
|
361
|
+
|
|
362
|
+
# Extract relationships within subgraph
|
|
363
|
+
for rel in graph.relationships:
|
|
364
|
+
if rel.subject_id in subgraph_entities and rel.object_id in subgraph_entities:
|
|
365
|
+
subgraph_relationships.append(rel)
|
|
366
|
+
|
|
367
|
+
return KnowledgeGraph(
|
|
368
|
+
entities={eid: graph.entities[eid] for eid in subgraph_entities if eid in graph.entities},
|
|
369
|
+
relationships=subgraph_relationships
|
|
370
|
+
)
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
**Best Practices**:
|
|
374
|
+
- Limit traversal depth to avoid explosion
|
|
375
|
+
- Use BFS for finding nearby entities
|
|
376
|
+
- Use DFS for path finding
|
|
377
|
+
- Extract subgraphs for context
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## 5. Retrieval Strategies
|
|
382
|
+
|
|
383
|
+
### Entity-Based Retrieval
|
|
384
|
+
|
|
385
|
+
Retrieve by entity:
|
|
386
|
+
|
|
387
|
+
```python
|
|
388
|
+
def retrieve_by_entity(graph: KnowledgeGraph, entity_name: str, max_depth=2):
|
|
389
|
+
"""Retrieve context around an entity"""
|
|
390
|
+
# Find entity
|
|
391
|
+
entity_id = None
|
|
392
|
+
for eid, entity in graph.entities.items():
|
|
393
|
+
if entity.name.lower() == entity_name.lower():
|
|
394
|
+
entity_id = eid
|
|
395
|
+
break
|
|
396
|
+
|
|
397
|
+
if not entity_id:
|
|
398
|
+
return []
|
|
399
|
+
|
|
400
|
+
# Traverse graph
|
|
401
|
+
results = bfs_traverse(graph, entity_id, max_depth)
|
|
402
|
+
|
|
403
|
+
# Format results
|
|
404
|
+
context = []
|
|
405
|
+
for result in results:
|
|
406
|
+
entity = result['entity']
|
|
407
|
+
depth = result['depth']
|
|
408
|
+
|
|
409
|
+
# Find relationships
|
|
410
|
+
rels = [r for r in graph.relationships
|
|
411
|
+
if r.subject_id == entity.id or r.object_id == entity.id]
|
|
412
|
+
|
|
413
|
+
context.append({
|
|
414
|
+
'entity': entity.name,
|
|
415
|
+
'type': entity.type,
|
|
416
|
+
'depth': depth,
|
|
417
|
+
'relationships': [
|
|
418
|
+
f"{graph.entities[r.subject_id].name} {r.predicate} {graph.entities[r.object_id].name}"
|
|
419
|
+
for r in rels
|
|
420
|
+
if r.subject_id in graph.entities and r.object_id in graph.entities
|
|
421
|
+
]
|
|
422
|
+
})
|
|
423
|
+
|
|
424
|
+
return context
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Relationship-Based Retrieval
|
|
428
|
+
|
|
429
|
+
Retrieve by relationship type:
|
|
430
|
+
|
|
431
|
+
```python
|
|
432
|
+
def retrieve_by_relationship(graph: KnowledgeGraph, predicate: str, limit=10):
|
|
433
|
+
"""Retrieve entities connected by relationship type"""
|
|
434
|
+
results = []
|
|
435
|
+
|
|
436
|
+
for rel in graph.relationships:
|
|
437
|
+
if rel.predicate.lower() == predicate.lower():
|
|
438
|
+
subject = graph.entities.get(rel.subject_id)
|
|
439
|
+
obj = graph.entities.get(rel.object_id)
|
|
440
|
+
|
|
441
|
+
if subject and obj:
|
|
442
|
+
results.append({
|
|
443
|
+
'subject': subject.name,
|
|
444
|
+
'predicate': rel.predicate,
|
|
445
|
+
'object': obj.name,
|
|
446
|
+
'confidence': rel.confidence
|
|
447
|
+
})
|
|
448
|
+
|
|
449
|
+
if len(results) >= limit:
|
|
450
|
+
break
|
|
451
|
+
|
|
452
|
+
return results
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**Best Practices**:
|
|
456
|
+
- Use entity-based retrieval for specific queries
|
|
457
|
+
- Use relationship-based retrieval for pattern queries
|
|
458
|
+
- Combine with vector search for best results
|
|
459
|
+
- Limit depth and breadth to control context size
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## 6. Temporal Decay
|
|
464
|
+
|
|
465
|
+
### Time-Based Weighting
|
|
466
|
+
|
|
467
|
+
Weight entities by recency:
|
|
468
|
+
|
|
469
|
+
```python
|
|
470
|
+
from datetime import datetime, timedelta
|
|
471
|
+
import math
|
|
472
|
+
|
|
473
|
+
def apply_temporal_decay(entities: list, decay_rate=0.1):
|
|
474
|
+
"""Apply temporal decay to entity scores"""
|
|
475
|
+
now = datetime.now()
|
|
476
|
+
|
|
477
|
+
for entity in entities:
|
|
478
|
+
# Calculate age in days
|
|
479
|
+
age_days = (now - entity['updated_at']).days
|
|
480
|
+
|
|
481
|
+
# Apply exponential decay
|
|
482
|
+
decay_factor = math.exp(-decay_rate * age_days)
|
|
483
|
+
|
|
484
|
+
# Update score
|
|
485
|
+
entity['score'] = entity.get('score', 1.0) * decay_factor
|
|
486
|
+
|
|
487
|
+
return sorted(entities, key=lambda x: x['score'], reverse=True)
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Sliding Window
|
|
491
|
+
|
|
492
|
+
Keep only recent entities:
|
|
493
|
+
|
|
494
|
+
```python
|
|
495
|
+
def sliding_window_filter(graph: KnowledgeGraph, window_days=30):
|
|
496
|
+
"""Filter graph to recent entities"""
|
|
497
|
+
cutoff = datetime.now() - timedelta(days=window_days)
|
|
498
|
+
|
|
499
|
+
# Filter entities
|
|
500
|
+
recent_entities = {
|
|
501
|
+
eid: entity
|
|
502
|
+
for eid, entity in graph.entities.items()
|
|
503
|
+
if entity.updated_at >= cutoff
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
# Filter relationships
|
|
507
|
+
recent_relationships = [
|
|
508
|
+
rel for rel in graph.relationships
|
|
509
|
+
if rel.updated_at >= cutoff
|
|
510
|
+
and rel.subject_id in recent_entities
|
|
511
|
+
and rel.object_id in recent_entities
|
|
512
|
+
]
|
|
513
|
+
|
|
514
|
+
return KnowledgeGraph(
|
|
515
|
+
entities=recent_entities,
|
|
516
|
+
relationships=recent_relationships
|
|
517
|
+
)
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Best Practices**:
|
|
521
|
+
- Apply temporal decay for long-running agents
|
|
522
|
+
- Use sliding windows to limit graph size
|
|
523
|
+
- Adjust decay rate based on domain
|
|
524
|
+
- Preserve important entities regardless of age
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
## 7. Graph Database Options
|
|
529
|
+
|
|
530
|
+
### Comparison
|
|
531
|
+
|
|
532
|
+
| Database | Type | Scale | Query Language | Features |
|
|
533
|
+
|----------|------|-------|----------------|----------|
|
|
534
|
+
| **Neo4j** | Native graph | Billions | Cypher | ACID, clustering, visualization |
|
|
535
|
+
| **Amazon Neptune** | Managed | Billions | Gremlin/SPARQL | Serverless, high availability |
|
|
536
|
+
| **ArangoDB** | Multi-model | Millions | AQL | Document + Graph, flexible |
|
|
537
|
+
| **NetworkX** | In-memory | Thousands | Python API | Simple, local, analysis |
|
|
538
|
+
|
|
539
|
+
### Neo4j Example
|
|
540
|
+
|
|
541
|
+
```python
|
|
542
|
+
from neo4j import GraphDatabase
|
|
543
|
+
|
|
544
|
+
class Neo4jGraph:
|
|
545
|
+
def __init__(self, uri, user, password):
|
|
546
|
+
self.driver = GraphDatabase.driver(uri, auth=(user, password))
|
|
547
|
+
|
|
548
|
+
def add_entity(self, entity: Entity):
|
|
549
|
+
"""Add entity to Neo4j"""
|
|
550
|
+
with self.driver.session() as session:
|
|
551
|
+
session.run(
|
|
552
|
+
"MERGE (e:Entity {id: $id}) "
|
|
553
|
+
"SET e.name = $name, e.type = $type, e.updated_at = datetime()",
|
|
554
|
+
id=entity.id, name=entity.name, type=entity.type
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
def add_relationship(self, rel: Relationship):
|
|
558
|
+
"""Add relationship to Neo4j"""
|
|
559
|
+
with self.driver.session() as session:
|
|
560
|
+
session.run(
|
|
561
|
+
"MATCH (a:Entity {id: $subject_id}), (b:Entity {id: $object_id}) "
|
|
562
|
+
"MERGE (a)-[r:RELATES {predicate: $predicate}]->(b) "
|
|
563
|
+
"SET r.confidence = $confidence, r.updated_at = datetime()",
|
|
564
|
+
subject_id=rel.subject_id,
|
|
565
|
+
object_id=rel.object_id,
|
|
566
|
+
predicate=rel.predicate,
|
|
567
|
+
confidence=rel.confidence
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
def traverse(self, entity_id: str, max_depth=2):
|
|
571
|
+
"""Traverse graph from entity"""
|
|
572
|
+
with self.driver.session() as session:
|
|
573
|
+
result = session.run(
|
|
574
|
+
"MATCH path = (start:Entity {id: $id})-[*1..$depth]-(end:Entity) "
|
|
575
|
+
"RETURN path",
|
|
576
|
+
id=entity_id, depth=max_depth
|
|
577
|
+
)
|
|
578
|
+
return [record["path"] for record in result]
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
**Best Practices**:
|
|
582
|
+
- Use Neo4j for production graph workloads
|
|
583
|
+
- Use NetworkX for prototyping and analysis
|
|
584
|
+
- Use managed services (Neptune) for scale
|
|
585
|
+
- Optimize queries with indexes
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
589
|
+
## 8. Best Practices
|
|
590
|
+
|
|
591
|
+
### DO
|
|
592
|
+
|
|
593
|
+
✅ **Extract entities accurately**: Use hybrid NER + LLM
|
|
594
|
+
✅ **Validate relationships**: Ensure consistency
|
|
595
|
+
✅ **Limit traversal depth**: Avoid graph explosion
|
|
596
|
+
✅ **Apply temporal decay**: Keep graph relevant
|
|
597
|
+
✅ **Use graph databases**: For large-scale graphs
|
|
598
|
+
✅ **Combine with vector search**: Best of both worlds
|
|
599
|
+
✅ **Version graph schema**: Support evolution
|
|
600
|
+
✅ **Monitor graph size**: Prune periodically
|
|
601
|
+
|
|
602
|
+
### DON'T
|
|
603
|
+
|
|
604
|
+
❌ **Don't extract all entities**: Be selective
|
|
605
|
+
❌ **Don't ignore confidence scores**: Use for filtering
|
|
606
|
+
❌ **Don't traverse entire graph**: Limit scope
|
|
607
|
+
❌ **Don't keep stale entities**: Apply decay
|
|
608
|
+
❌ **Don't use in-memory for large graphs**: Use database
|
|
609
|
+
❌ **Don't forget to deduplicate**: Entities and relationships
|
|
610
|
+
❌ **Don't ignore graph structure**: Leverage relationships
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## 9. Common Pitfalls
|
|
615
|
+
|
|
616
|
+
### Graph Explosion
|
|
617
|
+
|
|
618
|
+
**Problem**: Graph grows too large, traversal too slow
|
|
619
|
+
|
|
620
|
+
**Solution**:
|
|
621
|
+
- Limit traversal depth (1-3 hops)
|
|
622
|
+
- Apply temporal decay
|
|
623
|
+
- Prune low-confidence relationships
|
|
624
|
+
- Use subgraph extraction
|
|
625
|
+
|
|
626
|
+
### Poor Entity Extraction
|
|
627
|
+
|
|
628
|
+
**Problem**: Missing or incorrect entities
|
|
629
|
+
|
|
630
|
+
**Solution**:
|
|
631
|
+
- Use hybrid NER + LLM extraction
|
|
632
|
+
- Validate entities against schema
|
|
633
|
+
- Implement entity resolution (deduplication)
|
|
634
|
+
- Use domain-specific models
|
|
635
|
+
|
|
636
|
+
### Relationship Noise
|
|
637
|
+
|
|
638
|
+
**Problem**: Too many low-quality relationships
|
|
639
|
+
|
|
640
|
+
**Solution**:
|
|
641
|
+
- Filter by confidence threshold
|
|
642
|
+
- Validate relationship types
|
|
643
|
+
- Use pattern-based extraction for precision
|
|
644
|
+
- Review and prune periodically
|
|
645
|
+
|
|
646
|
+
---
|
|
647
|
+
|
|
648
|
+
## Configuration Example
|
|
649
|
+
|
|
650
|
+
```json
|
|
651
|
+
{
|
|
652
|
+
"mcp": {
|
|
653
|
+
"type": "graph",
|
|
654
|
+
"entityExtraction": {
|
|
655
|
+
"method": "hybrid",
|
|
656
|
+
"nerModel": "en_core_web_sm",
|
|
657
|
+
"llmModel": "gpt-4o-mini",
|
|
658
|
+
"confidenceThreshold": 0.7
|
|
659
|
+
},
|
|
660
|
+
"relationshipExtraction": {
|
|
661
|
+
"method": "llm",
|
|
662
|
+
"llmModel": "gpt-4o-mini",
|
|
663
|
+
"confidenceThreshold": 0.8
|
|
664
|
+
},
|
|
665
|
+
"graphDatabase": {
|
|
666
|
+
"provider": "neo4j",
|
|
667
|
+
"uri": "bolt://localhost:7687",
|
|
668
|
+
"maxConnections": 50
|
|
669
|
+
},
|
|
670
|
+
"traversal": {
|
|
671
|
+
"maxDepth": 2,
|
|
672
|
+
"maxResults": 50
|
|
673
|
+
},
|
|
674
|
+
"temporalDecay": {
|
|
675
|
+
"enabled": true,
|
|
676
|
+
"decayRate": 0.1,
|
|
677
|
+
"slidingWindowDays": 30
|
|
678
|
+
},
|
|
679
|
+
"tokenBudget": {
|
|
680
|
+
"maxGraphTokens": 2048
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
---
|
|
687
|
+
|