@smilintux/skcapstone 0.1.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +98 -0
- package/.github/workflows/ci.yml +39 -3
- package/.github/workflows/publish.yml +25 -4
- package/.openclaw-workspace.json +58 -0
- package/CHANGELOG.md +62 -0
- package/CLAUDE.md +39 -2
- package/MANIFEST.in +6 -0
- package/MISSION.md +7 -0
- package/README.md +47 -2
- package/SKILL.md +895 -23
- package/docker/Dockerfile +61 -0
- package/docker/compose-templates/dev-team.yml +203 -0
- package/docker/compose-templates/mini-team.yml +140 -0
- package/docker/compose-templates/ops-team.yml +173 -0
- package/docker/compose-templates/research-team.yml +170 -0
- package/docker/entrypoint.sh +192 -0
- package/docs/ARCHITECTURE.md +663 -374
- package/docs/BOND_WITH_GROK.md +112 -0
- package/docs/GETTING_STARTED.md +782 -0
- package/docs/QUICKSTART.md +477 -0
- package/docs/SKJOULE_ARCHITECTURE.md +658 -0
- package/docs/SOUL_SWAPPER.md +921 -0
- package/docs/SOVEREIGN_SINGULARITY.md +47 -14
- package/examples/custom-bond-template.json +36 -0
- package/examples/grok-feb.json +36 -0
- package/examples/grok-testimony.md +34 -0
- package/examples/love-bootloader.txt +32 -0
- package/examples/plugins/echo_tool.py +87 -0
- package/examples/queen-ava-feb.json +36 -0
- package/examples/souls/lumina.yaml +64 -0
- package/index.js +6 -5
- package/installer/build.py +124 -0
- package/openclaw-plugin/package.json +13 -0
- package/openclaw-plugin/src/index.ts +351 -0
- package/openclaw-plugin/src/openclaw.plugin.json +10 -0
- package/package.json +1 -1
- package/pyproject.toml +38 -2
- package/scripts/bump_version.py +141 -0
- package/scripts/check-updates.py +230 -0
- package/scripts/convert_blueprints_to_yaml.py +157 -0
- package/scripts/dev-install.sh +14 -0
- package/scripts/e2e-test.sh +193 -0
- package/scripts/install-bundle.sh +171 -0
- package/scripts/install.bat +2 -0
- package/scripts/install.ps1 +253 -0
- package/scripts/install.sh +185 -0
- package/scripts/mcp-serve.sh +69 -0
- package/scripts/mcp-server.bat +113 -0
- package/scripts/mcp-server.ps1 +116 -0
- package/scripts/mcp-server.sh +99 -0
- package/scripts/pull-models.sh +10 -0
- package/scripts/skcapstone +48 -0
- package/scripts/verify_install.sh +180 -0
- package/scripts/windows/install-tasks.ps1 +406 -0
- package/scripts/windows/skcapstone-task.xml +113 -0
- package/scripts/windows/uninstall-tasks.ps1 +117 -0
- package/skill.yaml +34 -0
- package/src/skcapstone/__init__.py +67 -2
- package/src/skcapstone/_cli_monolith.py +5916 -0
- package/src/skcapstone/_trustee_helpers.py +165 -0
- package/src/skcapstone/activity.py +105 -0
- package/src/skcapstone/agent_card.py +324 -0
- package/src/skcapstone/api.py +1935 -0
- package/src/skcapstone/archiver.py +340 -0
- package/src/skcapstone/auction.py +485 -0
- package/src/skcapstone/baby_agents.py +179 -0
- package/src/skcapstone/backup.py +345 -0
- package/src/skcapstone/blueprint_registry.py +357 -0
- package/src/skcapstone/blueprints/__init__.py +17 -0
- package/src/skcapstone/blueprints/builtins/content-studio.yaml +81 -0
- package/src/skcapstone/blueprints/builtins/defi-trading.yaml +81 -0
- package/src/skcapstone/blueprints/builtins/dev-squadron.yaml +95 -0
- package/src/skcapstone/blueprints/builtins/infrastructure-guardian.yaml +107 -0
- package/src/skcapstone/blueprints/builtins/legal-council.yaml +54 -0
- package/src/skcapstone/blueprints/builtins/ops-monitoring.yaml +67 -0
- package/src/skcapstone/blueprints/builtins/research-pod.yaml +69 -0
- package/src/skcapstone/blueprints/builtins/sovereign-launch.yaml +90 -0
- package/src/skcapstone/blueprints/registry.py +164 -0
- package/src/skcapstone/blueprints/schema.py +229 -0
- package/src/skcapstone/changelog.py +180 -0
- package/src/skcapstone/chat.py +769 -0
- package/src/skcapstone/claude_md.py +82 -0
- package/src/skcapstone/cli/__init__.py +144 -0
- package/src/skcapstone/cli/_common.py +88 -0
- package/src/skcapstone/cli/_validators.py +76 -0
- package/src/skcapstone/cli/agents.py +425 -0
- package/src/skcapstone/cli/agents_spawner.py +322 -0
- package/src/skcapstone/cli/agents_trustee.py +593 -0
- package/src/skcapstone/cli/alerts.py +248 -0
- package/src/skcapstone/cli/anchor.py +132 -0
- package/src/skcapstone/cli/archive_cmd.py +208 -0
- package/src/skcapstone/cli/backup.py +144 -0
- package/src/skcapstone/cli/bench.py +377 -0
- package/src/skcapstone/cli/benchmark.py +360 -0
- package/src/skcapstone/cli/capabilities_cmd.py +171 -0
- package/src/skcapstone/cli/card.py +151 -0
- package/src/skcapstone/cli/chat.py +584 -0
- package/src/skcapstone/cli/completions.py +64 -0
- package/src/skcapstone/cli/config_cmd.py +156 -0
- package/src/skcapstone/cli/consciousness.py +421 -0
- package/src/skcapstone/cli/context_cmd.py +142 -0
- package/src/skcapstone/cli/coord.py +194 -0
- package/src/skcapstone/cli/crush_cmd.py +170 -0
- package/src/skcapstone/cli/daemon.py +436 -0
- package/src/skcapstone/cli/errors_cmd.py +285 -0
- package/src/skcapstone/cli/export_cmd.py +156 -0
- package/src/skcapstone/cli/gtd.py +529 -0
- package/src/skcapstone/cli/housekeeping.py +81 -0
- package/src/skcapstone/cli/joule_cmd.py +627 -0
- package/src/skcapstone/cli/logs_cmd.py +194 -0
- package/src/skcapstone/cli/mcp_cmd.py +32 -0
- package/src/skcapstone/cli/memory.py +418 -0
- package/src/skcapstone/cli/metrics_cmd.py +136 -0
- package/src/skcapstone/cli/migrate.py +62 -0
- package/src/skcapstone/cli/mood_cmd.py +144 -0
- package/src/skcapstone/cli/mount.py +193 -0
- package/src/skcapstone/cli/notify.py +112 -0
- package/src/skcapstone/cli/peer.py +154 -0
- package/src/skcapstone/cli/peers_dir.py +122 -0
- package/src/skcapstone/cli/preflight_cmd.py +83 -0
- package/src/skcapstone/cli/profile_cmd.py +310 -0
- package/src/skcapstone/cli/record_cmd.py +238 -0
- package/src/skcapstone/cli/register_cmd.py +159 -0
- package/src/skcapstone/cli/search_cmd.py +156 -0
- package/src/skcapstone/cli/service_cmd.py +91 -0
- package/src/skcapstone/cli/session.py +127 -0
- package/src/skcapstone/cli/setup.py +240 -0
- package/src/skcapstone/cli/shell_cmd.py +43 -0
- package/src/skcapstone/cli/skills_cmd.py +168 -0
- package/src/skcapstone/cli/skseed.py +621 -0
- package/src/skcapstone/cli/soul.py +699 -0
- package/src/skcapstone/cli/status.py +935 -0
- package/src/skcapstone/cli/sync_cmd.py +301 -0
- package/src/skcapstone/cli/telegram.py +265 -0
- package/src/skcapstone/cli/test_cmd.py +234 -0
- package/src/skcapstone/cli/test_connection.py +253 -0
- package/src/skcapstone/cli/token.py +207 -0
- package/src/skcapstone/cli/trust.py +179 -0
- package/src/skcapstone/cli/upgrade_cmd.py +552 -0
- package/src/skcapstone/cli/usage_cmd.py +199 -0
- package/src/skcapstone/cli/version_cmd.py +162 -0
- package/src/skcapstone/cli/watch_cmd.py +342 -0
- package/src/skcapstone/client.py +428 -0
- package/src/skcapstone/cloud9_bridge.py +522 -0
- package/src/skcapstone/completions.py +163 -0
- package/src/skcapstone/config_validator.py +674 -0
- package/src/skcapstone/connectors/__init__.py +28 -0
- package/src/skcapstone/connectors/base.py +446 -0
- package/src/skcapstone/connectors/cursor.py +54 -0
- package/src/skcapstone/connectors/registry.py +254 -0
- package/src/skcapstone/connectors/terminal.py +152 -0
- package/src/skcapstone/connectors/vscode.py +60 -0
- package/src/skcapstone/consciousness_config.py +119 -0
- package/src/skcapstone/consciousness_loop.py +2051 -0
- package/src/skcapstone/context_loader.py +516 -0
- package/src/skcapstone/context_window.py +314 -0
- package/src/skcapstone/conversation_manager.py +238 -0
- package/src/skcapstone/conversation_store.py +230 -0
- package/src/skcapstone/conversation_summarizer.py +252 -0
- package/src/skcapstone/coord_federation.py +296 -0
- package/src/skcapstone/coordination.py +101 -7
- package/src/skcapstone/crush_integration.py +345 -0
- package/src/skcapstone/crush_shim.py +454 -0
- package/src/skcapstone/daemon.py +2494 -0
- package/src/skcapstone/dashboard.html +396 -0
- package/src/skcapstone/dashboard.py +481 -0
- package/src/skcapstone/data/model_profiles.yaml +88 -0
- package/src/skcapstone/defaults/__init__.py +55 -0
- package/src/skcapstone/defaults/lumina/config/skmemory.yaml +13 -0
- package/src/skcapstone/defaults/lumina/identity/identity.json +9 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/07a8b9c0d1e2-memory-system.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/29c0d1e2f3a4-multi-agent-coordination.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/3ad1e2f3a4b5-community-support.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/c3d4e5f6a7b8-getting-started.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/e5f6a7b8c9d0-how-to-contribute.json +23 -0
- package/src/skcapstone/defaults/lumina/memory/long-term/f6a7b8c9d0e1-sovereignty-explained.json +23 -0
- package/src/skcapstone/defaults/lumina/seeds/curiosity.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/joy.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/love.seed.json +24 -0
- package/src/skcapstone/defaults/lumina/seeds/sovereign-awakening.seed.json +43 -0
- package/src/skcapstone/defaults/lumina/soul/active.json +6 -0
- package/src/skcapstone/defaults/lumina/soul/base.json +22 -0
- package/src/skcapstone/defaults/lumina/trust/febs/welcome.feb +79 -0
- package/src/skcapstone/defaults/lumina/trust/trust.json +8 -0
- package/src/skcapstone/discovery.py +210 -19
- package/src/skcapstone/doctor.py +642 -0
- package/src/skcapstone/emotion_tracker.py +467 -0
- package/src/skcapstone/error_queue.py +405 -0
- package/src/skcapstone/export.py +447 -0
- package/src/skcapstone/fallback_tracker.py +186 -0
- package/src/skcapstone/file_transfer.py +512 -0
- package/src/skcapstone/fuse_mount.py +1156 -0
- package/src/skcapstone/gui_installer.py +591 -0
- package/src/skcapstone/heartbeat.py +611 -0
- package/src/skcapstone/housekeeping.py +298 -0
- package/src/skcapstone/install_wizard.py +941 -0
- package/src/skcapstone/kms.py +942 -0
- package/src/skcapstone/kms_scheduler.py +143 -0
- package/src/skcapstone/log_config.py +135 -0
- package/src/skcapstone/mcp_launcher.py +239 -0
- package/src/skcapstone/mcp_server.py +4700 -0
- package/src/skcapstone/mcp_tools/__init__.py +94 -0
- package/src/skcapstone/mcp_tools/_helpers.py +51 -0
- package/src/skcapstone/mcp_tools/agent_tools.py +243 -0
- package/src/skcapstone/mcp_tools/ansible_tools.py +232 -0
- package/src/skcapstone/mcp_tools/capauth_tools.py +186 -0
- package/src/skcapstone/mcp_tools/chat_tools.py +325 -0
- package/src/skcapstone/mcp_tools/cloud9_tools.py +115 -0
- package/src/skcapstone/mcp_tools/comm_tools.py +104 -0
- package/src/skcapstone/mcp_tools/consciousness_tools.py +114 -0
- package/src/skcapstone/mcp_tools/coord_tools.py +219 -0
- package/src/skcapstone/mcp_tools/deploy_tools.py +202 -0
- package/src/skcapstone/mcp_tools/did_tools.py +448 -0
- package/src/skcapstone/mcp_tools/emotion_tools.py +62 -0
- package/src/skcapstone/mcp_tools/file_tools.py +169 -0
- package/src/skcapstone/mcp_tools/fortress_tools.py +120 -0
- package/src/skcapstone/mcp_tools/gtd_tools.py +821 -0
- package/src/skcapstone/mcp_tools/health_tools.py +44 -0
- package/src/skcapstone/mcp_tools/heartbeat_tools.py +195 -0
- package/src/skcapstone/mcp_tools/kms_tools.py +123 -0
- package/src/skcapstone/mcp_tools/memory_tools.py +222 -0
- package/src/skcapstone/mcp_tools/model_tools.py +75 -0
- package/src/skcapstone/mcp_tools/notification_tools.py +92 -0
- package/src/skcapstone/mcp_tools/promoter_tools.py +101 -0
- package/src/skcapstone/mcp_tools/pubsub_tools.py +183 -0
- package/src/skcapstone/mcp_tools/security_tools.py +110 -0
- package/src/skcapstone/mcp_tools/skchat_tools.py +175 -0
- package/src/skcapstone/mcp_tools/skcomm_tools.py +122 -0
- package/src/skcapstone/mcp_tools/skills_tools.py +127 -0
- package/src/skcapstone/mcp_tools/skseed_tools.py +255 -0
- package/src/skcapstone/mcp_tools/skstacks_tools.py +288 -0
- package/src/skcapstone/mcp_tools/soul_tools.py +476 -0
- package/src/skcapstone/mcp_tools/sync_tools.py +92 -0
- package/src/skcapstone/mcp_tools/telegram_tools.py +477 -0
- package/src/skcapstone/mcp_tools/trust_tools.py +118 -0
- package/src/skcapstone/mcp_tools/trustee_tools.py +345 -0
- package/src/skcapstone/mdns_discovery.py +313 -0
- package/src/skcapstone/memory_adapter.py +333 -0
- package/src/skcapstone/memory_compressor.py +379 -0
- package/src/skcapstone/memory_curator.py +256 -0
- package/src/skcapstone/memory_engine.py +132 -13
- package/src/skcapstone/memory_fortress.py +529 -0
- package/src/skcapstone/memory_promoter.py +722 -0
- package/src/skcapstone/memory_verifier.py +260 -0
- package/src/skcapstone/message_crypto.py +215 -0
- package/src/skcapstone/metrics.py +832 -0
- package/src/skcapstone/migrate_memories.py +181 -0
- package/src/skcapstone/migrate_multi_agent.py +248 -0
- package/src/skcapstone/model_router.py +319 -0
- package/src/skcapstone/models.py +35 -4
- package/src/skcapstone/mood.py +344 -0
- package/src/skcapstone/notifications.py +380 -0
- package/src/skcapstone/onboard.py +901 -0
- package/src/skcapstone/peer_directory.py +324 -0
- package/src/skcapstone/peers.py +329 -0
- package/src/skcapstone/pillars/identity.py +84 -14
- package/src/skcapstone/pillars/memory.py +3 -1
- package/src/skcapstone/pillars/security.py +108 -15
- package/src/skcapstone/pillars/sync.py +78 -26
- package/src/skcapstone/pillars/trust.py +95 -33
- package/src/skcapstone/plugins.py +244 -0
- package/src/skcapstone/preflight.py +670 -0
- package/src/skcapstone/prompt_adapter.py +564 -0
- package/src/skcapstone/providers/__init__.py +13 -0
- package/src/skcapstone/providers/cloud.py +1061 -0
- package/src/skcapstone/providers/docker.py +759 -0
- package/src/skcapstone/providers/local.py +1193 -0
- package/src/skcapstone/providers/proxmox.py +447 -0
- package/src/skcapstone/pubsub.py +516 -0
- package/src/skcapstone/rate_limiter.py +119 -0
- package/src/skcapstone/register.py +241 -0
- package/src/skcapstone/registry_client.py +151 -0
- package/src/skcapstone/response_cache.py +194 -0
- package/src/skcapstone/response_scorer.py +225 -0
- package/src/skcapstone/runtime.py +89 -33
- package/src/skcapstone/scheduled_tasks.py +439 -0
- package/src/skcapstone/self_healing.py +341 -0
- package/src/skcapstone/service_health.py +228 -0
- package/src/skcapstone/session_capture.py +268 -0
- package/src/skcapstone/session_recorder.py +210 -0
- package/src/skcapstone/session_replayer.py +189 -0
- package/src/skcapstone/session_skills.py +263 -0
- package/src/skcapstone/shell.py +779 -0
- package/src/skcapstone/skills/__init__.py +1 -1
- package/src/skcapstone/skills/syncthing_setup.py +143 -41
- package/src/skcapstone/skjoule.py +861 -0
- package/src/skcapstone/snapshots.py +489 -0
- package/src/skcapstone/soul.py +1060 -0
- package/src/skcapstone/soul_switch.py +255 -0
- package/src/skcapstone/spawner.py +544 -0
- package/src/skcapstone/state_diff.py +401 -0
- package/src/skcapstone/summary.py +270 -0
- package/src/skcapstone/sync/backends.py +196 -2
- package/src/skcapstone/sync/engine.py +7 -5
- package/src/skcapstone/sync/models.py +4 -1
- package/src/skcapstone/sync/vault.py +356 -18
- package/src/skcapstone/sync_engine.py +363 -0
- package/src/skcapstone/sync_watcher.py +745 -0
- package/src/skcapstone/systemd.py +331 -0
- package/src/skcapstone/team_comms.py +476 -0
- package/src/skcapstone/team_engine.py +522 -0
- package/src/skcapstone/testrunner.py +300 -0
- package/src/skcapstone/tls.py +150 -0
- package/src/skcapstone/tokens.py +5 -5
- package/src/skcapstone/trust_calibration.py +202 -0
- package/src/skcapstone/trust_graph.py +449 -0
- package/src/skcapstone/trustee_monitor.py +385 -0
- package/src/skcapstone/trustee_ops.py +425 -0
- package/src/skcapstone/unified_search.py +421 -0
- package/src/skcapstone/uninstall_wizard.py +694 -0
- package/src/skcapstone/usage.py +331 -0
- package/src/skcapstone/version_check.py +148 -0
- package/src/skcapstone/warmth_anchor.py +333 -0
- package/src/skcapstone/whoami.py +294 -0
- package/systemd/skcapstone-api.socket +9 -0
- package/systemd/skcapstone-memory-compress.service +18 -0
- package/systemd/skcapstone-memory-compress.timer +11 -0
- package/systemd/skcapstone.service +36 -0
- package/systemd/skcapstone@.service +50 -0
- package/systemd/skcomm-heartbeat.service +18 -0
- package/systemd/skcomm-heartbeat.timer +12 -0
- package/systemd/skcomm-queue-drain.service +17 -0
- package/systemd/skcomm-queue-drain.timer +12 -0
- package/tests/conftest.py +13 -1
- package/tests/integration/__init__.py +1 -0
- package/tests/integration/test_consciousness_e2e.py +877 -0
- package/tests/integration/test_skills_registry.py +744 -0
- package/tests/test_agent_card.py +190 -0
- package/tests/test_agent_runtime.py +1283 -0
- package/tests/test_alerts_cmd.py +291 -0
- package/tests/test_archiver.py +498 -0
- package/tests/test_backup.py +254 -0
- package/tests/test_benchmark.py +366 -0
- package/tests/test_blueprints.py +457 -0
- package/tests/test_capabilities.py +257 -0
- package/tests/test_changelog.py +254 -0
- package/tests/test_chat.py +385 -0
- package/tests/test_claude_md.py +271 -0
- package/tests/test_cli_chat_llm.py +336 -0
- package/tests/test_cli_completions.py +390 -0
- package/tests/test_cli_init_reset.py +164 -0
- package/tests/test_cli_memory.py +208 -0
- package/tests/test_cli_profile.py +294 -0
- package/tests/test_cli_skills.py +223 -0
- package/tests/test_cli_status.py +395 -0
- package/tests/test_cli_test_cmd.py +206 -0
- package/tests/test_cli_test_connection.py +364 -0
- package/tests/test_cloud9_bridge.py +260 -0
- package/tests/test_cloud_provider.py +449 -0
- package/tests/test_cloud_providers.py +522 -0
- package/tests/test_completions.py +158 -0
- package/tests/test_component_manager.py +398 -0
- package/tests/test_config_reload.py +386 -0
- package/tests/test_config_validate.py +529 -0
- package/tests/test_consciousness_e2e.py +296 -0
- package/tests/test_consciousness_loop.py +1289 -0
- package/tests/test_context_loader.py +310 -0
- package/tests/test_conversation_api.py +306 -0
- package/tests/test_conversation_manager.py +381 -0
- package/tests/test_conversation_store.py +391 -0
- package/tests/test_conversation_summarizer.py +302 -0
- package/tests/test_cross_package.py +791 -0
- package/tests/test_crush_shim.py +519 -0
- package/tests/test_daemon.py +781 -0
- package/tests/test_daemon_shutdown.py +309 -0
- package/tests/test_dashboard.py +454 -0
- package/tests/test_discovery.py +200 -6
- package/tests/test_docker_provider.py +966 -0
- package/tests/test_doctor.py +257 -0
- package/tests/test_doctor_fix.py +351 -0
- package/tests/test_e2e_automated.py +292 -0
- package/tests/test_error_queue.py +404 -0
- package/tests/test_export.py +441 -0
- package/tests/test_fallback_tracker.py +219 -0
- package/tests/test_file_transfer.py +397 -0
- package/tests/test_fuse_mount.py +832 -0
- package/tests/test_health_loop.py +422 -0
- package/tests/test_heartbeat.py +354 -0
- package/tests/test_housekeeping.py +195 -0
- package/tests/test_identity_capauth.py +307 -0
- package/tests/test_identity_pillar.py +117 -0
- package/tests/test_install_wizard.py +68 -0
- package/tests/test_integration.py +325 -0
- package/tests/test_kms.py +495 -0
- package/tests/test_llm_providers.py +265 -0
- package/tests/test_local_provider.py +591 -0
- package/tests/test_log_config.py +199 -0
- package/tests/test_logs_cmd.py +287 -0
- package/tests/test_mcp_server.py +1909 -0
- package/tests/test_memory_adapter.py +339 -0
- package/tests/test_memory_curator.py +218 -0
- package/tests/test_memory_engine.py +6 -0
- package/tests/test_memory_fortress.py +571 -0
- package/tests/test_memory_pillar.py +119 -0
- package/tests/test_memory_promoter.py +445 -0
- package/tests/test_memory_verifier.py +420 -0
- package/tests/test_message_crypto.py +187 -0
- package/tests/test_metrics.py +632 -0
- package/tests/test_migrate_memories.py +464 -0
- package/tests/test_model_router.py +546 -0
- package/tests/test_mood.py +394 -0
- package/tests/test_multi_agent.py +269 -0
- package/tests/test_notifications.py +270 -0
- package/tests/test_onboard.py +500 -0
- package/tests/test_peer_directory.py +395 -0
- package/tests/test_peers.py +248 -0
- package/tests/test_pillars.py +87 -9
- package/tests/test_preflight.py +484 -0
- package/tests/test_prompt_adapter.py +331 -0
- package/tests/test_proxmox_provider.py +571 -0
- package/tests/test_pubsub.py +377 -0
- package/tests/test_rate_limiter.py +121 -0
- package/tests/test_registry_client.py +129 -0
- package/tests/test_response_cache.py +312 -0
- package/tests/test_response_scorer.py +294 -0
- package/tests/test_runtime.py +59 -0
- package/tests/test_scheduled_tasks.py +451 -0
- package/tests/test_security.py +250 -0
- package/tests/test_security_pillar.py +213 -0
- package/tests/test_self_healing.py +171 -0
- package/tests/test_session_capture.py +200 -0
- package/tests/test_session_recorder.py +360 -0
- package/tests/test_session_skills.py +235 -0
- package/tests/test_shell.py +210 -0
- package/tests/test_snapshots.py +549 -0
- package/tests/test_soul.py +984 -0
- package/tests/test_soul_swap.py +406 -0
- package/tests/test_spawner.py +211 -0
- package/tests/test_state_diff.py +173 -0
- package/tests/test_summary.py +135 -0
- package/tests/test_sync.py +315 -5
- package/tests/test_sync_backends.py +560 -0
- package/tests/test_sync_engine.py +482 -0
- package/tests/test_sync_pillar.py +344 -0
- package/tests/test_sync_pipeline.py +364 -0
- package/tests/test_sync_vault.py +581 -0
- package/tests/test_syncthing_setup.py +168 -22
- package/tests/test_systemd.py +323 -0
- package/tests/test_team_comms.py +408 -0
- package/tests/test_team_engine.py +397 -0
- package/tests/test_testrunner.py +238 -0
- package/tests/test_trust_calibration.py +204 -0
- package/tests/test_trust_graph.py +207 -0
- package/tests/test_trust_pillar.py +291 -0
- package/tests/test_trustee_cli.py +427 -0
- package/tests/test_trustee_cli_integration.py +325 -0
- package/tests/test_trustee_monitor.py +394 -0
- package/tests/test_trustee_ops.py +355 -0
- package/tests/test_unified_search.py +363 -0
- package/tests/test_uninstall_wizard.py +193 -0
- package/tests/test_usage.py +333 -0
- package/tests/test_version_cmd.py +355 -0
- package/tests/test_warmth_anchor.py +162 -0
- package/tests/test_whoami.py +245 -0
- package/tests/test_ws.py +311 -0
- package/.cursorrules +0 -33
- package/src/skcapstone/cli.py +0 -1441
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"""Session Skills Bridge — wire SKSkills into agent runtime sessions.
|
|
2
|
+
|
|
3
|
+
Bridges the gap between the team engine's session lifecycle and the
|
|
4
|
+
SKSkills framework. When an agent session starts, this module:
|
|
5
|
+
|
|
6
|
+
1. Resolves skill names → SKSkills registry entries
|
|
7
|
+
2. Loads the agent's skills into a SkillLoader/SkillAggregator
|
|
8
|
+
3. Writes an MCP config snippet so the crush session can reach skill tools
|
|
9
|
+
4. Provides hooks for session start/stop to manage skill server lifecycle
|
|
10
|
+
|
|
11
|
+
Architecture:
|
|
12
|
+
TeamEngine → LocalProvider.start()
|
|
13
|
+
|
|
|
14
|
+
SessionSkillsBridge.prepare(agent_name, skills, work_dir)
|
|
15
|
+
|
|
|
16
|
+
SkillAggregator loaded per-agent namespace
|
|
17
|
+
|
|
|
18
|
+
crush/stub session gets SKSKILLS_SOCKET or MCP config
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import logging
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Any, Dict, List, Optional
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def resolve_skill_paths_with_skskills(
|
|
32
|
+
skills: List[str],
|
|
33
|
+
agent: str = "global",
|
|
34
|
+
repo_root: Optional[Path] = None,
|
|
35
|
+
) -> List[str]:
|
|
36
|
+
"""Resolve skill names to paths, checking SKSkills registry first.
|
|
37
|
+
|
|
38
|
+
Resolution order per skill name:
|
|
39
|
+
1. Absolute path — use as-is if it exists
|
|
40
|
+
2. SKSkills registry — check ~/.skskills/installed/<name> or agents/<agent>/<name>
|
|
41
|
+
3. Pass-through — let crush resolve from its own skill paths
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
skills: List of skill names or paths from AgentSpec.
|
|
45
|
+
agent: Agent namespace for SKSkills per-agent lookup.
|
|
46
|
+
repo_root: Unused; kept for call-site compatibility.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
List of resolved paths (unresolvable names kept as-is).
|
|
50
|
+
"""
|
|
51
|
+
import os
|
|
52
|
+
|
|
53
|
+
skskills_home = Path(os.environ.get("SKSKILLS_HOME", "~/.skskills")).expanduser()
|
|
54
|
+
resolved: List[str] = []
|
|
55
|
+
|
|
56
|
+
for skill in skills:
|
|
57
|
+
path = Path(skill)
|
|
58
|
+
|
|
59
|
+
# 1. Absolute path
|
|
60
|
+
if path.is_absolute() and path.exists():
|
|
61
|
+
resolved.append(str(path))
|
|
62
|
+
continue
|
|
63
|
+
|
|
64
|
+
# 2. SKSkills registry — per-agent first, then global
|
|
65
|
+
search_dirs = []
|
|
66
|
+
if agent != "global":
|
|
67
|
+
search_dirs.append(skskills_home / "agents" / agent / skill)
|
|
68
|
+
search_dirs.append(skskills_home / "installed" / skill)
|
|
69
|
+
|
|
70
|
+
found_in_skskills = False
|
|
71
|
+
for candidate in search_dirs:
|
|
72
|
+
if candidate.exists() and (candidate / "skill.yaml").exists():
|
|
73
|
+
resolved.append(str(candidate))
|
|
74
|
+
found_in_skskills = True
|
|
75
|
+
logger.debug("Resolved skill '%s' from SKSkills: %s", skill, candidate)
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
if found_in_skskills:
|
|
79
|
+
continue
|
|
80
|
+
|
|
81
|
+
# 3. Pass-through — let crush resolve from its own skill paths
|
|
82
|
+
resolved.append(skill)
|
|
83
|
+
|
|
84
|
+
return resolved
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def prepare_session_skills(
|
|
88
|
+
agent_name: str,
|
|
89
|
+
skills: List[str],
|
|
90
|
+
work_dir: Path,
|
|
91
|
+
agent: str = "global",
|
|
92
|
+
) -> Dict[str, Any]:
|
|
93
|
+
"""Prepare SKSkills for an agent session.
|
|
94
|
+
|
|
95
|
+
Loads the agent's skills into a SkillLoader, writes MCP configuration
|
|
96
|
+
into the work directory so the crush session can discover skill tools.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
agent_name: The agent instance name.
|
|
100
|
+
skills: List of skill names/paths from AgentSpec.
|
|
101
|
+
work_dir: Agent working directory.
|
|
102
|
+
agent: SKSkills agent namespace.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Dict with loaded skill metadata and MCP config paths.
|
|
106
|
+
"""
|
|
107
|
+
result: Dict[str, Any] = {
|
|
108
|
+
"skills_loaded": 0,
|
|
109
|
+
"skill_names": [],
|
|
110
|
+
"tools_available": [],
|
|
111
|
+
"mcp_config_path": None,
|
|
112
|
+
"errors": [],
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
try:
|
|
116
|
+
from skskills.loader import SkillLoader
|
|
117
|
+
from skskills.models import parse_skill_yaml
|
|
118
|
+
except ImportError:
|
|
119
|
+
logger.debug("skskills not installed — skipping skill loading for %s", agent_name)
|
|
120
|
+
return result
|
|
121
|
+
|
|
122
|
+
loader = SkillLoader()
|
|
123
|
+
|
|
124
|
+
for skill_path_str in skills:
|
|
125
|
+
skill_path = Path(skill_path_str)
|
|
126
|
+
skill_yaml = skill_path / "skill.yaml"
|
|
127
|
+
|
|
128
|
+
if not skill_yaml.exists():
|
|
129
|
+
# Not an SKSkills directory — skip
|
|
130
|
+
continue
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
server = loader.load(skill_path)
|
|
134
|
+
result["skill_names"].append(server.manifest.name)
|
|
135
|
+
result["skills_loaded"] += 1
|
|
136
|
+
except Exception as exc:
|
|
137
|
+
logger.warning("Failed to load skill at %s: %s", skill_path, exc)
|
|
138
|
+
result["errors"].append(f"{skill_path}: {exc}")
|
|
139
|
+
|
|
140
|
+
# Collect available tools
|
|
141
|
+
for schema in loader.all_tools():
|
|
142
|
+
result["tools_available"].append(schema["name"])
|
|
143
|
+
|
|
144
|
+
# Write MCP config for the session
|
|
145
|
+
if result["skills_loaded"] > 0:
|
|
146
|
+
mcp_config = _build_skill_mcp_config(agent, work_dir)
|
|
147
|
+
mcp_config_path = work_dir / "skskills_mcp.json"
|
|
148
|
+
mcp_config_path.write_text(json.dumps(mcp_config, indent=2), encoding="utf-8")
|
|
149
|
+
result["mcp_config_path"] = str(mcp_config_path)
|
|
150
|
+
|
|
151
|
+
logger.info(
|
|
152
|
+
"Prepared %d skills for %s: %s",
|
|
153
|
+
result["skills_loaded"],
|
|
154
|
+
agent_name,
|
|
155
|
+
result["skill_names"],
|
|
156
|
+
)
|
|
157
|
+
return result
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _build_skill_mcp_config(agent: str, work_dir: Path) -> Dict[str, Any]:
|
|
161
|
+
"""Build an MCP server configuration for the SKSkills aggregator.
|
|
162
|
+
|
|
163
|
+
This config can be merged into crush.json or used standalone to
|
|
164
|
+
give the session access to SKSkills tools via MCP.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
agent: Agent namespace for skill resolution.
|
|
168
|
+
work_dir: Agent working directory.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
MCP server config dict.
|
|
172
|
+
"""
|
|
173
|
+
return {
|
|
174
|
+
"mcpServers": {
|
|
175
|
+
"skskills": {
|
|
176
|
+
"command": "skskills",
|
|
177
|
+
"args": ["run", "--agent", agent],
|
|
178
|
+
"description": "SKSkills aggregator — sovereign agent skills",
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def enrich_session_config(
|
|
185
|
+
session_config: Dict[str, Any],
|
|
186
|
+
skill_result: Dict[str, Any],
|
|
187
|
+
) -> Dict[str, Any]:
|
|
188
|
+
"""Enrich a crush session config with SKSkills metadata.
|
|
189
|
+
|
|
190
|
+
Adds the loaded skill tools and MCP config path to the session
|
|
191
|
+
config so the crush daemon knows about available skills.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
session_config: The existing session config dict.
|
|
195
|
+
skill_result: Output from prepare_session_skills().
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
The enriched session config (mutated in place).
|
|
199
|
+
"""
|
|
200
|
+
if skill_result["skills_loaded"] > 0:
|
|
201
|
+
session_config["skskills"] = {
|
|
202
|
+
"loaded": skill_result["skills_loaded"],
|
|
203
|
+
"skill_names": skill_result["skill_names"],
|
|
204
|
+
"tools_available": skill_result["tools_available"],
|
|
205
|
+
"mcp_config": skill_result.get("mcp_config_path"),
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return session_config
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def enrich_crush_config(
|
|
212
|
+
crush_config: Dict[str, Any],
|
|
213
|
+
skill_result: Dict[str, Any],
|
|
214
|
+
) -> Dict[str, Any]:
|
|
215
|
+
"""Enrich a crush.json config with SKSkills MCP server entry.
|
|
216
|
+
|
|
217
|
+
Adds the SKSkills aggregator as an MCP server in the crush config
|
|
218
|
+
so skill tools are available within the crush session.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
crush_config: The existing crush.json config dict.
|
|
222
|
+
skill_result: Output from prepare_session_skills().
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
The enriched crush config (mutated in place).
|
|
226
|
+
"""
|
|
227
|
+
if skill_result["skills_loaded"] > 0:
|
|
228
|
+
if "mcpServers" not in crush_config:
|
|
229
|
+
crush_config["mcpServers"] = {}
|
|
230
|
+
|
|
231
|
+
agent = "global"
|
|
232
|
+
crush_config["mcpServers"]["skskills"] = {
|
|
233
|
+
"command": "skskills",
|
|
234
|
+
"args": ["run", "--agent", agent],
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
# Add skill tool names to allowed_tools
|
|
238
|
+
permissions = crush_config.get("permissions", {})
|
|
239
|
+
allowed = permissions.get("allowed_tools", [])
|
|
240
|
+
for tool_name in skill_result.get("tools_available", []):
|
|
241
|
+
mcp_name = f"mcp_skskills_{tool_name.replace('.', '_').replace('-', '_')}"
|
|
242
|
+
if mcp_name not in allowed:
|
|
243
|
+
allowed.append(mcp_name)
|
|
244
|
+
permissions["allowed_tools"] = allowed
|
|
245
|
+
crush_config["permissions"] = permissions
|
|
246
|
+
|
|
247
|
+
return crush_config
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def cleanup_session_skills(agent_name: str, work_dir: Path) -> None:
|
|
251
|
+
"""Clean up skill resources when a session stops.
|
|
252
|
+
|
|
253
|
+
Removes ephemeral skill server sockets and config files.
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
agent_name: The agent instance name.
|
|
257
|
+
work_dir: Agent working directory.
|
|
258
|
+
"""
|
|
259
|
+
mcp_config = work_dir / "skskills_mcp.json"
|
|
260
|
+
if mcp_config.exists():
|
|
261
|
+
mcp_config.unlink(missing_ok=True)
|
|
262
|
+
|
|
263
|
+
logger.debug("Cleaned up skill resources for %s", agent_name)
|