Skip to content

Commit 3943d85

Browse files
authored
Merge pull request #2640 from dyoshikawa/resolve-issue-2404-goose-url-housekeeping
docs(goose): update stale Goose URLs after the governance move
2 parents 40a5671 + 8f53811 commit 3943d85

13 files changed

Lines changed: 28 additions & 27 deletions

File tree

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"src/generated/**"
2424
],
2525
"words": [
26+
"aaif",
2627
"diffable",
2728
"extensionless",
2829
"LASTEXITCODE",

docs/reference/file-formats.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,17 +1056,17 @@ Goose configures MCP servers in two locations depending on scope:
10561056
- **Global (`--global`):** MCP servers are written as **extensions** in the shared user config `~/.config/goose/config.yaml`. The schema is non-standard, so Rulesync maps canonical MCP fields to Goose's: `command` → `cmd` (an array `command` folds its tail into `args`), `env` → `envs`, `url`/`httpUrl` → `uri`, and `disabled: true` → `enabled: false`. The `type` is derived — `command` ⇒ `stdio`, a remote `url` ⇒ `streamable_http` (or `sse` when the canonical `type` is `sse`). Each extension also carries its own `name`. A canonical server with no `command` and no `url` is **skipped with a warning** rather than written as a `stdio` extension with no `cmd`, which Goose cannot start. Generation merges the `extensions:` block into the existing `config.yaml`, preserving other Goose settings (model, provider, ...), and the file is never deleted. The `extensions:` map itself is co-owned: Goose's own `builtin`/`platform`/`frontend`/`inline_python` extensions (`developer`, `memory`, ...) live there alongside MCP servers and are **carried over untouched**, as is any entry Rulesync cannot read as an MCP server, while every entry it positively identifies as one (`stdio`/`streamable_http`/`sse`) is Rulesync-owned, so a server deleted from `.rulesync/.mcp.json` is retracted with a warning naming it. Import mirrors this: a non-MCP extension type is skipped with a warning instead of being imported as a server (importing a `builtin` used to strip the type that makes it work). This location supports **both stdio and remote** (http/sse) servers.
10571057
- **Project:** Goose v1.39.0+ discovers MCP extensions in **open plugins** at `<project>/.agents/plugins/<name>/.mcp.json` (and `~/.agents/plugins/<name>/.mcp.json` at user scope). Rulesync emits `.agents/plugins/rulesync/.mcp.json`, reusing the same `.agents/plugins/rulesync/` tree already used for Goose hooks. The manifest uses the **Claude-style** `{ "mcpServers": { "<name>": { "command", "args", "env", "cwd" } } }` shape. This manifest is **stdio-only** — it cannot express `url`/`headers`, so **remote (http/sse) servers are skipped with a warning** in project mode; sync them with `--global` to `~/.config/goose/config.yaml` instead. The `.mcp.json` manifest is owned by Rulesync and is deleted when no servers remain.
10581058

1059-
See the [Goose extensions docs](https://block.github.io/goose/docs/getting-started/using-extensions/) and [open-plugins MCP PR #9471](https://github.com/block/goose/pull/9471).
1059+
See the [Goose extensions docs](https://goose-docs.ai/docs/getting-started/using-extensions/) and [open-plugins MCP PR #9471](https://github.com/aaif-goose/goose/pull/9471).
10601060

10611061
### Goose-specific: commands as recipes, subagents as custom agents
10621062

1063-
Goose [recipes](https://block.github.io/goose/docs/guides/recipes/recipe-reference/) are reusable YAML workflow files. **Commands** map to top-level recipes at `.goose/recipes/<name>.yaml` (project) and `~/.config/goose/recipes/<name>.yaml` (global); the command body becomes the recipe `prompt`, `title` defaults to the file name and `description` to the rulesync `description` (falling back to `title`), `version` defaults to `1.0.0`, and any other recipe field round-trips through the rulesync `goose` section of a command.
1063+
Goose [recipes](https://goose-docs.ai/docs/guides/recipes/recipe-reference/) are reusable YAML workflow files. **Commands** map to top-level recipes at `.goose/recipes/<name>.yaml` (project) and `~/.config/goose/recipes/<name>.yaml` (global); the command body becomes the recipe `prompt`, `title` defaults to the file name and `description` to the rulesync `description` (falling back to `title`), `version` defaults to `1.0.0`, and any other recipe field round-trips through the rulesync `goose` section of a command.
10641064

10651065
A recipe on disk is not invocable as `/name` on its own: Goose resolves slash commands from the `slash_commands` list in the user config (`~/.config/goose/config.yaml`), whose entries are `{ command, recipe_path }` pairs. In **global mode** Rulesync therefore registers every generated recipe there. `recipe_path` is written as an **absolute** path, because Goose resolves it with a bare `PathBuf::from(...)` on this code path (the tilde expansion used by `goose run --recipe` does not apply, so a `~/…` registration would never resolve), and the command name is lowercased, because Goose lowercases the typed command and compares it against the stored value verbatim. There is no project-level registration surface upstream, so project-scope recipes must still be run with `goose run --recipe`.
10661066

1067-
The list is co-owned: entries whose `recipe_path` points outside `~/.config/goose/recipes/` — and sub-recipes under `recipes/subagents/` — are carried over untouched, while **every** entry pointing directly into that directory is Rulesync-owned and recomputed on each `--global` generate. That retracts a deleted command's registration and drops the key once nothing is registered, but it also means a slash command you registered yourself (via Goose's own UI or `goose recipe`) for a recipe living in that directory is removed on the next generate — keep such recipes elsewhere, or author them in `.rulesync/commands/`. Command names must be unique, contain no spaces, and must not shadow a built-in command such as `/recipe`, `/compact`, or `/help`; Rulesync does not check the built-in names for you. See the [slash-command mapping in the Goose source](https://github.com/block/goose/blob/main/crates/goose/src/slash_commands/recipe_slash_command.rs).
1067+
The list is co-owned: entries whose `recipe_path` points outside `~/.config/goose/recipes/` — and sub-recipes under `recipes/subagents/` — are carried over untouched, while **every** entry pointing directly into that directory is Rulesync-owned and recomputed on each `--global` generate. That retracts a deleted command's registration and drops the key once nothing is registered, but it also means a slash command you registered yourself (via Goose's own UI or `goose recipe`) for a recipe living in that directory is removed on the next generate — keep such recipes elsewhere, or author them in `.rulesync/commands/`. Command names must be unique, contain no spaces, and must not shadow a built-in command such as `/recipe`, `/compact`, or `/help`; Rulesync does not check the built-in names for you. See the [slash-command mapping in the Goose source](https://github.com/aaif-goose/goose/blob/main/crates/goose/src/slash_commands/recipe_slash_command.rs).
10681068

1069-
**Subagents** map to Goose's [custom agents](https://block.github.io/goose/docs/guides/context-engineering/custom-agents/) (v1.34.0+): Markdown files with `name` (required) / `description` / `model` frontmatter whose body is the agent instructions, invocable via `@name` or delegation. They are emitted to the goose-specific discovery dirs `.goose/agents/<name>.md` (project) and `~/.config/goose/agents/<name>.md` (global), so the output cannot collide with a future shared `.agents/agents/` target; `model` and unknown future fields round-trip through the rulesync `goose` subagent section. Earlier rulesync versions emitted subagents as sub-recipe YAML under `.goose/recipes/subagents/` — a location Goose's agent discovery never scans, so those files were inert; they are no longer generated (stale outputs stay gitignored but are not cleaned up automatically).
1069+
**Subagents** map to Goose's [custom agents](https://goose-docs.ai/docs/guides/context-engineering/custom-agents/) (v1.34.0+): Markdown files with `name` (required) / `description` / `model` frontmatter whose body is the agent instructions, invocable via `@name` or delegation. They are emitted to the goose-specific discovery dirs `.goose/agents/<name>.md` (project) and `~/.config/goose/agents/<name>.md` (global), so the output cannot collide with a future shared `.agents/agents/` target; `model` and unknown future fields round-trip through the rulesync `goose` subagent section. Earlier rulesync versions emitted subagents as sub-recipe YAML under `.goose/recipes/subagents/` — a location Goose's agent discovery never scans, so those files were inert; they are no longer generated (stale outputs stay gitignored but are not cleaned up automatically).
10701070

10711071
### Vibe-specific: stdio `cwd` and MCP `[auth]` block
10721072

src/constants/goose-paths.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const GOOSE_GLOBAL_DIR = join(".config", "goose");
55
export const GOOSE_RULE_FILE_NAME = ".goosehints";
66
export const GOOSE_MCP_FILE_NAME = "config.yaml";
77
// Goose persists per-tool permission overrides in the global user config dir.
8-
// https://github.com/block/goose/blob/main/crates/goose/src/config/permission.rs
8+
// https://github.com/aaif-goose/goose/blob/main/crates/goose/src/config/permission.rs
99
export const GOOSE_PERMISSIONS_FILE_NAME = "permission.yaml";
1010
export const GOOSE_HOOKS_DIR_PATH = join(".agents", "plugins", "rulesync", "hooks");
1111
export const GOOSE_HOOKS_FILE_NAME = "hooks.json";
@@ -16,8 +16,8 @@ export const GOOSE_HOOKS_FILE_NAME = "hooks.json";
1616
// `{ "mcpServers": { "<name>": { command, args, env, cwd } } }`. The manifest is
1717
// stdio-only (no `url`/`headers`). rulesync reuses the same `.agents/plugins/rulesync/`
1818
// tree already used for Goose hooks.
19-
// @see https://github.com/block/goose/pull/9471
20-
// @see https://github.com/block/goose/releases/tag/v1.39.0
19+
// @see https://github.com/aaif-goose/goose/pull/9471
20+
// @see https://github.com/aaif-goose/goose/releases/tag/v1.39.0
2121
export const GOOSE_PLUGIN_MCP_DIR_PATH = join(".agents", "plugins", "rulesync");
2222
export const GOOSE_PLUGIN_MCP_FILE_NAME = ".mcp.json";
2323

@@ -33,8 +33,8 @@ export const GOOSE_PLUGIN_MCP_FILE_NAME = ".mcp.json";
3333
// `.agents/skills/` location is already the canonical Goose skill target via
3434
// `agentsskills`, and migrating the dedicated `goose` target would only
3535
// duplicate that output. See the agentsskills target for the recommended path.
36-
// @see https://block.github.io/goose/docs/mcp/skills-mcp/
37-
// @see https://block.github.io/goose/docs/guides/context-engineering/using-skills/
36+
// @see https://goose-docs.ai/docs/mcp/skills-mcp/
37+
// @see https://goose-docs.ai/docs/guides/context-engineering/using-skills/
3838
export const GOOSE_SKILLS_DIR_PATH = join(GOOSE_DIR, "skills");
3939

4040
// Recipes are reusable YAML workflow files. Goose discovers project recipes in
@@ -43,12 +43,12 @@ export const GOOSE_SKILLS_DIR_PATH = join(GOOSE_DIR, "skills");
4343
// files under the `subagents/` subdirectory (referenced from a parent recipe via
4444
// a relative `path`). Keeping subagents in a subdirectory makes the command and
4545
// subagent file sets disjoint so import/orphan-deletion never cross over.
46-
// @see https://block.github.io/goose/docs/guides/recipes/recipe-reference/
46+
// @see https://goose-docs.ai/docs/guides/recipes/recipe-reference/
4747
export const GOOSE_RECIPES_DIR_PATH = join(GOOSE_DIR, "recipes");
4848
export const GOOSE_GLOBAL_RECIPES_DIR_PATH = join(GOOSE_GLOBAL_DIR, "recipes");
4949
// Goose custom agents (Markdown + YAML frontmatter, v1.34.0+): the
5050
// goose-specific discovery dirs are used so the output does not collide with a
5151
// future shared `.agents/agents/` target.
52-
// @see https://block.github.io/goose/docs/guides/context-engineering/custom-agents/
52+
// @see https://goose-docs.ai/docs/guides/context-engineering/custom-agents/
5353
export const GOOSE_AGENTS_DIR_PATH = join(GOOSE_DIR, "agents");
5454
export const GOOSE_GLOBAL_AGENTS_DIR_PATH = join(GOOSE_GLOBAL_DIR, "agents");

src/features/commands/goose-command.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const RECIPE_VERSION = "1.0.0";
4848
//
4949
// The registration surface exists at user scope only — there is no project-level
5050
// `slash_commands` list — so it is written in global mode only.
51-
// @see https://github.com/block/goose/blob/main/crates/goose/src/slash_commands/recipe_slash_command.rs
51+
// @see https://github.com/aaif-goose/goose/blob/main/crates/goose/src/slash_commands/recipe_slash_command.rs
5252
const SLASH_COMMANDS_KEY = "slash_commands";
5353
const GOOSE_GLOBAL_RECIPES_POSIX_DIR = toPosixPath(GOOSE_GLOBAL_RECIPES_DIR_PATH);
5454

@@ -180,7 +180,7 @@ class GooseCommandConfigFile extends ToolFile {
180180
* The whole file is a YAML mapping (not frontmatter + markdown body), so the
181181
* class stores the parsed recipe object rather than a frontmatter/body split.
182182
*
183-
* @see https://block.github.io/goose/docs/guides/recipes/recipe-reference/
183+
* @see https://goose-docs.ai/docs/guides/recipes/recipe-reference/
184184
*/
185185
const GooseCommandRecipeSchema = z.looseObject({
186186
version: z.optional(z.string()),

src/features/hooks/goose-hooks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const GOOSE_CONVERTER_CONFIG: ToolHooksConverterConfig = {
4949
*
5050
* The JSON shape matches Claude Code's: each PascalCase event maps to an array of
5151
* `{ matcher, hooks: [{ type: "command", command }] }` entries.
52-
* @see https://block.github.io/goose/docs/guides/context-engineering/hooks/
52+
* @see https://goose-docs.ai/docs/guides/context-engineering/hooks/
5353
*/
5454
export class GooseHooks extends ToolHooks {
5555
constructor(params: AiFileParams) {

src/features/mcp/goose-mcp.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ function convertToGoosePluginMcpServers(
396396
* shape and cannot express `url`/`headers`, so remote servers are skipped with
397397
* a warning in project mode (use `--global` to sync them instead).
398398
*
399-
* @see https://block.github.io/goose/docs/getting-started/using-extensions/
400-
* @see https://github.com/block/goose/pull/9471
399+
* @see https://goose-docs.ai/docs/getting-started/using-extensions/
400+
* @see https://github.com/aaif-goose/goose/pull/9471
401401
*/
402402
export class GooseMcp extends ToolMcp {
403403
private readonly config: Record<string, unknown>;

src/features/mcp/mcp-processor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,8 @@ export const toolMcpFactories = new Map<McpProcessorToolTarget, ToolMcpFactory>(
312312
// `~/.config/goose/config.yaml`, and (since v1.39.0) discovers stdio-only
313313
// MCP extensions in open plugins at project scope
314314
// `.agents/plugins/rulesync/.mcp.json` (Claude-style `mcpServers`).
315-
// https://block.github.io/goose/docs/getting-started/using-extensions/
316-
// https://github.com/block/goose/pull/9471
315+
// https://goose-docs.ai/docs/getting-started/using-extensions/
316+
// https://github.com/aaif-goose/goose/pull/9471
317317
class: GooseMcp,
318318
meta: {
319319
supportsProject: true,

src/features/permissions/goose-permissions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const GOOSE_GLOBAL_ONLY_MESSAGE =
2525
// Goose stores user-set permission decisions under the top-level `user` key of
2626
// permission.yaml; other keys (e.g. `smart_approve`) hold cached LLM/annotation
2727
// decisions and are preserved verbatim.
28-
// https://github.com/block/goose/blob/main/crates/goose/src/config/permission.rs
28+
// https://github.com/aaif-goose/goose/blob/main/crates/goose/src/config/permission.rs
2929
const GOOSE_USER_KEY = "user";
3030

3131
// The catch-all rulesync pattern. Goose permission lists hold whole tool names
@@ -35,7 +35,7 @@ const CATCH_ALL_PATTERN = "*";
3535

3636
// Goose's built-in Developer extension tools are namespaced `extension__tool`.
3737
// rulesync's canonical categories map onto the matching Developer tool name.
38-
// https://block.github.io/goose/docs/mcp/developer-mcp/
38+
// https://goose-docs.ai/docs/mcp/developer-mcp/
3939
const RULESYNC_TO_GOOSE_TOOL_NAME: Record<string, string> = {
4040
bash: "developer__shell",
4141
edit: "developer__text_editor",

src/features/rules/goose-rule.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export type GooseRuleSettablePathsGlobal = ToolRuleSettablePathsGlobal;
3434
* touches during a session. The separate `.goose/memories/` tree is the Memory
3535
* extension's storage and is NOT auto-loaded as session context.
3636
* (Verified against the official docs:
37-
* https://block.github.io/goose/docs/guides/context-engineering/using-goosehints/)
37+
* https://goose-docs.ai/docs/guides/context-engineering/using-goosehints/)
3838
*
3939
* rulesync's topic-based non-root rules have no project subdirectory to map onto,
4040
* so writing them under `.goose/memories/` made them effectively invisible to
@@ -45,7 +45,7 @@ export type GooseRuleSettablePathsGlobal = ToolRuleSettablePathsGlobal;
4545
* Goose uses plain markdown files (.goosehints) without frontmatter.
4646
*
4747
* Global scope emits only `~/.config/goose/.goosehints`. Goose v1.41.0 (PR
48-
* block/goose#9736) additionally loads the vendor-neutral
48+
* aaif-goose/goose#9736) additionally loads the vendor-neutral
4949
* `~/.agents/AGENTS.md` alongside the config-dir hints, but rulesync
5050
* deliberately does not emit that shared path from the goose target: the
5151
* config-dir hints remain fully loaded (no capability loss), and the

src/features/skills/goose-skill.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818

1919
const GooseSkillFrontmatterSchema = z.looseObject({
2020
// Goose SKILL.md documents only `name` and `description` as required fields.
21-
// https://block.github.io/goose/docs/guides/context-engineering/using-skills/
21+
// https://goose-docs.ai/docs/guides/context-engineering/using-skills/
2222
// Any additional fields (e.g. `metadata`) pass through via z.looseObject.
2323
name: z.string(),
2424
description: z.string(),

0 commit comments

Comments
 (0)