@muskanmeet/invoicing-design-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (695) hide show
  1. package/.cache/replit/env/latest +78 -0
  2. package/.cache/replit/env/latest.json +1 -0
  3. package/.cache/replit/modules/nodejs-20.res +1 -0
  4. package/.cache/replit/modules/python-3.11.res +1 -0
  5. package/.cache/replit/modules/replit-rtld-loader.res +1 -0
  6. package/.cache/replit/modules/replit.res +1 -0
  7. package/.cache/replit/modules.stamp +0 -0
  8. package/.cache/replit/nix/dotreplitenv.json +1 -0
  9. package/.cache/replit/toolchain.json +1 -0
  10. package/.cache/typescript/5.9/package-lock.json +50 -0
  11. package/.cache/typescript/5.9/package.json +1 -0
  12. package/.config/nextjs-nodejs/config.json +7 -0
  13. package/.eslintrc.json +3 -0
  14. package/.local/.commit_message +31 -0
  15. package/.local/secondary_skills/LICENSE.txt +21 -0
  16. package/.local/secondary_skills/ad-creative/.fingerprint +1 -0
  17. package/.local/secondary_skills/ad-creative/SKILL.md +872 -0
  18. package/.local/secondary_skills/ai-recruiter/.fingerprint +1 -0
  19. package/.local/secondary_skills/ai-recruiter/SKILL.md +1087 -0
  20. package/.local/secondary_skills/ai-sdr/.fingerprint +1 -0
  21. package/.local/secondary_skills/ai-sdr/SKILL.md +204 -0
  22. package/.local/secondary_skills/ai-secretary/.fingerprint +1 -0
  23. package/.local/secondary_skills/ai-secretary/SKILL.md +1132 -0
  24. package/.local/secondary_skills/branding-generator/.fingerprint +1 -0
  25. package/.local/secondary_skills/branding-generator/SKILL.md +286 -0
  26. package/.local/secondary_skills/competitive-analysis/.fingerprint +1 -0
  27. package/.local/secondary_skills/competitive-analysis/SKILL.md +429 -0
  28. package/.local/secondary_skills/content-machine/.fingerprint +1 -0
  29. package/.local/secondary_skills/content-machine/SKILL.md +321 -0
  30. package/.local/secondary_skills/deep-research/.fingerprint +1 -0
  31. package/.local/secondary_skills/deep-research/SKILL.md +517 -0
  32. package/.local/secondary_skills/design-thinker/.fingerprint +1 -0
  33. package/.local/secondary_skills/design-thinker/SKILL.md +327 -0
  34. package/.local/secondary_skills/excel-generator/.fingerprint +1 -0
  35. package/.local/secondary_skills/excel-generator/SKILL.md +954 -0
  36. package/.local/secondary_skills/excel-generator/financial-models.md +289 -0
  37. package/.local/secondary_skills/file-converter/.fingerprint +1 -0
  38. package/.local/secondary_skills/file-converter/SKILL.md +823 -0
  39. package/.local/secondary_skills/flashcard-generator/.fingerprint +1 -0
  40. package/.local/secondary_skills/flashcard-generator/SKILL.md +233 -0
  41. package/.local/secondary_skills/geo/.fingerprint +1 -0
  42. package/.local/secondary_skills/geo/SKILL.md +378 -0
  43. package/.local/secondary_skills/geo/references/content-patterns.md +158 -0
  44. package/.local/secondary_skills/geo/references/platform-notes.md +128 -0
  45. package/.local/secondary_skills/geo/references/scorecard.md +113 -0
  46. package/.local/secondary_skills/geo/references/technical-checklist.md +257 -0
  47. package/.local/secondary_skills/github-solution-finder/.fingerprint +1 -0
  48. package/.local/secondary_skills/github-solution-finder/SKILL.md +174 -0
  49. package/.local/secondary_skills/infographic-builder/.fingerprint +1 -0
  50. package/.local/secondary_skills/infographic-builder/SKILL.md +317 -0
  51. package/.local/secondary_skills/infographic-builder/antv-syntax.md +470 -0
  52. package/.local/secondary_skills/infographic-builder/react-fallback.md +210 -0
  53. package/.local/secondary_skills/insurance-optimizer/.fingerprint +1 -0
  54. package/.local/secondary_skills/insurance-optimizer/SKILL.md +209 -0
  55. package/.local/secondary_skills/interview-prep/.fingerprint +1 -0
  56. package/.local/secondary_skills/interview-prep/SKILL.md +349 -0
  57. package/.local/secondary_skills/invoice-generator/.fingerprint +1 -0
  58. package/.local/secondary_skills/invoice-generator/SKILL.md +527 -0
  59. package/.local/secondary_skills/legal-contract/.fingerprint +1 -0
  60. package/.local/secondary_skills/legal-contract/SKILL.md +977 -0
  61. package/.local/secondary_skills/meal-planner/.fingerprint +1 -0
  62. package/.local/secondary_skills/meal-planner/SKILL.md +517 -0
  63. package/.local/secondary_skills/personal-shopper/.fingerprint +1 -0
  64. package/.local/secondary_skills/personal-shopper/SKILL.md +361 -0
  65. package/.local/secondary_skills/photo-editor/.fingerprint +1 -0
  66. package/.local/secondary_skills/photo-editor/SKILL.md +605 -0
  67. package/.local/secondary_skills/podcast-generator/.fingerprint +1 -0
  68. package/.local/secondary_skills/podcast-generator/SKILL.md +560 -0
  69. package/.local/secondary_skills/podcast-marketing/.fingerprint +1 -0
  70. package/.local/secondary_skills/podcast-marketing/SKILL.md +550 -0
  71. package/.local/secondary_skills/podcast-marketing/audio-processing.md +530 -0
  72. package/.local/secondary_skills/podcast-marketing/content-atoms.md +253 -0
  73. package/.local/secondary_skills/podcast-marketing/content-calendar.md +318 -0
  74. package/.local/secondary_skills/podcast-marketing/content-templates.md +325 -0
  75. package/.local/secondary_skills/podcast-marketing/quote-cards.md +238 -0
  76. package/.local/secondary_skills/podcast-marketing/rss-and-batch.md +359 -0
  77. package/.local/secondary_skills/podcast-marketing/video-clips.md +660 -0
  78. package/.local/secondary_skills/podcast-marketing/youtube-processing.md +328 -0
  79. package/.local/secondary_skills/product-manager/.fingerprint +1 -0
  80. package/.local/secondary_skills/product-manager/SKILL.md +272 -0
  81. package/.local/secondary_skills/programmatic-seo/.fingerprint +1 -0
  82. package/.local/secondary_skills/programmatic-seo/SKILL.md +1207 -0
  83. package/.local/secondary_skills/real-estate-analyzer/.fingerprint +1 -0
  84. package/.local/secondary_skills/real-estate-analyzer/SKILL.md +786 -0
  85. package/.local/secondary_skills/recipe-creator/.fingerprint +1 -0
  86. package/.local/secondary_skills/recipe-creator/SKILL.md +259 -0
  87. package/.local/secondary_skills/recreate-screenshot/.fingerprint +1 -0
  88. package/.local/secondary_skills/recreate-screenshot/SKILL.md +215 -0
  89. package/.local/secondary_skills/replit-migration-guardrails/.fingerprint +1 -0
  90. package/.local/secondary_skills/replit-migration-guardrails/SKILL.md +55 -0
  91. package/.local/secondary_skills/replit-migration-guardrails/references/base44.md +47 -0
  92. package/.local/secondary_skills/replit-migration-guardrails/references/vercel.md +78 -0
  93. package/.local/secondary_skills/resume-maker/.fingerprint +1 -0
  94. package/.local/secondary_skills/resume-maker/SKILL.md +790 -0
  95. package/.local/secondary_skills/seo-auditor/.fingerprint +1 -0
  96. package/.local/secondary_skills/seo-auditor/SKILL.md +448 -0
  97. package/.local/secondary_skills/skill-creator/.fingerprint +1 -0
  98. package/.local/secondary_skills/skill-creator/SKILL.md +214 -0
  99. package/.local/secondary_skills/skill-finder/.fingerprint +1 -0
  100. package/.local/secondary_skills/skill-finder/SKILL.md +299 -0
  101. package/.local/secondary_skills/stock-analyzer/.fingerprint +1 -0
  102. package/.local/secondary_skills/stock-analyzer/SKILL.md +798 -0
  103. package/.local/secondary_skills/storyboard/.fingerprint +1 -0
  104. package/.local/secondary_skills/storyboard/SKILL.md +558 -0
  105. package/.local/secondary_skills/supplier-research/.fingerprint +1 -0
  106. package/.local/secondary_skills/supplier-research/SKILL.md +213 -0
  107. package/.local/secondary_skills/tax-reviewer/.fingerprint +1 -0
  108. package/.local/secondary_skills/tax-reviewer/SKILL.md +131 -0
  109. package/.local/secondary_skills/travel-assistant/.fingerprint +1 -0
  110. package/.local/secondary_skills/travel-assistant/SKILL.md +667 -0
  111. package/.local/secondary_skills/video-editing/.fingerprint +1 -0
  112. package/.local/secondary_skills/video-editing/SKILL.md +705 -0
  113. package/.local/secondary_skills/video-editing/dead-space-and-chunking.md +1081 -0
  114. package/.local/secondary_skills/video-editing/operations.md +1719 -0
  115. package/.local/secondary_skills/video-editing/virality-scoring.md +1212 -0
  116. package/.local/secondary_skills/video-editing/voiceover.md +788 -0
  117. package/.local/secondary_skills/website-cloning/.fingerprint +1 -0
  118. package/.local/secondary_skills/website-cloning/SKILL.md +544 -0
  119. package/.local/secondary_skills/website-cloning/extraction.md +1207 -0
  120. package/.local/secondary_skills/website-cloning/pitfalls.md +297 -0
  121. package/.local/skills/LICENSE.txt +21 -0
  122. package/.local/skills/agent-inbox/.fingerprint +1 -0
  123. package/.local/skills/agent-inbox/SKILL.md +128 -0
  124. package/.local/skills/artifacts/.fingerprint +1 -0
  125. package/.local/skills/artifacts/SKILL.md +21 -0
  126. package/.local/skills/artifacts/artifacts/automation/artifact.yaml +40 -0
  127. package/.local/skills/artifacts/artifacts/automation/files/package.json.template +47 -0
  128. package/.local/skills/artifacts/artifacts/automation/files/scripts/build.sh +6 -0
  129. package/.local/skills/artifacts/artifacts/automation/files/scripts/inngest.sh +18 -0
  130. package/.local/skills/artifacts/artifacts/automation/files/src/global.d.ts +1 -0
  131. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/agents/agent.ts +89 -0
  132. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/index.ts +212 -0
  133. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/client.ts +17 -0
  134. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/index.ts +214 -0
  135. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/storage/index.ts +8 -0
  136. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/tools/exampleTool.ts +71 -0
  137. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/workflows/workflow.ts +203 -0
  138. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/cronTriggers.ts +61 -0
  139. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/exampleConnectorTrigger.ts +153 -0
  140. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/slackTriggers.ts +638 -0
  141. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/telegramTriggers.ts +94 -0
  142. package/.local/skills/artifacts/artifacts/automation/files/tests/testCronAutomation.ts +86 -0
  143. package/.local/skills/artifacts/artifacts/automation/files/tests/testWebhookAutomation.ts +118 -0
  144. package/.local/skills/artifacts/artifacts/automation/files/tsconfig.json +26 -0
  145. package/.local/skills/artifacts/artifacts/data-visualization/artifact.yaml +48 -0
  146. package/.local/skills/artifacts/artifacts/expo/OWNERS +2 -0
  147. package/.local/skills/artifacts/artifacts/expo/artifact.yaml +47 -0
  148. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/_layout.tsx +86 -0
  149. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/index.tsx +28 -0
  150. package/.local/skills/artifacts/artifacts/expo/files/app/+not-found.tsx +45 -0
  151. package/.local/skills/artifacts/artifacts/expo/files/app/_layout.tsx +60 -0
  152. package/.local/skills/artifacts/artifacts/expo/files/app.json.template +38 -0
  153. package/.local/skills/artifacts/artifacts/expo/files/assets/images/icon.png +0 -0
  154. package/.local/skills/artifacts/artifacts/expo/files/babel.config.js +6 -0
  155. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorBoundary.tsx +54 -0
  156. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorFallback.tsx +278 -0
  157. package/.local/skills/artifacts/artifacts/expo/files/components/KeyboardAwareScrollViewCompat.tsx +29 -0
  158. package/.local/skills/artifacts/artifacts/expo/files/constants/colors.ts +59 -0
  159. package/.local/skills/artifacts/artifacts/expo/files/hooks/useColors.ts +24 -0
  160. package/.local/skills/artifacts/artifacts/expo/files/metro.config.js +3 -0
  161. package/.local/skills/artifacts/artifacts/expo/files/package.json.template +58 -0
  162. package/.local/skills/artifacts/artifacts/expo/files/scripts/build.js +573 -0
  163. package/.local/skills/artifacts/artifacts/expo/files/server/serve.js +135 -0
  164. package/.local/skills/artifacts/artifacts/expo/files/server/templates/landing-page.html +460 -0
  165. package/.local/skills/artifacts/artifacts/expo/files/tsconfig.json +23 -0
  166. package/.local/skills/artifacts/artifacts/mockup-sandbox/artifact.yaml +15 -0
  167. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/components.json +21 -0
  168. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/index.html +31 -0
  169. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/mockupPreviewPlugin.ts +199 -0
  170. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/package.json.template +75 -0
  171. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/public/favicon.svg +3 -0
  172. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/.generated/mockup-components.ts +3 -0
  173. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/App.tsx +146 -0
  174. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/accordion.tsx +55 -0
  175. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert-dialog.tsx +139 -0
  176. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert.tsx +59 -0
  177. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/aspect-ratio.tsx +5 -0
  178. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/avatar.tsx +50 -0
  179. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/badge.tsx +43 -0
  180. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/breadcrumb.tsx +115 -0
  181. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button-group.tsx +83 -0
  182. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button.tsx +65 -0
  183. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/calendar.tsx +213 -0
  184. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/card.tsx +76 -0
  185. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/carousel.tsx +260 -0
  186. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/chart.tsx +367 -0
  187. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/checkbox.tsx +28 -0
  188. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/collapsible.tsx +11 -0
  189. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/command.tsx +153 -0
  190. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/context-menu.tsx +198 -0
  191. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dialog.tsx +120 -0
  192. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/drawer.tsx +116 -0
  193. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dropdown-menu.tsx +201 -0
  194. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/empty.tsx +104 -0
  195. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/field.tsx +244 -0
  196. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/form.tsx +176 -0
  197. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/hover-card.tsx +27 -0
  198. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-group.tsx +168 -0
  199. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-otp.tsx +69 -0
  200. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input.tsx +22 -0
  201. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/item.tsx +193 -0
  202. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/kbd.tsx +28 -0
  203. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/label.tsx +26 -0
  204. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/menubar.tsx +254 -0
  205. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/navigation-menu.tsx +128 -0
  206. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/pagination.tsx +117 -0
  207. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/popover.tsx +31 -0
  208. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/progress.tsx +28 -0
  209. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/radio-group.tsx +42 -0
  210. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/resizable.tsx +45 -0
  211. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/scroll-area.tsx +46 -0
  212. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/select.tsx +159 -0
  213. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/separator.tsx +29 -0
  214. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sheet.tsx +140 -0
  215. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sidebar.tsx +727 -0
  216. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/skeleton.tsx +15 -0
  217. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/slider.tsx +26 -0
  218. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sonner.tsx +31 -0
  219. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/spinner.tsx +16 -0
  220. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/switch.tsx +27 -0
  221. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/table.tsx +120 -0
  222. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tabs.tsx +53 -0
  223. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/textarea.tsx +22 -0
  224. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toast.tsx +127 -0
  225. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toaster.tsx +33 -0
  226. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle-group.tsx +61 -0
  227. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle.tsx +43 -0
  228. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tooltip.tsx +32 -0
  229. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-mobile.tsx +19 -0
  230. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-toast.ts +189 -0
  231. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/index.css +158 -0
  232. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/lib/utils.ts +6 -0
  233. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/main.tsx +5 -0
  234. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/tsconfig.json +20 -0
  235. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/vite.config.ts +72 -0
  236. package/.local/skills/artifacts/artifacts/react-vite/artifact.yaml +41 -0
  237. package/.local/skills/artifacts/artifacts/react-vite/files/components.json +20 -0
  238. package/.local/skills/artifacts/artifacts/react-vite/files/index.html.template +24 -0
  239. package/.local/skills/artifacts/artifacts/react-vite/files/package.json.template +77 -0
  240. package/.local/skills/artifacts/artifacts/react-vite/files/public/favicon.svg +3 -0
  241. package/.local/skills/artifacts/artifacts/react-vite/files/public/robots.txt +2 -0
  242. package/.local/skills/artifacts/artifacts/react-vite/files/src/App.tsx +42 -0
  243. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/accordion.tsx +55 -0
  244. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert-dialog.tsx +139 -0
  245. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert.tsx +59 -0
  246. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/aspect-ratio.tsx +5 -0
  247. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/avatar.tsx +50 -0
  248. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/badge.tsx +43 -0
  249. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/breadcrumb.tsx +115 -0
  250. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button-group.tsx +83 -0
  251. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button.tsx +65 -0
  252. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/calendar.tsx +213 -0
  253. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/card.tsx +76 -0
  254. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/carousel.tsx +260 -0
  255. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/chart.tsx +367 -0
  256. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/checkbox.tsx +28 -0
  257. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/collapsible.tsx +11 -0
  258. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/command.tsx +153 -0
  259. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/context-menu.tsx +198 -0
  260. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dialog.tsx +120 -0
  261. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/drawer.tsx +116 -0
  262. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dropdown-menu.tsx +201 -0
  263. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/empty.tsx +104 -0
  264. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/field.tsx +244 -0
  265. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/form.tsx +176 -0
  266. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/hover-card.tsx +27 -0
  267. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-group.tsx +168 -0
  268. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-otp.tsx +69 -0
  269. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input.tsx +22 -0
  270. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/item.tsx +193 -0
  271. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/kbd.tsx +28 -0
  272. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/label.tsx +26 -0
  273. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/menubar.tsx +254 -0
  274. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/navigation-menu.tsx +128 -0
  275. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/pagination.tsx +117 -0
  276. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/popover.tsx +31 -0
  277. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/progress.tsx +28 -0
  278. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/radio-group.tsx +42 -0
  279. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/resizable.tsx +45 -0
  280. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/scroll-area.tsx +46 -0
  281. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/select.tsx +159 -0
  282. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/separator.tsx +29 -0
  283. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sheet.tsx +140 -0
  284. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sidebar.tsx +727 -0
  285. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/skeleton.tsx +15 -0
  286. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/slider.tsx +26 -0
  287. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sonner.tsx +31 -0
  288. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/spinner.tsx +16 -0
  289. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/switch.tsx +27 -0
  290. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/table.tsx +120 -0
  291. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tabs.tsx +53 -0
  292. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/textarea.tsx +22 -0
  293. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toast.tsx +127 -0
  294. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toaster.tsx +33 -0
  295. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle-group.tsx +61 -0
  296. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle.tsx +43 -0
  297. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tooltip.tsx +32 -0
  298. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-mobile.tsx +19 -0
  299. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-toast.ts +191 -0
  300. package/.local/skills/artifacts/artifacts/react-vite/files/src/index.css +393 -0
  301. package/.local/skills/artifacts/artifacts/react-vite/files/src/lib/utils.ts +6 -0
  302. package/.local/skills/artifacts/artifacts/react-vite/files/src/main.tsx +5 -0
  303. package/.local/skills/artifacts/artifacts/react-vite/files/src/pages/not-found.tsx +21 -0
  304. package/.local/skills/artifacts/artifacts/react-vite/files/tsconfig.json +22 -0
  305. package/.local/skills/artifacts/artifacts/react-vite/files/vite.config.ts +75 -0
  306. package/.local/skills/artifacts/artifacts/slides/artifact.yaml +33 -0
  307. package/.local/skills/artifacts/artifacts/slides/files/index.html.template +46 -0
  308. package/.local/skills/artifacts/artifacts/slides/files/package.json.template +30 -0
  309. package/.local/skills/artifacts/artifacts/slides/files/public/favicon.svg +3 -0
  310. package/.local/skills/artifacts/artifacts/slides/files/scripts/validate-slides.ts +193 -0
  311. package/.local/skills/artifacts/artifacts/slides/files/src/App.tsx +251 -0
  312. package/.local/skills/artifacts/artifacts/slides/files/src/data/slides-manifest.json +1 -0
  313. package/.local/skills/artifacts/artifacts/slides/files/src/data/slidesManifestSchema.ts +33 -0
  314. package/.local/skills/artifacts/artifacts/slides/files/src/index.css +48 -0
  315. package/.local/skills/artifacts/artifacts/slides/files/src/main.tsx +14 -0
  316. package/.local/skills/artifacts/artifacts/slides/files/src/slideLoader.ts +51 -0
  317. package/.local/skills/artifacts/artifacts/slides/files/tsconfig.json +17 -0
  318. package/.local/skills/artifacts/artifacts/slides/files/vite.config.ts +74 -0
  319. package/.local/skills/artifacts/artifacts/video-js/artifact.yaml +38 -0
  320. package/.local/skills/artifacts/artifacts/video-js/files/index.html.template +27 -0
  321. package/.local/skills/artifacts/artifacts/video-js/files/package.json.template +36 -0
  322. package/.local/skills/artifacts/artifacts/video-js/files/public/favicon.svg +3 -0
  323. package/.local/skills/artifacts/artifacts/video-js/files/scripts/validate-recording.sh +38 -0
  324. package/.local/skills/artifacts/artifacts/video-js/files/src/App.tsx +5 -0
  325. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/ReplitLoadingScene.tsx +105 -0
  326. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/VideoTemplate.tsx +30 -0
  327. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/index.ts +1 -0
  328. package/.local/skills/artifacts/artifacts/video-js/files/src/hooks/use-mobile.tsx +19 -0
  329. package/.local/skills/artifacts/artifacts/video-js/files/src/index.css +50 -0
  330. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/utils.ts +6 -0
  331. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/animations.ts +239 -0
  332. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/hooks.ts +104 -0
  333. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/index.ts +19 -0
  334. package/.local/skills/artifacts/artifacts/video-js/files/src/main.tsx +5 -0
  335. package/.local/skills/artifacts/artifacts/video-js/files/tsconfig.json +16 -0
  336. package/.local/skills/artifacts/artifacts/video-js/files/vite.config.ts +79 -0
  337. package/.local/skills/artifacts/bootstrap-legacy.js +115 -0
  338. package/.local/skills/artifacts/bootstrap.js +118 -0
  339. package/.local/skills/artifacts/references/multi-artifact-creation.md +94 -0
  340. package/.local/skills/canvas/.fingerprint +1 -0
  341. package/.local/skills/canvas/SKILL.md +534 -0
  342. package/.local/skills/canvas/__init__.py +1 -0
  343. package/.local/skills/code_review/.fingerprint +1 -0
  344. package/.local/skills/code_review/SKILL.md +82 -0
  345. package/.local/skills/database/.fingerprint +1 -0
  346. package/.local/skills/database/SKILL.md +351 -0
  347. package/.local/skills/database/references/database-migrations-on-publish.md +57 -0
  348. package/.local/skills/delegation/.fingerprint +1 -0
  349. package/.local/skills/delegation/SKILL.md +200 -0
  350. package/.local/skills/deployment/.fingerprint +1 -0
  351. package/.local/skills/deployment/SKILL.md +261 -0
  352. package/.local/skills/deployment/references/deployment-failure-debugging.md +243 -0
  353. package/.local/skills/deployment/references/deployment-logs.md +147 -0
  354. package/.local/skills/design/.fingerprint +1 -0
  355. package/.local/skills/design/SKILL.md +235 -0
  356. package/.local/skills/design-exploration/.fingerprint +1 -0
  357. package/.local/skills/design-exploration/SKILL.md +95 -0
  358. package/.local/skills/diagnostics/.fingerprint +1 -0
  359. package/.local/skills/diagnostics/SKILL.md +122 -0
  360. package/.local/skills/environment-secrets/.fingerprint +1 -0
  361. package/.local/skills/environment-secrets/SKILL.md +201 -0
  362. package/.local/skills/expo/.fingerprint +1 -0
  363. package/.local/skills/expo/OWNERS +2 -0
  364. package/.local/skills/expo/SKILL.md +298 -0
  365. package/.local/skills/expo/references/design_and_aesthetics.md +141 -0
  366. package/.local/skills/expo/references/device_features_and_permissions.md +48 -0
  367. package/.local/skills/expo/references/first_build.md +114 -0
  368. package/.local/skills/expo/references/react_context.md +54 -0
  369. package/.local/skills/external_apis/.fingerprint +1 -0
  370. package/.local/skills/external_apis/SKILL.md +25 -0
  371. package/.local/skills/external_apis/references/brave.md +116 -0
  372. package/.local/skills/external_apis/references/elevenlabs.md +44 -0
  373. package/.local/skills/external_apis/references/exa.md +34 -0
  374. package/.local/skills/external_apis/references/firecrawl.md +37 -0
  375. package/.local/skills/external_apis/references/nano_banana.md +33 -0
  376. package/.local/skills/follow-up-tasks/.fingerprint +1 -0
  377. package/.local/skills/follow-up-tasks/SKILL.md +80 -0
  378. package/.local/skills/image-search/.fingerprint +1 -0
  379. package/.local/skills/image-search/SKILL.md +150 -0
  380. package/.local/skills/integrations/.fingerprint +1 -0
  381. package/.local/skills/integrations/SKILL.md +205 -0
  382. package/.local/skills/media-generation/.fingerprint +1 -0
  383. package/.local/skills/media-generation/SKILL.md +170 -0
  384. package/.local/skills/media-generation/audio_generation.md +138 -0
  385. package/.local/skills/media-generation/video_generation.md +82 -0
  386. package/.local/skills/mockup-extract/.fingerprint +1 -0
  387. package/.local/skills/mockup-extract/SKILL.md +123 -0
  388. package/.local/skills/mockup-graduate/.fingerprint +1 -0
  389. package/.local/skills/mockup-graduate/SKILL.md +97 -0
  390. package/.local/skills/mockup-sandbox/.fingerprint +1 -0
  391. package/.local/skills/mockup-sandbox/SKILL.md +750 -0
  392. package/.local/skills/package-management/.fingerprint +1 -0
  393. package/.local/skills/package-management/SKILL.md +264 -0
  394. package/.local/skills/post_merge_setup/.fingerprint +1 -0
  395. package/.local/skills/post_merge_setup/SKILL.md +102 -0
  396. package/.local/skills/project_tasks/.fingerprint +1 -0
  397. package/.local/skills/project_tasks/SKILL.md +361 -0
  398. package/.local/skills/query-integration-data/.fingerprint +1 -0
  399. package/.local/skills/query-integration-data/SKILL.md +385 -0
  400. package/.local/skills/react-vite/.fingerprint +1 -0
  401. package/.local/skills/react-vite/SKILL.md +110 -0
  402. package/.local/skills/react-vite/references/frontend_general_rules.md +66 -0
  403. package/.local/skills/react-vite/references/seo.md +158 -0
  404. package/.local/skills/remove-image-background/.fingerprint +1 -0
  405. package/.local/skills/remove-image-background/SKILL.md +55 -0
  406. package/.local/skills/repl_setup/.fingerprint +1 -0
  407. package/.local/skills/repl_setup/SKILL.md +90 -0
  408. package/.local/skills/repl_setup/references/angular.md +103 -0
  409. package/.local/skills/repl_setup/references/react_vite.md +121 -0
  410. package/.local/skills/repl_setup/references/vue.md +102 -0
  411. package/.local/skills/replit-docs/.fingerprint +1 -0
  412. package/.local/skills/replit-docs/SKILL.md +81 -0
  413. package/.local/skills/revenuecat/.fingerprint +1 -0
  414. package/.local/skills/revenuecat/SKILL.md +133 -0
  415. package/.local/skills/revenuecat/references/initial-setup.md +566 -0
  416. package/.local/skills/revenuecat/references/replit-revenuecat-sdk-docs.md +279 -0
  417. package/.local/skills/revenuecat/references/subsequent-management.md +63 -0
  418. package/.local/skills/security_scan/.fingerprint +1 -0
  419. package/.local/skills/security_scan/SKILL.md +51 -0
  420. package/.local/skills/skill-authoring/.fingerprint +1 -0
  421. package/.local/skills/skill-authoring/SKILL.md +99 -0
  422. package/.local/skills/slides/.fingerprint +1 -0
  423. package/.local/skills/slides/SKILL.md +523 -0
  424. package/.local/skills/slides/references/brand_research.md +86 -0
  425. package/.local/skills/slides/references/export_failures.md +36 -0
  426. package/.local/skills/slides/references/exporting.md +49 -0
  427. package/.local/skills/slides/references/importing.md +40 -0
  428. package/.local/skills/slides/references/visual_qa.md +121 -0
  429. package/.local/skills/slides/templates/90s-board-deck.md +285 -0
  430. package/.local/skills/slides/templates/academic-lecture.md +437 -0
  431. package/.local/skills/slides/templates/adventure-outdoor.md +845 -0
  432. package/.local/skills/slides/templates/analytics-dashboard.md +407 -0
  433. package/.local/skills/slides/templates/annual-report-cover.md +592 -0
  434. package/.local/skills/slides/templates/apple-minimal.md +570 -0
  435. package/.local/skills/slides/templates/architecture-studio.md +339 -0
  436. package/.local/skills/slides/templates/arctic-expedition.md +582 -0
  437. package/.local/skills/slides/templates/arctic-minimal.md +364 -0
  438. package/.local/skills/slides/templates/art-deco.md +308 -0
  439. package/.local/skills/slides/templates/artisan-ceramics.md +659 -0
  440. package/.local/skills/slides/templates/artisan-food.md +709 -0
  441. package/.local/skills/slides/templates/artisanal-chalkboard.md +623 -0
  442. package/.local/skills/slides/templates/astronomy-log.md +562 -0
  443. package/.local/skills/slides/templates/aurora-expedition.md +754 -0
  444. package/.local/skills/slides/templates/automotive-electric.md +339 -0
  445. package/.local/skills/slides/templates/bauhaus-avant-garde.md +443 -0
  446. package/.local/skills/slides/templates/bioluminescent-sea.md +814 -0
  447. package/.local/skills/slides/templates/biophilic-urban.md +565 -0
  448. package/.local/skills/slides/templates/blackboard-chalk.md +517 -0
  449. package/.local/skills/slides/templates/blueprint.md +478 -0
  450. package/.local/skills/slides/templates/botanical-index.md +822 -0
  451. package/.local/skills/slides/templates/botanical-wellness.md +611 -0
  452. package/.local/skills/slides/templates/brand-book-page.md +466 -0
  453. package/.local/skills/slides/templates/brutalist-concrete.md +362 -0
  454. package/.local/skills/slides/templates/brutalist-studio.md +325 -0
  455. package/.local/skills/slides/templates/brutalist-web-punk.md +591 -0
  456. package/.local/skills/slides/templates/celestial-observatory.md +453 -0
  457. package/.local/skills/slides/templates/ceramics-artisan.md +740 -0
  458. package/.local/skills/slides/templates/cinema-verite.md +415 -0
  459. package/.local/skills/slides/templates/claymorphism.md +737 -0
  460. package/.local/skills/slides/templates/collage-zine.md +357 -0
  461. package/.local/skills/slides/templates/copper-sage.md +325 -0
  462. package/.local/skills/slides/templates/coral-reef.md +508 -0
  463. package/.local/skills/slides/templates/corporate-grid.md +331 -0
  464. package/.local/skills/slides/templates/corporate-memphis-flat.md +938 -0
  465. package/.local/skills/slides/templates/cosmos-explorer.md +998 -0
  466. package/.local/skills/slides/templates/cpg-coffee.md +850 -0
  467. package/.local/skills/slides/templates/craft-coffee-roast.md +693 -0
  468. package/.local/skills/slides/templates/creative-agency.md +244 -0
  469. package/.local/skills/slides/templates/creative-director.md +875 -0
  470. package/.local/skills/slides/templates/culinary-brand.md +698 -0
  471. package/.local/skills/slides/templates/de-stijl-construct.md +320 -0
  472. package/.local/skills/slides/templates/desert-dunes-photo.md +483 -0
  473. package/.local/skills/slides/templates/desert-mirror.md +577 -0
  474. package/.local/skills/slides/templates/desert-modernism.md +439 -0
  475. package/.local/skills/slides/templates/developer-api-docs.md +654 -0
  476. package/.local/skills/slides/templates/editorial-magazine.md +694 -0
  477. package/.local/skills/slides/templates/engineering-blueprint.md +730 -0
  478. package/.local/skills/slides/templates/executive-mono.md +363 -0
  479. package/.local/skills/slides/templates/expedition-peak.md +298 -0
  480. package/.local/skills/slides/templates/fashion-campaign.md +681 -0
  481. package/.local/skills/slides/templates/fashion-editorial.md +497 -0
  482. package/.local/skills/slides/templates/figma-geometric.md +420 -0
  483. package/.local/skills/slides/templates/film-noir.md +857 -0
  484. package/.local/skills/slides/templates/fitness-athletics.md +663 -0
  485. package/.local/skills/slides/templates/flat-vector.md +912 -0
  486. package/.local/skills/slides/templates/fluid-luxe.md +665 -0
  487. package/.local/skills/slides/templates/furniture-brand.md +505 -0
  488. package/.local/skills/slides/templates/gallery-modern.md +436 -0
  489. package/.local/skills/slides/templates/gaming-esports.md +410 -0
  490. package/.local/skills/slides/templates/geodesic-future.md +368 -0
  491. package/.local/skills/slides/templates/glass-artisan.md +666 -0
  492. package/.local/skills/slides/templates/glassmorphism.md +320 -0
  493. package/.local/skills/slides/templates/greenhouse-botanical.md +662 -0
  494. package/.local/skills/slides/templates/healthcare-clarity.md +468 -0
  495. package/.local/skills/slides/templates/holographic-drop.md +663 -0
  496. package/.local/skills/slides/templates/hospitality-resort.md +608 -0
  497. package/.local/skills/slides/templates/hypercar-launch.md +557 -0
  498. package/.local/skills/slides/templates/infographic-title.md +306 -0
  499. package/.local/skills/slides/templates/ink-wash.md +244 -0
  500. package/.local/skills/slides/templates/investor-memo.md +509 -0
  501. package/.local/skills/slides/templates/isometric-data.md +703 -0
  502. package/.local/skills/slides/templates/ivory-boardroom.md +439 -0
  503. package/.local/skills/slides/templates/japanese-minimal.md +308 -0
  504. package/.local/skills/slides/templates/jazz-blue-note.md +478 -0
  505. package/.local/skills/slides/templates/kinetic-type.md +206 -0
  506. package/.local/skills/slides/templates/lagoon-luxury.md +320 -0
  507. package/.local/skills/slides/templates/lavender-pastoral.md +577 -0
  508. package/.local/skills/slides/templates/linear-precise.md +460 -0
  509. package/.local/skills/slides/templates/lineart-sketch.md +930 -0
  510. package/.local/skills/slides/templates/lost-temple.md +689 -0
  511. package/.local/skills/slides/templates/luxury-fashion.md +269 -0
  512. package/.local/skills/slides/templates/luxury-watch.md +678 -0
  513. package/.local/skills/slides/templates/marble-elegance.md +673 -0
  514. package/.local/skills/slides/templates/mediterranean-travel.md +811 -0
  515. package/.local/skills/slides/templates/memphis-design.md +426 -0
  516. package/.local/skills/slides/templates/midnight-jazz.md +260 -0
  517. package/.local/skills/slides/templates/minimalist-poster.md +538 -0
  518. package/.local/skills/slides/templates/molten-craft.md +743 -0
  519. package/.local/skills/slides/templates/moroccan-tile.md +738 -0
  520. package/.local/skills/slides/templates/motorsport.md +782 -0
  521. package/.local/skills/slides/templates/mountain-drift.md +311 -0
  522. package/.local/skills/slides/templates/music-label.md +641 -0
  523. package/.local/skills/slides/templates/neo-tokyo.md +637 -0
  524. package/.local/skills/slides/templates/neobrutalism.md +334 -0
  525. package/.local/skills/slides/templates/newspaper-broadsheet.md +687 -0
  526. package/.local/skills/slides/templates/noir-fragrance.md +672 -0
  527. package/.local/skills/slides/templates/non-profit-impact.md +320 -0
  528. package/.local/skills/slides/templates/ocean-breeze.md +398 -0
  529. package/.local/skills/slides/templates/origami-couture.md +636 -0
  530. package/.local/skills/slides/templates/origami-paper.md +308 -0
  531. package/.local/skills/slides/templates/pastel-playground.md +1114 -0
  532. package/.local/skills/slides/templates/perfume-noir.md +646 -0
  533. package/.local/skills/slides/templates/prairie-storm.md +625 -0
  534. package/.local/skills/slides/templates/private-equity-dark.md +506 -0
  535. package/.local/skills/slides/templates/renaissance-florals.md +225 -0
  536. package/.local/skills/slides/templates/retro-print.md +880 -0
  537. package/.local/skills/slides/templates/retro-vinyl-sleeve.md +229 -0
  538. package/.local/skills/slides/templates/riso-zine.md +1094 -0
  539. package/.local/skills/slides/templates/risograph.md +1151 -0
  540. package/.local/skills/slides/templates/saas-product-launch.md +972 -0
  541. package/.local/skills/slides/templates/scandinavian.md +372 -0
  542. package/.local/skills/slides/templates/skater-culture.md +583 -0
  543. package/.local/skills/slides/templates/slate-modern.md +469 -0
  544. package/.local/skills/slides/templates/sneaker-drop.md +1006 -0
  545. package/.local/skills/slides/templates/social-campaign.md +321 -0
  546. package/.local/skills/slides/templates/stained-glass.md +574 -0
  547. package/.local/skills/slides/templates/strategy-one-pager.md +508 -0
  548. package/.local/skills/slides/templates/street-drop.md +677 -0
  549. package/.local/skills/slides/templates/street-mural.md +588 -0
  550. package/.local/skills/slides/templates/studio-noir.md +466 -0
  551. package/.local/skills/slides/templates/sustainability-esg.md +686 -0
  552. package/.local/skills/slides/templates/swiss-archive.md +648 -0
  553. package/.local/skills/slides/templates/swiss-typographic.md +364 -0
  554. package/.local/skills/slides/templates/tea-ceremony.md +456 -0
  555. package/.local/skills/slides/templates/tech-earbuds.md +870 -0
  556. package/.local/skills/slides/templates/terracotta-studio.md +235 -0
  557. package/.local/skills/slides/templates/thesis-defense.md +390 -0
  558. package/.local/skills/slides/templates/travel-aerial.md +648 -0
  559. package/.local/skills/slides/templates/treasury-policy.md +475 -0
  560. package/.local/skills/slides/templates/tropical-lush.md +332 -0
  561. package/.local/skills/slides/templates/underwater-dream.md +627 -0
  562. package/.local/skills/slides/templates/urban-golden.md +342 -0
  563. package/.local/skills/slides/templates/vintage-apothecary.md +552 -0
  564. package/.local/skills/slides/templates/vintage-ticket-stub.md +637 -0
  565. package/.local/skills/slides/templates/vinyl-crate.md +550 -0
  566. package/.local/skills/slides/templates/vision-editorial.md +612 -0
  567. package/.local/skills/slides/templates/volcanic-edge.md +347 -0
  568. package/.local/skills/slides/templates/watercolor-city.md +827 -0
  569. package/.local/skills/slides/templates/wine-spirits.md +203 -0
  570. package/.local/skills/slides/templates/wireframe-prototype.md +718 -0
  571. package/.local/skills/slides/templates/workspace-design.md +782 -0
  572. package/.local/skills/slides/templates/workspace-modern.md +406 -0
  573. package/.local/skills/slides/templates/zen-meditation.md +284 -0
  574. package/.local/skills/slides/templates/zen-void.md +244 -0
  575. package/.local/skills/stripe/.fingerprint +1 -0
  576. package/.local/skills/stripe/SKILL.md +455 -0
  577. package/.local/skills/stripe/references/code-templates.md +588 -0
  578. package/.local/skills/threat_modeling/.fingerprint +1 -0
  579. package/.local/skills/threat_modeling/SKILL.md +240 -0
  580. package/.local/skills/validation/.fingerprint +1 -0
  581. package/.local/skills/validation/SKILL.md +237 -0
  582. package/.local/skills/video-js/.fingerprint +1 -0
  583. package/.local/skills/video-js/SKILL.md +793 -0
  584. package/.local/skills/video-js/references/audio.md +237 -0
  585. package/.local/skills/video-js/references/finalize_playback.md +16 -0
  586. package/.local/skills/video-js/references/first_build.md +87 -0
  587. package/.local/skills/video-js/references/scene_selectors.md +428 -0
  588. package/.local/skills/web-search/.fingerprint +1 -0
  589. package/.local/skills/web-search/SKILL.md +110 -0
  590. package/.local/skills/whop/.fingerprint +1 -0
  591. package/.local/skills/whop/SKILL.md +104 -0
  592. package/.local/skills/whop/references/code-templates.md +66 -0
  593. package/.local/skills/whop/references/whop-api.mjs +22 -0
  594. package/.local/skills/whop/references/whop-mcp.mjs +40 -0
  595. package/.local/skills/whop/references/whopClient.ts +54 -0
  596. package/.local/skills/workflows/.fingerprint +1 -0
  597. package/.local/skills/workflows/SKILL.md +245 -0
  598. package/.local/state/replit/agent/.agent_state_037313043e76b5c652f276153ea014a68570e145.bin +0 -0
  599. package/.local/state/replit/agent/.agent_state_0f5361c2a53ab324b2a941a797f6494891be084c.bin +0 -0
  600. package/.local/state/replit/agent/.agent_state_4272443827dc90eac8c5b1963a34ee86da70bb99.bin +0 -0
  601. package/.local/state/replit/agent/.agent_state_4f14655950cbd611b228b4f0e1f664b66a56af24.bin +0 -0
  602. package/.local/state/replit/agent/.agent_state_ce28955a30856aa3d095b3568c322c8ec098993f.bin +0 -0
  603. package/.local/state/replit/agent/.agent_state_ec5347d04ebfbf6cf850fe04e15590d423e96d1d.bin +0 -0
  604. package/.local/state/replit/agent/.agent_state_f68f8c104d815ccc387290f0fba2c87c818d29f1.bin +0 -0
  605. package/.local/state/replit/agent/.agent_state_f87c1803a179510408c57c7a380c26f5c2197a30.bin +0 -0
  606. package/.local/state/replit/agent/.agent_state_main.bin +0 -0
  607. package/.local/state/replit/agent/.latest.json +1 -0
  608. package/.local/state/replit/agent/repl_state.bin +0 -0
  609. package/.local/state/scribe/scribe.db +0 -0
  610. package/.local/state/scribe/scribe.db-shm +0 -0
  611. package/.local/state/scribe/scribe.db-wal +0 -0
  612. package/.local/state/workflow-logs/2tfQP52ibxJTy4lpZ7_JX/start_application.shell.exec.0 +27 -0
  613. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.external.managed.0 +31 -0
  614. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.json +1 -0
  615. package/.local/state/workflow-logs/85n-z_SHy4JSGaUeJIcxy/start_application.shell.exec.0 +18 -0
  616. package/.local/state/workflow-logs/GIL2Ql5124lrEqGrfRO4k/start_application.shell.exec.0 +222 -0
  617. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.external.managed.0 +45 -0
  618. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.json +1 -0
  619. package/.local/state/workflow-logs/OKp1t-fEO5U_zQi1SKOQ-/start_application.shell.exec.0 +10 -0
  620. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.external.managed.0 +43 -0
  621. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.json +1 -0
  622. package/.local/state/workflow-logs/UDYycRqPV-N4B7whZP-yX/start_application.shell.exec.0 +252 -0
  623. package/.local/state/workflow-logs/V8Anmvz-HuvAztflZ8yCo/start_application.shell.exec.0 +87 -0
  624. package/.local/state/workflow-logs/a5fMnjr9tCwoaFY93pYuN/start_application.shell.exec.0 +2519 -0
  625. package/.local/state/workflow-logs/ggFzYcdHfIlW0owP2pb0U/start_application.shell.exec.0 +28 -0
  626. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.external.managed.0 +41 -0
  627. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.json +1 -0
  628. package/.local/state/workflow-logs/nbLvtuGJXB0wPmnruB3BE/start_application.shell.exec.0 +199 -0
  629. package/.local/state/workflow-logs/uDhN6S0ypUEh0MphXaFGY/start_application.shell.exec.0 +73 -0
  630. package/.local/state/workflow-logs/xZqU5CdTivcY6KEDEcVmD/start_application.shell.exec.0 +17 -0
  631. package/.local/tasks/breadcrumb-component.md +89 -0
  632. package/.local/tasks/calendar-component.md +93 -0
  633. package/.local/tasks/invoicing-design-system-app.md +39 -0
  634. package/.local/tasks/task-1.md +42 -0
  635. package/.local/tasks/task-7.md +92 -0
  636. package/.local/tasks/task-8.md +96 -0
  637. package/.replit +34 -0
  638. package/.upm/store.json +1 -0
  639. package/README.md +121 -0
  640. package/app/dashboard/page.tsx +10 -0
  641. package/app/design-system/page.tsx +802 -0
  642. package/app/invoices/page.tsx +10 -0
  643. package/app/layout.tsx +28 -0
  644. package/app/login/page.tsx +5 -0
  645. package/app/page.tsx +93 -0
  646. package/app/signup/page.tsx +5 -0
  647. package/attached_assets/Colors_1779781016394.png +0 -0
  648. package/attached_assets/Navy_1779781016404.png +0 -0
  649. package/attached_assets/Orange_1779781016405.png +0 -0
  650. package/attached_assets/Screenshot_2026-05-26_at_1.14.29_PM_1779781472515.png +0 -0
  651. package/attached_assets/Screenshot_2026-05-26_at_11.28.20_AM_1779775171071.png +0 -0
  652. package/attached_assets/Screenshot_2026-05-26_at_2.04.42_PM_1779784485318.png +0 -0
  653. package/attached_assets/Typography_1779781016406.png +0 -0
  654. package/design-system/components/avatar.tsx +46 -0
  655. package/design-system/components/badge.tsx +34 -0
  656. package/design-system/components/breadcrumb.tsx +149 -0
  657. package/design-system/components/button.tsx +57 -0
  658. package/design-system/components/calendar.tsx +77 -0
  659. package/design-system/components/card.tsx +62 -0
  660. package/design-system/components/checkbox.tsx +27 -0
  661. package/design-system/components/date-picker.tsx +153 -0
  662. package/design-system/components/dialog.tsx +106 -0
  663. package/design-system/components/dropdown-menu.tsx +88 -0
  664. package/design-system/components/form-field.tsx +78 -0
  665. package/design-system/components/input.tsx +25 -0
  666. package/design-system/components/label.tsx +25 -0
  667. package/design-system/components/popover.tsx +30 -0
  668. package/design-system/components/radio-group.tsx +35 -0
  669. package/design-system/components/select.tsx +84 -0
  670. package/design-system/components/separator.tsx +24 -0
  671. package/design-system/components/switch.tsx +28 -0
  672. package/design-system/components/table.tsx +80 -0
  673. package/design-system/components/tabs.tsx +54 -0
  674. package/design-system/components/textarea.tsx +25 -0
  675. package/design-system/components/toast.tsx +118 -0
  676. package/design-system/components/toaster.tsx +38 -0
  677. package/design-system/components/tooltip.tsx +27 -0
  678. package/design-system/hooks/index.ts +2 -0
  679. package/design-system/hooks/use-media-query.ts +27 -0
  680. package/design-system/hooks/use-toast.ts +91 -0
  681. package/design-system/index.ts +36 -0
  682. package/design-system/lib/cn.ts +6 -0
  683. package/design-system/styles.css +142 -0
  684. package/design-system/tokens/tokens.css +149 -0
  685. package/design-system/tokens/tokens.ts +190 -0
  686. package/next.config.mjs +6 -0
  687. package/package.json +46 -0
  688. package/postcss.config.mjs +6 -0
  689. package/screens/_shared/app-shell.tsx +145 -0
  690. package/screens/auth/auth-screen.tsx +156 -0
  691. package/screens/dashboard/dashboard-screen.tsx +207 -0
  692. package/screens/index.ts +17 -0
  693. package/screens/invoices/invoices-screen.tsx +317 -0
  694. package/tailwind.config.ts +110 -0
  695. package/tsconfig.json +26 -0
