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')}