@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,457 @@
1
+ """Tests for agent team blueprints — schema, registry, and engine."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import shutil
7
+ from pathlib import Path
8
+ from unittest.mock import patch
9
+
10
+ import pytest
11
+ import yaml
12
+
13
+ from skcapstone.blueprints.schema import (
14
+ AgentRole,
15
+ AgentSpec,
16
+ BlueprintManifest,
17
+ CoordinationConfig,
18
+ ModelTier,
19
+ NetworkConfig,
20
+ ProviderType,
21
+ ResourceSpec,
22
+ StorageConfig,
23
+ VMType,
24
+ )
25
+ from skcapstone.blueprints.registry import BlueprintRegistry
26
+ from skcapstone.team_engine import (
27
+ AgentStatus,
28
+ DeployedAgent,
29
+ TeamDeployment,
30
+ TeamEngine,
31
+ )
32
+ from skcapstone.providers.local import LocalProvider
33
+
34
+
35
+ # ---------------------------------------------------------------------------
36
+ # Fixtures
37
+ # ---------------------------------------------------------------------------
38
+
39
+
40
+ def _minimal_blueprint(**overrides) -> dict:
41
+ """Build a minimal valid blueprint dict."""
42
+ base = {
43
+ "name": "Test Team",
44
+ "slug": "test-team",
45
+ "description": "A test blueprint.",
46
+ "agents": {
47
+ "alpha": {
48
+ "role": "worker",
49
+ "model": "fast",
50
+ "skills": ["python"],
51
+ },
52
+ },
53
+ }
54
+ base.update(overrides)
55
+ return base
56
+
57
+
58
+ @pytest.fixture
59
+ def tmp_home(tmp_path):
60
+ """Create a temporary agent home directory."""
61
+ home = tmp_path / ".skcapstone"
62
+ home.mkdir()
63
+ return home
64
+
65
+
66
+ # ---------------------------------------------------------------------------
67
+ # Schema tests
68
+ # ---------------------------------------------------------------------------
69
+
70
+
71
+ class TestBlueprintSchema:
72
+ """Validate the BlueprintManifest pydantic model."""
73
+
74
+ def test_minimal_blueprint_parses(self):
75
+ """Minimal blueprint with one agent should parse."""
76
+ bp = BlueprintManifest(**_minimal_blueprint())
77
+ assert bp.name == "Test Team"
78
+ assert bp.slug == "test-team"
79
+ assert bp.agent_count == 1
80
+ assert "alpha" in bp.agents
81
+
82
+ def test_agent_count_with_multiple_instances(self):
83
+ """Agent count should sum up instance counts."""
84
+ data = _minimal_blueprint()
85
+ data["agents"]["alpha"]["count"] = 3
86
+ data["agents"]["beta"] = {"role": "coder", "model": "code", "count": 2}
87
+ bp = BlueprintManifest(**data)
88
+ assert bp.agent_count == 5
89
+
90
+ def test_model_summary(self):
91
+ """Model summary should list unique model tiers."""
92
+ data = _minimal_blueprint()
93
+ data["agents"]["beta"] = {"role": "coder", "model": "code", "model_name": "minimax-m2.1"}
94
+ bp = BlueprintManifest(**data)
95
+ assert "fast" in bp.model_summary
96
+ assert "minimax-m2.1" in bp.model_summary
97
+
98
+ def test_slug_validation_rejects_uppercase(self):
99
+ """Slug must be lowercase with hyphens only."""
100
+ with pytest.raises(ValueError, match="slug must be lowercase"):
101
+ BlueprintManifest(**_minimal_blueprint(slug="Bad_Slug"))
102
+
103
+ def test_slug_validation_rejects_special_chars(self):
104
+ """Slug rejects special characters."""
105
+ with pytest.raises(ValueError):
106
+ BlueprintManifest(**_minimal_blueprint(slug="bad slug!"))
107
+
108
+ def test_defaults_are_sensible(self):
109
+ """Verify default values for optional fields."""
110
+ bp = BlueprintManifest(**_minimal_blueprint())
111
+ assert bp.default_provider == ProviderType.LOCAL
112
+ assert bp.network.mesh_vpn == "tailscale"
113
+ assert bp.storage.memory_backend == "filesystem"
114
+ assert bp.coordination.pattern == "supervisor"
115
+ assert bp.version == "1.0.0"
116
+
117
+ def test_agent_spec_defaults(self):
118
+ """AgentSpec should have sensible defaults."""
119
+ spec = AgentSpec()
120
+ assert spec.role == AgentRole.WORKER
121
+ assert spec.model == ModelTier.FAST
122
+ assert spec.vm_type == VMType.PROCESS
123
+ assert spec.count == 1
124
+ assert spec.resources.memory == "2g"
125
+ assert spec.resources.cores == 1
126
+
127
+ def test_resource_spec_constraints(self):
128
+ """Cores must be >= 1 and <= 128."""
129
+ with pytest.raises(ValueError):
130
+ ResourceSpec(cores=0)
131
+ with pytest.raises(ValueError):
132
+ ResourceSpec(cores=200)
133
+
134
+ def test_full_blueprint_with_all_fields(self):
135
+ """A fully-specified blueprint should parse."""
136
+ data = _minimal_blueprint(
137
+ version="2.0.0",
138
+ icon="🛡️",
139
+ author="chef",
140
+ default_provider="proxmox",
141
+ estimated_cost="$15/mo",
142
+ tags=["security", "ops"],
143
+ network={"mesh_vpn": "tailscale", "discovery": "skref_registry"},
144
+ storage={"skref_vault": "my-vault", "memory_backend": "skvector"},
145
+ coordination={
146
+ "queen": "lumina",
147
+ "pattern": "hierarchical",
148
+ "heartbeat": "5m",
149
+ "escalation": "chef",
150
+ },
151
+ )
152
+ bp = BlueprintManifest(**data)
153
+ assert bp.default_provider == ProviderType.PROXMOX
154
+ assert bp.coordination.queen == "lumina"
155
+ assert bp.storage.memory_backend == "skvector"
156
+
157
+
158
+ # ---------------------------------------------------------------------------
159
+ # Registry tests
160
+ # ---------------------------------------------------------------------------
161
+
162
+
163
+ class TestBlueprintRegistry:
164
+ """Test blueprint discovery and loading."""
165
+
166
+ def test_scan_finds_builtins(self):
167
+ """Registry should find built-in blueprints."""
168
+ registry = BlueprintRegistry()
169
+ blueprints = registry.list_blueprints()
170
+ slugs = [bp.slug for bp in blueprints]
171
+ assert "infrastructure-guardian" in slugs
172
+ assert "dev-squadron" in slugs
173
+ assert "research-pod" in slugs
174
+ assert len(blueprints) >= 6
175
+
176
+ def test_get_by_slug(self):
177
+ """Get a specific blueprint by slug."""
178
+ registry = BlueprintRegistry()
179
+ bp = registry.get("infrastructure-guardian")
180
+ assert bp is not None
181
+ assert bp.name == "Infrastructure Guardian"
182
+ assert bp.agent_count >= 6
183
+
184
+ def test_get_missing_returns_none(self):
185
+ """Missing slug should return None."""
186
+ registry = BlueprintRegistry()
187
+ assert registry.get("nonexistent-team") is None
188
+
189
+ def test_user_blueprints_override_builtins(self, tmp_home):
190
+ """User blueprints should take priority over built-ins."""
191
+ user_dir = tmp_home / "blueprints" / "teams"
192
+ user_dir.mkdir(parents=True)
193
+
194
+ custom = _minimal_blueprint(
195
+ name="Custom Guardian",
196
+ slug="infrastructure-guardian",
197
+ description="My custom override.",
198
+ )
199
+ (user_dir / "infrastructure-guardian.yaml").write_text(
200
+ yaml.dump(custom), encoding="utf-8"
201
+ )
202
+
203
+ registry = BlueprintRegistry(home=tmp_home)
204
+ bp = registry.get("infrastructure-guardian")
205
+ assert bp is not None
206
+ assert bp.name == "Custom Guardian"
207
+
208
+ def test_save_blueprint(self, tmp_home):
209
+ """Saving a blueprint should write a YAML file."""
210
+ registry = BlueprintRegistry(home=tmp_home)
211
+ bp = BlueprintManifest(**_minimal_blueprint())
212
+ path = registry.save_blueprint(bp)
213
+
214
+ assert path.exists()
215
+ loaded = yaml.safe_load(path.read_text())
216
+ assert loaded["name"] == "Test Team"
217
+
218
+ def test_invalid_yaml_is_skipped(self, tmp_home):
219
+ """Invalid YAML files should be skipped with a warning."""
220
+ user_dir = tmp_home / "blueprints" / "teams"
221
+ user_dir.mkdir(parents=True)
222
+ (user_dir / "broken.yaml").write_text("not: a: valid: blueprint: [")
223
+
224
+ registry = BlueprintRegistry(home=tmp_home)
225
+ # Should not raise
226
+ blueprints = registry.list_blueprints()
227
+ assert isinstance(blueprints, list)
228
+
229
+
230
+ # ---------------------------------------------------------------------------
231
+ # Team Engine tests
232
+ # ---------------------------------------------------------------------------
233
+
234
+
235
+ class TestTeamEngine:
236
+ """Test deployment orchestration."""
237
+
238
+ def test_resolve_deploy_order_simple(self):
239
+ """Simple dependencies should resolve in correct order."""
240
+ bp = BlueprintManifest(**_minimal_blueprint(
241
+ agents={
242
+ "alpha": {"role": "manager", "model": "fast"},
243
+ "beta": {"role": "worker", "model": "code", "depends_on": ["alpha"]},
244
+ "gamma": {"role": "worker", "model": "code", "depends_on": ["alpha", "beta"]},
245
+ }
246
+ ))
247
+
248
+ waves = TeamEngine.resolve_deploy_order(bp)
249
+ assert waves[0] == ["alpha"]
250
+ assert "beta" in waves[1]
251
+ assert "gamma" in waves[2] if len(waves) > 2 else "gamma" in waves[1]
252
+
253
+ def test_resolve_deploy_order_parallel(self):
254
+ """Independent agents should be in the same wave."""
255
+ bp = BlueprintManifest(**_minimal_blueprint(
256
+ agents={
257
+ "alpha": {"role": "worker", "model": "fast"},
258
+ "beta": {"role": "worker", "model": "code"},
259
+ "gamma": {"role": "worker", "model": "local"},
260
+ }
261
+ ))
262
+
263
+ waves = TeamEngine.resolve_deploy_order(bp)
264
+ assert len(waves) == 1
265
+ assert set(waves[0]) == {"alpha", "beta", "gamma"}
266
+
267
+ def test_resolve_circular_dependency_raises(self):
268
+ """Circular dependencies should raise ValueError."""
269
+ bp = BlueprintManifest(**_minimal_blueprint(
270
+ agents={
271
+ "alpha": {"role": "worker", "model": "fast", "depends_on": ["beta"]},
272
+ "beta": {"role": "worker", "model": "code", "depends_on": ["alpha"]},
273
+ }
274
+ ))
275
+
276
+ with pytest.raises(ValueError, match="[Cc]ircular|[Uu]nresolvable"):
277
+ TeamEngine.resolve_deploy_order(bp)
278
+
279
+ def test_deploy_dry_run(self, tmp_home):
280
+ """Deploy without a provider should create pending agents."""
281
+ bp = BlueprintManifest(**_minimal_blueprint())
282
+ engine = TeamEngine(home=tmp_home, provider=None)
283
+
284
+ deployment = engine.deploy(bp)
285
+ assert deployment.blueprint_slug == "test-team"
286
+ assert len(deployment.agents) == 1
287
+
288
+ agent = list(deployment.agents.values())[0]
289
+ assert agent.status == AgentStatus.PENDING
290
+ assert agent.host == "localhost"
291
+
292
+ def test_deploy_with_local_provider(self, tmp_home):
293
+ """Deploy with LocalProvider should create agent directories."""
294
+ bp = BlueprintManifest(**_minimal_blueprint())
295
+ backend = LocalProvider(home=tmp_home)
296
+ engine = TeamEngine(home=tmp_home, provider=backend)
297
+
298
+ deployment = engine.deploy(bp)
299
+ assert deployment.status == "running"
300
+
301
+ agent = list(deployment.agents.values())[0]
302
+ assert agent.status == AgentStatus.RUNNING
303
+ assert agent.host == "localhost"
304
+
305
+ # Check agent directory was created
306
+ agent_dir = tmp_home / "agents" / "local" / agent.name
307
+ assert agent_dir.exists()
308
+ assert (agent_dir / "config.json").exists()
309
+
310
+ def test_list_deployments(self, tmp_home):
311
+ """List deployments should return saved state."""
312
+ bp = BlueprintManifest(**_minimal_blueprint())
313
+ engine = TeamEngine(home=tmp_home)
314
+
315
+ engine.deploy(bp)
316
+ deployments = engine.list_deployments()
317
+ assert len(deployments) == 1
318
+ assert deployments[0].blueprint_slug == "test-team"
319
+
320
+ def test_destroy_deployment(self, tmp_home):
321
+ """Destroying a deployment should remove the state file."""
322
+ bp = BlueprintManifest(**_minimal_blueprint())
323
+ engine = TeamEngine(home=tmp_home)
324
+
325
+ deployment = engine.deploy(bp)
326
+ assert len(engine.list_deployments()) == 1
327
+
328
+ engine.destroy_deployment(deployment.deployment_id)
329
+ assert len(engine.list_deployments()) == 0
330
+
331
+ def test_destroy_nonexistent_returns_false(self, tmp_home):
332
+ """Destroying a nonexistent deployment should return False."""
333
+ engine = TeamEngine(home=tmp_home)
334
+ assert engine.destroy_deployment("fake-id") is False
335
+
336
+ def test_multi_instance_agents(self, tmp_home):
337
+ """Agents with count > 1 should spawn multiple instances."""
338
+ bp = BlueprintManifest(**_minimal_blueprint(
339
+ agents={
340
+ "scout": {
341
+ "role": "researcher",
342
+ "model": "fast",
343
+ "count": 3,
344
+ },
345
+ }
346
+ ))
347
+
348
+ engine = TeamEngine(home=tmp_home)
349
+ deployment = engine.deploy(bp)
350
+ assert len(deployment.agents) == 3
351
+ names = list(deployment.agents.keys())
352
+ assert "test-team-scout-1" in names
353
+ assert "test-team-scout-2" in names
354
+ assert "test-team-scout-3" in names
355
+
356
+
357
+ # ---------------------------------------------------------------------------
358
+ # Local Provider tests
359
+ # ---------------------------------------------------------------------------
360
+
361
+
362
+ class TestLocalProvider:
363
+ """Test the local process provider."""
364
+
365
+ def test_provision_creates_directory(self, tmp_home):
366
+ """Provision should create agent working directory."""
367
+ provider = LocalProvider(home=tmp_home)
368
+ spec = AgentSpec(role=AgentRole.WORKER, model=ModelTier.FAST)
369
+
370
+ result = provider.provision("test-agent", spec, "test-team")
371
+ assert result["host"] == "localhost"
372
+
373
+ work_dir = Path(result["work_dir"])
374
+ assert work_dir.exists()
375
+ assert (work_dir / "config.json").exists()
376
+ assert (work_dir / "memory").is_dir()
377
+ assert (work_dir / "scratch").is_dir()
378
+
379
+ def test_destroy_removes_directory(self, tmp_home):
380
+ """Destroy should remove the agent directory."""
381
+ provider = LocalProvider(home=tmp_home)
382
+ spec = AgentSpec()
383
+
384
+ result = provider.provision("doomed-agent", spec, "test-team")
385
+ work_dir = Path(result["work_dir"])
386
+ assert work_dir.exists()
387
+
388
+ provider.destroy("doomed-agent", result)
389
+ assert not work_dir.exists()
390
+
391
+ def test_health_check_running(self, tmp_home):
392
+ """Health check should detect current process as running."""
393
+ import os
394
+
395
+ provider = LocalProvider(home=tmp_home)
396
+ result = {"pid": os.getpid()}
397
+ status = provider.health_check("test", result)
398
+ assert status == AgentStatus.RUNNING
399
+
400
+ def test_health_check_stopped(self, tmp_home):
401
+ """Health check should detect dead PID as stopped."""
402
+ provider = LocalProvider(home=tmp_home)
403
+ result = {"pid": 99999999}
404
+ status = provider.health_check("test", result)
405
+ assert status == AgentStatus.STOPPED
406
+
407
+ def test_health_check_no_pid(self, tmp_home):
408
+ """No PID means stopped."""
409
+ provider = LocalProvider(home=tmp_home)
410
+ status = provider.health_check("test", {})
411
+ assert status == AgentStatus.STOPPED
412
+
413
+
414
+ # ---------------------------------------------------------------------------
415
+ # Builtin blueprint validation
416
+ # ---------------------------------------------------------------------------
417
+
418
+
419
+ class TestBuiltinBlueprints:
420
+ """Ensure all shipped blueprints are valid."""
421
+
422
+ def test_all_builtins_load(self):
423
+ """Every YAML in builtins/ should parse as a valid BlueprintManifest."""
424
+ registry = BlueprintRegistry()
425
+ blueprints = registry.list_blueprints()
426
+
427
+ for bp in blueprints:
428
+ assert bp.name, f"{bp.slug} has no name"
429
+ assert bp.description, f"{bp.slug} has no description"
430
+ assert bp.agent_count > 0, f"{bp.slug} has no agents"
431
+ assert bp.slug, f"Blueprint has empty slug"
432
+
433
+ def test_no_circular_deps_in_builtins(self):
434
+ """Built-in blueprints should have no circular dependencies."""
435
+ registry = BlueprintRegistry()
436
+ for bp in registry.list_blueprints():
437
+ waves = TeamEngine.resolve_deploy_order(bp)
438
+ assert len(waves) > 0, f"{bp.slug} has empty deploy order"
439
+
440
+ def test_infrastructure_guardian_details(self):
441
+ """Spot-check the Infrastructure Guardian blueprint."""
442
+ registry = BlueprintRegistry()
443
+ bp = registry.get("infrastructure-guardian")
444
+ assert bp is not None
445
+ assert "sentinel" in bp.agents
446
+ assert "rook" in bp.agents
447
+ assert bp.coordination.queen == "lumina"
448
+ assert bp.coordination.pattern == "supervisor"
449
+
450
+ def test_dev_squadron_details(self):
451
+ """Spot-check the Dev Squadron blueprint."""
452
+ registry = BlueprintRegistry()
453
+ bp = registry.get("dev-squadron")
454
+ assert bp is not None
455
+ assert "architect" in bp.agents
456
+ assert "reviewer" in bp.agents
457
+ assert bp.coordination.pattern == "hierarchical"