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,289 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
GEO Checker - Generative Engine Optimization Audit
|
|
4
|
+
Checks PUBLIC WEB CONTENT for AI citation readiness.
|
|
5
|
+
|
|
6
|
+
PURPOSE:
|
|
7
|
+
- Analyze pages that will be INDEXED by AI engines (ChatGPT, Perplexity, etc.)
|
|
8
|
+
- Check for structured data, author info, dates, FAQ sections
|
|
9
|
+
- Help content rank in AI-generated answers
|
|
10
|
+
|
|
11
|
+
WHAT IT CHECKS:
|
|
12
|
+
- HTML files (actual web pages)
|
|
13
|
+
- JSX/TSX files (React page components)
|
|
14
|
+
- NOT markdown files (those are developer docs, not public content)
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
python geo_checker.py <project_path>
|
|
18
|
+
"""
|
|
19
|
+
import sys
|
|
20
|
+
import re
|
|
21
|
+
import json
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
# Fix Windows console encoding
|
|
25
|
+
try:
|
|
26
|
+
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
27
|
+
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
|
28
|
+
except AttributeError:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Directories to skip (not public content)
|
|
33
|
+
SKIP_DIRS = {
|
|
34
|
+
'node_modules', '.next', 'dist', 'build', '.git', '.github',
|
|
35
|
+
'__pycache__', '.vscode', '.idea', 'coverage', 'test', 'tests',
|
|
36
|
+
'__tests__', 'spec', 'docs', 'documentation'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Files to skip (not public pages)
|
|
40
|
+
SKIP_FILES = {
|
|
41
|
+
'jest.config', 'webpack.config', 'vite.config', 'tsconfig',
|
|
42
|
+
'package.json', 'package-lock', 'yarn.lock', '.eslintrc',
|
|
43
|
+
'tailwind.config', 'postcss.config', 'next.config'
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def is_page_file(file_path: Path) -> bool:
|
|
48
|
+
"""Check if this file is likely a public-facing page."""
|
|
49
|
+
name = file_path.stem.lower()
|
|
50
|
+
|
|
51
|
+
# Skip config/utility files
|
|
52
|
+
if any(skip in name for skip in SKIP_FILES):
|
|
53
|
+
return False
|
|
54
|
+
|
|
55
|
+
# Skip test files
|
|
56
|
+
if name.endswith('.test') or name.endswith('.spec'):
|
|
57
|
+
return False
|
|
58
|
+
if name.startswith('test_') or name.startswith('spec_'):
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
# Likely page indicators
|
|
62
|
+
page_indicators = ['page', 'index', 'home', 'about', 'contact', 'blog',
|
|
63
|
+
'post', 'article', 'product', 'service', 'landing']
|
|
64
|
+
|
|
65
|
+
# Check if it's in a pages/app directory (Next.js, etc.)
|
|
66
|
+
parts = [p.lower() for p in file_path.parts]
|
|
67
|
+
if 'pages' in parts or 'app' in parts or 'routes' in parts:
|
|
68
|
+
return True
|
|
69
|
+
|
|
70
|
+
# Check filename indicators
|
|
71
|
+
if any(ind in name for ind in page_indicators):
|
|
72
|
+
return True
|
|
73
|
+
|
|
74
|
+
# HTML files are usually pages
|
|
75
|
+
if file_path.suffix.lower() == '.html':
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def find_web_pages(project_path: Path) -> list:
|
|
82
|
+
"""Find public-facing web pages only."""
|
|
83
|
+
patterns = ['**/*.html', '**/*.htm', '**/*.jsx', '**/*.tsx']
|
|
84
|
+
|
|
85
|
+
files = []
|
|
86
|
+
for pattern in patterns:
|
|
87
|
+
for f in project_path.glob(pattern):
|
|
88
|
+
# Skip excluded directories
|
|
89
|
+
if any(skip in f.parts for skip in SKIP_DIRS):
|
|
90
|
+
continue
|
|
91
|
+
|
|
92
|
+
# Check if it's likely a page
|
|
93
|
+
if is_page_file(f):
|
|
94
|
+
files.append(f)
|
|
95
|
+
|
|
96
|
+
return files[:30] # Limit to 30 pages
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def check_page(file_path: Path) -> dict:
|
|
100
|
+
"""Check a single web page for GEO elements."""
|
|
101
|
+
try:
|
|
102
|
+
content = file_path.read_text(encoding='utf-8', errors='ignore')
|
|
103
|
+
except Exception as e:
|
|
104
|
+
return {'file': str(file_path.name), 'passed': [], 'issues': [f"Error: {e}"], 'score': 0}
|
|
105
|
+
|
|
106
|
+
issues = []
|
|
107
|
+
passed = []
|
|
108
|
+
|
|
109
|
+
# 1. JSON-LD Structured Data (Critical for AI)
|
|
110
|
+
if 'application/ld+json' in content:
|
|
111
|
+
passed.append("JSON-LD structured data found")
|
|
112
|
+
if '"@type"' in content:
|
|
113
|
+
if 'Article' in content:
|
|
114
|
+
passed.append("Article schema present")
|
|
115
|
+
if 'FAQPage' in content:
|
|
116
|
+
passed.append("FAQ schema present")
|
|
117
|
+
if 'Organization' in content or 'Person' in content:
|
|
118
|
+
passed.append("Entity schema present")
|
|
119
|
+
else:
|
|
120
|
+
issues.append("No JSON-LD structured data (AI engines prefer structured content)")
|
|
121
|
+
|
|
122
|
+
# 2. Heading Structure
|
|
123
|
+
h1_count = len(re.findall(r'<h1[^>]*>', content, re.I))
|
|
124
|
+
h2_count = len(re.findall(r'<h2[^>]*>', content, re.I))
|
|
125
|
+
|
|
126
|
+
if h1_count == 1:
|
|
127
|
+
passed.append("Single H1 heading (clear topic)")
|
|
128
|
+
elif h1_count == 0:
|
|
129
|
+
issues.append("No H1 heading - page topic unclear")
|
|
130
|
+
else:
|
|
131
|
+
issues.append(f"Multiple H1 headings ({h1_count}) - confusing for AI")
|
|
132
|
+
|
|
133
|
+
if h2_count >= 2:
|
|
134
|
+
passed.append(f"{h2_count} H2 subheadings (good structure)")
|
|
135
|
+
else:
|
|
136
|
+
issues.append("Add more H2 subheadings for scannable content")
|
|
137
|
+
|
|
138
|
+
# 3. Author Attribution (E-E-A-T signal)
|
|
139
|
+
author_patterns = ['author', 'byline', 'written-by', 'contributor', 'rel="author"']
|
|
140
|
+
has_author = any(p in content.lower() for p in author_patterns)
|
|
141
|
+
if has_author:
|
|
142
|
+
passed.append("Author attribution found")
|
|
143
|
+
else:
|
|
144
|
+
issues.append("No author info (AI prefers attributed content)")
|
|
145
|
+
|
|
146
|
+
# 4. Publication Date (Freshness signal)
|
|
147
|
+
date_patterns = ['datePublished', 'dateModified', 'datetime=', 'pubdate', 'article:published']
|
|
148
|
+
has_date = any(re.search(p, content, re.I) for p in date_patterns)
|
|
149
|
+
if has_date:
|
|
150
|
+
passed.append("Publication date found")
|
|
151
|
+
else:
|
|
152
|
+
issues.append("No publication date (freshness matters for AI)")
|
|
153
|
+
|
|
154
|
+
# 5. FAQ Section (Highly citable)
|
|
155
|
+
faq_patterns = [r'<details', r'faq', r'frequently.?asked', r'"FAQPage"']
|
|
156
|
+
has_faq = any(re.search(p, content, re.I) for p in faq_patterns)
|
|
157
|
+
if has_faq:
|
|
158
|
+
passed.append("FAQ section detected (highly citable)")
|
|
159
|
+
|
|
160
|
+
# 6. Lists (Structured content)
|
|
161
|
+
list_count = len(re.findall(r'<(ul|ol)[^>]*>', content, re.I))
|
|
162
|
+
if list_count >= 2:
|
|
163
|
+
passed.append(f"{list_count} lists (structured content)")
|
|
164
|
+
|
|
165
|
+
# 7. Tables (Comparison data)
|
|
166
|
+
table_count = len(re.findall(r'<table[^>]*>', content, re.I))
|
|
167
|
+
if table_count >= 1:
|
|
168
|
+
passed.append(f"{table_count} table(s) (comparison data)")
|
|
169
|
+
|
|
170
|
+
# 8. Entity Recognition (E-E-A-T signal) - NEW 2025
|
|
171
|
+
entity_patterns = [
|
|
172
|
+
r'"@type"\s*:\s*"Organization"',
|
|
173
|
+
r'"@type"\s*:\s*"LocalBusiness"',
|
|
174
|
+
r'"@type"\s*:\s*"Brand"',
|
|
175
|
+
r'itemtype.*schema\.org/(Organization|Person|Brand)',
|
|
176
|
+
r'rel="author"'
|
|
177
|
+
]
|
|
178
|
+
has_entity = any(re.search(p, content, re.I) for p in entity_patterns)
|
|
179
|
+
if has_entity:
|
|
180
|
+
passed.append("Entity/Brand recognition (E-E-A-T)")
|
|
181
|
+
|
|
182
|
+
# 9. Original Statistics/Data (AI citation magnet) - NEW 2025
|
|
183
|
+
stat_patterns = [
|
|
184
|
+
r'\d+%', # Percentages
|
|
185
|
+
r'\$[\d,]+', # Dollar amounts
|
|
186
|
+
r'study\s+(shows|found)', # Research citations
|
|
187
|
+
r'according to', # Source attribution
|
|
188
|
+
r'data\s+(shows|reveals)', # Data-backed claims
|
|
189
|
+
r'\d+x\s+(faster|better|more)', # Comparison stats
|
|
190
|
+
r'(million|billion|trillion)', # Large numbers
|
|
191
|
+
]
|
|
192
|
+
stat_matches = sum(1 for p in stat_patterns if re.search(p, content, re.I))
|
|
193
|
+
if stat_matches >= 2:
|
|
194
|
+
passed.append("Original statistics/data (citation magnet)")
|
|
195
|
+
|
|
196
|
+
# 10. Conversational/Direct answers - NEW 2025
|
|
197
|
+
direct_answer_patterns = [
|
|
198
|
+
r'is defined as',
|
|
199
|
+
r'refers to',
|
|
200
|
+
r'means that',
|
|
201
|
+
r'the answer is',
|
|
202
|
+
r'in short,',
|
|
203
|
+
r'simply put,',
|
|
204
|
+
r'<dfn'
|
|
205
|
+
]
|
|
206
|
+
has_direct = any(re.search(p, content, re.I) for p in direct_answer_patterns)
|
|
207
|
+
if has_direct:
|
|
208
|
+
passed.append("Direct answer patterns (LLM-friendly)")
|
|
209
|
+
|
|
210
|
+
# Calculate score
|
|
211
|
+
total = len(passed) + len(issues)
|
|
212
|
+
score = (len(passed) / total * 100) if total > 0 else 0
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
'file': str(file_path.name),
|
|
216
|
+
'passed': passed,
|
|
217
|
+
'issues': issues,
|
|
218
|
+
'score': round(score)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def main():
|
|
223
|
+
target = sys.argv[1] if len(sys.argv) > 1 else "."
|
|
224
|
+
target_path = Path(target).resolve()
|
|
225
|
+
|
|
226
|
+
print("\n" + "=" * 60)
|
|
227
|
+
print(" GEO CHECKER - AI Citation Readiness Audit")
|
|
228
|
+
print("=" * 60)
|
|
229
|
+
print(f"Project: {target_path}")
|
|
230
|
+
print("-" * 60)
|
|
231
|
+
|
|
232
|
+
# Find web pages only
|
|
233
|
+
pages = find_web_pages(target_path)
|
|
234
|
+
|
|
235
|
+
if not pages:
|
|
236
|
+
print("\n[!] No public web pages found.")
|
|
237
|
+
print(" Looking for: HTML, JSX, TSX files in pages/app directories")
|
|
238
|
+
print(" Skipping: docs, tests, config files, node_modules")
|
|
239
|
+
output = {"script": "geo_checker", "pages_found": 0, "passed": True}
|
|
240
|
+
print("\n" + json.dumps(output, indent=2))
|
|
241
|
+
sys.exit(0)
|
|
242
|
+
|
|
243
|
+
print(f"Found {len(pages)} public pages to analyze\n")
|
|
244
|
+
|
|
245
|
+
# Check each page
|
|
246
|
+
results = []
|
|
247
|
+
for page in pages:
|
|
248
|
+
result = check_page(page)
|
|
249
|
+
results.append(result)
|
|
250
|
+
|
|
251
|
+
# Print results
|
|
252
|
+
for result in results:
|
|
253
|
+
status = "[OK]" if result['score'] >= 60 else "[!]"
|
|
254
|
+
print(f"{status} {result['file']}: {result['score']}%")
|
|
255
|
+
if result['issues'] and result['score'] < 60:
|
|
256
|
+
for issue in result['issues'][:2]: # Show max 2 issues
|
|
257
|
+
print(f" - {issue}")
|
|
258
|
+
|
|
259
|
+
# Average score
|
|
260
|
+
avg_score = sum(r['score'] for r in results) / len(results) if results else 0
|
|
261
|
+
|
|
262
|
+
print("\n" + "=" * 60)
|
|
263
|
+
print(f"AVERAGE GEO SCORE: {avg_score:.0f}%")
|
|
264
|
+
print("=" * 60)
|
|
265
|
+
|
|
266
|
+
if avg_score >= 80:
|
|
267
|
+
print("[OK] Excellent - Content well-optimized for AI citations")
|
|
268
|
+
elif avg_score >= 60:
|
|
269
|
+
print("[OK] Good - Some improvements recommended")
|
|
270
|
+
elif avg_score >= 40:
|
|
271
|
+
print("[!] Needs work - Add structured elements")
|
|
272
|
+
else:
|
|
273
|
+
print("[X] Poor - Content needs GEO optimization")
|
|
274
|
+
|
|
275
|
+
# JSON output
|
|
276
|
+
output = {
|
|
277
|
+
"script": "geo_checker",
|
|
278
|
+
"project": str(target_path),
|
|
279
|
+
"pages_checked": len(results),
|
|
280
|
+
"average_score": round(avg_score),
|
|
281
|
+
"passed": avg_score >= 60
|
|
282
|
+
}
|
|
283
|
+
print("\n" + json.dumps(output, indent=2))
|
|
284
|
+
|
|
285
|
+
sys.exit(0 if avg_score >= 60 else 1)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
if __name__ == "__main__":
|
|
289
|
+
main()
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
CHART_DIR="${1:-.}"
|
|
5
|
+
RELEASE_NAME="test-release"
|
|
6
|
+
|
|
7
|
+
echo "═══════════════════════════════════════════════════════"
|
|
8
|
+
echo " Helm Chart Validation"
|
|
9
|
+
echo "═══════════════════════════════════════════════════════"
|
|
10
|
+
echo ""
|
|
11
|
+
|
|
12
|
+
# Colors
|
|
13
|
+
GREEN='\033[0;32m'
|
|
14
|
+
YELLOW='\033[1;33m'
|
|
15
|
+
RED='\033[0;31m'
|
|
16
|
+
NC='\033[0m' # No Color
|
|
17
|
+
|
|
18
|
+
success() {
|
|
19
|
+
echo -e "${GREEN}✓${NC} $1"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
warning() {
|
|
23
|
+
echo -e "${YELLOW}⚠${NC} $1"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
error() {
|
|
27
|
+
echo -e "${RED}✗${NC} $1"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Check if Helm is installed
|
|
31
|
+
if ! command -v helm &> /dev/null; then
|
|
32
|
+
error "Helm is not installed"
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
echo "📦 Chart directory: $CHART_DIR"
|
|
37
|
+
echo ""
|
|
38
|
+
|
|
39
|
+
# 1. Check chart structure
|
|
40
|
+
echo "1️⃣ Checking chart structure..."
|
|
41
|
+
if [ ! -f "$CHART_DIR/Chart.yaml" ]; then
|
|
42
|
+
error "Chart.yaml not found"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
success "Chart.yaml exists"
|
|
46
|
+
|
|
47
|
+
if [ ! -f "$CHART_DIR/values.yaml" ]; then
|
|
48
|
+
error "values.yaml not found"
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
success "values.yaml exists"
|
|
52
|
+
|
|
53
|
+
if [ ! -d "$CHART_DIR/templates" ]; then
|
|
54
|
+
error "templates/ directory not found"
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
success "templates/ directory exists"
|
|
58
|
+
echo ""
|
|
59
|
+
|
|
60
|
+
# 2. Lint the chart
|
|
61
|
+
echo "2️⃣ Linting chart..."
|
|
62
|
+
if helm lint "$CHART_DIR"; then
|
|
63
|
+
success "Chart passed lint"
|
|
64
|
+
else
|
|
65
|
+
error "Chart failed lint"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
echo ""
|
|
69
|
+
|
|
70
|
+
# 3. Check Chart.yaml
|
|
71
|
+
echo "3️⃣ Validating Chart.yaml..."
|
|
72
|
+
CHART_NAME=$(grep "^name:" "$CHART_DIR/Chart.yaml" | awk '{print $2}')
|
|
73
|
+
CHART_VERSION=$(grep "^version:" "$CHART_DIR/Chart.yaml" | awk '{print $2}')
|
|
74
|
+
APP_VERSION=$(grep "^appVersion:" "$CHART_DIR/Chart.yaml" | awk '{print $2}' | tr -d '"')
|
|
75
|
+
|
|
76
|
+
if [ -z "$CHART_NAME" ]; then
|
|
77
|
+
error "Chart name not found"
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
success "Chart name: $CHART_NAME"
|
|
81
|
+
|
|
82
|
+
if [ -z "$CHART_VERSION" ]; then
|
|
83
|
+
error "Chart version not found"
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
success "Chart version: $CHART_VERSION"
|
|
87
|
+
|
|
88
|
+
if [ -z "$APP_VERSION" ]; then
|
|
89
|
+
warning "App version not specified"
|
|
90
|
+
else
|
|
91
|
+
success "App version: $APP_VERSION"
|
|
92
|
+
fi
|
|
93
|
+
echo ""
|
|
94
|
+
|
|
95
|
+
# 4. Test template rendering
|
|
96
|
+
echo "4️⃣ Testing template rendering..."
|
|
97
|
+
if helm template "$RELEASE_NAME" "$CHART_DIR" > /dev/null 2>&1; then
|
|
98
|
+
success "Templates rendered successfully"
|
|
99
|
+
else
|
|
100
|
+
error "Template rendering failed"
|
|
101
|
+
helm template "$RELEASE_NAME" "$CHART_DIR"
|
|
102
|
+
exit 1
|
|
103
|
+
fi
|
|
104
|
+
echo ""
|
|
105
|
+
|
|
106
|
+
# 5. Dry-run installation
|
|
107
|
+
echo "5️⃣ Testing dry-run installation..."
|
|
108
|
+
if helm install "$RELEASE_NAME" "$CHART_DIR" --dry-run --debug > /dev/null 2>&1; then
|
|
109
|
+
success "Dry-run installation successful"
|
|
110
|
+
else
|
|
111
|
+
error "Dry-run installation failed"
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
echo ""
|
|
115
|
+
|
|
116
|
+
# 6. Check for required Kubernetes resources
|
|
117
|
+
echo "6️⃣ Checking generated resources..."
|
|
118
|
+
MANIFESTS=$(helm template "$RELEASE_NAME" "$CHART_DIR")
|
|
119
|
+
|
|
120
|
+
if echo "$MANIFESTS" | grep -q "kind: Deployment"; then
|
|
121
|
+
success "Deployment found"
|
|
122
|
+
else
|
|
123
|
+
warning "No Deployment found"
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
if echo "$MANIFESTS" | grep -q "kind: Service"; then
|
|
127
|
+
success "Service found"
|
|
128
|
+
else
|
|
129
|
+
warning "No Service found"
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
if echo "$MANIFESTS" | grep -q "kind: ServiceAccount"; then
|
|
133
|
+
success "ServiceAccount found"
|
|
134
|
+
else
|
|
135
|
+
warning "No ServiceAccount found"
|
|
136
|
+
fi
|
|
137
|
+
echo ""
|
|
138
|
+
|
|
139
|
+
# 7. Check for security best practices
|
|
140
|
+
echo "7️⃣ Checking security best practices..."
|
|
141
|
+
if echo "$MANIFESTS" | grep -q "runAsNonRoot: true"; then
|
|
142
|
+
success "Running as non-root user"
|
|
143
|
+
else
|
|
144
|
+
warning "Not explicitly running as non-root"
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
if echo "$MANIFESTS" | grep -q "readOnlyRootFilesystem: true"; then
|
|
148
|
+
success "Using read-only root filesystem"
|
|
149
|
+
else
|
|
150
|
+
warning "Not using read-only root filesystem"
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
if echo "$MANIFESTS" | grep -q "allowPrivilegeEscalation: false"; then
|
|
154
|
+
success "Privilege escalation disabled"
|
|
155
|
+
else
|
|
156
|
+
warning "Privilege escalation not explicitly disabled"
|
|
157
|
+
fi
|
|
158
|
+
echo ""
|
|
159
|
+
|
|
160
|
+
# 8. Check for resource limits
|
|
161
|
+
echo "8️⃣ Checking resource configuration..."
|
|
162
|
+
if echo "$MANIFESTS" | grep -q "resources:"; then
|
|
163
|
+
if echo "$MANIFESTS" | grep -q "limits:"; then
|
|
164
|
+
success "Resource limits defined"
|
|
165
|
+
else
|
|
166
|
+
warning "No resource limits defined"
|
|
167
|
+
fi
|
|
168
|
+
if echo "$MANIFESTS" | grep -q "requests:"; then
|
|
169
|
+
success "Resource requests defined"
|
|
170
|
+
else
|
|
171
|
+
warning "No resource requests defined"
|
|
172
|
+
fi
|
|
173
|
+
else
|
|
174
|
+
warning "No resources defined"
|
|
175
|
+
fi
|
|
176
|
+
echo ""
|
|
177
|
+
|
|
178
|
+
# 9. Check for health probes
|
|
179
|
+
echo "9️⃣ Checking health probes..."
|
|
180
|
+
if echo "$MANIFESTS" | grep -q "livenessProbe:"; then
|
|
181
|
+
success "Liveness probe configured"
|
|
182
|
+
else
|
|
183
|
+
warning "No liveness probe found"
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
if echo "$MANIFESTS" | grep -q "readinessProbe:"; then
|
|
187
|
+
success "Readiness probe configured"
|
|
188
|
+
else
|
|
189
|
+
warning "No readiness probe found"
|
|
190
|
+
fi
|
|
191
|
+
echo ""
|
|
192
|
+
|
|
193
|
+
# 10. Check dependencies
|
|
194
|
+
if [ -f "$CHART_DIR/Chart.yaml" ] && grep -q "^dependencies:" "$CHART_DIR/Chart.yaml"; then
|
|
195
|
+
echo "🔟 Checking dependencies..."
|
|
196
|
+
if helm dependency list "$CHART_DIR" > /dev/null 2>&1; then
|
|
197
|
+
success "Dependencies valid"
|
|
198
|
+
|
|
199
|
+
if [ -f "$CHART_DIR/Chart.lock" ]; then
|
|
200
|
+
success "Chart.lock file present"
|
|
201
|
+
else
|
|
202
|
+
warning "Chart.lock file missing (run 'helm dependency update')"
|
|
203
|
+
fi
|
|
204
|
+
else
|
|
205
|
+
error "Dependencies check failed"
|
|
206
|
+
fi
|
|
207
|
+
echo ""
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
# 11. Check for values schema
|
|
211
|
+
if [ -f "$CHART_DIR/values.schema.json" ]; then
|
|
212
|
+
echo "1️⃣1️⃣ Validating values schema..."
|
|
213
|
+
success "values.schema.json present"
|
|
214
|
+
|
|
215
|
+
# Validate schema if jq is available
|
|
216
|
+
if command -v jq &> /dev/null; then
|
|
217
|
+
if jq empty "$CHART_DIR/values.schema.json" 2>/dev/null; then
|
|
218
|
+
success "values.schema.json is valid JSON"
|
|
219
|
+
else
|
|
220
|
+
error "values.schema.json contains invalid JSON"
|
|
221
|
+
exit 1
|
|
222
|
+
fi
|
|
223
|
+
fi
|
|
224
|
+
echo ""
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# Summary
|
|
228
|
+
echo "═══════════════════════════════════════════════════════"
|
|
229
|
+
echo " Validation Complete!"
|
|
230
|
+
echo "═══════════════════════════════════════════════════════"
|
|
231
|
+
echo ""
|
|
232
|
+
echo "Chart: $CHART_NAME"
|
|
233
|
+
echo "Version: $CHART_VERSION"
|
|
234
|
+
if [ -n "$APP_VERSION" ]; then
|
|
235
|
+
echo "App Version: $APP_VERSION"
|
|
236
|
+
fi
|
|
237
|
+
echo ""
|
|
238
|
+
success "All validations passed!"
|
|
239
|
+
echo ""
|
|
240
|
+
echo "Next steps:"
|
|
241
|
+
echo " • helm package $CHART_DIR"
|
|
242
|
+
echo " • helm install my-release $CHART_DIR"
|
|
243
|
+
echo " • helm test my-release"
|
|
244
|
+
echo ""
|