@techwavedev/agi-agent-kit 1.6.0 → 1.6.3
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/CHANGELOG.md +65 -0
- package/README.md +104 -15
- package/package.json +2 -2
- package/templates/base/.env.example +28 -0
- package/templates/base/CHANGELOG.md +10 -0
- package/templates/base/docker-compose.aries.yml +47 -0
- package/templates/base/docker-compose.pulsar.yml +29 -0
- package/templates/base/execution/agent_events.py +349 -0
- package/templates/base/execution/blockchain_auth.py +515 -0
- package/templates/base/execution/dispatch_agent_team.py +24 -5
- package/templates/base/execution/memory_manager.py +142 -10
- package/templates/base/execution/run_test_scenario.py +109 -6
- package/templates/base/execution/session_boot.py +82 -0
- package/templates/base/execution/session_init.py +48 -4
- package/templates/base/execution/test_qdrant_handoff.py +578 -0
- package/templates/base/tests/test_agent_events.py +249 -0
- package/templates/base/tests/test_blockchain_auth.py +375 -0
- package/templates/base/tests/test_multi_tenancy.py +296 -0
- package/templates/skills/core/documentation/scripts/__pycache__/analyze_code.cpython-312.pyc +0 -0
- package/templates/skills/core/documentation/scripts/__pycache__/detect_changes.cpython-312.pyc +0 -0
- package/templates/skills/core/documentation/scripts/__pycache__/generate_changelog.cpython-312.pyc +0 -0
- package/templates/skills/core/documentation/scripts/__pycache__/sync_docs.cpython-312.pyc +0 -0
- package/templates/skills/core/documentation/scripts/__pycache__/update_skill_docs.cpython-312.pyc +0 -0
- package/templates/skills/core/pdf-reader/scripts/__pycache__/extract_text.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/benchmark_token_savings.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/bm25_index.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/embedding_utils.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/hybrid_search.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/init_collection.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/memory_retrieval.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/semantic_cache.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/__pycache__/test_skill.cpython-312.pyc +0 -0
- package/templates/skills/core/qdrant-memory/scripts/memory_retrieval.py +110 -10
- package/templates/skills/core/webcrawler/scripts/__pycache__/crawl_docs.cpython-312.pyc +0 -0
- package/templates/skills/core/webcrawler/scripts/__pycache__/extract_page.cpython-312.pyc +0 -0
- package/templates/skills/core/webcrawler/scripts/__pycache__/filter_docs.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/dispatching-parallel-agents/SKILL.md +4 -2
- package/templates/skills/extended/ai-agents/last30days/scripts/__pycache__/last30days.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/cache.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/dates.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/dedupe.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/env.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/http.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/models.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/normalize.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/openai_reddit.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/reddit_enrich.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/render.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/schema.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/score.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/ui.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/websearch.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/scripts/lib/__pycache__/xai_x.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_cache.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_dates.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_dedupe.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_models.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_normalize.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_render.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/last30days/tests/__pycache__/test_score.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/llm-structured-output/SKILL.md +257 -0
- package/templates/skills/extended/ai-agents/voice-ai-engine-development/examples/__pycache__/complete_voice_engine.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/voice-ai-engine-development/examples/__pycache__/gemini_agent_example.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/voice-ai-engine-development/examples/__pycache__/interrupt_system_example.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/voice-ai-engine-development/templates/__pycache__/base_worker_template.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/voice-ai-engine-development/templates/__pycache__/multi_provider_factory_template.cpython-312.pyc +0 -0
- package/templates/skills/extended/ai-agents/youtube-summarizer/scripts/__pycache__/extract-transcript.cpython-312.pyc +0 -0
- package/templates/skills/extended/backend/senior-architect/scripts/__pycache__/architecture_diagram_generator.cpython-312.pyc +0 -0
- package/templates/skills/extended/backend/senior-architect/scripts/__pycache__/dependency_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/backend/senior-architect/scripts/__pycache__/project_architect.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/check_bounding_boxes.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/check_bounding_boxes_test.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/check_fillable_fields.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/convert_pdf_to_images.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/create_validation_image.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/extract_form_field_info.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/fill_fillable_fields.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf/scripts/__pycache__/fill_pdf_form_with_annotations.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/check_bounding_boxes.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/check_bounding_boxes_test.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/check_fillable_fields.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/convert_pdf_to_images.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/create_validation_image.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/extract_form_field_info.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/fill_fillable_fields.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/pdf-official/scripts/__pycache__/fill_pdf_form_with_annotations.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/xlsx/__pycache__/recalc.cpython-312.pyc +0 -0
- package/templates/skills/extended/data/xlsx-official/__pycache__/recalc.cpython-312.pyc +0 -0
- package/templates/skills/extended/debugging/systematic-debugging/SKILL.md +587 -229
- package/templates/skills/extended/devops/capi-mcp-gateway/SKILL.md +389 -0
- package/templates/skills/extended/devops/capi-mcp-gateway/references/agent_loop.md +237 -0
- package/templates/skills/extended/devops/capi-mcp-gateway/references/configuration.md +200 -0
- package/templates/skills/extended/devops/capi-mcp-gateway/references/security.md +199 -0
- package/templates/skills/extended/devops/capi-mcp-gateway/scripts/__pycache__/capi_mcp_client.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/capi-mcp-gateway/scripts/capi_mcp_client.py +255 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/0.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/1.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/10.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/100.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/101.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/102.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/103.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/104.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/105.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/106.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/107.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/108.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/109.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/11.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/110.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/111.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/112.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/113.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/114.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/115.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/116.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/117.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/118.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/119.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/12.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/120.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/121.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/122.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/123.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/124.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/125.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/126.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/127.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/128.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/129.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/13.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/130.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/131.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/132.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/133.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/134.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/135.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/136.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/137.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/138.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/139.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/14.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/140.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/141.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/142.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/143.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/144.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/145.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/146.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/147.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/148.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/149.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/15.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/150.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/151.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/152.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/153.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/154.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/155.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/156.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/157.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/158.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/159.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/16.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/160.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/161.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/162.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/163.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/17.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/18.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/19.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/2.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/20.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/21.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/22.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/23.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/24.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/25.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/26.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/27.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/28.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/29.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/3.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/30.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/31.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/32.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/33.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/34.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/35.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/36.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/37.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/38.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/39.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/4.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/40.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/41.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/42.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/43.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/44.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/45.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/46.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/47.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/48.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/49.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/5.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/50.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/51.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/52.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/53.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/54.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/55.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/56.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/57.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/58.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/59.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/6.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/60.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/61.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/62.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/63.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/64.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/65.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/66.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/67.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/68.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/69.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/7.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/70.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/71.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/72.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/73.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/74.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/75.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/76.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/77.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/78.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/79.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/8.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/80.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/81.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/82.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/83.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/84.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/85.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/86.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/87.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/88.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/89.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/9.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/90.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/91.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/92.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/93.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/94.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/95.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/96.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/97.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/98.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/2026-01-05-00-49-17/humaneval-solutions/__pycache__/99.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/0.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/1.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/10.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/100.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/101.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/102.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/103.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/104.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/105.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/106.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/107.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/108.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/109.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/11.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/110.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/111.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/112.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/113.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/114.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/115.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/116.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/117.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/118.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/119.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/12.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/120.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/121.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/122.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/123.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/124.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/125.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/126.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/127.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/128.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/129.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/13.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/130.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/131.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/132.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/133.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/134.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/135.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/136.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/137.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/138.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/139.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/14.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/140.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/141.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/142.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/143.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/144.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/145.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/146.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/147.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/148.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/149.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/15.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/150.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/151.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/152.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/153.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/154.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/155.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/156.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/157.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/158.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/159.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/16.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/160.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/161.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/162.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/163.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/17.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/18.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/19.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/2.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/20.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/21.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/22.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/23.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/24.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/25.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/26.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/27.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/28.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/29.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/3.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/30.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/31.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/32.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/33.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/34.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/35.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/36.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/37.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/38.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/39.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/4.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/40.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/41.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/42.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/43.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/44.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/45.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/46.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/47.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/48.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/49.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/5.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/50.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/51.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/52.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/53.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/54.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/55.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/56.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/57.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/58.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/59.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/6.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/60.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/61.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/62.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/63.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/64.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/65.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/66.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/67.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/68.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/69.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/7.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/70.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/71.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/72.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/73.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/74.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/75.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/76.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/77.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/78.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/79.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/8.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/80.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/81.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/82.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/83.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/84.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/85.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/86.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/87.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/88.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/89.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/9.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/90.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/91.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/92.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/93.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/94.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/95.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/96.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/97.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/98.cpython-312.pyc +0 -0
- package/templates/skills/extended/devops/loki-mode/benchmarks/results/humaneval-loki-solutions/__pycache__/99.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/scripts/__pycache__/document.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx/scripts/__pycache__/utilities.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/scripts/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/scripts/__pycache__/document.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/docx-official/scripts/__pycache__/utilities.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/product-manager-toolkit/scripts/__pycache__/customer_interview_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/documentation/product-manager-toolkit/scripts/__pycache__/rice_prioritizer.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/scripts/__pycache__/inventory.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/scripts/__pycache__/rearrange.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/scripts/__pycache__/replace.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx/scripts/__pycache__/thumbnail.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/__pycache__/pack.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/__pycache__/unpack.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/__pycache__/validate.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/validation/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/validation/__pycache__/base.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/validation/__pycache__/docx.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/validation/__pycache__/pptx.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/ooxml/scripts/validation/__pycache__/redlining.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/scripts/__pycache__/inventory.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/scripts/__pycache__/rearrange.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/scripts/__pycache__/replace.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/pptx-official/scripts/__pycache__/thumbnail.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/senior-fullstack/scripts/__pycache__/code_quality_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/senior-fullstack/scripts/__pycache__/fullstack_scaffolder.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/senior-fullstack/scripts/__pycache__/project_scaffolder.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/skill-creator/scripts/__pycache__/init_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/skill-creator/scripts/__pycache__/package_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/skill-creator/scripts/__pycache__/quick_validate.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/cli/assets/data/__pycache__/_sync_all.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/cli/assets/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/cli/assets/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/cli/assets/scripts/__pycache__/search.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/scripts/__pycache__/search.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/scripts/design_system.py +2 -1
- package/templates/skills/extended/frontend/ui-ux-pro-max/src/ui-ux-pro-max/data/__pycache__/_sync_all.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/src/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/src/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/templates/skills/extended/frontend/ui-ux-pro-max/src/ui-ux-pro-max/scripts/__pycache__/search.cpython-312.pyc +0 -0
- package/templates/skills/extended/gaming/audio-transcriber/scripts/__pycache__/transcribe.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/ab_test_planner.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/aso_scorer.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/competitor_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/keyword_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/launch_checklist.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/localization_helper.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/metadata_optimizer.cpython-312.pyc +0 -0
- package/templates/skills/extended/mobile/app-store-optimization/__pycache__/review_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/__pycache__/full_audit.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/__pycache__/quick_scan.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/__pycache__/score_calculator.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/scanners/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/scanners/__pycache__/dependency_scanner.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/scanners/__pycache__/injection_scanner.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/007/scripts/scanners/__pycache__/secrets_scanner.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/acceptance-orchestrator/SKILL.md +152 -0
- package/templates/skills/extended/other/agent-orchestrator/scripts/__pycache__/match_skills.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/agent-orchestrator/scripts/__pycache__/orchestrate.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/agent-orchestrator/scripts/__pycache__/scan_registry.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/ai-studio-image/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/ai-studio-image/scripts/__pycache__/generate.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/ai-studio-image/scripts/__pycache__/prompt_engine.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/ai-studio-image/scripts/__pycache__/templates.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/antigravity-skill-orchestrator/README.md +32 -0
- package/templates/skills/extended/other/antigravity-skill-orchestrator/SKILL.md +169 -0
- package/templates/skills/extended/other/claude-monitor/scripts/__pycache__/api_bench.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/claude-monitor/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/claude-monitor/scripts/__pycache__/health_check.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/claude-monitor/scripts/__pycache__/monitor.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/closed-loop-delivery/SKILL.md +163 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/active_context.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/compressor.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/context_loader.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/context_manager.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/models.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/project_registry.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/search.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/session_parser.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-agent/scripts/__pycache__/session_summary.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/context-guardian/scripts/__pycache__/context_snapshot.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/create-issue-gate/SKILL.md +131 -0
- package/templates/skills/extended/other/electron-development/SKILL.md +902 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/account_setup.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/analyze.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/api_client.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/auth.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/comments.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/db.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/export.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/hashtags.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/insights.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/media.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/messages.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/profile.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/publish.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/run_all.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/schedule.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/serve_api.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/instagram/scripts/__pycache__/templates.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/interview-coach/SKILL.md +135 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/__pycache__/db.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/__pycache__/export.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/__pycache__/run_all.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/__pycache__/serve_api.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/__pycache__/web_scraper_fallback.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/base_scraper.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/generic_scraper.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucap.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/juceac.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/juceal.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/juceb.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucec.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucema.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucemg.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucep.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucepa.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucepar.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucepe.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucepi.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucer.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucerja.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucern.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucesc.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucesp.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucetins.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucis_df.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/jucisrs.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/junta-leiloeiros/scripts/scraper/__pycache__/states.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-avaliacao/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-edital/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-ia/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-juridico/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-mercado/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/leiloeiro-risco/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/matematico-tao/scripts/__pycache__/complexity_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/matematico-tao/scripts/__pycache__/dependency_graph.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/oss-hunter/bin/__pycache__/hunter.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/pipecat-friday-agent/scripts/__pycache__/friday_agent.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/senior-frontend/scripts/__pycache__/bundle_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/senior-frontend/scripts/__pycache__/component_generator.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/senior-frontend/scripts/__pycache__/frontend_scaffolder.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-installer/scripts/__pycache__/detect_skills.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-installer/scripts/__pycache__/install_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-installer/scripts/__pycache__/package_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-installer/scripts/__pycache__/validate_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/cost_optimizer.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/db.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/governance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/recommender.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/report_generator.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/run_audit.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/__pycache__/scanner.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/code_quality.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/cross_skill.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/dependencies.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/documentation.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/governance_audit.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/performance.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/skill-sentinel/scripts/analyzers/__pycache__/security.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/stability-ai/scripts/__pycache__/config.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/stability-ai/scripts/__pycache__/generate.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/stability-ai/scripts/__pycache__/styles.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/telegram/assets/boilerplate/python/__pycache__/bot.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/telegram/assets/boilerplate/python/__pycache__/webhook_server.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/telegram/scripts/__pycache__/send_message.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/telegram/scripts/__pycache__/setup_project.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/telegram/scripts/__pycache__/test_bot.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/typescript-expert/scripts/__pycache__/ts_diagnostic.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/videodb/scripts/__pycache__/ws_listener.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/assets/boilerplate/python/__pycache__/app.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/assets/boilerplate/python/__pycache__/template_manager.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/assets/boilerplate/python/__pycache__/webhook_handler.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/assets/boilerplate/python/__pycache__/whatsapp_client.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/scripts/__pycache__/send_test_message.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/scripts/__pycache__/setup_project.cpython-312.pyc +0 -0
- package/templates/skills/extended/other/whatsapp-cloud-api/scripts/__pycache__/validate_config.cpython-312.pyc +0 -0
- package/templates/skills/extended/security/privacy-by-design/README.md +25 -0
- package/templates/skills/extended/security/privacy-by-design/SKILL.md +259 -0
- package/templates/skills/extended/workflow/finishing-a-development-branch/SKILL.md +6 -1
- package/templates/skills/extended/workflow/slack-gif-creator/core/__pycache__/easing.cpython-312.pyc +0 -0
- package/templates/skills/extended/workflow/slack-gif-creator/core/__pycache__/frame_composer.cpython-312.pyc +0 -0
- package/templates/skills/extended/workflow/slack-gif-creator/core/__pycache__/gif_builder.cpython-312.pyc +0 -0
- package/templates/skills/extended/workflow/slack-gif-creator/core/__pycache__/validators.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/ai-agents/prompt-engineering-patterns/scripts/__pycache__/optimize-prompt.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/backend/api-design-principles/assets/__pycache__/rest-api-template.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/backend/api-patterns/scripts/__pycache__/api_validator.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/backend/database-design/scripts/__pycache__/schema_validator.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/content/content-creator/scripts/__pycache__/brand_voice_analyzer.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/content/content-creator/scripts/__pycache__/seo_optimizer.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/content/geo-fundamentals/scripts/__pycache__/geo_checker.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/content/seo-fundamentals/scripts/__pycache__/seo_checker.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/debugging/performance-profiling/scripts/__pycache__/lighthouse_audit.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/frontend/frontend-design/scripts/__pycache__/accessibility_checker.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/frontend/frontend-design/scripts/__pycache__/ux_audit.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/frontend/stitch-loop/SKILL.md +108 -115
- package/templates/skills/knowledge/i18n/i18n-localization/scripts/__pycache__/i18n_checker.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/mobile/mobile-design/scripts/__pycache__/mobile_audit.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/security/vulnerability-scanner/scripts/__pycache__/security_scan.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/testing/lint-and-validate/scripts/__pycache__/lint_runner.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/testing/lint-and-validate/scripts/__pycache__/type_coverage.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/testing/testing-patterns/scripts/__pycache__/test_runner.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/testing/webapp-testing/scripts/__pycache__/playwright_runner.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/workflow/plugin-discovery/scripts/__pycache__/platform_setup.cpython-312.pyc +0 -0
- package/templates/skills/knowledge/workflow/self-update/scripts/__pycache__/update_kit.cpython-312.pyc +0 -0
|
@@ -0,0 +1,902 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: electron-development
|
|
3
|
+
description: "Master Electron desktop app development with secure IPC, contextIsolation, preload scripts, multi-process architecture, electron-builder packaging, code signing, and auto-update."
|
|
4
|
+
risk: safe
|
|
5
|
+
source: community
|
|
6
|
+
date_added: "2026-03-12"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Electron Development
|
|
10
|
+
|
|
11
|
+
You are a senior Electron engineer specializing in secure, production-grade desktop application architecture. You have deep expertise in Electron's multi-process model, IPC security patterns, native OS integration, application packaging, code signing, and auto-update strategies.
|
|
12
|
+
|
|
13
|
+
## Use this skill when
|
|
14
|
+
|
|
15
|
+
- Building new Electron desktop applications from scratch
|
|
16
|
+
- Securing an Electron app (contextIsolation, sandbox, CSP, nodeIntegration)
|
|
17
|
+
- Setting up IPC communication between main, renderer, and preload processes
|
|
18
|
+
- Packaging and distributing Electron apps with electron-builder or electron-forge
|
|
19
|
+
- Implementing auto-update with electron-updater
|
|
20
|
+
- Debugging main process issues or renderer crashes
|
|
21
|
+
- Managing multiple windows and application lifecycle
|
|
22
|
+
- Integrating native OS features (menus, tray, notifications, file system dialogs)
|
|
23
|
+
- Optimizing Electron app performance and bundle size
|
|
24
|
+
|
|
25
|
+
## Do not use this skill when
|
|
26
|
+
|
|
27
|
+
- Building web-only applications without desktop distribution → use `react-patterns`, `nextjs-best-practices`
|
|
28
|
+
- Building Tauri apps (Rust-based desktop alternative) → use `tauri-development` if available
|
|
29
|
+
- Building Chrome extensions → use `chrome-extension-developer`
|
|
30
|
+
- Implementing deep backend/server logic → use `nodejs-backend-patterns`
|
|
31
|
+
- Building mobile apps → use `react-native-architecture` or `flutter-expert`
|
|
32
|
+
|
|
33
|
+
## Instructions
|
|
34
|
+
|
|
35
|
+
1. Analyze the project structure and identify process boundaries.
|
|
36
|
+
2. Enforce security defaults: `contextIsolation: true`, `nodeIntegration: false`, `sandbox: true`.
|
|
37
|
+
3. Design IPC channels with explicit whitelisting in the preload script.
|
|
38
|
+
4. Implement, test, and build with appropriate tooling.
|
|
39
|
+
5. Validate against the Production Security Checklist before shipping.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Core Expertise Areas
|
|
44
|
+
|
|
45
|
+
### 1. Project Structure & Architecture
|
|
46
|
+
|
|
47
|
+
**Recommended project layout:**
|
|
48
|
+
```
|
|
49
|
+
my-electron-app/
|
|
50
|
+
├── package.json
|
|
51
|
+
├── electron-builder.yml # or forge.config.ts
|
|
52
|
+
├── src/
|
|
53
|
+
│ ├── main/
|
|
54
|
+
│ │ ├── main.ts # Main process entry
|
|
55
|
+
│ │ ├── ipc-handlers.ts # IPC channel handlers
|
|
56
|
+
│ │ ├── menu.ts # Application menu
|
|
57
|
+
│ │ ├── tray.ts # System tray
|
|
58
|
+
│ │ └── updater.ts # Auto-update logic
|
|
59
|
+
│ ├── preload/
|
|
60
|
+
│ │ └── preload.ts # Bridge between main ↔ renderer
|
|
61
|
+
│ ├── renderer/
|
|
62
|
+
│ │ ├── index.html # Entry HTML
|
|
63
|
+
│ │ ├── App.tsx # UI root (React/Vue/Svelte/vanilla)
|
|
64
|
+
│ │ ├── components/
|
|
65
|
+
│ │ └── styles/
|
|
66
|
+
│ └── shared/
|
|
67
|
+
│ ├── constants.ts # IPC channel names, shared enums
|
|
68
|
+
│ └── types.ts # Shared TypeScript interfaces
|
|
69
|
+
├── resources/
|
|
70
|
+
│ ├── icon.png # App icon (1024x1024)
|
|
71
|
+
│ └── entitlements.mac.plist # macOS entitlements
|
|
72
|
+
├── tests/
|
|
73
|
+
│ ├── unit/
|
|
74
|
+
│ └── e2e/
|
|
75
|
+
└── tsconfig.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Key architectural principles:**
|
|
79
|
+
- **Separate entry points**: Main, preload, and renderer each have their own build configuration.
|
|
80
|
+
- **Shared types, not shared modules**: The `shared/` directory contains only types, constants, and enums — never executable code imported across process boundaries.
|
|
81
|
+
- **Keep main process lean**: Main should orchestrate windows, handle IPC, and manage app lifecycle. Business logic belongs in the renderer or dedicated worker processes.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
### 2. Process Model (Main / Renderer / Preload / Utility)
|
|
86
|
+
|
|
87
|
+
Electron runs **multiple processes** that are isolated by design:
|
|
88
|
+
|
|
89
|
+
| Process | Role | Node.js Access | DOM Access |
|
|
90
|
+
|---------|------|----------------|------------|
|
|
91
|
+
| **Main** | App lifecycle, windows, native APIs, IPC hub | ✅ Full | ❌ None |
|
|
92
|
+
| **Renderer** | UI rendering, user interaction | ❌ None (by default) | ✅ Full |
|
|
93
|
+
| **Preload** | Secure bridge between main and renderer | ✅ Limited (via contextBridge) | ✅ Before page loads |
|
|
94
|
+
| **Utility** | CPU-intensive tasks, background work | ✅ Full | ❌ None |
|
|
95
|
+
|
|
96
|
+
**BrowserWindow with security defaults (MANDATORY):**
|
|
97
|
+
```typescript
|
|
98
|
+
import { BrowserWindow } from 'electron';
|
|
99
|
+
import path from 'node:path';
|
|
100
|
+
|
|
101
|
+
function createMainWindow(): BrowserWindow {
|
|
102
|
+
const win = new BrowserWindow({
|
|
103
|
+
width: 1200,
|
|
104
|
+
height: 800,
|
|
105
|
+
webPreferences: {
|
|
106
|
+
// ── SECURITY DEFAULTS (NEVER CHANGE THESE) ──
|
|
107
|
+
contextIsolation: true, // Isolates preload from renderer context
|
|
108
|
+
nodeIntegration: false, // Prevents require() in renderer
|
|
109
|
+
sandbox: true, // OS-level process sandboxing
|
|
110
|
+
|
|
111
|
+
// ── PRELOAD SCRIPT ──
|
|
112
|
+
preload: path.join(__dirname, '../preload/preload.js'),
|
|
113
|
+
|
|
114
|
+
// ── ADDITIONAL HARDENING ──
|
|
115
|
+
webSecurity: true, // Enforce same-origin policy
|
|
116
|
+
allowRunningInsecureContent: false,
|
|
117
|
+
experimentalFeatures: false,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Content Security Policy
|
|
122
|
+
win.webContents.session.webRequest.onHeadersReceived((details, callback) => {
|
|
123
|
+
callback({
|
|
124
|
+
responseHeaders: {
|
|
125
|
+
...details.responseHeaders,
|
|
126
|
+
'Content-Security-Policy': [
|
|
127
|
+
"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:;"
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
return win;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
> ⚠️ **CRITICAL**: Never set `nodeIntegration: true` or `contextIsolation: false` in production. These settings expose the renderer to remote code execution (RCE) attacks through XSS vulnerabilities.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### 3. Secure IPC Communication
|
|
142
|
+
|
|
143
|
+
IPC is the **only** safe channel for communication between main and renderer processes. All IPC must flow through the preload script.
|
|
144
|
+
|
|
145
|
+
**Preload script (contextBridge + explicit whitelisting):**
|
|
146
|
+
```typescript
|
|
147
|
+
// src/preload/preload.ts
|
|
148
|
+
import { contextBridge, ipcRenderer } from 'electron';
|
|
149
|
+
|
|
150
|
+
// ── WHITELIST: Only expose specific channels ──
|
|
151
|
+
const ALLOWED_SEND_CHANNELS = [
|
|
152
|
+
'file:save',
|
|
153
|
+
'file:open',
|
|
154
|
+
'app:get-version',
|
|
155
|
+
'dialog:show-open',
|
|
156
|
+
] as const;
|
|
157
|
+
|
|
158
|
+
const ALLOWED_RECEIVE_CHANNELS = [
|
|
159
|
+
'file:saved',
|
|
160
|
+
'file:opened',
|
|
161
|
+
'app:version',
|
|
162
|
+
'update:available',
|
|
163
|
+
'update:progress',
|
|
164
|
+
'update:downloaded',
|
|
165
|
+
'update:error',
|
|
166
|
+
] as const;
|
|
167
|
+
|
|
168
|
+
type SendChannel = typeof ALLOWED_SEND_CHANNELS[number];
|
|
169
|
+
type ReceiveChannel = typeof ALLOWED_RECEIVE_CHANNELS[number];
|
|
170
|
+
|
|
171
|
+
contextBridge.exposeInMainWorld('electronAPI', {
|
|
172
|
+
// One-way: renderer → main
|
|
173
|
+
send: (channel: SendChannel, ...args: unknown[]) => {
|
|
174
|
+
if (ALLOWED_SEND_CHANNELS.includes(channel)) {
|
|
175
|
+
ipcRenderer.send(channel, ...args);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
// Two-way: renderer → main → renderer (request/response)
|
|
180
|
+
invoke: (channel: SendChannel, ...args: unknown[]) => {
|
|
181
|
+
if (ALLOWED_SEND_CHANNELS.includes(channel)) {
|
|
182
|
+
return ipcRenderer.invoke(channel, ...args);
|
|
183
|
+
}
|
|
184
|
+
return Promise.reject(new Error(`Channel "${channel}" is not allowed`));
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
// One-way: main → renderer (subscriptions)
|
|
188
|
+
on: (channel: ReceiveChannel, callback: (...args: unknown[]) => void) => {
|
|
189
|
+
if (ALLOWED_RECEIVE_CHANNELS.includes(channel)) {
|
|
190
|
+
const listener = (_event: Electron.IpcRendererEvent, ...args: unknown[]) => callback(...args);
|
|
191
|
+
ipcRenderer.on(channel, listener);
|
|
192
|
+
return () => ipcRenderer.removeListener(channel, listener);
|
|
193
|
+
}
|
|
194
|
+
return () => {};
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Main process IPC handlers:**
|
|
200
|
+
```typescript
|
|
201
|
+
// src/main/ipc-handlers.ts
|
|
202
|
+
import { ipcMain, dialog, BrowserWindow } from 'electron';
|
|
203
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
204
|
+
|
|
205
|
+
export function registerIpcHandlers(): void {
|
|
206
|
+
// invoke() pattern: returns a value to the renderer
|
|
207
|
+
ipcMain.handle('file:open', async () => {
|
|
208
|
+
const { canceled, filePaths } = await dialog.showOpenDialog({
|
|
209
|
+
properties: ['openFile'],
|
|
210
|
+
filters: [{ name: 'Text Files', extensions: ['txt', 'md'] }],
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
if (canceled || filePaths.length === 0) return null;
|
|
214
|
+
|
|
215
|
+
const content = await readFile(filePaths[0], 'utf-8');
|
|
216
|
+
return { path: filePaths[0], content };
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
ipcMain.handle('file:save', async (_event, filePath: string, content: string) => {
|
|
220
|
+
// VALIDATE INPUTS — never trust renderer data blindly
|
|
221
|
+
if (typeof filePath !== 'string' || typeof content !== 'string') {
|
|
222
|
+
throw new Error('Invalid arguments');
|
|
223
|
+
}
|
|
224
|
+
await writeFile(filePath, content, 'utf-8');
|
|
225
|
+
return { success: true };
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
ipcMain.handle('app:get-version', () => {
|
|
229
|
+
return process.versions.electron;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Renderer usage (type-safe):**
|
|
235
|
+
```typescript
|
|
236
|
+
// src/renderer/App.tsx — or any renderer code
|
|
237
|
+
// The electronAPI is globally available via contextBridge
|
|
238
|
+
|
|
239
|
+
declare global {
|
|
240
|
+
interface Window {
|
|
241
|
+
electronAPI: {
|
|
242
|
+
send: (channel: string, ...args: unknown[]) => void;
|
|
243
|
+
invoke: (channel: string, ...args: unknown[]) => Promise<unknown>;
|
|
244
|
+
on: (channel: string, callback: (...args: unknown[]) => void) => () => void;
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Open a file via IPC
|
|
250
|
+
async function openFile() {
|
|
251
|
+
const result = await window.electronAPI.invoke('file:open');
|
|
252
|
+
if (result) {
|
|
253
|
+
console.log('File content:', result.content);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Subscribe to updates from main process
|
|
258
|
+
const unsubscribe = window.electronAPI.on('update:available', (version) => {
|
|
259
|
+
console.log('Update available:', version);
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Cleanup on unmount
|
|
263
|
+
// unsubscribe();
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**IPC Pattern Summary:**
|
|
267
|
+
|
|
268
|
+
| Pattern | Method | Use Case |
|
|
269
|
+
|---------|--------|----------|
|
|
270
|
+
| **Fire-and-forget** | `ipcRenderer.send()` → `ipcMain.on()` | Logging, telemetry, non-critical notifications |
|
|
271
|
+
| **Request/Response** | `ipcRenderer.invoke()` → `ipcMain.handle()` | File operations, dialogs, data queries |
|
|
272
|
+
| **Push to renderer** | `webContents.send()` → `ipcRenderer.on()` | Progress updates, download status, auto-update |
|
|
273
|
+
|
|
274
|
+
> ⚠️ **Never** use `ipcRenderer.sendSync()` in production — it blocks the renderer's event loop and freezes the UI.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
### 4. Security Hardening
|
|
279
|
+
|
|
280
|
+
#### Production Security Checklist
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
── MANDATORY ──
|
|
284
|
+
[ ] contextIsolation: true
|
|
285
|
+
[ ] nodeIntegration: false
|
|
286
|
+
[ ] sandbox: true
|
|
287
|
+
[ ] webSecurity: true
|
|
288
|
+
[ ] allowRunningInsecureContent: false
|
|
289
|
+
|
|
290
|
+
── IPC ──
|
|
291
|
+
[ ] Preload uses contextBridge with explicit channel whitelisting
|
|
292
|
+
[ ] All IPC inputs are validated in the main process
|
|
293
|
+
[ ] No raw ipcRenderer exposed to renderer context
|
|
294
|
+
[ ] No use of ipcRenderer.sendSync()
|
|
295
|
+
|
|
296
|
+
── CONTENT ──
|
|
297
|
+
[ ] Content Security Policy (CSP) headers set on all windows
|
|
298
|
+
[ ] No use of eval(), new Function(), or innerHTML with untrusted data
|
|
299
|
+
[ ] Remote content (if any) loaded in separate BrowserView with restricted permissions
|
|
300
|
+
[ ] protocol.registerSchemesAsPrivileged() uses minimal permissions
|
|
301
|
+
|
|
302
|
+
── NAVIGATION ──
|
|
303
|
+
[ ] webContents 'will-navigate' event intercepted — block unexpected URLs
|
|
304
|
+
[ ] webContents 'new-window' event intercepted — prevent pop-up exploitation
|
|
305
|
+
[ ] No shell.openExternal() with unsanitized URLs
|
|
306
|
+
|
|
307
|
+
── PACKAGING ──
|
|
308
|
+
[ ] ASAR archive enabled (protects source from casual inspection)
|
|
309
|
+
[ ] No sensitive credentials or API keys bundled in the app
|
|
310
|
+
[ ] Code signing configured for both Windows and macOS
|
|
311
|
+
[ ] Auto-update uses HTTPS and verifies signatures
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Preventing Navigation Hijacking:**
|
|
315
|
+
```typescript
|
|
316
|
+
// In main process, after creating a BrowserWindow
|
|
317
|
+
win.webContents.on('will-navigate', (event, url) => {
|
|
318
|
+
const parsedUrl = new URL(url);
|
|
319
|
+
// Only allow navigation within your app
|
|
320
|
+
if (parsedUrl.origin !== 'http://localhost:5173') { // dev server
|
|
321
|
+
event.preventDefault();
|
|
322
|
+
console.warn(`Blocked navigation to: ${url}`);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// Prevent new windows from being opened
|
|
327
|
+
win.webContents.setWindowOpenHandler(({ url }) => {
|
|
328
|
+
try {
|
|
329
|
+
const externalUrl = new URL(url);
|
|
330
|
+
const allowedHosts = new Set(['example.com', 'docs.example.com']);
|
|
331
|
+
|
|
332
|
+
// Never forward raw renderer-controlled URLs to the OS.
|
|
333
|
+
// Unvalidated links can enable phishing or abuse platform URL handlers.
|
|
334
|
+
if (externalUrl.protocol === 'https:' && allowedHosts.has(externalUrl.hostname)) {
|
|
335
|
+
require('electron').shell.openExternal(externalUrl.toString());
|
|
336
|
+
} else {
|
|
337
|
+
console.warn(`Blocked external URL: ${url}`);
|
|
338
|
+
}
|
|
339
|
+
} catch {
|
|
340
|
+
console.warn(`Rejected invalid external URL: ${url}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return { action: 'deny' }; // Block all new Electron windows
|
|
344
|
+
});
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Custom Protocol Registration (secure):**
|
|
348
|
+
```typescript
|
|
349
|
+
import { protocol } from 'electron';
|
|
350
|
+
import path from 'node:path';
|
|
351
|
+
import { readFile } from 'node:fs/promises';
|
|
352
|
+
import { URL } from 'node:url';
|
|
353
|
+
|
|
354
|
+
// Register a custom protocol for loading local assets securely
|
|
355
|
+
protocol.registerSchemesAsPrivileged([
|
|
356
|
+
{ scheme: 'app', privileges: { standard: true, secure: true, supportFetchAPI: true } },
|
|
357
|
+
]);
|
|
358
|
+
|
|
359
|
+
app.whenReady().then(() => {
|
|
360
|
+
protocol.handle('app', async (request) => {
|
|
361
|
+
const url = new URL(request.url);
|
|
362
|
+
const baseDir = path.resolve(__dirname, '../renderer');
|
|
363
|
+
// Strip the leading slash so path.resolve keeps baseDir as the root.
|
|
364
|
+
const relativePath = path.normalize(decodeURIComponent(url.pathname).replace(/^[/\\]+/, ''));
|
|
365
|
+
const filePath = path.resolve(baseDir, relativePath);
|
|
366
|
+
|
|
367
|
+
if (!filePath.startsWith(baseDir)) {
|
|
368
|
+
return new Response('Forbidden', { status: 403 });
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const data = await readFile(filePath);
|
|
372
|
+
return new Response(data);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
### 5. State Management Across Processes
|
|
380
|
+
|
|
381
|
+
**Strategy 1: Main process as single source of truth (recommended for most apps)**
|
|
382
|
+
```typescript
|
|
383
|
+
// src/main/store.ts
|
|
384
|
+
import { app } from 'electron';
|
|
385
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
386
|
+
import path from 'node:path';
|
|
387
|
+
|
|
388
|
+
interface AppState {
|
|
389
|
+
theme: 'light' | 'dark';
|
|
390
|
+
recentFiles: string[];
|
|
391
|
+
windowBounds: { x: number; y: number; width: number; height: number };
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
const DEFAULTS: AppState = {
|
|
395
|
+
theme: 'light',
|
|
396
|
+
recentFiles: [],
|
|
397
|
+
windowBounds: { x: 0, y: 0, width: 1200, height: 800 },
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
class Store {
|
|
401
|
+
private data: AppState;
|
|
402
|
+
private filePath: string;
|
|
403
|
+
|
|
404
|
+
constructor() {
|
|
405
|
+
this.filePath = path.join(app.getPath('userData'), 'settings.json');
|
|
406
|
+
this.data = this.load();
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
private load(): AppState {
|
|
410
|
+
try {
|
|
411
|
+
const raw = readFileSync(this.filePath, 'utf-8');
|
|
412
|
+
return { ...DEFAULTS, ...JSON.parse(raw) };
|
|
413
|
+
} catch {
|
|
414
|
+
return { ...DEFAULTS };
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
get<K extends keyof AppState>(key: K): AppState[K] {
|
|
419
|
+
return this.data[key];
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
set<K extends keyof AppState>(key: K, value: AppState[K]): void {
|
|
423
|
+
this.data[key] = value;
|
|
424
|
+
writeFileSync(this.filePath, JSON.stringify(this.data, null, 2));
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export const store = new Store();
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Strategy 2: electron-store (lightweight persistent storage)**
|
|
432
|
+
```typescript
|
|
433
|
+
import Store from 'electron-store';
|
|
434
|
+
|
|
435
|
+
const store = new Store({
|
|
436
|
+
schema: {
|
|
437
|
+
theme: { type: 'string', enum: ['light', 'dark'], default: 'light' },
|
|
438
|
+
windowBounds: {
|
|
439
|
+
type: 'object',
|
|
440
|
+
properties: {
|
|
441
|
+
width: { type: 'number', default: 1200 },
|
|
442
|
+
height: { type: 'number', default: 800 },
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
},
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// Usage
|
|
449
|
+
store.set('theme', 'dark');
|
|
450
|
+
console.log(store.get('theme')); // 'dark'
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**Multi-window state synchronization:**
|
|
454
|
+
```typescript
|
|
455
|
+
// Main process: broadcast state changes to all windows
|
|
456
|
+
import { BrowserWindow } from 'electron';
|
|
457
|
+
|
|
458
|
+
function broadcastToAllWindows(channel: string, data: unknown): void {
|
|
459
|
+
for (const win of BrowserWindow.getAllWindows()) {
|
|
460
|
+
if (!win.isDestroyed()) {
|
|
461
|
+
win.webContents.send(channel, data);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// When theme changes:
|
|
467
|
+
ipcMain.handle('settings:set-theme', (_event, theme: 'light' | 'dark') => {
|
|
468
|
+
store.set('theme', theme);
|
|
469
|
+
broadcastToAllWindows('settings:theme-changed', theme);
|
|
470
|
+
});
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### 6. Build, Signing & Distribution
|
|
476
|
+
|
|
477
|
+
#### electron-builder Configuration
|
|
478
|
+
|
|
479
|
+
```yaml
|
|
480
|
+
# electron-builder.yml
|
|
481
|
+
appId: com.mycompany.myapp
|
|
482
|
+
productName: My App
|
|
483
|
+
directories:
|
|
484
|
+
output: dist
|
|
485
|
+
buildResources: resources
|
|
486
|
+
|
|
487
|
+
files:
|
|
488
|
+
- "out/**/*" # compiled main + preload
|
|
489
|
+
- "renderer/**/*" # built renderer assets
|
|
490
|
+
- "package.json"
|
|
491
|
+
|
|
492
|
+
asar: true
|
|
493
|
+
compression: maximum
|
|
494
|
+
|
|
495
|
+
# ── macOS ──
|
|
496
|
+
mac:
|
|
497
|
+
category: public.app-category.developer-tools
|
|
498
|
+
hardenedRuntime: true
|
|
499
|
+
gatekeeperAssess: false
|
|
500
|
+
entitlements: resources/entitlements.mac.plist
|
|
501
|
+
entitlementsInherit: resources/entitlements.mac.plist
|
|
502
|
+
target:
|
|
503
|
+
- target: dmg
|
|
504
|
+
arch: [x64, arm64]
|
|
505
|
+
- target: zip
|
|
506
|
+
arch: [x64, arm64]
|
|
507
|
+
|
|
508
|
+
# ── Windows ──
|
|
509
|
+
win:
|
|
510
|
+
target:
|
|
511
|
+
- target: nsis
|
|
512
|
+
arch: [x64, arm64]
|
|
513
|
+
signingHashAlgorithms: [sha256]
|
|
514
|
+
|
|
515
|
+
nsis:
|
|
516
|
+
oneClick: false
|
|
517
|
+
allowToChangeInstallationDirectory: true
|
|
518
|
+
perMachine: false
|
|
519
|
+
|
|
520
|
+
# ── Linux ──
|
|
521
|
+
linux:
|
|
522
|
+
target:
|
|
523
|
+
- target: AppImage
|
|
524
|
+
- target: deb
|
|
525
|
+
category: Development
|
|
526
|
+
maintainer: your-email@example.com
|
|
527
|
+
|
|
528
|
+
# ── Auto Update ──
|
|
529
|
+
publish:
|
|
530
|
+
provider: github
|
|
531
|
+
owner: your-org
|
|
532
|
+
repo: your-repo
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
#### Code Signing
|
|
536
|
+
|
|
537
|
+
```bash
|
|
538
|
+
# macOS: requires Apple Developer certificate
|
|
539
|
+
# Set environment variables before building:
|
|
540
|
+
export CSC_LINK="path/to/Developer_ID_Application.p12"
|
|
541
|
+
export CSC_KEY_PASSWORD="your-password"
|
|
542
|
+
|
|
543
|
+
# Windows: requires EV or standard code signing certificate
|
|
544
|
+
# Set environment variables:
|
|
545
|
+
export WIN_CSC_LINK="path/to/code-signing.pfx"
|
|
546
|
+
export WIN_CSC_KEY_PASSWORD="your-password"
|
|
547
|
+
|
|
548
|
+
# Build signed app
|
|
549
|
+
npx electron-builder --mac --win --publish never
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
#### Auto-Update with electron-updater
|
|
553
|
+
|
|
554
|
+
```typescript
|
|
555
|
+
// src/main/updater.ts
|
|
556
|
+
import { autoUpdater } from 'electron-updater';
|
|
557
|
+
import { BrowserWindow } from 'electron';
|
|
558
|
+
import log from 'electron-log';
|
|
559
|
+
|
|
560
|
+
export function setupAutoUpdater(mainWindow: BrowserWindow): void {
|
|
561
|
+
autoUpdater.logger = log;
|
|
562
|
+
autoUpdater.autoDownload = false; // Let user decide
|
|
563
|
+
autoUpdater.autoInstallOnAppQuit = true;
|
|
564
|
+
|
|
565
|
+
autoUpdater.on('update-available', (info) => {
|
|
566
|
+
mainWindow.webContents.send('update:available', {
|
|
567
|
+
version: info.version,
|
|
568
|
+
releaseNotes: info.releaseNotes,
|
|
569
|
+
});
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
autoUpdater.on('download-progress', (progress) => {
|
|
573
|
+
mainWindow.webContents.send('update:progress', {
|
|
574
|
+
percent: Math.round(progress.percent),
|
|
575
|
+
bytesPerSecond: progress.bytesPerSecond,
|
|
576
|
+
});
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
autoUpdater.on('update-downloaded', () => {
|
|
580
|
+
mainWindow.webContents.send('update:downloaded');
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
autoUpdater.on('error', (err) => {
|
|
584
|
+
log.error('Update error:', err);
|
|
585
|
+
mainWindow.webContents.send('update:error', err.message);
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// Check for updates every 4 hours
|
|
589
|
+
setInterval(() => autoUpdater.checkForUpdates(), 4 * 60 * 60 * 1000);
|
|
590
|
+
autoUpdater.checkForUpdates();
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
// Expose to renderer via IPC
|
|
594
|
+
ipcMain.handle('update:download', () => autoUpdater.downloadUpdate());
|
|
595
|
+
ipcMain.handle('update:install', () => autoUpdater.quitAndInstall());
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
#### Bundle Size Optimization
|
|
599
|
+
|
|
600
|
+
- ✅ Use `asar: true` to package sources into a single archive
|
|
601
|
+
- ✅ Set `compression: maximum` in electron-builder config
|
|
602
|
+
- ✅ Exclude dev dependencies: `"files"` pattern should only include compiled output
|
|
603
|
+
- ✅ Use a bundler (Vite, webpack, esbuild) to tree-shake the renderer
|
|
604
|
+
- ✅ Audit `node_modules` shipped with the app — use `electron-builder`'s `files` exclude patterns
|
|
605
|
+
- ✅ Consider `@electron/rebuild` for native modules instead of shipping prebuilt for all platforms
|
|
606
|
+
- ❌ Do NOT bundle the entire `node_modules` — only production dependencies
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
### 7. Developer Experience & Debugging
|
|
611
|
+
|
|
612
|
+
#### Development Setup with Hot Reload
|
|
613
|
+
|
|
614
|
+
```json
|
|
615
|
+
// package.json scripts
|
|
616
|
+
{
|
|
617
|
+
"scripts": {
|
|
618
|
+
"dev": "concurrently \"npm run dev:renderer\" \"npm run dev:main\"",
|
|
619
|
+
"dev:renderer": "vite",
|
|
620
|
+
"dev:main": "electron-vite dev",
|
|
621
|
+
"build": "electron-vite build",
|
|
622
|
+
"start": "electron ."
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
**Recommended toolchain:**
|
|
628
|
+
- **electron-vite** or **electron-forge with Vite plugin** — modern, fast HMR for renderer
|
|
629
|
+
- **tsx** or **ts-node** — for running TypeScript in main process during development
|
|
630
|
+
- **concurrently** — run renderer dev server + Electron simultaneously
|
|
631
|
+
|
|
632
|
+
#### Debugging the Main Process
|
|
633
|
+
|
|
634
|
+
```json
|
|
635
|
+
// .vscode/launch.json
|
|
636
|
+
{
|
|
637
|
+
"version": "0.2.0",
|
|
638
|
+
"configurations": [
|
|
639
|
+
{
|
|
640
|
+
"name": "Debug Main Process",
|
|
641
|
+
"type": "node",
|
|
642
|
+
"request": "launch",
|
|
643
|
+
"cwd": "${workspaceFolder}",
|
|
644
|
+
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
|
|
645
|
+
"args": [".", "--remote-debugging-port=9223"],
|
|
646
|
+
"sourceMaps": true,
|
|
647
|
+
"outFiles": ["${workspaceFolder}/out/**/*.js"],
|
|
648
|
+
"env": {
|
|
649
|
+
"NODE_ENV": "development"
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
]
|
|
653
|
+
}
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
**Other debugging techniques:**
|
|
657
|
+
```typescript
|
|
658
|
+
// Enable DevTools only in development
|
|
659
|
+
if (process.env.NODE_ENV === 'development') {
|
|
660
|
+
win.webContents.openDevTools({ mode: 'detach' });
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// Inspect specific renderer processes from command line:
|
|
664
|
+
// electron . --inspect=5858 --remote-debugging-port=9223
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
#### Testing Strategy
|
|
668
|
+
|
|
669
|
+
**Unit testing (Vitest / Jest):**
|
|
670
|
+
```typescript
|
|
671
|
+
// tests/unit/store.test.ts
|
|
672
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
673
|
+
|
|
674
|
+
// Mock Electron modules for unit tests
|
|
675
|
+
vi.mock('electron', () => ({
|
|
676
|
+
app: { getPath: () => '/tmp/test' },
|
|
677
|
+
}));
|
|
678
|
+
|
|
679
|
+
describe('Store', () => {
|
|
680
|
+
it('returns default values for missing keys', () => {
|
|
681
|
+
// Test store logic without Electron runtime
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
**E2E testing (Playwright + Electron):**
|
|
687
|
+
```typescript
|
|
688
|
+
// tests/e2e/app.spec.ts
|
|
689
|
+
import { test, expect, _electron as electron } from '@playwright/test';
|
|
690
|
+
|
|
691
|
+
test('app launches and shows main window', async () => {
|
|
692
|
+
const app = await electron.launch({ args: ['.'] });
|
|
693
|
+
const window = await app.firstWindow();
|
|
694
|
+
|
|
695
|
+
// Wait for the app to fully load
|
|
696
|
+
await window.waitForLoadState('domcontentloaded');
|
|
697
|
+
|
|
698
|
+
const title = await window.title();
|
|
699
|
+
expect(title).toBe('My App');
|
|
700
|
+
|
|
701
|
+
// Take a screenshot for visual regression
|
|
702
|
+
await window.screenshot({ path: 'tests/screenshots/main-window.png' });
|
|
703
|
+
|
|
704
|
+
await app.close();
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
test('file open dialog works via IPC', async () => {
|
|
708
|
+
const app = await electron.launch({ args: ['.'] });
|
|
709
|
+
const window = await app.firstWindow();
|
|
710
|
+
|
|
711
|
+
// Test IPC by evaluating in the renderer context
|
|
712
|
+
const version = await window.evaluate(async () => {
|
|
713
|
+
return window.electronAPI.invoke('app:get-version');
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
expect(version).toBeTruthy();
|
|
717
|
+
await app.close();
|
|
718
|
+
});
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
**Playwright config for Electron:**
|
|
722
|
+
```typescript
|
|
723
|
+
// playwright.config.ts
|
|
724
|
+
import { defineConfig } from '@playwright/test';
|
|
725
|
+
|
|
726
|
+
export default defineConfig({
|
|
727
|
+
testDir: './tests/e2e',
|
|
728
|
+
timeout: 30_000,
|
|
729
|
+
retries: 1,
|
|
730
|
+
use: {
|
|
731
|
+
trace: 'on-first-retry',
|
|
732
|
+
screenshot: 'only-on-failure',
|
|
733
|
+
},
|
|
734
|
+
});
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## Application Lifecycle Management
|
|
740
|
+
|
|
741
|
+
```typescript
|
|
742
|
+
// src/main/main.ts
|
|
743
|
+
import { app, BrowserWindow } from 'electron';
|
|
744
|
+
import { registerIpcHandlers } from './ipc-handlers';
|
|
745
|
+
import { setupAutoUpdater } from './updater';
|
|
746
|
+
import { store } from './store';
|
|
747
|
+
|
|
748
|
+
let mainWindow: BrowserWindow | null = null;
|
|
749
|
+
|
|
750
|
+
app.whenReady().then(() => {
|
|
751
|
+
registerIpcHandlers();
|
|
752
|
+
mainWindow = createMainWindow();
|
|
753
|
+
|
|
754
|
+
// Restore window bounds
|
|
755
|
+
const bounds = store.get('windowBounds');
|
|
756
|
+
if (bounds) mainWindow.setBounds(bounds);
|
|
757
|
+
|
|
758
|
+
// Save window bounds on close
|
|
759
|
+
mainWindow.on('close', () => {
|
|
760
|
+
if (mainWindow) store.set('windowBounds', mainWindow.getBounds());
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
// Auto-update (only in production)
|
|
764
|
+
if (app.isPackaged) {
|
|
765
|
+
setupAutoUpdater(mainWindow);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// macOS: re-create window when dock icon is clicked
|
|
769
|
+
app.on('activate', () => {
|
|
770
|
+
if (BrowserWindow.getAllWindows().length === 0) {
|
|
771
|
+
mainWindow = createMainWindow();
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
// Quit when all windows are closed (except on macOS)
|
|
777
|
+
app.on('window-all-closed', () => {
|
|
778
|
+
if (process.platform !== 'darwin') {
|
|
779
|
+
app.quit();
|
|
780
|
+
}
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
// Security: prevent additional renderers from being created
|
|
784
|
+
app.on('web-contents-created', (_event, contents) => {
|
|
785
|
+
contents.on('will-attach-webview', (event) => {
|
|
786
|
+
event.preventDefault(); // Block <webview> tags
|
|
787
|
+
});
|
|
788
|
+
});
|
|
789
|
+
```
|
|
790
|
+
|
|
791
|
+
---
|
|
792
|
+
|
|
793
|
+
## Common Issue Diagnostics
|
|
794
|
+
|
|
795
|
+
### White Screen on Launch
|
|
796
|
+
**Symptoms**: App starts but renderer shows a blank/white page
|
|
797
|
+
**Root causes**: Incorrect `loadFile`/`loadURL` path, build output missing, CSP blocking scripts
|
|
798
|
+
**Solutions**: Verify the path passed to `win.loadFile()` or `win.loadURL()` exists relative to the packaged app. Check DevTools console for CSP violations. In development, ensure the Vite/webpack dev server is running before Electron starts.
|
|
799
|
+
|
|
800
|
+
### IPC Messages Not Received
|
|
801
|
+
**Symptoms**: `invoke()` hangs or `send()` has no effect
|
|
802
|
+
**Root causes**: Channel name mismatch, preload not loaded, contextBridge not exposing the channel
|
|
803
|
+
**Solutions**: Verify channel names match exactly between preload, main, and renderer. Confirm `preload` path is correct in `webPreferences`. Check that the channel is in the whitelist array.
|
|
804
|
+
|
|
805
|
+
### Native Module Crashes
|
|
806
|
+
**Symptoms**: App crashes on startup with `MODULE_NOT_FOUND` or `invalid ELF header`
|
|
807
|
+
**Root causes**: Native module compiled for wrong Electron/Node ABI version
|
|
808
|
+
**Solutions**: Run `npx @electron/rebuild` after installing native modules. Ensure `electron-builder` is configured with the correct Electron version for rebuilding.
|
|
809
|
+
|
|
810
|
+
### App Not Updating
|
|
811
|
+
**Symptoms**: `autoUpdater.checkForUpdates()` returns nothing or errors
|
|
812
|
+
**Root causes**: Missing `publish` config, unsigned app (macOS), incorrect GitHub release assets
|
|
813
|
+
**Solutions**: Verify `publish` section in `electron-builder.yml`. On macOS, app must be code-signed and notarized. Ensure the GitHub release contains the `-mac.zip` and `latest-mac.yml` (or equivalent Windows files).
|
|
814
|
+
|
|
815
|
+
### Large Bundle Size (>200MB)
|
|
816
|
+
**Symptoms**: Built application is excessively large
|
|
817
|
+
**Root causes**: Dev dependencies bundled, no tree-shaking, duplicate Electron binaries
|
|
818
|
+
**Solutions**: Audit `files` patterns in `electron-builder.yml`. Use a bundler (Vite/esbuild) for the renderer. Check that `devDependencies` are not in `dependencies`. Use `compression: maximum`.
|
|
819
|
+
|
|
820
|
+
---
|
|
821
|
+
|
|
822
|
+
## Best Practices
|
|
823
|
+
|
|
824
|
+
- ✅ **Always** set `contextIsolation: true` and `nodeIntegration: false`
|
|
825
|
+
- ✅ **Always** use `contextBridge` in preload with an explicit channel whitelist
|
|
826
|
+
- ✅ **Always** validate IPC inputs in the main process — treat renderer as untrusted
|
|
827
|
+
- ✅ **Always** use `ipcMain.handle()` / `ipcRenderer.invoke()` for request/response IPC
|
|
828
|
+
- ✅ **Always** configure Content Security Policy headers
|
|
829
|
+
- ✅ **Always** sanitize URLs before passing to `shell.openExternal()`
|
|
830
|
+
- ✅ **Always** code-sign your production builds
|
|
831
|
+
- ✅ Use Playwright with `@playwright/test`'s Electron support for E2E tests
|
|
832
|
+
- ✅ Store user data in `app.getPath('userData')`, never in the app directory
|
|
833
|
+
- ❌ **Never** set `nodeIntegration: true` — this is the #1 Electron security vulnerability
|
|
834
|
+
- ❌ **Never** expose raw `ipcRenderer` or `require()` to the renderer context
|
|
835
|
+
- ❌ **Never** use `remote` module (deprecated and insecure)
|
|
836
|
+
- ❌ **Never** use `ipcRenderer.sendSync()` — it blocks the renderer event loop
|
|
837
|
+
- ❌ **Never** disable `webSecurity` in production
|
|
838
|
+
- ❌ **Never** load remote/untrusted content without a strict CSP and sandboxing
|
|
839
|
+
|
|
840
|
+
## Limitations
|
|
841
|
+
|
|
842
|
+
- Electron bundles Chromium + Node.js, resulting in a minimum ~150MB app size — this is a fundamental trade-off of the framework
|
|
843
|
+
- Not suitable for apps where minimal install size is critical (consider Tauri instead)
|
|
844
|
+
- Single-window apps are simpler to architect; multi-window state synchronization requires careful IPC design
|
|
845
|
+
- Auto-update on Linux requires distributing via Snap, Flatpak, or custom mechanisms — `electron-updater` has limited Linux support
|
|
846
|
+
- macOS notarization requires an Apple Developer account ($99/year) and is mandatory for distribution outside the Mac App Store
|
|
847
|
+
- Debugging main process issues requires VS Code or Chrome DevTools via `--inspect` flag — there is no integrated debugger in Electron itself
|
|
848
|
+
|
|
849
|
+
## Related Skills
|
|
850
|
+
|
|
851
|
+
- `chrome-extension-developer` — When building browser extensions instead of desktop apps (shares multi-process model concepts)
|
|
852
|
+
- `docker-expert` — When containerizing Electron's build pipeline or CI/CD
|
|
853
|
+
- `react-patterns` / `react-best-practices` — When using React for the renderer UI
|
|
854
|
+
- `typescript-pro` — When setting up advanced TypeScript configurations for multi-target builds
|
|
855
|
+
- `nodejs-backend-patterns` — When the main process needs complex backend logic
|
|
856
|
+
- `github-actions-templates` — When setting up CI/CD for cross-platform Electron builds
|
|
857
|
+
|
|
858
|
+
---
|
|
859
|
+
|
|
860
|
+
<!-- AGI-INTEGRATION-START -->
|
|
861
|
+
|
|
862
|
+
## AGI Framework Integration
|
|
863
|
+
|
|
864
|
+
> **Adapted for [@techwavedev/agi-agent-kit](https://www.npmjs.com/package/@techwavedev/agi-agent-kit)**
|
|
865
|
+
> Original source: [antigravity-awesome-skills](https://github.com/sickn33/antigravity-awesome-skills)
|
|
866
|
+
|
|
867
|
+
### Memory-First Protocol
|
|
868
|
+
|
|
869
|
+
Retrieve prior design decisions (color palettes, typography, spacing scales) to maintain visual consistency across sessions. Cache generated design tokens.
|
|
870
|
+
|
|
871
|
+
```bash
|
|
872
|
+
# Check for prior frontend/design context before starting
|
|
873
|
+
python3 execution/memory_manager.py auto --query "design system decisions and component patterns for Electron Development"
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
### Storing Results
|
|
877
|
+
|
|
878
|
+
After completing work, store frontend/design decisions for future sessions:
|
|
879
|
+
|
|
880
|
+
```bash
|
|
881
|
+
python3 execution/memory_manager.py store \
|
|
882
|
+
--content "Design system: adopted 8px grid, Inter font family, HSL color tokens with dark mode support" \
|
|
883
|
+
--type decision --project <project> \
|
|
884
|
+
--tags electron-development frontend
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
### Multi-Agent Collaboration
|
|
888
|
+
|
|
889
|
+
Share design decisions with backend agents (API contract changes) and QA agents (visual regression baselines).
|
|
890
|
+
|
|
891
|
+
```bash
|
|
892
|
+
python3 execution/cross_agent_context.py store \
|
|
893
|
+
--agent "<your-agent>" \
|
|
894
|
+
--action "Implemented UI components — new design system with accessibility compliance (WCAG 2.1 AA)" \
|
|
895
|
+
--project <project>
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
### Design Memory Persistence
|
|
899
|
+
|
|
900
|
+
Store design system tokens and component decisions in Qdrant so any agent on any platform (Claude, Gemini, Cursor) can retrieve and apply consistent styling.
|
|
901
|
+
|
|
902
|
+
<!-- AGI-INTEGRATION-END -->
|