@@ -0,0 +1,1081 @@
1
+ # Dead Space Removal & Social Media Chunking
2
+
3
+ Complete implementation guide for removing silence/dead space from videos and chunking longer videos into social media-ready clips.
4
+
5
+ ## Table of Contents
6
+
7
+ 1. [Dead Space Removal](#dead-space-removal)
8
+ 2. [Social Media Chunking](#social-media-chunking)
9
+
10
+ 3. [Combined Pipeline](#combined-pipeline)
11
+
12
+ ---
13
+
14
+ ## Dead Space Removal
15
+
16
+ Remove silence, dead air, and filler from a video to produce a tighter cut.
17
+
18
+ ### Step 1: Detect Silent Intervals
19
+
20
+ Use FFmpeg's `silencedetect` filter to find all silent sections. Parse the output from stderr.
21
+
22
+ ```typescript
23
+
24
+ import { execFile } from 'child_process';
25
+
26
+ import { promisify } from 'util';
27
+
28
+ const execFileAsync = promisify(execFile);
29
+
30
+ interface SilentInterval {
31
+
32
+ start: number;
33
+
34
+ end: number;
35
+
36
+ duration: number;
37
+
38
+ }
39
+
40
+ interface SpeakingInterval {
41
+
42
+ start: number;
43
+
44
+ end: number;
45
+
46
+ duration: number;
47
+
48
+ }
49
+
50
+ async function detectSilence(
51
+
52
+ videoPath: string,
53
+
54
+ noiseThresholdDb = -35,
55
+
56
+ minSilenceDuration = 0.5
57
+
58
+ ): Promise<SilentInterval[]> {
59
+
60
+ const { stderr } = await execFileAsync('ffmpeg', [
61
+
62
+ '-i', videoPath,
63
+
64
+ '-af', `silencedetect=noise=${noiseThresholdDb}dB:d=${minSilenceDuration}`,
65
+
66
+ '-f', 'null', '-'
67
+
68
+ ], { maxBuffer: 10 * 1024 * 1024 });
69
+
70
+ const silentIntervals: SilentInterval[] = [];
71
+
72
+ const lines = stderr.split('\n');
73
+
74
+ let currentStart: number | null = null;
75
+
76
+ for (const line of lines) {
77
+
78
+ const startMatch = line.match(/silence_start:\s*([0-9.]+)/);
79
+
80
+ const endMatch = line.match(/silence_end:\s*([0-9.]+)\s*\\\s*silence_duration:\s*([0-9.]+)/);
81
+
82
+ if (startMatch) {
83
+
84
+ currentStart = parseFloat(startMatch[1]);
85
+
86
+ }
87
+
88
+ if (endMatch && currentStart !== null) {
89
+
90
+ const end = parseFloat(endMatch[1]);
91
+
92
+ const duration = parseFloat(endMatch[2]);
93
+
94
+ silentIntervals.push({ start: currentStart, end, duration });
95
+
96
+ currentStart = null;
97
+
98
+ }
99
+
100
+ }
101
+
102
+ return silentIntervals;
103
+
104
+ }
105
+
106
+ ```
107
+
108
+ ### Presets
109
+
110
+ ```typescript
111
+
112
+ const SILENCE_PRESETS = {
113
+
114
+ light: { noiseThresholdDb: -40, minSilenceDuration: 1.0 },
115
+
116
+ medium: { noiseThresholdDb: -35, minSilenceDuration: 0.5 },
117
+
118
+ aggressive: { noiseThresholdDb: -30, minSilenceDuration: 0.3 },
119
+
120
+ } as const;
121
+
122
+ type SilencePreset = keyof typeof SILENCE_PRESETS;
123
+
124
+ ```
125
+
126
+ ### Step 2: Calculate Non-Silent (Speaking) Intervals
127
+
128
+ Invert the silent intervals to find the parts worth keeping. Add a small padding around each speaking segment so words don't get clipped.
129
+
130
+ ```typescript
131
+
132
+ async function getSpeakingIntervals(
133
+
134
+ videoPath: string,
135
+
136
+ silentIntervals: SilentInterval[],
137
+
138
+ paddingSeconds = 0.1
139
+
140
+ ): Promise<SpeakingInterval[]> {
141
+
142
+ const { stdout } = await execFileAsync('ffprobe', [
143
+
144
+ '-v', 'quiet', '-print_format', 'json', '-show_format', videoPath
145
+
146
+ ]);
147
+
148
+ const totalDuration = parseFloat(JSON.parse(stdout).format.duration);
149
+
150
+ if (silentIntervals.length === 0) {
151
+
152
+ return [{ start: 0, end: totalDuration, duration: totalDuration }];
153
+
154
+ }
155
+
156
+ const speaking: SpeakingInterval[] = [];
157
+
158
+ let cursor = 0;
159
+
160
+ for (const silence of silentIntervals) {
161
+
162
+ const segStart = Math.max(0, cursor);
163
+
164
+ const segEnd = Math.max(segStart, silence.start + paddingSeconds);
165
+
166
+ if (segEnd - segStart >= 0.1) {
167
+
168
+ speaking.push({ start: segStart, end: segEnd, duration: segEnd - segStart });
169
+
170
+ }
171
+
172
+ cursor = Math.max(cursor, silence.end - paddingSeconds);
173
+
174
+ }
175
+
176
+ if (cursor < totalDuration) {
177
+
178
+ speaking.push({
179
+
180
+ start: cursor,
181
+
182
+ end: totalDuration,
183
+
184
+ duration: totalDuration - cursor,
185
+
186
+ });
187
+
188
+ }
189
+
190
+ return speaking;
191
+
192
+ }
193
+
194
+ ```
195
+
196
+ ### Step 3: Extract and Reassemble
197
+
198
+ Extract each speaking segment and concatenate them into the final output.
199
+
200
+ ```typescript
201
+
202
+ import * as fs from 'fs';
203
+
204
+ import * as path from 'path';
205
+
206
+ async function removeDeadSpace(
207
+
208
+ videoPath: string,
209
+
210
+ outputPath: string,
211
+
212
+ preset: SilencePreset = 'medium',
213
+
214
+ useTransitions = false,
215
+
216
+ transitionDuration = 0.3
217
+
218
+ ): Promise<{ outputPath: string; originalDuration: number; newDuration: number; removedSeconds: number }> {
219
+
220
+ const config = SILENCE_PRESETS[preset];
221
+
222
+ console.log(`Detecting silence (preset: ${preset}, threshold: ${config.noiseThresholdDb}dB, min duration: ${config.minSilenceDuration}s)...`);
223
+
224
+ const silentIntervals = await detectSilence(videoPath, config.noiseThresholdDb, config.minSilenceDuration);
225
+
226
+ console.log(`Found ${silentIntervals.length} silent intervals`);
227
+
228
+ const speakingIntervals = await getSpeakingIntervals(videoPath, silentIntervals);
229
+
230
+ console.log(`Found ${speakingIntervals.length} speaking segments`);
231
+
232
+ if (speakingIntervals.length === 0) {
233
+
234
+ throw new Error('No speaking segments found — the entire video appears silent');
235
+
236
+ }
237
+
238
+ if (speakingIntervals.length === 1 && silentIntervals.length === 0) {
239
+
240
+ console.log('No silence detected — video is already tight');
241
+
242
+ await fs.promises.copyFile(videoPath, outputPath);
243
+
244
+ const dur = speakingIntervals[0].duration;
245
+
246
+ return { outputPath, originalDuration: dur, newDuration: dur, removedSeconds: 0 };
247
+
248
+ }
249
+
250
+ const tmpDir = path.join(path.dirname(outputPath), `tmp_deadspace_${Date.now()}`);
251
+
252
+ await fs.promises.mkdir(tmpDir, { recursive: true });
253
+
254
+ const clipPaths: string[] = [];
255
+
256
+ for (let i = 0; i < speakingIntervals.length; i++) {
257
+
258
+ const seg = speakingIntervals[i];
259
+
260
+ const clipPath = path.join(tmpDir, `seg_${i.toString().padStart(4, '0')}.mp4`);
261
+
262
+ await execFileAsync('ffmpeg', [
263
+
264
+ '-y',
265
+
266
+ '-i', videoPath,
267
+
268
+ '-ss', seg.start.toFixed(3),
269
+
270
+ '-to', seg.end.toFixed(3),
271
+
272
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
273
+
274
+ '-c:a', 'aac', '-b:a', '128k',
275
+
276
+ clipPath
277
+
278
+ ]);
279
+
280
+ clipPaths.push(clipPath);
281
+
282
+ }
283
+
284
+ const concatList = path.join(tmpDir, 'concat.txt');
285
+
286
+ const lines = clipPaths.map(p => `file '${p}'`).join('\n');
287
+
288
+ await fs.promises.writeFile(concatList, lines);
289
+
290
+ await execFileAsync('ffmpeg', [
291
+
292
+ '-y',
293
+
294
+ '-f', 'concat', '-safe', '0',
295
+
296
+ '-i', concatList,
297
+
298
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
299
+
300
+ '-c:a', 'aac', '-b:a', '128k',
301
+
302
+ outputPath
303
+
304
+ ]);
305
+
306
+ for (const cp of clipPaths) await fs.promises.unlink(cp).catch(() => {});
307
+
308
+ await fs.promises.rm(tmpDir, { recursive: true, force: true });
309
+
310
+ const { stdout: probeOrig } = await execFileAsync('ffprobe', [
311
+
312
+ '-v', 'quiet', '-print_format', 'json', '-show_format', videoPath
313
+
314
+ ]);
315
+
316
+ const { stdout: probeNew } = await execFileAsync('ffprobe', [
317
+
318
+ '-v', 'quiet', '-print_format', 'json', '-show_format', outputPath
319
+
320
+ ]);
321
+
322
+ const originalDuration = parseFloat(JSON.parse(probeOrig).format.duration);
323
+
324
+ const newDuration = parseFloat(JSON.parse(probeNew).format.duration);
325
+
326
+ return {
327
+
328
+ outputPath,
329
+
330
+ originalDuration,
331
+
332
+ newDuration,
333
+
334
+ removedSeconds: originalDuration - newDuration,
335
+
336
+ };
337
+
338
+ }
339
+
340
+ ```
341
+
342
+ ### Quick FFmpeg-only approach (no Node.js)
343
+
344
+ For a simple one-off dead space removal, you can use FFmpeg directly with a two-pass approach:
345
+
346
+ ```bash
347
+
348
+ # Step 1: Detect silence and note timestamps
349
+
350
+ ffmpeg -i input.mp4 -af "silencedetect=noise=-35dB:d=0.5" -f null - 2>&1 | grep "silence_"
351
+
352
+ # Step 2: Manually construct a trim filter from the timestamps, or use the select filter:
353
+
354
+ # This keeps only non-silent frames (audio-based)
355
+
356
+ ffmpeg -i input.mp4 \\
357
+
358
+ -af "silenceremove=stop_periods=-1:stop_duration=0.5:stop_threshold=-35dB" \\
359
+
360
+ -c:v libx264 -crf 23 -preset medium \\
361
+
362
+ output_no_silence.mp4
363
+
364
+ ```
365
+
366
+ **Note:** The `silenceremove` filter only removes silence from the audio track — the video frames during silence are NOT removed. For proper video dead space removal (where both audio and video are cut), you must use the segmented extraction approach above.
367
+
368
+ ---
369
+
370
+ ## Social Media Chunking
371
+
372
+ Break a longer video into self-contained clips of 10-60 seconds for TikTok, Reels, and Shorts.
373
+
374
+ ### Step 1: Find Natural Break Points
375
+
376
+ Combine scene detection and silence detection to find the best places to split.
377
+
378
+ ```typescript
379
+
380
+ interface BreakPoint {
381
+
382
+ time: number;
383
+
384
+ type: 'scene' | 'silence' | 'both';
385
+
386
+ strength: number;
387
+
388
+ }
389
+
390
+ async function findBreakPoints(
391
+
392
+ videoPath: string,
393
+
394
+ sceneThreshold = 0.3,
395
+
396
+ silenceThresholdDb = -35,
397
+
398
+ minSilenceDuration = 0.3
399
+
400
+ ): Promise<BreakPoint[]> {
401
+
402
+ const sceneChanges = await detectSceneChangeTimes(videoPath, sceneThreshold);
403
+
404
+ const silentIntervals = await detectSilence(videoPath, silenceThresholdDb, minSilenceDuration);
405
+
406
+ const breakPoints: BreakPoint[] = [];
407
+
408
+ for (const sceneTime of sceneChanges) {
409
+
410
+ const nearbySilence = silentIntervals.find(
411
+
412
+ s => Math.abs(s.start - sceneTime) < 1.0 || Math.abs(s.end - sceneTime) < 1.0
413
+
414
+ );
415
+
416
+ if (nearbySilence) {
417
+
418
+ breakPoints.push({
419
+
420
+ time: nearbySilence.end,
421
+
422
+ type: 'both',
423
+
424
+ strength: 1.0,
425
+
426
+ });
427
+
428
+ } else {
429
+
430
+ breakPoints.push({ time: sceneTime, type: 'scene', strength: 0.6 });
431
+
432
+ }
433
+
434
+ }
435
+
436
+ for (const silence of silentIntervals) {
437
+
438
+ const alreadyCovered = breakPoints.some(bp => Math.abs(bp.time - silence.end) < 1.0);
439
+
440
+ if (!alreadyCovered) {
441
+
442
+ breakPoints.push({
443
+
444
+ time: silence.end,
445
+
446
+ type: 'silence',
447
+
448
+ strength: 0.4 + Math.min(silence.duration / 3, 0.4),
449
+
450
+ });
451
+
452
+ }
453
+
454
+ }
455
+
456
+ breakPoints.sort((a, b) => a.time - b.time);
457
+
458
+ return breakPoints;
459
+
460
+ }
461
+
462
+ async function detectSceneChangeTimes(videoPath: string, threshold = 0.3): Promise<number[]> {
463
+
464
+ const { stderr } = await execFileAsync('ffmpeg', [
465
+
466
+ '-i', videoPath,
467
+
468
+ '-filter:v', `select='gt(scene,${threshold})',showinfo`,
469
+
470
+ '-f', 'null', '-'
471
+
472
+ ], { maxBuffer: 10 * 1024 * 1024 });
473
+
474
+ const times: number[] = [];
475
+
476
+ for (const line of stderr.split('\n')) {
477
+
478
+ const match = line.match(/pts_time:([0-9.]+)/);
479
+
480
+ if (match) {
481
+
482
+ const pts = parseFloat(match[1]);
483
+
484
+ if (pts > 0) times.push(pts);
485
+
486
+ }
487
+
488
+ }
489
+
490
+ return times;
491
+
492
+ }
493
+
494
+ ```
495
+
496
+ ### Step 2: Build Clips from Break Points
497
+
498
+ Group segments between break points into clips targeting the desired length range.
499
+
500
+ ```typescript
501
+
502
+ interface ClipRange {
503
+
504
+ index: number;
505
+
506
+ start: number;
507
+
508
+ end: number;
509
+
510
+ duration: number;
511
+
512
+ breakType: string;
513
+
514
+ }
515
+
516
+ interface ChunkingConfig {
517
+
518
+ minClipDuration: number;
519
+
520
+ maxClipDuration: number;
521
+
522
+ idealClipDuration: number;
523
+
524
+ }
525
+
526
+ const PLATFORM_CONFIGS: Record<string, ChunkingConfig> = {
527
+
528
+ tiktok: { minClipDuration: 10, maxClipDuration: 45, idealClipDuration: 25 },
529
+
530
+ reels: { minClipDuration: 10, maxClipDuration: 30, idealClipDuration: 20 },
531
+
532
+ instagram_reels: { minClipDuration: 10, maxClipDuration: 30, idealClipDuration: 20 },
533
+
534
+ instagram_stories: { minClipDuration: 1, maxClipDuration: 60, idealClipDuration: 15 },
535
+
536
+ instagram_feed: { minClipDuration: 3, maxClipDuration: 60, idealClipDuration: 30 },
537
+
538
+ shorts: { minClipDuration: 15, maxClipDuration: 60, idealClipDuration: 40 },
539
+
540
+ youtube_shorts: { minClipDuration: 15, maxClipDuration: 60, idealClipDuration: 40 },
541
+
542
+ youtube: { minClipDuration: 30, maxClipDuration: 300, idealClipDuration: 120 },
543
+
544
+ twitter: { minClipDuration: 10, maxClipDuration: 45, idealClipDuration: 25 },
545
+
546
+ x: { minClipDuration: 10, maxClipDuration: 45, idealClipDuration: 25 },
547
+
548
+ facebook_reels: { minClipDuration: 10, maxClipDuration: 30, idealClipDuration: 20 },
549
+
550
+ facebook_feed: { minClipDuration: 15, maxClipDuration: 60, idealClipDuration: 30 },
551
+
552
+ linkedin: { minClipDuration: 10, maxClipDuration: 60, idealClipDuration: 30 },
553
+
554
+ pinterest: { minClipDuration: 6, maxClipDuration: 60, idealClipDuration: 20 },
555
+
556
+ snapchat: { minClipDuration: 5, maxClipDuration: 60, idealClipDuration: 20 },
557
+
558
+ general: { minClipDuration: 10, maxClipDuration: 60, idealClipDuration: 30 },
559
+
560
+ };
561
+
562
+ const PLATFORM_REFRAME: Record<string, { width: number; height: number; ratio: string }> = {
563
+
564
+ tiktok: { width: 1080, height: 1920, ratio: '9:16' },
565
+
566
+ reels: { width: 1080, height: 1920, ratio: '9:16' },
567
+
568
+ instagram_reels: { width: 1080, height: 1920, ratio: '9:16' },
569
+
570
+ instagram_stories: { width: 1080, height: 1920, ratio: '9:16' },
571
+
572
+ instagram_feed: { width: 1080, height: 1080, ratio: '1:1' },
573
+
574
+ shorts: { width: 1080, height: 1920, ratio: '9:16' },
575
+
576
+ youtube_shorts: { width: 1080, height: 1920, ratio: '9:16' },
577
+
578
+ youtube: { width: 1920, height: 1080, ratio: '16:9' },
579
+
580
+ twitter: { width: 1280, height: 720, ratio: '16:9' },
581
+
582
+ x: { width: 1280, height: 720, ratio: '16:9' },
583
+
584
+ facebook_reels: { width: 1080, height: 1920, ratio: '9:16' },
585
+
586
+ facebook_feed: { width: 1920, height: 1080, ratio: '16:9' },
587
+
588
+ linkedin: { width: 1920, height: 1080, ratio: '16:9' },
589
+
590
+ pinterest: { width: 1080, height: 1920, ratio: '9:16' },
591
+
592
+ snapchat: { width: 1080, height: 1920, ratio: '9:16' },
593
+
594
+ };
595
+
596
+ async function buildClips(
597
+
598
+ videoPath: string,
599
+
600
+ breakPoints: BreakPoint[],
601
+
602
+ platform: string = 'tiktok'
603
+
604
+ ): Promise<ClipRange[]> {
605
+
606
+ const config = PLATFORM_CONFIGS[platform] ?? PLATFORM_CONFIGS.general;
607
+
608
+ const { stdout } = await execFileAsync('ffprobe', [
609
+
610
+ '-v', 'quiet', '-print_format', 'json', '-show_format', videoPath
611
+
612
+ ]);
613
+
614
+ const totalDuration = parseFloat(JSON.parse(stdout).format.duration);
615
+
616
+ const allPoints = [0, ...breakPoints.map(bp => bp.time), totalDuration];
617
+
618
+ const uniquePoints = [...new Set(allPoints)].sort((a, b) => a - b);
619
+
620
+ const clips: ClipRange[] = [];
621
+
622
+ let clipStart = 0;
623
+
624
+ let clipIndex = 0;
625
+
626
+ for (let i = 1; i < uniquePoints.length; i++) {
627
+
628
+ const candidateEnd = uniquePoints[i];
629
+
630
+ const candidateDuration = candidateEnd - clipStart;
631
+
632
+ if (candidateDuration >= config.idealClipDuration) {
633
+
634
+ clips.push({
635
+
636
+ index: clipIndex++,
637
+
638
+ start: clipStart,
639
+
640
+ end: candidateEnd,
641
+
642
+ duration: candidateDuration,
643
+
644
+ breakType: breakPoints.find(bp => Math.abs(bp.time - candidateEnd) < 0.5)?.type ?? 'end',
645
+
646
+ });
647
+
648
+ clipStart = candidateEnd;
649
+
650
+ } else if (candidateDuration > config.maxClipDuration) {
651
+
652
+ const bestBreak = findBestBreakInRange(
653
+
654
+ breakPoints,
655
+
656
+ clipStart + config.minClipDuration,
657
+
658
+ clipStart + config.maxClipDuration
659
+
660
+ );
661
+
662
+ const splitPoint = bestBreak?.time ?? (clipStart + config.idealClipDuration);
663
+
664
+ clips.push({
665
+
666
+ index: clipIndex++,
667
+
668
+ start: clipStart,
669
+
670
+ end: splitPoint,
671
+
672
+ duration: splitPoint - clipStart,
673
+
674
+ breakType: bestBreak?.type ?? 'forced',
675
+
676
+ });
677
+
678
+ clipStart = splitPoint;
679
+
680
+ i--;
681
+
682
+ }
683
+
684
+ }
685
+
686
+ if (clipStart < totalDuration) {
687
+
688
+ const remainingDuration = totalDuration - clipStart;
689
+
690
+ if (remainingDuration >= config.minClipDuration) {
691
+
692
+ clips.push({
693
+
694
+ index: clipIndex++,
695
+
696
+ start: clipStart,
697
+
698
+ end: totalDuration,
699
+
700
+ duration: remainingDuration,
701
+
702
+ breakType: 'end',
703
+
704
+ });
705
+
706
+ } else if (clips.length > 0) {
707
+
708
+ const lastClip = clips[clips.length - 1];
709
+
710
+ lastClip.end = totalDuration;
711
+
712
+ lastClip.duration = totalDuration - lastClip.start;
713
+
714
+ }
715
+
716
+ }
717
+
718
+ return clips;
719
+
720
+ }
721
+
722
+ function findBestBreakInRange(
723
+
724
+ breakPoints: BreakPoint[],
725
+
726
+ rangeStart: number,
727
+
728
+ rangeEnd: number
729
+
730
+ ): BreakPoint | null {
731
+
732
+ const candidates = breakPoints.filter(bp => bp.time >= rangeStart && bp.time <= rangeEnd);
733
+
734
+ if (candidates.length === 0) return null;
735
+
736
+ return candidates.sort((a, b) => b.strength - a.strength)[0];
737
+
738
+ }
739
+
740
+ ```
741
+
742
+ ### Step 3: Export Clips
743
+
744
+ ```typescript
745
+
746
+ async function exportChunkedClips(
747
+
748
+ videoPath: string,
749
+
750
+ clips: ClipRange[],
751
+
752
+ outputDir: string
753
+
754
+ ): Promise<string[]> {
755
+
756
+ await fs.promises.mkdir(outputDir, { recursive: true });
757
+
758
+ const exportedPaths: string[] = [];
759
+
760
+ for (const clip of clips) {
761
+
762
+ const outputPath = path.join(
763
+
764
+ outputDir,
765
+
766
+ `clip_${(clip.index + 1).toString().padStart(2, '0')}_${formatTime(clip.start).replace(':', 'm')}s-${formatTime(clip.end).replace(':', 'm')}s.mp4`
767
+
768
+ );
769
+
770
+ await execFileAsync('ffmpeg', [
771
+
772
+ '-y',
773
+
774
+ '-i', videoPath,
775
+
776
+ '-ss', clip.start.toFixed(3),
777
+
778
+ '-to', clip.end.toFixed(3),
779
+
780
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
781
+
782
+ '-c:a', 'aac', '-b:a', '128k',
783
+
784
+ outputPath
785
+
786
+ ]);
787
+
788
+ exportedPaths.push(outputPath);
789
+
790
+ console.log(` Clip ${clip.index + 1}: ${formatTime(clip.start)} - ${formatTime(clip.end)} (${clip.duration.toFixed(1)}s) → ${path.basename(outputPath)}`);
791
+
792
+ }
793
+
794
+ return exportedPaths;
795
+
796
+ }
797
+
798
+ function formatTime(seconds: number): string {
799
+
800
+ const m = Math.floor(seconds / 60);
801
+
802
+ const s = Math.floor(seconds % 60);
803
+
804
+ return `${m}:${s.toString().padStart(2, '0')}`;
805
+
806
+ }
807
+
808
+ ```
809
+
810
+ ### Complete Chunking Pipeline
811
+
812
+ ```typescript
813
+
814
+ async function chunkVideoForSocialMedia(
815
+
816
+ videoPath: string,
817
+
818
+ outputDir: string,
819
+
820
+ platform: string = 'tiktok'
821
+
822
+ ): Promise<string[]> {
823
+
824
+ console.log(`Chunking ${videoPath} for ${platform}...`);
825
+
826
+ const config = PLATFORM_CONFIGS[platform] ?? PLATFORM_CONFIGS.general;
827
+
828
+ console.log(`Target clip length: ${config.minClipDuration}-${config.maxClipDuration}s (ideal: ${config.idealClipDuration}s)\n`);
829
+
830
+ console.log('Finding natural break points (scenes + silence)...');
831
+
832
+ const breakPoints = await findBreakPoints(videoPath);
833
+
834
+ console.log(`Found ${breakPoints.length} break points\n`);
835
+
836
+ console.log('Building clips...');
837
+
838
+ const clips = await buildClips(videoPath, breakPoints, platform);
839
+
840
+ console.log(`Generated ${clips.length} clips:\n`);
841
+
842
+ for (const clip of clips) {
843
+
844
+ console.log(` Clip ${clip.index + 1}: ${formatTime(clip.start)}-${formatTime(clip.end)} (${clip.duration.toFixed(1)}s, break: ${clip.breakType})`);
845
+
846
+ }
847
+
848
+ console.log('\nExporting clips...');
849
+
850
+ const paths = await exportChunkedClips(videoPath, clips, outputDir);
851
+
852
+ console.log(`\nDone! ${paths.length} clips exported to ${outputDir}/`);
853
+
854
+ return paths;
855
+
856
+ }
857
+
858
+ ```
859
+
860
+ ---
861
+
862
+ ## Combined Pipeline
863
+
864
+ For the full workflow of taking a raw long-form video and producing polished social clips.
865
+
866
+ **IMPORTANT:** When a user specifies a platform, reframing is NOT optional — the output must be in the platform's native format. TikTok/Reels = 9:16 (1080x1920), YouTube = 16:9 (1920x1080), Instagram Feed = 1:1 (1080x1080). Never deliver landscape clips when the user asked for TikTok content.
867
+
868
+ ```typescript
869
+
870
+ async function fullSocialMediaPipeline(
871
+
872
+ videoPath: string,
873
+
874
+ outputDir: string,
875
+
876
+ options: {
877
+
878
+ platform?: string;
879
+
880
+ removeDeadSpace?: boolean;
881
+
882
+ deadSpacePreset?: SilencePreset;
883
+
884
+ scoreWithAI?: boolean;
885
+
886
+ } = {}
887
+
888
+ ) {
889
+
890
+ const {
891
+
892
+ platform = 'tiktok',
893
+
894
+ removeDeadSpace: shouldRemoveDeadSpace = true,
895
+
896
+ deadSpacePreset = 'medium',
897
+
898
+ scoreWithAI = false,
899
+
900
+ } = options;
901
+
902
+ let workingPath = videoPath;
903
+
904
+ if (shouldRemoveDeadSpace) {
905
+
906
+ console.log('=== Step 1: Removing dead space ===\n');
907
+
908
+ const tightPath = path.join(outputDir, 'tightened.mp4');
909
+
910
+ const result = await removeDeadSpace(workingPath, tightPath, deadSpacePreset);
911
+
912
+ console.log(`Removed ${result.removedSeconds.toFixed(1)}s of dead space (${result.originalDuration.toFixed(1)}s → ${result.newDuration.toFixed(1)}s)\n`);
913
+
914
+ workingPath = tightPath;
915
+
916
+ }
917
+
918
+ console.log('=== Step 2: Chunking into clips ===\n');
919
+
920
+ const clipPaths = await chunkVideoForSocialMedia(workingPath, path.join(outputDir, 'clips'), platform);
921
+
922
+ if (scoreWithAI) {
923
+
924
+ console.log('\n=== Step 3: AI Virality Scoring (clip-level) ===\n');
925
+
926
+ // Score each exported clip using the clip-level prompt (Mode 2)
927
+
928
+ // This uses CLIP_SCORING_PROMPT which evaluates narrative arc,
929
+
930
+ // hook-to-payoff, and standalone quality — not just visual moments.
931
+
932
+ // See virality-scoring.md for the full scoring pipeline.
933
+
934
+ //
935
+
936
+ // Key differences from segment scoring:
937
+
938
+ // - Extracts 5-8 frames per clip (not 3) including first and last frame
939
+
940
+ // - Uses CLIP_SCORING_PROMPT which adds narrativeCompleteness,
941
+
942
+ // hookStrength, and standaloneQuality factors
943
+
944
+ // - Returns postingRecommendation: 'post as-is', 'post with minor edits', or 'consider skipping'
945
+
946
+ //
947
+
948
+ // Import and use:
949
+
950
+ // import { extractFrames, analyzeSegment, getScoringPrompt } from virality pipeline
951
+
952
+ // Score each clip file, rank by overallScore, present ranked results to user
953
+
954
+ console.log('Scoring clips with AI (clip-level prompt — evaluates narrative arc, hook, and standalone quality)...');
955
+
956
+ }
957
+
958
+ // Step 4: Reframe ALL clips for the target platform
959
+
960
+ // This is NOT optional when a platform is specified — users expect platform-ready output.
961
+
962
+ // See operations.md "Social Media Reframing" section for FFmpeg commands.
963
+
964
+ // Preferred strategy: blurred fill for landscape→portrait (looks polished).
965
+
966
+ // Alternative: center crop if the subject is center-framed throughout.
967
+
968
+ console.log('\n=== Step 4: Reframing clips for platform ===\n');
969
+
970
+ const reframeSpec = PLATFORM_REFRAME[platform];
971
+
972
+ if (reframeSpec) {
973
+
974
+ const reframedDir = path.join(outputDir, 'reframed');
975
+
976
+ await fs.promises.mkdir(reframedDir, { recursive: true });
977
+
978
+ const { width, height, ratio } = reframeSpec;
979
+
980
+ console.log(`Reframing all clips to ${ratio} (${width}×${height}) for ${platform}...`);
981
+
982
+ // Use blurred fill strategy (Strategy 3 from operations.md) for each clip
983
+
984
+ // See operations.md for the exact FFmpeg filter_complex commands
985
+
986
+ for (const clipPath of clipPaths) {
987
+
988
+ const outName = path.basename(clipPath, '.mp4') + `_${platform}.mp4`;
989
+
990
+ const outPath = path.join(reframedDir, outName);
991
+
992
+ await execFileAsync('ffmpeg', [
993
+
994
+ '-y', '-i', clipPath,
995
+
996
+ '-filter_complex',
997
+
998
+ `[0:v]scale=${width}:${height}:force_original_aspect_ratio=increase,crop=${width}:${height},gblur=sigma=50[bg];` +
999
+
1000
+ `[0:v]scale=${width}:${height}:force_original_aspect_ratio=decrease[fg];` +
1001
+
1002
+ `[bg][fg]overlay=(W-w)/2:(H-h)/2[outv]`,
1003
+
1004
+ '-map', '[outv]', '-map', '0:a?',
1005
+
1006
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
1007
+
1008
+ '-c:a', 'aac', '-b:a', '128k',
1009
+
1010
+ outPath
1011
+
1012
+ ]);
1013
+
1014
+ console.log(` ${path.basename(clipPath)} → ${outName}`);
1015
+
1016
+ }
1017
+
1018
+ } else {
1019
+
1020
+ console.log(`No reframing needed for platform: ${platform}`);
1021
+
1022
+ }
1023
+
1024
+ return clipPaths;
1025
+
1026
+ }
1027
+
1028
+ ```
1029
+
1030
+ ### Example Usage
1031
+
1032
+ ```typescript
1033
+
1034
+ await fullSocialMediaPipeline('raw_video.mp4', 'output/social', {
1035
+
1036
+ platform: 'tiktok',
1037
+
1038
+ removeDeadSpace: true,
1039
+
1040
+ deadSpacePreset: 'medium',
1041
+
1042
+ scoreWithAI: true,
1043
+
1044
+ });
1045
+
1046
+ ```
1047
+
1048
+ This produces:
1049
+
1050
+ 1. `output/social/tightened.mp4` — the video with dead space removed
1051
+ 2. `output/social/clips/clip_01_...mp4` through `clip_N_...mp4` — individual clips chunked to platform duration targets
1052
+
1053
+ 3. `output/social/reframed/clip_01_tiktok.mp4` — each clip reframed to 9:16 vertical (1080x1920) for TikTok
1054
+ 4. Each clip scored with clip-level AI analysis (narrative arc, hook strength, standalone quality)
1055
+
1056
+ 5. Clips ranked with posting recommendations ('post as-is', 'post with minor edits', 'consider skipping')
1057
+ 6. The reframed clips are the final deliverables — always present these to the user, not the intermediate landscape clips
1058
+
1059
+ ### Why clip-level scoring matters
1060
+
1061
+ The original segment-level scoring (Mode 1) evaluates tiny 2-10 second fragments on visual dynamism and emotional moments. This is useful for finding highlights, but it doesn't tell you whether a 30-second clip will actually perform well on social media.
1062
+
1063
+ Clip-level scoring (Mode 2) evaluates the full clip as a piece of content that will be posted. It checks:
1064
+
1065
+ - Does the clip **open strong** (hook evaluation on the first frame)?
1066
+ - Does it **tell a complete story** in 15-45 seconds?
1067
+
1068
+ - Would it **make sense without context** from the full video?
1069
+ - Does the ending **satisfy or intrigue** the viewer?
1070
+
1071
+ A clip can have great individual moments but still fail as a social post if it starts slow, ends mid-sentence, or requires context the viewer doesn't have. Clip-level scoring catches these issues.
1072
+
1073
+ ## Key Implementation Notes
1074
+
1075
+ - **`silenceremove` vs segmented approach:** FFmpeg's `silenceremove` filter only strips silence from the audio — it does NOT cut the corresponding video frames. For proper dead space removal where both audio and video are cut, always use the segmented extract-and-concatenate approach.
1076
+ - **Padding around speaking segments:** Always add 0.05-0.15s padding around each speaking segment. Without padding, words get clipped at the start/end.
1077
+
1078
+ - **Break point priority:** When building clips, prefer to split at points that are both a scene change AND a silence gap (strength 1.0). Pure scene changes (0.6) are better than pure silence (0.4), because visual continuity matters more than audio gaps.
1079
+ - **Short remainders:** If the last clip would be under `minClipDuration`, merge it into the previous clip rather than exporting a too-short orphan.
1080
+
1081
+ - **Re-encoding:** Each extract-and-concat pass re-encodes the video. For the combined pipeline (dead space removal + chunking), consider running dead space removal first to produce one clean file, then chunking that — this minimizes total re-encodes to 2 passes instead of more.