diff --git a/README.md b/README.md index 4c5eaf9dec..59b6a83f3a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -# Codebuff +# Codebuff & Freebuff -Codebuff is an **open-source AI coding assistant** that edits your codebase through natural language instructions. Instead of using one model for everything, it coordinates specialized agents that work together to understand your project and make precise changes. +**[Codebuff](https://codebuff.com)** is an open-source AI coding assistant that edits your codebase through natural language instructions. **[Freebuff](https://www.npmjs.com/package/freebuff)** is the free, ad-supported version — no subscription, no credits, no configuration. + +Instead of using one model for everything, Codebuff coordinates specialized agents that work together to understand your project and make precise changes.
@@ -147,6 +149,18 @@ await client.run({
Learn more about the SDK [here](https://www.npmjs.com/package/@codebuff/sdk).
+## Freebuff: The free coding agent
+
+Don't want a subscription? **[Freebuff](https://www.npmjs.com/package/freebuff)** is a free variant of Codebuff — no subscription, no credits, no configuration. Just install and start coding.
+
+```bash
+npm install -g freebuff
+cd your-project
+freebuff
+```
+
+Freebuff is ad-supported and uses models optimized for fast, high-quality assistance. It includes built-in web research, browser use, and more. Learn more in the [Freebuff README](./freebuff/README.md).
+
## Why choose Codebuff
**Custom workflows**: TypeScript generators let you mix AI generation with programmatic control. Agents can spawn subagents, branch on conditions, and run multi-step processes.
@@ -216,6 +230,8 @@ Some ways you can help:
**SDK**: `npm install @codebuff/sdk`
+**Freebuff (free)**: `npm install -g freebuff`
+
### Resources
**Documentation**: [codebuff.com/docs](https://codebuff.com/docs)
diff --git a/freebuff/cli/release/package.json b/freebuff/cli/release/package.json
index d29c729fc8..9f5caba439 100644
--- a/freebuff/cli/release/package.json
+++ b/freebuff/cli/release/package.json
@@ -1,6 +1,6 @@
{
"name": "freebuff",
- "version": "0.0.21",
+ "version": "0.0.22",
"description": "The world's strongest free coding agent",
"license": "MIT",
"bin": {
diff --git a/web/src/llm-api/__tests__/fireworks-deployment.test.ts b/web/src/llm-api/__tests__/fireworks-deployment.test.ts
index 2108d408a2..ddb8daddc6 100644
--- a/web/src/llm-api/__tests__/fireworks-deployment.test.ts
+++ b/web/src/llm-api/__tests__/fireworks-deployment.test.ts
@@ -5,7 +5,6 @@ import {
DEPLOYMENT_COOLDOWN_MS,
FireworksError,
isDeploymentCoolingDown,
- isDeploymentHours,
markDeploymentScalingUp,
resetDeploymentCooldown,
} from '../fireworks'
@@ -36,40 +35,6 @@ function dateAtEtHour(hour: number): Date {
}
describe('Fireworks deployment routing', () => {
- describe('isDeploymentHours', () => {
- it('returns true at 10am ET (start of window)', () => {
- expect(isDeploymentHours(dateAtEtHour(10))).toBe(true)
- })
-
- it('returns true at 2pm ET (mid-day)', () => {
- expect(isDeploymentHours(dateAtEtHour(14))).toBe(true)
- })
-
- it('returns true at 7pm ET (19:00, near end of window)', () => {
- expect(isDeploymentHours(dateAtEtHour(19))).toBe(true)
- })
-
- it('returns false at 9am ET (before window)', () => {
- expect(isDeploymentHours(dateAtEtHour(9))).toBe(false)
- })
-
- it('returns false at 8pm ET (20:00, window closed)', () => {
- expect(isDeploymentHours(dateAtEtHour(20))).toBe(false)
- })
-
- it('returns false at midnight ET', () => {
- expect(isDeploymentHours(dateAtEtHour(0))).toBe(false)
- })
-
- it('returns false at 3am ET', () => {
- expect(isDeploymentHours(dateAtEtHour(3))).toBe(false)
- })
-
- it('returns false at 11pm ET', () => {
- expect(isDeploymentHours(dateAtEtHour(23))).toBe(false)
- })
- })
-
describe('deployment cooldown', () => {
beforeEach(() => {
resetDeploymentCooldown()
@@ -139,8 +104,7 @@ describe('Fireworks deployment routing', () => {
return spy
}
- it('uses standard API outside deployment hours', async () => {
- const spy = spyDeploymentHours(false)
+ it('uses standard API when custom deployment is disabled', async () => {
const fetchCalls: string[] = []
const mockFetch = mock(async (_url: string | URL | Request, init?: RequestInit) => {
@@ -149,21 +113,18 @@ describe('Fireworks deployment routing', () => {
return new Response(JSON.stringify({ ok: true }), { status: 200 })
}) as unknown as typeof globalThis.fetch
- try {
- const response = await createFireworksRequestWithFallback({
- body: minimalBody as never,
- originalModel: 'minimax/minimax-m2.5',
- fetch: mockFetch,
- logger,
- sessionId: 'test-user-id',
- })
-
- expect(response.status).toBe(200)
- expect(fetchCalls).toHaveLength(1)
- expect(fetchCalls[0]).toBe(STANDARD_MODEL_ID)
- } finally {
- spy.restore()
- }
+ const response = await createFireworksRequestWithFallback({
+ body: minimalBody as never,
+ originalModel: 'minimax/minimax-m2.5',
+ fetch: mockFetch,
+ logger,
+ useCustomDeployment: false,
+ sessionId: 'test-user-id',
+ })
+
+ expect(response.status).toBe(200)
+ expect(fetchCalls).toHaveLength(1)
+ expect(fetchCalls[0]).toBe(STANDARD_MODEL_ID)
})
it('tries custom deployment during deployment hours', async () => {