@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
|
@@ -18,6 +18,7 @@ from __future__ import annotations
|
|
|
18
18
|
|
|
19
19
|
import json
|
|
20
20
|
import logging
|
|
21
|
+
import os
|
|
21
22
|
import re
|
|
22
23
|
import uuid
|
|
23
24
|
from datetime import datetime, timezone
|
|
@@ -31,9 +32,25 @@ logger = logging.getLogger("skcapstone.memory")
|
|
|
31
32
|
SHORT_TERM_TTL_HOURS = 72
|
|
32
33
|
|
|
33
34
|
|
|
35
|
+
def _get_unified():
|
|
36
|
+
"""Lazy accessor for the unified skmemory backend.
|
|
37
|
+
|
|
38
|
+
Returns the MemoryStore singleton or None if unavailable.
|
|
39
|
+
"""
|
|
40
|
+
try:
|
|
41
|
+
from .memory_adapter import get_unified
|
|
42
|
+
|
|
43
|
+
return get_unified()
|
|
44
|
+
except Exception as exc:
|
|
45
|
+
logger.debug("Unified memory backend unavailable: %s", exc)
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
|
|
34
49
|
def _memory_dir(home: Path) -> Path:
|
|
35
50
|
"""Resolve the memory directory, creating it if needed."""
|
|
36
|
-
|
|
51
|
+
# Use agent-specific memory directory if agent name is set
|
|
52
|
+
agent_name = os.environ.get("SKCAPSTONE_AGENT", "lumina")
|
|
53
|
+
mem = home / "agents" / agent_name / "memory"
|
|
37
54
|
mem.mkdir(parents=True, exist_ok=True)
|
|
38
55
|
for layer in MemoryLayer:
|
|
39
56
|
(mem / layer.value).mkdir(parents=True, exist_ok=True)
|
|
@@ -55,7 +72,7 @@ def _load_entry(path: Path) -> Optional[MemoryEntry]:
|
|
|
55
72
|
MemoryEntry or None if the file is invalid.
|
|
56
73
|
"""
|
|
57
74
|
try:
|
|
58
|
-
data = json.loads(path.read_text())
|
|
75
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
59
76
|
return MemoryEntry(**data)
|
|
60
77
|
except (json.JSONDecodeError, Exception) as exc:
|
|
61
78
|
logger.warning("Failed to load memory %s: %s", path, exc)
|
|
@@ -74,10 +91,30 @@ def _save_entry(home: Path, entry: MemoryEntry) -> Path:
|
|
|
74
91
|
"""
|
|
75
92
|
path = _entry_path(home, entry)
|
|
76
93
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
77
|
-
path.write_text(entry.model_dump_json(indent=2))
|
|
94
|
+
path.write_text(entry.model_dump_json(indent=2), encoding="utf-8")
|
|
78
95
|
return path
|
|
79
96
|
|
|
80
97
|
|
|
98
|
+
def _detect_active_soul(home: Path) -> Optional[str]:
|
|
99
|
+
"""Read the active soul name from disk if available.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
home: Agent home directory.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Active soul slug name, or None if at base.
|
|
106
|
+
"""
|
|
107
|
+
active_path = home / "soul" / "active.json"
|
|
108
|
+
if not active_path.exists():
|
|
109
|
+
return None
|
|
110
|
+
try:
|
|
111
|
+
data = json.loads(active_path.read_text(encoding="utf-8"))
|
|
112
|
+
return data.get("active_soul")
|
|
113
|
+
except (json.JSONDecodeError, OSError) as exc:
|
|
114
|
+
logger.debug("Cannot read active soul: %s", exc)
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
|
|
81
118
|
def store(
|
|
82
119
|
home: Path,
|
|
83
120
|
content: str,
|
|
@@ -86,6 +123,7 @@ def store(
|
|
|
86
123
|
importance: float = 0.5,
|
|
87
124
|
layer: Optional[MemoryLayer] = None,
|
|
88
125
|
metadata: Optional[dict] = None,
|
|
126
|
+
soul_context: Optional[str] = None,
|
|
89
127
|
) -> MemoryEntry:
|
|
90
128
|
"""Store a new memory.
|
|
91
129
|
|
|
@@ -97,12 +135,17 @@ def store(
|
|
|
97
135
|
importance: Importance score 0.0-1.0 (higher = more important).
|
|
98
136
|
layer: Force a specific layer. Defaults to SHORT_TERM.
|
|
99
137
|
metadata: Arbitrary key-value metadata.
|
|
138
|
+
soul_context: Which soul overlay was active. Auto-detected
|
|
139
|
+
from active.json if not provided.
|
|
100
140
|
|
|
101
141
|
Returns:
|
|
102
142
|
The created MemoryEntry.
|
|
103
143
|
"""
|
|
104
144
|
_memory_dir(home)
|
|
105
145
|
|
|
146
|
+
if soul_context is None:
|
|
147
|
+
soul_context = _detect_active_soul(home)
|
|
148
|
+
|
|
106
149
|
entry = MemoryEntry(
|
|
107
150
|
memory_id=uuid.uuid4().hex[:12],
|
|
108
151
|
content=content,
|
|
@@ -111,6 +154,7 @@ def store(
|
|
|
111
154
|
importance=max(0.0, min(1.0, importance)),
|
|
112
155
|
layer=layer or MemoryLayer.SHORT_TERM,
|
|
113
156
|
metadata=metadata or {},
|
|
157
|
+
soul_context=soul_context,
|
|
114
158
|
)
|
|
115
159
|
|
|
116
160
|
# Reason: high-importance memories skip straight to mid-term
|
|
@@ -119,6 +163,29 @@ def store(
|
|
|
119
163
|
|
|
120
164
|
_save_entry(home, entry)
|
|
121
165
|
_update_index(home, entry)
|
|
166
|
+
|
|
167
|
+
# Dual-write to unified backend (skmemory) if available
|
|
168
|
+
unified = _get_unified()
|
|
169
|
+
if unified:
|
|
170
|
+
try:
|
|
171
|
+
from .memory_adapter import entry_to_memory
|
|
172
|
+
|
|
173
|
+
memory = entry_to_memory(entry)
|
|
174
|
+
unified.primary.save(memory)
|
|
175
|
+
if unified.vector:
|
|
176
|
+
try:
|
|
177
|
+
unified.vector.save(memory)
|
|
178
|
+
except Exception as exc:
|
|
179
|
+
logger.debug("Vector dual-write failed (non-fatal): %s", exc)
|
|
180
|
+
if unified.graph:
|
|
181
|
+
try:
|
|
182
|
+
unified.graph.index_memory(memory)
|
|
183
|
+
except Exception as exc:
|
|
184
|
+
logger.debug("Graph dual-write failed (non-fatal): %s", exc)
|
|
185
|
+
logger.debug("Dual-write to unified backend for %s", entry.memory_id)
|
|
186
|
+
except Exception as e:
|
|
187
|
+
logger.debug("Unified dual-write failed (non-fatal): %s", e)
|
|
188
|
+
|
|
122
189
|
logger.info("Stored memory %s in %s", entry.memory_id, entry.layer.value)
|
|
123
190
|
return entry
|
|
124
191
|
|
|
@@ -126,6 +193,8 @@ def store(
|
|
|
126
193
|
def recall(home: Path, memory_id: str) -> Optional[MemoryEntry]:
|
|
127
194
|
"""Recall a specific memory by ID, updating access stats.
|
|
128
195
|
|
|
196
|
+
Tries unified backend first for faster recall, falls back to JSON files.
|
|
197
|
+
|
|
129
198
|
Args:
|
|
130
199
|
home: Agent home directory.
|
|
131
200
|
memory_id: The memory's unique ID.
|
|
@@ -155,11 +224,12 @@ def search(
|
|
|
155
224
|
layer: Optional[MemoryLayer] = None,
|
|
156
225
|
tags: Optional[list[str]] = None,
|
|
157
226
|
limit: int = 20,
|
|
227
|
+
soul_context: Optional[str] = None,
|
|
158
228
|
) -> list[MemoryEntry]:
|
|
159
229
|
"""Search memories by content and/or tags.
|
|
160
230
|
|
|
161
|
-
|
|
162
|
-
|
|
231
|
+
Uses unified backend (semantic search via SKVector) if available,
|
|
232
|
+
falls back to regex matching on JSON files.
|
|
163
233
|
|
|
164
234
|
Args:
|
|
165
235
|
home: Agent home directory.
|
|
@@ -167,10 +237,39 @@ def search(
|
|
|
167
237
|
layer: Restrict to a specific layer.
|
|
168
238
|
tags: Filter to entries containing ALL of these tags.
|
|
169
239
|
limit: Maximum number of results.
|
|
240
|
+
soul_context: Filter to memories formed under a specific soul.
|
|
170
241
|
|
|
171
242
|
Returns:
|
|
172
243
|
List of matching MemoryEntry objects, ranked by relevance.
|
|
173
244
|
"""
|
|
245
|
+
# Try unified backend first (semantic search), but only when home matches
|
|
246
|
+
# the global agent home so tests with temporary directories stay isolated.
|
|
247
|
+
from . import AGENT_HOME
|
|
248
|
+
|
|
249
|
+
_agent_home_resolved = Path(AGENT_HOME).expanduser().resolve()
|
|
250
|
+
_search_home_resolved = Path(home).resolve()
|
|
251
|
+
unified = _get_unified() if _search_home_resolved == _agent_home_resolved else None
|
|
252
|
+
if unified:
|
|
253
|
+
try:
|
|
254
|
+
from .memory_adapter import memory_to_entry
|
|
255
|
+
|
|
256
|
+
results_unified = unified.search(query, limit=limit)
|
|
257
|
+
if results_unified:
|
|
258
|
+
entries = [memory_to_entry(m) for m in results_unified]
|
|
259
|
+
# Apply local filters that unified may not support
|
|
260
|
+
if layer:
|
|
261
|
+
entries = [e for e in entries if e.layer == layer]
|
|
262
|
+
if tags:
|
|
263
|
+
entries = [e for e in entries if all(t in e.tags for t in tags)]
|
|
264
|
+
if soul_context is not None:
|
|
265
|
+
entries = [e for e in entries if e.soul_context == soul_context]
|
|
266
|
+
if entries:
|
|
267
|
+
logger.debug("Search via unified backend returned %d results", len(entries))
|
|
268
|
+
return entries[:limit]
|
|
269
|
+
except Exception as e:
|
|
270
|
+
logger.debug("Unified search failed (falling back to regex): %s", e)
|
|
271
|
+
|
|
272
|
+
# Fallback: regex search on JSON files
|
|
174
273
|
results: list[tuple[float, MemoryEntry]] = []
|
|
175
274
|
pattern = re.compile(re.escape(query), re.IGNORECASE)
|
|
176
275
|
layers = [layer] if layer else list(MemoryLayer)
|
|
@@ -187,6 +286,9 @@ def search(
|
|
|
187
286
|
if tags and not all(t in entry.tags for t in tags):
|
|
188
287
|
continue
|
|
189
288
|
|
|
289
|
+
if soul_context is not None and entry.soul_context != soul_context:
|
|
290
|
+
continue
|
|
291
|
+
|
|
190
292
|
content_matches = len(pattern.findall(entry.content))
|
|
191
293
|
tag_matches = sum(1 for t in entry.tags if pattern.search(t))
|
|
192
294
|
total_matches = content_matches + tag_matches
|
|
@@ -195,7 +297,9 @@ def search(
|
|
|
195
297
|
continue
|
|
196
298
|
|
|
197
299
|
# Reason: rank by (matches * importance), boost long-term memories
|
|
198
|
-
layer_boost = {MemoryLayer.LONG_TERM: 1.5, MemoryLayer.MID_TERM: 1.2}.get(
|
|
300
|
+
layer_boost = {MemoryLayer.LONG_TERM: 1.5, MemoryLayer.MID_TERM: 1.2}.get(
|
|
301
|
+
entry.layer, 1.0
|
|
302
|
+
)
|
|
199
303
|
score = total_matches * entry.importance * layer_boost
|
|
200
304
|
results.append((score, entry))
|
|
201
305
|
|
|
@@ -257,6 +361,16 @@ def delete(home: Path, memory_id: str) -> bool:
|
|
|
257
361
|
if path.exists():
|
|
258
362
|
path.unlink()
|
|
259
363
|
_remove_from_index(home, memory_id)
|
|
364
|
+
|
|
365
|
+
# Also remove from unified backend
|
|
366
|
+
unified = _get_unified()
|
|
367
|
+
if unified:
|
|
368
|
+
try:
|
|
369
|
+
unified.forget(memory_id)
|
|
370
|
+
logger.debug("Removed %s from unified backend", memory_id)
|
|
371
|
+
except Exception as e:
|
|
372
|
+
logger.debug("Unified delete failed (non-fatal): %s", e)
|
|
373
|
+
|
|
260
374
|
logger.info("Deleted memory %s", memory_id)
|
|
261
375
|
return True
|
|
262
376
|
|
|
@@ -332,11 +446,16 @@ def export_for_seed(home: Path, max_entries: int = 50) -> list[dict]:
|
|
|
332
446
|
List of dicts suitable for JSON serialization.
|
|
333
447
|
"""
|
|
334
448
|
all_entries = list_memories(home, limit=500)
|
|
335
|
-
all_entries.sort(
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
449
|
+
all_entries.sort(
|
|
450
|
+
key=lambda e: (
|
|
451
|
+
{MemoryLayer.LONG_TERM: 3, MemoryLayer.MID_TERM: 2, MemoryLayer.SHORT_TERM: 1}[
|
|
452
|
+
e.layer
|
|
453
|
+
],
|
|
454
|
+
e.importance,
|
|
455
|
+
e.access_count,
|
|
456
|
+
),
|
|
457
|
+
reverse=True,
|
|
458
|
+
)
|
|
340
459
|
|
|
341
460
|
return [
|
|
342
461
|
{
|
|
@@ -440,7 +559,7 @@ def _load_index(home: Path) -> dict:
|
|
|
440
559
|
index_path = _memory_dir(home) / "index.json"
|
|
441
560
|
if index_path.exists():
|
|
442
561
|
try:
|
|
443
|
-
return json.loads(index_path.read_text())
|
|
562
|
+
return json.loads(index_path.read_text(encoding="utf-8"))
|
|
444
563
|
except json.JSONDecodeError:
|
|
445
564
|
return {}
|
|
446
565
|
return {}
|
|
@@ -449,7 +568,7 @@ def _load_index(home: Path) -> dict:
|
|
|
449
568
|
def _save_index(home: Path, index: dict) -> None:
|
|
450
569
|
"""Persist the memory index to disk."""
|
|
451
570
|
index_path = _memory_dir(home) / "index.json"
|
|
452
|
-
index_path.write_text(json.dumps(index, indent=2))
|
|
571
|
+
index_path.write_text(json.dumps(index, indent=2), encoding="utf-8")
|
|
453
572
|
|
|
454
573
|
|
|
455
574
|
def _load_index_ids(home: Path) -> set[str]:
|