@thierrynakoa/fire-flow 12.2.1 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Real-Time Monitoring Dashboard
|
|
3
|
+
category: patterns-standards
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
tags: [react, typescript, vite, tailwind, express, sse, chokidar, dashboard, monitoring, dark-theme]
|
|
7
|
+
difficulty: medium
|
|
8
|
+
usage_count: 0
|
|
9
|
+
success_rate: 100
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Real-Time Monitoring Dashboard
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
You need a visual dashboard to monitor multiple projects, services, and agents in real-time. Data comes from diverse sources: Markdown state files on disk, vector databases (Qdrant), git repositories, HTTP service endpoints. The dashboard must update live without polling every source continuously, and it needs a polished dark-themed UI with loading states.
|
|
17
|
+
|
|
18
|
+
## Solution Pattern
|
|
19
|
+
|
|
20
|
+
**Vite + React 18 + TypeScript + Tailwind + Express backend + SSE push updates + Chokidar file watching**
|
|
21
|
+
|
|
22
|
+
An Express backend acts as the data aggregation layer, parsing local files, querying APIs, and running git commands. It serves data via REST endpoints and pushes live updates via Server-Sent Events (SSE) when watched files change. A Vite dev server proxies `/api/*` to Express, giving hot module reload for the React frontend while the backend handles the data.
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Browser (React + Tailwind)
|
|
28
|
+
|
|
|
29
|
+
+-- GET /api/projects --> Express parses STATE.md files
|
|
30
|
+
+-- GET /api/memory --> Express queries Qdrant REST API
|
|
31
|
+
+-- GET /api/git-timeline --> Express runs git log across repos
|
|
32
|
+
+-- GET /api/voice-status --> Express proxies voice-bridge:7899
|
|
33
|
+
+-- GET /api/debug-tracker --> Express parses debug/ directories
|
|
34
|
+
+-- SSE /api/events --> Express pushes Chokidar file changes
|
|
35
|
+
|
|
|
36
|
+
Vite Dev Server (port 5173)
|
|
37
|
+
|
|
|
38
|
+
+-- proxy: /api/* --> Express (port 3101)
|
|
39
|
+
|
|
|
40
|
+
Express Backend (port 3101)
|
|
41
|
+
|
|
|
42
|
+
+-- Chokidar watching C:\path\to\repos\*\.planning\STATE.md
|
|
43
|
+
+-- Qdrant REST API (port 6335)
|
|
44
|
+
+-- git log subprocess
|
|
45
|
+
+-- HTTP fetch to service sidecars
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Panel Architecture
|
|
49
|
+
|
|
50
|
+
Each dashboard panel is a self-contained React component owning its data fetching, state, error handling, and polling logic.
|
|
51
|
+
|
|
52
|
+
| Panel | Data Source | Update Strategy |
|
|
53
|
+
|-------|------------|-----------------|
|
|
54
|
+
| `ProjectOverview` | STATE.md parser | SSE push on file change |
|
|
55
|
+
| `PhaseProgress` | ROADMAP.md parser | SSE push on file change |
|
|
56
|
+
| `MemoryHealth` | Qdrant REST API | 60s polling |
|
|
57
|
+
| `GitTimeline` | `git log --format` | 30s polling |
|
|
58
|
+
| `DebugTracker` | `.planning/debug/` dir | SSE push on file change |
|
|
59
|
+
| `VoiceBridgeStatus` | HTTP sidecar (:7899) | 10s polling |
|
|
60
|
+
| `RecentActivity` | Aggregated from all sources | Derived from other panels |
|
|
61
|
+
|
|
62
|
+
## Code Examples
|
|
63
|
+
|
|
64
|
+
### Express Backend with File Parsing
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// server/index.ts
|
|
68
|
+
import express from "express";
|
|
69
|
+
import cors from "cors";
|
|
70
|
+
import chokidar from "chokidar";
|
|
71
|
+
import { readFileSync, existsSync } from "fs";
|
|
72
|
+
import { glob } from "glob";
|
|
73
|
+
import { execSync } from "child_process";
|
|
74
|
+
|
|
75
|
+
const app = express();
|
|
76
|
+
app.use(cors());
|
|
77
|
+
|
|
78
|
+
const REPOS_DIR = "C:/path/to/repos";
|
|
79
|
+
const PORT = 3101;
|
|
80
|
+
|
|
81
|
+
// --- SSE Setup ---
|
|
82
|
+
const sseClients: Set<express.Response> = new Set();
|
|
83
|
+
|
|
84
|
+
app.get("/api/events", (req, res) => {
|
|
85
|
+
res.writeHead(200, {
|
|
86
|
+
"Content-Type": "text/event-stream",
|
|
87
|
+
"Cache-Control": "no-cache",
|
|
88
|
+
Connection: "keep-alive",
|
|
89
|
+
});
|
|
90
|
+
sseClients.add(res);
|
|
91
|
+
req.on("close", () => sseClients.delete(res));
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
function broadcast(event: string, data: unknown) {
|
|
95
|
+
const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
96
|
+
sseClients.forEach((client) => client.write(payload));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// --- Chokidar File Watcher ---
|
|
100
|
+
const watcher = chokidar.watch(`${REPOS_DIR}/*/.planning/STATE.md`, {
|
|
101
|
+
ignoreInitial: true,
|
|
102
|
+
awaitWriteFinish: { stabilityThreshold: 500 },
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
watcher.on("change", (filePath) => {
|
|
106
|
+
const project = filePath.split(/[/\\]/)[3]; // Extract repo name
|
|
107
|
+
const state = parseStateMd(filePath);
|
|
108
|
+
broadcast("project-update", { project, state });
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// --- STATE.md Parser ---
|
|
112
|
+
interface ProjectState {
|
|
113
|
+
name: string;
|
|
114
|
+
phase: string;
|
|
115
|
+
status: string;
|
|
116
|
+
lastModified: string;
|
|
117
|
+
tasks: { name: string; done: boolean }[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function parseStateMd(filePath: string): ProjectState | null {
|
|
121
|
+
if (!existsSync(filePath)) return null;
|
|
122
|
+
const content = readFileSync(filePath, "utf-8");
|
|
123
|
+
const lines = content.split("\n");
|
|
124
|
+
|
|
125
|
+
const name = lines.find((l) => l.startsWith("# "))?.slice(2).trim() || "Unknown";
|
|
126
|
+
const phase = lines.find((l) => /^## (Current )?Phase/i.test(l))?.replace(/^## (Current )?Phase:?\s*/i, "").trim() || "Unknown";
|
|
127
|
+
const status = lines.find((l) => /^Status:/i.test(l))?.replace(/^Status:\s*/i, "").trim() || "unknown";
|
|
128
|
+
|
|
129
|
+
const tasks = lines
|
|
130
|
+
.filter((l) => /^- \[[ x]\]/.test(l))
|
|
131
|
+
.map((l) => ({
|
|
132
|
+
name: l.replace(/^- \[[ x]\]\s*/, "").trim(),
|
|
133
|
+
done: l.includes("[x]"),
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
return { name, phase, status, lastModified: new Date().toISOString(), tasks };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// --- Projects Endpoint ---
|
|
140
|
+
app.get("/api/projects", async (_req, res) => {
|
|
141
|
+
const stateFiles = await glob(`${REPOS_DIR}/*/.planning/STATE.md`);
|
|
142
|
+
const projects = stateFiles
|
|
143
|
+
.map((f) => parseStateMd(f))
|
|
144
|
+
.filter(Boolean);
|
|
145
|
+
res.json(projects);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// --- Git Timeline Endpoint ---
|
|
149
|
+
app.get("/api/git-timeline", async (_req, res) => {
|
|
150
|
+
const repos = await glob(`${REPOS_DIR}/*/.git`, { onlyDirectories: true });
|
|
151
|
+
const commits = repos.flatMap((gitDir) => {
|
|
152
|
+
const repoDir = gitDir.replace(/[/\\]\.git$/, "");
|
|
153
|
+
const repoName = repoDir.split(/[/\\]/).pop();
|
|
154
|
+
try {
|
|
155
|
+
const log = execSync(
|
|
156
|
+
`git -C "${repoDir}" log --format="%H|%s|%an|%aI" -20`,
|
|
157
|
+
{ encoding: "utf-8", timeout: 5000 }
|
|
158
|
+
);
|
|
159
|
+
return log.trim().split("\n").filter(Boolean).map((line) => {
|
|
160
|
+
const [hash, message, author, date] = line.split("|");
|
|
161
|
+
return { repo: repoName, hash, message, author, date };
|
|
162
|
+
});
|
|
163
|
+
} catch {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
// Sort all commits by date descending
|
|
168
|
+
commits.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
|
169
|
+
res.json(commits.slice(0, 50));
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// --- Qdrant Memory Health ---
|
|
173
|
+
app.get("/api/memory", async (_req, res) => {
|
|
174
|
+
try {
|
|
175
|
+
const resp = await fetch("http://127.0.0.1:6335/collections/power_flow_memory");
|
|
176
|
+
const data = await resp.json();
|
|
177
|
+
res.json({
|
|
178
|
+
points: data.result?.points_count || 0,
|
|
179
|
+
segments: data.result?.segments_count || 0,
|
|
180
|
+
status: data.result?.status || "unknown",
|
|
181
|
+
});
|
|
182
|
+
} catch {
|
|
183
|
+
res.json({ points: 0, segments: 0, status: "offline" });
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// --- Voice Bridge Status Proxy ---
|
|
188
|
+
app.get("/api/voice-status", async (_req, res) => {
|
|
189
|
+
try {
|
|
190
|
+
const resp = await fetch("http://127.0.0.1:7899/status", { signal: AbortSignal.timeout(2000) });
|
|
191
|
+
const data = await resp.json();
|
|
192
|
+
res.json(data);
|
|
193
|
+
} catch {
|
|
194
|
+
res.json({ service: "voice-bridge", status: "offline" });
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
app.listen(PORT, () => console.log(`Dashboard API on http://localhost:${PORT}`));
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Vite Config with Proxy
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// vite.config.ts
|
|
205
|
+
import { defineConfig } from "vite";
|
|
206
|
+
import react from "@vitejs/plugin-react";
|
|
207
|
+
|
|
208
|
+
export default defineConfig({
|
|
209
|
+
plugins: [react()],
|
|
210
|
+
server: {
|
|
211
|
+
port: 5173,
|
|
212
|
+
proxy: {
|
|
213
|
+
"/api": {
|
|
214
|
+
target: "http://localhost:3101",
|
|
215
|
+
changeOrigin: true,
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### React Panel with Polling and SSE
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
// src/components/ProjectOverview.tsx
|
|
226
|
+
import { useState, useEffect, useRef } from "react";
|
|
227
|
+
|
|
228
|
+
interface Project {
|
|
229
|
+
name: string;
|
|
230
|
+
phase: string;
|
|
231
|
+
status: string;
|
|
232
|
+
lastModified: string;
|
|
233
|
+
tasks: { name: string; done: boolean }[];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export function ProjectOverview() {
|
|
237
|
+
const [projects, setProjects] = useState<Project[]>([]);
|
|
238
|
+
const [loading, setLoading] = useState(true);
|
|
239
|
+
const eventSourceRef = useRef<EventSource | null>(null);
|
|
240
|
+
|
|
241
|
+
// Initial fetch
|
|
242
|
+
useEffect(() => {
|
|
243
|
+
fetch("/api/projects")
|
|
244
|
+
.then((r) => r.json())
|
|
245
|
+
.then((data) => {
|
|
246
|
+
setProjects(data);
|
|
247
|
+
setLoading(false);
|
|
248
|
+
})
|
|
249
|
+
.catch(() => setLoading(false));
|
|
250
|
+
}, []);
|
|
251
|
+
|
|
252
|
+
// SSE for live updates
|
|
253
|
+
useEffect(() => {
|
|
254
|
+
const es = new EventSource("/api/events");
|
|
255
|
+
eventSourceRef.current = es;
|
|
256
|
+
|
|
257
|
+
es.addEventListener("project-update", (e) => {
|
|
258
|
+
const update = JSON.parse(e.data);
|
|
259
|
+
setProjects((prev) =>
|
|
260
|
+
prev.map((p) => (p.name === update.project ? { ...p, ...update.state } : p))
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
es.onerror = () => {
|
|
265
|
+
es.close();
|
|
266
|
+
// Reconnect after 5s
|
|
267
|
+
setTimeout(() => {
|
|
268
|
+
eventSourceRef.current = new EventSource("/api/events");
|
|
269
|
+
}, 5000);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
return () => es.close();
|
|
273
|
+
}, []);
|
|
274
|
+
|
|
275
|
+
if (loading) return <SkeletonCard lines={4} />;
|
|
276
|
+
|
|
277
|
+
return (
|
|
278
|
+
<div className="glass-card">
|
|
279
|
+
<h2 className="text-lg font-semibold text-zinc-100 mb-4">Projects</h2>
|
|
280
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
281
|
+
{projects.map((project) => (
|
|
282
|
+
<div key={project.name} className="metric-card">
|
|
283
|
+
<div className="flex items-center justify-between mb-2">
|
|
284
|
+
<h3 className="font-medium text-zinc-200">{project.name}</h3>
|
|
285
|
+
<StatusBadge status={project.status} />
|
|
286
|
+
</div>
|
|
287
|
+
<p className="text-sm text-zinc-400">{project.phase}</p>
|
|
288
|
+
<ProgressBar tasks={project.tasks} />
|
|
289
|
+
</div>
|
|
290
|
+
))}
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function StatusBadge({ status }: { status: string }) {
|
|
297
|
+
const colors: Record<string, string> = {
|
|
298
|
+
active: "bg-green-500/20 text-green-400",
|
|
299
|
+
blocked: "bg-red-500/20 text-red-400",
|
|
300
|
+
planning: "bg-indigo-500/20 text-indigo-400",
|
|
301
|
+
complete: "bg-zinc-500/20 text-zinc-400",
|
|
302
|
+
};
|
|
303
|
+
return (
|
|
304
|
+
<span className={`text-xs px-2 py-0.5 rounded-full ${colors[status] || colors.planning}`}>
|
|
305
|
+
{status}
|
|
306
|
+
</span>
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function ProgressBar({ tasks }: { tasks: { done: boolean }[] }) {
|
|
311
|
+
const done = tasks.filter((t) => t.done).length;
|
|
312
|
+
const pct = tasks.length ? Math.round((done / tasks.length) * 100) : 0;
|
|
313
|
+
return (
|
|
314
|
+
<div className="mt-3">
|
|
315
|
+
<div className="flex justify-between text-xs text-zinc-500 mb-1">
|
|
316
|
+
<span>{done}/{tasks.length} tasks</span>
|
|
317
|
+
<span>{pct}%</span>
|
|
318
|
+
</div>
|
|
319
|
+
<div className="h-1.5 bg-zinc-800 rounded-full overflow-hidden">
|
|
320
|
+
<div className="h-full bg-indigo-500 rounded-full transition-all duration-500"
|
|
321
|
+
style={{ width: `${pct}%` }} />
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function SkeletonCard({ lines }: { lines: number }) {
|
|
328
|
+
return (
|
|
329
|
+
<div className="glass-card animate-pulse">
|
|
330
|
+
{Array.from({ length: lines }).map((_, i) => (
|
|
331
|
+
<div key={i} className="h-4 bg-zinc-800 rounded mb-3"
|
|
332
|
+
style={{ width: `${70 + Math.random() * 30}%` }} />
|
|
333
|
+
))}
|
|
334
|
+
</div>
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Dark Theme Design System
|
|
340
|
+
|
|
341
|
+
```css
|
|
342
|
+
/* src/index.css */
|
|
343
|
+
@tailwind base;
|
|
344
|
+
@tailwind components;
|
|
345
|
+
@tailwind utilities;
|
|
346
|
+
|
|
347
|
+
@layer base {
|
|
348
|
+
body {
|
|
349
|
+
@apply bg-zinc-950 text-zinc-100 antialiased;
|
|
350
|
+
font-family: "Inter", system-ui, -apple-system, sans-serif;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
@layer components {
|
|
355
|
+
.glass-card {
|
|
356
|
+
@apply bg-zinc-900/60 backdrop-blur-sm border border-zinc-800/50
|
|
357
|
+
rounded-xl p-6 shadow-lg;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.metric-card {
|
|
361
|
+
@apply bg-zinc-800/40 border border-zinc-700/30 rounded-lg p-4
|
|
362
|
+
hover:border-indigo-500/30 transition-colors duration-200;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.accent-glow {
|
|
366
|
+
box-shadow: 0 0 20px rgba(99, 102, 241, 0.15);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
@layer utilities {
|
|
371
|
+
.animate-fade-in {
|
|
372
|
+
animation: fadeIn 0.3s ease-out;
|
|
373
|
+
}
|
|
374
|
+
@keyframes fadeIn {
|
|
375
|
+
from { opacity: 0; transform: translateY(4px); }
|
|
376
|
+
to { opacity: 1; transform: translateY(0); }
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Tailwind Config for Dark Theme
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
// tailwind.config.ts
|
|
385
|
+
import type { Config } from "tailwindcss";
|
|
386
|
+
|
|
387
|
+
export default {
|
|
388
|
+
content: ["./index.html", "./src/**/*.{ts,tsx}"],
|
|
389
|
+
theme: {
|
|
390
|
+
extend: {
|
|
391
|
+
colors: {
|
|
392
|
+
brand: {
|
|
393
|
+
bg: "#09090b", // zinc-950
|
|
394
|
+
card: "#18181b", // zinc-900
|
|
395
|
+
accent: "#6366f1", // indigo-500
|
|
396
|
+
success: "#22c55e", // green-500
|
|
397
|
+
danger: "#ef4444", // red-500
|
|
398
|
+
warning: "#f59e0b", // amber-500
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
plugins: [],
|
|
404
|
+
} satisfies Config;
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## Implementation Steps
|
|
408
|
+
|
|
409
|
+
1. **Scaffold with Vite** -- `npm create vite@latest -- --template react-ts`. Add Tailwind, set up dark theme CSS.
|
|
410
|
+
2. **Create Express backend** in `server/` directory. Add TypeScript, nodemon for dev.
|
|
411
|
+
3. **Build the STATE.md parser** -- regex-based extraction of phase, status, tasks from Markdown.
|
|
412
|
+
4. **Add Chokidar watcher** for `.planning/STATE.md` files. Wire to SSE broadcast.
|
|
413
|
+
5. **Build the SSE endpoint** -- `/api/events` with client tracking and reconnection.
|
|
414
|
+
6. **Configure Vite proxy** -- `/api/*` forwards to Express port.
|
|
415
|
+
7. **Build panels one at a time** -- Start with ProjectOverview (file-based), then add MemoryHealth (API), GitTimeline (subprocess), VoiceBridgeStatus (HTTP proxy).
|
|
416
|
+
8. **Add skeleton loaders** -- Every panel shows a pulsing skeleton while its data loads.
|
|
417
|
+
9. **Add polling intervals** -- 10s for volatile sources (voice status), 60s for stable sources (memory).
|
|
418
|
+
10. **Wire SSE into React** -- `EventSource` in `useEffect` with reconnection logic.
|
|
419
|
+
11. **Polish** -- glass-card styling, status badges, progress bars, animate-fade-in on data arrival.
|
|
420
|
+
|
|
421
|
+
## When to Use
|
|
422
|
+
|
|
423
|
+
- Monitoring multiple independent projects from a single view
|
|
424
|
+
- Aggregating data from diverse sources (files, APIs, databases, git)
|
|
425
|
+
- Need live updates without heavy WebSocket infrastructure
|
|
426
|
+
- Building an internal developer tools dashboard
|
|
427
|
+
- When data sources are heterogeneous (Markdown files, REST APIs, CLI output)
|
|
428
|
+
|
|
429
|
+
## When NOT to Use
|
|
430
|
+
|
|
431
|
+
- High-frequency data (>10 updates/sec) -- SSE can lag; use WebSockets or gRPC streaming
|
|
432
|
+
- Public-facing dashboards with authentication needs -- add auth middleware first
|
|
433
|
+
- Simple single-project monitoring -- a terminal watch command may suffice
|
|
434
|
+
- When all data comes from a single database -- use that database's built-in dashboard tools
|
|
435
|
+
|
|
436
|
+
## Common Mistakes
|
|
437
|
+
|
|
438
|
+
1. **Not debouncing Chokidar events** -- File saves trigger multiple rapid change events. Use `awaitWriteFinish` with a stabilityThreshold (500ms works well).
|
|
439
|
+
2. **SSE reconnection storms** -- If the server goes down, `EventSource` auto-reconnects aggressively. Add exponential backoff in the `onerror` handler.
|
|
440
|
+
3. **Polling too frequently** -- Each poll spawns a subprocess (git log) or HTTP request. 10s minimum for active sources, 60s for stable ones.
|
|
441
|
+
4. **Forgetting CORS on Express** -- The Vite proxy handles dev, but if anyone accesses Express directly, CORS blocks the response. Always add `cors()` middleware.
|
|
442
|
+
5. **Not handling missing STATE.md files** -- Repos without `.planning/STATE.md` should be silently skipped, not crash the parser.
|
|
443
|
+
6. **Blocking Express with synchronous git commands** -- `execSync` blocks the event loop. For many repos, use `exec` with promises or a worker thread.
|
|
444
|
+
7. **Stale SSE connections** -- Dead clients stay in the set. Clean up on `req.on("close")` and periodically sweep.
|
|
445
|
+
|
|
446
|
+
## Related Skills
|
|
447
|
+
|
|
448
|
+
- `python-desktop-app-architecture.md` -- The status sidecar pattern consumed by this dashboard
|
|
449
|
+
- `multi-project-autonomous-build.md` -- The methodology that creates multiple projects monitored here
|
|
450
|
+
|
|
451
|
+
## References
|
|
452
|
+
|
|
453
|
+
- Contributed from: **claude-mission-control** (`C:\path\to\repos\claude-mission-control`)
|
|
454
|
+
- Vite proxy docs: https://vitejs.dev/config/server-options.html#server-proxy
|
|
455
|
+
- SSE spec: https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
456
|
+
- Chokidar: https://github.com/paulmillr/chokidar
|
|
457
|
+
- Tailwind dark mode: https://tailwindcss.com/docs/dark-mode
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: togglable-processing-pipeline
|
|
3
|
+
category: patterns-standards
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
contributed: 2026-02-24
|
|
6
|
+
contributor: voice-bridge-v4
|
|
7
|
+
last_updated: 2026-02-24
|
|
8
|
+
contributors:
|
|
9
|
+
- voice-bridge-v4
|
|
10
|
+
tags: [pipeline, config, text-processing, audio, post-processing, fail-fast]
|
|
11
|
+
difficulty: medium
|
|
12
|
+
usage_count: 0
|
|
13
|
+
success_rate: 100
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Togglable Processing Pipeline (Config-Driven Feature Ordering)
|
|
17
|
+
|
|
18
|
+
## Problem
|
|
19
|
+
|
|
20
|
+
Processing pipelines (text cleanup, audio post-processing, data transformation) often have multiple independent features that should each be toggleable. Common anti-patterns:
|
|
21
|
+
|
|
22
|
+
- Features hard-coded as if/else blocks that can't be disabled
|
|
23
|
+
- All features run regardless of whether the input needs them
|
|
24
|
+
- Expensive operations (API calls) run before cheap filters, wasting resources
|
|
25
|
+
- No config file support — toggling requires code changes
|
|
26
|
+
- Adding a new feature means modifying the pipeline method
|
|
27
|
+
|
|
28
|
+
## Solution Pattern
|
|
29
|
+
|
|
30
|
+
Build a **config-driven pipeline** where:
|
|
31
|
+
|
|
32
|
+
1. Each feature is independently togglable via config (`enabled: true/false`)
|
|
33
|
+
2. Features run in a **fail-fast order** — cheapest filters first, expensive operations last
|
|
34
|
+
3. A rejected input (e.g., hallucination) short-circuits the entire pipeline returning `None`
|
|
35
|
+
4. New features slot into the pipeline at the correct cost position
|
|
36
|
+
5. The processor is **stateless per call** — can be recreated from config for live reload
|
|
37
|
+
|
|
38
|
+
### Pipeline Ordering Principle
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Cost: $0 $0 $0 $0 $$$
|
|
42
|
+
──────────────────────────────────────────────────►
|
|
43
|
+
Hallucination Dictionary Fillers Numbers AI Cleanup
|
|
44
|
+
Filter Replace Remove Convert (API call)
|
|
45
|
+
(reject bad) (regex) (regex) (lookup) (expensive!)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Reject garbage first. Don't spend API credits cleaning up "thank you for watching."
|
|
49
|
+
|
|
50
|
+
## Code Example
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
# Before (problematic) — monolithic, no toggles, wrong order
|
|
54
|
+
def process(text):
|
|
55
|
+
text = call_ai_cleanup(text) # Expensive! Runs on garbage too
|
|
56
|
+
text = text.replace("um", "").replace("uh", "")
|
|
57
|
+
if text in BAD_PHRASES:
|
|
58
|
+
return None # Too late — already spent API credits
|
|
59
|
+
return text
|
|
60
|
+
|
|
61
|
+
# After (solution) — config-driven, ordered, togglable
|
|
62
|
+
class TextProcessor:
|
|
63
|
+
def __init__(self, config: dict):
|
|
64
|
+
self.cfg = config.get("post_processing", {})
|
|
65
|
+
|
|
66
|
+
def process(self, text: str) -> str | None:
|
|
67
|
+
# Stage 1: Reject (cheapest — regex/set lookup)
|
|
68
|
+
if self.cfg.get("hallucination_filter", {}).get("enabled"):
|
|
69
|
+
if self._is_hallucination(text):
|
|
70
|
+
return None # Short-circuit: saves all downstream cost
|
|
71
|
+
|
|
72
|
+
# Stage 2: Transform (cheap — regex replacement)
|
|
73
|
+
if self.cfg.get("custom_dictionary", {}).get("enabled"):
|
|
74
|
+
text = self._apply_dictionary(text)
|
|
75
|
+
|
|
76
|
+
if self.cfg.get("filler_removal", {}).get("enabled"):
|
|
77
|
+
text = self._remove_fillers(text)
|
|
78
|
+
|
|
79
|
+
# Stage 3: Convert (moderate — lookup table)
|
|
80
|
+
if self.cfg.get("number_conversion", {}).get("enabled"):
|
|
81
|
+
text = self._convert_numbers(text)
|
|
82
|
+
|
|
83
|
+
# Stage 4: AI cleanup (expensive — API call, LAST)
|
|
84
|
+
if self.cfg.get("ai_post_processing", {}).get("enabled"):
|
|
85
|
+
text = self._ai_process(text)
|
|
86
|
+
|
|
87
|
+
# Stage 5: Log (side effect — always last)
|
|
88
|
+
if self.cfg.get("transcription_history", {}).get("enabled"):
|
|
89
|
+
self._log_history(text)
|
|
90
|
+
|
|
91
|
+
return text
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Config Structure
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
post_processing:
|
|
98
|
+
hallucination_filter:
|
|
99
|
+
enabled: true
|
|
100
|
+
patterns: ["thank you for watching", "please subscribe"]
|
|
101
|
+
custom_dictionary:
|
|
102
|
+
enabled: false
|
|
103
|
+
replacements: { "claude": "Claude", "jarvis": "Jarvis" }
|
|
104
|
+
filler_removal:
|
|
105
|
+
enabled: false
|
|
106
|
+
words: ["um", "uh", "like", "basically"]
|
|
107
|
+
number_conversion:
|
|
108
|
+
enabled: false
|
|
109
|
+
ai_post_processing:
|
|
110
|
+
enabled: false
|
|
111
|
+
template: "Clean up: {text}"
|
|
112
|
+
model: "claude-haiku-4-5-20251001"
|
|
113
|
+
transcription_history:
|
|
114
|
+
enabled: true
|
|
115
|
+
max_entries: 10000
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Live Reload Pattern
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
# When settings change, recreate the processor
|
|
122
|
+
def _on_settings_changed(self, new_config: dict):
|
|
123
|
+
self.text_processor = TextProcessor(new_config)
|
|
124
|
+
# No restart needed — next call uses new config
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Implementation Steps
|
|
128
|
+
|
|
129
|
+
1. Define pipeline stages in cost order (cheapest → most expensive)
|
|
130
|
+
2. Create config structure with `enabled` toggle per feature
|
|
131
|
+
3. Build processor class that reads config in `__init__`
|
|
132
|
+
4. Pipeline method checks `enabled` before each stage
|
|
133
|
+
5. First stage should be a **reject filter** that returns `None` to short-circuit
|
|
134
|
+
6. Last stage should be **logging/side effects**
|
|
135
|
+
7. Support live reload by recreating processor from new config
|
|
136
|
+
|
|
137
|
+
## When to Use
|
|
138
|
+
|
|
139
|
+
- Text post-processing (transcription cleanup, NLP pipelines)
|
|
140
|
+
- Audio processing chains (noise reduction, normalization, effects)
|
|
141
|
+
- Data validation pipelines (format, clean, validate, enrich)
|
|
142
|
+
- Image processing (resize, crop, filter, watermark, compress)
|
|
143
|
+
- Any multi-step processing where features should be independently toggleable
|
|
144
|
+
|
|
145
|
+
## When NOT to Use
|
|
146
|
+
|
|
147
|
+
- When features have complex interdependencies (use a DAG instead)
|
|
148
|
+
- When order doesn't matter (use a simple feature flag set)
|
|
149
|
+
- When there's only one processing step (overkill)
|
|
150
|
+
- Real-time streaming where you can't buffer (need async pipeline)
|
|
151
|
+
|
|
152
|
+
## Common Mistakes
|
|
153
|
+
|
|
154
|
+
- **Wrong order** — Running expensive AI cleanup before cheap hallucination filter wastes money
|
|
155
|
+
- **Not short-circuiting** — A rejected input should `return None` immediately, not continue through remaining stages
|
|
156
|
+
- **Mutable state between calls** — Each `process()` call should be independent. Don't accumulate state across calls unless explicitly designed (like history logging)
|
|
157
|
+
- **Lazy init without cleanup** — If a stage lazily initializes resources (DB connections, API clients), implement `shutdown()` for clean teardown
|
|
158
|
+
- **Forgetting the config merge** — If config file doesn't have the new feature section, `deep_merge` with defaults ensures it still works
|
|
159
|
+
|
|
160
|
+
## Related Skills
|
|
161
|
+
|
|
162
|
+
- [pyqt6-settings-dialog](../frontend/pyqt6-settings-dialog.md) — GUI for toggling features
|
|
163
|
+
- [fail-fast-validation](../patterns-standards/fail-fast-validation.md) — General fail-fast patterns
|
|
164
|
+
|
|
165
|
+
## References
|
|
166
|
+
|
|
167
|
+
- Contributed from: voice-bridge-v4
|
|
168
|
+
- Pipeline pattern: https://refactoring.guru/design-patterns/chain-of-responsibility
|
|
169
|
+
- Real implementation: `voice-bridge-v3/src/voice_bridge_v3/text_processor.py`
|