@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.
Files changed (500) hide show
  1. package/CREDITS.md +25 -0
  2. package/DOMINION-FLOW-OVERVIEW.md +182 -38
  3. package/README.md +399 -455
  4. package/TROUBLESHOOTING.md +264 -264
  5. package/agents/fire-debugger.md +54 -0
  6. package/agents/fire-executor.md +1610 -1033
  7. package/agents/fire-fact-checker.md +1 -1
  8. package/agents/fire-planner.md +85 -17
  9. package/agents/fire-project-researcher.md +1 -1
  10. package/agents/fire-researcher.md +4 -22
  11. package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
  12. package/agents/fire-reviewer.md +552 -499
  13. package/agents/fire-verifier.md +114 -19
  14. package/bin/cli.js +18 -101
  15. package/commands/fire-0-orient.md +2 -2
  16. package/commands/fire-1a-new.md +50 -15
  17. package/commands/fire-1c-setup.md +33 -5
  18. package/commands/fire-1d-discuss.md +87 -1
  19. package/commands/fire-2-plan.md +556 -527
  20. package/commands/fire-3-execute.md +2046 -1356
  21. package/commands/fire-4-verify.md +975 -906
  22. package/commands/fire-5-handoff.md +46 -5
  23. package/commands/fire-6-resume.md +2 -31
  24. package/commands/fire-add-new-skill.md +138 -19
  25. package/commands/fire-autonomous.md +14 -2
  26. package/commands/fire-complete-milestone.md +1 -1
  27. package/commands/fire-cost.md +179 -183
  28. package/commands/fire-debug.md +1 -6
  29. package/commands/fire-loop-resume.md +2 -2
  30. package/commands/fire-loop-stop.md +1 -1
  31. package/commands/fire-loop.md +2 -15
  32. package/commands/fire-map-codebase.md +1 -1
  33. package/commands/fire-migrate-database.md +548 -0
  34. package/commands/fire-new-milestone.md +1 -1
  35. package/commands/fire-reflect.md +1 -2
  36. package/commands/fire-research.md +142 -21
  37. package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
  38. package/commands/fire-scaffold.md +297 -0
  39. package/commands/fire-search.md +1 -2
  40. package/commands/fire-security-scan.md +483 -484
  41. package/commands/fire-setup.md +359 -0
  42. package/commands/fire-skill.md +770 -0
  43. package/commands/fire-skills-diff.md +506 -506
  44. package/commands/fire-skills-history.md +388 -388
  45. package/commands/fire-skills-rollback.md +7 -7
  46. package/commands/fire-skills-sync.md +470 -470
  47. package/commands/fire-test.md +5 -5
  48. package/commands/fire-todos.md +1 -1
  49. package/commands/fire-update.md +5 -5
  50. package/commands/fire-validate-skills.md +282 -0
  51. package/commands/fire-vuln-scan.md +492 -493
  52. package/hooks/run-hook.sh +8 -8
  53. package/hooks/run-session-end.sh +7 -7
  54. package/hooks/session-end.sh +90 -90
  55. package/hooks/session-start.sh +1 -1
  56. package/package.json +4 -24
  57. package/plugin.json +7 -7
  58. package/references/autonomy-levels.md +235 -0
  59. package/references/behavioral-directives.md +95 -3
  60. package/references/blocker-tracking.md +1 -1
  61. package/references/circuit-breaker.md +93 -2
  62. package/references/context-engineering.md +227 -9
  63. package/references/honesty-protocols.md +70 -1
  64. package/references/issue-to-pr-pipeline.md +149 -150
  65. package/references/metrics-and-trends.md +1 -2
  66. package/references/research-improvements.md +4 -108
  67. package/references/sdlc-mapping.md +73 -0
  68. package/references/state-machine.md +151 -0
  69. package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
  70. package/skills-library/SKILLS-INDEX.md +57 -558
  71. package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
  72. package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
  73. package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
  74. package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
  75. package/skills-library/_general/automation/settings-gui-generator.md +172 -0
  76. package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
  77. package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
  78. package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
  79. package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
  80. package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
  81. package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
  82. package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
  83. package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
  84. package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
  85. package/skills-library/_general/frontend/color-token-migration.md +112 -0
  86. package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
  87. package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
  88. package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
  89. package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
  90. package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
  91. package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
  92. package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
  93. package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
  94. package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
  95. package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
  96. package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
  97. package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
  98. package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
  99. package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
  100. package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
  101. package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
  102. package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
  103. package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
  104. package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
  105. package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
  106. package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
  107. package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
  108. package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
  109. package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
  110. package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
  111. package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
  112. package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
  113. package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
  114. package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
  115. package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
  116. package/skills-library/_general/methodology/dead-code-activation.md +123 -0
  117. package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
  118. package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
  119. package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
  120. package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
  121. package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
  122. package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
  123. package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
  124. package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
  125. package/skills-library/_general/performance/liveclock-extraction.md +112 -0
  126. package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
  127. package/skills-library/_general/performance/use-visible-interval.md +131 -0
  128. package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
  129. package/skills-library/_quarantine/README.md +30 -0
  130. package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
  131. package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
  132. package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
  133. package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
  134. package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
  135. package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
  136. package/skills-library/api-patterns/graphql-content-queries.md +708 -0
  137. package/skills-library/appointment-scheduler-design.md +423 -0
  138. package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
  139. package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
  140. package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
  141. package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
  142. package/skills-library/automation/scheduled-content-publishing.md +608 -0
  143. package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
  144. package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
  145. package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
  146. package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
  147. package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
  148. package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
  149. package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
  150. package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
  151. package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
  152. package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
  153. package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
  154. package/skills-library/cms-patterns/content-branch-preview.md +515 -0
  155. package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
  156. package/skills-library/cms-patterns/mdx-component-content.md +649 -0
  157. package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
  158. package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
  159. package/skills-library/complexity-metrics/complexity-divider.md +707 -0
  160. package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
  161. package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
  162. package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
  163. package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
  164. package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
  165. package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
  166. package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
  167. package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
  168. package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
  169. package/skills-library/creative-multimedia/og-image-generator.md +635 -0
  170. package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
  171. package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
  172. package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
  173. package/skills-library/creative-multimedia/svg-generation.md +750 -0
  174. package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
  175. package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
  176. package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
  177. package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
  178. package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
  179. package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
  180. package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
  181. package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
  182. package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
  183. package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
  184. package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
  185. package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
  186. package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
  187. package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
  188. package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
  189. package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
  190. package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
  191. package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
  192. package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
  193. package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
  194. package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
  195. package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
  196. package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
  197. package/skills-library/database-solutions/content-publishing-states.md +631 -0
  198. package/skills-library/database-solutions/database-schema-designer.md +522 -0
  199. package/skills-library/database-solutions/er-diagram-components.md +569 -0
  200. package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
  201. package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
  202. package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
  203. package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
  204. package/skills-library/database-solutions/normalization-validator.md +778 -0
  205. package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
  206. package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
  207. package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
  208. package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
  209. package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
  210. package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
  211. package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
  212. package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
  213. package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
  214. package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
  215. package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
  216. package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
  217. package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
  218. package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
  219. package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
  220. package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
  221. package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
  222. package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
  223. package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
  224. package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
  225. package/skills-library/deployment-security/SECURITY.md +41 -0
  226. package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
  227. package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
  228. package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
  229. package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
  230. package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
  231. package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
  232. package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
  233. package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
  234. package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
  235. package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
  236. package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
  237. package/skills-library/deployment-security/vps-deployment.md +135 -0
  238. package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
  239. package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
  240. package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
  241. package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
  242. package/skills-library/document-processing/md-to-word-converter.md +318 -0
  243. package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
  244. package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
  245. package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
  246. package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
  247. package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
  248. package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
  249. package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
  250. package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
  251. package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
  252. package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
  253. package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
  254. package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
  255. package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
  256. package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
  257. package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
  258. package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
  259. package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
  260. package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
  261. package/skills-library/ecommerce/inventory-stock-management.md +270 -0
  262. package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
  263. package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
  264. package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
  265. package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
  266. package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
  267. package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
  268. package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
  269. package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
  270. package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
  271. package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
  272. package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
  273. package/skills-library/excalidraw-diagrams/LICENSE +21 -0
  274. package/skills-library/excalidraw-diagrams/README.md +178 -0
  275. package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
  276. package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
  277. package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
  278. package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
  279. package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
  280. package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
  281. package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
  282. package/skills-library/infrastructure/observability-designer.md +264 -0
  283. package/skills-library/infrastructure/performance-profiler.md +621 -0
  284. package/skills-library/installer-wizard-patterns.md +249 -0
  285. package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
  286. package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
  287. package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
  288. package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
  289. package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
  290. package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
  291. package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
  292. package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
  293. package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
  294. package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
  295. package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
  296. package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
  297. package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
  298. package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
  299. package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
  300. package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
  301. package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
  302. package/skills-library/integrations/headless-cms-architecture.md +484 -0
  303. package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
  304. package/skills-library/integrations/payload-cms-patterns.md +674 -0
  305. package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
  306. package/skills-library/integrations/rss-podcast-integration.md +300 -0
  307. package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
  308. package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
  309. package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
  310. package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
  311. package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
  312. package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
  313. package/skills-library/marketing/campaign-analytics.md +97 -0
  314. package/skills-library/marketing/content-creator.md +105 -0
  315. package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
  316. package/skills-library/marketing/social-media-analyzer.md +81 -0
  317. package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
  318. package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
  319. package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
  320. package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
  321. package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
  322. package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
  323. package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
  324. package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
  325. package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
  326. package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
  327. package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
  328. package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
  329. package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
  330. package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
  331. package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
  332. package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
  333. package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
  334. package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
  335. package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
  336. package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
  337. package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
  338. package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
  339. package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
  340. package/skills-library/methodology/tech-debt-tracker.md +570 -0
  341. package/skills-library/parallel-debug/SKILL.md +60 -0
  342. package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
  343. package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
  344. package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
  345. package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
  346. package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
  347. package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
  348. package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
  349. package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
  350. package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
  351. package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
  352. package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
  353. package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
  354. package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
  355. package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
  356. package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
  357. package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
  358. package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
  359. package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
  360. package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
  361. package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
  362. package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
  363. package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
  364. package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
  365. package/skills-library/security/admin-deletion-safety.md +396 -0
  366. package/skills-library/security/application-vuln-patterns.md +477 -0
  367. package/skills-library/security/env-secrets-manager.md +686 -0
  368. package/skills-library/security/secure-ai-application-templates.md +347 -0
  369. package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
  370. package/skills-library/supabase-connection-pooler-fix.md +102 -0
  371. package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
  372. package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
  373. package/skills-library/system-context/SKILL.md +40 -0
  374. package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
  375. package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
  376. package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
  377. package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
  378. package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
  379. package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
  380. package/skills-library/testing/playwright-api-security-tests.md +202 -0
  381. package/skills-library/toolbox/SKILL.md +84 -0
  382. package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
  383. package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
  384. package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
  385. package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
  386. package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
  387. package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
  388. package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
  389. package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
  390. package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
  391. package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
  392. package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
  393. package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  394. package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  395. package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  396. package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  397. package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  398. package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  399. package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  400. package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  401. package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
  402. package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  403. package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  404. package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  405. package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  406. package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
  407. package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
  408. package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  409. package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  410. package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
  411. package/skills-library/wordpress-style-theme-components.md +1526 -0
  412. package/templates/ASSUMPTIONS.md +1 -1
  413. package/templates/DECISION_LOG.md +0 -1
  414. package/templates/phase-prompt.md +1 -1
  415. package/templates/phoenix-comparison.md +6 -6
  416. package/templates/skill-api-integration.md +106 -0
  417. package/templates/skill-architecture-pattern.md +92 -0
  418. package/templates/skill-debug-pattern.md +98 -0
  419. package/templates/skill-devops-recipe.md +107 -0
  420. package/templates/skill-general.md +65 -0
  421. package/templates/skill-ui-component.md +113 -0
  422. package/tools/uat-runner.py +179 -0
  423. package/version.json +7 -3
  424. package/workflows/handoff-session.md +2 -2
  425. package/workflows/new-project.md +2 -2
  426. package/workflows/plan-phase.md +1 -1
  427. package/.claude-plugin/plugin.json +0 -64
  428. package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
  429. package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
  430. package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
  431. package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
  432. package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
  433. package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
  434. package/skills-library/specialists/api-architecture/api-designer.md +0 -49
  435. package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
  436. package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
  437. package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
  438. package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
  439. package/skills-library/specialists/backend/django-expert.md +0 -52
  440. package/skills-library/specialists/backend/fastapi-expert.md +0 -52
  441. package/skills-library/specialists/backend/laravel-specialist.md +0 -52
  442. package/skills-library/specialists/backend/nestjs-expert.md +0 -51
  443. package/skills-library/specialists/backend/rails-expert.md +0 -53
  444. package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
  445. package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
  446. package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
  447. package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
  448. package/skills-library/specialists/data-ml/rag-architect.md +0 -51
  449. package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
  450. package/skills-library/specialists/frontend/angular-architect.md +0 -52
  451. package/skills-library/specialists/frontend/flutter-expert.md +0 -51
  452. package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
  453. package/skills-library/specialists/frontend/react-native-expert.md +0 -50
  454. package/skills-library/specialists/frontend/vue-expert.md +0 -51
  455. package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
  456. package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
  457. package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
  458. package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
  459. package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
  460. package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
  461. package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
  462. package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
  463. package/skills-library/specialists/languages/cpp-pro.md +0 -74
  464. package/skills-library/specialists/languages/csharp-developer.md +0 -69
  465. package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
  466. package/skills-library/specialists/languages/golang-pro.md +0 -51
  467. package/skills-library/specialists/languages/java-architect.md +0 -49
  468. package/skills-library/specialists/languages/javascript-pro.md +0 -68
  469. package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
  470. package/skills-library/specialists/languages/php-pro.md +0 -49
  471. package/skills-library/specialists/languages/python-pro.md +0 -52
  472. package/skills-library/specialists/languages/react-expert.md +0 -51
  473. package/skills-library/specialists/languages/rust-engineer.md +0 -50
  474. package/skills-library/specialists/languages/sql-pro.md +0 -56
  475. package/skills-library/specialists/languages/swift-expert.md +0 -69
  476. package/skills-library/specialists/languages/typescript-pro.md +0 -51
  477. package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
  478. package/skills-library/specialists/platform/embedded-systems.md +0 -53
  479. package/skills-library/specialists/platform/game-developer.md +0 -53
  480. package/skills-library/specialists/platform/salesforce-developer.md +0 -53
  481. package/skills-library/specialists/platform/shopify-expert.md +0 -49
  482. package/skills-library/specialists/platform/wordpress-pro.md +0 -49
  483. package/skills-library/specialists/quality/code-documenter.md +0 -51
  484. package/skills-library/specialists/quality/code-reviewer.md +0 -67
  485. package/skills-library/specialists/quality/debugging-wizard.md +0 -51
  486. package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
  487. package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
  488. package/skills-library/specialists/quality/playwright-expert.md +0 -65
  489. package/skills-library/specialists/quality/spec-miner.md +0 -56
  490. package/skills-library/specialists/quality/test-master.md +0 -65
  491. package/skills-library/specialists/security/secure-code-guardian.md +0 -55
  492. package/skills-library/specialists/security/security-reviewer.md +0 -53
  493. package/skills-library/specialists/workflow/architecture-designer.md +0 -53
  494. package/skills-library/specialists/workflow/cli-developer.md +0 -70
  495. package/skills-library/specialists/workflow/feature-forge.md +0 -65
  496. package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
  497. package/skills-library/specialists/workflow/the-fool.md +0 -62
  498. /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
  499. /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
  500. /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
