Skip to content

fix(npm): follow the registry identifier to the bytefolk namespace - #162

Merged
PeterGuy326 merged 2 commits into
mainfrom
feat/153-registry-namespace-mem-mcp
Sep 10, 2026
Merged

PeterGuy326 merged 2 commits into
mainfrom
feat/153-registry-namespace-mem-mcp

Conversation

@waterbro-8

@waterbro-8 waterbro-8 commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

What this changes

mcpName becomes io.github.bytefolk/mem-mcp in npm/server.json and npm/package.json. This implements the registry half of the 2026-09-03 decision that G5 does not wait on an npm scope migration.

The official MCP Registry derives an entry's namespace from the repository owner. The value on main still names fullstack-ai-infra, which this repository no longer is, so a submission carrying it either points into a namespace we do not control or is rejected by namespace validation. That single stale string is why the registry listing never appeared — reading search=io.github.fullstack-ai-infra and search=bytefolk against the public registry API both return count: 0, so there is no prior record to migrate over.

What is deliberately not changed

value why it stays
npm package name @fullstack-ai-infra/mem-mcp The decision keeps the published scope. A registry identifier and an npm package identifier are different namespaces; moving the package would break every existing "args": ["-y", "@fullstack-ai-infra/mem-mcp"] client config and every cached install for no registry-side gain.
installer cache directory …/fullstack-ai-infra/mem-mcp Renaming it discards working caches to change a folder name.
version 0.1.1 scripts/validate_release_version.sh:39 pins npm/server.json's version to the tag, so the bump belongs to the release commit, not here.

The resulting shape — npm scope @fullstack-ai-infra, registry namespace io.github.bytefolk — is intentional and is what the new test encodes, so it does not read as a half-finished migration.

The guard

The defect was a stale string in a manifest, and a rename is precisely the event that makes a manifest stale, so npm/registry-identity.test.js now asserts the identifier against the repository coordinate npm/install.js already downloads from. It derives the expected namespace rather than hardcoding bytefolk, so a future rename moves the assertion instead of breaking it.

run result
this branch 3/3 pass
mcpName left on fullstack-ai-infra (the shipped state) 2 of 3 fail
repository coordinate renamed, identifier not followed 1 of 3 fails
full npm test 38 tests, 37 pass, 1 pre-existing platform skip
same on main@1332bf46 35 tests, 34 pass, 1 skip

Added to the test script's file list, so it runs in the npm-wrapper CI job rather than only when named directly.

Two things to know before reviewing

  • npm run test:tarball fails on this branch and identically on main. It is an npm install --offline of the locally packed tarball against this host's npm cache, not something this change touched. CI invokes it as npx --yes npm@12.0.2 run test:tarball, which this host cannot reproduce, so treat that leg as CI-covered only.
  • [Release] Migrate mem-mcp to @bytefolk/mem-mcp v0.1.2 #153 now contradicts this PR. That issue asks to migrate the package to @bytefolk/mem-mcp; the decision is to keep the scope. I linked with Refs #153, not Closes, because only the registry half is done here. [Release] Migrate mem-mcp to @bytefolk/mem-mcp v0.1.2 #153 should be rewritten, or the next person to pick it up will move the scope and undo the part that was never in question.

Not in this PR

Running mcp-publisher and the OAuth / organization verification are assigned to @PeterGuy326, and the registry record is created by that submission, not by merging this. README.md:11 also still points its Smithery badge at @fullstack-ai-infra/mem-mcp; that slug needs verifying against what Smithery actually resolves before it is edited, so it is left alone here rather than repointed to something possibly equally wrong.

Merging this PR is not a claim that it is merge-ready, and no review has been requested or recorded.

The repository moved to `bytefolk`, and the official MCP Registry derives an
entry's namespace from the repository owner. `mcpName` still named the
organization this repository used to belong to, so a submission carrying it
either resolves to a namespace we do not control or is rejected outright. That
is the whole of why the registry listing has never appeared: nothing else about
the server was missing.

`mcpName` becomes `io.github.bytefolk/mem-mcp` in both manifests that carry it
(`npm/server.json`, `npm/package.json`).

Deliberately unchanged:

- The npm package stays `@fullstack-ai-infra/mem-mcp`. A registry identifier and
  an npm package identifier are different namespaces, and moving the package
  would break every existing `"args": ["-y", "@fullstack-ai-infra/mem-mcp"]`
  client config and every cached install path for no registry-side gain.
- The installer's cache directory, which is also keyed on the old name, keeps
  its path. Renaming it would discard working caches to change a folder name.
