Skip to content

fix: [#309] point install endpoint at altimate.sh/install (not altimate.ai/install)#825

Merged
anandgupta42 merged 3 commits into
mainfrom
fix/install-url-altimate-sh
May 21, 2026
Merged

fix: [#309] point install endpoint at altimate.sh/install (not altimate.ai/install)#825
anandgupta42 merged 3 commits into
mainfrom
fix/install-url-altimate-sh

Conversation

@anandgupta42
Copy link
Copy Markdown
Contributor

@anandgupta42 anandgupta42 commented May 20, 2026

What does this PR do?

Swaps the install endpoint from altimate.ai/install (unreachable — HTML 404 on the marketing-site SPA) to altimate.sh/install (the canonical altimate-code site, where a Next.js route handler now serves the curl install script — see AltimateAI/altimate-code-website#22).

The mismatch broke v0.7.1's standalone install path end-to-end. Two failures, one URL:

  1. curl -fsSL https://altimate.ai/install | bash fetched HTML and tried to bash-execute it (would error out, but with a confusing symptom — not a clear "endpoint missing" message).
  2. altimate upgrade for curl-installed users fetches the install URL via Installation.upgradeCurl() in packages/opencode/src/installation/index.ts:37 to re-run the install script. With the broken URL, every curl-installed user's in-place upgrade silently failed.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Other: doc + test sweep to keep references in sync

Issue for this PR

Closes #309

How did you verify your code works?

  • bun turbo typecheck --filter=@altimateai/altimate-code — clean
  • bun test --timeout 30000 test/install/ test/installation/ test/branding/ test/skill/release-v0.7.1-* — 420/420 pass
  • bun run script/upstream/analyze.ts --markers --base main --strictok no upstream-shared files modified
  • Updated packages/opencode/test/install/upgrade-method.test.ts:88-93 so the assertion now requires altimate.sh/install AND rejects altimate.ai/install (negative assertion catches future regression that reintroduces the broken URL)
  • Updated packages/opencode/test/branding/branding.test.ts:124-130 "references altimate-owned domain" check the same way
  • Updated packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts:284 README curl-install assertion that was pinning the old URL
  • After companion website PR ships + this PR merges + next release: altimate upgrade from a curl-installed binary upgrades in place (manual verification)
  • After companion website PR ships: curl -fsSL https://altimate.sh/install | bash end-to-end smoke (manual verification)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas (the negative-assertion comments explain why both directions of the test matter)
  • I have made corresponding changes to the documentation (docs/docs/reference/troubleshooting.md)
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective (negative assertions on altimate.ai/install in two test files)
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published: pending — the companion website PR (AltimateAI/altimate-code-website#22) ships the route handler at altimate.sh/install. Merge order: website first, then this.

Files touched

File Change
install altimate.ai/installaltimate.sh/install (--help examples)
README.md install instruction
packages/opencode/src/installation/index.ts fetch("https://altimate.sh/install") in upgradeCurl()
docs/docs/reference/troubleshooting.md 3× references in install-path troubleshooting section
packages/opencode/test/install/upgrade-method.test.ts assertion updated + negative assertion against legacy URL
packages/opencode/test/branding/branding.test.ts brand-domain assertion updated + negative assertion
packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts README curl-install assertion updated

Out of scope

  • docs/mkdocs.yml:51 references altimate.ai/discord — that's the Discord invite on the marketing site, not the install path. Left unchanged.

Pairs with

  • AltimateAI/altimate-code-website#22 — adds the app/install/route.ts handler that serves the curl script at altimate.sh/install with proper Content-Type and GA4 download tracking.

🤖 Generated with Claude Code


Summary by cubic

Switch the install endpoint to https://www.altimate.sh/install and add a 15s timeout in upgradeCurl() to prevent hung upgrades. Fixes curl installs and restores altimate upgrade for curl users (issue #309).

  • Bug Fixes
    • upgradeCurl() now fetches from https://www.altimate.sh/install (inside an altimate_change block).
    • Bound the fetch with AbortSignal.timeout(15_000) to fail fast on stalls.
    • Updated examples in install, README.md, and troubleshooting docs to use the www host.
    • Strengthened tests to accept https://(www\.)?altimate.sh/install, reject altimate.ai/install, and verify the timeout is present.

Written for commit a511019. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • Documentation

    • Updated README and troubleshooting docs to point users to the new standalone installer URL and clarified reinstall/workaround steps for missing native modules and Alpine (musl).
  • Chores

    • Aligned installer help text and all install/upgrade references in tests and docs to the new curl installer endpoint.
  • Bug Fixes

    • Installer upgrade now enforces a bounded download timeout to avoid long hangs during fetch.

Review Change Stack

…te.ai/install)

altimate.ai is the marketing site (a React Router SPA on a different host)
where `/install` falls through to an HTML 404 page. altimate.sh is the
canonical altimate-code site and now serves the install script at
`/install` via a Next.js route handler with proper text/x-shellscript
content type and server-side GA4 tracking (companion PR in
AltimateAI/altimate-code-website).

The mismatch broke v0.7.1's standalone install path end-to-end:

  • `curl -fsSL https://altimate.ai/install | bash` fetched HTML and tried
    to bash-execute it (would error out, but the symptom was confusing).
  • `altimate upgrade` for curl-installed users fetches the install URL
    via `Installation.upgradeCurl()` to re-run the install script. With
    the broken URL, every curl-user's in-place upgrade silently failed.

This PR swaps the seven references in this repo:

  • install (curl install script): two examples in --help block
  • README.md: install instruction
  • packages/opencode/src/installation/index.ts: the fetch URL inside
    `upgradeCurl()`
  • docs/docs/reference/troubleshooting.md: three references in the
    install troubleshooting section added in v0.7.1
  • packages/opencode/test/install/upgrade-method.test.ts: assertion now
    requires altimate.sh/install AND explicitly rejects altimate.ai/install
    so a future regression that reintroduces the broken URL fires
    immediately
  • packages/opencode/test/branding/branding.test.ts: renamed brand-domain
    assertion to "references altimate-owned domain for user-facing URLs"
    that requires altimate.sh/install and rejects altimate.ai/install
  • packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts:
    the README curl-install assertion was pinning the old URL; updated

`docs/mkdocs.yml`'s `altimate.ai/discord` link is unchanged — that's a
separate marketing-site URL, not the install path.

Pairs with AltimateAI/altimate-code-website#22 which adds the
`app/install/route.ts` handler. Ship the website PR FIRST so the new URL
is live before this one merges to main — otherwise curl-install would be
broken in a different way (pointing at a not-yet-deployed endpoint)
between merges.

Closes #309.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@claude claude Bot left a comment

Choose a reason for hiding this comment

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

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

📝 Walkthrough

Walkthrough

This PR replaces occurrences of the curl installer endpoint https://altimate.ai/install with https://altimate.sh/install in the runtime upgrade function, user-facing documentation/help text, and related tests.

Changes

Installation Endpoint Migration

Layer / File(s) Summary
Core upgrade function endpoint update
packages/opencode/src/installation/index.ts
The upgradeCurl() method now fetches the installation script from https://www.altimate.sh/install and uses AbortSignal.timeout(15_000) to bound the request.
User-facing documentation and help text updates
README.md, docs/docs/reference/troubleshooting.md, install
README, troubleshooting guide, and install help examples updated to show https://altimate.sh/install in all curl install command examples and workaround snippets.
Test assertions and regression coverage
packages/opencode/test/branding/branding.test.ts, packages/opencode/test/install/upgrade-method.test.ts, packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts
Branding, upgrade, and release docs tests updated to expect altimate.sh/install (optional www.) and include negative assertions preventing regression to altimate.ai/install; upgrade tests assert AbortSignal.timeout(15_000) is used.

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related issues:

"I'm a rabbit with a tiny shell,
I swapped the link so installs go well.
From .ai to .sh the curl now sings,
No more HTML masquerading as things.
Hop, hop—bash runs, and the installer springs!"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'fix: [#309] point install endpoint at altimate.sh/install (not altimate.ai/install)' is clear, concise, and directly describes the main change: swapping the install endpoint URL from altimate.ai to altimate.sh.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering the what/why, test plan, type of change, issue reference, verification steps, and detailed checklist. It includes all key information needed for review.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/install-url-altimate-sh

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

1 similar comment
@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

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

No issues found across 7 files

Re-trigger cubic

@dev-punia-altimate
Copy link
Copy Markdown

❌ Tests — Failures Detected

TypeScript — 15 failure(s)

  • baseline [0.45ms]
  • baseline [0.31ms]
  • baseline [0.07ms]
  • baseline [0.25ms]
  • connection_refused [0.32ms]
  • timeout [0.05ms]
  • permission_denied [0.04ms]
  • parse_error [0.04ms]
  • oom [0.03ms]
  • network_error [0.03ms]
  • auth_failure [0.04ms]
  • rate_limit [0.03ms]
  • internal_error [0.04ms]
  • empty_error [0.02ms]
  • connection_refused [0.04ms]

Next Step

Please address the failing cases above and re-run verification.

cc @anandgupta42

… to Amplify

After AltimateAI/altimate-code-website#22 merged and deployed, the
install endpoint serves correctly from www.altimate.sh/install but the
apex altimate.sh/install still returns HTTP 404 from a non-Amplify
origin (ip-10-124-5-249.us-west-2.compute.internal, no x-amz-cf-id
headers). The apex DNS / CloudFront alias is a separate infra fix.

This is a same-day workaround: switch all install endpoint references
from altimate.sh/install to www.altimate.sh/install. Once the apex
routing is fixed, drop the `www.` prefix — the test assertions use a
`(www\.)?` regex so they keep passing across both forms.

Also adds an altimate_change marker block around the modified line in
`packages/opencode/src/installation/index.ts:upgradeCurl()`. The line
sits in upstream-shared territory and the marker guard flagged it as
unmarked custom code; wrap it now so future upstream merges see the
intent and don't auto-overwrite.

Files touched:

  • install
  • README.md
  • docs/docs/reference/troubleshooting.md
  • packages/opencode/src/installation/index.ts (+ altimate_change markers)
  • packages/opencode/test/install/upgrade-method.test.ts
    (assertion → /https:\/\/(www\.)?altimate\.sh\/install/)
  • packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts
    (README assertion → /curl -fsSL https:\/\/(www\.)?altimate\.sh\/install \| bash/)

Verified end-to-end:

  • `curl -fsSL https://www.altimate.sh/install` → HTTP 200,
    Content-Type text/x-shellscript, body identical to
    raw.githubusercontent.com/.../main/install (diff returns 0).
  • Full sandboxed install: `HOME=$(mktemp -d) bash <(curl ... www.altimate.sh)`
    completes; installed binary returns `0.7.1`.
  • Apex confirmed broken: `curl -sI https://altimate.sh/install` → 404
    from `ip-10-124-5-249.us-west-2.compute.internal` (not Amplify).

176/176 tests pass across the touched suites. Marker guard passes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

2 similar comments
@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/opencode/src/installation/index.ts (1)

10-17: 🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift

Replace ad-hoc telemetry singleton with Effect-native composition/caching.

This new mutable cache helper (_telemetryCache + getTelemetry) introduces a non-Effect pattern in packages/opencode/**/*.ts. Please move this to Effect.fn/Effect.fnUntraced + Effect.cached so lifecycle/tracing semantics stay consistent with the codebase conventions.

As per coding guidelines, "Use Effect.gen(function* () { ... }) for composing Effect computations", "Use Effect.fn("Domain.method") for named/traced effects and Effect.fnUntraced for internal helpers", and "Use Effect.cached when multiple concurrent callers should share a single in-flight computation rather than storing Fiber | undefined or Promise | undefined manually".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/opencode/src/installation/index.ts` around lines 10 - 17, Replace
the ad-hoc mutable singleton (_telemetryCache and getTelemetry) with an
Effect-based cached function: create an Effect.fnUntraced (internal helper) that
performs the dynamic import of "../telemetry" inside an Effect.gen and returns
the Telemetry export, then wrap that Effect with Effect.cached so concurrent
callers share a single in-flight computation; remove _telemetryCache and ensure
callers invoke the new Effect (e.g., getTelemetryEffect) to run the effect
rather than relying on the manual Promise/variable.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/opencode/src/installation/index.ts`:
- Around line 41-44: The fetch call that retrieves the install script in
upgradeCurl has no timeout and can hang; wrap the request with an
AbortController and a timer (e.g., 10s or appropriate constant) so the request
is aborted on timeout, clear the timer on success, and throw a clear error like
"install script fetch timed out" when aborted; update the fetch call that
assigns body (and any related error handling in upgradeCurl) to use
controller.signal and ensure the timer is cleaned up to avoid leaks.

---

Outside diff comments:
In `@packages/opencode/src/installation/index.ts`:
- Around line 10-17: Replace the ad-hoc mutable singleton (_telemetryCache and
getTelemetry) with an Effect-based cached function: create an Effect.fnUntraced
(internal helper) that performs the dynamic import of "../telemetry" inside an
Effect.gen and returns the Telemetry export, then wrap that Effect with
Effect.cached so concurrent callers share a single in-flight computation; remove
_telemetryCache and ensure callers invoke the new Effect (e.g.,
getTelemetryEffect) to run the effect rather than relying on the manual
Promise/variable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 9af53dbb-b83b-4cbe-8d45-12364a6f4f91

📥 Commits

Reviewing files that changed from the base of the PR and between 0f24653 and 4614e6e.

📒 Files selected for processing (6)
  • README.md
  • docs/docs/reference/troubleshooting.md
  • install
  • packages/opencode/src/installation/index.ts
  • packages/opencode/test/install/upgrade-method.test.ts
  • packages/opencode/test/skill/release-v0.7.1-binary-adversarial.test.ts
✅ Files skipped from review due to trivial changes (2)
  • install
  • docs/docs/reference/troubleshooting.md

Comment thread packages/opencode/src/installation/index.ts Outdated
Address CodeRabbit review feedback on PR #825: the install-script
`fetch` in `Installation.upgradeCurl()` had no timeout, so a stalled
CDN/origin could hang `altimate upgrade` indefinitely. Wrap the
request with `AbortSignal.timeout(15_000)` so it fails fast.

- `packages/opencode/src/installation/index.ts` — add `signal:
  AbortSignal.timeout(15_000)` to the fetch options; keep inside the
  existing `altimate_change` block (now gates URL + timeout together).
- `packages/opencode/test/install/upgrade-method.test.ts` — new
  regression assertion that the source still contains the bounded
  timeout.

The other CodeRabbit comment (refactor `_telemetryCache` to
`Effect.cached`) is outside this PR's diff and unrelated to the
install URL fix — leaving it for a separate change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

2 similar comments
@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

@github-actions
Copy link
Copy Markdown

👋 This PR was automatically closed by our quality checks.

Common reasons:

  • New GitHub account with limited contribution history
  • PR description doesn't meet our guidelines
  • Contribution appears to be AI-generated without meaningful review

If you believe this was a mistake, please open an issue explaining your intended contribution and a maintainer will help you.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
packages/opencode/src/installation/index.ts (1)

42-47: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Improve error messaging for timeout scenarios.

The AbortSignal.timeout correctly bounds the request, but when it fires the resulting AbortError lacks context about the 15s timeout. The current .then only handles HTTP errors via res.statusText. Consider wrapping the fetch in a try-catch to provide a clearer message when the timeout is reached, so users can distinguish timeout failures from HTTP errors.

🛡️ Suggested error handling improvement
-    const body = await fetch("https://www.altimate.sh/install", {
-      signal: AbortSignal.timeout(15_000),
-    }).then((res) => {
-      if (!res.ok) throw new Error(res.statusText)
-      return res.text()
-    })
+    const body = await fetch("https://www.altimate.sh/install", {
+      signal: AbortSignal.timeout(15_000),
+    })
+      .then((res) => {
+        if (!res.ok) throw new Error(res.statusText)
+        return res.text()
+      })
+      .catch((err) => {
+        if (err.name === "TimeoutError" || err.name === "AbortError") {
+          throw new Error("Install script fetch timed out after 15s")
+        }
+        throw err
+      })
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/opencode/src/installation/index.ts` around lines 42 - 47, The fetch
that assigns const body uses AbortSignal.timeout(15_000) but does not
distinguish an abort from an HTTP error; wrap the await fetch(...) + res.ok
check in a try-catch, catch errors from the fetch, and if the error is an
AbortError (e.g., error.name === 'AbortError' or DOMException with name
'AbortError') rethrow a new, clear Error indicating the request to
"https://www.altimate.sh/install" timed out after 15s; otherwise rethrow or log
the original error so HTTP/non-timeout failures keep their original messages.
Ensure you modify the block that creates body (the fetch + then/res.ok logic)
and keep the AbortSignal.timeout(15_000) usage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@packages/opencode/src/installation/index.ts`:
- Around line 42-47: The fetch that assigns const body uses
AbortSignal.timeout(15_000) but does not distinguish an abort from an HTTP
error; wrap the await fetch(...) + res.ok check in a try-catch, catch errors
from the fetch, and if the error is an AbortError (e.g., error.name ===
'AbortError' or DOMException with name 'AbortError') rethrow a new, clear Error
indicating the request to "https://www.altimate.sh/install" timed out after 15s;
otherwise rethrow or log the original error so HTTP/non-timeout failures keep
their original messages. Ensure you modify the block that creates body (the
fetch + then/res.ok logic) and keep the AbortSignal.timeout(15_000) usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 370ceb67-72e9-4120-914e-1336abcb4e15

📥 Commits

Reviewing files that changed from the base of the PR and between 4614e6e and a511019.

📒 Files selected for processing (2)
  • packages/opencode/src/installation/index.ts
  • packages/opencode/test/install/upgrade-method.test.ts

@anandgupta42 anandgupta42 merged commit e6b5c20 into main May 21, 2026
19 checks passed
anandgupta42 added a commit that referenced this pull request May 21, 2026
Hotfix for v0.7.1's broken install endpoint plus a defensive pass on
the upgrade fetch surface (5-persona pre-release review caught two
P0s that PR #825 did not).

Fixed
- `Installation.upgradeCurl()` fetches from www.altimate.sh/install
  instead of the unreachable altimate.ai/install. (#825, closes #309)
- Published GitHub Action (`github/action.yml`) realigned with the
  v0.7.1 binary rename: cache + PATH use ~/.altimate/bin (was
  ~/.altimate-code/bin), binary invoked as `altimate` (was
  `altimate-code`). Action was broken on every cache miss for v0.7.1+
  even before this URL fix.
- 15s bounded timeout on the upgrader fetch via AbortSignal.timeout
  (CodeRabbit feedback on #825).

Changed
- Curl-upgrade fetch failures now surface an actionable error naming
  the URL + the manual re-install one-liner + the GitHub releases
  fallback, instead of a raw `AbortError: The operation was aborted`
  or `Error: Not Found`. HTTP non-2xx also includes the status code.
- `UPGRADE_INSTALL_URL` and `UPGRADE_FETCH_TIMEOUT_MS` extracted as
  named constants inside the `altimate_change` block, so a future
  timeout tune is a single edit.

Testing
- 30 adversarial tests in `release-v0.7.2-adversarial.test.ts`
  covering URL eradication, cross-file host consistency, named-
  constant invariants, error-surface invariants, action.yml
  alignment, marker integrity, migration recovery surface, and
  CHANGELOG presence.
- 529/529 tests pass across install/branding/v0.7.1/v0.7.2 suites.
- Full opencode test suite: 8100 pass / 503 skip / 0 fail.
- Pre-release sanity (`bun run pre-release`): all 4 checks pass.
- Marker guard (`script/upstream/analyze.ts --markers --base main
  --strict`): ok.

If you installed v0.7.1 via curl, your `altimate upgrade` will still
fail until you re-install manually once:

    curl -fsSL https://www.altimate.sh/install | bash

v0.7.2 and forward self-heal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: curl install URL returns HTML instead of shell script

2 participants