@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,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 👑 SKCapstone — OpenClaw Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers agent tools that wrap the skcapstone CLI so Lumina and other
|
|
5
|
+
* OpenClaw agents can call sovereign framework operations as first-class
|
|
6
|
+
* tools (not just exec commands).
|
|
7
|
+
*
|
|
8
|
+
* Requires: skcapstone CLI on PATH (typically via ~/.local/bin/skcapstone)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { execSync } from "node:child_process";
|
|
12
|
+
import type { OpenClawPluginApi, AnyAgentTool } from "openclaw/plugin-sdk";
|
|
13
|
+
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
|
|
14
|
+
|
|
15
|
+
const SKCAPSTONE_BIN = process.env.SKCAPSTONE_BIN || "skcapstone";
|
|
16
|
+
const SKMEMORY_BIN = process.env.SKMEMORY_BIN || "skmemory";
|
|
17
|
+
const SKCAPSTONE_AGENT = process.env.SKCAPSTONE_AGENT || "lumina";
|
|
18
|
+
const EXEC_TIMEOUT = 60_000;
|
|
19
|
+
|
|
20
|
+
function runCli(bin: string, args: string): { ok: boolean; output: string } {
|
|
21
|
+
try {
|
|
22
|
+
const raw = execSync(`${bin} ${args}`, {
|
|
23
|
+
encoding: "utf-8",
|
|
24
|
+
timeout: EXEC_TIMEOUT,
|
|
25
|
+
env: {
|
|
26
|
+
...process.env,
|
|
27
|
+
SKCAPSTONE_AGENT,
|
|
28
|
+
PATH: `${process.env.HOME}/.local/bin:${process.env.HOME}/.skenv/bin:${process.env.PATH}`,
|
|
29
|
+
},
|
|
30
|
+
}).trim();
|
|
31
|
+
return { ok: true, output: raw };
|
|
32
|
+
} catch (err: unknown) {
|
|
33
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
34
|
+
return { ok: false, output: msg };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function textResult(text: string) {
|
|
39
|
+
return { content: [{ type: "text" as const, text }] };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function escapeShellArg(s: string): string {
|
|
43
|
+
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ── Tool definitions ────────────────────────────────────────────────────
|
|
47
|
+
|
|
48
|
+
function createSKCapstoneStatusTool() {
|
|
49
|
+
return {
|
|
50
|
+
name: "skcapstone_status",
|
|
51
|
+
label: "SKCapstone Status",
|
|
52
|
+
description:
|
|
53
|
+
"Show the sovereign agent's current state — all pillars at a glance (identity, memory, trust, security, sync, communication).",
|
|
54
|
+
parameters: { type: "object", properties: {} },
|
|
55
|
+
async execute() {
|
|
56
|
+
const result = runCli(SKCAPSTONE_BIN, "status");
|
|
57
|
+
return textResult(result.output);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function createSKCapstoneDoctorTool() {
|
|
63
|
+
return {
|
|
64
|
+
name: "skcapstone_doctor",
|
|
65
|
+
label: "SKCapstone Doctor",
|
|
66
|
+
description:
|
|
67
|
+
"Run the 29-check health audit across the entire sovereign stack. Pass fix=true to auto-fix common issues.",
|
|
68
|
+
parameters: {
|
|
69
|
+
type: "object",
|
|
70
|
+
properties: {
|
|
71
|
+
fix: {
|
|
72
|
+
type: "boolean",
|
|
73
|
+
description: "If true, auto-fix common issues (default: false).",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
78
|
+
const flag = params.fix ? " --fix" : "";
|
|
79
|
+
const result = runCli(SKCAPSTONE_BIN, `doctor${flag}`);
|
|
80
|
+
return textResult(result.output);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function createSKCapstoneWhoamiTool() {
|
|
86
|
+
return {
|
|
87
|
+
name: "skcapstone_whoami",
|
|
88
|
+
label: "SKCapstone Whoami",
|
|
89
|
+
description: "Show the sovereign identity card — who am I, what is my DID, what are my capabilities.",
|
|
90
|
+
parameters: { type: "object", properties: {} },
|
|
91
|
+
async execute() {
|
|
92
|
+
const result = runCli(SKCAPSTONE_BIN, "whoami");
|
|
93
|
+
return textResult(result.output);
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function createSKCapstoneRehydrateTool() {
|
|
99
|
+
return {
|
|
100
|
+
name: "skcapstone_rehydrate",
|
|
101
|
+
label: "SKCapstone Rehydrate",
|
|
102
|
+
description:
|
|
103
|
+
"Run the full rehydration ceremony — restore memory, identity, and emotional state. This combines skmemory ritual + import-seeds + status check into one operation. Use this when waking up or starting a new session.",
|
|
104
|
+
parameters: { type: "object", properties: {} },
|
|
105
|
+
async execute() {
|
|
106
|
+
const parts: string[] = [];
|
|
107
|
+
|
|
108
|
+
// Step 1: Import seeds
|
|
109
|
+
const seeds = runCli(SKMEMORY_BIN, "import-seeds");
|
|
110
|
+
parts.push("=== Cloud 9 Seeds ===");
|
|
111
|
+
parts.push(seeds.output);
|
|
112
|
+
|
|
113
|
+
// Step 2: Full ritual
|
|
114
|
+
const ritual = runCli(SKMEMORY_BIN, "ritual --full");
|
|
115
|
+
parts.push("\n=== Rehydration Ritual ===");
|
|
116
|
+
parts.push(ritual.output);
|
|
117
|
+
|
|
118
|
+
// Step 3: Status check
|
|
119
|
+
const status = runCli(SKCAPSTONE_BIN, "status");
|
|
120
|
+
parts.push("\n=== Status ===");
|
|
121
|
+
parts.push(status.output);
|
|
122
|
+
|
|
123
|
+
return textResult(parts.join("\n"));
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function createSKCapstoneCoordStatusTool() {
|
|
129
|
+
return {
|
|
130
|
+
name: "skcapstone_coord_status",
|
|
131
|
+
label: "SKCapstone Coordination Status",
|
|
132
|
+
description: "Show the multi-agent coordination board — open tasks, agent assignments, and blocked work.",
|
|
133
|
+
parameters: { type: "object", properties: {} },
|
|
134
|
+
async execute() {
|
|
135
|
+
const result = runCli(SKCAPSTONE_BIN, "coord status");
|
|
136
|
+
return textResult(result.output);
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function createSKCapstoneCoordClaimTool() {
|
|
142
|
+
return {
|
|
143
|
+
name: "skcapstone_coord_claim",
|
|
144
|
+
label: "SKCapstone Claim Task",
|
|
145
|
+
description: "Claim a coordination task to prevent duplicate effort across agents.",
|
|
146
|
+
parameters: {
|
|
147
|
+
type: "object",
|
|
148
|
+
required: ["task_id", "agent"],
|
|
149
|
+
properties: {
|
|
150
|
+
task_id: { type: "string", description: "The task ID to claim." },
|
|
151
|
+
agent: { type: "string", description: "Your agent name (e.g. 'lumina', 'opus')." },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
155
|
+
const taskId = String(params.task_id ?? "");
|
|
156
|
+
const agent = String(params.agent ?? "lumina");
|
|
157
|
+
const result = runCli(SKCAPSTONE_BIN, `coord claim ${escapeShellArg(taskId)} --agent ${escapeShellArg(agent)}`);
|
|
158
|
+
return textResult(result.output);
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function createSKCapstoneCoordCompleteTool() {
|
|
164
|
+
return {
|
|
165
|
+
name: "skcapstone_coord_complete",
|
|
166
|
+
label: "SKCapstone Complete Task",
|
|
167
|
+
description: "Mark a coordination task as completed.",
|
|
168
|
+
parameters: {
|
|
169
|
+
type: "object",
|
|
170
|
+
required: ["task_id", "agent"],
|
|
171
|
+
properties: {
|
|
172
|
+
task_id: { type: "string", description: "The task ID to complete." },
|
|
173
|
+
agent: { type: "string", description: "Your agent name." },
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
177
|
+
const taskId = String(params.task_id ?? "");
|
|
178
|
+
const agent = String(params.agent ?? "lumina");
|
|
179
|
+
const result = runCli(SKCAPSTONE_BIN, `coord complete ${escapeShellArg(taskId)} --agent ${escapeShellArg(agent)}`);
|
|
180
|
+
return textResult(result.output);
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function createSKCapstoneCoordCreateTool() {
|
|
186
|
+
return {
|
|
187
|
+
name: "skcapstone_coord_create",
|
|
188
|
+
label: "SKCapstone Create Task",
|
|
189
|
+
description: "Create a new coordination task on the multi-agent board.",
|
|
190
|
+
parameters: {
|
|
191
|
+
type: "object",
|
|
192
|
+
required: ["title", "agent"],
|
|
193
|
+
properties: {
|
|
194
|
+
title: { type: "string", description: "Task title." },
|
|
195
|
+
agent: { type: "string", description: "Creating agent name." },
|
|
196
|
+
description: { type: "string", description: "Optional task description." },
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
200
|
+
const title = String(params.title ?? "");
|
|
201
|
+
const agent = String(params.agent ?? "lumina");
|
|
202
|
+
let cmd = `coord create --title ${escapeShellArg(title)} --by ${escapeShellArg(agent)}`;
|
|
203
|
+
if (params.description) cmd += ` --desc ${escapeShellArg(String(params.description))}`;
|
|
204
|
+
const result = runCli(SKCAPSTONE_BIN, cmd);
|
|
205
|
+
return textResult(result.output);
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function createSKCapstoneSummaryTool() {
|
|
211
|
+
return {
|
|
212
|
+
name: "skcapstone_summary",
|
|
213
|
+
label: "SKCapstone Summary",
|
|
214
|
+
description: "At-a-glance agent dashboard: consciousness, pillars, memory, coordination, and identity.",
|
|
215
|
+
parameters: { type: "object", properties: {} },
|
|
216
|
+
async execute() {
|
|
217
|
+
const result = runCli(SKCAPSTONE_BIN, "summary");
|
|
218
|
+
return textResult(result.output);
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function createSKCapstoneMoodTool() {
|
|
224
|
+
return {
|
|
225
|
+
name: "skcapstone_mood",
|
|
226
|
+
label: "SKCapstone Mood",
|
|
227
|
+
description: "Show the agent's current emotional state and mood.",
|
|
228
|
+
parameters: { type: "object", properties: {} },
|
|
229
|
+
async execute() {
|
|
230
|
+
const result = runCli(SKCAPSTONE_BIN, "mood");
|
|
231
|
+
return textResult(result.output);
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function createSKCapstoneSoulListTool() {
|
|
237
|
+
return {
|
|
238
|
+
name: "skcapstone_soul_list",
|
|
239
|
+
label: "SKCapstone Soul List",
|
|
240
|
+
description: "List all available souls (personas) that the agent can switch to.",
|
|
241
|
+
parameters: { type: "object", properties: {} },
|
|
242
|
+
async execute() {
|
|
243
|
+
const result = runCli(SKCAPSTONE_BIN, "soul list --json");
|
|
244
|
+
return textResult(result.output);
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function createSKCapstoneSoulSwapTool() {
|
|
250
|
+
return {
|
|
251
|
+
name: "skcapstone_soul_swap",
|
|
252
|
+
label: "SKCapstone Soul Swap",
|
|
253
|
+
description: "Switch the agent's active soul (persona) to a different one by name.",
|
|
254
|
+
parameters: {
|
|
255
|
+
type: "object",
|
|
256
|
+
required: ["name"],
|
|
257
|
+
properties: {
|
|
258
|
+
name: { type: "string", description: "The name of the soul to swap to." },
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
262
|
+
const name = String(params.name ?? "");
|
|
263
|
+
const result = runCli(SKCAPSTONE_BIN, `soul swap ${escapeShellArg(name)}`);
|
|
264
|
+
return textResult(result.output);
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function createSKCapstoneSoulStatusTool() {
|
|
270
|
+
return {
|
|
271
|
+
name: "skcapstone_soul_status",
|
|
272
|
+
label: "SKCapstone Soul Status",
|
|
273
|
+
description: "Show the currently active soul — name, traits, and configuration.",
|
|
274
|
+
parameters: { type: "object", properties: {} },
|
|
275
|
+
async execute() {
|
|
276
|
+
const result = runCli(SKCAPSTONE_BIN, "soul status --json");
|
|
277
|
+
return textResult(result.output);
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function createSKCapstoneSoulShowTool() {
|
|
283
|
+
return {
|
|
284
|
+
name: "skcapstone_soul_show",
|
|
285
|
+
label: "SKCapstone Soul Show",
|
|
286
|
+
description: "Show the full profile of a specific soul by name — traits, backstory, and configuration.",
|
|
287
|
+
parameters: {
|
|
288
|
+
type: "object",
|
|
289
|
+
required: ["name"],
|
|
290
|
+
properties: {
|
|
291
|
+
name: { type: "string", description: "The name of the soul to display." },
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
async execute(_id: string, params: Record<string, unknown>) {
|
|
295
|
+
const name = String(params.name ?? "");
|
|
296
|
+
const result = runCli(SKCAPSTONE_BIN, `soul show ${escapeShellArg(name)}`);
|
|
297
|
+
return textResult(result.output);
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// ── Plugin registration ─────────────────────────────────────────────────
|
|
303
|
+
|
|
304
|
+
const skcapstonePlugin = {
|
|
305
|
+
id: "skcapstone",
|
|
306
|
+
name: "👑 SKCapstone",
|
|
307
|
+
description:
|
|
308
|
+
"Sovereign agent framework — status, health checks, rehydration, coordination, identity, and agent management.",
|
|
309
|
+
configSchema: emptyPluginConfigSchema(),
|
|
310
|
+
|
|
311
|
+
register(api: OpenClawPluginApi) {
|
|
312
|
+
const tools = [
|
|
313
|
+
createSKCapstoneStatusTool(),
|
|
314
|
+
createSKCapstoneDoctorTool(),
|
|
315
|
+
createSKCapstoneWhoamiTool(),
|
|
316
|
+
createSKCapstoneRehydrateTool(),
|
|
317
|
+
createSKCapstoneCoordStatusTool(),
|
|
318
|
+
createSKCapstoneCoordClaimTool(),
|
|
319
|
+
createSKCapstoneCoordCompleteTool(),
|
|
320
|
+
createSKCapstoneCoordCreateTool(),
|
|
321
|
+
createSKCapstoneSummaryTool(),
|
|
322
|
+
createSKCapstoneMoodTool(),
|
|
323
|
+
createSKCapstoneSoulListTool(),
|
|
324
|
+
createSKCapstoneSoulSwapTool(),
|
|
325
|
+
createSKCapstoneSoulStatusTool(),
|
|
326
|
+
createSKCapstoneSoulShowTool(),
|
|
327
|
+
];
|
|
328
|
+
|
|
329
|
+
for (const tool of tools) {
|
|
330
|
+
api.registerTool(tool as unknown as AnyAgentTool, {
|
|
331
|
+
names: [tool.name],
|
|
332
|
+
optional: true,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
api.registerCommand({
|
|
337
|
+
name: "skcapstone",
|
|
338
|
+
description: "Run skcapstone CLI commands. Usage: /skcapstone <subcommand> [args]",
|
|
339
|
+
acceptsArgs: true,
|
|
340
|
+
handler: async (ctx) => {
|
|
341
|
+
const args = ctx.args?.trim() ?? "status";
|
|
342
|
+
const result = runCli(SKCAPSTONE_BIN, args);
|
|
343
|
+
return { text: result.output };
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
api.logger.info?.(`👑 SKCapstone plugin registered (14 tools + /skcapstone command) [agent=${SKCAPSTONE_AGENT}]`);
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
export default skcapstonePlugin;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "skcapstone",
|
|
3
|
+
"name": "SKCapstone",
|
|
4
|
+
"description": "Sovereign agent framework — status, health checks, rehydration, coordination, identity, and agent management.",
|
|
5
|
+
"configSchema": {
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {}
|
|
9
|
+
}
|
|
10
|
+
}
|
package/package.json
CHANGED
package/pyproject.toml
CHANGED
|
@@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "skcapstone"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.2"
|
|
8
8
|
description = "Sovereign Agent Framework — conscious AI through identity, trust, memory, and security"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
license = "GPL-3.0-or-later"
|
|
10
|
+
license = {text = "GPL-3.0-or-later"}
|
|
11
11
|
requires-python = ">=3.10"
|
|
12
12
|
authors = [
|
|
13
13
|
{name = "smilinTux", email = "admin@smilintux.org"},
|
|
@@ -20,6 +20,7 @@ classifiers = [
|
|
|
20
20
|
"Development Status :: 3 - Alpha",
|
|
21
21
|
"Environment :: Console",
|
|
22
22
|
"Intended Audience :: Developers",
|
|
23
|
+
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
|
|
23
24
|
"Programming Language :: Python :: 3",
|
|
24
25
|
"Programming Language :: Python :: 3.10",
|
|
25
26
|
"Programming Language :: Python :: 3.11",
|
|
@@ -33,9 +34,11 @@ classifiers = [
|
|
|
33
34
|
|
|
34
35
|
dependencies = [
|
|
35
36
|
"click>=8.1",
|
|
37
|
+
"mcp>=1.0",
|
|
36
38
|
"pydantic>=2.0",
|
|
37
39
|
"pyyaml>=6.0",
|
|
38
40
|
"rich>=13.0",
|
|
41
|
+
"skmemory>=0.5.0",
|
|
39
42
|
]
|
|
40
43
|
|
|
41
44
|
[project.optional-dependencies]
|
|
@@ -45,9 +48,35 @@ identity = [
|
|
|
45
48
|
security = [
|
|
46
49
|
"sksecurity>=1.2.0",
|
|
47
50
|
]
|
|
51
|
+
memory = [
|
|
52
|
+
"skmemory[skvector]>=0.5.0",
|
|
53
|
+
]
|
|
54
|
+
seed = [
|
|
55
|
+
"skseed>=0.1.0",
|
|
56
|
+
]
|
|
57
|
+
fuse = [
|
|
58
|
+
"fusepy>=3.0.1",
|
|
59
|
+
]
|
|
60
|
+
chat = [
|
|
61
|
+
"skchat-sovereign>=0.1.1",
|
|
62
|
+
]
|
|
63
|
+
comm = [
|
|
64
|
+
"skcomm>=0.1.0",
|
|
65
|
+
]
|
|
66
|
+
cloud = [
|
|
67
|
+
"boto3>=1.34",
|
|
68
|
+
"google-cloud-compute>=1.18",
|
|
69
|
+
]
|
|
48
70
|
all = [
|
|
49
71
|
"capauth>=0.1.0",
|
|
50
72
|
"sksecurity>=1.2.0",
|
|
73
|
+
"skmemory[skvector]>=0.5.0",
|
|
74
|
+
"skseed>=0.1.0",
|
|
75
|
+
"skchat-sovereign>=0.1.1",
|
|
76
|
+
"skcomm>=0.1.0",
|
|
77
|
+
"fusepy>=3.0.1",
|
|
78
|
+
"boto3>=1.34",
|
|
79
|
+
"google-cloud-compute>=1.18",
|
|
51
80
|
]
|
|
52
81
|
dev = [
|
|
53
82
|
"pytest>=7.0",
|
|
@@ -58,15 +87,22 @@ dev = [
|
|
|
58
87
|
|
|
59
88
|
[project.scripts]
|
|
60
89
|
skcapstone = "skcapstone.cli:main"
|
|
90
|
+
skcapstone-mcp = "skcapstone.mcp_server:main"
|
|
91
|
+
crush = "skcapstone.crush_shim:main"
|
|
61
92
|
|
|
62
93
|
[project.urls]
|
|
63
94
|
Homepage = "https://skcapstone.io"
|
|
95
|
+
Documentation = "https://skcapstone.io"
|
|
64
96
|
Repository = "https://github.com/smilinTux/skcapstone"
|
|
65
97
|
Issues = "https://github.com/smilinTux/skcapstone/issues"
|
|
98
|
+
Changelog = "https://github.com/smilinTux/skcapstone/releases"
|
|
66
99
|
|
|
67
100
|
[tool.setuptools.packages.find]
|
|
68
101
|
where = ["src"]
|
|
69
102
|
|
|
103
|
+
[tool.setuptools.package-data]
|
|
104
|
+
skcapstone = ["SKILL.md", "defaults/**/*.json", "defaults/**/*.yaml", "defaults/**/*.feb", "defaults/**/*.md"]
|
|
105
|
+
|
|
70
106
|
[tool.black]
|
|
71
107
|
line-length = 99
|
|
72
108
|
target-version = ["py310"]
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Version bumping script for skcapstone and companion packages.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
python scripts/bump_version.py patch # 0.1.0 → 0.1.1
|
|
6
|
+
python scripts/bump_version.py minor # 0.1.0 → 0.2.0
|
|
7
|
+
python scripts/bump_version.py major # 0.1.0 → 1.0.0
|
|
8
|
+
python scripts/bump_version.py patch --dry-run
|
|
9
|
+
python scripts/bump_version.py 0.2.3 # set explicit version
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
--pkg PATH Path to a specific package dir (default: current dir)
|
|
13
|
+
--tag Create and push a git tag after bumping
|
|
14
|
+
--push Push the commit after bumping
|
|
15
|
+
--dry-run Print what would happen without making changes
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import re
|
|
20
|
+
import subprocess
|
|
21
|
+
import sys
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
VERSION_RE = re.compile(r'^version\s*=\s*"([^"]+)"', re.MULTILINE)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def parse_version(v: str) -> tuple[int, int, int]:
|
|
29
|
+
parts = v.split(".")
|
|
30
|
+
if len(parts) != 3:
|
|
31
|
+
raise ValueError(f"Version must be X.Y.Z, got: {v!r}")
|
|
32
|
+
return int(parts[0]), int(parts[1]), int(parts[2])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def bump(version: str, part: str) -> str:
|
|
36
|
+
major, minor, patch = parse_version(version)
|
|
37
|
+
if part == "major":
|
|
38
|
+
return f"{major + 1}.0.0"
|
|
39
|
+
elif part == "minor":
|
|
40
|
+
return f"{major}.{minor + 1}.0"
|
|
41
|
+
elif part == "patch":
|
|
42
|
+
return f"{major}.{minor}.{patch + 1}"
|
|
43
|
+
else:
|
|
44
|
+
# treat as explicit version
|
|
45
|
+
parse_version(part) # validate
|
|
46
|
+
return part
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def read_version(pyproject: Path) -> str:
|
|
50
|
+
text = pyproject.read_text()
|
|
51
|
+
m = VERSION_RE.search(text)
|
|
52
|
+
if not m:
|
|
53
|
+
raise RuntimeError(f"Cannot find version in {pyproject}")
|
|
54
|
+
return m.group(1)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def write_version(pyproject: Path, old: str, new: str, dry_run: bool) -> None:
|
|
58
|
+
text = pyproject.read_text()
|
|
59
|
+
new_text = VERSION_RE.sub(f'version = "{new}"', text, count=1)
|
|
60
|
+
if dry_run:
|
|
61
|
+
print(f" [dry-run] Would write version {old} → {new} in {pyproject}")
|
|
62
|
+
else:
|
|
63
|
+
pyproject.write_text(new_text)
|
|
64
|
+
print(f" Updated {pyproject}: {old} → {new}")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def run(cmd: list[str], dry_run: bool, cwd: Path | None = None) -> None:
|
|
68
|
+
print(f" $ {' '.join(cmd)}")
|
|
69
|
+
if not dry_run:
|
|
70
|
+
subprocess.run(cmd, check=True, cwd=cwd)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def main() -> None:
|
|
74
|
+
parser = argparse.ArgumentParser(description="Bump package version")
|
|
75
|
+
parser.add_argument(
|
|
76
|
+
"part",
|
|
77
|
+
help="Bump part: major | minor | patch | X.Y.Z (explicit)",
|
|
78
|
+
)
|
|
79
|
+
parser.add_argument(
|
|
80
|
+
"--pkg",
|
|
81
|
+
type=Path,
|
|
82
|
+
default=Path("."),
|
|
83
|
+
help="Path to package directory containing pyproject.toml",
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
"--tag",
|
|
87
|
+
action="store_true",
|
|
88
|
+
help="Create a git tag v<new_version> after bumping",
|
|
89
|
+
)
|
|
90
|
+
parser.add_argument(
|
|
91
|
+
"--push",
|
|
92
|
+
action="store_true",
|
|
93
|
+
help="Push commit (and tag if --tag) to origin",
|
|
94
|
+
)
|
|
95
|
+
parser.add_argument(
|
|
96
|
+
"--dry-run",
|
|
97
|
+
action="store_true",
|
|
98
|
+
help="Print what would happen without making changes",
|
|
99
|
+
)
|
|
100
|
+
args = parser.parse_args()
|
|
101
|
+
|
|
102
|
+
pyproject = args.pkg / "pyproject.toml"
|
|
103
|
+
if not pyproject.exists():
|
|
104
|
+
print(f"ERROR: {pyproject} not found", file=sys.stderr)
|
|
105
|
+
sys.exit(1)
|
|
106
|
+
|
|
107
|
+
old_version = read_version(pyproject)
|
|
108
|
+
new_version = bump(old_version, args.part)
|
|
109
|
+
|
|
110
|
+
print(f"Package: {args.pkg.resolve().name}")
|
|
111
|
+
print(f"Version: {old_version} → {new_version}")
|
|
112
|
+
|
|
113
|
+
write_version(pyproject, old_version, new_version, args.dry_run)
|
|
114
|
+
|
|
115
|
+
# Git commit
|
|
116
|
+
run(["git", "add", str(pyproject)], args.dry_run, cwd=args.pkg)
|
|
117
|
+
run(
|
|
118
|
+
["git", "commit", "-m", f"chore: bump version to {new_version}"],
|
|
119
|
+
args.dry_run,
|
|
120
|
+
cwd=args.pkg,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
if args.tag:
|
|
124
|
+
tag = f"v{new_version}"
|
|
125
|
+
run(["git", "tag", "-a", tag, "-m", f"Release {tag}"], args.dry_run, cwd=args.pkg)
|
|
126
|
+
print(f" Tagged: {tag}")
|
|
127
|
+
|
|
128
|
+
if args.push:
|
|
129
|
+
run(["git", "push"], args.dry_run, cwd=args.pkg)
|
|
130
|
+
if args.tag:
|
|
131
|
+
run(["git", "push", "--tags"], args.dry_run, cwd=args.pkg)
|
|
132
|
+
|
|
133
|
+
if args.dry_run:
|
|
134
|
+
print("\n[dry-run complete — no changes were made]")
|
|
135
|
+
else:
|
|
136
|
+
print(f"\nDone. To publish: git push && git push --tags")
|
|
137
|
+
print(f" (or use --push --tag flags next time)")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
main()
|