Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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).
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <https://capa.infragate.ai/getting-started/introduction/>. Anything
in a separate repo and are published at <https://capa.sh/getting-started/introduction/>. Anything
that explains how capa is wired together internally — install pipeline ordering,
per-provider quirks, lockfile semantics, the database schema, etc. — belongs
here.
Expand Down
8 changes: 4 additions & 4 deletions install.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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 <DIR>
Expand All @@ -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
"@
}

Expand Down
2 changes: 1 addition & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
2 changes: 1 addition & 1 deletion registries/claude-plugins/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/__tests__/upgrade-plan.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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(
Expand Down Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down
2 changes: 1 addition & 1 deletion src/server/__tests__/mcp-handler.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 9 additions & 3 deletions src/server/__tests__/registries-routes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand All @@ -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({
Comment on lines +572 to +573

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. Manager view path untested 🐞 Bug ⚙ Maintainability

The marketplace fixture test now calls the adapter directly, so it no longer verifies that the
DB-backed registry can be viewed through RegistryManager.view, including loader resolution and
timeout behavior. Regressions in the actual registry view path can therefore pass while this test
remains green.
Agent Prompt
## Issue description
The marketplace fixture test bypasses `RegistryManager.view` by constructing and invoking an adapter directly. Keep the fixture offline while exercising the same manager-backed path used by the registry view handler.

## Issue Context
`RegistryManager.view` resolves the DB-loaded adapter and applies timeout handling, while the route handler delegates to that method. The direct adapter call validates marketplace parsing but cannot catch failures in manager loading or route integration.

## Fix Focus Areas
- src/server/__tests__/registries-routes.test.ts[541-592]
- src/shared/registries/manager.ts[100-112]
- src/server/registries-routes.ts[383-405]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

capability: 'plugins',
id: 'developer-kit-typescript',
});
Expand All @@ -576,7 +582,7 @@ describe('registries-routes', () => {
},
});

const core = await manager.view(slug, {
const core = await adapter.view({
capability: 'plugins',
id: 'developer-kit',
});
Expand Down
4 changes: 2 additions & 2 deletions src/server/mcp-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
{
Expand Down Expand Up @@ -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,
},
},
Expand Down
2 changes: 1 addition & 1 deletion src/shared/__tests__/ui-urls.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
2 changes: 1 addition & 1 deletion src/shared/registries/bundled.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export const BUNDLED_ADAPTER_PINS: Record<BundledAdapterSlug, string> = {
"skills-sh":
"4f6b1c7ad0f0ab5a13edb673397602faf073736b86030a9755ab1a0fc87b7a08",
"claude-plugins":
"075345f00a90ca325032dc9c6910f0d758cf4936e7abe40e160aae9190dbfc49",
"e963bb725eb6dfe6ea161d28ae7edbc29802e5c1bcade3ee80db1e0e9c9231f6",
"cursor-marketplace":
"93fb72fc4c66381f28e7893e9af6b54f270d1fdfdab318838121e802967c0dfd",
};
Expand Down
2 changes: 1 addition & 1 deletion src/shared/ui-urls.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
2 changes: 1 addition & 1 deletion web-ui/src/components/layout/NavLinks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function NavLinks() {
<span>{t('nav.integrations')}</span>
</Link>
<a
href="https://capa.infragate.ai/getting-started/introduction/"
href="https://capa.sh/getting-started/introduction/"
target="_blank"
rel="noopener noreferrer"
className="flex items-center gap-2 rounded-sm px-3 py-2 text-[13px] text-text-secondary no-underline transition-colors hover:bg-hover-bg"
Expand Down
Loading