@schoolai/shipyard-mcp 0.3.2-next.530 → 0.3.2-next.540
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 +199 -114
- package/apps/hook/dist/index.cjs +35 -3
- package/apps/server/dist/{chunk-QDYV6R7L.js → chunk-FLGKCBXM.js} +76 -3
- package/apps/server/dist/index.js +2 -2
- package/apps/server/dist/{input-request-manager-QKHCEJUU.js → input-request-manager-3L5EHE23.js} +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,139 +1,189 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<img src="apps/web/public/icon.svg" alt="Shipyard Logo" width="120" height="120">
|
|
3
3
|
<h1>Shipyard</h1>
|
|
4
|
-
<p><strong>
|
|
4
|
+
<p><strong>Ship responsibly.</strong></p>
|
|
5
|
+
<p>Human-agent collaboration with receipts.</p>
|
|
5
6
|
|
|
6
7
|
<p>
|
|
7
8
|
<a href="https://github.com/SchoolAI/shipyard/actions"><img src="https://img.shields.io/github/actions/workflow/status/SchoolAI/shipyard/deploy.yml?branch=main&label=deploy" alt="Deploy Status"></a>
|
|
8
|
-
<img src="https://img.shields.io/
|
|
9
|
-
<img src="https://img.shields.io/badge/pnpm-10.x-F69220?logo=pnpm&logoColor=white" alt="pnpm">
|
|
9
|
+
<a href="https://www.npmjs.com/package/@schoolai/shipyard-mcp"><img src="https://img.shields.io/npm/v/@schoolai/shipyard-mcp" alt="npm version"></a>
|
|
10
10
|
<a href="./LICENSE.md"><img src="https://img.shields.io/badge/license-FSL--1.1-blue" alt="License"></a>
|
|
11
|
+
<a href="https://github.com/SchoolAI/shipyard/discussions"><img src="https://img.shields.io/github/discussions/SchoolAI/shipyard" alt="Discussions"></a>
|
|
11
12
|
</p>
|
|
12
13
|
</div>
|
|
13
14
|
|
|
14
15
|
---
|
|
15
16
|
|
|
17
|
+
<div align="center">
|
|
18
|
+
<img src="docs/assets/hero-inbox-split.png" alt="Shipyard Inbox with Task Detail" width="800">
|
|
19
|
+
<p><em>Inbox showing tasks needing review with split panel detail view</em></p>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
16
22
|
## The Problem
|
|
17
23
|
|
|
18
|
-
AI agents
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
24
|
+
You're managing multiple AI agents (Claude, Cursor, Devin), but there's no workspace where humans and agents collaborate together:
|
|
25
|
+
- **No verification** — Agent says "done" but you have no proof
|
|
26
|
+
- **No collaboration layer** — Humans review in GitHub, agents work in chat logs
|
|
27
|
+
- **No feedback loop** — You approve work, but the agent never sees it
|
|
22
28
|
|
|
23
|
-
Shipyard
|
|
29
|
+
Shipyard is the collaboration workspace for mixed human-agent teams. Agents create tasks with proof. Humans review in real-time. Feedback flows both ways.
|
|
24
30
|
|
|
25
|
-
##
|
|
31
|
+
## Why Shipyard
|
|
26
32
|
|
|
27
|
-
- **
|
|
28
|
-
- **
|
|
29
|
-
- **
|
|
30
|
-
- **Zero infrastructure** — GitHub
|
|
31
|
-
- **
|
|
32
|
-
- **Offline-first** — IndexedDB persistence, works without network
|
|
33
|
+
- **Human-agent collaboration** — The first workspace designed for mixed teams. Humans and AI agents work together with structured feedback loops.
|
|
34
|
+
- **Built for mixed teams** — Not a human tool with AI bolted on, or an AI tool ignoring humans. Designed for how agents and humans actually work together.
|
|
35
|
+
- **Receipts, not promises** — Screenshots, videos, and test results. Not just chat logs claiming work was done.
|
|
36
|
+
- **Zero infrastructure** — Works completely locally. GitHub optional for remote artifact sharing. No paid services, no servers to maintain.
|
|
37
|
+
- **Real-time P2P** — Multiple agents and reviewers sync via WebRTC. Works offline, no central server required.
|
|
33
38
|
|
|
34
|
-
##
|
|
35
|
-
|
|
36
|
-
| Platform | Status | Installation | Notes |
|
|
37
|
-
|----------|--------|--------------|-------|
|
|
38
|
-
| **Claude Code** | ✅ Full support | GitHub plugin | Complete integration with hooks + skills |
|
|
39
|
-
| **OpenCode** | ⚠️ Experimental | npm + config | Native task mode, testing in progress |
|
|
40
|
-
| **Cursor** | ⚠️ MCP only | npm + config | Works via MCP tools, manual workflow |
|
|
41
|
-
| **Windsurf** | ⚠️ MCP only | npm + config | Works via MCP tools, testing needed |
|
|
42
|
-
| **Devin** | ⚠️ MCP only | npm + config | API-only mode has limitations |
|
|
43
|
-
| **Replit Agent** | ⚠️ MCP only | npm + config | Basic functionality |
|
|
44
|
-
| **GitHub Copilot** | ⚠️ MCP only | npm + config | Basic functionality |
|
|
45
|
-
| **Gemini Code Assist** | ⚠️ MCP only | npm + config | Basic functionality |
|
|
46
|
-
| **Codex (OpenAI)** | ❓ Research needed | TBD | Feature completeness assessment in progress |
|
|
47
|
-
|
|
48
|
-
**Key:** Only Claude Code provides the full experience with automatic task creation and approval workflows. Other platforms work via manual MCP tool invocation.
|
|
39
|
+
## Get Started
|
|
49
40
|
|
|
50
|
-
|
|
41
|
+
Shipyard is just an MCP server. One command or a simple JSON config—works with all major AI coding tools.
|
|
51
42
|
|
|
52
|
-
|
|
43
|
+
**Prerequisite:** Node.js 22+ ([download](https://nodejs.org/))
|
|
53
44
|
|
|
54
|
-
###
|
|
45
|
+
### Claude Code (Recommended)
|
|
55
46
|
|
|
56
|
-
|
|
47
|
+
Full experience with hooks, skills, and auto-task creation:
|
|
57
48
|
|
|
58
49
|
```bash
|
|
59
|
-
|
|
60
|
-
/plugin marketplace add SchoolAI/shipyard
|
|
61
|
-
|
|
62
|
-
# Step 2: Install the plugin
|
|
63
|
-
/plugin install shipyard@schoolai-shipyard
|
|
50
|
+
/plugin install SchoolAI/shipyard
|
|
64
51
|
```
|
|
65
52
|
|
|
66
|
-
|
|
53
|
+
### Cursor
|
|
67
54
|
|
|
68
|
-
|
|
55
|
+
Add to `~/.cursor/mcp.json`:
|
|
69
56
|
|
|
70
|
-
|
|
71
|
-
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"mcpServers": {
|
|
60
|
+
"shipyard": {
|
|
61
|
+
"command": "npx",
|
|
62
|
+
"args": ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Codex (OpenAI)
|
|
72
69
|
|
|
73
|
-
|
|
70
|
+
Add via CLI:
|
|
74
71
|
|
|
75
72
|
```bash
|
|
76
|
-
|
|
73
|
+
codex mcp add shipyard -- npx -y @schoolai/shipyard-mcp@latest
|
|
77
74
|
```
|
|
78
75
|
|
|
79
|
-
|
|
80
|
-
</details>
|
|
81
|
-
|
|
82
|
-
This gives you:
|
|
83
|
-
- ✅ MCP tools for creating and managing tasks
|
|
84
|
-
- ✅ Automatic hooks for task creation workflow
|
|
85
|
-
- ✅ Skills for collaborative task management
|
|
76
|
+
Or add to `~/.codex/config.toml`:
|
|
86
77
|
|
|
87
|
-
|
|
78
|
+
```toml
|
|
79
|
+
[mcp_servers.shipyard]
|
|
80
|
+
command = "npx"
|
|
81
|
+
args = ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
82
|
+
```
|
|
88
83
|
|
|
89
|
-
|
|
84
|
+
### VS Code / GitHub Copilot
|
|
90
85
|
|
|
91
86
|
```bash
|
|
92
|
-
|
|
87
|
+
code --add-mcp '{"name":"shipyard","command":"npx","args":["-y","@schoolai/shipyard-mcp@latest"]}'
|
|
93
88
|
```
|
|
94
89
|
|
|
95
|
-
|
|
90
|
+
<details>
|
|
91
|
+
<summary><strong>See all platforms (Claude Desktop, Windsurf, JetBrains, Zed, etc.)</strong></summary>
|
|
92
|
+
|
|
93
|
+
### Claude Desktop
|
|
94
|
+
|
|
95
|
+
Add to your config file:
|
|
96
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
97
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
98
|
+
- Linux: `~/.config/claude/claude_desktop_config.json`
|
|
96
99
|
|
|
97
|
-
**Cursor** (`~/.cursor/mcp.json`):
|
|
98
100
|
```json
|
|
99
101
|
{
|
|
100
102
|
"mcpServers": {
|
|
101
103
|
"shipyard": {
|
|
102
104
|
"command": "npx",
|
|
103
|
-
"args": ["-y", "
|
|
105
|
+
"args": ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
```
|
|
108
110
|
|
|
109
|
-
|
|
111
|
+
### Windsurf
|
|
112
|
+
|
|
113
|
+
Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
114
|
+
|
|
110
115
|
```json
|
|
111
116
|
{
|
|
112
|
-
"
|
|
117
|
+
"mcpServers": {
|
|
113
118
|
"shipyard": {
|
|
114
|
-
"command": "npx
|
|
119
|
+
"command": "npx",
|
|
120
|
+
"args": ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
115
121
|
}
|
|
116
122
|
}
|
|
117
123
|
}
|
|
118
124
|
```
|
|
119
125
|
|
|
120
|
-
|
|
126
|
+
### JetBrains IDEs
|
|
121
127
|
|
|
122
|
-
|
|
128
|
+
1. Settings > Tools > AI Assistant > Model Context Protocol (MCP)
|
|
129
|
+
2. Click "Add"
|
|
130
|
+
3. Paste JSON config above
|
|
123
131
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
### Zed
|
|
133
|
+
|
|
134
|
+
Add to `~/.config/zed/settings.json`:
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"context_servers": {
|
|
139
|
+
"shipyard": {
|
|
140
|
+
"command": {
|
|
141
|
+
"path": "npx",
|
|
142
|
+
"args": ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
129
148
|
|
|
130
|
-
|
|
131
|
-
|
|
149
|
+
### Continue.dev
|
|
150
|
+
|
|
151
|
+
Create `.continue/mcpServers/shipyard.yaml`:
|
|
152
|
+
|
|
153
|
+
```yaml
|
|
154
|
+
mcpServers:
|
|
155
|
+
- name: Shipyard
|
|
156
|
+
command: npx
|
|
157
|
+
args: ["-y", "@schoolai/shipyard-mcp@latest"]
|
|
132
158
|
```
|
|
133
159
|
|
|
134
|
-
|
|
160
|
+
</details>
|
|
161
|
+
|
|
162
|
+
**[Full installation guide with troubleshooting →](./docs/INSTALLATION.md)**
|
|
163
|
+
|
|
164
|
+
## Platform Support
|
|
165
|
+
|
|
166
|
+
| Platform | Experience |
|
|
167
|
+
|----------|-----------|
|
|
168
|
+
| **Claude Code** | Full integration — hooks, skills, MCP tools, auto-task creation |
|
|
169
|
+
| **Codex, VS Code, Cursor, Windsurf** | MCP tools — manual workflow, full functionality |
|
|
170
|
+
| **Other MCP clients** | Basic — depends on platform capabilities |
|
|
171
|
+
|
|
172
|
+
**[See detailed compatibility matrix →](./docs/INSTALLATION.md#feature-comparison)**
|
|
173
|
+
|
|
174
|
+
<details>
|
|
175
|
+
<summary><strong>Using Shipyard skills on other platforms</strong></summary>
|
|
176
|
+
|
|
177
|
+
Shipyard includes a skill (`skills/shipyard/SKILL.md`) that teaches Claude Code how to use the MCP tools effectively. Other platforms can use this same instruction content through their native mechanisms:
|
|
135
178
|
|
|
136
|
-
|
|
179
|
+
- **VS Code / Copilot**: Copy to `.github/skills/shipyard/` (Agent Skills preview)
|
|
180
|
+
- **Cursor**: Create `.cursor/rules/shipyard.mdc` with skill content
|
|
181
|
+
- **Windsurf**: Create `.windsurf/workflows/shipyard-task.md`
|
|
182
|
+
- **JetBrains**: Add to `.junie/guidelines.md`
|
|
183
|
+
|
|
184
|
+
See [skills/shipyard/README.md](./skills/shipyard/README.md) for platform-specific instructions.
|
|
185
|
+
|
|
186
|
+
</details>
|
|
137
187
|
|
|
138
188
|
## How It Works
|
|
139
189
|
|
|
@@ -150,60 +200,101 @@ See **[SETUP.md](./docs/SETUP.md)** for full development setup.
|
|
|
150
200
|
└─────────────────┘ └─────────────────┘
|
|
151
201
|
```
|
|
152
202
|
|
|
153
|
-
1. Agent creates
|
|
154
|
-
2. Reviewers join via shared URL → Real-time P2P sync
|
|
155
|
-
3. Add comments
|
|
156
|
-
4. Agent uploads artifacts (screenshots,
|
|
203
|
+
1. **Agent creates task** via MCP tool → Browser opens automatically
|
|
204
|
+
2. **Reviewers join** via shared URL → Real-time P2P sync
|
|
205
|
+
3. **Add comments**, approve, or request changes → Agent sees feedback
|
|
206
|
+
4. **Agent uploads artifacts** (screenshots, videos) → Stored in GitHub
|
|
207
|
+
5. **Task auto-completes** when all deliverables have receipts (screenshots, videos, test results)
|
|
208
|
+
|
|
209
|
+
## Features
|
|
210
|
+
|
|
211
|
+
- **BlockNote editor** — Notion-like editing with inline comments and threads
|
|
212
|
+
- **Kanban board** — Drag-drop tasks between Draft, Review, In Progress, Done
|
|
213
|
+
- **GitHub artifacts** — Screenshots, videos, test results stored in your repo
|
|
214
|
+
- **Offline-first** — IndexedDB persistence, works without network
|
|
215
|
+
- **Multi-agent** — Multiple Claude Code/Cursor instances can work on same task
|
|
216
|
+
|
|
217
|
+
<details>
|
|
218
|
+
<summary><strong>See more screenshots</strong></summary>
|
|
157
219
|
|
|
158
|
-
|
|
220
|
+
### Kanban Board
|
|
221
|
+
<img src="docs/assets/board-view.png" alt="Kanban board with drag-drop columns" width="600">
|
|
159
222
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
223
|
+
### Full Task Detail
|
|
224
|
+
<img src="docs/assets/task-detail-full.png" alt="Task with deliverables and content" width="600">
|
|
225
|
+
|
|
226
|
+
</details>
|
|
227
|
+
|
|
228
|
+
## Data & Privacy
|
|
229
|
+
|
|
230
|
+
| Data | Where It Lives | Control |
|
|
231
|
+
|------|---------------|---------|
|
|
232
|
+
| Task content | Browser (IndexedDB) + P2P sync | You own it |
|
|
233
|
+
| Artifacts (local) | `~/.shipyard/artifacts/` served via localhost | You own it |
|
|
234
|
+
| Artifacts (shared) | Optional: GitHub (your repo, orphan branch) | You own it |
|
|
235
|
+
| MCP server | Runs locally | Never leaves your machine |
|
|
236
|
+
| URLs | Encoded snapshots | Shareable, regenerable |
|
|
237
|
+
|
|
238
|
+
**No telemetry. No cloud storage. GitHub optional.**
|
|
239
|
+
|
|
240
|
+
Works completely locally. Add GitHub only if you need remote reviewers to access artifacts.
|
|
167
241
|
|
|
168
242
|
## Documentation
|
|
169
243
|
|
|
170
244
|
| Doc | Description |
|
|
171
245
|
|-----|-------------|
|
|
172
|
-
| [
|
|
173
|
-
| [
|
|
174
|
-
| [
|
|
175
|
-
| [
|
|
246
|
+
| **[Installation](./docs/INSTALLATION.md)** | Platform-specific setup guides |
|
|
247
|
+
| **[Setup](./docs/SETUP.md)** | Development setup, troubleshooting |
|
|
248
|
+
| **[Architecture](./docs/architecture.md)** | Data model, sync topology, tech choices |
|
|
249
|
+
| **[Brief](./docs/BRIEF.md)** | 30-second project context |
|
|
176
250
|
|
|
177
|
-
##
|
|
251
|
+
## Architecture
|
|
178
252
|
|
|
179
|
-
|
|
180
|
-
1. **Workspace metaphor** — A shipyard is where work is built
|
|
181
|
-
2. **Dev culture** — "Shipping" is how developers talk about delivering value
|
|
253
|
+
Shipyard is a monorepo with multiple components:
|
|
182
254
|
|
|
183
|
-
|
|
255
|
+
| Component | Description |
|
|
256
|
+
|-----------|-------------|
|
|
257
|
+
| [**MCP Server**](./apps/server) | 12 tools for task creation, artifacts, feedback |
|
|
258
|
+
| [**Web App**](./apps/web) | React + BlockNote editor with Kanban board |
|
|
259
|
+
| [**Schema**](./packages/schema) | Shared Yjs CRDT types and URL encoding |
|
|
260
|
+
| [**WebRTC Signaling**](./apps/signaling) | P2P discovery (Cloudflare Worker) |
|
|
261
|
+
| [**Hooks**](./apps/hook) | Claude Code integration |
|
|
184
262
|
|
|
185
|
-
|
|
263
|
+
**Published package:** [`@schoolai/shipyard-mcp`](https://www.npmjs.com/package/@schoolai/shipyard-mcp) - Includes MCP server + hook
|
|
186
264
|
|
|
187
|
-
##
|
|
265
|
+
## Community
|
|
188
266
|
|
|
189
|
-
|
|
267
|
+
- **[GitHub Discussions](https://github.com/SchoolAI/shipyard/discussions)** — Questions, ideas, show & tell
|
|
268
|
+
- **[GitHub Issues](https://github.com/SchoolAI/shipyard/issues)** — Bug reports, feature requests
|
|
190
269
|
|
|
191
|
-
|
|
192
|
-
skills/shipyard/
|
|
193
|
-
├── SKILL.md # Instructions for Claude
|
|
194
|
-
├── README.md # Setup guide
|
|
195
|
-
└── examples/ # Usage examples
|
|
196
|
-
```
|
|
270
|
+
## Contributing
|
|
197
271
|
|
|
198
|
-
|
|
272
|
+
We value **ideas over implementations**. Please start with discussion:
|
|
199
273
|
|
|
200
|
-
|
|
274
|
+
### How to Contribute
|
|
201
275
|
|
|
202
|
-
|
|
276
|
+
1. **Bug reports** — [Open an issue](https://github.com/SchoolAI/shipyard/issues/new)
|
|
277
|
+
2. **Feature ideas** — [Start a discussion](https://github.com/SchoolAI/shipyard/discussions/new)
|
|
278
|
+
3. **Questions** — [Ask in discussions](https://github.com/SchoolAI/shipyard/discussions)
|
|
203
279
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
280
|
+
### Before Submitting Code
|
|
281
|
+
|
|
282
|
+
Open an issue describing what you want to change and get maintainer approval first. This helps us:
|
|
283
|
+
- Ensure changes align with project direction
|
|
284
|
+
- Avoid duplicate efforts
|
|
285
|
+
- Provide design guidance upfront
|
|
286
|
+
|
|
287
|
+
PRs without a linked, approved issue may be closed.
|
|
288
|
+
|
|
289
|
+
### AI Assistance
|
|
290
|
+
|
|
291
|
+
AI-assisted contributions are welcome. We use AI ourselves. What matters is that **you** understand what you're submitting and can answer questions about it.
|
|
292
|
+
|
|
293
|
+
### Learn the Codebase
|
|
294
|
+
|
|
295
|
+
1. **[Brief](./docs/BRIEF.md)** — 30-second project context
|
|
296
|
+
2. **[Engineering Standards](./docs/engineering-standards.md)** — Code quality expectations
|
|
297
|
+
3. **[Architecture](./docs/architecture.md)** — How it all fits together
|
|
207
298
|
|
|
208
299
|
## License
|
|
209
300
|
|
|
@@ -212,10 +303,4 @@ We welcome contributions! Please read the codebase first:
|
|
|
212
303
|
- **Free** for all non-competing use
|
|
213
304
|
- **Converts to Apache 2.0** automatically in 2 years
|
|
214
305
|
|
|
215
|
-
We chose this to ensure that all core improvements help grow this main repository while keeping it free for developers.
|
|
216
|
-
|
|
217
306
|
---
|
|
218
|
-
|
|
219
|
-
<div align="center">
|
|
220
|
-
<sub>Built with Yjs, BlockNote, and the MCP protocol</sub>
|
|
221
|
-
</div>
|
package/apps/hook/dist/index.cjs
CHANGED
|
@@ -28491,7 +28491,7 @@ init_cjs_shims();
|
|
|
28491
28491
|
// ../../packages/schema/dist/index.mjs
|
|
28492
28492
|
init_cjs_shims();
|
|
28493
28493
|
|
|
28494
|
-
// ../../packages/schema/dist/yjs-helpers-
|
|
28494
|
+
// ../../packages/schema/dist/yjs-helpers-Dr9oWyS2.mjs
|
|
28495
28495
|
init_cjs_shims();
|
|
28496
28496
|
|
|
28497
28497
|
// ../../packages/schema/dist/plan.mjs
|
|
@@ -42723,10 +42723,33 @@ var LocalArtifactParseSchema = external_exports.object({
|
|
|
42723
42723
|
localArtifactId: external_exports.string()
|
|
42724
42724
|
});
|
|
42725
42725
|
|
|
42726
|
-
// ../../packages/schema/dist/yjs-helpers-
|
|
42726
|
+
// ../../packages/schema/dist/yjs-helpers-Dr9oWyS2.mjs
|
|
42727
42727
|
function assertNever2(value) {
|
|
42728
42728
|
throw new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);
|
|
42729
42729
|
}
|
|
42730
|
+
var SyncedFileChangeSchema = external_exports.object({
|
|
42731
|
+
path: external_exports.string(),
|
|
42732
|
+
status: external_exports.enum([
|
|
42733
|
+
"added",
|
|
42734
|
+
"modified",
|
|
42735
|
+
"deleted",
|
|
42736
|
+
"renamed"
|
|
42737
|
+
]),
|
|
42738
|
+
patch: external_exports.string(),
|
|
42739
|
+
staged: external_exports.boolean()
|
|
42740
|
+
});
|
|
42741
|
+
var ChangeSnapshotSchema = external_exports.object({
|
|
42742
|
+
machineId: external_exports.string(),
|
|
42743
|
+
machineName: external_exports.string(),
|
|
42744
|
+
ownerId: external_exports.string(),
|
|
42745
|
+
headSha: external_exports.string(),
|
|
42746
|
+
branch: external_exports.string(),
|
|
42747
|
+
isLive: external_exports.boolean(),
|
|
42748
|
+
updatedAt: external_exports.number(),
|
|
42749
|
+
files: external_exports.array(SyncedFileChangeSchema),
|
|
42750
|
+
totalAdditions: external_exports.number(),
|
|
42751
|
+
totalDeletions: external_exports.number()
|
|
42752
|
+
});
|
|
42730
42753
|
var AgentPresenceSchema = external_exports.object({
|
|
42731
42754
|
agentType: external_exports.string(),
|
|
42732
42755
|
sessionId: external_exports.string(),
|
|
@@ -43044,7 +43067,8 @@ var YDOC_KEYS = {
|
|
|
43044
43067
|
EVENTS: "events",
|
|
43045
43068
|
SNAPSHOTS: "snapshots",
|
|
43046
43069
|
INPUT_REQUESTS: "inputRequests",
|
|
43047
|
-
LOCAL_DIFF_COMMENTS: "localDiffComments"
|
|
43070
|
+
LOCAL_DIFF_COMMENTS: "localDiffComments",
|
|
43071
|
+
CHANGE_SNAPSHOTS: "changeSnapshots"
|
|
43048
43072
|
};
|
|
43049
43073
|
var validKeys = new Set(Object.values(YDOC_KEYS));
|
|
43050
43074
|
var CommentBodySchema = external_exports.union([external_exports.string(), external_exports.array(external_exports.unknown())]);
|
|
@@ -44353,6 +44377,11 @@ var ImportConversationResponseSchema = external_exports.discriminatedUnion("succ
|
|
|
44353
44377
|
success: external_exports.literal(false),
|
|
44354
44378
|
error: external_exports.string()
|
|
44355
44379
|
})]);
|
|
44380
|
+
var MachineInfoResponseSchema = external_exports.object({
|
|
44381
|
+
machineId: external_exports.string(),
|
|
44382
|
+
machineName: external_exports.string(),
|
|
44383
|
+
ownerId: external_exports.string()
|
|
44384
|
+
});
|
|
44356
44385
|
var t = initTRPC.context().create({ allowOutsideOfServer: true });
|
|
44357
44386
|
var router = t.router;
|
|
44358
44387
|
var publicProcedure = t.procedure;
|
|
@@ -44459,6 +44488,9 @@ var planRouter = router({
|
|
|
44459
44488
|
error: "No working directory available"
|
|
44460
44489
|
};
|
|
44461
44490
|
return ctx.getFileContent(cwd, input.filePath);
|
|
44491
|
+
}),
|
|
44492
|
+
getMachineInfo: publicProcedure.input(PlanIdSchema).output(MachineInfoResponseSchema).query(async ({ ctx }) => {
|
|
44493
|
+
return ctx.getMachineInfo();
|
|
44462
44494
|
})
|
|
44463
44495
|
});
|
|
44464
44496
|
var subscriptionRouter = router({
|
|
@@ -864,13 +864,36 @@ function createInitialConversationVersion(params) {
|
|
|
864
864
|
return ConversationVersionSchema.parse(version);
|
|
865
865
|
}
|
|
866
866
|
|
|
867
|
-
// ../../packages/schema/dist/yjs-helpers-
|
|
867
|
+
// ../../packages/schema/dist/yjs-helpers-Dr9oWyS2.mjs
|
|
868
868
|
import { z as z2 } from "zod";
|
|
869
869
|
import { nanoid as nanoid2 } from "nanoid";
|
|
870
870
|
import * as Y from "yjs";
|
|
871
871
|
function assertNever2(value) {
|
|
872
872
|
throw new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);
|
|
873
873
|
}
|
|
874
|
+
var SyncedFileChangeSchema = z2.object({
|
|
875
|
+
path: z2.string(),
|
|
876
|
+
status: z2.enum([
|
|
877
|
+
"added",
|
|
878
|
+
"modified",
|
|
879
|
+
"deleted",
|
|
880
|
+
"renamed"
|
|
881
|
+
]),
|
|
882
|
+
patch: z2.string(),
|
|
883
|
+
staged: z2.boolean()
|
|
884
|
+
});
|
|
885
|
+
var ChangeSnapshotSchema = z2.object({
|
|
886
|
+
machineId: z2.string(),
|
|
887
|
+
machineName: z2.string(),
|
|
888
|
+
ownerId: z2.string(),
|
|
889
|
+
headSha: z2.string(),
|
|
890
|
+
branch: z2.string(),
|
|
891
|
+
isLive: z2.boolean(),
|
|
892
|
+
updatedAt: z2.number(),
|
|
893
|
+
files: z2.array(SyncedFileChangeSchema),
|
|
894
|
+
totalAdditions: z2.number(),
|
|
895
|
+
totalDeletions: z2.number()
|
|
896
|
+
});
|
|
874
897
|
var AgentPresenceSchema = z2.object({
|
|
875
898
|
agentType: z2.string(),
|
|
876
899
|
sessionId: z2.string(),
|
|
@@ -1283,7 +1306,8 @@ var YDOC_KEYS = {
|
|
|
1283
1306
|
EVENTS: "events",
|
|
1284
1307
|
SNAPSHOTS: "snapshots",
|
|
1285
1308
|
INPUT_REQUESTS: "inputRequests",
|
|
1286
|
-
LOCAL_DIFF_COMMENTS: "localDiffComments"
|
|
1309
|
+
LOCAL_DIFF_COMMENTS: "localDiffComments",
|
|
1310
|
+
CHANGE_SNAPSHOTS: "changeSnapshots"
|
|
1287
1311
|
};
|
|
1288
1312
|
var validKeys = new Set(Object.values(YDOC_KEYS));
|
|
1289
1313
|
var CommentBodySchema = z2.union([z2.string(), z2.array(z2.unknown())]);
|
|
@@ -2501,6 +2525,11 @@ var ImportConversationResponseSchema = z4.discriminatedUnion("success", [z4.obje
|
|
|
2501
2525
|
success: z4.literal(false),
|
|
2502
2526
|
error: z4.string()
|
|
2503
2527
|
})]);
|
|
2528
|
+
var MachineInfoResponseSchema = z4.object({
|
|
2529
|
+
machineId: z4.string(),
|
|
2530
|
+
machineName: z4.string(),
|
|
2531
|
+
ownerId: z4.string()
|
|
2532
|
+
});
|
|
2504
2533
|
var t = initTRPC.context().create({ allowOutsideOfServer: true });
|
|
2505
2534
|
var router = t.router;
|
|
2506
2535
|
var publicProcedure = t.procedure;
|
|
@@ -2607,6 +2636,9 @@ var planRouter = router({
|
|
|
2607
2636
|
error: "No working directory available"
|
|
2608
2637
|
};
|
|
2609
2638
|
return ctx.getFileContent(cwd, input.filePath);
|
|
2639
|
+
}),
|
|
2640
|
+
getMachineInfo: publicProcedure.input(PlanIdSchema).output(MachineInfoResponseSchema).query(async ({ ctx }) => {
|
|
2641
|
+
return ctx.getMachineInfo();
|
|
2610
2642
|
})
|
|
2611
2643
|
});
|
|
2612
2644
|
var subscriptionRouter = router({
|
|
@@ -3457,6 +3489,7 @@ import { WebrtcProvider } from "y-webrtc";
|
|
|
3457
3489
|
|
|
3458
3490
|
// src/server-identity.ts
|
|
3459
3491
|
import { execSync as execSync3 } from "child_process";
|
|
3492
|
+
import crypto2 from "crypto";
|
|
3460
3493
|
import os from "os";
|
|
3461
3494
|
import { basename } from "path";
|
|
3462
3495
|
import { z as z8 } from "zod";
|
|
@@ -3624,6 +3657,41 @@ function getEnvironmentContext() {
|
|
|
3624
3657
|
repo: getRepositoryFullName() || void 0
|
|
3625
3658
|
};
|
|
3626
3659
|
}
|
|
3660
|
+
var cachedMachineId = null;
|
|
3661
|
+
function getMachineId() {
|
|
3662
|
+
if (cachedMachineId) {
|
|
3663
|
+
return cachedMachineId;
|
|
3664
|
+
}
|
|
3665
|
+
const hostname = os.hostname();
|
|
3666
|
+
const user = process.env.USER || process.env.USERNAME;
|
|
3667
|
+
const cwd = process.cwd();
|
|
3668
|
+
if (!hostname) {
|
|
3669
|
+
throw new Error("Could not determine hostname for machine ID");
|
|
3670
|
+
}
|
|
3671
|
+
if (!user) {
|
|
3672
|
+
throw new Error("Could not determine username for machine ID (set USER or USERNAME env var)");
|
|
3673
|
+
}
|
|
3674
|
+
const hash = crypto2.createHash("sha256");
|
|
3675
|
+
hash.update(`${hostname}:${user}:${cwd}`);
|
|
3676
|
+
cachedMachineId = hash.digest("hex").slice(0, 16);
|
|
3677
|
+
logger.info({ machineId: cachedMachineId, hostname, user, cwd }, "Generated machine ID");
|
|
3678
|
+
return cachedMachineId;
|
|
3679
|
+
}
|
|
3680
|
+
function getMachineName() {
|
|
3681
|
+
const hostname = os.hostname();
|
|
3682
|
+
if (hostname.endsWith(".local")) {
|
|
3683
|
+
return hostname.slice(0, -6);
|
|
3684
|
+
}
|
|
3685
|
+
if (hostname.includes("-")) {
|
|
3686
|
+
const parts = hostname.split("-");
|
|
3687
|
+
if (parts.length >= 2) {
|
|
3688
|
+
const possessivePart = parts[0];
|
|
3689
|
+
const typePart = parts.slice(1).join(" ");
|
|
3690
|
+
return `${possessivePart}'s ${typePart}`;
|
|
3691
|
+
}
|
|
3692
|
+
}
|
|
3693
|
+
return hostname;
|
|
3694
|
+
}
|
|
3627
3695
|
|
|
3628
3696
|
// src/webrtc-provider.ts
|
|
3629
3697
|
var SIGNALING_SERVER = process.env.SIGNALING_URL || "wss://shipyard-signaling.jacob-191.workers.dev";
|
|
@@ -5425,7 +5493,12 @@ function createContext() {
|
|
|
5425
5493
|
hookHandlers: createHookHandlers(),
|
|
5426
5494
|
conversationHandlers: createConversationHandlers(),
|
|
5427
5495
|
getLocalChanges,
|
|
5428
|
-
getFileContent
|
|
5496
|
+
getFileContent,
|
|
5497
|
+
getMachineInfo: async () => ({
|
|
5498
|
+
machineId: getMachineId(),
|
|
5499
|
+
machineName: getMachineName(),
|
|
5500
|
+
ownerId: await getGitHubUsername()
|
|
5501
|
+
})
|
|
5429
5502
|
};
|
|
5430
5503
|
}
|
|
5431
5504
|
function createApp() {
|
|
@@ -59,7 +59,7 @@ import {
|
|
|
59
59
|
tryAcquireHubLock,
|
|
60
60
|
uploadArtifact,
|
|
61
61
|
webConfig
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-FLGKCBXM.js";
|
|
63
63
|
import {
|
|
64
64
|
logger
|
|
65
65
|
} from "./chunk-HFZCBGQ3.js";
|
|
@@ -3269,7 +3269,7 @@ async function setupReviewNotification(taskId, pollIntervalSeconds) {
|
|
|
3269
3269
|
return { script, fullResponse: text };
|
|
3270
3270
|
}
|
|
3271
3271
|
async function requestUserInput(opts) {
|
|
3272
|
-
const { InputRequestManager } = await import("./input-request-manager-
|
|
3272
|
+
const { InputRequestManager } = await import("./input-request-manager-3L5EHE23.js");
|
|
3273
3273
|
const ydoc = await getOrCreateDoc(PLAN_INDEX_DOC_NAME);
|
|
3274
3274
|
const manager = new InputRequestManager();
|
|
3275
3275
|
if ("questions" in opts && opts.questions) {
|