@techwavedev/agi-agent-kit 1.4.2 → 1.5.0
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 +27 -0
- package/README.md +22 -15
- package/bin/init.js +943 -84
- package/package.json +1 -1
- package/templates/base/.agent/workflows/memory-usage.md +68 -0
- package/templates/base/.env.example +21 -4
- package/templates/base/AGENTS.md +37 -8
- package/templates/base/execution/memory_usage_proof.py +307 -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/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/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/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/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/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/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/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/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/oss-hunter/bin/__pycache__/hunter.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/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/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
package/bin/init.js
CHANGED
|
@@ -22,6 +22,7 @@ const fs = require("fs");
|
|
|
22
22
|
const path = require("path");
|
|
23
23
|
const readline = require("readline");
|
|
24
24
|
const { execSync } = require("child_process");
|
|
25
|
+
const os = require("os");
|
|
25
26
|
|
|
26
27
|
// Color utilities for terminal output
|
|
27
28
|
const colors = {
|
|
@@ -65,8 +66,33 @@ const PACKS = {
|
|
|
65
66
|
skills: ["core", "knowledge", "extended"],
|
|
66
67
|
includeAgent: true,
|
|
67
68
|
},
|
|
69
|
+
custom: {
|
|
70
|
+
name: "Custom",
|
|
71
|
+
description: "Core + selected domains only",
|
|
72
|
+
skills: ["core"], // domains are resolved at install time via options.domains
|
|
73
|
+
includeAgent: true,
|
|
74
|
+
},
|
|
68
75
|
};
|
|
69
76
|
|
|
77
|
+
// Domain definitions — maps domain name to skill counts per tier
|
|
78
|
+
const DOMAINS = [
|
|
79
|
+
{ id: "ai-agents", label: "AI Agents & Orchestration", knowledge: 9, extended: 93 },
|
|
80
|
+
{ id: "architecture", label: "Architecture & System Design", knowledge: 6, extended: 32 },
|
|
81
|
+
{ id: "backend", label: "Backend & APIs", knowledge: 8, extended: 100 },
|
|
82
|
+
{ id: "blockchain", label: "Blockchain & Web3", knowledge: 1, extended: 3 },
|
|
83
|
+
{ id: "content", label: "Content & Copy", knowledge: 6, extended: 21 },
|
|
84
|
+
{ id: "debugging", label: "Debugging & Observability", knowledge: 5, extended: 36 },
|
|
85
|
+
{ id: "devops", label: "DevOps & Cloud", knowledge: 5, extended: 140 },
|
|
86
|
+
{ id: "documentation",label: "Documentation", knowledge: 3, extended: 34 },
|
|
87
|
+
{ id: "frontend", label: "Frontend & UI/UX", knowledge: 11, extended: 61 },
|
|
88
|
+
{ id: "gaming", label: "Gaming & Creative", knowledge: 1, extended: 4 },
|
|
89
|
+
{ id: "mobile", label: "Mobile (iOS/Android/RN)", knowledge: 1, extended: 8 },
|
|
90
|
+
{ id: "security", label: "Security & Pen Testing", knowledge: 2, extended: 38 },
|
|
91
|
+
{ id: "testing", label: "Testing & QA", knowledge: 6, extended: 32 },
|
|
92
|
+
{ id: "workflow", label: "Workflow & Automation", knowledge: 10, extended: 142 },
|
|
93
|
+
{ id: "i18n", label: "i18n & Localisation", knowledge: 1, extended: 0 },
|
|
94
|
+
];
|
|
95
|
+
|
|
70
96
|
// Parse command line arguments
|
|
71
97
|
function parseArgs() {
|
|
72
98
|
const args = process.argv.slice(2);
|
|
@@ -76,6 +102,8 @@ function parseArgs() {
|
|
|
76
102
|
path: process.cwd(),
|
|
77
103
|
symlinks: true,
|
|
78
104
|
help: false,
|
|
105
|
+
global: false,
|
|
106
|
+
ci: false, // --ci: skip all prompts, use safe defaults
|
|
79
107
|
};
|
|
80
108
|
|
|
81
109
|
for (const arg of args) {
|
|
@@ -85,8 +113,13 @@ function parseArgs() {
|
|
|
85
113
|
options.pack = arg.split("=")[1];
|
|
86
114
|
} else if (arg.startsWith("--path=")) {
|
|
87
115
|
options.path = path.resolve(arg.split("=")[1]);
|
|
116
|
+
} else if (arg === "--global" || arg === "-g") {
|
|
117
|
+
options.global = true;
|
|
118
|
+
options.path = path.join(os.homedir() || process.env.HOME || process.env.USERPROFILE || "", ".agent");
|
|
88
119
|
} else if (arg === "--no-symlinks") {
|
|
89
120
|
options.symlinks = false;
|
|
121
|
+
} else if (arg === "--ci") {
|
|
122
|
+
options.ci = true;
|
|
90
123
|
} else if (arg === "--help" || arg === "-h") {
|
|
91
124
|
options.help = true;
|
|
92
125
|
}
|
|
@@ -106,6 +139,7 @@ ${colors.bright}Usage:${colors.reset}
|
|
|
106
139
|
${colors.bright}Options:${colors.reset}
|
|
107
140
|
--pack=<pack> Select skill pack (core, medium, full)
|
|
108
141
|
--path=<dir> Target directory (default: current)
|
|
142
|
+
--global, -g Install globally to ~/.agent directory
|
|
109
143
|
--no-symlinks Skip GEMINI.md/CLAUDE.md symlink creation
|
|
110
144
|
--help Show this help message
|
|
111
145
|
|
|
@@ -128,51 +162,540 @@ ${colors.bright}Note:${colors.reset} Most scripts require ${colors.cyan}python3$
|
|
|
128
162
|
`);
|
|
129
163
|
}
|
|
130
164
|
|
|
131
|
-
// Prompt user for pack selection
|
|
165
|
+
// Prompt user for pack selection (including custom domain picker)
|
|
132
166
|
async function promptPackSelection() {
|
|
167
|
+
console.log(`\n${colors.bright}Which pack would you like to install?${colors.reset}\n`);
|
|
168
|
+
console.log(` ${colors.green}1. core${colors.reset} — 4 essential skills (webcrawler, pdf-reader, qdrant-memory, documentation)`);
|
|
169
|
+
console.log(` ${colors.blue}2. medium${colors.reset} — Core + 89 domain skills + .agent/ structure`);
|
|
170
|
+
console.log(` ${colors.yellow}3. full${colors.reset} — Everything: Medium + 785 community skills (878 total)`);
|
|
171
|
+
console.log(` ${colors.cyan}4. custom${colors.reset} — Core + you choose specific domains\n`);
|
|
172
|
+
|
|
173
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
174
|
+
|
|
175
|
+
return new Promise((resolve) => {
|
|
176
|
+
rl.question(` Enter choice (1-4) or pack name (default: core): `, async (answer) => {
|
|
177
|
+
rl.close();
|
|
178
|
+
const choice = answer.trim().toLowerCase();
|
|
179
|
+
|
|
180
|
+
if (choice === "2" || choice === "medium" || choice === "knowledge") {
|
|
181
|
+
resolve("medium");
|
|
182
|
+
} else if (choice === "3" || choice === "full") {
|
|
183
|
+
resolve("full");
|
|
184
|
+
} else if (choice === "4" || choice === "custom") {
|
|
185
|
+
const domains = await promptDomainSelection();
|
|
186
|
+
resolve(domains.length > 0 ? "custom" : "core");
|
|
187
|
+
} else {
|
|
188
|
+
if (choice !== "1" && choice !== "core" && choice !== "") {
|
|
189
|
+
log.warn("Invalid choice, defaulting to core");
|
|
190
|
+
}
|
|
191
|
+
resolve("core");
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Multi-select domain picker for custom installs
|
|
198
|
+
async function promptDomainSelection() {
|
|
199
|
+
const templatesPath = path.join(__dirname, "..", "templates", "skills");
|
|
200
|
+
|
|
201
|
+
console.log(`\n${colors.bright}━━━ Custom Domain Selection ━━━${colors.reset}`);
|
|
202
|
+
console.log(` ${colors.cyan}Core skills (webcrawler, pdf-reader, qdrant-memory, documentation) are always included.${colors.reset}\n`);
|
|
203
|
+
console.log(` The numbers show ${colors.blue}professional skills${colors.reset} (curated, same as medium pack)`);
|
|
204
|
+
console.log(` and ${colors.yellow}community skills${colors.reset} (antigravity-awesome-skills, same as full pack).`);
|
|
205
|
+
console.log(` You get both tiers for each domain you select.\n`);
|
|
206
|
+
console.log(` ${"".padEnd(38)} ${colors.blue}■ professional${colors.reset} ${colors.yellow}■ community${colors.reset}`);
|
|
207
|
+
console.log(` ${"-".repeat(72)}`);
|
|
208
|
+
|
|
209
|
+
DOMAINS.forEach((d, i) => {
|
|
210
|
+
const num = String(i + 1).padStart(2);
|
|
211
|
+
const knStr = d.knowledge > 0 ? `${d.knowledge} skills` : `— `;
|
|
212
|
+
const exStr = d.extended > 0 ? `${d.extended} skills` : `—`;
|
|
213
|
+
const knColored = d.knowledge > 0
|
|
214
|
+
? `${colors.blue}+${knStr}${colors.reset}`.padEnd(22)
|
|
215
|
+
: `${colors.dim}${knStr}${colors.reset}`.padEnd(22);
|
|
216
|
+
const exColored = d.extended > 0
|
|
217
|
+
? `${colors.yellow}+${exStr}${colors.reset}`
|
|
218
|
+
: `${colors.dim}${exStr}${colors.reset}`;
|
|
219
|
+
console.log(` ${colors.bright}${num}.${colors.reset} ${d.label.padEnd(36)} ${knColored} ${exColored}`);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
console.log(`\n Enter domain numbers separated by commas, or ranges (e.g. 1,3,5-7,9)`);
|
|
223
|
+
console.log(` Type ${colors.cyan}all${colors.reset} to select all, or press Enter to skip (core only)\n`);
|
|
224
|
+
|
|
225
|
+
const rl2 = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
226
|
+
|
|
227
|
+
return new Promise((resolve) => {
|
|
228
|
+
rl2.question(` Your domains: `, (answer) => {
|
|
229
|
+
rl2.close();
|
|
230
|
+
const input = answer.trim().toLowerCase();
|
|
231
|
+
|
|
232
|
+
if (!input) {
|
|
233
|
+
log.info("No domains selected — core only.");
|
|
234
|
+
resolve([]);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (input === "all") {
|
|
239
|
+
log.success(`All ${DOMAINS.length} domains selected.`);
|
|
240
|
+
// Store selected domain ids on process env for copySkills to read
|
|
241
|
+
process.env._AGI_CUSTOM_DOMAINS = DOMAINS.map((d) => d.id).join(",");
|
|
242
|
+
resolve(DOMAINS.map((d) => d.id));
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Parse numbers and ranges like "1,3,5-7"
|
|
247
|
+
const selected = [];
|
|
248
|
+
const parts = input.split(",");
|
|
249
|
+
for (const part of parts) {
|
|
250
|
+
const rangeParts = part.trim().split("-").map(Number);
|
|
251
|
+
if (rangeParts.length === 2) {
|
|
252
|
+
const [from, to] = rangeParts;
|
|
253
|
+
for (let n = from; n <= to; n++) {
|
|
254
|
+
if (n >= 1 && n <= DOMAINS.length) selected.push(DOMAINS[n - 1].id);
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
const n = parseInt(part.trim(), 10);
|
|
258
|
+
if (n >= 1 && n <= DOMAINS.length) selected.push(DOMAINS[n - 1].id);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (selected.length === 0) {
|
|
263
|
+
log.warn("No valid domains selected — falling back to core.");
|
|
264
|
+
resolve([]);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const names = selected.map((id) => DOMAINS.find((d) => d.id === id).label);
|
|
269
|
+
log.success(`Selected domains: ${colors.cyan}${names.join(", ")}${colors.reset}`);
|
|
270
|
+
process.env._AGI_CUSTOM_DOMAINS = selected.join(",");
|
|
271
|
+
resolve(selected);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Prompt user for install scope: project-local vs global
|
|
277
|
+
async function promptInstallScope(options) {
|
|
278
|
+
// Skip prompt if the user already passed --global or an explicit --path
|
|
279
|
+
if (options.global || options._pathExplicit) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Platform compatibility reference
|
|
284
|
+
const PLATFORM_COMPAT = [
|
|
285
|
+
{ name: "Gemini CLI", globalDir: "~/.gemini/skills", globalOk: true, note: "" },
|
|
286
|
+
{ name: "Claude Code", globalDir: "~/.claude/skills", globalOk: true, note: "" },
|
|
287
|
+
{ name: "Cursor", globalDir: "~/.cursor/skills", globalOk: false, note: "reads skills from project dir only" },
|
|
288
|
+
{ name: "Codex CLI", globalDir: "~/.codex/skills", globalOk: true, note: "requires CODEX_HOME env var if non-default" },
|
|
289
|
+
{ name: "OpenCode", globalDir: "(project dir only)", globalOk: false, note: "global skill dirs not yet supported" },
|
|
290
|
+
{ name: "OpenClaw", globalDir: "~/.openclaw/skills", globalOk: true, note: "" },
|
|
291
|
+
{ name: "AdaL CLI", globalDir: "~/.adal/skills", globalOk: true, note: "" },
|
|
292
|
+
{ name: "Copilot/VS", globalDir: "(project dir only)", globalOk: false, note: "skills loaded per-workspace only" },
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
console.log(`\n${colors.bright}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}`);
|
|
296
|
+
console.log(`${colors.bright} INSTALL SCOPE${colors.reset}`);
|
|
297
|
+
console.log(`${colors.bright}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${colors.reset}\n`);
|
|
298
|
+
|
|
299
|
+
console.log(` ${colors.bright}Option 1 — Project install (default, safest)${colors.reset}`);
|
|
300
|
+
console.log(` ─────────────────────────────────────────────`);
|
|
301
|
+
console.log(` Skills and agents are installed inside the ${colors.cyan}current directory${colors.reset}.`);
|
|
302
|
+
console.log(` Only this project can use them.\n`);
|
|
303
|
+
console.log(` ${colors.green}✔ Pitfalls to be aware of:${colors.reset}`);
|
|
304
|
+
console.log(` • You must run init again for every new project`);
|
|
305
|
+
console.log(` • Skills are NOT shared across projects`);
|
|
306
|
+
console.log(` • Existing files in this directory ${colors.yellow}may be overwritten${colors.reset} (e.g. AGENTS.md)\n`);
|
|
307
|
+
|
|
308
|
+
console.log(` ${colors.bright}Option 2 — Global install${colors.reset}`);
|
|
309
|
+
console.log(` ─────────────────────────────────────────────`);
|
|
310
|
+
console.log(` Skills installed once in ${colors.cyan}~/.agent${colors.reset} and symlinked into`);
|
|
311
|
+
console.log(` each supported AI platform's global skills directory.\n`);
|
|
312
|
+
console.log(` ${colors.yellow}⚠ Pitfalls to be aware of:${colors.reset}`);
|
|
313
|
+
console.log(` • Existing files in platform dirs ${colors.red}may be overwritten${colors.reset}`);
|
|
314
|
+
console.log(` • Not all platforms support global skill dirs (see table below)`);
|
|
315
|
+
console.log(` • Symlinks may conflict if you later do a project install`);
|
|
316
|
+
console.log(` • Removing skills requires manual cleanup of ~/.agent and symlinks\n`);
|
|
317
|
+
|
|
318
|
+
console.log(` ${colors.bright}Platform Global Install Compatibility:${colors.reset}`);
|
|
319
|
+
console.log(` ${"Platform".padEnd(14)} ${"Global Dir".padEnd(26)} ${"Supported?".padEnd(12)} Notes`);
|
|
320
|
+
console.log(` ${"─".repeat(72)}`);
|
|
321
|
+
for (const p of PLATFORM_COMPAT) {
|
|
322
|
+
const supported = p.globalOk
|
|
323
|
+
? `${colors.green}✔ Yes${colors.reset} `
|
|
324
|
+
: `${colors.red}✖ No${colors.reset} `;
|
|
325
|
+
const note = p.note ? `${colors.yellow}⚠ ${p.note}${colors.reset}` : "";
|
|
326
|
+
console.log(` ${p.name.padEnd(14)} ${p.globalDir.padEnd(26)} ${supported} ${note}`);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
console.log(`\n ${colors.bright}${colors.red}⚠ DISCLAIMER${colors.reset}`);
|
|
330
|
+
console.log(` ${"─".repeat(60)}`);
|
|
331
|
+
console.log(` By proceeding you acknowledge that:`);
|
|
332
|
+
console.log(` • This installer may ${colors.yellow}create, overwrite, or symlink files${colors.reset}`);
|
|
333
|
+
console.log(` in your project directory or home directory (~/.agent,`);
|
|
334
|
+
console.log(` ~/.gemini, ~/.claude, ~/.cursor, etc.)`);
|
|
335
|
+
console.log(` • ${colors.red}Existing AGENTS.md, GEMINI.md, CLAUDE.md${colors.reset} and platform`);
|
|
336
|
+
console.log(` skill dirs may be replaced.`);
|
|
337
|
+
console.log(` • The authors of agi-agent-kit ${colors.bright}assume no responsibility${colors.reset}`);
|
|
338
|
+
console.log(` for data loss, configuration conflicts, or any damages`);
|
|
339
|
+
console.log(` resulting from using this installer.`);
|
|
340
|
+
console.log(` • ${colors.cyan}Always back up important files before proceeding.${colors.reset}`);
|
|
341
|
+
console.log(``);
|
|
342
|
+
|
|
133
343
|
const rl = readline.createInterface({
|
|
134
344
|
input: process.stdin,
|
|
135
345
|
output: process.stdout,
|
|
136
346
|
});
|
|
137
347
|
|
|
138
348
|
return new Promise((resolve) => {
|
|
139
|
-
console.log(
|
|
140
|
-
`\n${colors.bright}Which pack would you like to install?${colors.reset}\n`,
|
|
141
|
-
);
|
|
142
|
-
console.log(
|
|
143
|
-
` 1. ${colors.green}core${colors.reset} Essential skills (webcrawler, pdf-reader, qdrant-memory, documentation)`,
|
|
144
|
-
);
|
|
145
|
-
console.log(
|
|
146
|
-
` 2. ${colors.blue}medium${colors.reset} Core + 89 specialized skills + .agent/ structure`,
|
|
147
|
-
);
|
|
148
|
-
console.log(
|
|
149
|
-
` 3. ${colors.yellow}full${colors.reset} Complete suite (Medium + 785 community skills from antigravity-awesome-skills)\n`,
|
|
150
|
-
);
|
|
151
|
-
|
|
152
349
|
rl.question(
|
|
153
|
-
`
|
|
350
|
+
` Choose install scope (1=Project / 2=Global, default: 1): `,
|
|
154
351
|
(answer) => {
|
|
155
352
|
rl.close();
|
|
156
|
-
const choice = answer.trim()
|
|
157
|
-
|
|
158
|
-
if (choice === "
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
else
|
|
167
|
-
|
|
168
|
-
log.warn("Invalid choice, defaulting to core");
|
|
169
|
-
resolve("core");
|
|
353
|
+
const choice = answer.trim();
|
|
354
|
+
|
|
355
|
+
if (choice === "2" || choice.toLowerCase() === "global" || choice.toLowerCase() === "g") {
|
|
356
|
+
const os = require("os");
|
|
357
|
+
options.global = true;
|
|
358
|
+
options.path = path.join(os.homedir(), ".agent");
|
|
359
|
+
console.log(``);
|
|
360
|
+
log.warn(`Global install selected. Symlinks will be created in ~/.gemini/skills, ~/.claude/skills, etc.`);
|
|
361
|
+
log.warn(`Platforms marked ✖ above will NOT pick up global skills automatically.`);
|
|
362
|
+
log.success(`Target directory: ${colors.cyan}${options.path}${colors.reset}`);
|
|
363
|
+
} else {
|
|
364
|
+
log.success(`Project install — target: ${colors.cyan}${options.path}${colors.reset}`);
|
|
170
365
|
}
|
|
366
|
+
resolve();
|
|
171
367
|
},
|
|
172
368
|
);
|
|
173
369
|
});
|
|
174
370
|
}
|
|
175
371
|
|
|
372
|
+
// Detect existing files that will be overwritten and offer to back them up
|
|
373
|
+
async function backupExistingFiles(targetPath, options = {}) {
|
|
374
|
+
const os = require("os");
|
|
375
|
+
const homeDir = os.homedir();
|
|
376
|
+
|
|
377
|
+
// Files and dirs the installer will create/overwrite in the target path
|
|
378
|
+
const WATCHED = [
|
|
379
|
+
"AGENTS.md", "GEMINI.md", "CLAUDE.md", "OPENCODE.md",
|
|
380
|
+
"COPILOT.md", "OPENCLAW.md", ".env", "directives",
|
|
381
|
+
"execution", "skills", "skill-creator", ".agent",
|
|
382
|
+
];
|
|
383
|
+
|
|
384
|
+
// For global installs, also check platform dirs that will be symlinked
|
|
385
|
+
const GLOBAL_PLATFORM_DIRS = options.global ? [
|
|
386
|
+
path.join(homeDir, ".gemini", "skills"),
|
|
387
|
+
path.join(homeDir, ".claude", "skills"),
|
|
388
|
+
path.join(homeDir, ".codex", "skills"),
|
|
389
|
+
path.join(homeDir, ".cursor", "skills"),
|
|
390
|
+
path.join(homeDir, ".openclaw", "skills"),
|
|
391
|
+
path.join(homeDir, ".adal", "skills"),
|
|
392
|
+
] : [];
|
|
393
|
+
|
|
394
|
+
const existing = WATCHED.filter((f) =>
|
|
395
|
+
fs.existsSync(path.join(targetPath, f)),
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
const existingGlobalDirs = GLOBAL_PLATFORM_DIRS.filter((p) =>
|
|
399
|
+
fs.existsSync(p) && !fs.lstatSync(p).isSymbolicLink(),
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
if (existing.length === 0 && existingGlobalDirs.length === 0) {
|
|
403
|
+
return; // Nothing to back up
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
console.log(`\n${colors.bright}━━━ Backup Existing Files ━━━${colors.reset}\n`);
|
|
407
|
+
console.log(` The following items already exist and ${colors.yellow}may be overwritten${colors.reset}:\n`);
|
|
408
|
+
|
|
409
|
+
for (const f of existing) {
|
|
410
|
+
const full = path.join(targetPath, f);
|
|
411
|
+
const isDir = fs.statSync(full).isDirectory();
|
|
412
|
+
console.log(` ${colors.yellow}${isDir ? "📁" : "📄"} ${full}${colors.reset}`);
|
|
413
|
+
}
|
|
414
|
+
for (const d of existingGlobalDirs) {
|
|
415
|
+
console.log(` ${colors.yellow}📁 ${d}${colors.reset} ${colors.red}(real dir — will be replaced by symlink)${colors.reset}`);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
console.log(`
|
|
419
|
+
${colors.bright}We strongly recommend backing these up before continuing.${colors.reset}`);
|
|
420
|
+
const backupBase = options.global
|
|
421
|
+
? path.join(homeDir, `.agi-global-backup-<timestamp>`)
|
|
422
|
+
: path.join(targetPath, `.agi-backup-<timestamp>`);
|
|
423
|
+
console.log(` Backup will be saved to: ${colors.cyan}${backupBase}${colors.reset}\n`);
|
|
424
|
+
|
|
425
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
426
|
+
|
|
427
|
+
return new Promise((resolve) => {
|
|
428
|
+
rl.question(` Create backup now? (Y/n, default: Y): `, (answer) => {
|
|
429
|
+
rl.close();
|
|
430
|
+
const choice = answer.trim().toLowerCase();
|
|
431
|
+
|
|
432
|
+
if (choice === "n" || choice === "no") {
|
|
433
|
+
log.warn("Backup skipped — existing files may be overwritten.");
|
|
434
|
+
resolve();
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-").replace("T", "_").slice(0, 19);
|
|
439
|
+
const backupDir = options.global
|
|
440
|
+
? path.join(homeDir, `.agi-global-backup-${ts}`)
|
|
441
|
+
: path.join(targetPath, `.agi-backup-${ts}`);
|
|
442
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
443
|
+
|
|
444
|
+
let backed = 0;
|
|
445
|
+
for (const f of existing) {
|
|
446
|
+
const src = path.join(targetPath, f);
|
|
447
|
+
const dest = path.join(backupDir, f);
|
|
448
|
+
try { copyDirSync(src, dest) || fs.copyFileSync(src, dest); backed++; } catch (e) {
|
|
449
|
+
log.warn(`Could not back up ${f}: ${e.message}`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
for (const d of existingGlobalDirs) {
|
|
453
|
+
const name = d.replace(homeDir, "~").replace(/\//g, "_").replace(/^_/, "");
|
|
454
|
+
const dest = path.join(backupDir, name);
|
|
455
|
+
try { copyDirSync(d, dest); backed++; } catch (e) {
|
|
456
|
+
log.warn(`Could not back up ${d}: ${e.message}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
log.success(`Backup created: ${colors.cyan}${backupDir}${colors.reset} (${backed} items)`);
|
|
461
|
+
resolve();
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Generate an uninstall script for global installs
|
|
467
|
+
function generateUninstallScript(installPath, options) {
|
|
468
|
+
const os = require("os");
|
|
469
|
+
const homeDir = os.homedir();
|
|
470
|
+
const scriptPath = path.join(installPath, "uninstall-agi.sh");
|
|
471
|
+
|
|
472
|
+
const platformSymlinks = [
|
|
473
|
+
path.join(homeDir, ".gemini", "skills"),
|
|
474
|
+
path.join(homeDir, ".claude", "skills"),
|
|
475
|
+
path.join(homeDir, ".codex", "skills"),
|
|
476
|
+
path.join(homeDir, ".cursor", "skills"),
|
|
477
|
+
path.join(homeDir, ".openclaw", "skills"),
|
|
478
|
+
path.join(homeDir, ".adal", "skills"),
|
|
479
|
+
];
|
|
480
|
+
|
|
481
|
+
const instructionLinks = ["GEMINI.md", "CLAUDE.md", "OPENCODE.md", "COPILOT.md", "OPENCLAW.md"]
|
|
482
|
+
.map((f) => path.join(installPath, f));
|
|
483
|
+
|
|
484
|
+
// Build the uninstall script content as a plain string to avoid quote escaping issues
|
|
485
|
+
let script = "#!/usr/bin/env bash\n";
|
|
486
|
+
script += "# AGI Agent Kit - Global Uninstaller\n";
|
|
487
|
+
script += "# Generated: " + new Date().toISOString() + "\n";
|
|
488
|
+
script += "# Install path: " + installPath + "\n";
|
|
489
|
+
script += "\n";
|
|
490
|
+
script += "set -e\n";
|
|
491
|
+
script += "\n";
|
|
492
|
+
script += "echo 'AGI Agent Kit - Global Uninstaller'\n";
|
|
493
|
+
script += "echo 'This will remove:'\n";
|
|
494
|
+
script += "echo ' - Skill symlinks from platform dirs (~/.gemini/skills, ~/.claude/skills, etc.)'\n";
|
|
495
|
+
script += "echo ' - Instruction file symlinks (GEMINI.md, CLAUDE.md, etc.)'\n";
|
|
496
|
+
script += "echo ' - The install directory: " + installPath + "'\n";
|
|
497
|
+
script += "echo ''\n";
|
|
498
|
+
script += "read -r -p 'Proceed? (y/N): ' confirm\n";
|
|
499
|
+
script += "if [ \"$confirm\" != 'y' ] && [ \"$confirm\" != 'Y' ]; then echo 'Aborted.'; exit 0; fi\n";
|
|
500
|
+
script += "\n";
|
|
501
|
+
script += "echo 'Removing platform skill symlinks...'\n";
|
|
502
|
+
for (const p of platformSymlinks) {
|
|
503
|
+
script += "[ -L '" + p + "' ] && rm '" + p + "' && echo ' Removed: " + p + "' || echo ' Skipped (not a symlink): " + p + "'\n";
|
|
504
|
+
}
|
|
505
|
+
script += "\n";
|
|
506
|
+
script += "echo 'Removing instruction file symlinks...'\n";
|
|
507
|
+
for (const p of instructionLinks) {
|
|
508
|
+
script += "[ -L '" + p + "' ] && rm '" + p + "' && echo ' Removed: " + p + "' || echo ' Skipped: " + p + "'\n";
|
|
509
|
+
}
|
|
510
|
+
script += "\n";
|
|
511
|
+
script += "echo 'Removing install directory: " + installPath + "'\n";
|
|
512
|
+
script += "rm -rf '" + installPath + "'\n";
|
|
513
|
+
script += "echo 'AGI Agent Kit global install removed successfully.'\n";
|
|
514
|
+
script += "echo 'Note: your .env and any backups were NOT removed.'\n";
|
|
515
|
+
|
|
516
|
+
fs.writeFileSync(scriptPath, script, { mode: 0o755 });
|
|
517
|
+
log.success("Uninstall script created: " + colors.cyan + scriptPath + colors.reset);
|
|
518
|
+
console.log(" Run it anytime to cleanly remove this global install:");
|
|
519
|
+
console.log(" " + colors.yellow + "bash " + scriptPath + colors.reset + "\n");
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Prompt user for local Qdrant + Ollama usage
|
|
523
|
+
async function promptLocalInfrastructure() {
|
|
524
|
+
// ── Step 1: Detect what's already running ──────────────────────────────────
|
|
525
|
+
const detected = { ollama: false, docker: false, qdrant: false };
|
|
526
|
+
let ollamaUrl = "http://localhost:11434";
|
|
527
|
+
let qdrantUrl = "http://localhost:6333";
|
|
528
|
+
|
|
529
|
+
try { execSync("ollama --version", { stdio: "pipe" }); detected.ollama = true; } catch (e) {}
|
|
530
|
+
try { execSync("docker --version", { stdio: "pipe" }); detected.docker = true; } catch (e) {}
|
|
531
|
+
try {
|
|
532
|
+
execSync(`curl -sf ${qdrantUrl}/healthz`, { stdio: "pipe", timeout: 3000 });
|
|
533
|
+
detected.qdrant = true;
|
|
534
|
+
} catch (e) {}
|
|
535
|
+
|
|
536
|
+
const icon = (ok) => ok ? `${colors.green}✔ detected${colors.reset}` : `${colors.red}✖ not found${colors.reset}`;
|
|
537
|
+
|
|
538
|
+
console.log(`\n${colors.bright}━━━ Local Memory Infrastructure (Qdrant + Ollama) ━━━${colors.reset}\n`);
|
|
539
|
+
console.log(` This toolkit supports a ${colors.cyan}local vector memory system${colors.reset} powered by:`);
|
|
540
|
+
console.log(` • ${colors.green}Qdrant${colors.reset} — local vector database for semantic agent memory`);
|
|
541
|
+
console.log(` • ${colors.green}Ollama${colors.reset} — local LLM runtime for private embeddings (nomic-embed-text)\n`);
|
|
542
|
+
console.log(` ${colors.bright}Current status:${colors.reset}`);
|
|
543
|
+
console.log(` Ollama CLI ${icon(detected.ollama)}`);
|
|
544
|
+
console.log(` Docker CLI ${icon(detected.docker)}`);
|
|
545
|
+
console.log(` Qdrant API ${icon(detected.qdrant)} (${qdrantUrl})\n`);
|
|
546
|
+
|
|
547
|
+
// ── Step 2: Ask enable/skip ────────────────────────────────────────────────
|
|
548
|
+
const allReady = detected.ollama && detected.qdrant;
|
|
549
|
+
if (allReady) {
|
|
550
|
+
console.log(` ${colors.green}✔ Both services detected — enabling memory is recommended.${colors.reset}\n`);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
console.log(` ${colors.bright}1. Yes${colors.reset} — enable memory (Qdrant + Ollama)`);
|
|
554
|
+
console.log(` ${colors.bright}2. Skip${colors.reset} — disable for now (can enable later in .env)\n`);
|
|
555
|
+
|
|
556
|
+
const answer1 = await _ask(` Enable memory? (1/2, default: 1): `);
|
|
557
|
+
const wantsMemory = !(answer1 === "2" || ["skip","no","n"].includes(answer1.toLowerCase()));
|
|
558
|
+
|
|
559
|
+
if (!wantsMemory) {
|
|
560
|
+
log.info("Memory infrastructure skipped.");
|
|
561
|
+
return { useLocal: false, detected, ollamaUrl, qdrantUrl };
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// ── Step 3: Per-service resolution when not detected ──────────────────────
|
|
565
|
+
if (!detected.ollama) {
|
|
566
|
+
console.log(`\n ${colors.yellow}⚠ Ollama not detected at localhost.${colors.reset}`);
|
|
567
|
+
console.log(` ${colors.bright}What would you like to do?${colors.reset}`);
|
|
568
|
+
console.log(` ${colors.bright}1.${colors.reset} I'll install it locally → ${colors.cyan}https://ollama.com/download${colors.reset}`);
|
|
569
|
+
console.log(` ${colors.bright}2.${colors.reset} I have it on a custom URL (remote server / Docker host)\n`);
|
|
570
|
+
const a = await _ask(` Choice (1/2, default: 1): `);
|
|
571
|
+
if (a === "2") {
|
|
572
|
+
const url = await _ask(` Enter Ollama URL (e.g. http://192.168.1.10:11434): `);
|
|
573
|
+
if (url.trim()) {
|
|
574
|
+
ollamaUrl = url.trim().replace(/\/$/, "");
|
|
575
|
+
log.success(`Ollama URL set to: ${colors.cyan}${ollamaUrl}${colors.reset}`);
|
|
576
|
+
// Verify it's reachable
|
|
577
|
+
try {
|
|
578
|
+
execSync(`curl -sf ${ollamaUrl}/api/tags`, { stdio: "pipe", timeout: 4000 });
|
|
579
|
+
log.success(`Ollama reachable at ${ollamaUrl}`);
|
|
580
|
+
detected.ollama = true;
|
|
581
|
+
} catch (e) {
|
|
582
|
+
log.warn(`Could not reach Ollama at ${ollamaUrl} — make sure it's running.`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
} else {
|
|
586
|
+
console.log(` ${colors.cyan}Install Ollama, then run:${colors.reset} ${colors.yellow}ollama pull nomic-embed-text${colors.reset}`);
|
|
587
|
+
console.log(` Memory will be written to .env — start Ollama before using the agent.\n`);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
if (!detected.qdrant) {
|
|
592
|
+
console.log(`\n ${colors.yellow}⚠ Qdrant not detected at ${qdrantUrl}.${colors.reset}`);
|
|
593
|
+
console.log(` ${colors.bright}What would you like to do?${colors.reset}`);
|
|
594
|
+
console.log(` ${colors.bright}1.${colors.reset} I'll run it locally via Docker`);
|
|
595
|
+
console.log(` ${colors.yellow}docker run -d -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant${colors.reset}`);
|
|
596
|
+
console.log(` ${colors.bright}2.${colors.reset} I have Qdrant on a custom URL (Qdrant Cloud, remote server, etc.)\n`);
|
|
597
|
+
const a = await _ask(` Choice (1/2, default: 1): `);
|
|
598
|
+
if (a === "2") {
|
|
599
|
+
const url = await _ask(` Enter Qdrant URL (e.g. https://xyz.qdrant.tech or http://10.0.0.5:6333): `);
|
|
600
|
+
if (url.trim()) {
|
|
601
|
+
qdrantUrl = url.trim().replace(/\/$/, "");
|
|
602
|
+
const apiKey = await _ask(` Qdrant API key (leave blank if not required): `);
|
|
603
|
+
log.success(`Qdrant URL set to: ${colors.cyan}${qdrantUrl}${colors.reset}`);
|
|
604
|
+
// Verify
|
|
605
|
+
try {
|
|
606
|
+
const header = apiKey.trim() ? `-H 'api-key: ${apiKey.trim()}'` : "";
|
|
607
|
+
execSync(`curl -sf ${header} ${qdrantUrl}/healthz`, { stdio: "pipe", timeout: 4000 });
|
|
608
|
+
log.success(`Qdrant reachable at ${qdrantUrl}`);
|
|
609
|
+
detected.qdrant = true;
|
|
610
|
+
} catch (e) {
|
|
611
|
+
log.warn(`Could not reach Qdrant at ${qdrantUrl} — check URL and API key.`);
|
|
612
|
+
}
|
|
613
|
+
return { useLocal: true, detected, ollamaUrl, qdrantUrl, qdrantApiKey: apiKey.trim() };
|
|
614
|
+
}
|
|
615
|
+
} else {
|
|
616
|
+
if (!detected.docker) {
|
|
617
|
+
console.log(`\n ${colors.yellow}⚠ Docker also not found.${colors.reset} Install Docker Desktop first:`);
|
|
618
|
+
console.log(` ${colors.cyan}https://www.docker.com/products/docker-desktop${colors.reset}`);
|
|
619
|
+
}
|
|
620
|
+
console.log(` Memory config will be written to .env — start Qdrant before using the agent.\n`);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
log.success("Memory infrastructure configured.");
|
|
625
|
+
return { useLocal: true, detected, ollamaUrl, qdrantUrl };
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
// Helper: promisified readline question
|
|
629
|
+
function _ask(question) {
|
|
630
|
+
return new Promise((resolve) => {
|
|
631
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
632
|
+
rl.question(question, (answer) => { rl.close(); resolve(answer.trim()); });
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// Write (or merge) a .env file with memory configuration
|
|
637
|
+
function writeEnvFile(targetPath, infraChoice) {
|
|
638
|
+
const envPath = path.join(targetPath, ".env");
|
|
639
|
+
const envExamplePath = path.join(
|
|
640
|
+
__dirname,
|
|
641
|
+
"..",
|
|
642
|
+
"templates",
|
|
643
|
+
"base",
|
|
644
|
+
".env.example",
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
// Build the memory block
|
|
648
|
+
const memoryEnabled = infraChoice.useLocal ? "true" : "false";
|
|
649
|
+
const qdrantUrl = infraChoice.qdrantUrl || "http://localhost:6333";
|
|
650
|
+
const qdrantApiKey = infraChoice.qdrantApiKey || "";
|
|
651
|
+
const ollamaUrl = infraChoice.ollamaUrl || "http://localhost:11434";
|
|
652
|
+
|
|
653
|
+
const memoryBlock = [
|
|
654
|
+
"",
|
|
655
|
+
"# ============================================================",
|
|
656
|
+
"# Agent Memory Configuration (Qdrant & Local LLM)",
|
|
657
|
+
"# ============================================================",
|
|
658
|
+
`MEMORY_ENABLED=${memoryEnabled}`,
|
|
659
|
+
`QDRANT_URL=${qdrantUrl}`,
|
|
660
|
+
`QDRANT_API_KEY=${qdrantApiKey}`,
|
|
661
|
+
"QDRANT_COLLECTION=agent_memory",
|
|
662
|
+
"EMBEDDING_PROVIDER=ollama",
|
|
663
|
+
`OLLAMA_URL=${ollamaUrl}`,
|
|
664
|
+
"EMBEDDING_MODEL=nomic-embed-text",
|
|
665
|
+
"CACHE_THRESHOLD=0.92",
|
|
666
|
+
"CACHE_TTL_DAYS=7",
|
|
667
|
+
"",
|
|
668
|
+
].join("\n");
|
|
669
|
+
|
|
670
|
+
if (fs.existsSync(envPath)) {
|
|
671
|
+
// .env already exists — append the memory block only if not already present
|
|
672
|
+
const existing = fs.readFileSync(envPath, "utf8");
|
|
673
|
+
if (existing.includes("MEMORY_ENABLED")) {
|
|
674
|
+
// Already configured — patch just the MEMORY_ENABLED line
|
|
675
|
+
const patched = existing.replace(
|
|
676
|
+
/^MEMORY_ENABLED=.*/m,
|
|
677
|
+
`MEMORY_ENABLED=${memoryEnabled}`,
|
|
678
|
+
);
|
|
679
|
+
fs.writeFileSync(envPath, patched, "utf8");
|
|
680
|
+
log.success(`.env updated: MEMORY_ENABLED=${memoryEnabled}`);
|
|
681
|
+
} else {
|
|
682
|
+
// Append the new block
|
|
683
|
+
fs.appendFileSync(envPath, memoryBlock, "utf8");
|
|
684
|
+
log.success(`.env: memory configuration appended (MEMORY_ENABLED=${memoryEnabled})`);
|
|
685
|
+
}
|
|
686
|
+
} else {
|
|
687
|
+
// Create a fresh .env from the example template, then append memory block
|
|
688
|
+
let base = "";
|
|
689
|
+
if (fs.existsSync(envExamplePath)) {
|
|
690
|
+
base = fs.readFileSync(envExamplePath, "utf8");
|
|
691
|
+
} else {
|
|
692
|
+
base = "# AGI Agent Kit — Environment Configuration\n# Fill in your API keys below\n";
|
|
693
|
+
}
|
|
694
|
+
fs.writeFileSync(envPath, base + memoryBlock, "utf8");
|
|
695
|
+
log.success(`.env created (MEMORY_ENABLED=${memoryEnabled})`);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
176
699
|
// Prompt for update components
|
|
177
700
|
async function promptUpdateSelection() {
|
|
178
701
|
return new Promise((resolve) => {
|
|
@@ -228,48 +751,108 @@ function isSkillDir(dirPath) {
|
|
|
228
751
|
// Supports both flat (core/) and categorized (knowledge/frontend/react-patterns/) layouts.
|
|
229
752
|
// Skills are always installed flat at the destination: skills/<skill-name>/
|
|
230
753
|
function copySkills(targetPath, pack, templatesPath) {
|
|
231
|
-
|
|
754
|
+
const destSkillsPath = path.join(targetPath, "skills");
|
|
755
|
+
|
|
756
|
+
// Helper: install all skills inside a category directory
|
|
757
|
+
function installCategoryDir(categoryPath, categoryName) {
|
|
758
|
+
if (!fs.existsSync(categoryPath)) return 0;
|
|
759
|
+
let count = 0;
|
|
760
|
+
const entries = fs.readdirSync(categoryPath, { withFileTypes: true });
|
|
761
|
+
for (const entry of entries) {
|
|
762
|
+
if (!entry.isDirectory()) continue;
|
|
763
|
+
const entryPath = path.join(categoryPath, entry.name);
|
|
764
|
+
if (isSkillDir(entryPath)) {
|
|
765
|
+
// Direct skill (e.g. core/webcrawler/)
|
|
766
|
+
const dest = path.join(destSkillsPath, entry.name);
|
|
767
|
+
if (copyDirSync(entryPath, dest)) { count++; }
|
|
768
|
+
} else {
|
|
769
|
+
// Category dir (e.g. knowledge/frontend/) — recurse one level
|
|
770
|
+
const skillDirs = fs.readdirSync(entryPath, { withFileTypes: true })
|
|
771
|
+
.filter((d) => d.isDirectory() && isSkillDir(path.join(entryPath, d.name)));
|
|
772
|
+
for (const skill of skillDirs) {
|
|
773
|
+
const src = path.join(entryPath, skill.name);
|
|
774
|
+
const dest = path.join(destSkillsPath, skill.name);
|
|
775
|
+
if (copyDirSync(src, dest)) { count++; }
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
return count;
|
|
780
|
+
}
|
|
232
781
|
|
|
233
|
-
|
|
782
|
+
if (pack === "custom") {
|
|
783
|
+
// ── Custom pack: always install core, then per-domain selections ──
|
|
784
|
+
log.header("Installing Custom pack (core + selected domains)...");
|
|
234
785
|
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
786
|
+
// 1. Core skills always
|
|
787
|
+
const coreCount = installCategoryDir(
|
|
788
|
+
path.join(templatesPath, "skills", "core"), "core"
|
|
789
|
+
);
|
|
790
|
+
log.success(`Core: ${coreCount} skills installed`);
|
|
238
791
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
.readdirSync(srcSkillsPath, { withFileTypes: true })
|
|
242
|
-
.filter((d) => d.isDirectory());
|
|
792
|
+
// 2. Selected domains from env (set by promptDomainSelection)
|
|
793
|
+
const selected = (process.env._AGI_CUSTOM_DOMAINS || "").split(",").filter(Boolean);
|
|
243
794
|
|
|
244
|
-
|
|
245
|
-
|
|
795
|
+
if (selected.length === 0) {
|
|
796
|
+
log.warn("No domains selected — core only install.");
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
246
799
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
800
|
+
for (const domainId of selected) {
|
|
801
|
+
let total = 0;
|
|
802
|
+
// Install from knowledge/<domain> if it exists
|
|
803
|
+
const knPath = path.join(templatesPath, "skills", "knowledge", domainId);
|
|
804
|
+
if (fs.existsSync(knPath)) {
|
|
805
|
+
const n = installCategoryDir(knPath, domainId);
|
|
806
|
+
total += n;
|
|
807
|
+
}
|
|
808
|
+
// Install from extended/<domain> if it exists
|
|
809
|
+
const exPath = path.join(templatesPath, "skills", "extended", domainId);
|
|
810
|
+
if (fs.existsSync(exPath)) {
|
|
811
|
+
const n = installCategoryDir(exPath, domainId);
|
|
812
|
+
total += n;
|
|
813
|
+
}
|
|
814
|
+
const domainInfo = DOMAINS.find((d) => d.id === domainId);
|
|
815
|
+
const label = domainInfo ? domainInfo.label : domainId;
|
|
816
|
+
if (total > 0) {
|
|
817
|
+
log.success(`Domain ${colors.cyan}${label}${colors.reset}: ${total} skills installed`);
|
|
818
|
+
} else {
|
|
819
|
+
log.warn(`Domain ${label}: no skills found (check template paths)`);
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
} else {
|
|
824
|
+
// ── Standard pack: iterate skill groups ──
|
|
825
|
+
log.header(`Installing ${PACKS[pack].name} skills...`);
|
|
826
|
+
const skillGroups = PACKS[pack].skills;
|
|
827
|
+
|
|
828
|
+
for (const group of skillGroups) {
|
|
829
|
+
const srcSkillsPath = path.join(templatesPath, "skills", group);
|
|
830
|
+
if (fs.existsSync(srcSkillsPath)) {
|
|
831
|
+
const entries = fs.readdirSync(srcSkillsPath, { withFileTypes: true })
|
|
832
|
+
.filter((d) => d.isDirectory());
|
|
833
|
+
|
|
834
|
+
for (const entry of entries) {
|
|
835
|
+
const entryPath = path.join(srcSkillsPath, entry.name);
|
|
836
|
+
if (isSkillDir(entryPath)) {
|
|
837
|
+
const dest = path.join(destSkillsPath, entry.name);
|
|
838
|
+
if (copyDirSync(entryPath, dest)) {
|
|
839
|
+
log.success(`Installed skill: ${entry.name}`);
|
|
840
|
+
}
|
|
841
|
+
} else {
|
|
842
|
+
const categorySkills = fs.readdirSync(entryPath, { withFileTypes: true })
|
|
843
|
+
.filter((d) => d.isDirectory() && isSkillDir(path.join(entryPath, d.name)));
|
|
844
|
+
for (const skill of categorySkills) {
|
|
845
|
+
const src = path.join(entryPath, skill.name);
|
|
846
|
+
const dest = path.join(destSkillsPath, skill.name);
|
|
847
|
+
if (copyDirSync(src, dest)) {
|
|
848
|
+
log.success(`Installed skill: ${skill.name} (${entry.name})`);
|
|
849
|
+
}
|
|
267
850
|
}
|
|
268
851
|
}
|
|
269
852
|
}
|
|
853
|
+
} else {
|
|
854
|
+
log.warn(`Skills directory not found: ${srcSkillsPath}`);
|
|
270
855
|
}
|
|
271
|
-
} else {
|
|
272
|
-
log.warn(`Skills directory not found: ${srcSkillsPath}`);
|
|
273
856
|
}
|
|
274
857
|
}
|
|
275
858
|
}
|
|
@@ -332,7 +915,7 @@ function copyBaseFiles(targetPath, templatesPath, options) {
|
|
|
332
915
|
}
|
|
333
916
|
|
|
334
917
|
// Create symlinks for multi-platform support
|
|
335
|
-
function createSymlinks(targetPath) {
|
|
918
|
+
function createSymlinks(targetPath, options = {}) {
|
|
336
919
|
log.header("Creating symlinks...");
|
|
337
920
|
|
|
338
921
|
const agentsMd = path.join(targetPath, "AGENTS.md");
|
|
@@ -372,19 +955,21 @@ function createSymlinks(targetPath) {
|
|
|
372
955
|
return;
|
|
373
956
|
}
|
|
374
957
|
|
|
958
|
+
const homeDir = os.homedir() || process.env.HOME || process.env.USERPROFILE || "";
|
|
959
|
+
|
|
375
960
|
const platformDirs = [
|
|
376
|
-
{ platform: ".claude/skills", platformName: "Claude Code" },
|
|
377
|
-
{ platform: ".gemini/skills", platformName: "Gemini CLI" },
|
|
378
|
-
{ platform: ".codex/skills", platformName: "Codex CLI" },
|
|
379
|
-
{ platform: ".cursor/skills", platformName: "Cursor" },
|
|
380
|
-
{ platform: ".adal/skills", platformName: "AdaL CLI" },
|
|
381
|
-
{ platform: ".openclaw/skills", platformName: "OpenClaw" },
|
|
961
|
+
{ platform: ".claude/skills", platformName: "Claude Code", globalPath: path.join(homeDir, ".claude", "skills") },
|
|
962
|
+
{ platform: ".gemini/skills", platformName: "Gemini CLI", globalPath: path.join(homeDir, ".gemini", "skills") },
|
|
963
|
+
{ platform: ".codex/skills", platformName: "Codex CLI", globalPath: path.join(process.env.CODEX_HOME || homeDir, ".codex", "skills") },
|
|
964
|
+
{ platform: ".cursor/skills", platformName: "Cursor", globalPath: path.join(homeDir, ".cursor", "skills") },
|
|
965
|
+
{ platform: ".adal/skills", platformName: "AdaL CLI", globalPath: path.join(homeDir, ".adal", "skills") },
|
|
966
|
+
{ platform: ".openclaw/skills", platformName: "OpenClaw", globalPath: path.join(homeDir, ".openclaw", "skills") },
|
|
382
967
|
];
|
|
383
968
|
|
|
384
|
-
for (const
|
|
385
|
-
const
|
|
386
|
-
const
|
|
387
|
-
const
|
|
969
|
+
for (const info of platformDirs) {
|
|
970
|
+
const { platform, platformName, globalPath } = info;
|
|
971
|
+
const linkPath = options.global ? globalPath : path.join(targetPath, platform);
|
|
972
|
+
const parentDir = path.dirname(linkPath);
|
|
388
973
|
|
|
389
974
|
try {
|
|
390
975
|
// Create parent directory (e.g., .claude/)
|
|
@@ -513,6 +1098,62 @@ function setupPythonEnv(targetPath) {
|
|
|
513
1098
|
log.info(`Activate with: ${colors.yellow}${activateCmd}${colors.reset}`);
|
|
514
1099
|
}
|
|
515
1100
|
|
|
1101
|
+
// Ask user about platform orchestration features and apply them
|
|
1102
|
+
async function promptPlatformFeatures(targetPath) {
|
|
1103
|
+
const features = { agentTeams: false };
|
|
1104
|
+
|
|
1105
|
+
console.log(`\n${colors.bright}━━━ Platform Orchestration Features ━━━${colors.reset}\n`);
|
|
1106
|
+
console.log(` ${colors.bright}Agent Teams${colors.reset} (Claude Code only)`);
|
|
1107
|
+
console.log(` Enables true parallel multi-agent execution — multiple specialist`);
|
|
1108
|
+
console.log(` agents (frontend, backend, security, etc.) work simultaneously`);
|
|
1109
|
+
console.log(` rather than one at a time. Best for complex, multi-domain tasks.\n`);
|
|
1110
|
+
console.log(` ${colors.yellow}Requires:${colors.reset} Claude Code with experimental features enabled.`);
|
|
1111
|
+
console.log(` ${colors.green}Recommended${colors.reset} if you plan to use @orchestrator or specialist agents.\n`);
|
|
1112
|
+
console.log(` ${colors.bright}1. Enable Agent Teams${colors.reset} — writes to .claude/settings.json (recommended)`);
|
|
1113
|
+
console.log(` ${colors.bright}2. Skip${colors.reset} — you can enable it manually later\n`);
|
|
1114
|
+
|
|
1115
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1116
|
+
|
|
1117
|
+
return new Promise((resolve) => {
|
|
1118
|
+
rl.question(` Enable Agent Teams? (1/2, default: 1): `, (answer) => {
|
|
1119
|
+
rl.close();
|
|
1120
|
+
const choice = answer.trim();
|
|
1121
|
+
|
|
1122
|
+
if (choice === "2" || choice.toLowerCase() === "skip" || choice.toLowerCase() === "n") {
|
|
1123
|
+
log.info("Agent Teams skipped. Enable later by editing .claude/settings.json.");
|
|
1124
|
+
console.log(` Add this to ${colors.cyan}.claude/settings.json${colors.reset}:`);
|
|
1125
|
+
console.log(` ${colors.yellow}{ "env": { "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" } }${colors.reset}\n`);
|
|
1126
|
+
resolve(features);
|
|
1127
|
+
return;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// Write .claude/settings.json
|
|
1131
|
+
try {
|
|
1132
|
+
const claudeDir = path.join(targetPath, ".claude");
|
|
1133
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
1134
|
+
const settingsPath = path.join(claudeDir, "settings.json");
|
|
1135
|
+
|
|
1136
|
+
// Merge with existing settings if present
|
|
1137
|
+
let existing = {};
|
|
1138
|
+
if (fs.existsSync(settingsPath)) {
|
|
1139
|
+
try { existing = JSON.parse(fs.readFileSync(settingsPath, "utf8")); } catch (e) {}
|
|
1140
|
+
}
|
|
1141
|
+
existing.env = existing.env || {};
|
|
1142
|
+
existing.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = "1";
|
|
1143
|
+
|
|
1144
|
+
fs.writeFileSync(settingsPath, JSON.stringify(existing, null, 2), "utf8");
|
|
1145
|
+
features.agentTeams = true;
|
|
1146
|
+
log.success(`Agent Teams enabled → ${colors.cyan}${settingsPath}${colors.reset}`);
|
|
1147
|
+
console.log(` Restart Claude Code in this directory to activate.\n`);
|
|
1148
|
+
} catch (e) {
|
|
1149
|
+
log.warn(`Could not write .claude/settings.json: ${e.message}`);
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
resolve(features);
|
|
1153
|
+
});
|
|
1154
|
+
});
|
|
1155
|
+
}
|
|
1156
|
+
|
|
516
1157
|
// Auto-run platform setup wizard to pre-configure environment
|
|
517
1158
|
function runPlatformSetup(targetPath) {
|
|
518
1159
|
const setupScript = path.join(
|
|
@@ -561,14 +1202,166 @@ function runPlatformSetup(targetPath) {
|
|
|
561
1202
|
}
|
|
562
1203
|
}
|
|
563
1204
|
|
|
1205
|
+
// Verify memory system (Qdrant + Ollama) after .env is written
|
|
1206
|
+
function verifyMemorySetup(targetPath) {
|
|
1207
|
+
log.header("Verifying memory system (Qdrant + Ollama)...");
|
|
1208
|
+
|
|
1209
|
+
const bootScript = path.join(targetPath, "execution", "session_boot.py");
|
|
1210
|
+
|
|
1211
|
+
if (!fs.existsSync(bootScript)) {
|
|
1212
|
+
log.warn("session_boot.py not found — skipping memory verification.");
|
|
1213
|
+
console.log(
|
|
1214
|
+
` You can verify later: ${colors.yellow}python3 execution/session_boot.py --auto-fix${colors.reset}`,
|
|
1215
|
+
);
|
|
1216
|
+
return false;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
const isWindows = process.platform === "win32";
|
|
1220
|
+
const venvPython = isWindows
|
|
1221
|
+
? path.join(targetPath, ".venv", "Scripts", "python")
|
|
1222
|
+
: path.join(targetPath, ".venv", "bin", "python3");
|
|
1223
|
+
const pythonCmd = fs.existsSync(venvPython) ? `"${venvPython}"` : "python3";
|
|
1224
|
+
|
|
1225
|
+
try {
|
|
1226
|
+
const output = execSync(
|
|
1227
|
+
`${pythonCmd} "${bootScript}" --auto-fix`,
|
|
1228
|
+
{ stdio: "pipe", timeout: 60000, cwd: targetPath },
|
|
1229
|
+
).toString().trim();
|
|
1230
|
+
console.log(` ${output}`);
|
|
1231
|
+
return true;
|
|
1232
|
+
} catch (e) {
|
|
1233
|
+
// session_boot exits non-zero when services aren't running — show its output
|
|
1234
|
+
const output = (e.stdout || e.stderr || "").toString().trim();
|
|
1235
|
+
if (output) {
|
|
1236
|
+
console.log(`\n${output}\n`);
|
|
1237
|
+
}
|
|
1238
|
+
console.log(` ${colors.yellow}⚠ Memory services not detected yet.${colors.reset}`);
|
|
1239
|
+
console.log(`
|
|
1240
|
+
${colors.bright}Follow these steps to get Qdrant + Ollama running:${colors.reset}
|
|
1241
|
+
|
|
1242
|
+
${colors.bright}Step 1 — Install Ollama (if not already installed)${colors.reset}
|
|
1243
|
+
${colors.cyan}https://ollama.com/download${colors.reset}
|
|
1244
|
+
Download and install for your OS, then come back here.
|
|
1245
|
+
|
|
1246
|
+
${colors.bright}Step 2 — Start Ollama in a NEW terminal tab/window${colors.reset}
|
|
1247
|
+
${colors.yellow}ollama serve${colors.reset}
|
|
1248
|
+
${colors.red}⚠ IMPORTANT:${colors.reset} This command runs in the foreground and must stay open.
|
|
1249
|
+
Open a new terminal tab (Cmd+T on Mac) and leave this running there.
|
|
1250
|
+
You will see logs like "Listening on 127.0.0.1:11434" — that means it's ready.
|
|
1251
|
+
|
|
1252
|
+
${colors.bright}Step 3 — Start Qdrant via Docker (in your original terminal)${colors.reset}
|
|
1253
|
+
${colors.yellow}docker run -d -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant${colors.reset}
|
|
1254
|
+
The ${colors.cyan}-d${colors.reset} flag runs it in the background. Docker Desktop must be running first.
|
|
1255
|
+
Verify it's up: ${colors.yellow}curl http://localhost:6333/healthz${colors.reset} → should return ${colors.green}{"title":"qdrant"}${colors.reset}
|
|
1256
|
+
|
|
1257
|
+
${colors.bright}Step 4 — Re-run the memory verification${colors.reset}
|
|
1258
|
+
${colors.yellow}python3 execution/session_boot.py --auto-fix${colors.reset}
|
|
1259
|
+
This will pull the embedding model and create the memory collections automatically.
|
|
1260
|
+
`);
|
|
1261
|
+
return false;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
564
1265
|
// Main init function
|
|
1266
|
+
// Detect an existing AGI Agent Kit install and ask the user what to do
|
|
1267
|
+
async function detectExistingInstall(targetPath) {
|
|
1268
|
+
const agentsMd = path.join(targetPath, "AGENTS.md");
|
|
1269
|
+
const versionFile = path.join(targetPath, ".agi-version");
|
|
1270
|
+
|
|
1271
|
+
if (!fs.existsSync(agentsMd)) {
|
|
1272
|
+
return { action: "install" }; // Clean install
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
// Read installed version if available
|
|
1276
|
+
let installedVersion = "unknown";
|
|
1277
|
+
if (fs.existsSync(versionFile)) {
|
|
1278
|
+
installedVersion = fs.readFileSync(versionFile, "utf8").trim();
|
|
1279
|
+
} else {
|
|
1280
|
+
// Fallback: try to grep it from AGENTS.md
|
|
1281
|
+
const mdContent = fs.readFileSync(agentsMd, "utf8");
|
|
1282
|
+
const match = mdContent.match(/agi-agent-kit[\s@v]+([\d.]+)/);
|
|
1283
|
+
if (match) installedVersion = match[1];
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// Current package version
|
|
1287
|
+
let incomingVersion = "unknown";
|
|
1288
|
+
try {
|
|
1289
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
|
|
1290
|
+
incomingVersion = pkg.version || "unknown";
|
|
1291
|
+
} catch (e) {}
|
|
1292
|
+
|
|
1293
|
+
console.log(`\n${colors.bright}━━━ Existing Installation Detected ━━━${colors.reset}\n`);
|
|
1294
|
+
console.log(` ${colors.yellow}AGI Agent Kit is already installed in this directory.${colors.reset}`);
|
|
1295
|
+
console.log(` Installed version : ${colors.cyan}${installedVersion}${colors.reset}`);
|
|
1296
|
+
console.log(` Incoming version : ${colors.green}${incomingVersion}${colors.reset}\n`);
|
|
1297
|
+
|
|
1298
|
+
const isSameVersion = installedVersion === incomingVersion;
|
|
1299
|
+
if (isSameVersion) {
|
|
1300
|
+
console.log(` ${colors.yellow}⚠ Same version detected.${colors.reset} Reinstalling will overwrite current files.\n`);
|
|
1301
|
+
} else if (installedVersion !== "unknown" && incomingVersion !== "unknown") {
|
|
1302
|
+
const [iMaj, iMin, iPatch] = installedVersion.split(".").map(Number);
|
|
1303
|
+
const [nMaj, nMin, nPatch] = incomingVersion.split(".").map(Number);
|
|
1304
|
+
const isDowngrade = nMaj < iMaj || (nMaj === iMaj && nMin < iMin) || (nMaj === iMaj && nMin === iMin && nPatch < iPatch);
|
|
1305
|
+
if (isDowngrade) {
|
|
1306
|
+
console.log(` ${colors.red}⚠ WARNING: Incoming version is OLDER than installed.${colors.reset}`);
|
|
1307
|
+
console.log(` You are about to downgrade. This may break things.\n`);
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
console.log(` What would you like to do?\n`);
|
|
1312
|
+
console.log(` ${colors.green}1. Update${colors.reset} — refresh skills, directives & execution scripts`);
|
|
1313
|
+
console.log(` ${colors.cyan}Preserves${colors.reset} your .env, custom skills, and .agent/ folder`);
|
|
1314
|
+
console.log(` ${colors.yellow}2. Reinstall${colors.reset} — full overwrite of all files (${colors.red}destructive${colors.reset})`);
|
|
1315
|
+
console.log(` You will be offered a backup before anything is changed`);
|
|
1316
|
+
console.log(` ${colors.red}3. Cancel${colors.reset} — abort, make no changes\n`);
|
|
1317
|
+
|
|
1318
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1319
|
+
|
|
1320
|
+
return new Promise((resolve) => {
|
|
1321
|
+
rl.question(` Your choice (1/2/3, default: 1): `, (answer) => {
|
|
1322
|
+
rl.close();
|
|
1323
|
+
const choice = answer.trim();
|
|
1324
|
+
|
|
1325
|
+
if (choice === "3" || choice.toLowerCase() === "cancel") {
|
|
1326
|
+
log.info("Install cancelled.");
|
|
1327
|
+
process.exit(0);
|
|
1328
|
+
} else if (choice === "2" || choice.toLowerCase() === "reinstall") {
|
|
1329
|
+
log.warn("Full reinstall selected — all existing files will be overwritten.");
|
|
1330
|
+
resolve({ action: "reinstall", installedVersion, incomingVersion });
|
|
1331
|
+
} else {
|
|
1332
|
+
// Default: update
|
|
1333
|
+
log.success(`Update selected — refreshing to v${incomingVersion}, preserving .env and custom files.`);
|
|
1334
|
+
resolve({ action: "update", installedVersion, incomingVersion });
|
|
1335
|
+
}
|
|
1336
|
+
});
|
|
1337
|
+
});
|
|
1338
|
+
}
|
|
1339
|
+
|
|
565
1340
|
async function init(options) {
|
|
566
1341
|
log.header("🚀 AGI Agent Kit Initializer");
|
|
567
1342
|
|
|
1343
|
+
if (options.ci) {
|
|
1344
|
+
log.info("CI mode: all prompts skipped, using safe defaults (pack=core, memory=disabled, teams=skip).");
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
// Detect existing install FIRST — before any scope/pack prompts
|
|
1348
|
+
const existingInstall = options.ci
|
|
1349
|
+
? { action: "install" }
|
|
1350
|
+
: await detectExistingInstall(options.path);
|
|
1351
|
+
const isUpdate = existingInstall.action === "update";
|
|
1352
|
+
|
|
1353
|
+
// Ask install scope (project vs global) — skip if already set via CLI flag
|
|
1354
|
+
if (!options.ci) await promptInstallScope(options);
|
|
1355
|
+
|
|
1356
|
+
// Offer backup only for reinstall (update preserves files, and backup is implied)
|
|
1357
|
+
if (!isUpdate && !options.ci) {
|
|
1358
|
+
await backupExistingFiles(options.path, options);
|
|
1359
|
+
}
|
|
1360
|
+
|
|
568
1361
|
// Determine pack
|
|
569
1362
|
let pack = options.pack;
|
|
570
1363
|
if (!pack) {
|
|
571
|
-
pack = await promptPackSelection();
|
|
1364
|
+
pack = options.ci ? "core" : await promptPackSelection();
|
|
572
1365
|
}
|
|
573
1366
|
|
|
574
1367
|
if (!PACKS[pack]) {
|
|
@@ -597,7 +1390,7 @@ async function init(options) {
|
|
|
597
1390
|
|
|
598
1391
|
// Create symlinks
|
|
599
1392
|
if (options.symlinks) {
|
|
600
|
-
createSymlinks(options.path);
|
|
1393
|
+
createSymlinks(options.path, options);
|
|
601
1394
|
}
|
|
602
1395
|
|
|
603
1396
|
// Copy .agent/ for full pack
|
|
@@ -608,21 +1401,87 @@ async function init(options) {
|
|
|
608
1401
|
// Setup Python environment
|
|
609
1402
|
setupPythonEnv(options.path);
|
|
610
1403
|
|
|
1404
|
+
// Ask user about local Qdrant + Ollama and write .env
|
|
1405
|
+
// Skip on update (preserve existing .env settings)
|
|
1406
|
+
let infraChoice = { useLocal: false, detected: {}, ollamaUrl: "http://localhost:11434", qdrantUrl: "http://localhost:6333" };
|
|
1407
|
+
if (!isUpdate && !options.ci) {
|
|
1408
|
+
infraChoice = await promptLocalInfrastructure();
|
|
1409
|
+
writeEnvFile(options.path, infraChoice);
|
|
1410
|
+
} else if (!isUpdate && options.ci) {
|
|
1411
|
+
// CI: write .env with memory disabled — no Qdrant/Ollama available
|
|
1412
|
+
writeEnvFile(options.path, infraChoice);
|
|
1413
|
+
log.info("CI mode: memory disabled in .env.");
|
|
1414
|
+
} else {
|
|
1415
|
+
// On update, read existing MEMORY_ENABLED from .env so hints stay accurate
|
|
1416
|
+
const envPath = path.join(options.path, ".env");
|
|
1417
|
+
if (fs.existsSync(envPath)) {
|
|
1418
|
+
const envContent = fs.readFileSync(envPath, "utf8");
|
|
1419
|
+
const memMatch = envContent.match(/^MEMORY_ENABLED=(.+)$/m);
|
|
1420
|
+
infraChoice.useLocal = memMatch && memMatch[1].trim() === "true";
|
|
1421
|
+
}
|
|
1422
|
+
log.info("Update mode: .env preserved, memory setting unchanged.");
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
// If memory enabled, verify Qdrant + Ollama are up and configured
|
|
1426
|
+
let memoryVerified = false;
|
|
1427
|
+
if (infraChoice.useLocal) {
|
|
1428
|
+
memoryVerified = verifyMemorySetup(options.path);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
// Ask about platform features (Agent Teams, MCP, etc.) BEFORE running setup wizard
|
|
1432
|
+
const platformFeatures = options.ci
|
|
1433
|
+
? { agentTeams: false }
|
|
1434
|
+
: await promptPlatformFeatures(options.path);
|
|
1435
|
+
|
|
611
1436
|
// Auto-run platform setup wizard
|
|
612
1437
|
runPlatformSetup(options.path);
|
|
613
1438
|
|
|
1439
|
+
// For global installs: generate an uninstall script
|
|
1440
|
+
if (options.global) {
|
|
1441
|
+
generateUninstallScript(options.path, options);
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
// Write version stamp so future runs can detect the installed version
|
|
1445
|
+
try {
|
|
1446
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
|
|
1447
|
+
fs.writeFileSync(path.join(options.path, ".agi-version"), pkg.version || "unknown", "utf8");
|
|
1448
|
+
} catch (e) { /* non-fatal */ }
|
|
1449
|
+
|
|
614
1450
|
// Final message
|
|
615
|
-
|
|
1451
|
+
const actionLabel = isUpdate ? "🔄 Update complete!" : "✨ Installation complete!";
|
|
1452
|
+
log.header(actionLabel);
|
|
1453
|
+
|
|
1454
|
+
let memoryHint;
|
|
1455
|
+
if (!infraChoice.useLocal) {
|
|
1456
|
+
memoryHint = ` 3. ${colors.yellow}Memory is DISABLED${colors.reset}. To enable later, set ${colors.cyan}MEMORY_ENABLED=true${colors.reset} in ${colors.cyan}.env${colors.reset}.`;
|
|
1457
|
+
} else if (memoryVerified) {
|
|
1458
|
+
// Services were already up and verified during install
|
|
1459
|
+
memoryHint = ` 3. ${colors.green}✔ Memory is READY${colors.reset} — Qdrant + Ollama verified during setup.\n Run at any time to check: ${colors.yellow}python3 execution/session_boot.py${colors.reset}`;
|
|
1460
|
+
} else {
|
|
1461
|
+
// User chose to enable but services weren't up yet
|
|
1462
|
+
memoryHint = ` 3. ${colors.bright}Start memory services${colors.reset} (open a ${colors.red}NEW terminal tab${colors.reset} for Ollama):\n\n ${colors.yellow}# Terminal tab 1 — leave this running:${colors.reset}\n ${colors.yellow}ollama serve${colors.reset}\n\n ${colors.yellow}# Terminal tab 2 — run once:${colors.reset}\n ${colors.yellow}docker run -d -p 6333:6333 -v qdrant_storage:/qdrant/storage qdrant/qdrant${colors.reset}\n ${colors.yellow}python3 execution/session_boot.py --auto-fix${colors.reset}`;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
616
1465
|
console.log(`
|
|
617
|
-
|
|
618
|
-
|
|
1466
|
+
${colors.bright}Summary of what was configured:${colors.reset}
|
|
1467
|
+
${colors.green}✔${colors.reset} Python environment (.venv)
|
|
1468
|
+
${colors.green}✔${colors.reset} Skills installed (${pack} pack)
|
|
1469
|
+
${colors.green}✔${colors.reset} AGENTS.md + platform symlinks
|
|
1470
|
+
${infraChoice.useLocal ? colors.green + "✔" + colors.reset : colors.yellow + "−" + colors.reset} Memory (Qdrant + Ollama): ${infraChoice.useLocal ? colors.green + "enabled" + colors.reset : colors.yellow + "disabled" + colors.reset}
|
|
1471
|
+
${platformFeatures.agentTeams ? colors.green + "✔" + colors.reset : colors.yellow + "−" + colors.reset} Agent Teams (parallel execution): ${platformFeatures.agentTeams ? colors.green + "enabled" + colors.reset : colors.yellow + "skipped" + colors.reset}
|
|
1472
|
+
${colors.dim}− MCP Servers: not configured (project-specific, add later)${colors.reset}
|
|
1473
|
+
|
|
1474
|
+
${colors.bright}Next steps:${colors.reset}
|
|
1475
|
+
1. Activate Python environment:
|
|
619
1476
|
${colors.yellow}source .venv/bin/activate${colors.reset}
|
|
620
1477
|
2. Review ${colors.cyan}AGENTS.md${colors.reset} for architecture overview
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
1478
|
+
${memoryHint}${platformFeatures.agentTeams ? "" : `
|
|
1479
|
+
▸ To enable Agent Teams later:\n ${colors.yellow}echo '${JSON.stringify({ env: { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: "1" } }, null, 2)}' > .claude/settings.json${colors.reset}`}
|
|
1480
|
+
▸ To add MCP servers: edit ${colors.cyan}.claude/settings.json${colors.reset} → ${colors.cyan}mcpServers${colors.reset} section
|
|
1481
|
+
▸ To install Claude plugins (pyright-lsp etc): type inside Claude Code:
|
|
1482
|
+
${colors.yellow}/plugin install pyright-lsp@claude-plugins-official${colors.reset}
|
|
1483
|
+
▸ Check ${colors.cyan}skills/${colors.reset} for available capabilities
|
|
1484
|
+
|
|
626
1485
|
Happy coding! 🎉
|
|
627
1486
|
`);
|
|
628
1487
|
}
|
|
@@ -714,7 +1573,7 @@ async function update(options) {
|
|
|
714
1573
|
// 4. Update Core Documentation if needed
|
|
715
1574
|
// We generally respect user's AGENTS.md, but maybe we update GEMINI.md/CLAUDE.md symlinks?
|
|
716
1575
|
if (options.symlinks) {
|
|
717
|
-
createSymlinks(options.path);
|
|
1576
|
+
createSymlinks(options.path, options);
|
|
718
1577
|
}
|
|
719
1578
|
|
|
720
1579
|
log.header("✨ Update complete!");
|