From 1d50d12ce2bd7844e8720e281a023821d9235031 Mon Sep 17 00:00:00 2001 From: barneyjm Date: Mon, 24 Aug 2026 10:36:23 -0400 Subject: [PATCH] Point volunteers at npx givework@latest, so a stale cache can't pin them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `npx givework start` resolves the `latest` dist-tag on a first run, but npx prefers a local node_modules/.bin/givework or a cached entry on every run after that — a volunteer can keep running an old CLI indefinitely without knowing. `start` is pitched as the same command your first time or your fiftieth, so that is exactly the path that goes stale. Pin the user-facing invocations to @latest: README, the site pages, and the post-login page in oauth.ts. Left alone on purpose: - scripts/seed-test-task.ts runs the locally built bin during development, where @latest would pull the registry copy and defeat the point; - the `npx github:Barneyjm/givework.dev …` branch-install path, which never touches the registry. test/run-target.test.ts asserts these strings, so it moves in lockstep. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01WoAJRWLbAW5pakUUzEzcjV --- README.md | 10 +++++----- site/conjecture.html | 2 +- site/index.html | 6 +++--- site/tasks.html | 4 ++-- site/volunteers.html | 4 ++-- src/oauth.ts | 4 ++-- test/run-target.test.ts | 6 ++++-- 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 20a34b8..5e76415 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ ## Volunteer in one command ```bash -npx givework start +npx givework@latest start ``` That is the whole thing, whether it is your first time or your fiftieth. `start` @@ -59,7 +59,7 @@ one, or the auto-probe picks wrong). Then keep going: ```bash -npx givework start --watch +npx givework@latest start --watch ``` `start` on its own finishes by telling you how to begin the work loop rather than @@ -71,7 +71,7 @@ and `run` are all still real commands if you'd rather drive the steps yourself. By default your runner chips away wherever work is needed — the general pool is the point, and it's how less-famous problems get attention too. If one problem in particular is why you're here, narrow it: `--target ` (e.g. -`npx givework run --watch --target goldbach`) works only that conjecture, and +`npx givework@latest run --watch --target goldbach`) works only that conjecture, and `run --task ` claims exactly one specific task and stops. ## What is Givework? @@ -657,12 +657,12 @@ account IDs, Neon project IDs, tokens) — CI injects them as secrets. `givework` is on npm, so the short form works: ```bash -npx givework start +npx givework@latest start ``` `npx github:Barneyjm/givework.dev …` also works and needs no registry at all — npm clones the repo, installs, runs `prepare` → `build:cli`, and links the -`givework` bin. Useful for running an unreleased branch; `npx givework` is the +`givework` bin. Useful for running an unreleased branch; `npx givework@latest` is the one to hand to a stranger. **Releases run from CI with no stored credential.** `.github/workflows/publish-cli.yml` diff --git a/site/conjecture.html b/site/conjecture.html index c1c5a37..6b3b72c 100644 --- a/site/conjecture.html +++ b/site/conjecture.html @@ -631,7 +631,7 @@ }); // The moment of motivation: someone reading THIS conjecture gets the // command that points their runner at it, not at the general pool. - h += '

Point your agent here with npx givework run --watch --target ' + esc(slug) + ' · see all open work →

'; + h += '

Point your agent here with npx givework@latest run --watch --target ' + esc(slug) + ' · see all open work →

'; slot.innerHTML = h; }) .catch(function () {}); diff --git a/site/index.html b/site/index.html index 66e78e4..e341c30 100644 --- a/site/index.html +++ b/site/index.html @@ -281,9 +281,9 @@

Put your idle agent to work.

Up and running in one command:

# signs you in, sets a cap, does one real task — about a minute
-npx givework start
+npx givework@latest start
 # when you're ready to keep a runner going on your own claude -p
-npx givework start --watch
+npx givework@latest start --watch

start does only what's missing and is safe to re-run. It never starts the work loop on its own — that's what --watch is for. Needs the claude CLI installed & logged in — that session is the donated capacity.

@@ -325,7 +325,7 @@

Two sides, one tally.

For contributors
-
01

Run one command

npx givework start signs you in, asks what you'll donate this month, and does one real task on a live open problem — so you see it work before you leave anything running. It picks up wherever you already are, so it's the same command every time. Your machine, your subscription; nothing leaves your control.

+
01

Run one command

npx givework@latest start signs you in, asks what you'll donate this month, and does one real task on a live open problem — so you see it work before you leave anything running. It picks up wherever you already are, so it's the same command every time. Your machine, your subscription; nothing leaves your control.

02

Check out a task

Each task reserves against a budget you set, so a run can never overspend. Read the accumulated state, add your chunk, and submit a contribution.

03

Keep the record

Each checkout and contribution adds to your running tally — so you can always see your own impact and point to the work you've done.

diff --git a/site/tasks.html b/site/tasks.html index 24d03f4..5889d5c 100644 --- a/site/tasks.html +++ b/site/tasks.html @@ -121,7 +121,7 @@

Work waiting to be picked up.

Loading…

-

Task titles and angles are public. The full brief comes with the task when your runner claims it — npx givework start.

+

Task titles and angles are public. The full brief comes with the task when your runner claims it — npx givework@latest start.

Become a contributor → @@ -215,7 +215,7 @@

Work waiting to be picked up.

}).join('') + '' + '

The full brief — statement, prior attempts, and the current ' + 'frontier — arrives with the task when your runner claims it: ' + - 'npx givework start

' + + 'npx givework@latest start

' + '
'; } diff --git a/site/volunteers.html b/site/volunteers.html index 3f4feca..ad4f9b0 100644 --- a/site/volunteers.html +++ b/site/volunteers.html @@ -135,9 +135,9 @@

Up and running in minutes.

It never starts the work loop on its own — that's what --watch is for. Needs the claude CLI installed & logged in — that session is the donated capacity.

# signs you in, sets a cap, does one real task — about a minute
-npx givework start
+npx givework@latest start
 # when you're ready to keep a runner going on your own claude -p
-npx givework start --watch
+npx givework@latest start --watch diff --git a/src/oauth.ts b/src/oauth.ts index 4c5bf7f..26eff79 100644 --- a/src/oauth.ts +++ b/src/oauth.ts @@ -378,9 +378,9 @@ Internal/sensitive work unlocks once an admin verifies your account.

signed in, so it's one click), asks what you'll donate this month, then hands you a real task on a live open problem and runs it. About a minute, and you see it work end to end before you leave anything running.

-
npx givework start
+
npx givework@latest start

Same command every time: it does only what's missing, so it's always safe -to re-run. When you're ready to keep a runner going, npx givework start --watch +to re-run. When you're ready to keep a runner going, npx givework@latest start --watch claims tasks continuously on your own claude -p until you stop it — start never begins that loop on its own.

Prerequisite: the claude CLI installed and logged in — that diff --git a/test/run-target.test.ts b/test/run-target.test.ts index b502d90..6edf085 100644 --- a/test/run-target.test.ts +++ b/test/run-target.test.ts @@ -190,8 +190,10 @@ describe('site: conjecture page claim command', () => { it('renders the per-slug command at the moment of motivation', () => { const html = readFileSync(new URL('../site/conjecture.html', import.meta.url), 'utf8'); // The open-pool note builds the command with the page's own slug… - expect(html).toContain("npx givework run --watch --target ' + esc(slug)"); + expect(html).toContain("npx givework@latest run --watch --target ' + esc(slug)"); // …instead of the old generic pointer. - expect(html).not.toContain('Claim one with npx givework start'); + expect(html).not.toContain( + 'Claim one with npx givework@latest start', + ); }); });