@sibyllinesoft/smith-installer 0.1.1

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.
@@ -0,0 +1,289 @@
1
+ ---
2
+ description: Configure chat platform bridges by selecting platforms, collecting credentials, and writing bridge config
3
+ ---
4
+ # Setup Chat Bridge
5
+
6
+ Run these read-only inspection commands to understand the current state:
7
+
8
+ ```bash
9
+ # Check if config already exists
10
+ cat config/chat-bridge.toml 2>/dev/null || echo "NO_CONFIG"
11
+
12
+ # Check which gateway secrets are already set in .env
13
+ grep -E '^(DISCORD_BOT_TOKEN|TELEGRAM_BOT_TOKEN|SLACK_BOT_TOKEN|SLACK_APP_TOKEN|TEAMS_TENANT_ID|WHATSAPP_ACCESS_TOKEN|MATRIX_ACCESS_TOKEN|SIGNAL_RECIPIENT|MATTERMOST_TOKEN|GOOGLE_CHAT_WEBHOOK_URL)=' .env 2>/dev/null | sed 's/=.*/=<set>/'
14
+ ```
15
+
16
+ ## What It Does
17
+
18
+ This skill interactively configures one or more chat platform bridges by:
19
+
20
+ 1. Asking the user which platforms they want to connect.
21
+ 2. Walking them through creating bot credentials on each platform.
22
+ 3. Writing `config/chat-bridge.toml` with the correct adapter stanzas.
23
+ 4. Setting the required env vars in `.env`.
24
+
25
+ ## Interactive Flow
26
+
27
+ Ask the user which platform(s) they want to configure. For each selected platform, walk through the setup guide below, collect the credentials, then write config and env vars.
28
+
29
+ ## Platform Setup Guides
30
+
31
+ ### Discord
32
+
33
+ 1. Go to https://discord.com/developers/applications
34
+ 2. Click **New Application**, give it a name, click **Create**.
35
+ 3. Go to **Bot** in the left sidebar, click **Reset Token**, copy the token.
36
+ 4. Under **Privileged Gateway Intents**, enable **Message Content Intent**.
37
+ 5. Go to **OAuth2 > URL Generator**, select scopes `bot` + `applications.commands`, permissions `Send Messages` + `Read Message History`.
38
+ 6. Open the generated URL to invite the bot to your server.
39
+
40
+ **Credentials needed:** Bot Token, Application ID (from General Information page)
41
+
42
+ **TOML stanza:**
43
+
44
+ ```toml
45
+ [[adapters]]
46
+ type = "discord"
47
+ bot_token = "<DISCORD_BOT_TOKEN>"
48
+ application_id = "<APPLICATION_ID>"
49
+ ```
50
+
51
+ **Env vars:** `DISCORD_BOT_TOKEN`
52
+
53
+ ### Telegram
54
+
55
+ 1. Open https://t.me/BotFather in Telegram.
56
+ 2. Send `/newbot`, follow prompts to choose a name and username.
57
+ 3. Copy the bot token BotFather gives you.
58
+
59
+ **Credentials needed:** Bot Token
60
+
61
+ **TOML stanza:**
62
+
63
+ ```toml
64
+ [[adapters]]
65
+ type = "telegram"
66
+ bot_token = "<TELEGRAM_BOT_TOKEN>"
67
+ ```
68
+
69
+ **Env vars:** `TELEGRAM_BOT_TOKEN`
70
+
71
+ ### Slack
72
+
73
+ 1. Go to https://api.slack.com/apps and click **Create New App > From scratch**.
74
+ 2. Under **Socket Mode**, enable it and generate an App-Level Token (begins with `xapp-`).
75
+ 3. Under **OAuth & Permissions**, add bot scopes: `chat:write`, `channels:history`, `groups:history`, `im:history`, `mpim:history`.
76
+ 4. Install the app to your workspace and copy the Bot User OAuth Token (begins with `xoxb-`).
77
+ 5. Under **Event Subscriptions**, enable events and subscribe to `message.channels`, `message.groups`, `message.im`, `message.mpim`.
78
+
79
+ **Credentials needed:** App Token (`xapp-...`), Bot Token (`xoxb-...`)
80
+
81
+ **TOML stanza:**
82
+
83
+ ```toml
84
+ [[adapters]]
85
+ type = "slack"
86
+ bot_token = "<SLACK_BOT_TOKEN>"
87
+ app_token = "<SLACK_APP_TOKEN>"
88
+ ```
89
+
90
+ **Env vars:** `SLACK_APP_TOKEN`, `SLACK_BOT_TOKEN`
91
+
92
+ ### Microsoft Teams
93
+
94
+ 1. Go to https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps
95
+ 2. Click **New registration**, name it, select **Accounts in this organizational directory only**.
96
+ 3. Under **Certificates & secrets**, create a new client secret and copy it.
97
+ 4. Note the **Application (client) ID** and **Directory (tenant) ID** from the Overview page.
98
+ 5. Under **API permissions**, add `ChannelMessage.Read.All`, `ChannelMessage.Send`, `Team.ReadBasic.All` (application permissions), then grant admin consent.
99
+ 6. Get the Team ID and Channel ID from Teams (right-click channel > Get link to channel).
100
+
101
+ **Credentials needed:** Tenant ID, Client ID, Client Secret, Team ID, Channel ID
102
+
103
+ **TOML stanza:**
104
+
105
+ ```toml
106
+ [[adapters]]
107
+ type = "teams"
108
+ tenant_id = "<TEAMS_TENANT_ID>"
109
+ client_id = "<TEAMS_CLIENT_ID>"
110
+ client_secret = "<TEAMS_CLIENT_SECRET>"
111
+ team_id = "<TEAM_ID>"
112
+ channel_id = "<CHANNEL_ID>"
113
+ ```
114
+
115
+ **Env vars:** `TEAMS_TENANT_ID`, `TEAMS_CLIENT_ID`, `TEAMS_CLIENT_SECRET`
116
+
117
+ ### Mattermost
118
+
119
+ 1. In your Mattermost instance, go to **Integrations > Bot Accounts > Add Bot Account**.
120
+ 2. Copy the access token.
121
+ 3. Note the Team ID and Channel ID from the channel URL or API.
122
+
123
+ **Credentials needed:** Base URL (your Mattermost server), Access Token, Team ID, Channel ID
124
+
125
+ **TOML stanza:**
126
+
127
+ ```toml
128
+ [[adapters]]
129
+ type = "mattermost"
130
+ base_url = "<MATTERMOST_URL>"
131
+ access_token = "<MATTERMOST_TOKEN>"
132
+ team_id = "<TEAM_ID>"
133
+ channel_id = "<CHANNEL_ID>"
134
+ ```
135
+
136
+ **Env vars:** `MATTERMOST_TOKEN`
137
+
138
+ ### WhatsApp
139
+
140
+ 1. Go to https://developers.facebook.com/apps and create a new **Business** app.
141
+ 2. Add the **WhatsApp** product.
142
+ 3. Under **WhatsApp > API Setup**, copy the temporary Access Token, Phone Number ID, and Business Account ID.
143
+ 4. For production, create a System User token with `whatsapp_business_messaging` permission.
144
+
145
+ **Credentials needed:** Access Token, Phone Number ID, Business Account ID
146
+
147
+ **TOML stanza:**
148
+
149
+ ```toml
150
+ [[adapters]]
151
+ type = "whatsapp"
152
+ access_token = "<WHATSAPP_ACCESS_TOKEN>"
153
+ phone_number_id = "<PHONE_NUMBER_ID>"
154
+ business_account_id = "<BUSINESS_ACCOUNT_ID>"
155
+ ```
156
+
157
+ **Env vars:** `WHATSAPP_ACCESS_TOKEN`
158
+
159
+ ### Matrix
160
+
161
+ 1. On your Matrix homeserver, create a bot user or use an existing account.
162
+ 2. Generate an access token via `curl -XPOST 'https://<homeserver>/_matrix/client/r0/login' -d '{"type":"m.login.password","user":"<username>","password":"<password>"}'`.
163
+ 3. Note the homeserver URL, access token, and full user ID (`@user:server`).
164
+
165
+ **Credentials needed:** Homeserver URL, Access Token, User ID
166
+
167
+ **TOML stanza:**
168
+
169
+ ```toml
170
+ [[adapters]]
171
+ type = "matrix"
172
+ homeserver_url = "<MATRIX_HOMESERVER>"
173
+ access_token = "<MATRIX_ACCESS_TOKEN>"
174
+ user_id = "<USER_ID>"
175
+ ```
176
+
177
+ **Env vars:** `MATRIX_HOMESERVER`, `MATRIX_ACCESS_TOKEN`
178
+
179
+ ### Signal
180
+
181
+ 1. Install `signal-cli` and register or link a phone number.
182
+ 2. Run `signal-cli` in daemon/JSON-RPC mode: `signal-cli -u +<NUMBER> daemon --json-rpc`.
183
+ 3. The default signal-cli URL is `http://127.0.0.1:8080`.
184
+
185
+ **Credentials needed:** Phone Number, signal-cli URL (if non-default)
186
+
187
+ **TOML stanza:**
188
+
189
+ ```toml
190
+ [[adapters]]
191
+ type = "signal"
192
+ phone_number = "<PHONE_NUMBER>"
193
+ signal_cli_url = "http://127.0.0.1:8080"
194
+ ```
195
+
196
+ **Env vars:** `SIGNAL_RECIPIENT`
197
+
198
+ ### Google Chat
199
+
200
+ 1. Go to https://console.cloud.google.com, create or select a project.
201
+ 2. Enable the **Google Chat API**.
202
+ 3. Create a **Service Account**, download the JSON key file.
203
+ 4. In **Google Chat API > Configuration**, configure the bot and note the Space ID.
204
+
205
+ **Credentials needed:** Path to service account JSON file, Space ID
206
+
207
+ **TOML stanza:**
208
+
209
+ ```toml
210
+ [[adapters]]
211
+ type = "google_chat"
212
+ service_account_json = "<PATH_TO_SERVICE_ACCOUNT_JSON>"
213
+ space_id = "<SPACE_ID>"
214
+ ```
215
+
216
+ **Env vars:** `GOOGLE_CHAT_WEBHOOK_URL`
217
+
218
+ ### iMessage (via BlueBubbles)
219
+
220
+ 1. Install and run BlueBubbles server on a Mac: https://bluebubbles.app
221
+ 2. Note the server URL and server password from BlueBubbles settings.
222
+
223
+ **Credentials needed:** Server URL, Server Password
224
+
225
+ **TOML stanza:**
226
+
227
+ ```toml
228
+ [[adapters]]
229
+ type = "imessage"
230
+ server_url = "<BLUEBUBBLES_SERVER_URL>"
231
+ server_password = "<SERVER_PASSWORD>"
232
+ ```
233
+
234
+ **Env vars:** None (config-only)
235
+
236
+ ## Mutation Commands
237
+
238
+ After collecting credentials from the user, write the config and env vars:
239
+
240
+ ### Write config/chat-bridge.toml
241
+
242
+ Assemble the file from the selected platform stanzas. Example for Discord + Telegram:
243
+
244
+ ```toml
245
+ [[adapters]]
246
+ type = "discord"
247
+ bot_token = "MTIz..."
248
+ application_id = "1234567890"
249
+
250
+ [[adapters]]
251
+ type = "telegram"
252
+ bot_token = "7654321:AAH..."
253
+ ```
254
+
255
+ ### Set env vars in .env
256
+
257
+ Use the idempotent pattern (same as `configure-agentd`):
258
+
259
+ ```bash
260
+ grep -q '^CHAT_BRIDGE_CONFIG=' .env || echo 'CHAT_BRIDGE_CONFIG=config/chat-bridge.toml' >> .env
261
+
262
+ # Generate a random admin token if not already set
263
+ grep -q '^CHAT_BRIDGE_ADMIN_TOKEN=.' .env || echo "CHAT_BRIDGE_ADMIN_TOKEN=$(openssl rand -hex 32)" >> .env
264
+
265
+ # Per-platform env vars (set for each configured platform)
266
+ grep -q '^DISCORD_BOT_TOKEN=' .env && sed -i 's|^DISCORD_BOT_TOKEN=.*|DISCORD_BOT_TOKEN=<collected-value>|' .env || echo 'DISCORD_BOT_TOKEN=<collected-value>' >> .env
267
+ ```
268
+
269
+ Repeat the `grep -q ... && sed -i ... || echo ...` pattern for each platform-specific env var.
270
+
271
+ ## Prerequisites
272
+
273
+ - `.env` exists (run `configure-agentd` first if missing).
274
+ - `config/` directory exists.
275
+
276
+ ## Expected Output
277
+
278
+ - `config/chat-bridge.toml` written with selected adapter stanzas.
279
+ - Platform credentials set in `.env`.
280
+ - `CHAT_BRIDGE_CONFIG` and `CHAT_BRIDGE_ADMIN_TOKEN` set in `.env`.
281
+
282
+ ## Common Failures
283
+
284
+ | Symptom | Cause | Fix |
285
+ |---------|-------|-----|
286
+ | `.env` does not exist | `configure-agentd` not run | Run `configure-agentd` skill first |
287
+ | `config/` directory missing | Not at repository root | `cd` to smith-core root |
288
+ | Invalid bot token at runtime | Token was revoked or mistyped | Re-run this skill to update credentials |
289
+ | TOML parse error on daemon start | Malformed config | Check quoting in `config/chat-bridge.toml` |
@@ -0,0 +1,55 @@
1
+ ---
2
+ description: Start agentd with committed baseline config and verify process health
3
+ ---
4
+ # Start Agentd
5
+
6
+ Run:
7
+
8
+ ```bash
9
+ cargo run --manifest-path agent/agentd/Cargo.toml --features grpc --bin agentd -- run \
10
+ --config ${AGENTD_CONFIG:-agent/agentd/config/agentd.toml} \
11
+ --capability-digest ${AGENTD_CAPABILITY_DIGEST:-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef}
12
+ ```
13
+
14
+ ## What It Does
15
+
16
+ This skill launches `agentd` directly from source using the valid CLI shape.
17
+
18
+ 1. Runs the explicit `agentd` bin target (multi-bin workspace-safe).
19
+ 2. Enables gRPC feature for Envoy JSON transcoding compatibility.
20
+ 3. Uses committed `agentd` config instead of insecure fallback parsing.
21
+ 4. Supplies required `--capability-digest` argument.
22
+
23
+ ## Prerequisites
24
+
25
+ - `agentd` build completed successfully.
26
+ - Required infrastructure services available if runtime depends on them.
27
+
28
+ ## Expected Output
29
+
30
+ - Process starts without immediate panic.
31
+ - Startup logs indicate daemon initialization and gRPC listener startup.
32
+
33
+ ## Reading Results
34
+
35
+ - Keep process attached while testing bridge/gateway flows.
36
+ - If process exits, inspect final error lines for missing config or dependency issues.
37
+ - On macOS, ensure `.env` includes `SMITH_EXECUTOR_VM_POOL_ENABLED=true` and
38
+ `SMITH_EXECUTOR_VM_METHOD=gondolin` to use the Gondolin sandbox path.
39
+
40
+ ## Common Failures
41
+
42
+ | Symptom | Cause | Fix |
43
+ |---------|-------|-----|
44
+ | `could not determine which binary to run` | Missing `--bin agentd` | Use full command shown above |
45
+ | `Failed to load config` | Wrong/missing config path | Set `AGENTD_CONFIG` to a valid agentd TOML |
46
+ | `Refusing all-zero capability digest` | Placeholder digest left at zero | Set real `AGENTD_CAPABILITY_DIGEST`, or opt in with `SMITH_ALLOW_ZERO_CAPABILITY_DIGEST=1` for local-only testing |
47
+ | `--capability-digest` required | Missing mandatory flag | Provide 64-char hex digest (env or inline) |
48
+ | Port already in use | Conflicting process | Stop conflicting process or change `AGENTD_GRPC_LISTEN` |
49
+ | Cannot connect to NATS/DB | Stack not running or wrong URL | Start stack and fix endpoint vars |
50
+ | TLS-related errors | Missing cert files for strict modes | Generate certs and verify mounts/env |
51
+
52
+ ## Notes
53
+
54
+ Use a separate terminal session so logs remain visible during installer verification.
55
+ For development-only fallback behavior, run the same command with `SMITH_EXECUTOR_ALLOW_INSECURE_FALLBACK=1 SMITH_ALLOW_ZERO_CAPABILITY_DIGEST=1`.
@@ -0,0 +1,109 @@
1
+ ---
2
+ description: Start the chat bridge daemon and platform gateway processes
3
+ ---
4
+ # Start Chat Bridge
5
+
6
+ Run these read-only inspection commands to understand the current state:
7
+
8
+ ```bash
9
+ # Verify config exists
10
+ test -f "${CHAT_BRIDGE_CONFIG:-config/chat-bridge.toml}" && echo "CONFIG_OK" || echo "NO_CONFIG"
11
+
12
+ # Check which platforms are configured
13
+ grep '^type = ' "${CHAT_BRIDGE_CONFIG:-config/chat-bridge.toml}" 2>/dev/null
14
+
15
+ # Check if daemon/gateways are already running
16
+ pgrep -f smith-chat-daemon && echo "DAEMON_RUNNING" || echo "DAEMON_NOT_RUNNING"
17
+ pgrep -af 'smith-.*-gateway' 2>/dev/null || echo "NO_GATEWAYS_RUNNING"
18
+ ```
19
+
20
+ ## What It Does
21
+
22
+ This skill starts the chat bridge daemon and the correct gateway binary for each configured platform adapter. The daemon handles inbound message routing, session management, and the admin/webhook API. Each gateway connects to its platform (Discord WebSocket, Telegram polling, etc.) and publishes messages to NATS for the daemon to consume.
23
+
24
+ ## Start Sequence
25
+
26
+ ### 1. Start the daemon
27
+
28
+ ```bash
29
+ cargo run -p smith-chat --features webhooks --bin smith-chat-daemon
30
+ ```
31
+
32
+ The daemon reads `CHAT_BRIDGE_CONFIG` (defaults to `config/chat-bridge.toml`) and starts the webhook server on `CHAT_BRIDGE_WEBHOOK_PORT` (defaults to 8092).
33
+
34
+ Start this in a separate terminal or background it with log redirection:
35
+
36
+ ```bash
37
+ cargo run -p smith-chat --features webhooks --bin smith-chat-daemon 2>&1 | tee logs/chat-daemon.log &
38
+ ```
39
+
40
+ ### 2. Start gateway(s) for each configured platform
41
+
42
+ Parse the `type = ` values from the config and start the matching gateway binary:
43
+
44
+ | Config `type =` | Binary name | Required env vars |
45
+ |-----------------|-------------|-------------------|
46
+ | `discord` | `smith-discord-gateway` | `DISCORD_BOT_TOKEN` |
47
+ | `telegram` | `smith-telegram-gateway` | `TELEGRAM_BOT_TOKEN` |
48
+ | `slack` | `smith-slack-gateway` | `SLACK_APP_TOKEN`, `SLACK_BOT_TOKEN` |
49
+ | `teams` | `smith-teams-gateway` | `TEAMS_TENANT_ID`, `TEAMS_CLIENT_ID`, `TEAMS_CLIENT_SECRET` |
50
+ | `mattermost` | `smith-mattermost-gateway` | `MATTERMOST_TOKEN` |
51
+ | `whatsapp` | `smith-whatsapp-gateway` | `WHATSAPP_ACCESS_TOKEN` |
52
+ | `matrix` | `smith-matrix-gateway` | `MATRIX_ACCESS_TOKEN` |
53
+ | `signal` | `smith-signal-gateway` | `SIGNAL_RECIPIENT` |
54
+ | `google_chat` | `smith-google-chat-gateway` | `GOOGLE_CHAT_WEBHOOK_URL` |
55
+ | `imessage` | `smith-imessage-gateway` | (config-only) |
56
+
57
+ Start each gateway with:
58
+
59
+ ```bash
60
+ cargo run -p smith-chat --bin <binary-name>
61
+ ```
62
+
63
+ For example, for Discord:
64
+
65
+ ```bash
66
+ cargo run -p smith-chat --bin smith-discord-gateway 2>&1 | tee logs/discord-gateway.log &
67
+ ```
68
+
69
+ Each gateway should run in its own terminal or backgrounded process.
70
+
71
+ ## Prerequisites
72
+
73
+ - `config/chat-bridge.toml` exists and has at least one `[[adapters]]` stanza (run `setup-chat-bridge` first).
74
+ - Platform credentials set in `.env` for each configured adapter.
75
+ - Docker stack running (NATS and Redis required by daemon).
76
+ - Rust workspace built (`cargo build -p smith-chat`).
77
+
78
+ ## Expected Output
79
+
80
+ - Daemon logs: `Starting chat bridge daemon` and `Starting webhook ingestion server`.
81
+ - Gateway logs: platform-specific ready message (e.g., `Discord bot is READY`).
82
+ - Processes visible via `pgrep -f smith-chat-daemon` and `pgrep -f gateway`.
83
+
84
+ ## Common Failures
85
+
86
+ | Symptom | Cause | Fix |
87
+ |---------|-------|-----|
88
+ | `NO_CONFIG` | Config file missing | Run `setup-chat-bridge` skill first |
89
+ | `failed to read chat bridge config` | Wrong `CHAT_BRIDGE_CONFIG` path | Check `.env` value matches actual file location |
90
+ | `failed to connect to NATS` | NATS not running | `docker compose up -d nats` |
91
+ | `failed to connect to redis` | Redis not running | `docker compose up -d redis` |
92
+ | Gateway missing env var | Credential not set in `.env` | Run `setup-chat-bridge` to set credentials |
93
+ | Port 8092 already in use | Another daemon instance running | Kill existing process or change `CHAT_BRIDGE_WEBHOOK_PORT` |
94
+ | `could not determine which binary to run` | Missing `--bin` flag | Use full `--bin <name>` as shown above |
95
+
96
+ ## Notes
97
+
98
+ Use separate terminal sessions so logs remain visible. For convenience, create a `logs/` directory first:
99
+
100
+ ```bash
101
+ mkdir -p logs
102
+ ```
103
+
104
+ To stop all chat bridge processes:
105
+
106
+ ```bash
107
+ pkill -f smith-chat-daemon
108
+ pkill -f 'smith-.*-gateway'
109
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: Start the Smith Core infrastructure stack with Docker Compose
3
+ ---
4
+ # Start Stack
5
+
6
+ Run:
7
+
8
+ ```bash
9
+ bash infra/envoy/certs/generate-certs.sh
10
+ docker compose up -d
11
+ docker compose ps
12
+ ```
13
+
14
+ ## What It Does
15
+
16
+ This skill launches the local infrastructure dependencies.
17
+
18
+ 1. Ensures local Envoy mTLS certs exist before container startup.
19
+ 2. Starts NATS, Postgres, Redis, ClickHouse, Grafana, OPA, Envoy, and MCP services.
20
+ 3. Ensures background containers are running.
21
+ 4. Gives a service-level health snapshot via `docker compose ps`.
22
+ 5. Establishes prerequisites for bridge and service processes.
23
+
24
+ ## Prerequisites
25
+
26
+ - Docker and Compose available.
27
+ - Ports required by the stack are free.
28
+
29
+ ## Expected Output
30
+
31
+ - Cert generation exits successfully (or reports existing certs).
32
+ - `docker compose up -d` exits successfully.
33
+ - `docker compose ps` shows core services as `running` or `healthy`.
34
+
35
+ ## Reading Results
36
+
37
+ Focus on these critical services:
38
+
39
+ - `smith-nats`
40
+ - `smith-postgres`
41
+ - `smith-envoy`
42
+ - `smith-mcp-index`
43
+
44
+ ## Common Failures
45
+
46
+ | Symptom | Cause | Fix |
47
+ |---------|-------|-----|
48
+ | Container exits immediately | Bad env/config | Inspect `docker compose logs <service>` |
49
+ | Envoy fails with cert path errors | Certs not generated/mounted | Run `bash infra/envoy/certs/generate-certs.sh` and retry |
50
+ | Port bind error | Port already in use | Free the port or remap in compose |
51
+ | Image pull/build failure | Network or registry failure | Retry after network recovery |
52
+ | Healthcheck stuck | Dependency not ready | Check dependent service logs |
53
+
54
+ ## Notes
55
+
56
+ Use `docker compose down` to stop the stack.
@@ -0,0 +1,53 @@
1
+ ---
2
+ description: Verify the full Smith Core bootstrap state after install steps
3
+ ---
4
+ # Verify
5
+
6
+ Run:
7
+
8
+ ```bash
9
+ cargo check --workspace
10
+ cargo check --manifest-path agent/agentd/Cargo.toml --features grpc --bin agentd
11
+ npm run build --workspaces --if-present
12
+ docker compose ps
13
+ ```
14
+
15
+ ## What It Does
16
+
17
+ This skill validates that core components are buildable and infrastructure is running.
18
+
19
+ 1. Checks Rust root workspace.
20
+ 2. Checks `agentd` workspace.
21
+ 3. Builds Node workspaces.
22
+ 4. Confirms Docker services are active.
23
+
24
+ ## Prerequisites
25
+
26
+ - Dependencies installed.
27
+ - Docker stack started.
28
+
29
+ ## Expected Output
30
+
31
+ - All check/build commands exit with status 0.
32
+ - `docker compose ps` shows core services up.
33
+
34
+ ## Reading Results
35
+
36
+ Installation is considered healthy when:
37
+
38
+ - Rust checks pass.
39
+ - Node workspace build passes.
40
+ - Core services (`nats`, `postgres`, `envoy`, `mcp-index`) are running.
41
+
42
+ ## Common Failures
43
+
44
+ | Symptom | Cause | Fix |
45
+ |---------|-------|-----|
46
+ | Rust check failures | Code/toolchain mismatch | Fix compile issues and rerun |
47
+ | npm build failures | TS/dependency issue | Resolve workspace build errors |
48
+ | Containers not running | Compose/startup failure | Inspect compose logs and restart |
49
+ | Intermittent health failures | Service startup race | Wait and re-run verification |
50
+
51
+ ## Notes
52
+
53
+ This is the final gate for local release-readiness confidence.