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.
- package/package.json +1 -1
- package/templates/.agents/agents/backend-specialist.md +263 -0
- package/templates/.agents/agents/code-archaeologist.md +106 -0
- package/templates/.agents/agents/database-architect.md +226 -0
- package/templates/.agents/agents/debugger.md +225 -0
- package/templates/.agents/agents/devops-engineer.md +242 -0
- package/templates/.agents/agents/documentation-writer.md +104 -0
- package/templates/.agents/agents/explorer-agent.md +73 -0
- package/templates/.agents/agents/frontend-specialist.md +593 -0
- package/templates/.agents/agents/game-developer.md +162 -0
- package/templates/.agents/agents/mobile-developer.md +377 -0
- package/templates/.agents/agents/orchestrator.md +416 -0
- package/templates/.agents/agents/penetration-tester.md +188 -0
- package/templates/.agents/agents/performance-optimizer.md +187 -0
- package/templates/.agents/agents/product-manager.md +112 -0
- package/templates/.agents/agents/product-owner.md +95 -0
- package/templates/.agents/agents/project-planner.md +406 -0
- package/templates/.agents/agents/qa-automation-engineer.md +103 -0
- package/templates/.agents/agents/security-auditor.md +170 -0
- package/templates/.agents/agents/seo-specialist.md +111 -0
- package/templates/.agents/agents/test-engineer.md +158 -0
- package/templates/.agents/rules/GEMINI.md +219 -0
- package/templates/.agents/scripts/auto_preview.py +148 -0
- package/templates/.agents/scripts/checklist.py +217 -0
- package/templates/.agents/scripts/session_manager.py +120 -0
- package/templates/.agents/scripts/verify_all.py +327 -0
- package/templates/.agents/workflows/brainstorm.md +113 -0
- package/templates/.agents/workflows/create.md +59 -0
- package/templates/.agents/workflows/debug.md +103 -0
- package/templates/.agents/workflows/deploy.md +176 -0
- package/templates/.agents/workflows/enhance.md +63 -0
- package/templates/.agents/workflows/orchestrate.md +237 -0
- package/templates/.agents/workflows/plan.md +89 -0
- package/templates/.agents/workflows/preview.md +81 -0
- package/templates/.agents/workflows/setup-brain.md +39 -0
- package/templates/.agents/workflows/status.md +86 -0
- package/templates/.agents/workflows/test.md +144 -0
- package/templates/.agents/workflows/ui-ux-pro-max.md +296 -0
- package/templates/skills_normal/api-patterns/scripts/api_validator.py +211 -0
- package/templates/skills_normal/database-design/scripts/schema_validator.py +172 -0
- package/templates/skills_normal/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/skills_normal/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/skills_normal/git-pushing/scripts/smart_commit.sh +19 -0
- package/templates/skills_normal/lint-and-validate/scripts/lint_runner.py +184 -0
- package/templates/skills_normal/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/skills_normal/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/skills_normal/senior-fullstack/scripts/code_quality_analyzer.py +114 -0
- package/templates/skills_normal/senior-fullstack/scripts/fullstack_scaffolder.py +114 -0
- package/templates/skills_normal/senior-fullstack/scripts/project_scaffolder.py +114 -0
- package/templates/skills_normal/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/skills_normal/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/skills_normal/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/vault/007/scripts/config.py +472 -0
- package/templates/vault/007/scripts/full_audit.py +1306 -0
- package/templates/vault/007/scripts/quick_scan.py +481 -0
- package/templates/vault/007/scripts/requirements.txt +26 -0
- package/templates/vault/007/scripts/scanners/__init__.py +0 -0
- package/templates/vault/007/scripts/scanners/dependency_scanner.py +1305 -0
- package/templates/vault/007/scripts/scanners/injection_scanner.py +1104 -0
- package/templates/vault/007/scripts/scanners/secrets_scanner.py +1008 -0
- package/templates/vault/007/scripts/score_calculator.py +693 -0
- package/templates/vault/agent-orchestrator/scripts/match_skills.py +329 -0
- package/templates/vault/agent-orchestrator/scripts/orchestrate.py +304 -0
- package/templates/vault/agent-orchestrator/scripts/requirements.txt +1 -0
- package/templates/vault/agent-orchestrator/scripts/scan_registry.py +508 -0
- package/templates/vault/ai-studio-image/scripts/config.py +613 -0
- package/templates/vault/ai-studio-image/scripts/generate.py +630 -0
- package/templates/vault/ai-studio-image/scripts/prompt_engine.py +424 -0
- package/templates/vault/ai-studio-image/scripts/requirements.txt +4 -0
- package/templates/vault/ai-studio-image/scripts/templates.py +349 -0
- package/templates/vault/android_ui_verification/scripts/verify_ui.sh +32 -0
- package/templates/vault/apify-audience-analysis/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-brand-reputation-monitoring/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-competitor-intelligence/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-content-analytics/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-ecommerce/reference/scripts/package.json +3 -0
- package/templates/vault/apify-ecommerce/reference/scripts/run_actor.js +369 -0
- package/templates/vault/apify-influencer-discovery/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-lead-generation/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-market-research/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-trend-analysis/reference/scripts/run_actor.js +363 -0
- package/templates/vault/apify-ultimate-scraper/reference/scripts/run_actor.js +363 -0
- package/templates/vault/audio-transcriber/scripts/install-requirements.sh +190 -0
- package/templates/vault/audio-transcriber/scripts/transcribe.py +486 -0
- package/templates/vault/claude-monitor/scripts/api_bench.py +240 -0
- package/templates/vault/claude-monitor/scripts/config.py +69 -0
- package/templates/vault/claude-monitor/scripts/health_check.py +362 -0
- package/templates/vault/claude-monitor/scripts/monitor.py +296 -0
- package/templates/vault/content-creator/scripts/brand_voice_analyzer.py +185 -0
- package/templates/vault/content-creator/scripts/seo_optimizer.py +419 -0
- package/templates/vault/context-agent/scripts/active_context.py +227 -0
- package/templates/vault/context-agent/scripts/compressor.py +149 -0
- package/templates/vault/context-agent/scripts/config.py +69 -0
- package/templates/vault/context-agent/scripts/context_loader.py +155 -0
- package/templates/vault/context-agent/scripts/context_manager.py +302 -0
- package/templates/vault/context-agent/scripts/models.py +103 -0
- package/templates/vault/context-agent/scripts/project_registry.py +132 -0
- package/templates/vault/context-agent/scripts/requirements.txt +6 -0
- package/templates/vault/context-agent/scripts/search.py +115 -0
- package/templates/vault/context-agent/scripts/session_parser.py +206 -0
- package/templates/vault/context-agent/scripts/session_summary.py +319 -0
- package/templates/vault/context-guardian/scripts/context_snapshot.py +229 -0
- package/templates/vault/docx/ooxml/scripts/pack.py +159 -0
- package/templates/vault/docx/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/docx/ooxml/scripts/validate.py +69 -0
- package/templates/vault/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/docx/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/docx/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/docx/scripts/__init__.py +1 -0
- package/templates/vault/docx/scripts/document.py +1276 -0
- package/templates/vault/docx/scripts/templates/comments.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsExtended.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/templates/vault/docx/scripts/templates/commentsIds.xml +3 -0
- package/templates/vault/docx/scripts/templates/people.xml +3 -0
- package/templates/vault/docx/scripts/utilities.py +374 -0
- package/templates/vault/docx-official/ooxml/scripts/pack.py +159 -0
- package/templates/vault/docx-official/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/docx-official/ooxml/scripts/validate.py +69 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/docx-official/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/docx-official/scripts/__init__.py +1 -0
- package/templates/vault/docx-official/scripts/document.py +1276 -0
- package/templates/vault/docx-official/scripts/templates/comments.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsExtended.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsExtensible.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/commentsIds.xml +3 -0
- package/templates/vault/docx-official/scripts/templates/people.xml +3 -0
- package/templates/vault/docx-official/scripts/utilities.py +374 -0
- package/templates/vault/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/vault/helm-chart-scaffolding/scripts/validate-chart.sh +244 -0
- package/templates/vault/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/vault/instagram/scripts/account_setup.py +233 -0
- package/templates/vault/instagram/scripts/analyze.py +221 -0
- package/templates/vault/instagram/scripts/api_client.py +444 -0
- package/templates/vault/instagram/scripts/auth.py +411 -0
- package/templates/vault/instagram/scripts/comments.py +160 -0
- package/templates/vault/instagram/scripts/config.py +111 -0
- package/templates/vault/instagram/scripts/db.py +467 -0
- package/templates/vault/instagram/scripts/export.py +138 -0
- package/templates/vault/instagram/scripts/governance.py +233 -0
- package/templates/vault/instagram/scripts/hashtags.py +114 -0
- package/templates/vault/instagram/scripts/insights.py +170 -0
- package/templates/vault/instagram/scripts/media.py +65 -0
- package/templates/vault/instagram/scripts/messages.py +103 -0
- package/templates/vault/instagram/scripts/profile.py +58 -0
- package/templates/vault/instagram/scripts/publish.py +449 -0
- package/templates/vault/instagram/scripts/requirements.txt +5 -0
- package/templates/vault/instagram/scripts/run_all.py +189 -0
- package/templates/vault/instagram/scripts/schedule.py +189 -0
- package/templates/vault/instagram/scripts/serve_api.py +234 -0
- package/templates/vault/instagram/scripts/templates.py +155 -0
- package/templates/vault/junta-leiloeiros/scripts/db.py +216 -0
- package/templates/vault/junta-leiloeiros/scripts/export.py +137 -0
- package/templates/vault/junta-leiloeiros/scripts/requirements.txt +15 -0
- package/templates/vault/junta-leiloeiros/scripts/run_all.py +190 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/__init__.py +4 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/base_scraper.py +209 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/generic_scraper.py +110 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucap.py +110 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceac.py +72 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceal.py +72 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/juceb.py +68 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucec.py +63 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucema.py +211 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucemg.py +218 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucep.py +70 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepa.py +74 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepar.py +80 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepe.py +78 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucepi.py +69 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucer.py +256 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucerja.py +170 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucern.py +71 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucesc.py +89 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucesp.py +233 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucetins.py +134 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucis_df.py +63 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/jucisrs.py +299 -0
- package/templates/vault/junta-leiloeiros/scripts/scraper/states.py +99 -0
- package/templates/vault/junta-leiloeiros/scripts/serve_api.py +164 -0
- package/templates/vault/junta-leiloeiros/scripts/web_scraper_fallback.py +233 -0
- package/templates/vault/last30days/scripts/last30days.py +521 -0
- package/templates/vault/last30days/scripts/lib/__init__.py +1 -0
- package/templates/vault/last30days/scripts/lib/cache.py +152 -0
- package/templates/vault/last30days/scripts/lib/dates.py +124 -0
- package/templates/vault/last30days/scripts/lib/dedupe.py +120 -0
- package/templates/vault/last30days/scripts/lib/env.py +149 -0
- package/templates/vault/last30days/scripts/lib/http.py +152 -0
- package/templates/vault/last30days/scripts/lib/models.py +175 -0
- package/templates/vault/last30days/scripts/lib/normalize.py +160 -0
- package/templates/vault/last30days/scripts/lib/openai_reddit.py +230 -0
- package/templates/vault/last30days/scripts/lib/reddit_enrich.py +232 -0
- package/templates/vault/last30days/scripts/lib/render.py +383 -0
- package/templates/vault/last30days/scripts/lib/schema.py +336 -0
- package/templates/vault/last30days/scripts/lib/score.py +311 -0
- package/templates/vault/last30days/scripts/lib/ui.py +324 -0
- package/templates/vault/last30days/scripts/lib/websearch.py +401 -0
- package/templates/vault/last30days/scripts/lib/xai_x.py +217 -0
- package/templates/vault/leiloeiro-avaliacao/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-avaliacao/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-edital/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-edital/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-ia/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-ia/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-juridico/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-juridico/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-mercado/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-mercado/scripts/requirements.txt +1 -0
- package/templates/vault/leiloeiro-risco/scripts/governance.py +106 -0
- package/templates/vault/leiloeiro-risco/scripts/requirements.txt +1 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/database.ts +24 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/db.ts +35 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/index.ts +2 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/migrations.ts +31 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/db/schema.sql +8 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/index.ts +44 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/routes/todos.ts +155 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/backend/src/types/index.ts +35 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.css +384 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/App.tsx +81 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/api/todos.ts +57 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/ConfirmDialog.tsx +26 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/EmptyState.tsx +8 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoForm.tsx +43 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoItem.tsx +36 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/components/TodoList.tsx +27 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/hooks/useTodos.ts +81 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/index.css +48 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/main.tsx +10 -0
- package/templates/vault/loki-mode/examples/todo-app-generated/frontend/src/vite-env.d.ts +1 -0
- package/templates/vault/loki-mode/scripts/export-to-vibe-kanban.sh +178 -0
- package/templates/vault/loki-mode/scripts/loki-wrapper.sh +281 -0
- package/templates/vault/loki-mode/scripts/take-screenshots.js +55 -0
- package/templates/vault/matematico-tao/scripts/complexity_analyzer.py +544 -0
- package/templates/vault/matematico-tao/scripts/dependency_graph.py +538 -0
- package/templates/vault/mcp-builder/scripts/connections.py +151 -0
- package/templates/vault/mcp-builder/scripts/evaluation.py +373 -0
- package/templates/vault/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/templates/vault/mcp-builder/scripts/requirements.txt +2 -0
- package/templates/vault/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/vault/notebooklm/scripts/__init__.py +81 -0
- package/templates/vault/notebooklm/scripts/ask_question.py +256 -0
- package/templates/vault/notebooklm/scripts/auth_manager.py +358 -0
- package/templates/vault/notebooklm/scripts/browser_session.py +255 -0
- package/templates/vault/notebooklm/scripts/browser_utils.py +107 -0
- package/templates/vault/notebooklm/scripts/cleanup_manager.py +302 -0
- package/templates/vault/notebooklm/scripts/config.py +44 -0
- package/templates/vault/notebooklm/scripts/notebook_manager.py +410 -0
- package/templates/vault/notebooklm/scripts/run.py +102 -0
- package/templates/vault/notebooklm/scripts/setup_environment.py +204 -0
- package/templates/vault/pdf/scripts/check_bounding_boxes.py +70 -0
- package/templates/vault/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/templates/vault/pdf/scripts/check_fillable_fields.py +12 -0
- package/templates/vault/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/templates/vault/pdf/scripts/create_validation_image.py +41 -0
- package/templates/vault/pdf/scripts/extract_form_field_info.py +152 -0
- package/templates/vault/pdf/scripts/fill_fillable_fields.py +114 -0
- package/templates/vault/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/templates/vault/pdf-official/scripts/check_bounding_boxes.py +70 -0
- package/templates/vault/pdf-official/scripts/check_bounding_boxes_test.py +226 -0
- package/templates/vault/pdf-official/scripts/check_fillable_fields.py +12 -0
- package/templates/vault/pdf-official/scripts/convert_pdf_to_images.py +35 -0
- package/templates/vault/pdf-official/scripts/create_validation_image.py +41 -0
- package/templates/vault/pdf-official/scripts/extract_form_field_info.py +152 -0
- package/templates/vault/pdf-official/scripts/fill_fillable_fields.py +114 -0
- package/templates/vault/pdf-official/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/templates/vault/planning-with-files/scripts/check-complete.sh +44 -0
- package/templates/vault/planning-with-files/scripts/init-session.sh +120 -0
- package/templates/vault/pptx/ooxml/scripts/pack.py +159 -0
- package/templates/vault/pptx/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/pptx/ooxml/scripts/validate.py +69 -0
- package/templates/vault/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/pptx/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/pptx/scripts/html2pptx.js +979 -0
- package/templates/vault/pptx/scripts/inventory.py +1020 -0
- package/templates/vault/pptx/scripts/rearrange.py +231 -0
- package/templates/vault/pptx/scripts/replace.py +385 -0
- package/templates/vault/pptx/scripts/thumbnail.py +450 -0
- package/templates/vault/pptx-official/ooxml/scripts/pack.py +159 -0
- package/templates/vault/pptx-official/ooxml/scripts/unpack.py +29 -0
- package/templates/vault/pptx-official/ooxml/scripts/validate.py +69 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/__init__.py +15 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/base.py +951 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/docx.py +274 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/pptx.py +315 -0
- package/templates/vault/pptx-official/ooxml/scripts/validation/redlining.py +279 -0
- package/templates/vault/pptx-official/scripts/html2pptx.js +979 -0
- package/templates/vault/pptx-official/scripts/inventory.py +1020 -0
- package/templates/vault/pptx-official/scripts/rearrange.py +231 -0
- package/templates/vault/pptx-official/scripts/replace.py +385 -0
- package/templates/vault/pptx-official/scripts/thumbnail.py +450 -0
- package/templates/vault/product-manager-toolkit/scripts/customer_interview_analyzer.py +441 -0
- package/templates/vault/product-manager-toolkit/scripts/rice_prioritizer.py +296 -0
- package/templates/vault/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
- package/templates/vault/scripts/.skill_cache.json +7538 -0
- package/templates/vault/scripts/skill_search.py +228 -0
- package/templates/vault/senior-architect/scripts/architecture_diagram_generator.py +114 -0
- package/templates/vault/senior-architect/scripts/dependency_analyzer.py +114 -0
- package/templates/vault/senior-architect/scripts/project_architect.py +114 -0
- package/templates/vault/shopify-development/scripts/requirements.txt +19 -0
- package/templates/vault/shopify-development/scripts/shopify_graphql.py +428 -0
- package/templates/vault/shopify-development/scripts/shopify_init.py +441 -0
- package/templates/vault/shopify-development/scripts/tests/test_shopify_init.py +379 -0
- package/templates/vault/skill-creator/scripts/init_skill.py +303 -0
- package/templates/vault/skill-creator/scripts/package_skill.py +110 -0
- package/templates/vault/skill-creator/scripts/quick_validate.py +95 -0
- package/templates/vault/skill-installer/scripts/detect_skills.py +318 -0
- package/templates/vault/skill-installer/scripts/install_skill.py +1708 -0
- package/templates/vault/skill-installer/scripts/package_skill.py +417 -0
- package/templates/vault/skill-installer/scripts/requirements.txt +1 -0
- package/templates/vault/skill-installer/scripts/validate_skill.py +430 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/__init__.py +13 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/code_quality.py +247 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/cross_skill.py +134 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/dependencies.py +121 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/documentation.py +189 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/governance_audit.py +153 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/performance.py +164 -0
- package/templates/vault/skill-sentinel/scripts/analyzers/security.py +189 -0
- package/templates/vault/skill-sentinel/scripts/config.py +158 -0
- package/templates/vault/skill-sentinel/scripts/cost_optimizer.py +146 -0
- package/templates/vault/skill-sentinel/scripts/db.py +354 -0
- package/templates/vault/skill-sentinel/scripts/governance.py +58 -0
- package/templates/vault/skill-sentinel/scripts/recommender.py +228 -0
- package/templates/vault/skill-sentinel/scripts/report_generator.py +224 -0
- package/templates/vault/skill-sentinel/scripts/requirements.txt +1 -0
- package/templates/vault/skill-sentinel/scripts/run_audit.py +290 -0
- package/templates/vault/skill-sentinel/scripts/scanner.py +271 -0
- package/templates/vault/stability-ai/scripts/config.py +266 -0
- package/templates/vault/stability-ai/scripts/generate.py +687 -0
- package/templates/vault/stability-ai/scripts/requirements.txt +4 -0
- package/templates/vault/stability-ai/scripts/styles.py +174 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/bot-client.ts +86 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/handlers.ts +79 -0
- package/templates/vault/telegram/assets/boilerplate/nodejs/src/index.ts +32 -0
- package/templates/vault/telegram/scripts/send_message.py +143 -0
- package/templates/vault/telegram/scripts/setup_project.py +103 -0
- package/templates/vault/telegram/scripts/test_bot.py +144 -0
- package/templates/vault/typescript-expert/scripts/ts_diagnostic.py +203 -0
- package/templates/vault/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/templates/vault/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/templates/vault/ui-ux-pro-max/scripts/core.py +257 -0
- package/templates/vault/ui-ux-pro-max/scripts/design_system.py +487 -0
- package/templates/vault/ui-ux-pro-max/scripts/search.py +76 -0
- package/templates/vault/videodb/scripts/ws_listener.py +204 -0
- package/templates/vault/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
- package/templates/vault/web-artifacts-builder/scripts/init-artifact.sh +322 -0
- package/templates/vault/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- package/templates/vault/webapp-testing/scripts/with_server.py +106 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/index.ts +125 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/template-manager.ts +67 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/types.ts +216 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/webhook-handler.ts +173 -0
- package/templates/vault/whatsapp-cloud-api/assets/boilerplate/nodejs/src/whatsapp-client.ts +193 -0
- package/templates/vault/whatsapp-cloud-api/scripts/send_test_message.py +137 -0
- package/templates/vault/whatsapp-cloud-api/scripts/setup_project.py +118 -0
- package/templates/vault/whatsapp-cloud-api/scripts/validate_config.py +190 -0
- package/templates/vault/youtube-summarizer/scripts/extract-transcript.py +65 -0
- 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()
|