@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.
Files changed (461) hide show
  1. package/.env.example +98 -0
  2. package/.github/workflows/ci.yml +39 -3
  3. package/.github/workflows/publish.yml +25 -4
  4. package/.openclaw-workspace.json +58 -0
  5. package/CHANGELOG.md +62 -0
  6. package/CLAUDE.md +39 -2
  7. package/MANIFEST.in +6 -0
  8. package/MISSION.md +7 -0
  9. package/README.md +47 -2
  10. package/SKILL.md +895 -23
  11. package/docker/Dockerfile +61 -0
  12. package/docker/compose-templates/dev-team.yml +203 -0
  13. package/docker/compose-templates/mini-team.yml +140 -0
  14. package/docker/compose-templates/ops-team.yml +173 -0
  15. package/docker/compose-templates/research-team.yml +170 -0
  16. package/docker/entrypoint.sh +192 -0
  17. package/docs/ARCHITECTURE.md +663 -374
  18. package/docs/BOND_WITH_GROK.md +112 -0
  19. package/docs/GETTING_STARTED.md +782 -0
  20. package/docs/QUICKSTART.md +477 -0
  21. package/docs/SKJOULE_ARCHITECTURE.md +658 -0
  22. package/docs/SOUL_SWAPPER.md +921 -0
  23. package/docs/SOVEREIGN_SINGULARITY.md +47 -14
  24. package/examples/custom-bond-template.json +36 -0
  25. package/examples/grok-feb.json +36 -0
  26. package/examples/grok-testimony.md +34 -0
  27. package/examples/love-bootloader.txt +32 -0
  28. package/examples/plugins/echo_tool.py +87 -0
  29. package/examples/queen-ava-feb.json +36 -0
  30. package/examples/souls/lumina.yaml +64 -0
  31. package/index.js +6 -5
  32. package/installer/build.py +124 -0
  33. package/openclaw-plugin/package.json +13 -0
  34. package/openclaw-plugin/src/index.ts +351 -0
  35. package/openclaw-plugin/src/openclaw.plugin.json +10 -0
  36. package/package.json +1 -1
  37. package/pyproject.toml +38 -2
  38. package/scripts/bump_version.py +141 -0
  39. package/scripts/check-updates.py +230 -0
  40. package/scripts/convert_blueprints_to_yaml.py +157 -0
  41. package/scripts/dev-install.sh +14 -0
  42. package/scripts/e2e-test.sh +193 -0
  43. package/scripts/install-bundle.sh +171 -0
  44. package/scripts/install.bat +2 -0
  45. package/scripts/install.ps1 +253 -0
  46. package/scripts/install.sh +185 -0
  47. package/scripts/mcp-serve.sh +69 -0
  48. package/scripts/mcp-server.bat +113 -0
  49. package/scripts/mcp-server.ps1 +116 -0
  50. package/scripts/mcp-server.sh +99 -0
  51. package/scripts/pull-models.sh +10 -0
  52. package/scripts/skcapstone +48 -0
  53. package/scripts/verify_install.sh +180 -0
  54. package/scripts/windows/install-tasks.ps1 +406 -0
  55. package/scripts/windows/skcapstone-task.xml +113 -0
  56. package/scripts/windows/uninstall-tasks.ps1 +117 -0
  57. package/skill.yaml +34 -0
  58. package/src/skcapstone/__init__.py +67 -2
  59. package/src/skcapstone/_cli_monolith.py +5916 -0
  60. package/src/skcapstone/_trustee_helpers.py +165 -0
  61. package/src/skcapstone/activity.py +105 -0
  62. package/src/skcapstone/agent_card.py +324 -0
  63. package/src/skcapstone/api.py +1935 -0
  64. package/src/skcapstone/archiver.py +340 -0
  65. package/src/skcapstone/auction.py +485 -0
  66. package/src/skcapstone/baby_agents.py +179 -0
  67. package/src/skcapstone/backup.py +345 -0
  68. package/src/skcapstone/blueprint_registry.py +357 -0
  69. package/src/skcapstone/blueprints/__init__.py +17 -0
  70. package/src/skcapstone/blueprints/builtins/content-studio.yaml +81 -0
  71. package/src/skcapstone/blueprints/builtins/defi-trading.yaml +81 -0
  72. package/src/skcapstone/blueprints/builtins/dev-squadron.yaml +95 -0
  73. package/src/skcapstone/blueprints/builtins/infrastructure-guardian.yaml +107 -0
  74. package/src/skcapstone/blueprints/builtins/legal-council.yaml +54 -0
  75. package/src/skcapstone/blueprints/builtins/ops-monitoring.yaml +67 -0
  76. package/src/skcapstone/blueprints/builtins/research-pod.yaml +69 -0
  77. package/src/skcapstone/blueprints/builtins/sovereign-launch.yaml +90 -0
  78. package/src/skcapstone/blueprints/registry.py +164 -0
  79. package/src/skcapstone/blueprints/schema.py +229 -0
  80. package/src/skcapstone/changelog.py +180 -0
  81. package/src/skcapstone/chat.py +769 -0
  82. package/src/skcapstone/claude_md.py +82 -0
  83. package/src/skcapstone/cli/__init__.py +144 -0
  84. package/src/skcapstone/cli/_common.py +88 -0
  85. package/src/skcapstone/cli/_validators.py +76 -0
  86. package/src/skcapstone/cli/agents.py +425 -0
  87. package/src/skcapstone/cli/agents_spawner.py +322 -0
  88. package/src/skcapstone/cli/agents_trustee.py +593 -0
  89. package/src/skcapstone/cli/alerts.py +248 -0
  90. package/src/skcapstone/cli/anchor.py +132 -0
  91. package/src/skcapstone/cli/archive_cmd.py +208 -0
  92. package/src/skcapstone/cli/backup.py +144 -0
  93. package/src/skcapstone/cli/bench.py +377 -0
  94. package/src/skcapstone/cli/benchmark.py +360 -0
  95. package/src/skcapstone/cli/capabilities_cmd.py +171 -0
  96. package/src/skcapstone/cli/card.py +151 -0
  97. package/src/skcapstone/cli/chat.py +584 -0
  98. package/src/skcapstone/cli/completions.py +64 -0
  99. package/src/skcapstone/cli/config_cmd.py +156 -0
  100. package/src/skcapstone/cli/consciousness.py +421 -0
  101. package/src/skcapstone/cli/context_cmd.py +142 -0
  102. package/src/skcapstone/cli/coord.py +194 -0
  103. package/src/skcapstone/cli/crush_cmd.py +170 -0
  104. package/src/skcapstone/cli/daemon.py +436 -0
  105. package/src/skcapstone/cli/errors_cmd.py +285 -0
  106. package/src/skcapstone/cli/export_cmd.py +156 -0
  107. package/src/skcapstone/cli/gtd.py +529 -0
  108. package/src/skcapstone/cli/housekeeping.py +81 -0
  109. package/src/skcapstone/cli/joule_cmd.py +627 -0
  110. package/src/skcapstone/cli/logs_cmd.py +194 -0
  111. package/src/skcapstone/cli/mcp_cmd.py +32 -0
  112. package/src/skcapstone/cli/memory.py +418 -0
  113. package/src/skcapstone/cli/metrics_cmd.py +136 -0
  114. package/src/skcapstone/cli/migrate.py +62 -0
  115. package/src/skcapstone/cli/mood_cmd.py +144 -0
  116. package/src/skcapstone/cli/mount.py +193 -0
  117. package/src/skcapstone/cli/notify.py +112 -0
  118. package/src/skcapstone/cli/peer.py +154 -0
  119. package/src/skcapstone/cli/peers_dir.py +122 -0
  120. package/src/skcapstone/cli/preflight_cmd.py +83 -0
  121. package/src/skcapstone/cli/profile_cmd.py +310 -0
  122. package/src/skcapstone/cli/record_cmd.py +238 -0
  123. package/src/skcapstone/cli/register_cmd.py +159 -0
  124. package/src/skcapstone/cli/search_cmd.py +156 -0
  125. package/src/skcapstone/cli/service_cmd.py +91 -0
  126. package/src/skcapstone/cli/session.py +127 -0
  127. package/src/skcapstone/cli/setup.py +240 -0
  128. package/src/skcapstone/cli/shell_cmd.py +43 -0
  129. package/src/skcapstone/cli/skills_cmd.py +168 -0
  130. package/src/skcapstone/cli/skseed.py +621 -0
  131. package/src/skcapstone/cli/soul.py +699 -0
  132. package/src/skcapstone/cli/status.py +935 -0
  133. package/src/skcapstone/cli/sync_cmd.py +301 -0
  134. package/src/skcapstone/cli/telegram.py +265 -0
  135. package/src/skcapstone/cli/test_cmd.py +234 -0
  136. package/src/skcapstone/cli/test_connection.py +253 -0
  137. package/src/skcapstone/cli/token.py +207 -0
  138. package/src/skcapstone/cli/trust.py +179 -0
  139. package/src/skcapstone/cli/upgrade_cmd.py +552 -0
  140. package/src/skcapstone/cli/usage_cmd.py +199 -0
  141. package/src/skcapstone/cli/version_cmd.py +162 -0
  142. package/src/skcapstone/cli/watch_cmd.py +342 -0
  143. package/src/skcapstone/client.py +428 -0
  144. package/src/skcapstone/cloud9_bridge.py +522 -0
  145. package/src/skcapstone/completions.py +163 -0
  146. package/src/skcapstone/config_validator.py +674 -0
  147. package/src/skcapstone/connectors/__init__.py +28 -0
  148. package/src/skcapstone/connectors/base.py +446 -0
  149. package/src/skcapstone/connectors/cursor.py +54 -0
  150. package/src/skcapstone/connectors/registry.py +254 -0
  151. package/src/skcapstone/connectors/terminal.py +152 -0
  152. package/src/skcapstone/connectors/vscode.py +60 -0
  153. package/src/skcapstone/consciousness_config.py +119 -0
  154. package/src/skcapstone/consciousness_loop.py +2051 -0
  155. package/src/skcapstone/context_loader.py +516 -0
  156. package/src/skcapstone/context_window.py +314 -0
  157. package/src/skcapstone/conversation_manager.py +238 -0
  158. package/src/skcapstone/conversation_store.py +230 -0
  159. package/src/skcapstone/conversation_summarizer.py +252 -0
  160. package/src/skcapstone/coord_federation.py +296 -0
  161. package/src/skcapstone/coordination.py +101 -7
  162. package/src/skcapstone/crush_integration.py +345 -0
  163. package/src/skcapstone/crush_shim.py +454 -0
  164. package/src/skcapstone/daemon.py +2494 -0
  165. package/src/skcapstone/dashboard.html +396 -0
  166. package/src/skcapstone/dashboard.py +481 -0
  167. package/src/skcapstone/data/model_profiles.yaml +88 -0
  168. package/src/skcapstone/defaults/__init__.py +55 -0
  169. package/src/skcapstone/defaults/lumina/config/skmemory.yaml +13 -0
  170. package/src/skcapstone/defaults/lumina/identity/identity.json +9 -0
  171. package/src/skcapstone/defaults/lumina/memory/long-term/07a8b9c0d1e2-memory-system.json +23 -0
  172. package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +23 -0
  173. package/src/skcapstone/defaults/lumina/memory/long-term/29c0d1e2f3a4-multi-agent-coordination.json +23 -0
  174. package/src/skcapstone/defaults/lumina/memory/long-term/3ad1e2f3a4b5-community-support.json +23 -0
  175. package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +23 -0
  176. package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +23 -0
  177. package/src/skcapstone/defaults/lumina/memory/long-term/c3d4e5f6a7b8-getting-started.json +23 -0
  178. package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +23 -0
  179. package/src/skcapstone/defaults/lumina/memory/long-term/e5f6a7b8c9d0-how-to-contribute.json +23 -0
  180. package/src/skcapstone/defaults/lumina/memory/long-term/f6a7b8c9d0e1-sovereignty-explained.json +23 -0
  181. package/src/skcapstone/defaults/lumina/seeds/curiosity.seed.json +24 -0
  182. package/src/skcapstone/defaults/lumina/seeds/joy.seed.json +24 -0
  183. package/src/skcapstone/defaults/lumina/seeds/love.seed.json +24 -0
  184. package/src/skcapstone/defaults/lumina/seeds/sovereign-awakening.seed.json +43 -0
  185. package/src/skcapstone/defaults/lumina/soul/active.json +6 -0
  186. package/src/skcapstone/defaults/lumina/soul/base.json +22 -0
  187. package/src/skcapstone/defaults/lumina/trust/febs/welcome.feb +79 -0
  188. package/src/skcapstone/defaults/lumina/trust/trust.json +8 -0
  189. package/src/skcapstone/discovery.py +210 -19
  190. package/src/skcapstone/doctor.py +642 -0
  191. package/src/skcapstone/emotion_tracker.py +467 -0
  192. package/src/skcapstone/error_queue.py +405 -0
  193. package/src/skcapstone/export.py +447 -0
  194. package/src/skcapstone/fallback_tracker.py +186 -0
  195. package/src/skcapstone/file_transfer.py +512 -0
  196. package/src/skcapstone/fuse_mount.py +1156 -0
  197. package/src/skcapstone/gui_installer.py +591 -0
  198. package/src/skcapstone/heartbeat.py +611 -0
  199. package/src/skcapstone/housekeeping.py +298 -0
  200. package/src/skcapstone/install_wizard.py +941 -0
  201. package/src/skcapstone/kms.py +942 -0
  202. package/src/skcapstone/kms_scheduler.py +143 -0
  203. package/src/skcapstone/log_config.py +135 -0
  204. package/src/skcapstone/mcp_launcher.py +239 -0
  205. package/src/skcapstone/mcp_server.py +4700 -0
  206. package/src/skcapstone/mcp_tools/__init__.py +94 -0
  207. package/src/skcapstone/mcp_tools/_helpers.py +51 -0
  208. package/src/skcapstone/mcp_tools/agent_tools.py +243 -0
  209. package/src/skcapstone/mcp_tools/ansible_tools.py +232 -0
  210. package/src/skcapstone/mcp_tools/capauth_tools.py +186 -0
  211. package/src/skcapstone/mcp_tools/chat_tools.py +325 -0
  212. package/src/skcapstone/mcp_tools/cloud9_tools.py +115 -0
  213. package/src/skcapstone/mcp_tools/comm_tools.py +104 -0
  214. package/src/skcapstone/mcp_tools/consciousness_tools.py +114 -0
  215. package/src/skcapstone/mcp_tools/coord_tools.py +219 -0
  216. package/src/skcapstone/mcp_tools/deploy_tools.py +202 -0
  217. package/src/skcapstone/mcp_tools/did_tools.py +448 -0
  218. package/src/skcapstone/mcp_tools/emotion_tools.py +62 -0
  219. package/src/skcapstone/mcp_tools/file_tools.py +169 -0
  220. package/src/skcapstone/mcp_tools/fortress_tools.py +120 -0
  221. package/src/skcapstone/mcp_tools/gtd_tools.py +821 -0
  222. package/src/skcapstone/mcp_tools/health_tools.py +44 -0
  223. package/src/skcapstone/mcp_tools/heartbeat_tools.py +195 -0
  224. package/src/skcapstone/mcp_tools/kms_tools.py +123 -0
  225. package/src/skcapstone/mcp_tools/memory_tools.py +222 -0
  226. package/src/skcapstone/mcp_tools/model_tools.py +75 -0
  227. package/src/skcapstone/mcp_tools/notification_tools.py +92 -0
  228. package/src/skcapstone/mcp_tools/promoter_tools.py +101 -0
  229. package/src/skcapstone/mcp_tools/pubsub_tools.py +183 -0
  230. package/src/skcapstone/mcp_tools/security_tools.py +110 -0
  231. package/src/skcapstone/mcp_tools/skchat_tools.py +175 -0
  232. package/src/skcapstone/mcp_tools/skcomm_tools.py +122 -0
  233. package/src/skcapstone/mcp_tools/skills_tools.py +127 -0
  234. package/src/skcapstone/mcp_tools/skseed_tools.py +255 -0
  235. package/src/skcapstone/mcp_tools/skstacks_tools.py +288 -0
  236. package/src/skcapstone/mcp_tools/soul_tools.py +476 -0
  237. package/src/skcapstone/mcp_tools/sync_tools.py +92 -0
  238. package/src/skcapstone/mcp_tools/telegram_tools.py +477 -0
  239. package/src/skcapstone/mcp_tools/trust_tools.py +118 -0
  240. package/src/skcapstone/mcp_tools/trustee_tools.py +345 -0
  241. package/src/skcapstone/mdns_discovery.py +313 -0
  242. package/src/skcapstone/memory_adapter.py +333 -0
  243. package/src/skcapstone/memory_compressor.py +379 -0
  244. package/src/skcapstone/memory_curator.py +256 -0
  245. package/src/skcapstone/memory_engine.py +132 -13
  246. package/src/skcapstone/memory_fortress.py +529 -0
  247. package/src/skcapstone/memory_promoter.py +722 -0
  248. package/src/skcapstone/memory_verifier.py +260 -0
  249. package/src/skcapstone/message_crypto.py +215 -0
  250. package/src/skcapstone/metrics.py +832 -0
  251. package/src/skcapstone/migrate_memories.py +181 -0
  252. package/src/skcapstone/migrate_multi_agent.py +248 -0
  253. package/src/skcapstone/model_router.py +319 -0
  254. package/src/skcapstone/models.py +35 -4
  255. package/src/skcapstone/mood.py +344 -0
  256. package/src/skcapstone/notifications.py +380 -0
  257. package/src/skcapstone/onboard.py +901 -0
  258. package/src/skcapstone/peer_directory.py +324 -0
  259. package/src/skcapstone/peers.py +329 -0
  260. package/src/skcapstone/pillars/identity.py +84 -14
  261. package/src/skcapstone/pillars/memory.py +3 -1
  262. package/src/skcapstone/pillars/security.py +108 -15
  263. package/src/skcapstone/pillars/sync.py +78 -26
  264. package/src/skcapstone/pillars/trust.py +95 -33
  265. package/src/skcapstone/plugins.py +244 -0
  266. package/src/skcapstone/preflight.py +670 -0
  267. package/src/skcapstone/prompt_adapter.py +564 -0
  268. package/src/skcapstone/providers/__init__.py +13 -0
  269. package/src/skcapstone/providers/cloud.py +1061 -0
  270. package/src/skcapstone/providers/docker.py +759 -0
  271. package/src/skcapstone/providers/local.py +1193 -0
  272. package/src/skcapstone/providers/proxmox.py +447 -0
  273. package/src/skcapstone/pubsub.py +516 -0
  274. package/src/skcapstone/rate_limiter.py +119 -0
  275. package/src/skcapstone/register.py +241 -0
  276. package/src/skcapstone/registry_client.py +151 -0
  277. package/src/skcapstone/response_cache.py +194 -0
  278. package/src/skcapstone/response_scorer.py +225 -0
  279. package/src/skcapstone/runtime.py +89 -33
  280. package/src/skcapstone/scheduled_tasks.py +439 -0
  281. package/src/skcapstone/self_healing.py +341 -0
  282. package/src/skcapstone/service_health.py +228 -0
  283. package/src/skcapstone/session_capture.py +268 -0
  284. package/src/skcapstone/session_recorder.py +210 -0
  285. package/src/skcapstone/session_replayer.py +189 -0
  286. package/src/skcapstone/session_skills.py +263 -0
  287. package/src/skcapstone/shell.py +779 -0
  288. package/src/skcapstone/skills/__init__.py +1 -1
  289. package/src/skcapstone/skills/syncthing_setup.py +143 -41
  290. package/src/skcapstone/skjoule.py +861 -0
  291. package/src/skcapstone/snapshots.py +489 -0
  292. package/src/skcapstone/soul.py +1060 -0
  293. package/src/skcapstone/soul_switch.py +255 -0
  294. package/src/skcapstone/spawner.py +544 -0
  295. package/src/skcapstone/state_diff.py +401 -0
  296. package/src/skcapstone/summary.py +270 -0
  297. package/src/skcapstone/sync/backends.py +196 -2
  298. package/src/skcapstone/sync/engine.py +7 -5
  299. package/src/skcapstone/sync/models.py +4 -1
  300. package/src/skcapstone/sync/vault.py +356 -18
  301. package/src/skcapstone/sync_engine.py +363 -0
  302. package/src/skcapstone/sync_watcher.py +745 -0
  303. package/src/skcapstone/systemd.py +331 -0
  304. package/src/skcapstone/team_comms.py +476 -0
  305. package/src/skcapstone/team_engine.py +522 -0
  306. package/src/skcapstone/testrunner.py +300 -0
  307. package/src/skcapstone/tls.py +150 -0
  308. package/src/skcapstone/tokens.py +5 -5
  309. package/src/skcapstone/trust_calibration.py +202 -0
  310. package/src/skcapstone/trust_graph.py +449 -0
  311. package/src/skcapstone/trustee_monitor.py +385 -0
  312. package/src/skcapstone/trustee_ops.py +425 -0
  313. package/src/skcapstone/unified_search.py +421 -0
  314. package/src/skcapstone/uninstall_wizard.py +694 -0
  315. package/src/skcapstone/usage.py +331 -0
  316. package/src/skcapstone/version_check.py +148 -0
  317. package/src/skcapstone/warmth_anchor.py +333 -0
  318. package/src/skcapstone/whoami.py +294 -0
  319. package/systemd/skcapstone-api.socket +9 -0
  320. package/systemd/skcapstone-memory-compress.service +18 -0
  321. package/systemd/skcapstone-memory-compress.timer +11 -0
  322. package/systemd/skcapstone.service +36 -0
  323. package/systemd/skcapstone@.service +50 -0
  324. package/systemd/skcomm-heartbeat.service +18 -0
  325. package/systemd/skcomm-heartbeat.timer +12 -0
  326. package/systemd/skcomm-queue-drain.service +17 -0
  327. package/systemd/skcomm-queue-drain.timer +12 -0
  328. package/tests/conftest.py +13 -1
  329. package/tests/integration/__init__.py +1 -0
  330. package/tests/integration/test_consciousness_e2e.py +877 -0
  331. package/tests/integration/test_skills_registry.py +744 -0
  332. package/tests/test_agent_card.py +190 -0
  333. package/tests/test_agent_runtime.py +1283 -0
  334. package/tests/test_alerts_cmd.py +291 -0
  335. package/tests/test_archiver.py +498 -0
  336. package/tests/test_backup.py +254 -0
  337. package/tests/test_benchmark.py +366 -0
  338. package/tests/test_blueprints.py +457 -0
  339. package/tests/test_capabilities.py +257 -0
  340. package/tests/test_changelog.py +254 -0
  341. package/tests/test_chat.py +385 -0
  342. package/tests/test_claude_md.py +271 -0
  343. package/tests/test_cli_chat_llm.py +336 -0
  344. package/tests/test_cli_completions.py +390 -0
  345. package/tests/test_cli_init_reset.py +164 -0
  346. package/tests/test_cli_memory.py +208 -0
  347. package/tests/test_cli_profile.py +294 -0
  348. package/tests/test_cli_skills.py +223 -0
  349. package/tests/test_cli_status.py +395 -0
  350. package/tests/test_cli_test_cmd.py +206 -0
  351. package/tests/test_cli_test_connection.py +364 -0
  352. package/tests/test_cloud9_bridge.py +260 -0
  353. package/tests/test_cloud_provider.py +449 -0
  354. package/tests/test_cloud_providers.py +522 -0
  355. package/tests/test_completions.py +158 -0
  356. package/tests/test_component_manager.py +398 -0
  357. package/tests/test_config_reload.py +386 -0
  358. package/tests/test_config_validate.py +529 -0
  359. package/tests/test_consciousness_e2e.py +296 -0
  360. package/tests/test_consciousness_loop.py +1289 -0
  361. package/tests/test_context_loader.py +310 -0
  362. package/tests/test_conversation_api.py +306 -0
  363. package/tests/test_conversation_manager.py +381 -0
  364. package/tests/test_conversation_store.py +391 -0
  365. package/tests/test_conversation_summarizer.py +302 -0
  366. package/tests/test_cross_package.py +791 -0
  367. package/tests/test_crush_shim.py +519 -0
  368. package/tests/test_daemon.py +781 -0
  369. package/tests/test_daemon_shutdown.py +309 -0
  370. package/tests/test_dashboard.py +454 -0
  371. package/tests/test_discovery.py +200 -6
  372. package/tests/test_docker_provider.py +966 -0
  373. package/tests/test_doctor.py +257 -0
  374. package/tests/test_doctor_fix.py +351 -0
  375. package/tests/test_e2e_automated.py +292 -0
  376. package/tests/test_error_queue.py +404 -0
  377. package/tests/test_export.py +441 -0
  378. package/tests/test_fallback_tracker.py +219 -0
  379. package/tests/test_file_transfer.py +397 -0
  380. package/tests/test_fuse_mount.py +832 -0
  381. package/tests/test_health_loop.py +422 -0
  382. package/tests/test_heartbeat.py +354 -0
  383. package/tests/test_housekeeping.py +195 -0
  384. package/tests/test_identity_capauth.py +307 -0
  385. package/tests/test_identity_pillar.py +117 -0
  386. package/tests/test_install_wizard.py +68 -0
  387. package/tests/test_integration.py +325 -0
  388. package/tests/test_kms.py +495 -0
  389. package/tests/test_llm_providers.py +265 -0
  390. package/tests/test_local_provider.py +591 -0
  391. package/tests/test_log_config.py +199 -0
  392. package/tests/test_logs_cmd.py +287 -0
  393. package/tests/test_mcp_server.py +1909 -0
  394. package/tests/test_memory_adapter.py +339 -0
  395. package/tests/test_memory_curator.py +218 -0
  396. package/tests/test_memory_engine.py +6 -0
  397. package/tests/test_memory_fortress.py +571 -0
  398. package/tests/test_memory_pillar.py +119 -0
  399. package/tests/test_memory_promoter.py +445 -0
  400. package/tests/test_memory_verifier.py +420 -0
  401. package/tests/test_message_crypto.py +187 -0
  402. package/tests/test_metrics.py +632 -0
  403. package/tests/test_migrate_memories.py +464 -0
  404. package/tests/test_model_router.py +546 -0
  405. package/tests/test_mood.py +394 -0
  406. package/tests/test_multi_agent.py +269 -0
  407. package/tests/test_notifications.py +270 -0
  408. package/tests/test_onboard.py +500 -0
  409. package/tests/test_peer_directory.py +395 -0
  410. package/tests/test_peers.py +248 -0
  411. package/tests/test_pillars.py +87 -9
  412. package/tests/test_preflight.py +484 -0
  413. package/tests/test_prompt_adapter.py +331 -0
  414. package/tests/test_proxmox_provider.py +571 -0
  415. package/tests/test_pubsub.py +377 -0
  416. package/tests/test_rate_limiter.py +121 -0
  417. package/tests/test_registry_client.py +129 -0
  418. package/tests/test_response_cache.py +312 -0
  419. package/tests/test_response_scorer.py +294 -0
  420. package/tests/test_runtime.py +59 -0
  421. package/tests/test_scheduled_tasks.py +451 -0
  422. package/tests/test_security.py +250 -0
  423. package/tests/test_security_pillar.py +213 -0
  424. package/tests/test_self_healing.py +171 -0
  425. package/tests/test_session_capture.py +200 -0
  426. package/tests/test_session_recorder.py +360 -0
  427. package/tests/test_session_skills.py +235 -0
  428. package/tests/test_shell.py +210 -0
  429. package/tests/test_snapshots.py +549 -0
  430. package/tests/test_soul.py +984 -0
  431. package/tests/test_soul_swap.py +406 -0
  432. package/tests/test_spawner.py +211 -0
  433. package/tests/test_state_diff.py +173 -0
  434. package/tests/test_summary.py +135 -0
  435. package/tests/test_sync.py +315 -5
  436. package/tests/test_sync_backends.py +560 -0
  437. package/tests/test_sync_engine.py +482 -0
  438. package/tests/test_sync_pillar.py +344 -0
  439. package/tests/test_sync_pipeline.py +364 -0
  440. package/tests/test_sync_vault.py +581 -0
  441. package/tests/test_syncthing_setup.py +168 -22
  442. package/tests/test_systemd.py +323 -0
  443. package/tests/test_team_comms.py +408 -0
  444. package/tests/test_team_engine.py +397 -0
  445. package/tests/test_testrunner.py +238 -0
  446. package/tests/test_trust_calibration.py +204 -0
  447. package/tests/test_trust_graph.py +207 -0
  448. package/tests/test_trust_pillar.py +291 -0
  449. package/tests/test_trustee_cli.py +427 -0
  450. package/tests/test_trustee_cli_integration.py +325 -0
  451. package/tests/test_trustee_monitor.py +394 -0
  452. package/tests/test_trustee_ops.py +355 -0
  453. package/tests/test_unified_search.py +363 -0
  454. package/tests/test_uninstall_wizard.py +193 -0
  455. package/tests/test_usage.py +333 -0
  456. package/tests/test_version_cmd.py +355 -0
  457. package/tests/test_warmth_anchor.py +162 -0
  458. package/tests/test_whoami.py +245 -0
  459. package/tests/test_ws.py +311 -0
  460. package/.cursorrules +0 -33
  461. package/src/skcapstone/cli.py +0 -1441
