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