@synctek/forgeos 2.0.0
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/LICENSE +21 -0
- package/README.md +386 -0
- package/dist/cli/commands/analyze.d.ts +14 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +94 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/build.d.ts +11 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +86 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/changeset.d.ts +13 -0
- package/dist/cli/commands/changeset.d.ts.map +1 -0
- package/dist/cli/commands/changeset.js +174 -0
- package/dist/cli/commands/changeset.js.map +1 -0
- package/dist/cli/commands/evidence.d.ts +12 -0
- package/dist/cli/commands/evidence.d.ts.map +1 -0
- package/dist/cli/commands/evidence.js +94 -0
- package/dist/cli/commands/evidence.js.map +1 -0
- package/dist/cli/commands/federation.d.ts +13 -0
- package/dist/cli/commands/federation.d.ts.map +1 -0
- package/dist/cli/commands/federation.js +127 -0
- package/dist/cli/commands/federation.js.map +1 -0
- package/dist/cli/commands/gate.d.ts +15 -0
- package/dist/cli/commands/gate.d.ts.map +1 -0
- package/dist/cli/commands/gate.js +178 -0
- package/dist/cli/commands/gate.js.map +1 -0
- package/dist/cli/commands/initiative.d.ts +13 -0
- package/dist/cli/commands/initiative.d.ts.map +1 -0
- package/dist/cli/commands/initiative.js +130 -0
- package/dist/cli/commands/initiative.js.map +1 -0
- package/dist/cli/commands/mind.d.ts +16 -0
- package/dist/cli/commands/mind.d.ts.map +1 -0
- package/dist/cli/commands/mind.js +139 -0
- package/dist/cli/commands/mind.js.map +1 -0
- package/dist/cli/commands/outcome.d.ts +12 -0
- package/dist/cli/commands/outcome.d.ts.map +1 -0
- package/dist/cli/commands/outcome.js +85 -0
- package/dist/cli/commands/outcome.js.map +1 -0
- package/dist/cli/commands/project.d.ts +13 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +128 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/review.d.ts +15 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +167 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/score.d.ts +17 -0
- package/dist/cli/commands/score.d.ts.map +1 -0
- package/dist/cli/commands/score.js +168 -0
- package/dist/cli/commands/score.js.map +1 -0
- package/dist/cli/commands/session.d.ts +13 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +133 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/trust.d.ts +16 -0
- package/dist/cli/commands/trust.d.ts.map +1 -0
- package/dist/cli/commands/trust.js +261 -0
- package/dist/cli/commands/trust.js.map +1 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +48 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +139 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/handlers.d.ts +11 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +424 -0
- package/dist/handlers.js.map +1 -0
- package/dist/http-server.d.ts +25 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +246 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers.d.ts +11 -0
- package/dist/mcp/handlers.d.ts.map +1 -0
- package/dist/mcp/handlers.js +553 -0
- package/dist/mcp/handlers.js.map +1 -0
- package/dist/mcp/http-server.d.ts +25 -0
- package/dist/mcp/http-server.d.ts.map +1 -0
- package/dist/mcp/http-server.js +246 -0
- package/dist/mcp/http-server.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +40 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +944 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +531 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/shared/client.d.ts +59 -0
- package/dist/shared/client.d.ts.map +1 -0
- package/dist/shared/client.js +171 -0
- package/dist/shared/client.js.map +1 -0
- package/dist/shared/errors.d.ts +25 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +44 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/types.d.ts +111 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +10 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tools.d.ts +944 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +513 -0
- package/dist/tools.js.map +1 -0
- package/dist/trust/chain.d.ts +86 -0
- package/dist/trust/chain.d.ts.map +1 -0
- package/dist/trust/chain.js +176 -0
- package/dist/trust/chain.js.map +1 -0
- package/dist/trust/git-binding.d.ts +61 -0
- package/dist/trust/git-binding.d.ts.map +1 -0
- package/dist/trust/git-binding.js +133 -0
- package/dist/trust/git-binding.js.map +1 -0
- package/dist/trust/index.d.ts +20 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +17 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/ledger.d.ts +144 -0
- package/dist/trust/ledger.d.ts.map +1 -0
- package/dist/trust/ledger.js +351 -0
- package/dist/trust/ledger.js.map +1 -0
- package/dist/trust/signing.d.ts +134 -0
- package/dist/trust/signing.d.ts.map +1 -0
- package/dist/trust/signing.js +249 -0
- package/dist/trust/signing.js.map +1 -0
- package/dist/trust/transmission.d.ts +129 -0
- package/dist/trust/transmission.d.ts.map +1 -0
- package/dist/trust/transmission.js +390 -0
- package/dist/trust/transmission.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SyncTek LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
# @synctek/forgeos-mcp
|
|
2
|
+
|
|
3
|
+
MCP server that connects Claude Code (and any MCP-compatible AI agent) to the
|
|
4
|
+
[ForgeOS](https://synctek.io/forgeos) governance engine.
|
|
5
|
+
|
|
6
|
+
ForgeOS enforces structured software development through gates, initiatives,
|
|
7
|
+
and quality reviews. This server exposes the ForgeOS engine as 12 typed MCP
|
|
8
|
+
tools so your AI agent can create initiatives, propose changesets, submit
|
|
9
|
+
evidence, run structured reviews, promote gates, and query institutional
|
|
10
|
+
knowledge — all from within a single Claude Code session.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Quick Start (stdio — recommended for Claude Code)
|
|
15
|
+
|
|
16
|
+
No install required:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx -y @synctek/forgeos-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Set your API key and engine URL before running:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
FORGEOS_API_KEY=your-key FORGEOS_ENGINE_URL=https://api.synctek.io npx -y @synctek/forgeos-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Claude Desktop Integration
|
|
31
|
+
|
|
32
|
+
Add to your `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/`):
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"forgeos": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-y", "@synctek/forgeos-mcp"],
|
|
40
|
+
"env": {
|
|
41
|
+
"FORGEOS_API_KEY": "your-api-key-here",
|
|
42
|
+
"FORGEOS_ENGINE_URL": "https://api.synctek.io"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For Claude Code (`~/.claude/mcp.json` or project-level `.mcp.json`):
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"mcpServers": {
|
|
54
|
+
"forgeos": {
|
|
55
|
+
"command": "npx",
|
|
56
|
+
"args": ["-y", "@synctek/forgeos-mcp"],
|
|
57
|
+
"env": {
|
|
58
|
+
"FORGEOS_API_KEY": "your-api-key-here",
|
|
59
|
+
"FORGEOS_ENGINE_URL": "https://api.synctek.io"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## HTTP/SSE Mode
|
|
69
|
+
|
|
70
|
+
For remote deployments or multi-tenant scenarios, run the HTTP server instead
|
|
71
|
+
of stdio. Each request carries its own Bearer token — no shared state between
|
|
72
|
+
callers.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Start the HTTP server (default port 8401)
|
|
76
|
+
npx -y @synctek/forgeos-mcp forgeos-mcp-http
|
|
77
|
+
|
|
78
|
+
# Or after installing globally:
|
|
79
|
+
npm install -g @synctek/forgeos-mcp
|
|
80
|
+
forgeos-mcp-http
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Endpoints
|
|
84
|
+
|
|
85
|
+
| Method | Path | Description |
|
|
86
|
+
|----------|-----------|------------------------------------------|
|
|
87
|
+
| `POST` | `/mcp` | StreamableHTTP main channel (JSON-RPC) |
|
|
88
|
+
| `GET` | `/mcp` | SSE fallback (server-to-client events) |
|
|
89
|
+
| `DELETE` | `/mcp` | Session cleanup |
|
|
90
|
+
| `GET` | `/health` | Liveness probe — no auth required |
|
|
91
|
+
|
|
92
|
+
### Calling the HTTP endpoint
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Health check
|
|
96
|
+
curl http://localhost:8401/health
|
|
97
|
+
|
|
98
|
+
# MCP request with Bearer token
|
|
99
|
+
curl -X POST http://localhost:8401/mcp \
|
|
100
|
+
-H "Authorization: Bearer your-api-key" \
|
|
101
|
+
-H "Content-Type: application/json" \
|
|
102
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Connecting an MCP client to the HTTP endpoint
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcpServers": {
|
|
110
|
+
"forgeos": {
|
|
111
|
+
"transport": "http",
|
|
112
|
+
"url": "http://localhost:8401/mcp",
|
|
113
|
+
"headers": {
|
|
114
|
+
"Authorization": "Bearer your-api-key"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Configuration
|
|
124
|
+
|
|
125
|
+
| Environment Variable | Default | Description |
|
|
126
|
+
|------------------------|--------------------------|-----------------------------------------------------|
|
|
127
|
+
| `FORGEOS_API_KEY` | _(empty)_ | API key sent as `X-ForgeOS-API-Key` header |
|
|
128
|
+
| `FORGEOS_ENGINE_URL` | `http://localhost:8400` | Base URL of the ForgeOS engine |
|
|
129
|
+
| `MCP_HTTP_PORT` | `8401` | Port for the HTTP/SSE server |
|
|
130
|
+
| `RATE_LIMIT_MAX` | `60` | Max requests per window (HTTP mode) |
|
|
131
|
+
| `RATE_LIMIT_WINDOW_MS` | `60000` | Rate limit window in milliseconds (HTTP mode) |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Tools Reference
|
|
136
|
+
|
|
137
|
+
All tools return JSON. Errors surface as `{ "ok": false, "error": "..." }`.
|
|
138
|
+
|
|
139
|
+
### `forge_init`
|
|
140
|
+
|
|
141
|
+
Initialize a ForgeOS governance session. Returns project state, active work,
|
|
142
|
+
governance rules, and workflow runbook. Call on every session start.
|
|
143
|
+
|
|
144
|
+
| Parameter | Type | Required | Description |
|
|
145
|
+
|----------------|----------|----------|----------------------------------|
|
|
146
|
+
| `project_id` | `string` | Yes | Project to initialize |
|
|
147
|
+
| `developer_id` | `string` | No | Developer identifier (default: `local`) |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### `forge_create_initiative`
|
|
152
|
+
|
|
153
|
+
Create a new initiative to track a piece of work. Returns the initiative with
|
|
154
|
+
a generated ID.
|
|
155
|
+
|
|
156
|
+
| Parameter | Type | Required | Description |
|
|
157
|
+
|---------------|----------|----------|-----------------------------------------|
|
|
158
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
159
|
+
| `title` | `string` | Yes | Initiative title |
|
|
160
|
+
| `description` | `string` | Yes | What this initiative accomplishes |
|
|
161
|
+
| `priority` | `string` | No | `low` \| `medium` \| `high` \| `critical` (default: `medium`) |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### `forge_propose_changeset`
|
|
166
|
+
|
|
167
|
+
Propose a changeset for an initiative. The engine computes a risk score and
|
|
168
|
+
determines required gates, reviewer roles, and evidence. Returns the changeset
|
|
169
|
+
with a full gate pipeline.
|
|
170
|
+
|
|
171
|
+
| Parameter | Type | Required | Description |
|
|
172
|
+
|--------------------|------------|----------|------------------------------------|
|
|
173
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
174
|
+
| `initiative_id` | `string` | Yes | Parent initiative |
|
|
175
|
+
| `description` | `string` | Yes | What changed and why |
|
|
176
|
+
| `files_changed` | `string[]` | Yes | File paths that changed |
|
|
177
|
+
| `modules_affected` | `string[]` | Yes | Module/area names affected |
|
|
178
|
+
| `branch` | `string` | No | Git branch name |
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
### `forge_get_profile`
|
|
183
|
+
|
|
184
|
+
Fetch a reviewer persona profile for subagent injection. When a `project_id`
|
|
185
|
+
is provided, the profile is enriched with Shared Mind patterns from prior
|
|
186
|
+
reviews. Use the returned `system_prompt` as the subagent's instructions.
|
|
187
|
+
|
|
188
|
+
| Parameter | Type | Required | Description |
|
|
189
|
+
|--------------------|------------|----------|---------------------------------------------------------|
|
|
190
|
+
| `role` | `string` | Yes | `architect` \| `qa_test` \| `security` \| `performance` \| `reliability` \| `accessibility` \| `docs_release` |
|
|
191
|
+
| `project_id` | `string` | No | Project for contextualization |
|
|
192
|
+
| `team_id` | `string` | No | Team ID for Shared Mind context (default: `default`) |
|
|
193
|
+
| `modules_affected` | `string[]` | No | Modules to focus on |
|
|
194
|
+
| `files_changed` | `string[]` | No | Files to focus on |
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
### `forge_submit_evidence`
|
|
199
|
+
|
|
200
|
+
Submit evidence (test results, scan outputs, etc.) for a changeset.
|
|
201
|
+
Auto-populates gate evidence requirements.
|
|
202
|
+
|
|
203
|
+
| Parameter | Type | Required | Description |
|
|
204
|
+
|----------------|------------|----------|-----------------------------------------------------------------------------------------------|
|
|
205
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
206
|
+
| `changeset_id` | `string` | Yes | Changeset ID |
|
|
207
|
+
| `type` | `string` | Yes | `unit_test` \| `coverage` \| `lint` \| `security_scan` \| `benchmark` \| `migration_plan` \| `ux_snapshot` \| `a11y_audit` \| `ai_review` |
|
|
208
|
+
| `summary` | `string` | Yes | Summary of the evidence |
|
|
209
|
+
| `file_refs` | `string[]` | No | File references |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### `forge_submit_review`
|
|
214
|
+
|
|
215
|
+
Submit a complete review with findings and verdict. Creates and finalizes the
|
|
216
|
+
review in one call.
|
|
217
|
+
|
|
218
|
+
| Parameter | Type | Required | Description |
|
|
219
|
+
|----------------|------------|----------|-----------------------------------------------|
|
|
220
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
221
|
+
| `changeset_id` | `string` | Yes | Changeset ID |
|
|
222
|
+
| `role` | `string` | Yes | Reviewer role (e.g. `security`, `architect`) |
|
|
223
|
+
| `status` | `string` | Yes | `approved` \| `blocked` \| `pending` |
|
|
224
|
+
| `notes` | `string` | Yes | Review summary |
|
|
225
|
+
| `findings` | `object[]` | Yes | Structured findings (see below) |
|
|
226
|
+
|
|
227
|
+
Each finding in `findings`:
|
|
228
|
+
|
|
229
|
+
| Field | Type | Required | Description |
|
|
230
|
+
|------------------|----------|----------|------------------------------------------------|
|
|
231
|
+
| `category` | `string` | Yes | Finding category |
|
|
232
|
+
| `severity` | `string` | Yes | `pass` \| `warning` \| `concern` \| `fail` |
|
|
233
|
+
| `observation` | `string` | Yes | What was observed |
|
|
234
|
+
| `recommendation` | `string` | No | Suggested fix |
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
### `forge_check_gates`
|
|
239
|
+
|
|
240
|
+
Get the gate pipeline status for a changeset. Shows which gates are passed,
|
|
241
|
+
pending, or failed, and what is needed to advance.
|
|
242
|
+
|
|
243
|
+
| Parameter | Type | Required | Description |
|
|
244
|
+
|----------------|----------|----------|----------------|
|
|
245
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
246
|
+
| `changeset_id` | `string` | Yes | Changeset ID |
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### `forge_promote_gate`
|
|
251
|
+
|
|
252
|
+
Promote a gate to passed status. All requirements (evidence + reviews) must be
|
|
253
|
+
satisfied. Advances the pipeline to the next gate.
|
|
254
|
+
|
|
255
|
+
| Parameter | Type | Required | Description |
|
|
256
|
+
|----------------|----------|----------|-------------------------------------------------------------------------------------------------|
|
|
257
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
258
|
+
| `changeset_id` | `string` | Yes | Changeset ID |
|
|
259
|
+
| `gate_id` | `string` | Yes | `intent` \| `design` \| `implementation` \| `verification` \| `hardening` \| `release` |
|
|
260
|
+
| `promoted_by` | `string` | No | Who is promoting (default: `local_agent`) |
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### `forge_release_check`
|
|
265
|
+
|
|
266
|
+
Check if a changeset is ready to release. Returns `can_release` status and any
|
|
267
|
+
remaining blockers.
|
|
268
|
+
|
|
269
|
+
| Parameter | Type | Required | Description |
|
|
270
|
+
|----------------|----------|----------|----------------|
|
|
271
|
+
| `project_id` | `string` | Yes | Project ID |
|
|
272
|
+
| `changeset_id` | `string` | Yes | Changeset ID |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### `forge_query_mind`
|
|
277
|
+
|
|
278
|
+
Search the Shared Mind for institutional knowledge. Returns patterns,
|
|
279
|
+
anti-patterns, and lessons relevant to the given context.
|
|
280
|
+
|
|
281
|
+
| Parameter | Type | Required | Description |
|
|
282
|
+
|-----------|----------|----------|------------------------------------------|
|
|
283
|
+
| `context` | `string` | Yes | Search context (keywords, module names) |
|
|
284
|
+
| `team_id` | `string` | No | Team ID (default: `default`) |
|
|
285
|
+
| `domain` | `string` | No | Specific domain to search |
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
### `forge_observe`
|
|
290
|
+
|
|
291
|
+
Record an observation to the Shared Mind. Use when you discover patterns,
|
|
292
|
+
anti-patterns, or lessons during development.
|
|
293
|
+
|
|
294
|
+
| Parameter | Type | Required | Description |
|
|
295
|
+
|--------------------|------------|----------|---------------------------------------------------------------------------------|
|
|
296
|
+
| `domain` | `string` | Yes | Knowledge domain (e.g. module name, technology) |
|
|
297
|
+
| `observation_type` | `string` | Yes | `pattern` \| `anti-pattern` \| `fix-recipe` \| `architecture-decision` \| `lesson` |
|
|
298
|
+
| `content` | `string` | Yes | What was observed |
|
|
299
|
+
| `team_id` | `string` | No | Team ID (default: `default`) |
|
|
300
|
+
| `confidence` | `number` | No | Confidence 0.0–1.0 (default: `0.8`) |
|
|
301
|
+
| `tags` | `string[]` | No | Tags for categorization |
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### `forge_get_workflow`
|
|
306
|
+
|
|
307
|
+
Get the current workflow state for an initiative. Shows which step the
|
|
308
|
+
developer is on, what is needed next, and overall progress.
|
|
309
|
+
|
|
310
|
+
| Parameter | Type | Required | Description |
|
|
311
|
+
|-----------------|----------|----------|----------------|
|
|
312
|
+
| `initiative_id` | `string` | Yes | Initiative ID |
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Typical Workflow
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
forge_init → bootstrap session, get runbook
|
|
320
|
+
forge_create_initiative → create initiative, get initiative_id
|
|
321
|
+
forge_propose_changeset → propose work, engine computes risk + gates
|
|
322
|
+
forge_get_profile → fetch reviewer persona (optional: enrich with Shared Mind)
|
|
323
|
+
(run subagent review using returned system_prompt)
|
|
324
|
+
forge_submit_evidence → upload test results, scan output, etc.
|
|
325
|
+
forge_submit_review → record reviewer verdict + findings
|
|
326
|
+
forge_check_gates → inspect gate pipeline status
|
|
327
|
+
forge_promote_gate → advance gates as evidence accumulates
|
|
328
|
+
forge_release_check → confirm all gates cleared before shipping
|
|
329
|
+
forge_observe → record lessons learned back to Shared Mind
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Security
|
|
335
|
+
|
|
336
|
+
- **Per-request auth isolation** — the HTTP server creates a new `ForgeOSClient`
|
|
337
|
+
per request, threaded from the `Authorization: Bearer <key>` header.
|
|
338
|
+
`process.env` is never mutated and there is no shared singleton across requests.
|
|
339
|
+
- **Rate limiting** — token-bucket per API key (or IP fallback).
|
|
340
|
+
Default: 60 requests per 60-second window. Configurable via `RATE_LIMIT_MAX`
|
|
341
|
+
and `RATE_LIMIT_WINDOW_MS`.
|
|
342
|
+
- **No credential leakage** — stdio mode reads `FORGEOS_API_KEY` from env once
|
|
343
|
+
at startup (single-tenant). HTTP mode never touches env for key resolution.
|
|
344
|
+
- **CORS** — all origins allowed by default (clients are local AI agents).
|
|
345
|
+
Restrict in production by configuring a reverse proxy.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## Development
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Clone and install
|
|
353
|
+
git clone https://github.com/synctek/forgeos-mcp
|
|
354
|
+
cd forgeos-mcp
|
|
355
|
+
npm install
|
|
356
|
+
|
|
357
|
+
# Run stdio server in dev mode (tsx, no build required)
|
|
358
|
+
npm run dev
|
|
359
|
+
|
|
360
|
+
# Run HTTP server in dev mode
|
|
361
|
+
npm run dev:http
|
|
362
|
+
|
|
363
|
+
# Build
|
|
364
|
+
npm run build
|
|
365
|
+
|
|
366
|
+
# Run built stdio server
|
|
367
|
+
npm start
|
|
368
|
+
|
|
369
|
+
# Run built HTTP server
|
|
370
|
+
npm run start:http
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Links
|
|
376
|
+
|
|
377
|
+
- Product: [synctek.io/forgeos](https://synctek.io/forgeos)
|
|
378
|
+
- Docs: [docs.synctek.io/forgeos](https://docs.synctek.io/forgeos)
|
|
379
|
+
- Issues: [github.com/synctek/forgeos-mcp/issues](https://github.com/synctek/forgeos-mcp/issues)
|
|
380
|
+
- npm: [@synctek/forgeos-mcp](https://www.npmjs.com/package/@synctek/forgeos-mcp)
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## License
|
|
385
|
+
|
|
386
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge analyze` — Local analysis entry point.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge analyze [path] [--init] — initialise keys (--init) or run analysis
|
|
6
|
+
* forge analyze [path] --project <pid> — submit analysis to engine
|
|
7
|
+
*
|
|
8
|
+
* If --init: initialises the local keypair + ledger directories.
|
|
9
|
+
* Otherwise: POSTs analysis request to engine, or hints to install forgeos-analysis.
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from "commander";
|
|
12
|
+
import { ForgeOSClient } from "../../shared/client.js";
|
|
13
|
+
export declare function registerAnalyzeCommands(parent: Command, client: ForgeOSClient): void;
|
|
14
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAWvD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,aAAa,GACpB,IAAI,CA4GN"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge analyze` — Local analysis entry point.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge analyze [path] [--init] — initialise keys (--init) or run analysis
|
|
6
|
+
* forge analyze [path] --project <pid> — submit analysis to engine
|
|
7
|
+
*
|
|
8
|
+
* If --init: initialises the local keypair + ledger directories.
|
|
9
|
+
* Otherwise: POSTs analysis request to engine, or hints to install forgeos-analysis.
|
|
10
|
+
*/
|
|
11
|
+
import { mkdirSync } from "fs";
|
|
12
|
+
import { join, resolve } from "path";
|
|
13
|
+
import { KeyManager } from "../../trust/signing.js";
|
|
14
|
+
import { formatTable, formatJSON, formatSuccess, formatWarning, formatError, } from "../output.js";
|
|
15
|
+
export function registerAnalyzeCommands(parent, client) {
|
|
16
|
+
parent
|
|
17
|
+
.command("analyze [path]")
|
|
18
|
+
.description("Analyse a project: initialise keys (--init) or submit to engine")
|
|
19
|
+
.option("--init", "Initialise local keypair and .forgeos directory structure")
|
|
20
|
+
.option("-p, --project <pid>", "Project ID (for engine-based analysis)")
|
|
21
|
+
.option("--json", "Output raw JSON")
|
|
22
|
+
.action(async (pathArg, opts) => {
|
|
23
|
+
const projectPath = resolve(pathArg ?? process.cwd());
|
|
24
|
+
// ------------------------------------------------------------------
|
|
25
|
+
// --init: generate keys + create directory structure
|
|
26
|
+
// ------------------------------------------------------------------
|
|
27
|
+
if (opts.init) {
|
|
28
|
+
try {
|
|
29
|
+
const forgeoDir = join(projectPath, ".forgeos");
|
|
30
|
+
mkdirSync(join(forgeoDir, "keys"), { recursive: true });
|
|
31
|
+
const km = new KeyManager(projectPath);
|
|
32
|
+
const fingerprint = km.generateKeypair();
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
console.log(formatJSON({
|
|
35
|
+
initialized: true,
|
|
36
|
+
project_path: projectPath,
|
|
37
|
+
fingerprint,
|
|
38
|
+
private_key: km.privateKeyPath,
|
|
39
|
+
public_key: km.publicKeyPath,
|
|
40
|
+
}));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log(formatSuccess("Project initialised."));
|
|
44
|
+
console.log(formatTable(["Field", "Value"], [
|
|
45
|
+
["Path", projectPath],
|
|
46
|
+
["Fingerprint", fingerprint],
|
|
47
|
+
["Private Key", km.privateKeyPath],
|
|
48
|
+
["Public Key", km.publicKeyPath],
|
|
49
|
+
]));
|
|
50
|
+
console.log("\nNext steps:\n" +
|
|
51
|
+
" forge analyze [path] — run analysis via engine\n" +
|
|
52
|
+
" pip install forgeos-analysis — run local ruff/AST analysis\n" +
|
|
53
|
+
" forge trust verify [path] — verify chain integrity\n");
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(formatError(err));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// ------------------------------------------------------------------
|
|
62
|
+
// Engine-based analysis
|
|
63
|
+
// ------------------------------------------------------------------
|
|
64
|
+
if (opts.project) {
|
|
65
|
+
try {
|
|
66
|
+
const data = await client.post(`/api/projects/${opts.project}/analyze`, { path: projectPath });
|
|
67
|
+
if (opts.json) {
|
|
68
|
+
console.log(formatJSON(data));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
console.log(formatSuccess("Analysis submitted."));
|
|
72
|
+
console.log(formatJSON(data));
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(formatError(err));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// ------------------------------------------------------------------
|
|
81
|
+
// Local analysis hint (no engine, no --init)
|
|
82
|
+
// ------------------------------------------------------------------
|
|
83
|
+
console.log(formatWarning("No --project specified. To run local ruff/AST analysis:\n\n" +
|
|
84
|
+
" pip install forgeos-analysis\n" +
|
|
85
|
+
" forgeos-analysis " +
|
|
86
|
+
projectPath +
|
|
87
|
+
"\n\n" +
|
|
88
|
+
"Or submit to the ForgeOS engine:\n\n" +
|
|
89
|
+
" forge analyze " +
|
|
90
|
+
pathArg +
|
|
91
|
+
" --project <pid>"));
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge build` — Build and delivery commands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge build start --project <pid> --changeset <cid>
|
|
6
|
+
* forge build status --project <pid> --changeset <cid>
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
import { ForgeOSClient } from "../../shared/client.js";
|
|
10
|
+
export declare function registerBuildCommands(parent: Command, client: ForgeOSClient): void;
|
|
11
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA6BvD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,aAAa,GACpB,IAAI,CAuFN"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge build` — Build and delivery commands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge build start --project <pid> --changeset <cid>
|
|
6
|
+
* forge build status --project <pid> --changeset <cid>
|
|
7
|
+
*/
|
|
8
|
+
import { formatTable, formatJSON, formatSuccess, formatError, formatStatus, green, yellow, red, } from "../output.js";
|
|
9
|
+
function buildStatusColor(status) {
|
|
10
|
+
const s = status.toLowerCase();
|
|
11
|
+
if (s === "success" || s === "complete" || s === "passed")
|
|
12
|
+
return green(status);
|
|
13
|
+
if (s === "running" || s === "pending")
|
|
14
|
+
return yellow(status);
|
|
15
|
+
if (s === "failed" || s === "error")
|
|
16
|
+
return red(status);
|
|
17
|
+
return status;
|
|
18
|
+
}
|
|
19
|
+
export function registerBuildCommands(parent, client) {
|
|
20
|
+
const build = parent
|
|
21
|
+
.command("build")
|
|
22
|
+
.description("Trigger and monitor changeset builds");
|
|
23
|
+
// -------------------------------------------------------------------------
|
|
24
|
+
// build start
|
|
25
|
+
// -------------------------------------------------------------------------
|
|
26
|
+
build
|
|
27
|
+
.command("start")
|
|
28
|
+
.description("Start a build for a changeset")
|
|
29
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
30
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
31
|
+
.option("--json", "Output raw JSON")
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
try {
|
|
34
|
+
const data = (await client.post(`/api/projects/${opts.project}/changesets/${opts.changeset}/build`));
|
|
35
|
+
if (opts.json) {
|
|
36
|
+
console.log(formatJSON(data));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(formatSuccess("Build started."));
|
|
40
|
+
console.log(formatTable(["Field", "Value"], [
|
|
41
|
+
["Build ID", data.build_id ?? "—"],
|
|
42
|
+
["Status", buildStatusColor(data.status ?? "pending")],
|
|
43
|
+
["Started At", data.started_at ?? "—"],
|
|
44
|
+
]));
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.error(formatError(err));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
// build status
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
build
|
|
55
|
+
.command("status")
|
|
56
|
+
.description("Check build status for a changeset")
|
|
57
|
+
.requiredOption("-p, --project <pid>", "Project ID")
|
|
58
|
+
.requiredOption("--changeset <cid>", "Changeset ID")
|
|
59
|
+
.option("--json", "Output raw JSON")
|
|
60
|
+
.action(async (opts) => {
|
|
61
|
+
try {
|
|
62
|
+
const data = (await client.get(`/api/projects/${opts.project}/changesets/${opts.changeset}/build`));
|
|
63
|
+
if (opts.json) {
|
|
64
|
+
console.log(formatJSON(data));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const status = data.status ?? "unknown";
|
|
68
|
+
console.log(formatStatus("Build status", buildStatusColor(status)));
|
|
69
|
+
console.log(formatTable(["Field", "Value"], [
|
|
70
|
+
["Build ID", data.build_id ?? "—"],
|
|
71
|
+
["Status", buildStatusColor(status)],
|
|
72
|
+
["Started At", data.started_at ?? "—"],
|
|
73
|
+
["Completed At", data.completed_at ?? "—"],
|
|
74
|
+
]));
|
|
75
|
+
if (data.logs) {
|
|
76
|
+
console.log("\nBuild logs:");
|
|
77
|
+
console.log(data.logs);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error(formatError(err));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `forge changeset` — Changeset operations.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* forge changeset propose --project <pid> --description <desc> [--modules m1,m2] [--files f1,f2]
|
|
6
|
+
* forge changeset list --project <pid>
|
|
7
|
+
* forge changeset show --project <pid> <id>
|
|
8
|
+
* forge changeset warnings --project <pid> <id>
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from "commander";
|
|
11
|
+
import { ForgeOSClient } from "../../shared/client.js";
|
|
12
|
+
export declare function registerChangesetCommands(parent: Command, client: ForgeOSClient): void;
|
|
13
|
+
//# sourceMappingURL=changeset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeset.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/changeset.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAYvD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,aAAa,GACpB,IAAI,CAuNN"}
|