bps-kit 1.0.1 → 1.0.2

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 (368) hide show
  1. package/package.json +1 -1
  2. package/templates/.agents/agents/backend-specialist.md +263 -0
  3. package/templates/.agents/agents/code-archaeologist.md +106 -0
  4. package/templates/.agents/agents/database-architect.md +226 -0
  5. package/templates/.agents/agents/debugger.md +225 -0
  6. package/templates/.agents/agents/devops-engineer.md +242 -0
  7. package/templates/.agents/agents/documentation-writer.md +104 -0
  8. package/templates/.agents/agents/explorer-agent.md +73 -0
  9. package/templates/.agents/agents/frontend-specialist.md +593 -0
  10. package/templates/.agents/agents/game-developer.md +162 -0
  11. package/templates/.agents/agents/mobile-developer.md +377 -0
  12. package/templates/.agents/agents/orchestrator.md +416 -0
  13. package/templates/.agents/agents/penetration-tester.md +188 -0
  14. package/templates/.agents/agents/performance-optimizer.md +187 -0
  15. package/templates/.agents/agents/product-manager.md +112 -0
  16. package/templates/.agents/agents/product-owner.md +95 -0
  17. package/templates/.agents/agents/project-planner.md +406 -0
  18. package/templates/.agents/agents/qa-automation-engineer.md +103 -0
  19. package/templates/.agents/agents/security-auditor.md +170 -0
  20. package/templates/.agents/agents/seo-specialist.md +111 -0
  21. package/templates/.agents/agents/test-engineer.md +158 -0
  22. package/templates/.agents/rules/GEMINI.md +219 -0
  23. package/templates/.agents/scripts/auto_preview.py +148 -0
  24. package/templates/.agents/scripts/checklist.py +217 -0
  25. package/templates/.agents/scripts/session_manager.py +120 -0
  26. package/templates/.agents/scripts/verify_all.py +327 -0
  27. package/templates/.agents/workflows/brainstorm.md +113 -0
  28. package/templates/.agents/workflows/create.md +59 -0
  29. package/templates/.agents/workflows/debug.md +103 -0
  30. package/templates/.agents/workflows/deploy.md +176 -0
  31. package/templates/.agents/workflows/enhance.md +63 -0
  32. package/templates/.agents/workflows/orchestrate.md +237 -0
  33. package/templates/.agents/workflows/plan.md +89 -0
  34. package/templates/.agents/workflows/preview.md +81 -0
  35. package/templates/.agents/workflows/setup-brain.md +39 -0
  36. package/templates/.agents/workflows/status.md +86 -0
  37. package/templates/.agents/workflows/test.md +144 -0
  38. package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
  39. package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
  40. package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
  41. package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
  42. package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
  43. package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
  44. package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
  45. package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
  46. package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
  47. package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
  48. package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
  49. package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
  50. package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
  51. package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
  52. package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
  53. package/templates/vault/007/scripts/config.py +472 -0
  54. package/templates/vault/007/scripts/full_audit.py +1306 -0
  55. package/templates/vault/007/scripts/quick_scan.py +481 -0
  56. package/templates/vault/007/scripts/requirements.txt +26 -0
  57. package/templates/vault/007/scripts/scanners/__init__.py +0 -0
  58. package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
  59. package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
  60. package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
  61. package/templates/vault/007/scripts/score_calculator.py +693 -0
  62. package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
  63. package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
  64. package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
  65. package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
  66. package/templates/vault/ai-studio-image/scripts/config.py +613 -0
  67. package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
  68. package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
  69. package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
  70. package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
  71. package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
  72. package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
  73. package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
  74. package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
  75. package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
  76. package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
  77. package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
  78. package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
  79. package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
  80. package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
  81. package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
  82. package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
  83. package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
  84. package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
  85. package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
  86. package/templates/vault/claude-monitor/scripts/config.py +69 -0
  87. package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
  88. package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
  89. package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
  90. package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
  91. package/templates/vault/context-agent/scripts/active_context.py +227 -0
  92. package/templates/vault/context-agent/scripts/compressor.py +149 -0
  93. package/templates/vault/context-agent/scripts/config.py +69 -0
  94. package/templates/vault/context-agent/scripts/context_loader.py +155 -0
  95. package/templates/vault/context-agent/scripts/context_manager.py +302 -0
  96. package/templates/vault/context-agent/scripts/models.py +103 -0
  97. package/templates/vault/context-agent/scripts/project_registry.py +132 -0
  98. package/templates/vault/context-agent/scripts/requirements.txt +6 -0
  99. package/templates/vault/context-agent/scripts/search.py +115 -0
  100. package/templates/vault/context-agent/scripts/session_parser.py +206 -0
  101. package/templates/vault/context-agent/scripts/session_summary.py +319 -0
  102. package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
  103. package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
  104. package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
  105. package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
  106. package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
  107. package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
  108. package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
  109. package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
  110. package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
  111. package/templates/vault/docx/scripts/__init__.py +1 -0
  112. package/templates/vault/docx/scripts/document.py +1276 -0
  113. package/templates/vault/docx/scripts/templates/comments.xml +3 -0
  114. package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
  115. package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
  116. package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
  117. package/templates/vault/docx/scripts/templates/people.xml +3 -0
  118. package/templates/vault/docx/scripts/utilities.py +374 -0
  119. package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
  120. package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
  121. package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
  122. package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
  123. package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
  124. package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
  125. package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
  126. package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
  127. package/templates/vault/docx-official/scripts/__init__.py +1 -0
  128. package/templates/vault/docx-official/scripts/document.py +1276 -0
  129. package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
  130. package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
  131. package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
  132. package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
  133. package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
  134. package/templates/vault/docx-official/scripts/utilities.py +374 -0
  135. package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
  137. package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/vault/instagram/scripts/account_setup.py +233 -0
  139. package/templates/vault/instagram/scripts/analyze.py +221 -0
  140. package/templates/vault/instagram/scripts/api_client.py +444 -0
  141. package/templates/vault/instagram/scripts/auth.py +411 -0
  142. package/templates/vault/instagram/scripts/comments.py +160 -0
  143. package/templates/vault/instagram/scripts/config.py +111 -0
  144. package/templates/vault/instagram/scripts/db.py +467 -0
  145. package/templates/vault/instagram/scripts/export.py +138 -0
  146. package/templates/vault/instagram/scripts/governance.py +233 -0
  147. package/templates/vault/instagram/scripts/hashtags.py +114 -0
  148. package/templates/vault/instagram/scripts/insights.py +170 -0
  149. package/templates/vault/instagram/scripts/media.py +65 -0
  150. package/templates/vault/instagram/scripts/messages.py +103 -0
  151. package/templates/vault/instagram/scripts/profile.py +58 -0
  152. package/templates/vault/instagram/scripts/publish.py +449 -0
  153. package/templates/vault/instagram/scripts/requirements.txt +5 -0
  154. package/templates/vault/instagram/scripts/run_all.py +189 -0
  155. package/templates/vault/instagram/scripts/schedule.py +189 -0
  156. package/templates/vault/instagram/scripts/serve_api.py +234 -0
  157. package/templates/vault/instagram/scripts/templates.py +155 -0
  158. package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
  159. package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
  160. package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
  161. package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
  162. package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
  163. package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
  164. package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
  165. package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
  166. package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
  167. package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
  168. package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
  169. package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
  170. package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
  171. package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
  172. package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
  173. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
  174. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
  175. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
  176. package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
  177. package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
  178. package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
  179. package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
  180. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
  181. package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
  182. package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
  183. package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
  184. package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
  185. package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
  186. package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
  187. package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
  188. package/templates/vault/last30days/scripts/last30days.py +521 -0
  189. package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
  190. package/templates/vault/last30days/scripts/lib/cache.py +152 -0
  191. package/templates/vault/last30days/scripts/lib/dates.py +124 -0
  192. package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
  193. package/templates/vault/last30days/scripts/lib/env.py +149 -0
  194. package/templates/vault/last30days/scripts/lib/http.py +152 -0
  195. package/templates/vault/last30days/scripts/lib/models.py +175 -0
  196. package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
  197. package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
  198. package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
  199. package/templates/vault/last30days/scripts/lib/render.py +383 -0
  200. package/templates/vault/last30days/scripts/lib/schema.py +336 -0
  201. package/templates/vault/last30days/scripts/lib/score.py +311 -0
  202. package/templates/vault/last30days/scripts/lib/ui.py +324 -0
  203. package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
  204. package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
  205. package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
  206. package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
  207. package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
  208. package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
  209. package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
  210. package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
  211. package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
  212. package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
  213. package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
  214. package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
  215. package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
  216. package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
  217. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
  218. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
  219. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
  220. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
  221. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
  222. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
  223. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
  224. package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
  225. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
  226. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
  227. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
  228. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
  229. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
  230. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
  231. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
  232. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
  233. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
  234. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
  235. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
  236. package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
  237. package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
  238. package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
  239. package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
  240. package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
  241. package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
  242. package/templates/vault/mcp-builder/scripts/connections.py +151 -0
  243. package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
  244. package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
  245. package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
  246. package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
  247. package/templates/vault/notebooklm/scripts/__init__.py +81 -0
  248. package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
  249. package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
  250. package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
  251. package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
  252. package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
  253. package/templates/vault/notebooklm/scripts/config.py +44 -0
  254. package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
  255. package/templates/vault/notebooklm/scripts/run.py +102 -0
  256. package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
  257. package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
  258. package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
  259. package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
  260. package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
  261. package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
  262. package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
  263. package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
  264. package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  265. package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
  266. package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
  267. package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
  268. package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
  269. package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
  270. package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
  271. package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
  272. package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
  273. package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
  274. package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
  275. package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
  276. package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
  277. package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
  278. package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
  279. package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
  280. package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
  281. package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
  282. package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
  283. package/templates/vault/pptx/scripts/html2pptx.js +979 -0
  284. package/templates/vault/pptx/scripts/inventory.py +1020 -0
  285. package/templates/vault/pptx/scripts/rearrange.py +231 -0
  286. package/templates/vault/pptx/scripts/replace.py +385 -0
  287. package/templates/vault/pptx/scripts/thumbnail.py +450 -0
  288. package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
  289. package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
  290. package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
  291. package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
  292. package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
  293. package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
  294. package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
  295. package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
  296. package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
  297. package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
  298. package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
  299. package/templates/vault/pptx-official/scripts/replace.py +385 -0
  300. package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
  301. package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
  302. package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
  303. package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  304. package/templates/vault/scripts/.skill_cache.json +7538 -0
  305. package/templates/vault/scripts/skill_search.py +228 -0
  306. package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
  307. package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
  308. package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
  309. package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
  310. package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
  311. package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
  312. package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
  313. package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
  314. package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
  315. package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
  316. package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
  317. package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
  318. package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
  319. package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
  320. package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
  321. package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
  322. package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
  323. package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
  324. package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
  325. package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
  326. package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
  327. package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
  328. package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
  329. package/templates/vault/skill-sentinel/scripts/config.py +158 -0
  330. package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
  331. package/templates/vault/skill-sentinel/scripts/db.py +354 -0
  332. package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
  333. package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
  334. package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
  335. package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
  336. package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
  337. package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
  338. package/templates/vault/stability-ai/scripts/config.py +266 -0
  339. package/templates/vault/stability-ai/scripts/generate.py +687 -0
  340. package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
  341. package/templates/vault/stability-ai/scripts/styles.py +174 -0
  342. package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
  343. package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
  344. package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
  345. package/templates/vault/telegram/scripts/send_message.py +143 -0
  346. package/templates/vault/telegram/scripts/setup_project.py +103 -0
  347. package/templates/vault/telegram/scripts/test_bot.py +144 -0
  348. package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
  349. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  350. package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  351. package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
  352. package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
  353. package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
  354. package/templates/vault/videodb/scripts/ws_listener.py +204 -0
  355. package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  357. package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
  359. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
  360. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
  361. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
  362. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
  363. package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
  364. package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
  365. package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
  366. package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
  367. package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
  368. package/templates/vault/youtube-summarizer/scripts/install-dependencies.sh +28 -0
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ WebSocket event listener for VideoDB with auto-reconnect and graceful shutdown.
4
+
5
+ Usage:
6
+ python scripts/ws_listener.py [OPTIONS] [output_dir]
7
+
8
+ Arguments:
9
+ output_dir Directory for output files (default: /tmp or VIDEODB_EVENTS_DIR env var)
10
+
11
+ Options:
12
+ --clear Clear the events file before starting (use when starting a new session)
13
+
14
+ Output files:
15
+ <output_dir>/videodb_events.jsonl - All WebSocket events (JSONL format)
16
+ <output_dir>/videodb_ws_id - WebSocket connection ID
17
+ <output_dir>/videodb_ws_pid - Process ID for easy termination
18
+
19
+ Output (first line, for parsing):
20
+ WS_ID=<connection_id>
21
+
22
+ Examples:
23
+ python scripts/ws_listener.py & # Run in background
24
+ python scripts/ws_listener.py --clear # Clear events and start fresh
25
+ python scripts/ws_listener.py --clear /tmp/mydir # Custom dir with clear
26
+ kill $(cat /tmp/videodb_ws_pid) # Stop the listener
27
+ """
28
+ import os
29
+ import sys
30
+ import json
31
+ import signal
32
+ import asyncio
33
+ from datetime import datetime, timezone
34
+ from pathlib import Path
35
+
36
+ from dotenv import load_dotenv
37
+ load_dotenv()
38
+
39
+ import videodb
40
+
41
+ # Retry config
42
+ MAX_RETRIES = 10
43
+ INITIAL_BACKOFF = 1 # seconds
44
+ MAX_BACKOFF = 60 # seconds
45
+
46
+ # Parse arguments
47
+ def parse_args():
48
+ clear = False
49
+ output_dir = None
50
+
51
+ args = sys.argv[1:]
52
+ for arg in args:
53
+ if arg == "--clear":
54
+ clear = True
55
+ elif not arg.startswith("-"):
56
+ output_dir = arg
57
+
58
+ if output_dir is None:
59
+ output_dir = os.environ.get("VIDEODB_EVENTS_DIR", "/tmp")
60
+
61
+ return clear, Path(output_dir)
62
+
63
+ CLEAR_EVENTS, OUTPUT_DIR = parse_args()
64
+ EVENTS_FILE = OUTPUT_DIR / "videodb_events.jsonl"
65
+ WS_ID_FILE = OUTPUT_DIR / "videodb_ws_id"
66
+ PID_FILE = OUTPUT_DIR / "videodb_ws_pid"
67
+
68
+ # Track if this is the first connection (for clearing events)
69
+ _first_connection = True
70
+
71
+
72
+ def log(msg: str):
73
+ """Log with timestamp."""
74
+ ts = datetime.now().strftime("%H:%M:%S")
75
+ print(f"[{ts}] {msg}", flush=True)
76
+
77
+
78
+ def append_event(event: dict):
79
+ """Append event to JSONL file with timestamps."""
80
+ event["ts"] = datetime.now(timezone.utc).isoformat()
81
+ event["unix_ts"] = datetime.now(timezone.utc).timestamp()
82
+ with open(EVENTS_FILE, "a") as f:
83
+ f.write(json.dumps(event) + "\n")
84
+
85
+
86
+ def write_pid():
87
+ """Write PID file for easy process management."""
88
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
89
+ PID_FILE.write_text(str(os.getpid()))
90
+
91
+
92
+ def cleanup_pid():
93
+ """Remove PID file on exit."""
94
+ try:
95
+ PID_FILE.unlink(missing_ok=True)
96
+ except Exception:
97
+ pass
98
+
99
+
100
+ async def listen_with_retry():
101
+ """Main listen loop with auto-reconnect and exponential backoff."""
102
+ global _first_connection
103
+
104
+ retry_count = 0
105
+ backoff = INITIAL_BACKOFF
106
+
107
+ while retry_count < MAX_RETRIES:
108
+ try:
109
+ conn = videodb.connect()
110
+ ws_wrapper = conn.connect_websocket()
111
+ ws = await ws_wrapper.connect()
112
+ ws_id = ws.connection_id
113
+
114
+ # Ensure output directory exists
115
+ OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
116
+
117
+ # Clear events file only on first connection if --clear flag is set
118
+ if _first_connection and CLEAR_EVENTS:
119
+ EVENTS_FILE.unlink(missing_ok=True)
120
+ log("Cleared events file")
121
+ _first_connection = False
122
+
123
+ # Write ws_id to file for easy retrieval
124
+ WS_ID_FILE.write_text(ws_id)
125
+
126
+ # Print ws_id (parseable format for LLM)
127
+ if retry_count == 0:
128
+ print(f"WS_ID={ws_id}", flush=True)
129
+ log(f"Connected (ws_id={ws_id})")
130
+
131
+ # Reset retry state on successful connection
132
+ retry_count = 0
133
+ backoff = INITIAL_BACKOFF
134
+
135
+ # Listen for messages
136
+ async for msg in ws.receive():
137
+ append_event(msg)
138
+ channel = msg.get("channel", msg.get("event", "unknown"))
139
+ text = msg.get("data", {}).get("text", "")
140
+ if text:
141
+ print(f"[{channel}] {text[:80]}", flush=True)
142
+
143
+ # If we exit the loop normally, connection was closed
144
+ log("Connection closed by server")
145
+
146
+ except asyncio.CancelledError:
147
+ log("Shutdown requested")
148
+ raise
149
+ except Exception as e:
150
+ retry_count += 1
151
+ log(f"Connection error: {e}")
152
+
153
+ if retry_count >= MAX_RETRIES:
154
+ log(f"Max retries ({MAX_RETRIES}) exceeded, exiting")
155
+ break
156
+
157
+ log(f"Reconnecting in {backoff}s (attempt {retry_count}/{MAX_RETRIES})...")
158
+ await asyncio.sleep(backoff)
159
+ backoff = min(backoff * 2, MAX_BACKOFF)
160
+
161
+
162
+ async def main_async():
163
+ """Async main with signal handling."""
164
+ loop = asyncio.get_running_loop()
165
+ shutdown_event = asyncio.Event()
166
+
167
+ def handle_signal():
168
+ log("Received shutdown signal")
169
+ shutdown_event.set()
170
+
171
+ # Register signal handlers
172
+ for sig in (signal.SIGINT, signal.SIGTERM):
173
+ loop.add_signal_handler(sig, handle_signal)
174
+
175
+ # Run listener with cancellation support
176
+ listen_task = asyncio.create_task(listen_with_retry())
177
+ shutdown_task = asyncio.create_task(shutdown_event.wait())
178
+
179
+ done, pending = await asyncio.wait(
180
+ [listen_task, shutdown_task],
181
+ return_when=asyncio.FIRST_COMPLETED,
182
+ )
183
+
184
+ # Cancel remaining tasks
185
+ for task in pending:
186
+ task.cancel()
187
+ try:
188
+ await task
189
+ except asyncio.CancelledError:
190
+ pass
191
+
192
+ log("Shutdown complete")
193
+
194
+
195
+ def main():
196
+ write_pid()
197
+ try:
198
+ asyncio.run(main_async())
199
+ finally:
200
+ cleanup_pid()
201
+
202
+
203
+ if __name__ == "__main__":
204
+ main()
@@ -0,0 +1,54 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ echo "📦 Bundling React app to single HTML artifact..."
5
+
6
+ # Check if we're in a project directory
7
+ if [ ! -f "package.json" ]; then
8
+ echo "❌ Error: No package.json found. Run this script from your project root."
9
+ exit 1
10
+ fi
11
+
12
+ # Check if index.html exists
13
+ if [ ! -f "index.html" ]; then
14
+ echo "❌ Error: No index.html found in project root."
15
+ echo " This script requires an index.html entry point."
16
+ exit 1
17
+ fi
18
+
19
+ # Install bundling dependencies
20
+ echo "📦 Installing bundling dependencies..."
21
+ pnpm add -D parcel @parcel/config-default parcel-resolver-tspaths html-inline
22
+
23
+ # Create Parcel config with tspaths resolver
24
+ if [ ! -f ".parcelrc" ]; then
25
+ echo "🔧 Creating Parcel configuration with path alias support..."
26
+ cat > .parcelrc << 'EOF'
27
+ {
28
+ "extends": "@parcel/config-default",
29
+ "resolvers": ["parcel-resolver-tspaths", "..."]
30
+ }
31
+ EOF
32
+ fi
33
+
34
+ # Clean previous build
35
+ echo "🧹 Cleaning previous build..."
36
+ rm -rf dist bundle.html
37
+
38
+ # Build with Parcel
39
+ echo "🔨 Building with Parcel..."
40
+ pnpm exec parcel build index.html --dist-dir dist --no-source-maps
41
+
42
+ # Inline everything into single HTML
43
+ echo "🎯 Inlining all assets into single HTML file..."
44
+ pnpm exec html-inline dist/index.html > bundle.html
45
+
46
+ # Get file size
47
+ FILE_SIZE=$(du -h bundle.html | cut -f1)
48
+
49
+ echo ""
50
+ echo "✅ Bundle complete!"
51
+ echo "📄 Output: bundle.html ($FILE_SIZE)"
52
+ echo ""
53
+ echo "You can now use this single HTML file as an artifact in Claude conversations."
54
+ echo "To test locally: open bundle.html in your browser"
@@ -0,0 +1,322 @@
1
+ #!/bin/bash
2
+
3
+ # Exit on error
4
+ set -e
5
+
6
+ # Detect Node version
7
+ NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
8
+
9
+ echo "🔍 Detected Node.js version: $NODE_VERSION"
10
+
11
+ if [ "$NODE_VERSION" -lt 18 ]; then
12
+ echo "❌ Error: Node.js 18 or higher is required"
13
+ echo " Current version: $(node -v)"
14
+ exit 1
15
+ fi
16
+
17
+ # Set Vite version based on Node version
18
+ if [ "$NODE_VERSION" -ge 20 ]; then
19
+ VITE_VERSION="latest"
20
+ echo "✅ Using Vite latest (Node 20+)"
21
+ else
22
+ VITE_VERSION="5.4.11"
23
+ echo "✅ Using Vite $VITE_VERSION (Node 18 compatible)"
24
+ fi
25
+
26
+ # Detect OS and set sed syntax
27
+ if [[ "$OSTYPE" == "darwin"* ]]; then
28
+ SED_INPLACE="sed -i ''"
29
+ else
30
+ SED_INPLACE="sed -i"
31
+ fi
32
+
33
+ # Check if pnpm is installed
34
+ if ! command -v pnpm &> /dev/null; then
35
+ echo "📦 pnpm not found. Installing pnpm..."
36
+ npm install -g pnpm
37
+ fi
38
+
39
+ # Check if project name is provided
40
+ if [ -z "$1" ]; then
41
+ echo "❌ Usage: ./create-react-shadcn-complete.sh <project-name>"
42
+ exit 1
43
+ fi
44
+
45
+ PROJECT_NAME="$1"
46
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
47
+ COMPONENTS_TARBALL="$SCRIPT_DIR/shadcn-components.tar.gz"
48
+
49
+ # Check if components tarball exists
50
+ if [ ! -f "$COMPONENTS_TARBALL" ]; then
51
+ echo "❌ Error: shadcn-components.tar.gz not found in script directory"
52
+ echo " Expected location: $COMPONENTS_TARBALL"
53
+ exit 1
54
+ fi
55
+
56
+ echo "🚀 Creating new React + Vite project: $PROJECT_NAME"
57
+
58
+ # Create new Vite project (always use latest create-vite, pin vite version later)
59
+ pnpm create vite "$PROJECT_NAME" --template react-ts
60
+
61
+ # Navigate into project directory
62
+ cd "$PROJECT_NAME"
63
+
64
+ echo "🧹 Cleaning up Vite template..."
65
+ $SED_INPLACE '/<link rel="icon".*vite\.svg/d' index.html
66
+ $SED_INPLACE 's/<title>.*<\/title>/<title>'"$PROJECT_NAME"'<\/title>/' index.html
67
+
68
+ echo "📦 Installing base dependencies..."
69
+ pnpm install
70
+
71
+ # Pin Vite version for Node 18
72
+ if [ "$NODE_VERSION" -lt 20 ]; then
73
+ echo "📌 Pinning Vite to $VITE_VERSION for Node 18 compatibility..."
74
+ pnpm add -D vite@$VITE_VERSION
75
+ fi
76
+
77
+ echo "📦 Installing Tailwind CSS and dependencies..."
78
+ pnpm install -D tailwindcss@3.4.1 postcss autoprefixer @types/node tailwindcss-animate
79
+ pnpm install class-variance-authority clsx tailwind-merge lucide-react next-themes
80
+
81
+ echo "⚙️ Creating Tailwind and PostCSS configuration..."
82
+ cat > postcss.config.js << 'EOF'
83
+ export default {
84
+ plugins: {
85
+ tailwindcss: {},
86
+ autoprefixer: {},
87
+ },
88
+ }
89
+ EOF
90
+
91
+ echo "📝 Configuring Tailwind with shadcn theme..."
92
+ cat > tailwind.config.js << 'EOF'
93
+ /** @type {import('tailwindcss').Config} */
94
+ module.exports = {
95
+ darkMode: ["class"],
96
+ content: [
97
+ "./index.html",
98
+ "./src/**/*.{js,ts,jsx,tsx}",
99
+ ],
100
+ theme: {
101
+ extend: {
102
+ colors: {
103
+ border: "hsl(var(--border))",
104
+ input: "hsl(var(--input))",
105
+ ring: "hsl(var(--ring))",
106
+ background: "hsl(var(--background))",
107
+ foreground: "hsl(var(--foreground))",
108
+ primary: {
109
+ DEFAULT: "hsl(var(--primary))",
110
+ foreground: "hsl(var(--primary-foreground))",
111
+ },
112
+ secondary: {
113
+ DEFAULT: "hsl(var(--secondary))",
114
+ foreground: "hsl(var(--secondary-foreground))",
115
+ },
116
+ destructive: {
117
+ DEFAULT: "hsl(var(--destructive))",
118
+ foreground: "hsl(var(--destructive-foreground))",
119
+ },
120
+ muted: {
121
+ DEFAULT: "hsl(var(--muted))",
122
+ foreground: "hsl(var(--muted-foreground))",
123
+ },
124
+ accent: {
125
+ DEFAULT: "hsl(var(--accent))",
126
+ foreground: "hsl(var(--accent-foreground))",
127
+ },
128
+ popover: {
129
+ DEFAULT: "hsl(var(--popover))",
130
+ foreground: "hsl(var(--popover-foreground))",
131
+ },
132
+ card: {
133
+ DEFAULT: "hsl(var(--card))",
134
+ foreground: "hsl(var(--card-foreground))",
135
+ },
136
+ },
137
+ borderRadius: {
138
+ lg: "var(--radius)",
139
+ md: "calc(var(--radius) - 2px)",
140
+ sm: "calc(var(--radius) - 4px)",
141
+ },
142
+ keyframes: {
143
+ "accordion-down": {
144
+ from: { height: "0" },
145
+ to: { height: "var(--radix-accordion-content-height)" },
146
+ },
147
+ "accordion-up": {
148
+ from: { height: "var(--radix-accordion-content-height)" },
149
+ to: { height: "0" },
150
+ },
151
+ },
152
+ animation: {
153
+ "accordion-down": "accordion-down 0.2s ease-out",
154
+ "accordion-up": "accordion-up 0.2s ease-out",
155
+ },
156
+ },
157
+ },
158
+ plugins: [require("tailwindcss-animate")],
159
+ }
160
+ EOF
161
+
162
+ # Add Tailwind directives and CSS variables to index.css
163
+ echo "🎨 Adding Tailwind directives and CSS variables..."
164
+ cat > src/index.css << 'EOF'
165
+ @tailwind base;
166
+ @tailwind components;
167
+ @tailwind utilities;
168
+
169
+ @layer base {
170
+ :root {
171
+ --background: 0 0% 100%;
172
+ --foreground: 0 0% 3.9%;
173
+ --card: 0 0% 100%;
174
+ --card-foreground: 0 0% 3.9%;
175
+ --popover: 0 0% 100%;
176
+ --popover-foreground: 0 0% 3.9%;
177
+ --primary: 0 0% 9%;
178
+ --primary-foreground: 0 0% 98%;
179
+ --secondary: 0 0% 96.1%;
180
+ --secondary-foreground: 0 0% 9%;
181
+ --muted: 0 0% 96.1%;
182
+ --muted-foreground: 0 0% 45.1%;
183
+ --accent: 0 0% 96.1%;
184
+ --accent-foreground: 0 0% 9%;
185
+ --destructive: 0 84.2% 60.2%;
186
+ --destructive-foreground: 0 0% 98%;
187
+ --border: 0 0% 89.8%;
188
+ --input: 0 0% 89.8%;
189
+ --ring: 0 0% 3.9%;
190
+ --radius: 0.5rem;
191
+ }
192
+
193
+ .dark {
194
+ --background: 0 0% 3.9%;
195
+ --foreground: 0 0% 98%;
196
+ --card: 0 0% 3.9%;
197
+ --card-foreground: 0 0% 98%;
198
+ --popover: 0 0% 3.9%;
199
+ --popover-foreground: 0 0% 98%;
200
+ --primary: 0 0% 98%;
201
+ --primary-foreground: 0 0% 9%;
202
+ --secondary: 0 0% 14.9%;
203
+ --secondary-foreground: 0 0% 98%;
204
+ --muted: 0 0% 14.9%;
205
+ --muted-foreground: 0 0% 63.9%;
206
+ --accent: 0 0% 14.9%;
207
+ --accent-foreground: 0 0% 98%;
208
+ --destructive: 0 62.8% 30.6%;
209
+ --destructive-foreground: 0 0% 98%;
210
+ --border: 0 0% 14.9%;
211
+ --input: 0 0% 14.9%;
212
+ --ring: 0 0% 83.1%;
213
+ }
214
+ }
215
+
216
+ @layer base {
217
+ * {
218
+ @apply border-border;
219
+ }
220
+ body {
221
+ @apply bg-background text-foreground;
222
+ }
223
+ }
224
+ EOF
225
+
226
+ # Add path aliases to tsconfig.json
227
+ echo "🔧 Adding path aliases to tsconfig.json..."
228
+ node -e "
229
+ const fs = require('fs');
230
+ const config = JSON.parse(fs.readFileSync('tsconfig.json', 'utf8'));
231
+ config.compilerOptions = config.compilerOptions || {};
232
+ config.compilerOptions.baseUrl = '.';
233
+ config.compilerOptions.paths = { '@/*': ['./src/*'] };
234
+ fs.writeFileSync('tsconfig.json', JSON.stringify(config, null, 2));
235
+ "
236
+
237
+ # Add path aliases to tsconfig.app.json
238
+ echo "🔧 Adding path aliases to tsconfig.app.json..."
239
+ node -e "
240
+ const fs = require('fs');
241
+ const path = 'tsconfig.app.json';
242
+ const content = fs.readFileSync(path, 'utf8');
243
+ // Remove comments manually
244
+ const lines = content.split('\n').filter(line => !line.trim().startsWith('//'));
245
+ const jsonContent = lines.join('\n');
246
+ const config = JSON.parse(jsonContent.replace(/\/\*[\s\S]*?\*\//g, '').replace(/,(\s*[}\]])/g, '\$1'));
247
+ config.compilerOptions = config.compilerOptions || {};
248
+ config.compilerOptions.baseUrl = '.';
249
+ config.compilerOptions.paths = { '@/*': ['./src/*'] };
250
+ fs.writeFileSync(path, JSON.stringify(config, null, 2));
251
+ "
252
+
253
+ # Update vite.config.ts
254
+ echo "⚙️ Updating Vite configuration..."
255
+ cat > vite.config.ts << 'EOF'
256
+ import path from "path";
257
+ import react from "@vitejs/plugin-react";
258
+ import { defineConfig } from "vite";
259
+
260
+ export default defineConfig({
261
+ plugins: [react()],
262
+ resolve: {
263
+ alias: {
264
+ "@": path.resolve(__dirname, "./src"),
265
+ },
266
+ },
267
+ });
268
+ EOF
269
+
270
+ # Install all shadcn/ui dependencies
271
+ echo "📦 Installing shadcn/ui dependencies..."
272
+ pnpm install @radix-ui/react-accordion @radix-ui/react-aspect-ratio @radix-ui/react-avatar @radix-ui/react-checkbox @radix-ui/react-collapsible @radix-ui/react-context-menu @radix-ui/react-dialog @radix-ui/react-dropdown-menu @radix-ui/react-hover-card @radix-ui/react-label @radix-ui/react-menubar @radix-ui/react-navigation-menu @radix-ui/react-popover @radix-ui/react-progress @radix-ui/react-radio-group @radix-ui/react-scroll-area @radix-ui/react-select @radix-ui/react-separator @radix-ui/react-slider @radix-ui/react-slot @radix-ui/react-switch @radix-ui/react-tabs @radix-ui/react-toast @radix-ui/react-toggle @radix-ui/react-toggle-group @radix-ui/react-tooltip
273
+ pnpm install sonner cmdk vaul embla-carousel-react react-day-picker react-resizable-panels date-fns react-hook-form @hookform/resolvers zod
274
+
275
+ # Extract shadcn components from tarball
276
+ echo "📦 Extracting shadcn/ui components..."
277
+ tar -xzf "$COMPONENTS_TARBALL" -C src/
278
+
279
+ # Create components.json for reference
280
+ echo "📝 Creating components.json config..."
281
+ cat > components.json << 'EOF'
282
+ {
283
+ "$schema": "https://ui.shadcn.com/schema.json",
284
+ "style": "default",
285
+ "rsc": false,
286
+ "tsx": true,
287
+ "tailwind": {
288
+ "config": "tailwind.config.js",
289
+ "css": "src/index.css",
290
+ "baseColor": "slate",
291
+ "cssVariables": true,
292
+ "prefix": ""
293
+ },
294
+ "aliases": {
295
+ "components": "@/components",
296
+ "utils": "@/lib/utils",
297
+ "ui": "@/components/ui",
298
+ "lib": "@/lib",
299
+ "hooks": "@/hooks"
300
+ }
301
+ }
302
+ EOF
303
+
304
+ echo "✅ Setup complete! You can now use Tailwind CSS and shadcn/ui in your project."
305
+ echo ""
306
+ echo "📦 Included components (40+ total):"
307
+ echo " - accordion, alert, aspect-ratio, avatar, badge, breadcrumb"
308
+ echo " - button, calendar, card, carousel, checkbox, collapsible"
309
+ echo " - command, context-menu, dialog, drawer, dropdown-menu"
310
+ echo " - form, hover-card, input, label, menubar, navigation-menu"
311
+ echo " - popover, progress, radio-group, resizable, scroll-area"
312
+ echo " - select, separator, sheet, skeleton, slider, sonner"
313
+ echo " - switch, table, tabs, textarea, toast, toggle, toggle-group, tooltip"
314
+ echo ""
315
+ echo "To start developing:"
316
+ echo " cd $PROJECT_NAME"
317
+ echo " pnpm dev"
318
+ echo ""
319
+ echo "📚 Import components like:"
320
+ echo " import { Button } from '@/components/ui/button'"
321
+ echo " import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'"
322
+ echo " import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog'"
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Start one or more servers, wait for them to be ready, run a command, then clean up.
4
+
5
+ Usage:
6
+ # Single server
7
+ python scripts/with_server.py --server "npm run dev" --port 5173 -- python automation.py
8
+ python scripts/with_server.py --server "npm start" --port 3000 -- python test.py
9
+
10
+ # Multiple servers
11
+ python scripts/with_server.py \
12
+ --server "cd backend && python server.py" --port 3000 \
13
+ --server "cd frontend && npm run dev" --port 5173 \
14
+ -- python test.py
15
+ """
16
+
17
+ import subprocess
18
+ import socket
19
+ import time
20
+ import sys
21
+ import argparse
22
+
23
+ def is_server_ready(port, timeout=30):
24
+ """Wait for server to be ready by polling the port."""
25
+ start_time = time.time()
26
+ while time.time() - start_time < timeout:
27
+ try:
28
+ with socket.create_connection(('localhost', port), timeout=1):
29
+ return True
30
+ except (socket.error, ConnectionRefusedError):
31
+ time.sleep(0.5)
32
+ return False
33
+
34
+
35
+ def main():
36
+ parser = argparse.ArgumentParser(description='Run command with one or more servers')
37
+ parser.add_argument('--server', action='append', dest='servers', required=True, help='Server command (can be repeated)')
38
+ parser.add_argument('--port', action='append', dest='ports', type=int, required=True, help='Port for each server (must match --server count)')
39
+ parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds per server (default: 30)')
40
+ parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run after server(s) ready')
41
+
42
+ args = parser.parse_args()
43
+
44
+ # Remove the '--' separator if present
45
+ if args.command and args.command[0] == '--':
46
+ args.command = args.command[1:]
47
+
48
+ if not args.command:
49
+ print("Error: No command specified to run")
50
+ sys.exit(1)
51
+
52
+ # Parse server configurations
53
+ if len(args.servers) != len(args.ports):
54
+ print("Error: Number of --server and --port arguments must match")
55
+ sys.exit(1)
56
+
57
+ servers = []
58
+ for cmd, port in zip(args.servers, args.ports):
59
+ servers.append({'cmd': cmd, 'port': port})
60
+
61
+ server_processes = []
62
+
63
+ try:
64
+ # Start all servers
65
+ for i, server in enumerate(servers):
66
+ print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
67
+
68
+ # Use shell=True to support commands with cd and &&
69
+ process = subprocess.Popen(
70
+ server['cmd'],
71
+ shell=True,
72
+ stdout=subprocess.PIPE,
73
+ stderr=subprocess.PIPE
74
+ )
75
+ server_processes.append(process)
76
+
77
+ # Wait for this server to be ready
78
+ print(f"Waiting for server on port {server['port']}...")
79
+ if not is_server_ready(server['port'], timeout=args.timeout):
80
+ raise RuntimeError(f"Server failed to start on port {server['port']} within {args.timeout}s")
81
+
82
+ print(f"Server ready on port {server['port']}")
83
+
84
+ print(f"\nAll {len(servers)} server(s) ready")
85
+
86
+ # Run the command
87
+ print(f"Running: {' '.join(args.command)}\n")
88
+ result = subprocess.run(args.command)
89
+ sys.exit(result.returncode)
90
+
91
+ finally:
92
+ # Clean up all servers
93
+ print(f"\nStopping {len(server_processes)} server(s)...")
94
+ for i, process in enumerate(server_processes):
95
+ try:
96
+ process.terminate()
97
+ process.wait(timeout=5)
98
+ except subprocess.TimeoutExpired:
99
+ process.kill()
100
+ process.wait()
101
+ print(f"Server {i+1} stopped")
102
+ print("All servers stopped")
103
+
104
+
105
+ if __name__ == '__main__':
106
+ main()