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