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
10 changes: 5 additions & 5 deletions .github/workflows/auto-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ permissions:

jobs:
automove:
name: Move issue to swamp.club lab
name: Move issue to swamp-club.com lab
runs-on: ubuntu-latest
steps:
- name: Move to lab and close GitHub issue
Expand Down Expand Up @@ -41,7 +41,7 @@ jobs:
// Create the lab issue via the public submission endpoint. The
// `source: "swamp"` tag attributes it to this repo in the Lab UI.
const createRes = await fetch(
"https://swamp.club/api/v1/lab/issues",
"https://swamp-club.com/api/v1/lab/issues",
{
method: "POST",
headers: {
Expand All @@ -61,7 +61,7 @@ jobs:
if (!createRes.ok) {
const text = await createRes.text().catch(() => "");
core.setFailed(
`swamp.club create failed: ${createRes.status} ${text}`,
`swamp-club.com create failed: ${createRes.status} ${text}`,
);
return;
}
Expand All @@ -79,15 +79,15 @@ jobs:
labIssueNumber <= 0
) {
core.setFailed(
`swamp.club create returned no lab issue number: ${
`swamp-club.com create returned no lab issue number: ${
JSON.stringify(data)
}`,
);
return;
}

// We have a confirmed lab issue number — safe to comment and close.
const labUrl = `https://swamp.club/lab/${labIssueNumber}`;
const labUrl = `https://swamp-club.com/lab/${labIssueNumber}`;

// Post the auto-responder comment linking to the lab issue.
await github.rest.issues.createComment({
Expand Down
12 changes: 6 additions & 6 deletions BUG_BOUNTY.md
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,9 @@ Examples include:

### Eligible Assets

| Identifier | Asset Type | Instruction | Eligible for Bounty | Eligible for Submission | Availability Requirement | Confidentiality Requirement | Integrity Requirement | Max Severity | System Tags | Created At | Updated At |
| -------------------- | ---------- | ----------- | ------------------- | ----------------------- | ------------------------ | --------------------------- | --------------------- | ------------ | ----------- | ----------------------- | ----------------------- |
| telemetry.swamp.club | API | | true | true | | | | critical | production | 2026-11-02 13:45:00 UTC | 2026-11-02 13:45:00 UTC |
| swamp.club | WEB APP | | true | true | | | | critical | production | 2026-11-02 13:45:00 UTC | 2026-11-02 13:45:00 UTC |
| systeminit.com | WEB APP | | true | true | | | | medium | production | 2024-11-28 13:45:00 UTC | 2024-11-28 13:45:00 UTC |
| swamp CLI (stable) | OTHER | | true | true | | | | high | production | 2026-02-12 00:00:00 UTC | 2026-02-12 00:00:00 UTC |
| Identifier | Asset Type | Instruction | Eligible for Bounty | Eligible for Submission | Availability Requirement | Confidentiality Requirement | Integrity Requirement | Max Severity | System Tags | Created At | Updated At |
| ------------------------ | ---------- | ----------- | ------------------- | ----------------------- | ------------------------ | --------------------------- | --------------------- | ------------ | ----------- | ----------------------- | ----------------------- |
| telemetry.swamp-club.com | API | | true | true | | | | critical | production | 2026-11-02 13:45:00 UTC | 2026-11-02 13:45:00 UTC |
| swamp-club.com | WEB APP | | true | true | | | | critical | production | 2026-11-02 13:45:00 UTC | 2026-11-02 13:45:00 UTC |
| systeminit.com | WEB APP | | true | true | | | | medium | production | 2024-11-28 13:45:00 UTC | 2024-11-28 13:45:00 UTC |
| swamp CLI (stable) | OTHER | | true | true | | | | high | production | 2026-02-12 00:00:00 UTC | 2026-02-12 00:00:00 UTC |
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Come join the [swamp party on discord](https://discord.gg/swamp-club).
## Getting Started

```bash
curl -fsSL https://swamp.club/install.sh | sh
curl -fsSL https://swamp-club.com/install.sh | sh
```

### Quick Start
Expand Down
1 change: 1 addition & 0 deletions TRADEMARKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ This Policy covers:
| swamp | software platform |
| Swamp Club | software platform |
| swamp.club | software platform |
| swamp-club.com | software platform |

Some Marks may not be registered, but registration does not equal ownership of
trademarks. This Policy covers our Marks whether they are registered or not.
Expand Down
2 changes: 1 addition & 1 deletion design/extension.md
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@ support are marked as "unverified" but still allowed.

## Registry

Extensions are distributed through the swamp registry at `https://swamp.club`.
Extensions are distributed through the swamp registry at `https://swamp-club.com`.

### Authentication

Expand Down
4 changes: 2 additions & 2 deletions design/libswamp.md
Original file line number Diff line number Diff line change
Expand Up @@ -702,11 +702,11 @@ Deno.test("whoami yields identity on success", async () => {

assertEquals(events, [
{ kind: "loading_credentials" },
{ kind: "contacting_server", serverUrl: "https://swamp.club" },
{ kind: "contacting_server", serverUrl: "https://swamp-club.com" },
{
kind: "completed",
identity: {
serverUrl: "https://swamp.club",
serverUrl: "https://swamp-club.com",
id: "user-1",
username: "adam",
email: "adam@example.com",
Expand Down
6 changes: 3 additions & 3 deletions extensions/models/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ match the classification.

Each lab issue has a sequential, human-friendly number (`#1`, `#2`, ...) used in
every lab URL — both the dashboard and the API. You can find an issue at
`https://swamp.club/lab/<number>`.
`https://swamp-club.com/lab/<number>`.

Classification types (`triage`) match swamp-club's issue types:

Expand All @@ -195,7 +195,7 @@ Status transitions in swamp-club:
### Setup

The model requires a swamp-club API key. The URL defaults to
`https://swamp.club`.
`https://swamp-club.com`.

**Option 1: Environment variable (recommended)**

Expand All @@ -204,7 +204,7 @@ export SWAMP_API_KEY=swamp_your_key_here
```

The model reads `SWAMP_API_KEY` automatically and connects to
`https://swamp.club`.
`https://swamp-club.com`.

**Option 2: Point at a local dev server**

Expand Down
2 changes: 1 addition & 1 deletion extensions/models/_lib/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export const GlobalArgsSchema = z.object({
"Swamp Club lab issue number (the issue must already exist in swamp-club)",
),
swampClubUrl: z.string().optional().describe(
"Swamp Club API base URL (defaults to https://swamp.club)",
"Swamp Club API base URL (defaults to https://swamp-club.com)",
),
swampClubApiKey: z.string().optional().describe(
"Swamp Club API key (defaults to SWAMP_API_KEY env var)",
Expand Down
11 changes: 9 additions & 2 deletions extensions/models/_lib/swamp_club.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,8 +301,15 @@ export async function loadAuthFile(): Promise<
username?: string;
};
if (creds.apiKey) {
// Read-only domain migration: rewrite the legacy swamp.club URL to
// the new domain so callers transparently hit the right host. The
// CLI's AuthRepository persists the rewrite; here we don't own the
// file, so we just translate at the read site.
const serverUrl = creds.serverUrl === "https://swamp.club"
? "https://swamp-club.com"
: creds.serverUrl ?? "https://swamp-club.com";
return {
serverUrl: creds.serverUrl ?? "https://swamp.club",
serverUrl,
apiKey: creds.apiKey,
username: creds.username || undefined,
};
Expand Down Expand Up @@ -339,7 +346,7 @@ export async function createSwampClubClient(
}
}

url = url ?? "https://swamp.club";
url = url ?? "https://swamp-club.com";

if (!apiKey) {
logger?.warning(
Expand Down
2 changes: 1 addition & 1 deletion integration/issue_extension_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ models:
assertEquals(parsed.reason, "no-repository");
assertStringIncludes(
parsed.guidance,
"swamp.club/extensions/%40adam%2Fcfgmgmt",
"swamp-club.com/extensions/%40adam%2Fcfgmgmt",
);
} finally {
await Deno.remove(repo, { recursive: true });
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/extension_report_dispatcher_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ Deno.test("resolveExtensionTarget: no-repository refusal when manifest has no re
assertStringIncludes(t.guidance, "does not declare a repository");
assertStringIncludes(
t.guidance,
"swamp.club/extensions/%40adam%2Fcfgmgmt",
"swamp-club.com/extensions/%40adam%2Fcfgmgmt",
);
} finally {
await Deno.remove(repo, { recursive: true });
Expand Down
7 changes: 3 additions & 4 deletions src/cli/commands/extension_search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,14 @@ import {
} from "../../libswamp/mod.ts";
import { createExtensionSearchRenderer } from "../../presentation/renderers/extension_search.tsx";
import { resolveSkillsDir } from "../../domain/repo/skill_dirs.ts";

const DEFAULT_SERVER_URL = "https://swamp.club";
import { DEFAULT_SWAMP_CLUB_URL } from "../../domain/auth/auth_credentials.ts";

/**
* Resolves the registry server URL.
* Priority: SWAMP_CLUB_URL env var > default "https://swamp.club"
* Priority: SWAMP_CLUB_URL env var > DEFAULT_SWAMP_CLUB_URL
*/
function resolveServerUrl(): string {
return Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SERVER_URL;
return Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SWAMP_CLUB_URL;
}

// deno-lint-ignore no-explicit-any
Expand Down
5 changes: 2 additions & 3 deletions src/cli/commands/extension_update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,13 @@ import {
} from "../../libswamp/mod.ts";
import { createExtensionUpdateRenderer } from "../../presentation/renderers/extension_update.ts";
import { resolveSkillsDir } from "../../domain/repo/skill_dirs.ts";
import { DEFAULT_SWAMP_CLUB_URL } from "../../domain/auth/auth_credentials.ts";

// deno-lint-ignore no-explicit-any
type AnyOptions = any;

const DEFAULT_SERVER_URL = "https://swamp.club";

function resolveServerUrl(): string {
return Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SERVER_URL;
return Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SWAMP_CLUB_URL;
}

export const extensionUpdateCommand = new Command()
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/issue_submit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ async function promptLoginOrEmail(): Promise<"login" | "email"> {

await Deno.stdout.write(
encoder.encode(
"\nYou're not logged in to swamp.club.\n\n" +
"\nYou're not logged in to swamp-club.com.\n\n" +
" 1. Log in first (then retry this command)\n" +
" 2. Send via email\n\n" +
"Choose [1/2]: ",
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ import {
} from "../mod.ts";
import { resolveSkillsDir } from "../../domain/repo/skill_dirs.ts";
import { VERSION } from "./version.ts";
import { DEFAULT_SWAMP_CLUB_URL } from "../../domain/auth/auth_credentials.ts";

// deno-lint-ignore no-explicit-any
type AnyOptions = any;

const logger = getSwampLogger(["open"]);
const DEFAULT_SERVER_URL = "https://swamp.club";

function forceExtensionCatalogRescan(repoDir: string): void {
try {
Expand Down Expand Up @@ -155,7 +155,7 @@ export const openCommand = new Command()
]);

const extClient = new ExtensionApiClient(
Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SERVER_URL,
Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SWAMP_CLUB_URL,
);

const state: OpenServerState = {
Expand Down
5 changes: 3 additions & 2 deletions src/cli/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import {
import { RepoPath } from "../domain/repo/repo_path.ts";
import { ExtensionAutoResolver } from "../domain/extensions/extension_auto_resolver.ts";
import { ExtensionApiClient } from "../infrastructure/http/extension_api_client.ts";
import { DEFAULT_SWAMP_CLUB_URL } from "../domain/auth/auth_credentials.ts";
import { setAutoResolver } from "./auto_resolver_context.ts";
import {
createAutoResolveInstallerAdapter,
Expand Down Expand Up @@ -320,7 +321,7 @@ export function configureExtensionAutoResolver(
setAutoResolver(null);
return;
}
const serverUrl = Deno.env.get("SWAMP_CLUB_URL") ?? "https://swamp.club";
const serverUrl = Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SWAMP_CLUB_URL;
const extensionClient = new ExtensionApiClient(serverUrl);
const modelsDir = resolveModelsDir(marker);
const denoRuntime = new EmbeddedDenoRuntime();
Expand Down Expand Up @@ -717,7 +718,7 @@ async function checkForMissingPulledExtensions(
}

/** Default telemetry endpoint */
const DEFAULT_TELEMETRY_ENDPOINT = "https://telemetry.swamp.club";
const DEFAULT_TELEMETRY_ENDPOINT = "https://telemetry.swamp-club.com";

/** Telemetry endpoint used when auth serverUrl is a localhost address */
const LOCALHOST_TELEMETRY_ENDPOINT = "http://localhost:8080";
Expand Down
13 changes: 8 additions & 5 deletions src/cli/mod_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -425,8 +425,8 @@ Deno.test("isLocalhostUrl returns true for http://[::1]:3000", () => {
assertEquals(isLocalhostUrl("http://[::1]:3000"), true);
});

Deno.test("isLocalhostUrl returns false for https://swamp.club", () => {
assertEquals(isLocalhostUrl("https://swamp.club"), false);
Deno.test("isLocalhostUrl returns false for https://swamp-club.com", () => {
assertEquals(isLocalhostUrl("https://swamp-club.com"), false);
});

Deno.test("isLocalhostUrl returns false for https://example.com", () => {
Expand Down Expand Up @@ -457,13 +457,16 @@ Deno.test("resolveTelemetryEndpoint returns localhost endpoint when auth serverU
});

Deno.test("resolveTelemetryEndpoint returns default when auth serverUrl is remote", () => {
const result = resolveTelemetryEndpoint(undefined, "https://swamp.club");
assertEquals(result, "https://telemetry.swamp.club");
const result = resolveTelemetryEndpoint(
undefined,
"https://swamp-club.com",
);
assertEquals(result, "https://telemetry.swamp-club.com");
});

Deno.test("resolveTelemetryEndpoint returns default when auth serverUrl is null", () => {
const result = resolveTelemetryEndpoint(undefined, null);
assertEquals(result, "https://telemetry.swamp.club");
assertEquals(result, "https://telemetry.swamp-club.com");
});

// --- isUpdateCheckDisabledByEnv tests ---
Expand Down
3 changes: 2 additions & 1 deletion src/cli/resolve_datastore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import { maybeAutoUpdateDatastoreExtension } from "../libswamp/extensions/datast
import { FileExtensionUpdateCheckRepository } from "../infrastructure/persistence/extension_update_check_repository.ts";
import { readUpstreamExtensions } from "../infrastructure/persistence/upstream_extensions.ts";
import { ExtensionApiClient } from "../infrastructure/http/extension_api_client.ts";
import { DEFAULT_SWAMP_CLUB_URL } from "../domain/auth/auth_credentials.ts";
import {
detectLocalEditsForExtension,
enumeratePulledExtensionDirs,
Expand Down Expand Up @@ -93,7 +94,7 @@ async function maybeAutoUpdateSwampDatastore(
type,
path: lockfilePath,
});
const serverUrl = Deno.env.get("SWAMP_CLUB_URL") ?? "https://swamp.club";
const serverUrl = Deno.env.get("SWAMP_CLUB_URL") ?? DEFAULT_SWAMP_CLUB_URL;
const extensionClient = new ExtensionApiClient(serverUrl);
const cacheRepository = new FileExtensionUpdateCheckRepository(swampDir);

Expand Down
8 changes: 6 additions & 2 deletions src/domain/auth/auth_credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@
// along with Swamp. If not, see <https://www.gnu.org/licenses/>.

/** Default swamp-club server URL, used when no override is configured. */
export const DEFAULT_SWAMP_CLUB_URL = "https://swamp.club";
export const DEFAULT_SWAMP_CLUB_URL = "https://swamp-club.com";

/** Legacy default swamp-club URL, retained so stored credentials carrying the
* old domain can be transparently migrated on load. */
export const LEGACY_SWAMP_CLUB_URL = "https://swamp.club";

/** Stored authentication credentials for swamp-club API access. */
export interface AuthCredentials {
/** The swamp-club server URL (e.g., "https://swamp.club") */
/** The swamp-club server URL (e.g., "https://swamp-club.com") */
serverUrl: string;
/** The API key prefixed with "swamp_" */
apiKey: string;
Expand Down
5 changes: 4 additions & 1 deletion src/domain/extensions/repository_url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
// along with Swamp. If not, see <https://www.gnu.org/licenses/>.

import { UserError } from "../errors.ts";
import { DEFAULT_SWAMP_CLUB_URL } from "../auth/auth_credentials.ts";

/** Supported third-party repository providers. */
export type RepositoryProvider = "github" | "gitlab" | "other";
Expand Down Expand Up @@ -129,7 +130,9 @@ export function buildGitlabNewIssueUrl(
* swamp-club/routes/extensions/[...name].tsx.
*/
export function swampClubExtensionUrl(extensionName: string): string {
return `https://swamp.club/extensions/${encodeURIComponent(extensionName)}`;
return `${DEFAULT_SWAMP_CLUB_URL}/extensions/${
encodeURIComponent(extensionName)
}`;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/domain/extensions/repository_url_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ Deno.test("buildGitlabNewIssueUrl: strips trailing slash from repo URL", () => {
Deno.test("swampClubExtensionUrl: percent-encodes the scoped name", () => {
assertEquals(
swampClubExtensionUrl("@adam/cfgmgmt"),
"https://swamp.club/extensions/%40adam%2Fcfgmgmt",
"https://swamp-club.com/extensions/%40adam%2Fcfgmgmt",
);
});

Expand Down
Loading
Loading