From 02f3edeac1c0ceef79745b607aa6f047f9af960e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=82=9F=E6=89=AC?= Date: Mon, 7 Sep 2026 17:52:28 +0800 Subject: [PATCH] feat(sdk): consolidate project services into SDK Move local versions and directory workspace services into SDK subpath exports. Update CLI and Workbench consumers, release configuration, documentation, and package smoke coverage. Bump SDK, CLI, and Playground to 0.7.0 while retaining private package versions. --- .changeset/config.json | 10 +--- .dependency-cruiser.cjs | 35 ++++-------- .github/workflows/ci.yml | 4 +- README.md | 4 +- README.zh-CN.md | 4 +- apps/server/package.json | 2 - apps/server/src/routes/project.ts | 4 +- .../src/services/project-declarations.ts | 14 ++--- apps/server/src/services/project-manager.ts | 16 +++--- apps/server/src/services/project-versions.ts | 4 +- .../server/tests/project-declarations.test.ts | 2 +- apps/server/tests/project-manager.test.ts | 2 +- apps/server/tests/project-versions.test.ts | 2 +- bun.lock | 42 +------------- docs/contributing/release.md | 2 +- docs/contributing/release.zh-CN.md | 2 +- docs/reference/sdk.md | 2 +- package.json | 10 +--- packages/cli/CHANGELOG.md | 7 +++ packages/cli/package.json | 4 +- packages/cli/src/commands/apply.ts | 2 +- packages/cli/src/commands/destroy.ts | 2 +- packages/cli/src/commands/plan.ts | 2 +- packages/cli/src/commands/project.ts | 4 +- .../cli/src/versioning/project-versions.ts | 4 +- packages/cli/tests/unit/version.test.ts | 2 +- packages/playground/CHANGELOG.md | 7 +++ packages/playground/package.json | 4 +- packages/playground/tsup.config.ts | 4 +- packages/project-versions/CHANGELOG.md | 17 ------ packages/project-versions/package.json | 57 ------------------- packages/project-versions/tsconfig.json | 13 ----- packages/project-versions/tsup.config.ts | 15 ----- packages/project-workspace/CHANGELOG.md | 18 ------ packages/project-workspace/package.json | 42 -------------- packages/project-workspace/tsconfig.json | 11 ---- packages/project-workspace/tsup.config.ts | 15 ----- packages/sdk/CHANGELOG.md | 6 ++ packages/sdk/README.md | 17 ++++++ .../docs/project-versions.md} | 11 ++-- .../docs/project-workspace.md} | 6 +- packages/sdk/docs/public-api-layers.md | 7 +++ packages/sdk/package.json | 14 ++++- .../internal/project-versions}/directory.ts | 5 +- .../src/internal/project-versions}/index.ts | 4 +- .../src/internal/project-workspace}/index.ts | 37 ++++++------ .../internal/project-workspace}/scaffold.ts | 0 .../project-workspace}/vault-secrets.ts | 2 +- packages/sdk/src/project-versions.ts | 2 + packages/sdk/src/project-workspace.ts | 2 + .../tests/unit/project-scaffold.test.ts} | 6 +- .../tests/unit/project-vault-secrets.test.ts} | 10 +++- .../tests/unit}/project-versions.test.ts | 2 +- .../tests/unit/project-workspace.test.ts} | 4 +- packages/sdk/tsup.config.ts | 2 + scripts/open-source.test.ts | 8 +-- scripts/release/build.ts | 2 +- scripts/release/channel.ts | 2 +- scripts/release/consumer-smoke.ts | 21 +++---- scripts/release/playground-bundle.test.ts | 4 +- scripts/release/project-sdk-smoke.ts | 43 ++++++++++++++ scripts/release/publish.ts | 2 +- scripts/release/smoke-packed.test.ts | 4 +- scripts/release/smoke-packed.ts | 14 ++--- scripts/release/snapshot.ts | 2 +- scripts/verify.ts | 2 - 66 files changed, 236 insertions(+), 396 deletions(-) delete mode 100644 packages/project-versions/CHANGELOG.md delete mode 100644 packages/project-versions/package.json delete mode 100644 packages/project-versions/tsconfig.json delete mode 100644 packages/project-versions/tsup.config.ts delete mode 100644 packages/project-workspace/CHANGELOG.md delete mode 100644 packages/project-workspace/package.json delete mode 100644 packages/project-workspace/tsconfig.json delete mode 100644 packages/project-workspace/tsup.config.ts rename packages/{project-versions/README.md => sdk/docs/project-versions.md} (64%) rename packages/{project-workspace/README.md => sdk/docs/project-workspace.md} (95%) rename packages/{project-versions/src => sdk/src/internal/project-versions}/directory.ts (99%) rename packages/{project-versions/src => sdk/src/internal/project-versions}/index.ts (99%) rename packages/{project-workspace/src => sdk/src/internal/project-workspace}/index.ts (99%) rename packages/{project-workspace/src => sdk/src/internal/project-workspace}/scaffold.ts (100%) rename packages/{project-workspace/src => sdk/src/internal/project-workspace}/vault-secrets.ts (99%) create mode 100644 packages/sdk/src/project-versions.ts create mode 100644 packages/sdk/src/project-workspace.ts rename packages/{project-workspace/tests/scaffold.test.ts => sdk/tests/unit/project-scaffold.test.ts} (96%) rename packages/{project-workspace/tests/vault-secrets.test.ts => sdk/tests/unit/project-vault-secrets.test.ts} (97%) rename packages/{project-versions/tests => sdk/tests/unit}/project-versions.test.ts (99%) rename packages/{project-workspace/tests/workspace.test.ts => sdk/tests/unit/project-workspace.test.ts} (99%) create mode 100644 scripts/release/project-sdk-smoke.ts diff --git a/.changeset/config.json b/.changeset/config.json index 1afef7f..410700a 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -2,15 +2,7 @@ "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, - "fixed": [ - [ - "@openagentpack/sdk", - "@openagentpack/project-versions", - "@openagentpack/project-workspace", - "@openagentpack/playground", - "@openagentpack/cli" - ] - ], + "fixed": [["@openagentpack/sdk", "@openagentpack/playground", "@openagentpack/cli"]], "linked": [], "access": "public", "baseBranch": "main", diff --git a/.dependency-cruiser.cjs b/.dependency-cruiser.cjs index fdbbdac..33f1574 100644 --- a/.dependency-cruiser.cjs +++ b/.dependency-cruiser.cjs @@ -20,22 +20,25 @@ module.exports = { severity: "error", comment: "@openagentpack/sdk is the shared engine and must not depend on host packages or applications.", from: { path: "^packages/sdk/" }, - to: { path: "^(packages/cli|apps/server|apps/webui)/" }, + to: { path: "^(packages/cli|packages/playground|apps/server|apps/webui)/" }, }, { - name: "no-project-versions-to-hosts-or-apps", + name: "no-sdk-core-to-project-services", severity: "error", comment: - "@openagentpack/project-versions is a shared Node engine and must not depend on host packages or applications.", - from: { path: "^packages/project-versions/" }, - to: { path: "^(packages/cli|packages/playground|apps/server|apps/webui)/" }, + "Core SDK modules must not pull Node project services into the default entry or create dependency cycles.", + from: { + path: "^packages/sdk/src/", + pathNot: "^packages/sdk/src/(internal/project-(versions|workspace)/|project-(versions|workspace)\\.ts$)", + }, + to: { path: "^packages/sdk/src/(internal/project-(versions|workspace)/|project-(versions|workspace)\\.ts$)" }, }, { - name: "no-project-workspace-to-hosts-or-apps", + name: "no-project-versions-to-workspace", severity: "error", - comment: "@openagentpack/project-workspace is a shared Node engine and must not depend on hosts or applications.", - from: { path: "^packages/project-workspace/" }, - to: { path: "^(packages/cli|packages/playground|apps/server|apps/webui)/" }, + comment: "Snapshot storage must remain independent of the directory workspace adapter.", + from: { path: "^packages/sdk/src/(internal/project-versions/|project-versions\\.ts$)" }, + to: { path: "^packages/sdk/src/(internal/project-workspace/|project-workspace\\.ts$)" }, }, { name: "no-sdk-deep-imports", @@ -57,20 +60,6 @@ module.exports = { from: { path: "^apps/webui/src/" }, to: { path: "^packages/sdk/" }, }, - { - name: "no-webui-project-versions-runtime-import", - severity: "error", - comment: "Browser-facing code must use Workbench APIs instead of importing the Node-only version engine.", - from: { path: "^apps/webui/src/" }, - to: { path: "^packages/project-versions/" }, - }, - { - name: "no-webui-project-workspace-runtime-import", - severity: "error", - comment: "Browser-facing code must use Workbench APIs instead of importing the Node-only workspace engine.", - from: { path: "^apps/webui/src/" }, - to: { path: "^packages/project-workspace/" }, - }, ], options: { doNotFollow: { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 963bfb4..8fc5dfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,7 +64,7 @@ jobs: - node: 24 scope: all # Library smoke on the SDK engines floor (>=18.17.0): build and install - # sdk, project-versions, and project-workspace; cli/playground require Node >=22. + # SDK and its project subpaths; cli/playground require Node >=22. - node: 18.17.0 scope: sdk - node: 20 @@ -86,8 +86,6 @@ jobs: - if: matrix.scope == 'sdk' run: | bun run build:sdk - bun run build:project-versions - bun run build:project-workspace bun scripts/release/smoke-packed.ts --sdk-only gate: diff --git a/README.md b/README.md index 08d4291..affd705 100644 --- a/README.md +++ b/README.md @@ -179,10 +179,10 @@ The [`examples/`](./examples) directory has runnable configs for every provider, ## Using the SDK -Cloud runtime capabilities are available from `@openagentpack/sdk`. Directory compilation, Build/Publish, and full-tree versions are exposed by `@openagentpack/project-workspace`, backed by the storage primitives in `@openagentpack/project-versions`: +Cloud runtime capabilities are available from `@openagentpack/sdk`. The same npm package includes Node-only subpaths: `@openagentpack/sdk/project-workspace` provides directory compilation, Build/Publish, and full-tree versions, backed by the storage primitives in `@openagentpack/sdk/project-versions`: ```ts -import { previewProjectBuild, commitProjectBuild } from "@openagentpack/project-workspace"; +import { previewProjectBuild, commitProjectBuild } from "@openagentpack/sdk/project-workspace"; const preview = await previewProjectBuild("./my-agent"); const build = await commitProjectBuild({ diff --git a/README.zh-CN.md b/README.zh-CN.md index 9e4aec8..d77faf6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -175,11 +175,11 @@ Beta 用户可以安装 `@openagentpack/cli@beta`;固定版本及切回稳定 ## 使用 SDK -云端项目运行能力可通过 `@openagentpack/sdk` 以编程方式调用;仅限 Node.js 的本地项目版本能力由独立包 `@openagentpack/project-versions` 提供: +云端项目运行能力可通过 `@openagentpack/sdk` 以编程方式调用;本地版本和目录项目能力随同一个 SDK 包发布,分别通过仅限 Node.js 的 `@openagentpack/sdk/project-versions`、`@openagentpack/sdk/project-workspace` 子路径调用: ```ts import { resolveProjectConfig, planProjectContext } from "@openagentpack/sdk"; -import { createProjectVersionService } from "@openagentpack/project-versions"; +import { createProjectVersionService } from "@openagentpack/sdk/project-versions"; const config = await resolveProjectConfig({ configPath: "agents.yaml" }); const plan = await planProjectContext(config); diff --git a/apps/server/package.json b/apps/server/package.json index 1ec4e02..46c033d 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -16,8 +16,6 @@ }, "dependencies": { "@hono/zod-openapi": "^1.4.0", - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "chokidar": "^4.0.3", "hono": "^4.12.28", diff --git a/apps/server/src/routes/project.ts b/apps/server/src/routes/project.ts index 5f7130d..6ec5caf 100644 --- a/apps/server/src/routes/project.ts +++ b/apps/server/src/routes/project.ts @@ -1,11 +1,11 @@ import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { planAgentResourcesWithStateBackend, syncAgentResourcesWithStateBackend } from "@openagentpack/sdk"; import { acquireDirectoryProjectMutation, commitProjectBuild, previewProjectBuild, readValidProjectBuild, -} from "@openagentpack/project-workspace"; -import { planAgentResourcesWithStateBackend, syncAgentResourcesWithStateBackend } from "@openagentpack/sdk"; +} from "@openagentpack/sdk/project-workspace"; import { errorResponses } from "@/schemas/common"; import { AgentApplyBodySchema, diff --git a/apps/server/src/services/project-declarations.ts b/apps/server/src/services/project-declarations.ts index 6df9a73..f8d5801 100644 --- a/apps/server/src/services/project-declarations.ts +++ b/apps/server/src/services/project-declarations.ts @@ -1,19 +1,19 @@ import { randomUUID } from "node:crypto"; import { mkdir, readFile, rename, stat, unlink, writeFile } from "node:fs/promises"; import { basename, dirname, relative, resolve } from "node:path"; -import { - acquireDirectoryProjectMutation, - type DirectoryResourceType, - FILE_AUTO_ASSOCIATION_IGNORE_FILE, - inspectDirectoryProject, - locateDirectoryProjectResource, -} from "@openagentpack/project-workspace"; import { type Diagnostic, type ResolvedProjectConfig, resolveProjectConfigFromObject, validateProjectConfig, } from "@openagentpack/sdk"; +import { + acquireDirectoryProjectMutation, + type DirectoryResourceType, + FILE_AUTO_ASSOCIATION_IGNORE_FILE, + inspectDirectoryProject, + locateDirectoryProjectResource, +} from "@openagentpack/sdk/project-workspace"; import { parse, stringify } from "yaml"; import { type ProjectRuntimeManager, projectRuntimeManager } from "@/services/project-manager"; import { projectMutationCoordinator } from "@/services/project-mutations"; diff --git a/apps/server/src/services/project-manager.ts b/apps/server/src/services/project-manager.ts index 4ac63b2..0fbe40b 100644 --- a/apps/server/src/services/project-manager.ts +++ b/apps/server/src/services/project-manager.ts @@ -1,14 +1,6 @@ import { createHash } from "node:crypto"; import { existsSync } from "node:fs"; import { basename, resolve } from "node:path"; -import { - getProjectBuildStatus, - inspectDirectoryProject, - PROJECT_BUILD_FILE, - PROJECT_METADATA_FILE, - PROJECT_STATE_FILE, - resolveDirectoryProjectRuntime, -} from "@openagentpack/project-workspace"; import { type AgentWithReadiness, type BackendRuntimeInput, @@ -18,6 +10,14 @@ import { type ResolvedProjectConfig, readProjectRuntime, } from "@openagentpack/sdk"; +import { + getProjectBuildStatus, + inspectDirectoryProject, + PROJECT_BUILD_FILE, + PROJECT_METADATA_FILE, + PROJECT_STATE_FILE, + resolveDirectoryProjectRuntime, +} from "@openagentpack/sdk/project-workspace"; import { type FSWatcher, watch } from "chokidar"; import { type ProjectMutationSnapshot, projectMutationCoordinator } from "@/services/project-mutations"; diff --git a/apps/server/src/services/project-versions.ts b/apps/server/src/services/project-versions.ts index 32b99a0..08b08e6 100644 --- a/apps/server/src/services/project-versions.ts +++ b/apps/server/src/services/project-versions.ts @@ -4,8 +4,8 @@ import type { DirectoryProjectVersionStatus, DirectoryVersionFileChange, PreparedDirectoryProjectVersion, -} from "@openagentpack/project-versions"; -import { createDirectoryWorkspaceVersionService, inspectDirectoryProject } from "@openagentpack/project-workspace"; +} from "@openagentpack/sdk/project-versions"; +import { createDirectoryWorkspaceVersionService, inspectDirectoryProject } from "@openagentpack/sdk/project-workspace"; import { type ProjectRuntimeManager, projectRuntimeManager } from "@/services/project-manager"; import { projectMutationCoordinator } from "@/services/project-mutations"; diff --git a/apps/server/tests/project-declarations.test.ts b/apps/server/tests/project-declarations.test.ts index 92be696..1dfdf08 100644 --- a/apps/server/tests/project-declarations.test.ts +++ b/apps/server/tests/project-declarations.test.ts @@ -6,7 +6,7 @@ import { acquireDirectoryProjectMutation, FILE_AUTO_ASSOCIATION_IGNORE_FILE, previewProjectBuild, -} from "@openagentpack/project-workspace"; +} from "@openagentpack/sdk/project-workspace"; import { commitDeclarationChange, listProjectDeclarations, diff --git a/apps/server/tests/project-manager.test.ts b/apps/server/tests/project-manager.test.ts index b13f154..02edd5a 100644 --- a/apps/server/tests/project-manager.test.ts +++ b/apps/server/tests/project-manager.test.ts @@ -6,7 +6,7 @@ import { commitProjectBuild, getProjectBuildStatus, initializeDirectoryProject, -} from "@openagentpack/project-workspace"; +} from "@openagentpack/sdk/project-workspace"; import { listProjectDeclarations } from "../src/services/project-declarations"; import { ProjectRuntimeManager } from "../src/services/project-manager"; diff --git a/apps/server/tests/project-versions.test.ts b/apps/server/tests/project-versions.test.ts index da36e37..4f8ccd2 100644 --- a/apps/server/tests/project-versions.test.ts +++ b/apps/server/tests/project-versions.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, test } from "bun:test"; import { chmod, mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import { initializeDirectoryProject } from "@openagentpack/project-workspace"; +import { initializeDirectoryProject } from "@openagentpack/sdk/project-workspace"; import { ProjectRuntimeManager } from "../src/services/project-manager"; import { commitProjectVersionAfterApply, diff --git a/bun.lock b/bun.lock index c04810c..8e94b15 100644 --- a/bun.lock +++ b/bun.lock @@ -20,8 +20,6 @@ "version": "0.0.11", "dependencies": { "@hono/zod-openapi": "^1.4.0", - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "chokidar": "^4.0.3", "hono": "^4.12.28", @@ -69,14 +67,12 @@ }, "packages/cli": { "name": "@openagentpack/cli", - "version": "0.6.0", + "version": "0.7.0", "bin": { "agents": "dist/bin/agents.js", }, "dependencies": { "@clack/prompts": "^1.5.1", - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "chalk": "^5.6.2", "commander": "^14.0.3", @@ -98,15 +94,13 @@ }, "packages/playground": { "name": "@openagentpack/playground", - "version": "0.6.0", + "version": "0.7.0", "bin": { "agents-playground": "dist/bin/playground.js", }, "dependencies": { "@hono/node-server": "^2.0.5", "@hono/zod-openapi": "^1.4.0", - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "chokidar": "^4.0.3", "hono": "^4.12.28", @@ -121,35 +115,9 @@ "typescript": "^6.0.3", }, }, - "packages/project-versions": { - "name": "@openagentpack/project-versions", - "version": "0.6.0", - "dependencies": { - "@openagentpack/sdk": "workspace:*", - }, - "devDependencies": { - "@types/bun": "^1.3.14", - "@types/node": "^25.9.3", - "typescript": "^6.0.3", - }, - }, - "packages/project-workspace": { - "name": "@openagentpack/project-workspace", - "version": "0.6.0", - "dependencies": { - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/sdk": "workspace:*", - "yaml": "^2.9.0", - }, - "devDependencies": { - "@types/bun": "^1.3.14", - "@types/node": "^25.9.3", - "typescript": "^6.0.3", - }, - }, "packages/sdk": { "name": "@openagentpack/sdk", - "version": "0.6.0", + "version": "0.7.0", "dependencies": { "jszip": "^3.10.1", "yaml": "^2.9.0", @@ -354,10 +322,6 @@ "@openagentpack/playground": ["@openagentpack/playground@workspace:packages/playground"], - "@openagentpack/project-versions": ["@openagentpack/project-versions@workspace:packages/project-versions"], - - "@openagentpack/project-workspace": ["@openagentpack/project-workspace@workspace:packages/project-workspace"], - "@openagentpack/sdk": ["@openagentpack/sdk@workspace:packages/sdk"], "@openagentpack/server": ["@openagentpack/server@workspace:apps/server"], diff --git a/docs/contributing/release.md b/docs/contributing/release.md index 70d99b6..4b3f27f 100644 --- a/docs/contributing/release.md +++ b/docs/contributing/release.md @@ -1,6 +1,6 @@ # npm releases -OpenAgentPack publishes `@openagentpack/sdk`, `@openagentpack/project-versions`, `@openagentpack/playground`, and `@openagentpack/cli` as one fixed version group. Real publishing happens only in GitHub Actions; local commands can build and dry-run the tarballs but cannot publish them. +OpenAgentPack publishes `@openagentpack/sdk`, `@openagentpack/playground`, and `@openagentpack/cli` as one fixed version group. Local versions and directory projects ship inside the SDK as `@openagentpack/sdk/project-versions` and `@openagentpack/sdk/project-workspace` subpath exports; they are not separate npm packages. Real publishing happens only in GitHub Actions; local commands can build and dry-run the tarballs but cannot publish them. ## One-time repository setup diff --git a/docs/contributing/release.zh-CN.md b/docs/contributing/release.zh-CN.md index f6ebff2..5a2b8c0 100644 --- a/docs/contributing/release.zh-CN.md +++ b/docs/contributing/release.zh-CN.md @@ -1,6 +1,6 @@ # npm 发布流程 -OpenAgentPack 将 `@openagentpack/sdk`、`@openagentpack/project-versions`、`@openagentpack/playground` 和 `@openagentpack/cli` 作为同一版本组发布。真实发布只能在 GitHub Actions 中执行;本地只能构建和 dry-run,不能把包发布到 npm。 +OpenAgentPack 将 `@openagentpack/sdk`、`@openagentpack/playground` 和 `@openagentpack/cli` 作为同一版本组发布。本地版本和目录项目随 SDK 一起发布,通过 `@openagentpack/sdk/project-versions`、`@openagentpack/sdk/project-workspace` 子路径导出,不再是独立 npm 包。真实发布只能在 GitHub Actions 中执行;本地只能构建和 dry-run,不能把包发布到 npm。 ## 一次性配置 diff --git a/docs/reference/sdk.md b/docs/reference/sdk.md index 10ff650..51e0729 100644 --- a/docs/reference/sdk.md +++ b/docs/reference/sdk.md @@ -1,6 +1,6 @@ # SDK reference -`@openagentpack/sdk` is the Node-compatible TypeScript project/runtime SDK that powers the `agents` CLI. Node-only local project versioning is published separately as `@openagentpack/project-versions`, which depends on the SDK for project validation and redaction. This page summarizes the public surface re-exported from `packages/sdk/src/index.ts`; the contract is detailed in [`packages/sdk/docs/public-api-layers.md`](../../packages/sdk/docs/public-api-layers.md). +`@openagentpack/sdk` is the Node-compatible TypeScript project/runtime SDK that powers the `agents` CLI. The same package exports Node-only local snapshots from `@openagentpack/sdk/project-versions` and directory Build/Publish services from `@openagentpack/sdk/project-workspace`. These subpaths share the SDK's validation, transport, and error types without adding project services to the default entry. See [directory projects](../../packages/sdk/docs/project-workspace.md), [local versions](../../packages/sdk/docs/project-versions.md), and the [public API contract](../../packages/sdk/docs/public-api-layers.md). ## Install diff --git a/package.json b/package.json index 361adf6..8db570a 100644 --- a/package.json +++ b/package.json @@ -34,24 +34,18 @@ "dev": "bun run dev:server & bun run dev:webui & wait", "dev:webui": "bun run --cwd apps/webui dev", "dev:server": "bun run --cwd apps/server dev", - "typecheck": "bun run build:sdk && bun run build:project-versions && bun run build:project-workspace && bun run typecheck:scripts && bun run typecheck:sdk && bun run typecheck:project-versions && bun run typecheck:project-workspace && bun run typecheck:cli && bun run typecheck:playbooks && bun run typecheck:playground && bun run typecheck:webui && bun run typecheck:server", + "typecheck": "bun run build:sdk && bun run typecheck:scripts && bun run typecheck:sdk && bun run typecheck:cli && bun run typecheck:playbooks && bun run typecheck:playground && bun run typecheck:webui && bun run typecheck:server", "build:sdk": "bun run --cwd packages/sdk build", - "build:project-versions": "bun run --cwd packages/project-versions build", - "build:project-workspace": "bun run --cwd packages/project-workspace build", "typecheck:scripts": "tsc -p scripts/tsconfig.json --noEmit", "typecheck:sdk": "bun run --cwd packages/sdk typecheck", - "typecheck:project-versions": "bun run --cwd packages/project-versions typecheck", - "typecheck:project-workspace": "bun run --cwd packages/project-workspace typecheck", "typecheck:cli": "bun run --cwd packages/cli typecheck", "typecheck:playbooks": "bun run --cwd packages/playbooks typecheck", "typecheck:playground": "bun run --cwd packages/playground typecheck", "typecheck:webui": "bun run --cwd apps/webui typecheck", "typecheck:server": "bun run --cwd apps/server typecheck", - "test": "bun run build:sdk && bun run build:project-versions && bun run build:project-workspace && bun run test:verification && bun run test:sdk && bun run test:project-versions && bun run test:project-workspace && bun run test:cli && bun run test:playbooks && bun run test:webui && bun run test:server", + "test": "bun run build:sdk && bun run test:verification && bun run test:sdk && bun run test:cli && bun run test:playbooks && bun run test:webui && bun run test:server", "test:verification": "bun test scripts/*.test.ts scripts/release/*.test.ts", "test:sdk": "bun run --cwd packages/sdk test", - "test:project-versions": "bun run --cwd packages/project-versions test", - "test:project-workspace": "bun run --cwd packages/project-workspace test", "test:cli": "bun run --cwd packages/cli test", "test:playbooks": "bun run --cwd packages/playbooks test", "test:webui": "bun run --cwd apps/webui test", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0c8da85..0366020 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @openagentpack/cli +## 0.7.0 + +### Minor Changes + +- Use SDK subpath exports for project and version commands instead of the standalone project packages. +- Updated dependencies: `@openagentpack/sdk@0.7.0`. + ## 0.6.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 7126b62..073264c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openagentpack/cli", - "version": "0.6.0", + "version": "0.7.0", "description": "Open Agent Pack — Declaratively manage AI agent infrastructure", "license": "Apache-2.0", "keywords": [ @@ -54,8 +54,6 @@ "typescript": "^6.0.3" }, "dependencies": { - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "@clack/prompts": "^1.5.1", "chalk": "^5.6.2", diff --git a/packages/cli/src/commands/apply.ts b/packages/cli/src/commands/apply.ts index a5cfc2c..adf825f 100644 --- a/packages/cli/src/commands/apply.ts +++ b/packages/cli/src/commands/apply.ts @@ -1,6 +1,6 @@ import * as p from "@clack/prompts"; -import { assertLegacyYamlNotShadowed } from "@openagentpack/project-workspace"; import { decideDestructive, executePlannedProject, type PlannedAction, UserError } from "@openagentpack/sdk"; +import { assertLegacyYamlNotShadowed } from "@openagentpack/sdk/project-workspace"; import chalk from "chalk"; import { assertProviderConfigured, buildCliRuntime } from "../config-loader.ts"; import { log } from "../logger.ts"; diff --git a/packages/cli/src/commands/destroy.ts b/packages/cli/src/commands/destroy.ts index a769cbd..04ff44f 100644 --- a/packages/cli/src/commands/destroy.ts +++ b/packages/cli/src/commands/destroy.ts @@ -1,11 +1,11 @@ import * as p from "@clack/prompts"; -import { assertLegacyYamlNotShadowed } from "@openagentpack/project-workspace"; import { type DestroyDefaultMemoryStoreResult, type DestroyResourceResult, destroyPlannedProjectResources, planDestroyProjectContext, } from "@openagentpack/sdk"; +import { assertLegacyYamlNotShadowed } from "@openagentpack/sdk/project-workspace"; import chalk from "chalk"; import { buildCliRuntime } from "../config-loader.ts"; import { log } from "../logger.ts"; diff --git a/packages/cli/src/commands/plan.ts b/packages/cli/src/commands/plan.ts index 0e54373..4b70a10 100644 --- a/packages/cli/src/commands/plan.ts +++ b/packages/cli/src/commands/plan.ts @@ -1,5 +1,5 @@ -import { assertLegacyYamlNotShadowed } from "@openagentpack/project-workspace"; import { UserError } from "@openagentpack/sdk"; +import { assertLegacyYamlNotShadowed } from "@openagentpack/sdk/project-workspace"; import chalk from "chalk"; import { assertProviderConfigured, buildCliRuntime } from "../config-loader.ts"; import { log } from "../logger.ts"; diff --git a/packages/cli/src/commands/project.ts b/packages/cli/src/commands/project.ts index 0bf69cd..e9d2e29 100644 --- a/packages/cli/src/commands/project.ts +++ b/packages/cli/src/commands/project.ts @@ -1,4 +1,5 @@ import * as prompts from "@clack/prompts"; +import { UserError } from "@openagentpack/sdk"; import { commitProjectBuild, createDirectoryWorkspaceVersionService, @@ -7,8 +8,7 @@ import { planProjectPublish, previewProjectBuild, validateDirectoryProject, -} from "@openagentpack/project-workspace"; -import { UserError } from "@openagentpack/sdk"; +} from "@openagentpack/sdk/project-workspace"; import chalk from "chalk"; import { ensureCredentials } from "../credentials.ts"; import { log } from "../logger.ts"; diff --git a/packages/cli/src/versioning/project-versions.ts b/packages/cli/src/versioning/project-versions.ts index 6dbd3f4..056951d 100644 --- a/packages/cli/src/versioning/project-versions.ts +++ b/packages/cli/src/versioning/project-versions.ts @@ -6,7 +6,7 @@ export type { ProjectVersionService, ProjectVersionStatus, ProjectVersionsPage, -} from "@openagentpack/project-versions"; +} from "@openagentpack/sdk/project-versions"; export { commitPreparedProjectVersion, createProjectVersionService, @@ -19,4 +19,4 @@ export { readProjectVersionSource, releasePreparedProjectVersion, restoreProjectVersion, -} from "@openagentpack/project-versions"; +} from "@openagentpack/sdk/project-versions"; diff --git a/packages/cli/tests/unit/version.test.ts b/packages/cli/tests/unit/version.test.ts index bbb3e71..f62c0f7 100644 --- a/packages/cli/tests/unit/version.test.ts +++ b/packages/cli/tests/unit/version.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, test } from "bun:test"; import { chmod, mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; -import { createDirectoryWorkspaceVersionService } from "@openagentpack/project-workspace"; +import { createDirectoryWorkspaceVersionService } from "@openagentpack/sdk/project-workspace"; const REPO_ROOT = resolve(import.meta.dir, "../../../.."); const directories: string[] = []; diff --git a/packages/playground/CHANGELOG.md b/packages/playground/CHANGELOG.md index 85e8bfe..16ca191 100644 --- a/packages/playground/CHANGELOG.md +++ b/packages/playground/CHANGELOG.md @@ -1,5 +1,12 @@ # @openagentpack/playground +## 0.7.0 + +### Minor Changes + +- Use the SDK's project and version services for Workbench, keeping one shared SDK runtime in the published server bundle. +- Updated dependencies: `@openagentpack/sdk@0.7.0`. + ## 0.6.0 ### Minor Changes diff --git a/packages/playground/package.json b/packages/playground/package.json index 593467e..9ec7b62 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -1,6 +1,6 @@ { "name": "@openagentpack/playground", - "version": "0.6.0", + "version": "0.7.0", "description": "OpenAgentPack Playground — one-command local web UI for OpenAgentPack", "license": "Apache-2.0", "keywords": [ @@ -42,8 +42,6 @@ "dependencies": { "@hono/node-server": "^2.0.5", "@hono/zod-openapi": "^1.4.0", - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/project-workspace": "workspace:*", "@openagentpack/sdk": "workspace:*", "chokidar": "^4.0.3", "hono": "^4.12.28", diff --git a/packages/playground/tsup.config.ts b/packages/playground/tsup.config.ts index e297aa4..367b2ed 100644 --- a/packages/playground/tsup.config.ts +++ b/packages/playground/tsup.config.ts @@ -18,8 +18,8 @@ export default defineConfig({ // require("process") without Node's CommonJS loader. external: [ "@openagentpack/sdk", - "@openagentpack/project-versions", - "@openagentpack/project-workspace", + "@openagentpack/sdk/project-versions", + "@openagentpack/sdk/project-workspace", "hono", "@hono/node-server", "@hono/zod-openapi", diff --git a/packages/project-versions/CHANGELOG.md b/packages/project-versions/CHANGELOG.md deleted file mode 100644 index be1a5cf..0000000 --- a/packages/project-versions/CHANGELOG.md +++ /dev/null @@ -1,17 +0,0 @@ -# @openagentpack/project-versions - -## 0.6.0 - -### Minor Changes - -- f956bad: Publish a directory workspace service for deterministic Build/Publish and a - Git-independent full source-tree snapshot engine. CLI and Workbench share one - versioning switch, content-addressed text/binary blobs, forward restore, and a - cross-process mutation lock while remote State remains excluded. Project Build - previews now show full directory source changes against the current version HEAD. - -### Patch Changes - -- Updated dependencies [8c6a767] -- Updated dependencies [f956bad] - - @openagentpack/sdk@0.6.0 diff --git a/packages/project-versions/package.json b/packages/project-versions/package.json deleted file mode 100644 index de2f4d9..0000000 --- a/packages/project-versions/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "@openagentpack/project-versions", - "version": "0.6.0", - "description": "Git-independent content-addressed project versioning for OpenAgentPack", - "license": "Apache-2.0", - "keywords": [ - "openagentpack", - "snapshots", - "versioning", - "agents.yaml" - ], - "homepage": "https://github.com/modelstudioai/OpenAgentPack/tree/main/packages/project-versions#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/modelstudioai/OpenAgentPack.git", - "directory": "packages/project-versions" - }, - "bugs": { - "url": "https://github.com/modelstudioai/OpenAgentPack/issues" - }, - "engines": { - "node": ">=18.17.0" - }, - "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "bun": "./dist/index.js", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, - "files": [ - "dist", - "LICENSE" - ], - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "scripts": { - "build": "tsup", - "test": "bun test", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@openagentpack/sdk": "workspace:*" - }, - "devDependencies": { - "@types/bun": "^1.3.14", - "@types/node": "^25.9.3", - "typescript": "^6.0.3" - } -} diff --git a/packages/project-versions/tsconfig.json b/packages/project-versions/tsconfig.json deleted file mode 100644 index 6e0b035..0000000 --- a/packages/project-versions/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "types": ["node", "bun"], - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - "noImplicitOverride": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false - }, - "include": ["src/**/*.ts", "tests/**/*.ts"] -} diff --git a/packages/project-versions/tsup.config.ts b/packages/project-versions/tsup.config.ts deleted file mode 100644 index 9352bf8..0000000 --- a/packages/project-versions/tsup.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: { index: "src/index.ts" }, - format: ["esm"], - dts: { - compilerOptions: { - ignoreDeprecations: "6.0", - types: ["node", "bun"], - }, - }, - clean: true, - target: "es2022", - external: ["@openagentpack/sdk"], -}); diff --git a/packages/project-workspace/CHANGELOG.md b/packages/project-workspace/CHANGELOG.md deleted file mode 100644 index 257443d..0000000 --- a/packages/project-workspace/CHANGELOG.md +++ /dev/null @@ -1,18 +0,0 @@ -# @openagentpack/project-workspace - -## 0.6.0 - -### Minor Changes - -- f956bad: Publish a directory workspace service for deterministic Build/Publish and a - Git-independent full source-tree snapshot engine. CLI and Workbench share one - versioning switch, content-addressed text/binary blobs, forward restore, and a - cross-process mutation lock while remote State remains excluded. Project Build - previews now show full directory source changes against the current version HEAD. - -### Patch Changes - -- Updated dependencies [8c6a767] -- Updated dependencies [f956bad] - - @openagentpack/sdk@0.6.0 - - @openagentpack/project-versions@0.6.0 diff --git a/packages/project-workspace/package.json b/packages/project-workspace/package.json deleted file mode 100644 index 6aae512..0000000 --- a/packages/project-workspace/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@openagentpack/project-workspace", - "version": "0.6.0", - "description": "Directory workspace, build, publish, and version services for OpenAgentPack projects", - "license": "Apache-2.0", - "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "bun": "./dist/index.js", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, - "files": [ - "dist", - "README.md", - "LICENSE" - ], - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "scripts": { - "build": "tsup", - "test": "bun test", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@openagentpack/project-versions": "workspace:*", - "@openagentpack/sdk": "workspace:*", - "yaml": "^2.9.0" - }, - "devDependencies": { - "@types/bun": "^1.3.14", - "@types/node": "^25.9.3", - "typescript": "^6.0.3" - } -} diff --git a/packages/project-workspace/tsconfig.json b/packages/project-workspace/tsconfig.json deleted file mode 100644 index 24b497e..0000000 --- a/packages/project-workspace/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "types": ["node", "bun"], - "noUncheckedIndexedAccess": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false - }, - "include": ["src/**/*.ts", "tests/**/*.ts"] -} diff --git a/packages/project-workspace/tsup.config.ts b/packages/project-workspace/tsup.config.ts deleted file mode 100644 index 212ad9d..0000000 --- a/packages/project-workspace/tsup.config.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from "tsup"; - -export default defineConfig({ - entry: { index: "src/index.ts" }, - format: ["esm"], - dts: { - compilerOptions: { - ignoreDeprecations: "6.0", - types: ["node", "bun"], - }, - }, - clean: true, - target: "es2022", - external: ["@openagentpack/sdk", "@openagentpack/project-versions"], -}); diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index ca50c90..64ca24d 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -1,5 +1,11 @@ # @openagentpack/sdk +## 0.7.0 + +### Minor Changes + +- Include local versions and directory project services in the SDK through the Node-only `./project-versions` and `./project-workspace` exports. Preserve existing snapshots, resource layouts, and shared runtime behavior while removing the two standalone package publication requirements. + ## 0.6.0 ### Minor Changes diff --git a/packages/sdk/README.md b/packages/sdk/README.md index e3f3dc8..b881332 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -18,6 +18,23 @@ const plan = await planProjectContext(config); console.log(plan); ``` +## Local projects and versions + +The same SDK package includes Node.js subpaths for directory projects and local +snapshots; no additional OpenAgentPack packages are required: + +```ts +import { initializeDirectoryProject } from "@openagentpack/sdk/project-workspace"; +import { createDirectoryProjectVersionService } from "@openagentpack/sdk/project-versions"; +``` + +Use [project-workspace](https://github.com/modelstudioai/OpenAgentPack/blob/main/packages/sdk/docs/project-workspace.md) +for Init, Build, Publish, and validated directory restore. The lower-level +[project-versions](https://github.com/modelstudioai/OpenAgentPack/blob/main/packages/sdk/docs/project-versions.md) +subpath exposes snapshot storage primitives. Existing local snapshots remain +compatible without migration. These services are not re-exported from the SDK's +default entry point. + See the [configuration guide](https://github.com/modelstudioai/OpenAgentPack/blob/main/docs/configuration.md), [provider reference](https://github.com/modelstudioai/OpenAgentPack/blob/main/docs/providers.md), and [SDK documentation](https://github.com/modelstudioai/OpenAgentPack/tree/main/packages/sdk/docs). ## License diff --git a/packages/project-versions/README.md b/packages/sdk/docs/project-versions.md similarity index 64% rename from packages/project-versions/README.md rename to packages/sdk/docs/project-versions.md index 85812e2..3cbe688 100644 --- a/packages/project-versions/README.md +++ b/packages/sdk/docs/project-versions.md @@ -1,15 +1,18 @@ -# `@openagentpack/project-versions` +# `@openagentpack/sdk/project-versions` -Git-independent, Node-only local version primitives for OpenAgentPack. +Git-independent, Node-only local version primitives included in `@openagentpack/sdk`. +Existing `.openagentpack/versions` data, snapshot IDs, locks, and source formats +remain compatible with the earlier standalone implementation. No data migration +or reinitialization is required. `createDirectoryProjectVersionService` stores full directory manifests, file modes, text, and binary content in immutable entries and content-addressed blobs. A host -adapter supplies validation and atomic restore; `@openagentpack/project-workspace` +adapter supplies validation and atomic restore; `@openagentpack/sdk/project-workspace` provides the standard directory-project adapter and excludes generated Build, locks, versions, and remote State from source snapshots. ```ts -import { createDirectoryWorkspaceVersionService } from "@openagentpack/project-workspace"; +import { createDirectoryWorkspaceVersionService } from "@openagentpack/sdk/project-workspace"; const versions = createDirectoryWorkspaceVersionService("./my-agent"); await versions.enable(); diff --git a/packages/project-workspace/README.md b/packages/sdk/docs/project-workspace.md similarity index 95% rename from packages/project-workspace/README.md rename to packages/sdk/docs/project-workspace.md index 07ebe7f..1b2952e 100644 --- a/packages/project-workspace/README.md +++ b/packages/sdk/docs/project-workspace.md @@ -1,8 +1,8 @@ -# @openagentpack/project-workspace +# @openagentpack/sdk/project-workspace -Node.js services for OpenAgentPack directory projects. The package scans and +Node.js services included in the `@openagentpack/sdk` npm package. This subpath scans and validates project source files, builds the generated `agents.yaml`, coordinates -Publish, and adapts directory snapshots to `@openagentpack/project-versions`. +Publish, and adapts directory snapshots to `@openagentpack/sdk/project-versions`. Build output, remote state, and local version blobs live below `.openagentpack/` and are not project source. diff --git a/packages/sdk/docs/public-api-layers.md b/packages/sdk/docs/public-api-layers.md index 3bc6105..50e9f70 100644 --- a/packages/sdk/docs/public-api-layers.md +++ b/packages/sdk/docs/public-api-layers.md @@ -3,6 +3,13 @@ `@openagentpack/sdk` is the reusable OpenAgentPack runtime. Its primary package entry is `.`, and it also exposes three deliberately narrow, browser-safe contracts: `./session-events`, `./scan-lifecycle`, and `./file-lifecycle`. +The same npm package also provides Node-only domain-service subpaths: +`./project-versions` for local snapshots and `./project-workspace` for directory +projects, Build/Publish, and version restoration. These share core SDK services +but are not re-exported by the default entry. Their implementations remain under +`src/internal/project-versions/` and `src/internal/project-workspace/`; hosts may +only import the documented public subpaths. Core SDK modules must not depend on +these project services, and version storage must not depend on the workspace adapter. Everything re-exported from those entries is public SDK surface; the engine itself lives under `src/internal/` and is intentionally unreachable from outside the package. Parser, state, provider, planner, and executor internals diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 0244bf8..22cae37 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openagentpack/sdk", - "version": "0.6.0", + "version": "0.7.0", "description": "OpenAgentPack SDK (Node-compatible runtime)", "license": "Apache-2.0", "keywords": [ @@ -33,6 +33,18 @@ "import": "./dist/index.js", "default": "./dist/index.js" }, + "./project-versions": { + "bun": "./dist/project-versions.js", + "types": "./dist/project-versions.d.ts", + "import": "./dist/project-versions.js", + "default": "./dist/project-versions.js" + }, + "./project-workspace": { + "bun": "./dist/project-workspace.js", + "types": "./dist/project-workspace.d.ts", + "import": "./dist/project-workspace.js", + "default": "./dist/project-workspace.js" + }, "./session-events": { "bun": "./dist/session-events.js", "types": "./dist/session-events.d.ts", diff --git a/packages/project-versions/src/directory.ts b/packages/sdk/src/internal/project-versions/directory.ts similarity index 99% rename from packages/project-versions/src/directory.ts rename to packages/sdk/src/internal/project-versions/directory.ts index e8b1668..03d836b 100644 --- a/packages/project-versions/src/directory.ts +++ b/packages/sdk/src/internal/project-versions/directory.ts @@ -1,8 +1,9 @@ import { createHash, randomUUID } from "node:crypto"; import { mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises"; import { dirname, resolve } from "node:path"; -import type { Diagnostic } from "@openagentpack/sdk"; -import { inspectProjectSource, UserError } from "@openagentpack/sdk"; +import { inspectProjectSource } from "../core/project-source-security.ts"; +import { UserError } from "../errors.ts"; +import type { Diagnostic } from "../types/dto.ts"; const DIRECTORY_STORE_SCHEMA = 1; const VERSION_ID = /^[a-f0-9]{64}$/; diff --git a/packages/project-versions/src/index.ts b/packages/sdk/src/internal/project-versions/index.ts similarity index 99% rename from packages/project-versions/src/index.ts rename to packages/sdk/src/internal/project-versions/index.ts index c2a7c23..3fe59c6 100644 --- a/packages/project-versions/src/index.ts +++ b/packages/sdk/src/internal/project-versions/index.ts @@ -2,7 +2,9 @@ import { createHash, randomUUID } from "node:crypto"; import { constants } from "node:fs"; import { access, chmod, mkdir, open, readFile, realpath, rename, rmdir, stat, unlink } from "node:fs/promises"; import { basename, dirname, relative, resolve } from "node:path"; -import { type Diagnostic, inspectProjectSource, UserError as SdkUserError } from "@openagentpack/sdk"; +import { inspectProjectSource } from "../core/project-source-security.ts"; +import { UserError as SdkUserError } from "../errors.ts"; +import type { Diagnostic } from "../types/dto.ts"; export * from "./directory.ts"; diff --git a/packages/project-workspace/src/index.ts b/packages/sdk/src/internal/project-workspace/index.ts similarity index 99% rename from packages/project-workspace/src/index.ts rename to packages/sdk/src/internal/project-workspace/index.ts index 7bde32e..724d334 100644 --- a/packages/project-workspace/src/index.ts +++ b/packages/sdk/src/internal/project-workspace/index.ts @@ -14,30 +14,27 @@ import { writeFile, } from "node:fs/promises"; import { basename, dirname, extname, isAbsolute, relative, resolve, sep } from "node:path"; +import { parse, stringify } from "yaml"; +import { writeProjectRuntime } from "../core/project-runtime.ts"; +import { inspectProjectSource } from "../core/project-source-security.ts"; import { - createDirectoryProjectVersionService, - type DirectoryProjectSnapshot, - type DirectoryProjectVersionService, -} from "@openagentpack/project-versions"; -import { - LocalFileStateBackend, - type Diagnostic, - type LoadedProjectConfig, - type PlannedAction, - type ResourcePlanResult, - type ResourceSyncRun, - type RuntimeFeedbackSink, executePlannedProject, - inspectProjectSource, planProjectContext, planProjectWithStateBackend, - resolveProjectConfigFromObject, - resolveProjectConfig, - UserError, - validateProjectConfig, - writeProjectRuntime, -} from "@openagentpack/sdk"; -import { parse, stringify } from "yaml"; + type ResourcePlanResult, + type ResourceSyncRun, +} from "../core/resource-runtime.ts"; +import { validateProjectConfig } from "../core/validate-config.ts"; +import { UserError } from "../errors.ts"; +import { type LoadedProjectConfig, resolveProjectConfig, resolveProjectConfigFromObject } from "../parser/index.ts"; +import { + createDirectoryProjectVersionService, + type DirectoryProjectSnapshot, + type DirectoryProjectVersionService, +} from "../project-versions/index.ts"; +import { LocalFileStateBackend } from "../state/local-file-state-backend.ts"; +import type { Diagnostic, PlannedAction } from "../types/dto.ts"; +import type { RuntimeFeedbackSink } from "../types/runtime-feedback.ts"; import { directoryProjectScaffold, RESOURCE_EXAMPLES_DIRECTORY } from "./scaffold.ts"; import { applyVaultSecretMigration, diff --git a/packages/project-workspace/src/scaffold.ts b/packages/sdk/src/internal/project-workspace/scaffold.ts similarity index 100% rename from packages/project-workspace/src/scaffold.ts rename to packages/sdk/src/internal/project-workspace/scaffold.ts diff --git a/packages/project-workspace/src/vault-secrets.ts b/packages/sdk/src/internal/project-workspace/vault-secrets.ts similarity index 99% rename from packages/project-workspace/src/vault-secrets.ts rename to packages/sdk/src/internal/project-workspace/vault-secrets.ts index b5fe377..d5f7a57 100644 --- a/packages/project-workspace/src/vault-secrets.ts +++ b/packages/sdk/src/internal/project-workspace/vault-secrets.ts @@ -2,7 +2,7 @@ import { createHash, randomUUID } from "node:crypto"; import { chmod, lstat, readFile, rename, rm, writeFile } from "node:fs/promises"; import { resolve } from "node:path"; import * as nodeUtil from "node:util"; -import { UserError } from "@openagentpack/sdk"; +import { UserError } from "../errors.ts"; import type { ProjectSourceFile } from "./index.ts"; import { RESOURCE_EXAMPLES_DIRECTORY } from "./scaffold.ts"; diff --git a/packages/sdk/src/project-versions.ts b/packages/sdk/src/project-versions.ts new file mode 100644 index 0000000..eff72ba --- /dev/null +++ b/packages/sdk/src/project-versions.ts @@ -0,0 +1,2 @@ +// Node-only local snapshot services. Keep these out of the default SDK entry. +export * from "./internal/project-versions/index.ts"; diff --git a/packages/sdk/src/project-workspace.ts b/packages/sdk/src/project-workspace.ts new file mode 100644 index 0000000..2e9fe2b --- /dev/null +++ b/packages/sdk/src/project-workspace.ts @@ -0,0 +1,2 @@ +// Node-only directory project workflows shared by CLI and Workbench hosts. +export * from "./internal/project-workspace/index.ts"; diff --git a/packages/project-workspace/tests/scaffold.test.ts b/packages/sdk/tests/unit/project-scaffold.test.ts similarity index 96% rename from packages/project-workspace/tests/scaffold.test.ts rename to packages/sdk/tests/unit/project-scaffold.test.ts index a98be5b..ad6488d 100644 --- a/packages/project-workspace/tests/scaffold.test.ts +++ b/packages/sdk/tests/unit/project-scaffold.test.ts @@ -2,8 +2,9 @@ import { afterEach, describe, expect, test } from "bun:test"; import { cp, mkdir, mkdtemp, readFile, rm, stat, symlink, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { dirname, resolve } from "node:path"; -import { resolveProjectConfigFromObject } from "@openagentpack/sdk"; import { parse } from "yaml"; +import { resolveProjectConfigFromObject } from "../../src/index.ts"; +import { directoryProjectScaffold } from "../../src/internal/project-workspace/scaffold.ts"; import { commitProjectBuild, initializeDirectoryProject, @@ -11,8 +12,7 @@ import { locateDirectoryProjectResource, planProjectPublish, previewProjectBuild, -} from "../src/index.ts"; -import { directoryProjectScaffold } from "../src/scaffold.ts"; +} from "../../src/project-workspace.ts"; const roots: string[] = []; afterEach(async () => { diff --git a/packages/project-workspace/tests/vault-secrets.test.ts b/packages/sdk/tests/unit/project-vault-secrets.test.ts similarity index 97% rename from packages/project-workspace/tests/vault-secrets.test.ts rename to packages/sdk/tests/unit/project-vault-secrets.test.ts index 95bf0f6..e3b0c95 100644 --- a/packages/project-workspace/tests/vault-secrets.test.ts +++ b/packages/sdk/tests/unit/project-vault-secrets.test.ts @@ -2,7 +2,12 @@ import { afterEach, describe, expect, test } from "bun:test"; import { chmod, mkdir, mkdtemp, readFile, rm, stat, symlink, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { resolve } from "node:path"; -import { resolveProjectConfig } from "@openagentpack/sdk"; +import { resolveProjectConfig } from "../../src/index.ts"; +import { + applyVaultSecretMigration, + planVaultSecretMigration, + readProjectEnvironment, +} from "../../src/internal/project-workspace/vault-secrets.ts"; import { commitProjectBuild, createDirectoryWorkspaceVersionService, @@ -12,8 +17,7 @@ import { planProjectPublish, previewProjectBuild, resolveDirectoryProjectRuntime, -} from "../src/index.ts"; -import { applyVaultSecretMigration, planVaultSecretMigration, readProjectEnvironment } from "../src/vault-secrets.ts"; +} from "../../src/project-workspace.ts"; const directories: string[] = []; afterEach(async () => { diff --git a/packages/project-versions/tests/project-versions.test.ts b/packages/sdk/tests/unit/project-versions.test.ts similarity index 99% rename from packages/project-versions/tests/project-versions.test.ts rename to packages/sdk/tests/unit/project-versions.test.ts index b97736e..d266763 100644 --- a/packages/project-versions/tests/project-versions.test.ts +++ b/packages/sdk/tests/unit/project-versions.test.ts @@ -13,7 +13,7 @@ import { previewProjectVersion, releasePreparedProjectVersion, restoreProjectVersion, -} from "../src/index"; +} from "../../src/project-versions.ts"; const directories: string[] = []; const execFileAsync = promisify(execFile); diff --git a/packages/project-workspace/tests/workspace.test.ts b/packages/sdk/tests/unit/project-workspace.test.ts similarity index 99% rename from packages/project-workspace/tests/workspace.test.ts rename to packages/sdk/tests/unit/project-workspace.test.ts index e537e64..e142920 100644 --- a/packages/project-workspace/tests/workspace.test.ts +++ b/packages/sdk/tests/unit/project-workspace.test.ts @@ -2,7 +2,7 @@ import { afterEach, describe, expect, test } from "bun:test"; import { mkdir, mkdtemp, readFile, rm, stat, symlink, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { resolve } from "node:path"; -import { resolveProjectConfigFromObject } from "@openagentpack/sdk"; +import { resolveProjectConfigFromObject } from "../../src/index.ts"; import { acquireDirectoryProjectMutation, commitProjectBuild, @@ -12,7 +12,7 @@ import { initializeDirectoryProject, planProjectPublish, previewProjectBuild, -} from "../src/index.ts"; +} from "../../src/project-workspace.ts"; const temporaryDirectories: string[] = []; diff --git a/packages/sdk/tsup.config.ts b/packages/sdk/tsup.config.ts index a70449f..c7b7dd4 100644 --- a/packages/sdk/tsup.config.ts +++ b/packages/sdk/tsup.config.ts @@ -3,6 +3,8 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: { index: "src/index.ts", + "project-versions": "src/project-versions.ts", + "project-workspace": "src/project-workspace.ts", "session-events": "src/session-events.ts", "scan-lifecycle": "src/scan-lifecycle.ts", "file-lifecycle": "src/file-lifecycle.ts", diff --git a/scripts/open-source.test.ts b/scripts/open-source.test.ts index f1d39dc..69efce5 100644 --- a/scripts/open-source.test.ts +++ b/scripts/open-source.test.ts @@ -40,13 +40,7 @@ function output(command: string[]): string { describe("open-source repository invariants", () => { test("public packages share one version for on-demand Playground resolution", () => { - const packagePaths = [ - "packages/sdk/package.json", - "packages/project-versions/package.json", - "packages/project-workspace/package.json", - "packages/playground/package.json", - "packages/cli/package.json", - ]; + const packagePaths = ["packages/sdk/package.json", "packages/playground/package.json", "packages/cli/package.json"]; const manifests = packagePaths.map( (file) => JSON.parse(readFileSync(resolve(root, file), "utf8")) as { name: string; version: string }, ); diff --git a/scripts/release/build.ts b/scripts/release/build.ts index 8deeeaf..825a404 100644 --- a/scripts/release/build.ts +++ b/scripts/release/build.ts @@ -3,7 +3,7 @@ * 用法: bun run scripts/release/build.ts */ -const PACKAGES = ["sdk", "project-versions", "project-workspace", "playground", "cli"] as const; // 拓扑顺序 +const PACKAGES = ["sdk", "playground", "cli"] as const; // 拓扑顺序 console.log("Building all publishable packages...\n"); diff --git a/scripts/release/channel.ts b/scripts/release/channel.ts index 5e66ab3..72f1d22 100644 --- a/scripts/release/channel.ts +++ b/scripts/release/channel.ts @@ -11,7 +11,7 @@ export interface ReleaseIdentity { } const root = resolve(import.meta.dirname, "../.."); -const releasePackages = ["sdk", "project-versions", "project-workspace", "playground", "cli"] as const; +const releasePackages = ["sdk", "playground", "cli"] as const; const stableVersion = /^[0-9]+\.[0-9]+\.[0-9]+$/; export const betaSnapshotVersion = /^[0-9]+\.[0-9]+\.[0-9]+-beta-[0-9a-f]{7}-([0-9a-f]{8})-\d{8}$/; diff --git a/scripts/release/consumer-smoke.ts b/scripts/release/consumer-smoke.ts index 0ca2f6b..ae8f4c8 100644 --- a/scripts/release/consumer-smoke.ts +++ b/scripts/release/consumer-smoke.ts @@ -9,8 +9,9 @@ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "nod import { createServer } from "node:net"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; +import { projectSdkSmokeSource } from "./project-sdk-smoke.ts"; -export const REGISTRY_PACKAGES = ["sdk", "project-versions", "project-workspace", "playground", "cli"] as const; +export const REGISTRY_PACKAGES = ["sdk", "playground", "cli"] as const; const REGISTRY = "https://registry.npmjs.org"; const root = resolve(import.meta.dirname, "../.."); @@ -165,7 +166,7 @@ function smokeProjectVersions(directory: string): void { "node", "--input-type=module", "--eval", - 'import { createProjectVersionService } from "@openagentpack/project-versions"; if (typeof createProjectVersionService !== "function") throw new Error("project-versions export missing");', + 'import { createProjectVersionService } from "@openagentpack/sdk/project-versions"; if (typeof createProjectVersionService !== "function") throw new Error("project-versions export missing");', ], directory, ); @@ -177,7 +178,7 @@ function smokeProjectWorkspace(directory: string): void { "node", "--input-type=module", "--eval", - 'import { previewProjectBuild } from "@openagentpack/project-workspace"; if (typeof previewProjectBuild !== "function") throw new Error("project-workspace export missing");', + 'import { previewProjectBuild } from "@openagentpack/sdk/project-workspace"; if (typeof previewProjectBuild !== "function") throw new Error("project-workspace export missing");', ], directory, ); @@ -267,17 +268,9 @@ export async function smokePublishedPackages(requested: string): Promise { assertInstalledPackage(sdkDirectory, "@openagentpack/sdk", version); smokeSdk(sdkDirectory); - const projectVersionsDirectory = join(temporaryRoot, "project-versions-consumer"); - writeConsumerManifest(projectVersionsDirectory, "openagentpack-project-versions-consumer"); - installPackage(projectVersionsDirectory, "@openagentpack/project-versions", version); - assertInstalledPackage(projectVersionsDirectory, "@openagentpack/project-versions", version); - smokeProjectVersions(projectVersionsDirectory); - - const projectWorkspaceDirectory = join(temporaryRoot, "project-workspace-consumer"); - writeConsumerManifest(projectWorkspaceDirectory, "openagentpack-project-workspace-consumer"); - installPackage(projectWorkspaceDirectory, "@openagentpack/project-workspace", version); - assertInstalledPackage(projectWorkspaceDirectory, "@openagentpack/project-workspace", version); - smokeProjectWorkspace(projectWorkspaceDirectory); + smokeProjectVersions(sdkDirectory); + smokeProjectWorkspace(sdkDirectory); + run(["node", "--input-type=module", "--eval", projectSdkSmokeSource], sdkDirectory); const cliDirectory = join(temporaryRoot, "cli-consumer"); writeConsumerManifest(cliDirectory, "openagentpack-cli-consumer"); diff --git a/scripts/release/playground-bundle.test.ts b/scripts/release/playground-bundle.test.ts index b6473b7..ea78303 100644 --- a/scripts/release/playground-bundle.test.ts +++ b/scripts/release/playground-bundle.test.ts @@ -24,8 +24,8 @@ describe("published Playground dependency boundary", () => { } for (const name of [ "@openagentpack/sdk", - "@openagentpack/project-versions", - "@openagentpack/project-workspace", + "@openagentpack/sdk/project-versions", + "@openagentpack/sdk/project-workspace", "yaml", ]) { expect(playgroundConfig.external).toContain(name); diff --git a/scripts/release/project-sdk-smoke.ts b/scripts/release/project-sdk-smoke.ts new file mode 100644 index 0000000..844ae9e --- /dev/null +++ b/scripts/release/project-sdk-smoke.ts @@ -0,0 +1,43 @@ +// Execute from an external consumer with only published/packed SDK dependencies. +// This verifies subpath packaging, shared error identity, and offline disk workflows. +export const projectSdkSmokeSource = ` +import assert from "node:assert/strict"; +import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { UserError } from "@openagentpack/sdk"; +import { ProjectVersionError } from "@openagentpack/sdk/project-versions"; +import { + DirectoryProjectMutationConflictError, + initializeDirectoryProject, + previewProjectBuild, + commitProjectBuild, + createDirectoryWorkspaceVersionService, +} from "@openagentpack/sdk/project-workspace"; + +assert.ok(new ProjectVersionError("version conflict") instanceof UserError); +assert.ok(new DirectoryProjectMutationConflictError("project conflict") instanceof UserError); +const root = await mkdtemp(join(tmpdir(), "agents-sdk-subpaths-")); +try { + const initialized = await initializeDirectoryProject({ projectRoot: root }); + const service = createDirectoryWorkspaceVersionService(root); + const instructionsPath = join(root, "agents/assistant/instructions.md"); + const original = await readFile(instructionsPath, "utf8"); + assert.equal((await service.listVersions()).versions[0].version_id, initialized.baseline_version); + const preview = await previewProjectBuild(root); + assert.equal(preview.can_build, true); + const build = await commitProjectBuild({ projectRoot: root, baseRevision: preview.project_revision }); + assert.ok(build.manifest.yaml_hash); + await writeFile(instructionsPath, "Changed through the packed SDK.\\n"); + const restore = await service.previewVersion(initialized.baseline_version); + assert.equal(restore.can_restore, true); + assert.ok(restore.changes.some(change => change.path === "agents/assistant/instructions.md")); + await service.restoreVersion(initialized.baseline_version, { + projectRevision: restore.base_project_revision, + headVersion: restore.base_head_version, + }); + assert.equal(await readFile(instructionsPath, "utf8"), original); +} finally { + await rm(root, { recursive: true, force: true }); +} +`; diff --git a/scripts/release/publish.ts b/scripts/release/publish.ts index 4469181..d5cb98d 100644 --- a/scripts/release/publish.ts +++ b/scripts/release/publish.ts @@ -9,7 +9,7 @@ import { join, relative, resolve } from "node:path"; import { assertPublishManifest, rewriteExportTargets, rewriteWorkspaceDependencies } from "./package-manifest.ts"; const root = resolve(import.meta.dirname, "../.."); -export const PACKAGES = ["sdk", "project-versions", "project-workspace", "playground", "cli"] as const; +export const PACKAGES = ["sdk", "playground", "cli"] as const; export function publishedPackageSpec(name: string, version: string): string { return `${name}@${version}`; diff --git a/scripts/release/smoke-packed.test.ts b/scripts/release/smoke-packed.test.ts index 1c2b1e9..7fb305c 100644 --- a/scripts/release/smoke-packed.test.ts +++ b/scripts/release/smoke-packed.test.ts @@ -24,7 +24,7 @@ describe("--sdk-only mode", () => { }); test("restricts the package set to Node 18-compatible libraries when enabled", () => { - expect(smokePackages(true)).toEqual(["sdk", "project-versions", "project-workspace"]); + expect(smokePackages(true)).toEqual(["sdk"]); }); test("CI builds every library in dependency order before the SDK-only smoke", () => { @@ -42,6 +42,6 @@ describe("--sdk-only mode", () => { }); test("keeps the full package set when disabled", () => { - expect(smokePackages(false)).toEqual(["sdk", "project-versions", "project-workspace", "playground", "cli"]); + expect(smokePackages(false)).toEqual(["sdk", "playground", "cli"]); }); }); diff --git a/scripts/release/smoke-packed.ts b/scripts/release/smoke-packed.ts index 0e819af..f56f29e 100644 --- a/scripts/release/smoke-packed.ts +++ b/scripts/release/smoke-packed.ts @@ -2,15 +2,15 @@ * Pack the exact publish manifests, install them as an external npm consumer, * then exercise every public SDK entry point plus the CLI and Playground bins. * - * `--sdk-only` restricts the run to the Node 18-compatible library packages: - * SDK, project-versions, and project-workspace. This is the mode CI uses below - * the CLI/Playground Node floor to enforce the libraries' >=18.17.0 contract. + * `--sdk-only` installs just the SDK, including its Node-only project subpaths. + * CI uses this below the CLI/Playground Node floor to enforce Node >=18.17.0. */ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { createServer } from "node:net"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; +import { projectSdkSmokeSource } from "./project-sdk-smoke.ts"; import { PACKAGES, restoreLicense, @@ -27,9 +27,7 @@ export function isSdkOnly(argv: readonly string[]): boolean { } export function smokePackages(sdkOnly: boolean): readonly (typeof PACKAGES)[number][] { - return sdkOnly - ? PACKAGES.filter((pkg) => pkg === "sdk" || pkg === "project-versions" || pkg === "project-workspace") - : PACKAGES; + return sdkOnly ? PACKAGES.filter((pkg) => pkg === "sdk") : PACKAGES; } type PackedPackage = { filename: string }; @@ -154,11 +152,13 @@ async function main(): Promise { "node", "--input-type=module", "--eval", - 'await import("@openagentpack/sdk"); await import("@openagentpack/sdk/session-events"); await import("@openagentpack/sdk/scan-lifecycle"); await import("@openagentpack/sdk/file-lifecycle"); const versions = await import("@openagentpack/project-versions"); const workspace = await import("@openagentpack/project-workspace"); if (typeof versions.createProjectVersionService !== "function") throw new Error("project-versions export missing"); if (typeof workspace.previewProjectBuild !== "function") throw new Error("project-workspace export missing");', + 'await import("@openagentpack/sdk"); await import("@openagentpack/sdk/session-events"); await import("@openagentpack/sdk/scan-lifecycle"); await import("@openagentpack/sdk/file-lifecycle"); const versions = await import("@openagentpack/sdk/project-versions"); const workspace = await import("@openagentpack/sdk/project-workspace"); if (typeof versions.createProjectVersionService !== "function") throw new Error("project-versions export missing"); if (typeof workspace.previewProjectBuild !== "function") throw new Error("project-workspace export missing");', ], consumer, ); + run(["node", "--input-type=module", "--eval", projectSdkSmokeSource], consumer); + if (!sdkOnly) { const expectedVersion = JSON.parse(readFileSync(join(root, "packages/cli/package.json"), "utf8")) as { version: string; diff --git a/scripts/release/snapshot.ts b/scripts/release/snapshot.ts index 6de240e..8b3fd8e 100644 --- a/scripts/release/snapshot.ts +++ b/scripts/release/snapshot.ts @@ -3,7 +3,7 @@ import { resolve } from "node:path"; import { betaSnapshotVersion, commonReleaseVersion, releasePackageVersions, releaseRefHash } from "./channel.ts"; const root = resolve(import.meta.dirname, "../.."); -const releasePackages = ["sdk", "project-versions", "project-workspace", "playground", "cli"] as const; +const releasePackages = ["sdk", "playground", "cli"] as const; export function snapshotVersion(baseVersion: string, sha: string, ref: string, date = new Date()): string { if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.test(baseVersion)) { diff --git a/scripts/verify.ts b/scripts/verify.ts index 50f1565..0e6720d 100644 --- a/scripts/verify.ts +++ b/scripts/verify.ts @@ -69,8 +69,6 @@ export function resolveComparisonBase( const affectedTypechecks = [ { prefix: "scripts/", script: "typecheck:scripts" }, { prefix: "packages/sdk/", script: "typecheck:sdk" }, - { prefix: "packages/project-versions/", script: "typecheck:project-versions" }, - { prefix: "packages/project-workspace/", script: "typecheck:project-workspace" }, { prefix: "packages/cli/", script: "typecheck:cli" }, { prefix: "packages/playbooks/", script: "typecheck:playbooks" }, { prefix: "packages/playground/", script: "typecheck:playground" },