@@ -0,0 +1,690 @@
1
+ # TipTap v2 Minimal Rich Text Editor Setup
2
+
3
+ > Production-ready TipTap v2 React component with toolbar, auto-save, image upload, and word count — the minimum viable rich text editor for content platforms.
4
+
5
+ **When to use:** Building any content editor in a React/Vite/Next.js app that needs rich text beyond a basic textarea: blog posts, course lessons, knowledge base articles, CMS content.
6
+ **Stack:** TipTap v2, React 18+, TypeScript, Tailwind CSS
7
+
8
+ ---
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ # Core TipTap packages
14
+ npm install @tiptap/react @tiptap/pm @tiptap/starter-kit
15
+
16
+ # Extensions used in this guide
17
+ npm install @tiptap/extension-placeholder
18
+ npm install @tiptap/extension-link
19
+ npm install @tiptap/extension-image
20
+ npm install @tiptap/extension-character-count
21
+ npm install @tiptap/extension-heading
22
+ npm install @tiptap/extension-code-block-lowlight
23
+ npm install lowlight # syntax highlighting for code blocks
24
+
25
+ # Safe HTML rendering
26
+ npm install isomorphic-dompurify
27
+ npm install @types/dompurify
28
+
29
+ # Optional: typography extension for smart quotes, em-dashes
30
+ npm install @tiptap/extension-typography
31
+ ```
32
+
33
+ **Package summary:**
34
+ | Package | Purpose |
35
+ |---------|---------|
36
+ | `@tiptap/react` | React integration, `useEditor`, `EditorContent` |
37
+ | `@tiptap/pm` | ProseMirror peer dependency |
38
+ | `@tiptap/starter-kit` | Bold, Italic, Strike, Code, Lists, Blockquote, HorizontalRule, History |
39
+ | `@tiptap/extension-link` | Clickable links with href validation |
40
+ | `@tiptap/extension-image` | Image embedding |
41
+ | `@tiptap/extension-character-count` | Word and character count |
42
+ | `@tiptap/extension-placeholder` | Ghost text when editor is empty |
43
+ | `isomorphic-dompurify` | Sanitize HTML before rendering — prevents XSS |
44
+ | `lowlight` | Syntax highlighting engine for code blocks |
45
+
46
+ ---
47
+
48
+ ## Minimal Editor Component
49
+
50
+ ```tsx
51
+ // components/RichTextEditor.tsx
52
+ import React, { useCallback, useEffect, useRef } from 'react';
53
+ import { useEditor, EditorContent } from '@tiptap/react';
54
+ import StarterKit from '@tiptap/starter-kit';
55
+ import Link from '@tiptap/extension-link';
56
+ import Image from '@tiptap/extension-image';
57
+ import Placeholder from '@tiptap/extension-placeholder';
58
+ import CharacterCount from '@tiptap/extension-character-count';
59
+ import Heading from '@tiptap/extension-heading';
60
+
61
+ import { Toolbar } from './EditorToolbar';
62
+
63
+ interface RichTextEditorProps {
64
+ initialContent?: string; // HTML string or JSON string
65
+ onChange?: (html: string, json: object) => void;
66
+ onSave?: (html: string, json: object) => Promise<void>;
67
+ placeholder?: string;
68
+ editable?: boolean;
69
+ wordLimit?: number;
70
+ className?: string;
71
+ }
72
+
73
+ export function RichTextEditor({
74
+ initialContent = '',
75
+ onChange,
76
+ onSave,
77
+ placeholder = 'Start writing...',
78
+ editable = true,
79
+ wordLimit,
80
+ className = '',
81
+ }: RichTextEditorProps) {
82
+ const saveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
83
+ const isSaving = useRef(false);
84
+
85
+ const editor = useEditor({
86
+ extensions: [
87
+ StarterKit.configure({
88
+ heading: false, // We configure heading separately
89
+ codeBlock: false, // We configure codeBlock separately
90
+ }),
91
+ Heading.configure({
92
+ levels: [2, 3, 4], // H2, H3, H4 only — no H1 (page title owns that)
93
+ }),
94
+ Link.configure({
95
+ openOnClick: false, // Don't follow links in editor
96
+ HTMLAttributes: {
97
+ rel: 'noopener noreferrer',
98
+ class: 'text-blue-600 underline hover:text-blue-800',
99
+ },
100
+ validate: (href) => /^https?:\/\//.test(href),
101
+ }),
102
+ Image.configure({
103
+ HTMLAttributes: {
104
+ class: 'max-w-full rounded-lg my-4',
105
+ },
106
+ allowBase64: false, // Force proper uploads, not inline base64
107
+ }),
108
+ Placeholder.configure({
109
+ placeholder,
110
+ emptyNodeClass: 'before:content-[attr(data-placeholder)] before:text-gray-400 before:float-left before:pointer-events-none before:h-0',
111
+ }),
112
+ CharacterCount.configure({
113
+ limit: wordLimit ? wordLimit * 6 : undefined, // rough char estimate
114
+ }),
115
+ ],
116
+
117
+ content: (() => {
118
+ if (!initialContent) return '';
119
+ // Try to parse as JSON (TipTap JSON format), fall back to HTML
120
+ try {
121
+ return JSON.parse(initialContent);
122
+ } catch {
123
+ return initialContent; // treat as HTML
124
+ }
125
+ })(),
126
+
127
+ editable,
128
+
129
+ editorProps: {
130
+ attributes: {
131
+ class: [
132
+ 'prose prose-slate max-w-none',
133
+ 'focus:outline-none',
134
+ 'min-h-[200px] p-4',
135
+ className,
136
+ ].filter(Boolean).join(' '),
137
+ },
138
+ },
139
+
140
+ onUpdate: ({ editor }) => {
141
+ const html = editor.getHTML();
142
+ const json = editor.getJSON();
143
+
144
+ onChange?.(html, json);
145
+
146
+ // Debounced auto-save: wait 1.5s after last keystroke
147
+ if (onSave) {
148
+ if (saveTimer.current) clearTimeout(saveTimer.current);
149
+ saveTimer.current = setTimeout(async () => {
150
+ if (isSaving.current) return;
151
+ isSaving.current = true;
152
+ try {
153
+ await onSave(html, json);
154
+ } finally {
155
+ isSaving.current = false;
156
+ }
157
+ }, 1500);
158
+ }
159
+ },
160
+ });
161
+
162
+ // Cleanup timer on unmount
163
+ useEffect(() => {
164
+ return () => {
165
+ if (saveTimer.current) clearTimeout(saveTimer.current);
166
+ };
167
+ }, []);
168
+
169
+ if (!editor) return null;
170
+
171
+ const wordCount = editor.storage.characterCount?.words() ?? 0;
172
+ const charCount = editor.storage.characterCount?.characters() ?? 0;
173
+
174
+ return (
175
+ <div className="border border-gray-200 rounded-lg overflow-hidden">
176
+ {editable && <Toolbar editor={editor} />}
177
+ <EditorContent editor={editor} />
178
+ <div className="flex justify-end gap-4 px-4 py-2 text-xs text-gray-400 border-t border-gray-100">
179
+ <span>{wordCount} words</span>
180
+ <span>{charCount} characters</span>
181
+ </div>
182
+ </div>
183
+ );
184
+ }
185
+ ```
186
+
187
+ ---
188
+
189
+ ## Toolbar Component
190
+
191
+ ```tsx
192
+ // components/EditorToolbar.tsx
193
+ import React, { useCallback } from 'react';
194
+ import type { Editor } from '@tiptap/react';
195
+
196
+ interface ToolbarProps {
197
+ editor: Editor;
198
+ }
199
+
200
+ export function Toolbar({ editor }: ToolbarProps) {
201
+ const setLink = useCallback(() => {
202
+ const previousUrl = editor.getAttributes('link').href ?? '';
203
+ const url = window.prompt('Enter URL:', previousUrl);
204
+
205
+ if (url === null) return; // cancelled
206
+ if (url === '') {
207
+ editor.chain().focus().extendMarkRange('link').unsetLink().run();
208
+ return;
209
+ }
210
+
211
+ // Prepend https:// if missing
212
+ const normalized = url.startsWith('http') ? url : `https://${url}`;
213
+ editor.chain().focus().extendMarkRange('link').setLink({ href: normalized }).run();
214
+ }, [editor]);
215
+
216
+ return (
217
+ <div className="flex flex-wrap gap-1 p-2 border-b border-gray-200 bg-gray-50">
218
+ {/* Headings */}
219
+ <ToolbarGroup>
220
+ <ToolbarButton
221
+ onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}
222
+ active={editor.isActive('heading', { level: 2 })}
223
+ title="Heading 2"
224
+ >
225
+ H2
226
+ </ToolbarButton>
227
+ <ToolbarButton
228
+ onClick={() => editor.chain().focus().toggleHeading({ level: 3 }).run()}
229
+ active={editor.isActive('heading', { level: 3 })}
230
+ title="Heading 3"
231
+ >
232
+ H3
233
+ </ToolbarButton>
234
+ </ToolbarGroup>
235
+
236
+ <Divider />
237
+
238
+ {/* Marks */}
239
+ <ToolbarGroup>
240
+ <ToolbarButton
241
+ onClick={() => editor.chain().focus().toggleBold().run()}
242
+ active={editor.isActive('bold')}
243
+ disabled={!editor.can().chain().focus().toggleBold().run()}
244
+ title="Bold (Ctrl+B)"
245
+ >
246
+ <b>B</b>
247
+ </ToolbarButton>
248
+ <ToolbarButton
249
+ onClick={() => editor.chain().focus().toggleItalic().run()}
250
+ active={editor.isActive('italic')}
251
+ title="Italic (Ctrl+I)"
252
+ >
253
+ <i>I</i>
254
+ </ToolbarButton>
255
+ <ToolbarButton
256
+ onClick={() => editor.chain().focus().toggleCode().run()}
257
+ active={editor.isActive('code')}
258
+ title="Inline Code"
259
+ >
260
+ {'</>'}
261
+ </ToolbarButton>
262
+ <ToolbarButton
263
+ onClick={setLink}
264
+ active={editor.isActive('link')}
265
+ title="Add Link (Ctrl+K)"
266
+ >
267
+ Link
268
+ </ToolbarButton>
269
+ </ToolbarGroup>
270
+
271
+ <Divider />
272
+
273
+ {/* Lists */}
274
+ <ToolbarGroup>
275
+ <ToolbarButton
276
+ onClick={() => editor.chain().focus().toggleBulletList().run()}
277
+ active={editor.isActive('bulletList')}
278
+ title="Bullet List"
279
+ >
280
+ - List
281
+ </ToolbarButton>
282
+ <ToolbarButton
283
+ onClick={() => editor.chain().focus().toggleOrderedList().run()}
284
+ active={editor.isActive('orderedList')}
285
+ title="Numbered List"
286
+ >
287
+ 1. List
288
+ </ToolbarButton>
289
+ </ToolbarGroup>
290
+
291
+ <Divider />
292
+
293
+ {/* Block elements */}
294
+ <ToolbarGroup>
295
+ <ToolbarButton
296
+ onClick={() => editor.chain().focus().toggleBlockquote().run()}
297
+ active={editor.isActive('blockquote')}
298
+ title="Blockquote"
299
+ >
300
+ Quote
301
+ </ToolbarButton>
302
+ <ToolbarButton
303
+ onClick={() => editor.chain().focus().toggleCodeBlock().run()}
304
+ active={editor.isActive('codeBlock')}
305
+ title="Code Block"
306
+ >
307
+ {'{ }'}
308
+ </ToolbarButton>
309
+ </ToolbarGroup>
310
+
311
+ <Divider />
312
+
313
+ {/* History */}
314
+ <ToolbarGroup>
315
+ <ToolbarButton
316
+ onClick={() => editor.chain().focus().undo().run()}
317
+ disabled={!editor.can().chain().focus().undo().run()}
318
+ title="Undo (Ctrl+Z)"
319
+ >
320
+ Undo
321
+ </ToolbarButton>
322
+ <ToolbarButton
323
+ onClick={() => editor.chain().focus().redo().run()}
324
+ disabled={!editor.can().chain().focus().redo().run()}
325
+ title="Redo (Ctrl+Shift+Z)"
326
+ >
327
+ Redo
328
+ </ToolbarButton>
329
+ </ToolbarGroup>
330
+ </div>
331
+ );
332
+ }
333
+
334
+ // Sub-components
335
+
336
+ function ToolbarGroup({ children }: { children: React.ReactNode }) {
337
+ return <div className="flex gap-0.5">{children}</div>;
338
+ }
339
+
340
+ function Divider() {
341
+ return <div className="w-px bg-gray-200 mx-1 self-stretch" />;
342
+ }
343
+
344
+ interface ButtonProps {
345
+ onClick: () => void;
346
+ active?: boolean;
347
+ disabled?: boolean;
348
+ title?: string;
349
+ children: React.ReactNode;
350
+ }
351
+
352
+ function ToolbarButton({ onClick, active, disabled, title, children }: ButtonProps) {
353
+ return (
354
+ <button
355
+ type="button"
356
+ onClick={onClick}
357
+ disabled={disabled}
358
+ title={title}
359
+ className={[
360
+ 'px-2 py-1 rounded text-sm font-medium transition-colors',
361
+ 'hover:bg-gray-200 disabled:opacity-40 disabled:cursor-not-allowed',
362
+ active
363
+ ? 'bg-gray-800 text-white hover:bg-gray-700'
364
+ : 'text-gray-700',
365
+ ].join(' ')}
366
+ >
367
+ {children}
368
+ </button>
369
+ );
370
+ }
371
+ ```
372
+
373
+ ---
374
+
375
+ ## Getting and Setting Content
376
+
377
+ ```typescript
378
+ // Get content from editor
379
+ const html = editor.getHTML();
380
+ // Returns: '<p>Hello <strong>world</strong></p>'
381
+
382
+ const json = editor.getJSON();
383
+ // Returns ProseMirror document JSON — preferred for storage (round-trips perfectly)
384
+ /*
385
+ {
386
+ "type": "doc",
387
+ "content": [
388
+ {
389
+ "type": "paragraph",
390
+ "content": [
391
+ { "type": "text", "text": "Hello " },
392
+ { "type": "text", "marks": [{ "type": "bold" }], "text": "world" }
393
+ ]
394
+ }
395
+ ]
396
+ }
397
+ */
398
+
399
+ const text = editor.getText();
400
+ // Returns: 'Hello world' (plain text, no markup)
401
+
402
+ // Set content programmatically (e.g., loading saved draft)
403
+ editor.commands.setContent('<p>Loaded from DB</p>'); // HTML
404
+ editor.commands.setContent(jsonFromDatabase, false); // JSON, second arg = don't emit update
405
+ editor.commands.clearContent(); // empty editor
406
+ ```
407
+
408
+ ---
409
+
410
+ ## Saving to Database
411
+
412
+ ```typescript
413
+ // hooks/useContentSave.ts
414
+ import { useCallback, useRef, useState } from 'react';
415
+
416
+ type SaveStatus = 'idle' | 'saving' | 'saved' | 'error';
417
+
418
+ export function useContentSave(contentId: string) {
419
+ const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');
420
+ const lastSavedContent = useRef<string>('');
421
+
422
+ const save = useCallback(async (html: string, json: object) => {
423
+ // Skip if content hasn't changed
424
+ const serialized = JSON.stringify(json);
425
+ if (serialized === lastSavedContent.current) return;
426
+
427
+ setSaveStatus('saving');
428
+ try {
429
+ await fetch(`/api/content/${contentId}`, {
430
+ method: 'PATCH',
431
+ headers: { 'Content-Type': 'application/json' },
432
+ body: JSON.stringify({
433
+ body_html: html,
434
+ body_json: json,
435
+ }),
436
+ });
437
+ lastSavedContent.current = serialized;
438
+ setSaveStatus('saved');
439
+ // Reset to 'idle' after 2 seconds
440
+ setTimeout(() => setSaveStatus('idle'), 2000);
441
+ } catch {
442
+ setSaveStatus('error');
443
+ }
444
+ }, [contentId]);
445
+
446
+ return { save, saveStatus };
447
+ }
448
+
449
+ // Usage in parent:
450
+ function ContentEditPage({ contentId }: { contentId: string }) {
451
+ const { save, saveStatus } = useContentSave(contentId);
452
+
453
+ return (
454
+ <div>
455
+ <div className="flex items-center gap-2 mb-4">
456
+ <h1>Edit Content</h1>
457
+ {saveStatus === 'saving' && <span className="text-sm text-gray-400">Saving...</span>}
458
+ {saveStatus === 'saved' && <span className="text-sm text-green-500">Saved</span>}
459
+ {saveStatus === 'error' && <span className="text-sm text-red-500">Save failed</span>}
460
+ </div>
461
+ <RichTextEditor
462
+ initialContent={content.body_json}
463
+ onSave={save}
464
+ />
465
+ </div>
466
+ );
467
+ }
468
+ ```
469
+
470
+ ---
471
+
472
+ ## Rendering Saved Content Safely
473
+
474
+ **SECURITY: Always sanitize HTML before rendering. Raw HTML from any storage must go through DOMPurify.**
475
+
476
+ **Option A — Sanitize and render HTML:**
477
+
478
+ ```tsx
479
+ // components/ContentRenderer.tsx
480
+ // NOTE: Always sanitize before rendering to prevent XSS attacks.
481
+ import DOMPurify from 'isomorphic-dompurify';
482
+
483
+ const ALLOWED_TAGS = ['p','h2','h3','h4','strong','em','code','pre','a','ul','ol','li','blockquote','img','hr','br'];
484
+ const ALLOWED_ATTR = ['href','src','alt','class','rel','target'];
485
+
486
+ interface Props {
487
+ html: string;
488
+ className?: string;
489
+ }
490
+
491
+ export function ContentRenderer({ html, className = '' }: Props) {
492
+ // Sanitize BEFORE rendering — this prevents XSS even if DB content is compromised
493
+ const sanitized = DOMPurify.sanitize(html, { ALLOWED_TAGS, ALLOWED_ATTR });
494
+
495
+ // eslint-disable-next-line react/no-danger -- intentional: sanitized above with DOMPurify
496
+ return (
497
+ <div
498
+ className={`prose prose-slate max-w-none ${className}`}
499
+ // Content is sanitized by DOMPurify before this assignment
500
+ {...{ dangerouslySetInnerHTML: { __html: sanitized } }}
501
+ />
502
+ );
503
+ }
504
+ ```
505
+
506
+ **Option B (Preferred) — Render from JSON using TipTap's `generateHTML`:**
507
+
508
+ ```tsx
509
+ import { generateHTML } from '@tiptap/html';
510
+ import StarterKit from '@tiptap/starter-kit';
511
+ import Heading from '@tiptap/extension-heading';
512
+ import Link from '@tiptap/extension-link';
513
+
514
+ // This avoids dangerouslySetInnerHTML entirely — output is always valid markup
515
+ function renderContentFromJson(json: object): string {
516
+ return generateHTML(json, [
517
+ StarterKit,
518
+ Heading.configure({ levels: [2, 3, 4] }),
519
+ Link,
520
+ ]);
521
+ }
522
+
523
+ // Then pass the result to ContentRenderer for a final sanitization pass
524
+ // or use TipTap's React renderer for fully safe rendering without innerHTML
525
+ ```
526
+
527
+ Using JSON + `generateHTML` is safer than storing raw HTML because the JSON round-trip is lossless and the schema is strictly controlled by TipTap's node definitions.
528
+
529
+ ---
530
+
531
+ ## Image Upload Extension
532
+
533
+ ```tsx
534
+ // extensions/uploadable-image.ts
535
+ import Image from '@tiptap/extension-image';
536
+
537
+ export const UploadableImage = Image.extend({
538
+ addAttributes() {
539
+ return {
540
+ ...this.parent?.(),
541
+ loading: { default: null },
542
+ };
543
+ },
544
+ });
545
+
546
+ // Upload handler (call from toolbar or drag-drop)
547
+ async function uploadImageFile(file: File, editor: Editor): Promise<void> {
548
+ if (!file.type.startsWith('image/')) {
549
+ alert('Please select an image file');
550
+ return;
551
+ }
552
+
553
+ if (file.size > 5 * 1024 * 1024) {
554
+ alert('Image must be under 5MB');
555
+ return;
556
+ }
557
+
558
+ // Insert a placeholder while uploading
559
+ const placeholderSrc = URL.createObjectURL(file);
560
+ editor.chain().focus().setImage({ src: placeholderSrc, alt: 'Uploading...' }).run();
561
+
562
+ const formData = new FormData();
563
+ formData.append('file', file);
564
+
565
+ try {
566
+ const res = await fetch('/api/media/upload', { method: 'POST', body: formData });
567
+ const { url } = await res.json() as { url: string };
568
+
569
+ // Replace placeholder with real URL
570
+ editor.chain().focus()
571
+ .updateAttributes('image', { src: url, alt: file.name.replace(/\.[^.]+$/, '') })
572
+ .run();
573
+ } catch {
574
+ // Remove the placeholder if upload failed
575
+ editor.chain().focus().undo().run();
576
+ alert('Image upload failed. Please try again.');
577
+ } finally {
578
+ URL.revokeObjectURL(placeholderSrc);
579
+ }
580
+ }
581
+ ```
582
+
583
+ **Add drag-and-drop to the editor wrapper:**
584
+
585
+ ```tsx
586
+ function EditorWithDrop({ editor, children }: { editor: Editor; children: React.ReactNode }) {
587
+ const handleDrop = useCallback((e: React.DragEvent) => {
588
+ e.preventDefault();
589
+ const files = Array.from(e.dataTransfer.files).filter(f => f.type.startsWith('image/'));
590
+ files.forEach(file => uploadImageFile(file, editor));
591
+ }, [editor]);
592
+
593
+ return (
594
+ <div onDrop={handleDrop} onDragOver={e => e.preventDefault()}>
595
+ {children}
596
+ </div>
597
+ );
598
+ }
599
+ ```
600
+
601
+ ---
602
+
603
+ ## Word Count Extension Usage
604
+
605
+ ```tsx
606
+ // Word count is already installed via CharacterCount extension
607
+ // Access via editor.storage:
608
+
609
+ const words = editor.storage.characterCount.words();
610
+ const chars = editor.storage.characterCount.characters();
611
+
612
+ // With a word limit:
613
+ const editor = useEditor({
614
+ extensions: [
615
+ CharacterCount.configure({
616
+ limit: 10000, // character limit
617
+ mode: 'textSize', // 'textSize' (default) or 'nodeSize'
618
+ }),
619
+ ],
620
+ });
621
+
622
+ // Check if limit is approached:
623
+ const charLimit = 10000;
624
+ const currentChars = editor.storage.characterCount.characters();
625
+ const isNearLimit = currentChars >= charLimit * 0.9;
626
+ const isAtLimit = currentChars >= charLimit;
627
+ ```
628
+
629
+ ---
630
+
631
+ ## Common Gotchas
632
+
633
+ ### 1. SSR / Next.js Compatibility
634
+
635
+ TipTap uses browser APIs. In Next.js, always use dynamic import with `ssr: false`:
636
+
637
+ ```tsx
638
+ // pages/edit.tsx or app/edit/page.tsx
639
+ import dynamic from 'next/dynamic';
640
+
641
+ const RichTextEditor = dynamic(
642
+ () => import('../components/RichTextEditor'),
643
+ { ssr: false, loading: () => <div className="h-48 animate-pulse bg-gray-100 rounded" /> }
644
+ );
645
+ ```
646
+
647
+ ### 2. CSS Conflicts with Tailwind's Preflight
648
+
649
+ Tailwind's preflight resets all heading sizes, margins, etc. The `@tailwindcss/typography` plugin (`prose` class) re-applies them. Always wrap rendered content in `prose`:
650
+
651
+ ```tsx
652
+ // Install: npm install @tailwindcss/typography
653
+ // tailwind.config.ts: plugins: [require('@tailwindcss/typography')]
654
+
655
+ <div className="prose prose-slate max-w-none">
656
+ {/* rendered content */}
657
+ </div>
658
+ ```
659
+
660
+ ### 3. `useEditor` Returns `null` Initially
661
+
662
+ The editor is `null` on the first render. Always guard:
663
+
664
+ ```tsx
665
+ if (!editor) return <div className="h-48 bg-gray-50 rounded animate-pulse" />;
666
+ ```
667
+
668
+ ### 4. Content Sync on External Updates
669
+
670
+ If you load new content after the editor is initialized (e.g., switching between drafts):
671
+
672
+ ```tsx
673
+ useEffect(() => {
674
+ if (editor && initialContent && editor.getHTML() !== initialContent) {
675
+ editor.commands.setContent(initialContent, false); // false = don't emit update
676
+ }
677
+ }, [editor, initialContent]);
678
+ ```
679
+
680
+ ### 5. Link Extension Click Behavior
681
+
682
+ By default, `openOnClick: true` causes links to open while editing — confusing for authors. Always set `openOnClick: false` in the editor and handle link clicks in the rendered output separately.
683
+
684
+ ### 6. Bold/Italic Not Working on Safari
685
+
686
+ ProseMirror requires `contenteditable="true"` for keyboard shortcuts. Safari can be finicky with `tabIndex`. Add `tabIndex={0}` to the EditorContent wrapper if shortcuts don't fire.
687
+
688
+ ### 7. XSS When Rendering Saved HTML
689
+
690
+ Never render untrusted HTML without sanitization. Even if your own editor wrote the HTML, always run it through DOMPurify before rendering — database compromise or API injection are real attack vectors. Prefer the JSON + `generateHTML` path to avoid innerHTML entirely.