diff --git a/changes/site-target-client-compatibility.changed.md b/changes/site-target-client-compatibility.changed.md new file mode 100644 index 0000000..a8de6db --- /dev/null +++ b/changes/site-target-client-compatibility.changed.md @@ -0,0 +1,7 @@ +--- +"githits": patch +"@githits/mcp": none +--- + +- **Prepare standalone-site compatibility** - Resolve requests and responses + recognize the reserved site target kind ahead of backend activation. diff --git a/packages/core-internal/src/services/resolve-target-service.ts b/packages/core-internal/src/services/resolve-target-service.ts index 8547e4f..36d912f 100644 --- a/packages/core-internal/src/services/resolve-target-service.ts +++ b/packages/core-internal/src/services/resolve-target-service.ts @@ -17,7 +17,7 @@ import { } from "./package-intelligence-service.js"; import type { TokenProvider } from "./token-provider.js"; -export type ResolveTargetKind = "PACKAGE" | "REPOSITORY"; +export type ResolveTargetKind = "PACKAGE" | "REPOSITORY" | "SITE"; export interface ResolveTargetParams { name: string; diff --git a/packages/mcp/src/shared/resolve-target-request.test.ts b/packages/mcp/src/shared/resolve-target-request.test.ts index a56ef57..0a46a88 100644 --- a/packages/mcp/src/shared/resolve-target-request.test.ts +++ b/packages/mcp/src/shared/resolve-target-request.test.ts @@ -57,6 +57,22 @@ describe("buildResolveTargetParams", () => { }); }); + it("accepts every resolver target kind", () => { + for (const [preferKind, expected] of [ + ["package", "PACKAGE"], + ["repository", "REPOSITORY"], + ["site", "SITE"], + ] as const) { + expect( + buildResolveTargetParams({ + name: "documentation", + preferKind, + includeDetailedFields: false, + }).preferredKinds, + ).toEqual([expected]); + } + }); + it("rejects empty names and unsupported enums", () => { expect(() => buildResolveTargetParams({ name: " ", includeDetailedFields: false }), @@ -78,7 +94,7 @@ describe("buildResolveTargetParams", () => { expect(() => buildResolveTargetParams({ name: "x", - preferKind: "site", + preferKind: "workspace", includeDetailedFields: false, }), ).toThrow("prefer-kind expects package or repository"); diff --git a/packages/mcp/src/shared/resolve-target-request.ts b/packages/mcp/src/shared/resolve-target-request.ts index a2fa4fb..6e49e44 100644 --- a/packages/mcp/src/shared/resolve-target-request.ts +++ b/packages/mcp/src/shared/resolve-target-request.ts @@ -82,6 +82,7 @@ function parsePreferredKind( if (!kind) return undefined; if (kind === "package") return "PACKAGE"; if (kind === "repository") return "REPOSITORY"; + if (kind === "site") return "SITE"; throw new InvalidPackageSpecError( `prefer-kind expects package or repository. Got '${value}'.`, ); diff --git a/packages/mcp/src/shared/resolve-target-response.test.ts b/packages/mcp/src/shared/resolve-target-response.test.ts index 5d0f2c0..6746b2c 100644 --- a/packages/mcp/src/shared/resolve-target-response.test.ts +++ b/packages/mcp/src/shared/resolve-target-response.test.ts @@ -172,6 +172,29 @@ describe("formatResolveTargetTerminal", () => { expect(output).toContain("githits search ''"); }); + it("renders standalone documentation sites as a known target kind", () => { + const site = candidate({ + kind: "SITE", + canonicalKey: + "site:developer.apple.com/design/human-interface-guidelines", + displayName: "Apple Human Interface Guidelines", + stars: undefined, + downloadsLastMonth: undefined, + documentationUrl: + "https://developer.apple.com/design/human-interface-guidelines", + codeAvailable: false, + }); + + const output = formatResolveTargetTerminal( + result({ best: site, candidates: [site], protectedMatches: [] }), + { name: "Apple human interface guidelines", useColors: false }, + ); + + expect(output).toContain( + "site:developer.apple.com/design/human-interface-guidelines [exact] · site · docs", + ); + }); + it("appends missing protected and best candidates after ranked candidates", () => { const protectedExtra = { kind: "PACKAGE", diff --git a/packages/mcp/src/shared/resolve-target-response.ts b/packages/mcp/src/shared/resolve-target-response.ts index 9b31281..2780d58 100644 --- a/packages/mcp/src/shared/resolve-target-response.ts +++ b/packages/mcp/src/shared/resolve-target-response.ts @@ -143,7 +143,7 @@ export function formatResolveTargetTerminal( } const KNOWN_CONFIDENCE_VALUES = new Set(["exact", "high", "medium", "low"]); -const KNOWN_KIND_VALUES = new Set(["package", "repository"]); +const KNOWN_KIND_VALUES = new Set(["package", "repository", "site"]); function formatCandidate( target: ResolveTargetReference,