@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,113 @@
1
+ @echo off
2
+ REM -------------------------------------------------------------------
3
+ REM skcapstone MCP server launcher for Windows (cmd.exe)
4
+ REM Task: e5f81637
5
+ REM
6
+ REM Auto-detects the Python virtualenv and launches the MCP server
7
+ REM on stdio transport. Works with any MCP client that speaks stdio.
8
+ REM
9
+ REM Usage:
10
+ REM scripts\mcp-server.bat
11
+ REM
12
+ REM Environment overrides:
13
+ REM set SKCAPSTONE_VENV=C:\path\to\venv
14
+ REM set SKMEMORY_HOME=C:\path\to\memory
15
+ REM -------------------------------------------------------------------
16
+
17
+ setlocal enabledelayedexpansion
18
+
19
+ set "SCRIPT_DIR=%~dp0"
20
+ REM Remove trailing backslash
21
+ set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
22
+
23
+ REM Navigate up one level to get skcapstone project dir
24
+ for %%I in ("%SCRIPT_DIR%\..") do set "SKCAPSTONE_DIR=%%~fI"
25
+
26
+ set "PYTHON="
27
+
28
+ REM --- 1. Explicit SKCAPSTONE_VENV override ---
29
+ if defined SKCAPSTONE_VENV (
30
+ if exist "%SKCAPSTONE_VENV%\Scripts\python.exe" (
31
+ set "PYTHON=%SKCAPSTONE_VENV%\Scripts\python.exe"
32
+ goto :found
33
+ )
34
+ if exist "%SKCAPSTONE_VENV%\bin\python" (
35
+ set "PYTHON=%SKCAPSTONE_VENV%\bin\python"
36
+ goto :found
37
+ )
38
+ echo WARNING: SKCAPSTONE_VENV=%SKCAPSTONE_VENV% set but python not found, falling back. >&2
39
+ )
40
+
41
+ REM --- 2. Standard skenv on Windows (%LOCALAPPDATA%\skenv) ---
42
+ if exist "%LOCALAPPDATA%\skenv\Scripts\python.exe" (
43
+ "%LOCALAPPDATA%\skenv\Scripts\python.exe" -c "import skcapstone" >nul 2>&1
44
+ if !errorlevel! equ 0 (
45
+ set "PYTHON=%LOCALAPPDATA%\skenv\Scripts\python.exe"
46
+ goto :found
47
+ )
48
+ )
49
+
50
+ REM --- 3. Standard skenv Unix-style (%USERPROFILE%\.skenv) ---
51
+ if exist "%USERPROFILE%\.skenv\Scripts\python.exe" (
52
+ "%USERPROFILE%\.skenv\Scripts\python.exe" -c "import skcapstone" >nul 2>&1
53
+ if !errorlevel! equ 0 (
54
+ set "PYTHON=%USERPROFILE%\.skenv\Scripts\python.exe"
55
+ goto :found
56
+ )
57
+ )
58
+
59
+ REM --- 4. Project-local .venv ---
60
+ if exist "%SKCAPSTONE_DIR%\.venv\Scripts\python.exe" (
61
+ "%SKCAPSTONE_DIR%\.venv\Scripts\python.exe" -c "import skcapstone" >nul 2>&1
62
+ if !errorlevel! equ 0 (
63
+ set "PYTHON=%SKCAPSTONE_DIR%\.venv\Scripts\python.exe"
64
+ goto :found
65
+ )
66
+ )
67
+
68
+ REM --- 5. System Python ---
69
+ where python >nul 2>&1
70
+ if %errorlevel% equ 0 (
71
+ python -c "import skcapstone" >nul 2>&1
72
+ if !errorlevel! equ 0 (
73
+ set "PYTHON=python"
74
+ goto :found
75
+ )
76
+ )
77
+
78
+ where python3 >nul 2>&1
79
+ if %errorlevel% equ 0 (
80
+ python3 -c "import skcapstone" >nul 2>&1
81
+ if !errorlevel! equ 0 (
82
+ set "PYTHON=python3"
83
+ goto :found
84
+ )
85
+ )
86
+
87
+ REM --- Not found ---
88
+ echo ERROR: Could not find a Python interpreter with skcapstone installed. >&2
89
+ echo. >&2
90
+ echo Install with: >&2
91
+ echo scripts\install.bat >&2
92
+ echo. >&2
93
+ echo Or point to an existing venv: >&2
94
+ echo set SKCAPSTONE_VENV=C:\path\to\venv >&2
95
+ echo scripts\mcp-server.bat >&2
96
+ exit /b 1
97
+
98
+ :found
99
+
100
+ REM --- Set environment variables ---
101
+ if not defined SKMEMORY_HOME set "SKMEMORY_HOME=%USERPROFILE%\.skcapstone\memory"
102
+ if not defined SKCAPSTONE_HOME set "SKCAPSTONE_HOME=%USERPROFILE%\.skcapstone"
103
+
104
+ REM Ensure skcapstone is importable
105
+ if defined PYTHONPATH (
106
+ set "PYTHONPATH=%SKCAPSTONE_DIR%\src;%PYTHONPATH%"
107
+ ) else (
108
+ set "PYTHONPATH=%SKCAPSTONE_DIR%\src"
109
+ )
110
+
111
+ REM --- Launch MCP server on stdio ---
112
+ %PYTHON% -m skcapstone.mcp_server %*
113
+ exit /b %errorlevel%
@@ -0,0 +1,116 @@
1
+ #Requires -Version 5.1
2
+ <#
3
+ .SYNOPSIS
4
+ SKCapstone MCP server launcher for Windows (PowerShell).
5
+ Task: e5f81637
6
+
7
+ .DESCRIPTION
8
+ Auto-detects the Python virtualenv and launches the MCP server
9
+ on stdio transport. Works with Cursor, Claude Desktop, Claude
10
+ Code CLI, Windsurf, Aider, Cline, or any stdio MCP client.
11
+
12
+ .PARAMETER VenvPath
13
+ Override the virtualenv path (instead of auto-detection).
14
+
15
+ .EXAMPLE
16
+ .\scripts\mcp-server.ps1
17
+ .\scripts\mcp-server.ps1 -VenvPath C:\Users\me\.skenv
18
+
19
+ .NOTES
20
+ Environment overrides:
21
+ SKCAPSTONE_VENV - force a specific virtualenv
22
+ SKMEMORY_HOME - override memory storage location
23
+ #>
24
+
25
+ [CmdletBinding()]
26
+ param(
27
+ [string]$VenvPath
28
+ )
29
+
30
+ Set-StrictMode -Version Latest
31
+ $ErrorActionPreference = 'Stop'
32
+
33
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
34
+ $SkcapstoneDir = Split-Path -Parent $ScriptDir
35
+
36
+ # --- Locate the Python interpreter ---
37
+ function Find-Python {
38
+ # 1. Explicit parameter or env var
39
+ $ExplicitVenv = if ($VenvPath) { $VenvPath } else { $env:SKCAPSTONE_VENV }
40
+ if ($ExplicitVenv) {
41
+ $py = Join-Path $ExplicitVenv 'Scripts\python.exe'
42
+ if (Test-Path $py) { return $py }
43
+ $py = Join-Path $ExplicitVenv 'bin\python'
44
+ if (Test-Path $py) { return $py }
45
+ Write-Warning "SKCAPSTONE_VENV=$ExplicitVenv set but python not found there, falling back."
46
+ }
47
+
48
+ # 2. Standard skenv location on Windows
49
+ $SkenvWin = Join-Path $env:LOCALAPPDATA 'skenv\Scripts\python.exe'
50
+ if (Test-Path $SkenvWin) {
51
+ $check = & $SkenvWin -c "import skcapstone" 2>&1
52
+ if ($LASTEXITCODE -eq 0) { return $SkenvWin }
53
+ }
54
+
55
+ # 3. Standard skenv location (Unix-style, e.g. WSL path in Windows)
56
+ $SkenvUnix = Join-Path $HOME '.skenv\bin\python'
57
+ if (Test-Path $SkenvUnix) {
58
+ $check = & $SkenvUnix -c "import skcapstone" 2>&1
59
+ if ($LASTEXITCODE -eq 0) { return $SkenvUnix }
60
+ }
61
+
62
+ # 4. Project-local .venv
63
+ $LocalVenv = Join-Path $SkcapstoneDir '.venv\Scripts\python.exe'
64
+ if (Test-Path $LocalVenv) {
65
+ $check = & $LocalVenv -c "import skcapstone" 2>&1
66
+ if ($LASTEXITCODE -eq 0) { return $LocalVenv }
67
+ }
68
+
69
+ # 5. System Python
70
+ foreach ($cmd in @('python', 'python3')) {
71
+ $sysPath = Get-Command $cmd -ErrorAction SilentlyContinue
72
+ if ($sysPath) {
73
+ $check = & $sysPath.Source -c "import skcapstone" 2>&1
74
+ if ($LASTEXITCODE -eq 0) { return $sysPath.Source }
75
+ }
76
+ }
77
+
78
+ return $null
79
+ }
80
+
81
+ $Python = Find-Python
82
+ if (-not $Python) {
83
+ Write-Error @"
84
+ Could not find a Python interpreter with skcapstone installed.
85
+
86
+ Install with:
87
+ .\scripts\install.ps1
88
+
89
+ Or point to an existing venv:
90
+ `$env:SKCAPSTONE_VENV = 'C:\path\to\venv'
91
+ .\scripts\mcp-server.ps1
92
+ "@
93
+ exit 1
94
+ }
95
+
96
+ Write-Verbose "Using Python: $Python"
97
+
98
+ # --- Set environment variables ---
99
+ if (-not $env:SKMEMORY_HOME) {
100
+ $env:SKMEMORY_HOME = Join-Path $HOME '.skcapstone\memory'
101
+ }
102
+ if (-not $env:SKCAPSTONE_HOME) {
103
+ $env:SKCAPSTONE_HOME = Join-Path $HOME '.skcapstone'
104
+ }
105
+
106
+ # Ensure skcapstone is importable
107
+ $SrcPath = Join-Path $SkcapstoneDir 'src'
108
+ if ($env:PYTHONPATH) {
109
+ $env:PYTHONPATH = "$SrcPath;$($env:PYTHONPATH)"
110
+ } else {
111
+ $env:PYTHONPATH = $SrcPath
112
+ }
113
+
114
+ # --- Launch MCP server on stdio ---
115
+ & $Python -m skcapstone.mcp_server @args
116
+ exit $LASTEXITCODE
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env bash
2
+ # -------------------------------------------------------------------
3
+ # skcapstone MCP server launcher — cross-platform (Linux / macOS)
4
+ # Task: e5f81637
5
+ #
6
+ # Works with: Cursor, Claude Desktop, Claude Code CLI, Windsurf,
7
+ # Aider, Cline, or any MCP client that speaks stdio.
8
+ #
9
+ # The script auto-detects the Python virtualenv and launches the
10
+ # MCP server on stdio. No hardcoded paths required in client configs.
11
+ #
12
+ # Usage:
13
+ # ./scripts/mcp-server.sh (from repo root)
14
+ # bash scripts/mcp-server.sh (explicit bash)
15
+ #
16
+ # Environment overrides:
17
+ # SKCAPSTONE_VENV=/path/to/venv — force a specific virtualenv
18
+ # SKMEMORY_HOME=/path/to/dir — override memory storage location
19
+ # SKCAPSTONE_LOG_LEVEL=DEBUG — set log verbosity
20
+ # -------------------------------------------------------------------
21
+
22
+ set -euo pipefail
23
+
24
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ SKCAPSTONE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
26
+
27
+ # --- Locate the Python interpreter ---
28
+ # Priority:
29
+ # 1. SKCAPSTONE_VENV env var (explicit override)
30
+ # 2. ~/.skenv (standard SK* suite venv)
31
+ # 3. Project-local .venv dirs
32
+ # 4. System python3 / python
33
+ find_python() {
34
+ # 1. Explicit venv override
35
+ if [[ -n "${SKCAPSTONE_VENV:-}" ]]; then
36
+ local py="$SKCAPSTONE_VENV/bin/python"
37
+ if [[ -x "$py" ]]; then
38
+ echo "$py"
39
+ return
40
+ fi
41
+ echo "WARNING: SKCAPSTONE_VENV=$SKCAPSTONE_VENV set but $py not found, falling back." >&2
42
+ fi
43
+
44
+ # 2. Standard ~/.skenv venv
45
+ local skenv="$HOME/.skenv/bin/python"
46
+ if [[ -x "$skenv" ]]; then
47
+ if "$skenv" -c "import skcapstone" 2>/dev/null; then
48
+ echo "$skenv"
49
+ return
50
+ fi
51
+ fi
52
+
53
+ # 3. Project-local venvs
54
+ local candidates=(
55
+ "$SKCAPSTONE_DIR/.venv/bin/python"
56
+ "$SKCAPSTONE_DIR/../.venv/bin/python"
57
+ )
58
+ for py in "${candidates[@]}"; do
59
+ if [[ -x "$py" ]]; then
60
+ if "$py" -c "import skcapstone" 2>/dev/null; then
61
+ echo "$py"
62
+ return
63
+ fi
64
+ fi
65
+ done
66
+
67
+ # 4. System Python (must have skcapstone installed)
68
+ for cmd in python3 python; do
69
+ if command -v "$cmd" >/dev/null 2>&1; then
70
+ if "$cmd" -c "import skcapstone" 2>/dev/null; then
71
+ echo "$(command -v "$cmd")"
72
+ return
73
+ fi
74
+ fi
75
+ done
76
+
77
+ return 1
78
+ }
79
+
80
+ PYTHON="$(find_python)" || {
81
+ echo "ERROR: Could not find a Python interpreter with skcapstone installed." >&2
82
+ echo "" >&2
83
+ echo "Install with:" >&2
84
+ echo " bash scripts/install.sh" >&2
85
+ echo "" >&2
86
+ echo "Or point to an existing venv:" >&2
87
+ echo " SKCAPSTONE_VENV=/path/to/venv bash scripts/mcp-server.sh" >&2
88
+ exit 1
89
+ }
90
+
91
+ # --- Set environment variables ---
92
+ export SKMEMORY_HOME="${SKMEMORY_HOME:-$HOME/.skcapstone/memory}"
93
+ export SKCAPSTONE_HOME="${SKCAPSTONE_HOME:-$HOME/.skcapstone}"
94
+
95
+ # Ensure skcapstone is importable even if not pip-installed
96
+ export PYTHONPATH="${SKCAPSTONE_DIR}/src${PYTHONPATH:+:$PYTHONPATH}"
97
+
98
+ # --- Launch MCP server on stdio ---
99
+ exec "$PYTHON" -m skcapstone.mcp_server "$@"
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+ # Pull required Ollama models for the sovereign agent
3
+ set -euo pipefail
4
+
5
+ echo "Pulling Ollama models for SKCapstone..."
6
+
7
+ ollama pull llama3.2 # FAST tier (3.2B, ~2GB) — CPU-only inference
8
+ ollama pull devstral # CODE tier — code generation and review
9
+
10
+ echo "Models ready"
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ # ---------------------------------------------------------------------------
3
+ # skcapstone CLI wrapper — run without pip install (dev from repo).
4
+ #
5
+ # Adds skcapstone src to PYTHONPATH and invokes the CLI. Use when working
6
+ # from the monorepo without activating a venv or installing the package.
7
+ #
8
+ # To get `skcapstone` on PATH:
9
+ # export PATH="/path/to/smilintux-org/skcapstone/scripts:$PATH"
10
+ # Or from repo root: export PATH="$(pwd)/skcapstone/scripts:$PATH"
11
+ #
12
+ # Usage:
13
+ # ./skcapstone/scripts/skcapstone status
14
+ # skcapstone trust rehydrate # when scripts/ is on PATH
15
+ # ---------------------------------------------------------------------------
16
+
17
+ set -euo pipefail
18
+
19
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
+ SKCAPSTONE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
21
+ SRC_DIR="${SKCAPSTONE_DIR}/src"
22
+
23
+ export PYTHONPATH="${SRC_DIR}${PYTHONPATH:+:$PYTHONPATH}"
24
+
25
+ # Prefer venv python if present (has deps); else system python (may need deps)
26
+ if [[ -x "${SKCAPSTONE_DIR}/.venv/bin/python" ]]; then
27
+ exec "${SKCAPSTONE_DIR}/.venv/bin/python" -c "
28
+ import sys
29
+ sys.argv = ['skcapstone'] + sys.argv[1:]
30
+ from skcapstone.cli import main
31
+ main()
32
+ " "$@"
33
+ elif [[ -x "$(cd "$SCRIPT_DIR/../.." && pwd)/skmemory/.venv/bin/python" ]]; then
34
+ REPO_VENV="$(cd "$SCRIPT_DIR/../.." && pwd)/skmemory/.venv/bin/python"
35
+ exec "$REPO_VENV" -c "
36
+ import sys
37
+ sys.argv = ['skcapstone'] + sys.argv[1:]
38
+ from skcapstone.cli import main
39
+ main()
40
+ " "$@"
41
+ else
42
+ exec python -c "
43
+ import sys
44
+ sys.argv = ['skcapstone'] + sys.argv[1:]
45
+ from skcapstone.cli import main
46
+ main()
47
+ " "$@"
48
+ fi
@@ -0,0 +1,180 @@
1
+ #!/bin/bash
2
+ # verify_install.sh — Verify skcapstone pip install works cleanly.
3
+ # Creates a fresh venv, installs each package, runs --version, reports pass/fail.
4
+ set -uo pipefail
5
+
6
+ REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
7
+ VENV_DIR="/tmp/skcapstone_verify_venv_$$"
8
+ PASS=0
9
+ FAIL=0
10
+ RESULTS=()
11
+
12
+ # ── helpers ────────────────────────────────────────────────────────────────
13
+ ok() { echo " [PASS] $*"; PASS=$((PASS + 1)); RESULTS+=("PASS: $*"); }
14
+ fail() { echo " [FAIL] $*"; FAIL=$((FAIL + 1)); RESULTS+=("FAIL: $*"); }
15
+ skip() { echo " [SKIP] $*"; RESULTS+=("SKIP: $*"); }
16
+
17
+ hr() { printf '%0.s─' {1..60}; echo; }
18
+
19
+ cleanup() { rm -rf "$VENV_DIR"; }
20
+ trap cleanup EXIT
21
+
22
+ # ── setup ──────────────────────────────────────────────────────────────────
23
+ hr
24
+ echo " SKCapstone Install Verification"
25
+ echo " Repo : $REPO_ROOT"
26
+ echo " Venv : $VENV_DIR"
27
+ hr
28
+
29
+ # Require Python ≥ 3.10 — prefer pyenv global python3, then fallback names
30
+ for _py in python3 python python3.13 python3.12 python3.11 python3.10; do
31
+ if _found=$(command -v "$_py" 2>/dev/null) && "$_found" -c "import sys; sys.exit(0 if sys.version_info >= (3,10) else 1)" 2>/dev/null; then
32
+ PYTHON="$_found"
33
+ break
34
+ fi
35
+ done
36
+ if [[ -z "${PYTHON:-}" ]]; then
37
+ echo "ERROR: python3 >= 3.10 not found"; exit 1
38
+ fi
39
+ PY_VER=$("$PYTHON" -c "import sys; print('%d.%d' % sys.version_info[:2])")
40
+ echo " Python: $PYTHON ($PY_VER)"
41
+ hr
42
+
43
+ # Create isolated venv
44
+ "$PYTHON" -m venv "$VENV_DIR" || { echo "ERROR: venv creation failed"; exit 1; }
45
+ PIP="$VENV_DIR/bin/pip"
46
+ PYEXE="$VENV_DIR/bin/python"
47
+
48
+ "$PIP" install --quiet --upgrade pip wheel setuptools 2>&1 | tail -1
49
+
50
+ # Common pip flags — prefer pre-built wheels, 60s per-package timeout
51
+ PIP_OPTS=(--quiet --prefer-binary --timeout=60)
52
+
53
+ # ── 1. Core skcapstone (base deps only) ───────────────────────────────────
54
+ echo
55
+ echo "Step 1: core install (click, mcp, pydantic, pyyaml, rich)"
56
+ if "$PIP" install "${PIP_OPTS[@]}" "$REPO_ROOT" 2>&1; then
57
+ ok "pip install skcapstone (core)"
58
+ else
59
+ fail "pip install skcapstone (core)"
60
+ fi
61
+
62
+ # Verify importable
63
+ if "$PYEXE" -c "import skcapstone; print(' version:', skcapstone.__version__)" 2>&1; then
64
+ ok "import skcapstone"
65
+ else
66
+ fail "import skcapstone"
67
+ fi
68
+
69
+ # Verify CLI entry point
70
+ if "$VENV_DIR/bin/skcapstone" --help > /dev/null 2>&1; then
71
+ ok "skcapstone --help"
72
+ else
73
+ fail "skcapstone --help"
74
+ fi
75
+
76
+ if "$VENV_DIR/bin/skcapstone" --version 2>&1 | grep -qE "[0-9]+\.[0-9]+"; then
77
+ ok "skcapstone --version"
78
+ else
79
+ fail "skcapstone --version"
80
+ fi
81
+
82
+ # Verify crush shim entry point
83
+ if "$VENV_DIR/bin/crush" --help > /dev/null 2>&1; then
84
+ ok "crush --help"
85
+ else
86
+ fail "crush --help (stub)"
87
+ fi
88
+
89
+ # ── 2. Optional extra: consciousness (watchdog) ────────────────────────────
90
+ echo
91
+ echo "Step 2: optional 'consciousness' extra"
92
+ if "$PIP" install "${PIP_OPTS[@]}" "$REPO_ROOT[consciousness]" 2>&1; then
93
+ ok "pip install skcapstone[consciousness]"
94
+ if "$PYEXE" -c "import watchdog; print(' watchdog:', watchdog.__version__)" 2>&1; then
95
+ ok "import watchdog"
96
+ else
97
+ fail "import watchdog"
98
+ fi
99
+ else
100
+ fail "pip install skcapstone[consciousness]"
101
+ fi
102
+
103
+ # ── 3. Optional extra: shell (prompt_toolkit) ──────────────────────────────
104
+ echo
105
+ echo "Step 3: optional 'shell' extra"
106
+ if "$PIP" install "${PIP_OPTS[@]}" "$REPO_ROOT[shell]" 2>&1; then
107
+ ok "pip install skcapstone[shell]"
108
+ if "$PYEXE" -c "import prompt_toolkit; print(' prompt_toolkit:', prompt_toolkit.__version__)" 2>&1; then
109
+ ok "import prompt_toolkit"
110
+ else
111
+ fail "import prompt_toolkit"
112
+ fi
113
+ else
114
+ fail "pip install skcapstone[shell]"
115
+ fi
116
+
117
+ # ── 4. Dev extras (pytest, ruff, black) ────────────────────────────────────
118
+ echo
119
+ echo "Step 4: dev extras"
120
+ if "$PIP" install "${PIP_OPTS[@]}" "$REPO_ROOT[dev]" 2>&1; then
121
+ ok "pip install skcapstone[dev]"
122
+ for pkg in pytest ruff black; do
123
+ if "$PYEXE" -c "import $pkg" 2>&1; then
124
+ ok "import $pkg"
125
+ else
126
+ fail "import $pkg"
127
+ fi
128
+ done
129
+ else
130
+ fail "pip install skcapstone[dev]"
131
+ fi
132
+
133
+ # ── 5. Local sibling packages (skseed, skcomm) ─────────────────────────────
134
+ echo
135
+ echo "Step 5: local sibling packages (if present)"
136
+ for pkg_dir in "$REPO_ROOT/../skseed" "$REPO_ROOT/../skcomm" "$REPO_ROOT/../skmemory" "$REPO_ROOT/../skskills"; do
137
+ pkg_name=$(basename "$pkg_dir")
138
+ if [[ -f "$pkg_dir/pyproject.toml" ]] || [[ -f "$pkg_dir/setup.py" ]]; then
139
+ if "$PIP" install "${PIP_OPTS[@]}" -e "$pkg_dir" 2>&1; then
140
+ ok "pip install -e $pkg_name"
141
+ if "$PYEXE" -c "import $pkg_name" 2>&1; then
142
+ ok "import $pkg_name"
143
+ else
144
+ fail "import $pkg_name"
145
+ fi
146
+ else
147
+ fail "pip install -e $pkg_name"
148
+ fi
149
+ else
150
+ skip "$pkg_name not found at $pkg_dir"
151
+ fi
152
+ done
153
+
154
+ # ── 6. Verify key CLI subcommands load ─────────────────────────────────────
155
+ echo
156
+ echo "Step 6: CLI subcommands smoke test"
157
+ SKCAP="$VENV_DIR/bin/skcapstone"
158
+ for subcmd in status memory coord doctor daemon sync; do
159
+ if "$SKCAP" "$subcmd" --help > /dev/null 2>&1; then
160
+ ok "skcapstone $subcmd --help"
161
+ else
162
+ fail "skcapstone $subcmd --help"
163
+ fi
164
+ done
165
+
166
+ # ── Summary ────────────────────────────────────────────────────────────────
167
+ echo
168
+ hr
169
+ echo " Results: $PASS passed, $FAIL failed"
170
+ hr
171
+ if [[ $FAIL -eq 0 ]]; then
172
+ echo " ALL CHECKS PASSED"
173
+ exit 0
174
+ else
175
+ echo " FAILURES:"
176
+ for r in "${RESULTS[@]}"; do
177
+ [[ "$r" == FAIL:* ]] && echo " $r"
178
+ done
179
+ exit 1
180
+ fi