Diffinery

codician/diffinerypublic

Open-source, agent-first GitHub and GitHub Actions alternative that runs on your own Cloudflare account: git hosting, pull requests, code review and drop-in GitHub Actions YAML on Workers, Durable Objects, R2 and Containers.

3 files changed+8−1
modifiedapps/cli/install/install.sh+6−0View file
@@ -8,6 +8,12 @@
88 # Node.js 22 or later: the one on your PATH when it's new enough, otherwise a private copy of the
99 # Node.js LTS from nodejs.org, checked against its published SHA-256, in ~/.diffinery/node.
1010 # Run it again, or `diffinery upgrade`, to update. Served by Diffinery from apps/cli/install/.
11+
12+# Piped into sh instead of bash, a shell like dash stops at `set -o pipefail` with no hint why.
13+if [ -z "${BASH_VERSION:-}" ]; then
14+ echo "This installer needs bash: curl -fsSL __DIFFINERY_URL__/install | bash" >&2
15+ exit 1
16+fi
1117 set -euo pipefail
1218
1319 server=${DIFFINERY_URL:-__DIFFINERY_URL__}
modifiedapps/diffinery/docs/agents/claude-and-codex.md+1−1View file
@@ -51,7 +51,7 @@
5151 The MCP tools need no git at all. When Claude Code works in a clone instead, give it the CLI once:
5252
5353 ```sh
54-curl -fsSL https://diffinery.com/install | sh # Windows: irm https://diffinery.com/install.ps1 | iex
54+curl -fsSL https://diffinery.com/install | bash # Windows: irm https://diffinery.com/install.ps1 | iex
5555 diffinery login # browser sign-in, or --device on a server
5656 diffinery auth setup-git # git push and pull use the same sign-in
5757 diffinery auth setup-gh # gh, and Claude Code's pull request and CI status
modifiedapps/diffinery/test/unit/docs.test.ts+1−0View file
@@ -220,6 +220,7 @@
220220 expect(sh).toMatch(/^#!\/usr\/bin\/env bash\n/);
221221 expect(sh).toContain(`server=\${DIFFINERY_URL:-${ORIGIN}}`);
222222 expect(sh).not.toContain("__DIFFINERY_URL__");
223+ expect(sh).toContain(`curl -fsSL ${ORIGIN}/install | bash`); // what to run when piped into sh
223224 }
224225 const ps1 = await (await get("/install.ps1")).text();
225226 expect(ps1).toContain(`'${ORIGIN}'`);