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,44 @@
1
+ """
2
+ Configuration for NotebookLM Skill
3
+ Centralizes constants, selectors, and paths
4
+ """
5
+
6
+ from pathlib import Path
7
+
8
+ # Paths
9
+ SKILL_DIR = Path(__file__).parent.parent
10
+ DATA_DIR = SKILL_DIR / "data"
11
+ BROWSER_STATE_DIR = DATA_DIR / "browser_state"
12
+ BROWSER_PROFILE_DIR = BROWSER_STATE_DIR / "browser_profile"
13
+ STATE_FILE = BROWSER_STATE_DIR / "state.json"
14
+ AUTH_INFO_FILE = DATA_DIR / "auth_info.json"
15
+ LIBRARY_FILE = DATA_DIR / "library.json"
16
+
17
+ # NotebookLM Selectors
18
+ QUERY_INPUT_SELECTORS = [
19
+ "textarea.query-box-input", # Primary
20
+ 'textarea[aria-label="Feld für Anfragen"]', # Fallback German
21
+ 'textarea[aria-label="Input for queries"]', # Fallback English
22
+ ]
23
+
24
+ RESPONSE_SELECTORS = [
25
+ ".to-user-container .message-text-content", # Primary
26
+ "[data-message-author='bot']",
27
+ "[data-message-author='assistant']",
28
+ ]
29
+
30
+ # Browser Configuration
31
+ BROWSER_ARGS = [
32
+ '--disable-blink-features=AutomationControlled', # Patches navigator.webdriver
33
+ '--disable-dev-shm-usage',
34
+ '--no-sandbox',
35
+ '--no-first-run',
36
+ '--no-default-browser-check'
37
+ ]
38
+
39
+ USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
40
+
41
+ # Timeouts
42
+ LOGIN_TIMEOUT_MINUTES = 10
43
+ QUERY_TIMEOUT_SECONDS = 120
44
+ PAGE_LOAD_TIMEOUT = 30000
@@ -0,0 +1,410 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Notebook Library Management for NotebookLM
4
+ Manages a library of NotebookLM notebooks with metadata
5
+ Based on the MCP server implementation
6
+ """
7
+
8
+ import json
9
+ import argparse
10
+ import uuid
11
+ import os
12
+ from pathlib import Path
13
+ from typing import Dict, List, Optional, Any
14
+ from datetime import datetime
15
+
16
+
17
+ class NotebookLibrary:
18
+ """Manages a collection of NotebookLM notebooks with metadata"""
19
+
20
+ def __init__(self):
21
+ """Initialize the notebook library"""
22
+ # Store data within the skill directory
23
+ skill_dir = Path(__file__).parent.parent
24
+ self.data_dir = skill_dir / "data"
25
+ self.data_dir.mkdir(parents=True, exist_ok=True)
26
+
27
+ self.library_file = self.data_dir / "library.json"
28
+ self.notebooks: Dict[str, Dict[str, Any]] = {}
29
+ self.active_notebook_id: Optional[str] = None
30
+
31
+ # Load existing library
32
+ self._load_library()
33
+
34
+ def _load_library(self):
35
+ """Load library from disk"""
36
+ if self.library_file.exists():
37
+ try:
38
+ with open(self.library_file, 'r') as f:
39
+ data = json.load(f)
40
+ self.notebooks = data.get('notebooks', {})
41
+ self.active_notebook_id = data.get('active_notebook_id')
42
+ print(f"šŸ“š Loaded library with {len(self.notebooks)} notebooks")
43
+ except Exception as e:
44
+ print(f"āš ļø Error loading library: {e}")
45
+ self.notebooks = {}
46
+ self.active_notebook_id = None
47
+ else:
48
+ self._save_library()
49
+
50
+ def _save_library(self):
51
+ """Save library to disk"""
52
+ try:
53
+ data = {
54
+ 'notebooks': self.notebooks,
55
+ 'active_notebook_id': self.active_notebook_id,
56
+ 'updated_at': datetime.now().isoformat()
57
+ }
58
+ with open(self.library_file, 'w') as f:
59
+ json.dump(data, f, indent=2)
60
+ except Exception as e:
61
+ print(f"āŒ Error saving library: {e}")
62
+
63
+ def add_notebook(
64
+ self,
65
+ url: str,
66
+ name: str,
67
+ description: str,
68
+ topics: List[str],
69
+ content_types: Optional[List[str]] = None,
70
+ use_cases: Optional[List[str]] = None,
71
+ tags: Optional[List[str]] = None
72
+ ) -> Dict[str, Any]:
73
+ """
74
+ Add a new notebook to the library
75
+
76
+ Args:
77
+ url: NotebookLM notebook URL
78
+ name: Display name for the notebook
79
+ description: What's in this notebook
80
+ topics: Topics covered
81
+ content_types: Types of content (optional)
82
+ use_cases: When to use this notebook (optional)
83
+ tags: Additional tags for organization (optional)
84
+
85
+ Returns:
86
+ The created notebook object
87
+ """
88
+ # Generate ID from name
89
+ notebook_id = name.lower().replace(' ', '-').replace('_', '-')
90
+
91
+ # Check for duplicates
92
+ if notebook_id in self.notebooks:
93
+ raise ValueError(f"Notebook with ID '{notebook_id}' already exists")
94
+
95
+ # Create notebook object
96
+ notebook = {
97
+ 'id': notebook_id,
98
+ 'url': url,
99
+ 'name': name,
100
+ 'description': description,
101
+ 'topics': topics,
102
+ 'content_types': content_types or [],
103
+ 'use_cases': use_cases or [],
104
+ 'tags': tags or [],
105
+ 'created_at': datetime.now().isoformat(),
106
+ 'updated_at': datetime.now().isoformat(),
107
+ 'use_count': 0,
108
+ 'last_used': None
109
+ }
110
+
111
+ # Add to library
112
+ self.notebooks[notebook_id] = notebook
113
+
114
+ # Set as active if it's the first notebook
115
+ if len(self.notebooks) == 1:
116
+ self.active_notebook_id = notebook_id
117
+
118
+ self._save_library()
119
+
120
+ print(f"āœ… Added notebook: {name} ({notebook_id})")
121
+ return notebook
122
+
123
+ def remove_notebook(self, notebook_id: str) -> bool:
124
+ """
125
+ Remove a notebook from the library
126
+
127
+ Args:
128
+ notebook_id: ID of notebook to remove
129
+
130
+ Returns:
131
+ True if removed, False if not found
132
+ """
133
+ if notebook_id in self.notebooks:
134
+ del self.notebooks[notebook_id]
135
+
136
+ # Clear active if it was removed
137
+ if self.active_notebook_id == notebook_id:
138
+ self.active_notebook_id = None
139
+ # Set new active if there are other notebooks
140
+ if self.notebooks:
141
+ self.active_notebook_id = list(self.notebooks.keys())[0]
142
+
143
+ self._save_library()
144
+ print(f"āœ… Removed notebook: {notebook_id}")
145
+ return True
146
+
147
+ print(f"āš ļø Notebook not found: {notebook_id}")
148
+ return False
149
+
150
+ def update_notebook(
151
+ self,
152
+ notebook_id: str,
153
+ name: Optional[str] = None,
154
+ description: Optional[str] = None,
155
+ topics: Optional[List[str]] = None,
156
+ content_types: Optional[List[str]] = None,
157
+ use_cases: Optional[List[str]] = None,
158
+ tags: Optional[List[str]] = None,
159
+ url: Optional[str] = None
160
+ ) -> Dict[str, Any]:
161
+ """
162
+ Update notebook metadata
163
+
164
+ Args:
165
+ notebook_id: ID of notebook to update
166
+ Other args: Fields to update (None = keep existing)
167
+
168
+ Returns:
169
+ Updated notebook object
170
+ """
171
+ if notebook_id not in self.notebooks:
172
+ raise ValueError(f"Notebook not found: {notebook_id}")
173
+
174
+ notebook = self.notebooks[notebook_id]
175
+
176
+ # Update fields if provided
177
+ if name is not None:
178
+ notebook['name'] = name
179
+ if description is not None:
180
+ notebook['description'] = description
181
+ if topics is not None:
182
+ notebook['topics'] = topics
183
+ if content_types is not None:
184
+ notebook['content_types'] = content_types
185
+ if use_cases is not None:
186
+ notebook['use_cases'] = use_cases
187
+ if tags is not None:
188
+ notebook['tags'] = tags
189
+ if url is not None:
190
+ notebook['url'] = url
191
+
192
+ notebook['updated_at'] = datetime.now().isoformat()
193
+
194
+ self._save_library()
195
+ print(f"āœ… Updated notebook: {notebook['name']}")
196
+ return notebook
197
+
198
+ def get_notebook(self, notebook_id: str) -> Optional[Dict[str, Any]]:
199
+ """Get a specific notebook by ID"""
200
+ return self.notebooks.get(notebook_id)
201
+
202
+ def list_notebooks(self) -> List[Dict[str, Any]]:
203
+ """List all notebooks in the library"""
204
+ return list(self.notebooks.values())
205
+
206
+ def search_notebooks(self, query: str) -> List[Dict[str, Any]]:
207
+ """
208
+ Search notebooks by query
209
+
210
+ Args:
211
+ query: Search query (searches name, description, topics, tags)
212
+
213
+ Returns:
214
+ List of matching notebooks
215
+ """
216
+ query_lower = query.lower()
217
+ results = []
218
+
219
+ for notebook in self.notebooks.values():
220
+ # Search in various fields
221
+ searchable = [
222
+ notebook['name'].lower(),
223
+ notebook['description'].lower(),
224
+ ' '.join(notebook['topics']).lower(),
225
+ ' '.join(notebook['tags']).lower(),
226
+ ' '.join(notebook.get('use_cases', [])).lower()
227
+ ]
228
+
229
+ if any(query_lower in field for field in searchable):
230
+ results.append(notebook)
231
+
232
+ return results
233
+
234
+ def select_notebook(self, notebook_id: str) -> Dict[str, Any]:
235
+ """
236
+ Set a notebook as active
237
+
238
+ Args:
239
+ notebook_id: ID of notebook to activate
240
+
241
+ Returns:
242
+ The activated notebook
243
+ """
244
+ if notebook_id not in self.notebooks:
245
+ raise ValueError(f"Notebook not found: {notebook_id}")
246
+
247
+ self.active_notebook_id = notebook_id
248
+ self._save_library()
249
+
250
+ notebook = self.notebooks[notebook_id]
251
+ print(f"āœ… Activated notebook: {notebook['name']}")
252
+ return notebook
253
+
254
+ def get_active_notebook(self) -> Optional[Dict[str, Any]]:
255
+ """Get the currently active notebook"""
256
+ if self.active_notebook_id:
257
+ return self.notebooks.get(self.active_notebook_id)
258
+ return None
259
+
260
+ def increment_use_count(self, notebook_id: str) -> Dict[str, Any]:
261
+ """
262
+ Increment usage counter for a notebook
263
+
264
+ Args:
265
+ notebook_id: ID of notebook that was used
266
+
267
+ Returns:
268
+ Updated notebook
269
+ """
270
+ if notebook_id not in self.notebooks:
271
+ raise ValueError(f"Notebook not found: {notebook_id}")
272
+
273
+ notebook = self.notebooks[notebook_id]
274
+ notebook['use_count'] += 1
275
+ notebook['last_used'] = datetime.now().isoformat()
276
+
277
+ self._save_library()
278
+ return notebook
279
+
280
+ def get_stats(self) -> Dict[str, Any]:
281
+ """Get library statistics"""
282
+ total_notebooks = len(self.notebooks)
283
+ total_topics = set()
284
+ total_use_count = 0
285
+
286
+ for notebook in self.notebooks.values():
287
+ total_topics.update(notebook['topics'])
288
+ total_use_count += notebook['use_count']
289
+
290
+ # Find most used
291
+ most_used = None
292
+ if self.notebooks:
293
+ most_used = max(
294
+ self.notebooks.values(),
295
+ key=lambda n: n['use_count']
296
+ )
297
+
298
+ return {
299
+ 'total_notebooks': total_notebooks,
300
+ 'total_topics': len(total_topics),
301
+ 'total_use_count': total_use_count,
302
+ 'active_notebook': self.get_active_notebook(),
303
+ 'most_used_notebook': most_used,
304
+ 'library_path': str(self.library_file)
305
+ }
306
+
307
+
308
+ def main():
309
+ """Command-line interface for notebook management"""
310
+ parser = argparse.ArgumentParser(description='Manage NotebookLM library')
311
+
312
+ subparsers = parser.add_subparsers(dest='command', help='Commands')
313
+
314
+ # Add command
315
+ add_parser = subparsers.add_parser('add', help='Add a notebook')
316
+ add_parser.add_argument('--url', required=True, help='NotebookLM URL')
317
+ add_parser.add_argument('--name', required=True, help='Display name')
318
+ add_parser.add_argument('--description', required=True, help='Description')
319
+ add_parser.add_argument('--topics', required=True, help='Comma-separated topics')
320
+ add_parser.add_argument('--use-cases', help='Comma-separated use cases')
321
+ add_parser.add_argument('--tags', help='Comma-separated tags')
322
+
323
+ # List command
324
+ subparsers.add_parser('list', help='List all notebooks')
325
+
326
+ # Search command
327
+ search_parser = subparsers.add_parser('search', help='Search notebooks')
328
+ search_parser.add_argument('--query', required=True, help='Search query')
329
+
330
+ # Activate command
331
+ activate_parser = subparsers.add_parser('activate', help='Set active notebook')
332
+ activate_parser.add_argument('--id', required=True, help='Notebook ID')
333
+
334
+ # Remove command
335
+ remove_parser = subparsers.add_parser('remove', help='Remove a notebook')
336
+ remove_parser.add_argument('--id', required=True, help='Notebook ID')
337
+
338
+ # Stats command
339
+ subparsers.add_parser('stats', help='Show library statistics')
340
+
341
+ args = parser.parse_args()
342
+
343
+ # Initialize library
344
+ library = NotebookLibrary()
345
+
346
+ # Execute command
347
+ if args.command == 'add':
348
+ topics = [t.strip() for t in args.topics.split(',')]
349
+ use_cases = [u.strip() for u in args.use_cases.split(',')] if args.use_cases else None
350
+ tags = [t.strip() for t in args.tags.split(',')] if args.tags else None
351
+
352
+ notebook = library.add_notebook(
353
+ url=args.url,
354
+ name=args.name,
355
+ description=args.description,
356
+ topics=topics,
357
+ use_cases=use_cases,
358
+ tags=tags
359
+ )
360
+ print(json.dumps(notebook, indent=2))
361
+
362
+ elif args.command == 'list':
363
+ notebooks = library.list_notebooks()
364
+ if notebooks:
365
+ print("\nšŸ“š Notebook Library:")
366
+ for notebook in notebooks:
367
+ active = " [ACTIVE]" if notebook['id'] == library.active_notebook_id else ""
368
+ print(f"\n šŸ““ {notebook['name']}{active}")
369
+ print(f" ID: {notebook['id']}")
370
+ print(f" Topics: {', '.join(notebook['topics'])}")
371
+ print(f" Uses: {notebook['use_count']}")
372
+ else:
373
+ print("šŸ“š Library is empty. Add notebooks with: notebook_manager.py add")
374
+
375
+ elif args.command == 'search':
376
+ results = library.search_notebooks(args.query)
377
+ if results:
378
+ print(f"\nšŸ” Found {len(results)} notebooks:")
379
+ for notebook in results:
380
+ print(f"\n šŸ““ {notebook['name']} ({notebook['id']})")
381
+ print(f" {notebook['description']}")
382
+ else:
383
+ print(f"šŸ” No notebooks found for: {args.query}")
384
+
385
+ elif args.command == 'activate':
386
+ notebook = library.select_notebook(args.id)
387
+ print(f"Now using: {notebook['name']}")
388
+
389
+ elif args.command == 'remove':
390
+ if library.remove_notebook(args.id):
391
+ print("Notebook removed from library")
392
+
393
+ elif args.command == 'stats':
394
+ stats = library.get_stats()
395
+ print("\nšŸ“Š Library Statistics:")
396
+ print(f" Total notebooks: {stats['total_notebooks']}")
397
+ print(f" Total topics: {stats['total_topics']}")
398
+ print(f" Total uses: {stats['total_use_count']}")
399
+ if stats['active_notebook']:
400
+ print(f" Active: {stats['active_notebook']['name']}")
401
+ if stats['most_used_notebook']:
402
+ print(f" Most used: {stats['most_used_notebook']['name']} ({stats['most_used_notebook']['use_count']} uses)")
403
+ print(f" Library path: {stats['library_path']}")
404
+
405
+ else:
406
+ parser.print_help()
407
+
408
+
409
+ if __name__ == "__main__":
410
+ main()
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Universal runner for NotebookLM skill scripts
4
+ Ensures all scripts run with the correct virtual environment
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import subprocess
10
+ from pathlib import Path
11
+
12
+
13
+ def get_venv_python():
14
+ """Get the virtual environment Python executable"""
15
+ skill_dir = Path(__file__).parent.parent
16
+ venv_dir = skill_dir / ".venv"
17
+
18
+ if os.name == 'nt': # Windows
19
+ venv_python = venv_dir / "Scripts" / "python.exe"
20
+ else: # Unix/Linux/Mac
21
+ venv_python = venv_dir / "bin" / "python"
22
+
23
+ return venv_python
24
+
25
+
26
+ def ensure_venv():
27
+ """Ensure virtual environment exists"""
28
+ skill_dir = Path(__file__).parent.parent
29
+ venv_dir = skill_dir / ".venv"
30
+ setup_script = skill_dir / "scripts" / "setup_environment.py"
31
+
32
+ # Check if venv exists
33
+ if not venv_dir.exists():
34
+ print("šŸ”§ First-time setup: Creating virtual environment...")
35
+ print(" This may take a minute...")
36
+
37
+ # Run setup with system Python
38
+ result = subprocess.run([sys.executable, str(setup_script)])
39
+ if result.returncode != 0:
40
+ print("āŒ Failed to set up environment")
41
+ sys.exit(1)
42
+
43
+ print("āœ… Environment ready!")
44
+
45
+ return get_venv_python()
46
+
47
+
48
+ def main():
49
+ """Main runner"""
50
+ if len(sys.argv) < 2:
51
+ print("Usage: python run.py <script_name> [args...]")
52
+ print("\nAvailable scripts:")
53
+ print(" ask_question.py - Query NotebookLM")
54
+ print(" notebook_manager.py - Manage notebook library")
55
+ print(" session_manager.py - Manage sessions")
56
+ print(" auth_manager.py - Handle authentication")
57
+ print(" cleanup_manager.py - Clean up skill data")
58
+ sys.exit(1)
59
+
60
+ script_name = sys.argv[1]
61
+ script_args = sys.argv[2:]
62
+
63
+ # Handle both "scripts/script.py" and "script.py" formats
64
+ if script_name.startswith('scripts/'):
65
+ # Remove the scripts/ prefix if provided
66
+ script_name = script_name[8:] # len('scripts/') = 8
67
+
68
+ # Ensure .py extension
69
+ if not script_name.endswith('.py'):
70
+ script_name += '.py'
71
+
72
+ # Get script path
73
+ skill_dir = Path(__file__).parent.parent
74
+ script_path = skill_dir / "scripts" / script_name
75
+
76
+ if not script_path.exists():
77
+ print(f"āŒ Script not found: {script_name}")
78
+ print(f" Working directory: {Path.cwd()}")
79
+ print(f" Skill directory: {skill_dir}")
80
+ print(f" Looked for: {script_path}")
81
+ sys.exit(1)
82
+
83
+ # Ensure venv exists and get Python executable
84
+ venv_python = ensure_venv()
85
+
86
+ # Build command
87
+ cmd = [str(venv_python), str(script_path)] + script_args
88
+
89
+ # Run the script
90
+ try:
91
+ result = subprocess.run(cmd)
92
+ sys.exit(result.returncode)
93
+ except KeyboardInterrupt:
94
+ print("\nāš ļø Interrupted by user")
95
+ sys.exit(130)
96
+ except Exception as e:
97
+ print(f"āŒ Error: {e}")
98
+ sys.exit(1)
99
+
100
+
101
+ if __name__ == "__main__":
102
+ main()