- The version stays 0.1.1 here. `scripts/validate_release_version.sh` pins
  `npm/server.json` to the tagged version, so the bump belongs to the release
  that carries it, not to this change.

`npm/registry-identity.test.js` is added because the failure was a stale string
in a manifest, and a rename is exactly the event that makes a manifest stale. It
derives the expected namespace from the repository coordinate the installer
itself downloads from, so it follows a future rename instead of asserting one
particular spelling, and it pins the two manifests against each other. Verified
by mutation: leaving `mcpName` on the old organization fails two of the three
cases, and renaming only the repository coordinate fails the third.

Refs #153 for the registry half only. That issue's title and scope ask for the
npm package to move to `@bytefolk/mem-mcp` as well, and the 2026-09-03 decision
is to keep the published scope. #153 should be rewritten to say so: as long as
it reads "migrate mem-mcp to @bytefolk/mem-mcp", the next person who picks it up
will move the scope and undo the part that is not up for grabs.

@PeterGuy326 PeterGuy326 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review: the change keeps the published npm scope and only aligns both MCP Registry manifests with the current bytefolk/mem repository owner, adding a regression test for both manifests and the unscoped server name. The npm test suite passed locally (44 pass, 1 platform skip); required CI is green. This is safe to merge as the registry-identity half, while the separate npm-scope decision remains open. Approving for squash auto-merge.

@wadrzl

wadrzl commented Sep 6, 2026

Copy link
Copy Markdown

Local Verification Summary for Issue #104 (MCP Registry Listing)

Branch tested: pr-162 at head e7fdc03f76074d80965546e49ccfc129eb829f9a
Base: main

Issue #104 Context

Issue #104 tracks listing mem-mcp on MCP hubs (official MCP Registry, Smithery, Glama, PulseMCP). This PR addresses G5 (official MCP Registry) by fixing the stale mcpName that prevented the registry listing from appearing.

Changes Verified

File Change Status
npm/server.json mcpName: io.github.fullstack-ai-infra/mem-mcpio.github.bytefolk/mem-mcp PASS
npm/package.json mcpName: same update PASS
npm/install.js Added REPO export for test derivation PASS
npm/registry-identity.test.js New test file (3 tests) PASS
CHANGELOG.md Added entry for registry identifier fix PASS

Test Results

Test Suite Result
npm test 45 tests / 44 pass / 0 fail / 1 skip (Windows shim)
Registry identity tests 3/3 PASS
npm pack --dry-run PASS - 6 files, 14.9 kB

Key Registry Identity Tests

  1. "the registry namespace follows the repository owner" - PASS

    • Derives expected namespace from REPO constant (not hardcoded)
    • Validates both server.json and package.json match io.github.bytefolk/mem-mcp
  2. "both manifests name the same server" - PASS

    • server.json.mcpName === package.json.mcpName
    • server.json.version === package.json.version
  3. "the registry name is the unscoped package name" - PASS

    • Trailing segment of mcpName (mem-mcp) matches unscoped package name
    • Prevents silent registry record forking

Manifest Values Verified

// npm/server.json
{
  "mcpName": "io.github.bytefolk/mem-mcp",
  "name": "mem-mcp",
  "version": "0.1.1",
  "repo": "https://github.com/bytefolk/mem"
}

// npm/package.json
{
  "name": "@fullstack-ai-infra/mem-mcp",
  "mcpName": "io.github.bytefolk/mem-mcp"
}

Deliberate Non-Changes (Correct)

Item Value Reason
npm package name @fullstack-ai-infra/mem-mcp Registry and npm are different namespaces; moving would break existing configs
Installer cache directory …/fullstack-ai-infra/mem-mcp Renaming discards working caches for no gain
Version 0.1.1 Version bump belongs to release commit, not this fix

Mutation Testing (from PR description)

  • Leaving mcpName on fullstack-ai-infra: 2 of 3 registry tests fail
  • Renaming only repository coordinate: 1 of 3 tests fails
  • Current branch: 3/3 pass

Next Steps for Issue #104 G5

After this PR merges, the remaining step is running mcp-publisher to submit to the official MCP Registry. This PR fixes the identifier; the actual submission creates the registry record.

@PeterGuy326

Copy link
Copy Markdown
Collaborator

Decision update: #153 (comment)

The npm target is now @bytefolk/mem-mcp@0.1.2. This PR's MCP Registry identity fix remains relevant, but its intentional old npm scope is no longer the selected release shape. It will be integrated with the full migration under #153. Auto-merge has been disabled and verified; this is not a merge or a new approval.

@PeterGuy326

Copy link
Copy Markdown
Collaborator

