forge-openclaw-plugin 0.3.11 → 0.3.12

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.
@@ -173,6 +173,7 @@ const lifeForceRouteSpecs = {
173
173
  const workbenchRouteSpecs = {
174
174
  boxCatalog: { method: "GET", path: "/api/v1/workbench/catalog/boxes" },
175
175
  listFlows: { method: "GET", path: "/api/v1/workbench/flows" },
176
+ flowDetail: { method: "GET", path: "/api/v1/workbench/flows/:id" },
176
177
  flowById: { method: "GET", path: "/api/v1/workbench/flows/:id" },
177
178
  flowBySlug: {
178
179
  method: "GET",
@@ -212,6 +213,7 @@ const workbenchRouteSpecs = {
212
213
  method: "GET",
213
214
  path: "/api/v1/workbench/flows/:id/output"
214
215
  },
216
+ runHistory: { method: "GET", path: "/api/v1/workbench/flows/:id/runs" },
215
217
  runs: { method: "GET", path: "/api/v1/workbench/flows/:id/runs" },
216
218
  runDetail: {
217
219
  method: "GET",
@@ -0,0 +1,49 @@
1
+ INSERT OR IGNORE INTO users (
2
+ id, kind, handle, display_name, description, accent_color, created_at, updated_at
3
+ ) VALUES (
4
+ 'user_agent_claude',
5
+ 'bot',
6
+ 'claude',
7
+ 'Claude Code',
8
+ 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
9
+ '#f97316',
10
+ datetime('now'),
11
+ datetime('now')
12
+ );
13
+
14
+ UPDATE users
15
+ SET kind = 'bot',
16
+ handle = 'claude',
17
+ display_name = 'Claude Code',
18
+ description = 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
19
+ accent_color = '#f97316',
20
+ updated_at = datetime('now')
21
+ WHERE id = 'user_agent_claude';
22
+
23
+ UPDATE agent_identities
24
+ SET label = 'Forge Claude Code',
25
+ agent_type = 'claude',
26
+ provider = 'claude',
27
+ identity_key = COALESCE(identity_key, 'runtime:claude:legacy:default'),
28
+ machine_key = COALESCE(machine_key, 'legacy'),
29
+ persona_key = COALESCE(persona_key, 'default'),
30
+ description = 'Forge Claude Code runtime agent with stable Forge identity and linked Kanban user.',
31
+ updated_at = datetime('now')
32
+ WHERE lower(agent_type) = 'claude'
33
+ OR lower(label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
34
+
35
+ INSERT OR IGNORE INTO agent_identity_users (
36
+ agent_id, user_id, role, created_at, updated_at
37
+ )
38
+ SELECT id, 'user_agent_claude', 'primary', datetime('now'), datetime('now')
39
+ FROM agent_identities
40
+ WHERE provider = 'claude';
41
+
42
+ UPDATE agent_runtime_sessions
43
+ SET agent_label = 'Forge Claude Code',
44
+ agent_type = 'claude',
45
+ provider = 'claude',
46
+ updated_at = datetime('now')
47
+ WHERE provider = 'claude'
48
+ OR lower(agent_type) = 'claude'
49
+ OR lower(agent_label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
@@ -5134,9 +5134,11 @@ function buildAgentOnboardingPayload(request) {
5134
5134
  summary: "Dedicated graph-flow API. Use it for flow catalog reads, flow CRUD, execution, run history, published outputs, node results, and latest successful node outputs.",
5135
5135
  routeKeys: [
5136
5136
  "listFlows",
5137
+ "flowDetail",
5137
5138
  "flowById",
5138
5139
  "flowBySlug",
5139
5140
  "publishedOutput",
5141
+ "runHistory",
5140
5142
  "runs",
5141
5143
  "runDetail",
5142
5144
  "runNodes",
@@ -5160,9 +5162,11 @@ function buildAgentOnboardingPayload(request) {
5160
5162
  ],
5161
5163
  methodRoutes: {
5162
5164
  listFlows: "GET /api/v1/workbench/flows",
5165
+ flowDetail: "GET /api/v1/workbench/flows/:id",
5163
5166
  flowById: "GET /api/v1/workbench/flows/:id",
5164
5167
  flowBySlug: "GET /api/v1/workbench/flows/by-slug/:slug",
5165
5168
  publishedOutput: "GET /api/v1/workbench/flows/:id/output",
5169
+ runHistory: "GET /api/v1/workbench/flows/:id/runs",
5166
5170
  runs: "GET /api/v1/workbench/flows/:id/runs",
5167
5171
  runDetail: "GET /api/v1/workbench/flows/:id/runs/:runId",
5168
5172
  runNodes: "GET /api/v1/workbench/flows/:id/runs/:runId/nodes",
@@ -5178,9 +5182,11 @@ function buildAgentOnboardingPayload(request) {
5178
5182
  },
5179
5183
  readRoutes: {
5180
5184
  listFlows: "/api/v1/workbench/flows",
5185
+ flowDetail: "/api/v1/workbench/flows/:id",
5181
5186
  flowById: "/api/v1/workbench/flows/:id",
5182
5187
  flowBySlug: "/api/v1/workbench/flows/by-slug/:slug",
5183
5188
  publishedOutput: "/api/v1/workbench/flows/:id/output",
5189
+ runHistory: "/api/v1/workbench/flows/:id/runs",
5184
5190
  runs: "/api/v1/workbench/flows/:id/runs",
5185
5191
  runDetail: "/api/v1/workbench/flows/:id/runs/:runId",
5186
5192
  runNodes: "/api/v1/workbench/flows/:id/runs/:runId/nodes",
@@ -5199,6 +5205,7 @@ function buildAgentOnboardingPayload(request) {
5199
5205
  notes: [
5200
5206
  "Workbench is a dedicated execution surface, not a batch CRUD entity family.",
5201
5207
  "Route-selection questions are internal. User-facing questions should ask whether the user needs the saved flow, its input contract, one run, one node, or the public result instead of reciting Workbench route keys.",
5208
+ "`flowDetail` is the plain saved-flow detail route-key alias for `flowById`, and `runHistory` is the plain run-history route-key alias for `runs`. Keep the older keys valid for existing agents, but prefer the clearer aliases in new examples and guidance.",
5202
5209
  "Use the flow routes when the agent needs stable public input contracts, published outputs, node-level results, or reusable execution history.",
5203
5210
  "If the user is still figuring out inputs or editable structure, read flow detail or box catalog before asking them to reconstruct structured inputs from memory.",
5204
5211
  "For flow creation, clarify what the flow should reliably produce, which input contract it should accept, and which first node or box anchors the flow before asking for structured input details.",
@@ -5305,6 +5312,25 @@ function buildAgentOnboardingPayload(request) {
5305
5312
  "Use a distinct actor label such as Albert (codex) so Codex-originated work stays readable in Forge history.",
5306
5313
  "The Forge MCP bridge now self-registers as a live agent session and heartbeats while the MCP server process stays alive."
5307
5314
  ]
5315
+ },
5316
+ claude: {
5317
+ label: "Claude Code",
5318
+ installSteps: [
5319
+ "Install Claude Code, then run npx forge-memory configure and select Claude Code.",
5320
+ "Keep Claude pointed at the same Forge origin, port, and shared data root used by the rest of the local runtime.",
5321
+ "Restart the Claude Code session after MCP configuration changes so the Forge MCP server starts cleanly."
5322
+ ],
5323
+ verifyCommands: [
5324
+ "claude mcp list",
5325
+ "claude mcp get forge",
5326
+ "claude",
5327
+ `curl -s ${origin}/api/v1/health`
5328
+ ],
5329
+ configNotes: [
5330
+ "Forge Memory writes one user-scope Claude MCP server named forge in ~/.claude.json.",
5331
+ "The Claude MCP server command is npx forge-memory mcp, so Claude shares the same Forge runtime and data root as OpenClaw, Hermes, and Codex.",
5332
+ "Use a distinct actor label such as Albert (claude) so Claude-originated work stays readable in Forge history."
5333
+ ]
5308
5334
  }
5309
5335
  },
5310
5336
  verificationPaths: {
@@ -5340,8 +5366,10 @@ function buildAgentOnboardingPayload(request) {
5340
5366
  movementTripPointDelete: "/api/v1/movement/trips/:id/points/:pointId",
5341
5367
  workbenchBoxCatalog: "/api/v1/workbench/catalog/boxes",
5342
5368
  workbenchFlows: "/api/v1/workbench/flows",
5369
+ workbenchFlowDetail: "/api/v1/workbench/flows/:id",
5343
5370
  workbenchFlowBySlug: "/api/v1/workbench/flows/by-slug/:slug",
5344
5371
  workbenchPublishedOutput: "/api/v1/workbench/flows/:id/output",
5372
+ workbenchRunHistory: "/api/v1/workbench/flows/:id/runs",
5345
5373
  workbenchRuns: "/api/v1/workbench/flows/:id/runs",
5346
5374
  workbenchRunDetail: "/api/v1/workbench/flows/:id/runs/:runId",
5347
5375
  workbenchNodeResult: "/api/v1/workbench/flows/:id/runs/:runId/nodes/:nodeId",
@@ -5510,10 +5538,12 @@ function buildAgentOnboardingPayload(request) {
5510
5538
  lifeForceWeekdayTemplate: '{"routeKey":"weekdayTemplate","pathParams":{"weekday":"monday"},"body":{"points":[{"hour":13,"freeAp":-4}]}}',
5511
5539
  lifeForceFatigueSignal: '{"routeKey":"fatigueSignal","body":{"signal":"tired","intensity":7,"note":"Sharp post-lunch dip after clinic admin."}}',
5512
5540
  workbenchFlowCatalog: '{"routeKey":"listFlows","query":{"includeArchived":false}}',
5541
+ workbenchFlowDetail: '{"routeKey":"flowDetail","pathParams":{"id":"flow_research_digest"}}',
5513
5542
  workbenchBoxCatalog: '{"routeKey":"boxCatalog"}',
5514
5543
  workbenchCreateFlow: '{"routeKey":"createFlow","body":{"title":"Research digest","slug":"research-digest","description":"Turn a topic into a cited digest with a stable published summary.","nodes":[],"edges":[]}}',
5515
5544
  workbenchUpdateFlow: '{"routeKey":"updateFlow","pathParams":{"id":"flow_research_digest"},"body":{"description":"Keep the same input contract but add a stronger evidence-check node."}}',
5516
5545
  workbenchDeleteFlow: '{"routeKey":"deleteFlow","pathParams":{"id":"flow_research_digest"}}',
5546
+ workbenchRunHistory: '{"routeKey":"runHistory","pathParams":{"id":"flow_research_digest"},"query":{"limit":10}}',
5517
5547
  workbenchRunDetail: '{"routeKey":"runDetail","pathParams":{"id":"flow_research_digest","runId":"run_123"}}',
5518
5548
  workbenchRunNodes: '{"routeKey":"runNodes","pathParams":{"id":"flow_research_digest","runId":"run_123"}}',
5519
5549
  workbenchNodeResult: '{"routeKey":"nodeResult","pathParams":{"id":"flow_research_digest","runId":"run_123","nodeId":"node_summary"}}',
@@ -2380,7 +2380,7 @@ export function buildOpenApiDocument() {
2380
2380
  identityKey: nullable({ type: "string" }),
2381
2381
  provider: nullable({
2382
2382
  type: "string",
2383
- enum: ["openclaw", "hermes", "codex"]
2383
+ enum: ["openclaw", "hermes", "codex", "claude"]
2384
2384
  }),
2385
2385
  machineKey: nullable({ type: "string" }),
2386
2386
  personaKey: nullable({ type: "string" }),
@@ -2488,7 +2488,10 @@ export function buildOpenApiDocument() {
2488
2488
  agentId: nullable({ type: "string" }),
2489
2489
  agentLabel: { type: "string" },
2490
2490
  agentType: { type: "string" },
2491
- provider: { type: "string", enum: ["openclaw", "hermes", "codex"] },
2491
+ provider: {
2492
+ type: "string",
2493
+ enum: ["openclaw", "hermes", "codex", "claude"]
2494
+ },
2492
2495
  sessionKey: { type: "string" },
2493
2496
  sessionLabel: { type: "string" },
2494
2497
  actorLabel: { type: "string" },
@@ -49,6 +49,21 @@ function toReconnectPlan(row) {
49
49
  automationSupported: false
50
50
  });
51
51
  }
52
+ if (row.provider === "claude") {
53
+ return agentRuntimeReconnectPlanSchema.parse({
54
+ summary: "Restart or resume Claude Code so the Forge MCP server starts again and reconnects to the shared Forge runtime.",
55
+ commands: [
56
+ "claude mcp list",
57
+ "claude mcp get forge",
58
+ `curl -s ${forgeBaseUrl}/api/v1/health`
59
+ ],
60
+ notes: [
61
+ "Forge Memory configures Claude through a user-scope MCP server named forge that runs npx forge-memory mcp.",
62
+ "If Forge is local, keep Claude pointed at the same Forge origin, port, and shared data root."
63
+ ],
64
+ automationSupported: false
65
+ });
66
+ }
52
67
  return agentRuntimeReconnectPlanSchema.parse({
53
68
  summary: "Restart or resume the Codex session so the Forge MCP bridge launches again and re-registers with Forge.",
54
69
  commands: [
@@ -229,6 +244,9 @@ function canonicalRuntimeAgentLabel(provider) {
229
244
  if (provider === "hermes") {
230
245
  return "Forge Hermes";
231
246
  }
247
+ if (provider === "claude") {
248
+ return "Forge Claude Code";
249
+ }
232
250
  return "Forge Codex";
233
251
  }
234
252
  function canonicalRuntimeDescription(provider) {
@@ -253,6 +271,15 @@ function canonicalAgentUserSpec(provider) {
253
271
  accentColor: "#a78bfa"
254
272
  };
255
273
  }
274
+ if (provider === "claude") {
275
+ return {
276
+ id: "user_agent_claude",
277
+ handle: "claude",
278
+ displayName: "Claude Code",
279
+ description: "Claude Code runtime actor linked to Forge agent identity and Kanban ownership.",
280
+ accentColor: "#f97316"
281
+ };
282
+ }
256
283
  return {
257
284
  id: "user_agent_codex",
258
285
  handle: "codex",
@@ -415,7 +415,8 @@ function runtimeProviderFromAgentType(agentType) {
415
415
  const normalized = normalizeAgentIdentityPart(agentType);
416
416
  if (normalized === "openclaw" ||
417
417
  normalized === "hermes" ||
418
- normalized === "codex") {
418
+ normalized === "codex" ||
419
+ normalized === "claude") {
419
420
  return normalized;
420
421
  }
421
422
  return null;
@@ -289,7 +289,8 @@ export const defaultAgentScopePolicy = {
289
289
  export const agentRuntimeProviderSchema = z.enum([
290
290
  "openclaw",
291
291
  "hermes",
292
- "codex"
292
+ "codex",
293
+ "claude"
293
294
  ]);
294
295
  export const agentRuntimeConnectionModeSchema = z.enum([
295
296
  "operator_session",
@@ -2,7 +2,7 @@
2
2
  "id": "forge-openclaw-plugin",
3
3
  "name": "Forge",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
- "version": "0.3.11",
5
+ "version": "0.3.12",
6
6
  "activation": {
7
7
  "onStartup": true,
8
8
  "onCapabilities": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge-openclaw-plugin",
3
- "version": "0.3.11",
3
+ "version": "0.3.12",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -0,0 +1,49 @@
1
+ INSERT OR IGNORE INTO users (
2
+ id, kind, handle, display_name, description, accent_color, created_at, updated_at
3
+ ) VALUES (
4
+ 'user_agent_claude',
5
+ 'bot',
6
+ 'claude',
7
+ 'Claude Code',
8
+ 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
9
+ '#f97316',
10
+ datetime('now'),
11
+ datetime('now')
12
+ );
13
+
14
+ UPDATE users
15
+ SET kind = 'bot',
16
+ handle = 'claude',
17
+ display_name = 'Claude Code',
18
+ description = 'Claude Code runtime actor linked to Forge agent identity and Kanban ownership.',
19
+ accent_color = '#f97316',
20
+ updated_at = datetime('now')
21
+ WHERE id = 'user_agent_claude';
22
+
23
+ UPDATE agent_identities
24
+ SET label = 'Forge Claude Code',
25
+ agent_type = 'claude',
26
+ provider = 'claude',
27
+ identity_key = COALESCE(identity_key, 'runtime:claude:legacy:default'),
28
+ machine_key = COALESCE(machine_key, 'legacy'),
29
+ persona_key = COALESCE(persona_key, 'default'),
30
+ description = 'Forge Claude Code runtime agent with stable Forge identity and linked Kanban user.',
31
+ updated_at = datetime('now')
32
+ WHERE lower(agent_type) = 'claude'
33
+ OR lower(label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
34
+
35
+ INSERT OR IGNORE INTO agent_identity_users (
36
+ agent_id, user_id, role, created_at, updated_at
37
+ )
38
+ SELECT id, 'user_agent_claude', 'primary', datetime('now'), datetime('now')
39
+ FROM agent_identities
40
+ WHERE provider = 'claude';
41
+
42
+ UPDATE agent_runtime_sessions
43
+ SET agent_label = 'Forge Claude Code',
44
+ agent_type = 'claude',
45
+ provider = 'claude',
46
+ updated_at = datetime('now')
47
+ WHERE provider = 'claude'
48
+ OR lower(agent_type) = 'claude'
49
+ OR lower(agent_label) IN ('forge claude', 'forge claude code', 'claude', 'claude code');
@@ -145,6 +145,8 @@ Concrete route-key examples for internal use:
145
145
  `{"routeKey":"fatigueSignal","body":{"signal":"tired","intensity":7,"note":"Sharp post-lunch dip after clinic admin."}}`
146
146
  - Workbench flow catalog:
147
147
  `{"routeKey":"listFlows","query":{"includeArchived":false}}`
148
+ - Workbench flow detail:
149
+ `{"routeKey":"flowDetail","pathParams":{"id":"flow_research_digest"}}`
148
150
  - Workbench box catalog:
149
151
  `{"routeKey":"boxCatalog"}`
150
152
  - Workbench flow creation:
@@ -153,6 +155,8 @@ Concrete route-key examples for internal use:
153
155
  `{"routeKey":"updateFlow","pathParams":{"id":"flow_research_digest"},"body":{"description":"Keep the same input contract but add a stronger evidence-check node."}}`
154
156
  - Workbench flow deletion:
155
157
  `{"routeKey":"deleteFlow","pathParams":{"id":"flow_research_digest"}}`
158
+ - Workbench run history:
159
+ `{"routeKey":"runHistory","pathParams":{"id":"flow_research_digest"},"query":{"limit":10}}`
156
160
  - Workbench run detail:
157
161
  `{"routeKey":"runDetail","pathParams":{"id":"flow_research_digest","runId":"run_123"}}`
158
162
  - Workbench run nodes:
@@ -2221,6 +2221,8 @@ Lane-to-route map:
2221
2221
 
2222
2222
  - discover or inspect flows:
2223
2223
  `/api/v1/workbench/flows`, `/api/v1/workbench/flows/:id`, or `/api/v1/workbench/flows/by-slug/:slug`
2224
+ Use route key `flowDetail` for saved-flow detail by id; `flowById` remains valid
2225
+ for older agents.
2224
2226
  - create, update, or delete a flow:
2225
2227
  `POST /api/v1/workbench/flows`, then `PATCH /api/v1/workbench/flows/:id` or
2226
2228
  `DELETE /api/v1/workbench/flows/:id` for an existing saved flow
@@ -2232,6 +2234,8 @@ Lane-to-route map:
2232
2234
  `POST /api/v1/workbench/flows/:id/chat`
2233
2235
  - inspect published output or run history:
2234
2236
  `/api/v1/workbench/flows/:id/output` or `/api/v1/workbench/flows/:id/runs`
2237
+ Use route key `runHistory` for the run-history read; `runs` remains valid for
2238
+ older agents.
2235
2239
  - inspect one run or node result:
2236
2240
  `/api/v1/workbench/flows/:id/runs/:runId`,
2237
2241
  `/api/v1/workbench/flows/:id/runs/:runId/nodes`,