Skip to content

Commit 79cb1fe

Browse files
committed
chore: release v0.15.0
1 parent 5a660f8 commit 79cb1fe

File tree

7 files changed

+88
-49
lines changed

7 files changed

+88
-49
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## [0.15.0] - 2025-11-10
4+
### 🗂 Documentation & Helpers
5+
- Core package now ships the monorepo README directly (`packages/core/README.md`) so npm consumers see the same getting-started guides without visiting GitHub.
6+
- Helper APIs (`createHeadlessCodex/Claude/Gemini`) are now the recommended path throughout the docs and multi-provider examples, keeping server-only usage explicit.
7+
8+
### 🧪 Tooling
9+
- Smoke tests assert the presence of the helper factories across all adapters to prevent regressions.
10+
311
## [0.14.1] - 2025-11-10
412
### ✨ Helper APIs
513
- Added `createHeadlessClaude()` and `createHeadlessGemini()` convenience helpers, mirroring the Codex helper so consumers can get a coder without calling `registerAdapter` manually.

packages/claude-adapter/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@headless-coder-sdk/claude-adapter",
3-
"version": "0.14.1",
3+
"version": "0.15.0",
44
"type": "module",
55
"main": "./dist/index.cjs",
66
"module": "./dist/index.js",
@@ -19,7 +19,7 @@
1919
},
2020
"peerDependencies": {
2121
"@anthropic-ai/claude-agent-sdk": "*",
22-
"@headless-coder-sdk/core": "^0.14.1"
22+
"@headless-coder-sdk/core": "^0.15.0"
2323
},
2424
"devDependencies": {
2525
"typescript": "^5.4.0",

packages/codex-adapter/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@headless-coder-sdk/codex-adapter",
3-
"version": "0.14.1",
3+
"version": "0.15.0",
44
"type": "module",
55
"main": "./dist/index.cjs",
66
"module": "./dist/index.js",
@@ -27,7 +27,7 @@
2727
"build": "tsup --config tsup.config.ts"
2828
},
2929
"peerDependencies": {
30-
"@headless-coder-sdk/core": "^0.14.1",
30+
"@headless-coder-sdk/core": "^0.15.0",
3131
"@openai/codex-sdk": "^0.57.0"
3232
},
3333
"devDependencies": {

packages/core/README.md

Lines changed: 70 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,9 @@ npm i @headless-coder-sdk/core @headless-coder-sdk/codex-adapter
3838
```
3939

4040
```ts
41-
import { registerAdapter, createCoder } from '@headless-coder-sdk/core';
42-
import { CODER_NAME as CODEX, createAdapter as createCodex } from '@headless-coder-sdk/codex-adapter';
41+
import { createHeadlessCodex } from '@headless-coder-sdk/codex-adapter';
4342

44-
registerAdapter(CODEX, createCodex);
45-
46-
const coder = createCoder(CODEX);
43+
const coder = createHeadlessCodex({ workingDirectory: process.cwd() });
4744
const thread = await coder.startThread();
4845
const result = await thread.run('Write a hello world script');
4946
console.log(result.text);
@@ -70,12 +67,9 @@ console.log(result.text);
7067
## 🌊 Streaming Example (Claude)
7168

7269
```ts
73-
import { registerAdapter, createCoder } from '@headless-coder-sdk/core/factory';
74-
import { CODER_NAME as CLAUDE_CODER, createAdapter as createClaudeAdapter } from '@headless-coder-sdk/claude-adapter';
75-
76-
registerAdapter(CLAUDE_CODER, createClaudeAdapter);
70+
import { createHeadlessClaude } from '@headless-coder-sdk/claude-adapter';
7771

78-
const claude = createCoder(CLAUDE_CODER, {
72+
const claude = createHeadlessClaude({
7973
workingDirectory: process.cwd(),
8074
permissionMode: 'bypassPermissions',
8175
});
@@ -97,12 +91,9 @@ console.log(followUp.text);
9791
## 🧩 Structured Output Example (Gemini)
9892

9993
```ts
100-
import { registerAdapter, createCoder } from '@headless-coder-sdk/core/factory';
101-
import { CODER_NAME as GEMINI_CODER, createAdapter as createGeminiAdapter } from '@headless-coder-sdk/gemini-adapter';
102-
103-
registerAdapter(GEMINI_CODER, createGeminiAdapter);
94+
import { createHeadlessGemini } from '@headless-coder-sdk/gemini-adapter';
10495

105-
const gemini = createCoder(GEMINI_CODER, {
96+
const gemini = createHeadlessGemini({
10697
workingDirectory: process.cwd(),
10798
includeDirectories: [process.cwd()],
10899
});
@@ -153,27 +144,15 @@ console.log(followUp.text);
153144
## 🔄 Multi-Provider Workflow
154145

155146
```ts
156-
import {
157-
registerAdapter,
158-
createCoder,
159-
} from '@headless-coder-sdk/core/factory';
160-
import {
161-
CODER_NAME as CODEX,
162-
createAdapter as createCodex,
163-
} from '@headless-coder-sdk/codex-adapter';
164-
import {
165-
CODER_NAME as CLAUDE,
166-
createAdapter as createClaude,
167-
} from '@headless-coder-sdk/claude-adapter';
168-
import {
169-
CODER_NAME as GEMINI,
170-
createAdapter as createGemini,
171-
} from '@headless-coder-sdk/gemini-adapter';
172-
173-
registerAdapter(CODEX, createCodex);
174-
registerAdapter(CLAUDE, createClaude);
175-
registerAdapter(GEMINI, createGemini);
147+
import { createHeadlessCodex } from '@headless-coder-sdk/codex-adapter';
148+
import { createHeadlessClaude } from '@headless-coder-sdk/claude-adapter';
149+
import { createHeadlessGemini } from '@headless-coder-sdk/gemini-adapter';
150+
151+
const codex = createHeadlessCodex();
152+
const claude = createHeadlessClaude();
153+
const gemini = createHeadlessGemini({ workingDirectory: process.cwd() });
176154

155+
// 1) Claude + Codex perform code review concurrently and emit structured findings.
177156
const reviewSchema = {
178157
type: 'object',
179158
properties: {
@@ -194,7 +173,6 @@ const reviewSchema = {
194173
} as const;
195174

196175
async function runMultiProviderReview(commitHash: string) {
197-
const [claude, codex] = [createCoder(CLAUDE), createCoder(CODEX)];
198176
const [claudeThread, codexThread] = await Promise.all([
199177
claude.startThread(),
200178
codex.startThread(),
@@ -213,7 +191,7 @@ async function runMultiProviderReview(commitHash: string) {
213191
...(codexReview.json?.issues ?? []),
214192
];
215193

216-
const gemini = createCoder(GEMINI, { workingDirectory: process.cwd() });
194+
// 2) Gemini waits for both reviewers, then fixes each issue sequentially.
217195
const geminiThread = await gemini.startThread();
218196

219197
for (const issue of combinedIssues) {
@@ -229,11 +207,47 @@ async function runMultiProviderReview(commitHash: string) {
229207
]);
230208
}
231209

232-
await Promise.all([claude.close?.(claudeThread), codex.close?.(codexThread), gemini.close?.(geminiThread)]);
210+
await Promise.all([
211+
claude.close?.(claudeThread),
212+
codex.close?.(codexThread),
213+
gemini.close?.(geminiThread),
214+
]);
233215
}
234216
```
235217

236-
Two reviewers (Claude and Codex) analyze the same commit concurrently and emit structured findings. Gemini waits until both reviews finish, then applies fixes sequentially based on the shared structured payload.
218+
In this workflow two reviewers (Claude, Codex) analyze the same commit in parallel and emit structured findings. Gemini then waits until both reviews finish and applies fixes issue-by-issue using the shared structured payload.
219+
220+
---
221+
222+
## ⚠️ Codex Adapter Runtime
223+
224+
- The Codex adapter forks worker processes via Node’s `child_process` API and **must run on the server**. It is safe to import in build tooling, but gate runtime usage to environments where `process.versions.node` exists.
225+
- A convenience helper, `createHeadlessCodex`, registers the adapter and returns a coder in one call:
226+
227+
```ts
228+
import { createHeadlessCodex } from '@headless-coder-sdk/codex-adapter';
229+
230+
if (typeof window !== 'undefined') {
231+
throw new Error('Codex adapter is server-only');
232+
}
233+
234+
const codex = createHeadlessCodex({ workingDirectory: process.cwd() });
235+
```
236+
237+
- In frameworks like Next.js, lazy-load the helper inside server components or API routes to avoid bundling it client-side:
238+
239+
```ts
240+
export async function POST() {
241+
if (typeof window !== 'undefined') {
242+
throw new Error('Codex must run on the server');
243+
}
244+
const { createHeadlessCodex } = await import('@headless-coder-sdk/codex-adapter');
245+
const coder = createHeadlessCodex({ workingDirectory: process.cwd() });
246+
const thread = await coder.startThread();
247+
const result = await thread.run('List recent commits');
248+
return Response.json({ text: result.text });
249+
}
250+
```
237251

238252
---
239253

@@ -294,4 +308,21 @@ Open an [issue](https://github.com/OhadAssulin/headless-coder-sdk/issues) or sub
294308

295309
---
296310

311+
## 📦 Distribution Notes
312+
313+
- Every workspace now emits flattened entry points at `dist/*.js` (ESM) and `dist/*.cjs` (CommonJS), with `.d.ts` files sitting beside them for better editor support.
314+
- You can import `createCoder` or helper utilities directly from `@headless-coder-sdk/core` and `@headless-coder-sdk/codex-adapter` without deep `dist/*/src` paths—the `main`/`module` fields now point at those root files.
315+
- Helper factories (`createHeadlessCodex/Claude/Gemini`) register adapters and return coders in one call, making server-only integrations simpler.
316+
- `package.json` is exposed via the exports map (`import '@headless-coder-sdk/core/package.json'`) for tooling that needs to inspect versions at runtime.
317+
- `@headless-coder-sdk/codex-adapter` forks a worker via `fileURLToPath(new URL('./worker.js', import.meta.url))`; keep `dist/worker.js` adjacent when rebundling so that child processes can spawn correctly.
318+
319+
---
320+
321+
## ✅ Smoke Tests
322+
323+
- `npm run smoke` builds every workspace, packs the publishable tarballs, installs them in a throwaway project, and exercises both CommonJS and ESM entry points.
324+
- Set `HEADLESS_CODER_KEEP_SMOKE_TMP=1 npm run smoke` if you want to inspect the generated smoke project instead of deleting it.
325+
326+
---
327+
297328
© 2025 Ohad Assulin - MIT License

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@headless-coder-sdk/core",
3-
"version": "0.14.1",
3+
"version": "0.15.0",
44
"description": "Unified SDK for headless AI coders (Codex, Claude, Gemini) with standardized threading, streaming, and sandboxing.",
55
"type": "module",
66
"main": "./dist/index.cjs",

packages/gemini-adapter/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@headless-coder-sdk/gemini-adapter",
3-
"version": "0.14.1",
3+
"version": "0.15.0",
44
"type": "module",
55
"main": "./dist/index.cjs",
66
"module": "./dist/index.js",
@@ -18,7 +18,7 @@
1818
"build": "tsup --config tsup.config.ts"
1919
},
2020
"peerDependencies": {
21-
"@headless-coder-sdk/core": "^0.14.1"
21+
"@headless-coder-sdk/core": "^0.15.0"
2222
},
2323
"devDependencies": {
2424
"typescript": "^5.4.0",

pnpm-lock.yaml

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)