Current-main implementation candidate: #193, head bc0f73345774187f17c8e797bc2b3d4430f6d4a2. It integrates the actual ByteFolk package/cache migration, MCP identity and 0.1.2 version surfaces, with human attribution to #154/#162/#168.

Independent source preflight passed after reproducing and fixing a legacy-cache alias/data-loss edge case. The exact tested file tree was verified after upload. Fresh GitHub CI and human review are separate gates; #193 remains draft. No tag, release, npm publish or main merge has occurred. RC alignment/bootstrap and npm owner authentication/Trusted Publisher proof remain required.

The previous candidates remain open pending review of this replacement; their historical green tests are not reused as current-head evidence.

@PeterGuy326
PeterGuy326 merged commit 39e8946 into main Sep 10, 2026
20 checks passed
@PeterGuy326
PeterGuy326 deleted the feat/153-registry-namespace-mem-mcp branch September 10, 2026 15:52
waterbro-8 added a commit that referenced this pull request Sep 14, 2026
Resolves the only collision, in CHANGELOG.md's [Unreleased] "Fixed" list, by
keeping both entries: this branch's CI Web bullet and main's #165 bullet about
withholding unverifiable URL credentials. No duplicate "### Fixed" heading was
introduced.

main's "### Changed" side won on its own: the branch's "retaining the published
npm scope, MCP identity, and existing cache paths" wording is false after #162
changed mcpName to io.github.bytefolk/mem-mcp, and the merged text no longer
carries that clause. GOVERNANCE.md arrived from main without conflict because
this branch never added one.

This commit is the conflict resolution only; the CI evidence fixes follow.
waterbro-8 added a commit that referenced this pull request Sep 17, 2026
## Canonical requirement

Refs bytefolk/.github#32

- Canonical Issue URL: bytefolk/.github#32
- Consumed revision: R1
- No automatic close keywords: acknowledged

Decision reference: the initial R1 Issue body. It explicitly records
that local candidates preceded this prospective publication record; no
retrospective approval is claimed.

## Requirement trace

| REQ/AC IDs | Changed files / domain | Tests or review evidence |
|---|---|---|
| REQ-001 / AC-001 | 4 exact-pinned version annotations | Exact
expected-byte replacement PASS |
| REQ-002 / AC-002 | 2 files in bytefolk/mem | Repository inventory
PASS; aggregate 7 repositories, 13 files, 21 lines |
| REQ-003 / AC-003 | Existing workflow content and modes | Parsed YAML
and comment-stripped bytes identical |
| REQ-004 / AC-004 | Current-head CI and independent review | Local
independent replay recorded in the canonical R1 Issue linked above;
hosted CI collected on head `f464f686` (19 of 20 checks succeed, see
Validation); independent human review requested and still pending |

## File domains

`.github/workflows/bytefolk-scorecard.yml` (47);
`.github/workflows/bytefolk-security.yml` (58, 65, 68).

