From bcd786f9528f6e03fa3289578cf8056940a00d45 Mon Sep 17 00:00:00 2001 From: liyuanyang Date: Wed, 2 Sep 2026 08:54:39 +0800 Subject: [PATCH] chore(npm): migrate @fullstack-ai-infra/mem-mcp to @bytefolk/mem-mcp v0.1.2 (#153) Rename the npm package scope, MCP metadata identity, and default cache directory from fullstack-ai-infra to bytefolk. Bump the monorepo version to 0.1.2 across all version surfaces (Go, Python, web, Helm, docs). --- .github/workflows/release.yml | 4 ++-- CHANGELOG.md | 10 +++++++++- README.md | 2 +- deploy/helm/mem/Chart.yaml | 4 ++-- deploy/helm/mem/values-production.example.yaml | 6 +++--- deploy/helm/mem/values.yaml | 6 +++--- docs/DEPLOYMENT.md | 2 +- docs/maintainers/releasing.md | 4 ++-- npm/README.md | 8 ++++---- npm/clean-tarball.test.js | 2 +- npm/install.js | 12 ++++++------ npm/install.test.js | 18 +++++++++--------- npm/package.json | 6 +++--- npm/platforms.js | 2 +- npm/server.json | 4 ++-- scripts/validate_release_version.sh | 2 +- server/cmd/mem-mcp/main.go | 2 +- web/package-lock.json | 4 ++-- web/package.json | 2 +- worker/README.md | 2 +- worker/mem_worker/__init__.py | 2 +- worker/pyproject.toml | 2 +- worker/uv.lock | 2 +- 23 files changed, 58 insertions(+), 50 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d49da3..0e632cd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ on: workflow_dispatch: inputs: version: - description: "Existing annotated tag to publish (for example, v0.1.1)" + description: "Existing annotated tag to publish (for example, v0.1.2)" required: true type: string @@ -47,7 +47,7 @@ jobs: set -euo pipefail version="${INPUT_VERSION:-${REF_NAME}}" if [[ ! "${version}" =~ ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-rc\.(0|[1-9][0-9]*))?$ ]]; then - echo "expected an existing release tag such as v0.1.1, got: ${version:-}" >&2 + echo "expected an existing release tag such as v0.1.2, got: ${version:-}" >&2 exit 1 fi if [[ "${EVENT_NAME}" == push && "${FULL_REF}" != "refs/tags/${version}" ]]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index 583287f..75f9a78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,19 @@ The project publishes 0.x prerelease versions; a stable release line is not yet ## [Unreleased] +## [0.1.2] - 2026-09-02 + ### Changed - Migrate GitHub repository, Release, issue, badge, and raw-content coordinates to the canonical `bytefolk` organization while retaining the published npm scope, MCP identity, and existing cache paths. +- Rename `@fullstack-ai-infra/mem-mcp` to `@bytefolk/mem-mcp`. The npm package + scope, MCP metadata identity (`io.github.bytefolk/mem-mcp`), and default + cache directory now use `bytefolk`. The old `@fullstack-ai-infra/mem-mcp@0.1.1` + package remains installable until migration is complete. + ### Security - Normalize the client-declared MIME type of a stored file before deciding how @@ -355,6 +362,7 @@ The project publishes 0.x prerelease versions; a stable release line is not yet - Preserve the primary Web acceptance failure when browser or Vite cleanup also fails. -[Unreleased]: https://github.com/bytefolk/mem/compare/v0.1.1...HEAD +[Unreleased]: https://github.com/bytefolk/mem/compare/v0.1.2...HEAD +[0.1.2]: https://github.com/bytefolk/mem/releases/tag/v0.1.2 [0.1.1]: https://github.com/bytefolk/mem/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/bytefolk/mem/releases/tag/v0.1.0 diff --git a/README.md b/README.md index 8b333d6..a7bc861 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE) [![Status](https://img.shields.io/badge/status-experimental-orange.svg)](#project-status) [![MCP Server](https://img.shields.io/badge/MCP%20Server-26%20tools-blue?logo=modelcontextprotocol)](docs/mcp.md) -[![smithery](https://smithery.ai/badge/@fullstack-ai-infra/mem-mcp)](https://smithery.ai/server/@fullstack-ai-infra/mem-mcp) +[![smithery](https://smithery.ai/badge/@bytefolk/mem-mcp)](https://smithery.ai/server/@bytefolk/mem-mcp) **A portable, self-hosted memory plane for AI agents.** diff --git a/deploy/helm/mem/Chart.yaml b/deploy/helm/mem/Chart.yaml index c86c3cb..640fa31 100644 --- a/deploy/helm/mem/Chart.yaml +++ b/deploy/helm/mem/Chart.yaml @@ -2,6 +2,6 @@ apiVersion: v2 name: mem description: Production Web, memd, migration, and Worker workloads for mem type: application -version: 0.1.1 -appVersion: "0.1.1" +version: 0.1.2 +appVersion: "0.1.2" kubeVersion: ">=1.28.0-0" diff --git a/deploy/helm/mem/values-production.example.yaml b/deploy/helm/mem/values-production.example.yaml index 3559e42..26f378c 100644 --- a/deploy/helm/mem/values-production.example.yaml +++ b/deploy/helm/mem/values-production.example.yaml @@ -2,13 +2,13 @@ images: server: repository: registry.example.internal/mem/server - tag: "0.1.1" + tag: "0.1.2" worker: repository: registry.example.internal/mem/worker - tag: "0.1.1" + tag: "0.1.2" web: repository: registry.example.internal/mem/web - tag: "0.1.1" + tag: "0.1.2" existingSecret: mem-runtime diff --git a/deploy/helm/mem/values.yaml b/deploy/helm/mem/values.yaml index 90cdb5c..6e68aaf 100644 --- a/deploy/helm/mem/values.yaml +++ b/deploy/helm/mem/values.yaml @@ -14,15 +14,15 @@ runtime: images: server: repository: mem-server - tag: "0.1.1" + tag: "0.1.2" pullPolicy: IfNotPresent worker: repository: mem-worker - tag: "0.1.1" + tag: "0.1.2" pullPolicy: IfNotPresent web: repository: mem-web - tag: "0.1.1" + tag: "0.1.2" pullPolicy: IfNotPresent serviceAccount: diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 83acc7a..31b8ab3 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -64,7 +64,7 @@ Use an immutable version for all three images. The example below builds the model-free Worker; optional heavy extras must be explicitly selected. ```bash -export MEM_VERSION=0.1.1 +export MEM_VERSION=0.1.2 export MEM_REGISTRY=registry.example.internal/mem docker build \ diff --git a/docs/maintainers/releasing.md b/docs/maintainers/releasing.md index 4af8c0b..5d9f059 100644 --- a/docs/maintainers/releasing.md +++ b/docs/maintainers/releasing.md @@ -104,7 +104,7 @@ creates, moves, or replaces a tag. starting npm publication. 6. In `npm/`, rerun `npm test`, the npm 12 clean-tarball test, and `npm pack --dry-run --ignore-scripts`. Confirm - `npm view @fullstack-ai-infra/mem-mcp@VERSION version` does not find the + `npm view @bytefolk/mem-mcp@VERSION version` does not find the version, then publish it once with `npm publish --access public --tag latest`. 7. Install the public package in a clean temporary consumer with lifecycle @@ -115,7 +115,7 @@ creates, moves, or replaces a tag. Trusted Publishing is the target npm credential path. For the bootstrap publication, prefer interactive npm 2FA. If a token is required, use a one-day granular npm token restricted to read/write access for -`@fullstack-ai-infra/mem-mcp` only, with no unrelated package or organization +`@bytefolk/mem-mcp` only, with no unrelated package or organization access. Keep it out of repository files, logs, workflow inputs, and issue comments. Read the published version back from the registry and complete the clean-install smoke test before revoking the token immediately. diff --git a/npm/README.md b/npm/README.md index 7d6665c..7129b59 100644 --- a/npm/README.md +++ b/npm/README.md @@ -7,7 +7,7 @@ This package distributes the `mem-mcp` stdio MCP server binary so it can be inst ## Install ```bash -npm install @fullstack-ai-infra/mem-mcp +npm install @bytefolk/mem-mcp ``` ## Usage @@ -39,7 +39,7 @@ a later diagnostic sink fails. The executable cache is outside the installed npm package and is isolated by package version and platform. Defaults are `$XDG_CACHE_HOME` (or `~/.cache`) on Linux, `~/Library/Caches` on macOS, and `%LOCALAPPDATA%` on Windows, below -`fullstack-ai-infra/mem-mcp`. Set `MEM_MCP_CACHE_DIR` to an absolute path to use +`bytefolk/mem-mcp`. Set `MEM_MCP_CACHE_DIR` to an absolute path to use a different writable cache root. A per-asset cross-process lock serializes verification and atomic replacement, so concurrent hosts cannot expose or delete each other's downloads. Stale-lock recovery removes only artifacts named @@ -59,7 +59,7 @@ bounded shutdown grace period. "mcpServers": { "mem": { "command": "npx", - "args": ["-y", "@fullstack-ai-infra/mem-mcp"], + "args": ["-y", "@bytefolk/mem-mcp"], "env": { "MEM_SERVER": "http://localhost:8787", "MEM_TOKEN": "mem_..." @@ -75,7 +75,7 @@ bounded shutdown grace period. claude mcp add --scope project --transport stdio \ --env MEM_SERVER=http://localhost:8787 \ --env MEM_TOKEN=mem_... \ - mem -- npx -y @fullstack-ai-infra/mem-mcp + mem -- npx -y @bytefolk/mem-mcp ``` ## Configuration diff --git a/npm/clean-tarball.test.js b/npm/clean-tarball.test.js index ae2632a..7dd6187 100644 --- a/npm/clean-tarball.test.js +++ b/npm/clean-tarball.test.js @@ -134,7 +134,7 @@ test( const packageRoot = join( consumer, "node_modules", - "@fullstack-ai-infra", + "@bytefolk", "mem-mcp", ); const packageJson = JSON.parse( diff --git a/npm/install.js b/npm/install.js index 58f11ee..0d0001a 100644 --- a/npm/install.js +++ b/npm/install.js @@ -30,7 +30,7 @@ const { pipeline } = require("stream/promises"); const { TextDecoder } = require("util"); const { assetFor } = require("./platforms"); -const PACKAGE = "@fullstack-ai-infra/mem-mcp"; +const PACKAGE = "@bytefolk/mem-mcp"; const REPO = "bytefolk/mem"; const CHECKSUM_ASSET = "mem-mcp-checksums.txt"; const MAX_CHECKSUM_BYTES = 64 * 1024; @@ -120,7 +120,7 @@ function cacheRootFor(options = {}) { if (environment.LOCALAPPDATA) { return pathApi.join( absolutePath(environment.LOCALAPPDATA, osPlatform, "LOCALAPPDATA"), - "fullstack-ai-infra", + "bytefolk", "mem-mcp", ); } @@ -128,7 +128,7 @@ function cacheRootFor(options = {}) { absolutePath(homeDirectory, osPlatform, "home directory"), "AppData", "Local", - "fullstack-ai-infra", + "bytefolk", "mem-mcp", ); } @@ -138,7 +138,7 @@ function cacheRootFor(options = {}) { absolutePath(homeDirectory, osPlatform, "home directory"), "Library", "Caches", - "fullstack-ai-infra", + "bytefolk", "mem-mcp", ); } @@ -146,14 +146,14 @@ function cacheRootFor(options = {}) { if (environment.XDG_CACHE_HOME) { return pathApi.join( absolutePath(environment.XDG_CACHE_HOME, osPlatform, "XDG_CACHE_HOME"), - "fullstack-ai-infra", + "bytefolk", "mem-mcp", ); } return pathApi.join( absolutePath(homeDirectory, osPlatform, "home directory"), ".cache", - "fullstack-ai-infra", + "bytefolk", "mem-mcp", ); } diff --git a/npm/install.test.js b/npm/install.test.js index 28ad7a6..ee16451 100644 --- a/npm/install.test.js +++ b/npm/install.test.js @@ -222,7 +222,7 @@ test("cache paths are user-scoped, versioned, and require absolute overrides", ( environment: { XDG_CACHE_HOME: "/var/cache/example" }, homeDirectory: "/home/example", }), - "/var/cache/example/fullstack-ai-infra/mem-mcp", + "/var/cache/example/bytefolk/mem-mcp", ); assert.equal( cacheRootFor({ @@ -230,7 +230,7 @@ test("cache paths are user-scoped, versioned, and require absolute overrides", ( environment: {}, homeDirectory: "/Users/example", }), - "/Users/example/Library/Caches/fullstack-ai-infra/mem-mcp", + "/Users/example/Library/Caches/bytefolk/mem-mcp", ); assert.equal( cacheRootFor({ @@ -238,17 +238,17 @@ test("cache paths are user-scoped, versioned, and require absolute overrides", ( environment: { LOCALAPPDATA: "C:\\Users\\example\\AppData\\Local" }, homeDirectory: "C:\\Users\\example", }), - "C:\\Users\\example\\AppData\\Local\\fullstack-ai-infra\\mem-mcp", + "C:\\Users\\example\\AppData\\Local\\bytefolk\\mem-mcp", ); assert.equal( cacheDirectory({ osPlatform: "linux", osArch: "arm64", - version: "0.1.1", + version: "0.1.2", environment: { MEM_MCP_CACHE_DIR: "/var/cache/mem-mcp-test" }, homeDirectory: "/home/example", }), - "/var/cache/mem-mcp-test/v0.1.1/linux-arm64", + "/var/cache/mem-mcp-test/v0.1.2/linux-arm64", ); assert.throws( () => cacheRootFor({ @@ -274,14 +274,14 @@ test("install verifies a temporary download before exposing it", async (t) => { const osPlatform = platform(); const osArch = arch(); const asset = assetFor(osPlatform, osArch); - const cacheDir = join(cacheRoot, "v0.1.1", `${osPlatform}-${osArch}`); + const cacheDir = join(cacheRoot, "v0.1.2", `${osPlatform}-${osArch}`); const bytes = Buffer.from("trusted mem-mcp binary"); const requested = []; const installed = await install({ osPlatform, osArch, - version: "0.1.1", + version: "0.1.2", environment: { MEM_MCP_CACHE_DIR: cacheRoot }, homeDirectory: join(root, "read-only-package-home-must-not-be-used"), logger: QUIET_LOGGER, @@ -302,8 +302,8 @@ test("install verifies a temporary download before exposing it", async (t) => { } assert.deepEqual(readdirSync(cacheDir), [asset]); assert.deepEqual(requested, [ - "https://github.com/bytefolk/mem/releases/download/v0.1.1/mem-mcp-checksums.txt", - `https://github.com/bytefolk/mem/releases/download/v0.1.1/${asset}`, + "https://github.com/bytefolk/mem/releases/download/v0.1.2/mem-mcp-checksums.txt", + `https://github.com/bytefolk/mem/releases/download/v0.1.2/${asset}`, ]); }); diff --git a/npm/package.json b/npm/package.json index 9481628..721f2cb 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,8 +1,8 @@ { - "name": "@fullstack-ai-infra/mem-mcp", - "version": "0.1.1", + "name": "@bytefolk/mem-mcp", + "version": "0.1.2", "description": "MCP server for mem — a portable, self-hosted memory plane for AI agents", - "mcpName": "io.github.fullstack-ai-infra/mem-mcp", + "mcpName": "io.github.bytefolk/mem-mcp", "keywords": [ "mcp", "model-context-protocol", diff --git a/npm/platforms.js b/npm/platforms.js index 2dcb510..df049b2 100644 --- a/npm/platforms.js +++ b/npm/platforms.js @@ -35,7 +35,7 @@ function assetFor(osPlatform, osArch) { if (!asset) { throw new Error( `Unsupported platform: ${key}. ${ - "@fullstack-ai-infra/mem-mcp" + "@bytefolk/mem-mcp" } publishes: ${Object.keys(ASSETS).join(", ")}.` ); } diff --git a/npm/server.json b/npm/server.json index f214f7a..f924368 100644 --- a/npm/server.json +++ b/npm/server.json @@ -1,7 +1,7 @@ { - "mcpName": "io.github.fullstack-ai-infra/mem-mcp", + "mcpName": "io.github.bytefolk/mem-mcp", "name": "mem-mcp", - "version": "0.1.1", + "version": "0.1.2", "description": "MCP server for mem — a portable, self-hosted memory plane for AI agents", "protocol": "2024-11-05", "transport": "stdio", diff --git a/scripts/validate_release_version.sh b/scripts/validate_release_version.sh index 987a304..9e47003 100755 --- a/scripts/validate_release_version.sh +++ b/scripts/validate_release_version.sh @@ -38,7 +38,7 @@ fi require_exact_line npm/package.json " \"version\": \"${version}\"," require_exact_line npm/server.json " \"version\": \"${version}\"," require_exact_line server/cmd/mem-mcp/main.go \ - $'\t\"version\": \"'"${version}"$'\", // synced with npm/@fullstack-ai-infra/mem-mcp version' + $'\t\"version\": \"'"${version}"$'\", // synced with npm/@bytefolk/mem-mcp version' require_exact_line worker/pyproject.toml "version = \"${version}\"" require_exact_line worker/mem_worker/__init__.py "__version__ = \"${version}\"" diff --git a/server/cmd/mem-mcp/main.go b/server/cmd/mem-mcp/main.go index e976d30..0d7d886 100644 --- a/server/cmd/mem-mcp/main.go +++ b/server/cmd/mem-mcp/main.go @@ -50,7 +50,7 @@ const protocolVersion = "2024-11-05" // serverInfo is what we report back in the `initialize` handshake. var serverInfo = map[string]any{ "name": "mem-mcp", - "version": "0.1.1", // synced with npm/@fullstack-ai-infra/mem-mcp version + "version": "0.1.2", // synced with npm/@bytefolk/mem-mcp version } func main() { diff --git a/web/package-lock.json b/web/package-lock.json index 2bd86c8..6040f6a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "mem-web", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mem-web", - "version": "0.1.1", + "version": "0.1.2", "dependencies": { "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", diff --git a/web/package.json b/web/package.json index 6a66d95..d371d6d 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "mem-web", "private": true, - "version": "0.1.1", + "version": "0.1.2", "type": "module", "description": "mem · Agent-Native AI 网盘 · Web UI (Phase 1)", "scripts": { diff --git a/worker/README.md b/worker/README.md index 7cd5e8c..a1feb17 100644 --- a/worker/README.md +++ b/worker/README.md @@ -293,7 +293,7 @@ print(stub.HealthCheck(pb.HealthCheckRequest())) PY ``` -Expected: `status: SERVING\nversion: "0.1.1"`. +Expected: `status: SERVING\nversion: "0.1.2"`. --- diff --git a/worker/mem_worker/__init__.py b/worker/mem_worker/__init__.py index 7e1ada1..052bb7a 100644 --- a/worker/mem_worker/__init__.py +++ b/worker/mem_worker/__init__.py @@ -13,4 +13,4 @@ from __future__ import annotations -__version__ = "0.1.1" +__version__ = "0.1.2" diff --git a/worker/pyproject.toml b/worker/pyproject.toml index 0481b7f..68cc22c 100644 --- a/worker/pyproject.toml +++ b/worker/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mem-worker" -version = "0.1.1" +version = "0.1.2" description = "mem AI Worker — Processor + Provider service (gRPC, Python 3.11+)" readme = "README.md" requires-python = ">=3.11" diff --git a/worker/uv.lock b/worker/uv.lock index cd0c2b8..505a433 100644 --- a/worker/uv.lock +++ b/worker/uv.lock @@ -925,7 +925,7 @@ wheels = [ [[package]] name = "mem-worker" -version = "0.1.1" +version = "0.1.2" source = { editable = "." } dependencies = [ { name = "boto3" },