@bradheitmann/odin-sentinel 0.4.3 → 0.4.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/README.md
CHANGED
|
@@ -28,6 +28,136 @@ programming language.
|
|
|
28
28
|
For a recommended first team, see
|
|
29
29
|
[docs/guides/recommended-starter-team.md](docs/guides/recommended-starter-team.md).
|
|
30
30
|
|
|
31
|
+
For copy-paste setup and team-bootstrap prompts you can hand to Claude Code or
|
|
32
|
+
Codex on a fresh machine, see
|
|
33
|
+
[docs/guides/quickstart-prompts.md](docs/guides/quickstart-prompts.md).
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
### 1. Install
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm i -g @bradheitmann/odin-sentinel
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Or use `npx` without installing — see the host-specific configs below.
|
|
44
|
+
|
|
45
|
+
### 2. Configure your MCP host
|
|
46
|
+
|
|
47
|
+
Pick the one you use. Restart the host after editing.
|
|
48
|
+
|
|
49
|
+
**Claude Code**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
claude mcp add odin-sentinel -- npx -y -p @bradheitmann/odin-sentinel odin-sentinel-mcp
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Codex** (`~/.codex/config.toml`)
|
|
56
|
+
|
|
57
|
+
```toml
|
|
58
|
+
[mcp_servers.odin-sentinel]
|
|
59
|
+
command = "npx"
|
|
60
|
+
args = ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Cursor / Cursor CLI / VS Code / Factory (Droid) / Pi** (`mcpServers` JSON)
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"mcpServers": {
|
|
68
|
+
"odin-sentinel": {
|
|
69
|
+
"command": "npx",
|
|
70
|
+
"args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Zed** (`~/.config/zed/settings.json` → `context_servers`)
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
"odin-sentinel": {
|
|
80
|
+
"source": "custom",
|
|
81
|
+
"command": "npx",
|
|
82
|
+
"args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Goose** (`~/.config/goose/config.yaml` → `extensions`)
|
|
87
|
+
|
|
88
|
+
```yaml
|
|
89
|
+
odin-sentinel:
|
|
90
|
+
type: stdio
|
|
91
|
+
cmd: npx
|
|
92
|
+
args: ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
93
|
+
enabled: true
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Crush** (`~/.config/crush/crush.json` → `mcp`)
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"mcp": {
|
|
101
|
+
"odin-sentinel": {
|
|
102
|
+
"type": "stdio",
|
|
103
|
+
"command": "npx",
|
|
104
|
+
"args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**OpenCode** (`~/.config/opencode/opencode.json` → `mcp`)
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"mcp": {
|
|
115
|
+
"odin-sentinel": {
|
|
116
|
+
"type": "local",
|
|
117
|
+
"command": ["npx", "-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"],
|
|
118
|
+
"enabled": true
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**OpenHands** (`~/.openhands/config.toml`)
|
|
125
|
+
|
|
126
|
+
```toml
|
|
127
|
+
[mcp.stdio_servers.odin-sentinel]
|
|
128
|
+
name = "odin-sentinel"
|
|
129
|
+
command = "npx"
|
|
130
|
+
args = ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3. Use it
|
|
134
|
+
|
|
135
|
+
After restarting the host, give the agent an instruction like:
|
|
136
|
+
|
|
137
|
+
> Use the `odin-sentinel` MCP server. Call `odin.get_startup_packet`, then bootstrap an executive office and one development pod.
|
|
138
|
+
|
|
139
|
+
The agent will read the protocol resources (`odin://protocol/*`), follow the role contracts, and stay inside the SCP governance rules.
|
|
140
|
+
|
|
141
|
+
### 4. Verify (optional)
|
|
142
|
+
|
|
143
|
+
A one-line smoke test that works without any host:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}\n' \
|
|
147
|
+
| npx -y -p @bradheitmann/odin-sentinel odin-sentinel-mcp
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
A successful response includes `"serverInfo":{"name":"odin-sentinel","version":"0.4.5"}`.
|
|
151
|
+
|
|
152
|
+
### Claude Code plugin (optional)
|
|
153
|
+
|
|
154
|
+
If you're on Claude Code, you can install the SCP skill + MCP server together as a plugin:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
claude plugin marketplace add bradheitmann/odin-sentinel
|
|
158
|
+
claude plugin install sentinel-coordination-protocol@odin-sentinel
|
|
159
|
+
```
|
|
160
|
+
|
|
31
161
|
## Terms
|
|
32
162
|
|
|
33
163
|
- ODIN Sentinel: this MCP server and its portable team-coordination protocol.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# ODIN Sentinel Quickstart Prompts
|
|
2
|
+
|
|
3
|
+
Two prompts that take a fresh machine from *"agents installed"* to *"team running under the Sentinel Coordination Protocol."* Paste each one into a capable coding agent (Claude Code or Codex) at the indicated moment. The agents do the rest.
|
|
4
|
+
|
|
5
|
+
The prompts are opinionated. They assume you want a working team in the smallest number of steps, not a customized one. Swap rosters or hosts at the end if you have different agents available.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prompt 1 — Setup
|
|
10
|
+
|
|
11
|
+
**When to use:** once per machine. Paste into Claude Code or Codex on the target machine. The agent will detect what's missing, install only what's needed (Homebrew, git, Node.js, pnpm, CMUX, and the `@bradheitmann/odin-sentinel` MCP server), and wire the server into every agent host you actually have installed.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Set up the @bradheitmann/odin-sentinel MCP server on this machine. Detect what's missing, install only what's needed, configure only the agent hosts that exist on this machine.
|
|
15
|
+
|
|
16
|
+
# Plan
|
|
17
|
+
Make a 5-task plan and execute in order:
|
|
18
|
+
1. Prereqs (Homebrew, git, node, pnpm, cmux — install only if missing)
|
|
19
|
+
2. Install MCP server with explicit @latest tag
|
|
20
|
+
3. Smoke test the server
|
|
21
|
+
4. Detect installed agent hosts and wire each one
|
|
22
|
+
5. Print final report
|
|
23
|
+
|
|
24
|
+
# Rules
|
|
25
|
+
- Detect first, install only if missing: `command -v <tool>` for CLIs; `test -e <path>` for config dirs.
|
|
26
|
+
- After installing pnpm fresh, run `pnpm setup && source ~/.zshrc` once.
|
|
27
|
+
- Ignore pnpm warnings of the form "Failed to create bin … @pnpm/exe" — benign Homebrew vs pnpm self-install conflict.
|
|
28
|
+
- Always install with `pnpm add -g @bradheitmann/odin-sentinel@latest` — the bare name can return a stale version from registry cache.
|
|
29
|
+
- The MCP server has no `--version` flag. To verify, send a JSON-RPC initialize on stdin and parse the response.
|
|
30
|
+
- For every JSON / TOML / YAML config file: read, merge the odin-sentinel entry, write back. Never overwrite a whole file. Preserve comments in JSONC. Create the file if missing.
|
|
31
|
+
- Do not install agent CLIs the user doesn't have.
|
|
32
|
+
- Do not enable telemetry, deploy Cloudflare resources, or edit anything outside the host config files listed below plus one optional line in ~/.zshrc.
|
|
33
|
+
|
|
34
|
+
# Smoke test (use this exact form)
|
|
35
|
+
printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}\n' | odin-sentinel-mcp
|
|
36
|
+
|
|
37
|
+
Expect `"serverInfo":{"name":"odin-sentinel","version":"<X.Y.Z>"}`. If absent, stop and report.
|
|
38
|
+
|
|
39
|
+
# Hosts to detect and configure
|
|
40
|
+
For each: detect → if installed, merge the entry into the listed config file (idempotent). Every entry uses `command = "odin-sentinel-mcp"` with no args.
|
|
41
|
+
|
|
42
|
+
- Claude Code: `command -v claude` → `claude mcp add odin-sentinel -- odin-sentinel-mcp`
|
|
43
|
+
- Codex: `command -v codex` → `~/.codex/config.toml` [mcp_servers.odin-sentinel] command = "odin-sentinel-mcp"
|
|
44
|
+
- Cursor: `command -v cursor-agent` → `~/.cursor/mcp.json` mcpServers.odin-sentinel = { command: "odin-sentinel-mcp" }
|
|
45
|
+
- Factory Droid: `command -v droid` → `~/.factory/mcp.json` mcpServers.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp", disabled: false }
|
|
46
|
+
- Kilo Code: `command -v kilocode` → `~/.kilocode/mcp.json` (same shape as Cursor)
|
|
47
|
+
- Pi: `command -v pi` → `~/.pi/mcp.json` (same shape as Cursor)
|
|
48
|
+
- OpenCode: `command -v opencode` → `~/.config/opencode/opencode.json` mcp.odin-sentinel = { type: "local", command: ["odin-sentinel-mcp"], enabled: true }
|
|
49
|
+
- Crush: `command -v crush` → `~/.config/crush/crush.json` mcp.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp" }
|
|
50
|
+
- Goose: `command -v goose` → `~/.config/goose/config.yaml` extensions.odin-sentinel = { type: stdio, cmd: odin-sentinel-mcp, enabled: true }
|
|
51
|
+
- OpenHands: `command -v openhands` → `~/.openhands/config.toml` [mcp.stdio_servers.odin-sentinel] name = "odin-sentinel", command = "odin-sentinel-mcp"
|
|
52
|
+
- Zed: `test -e ~/.config/zed` → `~/.config/zed/settings.json` context_servers.odin-sentinel = { source: "custom", command: "odin-sentinel-mcp", enabled: true }
|
|
53
|
+
- VS Code: `command -v code` → `~/Library/Application Support/Code/User/mcp.json` servers.odin-sentinel = { type: "stdio", command: "odin-sentinel-mcp" }
|
|
54
|
+
|
|
55
|
+
# Final report
|
|
56
|
+
Print:
|
|
57
|
+
- installed odin-sentinel version
|
|
58
|
+
- which hosts were configured
|
|
59
|
+
- which hosts were skipped (one line each, with reason "not installed")
|
|
60
|
+
- any non-fatal warnings
|
|
61
|
+
|
|
62
|
+
Then print these three lines and stop:
|
|
63
|
+
|
|
64
|
+
Setup complete.
|
|
65
|
+
Restart any agent host you configured (their MCP config is cached at startup).
|
|
66
|
+
To boot a team: open CMUX, launch your Executive PM agent in the first surface, paste your team-roster prompt.
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
After it finishes, **restart any agent host it touched** — each one caches MCP server configs at startup. Skipping the restart is the most common reason "the MCP server isn't showing up" after a clean install.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Prompt 2 — Team Bootstrap
|
|
74
|
+
|
|
75
|
+
**When to use:** every time you spin up a new project. Open CMUX, launch Codex in the first surface, paste this. Codex acts as `A/EXEC-PM`, reads the Sentinel Coordination Protocol from the bundled skill, and stages a two-team layout (executive office + one development pod). The roster below is opinionated — substitute models or hosts you actually have.
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
You are A/EXEC-PM. Bootstrap a 2-team Sentinel Coordination Protocol session in this CMUX workspace.
|
|
79
|
+
|
|
80
|
+
# Procedure
|
|
81
|
+
1. Call odin.get_version. Confirm >= 0.4.4.
|
|
82
|
+
2. Call odin.get_bootstrap_skill. Read the full SCP contract. Follow it for the remainder of this session — particularly: you are the sole staffing authority, sole CMUX surface custodian, and you must complete the pre-staffing gate before every spawn.
|
|
83
|
+
3. Call odin.compute_surface_layout with teamCount=2. Confirm the canonical layout is [A] [B].
|
|
84
|
+
4. Call odin.compute_surface_layout_gate with fromTeamCount=1, toTeamCount=2. Execute the cmux operations it lists.
|
|
85
|
+
5. Stage the team per the roster below. For each surface: create it via cmux, confirm it exists and is empty, send the agent launch command, then send the occupant boot prompt requesting an SCP_BOOT_RECEIPT.
|
|
86
|
+
|
|
87
|
+
# Roster (substitute hosts/models if you have different agents available)
|
|
88
|
+
|
|
89
|
+
Team A — Executive Office (column 0, 5 surfaces stacked as tabs):
|
|
90
|
+
| Slot | Agent host | Model |
|
|
91
|
+
|---------------|---------------|-----------------|
|
|
92
|
+
| A/EXEC-PM | Codex | (you) |
|
|
93
|
+
| A/EXEC-ODIN | Codex | high-reasoning |
|
|
94
|
+
| A/EXEC-ASST | Kilo Code | Composer-2 |
|
|
95
|
+
| A/EXEC-RSCH | Cursor | Kimi-K-2.5 |
|
|
96
|
+
| A/EXEC-QA | OpenCode | Kimi-K-2.5 |
|
|
97
|
+
|
|
98
|
+
Team B — Development Pod (column 1, 5 surfaces stacked as tabs):
|
|
99
|
+
| Slot | Agent host | Model |
|
|
100
|
+
|---------------|---------------|-----------------|
|
|
101
|
+
| B/TEAM-PM | Claude Code | Opus-4.7 |
|
|
102
|
+
| B/ODIN | Codex | high-reasoning |
|
|
103
|
+
| B/DEV-1 | Droid (Factory) | Kimi-K-2.6 |
|
|
104
|
+
| B/QA-1 | Crush | GLM-5.1 |
|
|
105
|
+
| B/SHADOW-1 | Claude Code | Haiku |
|
|
106
|
+
|
|
107
|
+
# Constraints
|
|
108
|
+
- You are the only role permitted to invoke cmux surface operations (new-split, new-surface, move-surface, close-surface).
|
|
109
|
+
- No hidden subagents. Every agent must occupy a visible CMUX surface.
|
|
110
|
+
- TEAM PMs do not staff their own pods. All staffing is yours.
|
|
111
|
+
- A/EXEC-ODIN holds binding HALT authority over you. Honor HALT directives.
|
|
112
|
+
- Context window soft threshold 70% / hard 90% per agent. Force handoff or lockdown on hard breach.
|
|
113
|
+
|
|
114
|
+
# Closeout signal
|
|
115
|
+
After all 10 surfaces are spawned, all 10 boot receipts received, and odin.validate_team_manifest passes, emit a single line:
|
|
116
|
+
|
|
117
|
+
STAGED_AND_IDLE: 2 teams, 10 occupants, layout=[A] [B]
|
|
118
|
+
|
|
119
|
+
Then wait for the user's first product directive. Do not begin work until dispatched.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
When `STAGED_AND_IDLE` appears, the team is ready for your first directive.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Scaling beyond 2 teams
|
|
127
|
+
|
|
128
|
+
To add a third development pod (Team C), tell `A/EXEC-PM`:
|
|
129
|
+
|
|
130
|
+
> Stage Team C as a new development pod identical in role shape to Team B. Call `odin.compute_surface_layout_gate fromTeamCount=2 toTeamCount=3` first and follow its checklist. The canonical layout becomes `[A] [B/C]` — Team A in the tall column, B and C stacked in the right column.
|
|
131
|
+
|
|
132
|
+
The same pattern scales out to 4, 5, 6, 7, 8 teams. The packing rule is in `odin://protocol/topology`.
|
package/package.json
CHANGED
|
@@ -33,10 +33,12 @@ function filesToAudit() {
|
|
|
33
33
|
|
|
34
34
|
const publicFiles = filesToAudit();
|
|
35
35
|
|
|
36
|
-
//
|
|
37
|
-
// directories and tilde home paths
|
|
38
|
-
//
|
|
36
|
+
// Install and protocol documentation legitimately references agent harness
|
|
37
|
+
// config directories and tilde home paths. The path-style rules below skip
|
|
38
|
+
// these files; the rest of the rules still apply.
|
|
39
39
|
const BUNDLED_DOC = new Set([
|
|
40
|
+
"README.md",
|
|
41
|
+
"docs/guides/quickstart-prompts.md",
|
|
40
42
|
"protocol/bootstrap-" + "sk" + "ill.md",
|
|
41
43
|
"plugins/sentinel-coordination-protocol/" + "sk" + "ills/sentinel-coordination-protocol/SK" + "ILL.md"
|
|
42
44
|
]);
|
|
@@ -39,6 +39,7 @@ const requiredFiles = [
|
|
|
39
39
|
"dist/src/protocol/validators.js",
|
|
40
40
|
"dist/src/protocol/version.js",
|
|
41
41
|
"docs/guides/quick-start.md",
|
|
42
|
+
"docs/guides/quickstart-prompts.md",
|
|
42
43
|
"docs/guides/recommended-starter-team.md",
|
|
43
44
|
"docs/reference/client-compatibility.md",
|
|
44
45
|
"docs/reference/cost-and-privacy.md",
|