@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,336 @@
|
|
|
1
|
+
"""Tests for the LLM-powered skcapstone chat CLI commands.
|
|
2
|
+
|
|
3
|
+
Covers:
|
|
4
|
+
- chat list / chat --list (empty and non-empty)
|
|
5
|
+
- chat open LLM loop (mocked LLMBridge + console.input)
|
|
6
|
+
- _run_llm_chat saves exchanges to conversations/{peer}.json
|
|
7
|
+
- --list flag routing via _ChatGroup
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from unittest.mock import MagicMock, patch
|
|
15
|
+
|
|
16
|
+
import pytest
|
|
17
|
+
from click.testing import CliRunner
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
# Fixtures
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.fixture
|
|
26
|
+
def agent_home(tmp_path):
|
|
27
|
+
"""Minimal agent home with identity and manifest."""
|
|
28
|
+
home = tmp_path / ".skcapstone"
|
|
29
|
+
(home / "identity").mkdir(parents=True)
|
|
30
|
+
(home / "config").mkdir(parents=True)
|
|
31
|
+
identity = {"name": "TestAgent", "fingerprint": "AABB1234", "capauth_managed": False}
|
|
32
|
+
(home / "identity" / "identity.json").write_text(json.dumps(identity))
|
|
33
|
+
(home / "manifest.json").write_text(json.dumps({"name": "TestAgent", "version": "0.1.0"}))
|
|
34
|
+
import yaml
|
|
35
|
+
(home / "config" / "config.yaml").write_text(yaml.dump({"agent_name": "TestAgent"}))
|
|
36
|
+
return home
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@pytest.fixture
|
|
40
|
+
def agent_home_with_convs(agent_home):
|
|
41
|
+
"""Agent home with pre-existing conversation files."""
|
|
42
|
+
convs = agent_home / "conversations"
|
|
43
|
+
convs.mkdir(parents=True)
|
|
44
|
+
lumina_history = [
|
|
45
|
+
{"role": "user", "content": "Hello Lumina!", "timestamp": "2026-03-01T10:00:00Z"},
|
|
46
|
+
{"role": "assistant", "content": "Hello! How can I help?", "timestamp": "2026-03-01T10:00:01Z"},
|
|
47
|
+
]
|
|
48
|
+
(convs / "lumina.json").write_text(json.dumps(lumina_history))
|
|
49
|
+
jarvis_history = [
|
|
50
|
+
{"role": "user", "content": "Status?", "timestamp": "2026-03-01T11:00:00Z"},
|
|
51
|
+
]
|
|
52
|
+
(convs / "jarvis.json").write_text(json.dumps(jarvis_history))
|
|
53
|
+
return agent_home
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
# chat list
|
|
58
|
+
# ---------------------------------------------------------------------------
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class TestChatList:
|
|
62
|
+
"""Tests for `skcapstone chat list`."""
|
|
63
|
+
|
|
64
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
65
|
+
def test_chat_list_help(self, _mock_rt):
|
|
66
|
+
from skcapstone.cli import main
|
|
67
|
+
runner = CliRunner()
|
|
68
|
+
result = runner.invoke(main, ["chat", "list", "--help"])
|
|
69
|
+
assert result.exit_code == 0
|
|
70
|
+
assert "conversation" in result.output.lower()
|
|
71
|
+
|
|
72
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
73
|
+
def test_chat_list_empty_no_dir(self, _mock_rt, agent_home):
|
|
74
|
+
"""No conversations dir → 'No conversations yet' message."""
|
|
75
|
+
from skcapstone.cli import main
|
|
76
|
+
runner = CliRunner()
|
|
77
|
+
result = runner.invoke(main, ["chat", "list", "--home", str(agent_home)])
|
|
78
|
+
assert result.exit_code == 0
|
|
79
|
+
assert "No conversations" in result.output
|
|
80
|
+
|
|
81
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
82
|
+
def test_chat_list_empty_dir(self, _mock_rt, agent_home):
|
|
83
|
+
"""Empty conversations dir → 'No conversations yet' message."""
|
|
84
|
+
(agent_home / "conversations").mkdir(parents=True)
|
|
85
|
+
from skcapstone.cli import main
|
|
86
|
+
runner = CliRunner()
|
|
87
|
+
result = runner.invoke(main, ["chat", "list", "--home", str(agent_home)])
|
|
88
|
+
assert result.exit_code == 0
|
|
89
|
+
assert "No conversations" in result.output
|
|
90
|
+
|
|
91
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
92
|
+
def test_chat_list_shows_peers(self, _mock_rt, agent_home_with_convs):
|
|
93
|
+
"""Peers with conversations are listed with message counts."""
|
|
94
|
+
from skcapstone.cli import main
|
|
95
|
+
runner = CliRunner()
|
|
96
|
+
result = runner.invoke(main, ["chat", "list", "--home", str(agent_home_with_convs)])
|
|
97
|
+
assert result.exit_code == 0
|
|
98
|
+
assert "lumina" in result.output
|
|
99
|
+
assert "jarvis" in result.output
|
|
100
|
+
assert "2" in result.output
|
|
101
|
+
assert "1" in result.output
|
|
102
|
+
|
|
103
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
104
|
+
def test_chat_list_shows_last_message_preview(self, _mock_rt, agent_home_with_convs):
|
|
105
|
+
"""Last message content is shown in the list."""
|
|
106
|
+
from skcapstone.cli import main
|
|
107
|
+
runner = CliRunner()
|
|
108
|
+
result = runner.invoke(main, ["chat", "list", "--home", str(agent_home_with_convs)])
|
|
109
|
+
assert result.exit_code == 0
|
|
110
|
+
assert "Hello! How can I help?" in result.output or "How can I help" in result.output
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class TestChatListFlag:
|
|
114
|
+
"""Tests for `skcapstone chat --list` routing."""
|
|
115
|
+
|
|
116
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
117
|
+
def test_chat_double_dash_list(self, _mock_rt, agent_home):
|
|
118
|
+
"""chat --list routes to the list subcommand."""
|
|
119
|
+
from skcapstone.cli import main
|
|
120
|
+
runner = CliRunner()
|
|
121
|
+
result = runner.invoke(main, ["chat", "--list", "--home", str(agent_home)])
|
|
122
|
+
assert result.exit_code == 0
|
|
123
|
+
assert "No conversations" in result.output
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# ---------------------------------------------------------------------------
|
|
127
|
+
# chat open (LLM loop)
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class TestChatOpenLLM:
|
|
132
|
+
"""Tests for `skcapstone chat open` using LLMBridge."""
|
|
133
|
+
|
|
134
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
135
|
+
def test_chat_open_help(self, _mock_rt):
|
|
136
|
+
"""chat open --help works and shows PEER argument."""
|
|
137
|
+
from skcapstone.cli import main
|
|
138
|
+
runner = CliRunner()
|
|
139
|
+
result = runner.invoke(main, ["chat", "open", "--help"])
|
|
140
|
+
assert result.exit_code == 0
|
|
141
|
+
assert "PEER" in result.output
|
|
142
|
+
|
|
143
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
144
|
+
def test_chat_open_missing_home(self, _mock_rt, tmp_path):
|
|
145
|
+
"""chat open exits with error if home dir doesn't exist."""
|
|
146
|
+
from skcapstone.cli import main
|
|
147
|
+
runner = CliRunner()
|
|
148
|
+
result = runner.invoke(
|
|
149
|
+
main, ["chat", "open", "lumina", "--home", str(tmp_path / "nonexistent")]
|
|
150
|
+
)
|
|
151
|
+
assert result.exit_code != 0 or "No agent found" in result.output
|
|
152
|
+
|
|
153
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
154
|
+
@patch("skcapstone.cli.chat._run_llm_chat")
|
|
155
|
+
def test_chat_open_calls_llm_chat(self, mock_llm_chat, mock_rt, agent_home):
|
|
156
|
+
"""chat open delegates to _run_llm_chat."""
|
|
157
|
+
mock_runtime = MagicMock()
|
|
158
|
+
mock_runtime.manifest.name = "TestAgent"
|
|
159
|
+
mock_rt.return_value = mock_runtime
|
|
160
|
+
|
|
161
|
+
from skcapstone.cli import main
|
|
162
|
+
runner = CliRunner()
|
|
163
|
+
runner.invoke(main, ["chat", "open", "lumina", "--home", str(agent_home)])
|
|
164
|
+
|
|
165
|
+
assert mock_llm_chat.called
|
|
166
|
+
assert mock_llm_chat.call_args[0][0] == "lumina"
|
|
167
|
+
|
|
168
|
+
@patch("skcapstone.cli.chat.get_runtime")
|
|
169
|
+
@patch("skcapstone.cli.chat._run_llm_chat")
|
|
170
|
+
def test_chat_shortcut_calls_llm_chat(self, mock_llm_chat, mock_rt, agent_home):
|
|
171
|
+
"""skcapstone chat <peer> (shortcut) also calls _run_llm_chat."""
|
|
172
|
+
mock_runtime = MagicMock()
|
|
173
|
+
mock_runtime.manifest.name = "TestAgent"
|
|
174
|
+
mock_rt.return_value = mock_runtime
|
|
175
|
+
|
|
176
|
+
from skcapstone.cli import main
|
|
177
|
+
runner = CliRunner()
|
|
178
|
+
runner.invoke(main, ["chat", "lumina", "--home", str(agent_home)])
|
|
179
|
+
|
|
180
|
+
assert mock_llm_chat.called
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# ---------------------------------------------------------------------------
|
|
184
|
+
# _run_llm_chat unit tests
|
|
185
|
+
# ---------------------------------------------------------------------------
|
|
186
|
+
|
|
187
|
+
# Patch targets — lazy imports inside _run_llm_chat are fetched from
|
|
188
|
+
# consciousness_loop at call time, so patch at the source module.
|
|
189
|
+
_CL = "skcapstone.consciousness_loop"
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class TestRunLLMChat:
|
|
193
|
+
"""Unit tests for _run_llm_chat helper."""
|
|
194
|
+
|
|
195
|
+
def _make_mock_bridge(self, response="Mock LLM response"):
|
|
196
|
+
mock_bridge = MagicMock()
|
|
197
|
+
mock_bridge.generate.return_value = response
|
|
198
|
+
return mock_bridge
|
|
199
|
+
|
|
200
|
+
def _make_mock_builder(self):
|
|
201
|
+
mock_builder = MagicMock()
|
|
202
|
+
mock_builder.build.return_value = "System prompt text"
|
|
203
|
+
return mock_builder
|
|
204
|
+
|
|
205
|
+
def _status_ctx(self, mock_console):
|
|
206
|
+
"""Wire console.status() as a no-op context manager."""
|
|
207
|
+
ctx = MagicMock()
|
|
208
|
+
ctx.__enter__ = MagicMock(return_value=ctx)
|
|
209
|
+
ctx.__exit__ = MagicMock(return_value=False)
|
|
210
|
+
mock_console.status.return_value = ctx
|
|
211
|
+
|
|
212
|
+
def test_run_llm_chat_single_exchange(self, agent_home):
|
|
213
|
+
"""A single user message triggers LLMBridge.generate and saves history."""
|
|
214
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
215
|
+
|
|
216
|
+
mock_bridge = self._make_mock_bridge("Hello from LLM!")
|
|
217
|
+
mock_builder = self._make_mock_builder()
|
|
218
|
+
|
|
219
|
+
with patch(f"{_CL}.LLMBridge", return_value=mock_bridge), \
|
|
220
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=mock_builder), \
|
|
221
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
222
|
+
patch(f"{_CL}._classify_message", return_value=MagicMock()), \
|
|
223
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
224
|
+
self._status_ctx(mock_console)
|
|
225
|
+
mock_console.input.side_effect = ["hi", "/quit"]
|
|
226
|
+
|
|
227
|
+
_run_llm_chat("lumina", agent_home, "TestAgent")
|
|
228
|
+
|
|
229
|
+
mock_bridge.generate.assert_called_once()
|
|
230
|
+
assert mock_builder.add_to_history.call_count == 2
|
|
231
|
+
calls = mock_builder.add_to_history.call_args_list
|
|
232
|
+
assert calls[0][0] == ("lumina", "user", "hi")
|
|
233
|
+
assert calls[1][0] == ("lumina", "assistant", "Hello from LLM!")
|
|
234
|
+
|
|
235
|
+
def test_run_llm_chat_empty_message_skipped(self, agent_home):
|
|
236
|
+
"""Empty input is skipped without calling LLMBridge."""
|
|
237
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
238
|
+
|
|
239
|
+
mock_bridge = self._make_mock_bridge()
|
|
240
|
+
mock_builder = self._make_mock_builder()
|
|
241
|
+
|
|
242
|
+
with patch(f"{_CL}.LLMBridge", return_value=mock_bridge), \
|
|
243
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=mock_builder), \
|
|
244
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
245
|
+
patch(f"{_CL}._classify_message", return_value=MagicMock()), \
|
|
246
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
247
|
+
self._status_ctx(mock_console)
|
|
248
|
+
mock_console.input.side_effect = ["", " ", "/quit"]
|
|
249
|
+
|
|
250
|
+
_run_llm_chat("lumina", agent_home, "TestAgent")
|
|
251
|
+
|
|
252
|
+
mock_bridge.generate.assert_not_called()
|
|
253
|
+
|
|
254
|
+
def test_run_llm_chat_ctrl_c_exits_gracefully(self, agent_home):
|
|
255
|
+
"""KeyboardInterrupt exits the loop without raising."""
|
|
256
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
257
|
+
|
|
258
|
+
with patch(f"{_CL}.LLMBridge", return_value=self._make_mock_bridge()), \
|
|
259
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=self._make_mock_builder()), \
|
|
260
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
261
|
+
patch(f"{_CL}._classify_message", return_value=MagicMock()), \
|
|
262
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
263
|
+
mock_console.input.side_effect = KeyboardInterrupt
|
|
264
|
+
|
|
265
|
+
_run_llm_chat("lumina", agent_home, "TestAgent")
|
|
266
|
+
|
|
267
|
+
mock_console.print.assert_called()
|
|
268
|
+
|
|
269
|
+
def test_run_llm_chat_shows_existing_history(self, agent_home_with_convs):
|
|
270
|
+
"""Existing conversation history is shown at startup."""
|
|
271
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
272
|
+
|
|
273
|
+
with patch(f"{_CL}.LLMBridge", return_value=self._make_mock_bridge()), \
|
|
274
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=self._make_mock_builder()), \
|
|
275
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
276
|
+
patch(f"{_CL}._classify_message", return_value=MagicMock()), \
|
|
277
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
278
|
+
self._status_ctx(mock_console)
|
|
279
|
+
mock_console.input.side_effect = ["/quit"]
|
|
280
|
+
|
|
281
|
+
_run_llm_chat("lumina", agent_home_with_convs, "TestAgent")
|
|
282
|
+
|
|
283
|
+
all_printed = " ".join(str(c) for c in mock_console.print.call_args_list)
|
|
284
|
+
assert "previous message" in all_printed
|
|
285
|
+
|
|
286
|
+
def test_run_llm_chat_llmbridge_error_handled(self, agent_home):
|
|
287
|
+
"""LLMBridge exceptions are caught; error text saved to history."""
|
|
288
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
289
|
+
|
|
290
|
+
mock_bridge = MagicMock()
|
|
291
|
+
mock_bridge.generate.side_effect = RuntimeError("LLM offline")
|
|
292
|
+
mock_builder = self._make_mock_builder()
|
|
293
|
+
|
|
294
|
+
with patch(f"{_CL}.LLMBridge", return_value=mock_bridge), \
|
|
295
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=mock_builder), \
|
|
296
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
297
|
+
patch(f"{_CL}._classify_message", return_value=MagicMock()), \
|
|
298
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
299
|
+
self._status_ctx(mock_console)
|
|
300
|
+
mock_console.input.side_effect = ["hello", "/quit"]
|
|
301
|
+
|
|
302
|
+
_run_llm_chat("lumina", agent_home, "TestAgent")
|
|
303
|
+
|
|
304
|
+
saved_calls = [c for c in mock_builder.add_to_history.call_args_list
|
|
305
|
+
if c[0][1] == "assistant"]
|
|
306
|
+
assert saved_calls
|
|
307
|
+
assert "Error" in saved_calls[0][0][2]
|
|
308
|
+
|
|
309
|
+
def test_run_llm_chat_saves_to_json(self, agent_home):
|
|
310
|
+
"""Conversation exchanges are persisted to conversations/{peer}.json."""
|
|
311
|
+
from skcapstone.cli.chat import _run_llm_chat
|
|
312
|
+
from skcapstone.consciousness_loop import SystemPromptBuilder
|
|
313
|
+
|
|
314
|
+
mock_bridge = MagicMock()
|
|
315
|
+
mock_bridge.generate.return_value = "Saved response"
|
|
316
|
+
# Use a real SystemPromptBuilder so the JSON persistence path is exercised.
|
|
317
|
+
real_builder = SystemPromptBuilder(home=agent_home)
|
|
318
|
+
|
|
319
|
+
with patch(f"{_CL}.LLMBridge", return_value=mock_bridge), \
|
|
320
|
+
patch(f"{_CL}.SystemPromptBuilder", return_value=real_builder), \
|
|
321
|
+
patch(f"{_CL}.ConsciousnessConfig"), \
|
|
322
|
+
patch("skcapstone.cli.chat.console") as mock_console:
|
|
323
|
+
self._status_ctx(mock_console)
|
|
324
|
+
mock_console.input.side_effect = ["persist this", "/quit"]
|
|
325
|
+
|
|
326
|
+
_run_llm_chat("testpeer", agent_home, "TestAgent")
|
|
327
|
+
|
|
328
|
+
conv_file = agent_home / "conversations" / "testpeer.json"
|
|
329
|
+
assert conv_file.exists(), "conversations/testpeer.json should be created"
|
|
330
|
+
data = json.loads(conv_file.read_text())
|
|
331
|
+
assert isinstance(data, list)
|
|
332
|
+
assert len(data) == 2
|
|
333
|
+
assert data[0]["role"] == "user"
|
|
334
|
+
assert data[0]["content"] == "persist this"
|
|
335
|
+
assert data[1]["role"] == "assistant"
|
|
336
|
+
assert data[1]["content"] == "Saved response"
|