@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
|
@@ -20,6 +20,7 @@ from .models import (
|
|
|
20
20
|
MemoryState,
|
|
21
21
|
PillarStatus,
|
|
22
22
|
SecurityState,
|
|
23
|
+
SkillsState,
|
|
23
24
|
SyncState,
|
|
24
25
|
TrustState,
|
|
25
26
|
)
|
|
@@ -40,13 +41,17 @@ def _count_json_files(directory: Path) -> int:
|
|
|
40
41
|
return sum(1 for f in directory.iterdir() if f.suffix == ".json")
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
def discover_identity(home: Path) -> IdentityState:
|
|
44
|
+
def discover_identity(home: Path, shared_root: Optional[Path] = None) -> IdentityState:
|
|
44
45
|
"""Probe for CapAuth identity.
|
|
45
46
|
|
|
46
|
-
Checks:
|
|
47
|
-
1. capauth
|
|
48
|
-
2. ~/.skcapstone/identity/
|
|
49
|
-
3.
|
|
47
|
+
Checks (in priority order):
|
|
48
|
+
1. Real CapAuth profile at ~/.capauth/ (sovereign PGP keys)
|
|
49
|
+
2. Identity manifest at ~/.skcapstone/identity/identity.json
|
|
50
|
+
3. Key material files in the identity directory
|
|
51
|
+
|
|
52
|
+
When a real CapAuth profile is found, the identity.json is
|
|
53
|
+
updated to reflect the actual PGP fingerprint, replacing any
|
|
54
|
+
placeholder values from a previous init without CapAuth.
|
|
50
55
|
|
|
51
56
|
Args:
|
|
52
57
|
home: The agent home directory (~/.skcapstone).
|
|
@@ -57,20 +62,23 @@ def discover_identity(home: Path) -> IdentityState:
|
|
|
57
62
|
state = IdentityState()
|
|
58
63
|
identity_dir = home / "identity"
|
|
59
64
|
|
|
60
|
-
|
|
61
|
-
if
|
|
62
|
-
state
|
|
65
|
+
capauth_state = _try_load_capauth_profile()
|
|
66
|
+
if capauth_state is not None:
|
|
67
|
+
state = capauth_state
|
|
68
|
+
_sync_identity_json(identity_dir, state)
|
|
69
|
+
return state
|
|
63
70
|
|
|
64
71
|
manifest_file = identity_dir / "identity.json"
|
|
65
72
|
if manifest_file.exists():
|
|
66
73
|
try:
|
|
67
|
-
data = json.loads(manifest_file.read_text())
|
|
74
|
+
data = json.loads(manifest_file.read_text(encoding="utf-8"))
|
|
68
75
|
state.fingerprint = data.get("fingerprint")
|
|
69
76
|
state.name = data.get("name")
|
|
70
77
|
state.email = data.get("email")
|
|
71
78
|
if data.get("created_at"):
|
|
72
79
|
state.created_at = datetime.fromisoformat(data["created_at"])
|
|
73
|
-
|
|
80
|
+
is_placeholder = not data.get("capauth_managed", False)
|
|
81
|
+
state.status = PillarStatus.DEGRADED if is_placeholder else PillarStatus.ACTIVE
|
|
74
82
|
except (json.JSONDecodeError, KeyError, ValueError):
|
|
75
83
|
state.status = PillarStatus.ERROR
|
|
76
84
|
|
|
@@ -80,15 +88,86 @@ def discover_identity(home: Path) -> IdentityState:
|
|
|
80
88
|
if state.status == PillarStatus.MISSING:
|
|
81
89
|
state.status = PillarStatus.DEGRADED
|
|
82
90
|
|
|
91
|
+
# Fallback: if agent has no identity, inherit from shared root (node owner)
|
|
92
|
+
if state.status == PillarStatus.MISSING and shared_root and shared_root != home:
|
|
93
|
+
shared_identity = shared_root / "identity" / "identity.json"
|
|
94
|
+
if shared_identity.exists():
|
|
95
|
+
try:
|
|
96
|
+
data = json.loads(shared_identity.read_text(encoding="utf-8"))
|
|
97
|
+
state.fingerprint = data.get("fingerprint")
|
|
98
|
+
state.name = data.get("name")
|
|
99
|
+
state.email = data.get("email")
|
|
100
|
+
state.status = PillarStatus.DEGRADED # inherited, not own key
|
|
101
|
+
except (json.JSONDecodeError, KeyError, ValueError):
|
|
102
|
+
pass
|
|
103
|
+
|
|
83
104
|
return state
|
|
84
105
|
|
|
85
106
|
|
|
107
|
+
def _try_load_capauth_profile() -> Optional[IdentityState]:
|
|
108
|
+
"""Attempt to load a real CapAuth profile from ~/.capauth/.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
IdentityState populated from the CapAuth profile, or None
|
|
112
|
+
if capauth is not installed or no profile exists.
|
|
113
|
+
"""
|
|
114
|
+
try:
|
|
115
|
+
from capauth.profile import load_profile # type: ignore[import-untyped]
|
|
116
|
+
|
|
117
|
+
profile = load_profile()
|
|
118
|
+
return IdentityState(
|
|
119
|
+
fingerprint=profile.key_info.fingerprint,
|
|
120
|
+
name=profile.entity.name,
|
|
121
|
+
email=profile.entity.email,
|
|
122
|
+
key_path=Path(profile.key_info.public_key_path),
|
|
123
|
+
created_at=profile.key_info.created,
|
|
124
|
+
status=PillarStatus.ACTIVE,
|
|
125
|
+
)
|
|
126
|
+
except ImportError:
|
|
127
|
+
return None
|
|
128
|
+
except Exception:
|
|
129
|
+
return None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _sync_identity_json(identity_dir: Path, state: IdentityState) -> None:
|
|
133
|
+
"""Write or update identity.json when a real CapAuth profile is found.
|
|
134
|
+
|
|
135
|
+
Ensures the skcapstone identity manifest stays in sync with the
|
|
136
|
+
CapAuth profile so other pillars (sync, tokens) see the real
|
|
137
|
+
fingerprint instead of a placeholder.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
identity_dir: Path to ~/.skcapstone/identity/.
|
|
141
|
+
state: IdentityState with real CapAuth data.
|
|
142
|
+
"""
|
|
143
|
+
identity_dir.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
manifest_path = identity_dir / "identity.json"
|
|
145
|
+
|
|
146
|
+
manifest = {
|
|
147
|
+
"name": state.name,
|
|
148
|
+
"email": state.email,
|
|
149
|
+
"fingerprint": state.fingerprint,
|
|
150
|
+
"created_at": state.created_at.isoformat() if state.created_at else None,
|
|
151
|
+
"capauth_managed": True,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
existing = {}
|
|
155
|
+
if manifest_path.exists():
|
|
156
|
+
try:
|
|
157
|
+
existing = json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
158
|
+
except (json.JSONDecodeError, OSError):
|
|
159
|
+
pass
|
|
160
|
+
|
|
161
|
+
if existing.get("fingerprint") != state.fingerprint or not existing.get("capauth_managed"):
|
|
162
|
+
manifest_path.write_text(json.dumps(manifest, indent=2), encoding="utf-8")
|
|
163
|
+
|
|
164
|
+
|
|
86
165
|
def discover_memory(home: Path) -> MemoryState:
|
|
87
166
|
"""Probe for SKMemory state.
|
|
88
167
|
|
|
89
168
|
Checks (in order):
|
|
90
169
|
1. Built-in memory engine at ~/.skcapstone/memory/
|
|
91
|
-
2. External skmemory package at ~/.
|
|
170
|
+
2. External skmemory package at ~/.skcapstone/ (consolidated)
|
|
92
171
|
|
|
93
172
|
Args:
|
|
94
173
|
home: The agent home directory (~/.skcapstone).
|
|
@@ -113,7 +192,7 @@ def discover_memory(home: Path) -> MemoryState:
|
|
|
113
192
|
if skmemory is None:
|
|
114
193
|
return state
|
|
115
194
|
|
|
116
|
-
memory_home = Path("~/.
|
|
195
|
+
memory_home = Path("~/.skcapstone").expanduser()
|
|
117
196
|
if not memory_home.exists():
|
|
118
197
|
state.status = PillarStatus.DEGRADED
|
|
119
198
|
return state
|
|
@@ -157,7 +236,7 @@ def discover_trust(home: Path) -> TrustState:
|
|
|
157
236
|
manifest = trust_dir / "trust.json"
|
|
158
237
|
if manifest.exists():
|
|
159
238
|
try:
|
|
160
|
-
data = json.loads(manifest.read_text())
|
|
239
|
+
data = json.loads(manifest.read_text(encoding="utf-8"))
|
|
161
240
|
state.depth = data.get("depth", 0.0)
|
|
162
241
|
state.trust_level = data.get("trust_level", 0.0)
|
|
163
242
|
state.love_intensity = data.get("love_intensity", 0.0)
|
|
@@ -217,7 +296,7 @@ def discover_security(home: Path) -> SecurityState:
|
|
|
217
296
|
audit_log = security_dir / "audit.log"
|
|
218
297
|
if audit_log.exists():
|
|
219
298
|
try:
|
|
220
|
-
line_count = sum(1 for _ in audit_log.open())
|
|
299
|
+
line_count = sum(1 for _ in audit_log.open(encoding="utf-8"))
|
|
221
300
|
state.audit_entries = line_count
|
|
222
301
|
state.status = PillarStatus.ACTIVE
|
|
223
302
|
except OSError:
|
|
@@ -226,7 +305,7 @@ def discover_security(home: Path) -> SecurityState:
|
|
|
226
305
|
manifest = security_dir / "security.json"
|
|
227
306
|
if manifest.exists():
|
|
228
307
|
try:
|
|
229
|
-
data = json.loads(manifest.read_text())
|
|
308
|
+
data = json.loads(manifest.read_text(encoding="utf-8"))
|
|
230
309
|
state.threats_detected = data.get("threats_detected", 0)
|
|
231
310
|
if data.get("last_scan"):
|
|
232
311
|
state.last_scan = datetime.fromisoformat(data["last_scan"])
|
|
@@ -257,19 +336,131 @@ def discover_sync(home: Path) -> SyncState:
|
|
|
257
336
|
return _discover(home)
|
|
258
337
|
|
|
259
338
|
|
|
260
|
-
def
|
|
261
|
-
"""
|
|
339
|
+
def _probe_remote_registry(state: SkillsState) -> None:
|
|
340
|
+
"""Probe the remote skills-registry for availability.
|
|
341
|
+
|
|
342
|
+
Uses the skskills RemoteRegistry client when available.
|
|
343
|
+
Falls back gracefully if the skskills package is missing or
|
|
344
|
+
the remote registry is unreachable.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
state: SkillsState to update with remote info (mutated in place).
|
|
348
|
+
"""
|
|
349
|
+
try:
|
|
350
|
+
from skskills.remote import RemoteRegistry, DEFAULT_REGISTRY_URL
|
|
351
|
+
except ImportError:
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
import os
|
|
355
|
+
|
|
356
|
+
registry_url = os.environ.get("SKSKILLS_REGISTRY_URL", DEFAULT_REGISTRY_URL)
|
|
357
|
+
state.registry_url = registry_url
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
remote = RemoteRegistry(registry_url=registry_url)
|
|
361
|
+
index = remote.fetch_index()
|
|
362
|
+
state.registry_available = True
|
|
363
|
+
state.remote_skill_count = len(index.skills)
|
|
364
|
+
except Exception:
|
|
365
|
+
# Remote unreachable — cached index may still work; that is
|
|
366
|
+
# handled by RemoteRegistry.fetch_index() internally.
|
|
367
|
+
state.registry_available = False
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def discover_skills(home: Path, agent: Optional[str] = None) -> SkillsState:
|
|
371
|
+
"""Probe for SKSkills installations.
|
|
372
|
+
|
|
373
|
+
Checks skill directories in priority order:
|
|
374
|
+
1. Per-agent skcapstone skills at ~/.skcapstone/skills/agents/<agent>/
|
|
375
|
+
2. Global registry at ~/.skskills/installed/
|
|
376
|
+
3. Per-agent registry at ~/.skskills/agents/<agent>/
|
|
377
|
+
4. Remote skills-registry at skills.smilintux.org (optional)
|
|
262
378
|
|
|
263
379
|
Args:
|
|
264
380
|
home: The agent home directory (~/.skcapstone).
|
|
381
|
+
agent: Agent name for per-agent namespace lookup. When provided,
|
|
382
|
+
per-agent skills are reported alongside global ones.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
SkillsState with current skill installation information.
|
|
386
|
+
"""
|
|
387
|
+
import os
|
|
388
|
+
|
|
389
|
+
state = SkillsState()
|
|
390
|
+
skskills_home = Path(os.environ.get("SKSKILLS_HOME", "~/.skskills")).expanduser()
|
|
391
|
+
state.skskills_home = skskills_home
|
|
392
|
+
|
|
393
|
+
skill_names: set[str] = set()
|
|
394
|
+
|
|
395
|
+
# 1. Per-agent skcapstone skills (synced via Syncthing, highest priority)
|
|
396
|
+
if agent:
|
|
397
|
+
agent_skcap_dir = home / "skills" / "agents" / agent
|
|
398
|
+
if agent_skcap_dir.is_dir():
|
|
399
|
+
for d in agent_skcap_dir.iterdir():
|
|
400
|
+
if d.is_dir() and (d / "skill.yaml").exists():
|
|
401
|
+
skill_names.add(d.name)
|
|
402
|
+
|
|
403
|
+
if not skskills_home.exists():
|
|
404
|
+
state.installed = len(skill_names)
|
|
405
|
+
state.skill_names = sorted(skill_names)
|
|
406
|
+
if skill_names:
|
|
407
|
+
state.status = PillarStatus.ACTIVE
|
|
408
|
+
# Still check remote even if no local skills home
|
|
409
|
+
_probe_remote_registry(state)
|
|
410
|
+
return state
|
|
411
|
+
|
|
412
|
+
# 2. Global registry
|
|
413
|
+
installed_dir = skskills_home / "installed"
|
|
414
|
+
if installed_dir.exists():
|
|
415
|
+
for d in installed_dir.iterdir():
|
|
416
|
+
if d.is_dir() and (d / "skill.yaml").exists():
|
|
417
|
+
skill_names.add(d.name)
|
|
418
|
+
|
|
419
|
+
# 3. Per-agent registry (overrides/extends global)
|
|
420
|
+
if agent:
|
|
421
|
+
agent_reg_dir = skskills_home / "agents" / agent
|
|
422
|
+
if agent_reg_dir.is_dir():
|
|
423
|
+
for d in agent_reg_dir.iterdir():
|
|
424
|
+
if (d.is_dir() or d.is_symlink()) and (d / "skill.yaml").exists():
|
|
425
|
+
skill_names.add(d.name)
|
|
426
|
+
|
|
427
|
+
state.installed = len(skill_names)
|
|
428
|
+
state.skill_names = sorted(skill_names)
|
|
429
|
+
|
|
430
|
+
if state.installed > 0:
|
|
431
|
+
state.status = PillarStatus.ACTIVE
|
|
432
|
+
elif skskills_home.exists():
|
|
433
|
+
state.status = PillarStatus.DEGRADED
|
|
434
|
+
|
|
435
|
+
# 4. Remote skills-registry (non-blocking, best-effort)
|
|
436
|
+
_probe_remote_registry(state)
|
|
437
|
+
|
|
438
|
+
return state
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
def discover_all(
|
|
442
|
+
home: Path,
|
|
443
|
+
agent: Optional[str] = None,
|
|
444
|
+
shared_root: Optional[Path] = None,
|
|
445
|
+
) -> dict:
|
|
446
|
+
"""Run full discovery across all pillars including sync and skills.
|
|
447
|
+
|
|
448
|
+
Args:
|
|
449
|
+
home: The agent-specific home directory (~/.skcapstone/agent/<name>/).
|
|
450
|
+
agent: Agent name for per-agent skill namespace lookup.
|
|
451
|
+
shared_root: Shared root (~/.skcapstone/) for fallback identity lookup.
|
|
265
452
|
|
|
266
453
|
Returns:
|
|
267
|
-
Dict with identity, memory, trust, security, sync states.
|
|
454
|
+
Dict with identity, memory, trust, security, sync, skills states.
|
|
268
455
|
"""
|
|
456
|
+
identity = discover_identity(home, shared_root=shared_root)
|
|
457
|
+
# Resolve agent from identity when not explicitly provided
|
|
458
|
+
resolved_agent = agent or identity.name or None
|
|
269
459
|
return {
|
|
270
|
-
"identity":
|
|
460
|
+
"identity": identity,
|
|
271
461
|
"memory": discover_memory(home),
|
|
272
462
|
"trust": discover_trust(home),
|
|
273
463
|
"security": discover_security(home),
|
|
274
464
|
"sync": discover_sync(home),
|
|
465
|
+
"skills": discover_skills(home, agent=resolved_agent),
|
|
275
466
|
}
|