Prepared parent / merge base: `2986fe38175f54d99f15dd38a498708c6ecd88cd`
PR base at publication: `87db0dfe0507be2190fe2fdcce0e267be8224f4d`.
Since that baseline `main` advanced by six commits through `3c13f04e`
(#162, #160, #165, #188, #158, #204) — not only `web/package-lock.json`
as previously stated here. None of them touched `.github/workflows/`, so
the F9 workflow blobs and the PR diff are unchanged. The reviewed commit
and original parent are preserved.
Head: `f464f68636adc6bb5295c3818aa6654c46a3caad` — `d2a9ec5` plus one
non-forced `Merge branch 'main'` commit (`f464f686`) that brought the
branch up to `3c13f04e` so it is no longer `BEHIND`. Verified: `git
rev-parse d2a9ec5:.github/workflows/bytefolk-scorecard.yml` and
`...:bytefolk-security.yml` return the same blobs (`2058126c`,
`48a507e0`) as at `f464f686`, and `git diff main...f464f68` is still
exactly these 2 files, `+4/-4`. The comment-only payload is therefore
byte-identical to the reviewed commit and the equality proof above holds
on the current head.

## Scope and non-goals

Correct only `# v4.37.4` to `# v4.37.9` on CodeQL uses-lines pinned to
`cdf488f595d80d6e07e03d4674febd5ab45fa938`. The [official tag
object](https://api.github.com/repos/github/codeql-action/git/tags/a35ac6e6798d72df5475948b28efb89edc2e19ca)
resolves to that existing pin. Action SHAs, permissions, triggers,
steps, matrices, other pins, and runtime code are unchanged.

## Validation

- Exact commands: `ruby evidence/verify.rb --baseline` and `ruby
evidence/verify.rb --committed` from the retained review packet; `git
diff --check 2986fe3
d2a9ec5` from this repository.
- Observed counts/results: PASS 2/2 files and 4/4 replacements here;
aggregate PASS 13/13 files and 21/21 replacements. Baseline
intentionally exits 1 after detecting all 21 stale annotations;
committed verification exits 0.
- Check URLs: collected on head `f464f686` — 19 of 20 checks succeed.
The single failure is [`HTTP, CLI and MCP
lifecycle`](https://github.com/bytefolk/mem/actions/runs/34807101354/job/103861020551),
whose log is `pull access denied for minio/minio` at ~13s: a
container-image pull failure in an unrelated job. The same workflow was
green on `main` at `3c13f04e`, and the identical failure is present on
#198 and #199, so it is not caused by this comment-only change.
Root-cause tracking is separate and open.

The strict verifier checks the changed-file allowlist; exact old blobs
and line inventory; complete expected-byte replacement; absence of stale
target annotations; parsed YAML equality; comment-stripped byte equality
and SHA-256 digests; whitespace and unchanged modes; one commit with the
exact parent; and clean worktrees with no untracked files. All passed.
The independent replay is recorded in canonical R1. The verifier and
inventory are retained outside repository commits.

| ID | REQ/AC | Observable acceptance criterion | Command or manual
steps | Environment | Expected | Observed | Status |
|---|---|---|---|---|---|---|---|
| V1 | AC-001, AC-002, AC-003 | Exact annotations with executable YAML
unchanged | `ruby evidence/verify.rb --committed` | Ruby 2.6.10, Psych
3.1.0, isolated review packet | Exact scoped replacements and equality |
2/2 files; 4/4 lines; all invariants pass | PASS |
| V2 | AC-004 | Hosted checks on this exact head | Inspect this PR's
checks at `f464f686` | GitHub Actions | Applicable checks succeed | 19
of 20 succeed; `HTTP, CLI and MCP lifecycle` fails on `pull access
denied for minio/minio` (infra, unrelated job, also failing on
#198/#199, green on `main`) | PARTIAL |

## Security and compatibility

Documentation annotation only. No dependencies, permissions,
credentials, data flows, or runtime behavior change. The diff and commit
identity were inspected for public-safe content. No CHANGELOG entry or
behavior-documentation update is needed because only explanatory
comments change.

## Known limitations

Runtime suites, build, coverage, and dependency audits were not rerun
for this comment-only change; no runtime test result is claimed. Hosted
CI is separate from local equality proof. Two limits now apply: (1) the
strict verifier's `one commit with the exact parent` invariant describes
the reviewed payload commit `d2a9ec5`, not the current branch shape,
which carries two additional `Merge branch 'main'` commits; (2) this PR
is **not merge-ready yet** — repository `AGENTS.md` step 6 requires
passing CI *and* an approval from someone other than the author, and
`HTTP, CLI and MCP lifecycle` is red on the unrelated `minio` pull, so
the green-CI half is unmet until that infrastructure failure is fixed.

## Risk and rollback

Low-risk annotation correction. Roll back through an ordinary revert of
this single commit. There is no migration or release action.

## Product review handoff

- Implementation/publication owner: @PeterGuy326
- Automated pre-review result: independent local replay recorded in R1;
no human approval implied.
- Human final review: PENDING; no human review requested by this
publication.
- Merge ledger owner: @PeterGuy326
- Product reviewer: @PeterGuy326
- Milestone or release packet: N/A: bounded documentation annotation
maintenance
- Merge, CI, release, and model judgment do not accept or close the
Issue: acknowledged


## Maintenance update (2026-09-14, @waterbro-8)

Records written by the maintainer account, not by the implementation
owner:

- `f464f686 Merge branch 'main'` was pushed to this head branch
(non-forced, `main` at `3c13f04e` is an ancestor of the head) to clear
the `BEHIND` state this PR's own body said blocked merging. No workflow
file content changed: both blobs are identical to `d2a9ec5`.
- The stale facts above were corrected in place: the recorded head SHA,
the "Main advanced only `web/package-lock.json` in PR #192" claim, the
`NOT VERIFIED` hosted-CI rows, and the "this is a draft, not
merge-ready" note.
- This PR was marked ready for review and an independent review was
requested. The maintainer account that pushed the merge commit did
**not** approve it: `AGENTS.md` step 6 requires an approval from someone
other than the author, and a commit author on the head cannot supply
that approval for their own push. `@PeterGuy326` remains implementation
and merge-ledger owner.

Co-authored-by: 勒布朗-詹姆斯 <2986253039@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants