diff --git a/README.md b/README.md
index dbbe7f7e..050cc1a8 100644
--- a/README.md
+++ b/README.md
@@ -61,13 +61,13 @@ The teammate who clones tomorrow gets the exact setup you have today.
**macOS and Linux:**
```bash
-curl -LsSf https://capa.infragate.ai/install.sh | sh
+curl -LsSf https://capa.sh/install.sh | sh
```
**Windows:**
```powershell
-powershell -ExecutionPolicy ByPass -c "irm https://capa.infragate.ai/install.ps1 | iex"
+powershell -ExecutionPolicy ByPass -c "irm https://capa.sh/install.ps1 | iex"
```
## Quick start
@@ -198,7 +198,7 @@ capabilities.yaml ──► capa install ──► provider files (.cursor/,
│
└──► Web UI editor ◄──► file watcher ◄──► disk
-Agent ──MCP──► capa gateway (:5912) ──proxy──► upstream MCP (stdio / HTTP / SSE)
+Agent ──MCP──► capa gateway (:5912) ──proxy──► upstream MCP (stdio / HTTP / SSE)
│
├── on-demand tools (setup_tools / call_tool)
├── per-sub-agent filtered endpoints
@@ -226,6 +226,6 @@ capa upgrade [--yes] # pin GitHub release + verify installer c
Guides, the full schema reference, and the registry catalog:
-**[https://capa.infragate.ai](https://capa.infragate.ai/getting-started/introduction/)**
+**[https://capa.sh](https://capa.sh/getting-started/introduction/)**
Maintainer-oriented internals (install pipeline, provider matrix, lockfile semantics) live in [`docs/`](./docs/README.md).
diff --git a/docs/README.md b/docs/README.md
index eb411009..d347c8d3 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -2,7 +2,7 @@
This folder is for people working **on** capa, not people using it. End-user docs
(getting started, the capabilities schema reference, the registry catalog) live
-in a separate repo and are published at . Anything
+in a separate repo and are published at . Anything
that explains how capa is wired together internally — install pipeline ordering,
per-provider quirks, lockfile semantics, the database schema, etc. — belongs
here.
diff --git a/install.ps1 b/install.ps1
index 19634dac..e598f232 100644
--- a/install.ps1
+++ b/install.ps1
@@ -61,7 +61,7 @@ USAGE:
.\install.ps1 [OPTIONS]
Or via web:
- powershell -ExecutionPolicy ByPass -c "irm https://capa.infragate.ai/install.ps1 | iex"
+ powershell -ExecutionPolicy ByPass -c "irm https://capa.sh/install.ps1 | iex"
OPTIONS:
-InstallDir
@@ -88,13 +88,13 @@ ENVIRONMENT VARIABLES:
EXAMPLES:
# Install with defaults
- irm https://capa.infragate.ai/install.ps1 | iex
+ irm https://capa.sh/install.ps1 | iex
# Install to custom directory
- `$env:CAPA_INSTALL_DIR="C:\Tools"; irm https://capa.infragate.ai/install.ps1 | iex
+ `$env:CAPA_INSTALL_DIR="C:\Tools"; irm https://capa.sh/install.ps1 | iex
# Install without modifying PATH
- powershell -c "irm https://capa.infragate.ai/install.ps1 | iex" -NoModifyPath
+ powershell -c "irm https://capa.sh/install.ps1 | iex" -NoModifyPath
"@
}
diff --git a/install.sh b/install.sh
index 641abe64..6043f38a 100644
--- a/install.sh
+++ b/install.sh
@@ -109,7 +109,7 @@ EXAMPLES:
# verifies SHA256 against SHA256SUMS.txt, then runs the local file)
# Convenience only — does not verify the installer script itself:
- curl -LsSf https://capa.infragate.ai/install.sh | sh
+ curl -LsSf https://capa.sh/install.sh | sh
EOF
}
diff --git a/registries/claude-plugins/adapter.ts b/registries/claude-plugins/adapter.ts
index f598ea9b..5e3fa498 100644
--- a/registries/claude-plugins/adapter.ts
+++ b/registries/claude-plugins/adapter.ts
@@ -115,7 +115,7 @@ const MAX_LISTING_PAGES = 50;
const LIST_CACHE_TTL_MS = 10 * 60 * 1000;
const SUMMARY_PREVIEW_CHARS = 600;
const UA =
- 'Mozilla/5.0 (compatible; capa-registry-claude-plugins/1.0; +https://capa.infragate.ai)';
+ 'Mozilla/5.0 (compatible; capa-registry-claude-plugins/1.0; +https://capa.sh)';
// Anthropic's official plugin marketplace manifest — the source of truth
// for `(repo, path, sha)` per plugin. We pin to `main` because that's
diff --git a/src/cli/commands/__tests__/upgrade-plan.test.ts b/src/cli/commands/__tests__/upgrade-plan.test.ts
index 4b1bffdf..ea813336 100644
--- a/src/cli/commands/__tests__/upgrade-plan.test.ts
+++ b/src/cli/commands/__tests__/upgrade-plan.test.ts
@@ -10,8 +10,8 @@ import {
upgradeConfirmationState,
} from '../upgrade-plan';
-const VENDOR_INSTALL_SH = 'https://capa.infragate.ai/install.sh';
-const VENDOR_INSTALL_PS1 = 'https://capa.infragate.ai/install.ps1';
+const VENDOR_INSTALL_SH = 'https://capa.sh/install.sh';
+const VENDOR_INSTALL_PS1 = 'https://capa.sh/install.ps1';
function sha256Hex(data: string | Uint8Array): string {
return createHash('sha256').update(data).digest('hex');
@@ -38,7 +38,7 @@ describe('capa upgrade planning', () => {
'https://github.com/infragate/capa/releases/download/v1.2.3/install.sh',
);
expect(url).not.toBe(VENDOR_INSTALL_SH);
- expect(url).not.toContain('capa.infragate.ai');
+ expect(url).not.toContain('capa.sh');
const ps1 = githubReleaseAssetUrl('1.2.3', 'install.ps1');
expect(ps1).toBe(
@@ -71,7 +71,7 @@ describe('capa upgrade planning', () => {
},
});
- expect(fetched.some((u) => u.includes('capa.infragate.ai'))).toBe(false);
+ expect(fetched.some((u) => u.includes('capa.sh'))).toBe(false);
expect(plan.tag).toBe('v9.9.9');
expect(plan.version).toBe('9.9.9');
expect(plan.installerAsset).toBe('install.sh');
diff --git a/src/cli/commands/install-tasks/helpers/__tests__/install-one-skill-id.test.ts b/src/cli/commands/install-tasks/helpers/__tests__/install-one-skill-id.test.ts
index deec634f..977369d6 100644
--- a/src/cli/commands/install-tasks/helpers/__tests__/install-one-skill-id.test.ts
+++ b/src/cli/commands/install-tasks/helpers/__tests__/install-one-skill-id.test.ts
@@ -25,7 +25,8 @@ describe('installOneSkill id hardening', () => {
afterEach(() => {
db.close();
- rmSync(tempDir, { recursive: true, force: true });
+ // Windows can keep SQLite WAL/SHM locked briefly after close().
+ rmSync(tempDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 50 });
});
it('rejects skill ids that leave the provider skills directory', async () => {
diff --git a/src/server/__tests__/mcp-handler.integration.test.ts b/src/server/__tests__/mcp-handler.integration.test.ts
index 3135adf0..8f6db93c 100644
--- a/src/server/__tests__/mcp-handler.integration.test.ts
+++ b/src/server/__tests__/mcp-handler.integration.test.ts
@@ -693,7 +693,7 @@ describe('handleMessage > initialize (server icons)', () => {
expect(resp.result.serverInfo.description).toBe(
'An agentic skills and tools package manager',
);
- expect(resp.result.serverInfo.websiteUrl).toBe('https://capa.infragate.ai');
+ expect(resp.result.serverInfo.websiteUrl).toBe('https://capa.sh');
const icons = resp.result.serverInfo.icons;
expect(icons).toHaveLength(1);
diff --git a/src/server/__tests__/registries-routes.test.ts b/src/server/__tests__/registries-routes.test.ts
index 8b1cbd02..1ba4555f 100644
--- a/src/server/__tests__/registries-routes.test.ts
+++ b/src/server/__tests__/registries-routes.test.ts
@@ -5,6 +5,7 @@ import { tmpdir } from 'os';
import * as config from '../../shared/config';
import * as safeRemoteUrl from '../../shared/safe-remote-url';
import { CapaDatabase } from '../../db/database';
+import { loadClaudeMarketplaceAdapter } from '../../shared/registries/claude-marketplace';
import { RegistryManager } from '../../shared/registries/manager';
import {
listRegistriesHandler,
@@ -539,7 +540,9 @@ describe('registries-routes', () => {
it('installs a git-backed marketplace when materializing from a local snapshot fixture', async () => {
// Simulate install by writing managed files directly then loading —
- // full git clone is covered by unit source-mapping tests.
+ // full git clone is covered by unit source-mapping tests. View through
+ // loadClaudeMarketplaceAdapter without a db so inspectPlugin is not
+ // attached (manager.view() would clone the plugin repo).
const { writeFileSync: write } = await import('fs');
const slug = 'dk-local';
const dir = join(managedDir, slug);
@@ -564,7 +567,10 @@ describe('registries-routes', () => {
enabled: true,
});
await manager.reload();
- const detail = await manager.view(slug, {
+ expect((await manager.list()).some((m) => m.id === slug)).toBe(true);
+
+ const adapter = loadClaudeMarketplaceAdapter(slug);
+ const detail = await adapter.view({
capability: 'plugins',
id: 'developer-kit-typescript',
});
@@ -576,7 +582,7 @@ describe('registries-routes', () => {
},
});
- const core = await manager.view(slug, {
+ const core = await adapter.view({
capability: 'plugins',
id: 'developer-kit',
});
diff --git a/src/server/mcp-handler.ts b/src/server/mcp-handler.ts
index a501fcba..30ac9e8d 100644
--- a/src/server/mcp-handler.ts
+++ b/src/server/mcp-handler.ts
@@ -171,7 +171,7 @@ export class CapaMCPServer {
version: VERSION,
title: "capa",
description: "An agentic skills and tools package manager",
- websiteUrl: "https://capa.infragate.ai",
+ websiteUrl: "https://capa.sh",
icons: CAPA_SERVER_ICONS,
},
{
@@ -1045,7 +1045,7 @@ export class CapaMCPServer {
title: "capa",
version: VERSION,
description: "An agentic skills and tools package manager",
- websiteUrl: "https://capa.infragate.ai",
+ websiteUrl: "https://capa.sh",
icons: CAPA_SERVER_ICONS,
},
},
diff --git a/src/shared/__tests__/ui-urls.test.ts b/src/shared/__tests__/ui-urls.test.ts
index d0892533..d9322953 100644
--- a/src/shared/__tests__/ui-urls.test.ts
+++ b/src/shared/__tests__/ui-urls.test.ts
@@ -3,7 +3,7 @@ import { CAPA_CLOUD_OAUTH_URL, CAPA_DOCS_URL, cloudOAuthDisclosure, projectUiPat
describe('ui-urls', () => {
it('CAPA_DOCS_URL points to capa docs site', () => {
- expect(CAPA_DOCS_URL).toBe('https://capa.infragate.ai/getting-started/introduction/');
+ expect(CAPA_DOCS_URL).toBe('https://capa.sh/getting-started/introduction/');
});
it('CAPA_CLOUD_OAUTH_URL points to cloud OAuth endpoint', () => {
diff --git a/src/shared/registries/bundled.ts b/src/shared/registries/bundled.ts
index 62fa8812..e3dd2ae7 100644
--- a/src/shared/registries/bundled.ts
+++ b/src/shared/registries/bundled.ts
@@ -19,7 +19,7 @@ export const BUNDLED_ADAPTER_PINS: Record = {
"skills-sh":
"4f6b1c7ad0f0ab5a13edb673397602faf073736b86030a9755ab1a0fc87b7a08",
"claude-plugins":
- "075345f00a90ca325032dc9c6910f0d758cf4936e7abe40e160aae9190dbfc49",
+ "e963bb725eb6dfe6ea161d28ae7edbc29802e5c1bcade3ee80db1e0e9c9231f6",
"cursor-marketplace":
"93fb72fc4c66381f28e7893e9af6b54f270d1fdfdab318838121e802967c0dfd",
};
diff --git a/src/shared/ui-urls.ts b/src/shared/ui-urls.ts
index c6cb5bc7..dd53e1c8 100644
--- a/src/shared/ui-urls.ts
+++ b/src/shared/ui-urls.ts
@@ -2,7 +2,7 @@
* Web UI route helpers for the capa server SPA.
*/
-export const CAPA_DOCS_URL = "https://capa.infragate.ai/getting-started/introduction/";
+export const CAPA_DOCS_URL = "https://capa.sh/getting-started/introduction/";
export const CAPA_CLOUD_OAUTH_URL = "https://capa.infragate.ai/auth";
/** Shown before browser OAuth. Cloud host is pinned; not request-controlled. */
diff --git a/web-ui/src/components/layout/NavLinks.tsx b/web-ui/src/components/layout/NavLinks.tsx
index e3b3a688..e3b25ff0 100644
--- a/web-ui/src/components/layout/NavLinks.tsx
+++ b/web-ui/src/components/layout/NavLinks.tsx
@@ -25,7 +25,7 @@ export function NavLinks() {
{t('nav.integrations')}