@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,515 @@
|
|
|
1
|
+
# Content Branch Preview
|
|
2
|
+
|
|
3
|
+
> Edit content on a draft version — preview it at a staging URL — approve to go live
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Content branching lets editors work on a "draft copy" of any content without affecting what's live. They can preview their changes, share the preview link with approvers, and publish when ready. Think of it as "pull requests for content."
|
|
9
|
+
|
|
10
|
+
**Why this matters for non-technical users:**
|
|
11
|
+
- A teacher edits a lesson → students still see the current version
|
|
12
|
+
- An admin reviews the draft → shares preview link with pastor
|
|
13
|
+
- Pastor approves → one click to publish
|
|
14
|
+
- If something goes wrong → one click to revert
|
|
15
|
+
|
|
16
|
+
**Key difference from TinaCMS:**
|
|
17
|
+
TinaCMS uses actual git branches. We use **database-level versioning** — same concept, no git knowledge required. Works with MySQL and PostgreSQL.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Architecture
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
┌─────────────────────────────────────────────────┐
|
|
25
|
+
│ Content Record: "Introduction to Prayer" │
|
|
26
|
+
│ │
|
|
27
|
+
│ ┌─────────────┐ ┌──────────────┐ │
|
|
28
|
+
│ │ LIVE v3 │ │ DRAFT v4 │ │
|
|
29
|
+
│ │ (published) │ │ (editing) │ │
|
|
30
|
+
│ │ │ │ │ │
|
|
31
|
+
│ │ Students │ │ Preview URL │ │
|
|
32
|
+
│ │ see this │ │ /preview/abc │ │
|
|
33
|
+
│ └─────────────┘ └──────────────┘ │
|
|
34
|
+
│ │ │
|
|
35
|
+
│ [Approve] │
|
|
36
|
+
│ │ │
|
|
37
|
+
│ DRAFT v4 → LIVE v4 │
|
|
38
|
+
│ (old LIVE v3 → archived) │
|
|
39
|
+
└─────────────────────────────────────────────────┘
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Database Schema
|
|
45
|
+
|
|
46
|
+
### MySQL
|
|
47
|
+
|
|
48
|
+
```sql
|
|
49
|
+
-- Content versions table — stores every version of every content record
|
|
50
|
+
CREATE TABLE content_versions (
|
|
51
|
+
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
52
|
+
content_type VARCHAR(64) NOT NULL, -- 'lesson', 'course', 'announcement'
|
|
53
|
+
content_id VARCHAR(36) NOT NULL, -- ID of the original record
|
|
54
|
+
version_number INT NOT NULL DEFAULT 1,
|
|
55
|
+
status ENUM('draft', 'in_review', 'approved', 'live', 'archived') DEFAULT 'draft',
|
|
56
|
+
data JSON NOT NULL, -- Full snapshot of all fields
|
|
57
|
+
preview_token VARCHAR(64) UNIQUE, -- Random token for preview URL
|
|
58
|
+
created_by VARCHAR(36) NOT NULL,
|
|
59
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
60
|
+
published_at TIMESTAMP NULL,
|
|
61
|
+
reviewed_by VARCHAR(36) NULL,
|
|
62
|
+
review_note TEXT NULL,
|
|
63
|
+
|
|
64
|
+
INDEX idx_content (content_type, content_id),
|
|
65
|
+
INDEX idx_status (status),
|
|
66
|
+
INDEX idx_preview (preview_token),
|
|
67
|
+
UNIQUE INDEX idx_unique_version (content_type, content_id, version_number),
|
|
68
|
+
FOREIGN KEY (created_by) REFERENCES users(id)
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### PostgreSQL
|
|
73
|
+
|
|
74
|
+
```sql
|
|
75
|
+
CREATE TYPE content_version_status AS ENUM ('draft', 'in_review', 'approved', 'live', 'archived');
|
|
76
|
+
|
|
77
|
+
CREATE TABLE content_versions (
|
|
78
|
+
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
|
|
79
|
+
content_type VARCHAR(64) NOT NULL,
|
|
80
|
+
content_id UUID NOT NULL,
|
|
81
|
+
version_number INT NOT NULL DEFAULT 1,
|
|
82
|
+
status content_version_status DEFAULT 'draft',
|
|
83
|
+
data JSONB NOT NULL,
|
|
84
|
+
preview_token VARCHAR(64) UNIQUE,
|
|
85
|
+
created_by UUID NOT NULL REFERENCES users(id),
|
|
86
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
87
|
+
published_at TIMESTAMPTZ,
|
|
88
|
+
reviewed_by UUID REFERENCES users(id),
|
|
89
|
+
review_note TEXT
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE INDEX idx_cv_content ON content_versions(content_type, content_id);
|
|
93
|
+
CREATE INDEX idx_cv_status ON content_versions(status);
|
|
94
|
+
CREATE UNIQUE INDEX idx_cv_unique ON content_versions(content_type, content_id, version_number);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Content Version Service
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
// server/services/contentVersionService.js
|
|
103
|
+
const crypto = require('crypto');
|
|
104
|
+
|
|
105
|
+
class ContentVersionService {
|
|
106
|
+
constructor(db) {
|
|
107
|
+
this.db = db;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Create a new draft version of existing content.
|
|
112
|
+
* Snapshots the current live data into a new draft record.
|
|
113
|
+
*/
|
|
114
|
+
async createDraft(contentType, contentId, userId) {
|
|
115
|
+
// Get the current live version's data
|
|
116
|
+
const [live] = await this.db.query(
|
|
117
|
+
`SELECT * FROM ${contentType} WHERE id = ?`,
|
|
118
|
+
[contentId]
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
if (!live) throw new Error(`${contentType} ${contentId} not found`);
|
|
122
|
+
|
|
123
|
+
// Get next version number
|
|
124
|
+
const [{ maxVersion }] = await this.db.query(
|
|
125
|
+
`SELECT COALESCE(MAX(version_number), 0) as maxVersion
|
|
126
|
+
FROM content_versions
|
|
127
|
+
WHERE content_type = ? AND content_id = ?`,
|
|
128
|
+
[contentType, contentId]
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
const versionNumber = maxVersion + 1;
|
|
132
|
+
const previewToken = crypto.randomBytes(32).toString('hex');
|
|
133
|
+
|
|
134
|
+
await this.db.query(
|
|
135
|
+
`INSERT INTO content_versions
|
|
136
|
+
(content_type, content_id, version_number, status, data, preview_token, created_by)
|
|
137
|
+
VALUES (?, ?, ?, 'draft', ?, ?, ?)`,
|
|
138
|
+
[contentType, contentId, versionNumber, JSON.stringify(live), previewToken, userId]
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return { versionNumber, previewToken };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Update a draft version's data.
|
|
146
|
+
*/
|
|
147
|
+
async updateDraft(contentType, contentId, versionNumber, updates, userId) {
|
|
148
|
+
const [version] = await this.db.query(
|
|
149
|
+
`SELECT * FROM content_versions
|
|
150
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ? AND status = 'draft'`,
|
|
151
|
+
[contentType, contentId, versionNumber]
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
if (!version) throw new Error('Draft not found or not editable');
|
|
155
|
+
|
|
156
|
+
const currentData = typeof version.data === 'string' ? JSON.parse(version.data) : version.data;
|
|
157
|
+
const newData = { ...currentData, ...updates };
|
|
158
|
+
|
|
159
|
+
await this.db.query(
|
|
160
|
+
`UPDATE content_versions SET data = ?
|
|
161
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ?`,
|
|
162
|
+
[JSON.stringify(newData), contentType, contentId, versionNumber]
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return newData;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Submit a draft for review.
|
|
170
|
+
*/
|
|
171
|
+
async submitForReview(contentType, contentId, versionNumber) {
|
|
172
|
+
await this.db.query(
|
|
173
|
+
`UPDATE content_versions SET status = 'in_review'
|
|
174
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ? AND status = 'draft'`,
|
|
175
|
+
[contentType, contentId, versionNumber]
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Approve a version (reviewer action).
|
|
181
|
+
*/
|
|
182
|
+
async approve(contentType, contentId, versionNumber, reviewerId, note = '') {
|
|
183
|
+
await this.db.query(
|
|
184
|
+
`UPDATE content_versions
|
|
185
|
+
SET status = 'approved', reviewed_by = ?, review_note = ?
|
|
186
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ? AND status = 'in_review'`,
|
|
187
|
+
[reviewerId, note, contentType, contentId, versionNumber]
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Publish an approved version — makes it live and archives the old live version.
|
|
193
|
+
*/
|
|
194
|
+
async publish(contentType, contentId, versionNumber) {
|
|
195
|
+
const [version] = await this.db.query(
|
|
196
|
+
`SELECT * FROM content_versions
|
|
197
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ?
|
|
198
|
+
AND status IN ('approved', 'draft')`,
|
|
199
|
+
[contentType, contentId, versionNumber]
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
if (!version) throw new Error('Version not found or not publishable');
|
|
203
|
+
|
|
204
|
+
const data = typeof version.data === 'string' ? JSON.parse(version.data) : version.data;
|
|
205
|
+
|
|
206
|
+
// Archive current live version
|
|
207
|
+
await this.db.query(
|
|
208
|
+
`UPDATE content_versions SET status = 'archived'
|
|
209
|
+
WHERE content_type = ? AND content_id = ? AND status = 'live'`,
|
|
210
|
+
[contentType, contentId]
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// Mark this version as live
|
|
214
|
+
await this.db.query(
|
|
215
|
+
`UPDATE content_versions
|
|
216
|
+
SET status = 'live', published_at = NOW()
|
|
217
|
+
WHERE content_type = ? AND content_id = ? AND version_number = ?`,
|
|
218
|
+
[contentType, contentId, versionNumber]
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
// Update the actual content table
|
|
222
|
+
const fields = Object.keys(data).filter((k) => k !== 'id' && k !== 'created_at');
|
|
223
|
+
const setClauses = fields.map((f) => `${f} = ?`);
|
|
224
|
+
const values = [...fields.map((f) => data[f]), contentId];
|
|
225
|
+
|
|
226
|
+
await this.db.query(
|
|
227
|
+
`UPDATE ${contentType} SET ${setClauses.join(', ')}, updated_at = NOW() WHERE id = ?`,
|
|
228
|
+
values
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
return data;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Revert to a previous version.
|
|
236
|
+
*/
|
|
237
|
+
async revert(contentType, contentId, targetVersionNumber) {
|
|
238
|
+
return this.publish(contentType, contentId, targetVersionNumber);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Get a version by preview token (for preview URLs).
|
|
243
|
+
*/
|
|
244
|
+
async getByPreviewToken(previewToken) {
|
|
245
|
+
const [version] = await this.db.query(
|
|
246
|
+
`SELECT * FROM content_versions WHERE preview_token = ?`,
|
|
247
|
+
[previewToken]
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
if (!version) throw new Error('Preview not found');
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
...version,
|
|
254
|
+
data: typeof version.data === 'string' ? JSON.parse(version.data) : version.data,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* List all versions of a content record.
|
|
260
|
+
*/
|
|
261
|
+
async listVersions(contentType, contentId) {
|
|
262
|
+
return this.db.query(
|
|
263
|
+
`SELECT cv.*, u.name as author_name
|
|
264
|
+
FROM content_versions cv
|
|
265
|
+
JOIN users u ON cv.created_by = u.id
|
|
266
|
+
WHERE cv.content_type = ? AND cv.content_id = ?
|
|
267
|
+
ORDER BY cv.version_number DESC`,
|
|
268
|
+
[contentType, contentId]
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
module.exports = ContentVersionService;
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## API Routes
|
|
279
|
+
|
|
280
|
+
```js
|
|
281
|
+
// server/routes/contentVersions.js
|
|
282
|
+
const ContentVersionService = require('../services/contentVersionService');
|
|
283
|
+
|
|
284
|
+
const versionService = new ContentVersionService(db);
|
|
285
|
+
|
|
286
|
+
// Create a new draft
|
|
287
|
+
router.post('/api/content/:type/:id/draft', authenticate, authorize(['admin', 'teacher']), async (req, res) => {
|
|
288
|
+
const result = await versionService.createDraft(req.params.type, req.params.id, req.user.id);
|
|
289
|
+
const previewUrl = `${req.protocol}://${req.get('host')}/preview/${result.previewToken}`;
|
|
290
|
+
res.json({ ...result, previewUrl });
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
// Update draft
|
|
294
|
+
router.patch('/api/content/:type/:id/version/:version', authenticate, authorize(['admin', 'teacher']), async (req, res) => {
|
|
295
|
+
const data = await versionService.updateDraft(
|
|
296
|
+
req.params.type, req.params.id, parseInt(req.params.version), req.body, req.user.id
|
|
297
|
+
);
|
|
298
|
+
res.json(data);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Submit for review
|
|
302
|
+
router.post('/api/content/:type/:id/version/:version/submit', authenticate, authorize(['admin', 'teacher']), async (req, res) => {
|
|
303
|
+
await versionService.submitForReview(req.params.type, req.params.id, parseInt(req.params.version));
|
|
304
|
+
res.json({ message: 'Submitted for review' });
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Approve
|
|
308
|
+
router.post('/api/content/:type/:id/version/:version/approve', authenticate, authorize(['admin']), async (req, res) => {
|
|
309
|
+
await versionService.approve(
|
|
310
|
+
req.params.type, req.params.id, parseInt(req.params.version), req.user.id, req.body.note
|
|
311
|
+
);
|
|
312
|
+
res.json({ message: 'Approved' });
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Publish
|
|
316
|
+
router.post('/api/content/:type/:id/version/:version/publish', authenticate, authorize(['admin']), async (req, res) => {
|
|
317
|
+
const data = await versionService.publish(req.params.type, req.params.id, parseInt(req.params.version));
|
|
318
|
+
res.json({ message: 'Published', data });
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// Preview (public — uses token, no auth needed)
|
|
322
|
+
router.get('/preview/:token', async (req, res) => {
|
|
323
|
+
const version = await versionService.getByPreviewToken(req.params.token);
|
|
324
|
+
res.json({ preview: true, ...version });
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// Version history
|
|
328
|
+
router.get('/api/content/:type/:id/versions', authenticate, async (req, res) => {
|
|
329
|
+
const versions = await versionService.listVersions(req.params.type, req.params.id);
|
|
330
|
+
res.json(versions);
|
|
331
|
+
});
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## React: Version History Panel
|
|
337
|
+
|
|
338
|
+
```jsx
|
|
339
|
+
// components/cms/VersionHistory.jsx
|
|
340
|
+
import { useState, useEffect } from 'react';
|
|
341
|
+
|
|
342
|
+
export default function VersionHistory({ contentType, contentId, onPreview, onPublish, onRevert }) {
|
|
343
|
+
const [versions, setVersions] = useState([]);
|
|
344
|
+
const [loading, setLoading] = useState(true);
|
|
345
|
+
|
|
346
|
+
useEffect(() => {
|
|
347
|
+
fetch(`/api/content/${contentType}/${contentId}/versions`)
|
|
348
|
+
.then((r) => r.json())
|
|
349
|
+
.then(setVersions)
|
|
350
|
+
.finally(() => setLoading(false));
|
|
351
|
+
}, [contentType, contentId]);
|
|
352
|
+
|
|
353
|
+
if (loading) return <div>Loading version history...</div>;
|
|
354
|
+
|
|
355
|
+
const statusColors = {
|
|
356
|
+
draft: '#f59e0b',
|
|
357
|
+
in_review: '#8b5cf6',
|
|
358
|
+
approved: '#10b981',
|
|
359
|
+
live: '#3b82f6',
|
|
360
|
+
archived: '#6b7280',
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
return (
|
|
364
|
+
<div style={{ maxWidth: '600px' }}>
|
|
365
|
+
<h3>Version History</h3>
|
|
366
|
+
{versions.map((v) => (
|
|
367
|
+
<div
|
|
368
|
+
key={v.version_number}
|
|
369
|
+
style={{
|
|
370
|
+
padding: '12px',
|
|
371
|
+
border: '1px solid #e5e7eb',
|
|
372
|
+
borderRadius: '8px',
|
|
373
|
+
marginBottom: '8px',
|
|
374
|
+
display: 'flex',
|
|
375
|
+
justifyContent: 'space-between',
|
|
376
|
+
alignItems: 'center',
|
|
377
|
+
}}
|
|
378
|
+
>
|
|
379
|
+
<div>
|
|
380
|
+
<strong>v{v.version_number}</strong>
|
|
381
|
+
<span
|
|
382
|
+
style={{
|
|
383
|
+
background: statusColors[v.status],
|
|
384
|
+
color: 'white',
|
|
385
|
+
padding: '2px 8px',
|
|
386
|
+
borderRadius: '12px',
|
|
387
|
+
fontSize: '12px',
|
|
388
|
+
marginLeft: '8px',
|
|
389
|
+
}}
|
|
390
|
+
>
|
|
391
|
+
{v.status}
|
|
392
|
+
</span>
|
|
393
|
+
<div style={{ color: '#6b7280', fontSize: '13px', marginTop: '4px' }}>
|
|
394
|
+
by {v.author_name} | {new Date(v.created_at).toLocaleDateString()}
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
<div style={{ display: 'flex', gap: '6px' }}>
|
|
398
|
+
{v.preview_token && (
|
|
399
|
+
<button onClick={() => onPreview(v.preview_token)} style={btnStyle}>
|
|
400
|
+
Preview
|
|
401
|
+
</button>
|
|
402
|
+
)}
|
|
403
|
+
{v.status === 'approved' && (
|
|
404
|
+
<button onClick={() => onPublish(v.version_number)} style={{ ...btnStyle, background: '#10b981' }}>
|
|
405
|
+
Publish
|
|
406
|
+
</button>
|
|
407
|
+
)}
|
|
408
|
+
{v.status === 'archived' && (
|
|
409
|
+
<button onClick={() => onRevert(v.version_number)} style={{ ...btnStyle, background: '#f59e0b' }}>
|
|
410
|
+
Revert
|
|
411
|
+
</button>
|
|
412
|
+
)}
|
|
413
|
+
</div>
|
|
414
|
+
</div>
|
|
415
|
+
))}
|
|
416
|
+
</div>
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const btnStyle = {
|
|
421
|
+
background: '#3b82f6',
|
|
422
|
+
color: 'white',
|
|
423
|
+
border: 'none',
|
|
424
|
+
padding: '4px 12px',
|
|
425
|
+
borderRadius: '4px',
|
|
426
|
+
cursor: 'pointer',
|
|
427
|
+
fontSize: '13px',
|
|
428
|
+
};
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## Preview Page Component
|
|
434
|
+
|
|
435
|
+
```jsx
|
|
436
|
+
// pages/PreviewPage.jsx
|
|
437
|
+
import { useState, useEffect } from 'react';
|
|
438
|
+
import { useParams } from 'react-router-dom';
|
|
439
|
+
|
|
440
|
+
export default function PreviewPage() {
|
|
441
|
+
const { token } = useParams();
|
|
442
|
+
const [preview, setPreview] = useState(null);
|
|
443
|
+
const [loading, setLoading] = useState(true);
|
|
444
|
+
|
|
445
|
+
useEffect(() => {
|
|
446
|
+
fetch(`/preview/${token}`)
|
|
447
|
+
.then((r) => r.json())
|
|
448
|
+
.then(setPreview)
|
|
449
|
+
.finally(() => setLoading(false));
|
|
450
|
+
}, [token]);
|
|
451
|
+
|
|
452
|
+
if (loading) return <div>Loading preview...</div>;
|
|
453
|
+
if (!preview) return <div>Preview not found or expired.</div>;
|
|
454
|
+
|
|
455
|
+
return (
|
|
456
|
+
<div>
|
|
457
|
+
{/* Preview banner */}
|
|
458
|
+
<div
|
|
459
|
+
style={{
|
|
460
|
+
background: '#fef3c7',
|
|
461
|
+
border: '1px solid #f59e0b',
|
|
462
|
+
padding: '12px 20px',
|
|
463
|
+
display: 'flex',
|
|
464
|
+
justifyContent: 'space-between',
|
|
465
|
+
alignItems: 'center',
|
|
466
|
+
position: 'sticky',
|
|
467
|
+
top: 0,
|
|
468
|
+
zIndex: 1000,
|
|
469
|
+
}}
|
|
470
|
+
>
|
|
471
|
+
<span>
|
|
472
|
+
<strong>PREVIEW MODE</strong> — Version {preview.version_number} ({preview.status})
|
|
473
|
+
</span>
|
|
474
|
+
<span style={{ color: '#92400e', fontSize: '13px' }}>
|
|
475
|
+
This is not the live version. Only people with this link can see it.
|
|
476
|
+
</span>
|
|
477
|
+
</div>
|
|
478
|
+
|
|
479
|
+
{/* Render the content using preview data */}
|
|
480
|
+
<article style={{ maxWidth: '800px', margin: '40px auto', padding: '0 20px' }}>
|
|
481
|
+
<h1>{preview.data.title}</h1>
|
|
482
|
+
{preview.data.subtitle && <p style={{ color: '#6b7280' }}>{preview.data.subtitle}</p>}
|
|
483
|
+
{preview.data.cover_image && (
|
|
484
|
+
<img src={preview.data.cover_image} alt="" style={{ width: '100%', borderRadius: '8px' }} />
|
|
485
|
+
)}
|
|
486
|
+
<div>{preview.data.body}</div>
|
|
487
|
+
</article>
|
|
488
|
+
</div>
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## Integration With Existing Skills
|
|
496
|
+
|
|
497
|
+
| Skill | How It Connects |
|
|
498
|
+
|-------|----------------|
|
|
499
|
+
| `content-publishing-states.md` | Version status maps to the state machine (draft→in_review→published) |
|
|
500
|
+
| `inline-visual-editing.md` | Inline edits save to the draft version, not live |
|
|
501
|
+
| `scheduled-content-publishing.md` | Schedule a version to auto-publish at a future date |
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## When to Use Content Branching
|
|
506
|
+
|
|
507
|
+
**Use it for:**
|
|
508
|
+
- Lessons and courses (high-impact content, needs review)
|
|
509
|
+
- Landing pages and announcements
|
|
510
|
+
- Any content that goes through an approval workflow
|
|
511
|
+
|
|
512
|
+
**Skip it for:**
|
|
513
|
+
- Chat messages and comments (ephemeral, no review needed)
|
|
514
|
+
- User profile updates (personal, no approval needed)
|
|
515
|
+
- System settings (admin-only, no preview needed)
|