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,114 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Project Scaffolder
4
+ Automated tool for senior fullstack tasks
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import json
10
+ import argparse
11
+ from pathlib import Path
12
+ from typing import Dict, List, Optional
13
+
14
+ class ProjectScaffolder:
15
+ """Main class for project scaffolder functionality"""
16
+
17
+ def __init__(self, target_path: str, verbose: bool = False):
18
+ self.target_path = Path(target_path)
19
+ self.verbose = verbose
20
+ self.results = {}
21
+
22
+ def run(self) -> Dict:
23
+ """Execute the main functionality"""
24
+ print(f"🚀 Running {self.__class__.__name__}...")
25
+ print(f"📁 Target: {self.target_path}")
26
+
27
+ try:
28
+ self.validate_target()
29
+ self.analyze()
30
+ self.generate_report()
31
+
32
+ print("✅ Completed successfully!")
33
+ return self.results
34
+
35
+ except Exception as e:
36
+ print(f"❌ Error: {e}")
37
+ sys.exit(1)
38
+
39
+ def validate_target(self):
40
+ """Validate the target path exists and is accessible"""
41
+ if not self.target_path.exists():
42
+ raise ValueError(f"Target path does not exist: {self.target_path}")
43
+
44
+ if self.verbose:
45
+ print(f"✓ Target validated: {self.target_path}")
46
+
47
+ def analyze(self):
48
+ """Perform the main analysis or operation"""
49
+ if self.verbose:
50
+ print("📊 Analyzing...")
51
+
52
+ # Main logic here
53
+ self.results['status'] = 'success'
54
+ self.results['target'] = str(self.target_path)
55
+ self.results['findings'] = []
56
+
57
+ # Add analysis results
58
+ if self.verbose:
59
+ print(f"✓ Analysis complete: {len(self.results.get('findings', []))} findings")
60
+
61
+ def generate_report(self):
62
+ """Generate and display the report"""
63
+ print("\n" + "="*50)
64
+ print("REPORT")
65
+ print("="*50)
66
+ print(f"Target: {self.results.get('target')}")
67
+ print(f"Status: {self.results.get('status')}")
68
+ print(f"Findings: {len(self.results.get('findings', []))}")
69
+ print("="*50 + "\n")
70
+
71
+ def main():
72
+ """Main entry point"""
73
+ parser = argparse.ArgumentParser(
74
+ description="Project Scaffolder"
75
+ )
76
+ parser.add_argument(
77
+ 'target',
78
+ help='Target path to analyze or process'
79
+ )
80
+ parser.add_argument(
81
+ '--verbose', '-v',
82
+ action='store_true',
83
+ help='Enable verbose output'
84
+ )
85
+ parser.add_argument(
86
+ '--json',
87
+ action='store_true',
88
+ help='Output results as JSON'
89
+ )
90
+ parser.add_argument(
91
+ '--output', '-o',
92
+ help='Output file path'
93
+ )
94
+
95
+ args = parser.parse_args()
96
+
97
+ tool = ProjectScaffolder(
98
+ args.target,
99
+ verbose=args.verbose
100
+ )
101
+
102
+ results = tool.run()
103
+
104
+ if args.json:
105
+ output = json.dumps(results, indent=2)
106
+ if args.output:
107
+ with open(args.output, 'w') as f:
108
+ f.write(output)
109
+ print(f"Results written to {args.output}")
110
+ else:
111
+ print(output)
112
+
113
+ if __name__ == '__main__':
114
+ main()
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SEO Checker - Search Engine Optimization Audit
4
+ Checks HTML/JSX/TSX pages for SEO best practices.
5
+
6
+ PURPOSE:
7
+ - Verify meta tags, titles, descriptions
8
+ - Check Open Graph tags for social sharing
9
+ - Validate heading hierarchy
10
+ - Check image accessibility (alt attributes)
11
+
12
+ WHAT IT CHECKS:
13
+ - HTML files (actual web pages)
14
+ - JSX/TSX files (React page components)
15
+ - Only files that are likely PUBLIC pages
16
+
17
+ Usage:
18
+ python seo_checker.py <project_path>
19
+ """
20
+ import sys
21
+ import json
22
+ import re
23
+ from pathlib import Path
24
+ from datetime import datetime
25
+
26
+ # Fix Windows console encoding
27
+ try:
28
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
29
+ except:
30
+ pass
31
+
32
+
33
+ # Directories to skip
34
+ SKIP_DIRS = {
35
+ 'node_modules', '.next', 'dist', 'build', '.git', '.github',
36
+ '__pycache__', '.vscode', '.idea', 'coverage', 'test', 'tests',
37
+ '__tests__', 'spec', 'docs', 'documentation', 'examples'
38
+ }
39
+
40
+ # Files to skip (not pages)
41
+ SKIP_PATTERNS = [
42
+ 'config', 'setup', 'util', 'helper', 'hook', 'context', 'store',
43
+ 'service', 'api', 'lib', 'constant', 'type', 'interface', 'mock',
44
+ '.test.', '.spec.', '_test.', '_spec.'
45
+ ]
46
+
47
+
48
+ def is_page_file(file_path: Path) -> bool:
49
+ """Check if this file is likely a public-facing page."""
50
+ name = file_path.name.lower()
51
+ stem = file_path.stem.lower()
52
+
53
+ # Skip utility/config files
54
+ if any(skip in name for skip in SKIP_PATTERNS):
55
+ return False
56
+
57
+ # Check path - pages in specific directories are likely pages
58
+ parts = [p.lower() for p in file_path.parts]
59
+ page_dirs = ['pages', 'app', 'routes', 'views', 'screens']
60
+
61
+ if any(d in parts for d in page_dirs):
62
+ return True
63
+
64
+ # Filename indicators for pages
65
+ page_names = ['page', 'index', 'home', 'about', 'contact', 'blog',
66
+ 'post', 'article', 'product', 'landing', 'layout']
67
+
68
+ if any(p in stem for p in page_names):
69
+ return True
70
+
71
+ # HTML files are usually pages
72
+ if file_path.suffix.lower() in ['.html', '.htm']:
73
+ return True
74
+
75
+ return False
76
+
77
+
78
+ def find_pages(project_path: Path) -> list:
79
+ """Find page files to check."""
80
+ patterns = ['**/*.html', '**/*.htm', '**/*.jsx', '**/*.tsx']
81
+
82
+ files = []
83
+ for pattern in patterns:
84
+ for f in project_path.glob(pattern):
85
+ # Skip excluded directories
86
+ if any(skip in f.parts for skip in SKIP_DIRS):
87
+ continue
88
+
89
+ # Check if it's likely a page
90
+ if is_page_file(f):
91
+ files.append(f)
92
+
93
+ return files[:50] # Limit to 50 files
94
+
95
+
96
+ def check_page(file_path: Path) -> dict:
97
+ """Check a single page for SEO issues."""
98
+ issues = []
99
+
100
+ try:
101
+ content = file_path.read_text(encoding='utf-8', errors='ignore')
102
+ except Exception as e:
103
+ return {"file": str(file_path.name), "issues": [f"Error: {e}"]}
104
+
105
+ # Detect if this is a layout/template file (has Head component)
106
+ is_layout = 'Head>' in content or '<head' in content.lower()
107
+
108
+ # 1. Title tag
109
+ has_title = '<title' in content.lower() or 'title=' in content or 'Head>' in content
110
+ if not has_title and is_layout:
111
+ issues.append("Missing <title> tag")
112
+
113
+ # 2. Meta description
114
+ has_description = 'name="description"' in content.lower() or 'name=\'description\'' in content.lower()
115
+ if not has_description and is_layout:
116
+ issues.append("Missing meta description")
117
+
118
+ # 3. Open Graph tags
119
+ has_og = 'og:' in content or 'property="og:' in content.lower()
120
+ if not has_og and is_layout:
121
+ issues.append("Missing Open Graph tags")
122
+
123
+ # 4. Heading hierarchy - multiple H1s
124
+ h1_matches = re.findall(r'<h1[^>]*>', content, re.I)
125
+ if len(h1_matches) > 1:
126
+ issues.append(f"Multiple H1 tags ({len(h1_matches)})")
127
+
128
+ # 5. Images without alt
129
+ img_pattern = r'<img[^>]+>'
130
+ imgs = re.findall(img_pattern, content, re.I)
131
+ for img in imgs:
132
+ if 'alt=' not in img.lower():
133
+ issues.append("Image missing alt attribute")
134
+ break
135
+ if 'alt=""' in img or "alt=''" in img:
136
+ issues.append("Image has empty alt attribute")
137
+ break
138
+
139
+ # 6. Check for canonical link (nice to have)
140
+ # has_canonical = 'rel="canonical"' in content.lower()
141
+
142
+ return {
143
+ "file": str(file_path.name),
144
+ "issues": issues
145
+ }
146
+
147
+
148
+ def main():
149
+ project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
150
+
151
+ print(f"\n{'='*60}")
152
+ print(f" SEO CHECKER - Search Engine Optimization Audit")
153
+ print(f"{'='*60}")
154
+ print(f"Project: {project_path}")
155
+ print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
156
+ print("-"*60)
157
+
158
+ # Find pages
159
+ pages = find_pages(project_path)
160
+
161
+ if not pages:
162
+ print("\n[!] No page files found.")
163
+ print(" Looking for: HTML, JSX, TSX in pages/app/routes directories")
164
+ output = {"script": "seo_checker", "files_checked": 0, "passed": True}
165
+ print("\n" + json.dumps(output, indent=2))
166
+ sys.exit(0)
167
+
168
+ print(f"Found {len(pages)} page files to analyze\n")
169
+
170
+ # Check each page
171
+ all_issues = []
172
+ for f in pages:
173
+ result = check_page(f)
174
+ if result["issues"]:
175
+ all_issues.append(result)
176
+
177
+ # Summary
178
+ print("=" * 60)
179
+ print("SEO ANALYSIS RESULTS")
180
+ print("=" * 60)
181
+
182
+ if all_issues:
183
+ # Group by issue type
184
+ issue_counts = {}
185
+ for item in all_issues:
186
+ for issue in item["issues"]:
187
+ issue_counts[issue] = issue_counts.get(issue, 0) + 1
188
+
189
+ print("\nIssue Summary:")
190
+ for issue, count in sorted(issue_counts.items(), key=lambda x: -x[1]):
191
+ print(f" [{count}] {issue}")
192
+
193
+ print(f"\nAffected files ({len(all_issues)}):")
194
+ for item in all_issues[:5]:
195
+ print(f" - {item['file']}")
196
+ if len(all_issues) > 5:
197
+ print(f" ... and {len(all_issues) - 5} more")
198
+ else:
199
+ print("\n[OK] No SEO issues found!")
200
+
201
+ total_issues = sum(len(item["issues"]) for item in all_issues)
202
+ passed = total_issues == 0
203
+
204
+ output = {
205
+ "script": "seo_checker",
206
+ "project": str(project_path),
207
+ "files_checked": len(pages),
208
+ "files_with_issues": len(all_issues),
209
+ "issues_found": total_issues,
210
+ "passed": passed
211
+ }
212
+
213
+ print("\n" + json.dumps(output, indent=2))
214
+
215
+ sys.exit(0 if passed else 1)
216
+
217
+
218
+ if __name__ == "__main__":
219
+ main()
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test Runner - Unified test execution and coverage reporting
4
+ Runs tests and generates coverage report based on project type.
5
+
6
+ Usage:
7
+ python test_runner.py <project_path> [--coverage]
8
+
9
+ Supports:
10
+ - Node.js: npm test, jest, vitest
11
+ - Python: pytest, unittest
12
+ """
13
+
14
+ import subprocess
15
+ import sys
16
+ import json
17
+ from pathlib import Path
18
+ from datetime import datetime
19
+
20
+ # Fix Windows console encoding
21
+ try:
22
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
23
+ except:
24
+ pass
25
+
26
+
27
+ def detect_test_framework(project_path: Path) -> dict:
28
+ """Detect test framework and commands."""
29
+ result = {
30
+ "type": "unknown",
31
+ "framework": None,
32
+ "cmd": None,
33
+ "coverage_cmd": None
34
+ }
35
+
36
+ # Node.js project
37
+ package_json = project_path / "package.json"
38
+ if package_json.exists():
39
+ result["type"] = "node"
40
+ try:
41
+ pkg = json.loads(package_json.read_text(encoding='utf-8'))
42
+ scripts = pkg.get("scripts", {})
43
+ deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
44
+
45
+ # Check for test script
46
+ if "test" in scripts:
47
+ result["framework"] = "npm test"
48
+ result["cmd"] = ["npm", "test"]
49
+
50
+ # Try to detect specific framework for coverage
51
+ if "vitest" in deps:
52
+ result["framework"] = "vitest"
53
+ result["coverage_cmd"] = ["npx", "vitest", "run", "--coverage"]
54
+ elif "jest" in deps:
55
+ result["framework"] = "jest"
56
+ result["coverage_cmd"] = ["npx", "jest", "--coverage"]
57
+ elif "vitest" in deps:
58
+ result["framework"] = "vitest"
59
+ result["cmd"] = ["npx", "vitest", "run"]
60
+ result["coverage_cmd"] = ["npx", "vitest", "run", "--coverage"]
61
+ elif "jest" in deps:
62
+ result["framework"] = "jest"
63
+ result["cmd"] = ["npx", "jest"]
64
+ result["coverage_cmd"] = ["npx", "jest", "--coverage"]
65
+
66
+ except:
67
+ pass
68
+
69
+ # Python project
70
+ if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
71
+ result["type"] = "python"
72
+ result["framework"] = "pytest"
73
+ result["cmd"] = ["python", "-m", "pytest", "-v"]
74
+ result["coverage_cmd"] = ["python", "-m", "pytest", "--cov", "--cov-report=term-missing"]
75
+
76
+ return result
77
+
78
+
79
+ def run_tests(cmd: list, cwd: Path) -> dict:
80
+ """Run tests and return results."""
81
+ result = {
82
+ "passed": False,
83
+ "output": "",
84
+ "error": "",
85
+ "tests_run": 0,
86
+ "tests_passed": 0,
87
+ "tests_failed": 0
88
+ }
89
+
90
+ try:
91
+ proc = subprocess.run(
92
+ cmd,
93
+ cwd=str(cwd),
94
+ capture_output=True,
95
+ text=True,
96
+ encoding='utf-8',
97
+ errors='replace',
98
+ timeout=300 # 5 min timeout for tests
99
+ )
100
+
101
+ result["output"] = proc.stdout[:3000] if proc.stdout else ""
102
+ result["error"] = proc.stderr[:500] if proc.stderr else ""
103
+ result["passed"] = proc.returncode == 0
104
+
105
+ # Try to parse test counts from output
106
+ output = proc.stdout or ""
107
+
108
+ # Jest/Vitest pattern: "Tests: X passed, Y failed, Z total"
109
+ if "passed" in output.lower() and "failed" in output.lower():
110
+ import re
111
+ match = re.search(r'(\d+)\s+passed', output, re.IGNORECASE)
112
+ if match:
113
+ result["tests_passed"] = int(match.group(1))
114
+ match = re.search(r'(\d+)\s+failed', output, re.IGNORECASE)
115
+ if match:
116
+ result["tests_failed"] = int(match.group(1))
117
+ result["tests_run"] = result["tests_passed"] + result["tests_failed"]
118
+
119
+ # Pytest pattern: "X passed, Y failed"
120
+ if "pytest" in str(cmd):
121
+ import re
122
+ match = re.search(r'(\d+)\s+passed', output)
123
+ if match:
124
+ result["tests_passed"] = int(match.group(1))
125
+ match = re.search(r'(\d+)\s+failed', output)
126
+ if match:
127
+ result["tests_failed"] = int(match.group(1))
128
+ result["tests_run"] = result["tests_passed"] + result["tests_failed"]
129
+
130
+ except FileNotFoundError:
131
+ result["error"] = f"Command not found: {cmd[0]}"
132
+ except subprocess.TimeoutExpired:
133
+ result["error"] = "Timeout after 300s"
134
+ except Exception as e:
135
+ result["error"] = str(e)
136
+
137
+ return result
138
+
139
+
140
+ def main():
141
+ project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
142
+ with_coverage = "--coverage" in sys.argv
143
+
144
+ print(f"\n{'='*60}")
145
+ print(f"[TEST RUNNER] Unified Test Execution")
146
+ print(f"{'='*60}")
147
+ print(f"Project: {project_path}")
148
+ print(f"Coverage: {'enabled' if with_coverage else 'disabled'}")
149
+ print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
150
+
151
+ # Detect test framework
152
+ test_info = detect_test_framework(project_path)
153
+ print(f"Type: {test_info['type']}")
154
+ print(f"Framework: {test_info['framework']}")
155
+ print("-"*60)
156
+
157
+ if not test_info["cmd"]:
158
+ print("No test framework found for this project.")
159
+ output = {
160
+ "script": "test_runner",
161
+ "project": str(project_path),
162
+ "type": test_info["type"],
163
+ "framework": None,
164
+ "passed": True,
165
+ "message": "No tests configured"
166
+ }
167
+ print(json.dumps(output, indent=2))
168
+ sys.exit(0)
169
+
170
+ # Choose command
171
+ cmd = test_info["coverage_cmd"] if with_coverage and test_info["coverage_cmd"] else test_info["cmd"]
172
+
173
+ print(f"Running: {' '.join(cmd)}")
174
+ print("-"*60)
175
+
176
+ # Run tests
177
+ result = run_tests(cmd, project_path)
178
+
179
+ # Print output (truncated)
180
+ if result["output"]:
181
+ lines = result["output"].split("\n")
182
+ for line in lines[:30]:
183
+ print(line)
184
+ if len(lines) > 30:
185
+ print(f"... ({len(lines) - 30} more lines)")
186
+
187
+ # Summary
188
+ print("\n" + "="*60)
189
+ print("SUMMARY")
190
+ print("="*60)
191
+
192
+ if result["passed"]:
193
+ print("[PASS] All tests passed")
194
+ else:
195
+ print("[FAIL] Some tests failed")
196
+ if result["error"]:
197
+ print(f"Error: {result['error'][:200]}")
198
+
199
+ if result["tests_run"] > 0:
200
+ print(f"Tests: {result['tests_run']} total, {result['tests_passed']} passed, {result['tests_failed']} failed")
201
+
202
+ output = {
203
+ "script": "test_runner",
204
+ "project": str(project_path),
205
+ "type": test_info["type"],
206
+ "framework": test_info["framework"],
207
+ "tests_run": result["tests_run"],
208
+ "tests_passed": result["tests_passed"],
209
+ "tests_failed": result["tests_failed"],
210
+ "passed": result["passed"]
211
+ }
212
+
213
+ print("\n" + json.dumps(output, indent=2))
214
+
215
+ sys.exit(0 if result["passed"] else 1)
216
+
217
+
218
+ if __name__ == "__main__":
219
+ main()