diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index dc94336..42529c7 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -63,9 +63,9 @@ jobs: with: node-version: 22 - - name: Publish @fullstack-ai-infra/mem-mcp (OIDC) + - name: Publish @bytefolk/mem-mcp (OIDC) working-directory: npm # No NPM_TOKEN / NODE_AUTH_TOKEN: auth is exchanged from the GitHub OIDC # id-token against the npmjs Trusted Publisher configured for - # org=fullstack-ai-infra / repo=mem / workflow=npm-publish.yml. + # org=bytefolk / repo=mem / workflow=npm-publish.yml. run: npm publish --provenance --access public diff --git a/CHANGELOG.md b/CHANGELOG.md index 30320bd..7314503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ The project publishes 0.x prerelease versions; a stable release line is not yet ## [Unreleased] +### Changed + +- Align npm/MCP/installer identity to `@bytefolk/mem-mcp@0.1.2` and the ByteFolk executable-cache namespace. Refs #153. + ### Added - Additive `durable-memory.v1` envelope for derived RoleWeave/mem records diff --git a/README.md b/README.md index 15df72a..a9b7b2e 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 9bc88bd..cf1444b 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_REVISION="$(git rev-parse HEAD)" export MEM_REGISTRY=registry.example.internal/mem @@ -105,7 +105,7 @@ Every release publishes a single version grammar that clients pin against. The | Field | Example | Meaning | | --- | --- | --- | -| `version` | `"0.1.1"` | Semver release tag (without the `v` prefix) | +| `version` | `"0.1.2"` | Semver release tag (without the `v` prefix) | | `revision` | `"10d4bf7a48fd5ab0ce6fc67caa407a717f81830e"` | 40-hex git commit the binary was built from | | `contract` | `"durable-context.v1"` | Durable-context wire contract the server speaks | 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 4215cc7..a388c32 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 49aa4e5..6eff549 100644 --- a/npm/install.test.js +++ b/npm/install.test.js @@ -226,7 +226,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({ @@ -234,7 +234,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({ @@ -242,17 +242,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({ @@ -278,14 +278,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, @@ -306,8 +306,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 235e2ee..9e6cac9 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { - "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.bytefolk/mem-mcp", "keywords": [ 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 aa3fd6e..f924368 100644 --- a/npm/server.json +++ b/npm/server.json @@ -1,7 +1,7 @@ { "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 e063ac3..766664a 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.json b/web/package.json index e8a3535..2988971 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 9fead71..b965758 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"