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,441 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Customer Interview Analyzer
4
+ Extracts insights, patterns, and opportunities from user interviews
5
+ """
6
+
7
+ import re
8
+ from typing import Dict, List, Tuple, Set
9
+ from collections import Counter, defaultdict
10
+ import json
11
+
12
+ class InterviewAnalyzer:
13
+ """Analyze customer interviews for insights and patterns"""
14
+
15
+ def __init__(self):
16
+ # Pain point indicators
17
+ self.pain_indicators = [
18
+ 'frustrat', 'annoy', 'difficult', 'hard', 'confus', 'slow',
19
+ 'problem', 'issue', 'struggle', 'challeng', 'pain', 'waste',
20
+ 'manual', 'repetitive', 'tedious', 'boring', 'time-consuming',
21
+ 'complicated', 'complex', 'unclear', 'wish', 'need', 'want'
22
+ ]
23
+
24
+ # Positive indicators
25
+ self.delight_indicators = [
26
+ 'love', 'great', 'awesome', 'amazing', 'perfect', 'easy',
27
+ 'simple', 'quick', 'fast', 'helpful', 'useful', 'valuable',
28
+ 'save', 'efficient', 'convenient', 'intuitive', 'clear'
29
+ ]
30
+
31
+ # Feature request indicators
32
+ self.request_indicators = [
33
+ 'would be nice', 'wish', 'hope', 'want', 'need', 'should',
34
+ 'could', 'would love', 'if only', 'it would help', 'suggest',
35
+ 'recommend', 'idea', 'what if', 'have you considered'
36
+ ]
37
+
38
+ # Jobs to be done patterns
39
+ self.jtbd_patterns = [
40
+ r'when i\s+(.+?),\s+i want to\s+(.+?)\s+so that\s+(.+)',
41
+ r'i need to\s+(.+?)\s+because\s+(.+)',
42
+ r'my goal is to\s+(.+)',
43
+ r'i\'m trying to\s+(.+)',
44
+ r'i use \w+ to\s+(.+)',
45
+ r'helps me\s+(.+)',
46
+ ]
47
+
48
+ def analyze_interview(self, text: str) -> Dict:
49
+ """Analyze a single interview transcript"""
50
+ text_lower = text.lower()
51
+ sentences = self._split_sentences(text)
52
+
53
+ analysis = {
54
+ 'pain_points': self._extract_pain_points(sentences),
55
+ 'delights': self._extract_delights(sentences),
56
+ 'feature_requests': self._extract_requests(sentences),
57
+ 'jobs_to_be_done': self._extract_jtbd(text_lower),
58
+ 'sentiment_score': self._calculate_sentiment(text_lower),
59
+ 'key_themes': self._extract_themes(text_lower),
60
+ 'quotes': self._extract_key_quotes(sentences),
61
+ 'metrics_mentioned': self._extract_metrics(text),
62
+ 'competitors_mentioned': self._extract_competitors(text)
63
+ }
64
+
65
+ return analysis
66
+
67
+ def _split_sentences(self, text: str) -> List[str]:
68
+ """Split text into sentences"""
69
+ # Simple sentence splitting
70
+ sentences = re.split(r'[.!?]+', text)
71
+ return [s.strip() for s in sentences if s.strip()]
72
+
73
+ def _extract_pain_points(self, sentences: List[str]) -> List[Dict]:
74
+ """Extract pain points from sentences"""
75
+ pain_points = []
76
+
77
+ for sentence in sentences:
78
+ sentence_lower = sentence.lower()
79
+ for indicator in self.pain_indicators:
80
+ if indicator in sentence_lower:
81
+ # Extract context around the pain point
82
+ pain_points.append({
83
+ 'quote': sentence,
84
+ 'indicator': indicator,
85
+ 'severity': self._assess_severity(sentence_lower)
86
+ })
87
+ break
88
+
89
+ return pain_points[:10] # Return top 10
90
+
91
+ def _extract_delights(self, sentences: List[str]) -> List[Dict]:
92
+ """Extract positive feedback"""
93
+ delights = []
94
+
95
+ for sentence in sentences:
96
+ sentence_lower = sentence.lower()
97
+ for indicator in self.delight_indicators:
98
+ if indicator in sentence_lower:
99
+ delights.append({
100
+ 'quote': sentence,
101
+ 'indicator': indicator,
102
+ 'strength': self._assess_strength(sentence_lower)
103
+ })
104
+ break
105
+
106
+ return delights[:10]
107
+
108
+ def _extract_requests(self, sentences: List[str]) -> List[Dict]:
109
+ """Extract feature requests and suggestions"""
110
+ requests = []
111
+
112
+ for sentence in sentences:
113
+ sentence_lower = sentence.lower()
114
+ for indicator in self.request_indicators:
115
+ if indicator in sentence_lower:
116
+ requests.append({
117
+ 'quote': sentence,
118
+ 'type': self._classify_request(sentence_lower),
119
+ 'priority': self._assess_request_priority(sentence_lower)
120
+ })
121
+ break
122
+
123
+ return requests[:10]
124
+
125
+ def _extract_jtbd(self, text: str) -> List[Dict]:
126
+ """Extract Jobs to Be Done patterns"""
127
+ jobs = []
128
+
129
+ for pattern in self.jtbd_patterns:
130
+ matches = re.findall(pattern, text, re.IGNORECASE)
131
+ for match in matches:
132
+ if isinstance(match, tuple):
133
+ job = ' → '.join(match)
134
+ else:
135
+ job = match
136
+
137
+ jobs.append({
138
+ 'job': job,
139
+ 'pattern': pattern.pattern if hasattr(pattern, 'pattern') else pattern
140
+ })
141
+
142
+ return jobs[:5]
143
+
144
+ def _calculate_sentiment(self, text: str) -> Dict:
145
+ """Calculate overall sentiment of the interview"""
146
+ positive_count = sum(1 for ind in self.delight_indicators if ind in text)
147
+ negative_count = sum(1 for ind in self.pain_indicators if ind in text)
148
+
149
+ total = positive_count + negative_count
150
+ if total == 0:
151
+ sentiment_score = 0
152
+ else:
153
+ sentiment_score = (positive_count - negative_count) / total
154
+
155
+ if sentiment_score > 0.3:
156
+ sentiment_label = 'positive'
157
+ elif sentiment_score < -0.3:
158
+ sentiment_label = 'negative'
159
+ else:
160
+ sentiment_label = 'neutral'
161
+
162
+ return {
163
+ 'score': round(sentiment_score, 2),
164
+ 'label': sentiment_label,
165
+ 'positive_signals': positive_count,
166
+ 'negative_signals': negative_count
167
+ }
168
+
169
+ def _extract_themes(self, text: str) -> List[str]:
170
+ """Extract key themes using word frequency"""
171
+ # Remove common words
172
+ stop_words = {'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at',
173
+ 'to', 'for', 'of', 'with', 'by', 'from', 'as', 'is',
174
+ 'was', 'are', 'were', 'been', 'be', 'have', 'has',
175
+ 'had', 'do', 'does', 'did', 'will', 'would', 'could',
176
+ 'should', 'may', 'might', 'must', 'can', 'shall',
177
+ 'it', 'i', 'you', 'we', 'they', 'them', 'their'}
178
+
179
+ # Extract meaningful words
180
+ words = re.findall(r'\b[a-z]{4,}\b', text)
181
+ meaningful_words = [w for w in words if w not in stop_words]
182
+
183
+ # Count frequency
184
+ word_freq = Counter(meaningful_words)
185
+
186
+ # Extract themes (top frequent meaningful words)
187
+ themes = [word for word, count in word_freq.most_common(10) if count >= 3]
188
+
189
+ return themes
190
+
191
+ def _extract_key_quotes(self, sentences: List[str]) -> List[str]:
192
+ """Extract the most insightful quotes"""
193
+ scored_sentences = []
194
+
195
+ for sentence in sentences:
196
+ if len(sentence) < 20 or len(sentence) > 200:
197
+ continue
198
+
199
+ score = 0
200
+ sentence_lower = sentence.lower()
201
+
202
+ # Score based on insight indicators
203
+ if any(ind in sentence_lower for ind in self.pain_indicators):
204
+ score += 2
205
+ if any(ind in sentence_lower for ind in self.request_indicators):
206
+ score += 2
207
+ if 'because' in sentence_lower:
208
+ score += 1
209
+ if 'but' in sentence_lower:
210
+ score += 1
211
+ if '?' in sentence:
212
+ score += 1
213
+
214
+ if score > 0:
215
+ scored_sentences.append((score, sentence))
216
+
217
+ # Sort by score and return top quotes
218
+ scored_sentences.sort(reverse=True)
219
+ return [s[1] for s in scored_sentences[:5]]
220
+
221
+ def _extract_metrics(self, text: str) -> List[str]:
222
+ """Extract any metrics or numbers mentioned"""
223
+ metrics = []
224
+
225
+ # Find percentages
226
+ percentages = re.findall(r'\d+%', text)
227
+ metrics.extend(percentages)
228
+
229
+ # Find time metrics
230
+ time_metrics = re.findall(r'\d+\s*(?:hours?|minutes?|days?|weeks?|months?)', text, re.IGNORECASE)
231
+ metrics.extend(time_metrics)
232
+
233
+ # Find money metrics
234
+ money_metrics = re.findall(r'\$[\d,]+', text)
235
+ metrics.extend(money_metrics)
236
+
237
+ # Find general numbers with context
238
+ number_contexts = re.findall(r'(\d+)\s+(\w+)', text)
239
+ for num, context in number_contexts:
240
+ if context.lower() not in ['the', 'a', 'an', 'and', 'or', 'of']:
241
+ metrics.append(f"{num} {context}")
242
+
243
+ return list(set(metrics))[:10]
244
+
245
+ def _extract_competitors(self, text: str) -> List[str]:
246
+ """Extract competitor mentions"""
247
+ # Common competitor indicators
248
+ competitor_patterns = [
249
+ r'(?:use|used|using|tried|trying|switch from|switched from|instead of)\s+(\w+)',
250
+ r'(\w+)\s+(?:is better|works better|is easier)',
251
+ r'compared to\s+(\w+)',
252
+ r'like\s+(\w+)',
253
+ r'similar to\s+(\w+)',
254
+ ]
255
+
256
+ competitors = set()
257
+ for pattern in competitor_patterns:
258
+ matches = re.findall(pattern, text, re.IGNORECASE)
259
+ competitors.update(matches)
260
+
261
+ # Filter out common words
262
+ common_words = {'this', 'that', 'it', 'them', 'other', 'another', 'something'}
263
+ competitors = [c for c in competitors if c.lower() not in common_words and len(c) > 2]
264
+
265
+ return list(competitors)[:5]
266
+
267
+ def _assess_severity(self, text: str) -> str:
268
+ """Assess severity of pain point"""
269
+ if any(word in text for word in ['very', 'extremely', 'really', 'totally', 'completely']):
270
+ return 'high'
271
+ elif any(word in text for word in ['somewhat', 'bit', 'little', 'slightly']):
272
+ return 'low'
273
+ return 'medium'
274
+
275
+ def _assess_strength(self, text: str) -> str:
276
+ """Assess strength of positive feedback"""
277
+ if any(word in text for word in ['absolutely', 'definitely', 'really', 'very']):
278
+ return 'strong'
279
+ return 'moderate'
280
+
281
+ def _classify_request(self, text: str) -> str:
282
+ """Classify the type of request"""
283
+ if any(word in text for word in ['ui', 'design', 'look', 'color', 'layout']):
284
+ return 'ui_improvement'
285
+ elif any(word in text for word in ['feature', 'add', 'new', 'build']):
286
+ return 'new_feature'
287
+ elif any(word in text for word in ['fix', 'bug', 'broken', 'work']):
288
+ return 'bug_fix'
289
+ elif any(word in text for word in ['faster', 'slow', 'performance', 'speed']):
290
+ return 'performance'
291
+ return 'general'
292
+
293
+ def _assess_request_priority(self, text: str) -> str:
294
+ """Assess priority of request"""
295
+ if any(word in text for word in ['critical', 'urgent', 'asap', 'immediately', 'blocking']):
296
+ return 'critical'
297
+ elif any(word in text for word in ['need', 'important', 'should', 'must']):
298
+ return 'high'
299
+ elif any(word in text for word in ['nice', 'would', 'could', 'maybe']):
300
+ return 'low'
301
+ return 'medium'
302
+
303
+ def aggregate_interviews(interviews: List[Dict]) -> Dict:
304
+ """Aggregate insights from multiple interviews"""
305
+ aggregated = {
306
+ 'total_interviews': len(interviews),
307
+ 'common_pain_points': defaultdict(list),
308
+ 'common_requests': defaultdict(list),
309
+ 'jobs_to_be_done': [],
310
+ 'overall_sentiment': {
311
+ 'positive': 0,
312
+ 'negative': 0,
313
+ 'neutral': 0
314
+ },
315
+ 'top_themes': Counter(),
316
+ 'metrics_summary': set(),
317
+ 'competitors_mentioned': Counter()
318
+ }
319
+
320
+ for interview in interviews:
321
+ # Aggregate pain points
322
+ for pain in interview.get('pain_points', []):
323
+ indicator = pain.get('indicator', 'unknown')
324
+ aggregated['common_pain_points'][indicator].append(pain['quote'])
325
+
326
+ # Aggregate requests
327
+ for request in interview.get('feature_requests', []):
328
+ req_type = request.get('type', 'general')
329
+ aggregated['common_requests'][req_type].append(request['quote'])
330
+
331
+ # Aggregate JTBD
332
+ aggregated['jobs_to_be_done'].extend(interview.get('jobs_to_be_done', []))
333
+
334
+ # Aggregate sentiment
335
+ sentiment = interview.get('sentiment_score', {}).get('label', 'neutral')
336
+ aggregated['overall_sentiment'][sentiment] += 1
337
+
338
+ # Aggregate themes
339
+ for theme in interview.get('key_themes', []):
340
+ aggregated['top_themes'][theme] += 1
341
+
342
+ # Aggregate metrics
343
+ aggregated['metrics_summary'].update(interview.get('metrics_mentioned', []))
344
+
345
+ # Aggregate competitors
346
+ for competitor in interview.get('competitors_mentioned', []):
347
+ aggregated['competitors_mentioned'][competitor] += 1
348
+
349
+ # Process aggregated data
350
+ aggregated['common_pain_points'] = dict(aggregated['common_pain_points'])
351
+ aggregated['common_requests'] = dict(aggregated['common_requests'])
352
+ aggregated['top_themes'] = dict(aggregated['top_themes'].most_common(10))
353
+ aggregated['metrics_summary'] = list(aggregated['metrics_summary'])
354
+ aggregated['competitors_mentioned'] = dict(aggregated['competitors_mentioned'])
355
+
356
+ return aggregated
357
+
358
+ def format_single_interview(analysis: Dict) -> str:
359
+ """Format single interview analysis"""
360
+ output = ["=" * 60]
361
+ output.append("CUSTOMER INTERVIEW ANALYSIS")
362
+ output.append("=" * 60)
363
+
364
+ # Sentiment
365
+ sentiment = analysis['sentiment_score']
366
+ output.append(f"\nšŸ“Š Overall Sentiment: {sentiment['label'].upper()}")
367
+ output.append(f" Score: {sentiment['score']}")
368
+ output.append(f" Positive signals: {sentiment['positive_signals']}")
369
+ output.append(f" Negative signals: {sentiment['negative_signals']}")
370
+
371
+ # Pain Points
372
+ if analysis['pain_points']:
373
+ output.append("\nšŸ”„ Pain Points Identified:")
374
+ for i, pain in enumerate(analysis['pain_points'][:5], 1):
375
+ output.append(f"\n{i}. [{pain['severity'].upper()}] {pain['quote'][:100]}...")
376
+
377
+ # Feature Requests
378
+ if analysis['feature_requests']:
379
+ output.append("\nšŸ’” Feature Requests:")
380
+ for i, req in enumerate(analysis['feature_requests'][:5], 1):
381
+ output.append(f"\n{i}. [{req['type']}] Priority: {req['priority']}")
382
+ output.append(f" \"{req['quote'][:100]}...\"")
383
+
384
+ # Jobs to Be Done
385
+ if analysis['jobs_to_be_done']:
386
+ output.append("\nšŸŽÆ Jobs to Be Done:")
387
+ for i, job in enumerate(analysis['jobs_to_be_done'], 1):
388
+ output.append(f"{i}. {job['job']}")
389
+
390
+ # Key Themes
391
+ if analysis['key_themes']:
392
+ output.append("\nšŸ·ļø Key Themes:")
393
+ output.append(", ".join(analysis['key_themes']))
394
+
395
+ # Key Quotes
396
+ if analysis['quotes']:
397
+ output.append("\nšŸ’¬ Key Quotes:")
398
+ for i, quote in enumerate(analysis['quotes'][:3], 1):
399
+ output.append(f'{i}. "{quote}"')
400
+
401
+ # Metrics
402
+ if analysis['metrics_mentioned']:
403
+ output.append("\nšŸ“ˆ Metrics Mentioned:")
404
+ output.append(", ".join(analysis['metrics_mentioned']))
405
+
406
+ # Competitors
407
+ if analysis['competitors_mentioned']:
408
+ output.append("\nšŸ¢ Competitors Mentioned:")
409
+ output.append(", ".join(analysis['competitors_mentioned']))
410
+
411
+ return "\n".join(output)
412
+
413
+ def main():
414
+ import sys
415
+
416
+ if len(sys.argv) < 2:
417
+ print("Usage: python customer_interview_analyzer.py <interview_file.txt>")
418
+ print("\nThis tool analyzes customer interview transcripts to extract:")
419
+ print(" - Pain points and frustrations")
420
+ print(" - Feature requests and suggestions")
421
+ print(" - Jobs to be done")
422
+ print(" - Sentiment analysis")
423
+ print(" - Key themes and quotes")
424
+ sys.exit(1)
425
+
426
+ # Read interview transcript
427
+ with open(sys.argv[1], 'r') as f:
428
+ interview_text = f.read()
429
+
430
+ # Analyze
431
+ analyzer = InterviewAnalyzer()
432
+ analysis = analyzer.analyze_interview(interview_text)
433
+
434
+ # Output
435
+ if len(sys.argv) > 2 and sys.argv[2] == 'json':
436
+ print(json.dumps(analysis, indent=2))
437
+ else:
438
+ print(format_single_interview(analysis))
439
+
440
+ if __name__ == "__main__":
441
+ main()