@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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +386 -0
  3. package/dist/cli/commands/analyze.d.ts +14 -0
  4. package/dist/cli/commands/analyze.d.ts.map +1 -0
  5. package/dist/cli/commands/analyze.js +94 -0
  6. package/dist/cli/commands/analyze.js.map +1 -0
  7. package/dist/cli/commands/build.d.ts +11 -0
  8. package/dist/cli/commands/build.d.ts.map +1 -0
  9. package/dist/cli/commands/build.js +86 -0
  10. package/dist/cli/commands/build.js.map +1 -0
  11. package/dist/cli/commands/changeset.d.ts +13 -0
  12. package/dist/cli/commands/changeset.d.ts.map +1 -0
  13. package/dist/cli/commands/changeset.js +174 -0
  14. package/dist/cli/commands/changeset.js.map +1 -0
  15. package/dist/cli/commands/evidence.d.ts +12 -0
  16. package/dist/cli/commands/evidence.d.ts.map +1 -0
  17. package/dist/cli/commands/evidence.js +94 -0
  18. package/dist/cli/commands/evidence.js.map +1 -0
  19. package/dist/cli/commands/federation.d.ts +13 -0
  20. package/dist/cli/commands/federation.d.ts.map +1 -0
  21. package/dist/cli/commands/federation.js +127 -0
  22. package/dist/cli/commands/federation.js.map +1 -0
  23. package/dist/cli/commands/gate.d.ts +15 -0
  24. package/dist/cli/commands/gate.d.ts.map +1 -0
  25. package/dist/cli/commands/gate.js +178 -0
  26. package/dist/cli/commands/gate.js.map +1 -0
  27. package/dist/cli/commands/initiative.d.ts +13 -0
  28. package/dist/cli/commands/initiative.d.ts.map +1 -0
  29. package/dist/cli/commands/initiative.js +130 -0
  30. package/dist/cli/commands/initiative.js.map +1 -0
  31. package/dist/cli/commands/mind.d.ts +16 -0
  32. package/dist/cli/commands/mind.d.ts.map +1 -0
  33. package/dist/cli/commands/mind.js +139 -0
  34. package/dist/cli/commands/mind.js.map +1 -0
  35. package/dist/cli/commands/outcome.d.ts +12 -0
  36. package/dist/cli/commands/outcome.d.ts.map +1 -0
  37. package/dist/cli/commands/outcome.js +85 -0
  38. package/dist/cli/commands/outcome.js.map +1 -0
  39. package/dist/cli/commands/project.d.ts +13 -0
  40. package/dist/cli/commands/project.d.ts.map +1 -0
  41. package/dist/cli/commands/project.js +128 -0
  42. package/dist/cli/commands/project.js.map +1 -0
  43. package/dist/cli/commands/review.d.ts +15 -0
  44. package/dist/cli/commands/review.d.ts.map +1 -0
  45. package/dist/cli/commands/review.js +167 -0
  46. package/dist/cli/commands/review.js.map +1 -0
  47. package/dist/cli/commands/score.d.ts +17 -0
  48. package/dist/cli/commands/score.d.ts.map +1 -0
  49. package/dist/cli/commands/score.js +168 -0
  50. package/dist/cli/commands/score.js.map +1 -0
  51. package/dist/cli/commands/session.d.ts +13 -0
  52. package/dist/cli/commands/session.d.ts.map +1 -0
  53. package/dist/cli/commands/session.js +133 -0
  54. package/dist/cli/commands/session.js.map +1 -0
  55. package/dist/cli/commands/trust.d.ts +16 -0
  56. package/dist/cli/commands/trust.d.ts.map +1 -0
  57. package/dist/cli/commands/trust.js +261 -0
  58. package/dist/cli/commands/trust.js.map +1 -0
  59. package/dist/cli/index.d.ts +19 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +99 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/output.d.ts +48 -0
  64. package/dist/cli/output.d.ts.map +1 -0
  65. package/dist/cli/output.js +139 -0
  66. package/dist/cli/output.js.map +1 -0
  67. package/dist/client.d.ts +46 -0
  68. package/dist/client.d.ts.map +1 -0
  69. package/dist/client.js +146 -0
  70. package/dist/client.js.map +1 -0
  71. package/dist/handlers.d.ts +11 -0
  72. package/dist/handlers.d.ts.map +1 -0
  73. package/dist/handlers.js +424 -0
  74. package/dist/handlers.js.map +1 -0
  75. package/dist/http-server.d.ts +25 -0
  76. package/dist/http-server.d.ts.map +1 -0
  77. package/dist/http-server.js +246 -0
  78. package/dist/http-server.js.map +1 -0
  79. package/dist/index.d.ts +3 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +40 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/mcp/handlers.d.ts +11 -0
  84. package/dist/mcp/handlers.d.ts.map +1 -0
  85. package/dist/mcp/handlers.js +553 -0
  86. package/dist/mcp/handlers.js.map +1 -0
  87. package/dist/mcp/http-server.d.ts +25 -0
  88. package/dist/mcp/http-server.d.ts.map +1 -0
  89. package/dist/mcp/http-server.js +246 -0
  90. package/dist/mcp/http-server.js.map +1 -0
  91. package/dist/mcp/index.d.ts +3 -0
  92. package/dist/mcp/index.d.ts.map +1 -0
  93. package/dist/mcp/index.js +40 -0
  94. package/dist/mcp/index.js.map +1 -0
  95. package/dist/mcp/tools.d.ts +944 -0
  96. package/dist/mcp/tools.d.ts.map +1 -0
  97. package/dist/mcp/tools.js +531 -0
  98. package/dist/mcp/tools.js.map +1 -0
  99. package/dist/shared/client.d.ts +59 -0
  100. package/dist/shared/client.d.ts.map +1 -0
  101. package/dist/shared/client.js +171 -0
  102. package/dist/shared/client.js.map +1 -0
  103. package/dist/shared/errors.d.ts +25 -0
  104. package/dist/shared/errors.d.ts.map +1 -0
  105. package/dist/shared/errors.js +44 -0
  106. package/dist/shared/errors.js.map +1 -0
  107. package/dist/shared/types.d.ts +111 -0
  108. package/dist/shared/types.d.ts.map +1 -0
  109. package/dist/shared/types.js +10 -0
  110. package/dist/shared/types.js.map +1 -0
  111. package/dist/tools.d.ts +944 -0
  112. package/dist/tools.d.ts.map +1 -0
  113. package/dist/tools.js +513 -0
  114. package/dist/tools.js.map +1 -0
  115. package/dist/trust/chain.d.ts +86 -0
  116. package/dist/trust/chain.d.ts.map +1 -0
  117. package/dist/trust/chain.js +176 -0
  118. package/dist/trust/chain.js.map +1 -0
  119. package/dist/trust/git-binding.d.ts +61 -0
  120. package/dist/trust/git-binding.d.ts.map +1 -0
  121. package/dist/trust/git-binding.js +133 -0
  122. package/dist/trust/git-binding.js.map +1 -0
  123. package/dist/trust/index.d.ts +20 -0
  124. package/dist/trust/index.d.ts.map +1 -0
  125. package/dist/trust/index.js +17 -0
  126. package/dist/trust/index.js.map +1 -0
  127. package/dist/trust/ledger.d.ts +144 -0
  128. package/dist/trust/ledger.d.ts.map +1 -0
  129. package/dist/trust/ledger.js +351 -0
  130. package/dist/trust/ledger.js.map +1 -0
  131. package/dist/trust/signing.d.ts +134 -0
  132. package/dist/trust/signing.d.ts.map +1 -0
  133. package/dist/trust/signing.js +249 -0
  134. package/dist/trust/signing.js.map +1 -0
  135. package/dist/trust/transmission.d.ts +129 -0
  136. package/dist/trust/transmission.d.ts.map +1 -0
  137. package/dist/trust/transmission.js +390 -0
  138. package/dist/trust/transmission.js.map +1 -0
  139. package/dist/types.d.ts +183 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +3 -0
  142. package/dist/types.js.map +1 -0
  143. 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":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,uBAAuB,CACrC,MAAe,EACf,MAAqB;IAErB,MAAM;SACH,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CACV,iEAAiE,CAClE;SACA,MAAM,CACL,QAAQ,EACR,2DAA2D,CAC5D;SACA,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,qEAAqE;QACrE,qDAAqD;QACrD,qEAAqE;QAErE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBAChD,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAExD,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;gBACvC,MAAM,WAAW,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;gBAEzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CACT,UAAU,CAAC;wBACT,WAAW,EAAE,IAAI;wBACjB,YAAY,EAAE,WAAW;wBACzB,WAAW;wBACX,WAAW,EAAE,EAAE,CAAC,cAAc;wBAC9B,UAAU,EAAE,EAAE,CAAC,aAAa;qBAC7B,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CACT,WAAW,CACT,CAAC,OAAO,EAAE,OAAO,CAAC,EAClB;oBACE,CAAC,MAAM,EAAE,WAAW,CAAC;oBACrB,CAAC,aAAa,EAAE,WAAW,CAAC;oBAC5B,CAAC,aAAa,EAAE,EAAE,CAAC,cAAc,CAAC;oBAClC,CAAC,YAAY,EAAE,EAAE,CAAC,aAAa,CAAC;iBACjC,CACF,CACF,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,iBAAiB;oBACjB,+DAA+D;oBAC/D,mEAAmE;oBACnE,8DAA8D,CAC/D,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAY,CAAC,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,wBAAwB;QACxB,qEAAqE;QAErE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC5B,iBAAiB,IAAI,CAAC,OAAO,UAAU,EACvC,EAAE,IAAI,EAAE,WAAW,EAAE,CACtB,CAAC;gBAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC9B,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAA4B,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,6CAA6C;QAC7C,qEAAqE;QAErE,OAAO,CAAC,GAAG,CACT,aAAa,CACX,6DAA6D;YAC7D,kCAAkC;YAClC,qBAAqB;YACrB,WAAW;YACX,MAAM;YACN,sCAAsC;YACtC,kBAAkB;YAClB,OAAO;YACP,kBAAkB,CACnB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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"}