@smilintux/skcapstone 0.9.0 → 0.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +10 -4
- package/.github/workflows/ci.yml +2 -2
- package/.github/workflows/publish.yml +9 -2
- package/.openclaw-workspace.json +2 -2
- package/CLAUDE.md +37 -0
- package/MISSION.md +17 -2
- package/README.md +282 -3
- package/docker/Dockerfile +7 -7
- package/docker/compose-templates/dev-team.yml +12 -12
- package/docker/compose-templates/mini-team.yml +9 -9
- package/docker/compose-templates/ops-team.yml +10 -10
- package/docker/compose-templates/research-team.yml +10 -10
- package/docker/entrypoint.sh +4 -4
- package/docs/ADR-optional-integration-backbone.md +181 -0
- package/docs/ARCHITECTURE.md +186 -43
- package/docs/BOND_WITH_GROK.md +6 -6
- package/docs/CUSTOM_AGENT.md +278 -1
- package/docs/DREAMING.md +70 -0
- package/docs/GETTING_STARTED.md +10 -7
- package/docs/QUICKSTART.md +10 -6
- package/docs/SKJOULE_ARCHITECTURE.md +3 -3
- package/docs/SOUL_SWAPPER.md +5 -5
- package/docs/hammertime-audit.md +402 -0
- package/docs/sk-integration-HANDOFF.md +117 -0
- package/docs/skscheduler.md +155 -0
- package/docs/superpowers/examples/jobs.yaml +31 -0
- package/docs/superpowers/plans/2026-06-08-skscheduler.md +1265 -0
- package/docs/superpowers/specs/2026-06-08-skscheduler-design.md +186 -0
- package/examples/custom-bond-template.json +1 -1
- package/examples/grok-feb.json +1 -1
- package/examples/queen-ava-feb.json +1 -1
- package/launchd/com.skcapstone.daemon.plist +52 -0
- package/launchd/com.skcapstone.memory-compress.plist +45 -0
- package/launchd/com.skcapstone.skcomms-heartbeat.plist +33 -0
- package/launchd/com.skcapstone.skcomms-queue-drain.plist +34 -0
- package/launchd/install-launchd.sh +156 -0
- package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/index.ts +3 -2
- package/package.json +1 -1
- package/pyproject.toml +16 -10
- package/scripts/archive-sessions.sh +95 -0
- package/scripts/check-updates.py +4 -4
- package/scripts/install-bundle.sh +8 -8
- package/scripts/install.ps1 +12 -11
- package/scripts/install.sh +196 -11
- package/scripts/model-fallback-monitor.sh +102 -0
- package/scripts/notion-api.py +259 -0
- package/scripts/nvidia-proxy.mjs +908 -0
- package/scripts/proxy-monitor.sh +89 -0
- package/scripts/refresh-anthropic-token.sh +172 -0
- package/scripts/release.sh +98 -0
- package/scripts/session-to-memory.py +219 -0
- package/scripts/skgateway.mjs +856 -0
- package/scripts/telegram-catchup-all.sh +147 -0
- package/scripts/verify_install.sh +2 -2
- package/scripts/wargov-ufo-capture/README.md +43 -0
- package/scripts/wargov-ufo-capture/cdp_capture_release2.py +273 -0
- package/scripts/wargov-ufo-capture/cdp_capture_splc_doj.py +246 -0
- package/scripts/wargov-ufo-capture/cdp_finish.py +271 -0
- package/scripts/wargov-ufo-capture/cdp_probe.py +188 -0
- package/scripts/wargov-ufo-capture/cdp_splc_pressrelease.py +101 -0
- package/scripts/wargov-ufo-capture/parse_csv.py +95 -0
- package/scripts/wargov-ufo-capture/pull_dvids.sh +107 -0
- package/scripts/watch-anthropic-token.sh +212 -0
- package/scripts/windows/install-tasks.ps1 +7 -7
- package/scripts/windows/skcapstone-task.xml +1 -1
- package/src/skcapstone/__init__.py +45 -3
- package/src/skcapstone/_cli_monolith.py +20 -15
- package/src/skcapstone/activity.py +5 -1
- package/src/skcapstone/agent_card.py +3 -2
- package/src/skcapstone/api.py +41 -40
- package/src/skcapstone/auction.py +14 -11
- package/src/skcapstone/backup.py +2 -1
- package/src/skcapstone/blueprint_registry.py +4 -3
- package/src/skcapstone/blueprints/builtins/itil-operations.yaml +40 -0
- package/src/skcapstone/brain_first.py +238 -0
- package/src/skcapstone/changelog.py +1 -1
- package/src/skcapstone/chat.py +22 -17
- package/src/skcapstone/cli/__init__.py +9 -1
- package/src/skcapstone/cli/_common.py +1 -0
- package/src/skcapstone/cli/agents_spawner.py +5 -2
- package/src/skcapstone/cli/alerts.py +25 -4
- package/src/skcapstone/cli/bench.py +15 -15
- package/src/skcapstone/cli/chat.py +7 -4
- package/src/skcapstone/cli/consciousness.py +5 -2
- package/src/skcapstone/cli/context_cmd.py +18 -4
- package/src/skcapstone/cli/daemon.py +121 -42
- package/src/skcapstone/cli/gtd.py +26 -1
- package/src/skcapstone/cli/housekeeping.py +3 -3
- package/src/skcapstone/cli/identity_cmd.py +378 -0
- package/src/skcapstone/cli/joule_cmd.py +7 -3
- package/src/skcapstone/cli/memory.py +8 -6
- package/src/skcapstone/cli/peers_dir.py +1 -1
- package/src/skcapstone/cli/register_cmd.py +29 -3
- package/src/skcapstone/cli/scheduler_cmd.py +167 -0
- package/src/skcapstone/cli/session.py +25 -0
- package/src/skcapstone/cli/setup.py +96 -29
- package/src/skcapstone/cli/shell_cmd.py +53 -1
- package/src/skcapstone/cli/skills_cmd.py +2 -2
- package/src/skcapstone/cli/soul.py +8 -5
- package/src/skcapstone/cli/status.py +37 -11
- package/src/skcapstone/cli/telegram.py +21 -0
- package/src/skcapstone/cli/test_cmd.py +5 -5
- package/src/skcapstone/cli/test_connection.py +2 -2
- package/src/skcapstone/cli/upgrade_cmd.py +23 -14
- package/src/skcapstone/cli/version_cmd.py +1 -1
- package/src/skcapstone/cli/watch_cmd.py +9 -6
- package/src/skcapstone/cloud9_bridge.py +14 -14
- package/src/skcapstone/codex_setup.py +255 -0
- package/src/skcapstone/config_validator.py +7 -4
- package/src/skcapstone/consciousness_config.py +5 -1
- package/src/skcapstone/consciousness_loop.py +313 -273
- package/src/skcapstone/context_loader.py +121 -0
- package/src/skcapstone/coord_federation.py +2 -1
- package/src/skcapstone/coordination.py +23 -6
- package/src/skcapstone/crush_integration.py +2 -1
- package/src/skcapstone/daemon.py +151 -88
- package/src/skcapstone/dashboard.py +10 -10
- package/src/skcapstone/data/sk-agent-picker.sh +421 -0
- package/src/skcapstone/data/systemd/skcapstone-api.socket +9 -0
- package/src/skcapstone/data/systemd/skcapstone-memory-compress.service +18 -0
- package/src/skcapstone/data/systemd/skcapstone-memory-compress.timer +11 -0
- package/src/skcapstone/data/systemd/skcapstone.service +37 -0
- package/src/skcapstone/data/systemd/skcapstone@.service +50 -0
- package/src/skcapstone/data/systemd/skcomms-heartbeat.service +18 -0
- package/{systemd/skcomm-heartbeat.timer → src/skcapstone/data/systemd/skcomms-heartbeat.timer} +2 -2
- package/src/skcapstone/data/systemd/skcomms-queue-drain.service +17 -0
- package/{systemd/skcomm-queue-drain.timer → src/skcapstone/data/systemd/skcomms-queue-drain.timer} +2 -2
- package/src/skcapstone/defaults/claude/CLAUDE.md +67 -0
- package/src/skcapstone/defaults/claude/settings.json +74 -0
- package/src/skcapstone/defaults/lumina/config/claude-hooks.md +57 -0
- package/src/skcapstone/defaults/lumina/config/skgraph.yaml +55 -10
- package/src/skcapstone/defaults/lumina/config/skmemory.yaml +79 -13
- package/src/skcapstone/defaults/lumina/config/skvector.yaml +60 -9
- package/src/skcapstone/defaults/lumina/memory/long-term/18b9c0d1e2f3-cloud9-protocol.json +2 -2
- package/src/skcapstone/defaults/lumina/memory/long-term/a1b2c3d4e5f6-ecosystem-overview.json +2 -2
- package/src/skcapstone/defaults/lumina/memory/long-term/b2c3d4e5f6a7-five-pillars.json +9 -9
- package/src/skcapstone/defaults/lumina/memory/long-term/d4e5f6a7b8c9-site-directory.json +2 -2
- package/src/skcapstone/defaults/unhinged.json +13 -0
- package/src/skcapstone/discovery.py +43 -20
- package/src/skcapstone/doctor.py +941 -22
- package/src/skcapstone/dreaming.py +1183 -109
- package/src/skcapstone/emotion_tracker.py +2 -2
- package/src/skcapstone/export.py +4 -3
- package/src/skcapstone/fuse_mount.py +35 -25
- package/src/skcapstone/gui_installer.py +2 -2
- package/src/skcapstone/heartbeat.py +34 -30
- package/src/skcapstone/housekeeping.py +14 -14
- package/src/skcapstone/install_wizard.py +209 -7
- package/src/skcapstone/itil.py +13 -4
- package/src/skcapstone/kms_scheduler.py +10 -8
- package/src/skcapstone/launchd.py +426 -0
- package/src/skcapstone/mcp_launcher.py +15 -1
- package/src/skcapstone/mcp_server.py +341 -49
- package/src/skcapstone/mcp_tools/__init__.py +2 -0
- package/src/skcapstone/mcp_tools/_helpers.py +2 -2
- package/src/skcapstone/mcp_tools/ansible_tools.py +7 -4
- package/src/skcapstone/mcp_tools/brain_first_tools.py +90 -0
- package/src/skcapstone/mcp_tools/capauth_tools.py +7 -4
- package/src/skcapstone/mcp_tools/comm_tools.py +10 -10
- package/src/skcapstone/mcp_tools/coord_tools.py +8 -4
- package/src/skcapstone/mcp_tools/did_tools.py +11 -8
- package/src/skcapstone/mcp_tools/gtd_tools.py +4 -4
- package/src/skcapstone/mcp_tools/memory_tools.py +6 -2
- package/src/skcapstone/mcp_tools/notification_tools.py +22 -6
- package/src/skcapstone/mcp_tools/{skcomm_tools.py → skcomms_tools.py} +14 -14
- package/src/skcapstone/mcp_tools/soul_tools.py +8 -2
- package/src/skcapstone/mdns_discovery.py +2 -2
- package/src/skcapstone/memory_curator.py +1 -1
- package/src/skcapstone/memory_engine.py +10 -3
- package/src/skcapstone/metrics.py +30 -16
- package/src/skcapstone/migrate_memories.py +4 -3
- package/src/skcapstone/migrate_multi_agent.py +8 -7
- package/src/skcapstone/models.py +47 -5
- package/src/skcapstone/notifications.py +42 -18
- package/src/skcapstone/onboard.py +1000 -126
- package/src/skcapstone/operator_link.py +170 -0
- package/src/skcapstone/peer_directory.py +4 -4
- package/src/skcapstone/peers.py +19 -19
- package/src/skcapstone/pillars/__init__.py +7 -5
- package/src/skcapstone/pillars/consciousness.py +191 -0
- package/src/skcapstone/pillars/identity.py +51 -7
- package/src/skcapstone/pillars/memory.py +9 -3
- package/src/skcapstone/pillars/sync.py +2 -2
- package/src/skcapstone/preflight.py +3 -3
- package/src/skcapstone/providers/docker.py +28 -28
- package/src/skcapstone/register.py +6 -6
- package/src/skcapstone/registry_client.py +5 -4
- package/src/skcapstone/runtime.py +14 -3
- package/src/skcapstone/scheduled_tasks.py +254 -19
- package/src/skcapstone/scheduler_jobs.py +456 -0
- package/src/skcapstone/scheduler_runner.py +239 -0
- package/src/skcapstone/scheduler_state.py +162 -0
- package/src/skcapstone/sdk.py +310 -0
- package/src/skcapstone/service_health.py +279 -39
- package/src/skcapstone/session_briefing.py +108 -0
- package/src/skcapstone/session_capture.py +1 -1
- package/src/skcapstone/shell.py +7 -1
- package/src/skcapstone/soul.py +3 -1
- package/src/skcapstone/soul_switch.py +3 -1
- package/src/skcapstone/summary.py +6 -6
- package/src/skcapstone/sync_engine.py +15 -15
- package/src/skcapstone/sync_watcher.py +2 -2
- package/src/skcapstone/systemd.py +72 -21
- package/src/skcapstone/team_comms.py +8 -8
- package/src/skcapstone/team_engine.py +1 -1
- package/src/skcapstone/testrunner.py +3 -3
- package/src/skcapstone/trust_graph.py +40 -5
- package/src/skcapstone/unified_search.py +15 -6
- package/src/skcapstone/uninstall_wizard.py +11 -3
- package/src/skcapstone/version_check.py +8 -4
- package/src/skcapstone/warmth_anchor.py +4 -2
- package/src/skcapstone/whoami.py +4 -4
- package/systemd/skcapstone.service +4 -6
- package/systemd/skcapstone@.service +7 -8
- package/systemd/skcomms-heartbeat.service +21 -0
- package/systemd/skcomms-heartbeat.timer +12 -0
- package/systemd/skcomms-queue-drain.service +17 -0
- package/systemd/skcomms-queue-drain.timer +12 -0
- package/tests/conftest.py +39 -0
- package/tests/integration/test_consciousness_e2e.py +39 -39
- package/tests/test_agent_card.py +1 -1
- package/tests/test_agent_home_scaffold.py +34 -0
- package/tests/test_alerts_consumer_topics.py +27 -0
- package/tests/test_backup.py +2 -1
- package/tests/test_chat.py +6 -6
- package/tests/test_claude_md.py +2 -2
- package/tests/test_cli_skills.py +10 -10
- package/tests/test_cli_test_cmd.py +4 -4
- package/tests/test_cli_test_connection.py +1 -1
- package/tests/test_cloud9_bridge.py +6 -6
- package/tests/test_consciousness_e2e.py +1 -1
- package/tests/test_consciousness_loop.py +10 -10
- package/tests/test_coordination.py +25 -0
- package/tests/test_cross_package.py +21 -21
- package/tests/test_daemon.py +4 -4
- package/tests/test_daemon_shutdown.py +1 -1
- package/tests/test_docker_provider.py +29 -29
- package/tests/test_doctor.py +400 -0
- package/tests/test_doctor_skscheduler.py +50 -0
- package/tests/test_dreaming_engine.py +147 -0
- package/tests/test_dreaming_gtd_capture.py +35 -0
- package/tests/test_e2e_automated.py +8 -5
- package/tests/test_fuse_mount.py +10 -10
- package/tests/test_gtd_brief.py +46 -0
- package/tests/test_gtd_malformed_tolerance.py +31 -0
- package/tests/test_housekeeping.py +15 -15
- package/tests/test_identity_migrate.py +251 -0
- package/tests/test_integration_backbone.py +598 -0
- package/tests/test_itil_gtd_lifecycle.py +37 -0
- package/tests/test_jobs_dropins.py +84 -0
- package/tests/test_mcp_server.py +82 -37
- package/tests/test_models.py +48 -4
- package/tests/test_multi_agent.py +31 -29
- package/tests/test_notifications.py +122 -32
- package/tests/test_onboard.py +63 -75
- package/tests/test_operator_link.py +78 -0
- package/tests/test_peers.py +14 -14
- package/tests/test_pillars.py +98 -0
- package/tests/test_preflight.py +3 -3
- package/tests/test_runtime.py +21 -0
- package/tests/test_scheduled_tasks.py +11 -6
- package/tests/test_scheduler_cli.py +47 -0
- package/tests/test_scheduler_features.py +133 -0
- package/tests/test_scheduler_integration.py +87 -0
- package/tests/test_scheduler_jobs.py +155 -0
- package/tests/test_scheduler_runner.py +64 -0
- package/tests/test_scheduler_state.py +57 -0
- package/tests/test_sdk.py +70 -0
- package/tests/test_service_health_incidents.py +34 -0
- package/tests/test_service_registry.py +52 -0
- package/tests/test_session_briefing.py +130 -0
- package/tests/test_snapshots.py +4 -4
- package/tests/test_sync_pipeline.py +26 -26
- package/tests/test_team_comms.py +2 -2
- package/tests/test_testrunner.py +2 -2
- package/tests/test_trust_graph.py +18 -0
- package/tests/test_unified_search.py +2 -2
- package/tests/test_version_check.py +10 -0
- package/tests/test_version_cmd.py +8 -8
- package/tests/test_whoami.py +1 -1
- package/systemd/skcomm-heartbeat.service +0 -18
- package/systemd/skcomm-queue-drain.service +0 -17
- /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/package.json +0 -0
- /package/{openclaw-plugin → openclaw-plugin.archived-2026-04-23}/src/openclaw.plugin.json +0 -0
|
@@ -25,9 +25,9 @@ x-agent-defaults: &agent-defaults
|
|
|
25
25
|
- skcapstone-mcp
|
|
26
26
|
environment:
|
|
27
27
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
28
|
-
|
|
28
|
+
SKCOMMS_HOME: /skcomms
|
|
29
29
|
volumes:
|
|
30
|
-
-
|
|
30
|
+
- skcomms-data:/skcomms
|
|
31
31
|
|
|
32
32
|
services:
|
|
33
33
|
|
|
@@ -59,10 +59,10 @@ services:
|
|
|
59
59
|
AGENT_ROLE: manager
|
|
60
60
|
AGENT_MODEL: claude-sonnet-4-6
|
|
61
61
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
62
|
-
|
|
62
|
+
SKCOMMS_HOME: /skcomms
|
|
63
63
|
volumes:
|
|
64
64
|
- mini-team-manager-data:/agent
|
|
65
|
-
-
|
|
65
|
+
- skcomms-data:/skcomms
|
|
66
66
|
deploy:
|
|
67
67
|
resources:
|
|
68
68
|
limits:
|
|
@@ -85,10 +85,10 @@ services:
|
|
|
85
85
|
AGENT_ROLE: worker
|
|
86
86
|
AGENT_MODEL: claude-haiku-4-5-20251001
|
|
87
87
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
88
|
-
|
|
88
|
+
SKCOMMS_HOME: /skcomms
|
|
89
89
|
volumes:
|
|
90
90
|
- mini-team-worker-alpha-data:/agent
|
|
91
|
-
-
|
|
91
|
+
- skcomms-data:/skcomms
|
|
92
92
|
deploy:
|
|
93
93
|
resources:
|
|
94
94
|
limits:
|
|
@@ -111,10 +111,10 @@ services:
|
|
|
111
111
|
AGENT_ROLE: worker
|
|
112
112
|
AGENT_MODEL: claude-haiku-4-5-20251001
|
|
113
113
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
114
|
-
|
|
114
|
+
SKCOMMS_HOME: /skcomms
|
|
115
115
|
volumes:
|
|
116
116
|
- mini-team-worker-beta-data:/agent
|
|
117
|
-
-
|
|
117
|
+
- skcomms-data:/skcomms
|
|
118
118
|
deploy:
|
|
119
119
|
resources:
|
|
120
120
|
limits:
|
|
@@ -129,7 +129,7 @@ services:
|
|
|
129
129
|
# ── Volumes ──────────────────────────────────────────────────────────────
|
|
130
130
|
volumes:
|
|
131
131
|
skcapstone-mcp-data: {}
|
|
132
|
-
|
|
132
|
+
skcomms-data: {}
|
|
133
133
|
mini-team-manager-data: {}
|
|
134
134
|
mini-team-worker-alpha-data: {}
|
|
135
135
|
mini-team-worker-beta-data: {}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# docker compose up -d
|
|
10
10
|
#
|
|
11
11
|
# Key points:
|
|
12
|
-
# - security-sentinel has read-only access to /
|
|
12
|
+
# - security-sentinel has read-only access to /skcomms for audit trails
|
|
13
13
|
# - monitor polls heartbeats every 30m via the MCP heartbeat tools
|
|
14
14
|
# - ops-agent handles restarts, rotations, and scaling via trustee_* tools
|
|
15
15
|
|
|
@@ -53,10 +53,10 @@ services:
|
|
|
53
53
|
AGENT_MODEL: claude-sonnet-4-6
|
|
54
54
|
SOUL_BLUEPRINT: souls/ops-lead.yaml
|
|
55
55
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
56
|
-
|
|
56
|
+
SKCOMMS_HOME: /skcomms
|
|
57
57
|
volumes:
|
|
58
58
|
- ops-team-ops-lead-data:/agent
|
|
59
|
-
-
|
|
59
|
+
- skcomms-data:/skcomms
|
|
60
60
|
deploy:
|
|
61
61
|
resources:
|
|
62
62
|
limits:
|
|
@@ -82,10 +82,10 @@ services:
|
|
|
82
82
|
AGENT_MODEL: claude-sonnet-4-6
|
|
83
83
|
SOUL_BLUEPRINT: souls/sentinel.yaml
|
|
84
84
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
85
|
-
|
|
85
|
+
SKCOMMS_HOME: /skcomms
|
|
86
86
|
volumes:
|
|
87
87
|
- ops-team-security-sentinel-data:/agent
|
|
88
|
-
-
|
|
88
|
+
- skcomms-data:/skcomms:ro
|
|
89
89
|
deploy:
|
|
90
90
|
resources:
|
|
91
91
|
limits:
|
|
@@ -109,12 +109,12 @@ services:
|
|
|
109
109
|
AGENT_ROLE: ops
|
|
110
110
|
AGENT_MODEL: claude-haiku-4-5-20251001
|
|
111
111
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
112
|
-
|
|
112
|
+
SKCOMMS_HOME: /skcomms
|
|
113
113
|
# Poll interval for heartbeat checks (seconds)
|
|
114
114
|
MONITOR_INTERVAL: "1800"
|
|
115
115
|
volumes:
|
|
116
116
|
- ops-team-monitor-data:/agent
|
|
117
|
-
-
|
|
117
|
+
- skcomms-data:/skcomms
|
|
118
118
|
deploy:
|
|
119
119
|
resources:
|
|
120
120
|
limits:
|
|
@@ -139,12 +139,12 @@ services:
|
|
|
139
139
|
AGENT_ROLE: ops
|
|
140
140
|
AGENT_MODEL: claude-haiku-4-5-20251001
|
|
141
141
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
142
|
-
|
|
142
|
+
SKCOMMS_HOME: /skcomms
|
|
143
143
|
# Docker socket for trustee operations (restart, rotate, scale)
|
|
144
144
|
DOCKER_HOST: "unix:///var/run/docker.sock"
|
|
145
145
|
volumes:
|
|
146
146
|
- ops-team-ops-agent-data:/agent
|
|
147
|
-
-
|
|
147
|
+
- skcomms-data:/skcomms
|
|
148
148
|
# Bind Docker socket so the ops agent can restart containers
|
|
149
149
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
150
150
|
deploy:
|
|
@@ -161,7 +161,7 @@ services:
|
|
|
161
161
|
# ── Volumes ──────────────────────────────────────────────────────────────
|
|
162
162
|
volumes:
|
|
163
163
|
skcapstone-mcp-data: {}
|
|
164
|
-
|
|
164
|
+
skcomms-data: {}
|
|
165
165
|
ops-team-ops-lead-data: {}
|
|
166
166
|
ops-team-security-sentinel-data: {}
|
|
167
167
|
ops-team-monitor-data: {}
|
|
@@ -18,7 +18,7 @@ x-agent-defaults: &agent-defaults
|
|
|
18
18
|
networks:
|
|
19
19
|
- skcapstone
|
|
20
20
|
volumes:
|
|
21
|
-
-
|
|
21
|
+
- skcomms-data:/skcomms
|
|
22
22
|
|
|
23
23
|
services:
|
|
24
24
|
|
|
@@ -52,10 +52,10 @@ services:
|
|
|
52
52
|
AGENT_MODEL: claude-opus-4-6
|
|
53
53
|
SOUL_BLUEPRINT: souls/research-lead.yaml
|
|
54
54
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
55
|
-
|
|
55
|
+
SKCOMMS_HOME: /skcomms
|
|
56
56
|
volumes:
|
|
57
57
|
- research-team-research-lead-data:/agent
|
|
58
|
-
-
|
|
58
|
+
- skcomms-data:/skcomms
|
|
59
59
|
deploy:
|
|
60
60
|
resources:
|
|
61
61
|
limits:
|
|
@@ -81,10 +81,10 @@ services:
|
|
|
81
81
|
AGENT_MODEL: claude-sonnet-4-6
|
|
82
82
|
SOUL_BLUEPRINT: souls/researcher.yaml
|
|
83
83
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
84
|
-
|
|
84
|
+
SKCOMMS_HOME: /skcomms
|
|
85
85
|
volumes:
|
|
86
86
|
- research-team-researcher-alpha-data:/agent
|
|
87
|
-
-
|
|
87
|
+
- skcomms-data:/skcomms
|
|
88
88
|
deploy:
|
|
89
89
|
resources:
|
|
90
90
|
limits:
|
|
@@ -110,10 +110,10 @@ services:
|
|
|
110
110
|
AGENT_MODEL: claude-sonnet-4-6
|
|
111
111
|
SOUL_BLUEPRINT: souls/researcher.yaml
|
|
112
112
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
113
|
-
|
|
113
|
+
SKCOMMS_HOME: /skcomms
|
|
114
114
|
volumes:
|
|
115
115
|
- research-team-researcher-beta-data:/agent
|
|
116
|
-
-
|
|
116
|
+
- skcomms-data:/skcomms
|
|
117
117
|
deploy:
|
|
118
118
|
resources:
|
|
119
119
|
limits:
|
|
@@ -140,10 +140,10 @@ services:
|
|
|
140
140
|
AGENT_MODEL: claude-sonnet-4-6
|
|
141
141
|
SOUL_BLUEPRINT: souls/analyst.yaml
|
|
142
142
|
SKCAPSTONE_MCP_HOST: "skcapstone-mcp:8765"
|
|
143
|
-
|
|
143
|
+
SKCOMMS_HOME: /skcomms
|
|
144
144
|
volumes:
|
|
145
145
|
- research-team-analyst-data:/agent
|
|
146
|
-
-
|
|
146
|
+
- skcomms-data:/skcomms
|
|
147
147
|
deploy:
|
|
148
148
|
resources:
|
|
149
149
|
limits:
|
|
@@ -158,7 +158,7 @@ services:
|
|
|
158
158
|
# ── Volumes ──────────────────────────────────────────────────────────────
|
|
159
159
|
volumes:
|
|
160
160
|
skcapstone-mcp-data: {}
|
|
161
|
-
|
|
161
|
+
skcomms-data: {}
|
|
162
162
|
research-team-research-lead-data: {}
|
|
163
163
|
research-team-researcher-alpha-data: {}
|
|
164
164
|
research-team-researcher-beta-data: {}
|
package/docker/entrypoint.sh
CHANGED
|
@@ -19,9 +19,9 @@ CONFIG_FILE="/agent/config.json"
|
|
|
19
19
|
MCP_CONFIG_FILE="/agent/mcp_config.json"
|
|
20
20
|
STATE_FILE="/agent/session_state.json"
|
|
21
21
|
LOG_FILE="/agent/agent.log"
|
|
22
|
-
|
|
23
|
-
INBOX_DIR="${
|
|
24
|
-
OUTBOX_DIR="${
|
|
22
|
+
SKCOMMS_HOME="${SKCOMMS_HOME:-/skcomms}"
|
|
23
|
+
INBOX_DIR="${SKCOMMS_HOME}/${TEAM_NAME}/${AGENT_NAME}/inbox"
|
|
24
|
+
OUTBOX_DIR="${SKCOMMS_HOME}/${TEAM_NAME}/${AGENT_NAME}/outbox"
|
|
25
25
|
|
|
26
26
|
# ---------------------------------------------------------------------------
|
|
27
27
|
# Helpers
|
|
@@ -146,7 +146,7 @@ SYSTEM_PROMPT_FILE="/agent/system_prompt.txt"
|
|
|
146
146
|
} > "$SYSTEM_PROMPT_FILE"
|
|
147
147
|
|
|
148
148
|
# ---------------------------------------------------------------------------
|
|
149
|
-
# Set up
|
|
149
|
+
# Set up SKComms directories
|
|
150
150
|
# ---------------------------------------------------------------------------
|
|
151
151
|
|
|
152
152
|
mkdir -p "$INBOX_DIR" "$OUTBOX_DIR" /agent/memory /agent/scratch
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# ADR: skcapstone as the Optional Integration Backbone for the sk* Ecosystem
|
|
2
|
+
|
|
3
|
+
**Status:** Accepted — **fully implemented 2026-06-09** (backbone + 8 adapters + dual-mode harness)
|
|
4
|
+
**Author:** Opus (application architect), commissioned by Chef
|
|
5
|
+
**Scope:** skcapstone + all sk* consumer services (skmemory, skcomms, skchat, sksecurity, capauth, skvoice, skseed, cloud9, skgateway)
|
|
6
|
+
|
|
7
|
+
> **Implementation status (2026-06-09):** The full backbone is live and tested in
|
|
8
|
+
> skcapstone (208 tests green):
|
|
9
|
+
> - `skcapstone.sdk` stable facade — `is_available / alert / register_job /
|
|
10
|
+
> unregister_job / coord_create / register_service` (`src/skcapstone/sdk.py`).
|
|
11
|
+
> - Scheduler `jobs.d/` drop-in merge + `register_job()` (`scheduler_jobs.py`:
|
|
12
|
+
> `load_jobs_with_dropins`); runtime callers (daemon scheduled_tasks, scheduler
|
|
13
|
+
> CLI, doctor) repointed to the merged loader.
|
|
14
|
+
> - Canonical alert sink: `sdk.alert()` → PubSub topic `<service>.<severity>`
|
|
15
|
+
> (+ notify on warn/error/critical); `skcapstone alerts` now subscribes to
|
|
16
|
+
> `*.critical|*.error|*.warn` and styles consumer topics by severity suffix.
|
|
17
|
+
> - Discovery: `sdk.register_service()` writes `~/.skcapstone/registry/<name>.json`;
|
|
18
|
+
> `service_health.check_all_services()` unions the registry with built-in defaults.
|
|
19
|
+
>
|
|
20
|
+
> Consumers can now code against `skcapstone.sdk` immediately. **skcomms is folding
|
|
21
|
+
> into skcomms** (canonical pivot) — target skcomms for that adapter.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. Problem
|
|
26
|
+
|
|
27
|
+
skcapstone already ships the primitives a distributed agent ecosystem needs — alerting
|
|
28
|
+
(`PubSub` → Telegram/desktop), a config-driven job scheduler (`scheduler_*`), a coordination
|
|
29
|
+
board (`coordination.Board`), and service health checks (`service_health`). **But no consumer
|
|
30
|
+
service uses any of them.** A deep-dive audit (2026-06-09) found:
|
|
31
|
+
|
|
32
|
+
- **Zero hard dependencies.** No sk* repo imports `skcapstone` at runtime; none list it in
|
|
33
|
+
`pyproject.toml`/`package.json`. Good for sovereignty — bad for cohesion.
|
|
34
|
+
- **Alerting is fragmented.** skmemory → its own Telegram; skchat → `notify-send`;
|
|
35
|
+
sksecurity → its own dashboard; most → nothing. No common sink.
|
|
36
|
+
- **Scheduling is decentralized.** Every service rolls its own: `PromotionScheduler`,
|
|
37
|
+
threading daemons, `while True` loops, per-repo systemd timers / launchd plists. None
|
|
38
|
+
register with skcapstone's scheduler.
|
|
39
|
+
- **No discovery.** `service_health` health-checks a *hardcoded* list of services; there is
|
|
40
|
+
no registry a service can join.
|
|
41
|
+
|
|
42
|
+
The goal Chef set: **every sk* service should, by default, use skcapstone's sk-alert and
|
|
43
|
+
skscheduler when skcapstone is installed — and continue to run fully standalone when it is
|
|
44
|
+
not.** skcapstone is the integration backbone; consumers are sovereign.
|
|
45
|
+
|
|
46
|
+
## 2. Design Principles
|
|
47
|
+
|
|
48
|
+
1. **Optional-by-presence, default-on.** If `skcapstone` importable (or its daemon reachable),
|
|
49
|
+
route through it automatically. If not, fall back to the service's native mechanism. No
|
|
50
|
+
config flag required to get the integrated path — presence *is* the signal. A
|
|
51
|
+
`SK_STANDALONE=1` escape hatch forces native mode even when skcapstone is present.
|
|
52
|
+
2. **No new hard dependency.** skcapstone stays an `extras_require`/optional install. Standalone
|
|
53
|
+
must remain a first-class, tested mode.
|
|
54
|
+
3. **One stable contract.** Consumers code against a small, frozen public facade
|
|
55
|
+
(`skcapstone.sdk`), never against internal modules (`pubsub`, `scheduler_runner`, …). The
|
|
56
|
+
facade is the only thing we promise not to break.
|
|
57
|
+
4. **Graceful degradation is idiomatic** (the `try/except ImportError → None → capability
|
|
58
|
+
check` pattern skcapstone already uses internally).
|
|
59
|
+
5. **Polyglot.** Python services import the SDK in-process; Node (`skgateway`) and any
|
|
60
|
+
non-Python service integrate via the skcapstone daemon's HTTP/MCP endpoint.
|
|
61
|
+
|
|
62
|
+
## 3. Target Architecture
|
|
63
|
+
|
|
64
|
+
### 3.1 The stable SDK facade — `skcapstone.sdk` (new)
|
|
65
|
+
|
|
66
|
+
A thin, versioned public module wrapping the existing internals. The **only** surface
|
|
67
|
+
consumers import:
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
# skcapstone/sdk.py (stable, semver-tracked)
|
|
71
|
+
def is_available() -> bool: ... # in-proc + daemon presence
|
|
72
|
+
def alert(topic: str, payload: dict, *, level: str = "info",
|
|
73
|
+
notify: bool = False) -> bool: ... # wraps PubSub.publish (+ notify path)
|
|
74
|
+
def register_job(spec: dict) -> Path: ... # writes a jobs.d/ drop-in fragment
|
|
75
|
+
def unregister_job(name: str) -> None: ...
|
|
76
|
+
def coord_create(title: str, **kw) -> str: ... # wraps coordination.Board
|
|
77
|
+
def register_service(name: str, health_url: str | None = None,
|
|
78
|
+
pid_file: str | None = None) -> None: ... # discovery
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Implementation note: `alert()` wraps `PubSub.publish(topic, payload)` and, when `notify=True`
|
|
82
|
+
or `level` ≥ warn, the existing notification/Telegram path. `register_job()` solves the
|
|
83
|
+
"scheduler is config-only" gap (see 3.2).
|
|
84
|
+
|
|
85
|
+
### 3.2 Scheduler drop-in registration — `jobs.d/`
|
|
86
|
+
|
|
87
|
+
Today jobs live in a single static `~/.skcapstone/config/jobs.yaml`. External services cannot
|
|
88
|
+
self-register. Add a **conf.d-style drop-in directory**: `load_jobs()` merges
|
|
89
|
+
`~/.skcapstone/config/jobs.yaml` **plus** every `~/.skcapstone/config/jobs.d/*.yaml`. A service
|
|
90
|
+
calls `sdk.register_job({...})` which writes `jobs.d/<service>.yaml`. Standalone services keep
|
|
91
|
+
their native systemd timer; integrated services let the skcapstone daemon own the cadence
|
|
92
|
+
(single scheduler, central retry/notify/jitter, cross-host `nodes:` placement).
|
|
93
|
+
|
|
94
|
+
### 3.3 Consumer-side adapter (the pattern every repo implements)
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
# <service>/integration.py
|
|
98
|
+
import os
|
|
99
|
+
try:
|
|
100
|
+
from skcapstone import sdk as _sk
|
|
101
|
+
_HAS = (not os.environ.get("SK_STANDALONE")) and _sk.is_available()
|
|
102
|
+
except ImportError:
|
|
103
|
+
_sk, _HAS = None, False
|
|
104
|
+
|
|
105
|
+
def alert(topic, payload, level="info"):
|
|
106
|
+
if _HAS:
|
|
107
|
+
return _sk.alert(f"{SERVICE}.{topic}", payload, level=level, notify=level in ("warn","error","critical"))
|
|
108
|
+
return _native_alert(topic, payload, level) # existing Telegram/notify-send/log
|
|
109
|
+
|
|
110
|
+
def ensure_schedule():
|
|
111
|
+
if _HAS:
|
|
112
|
+
_sk.register_job(_job_spec()) # central scheduler owns cadence
|
|
113
|
+
else:
|
|
114
|
+
_ensure_native_timer() # existing systemd/thread loop
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 3.4 Discovery
|
|
118
|
+
|
|
119
|
+
Extend `service_health` from a hardcoded list to a registry: services call
|
|
120
|
+
`sdk.register_service(name, health_url=…, pid_file=…)`, which writes
|
|
121
|
+
`~/.skcapstone/registry/<name>.json`; `check_all_services()` unions the registry with the known
|
|
122
|
+
defaults. Optional — health still works without it.
|
|
123
|
+
|
|
124
|
+
### 3.5 Polyglot bridge (skgateway / Node)
|
|
125
|
+
|
|
126
|
+
Non-Python services integrate **file-based** — writing the same Syncthing-synced tree under
|
|
127
|
+
`~/.skcapstone` that the Python SDK itself writes. This is preferred over the daemon HTTP/MCP
|
|
128
|
+
path because it is zero-broker and **daemon-independent** (the Python `sdk.alert` doesn't need
|
|
129
|
+
the daemon either — it writes pubsub files directly). Presence = the shared home exists and
|
|
130
|
+
`SK_STANDALONE` is unset. A Node `alert()` mirrors `pubsub.PubSub.publish`'s message format
|
|
131
|
+
(`message_id`/`topic`/`sender`/`payload`/`published_at` ISO-8601/`ttl_seconds`/`tags`) and
|
|
132
|
+
`registerService()` mirrors `sdk.register_service`'s registry entry, so Python consumers
|
|
133
|
+
(`skcapstone alerts`, `service_health`) read them transparently. **Validated** end-to-end:
|
|
134
|
+
skgateway's Node `alert()` → `PubSub.poll()` in Python round-trips intact (see
|
|
135
|
+
`skgateway/src/integration.mjs`, `tests/integration.test.mjs`). Services that genuinely need
|
|
136
|
+
live request/response (not fire-and-forget) can still call the daemon MCP endpoint
|
|
137
|
+
(`:9475`) — but alerts/discovery do not.
|
|
138
|
+
|
|
139
|
+
## 4. Integration Contract (frozen surface)
|
|
140
|
+
|
|
141
|
+
| Capability | Integrated path (skcapstone present) | Standalone fallback |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| Alert / notify | `sdk.alert()` → PubSub topic `<svc>.<sev>` → notify/Telegram | service-native (Telegram / notify-send / log) |
|
|
144
|
+
| Scheduled work | `sdk.register_job()` → `jobs.d/<svc>.yaml` → daemon scheduler | service-native systemd timer / thread loop |
|
|
145
|
+
| Coordination | `sdk.coord_create()` | n/a (no-op / local log) |
|
|
146
|
+
| Discovery/health | `sdk.register_service()` → registry | service-native pid/log |
|
|
147
|
+
| Topic naming | `<service>.<severity>` (e.g. `skmemory.error`); the semantic **event name goes in the payload** (`{"event": "sweep_failed", …}`), NOT the topic suffix — this is what lets `skcapstone alerts` (`*.error`/`*.critical`/`*.warn`) route by severity | — |
|
|
148
|
+
| Escape hatch | `SK_STANDALONE=1` forces native even if present | default |
|
|
149
|
+
|
|
150
|
+
## 5. Acceptance (system-level)
|
|
151
|
+
|
|
152
|
+
- Each consumer passes its test suite **with skcapstone absent** (import-time and runtime).
|
|
153
|
+
- With skcapstone present, alerts land on PubSub topics and jobs appear in `skcapstone scheduler list`.
|
|
154
|
+
- No consumer adds a hard `skcapstone` dependency; integration lives behind `extras_require`/optional import.
|
|
155
|
+
- `SK_STANDALONE=1` forces native mode end-to-end.
|
|
156
|
+
|
|
157
|
+
## 6. Reference Implementation
|
|
158
|
+
|
|
159
|
+
**The canonical adapter pattern is `skmemory/skmemory/integration.py`** (commit `be33179`).
|
|
160
|
+
|
|
161
|
+
Copy this file to build a new adapter. It demonstrates:
|
|
162
|
+
- The optional `try/except` import guard
|
|
163
|
+
- The `is_present()` / `alert()` / `ensure_schedule()` / `unregister_schedule()` / `register_self()` public API
|
|
164
|
+
- Topic naming: `<service>.<severity>` with the semantic event name in `payload["event"]`
|
|
165
|
+
- The severity → notify escalation (`warn`/`error`/`critical` trigger Telegram/desktop)
|
|
166
|
+
|
|
167
|
+
All 8 current adapters follow this pattern:
|
|
168
|
+
`skmemory` · `sksecurity` · `skgateway` (Node, file-based) · `skcomms` · `capauth` ·
|
|
169
|
+
`cloud9` · `skvoice` · `skseed`
|
|
170
|
+
|
|
171
|
+
The dual-mode acceptance harness is `skcapstone/tests/test_integration_backbone.py`.
|
|
172
|
+
|
|
173
|
+
## 7. Work Breakdown (see coord board, tag `sk-integration`)
|
|
174
|
+
|
|
175
|
+
- **Backbone (skcapstone):** `skcapstone.sdk` facade · `jobs.d/` drop-in + `register_job()` ·
|
|
176
|
+
canonical alert sink + topic convention · service registry in `service_health`.
|
|
177
|
+
- **Per-consumer adapters:** skmemory (reference) · sksecurity · skgateway (Node) · skcomms ·
|
|
178
|
+
capauth · cloud9 · skvoice · skseed — **all DONE**. skchat (`ad4f721a`) owned by separate
|
|
179
|
+
thread.
|
|
180
|
+
- **Cross-cutting:** dual-mode integration test harness (114 tests green) · per-repo README
|
|
181
|
+
"integration modes + `~/.skcapstone/` filesystem contract" sections — **all DONE**.
|