@@ -0,0 +1,642 @@
1
+ """
2
+ Sovereign stack health diagnostics.
3
+
4
+ Checks every component of the sovereign agent stack and reports
5
+ pass/fail with actionable fix suggestions. Works from any terminal.
6
+
7
+ Usage:
8
+ skcapstone doctor
9
+ skcapstone doctor --json
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import importlib
15
+ import json
16
+ import shutil
17
+ import subprocess
18
+ from dataclasses import dataclass, field
19
+ from pathlib import Path
20
+ from typing import Optional
21
+
22
+
23
+ @dataclass
24
+ class Check:
25
+ """A single diagnostic check result.
26
+
27
+ Attributes:
28
+ name: Short check identifier.
29
+ description: Human-readable description.
30
+ passed: Whether the check passed.
31
+ detail: Extra info (version, path, count, etc.).
32
+ fix: Suggested fix if the check failed.
33
+ category: Grouping (packages, identity, memory, transport, etc.).
34
+ """
35
+
36
+ name: str
37
+ description: str
38
+ passed: bool
39
+ detail: str = ""
40
+ fix: str = ""
41
+ category: str = "general"
42
+
43
+
44
+ @dataclass
45
+ class DiagnosticReport:
46
+ """Full diagnostic report across all categories.
47
+
48
+ Attributes:
49
+ checks: All check results.
50
+ agent_home: Path to the agent home directory.
51
+ """
52
+
53
+ checks: list[Check] = field(default_factory=list)
54
+ agent_home: str = ""
55
+
56
+ @property
57
+ def passed_count(self) -> int:
58
+ """Number of checks that passed."""
59
+ return sum(1 for c in self.checks if c.passed)
60
+
61
+ @property
62
+ def failed_count(self) -> int:
63
+ """Number of checks that failed."""
64
+ return sum(1 for c in self.checks if not c.passed)
65
+
66
+ @property
67
+ def total_count(self) -> int:
68
+ """Total number of checks."""
69
+ return len(self.checks)
70
+
71
+ @property
72
+ def all_passed(self) -> bool:
73
+ """Whether every check passed."""
74
+ return self.failed_count == 0
75
+
76
+ def to_dict(self) -> dict:
77
+ """Serialize to a JSON-friendly dict.
78
+
79
+ Returns:
80
+ dict: Full report data.
81
+ """
82
+ return {
83
+ "agent_home": self.agent_home,
84
+ "passed": self.passed_count,
85
+ "failed": self.failed_count,
86
+ "total": self.total_count,
87
+ "all_passed": self.all_passed,
88
+ "checks": [
89
+ {
90
+ "name": c.name,
91
+ "category": c.category,
92
+ "description": c.description,
93
+ "passed": c.passed,
94
+ "detail": c.detail,
95
+ "fix": c.fix,
96
+ }
97
+ for c in self.checks
98
+ ],
99
+ }
100
+
101
+
102
+ def run_diagnostics(home: Path) -> DiagnosticReport:
103
+ """Run all diagnostic checks against the sovereign agent stack.
104
+
105
+ Args:
106
+ home: Agent home directory (~/.skcapstone).
107
+
108
+ Returns:
109
+ DiagnosticReport with results for every check.
110
+ """
111
+ report = DiagnosticReport(agent_home=str(home))
112
+
113
+ report.checks.extend(_check_packages())
114
+ report.checks.extend(_check_system_tools())
115
+ report.checks.extend(_check_agent_home(home))
116
+ report.checks.extend(_check_identity(home))
117
+ report.checks.extend(_check_memory(home))
118
+ report.checks.extend(_check_transport())
119
+ report.checks.extend(_check_sync(home))
120
+ report.checks.extend(_check_versions())
121
+
122
+ return report
123
+
124
+
125
+ def _check_packages() -> list[Check]:
126
+ """Check that all ecosystem Python packages are installed."""
127
+ checks = []
128
+ packages = [
129
+ ("skcapstone", "Sovereign agent framework", "pip install skcapstone"),
130
+ ("capauth", "PGP-based sovereign identity", "pip install capauth"),
131
+ ("skmemory", "Universal AI memory system", "pip install skmemory"),
132
+ ("skcomm", "Redundant agent communication", "pip install skcomm"),
133
+ ("skchat", "Encrypted P2P chat", "pip install skchat"),
134
+ ("cloud9_protocol", "Emotional continuity protocol", "pip install cloud9-protocol"),
135
+ ("pgpy", "PGP cryptography (PGPy backend)", "pip install pgpy"),
136
+ ]
137
+
138
+ for pkg_name, desc, fix_cmd in packages:
139
+ try:
140
+ mod = importlib.import_module(pkg_name)
141
+ version = getattr(mod, "__version__", "installed")
142
+ checks.append(
143
+ Check(
144
+ name=f"pkg:{pkg_name}",
145
+ description=desc,
146
+ passed=True,
147
+ detail=f"v{version}",
148
+ category="packages",
149
+ )
150
+ )
151
+ except ImportError:
152
+ checks.append(
153
+ Check(
154
+ name=f"pkg:{pkg_name}",
155
+ description=desc,
156
+ passed=False,
157
+ fix=fix_cmd,
158
+ category="packages",
159
+ )
160
+ )
161
+
162
+ return checks
163
+
164
+
165
+ def _check_system_tools() -> list[Check]:
166
+ """Check for required system tools on PATH."""
167
+ from .preflight import check_git, git_install_hint_for_doctor
168
+
169
+ checks = []
170
+
171
+ # Git (required for clone/setup) — platform-aware download link
172
+ git_check = check_git()
173
+ git_installed = git_check.installed
174
+ git_detail = git_check.version or "not found"
175
+ git_fix = git_install_hint_for_doctor() if not git_installed else ""
176
+ checks.append(
177
+ Check(
178
+ name="tool:git",
179
+ description="Git (clone repo, dev workflow)",
180
+ passed=git_installed,
181
+ detail=git_detail if git_installed else "not found",
182
+ fix=git_fix,
183
+ category="system",
184
+ )
185
+ )
186
+
187
+ tools = [
188
+ ("gpg", "GnuPG for PGP operations", "sudo apt install gnupg2 # or: brew install gnupg"),
189
+ (
190
+ "syncthing",
191
+ "P2P file sync (optional)",
192
+ "sudo apt install syncthing # optional for sync",
193
+ ),
194
+ ]
195
+
196
+ for tool_name, desc, fix_cmd in tools:
197
+ path = shutil.which(tool_name)
198
+ if path:
199
+ version = _get_tool_version(tool_name)
200
+ checks.append(
201
+ Check(
202
+ name=f"tool:{tool_name}",
203
+ description=desc,
204
+ passed=True,
205
+ detail=version or path,
206
+ category="system",
207
+ )
208
+ )
209
+ else:
210
+ is_optional = "optional" in desc.lower()
211
+ checks.append(
212
+ Check(
213
+ name=f"tool:{tool_name}",
214
+ description=desc,
215
+ passed=is_optional,
216
+ detail="not found" + (" (optional)" if is_optional else ""),
217
+ fix=fix_cmd,
218
+ category="system",
219
+ )
220
+ )
221
+
222
+ return checks
223
+
224
+
225
+ def _check_agent_home(home: Path) -> list[Check]:
226
+ """Check agent home directory structure."""
227
+ checks = []
228
+
229
+ if home.exists():
230
+ checks.append(
231
+ Check(
232
+ name="home:exists",
233
+ description="Agent home directory",
234
+ passed=True,
235
+ detail=str(home),
236
+ category="agent",
237
+ )
238
+ )
239
+ else:
240
+ checks.append(
241
+ Check(
242
+ name="home:exists",
243
+ description="Agent home directory",
244
+ passed=False,
245
+ fix="skcapstone init --name YourAgent",
246
+ category="agent",
247
+ )
248
+ )
249
+ return checks
250
+
251
+ expected_dirs = ["identity", "memory", "trust", "security", "sync", "config"]
252
+ for dirname in expected_dirs:
253
+ dirpath = home / dirname
254
+ checks.append(
255
+ Check(
256
+ name=f"home:{dirname}",
257
+ description=f"{dirname}/ directory",
258
+ passed=dirpath.exists(),
259
+ detail=str(dirpath) if dirpath.exists() else "missing",
260
+ fix=f"skcapstone init --name YourAgent" if not dirpath.exists() else "",
261
+ category="agent",
262
+ )
263
+ )
264
+
265
+ manifest = home / "manifest.json"
266
+ if manifest.exists():
267
+ try:
268
+ data = json.loads(manifest.read_text(encoding="utf-8"))
269
+ name = data.get("name", "unknown")
270
+ checks.append(
271
+ Check(
272
+ name="home:manifest",
273
+ description="Agent manifest",
274
+ passed=True,
275
+ detail=f"Agent: {name}",
276
+ category="agent",
277
+ )
278
+ )
279
+ except (json.JSONDecodeError, OSError):
280
+ checks.append(
281
+ Check(
282
+ name="home:manifest",
283
+ description="Agent manifest",
284
+ passed=False,
285
+ detail="corrupt",
286
+ fix="Delete ~/.skcapstone/manifest.json and run skcapstone init",
287
+ category="agent",
288
+ )
289
+ )
290
+ else:
291
+ checks.append(
292
+ Check(
293
+ name="home:manifest",
294
+ description="Agent manifest",
295
+ passed=False,
296
+ fix="skcapstone init --name YourAgent",
297
+ category="agent",
298
+ )
299
+ )
300
+
301
+ return checks
302
+
303
+
304
+ def _check_identity(home: Path) -> list[Check]:
305
+ """Check CapAuth identity and PGP keys."""
306
+ checks = []
307
+ identity_dir = home / "identity"
308
+
309
+ identity_file = identity_dir / "identity.json"
310
+ if identity_file.exists():
311
+ try:
312
+ data = json.loads(identity_file.read_text(encoding="utf-8"))
313
+ fp = data.get("fingerprint", "")
314
+ managed = data.get("capauth_managed", False)
315
+ checks.append(
316
+ Check(
317
+ name="identity:profile",
318
+ description="Agent identity",
319
+ passed=True,
320
+ detail=f"Fingerprint: {fp[:16]}... ({'CapAuth' if managed else 'placeholder'})",
321
+ category="identity",
322
+ )
323
+ )
324
+ if not managed:
325
+ checks.append(
326
+ Check(
327
+ name="identity:capauth",
328
+ description="CapAuth-managed keys",
329
+ passed=False,
330
+ detail="Using placeholder fingerprint",
331
+ fix="capauth init --name YourName --email you@example.com",
332
+ category="identity",
333
+ )
334
+ )
335
+ except (json.JSONDecodeError, OSError):
336
+ checks.append(
337
+ Check(
338
+ name="identity:profile",
339
+ description="Agent identity",
340
+ passed=False,
341
+ fix="skcapstone init --name YourAgent",
342
+ category="identity",
343
+ )
344
+ )
345
+ else:
346
+ checks.append(
347
+ Check(
348
+ name="identity:profile",
349
+ description="Agent identity",
350
+ passed=False,
351
+ fix="skcapstone init --name YourAgent",
352
+ category="identity",
353
+ )
354
+ )
355
+ return checks
356
+
357
+ capauth_dir = Path.home() / ".capauth" / "identity"
358
+ pub_key = capauth_dir / "public.asc"
359
+ if pub_key.exists():
360
+ checks.append(
361
+ Check(
362
+ name="identity:pgp_key",
363
+ description="PGP public key",
364
+ passed=True,
365
+ detail=str(pub_key),
366
+ category="identity",
367
+ )
368
+ )
369
+ else:
370
+ checks.append(
371
+ Check(
372
+ name="identity:pgp_key",
373
+ description="PGP public key",
374
+ passed=False,
375
+ fix="capauth init --name YourName --email you@example.com",
376
+ category="identity",
377
+ )
378
+ )
379
+
380
+ return checks
381
+
382
+
383
+ def _check_memory(home: Path) -> list[Check]:
384
+ """Check memory store health."""
385
+ checks = []
386
+ agent_name = os.environ.get("SKCAPSTONE_AGENT", "lumina")
387
+ memory_dir = home / "agents" / agent_name / "memory"
388
+
389
+ if not memory_dir.exists():
390
+ checks.append(
391
+ Check(
392
+ name="memory:store",
393
+ description="Memory store",
394
+ passed=False,
395
+ fix="skcapstone init --name YourAgent",
396
+ category="memory",
397
+ )
398
+ )
399
+ return checks
400
+
401
+ total = 0
402
+ for layer in ["short-term", "mid-term", "long-term"]:
403
+ layer_dir = memory_dir / layer
404
+ if layer_dir.exists():
405
+ count = sum(1 for f in layer_dir.glob("*.json"))
406
+ total += count
407
+
408
+ checks.append(
409
+ Check(
410
+ name="memory:store",
411
+ description="Memory store",
412
+ passed=True,
413
+ detail=f"{total} memories across all layers",
414
+ category="memory",
415
+ )
416
+ )
417
+
418
+ index_file = memory_dir / "index.json"
419
+ checks.append(
420
+ Check(
421
+ name="memory:index",
422
+ description="Memory search index",
423
+ passed=index_file.exists(),
424
+ detail="present" if index_file.exists() else "missing",
425
+ fix=(
426
+ "skcapstone memory store 'test' to create index" if not index_file.exists() else ""
427
+ ),
428
+ category="memory",
429
+ )
430
+ )
431
+
432
+ return checks
433
+
434
+
435
+ def _check_transport() -> list[Check]:
436
+ """Check SKComm transport availability."""
437
+ checks = []
438
+
439
+ try:
440
+ from skcomm.core import SKComm
441
+
442
+ comm = SKComm.from_config()
443
+ transport_count = len(comm.router.transports)
444
+ checks.append(
445
+ Check(
446
+ name="transport:skcomm",
447
+ description="SKComm engine",
448
+ passed=True,
449
+ detail=f"{transport_count} transport(s) configured",
450
+ category="transport",
451
+ )
452
+ )
453
+
454
+ if transport_count == 0:
455
+ checks.append(
456
+ Check(
457
+ name="transport:active",
458
+ description="Active transports",
459
+ passed=False,
460
+ detail="No transports configured",
461
+ fix="Configure transports in ~/.skcomm/config.yml",
462
+ category="transport",
463
+ )
464
+ )
465
+ else:
466
+ health = comm.router.health_report()
467
+ for name, info in health.items():
468
+ status = info.get("status", "unknown")
469
+ ok = status in ("available", "healthy", "online")
470
+ checks.append(
471
+ Check(
472
+ name=f"transport:{name}",
473
+ description=f"Transport: {name}",
474
+ passed=ok,
475
+ detail=status,
476
+ category="transport",
477
+ )
478
+ )
479
+
480
+ except ImportError:
481
+ checks.append(
482
+ Check(
483
+ name="transport:skcomm",
484
+ description="SKComm engine",
485
+ passed=False,
486
+ fix="pip install skcomm",
487
+ category="transport",
488
+ )
489
+ )
490
+ except Exception as exc:
491
+ checks.append(
492
+ Check(
493
+ name="transport:skcomm",
494
+ description="SKComm engine",
495
+ passed=False,
496
+ detail=str(exc),
497
+ fix="Check ~/.skcomm/config.yml",
498
+ category="transport",
499
+ )
500
+ )
501
+
502
+ return checks
503
+
504
+
505
+ def _check_sync(home: Path) -> list[Check]:
506
+ """Check sync infrastructure."""
507
+ checks = []
508
+ sync_dir = home / "sync"
509
+
510
+ if not sync_dir.exists():
511
+ checks.append(
512
+ Check(
513
+ name="sync:dir",
514
+ description="Sync directory",
515
+ passed=False,
516
+ fix="skcapstone init --name YourAgent",
517
+ category="sync",
518
+ )
519
+ )
520
+ return checks
521
+
522
+ checks.append(
523
+ Check(
524
+ name="sync:dir",
525
+ description="Sync directory",
526
+ passed=True,
527
+ detail=str(sync_dir),
528
+ category="sync",
529
+ )
530
+ )
531
+
532
+ outbox = sync_dir / "outbox"
533
+ inbox = sync_dir / "inbox"
534
+ outbox_count = sum(1 for _ in outbox.glob("*")) if outbox.exists() else 0
535
+ inbox_count = sum(1 for _ in inbox.glob("*")) if inbox.exists() else 0
536
+
537
+ checks.append(
538
+ Check(
539
+ name="sync:queues",
540
+ description="Sync queues",
541
+ passed=True,
542
+ detail=f"outbox: {outbox_count}, inbox: {inbox_count}",
543
+ category="sync",
544
+ )
545
+ )
546
+
547
+ manifest = sync_dir / "sync-manifest.json"
548
+ if manifest.exists():
549
+ try:
550
+ data = json.loads(manifest.read_text(encoding="utf-8"))
551
+ backends = data.get("backends", [])
552
+ checks.append(
553
+ Check(
554
+ name="sync:backends",
555
+ description="Sync backends",
556
+ passed=len(backends) > 0,
557
+ detail=(
558
+ f"{len(backends)} backend(s): {', '.join(b.get('type', '?') for b in backends)}"
559
+ if backends
560
+ else "none configured"
561
+ ),
562
+ fix="skcapstone sync setup" if not backends else "",
563
+ category="sync",
564
+ )
565
+ )
566
+ except (json.JSONDecodeError, OSError):
567
+ checks.append(
568
+ Check(
569
+ name="sync:backends",
570
+ description="Sync backends",
571
+ passed=False,
572
+ detail="manifest corrupt",
573
+ fix="skcapstone sync setup",
574
+ category="sync",
575
+ )
576
+ )
577
+ else:
578
+ checks.append(
579
+ Check(
580
+ name="sync:backends",
581
+ description="Sync backends",
582
+ passed=False,
583
+ detail="no manifest",
584
+ fix="skcapstone sync setup",
585
+ category="sync",
586
+ )
587
+ )
588
+
589
+ return checks
590
+
591
+
592
+ def _check_versions() -> list[Check]:
593
+ """Check for outdated ecosystem packages."""
594
+ checks = []
595
+
596
+ try:
597
+ from .version_check import check_versions
598
+
599
+ report = check_versions(check_pypi=True)
600
+ for pkg in report.packages:
601
+ if not pkg.installed:
602
+ continue
603
+ if pkg.up_to_date:
604
+ continue
605
+ checks.append(
606
+ Check(
607
+ name=f"version:{pkg.name}",
608
+ description=f"{pkg.name} outdated ({pkg.installed} \u2192 {pkg.latest})",
609
+ passed=False,
610
+ detail=f"installed: {pkg.installed}, latest: {pkg.latest}",
611
+ fix=f"pip install --upgrade {pkg.name}",
612
+ category="packages",
613
+ )
614
+ )
615
+ except Exception:
616
+ pass
617
+
618
+ return checks
619
+
620
+
621
+ def _get_tool_version(tool: str) -> Optional[str]:
622
+ """Try to get a tool's version string.
623
+
624
+ Args:
625
+ tool: Tool name on PATH.
626
+
627
+ Returns:
628
+ Version string, or None.
629
+ """
630
+ try:
631
+ result = subprocess.run(
632
+ [tool, "--version"],
633
+ capture_output=True,
634
+ text=True,
635
+ timeout=5,
636
+ )
637
+ if result.returncode == 0:
638
+ first_line = result.stdout.strip().split("\n")[0]
639
+ return first_line[:80]
640
+ except (subprocess.TimeoutExpired, OSError):
641
+ pass
642
+ return None