Retire the 1.0.0 installer and take dead macOS links off the site
Deleting the old Windows build from R2 surfaced something worse: the two macOS DMG links had no objects behind them at all - the mac builds were never uploaded, so every mac download click has been a 404. - R2 now holds exactly one desktop artifact: AC/AgentCompany-1.1.0-x64 .exe (old exe deleted on operator instruction, verified 404) - The release manifest drops the macOS entry with a comment explaining how it comes back (upload real DMGs first); footer mac links removed; hero reads "Available on Windows - macOS build coming soon" - Root fix in platform-support: FAQ/JSON-LD copy now derives from whatever platforms the manifest actually ships instead of hard-requiring macos+windows, so the site structurally cannot advertise a platform without a real artifact behind it - Landing e2e updated (>=1 tracked asset) and green; redeployed and verified live: no r2.dev leaks, no mac links, coming-soon copy shown, tracked download 302s to the 1.1.0 installer
This commit is contained in:
1 parent
a489accc38
commit
c027508b97
5 files changed
+25
-37
No files matched your search
@@ -21,8 +21,6 @@ const footerGroups: { title: string; links: FooterLink[] }[] = [
|
|||||||
{
|
{
|
||||||
title: "Downloads",
|
title: "Downloads",
|
||||||
links: [
|
links: [
|
||||||
{ label: "Apple Silicon", href: getTrackedDownloadHref("macos-arm64-dmg"), external: true },
|
|
||||||
{ label: "Intel Mac", href: getTrackedDownloadHref("macos-x64-dmg"), external: true },
|
|
||||||
{ label: "Windows Installer", href: getTrackedDownloadHref("windows-x64-installer"), external: true },
|
{ label: "Windows Installer", href: getTrackedDownloadHref("windows-x64-installer"), external: true },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -14,26 +14,33 @@ export type PlatformSupportSummary = {
|
|||||||
|
|
||||||
export const platformSupportSummary = buildPlatformSupportSummary(platformDownloads);
|
export const platformSupportSummary = buildPlatformSupportSummary(platformDownloads);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy derives from whatever platforms the release manifest actually ships,
|
||||||
|
* so the download matrix stays the single source of truth and the site can
|
||||||
|
* never advertise a platform without a real artifact behind it.
|
||||||
|
*/
|
||||||
export function buildPlatformSupportSummary(downloads: PlatformDownload[]): PlatformSupportSummary {
|
export function buildPlatformSupportSummary(downloads: PlatformDownload[]): PlatformSupportSummary {
|
||||||
const macos = requirePlatform(downloads, "macos");
|
if (downloads.length === 0) {
|
||||||
const windows = requirePlatform(downloads, "windows");
|
throw new Error("Release download metadata must include at least one platform.");
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
downloadAnswer:
|
downloadAnswer:
|
||||||
`Use the download section on this page to choose the build that matches your architecture and package format. ` +
|
`Use the download section on this page to choose the build that matches your architecture and package format. ` +
|
||||||
`${formatDownloadSentence(macos)} ${formatDownloadSentence(windows)}`,
|
downloads.map(formatDownloadSentence).join(" "),
|
||||||
platformAnswer:
|
platformAnswer:
|
||||||
`AgentCompany is available on ${formatAvailability(macos)} and ${formatAvailability(windows)}. ` +
|
`AgentCompany is available on ${joinWithAnd(downloads.map(formatAvailability))}. ` +
|
||||||
`It is built with Electron and the desktop feature set stays aligned across all supported targets.`,
|
`It is built with Electron and the desktop feature set stays aligned across all supported targets.`,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function requirePlatform(downloads: PlatformDownload[], id: PlatformDownload["id"]): PlatformDownload {
|
function joinWithAnd(parts: string[]): string {
|
||||||
const platform = downloads.find((download) => download.id === id);
|
if (parts.length === 1) {
|
||||||
if (!platform) {
|
return parts[0];
|
||||||
throw new Error(`Missing ${id} release download metadata.`);
|
|
||||||
}
|
}
|
||||||
return platform;
|
if (parts.length === 2) {
|
||||||
|
return `${parts[0]} and ${parts[1]}`;
|
||||||
|
}
|
||||||
|
return `${parts.slice(0, -1).join(", ")}, and ${parts.at(-1)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatDownloadSentence(download: PlatformDownload): string {
|
function formatDownloadSentence(download: PlatformDownload): string {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export const landingHeroNarrative = {
|
|||||||
titleLine2: "from Your Desktop",
|
titleLine2: "from Your Desktop",
|
||||||
description:
|
description:
|
||||||
"Run AI CEO by default, switch to AI Co-Founder for human-reviewed decisions, and launch the first mission from a local desktop setup.",
|
"Run AI CEO by default, switch to AI Co-Founder for human-reviewed decisions, and launch the first mission from a local desktop setup.",
|
||||||
availability: "Available on macOS and Windows",
|
availability: "Available on Windows · macOS build coming soon",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const onboardingFlowNarrative = {
|
export const onboardingFlowNarrative = {
|
||||||
@@ -75,6 +75,6 @@ export const landingStructuredDataNarrative = {
|
|||||||
"AI CEO autonomous operating mode",
|
"AI CEO autonomous operating mode",
|
||||||
"AI Co-Founder human-reviewed operating mode",
|
"AI Co-Founder human-reviewed operating mode",
|
||||||
"Local-first SQLite storage",
|
"Local-first SQLite storage",
|
||||||
"Desktop releases for macOS and Windows",
|
"Desktop releases for Windows (macOS build coming soon)",
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -18,29 +18,10 @@ export type PlatformDownload = {
|
|||||||
|
|
||||||
export const releaseVersion = "1.1.0";
|
export const releaseVersion = "1.1.0";
|
||||||
|
|
||||||
|
// macOS is intentionally absent: its builds were never uploaded to R2, so
|
||||||
|
// every DMG link 404'd. Re-add the entry (and the footer links) only after
|
||||||
|
// the mac machine actually ships AC/AgentCompany-<version>-*.dmg.
|
||||||
export const platformDownloads: PlatformDownload[] = [
|
export const platformDownloads: PlatformDownload[] = [
|
||||||
{
|
|
||||||
id: "macos",
|
|
||||||
packageDescription: "signed and notarized DMG builds",
|
|
||||||
title: "macOS",
|
|
||||||
note: "Signed + notarized DMG builds",
|
|
||||||
assets: [
|
|
||||||
{
|
|
||||||
architectures: ["arm64"],
|
|
||||||
id: "macos-arm64-dmg",
|
|
||||||
label: "Apple Silicon DMG",
|
|
||||||
href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-1.0.0-arm64.dmg",
|
|
||||||
note: "arm64 · v1.0.0",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
architectures: ["x64"],
|
|
||||||
id: "macos-x64-dmg",
|
|
||||||
label: "Intel Mac DMG",
|
|
||||||
href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-1.0.0.dmg",
|
|
||||||
note: "x64 · v1.0.0",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: "windows",
|
id: "windows",
|
||||||
packageDescription: "a signed NSIS installer build",
|
packageDescription: "a signed NSIS installer build",
|
||||||
|
|||||||
@@ -40,8 +40,10 @@ test("download links use the tracked endpoint and never expose R2 URLs", async (
|
|||||||
await page.goto("/");
|
await page.goto("/");
|
||||||
await scrollThrough(page);
|
await scrollThrough(page);
|
||||||
|
|
||||||
|
// Every advertised platform asset routes through the tracked endpoint
|
||||||
|
// (currently Windows only - macOS returns once its build ships to R2).
|
||||||
const tracked = page.locator('#download a[href^="/api/download?asset="]');
|
const tracked = page.locator('#download a[href^="/api/download?asset="]');
|
||||||
expect(await tracked.count()).toBeGreaterThanOrEqual(3);
|
expect(await tracked.count()).toBeGreaterThanOrEqual(1);
|
||||||
|
|
||||||
// Real release URLs must stay behind the server-side redirect.
|
// Real release URLs must stay behind the server-side redirect.
|
||||||
expect(await page.locator('a[href*="r2.dev"]').count()).toBe(0);
|
expect(await page.locator('a[href*="r2.dev"]').count()).toBe(0);
|
||||||
|
|||||||
Reference in new issue
Block a user