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" },