@akira-tl/forgerelay 1.3.2 → 1.3.3

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/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable ForgeRelay changes are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.3.3] - 2026-10-15
8
+
9
+ ### Fixed
10
+
11
+ - `open_workspace` 现在明确区分 Host 顶层 Core tool、`capabilityCatalog` 与 `capabilityFingerprint`:`minimal` / `full` 的核心工具仍由 Host 当前 `tools/list` snapshot 决定,不再允许仅因 fingerprint/catalog 未列出 `write`、`edit` 或 `bash` 就把 ForgeRelay 判断为只读;模型可见标签也改为明确的 Capability catalog 与 semantic feature fingerprint 表述。
12
+
7
13
  ## [1.3.2] - 2026-10-08
8
14
 
9
15
  ### Security
@@ -12,7 +12,7 @@ import { logToolCall, workspaceLogContext } from "../../core/tool-support.js";
12
12
  import { buildExecutionShellContext } from "../../../server-instructions.js";
13
13
  import { workspaceColorFor, workspaceIdentityName } from "../../../../workspace-colors.js";
14
14
  export const workspaceTaskUsageInstruction = "Use workspace.tasks proactively for work that spans multiple steps or sessions: create or update Tasks to preserve useful next steps and current state, and read its summary when resuming relevant unfinished work. Do not query it mechanically on every open_workspace call.";
15
- export const capabilityDiscoveryInstruction = "For capability describe/run, use only names present in capabilityCatalog. capabilityFingerprint.capabilities is a semantic feature fingerprint, not a callable registry; capabilityGuides are documentation descriptors, not callable capabilities.";
15
+ export const capabilityDiscoveryInstruction = "Core MCP tools are separate from capabilityCatalog and capabilityFingerprint; the Host's current tools/list snapshot determines which top-level tools can be called. In toolMode=minimal or full, ForgeRelay's regular core surface is open_workspace, capability, close_workspace, read, write, edit, rename, delete, and bash. Do not infer that write, edit, or bash are unavailable merely because they are absent from capabilityCatalog or capabilityFingerprint. If an expected core tool is missing from the Host tool snapshot, treat the Host MCP metadata as stale or incomplete rather than describing ForgeRelay as read-only. For capability describe/run, use only names present in capabilityCatalog. capabilityFingerprint.capabilities is a semantic feature fingerprint, not a callable registry; capabilityGuides are documentation descriptors, not callable capabilities.";
16
16
  export async function presentLocalWorkspaceOpen(options, input, contextData) {
17
17
  const { config, forgerelayVersion: FORGERELAY_VERSION, workspaces, workspaceTasks, reviewCheckpoints, capabilityRegistry, subagentProviders, hooks, rememberWorkspacePanelState, } = options;
18
18
  const { path, workspaceId, mode, baseRef, targetBranch, newWorktree, newWorkspace, context } = input;
@@ -155,7 +155,7 @@ export async function presentLocalWorkspaceOpen(options, input, contextData) {
155
155
  ? `Available skills: ${visibleSkills.map((skill) => skill.name).join(", ")}`
156
156
  : undefined,
157
157
  capabilityCatalog.length > 0
158
- ? `Optional capabilities: ${capabilityCatalog.map((entry) => entry.name).join(", ")}`
158
+ ? `Capability catalog entries: ${capabilityCatalog.map((entry) => entry.name).join(", ")}`
159
159
  : undefined,
160
160
  visibleCapabilityGuides.length > 0
161
161
  ? `Capability guides: ${visibleCapabilityGuides.map((guide) => guide.name).join(", ")}`
@@ -175,7 +175,7 @@ export async function presentLocalWorkspaceOpen(options, input, contextData) {
175
175
  staleWorkspaces.length > 0
176
176
  ? `This Workspace has been idle for more than 2 days: ${staleWorkspaces.map((stale) => `${stale.workspaceId} last-used=${stale.lastUsedAt}`).join(", ")}. It remains available to resume or explicitly close; do not clean it up automatically.`
177
177
  : undefined,
178
- `ForgeRelay ${capabilityFingerprint.version} capabilities: ${capabilityFingerprint.capabilities.join(", ")}`,
178
+ `ForgeRelay semantic feature fingerprint (${capabilityFingerprint.version}): ${capabilityFingerprint.capabilities.join(", ")}`,
179
179
  instruction,
180
180
  resourceUpdate?.text,
181
181
  ].filter(Boolean).join("\n"),
@@ -503,7 +503,7 @@ async function handleOpenWorkspace(options, input, requestContext) {
503
503
  ? `Available skills: ${relayedSkills.map((skill) => String(skill.name ?? "")).filter(Boolean).join(", ")}`
504
504
  : undefined,
505
505
  relayedCapabilities.length > 0
506
- ? `Optional capabilities: ${relayedCapabilities.map((entry) => String(entry.name ?? "")).filter(Boolean).join(", ")}`
506
+ ? `Capability catalog entries: ${relayedCapabilities.map((entry) => String(entry.name ?? "")).filter(Boolean).join(", ")}`
507
507
  : undefined,
508
508
  opened.instruction,
509
509
  ].filter(Boolean).join("\n");
@@ -453,7 +453,12 @@ version, tool mode, and stable semantic capability names. The fingerprint also
453
453
  reports enabled optional domains such as subagent profile discovery, native
454
454
  artifact download, MCP App UI, or aggregate `review.changes` when those
455
455
  features are actually available; it remains a semantic summary rather than a
456
- copy of `tools/list`.
456
+ copy of `tools/list`. Neither `capabilityFingerprint` nor `capabilityCatalog`
457
+ is evidence that an omitted Core tool is unavailable. The Host's current
458
+ `tools/list` snapshot is authoritative for top-level callability; in
459
+ `minimal` and `full`, the expected regular Core surface remains
460
+ `open_workspace`, `capability`, `close_workspace`, `read`, `write`,
461
+ `edit`, `rename`, `delete`, and `bash`.
457
462
 
458
463
  Bootstrap responses also return `capabilityGuides`, which are compact descriptors
459
464
  for built-in ForgeRelay documentation that the Agent can explicitly load with
@@ -466,11 +471,14 @@ context.
466
471
 
467
472
  There is no separate progressive-disclosure configuration switch. Capability
468
473
  Guide discovery is built in, while optional low-frequency actions are advertised
469
- through the workspace Capability catalog instead of adding top-level tools. If the
470
- fingerprint reports a capability that is missing from the Host's current tool
471
- snapshot, treat that as stale Host MCP metadata: reconnect/refresh the integration
472
- or use a Host context that reloads `tools/list`. The ForgeRelay process cannot
473
- force a Host to invalidate its cached schema.
474
+ through the workspace Capability catalog instead of adding top-level tools. If an
475
+ expected Core tool is missing from the Host's current tool snapshot, or the
476
+ fingerprint reports a semantic feature that the Host metadata does not reflect,
477
+ treat that as stale or incomplete Host MCP metadata: reconnect/refresh the
478
+ integration or use a Host context that reloads `tools/list`. Do not describe
479
+ ForgeRelay as read-only merely because `write`, `edit`, or `bash` is absent
480
+ from the fingerprint or Capability catalog. The ForgeRelay process cannot force
481
+ a Host to invalidate its cached schema.
474
482
 
475
483
  ### LSP code intelligence
476
484
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akira-tl/forgerelay",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "Local development control plane for MCP coding agents.",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/Akira-TL/forgerelay#readme",