@akira-tl/forgerelay 1.1.1 → 1.1.2

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,13 @@ All notable ForgeRelay changes are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.1.2] - 2026-09-11
8
+
9
+ ### Fixed
10
+
11
+ - Clarified Capability discovery so Agents use only `open_workspace.capabilityCatalog` names with the `capability` gateway; semantic `capabilityFingerprint.capabilities` entries and Capability Guide descriptors are no longer presented as callable capability names.
12
+ - Changed Agent Skill collision precedence so a Project's `.agents/skills` definition wins over the same-named global `~/.agents/skills` definition, keeping Project-local workflow customizations authoritative.
13
+
7
14
  ## [1.1.1] - 2026-09-10
8
15
 
9
16
  ### Added
@@ -11,6 +11,7 @@ import { redactSkillDiagnosticPaths } from "../../core/schemas.js";
11
11
  import { logToolCall, workspaceLogContext } from "../../core/tool-support.js";
12
12
  import { buildExecutionShellContext } from "../../../server-instructions.js";
13
13
  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.";
14
+ 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.";
14
15
  export async function presentLocalWorkspaceOpen(options, input, contextData) {
15
16
  const { config, forgerelayVersion: FORGERELAY_VERSION, workspaces, workspaceTasks, reviewCheckpoints, capabilityRegistry, subagentProviders, hooks, rememberWorkspacePanelState, } = options;
16
17
  const { path, workspaceId, mode, baseRef, newWorktree, newWorkspace, context } = input;
@@ -98,6 +99,7 @@ export async function presentLocalWorkspaceOpen(options, input, contextData) {
98
99
  const workspaceContextInstruction = "For later open_workspace calls, context=\"auto\" avoids repeating unchanged bootstrap context; use context=\"none\" when only the workspace handle/metadata is needed, or context=\"full\" to force a refresh.";
99
100
  const workspaceManagementInstruction = [
100
101
  "Use open_workspace(action=\"list\") for lightweight Workspace inventory. Use action=\"inspect\" with one known workspaceId for bounded read-only metadata without opening/resuming it. Explicitly open a Workspace before executing or mutating against it, and ask the user before close_workspace cleanup.",
102
+ capabilityDiscoveryInstruction,
101
103
  capabilityCatalog.some((entry) => entry.name === "workspace.tasks")
102
104
  ? workspaceTaskUsageInstruction
103
105
  : undefined,
@@ -57,14 +57,14 @@ export function registerWorkspaceAuxiliaryTools(options) {
57
57
  });
58
58
  registerAppTool(server, toolNames.capability, {
59
59
  title: "Use optional capability",
60
- description: "Describe or run one optional ForgeRelay capability advertised by open_workspace. Use describe when the capability contract is unfamiliar, then read its advertised guide if needed. Run dispatches only explicitly registered capabilities; it cannot invoke arbitrary shell commands, URLs, or methods.",
60
+ description: "Describe or run one registered ForgeRelay capability. Only names present in open_workspace.capabilityCatalog are valid for describe/run. capabilityFingerprint.capabilities is a semantic feature fingerprint, not a callable registry, and capabilityGuides are documentation descriptors rather than callable capabilities. Use describe when the capability contract is unfamiliar, then read its advertised guide if needed. Run cannot invoke arbitrary shell commands, URLs, or methods.",
61
61
  inputSchema: {
62
62
  workspaceId: z.string().describe("Workspace identifier returned by open_workspace."),
63
63
  member: z.string().optional().describe("Required for a Composite Workspace; explicit member name whose capability surface is used."),
64
64
  name: z
65
65
  .string()
66
66
  .regex(/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/)
67
- .describe("Stable dotted capability name advertised by open_workspace."),
67
+ .describe("Stable dotted capability name present in open_workspace.capabilityCatalog. Do not use semantic-only names from capabilityFingerprint.capabilities or capabilityGuides."),
68
68
  action: z.enum(["describe", "run"]),
69
69
  arguments: z
70
70
  .record(z.string(), z.unknown())
@@ -7,8 +7,8 @@ import { expandHomePath, isPathInsideRoot } from "../../mcp/filesystem/roots.js"
7
7
  const FRONTMATTER_DELIMITER = "---";
8
8
  export function effectiveSkillPaths(config, cwd) {
9
9
  const defaultPathCandidates = [
10
- join(homedir(), ".agents", "skills"),
11
10
  resolve(cwd, ".agents", "skills"),
11
+ join(homedir(), ".agents", "skills"),
12
12
  config.configSkillsDir,
13
13
  join(config.agentDir, "skills"),
14
14
  ];
@@ -201,12 +201,16 @@ gateway rather than each receiving another top-level tool schema.
201
201
  `open_workspace` adds lightweight discovery surfaces:
202
202
 
203
203
  - `capabilityFingerprint` is returned on every open/resume and includes the
204
- ForgeRelay version, active tool mode, and stable semantic capability names;
205
- - `capabilityCatalog` lists currently available registered actions such as
206
- `hooks.check`, with compact guide metadata;
204
+ ForgeRelay version, active tool mode, and stable semantic capability names. It
205
+ is a feature fingerprint, not a callable registry;
206
+ - `capabilityCatalog` is the callable registry for the `capability` gateway and
207
+ lists currently available registered actions such as `hooks.check`, with
208
+ compact guide metadata. Only names present here are valid for
209
+ `capability(action="describe"|"run")`;
207
210
  - `capabilityGuides` is returned with bootstrap context and contains compact
208
211
  descriptors for ForgeRelay-owned, versioned guides that can be loaded with
209
- the normal `read` tool.
212
+ the normal `read` tool. Guide names are documentation descriptors, not
213
+ callable capability names.
210
214
 
211
215
  Do not preload every capability guide. Read a guide only when the current task
212
216
  needs that domain. Built-in guides cover lifecycle Hooks, advanced managed
@@ -228,14 +232,16 @@ force the Host to discard a cached tool schema.
228
232
 
229
233
  ## Agent Skills
230
234
 
231
- ForgeRelay discovers standard Agent Skills from:
235
+ ForgeRelay discovers standard Agent Skills in precedence order from:
232
236
 
233
- - `~/.agents/skills`
234
237
  - project `.agents/skills`
238
+ - `~/.agents/skills`
235
239
  - the active ForgeRelay config directory's `skills` folder
236
240
  - `FORGERELAY_AGENT_DIR/skills` (defaults to `~/.codex/skills`)
237
241
  - paths from `FORGERELAY_SKILL_PATHS`
238
242
 
243
+ Same-named collisions use the first source, so project Skills override global Skills.
244
+
239
245
  When a task matches an advertised skill, read its `SKILL.md` before using other
240
246
  files in the skill directory.
241
247
 
@@ -860,14 +860,16 @@ select a global instruction file; its `skills` child is an additional Agent Skil
860
860
  | `FORGERELAY_AGENT_DIR` | Defaults to `~/.codex`; its `skills` child is included as an additional Skill source. |
861
861
  | `FORGERELAY_SKILL_PATHS` | Optional comma-separated additional skill directories. |
862
862
 
863
- Standard Agent Skills are discovered from:
863
+ Standard Agent Skills are discovered in precedence order from:
864
864
 
865
- - `~/.agents/skills`
866
865
  - project `.agents/skills`
866
+ - `~/.agents/skills`
867
867
  - the active ForgeRelay config directory's `skills` folder
868
868
  - `FORGERELAY_AGENT_DIR/skills`
869
869
  - paths from `FORGERELAY_SKILL_PATHS`
870
870
 
871
+ When the same Skill name appears in more than one source, the first source wins. Project Skills therefore override same-named global `~/.agents/skills` entries, matching ForgeRelay's project-over-global configuration model.
872
+
871
873
  When subagents are enabled, profiles are discovered from:
872
874
 
873
875
  - the active ForgeRelay config directory's `agents/*.md`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akira-tl/forgerelay",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
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",