Skip to content

Commit 4760aed

Browse files
committed
fix: multiple cleanup items
- doctor: resolve workspace main entry for npm-named adapters so minCoreVersion loads - doctor: export resolveWorkspaceMainEntry from version-check.ts + index.ts - AGENTS.md: fix stale npm scope @browserkit@browserkit-dev - CHANGELOG.md: fix header typo and rewrite to accurately separate 0.1.0 vs 0.2.0 Made-with: Cursor
1 parent 1c47c56 commit 4760aed

5 files changed

Lines changed: 58 additions & 6 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Durable facts and correction patterns for this workspace. Updated by continual-l
44

55
## Project: browserkit
66

7-
- Project is named **browserkit** — decided and final. npm scope is `@browserkit`. GitHub org is `browserkit-dev` (`browserkit` org was taken on GitHub, available on npm).
7+
- Project is named **browserkit** — decided and final. npm scope is `@browserkit-dev`. GitHub org is `browserkit-dev` (`browserkit` org name was taken on both GitHub and npm; `@browserkit-dev` is the npm scope in use).
88
- GitHub repos: `browserkit-dev/browserkit` (framework — `@browserkit-dev/core` + `@browserkit-dev/core/testing`), `browserkit-dev/adapter-hackernews`, `browserkit-dev/adapter-google-discover`, `browserkit-dev/adapter-linkedin` — all standalone public repos
99
- Language is TypeScript, not Python
1010
- MCP transport is HTTP (`StreamableHTTPServerTransport`), not stdio — preferred for multi-agent deployment

packages/core/CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@
44

55
### Minor Changes
66

7-
- 732686d: Initial public release of @browserkit-dev/core — the framework for building site-specific MCP servers over authenticated browser sessions.
7+
- Adapter ecosystem hardening: `minCoreVersion` + `AdapterRequirements` on `SiteAdapter`, `version-check.ts` with `satisfies()`/`readCoreVersion()`, `browserkit doctor` CLI command, dynamic `create-adapter` scaffold versioning, cross-repo `test-adapters.yml` CI.
88

9-
Key features:
9+
## 0.1.0
10+
11+
### Minor Changes
12+
13+
- Initial public release of @browserkit-dev/core — the framework for building site-specific MCP servers over authenticated browser sessions.
1014

15+
Key features:
1116
- `defineAdapter` / `SiteAdapter` interface for building adapters
1217
- `SessionManager` with persistent, storage-state, and CDP-attach strategies
1318
- `withLoginFlow` for opt-in automated form-based login
1419
- `waitUntil`, `fetchGetWithinPage`, `fetchPostWithinPage` and other scraping utilities
1520
- `preparePage` lifecycle hook for per-page configuration
1621
- `LockManager`, `RateLimiter`, and `withObservability` for production reliability
1722
- HTTP MCP transport via `StreamableHTTPServerTransport`
23+
- `LockManager`, `RateLimiter`, and `withObservability` for production reliability
24+
- HTTP MCP transport via `StreamableHTTPServerTransport`

packages/core/src/cli.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { SessionManager, getDefaultDataDir } from "./session-manager.js";
88
import { runLoginCommand } from "./human-handoff.js";import { createAdapter } from "./create-adapter.js";
99
import type { FrameworkConfig, DaemonStatus, AdapterStatus } from "./types.js";
1010
import { getLogger } from "./logger.js";
11-
import { readCoreVersion, satisfies, readAdapterVersion } from "./version-check.js";
11+
import { readCoreVersion, satisfies, readAdapterVersion, resolveWorkspaceMainEntry } from "./version-check.js";
1212

1313
const log = getLogger("cli");
1414

@@ -449,7 +449,12 @@ async function cmdDoctor(args: string[]): Promise<void> {
449449
let loadError: string | undefined;
450450

451451
try {
452-
const mod = await import(key).catch(() => null);
452+
// For npm package names that aren't in node_modules (workspace packages),
453+
// resolve the main entry file via the workspace and import from that path.
454+
const importKey = (key.startsWith("/") || key.startsWith("."))
455+
? key
456+
: (resolveWorkspaceMainEntry(key) ?? key);
457+
const mod = await import(importKey).catch(() => null);
453458
const adapter = mod?.default ?? mod;
454459
if (adapter && typeof adapter === "object") {
455460
minCoreVer = typeof adapter.minCoreVersion === "string" ? adapter.minCoreVersion : undefined;

packages/core/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export {
8888
export { withLoginFlow } from "./login-flow.js";
8989

9090
// ─── Version utilities ────────────────────────────────────────────────────────
91-
export { readCoreVersion, satisfies, parseSemver, readAdapterVersion } from "./version-check.js";
91+
export { readCoreVersion, satisfies, parseSemver, readAdapterVersion, resolveWorkspaceMainEntry } from "./version-check.js";
9292

9393
// ─── Observability ────────────────────────────────────────────────────────────
9494
export { withObservability } from "./observability.js";

packages/core/src/version-check.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,43 @@ function findInPnpmWorkspace(packageName: string): string | null {
135135
return null;
136136
}
137137
}
138+
139+
/**
140+
* For an npm package name, resolve its main entry file path via the pnpm
141+
* workspace (for packages that are workspace members but not in node_modules).
142+
* Returns null if not found in the workspace.
143+
*/
144+
export function resolveWorkspaceMainEntry(packageName: string): string | null {
145+
try {
146+
let dir = path.dirname(fileURLToPath(import.meta.url));
147+
for (let i = 0; i < 10; i++) {
148+
if (fs.existsSync(path.join(dir, "pnpm-workspace.yaml"))) {
149+
const packagesDir = path.join(dir, "packages");
150+
if (!fs.existsSync(packagesDir)) break;
151+
for (const entry of fs.readdirSync(packagesDir)) {
152+
const pkgJsonPath = path.join(packagesDir, entry, "package.json");
153+
if (fs.existsSync(pkgJsonPath)) {
154+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8")) as {
155+
name?: string;
156+
main?: string;
157+
exports?: Record<string, unknown>;
158+
};
159+
if (pkg.name === packageName) {
160+
// Prefer exports["."].import, fall back to main
161+
const exportsDefault = (pkg.exports as { "."?: { import?: string } } | undefined)?.["."]?.import;
162+
const mainEntry = exportsDefault ?? pkg.main ?? "dist/index.js";
163+
return path.join(packagesDir, entry, mainEntry);
164+
}
165+
}
166+
}
167+
break;
168+
}
169+
const parent = path.dirname(dir);
170+
if (parent === dir) break;
171+
dir = parent;
172+
}
173+
return null;
174+
} catch {
175+
return null;
176+
}
177+
}

0 commit comments

Comments
 (0)