Skip to content

Commit b377c62

Browse files
authored
Merge pull request DeusData#1543 from DeusData/fix/batch1-strictness-and-installers
fix(install,daemon): unbreak npx clients, group-writable homes, and legacy updaters (+3 security alerts)
2 parents 58d6100 + 8eabe19 commit b377c62

25 files changed

Lines changed: 783 additions & 137 deletions

‎.github/workflows/release.yml‎

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -360,16 +360,18 @@ jobs:
360360
- name: Build PyPI distribution
361361
working-directory: pkg/pypi
362362
run: |
363-
# Pin to specific versions (typosquatting / supply-chain mitigation).
364-
# OSSF scorecard prefers --require-hashes, but that needs full
365-
# transitive deps; version pinning is the practical compromise.
363+
# Every byte of the publish toolchain is bound by hash: version pins
364+
# alone still let a compromised index serve different content, and a
365+
# bare `pip install` resolves the whole transitive graph at run time
366+
# (OSSF Scorecard pinned-dependencies). requirements-publish.txt is
367+
# generated on a linux/amd64 python:3.12 image — see its header for
368+
# the exact regeneration command.
366369
#
367-
# twine >= 7 is required: `python -m build` resolves the UNPINNED
368-
# hatchling backend fresh in its isolated env, and current hatchling
369-
# emits Metadata-Version 2.5, which twine 6.2.0 rejects as invalid
370-
# ("'2.5' is not a valid metadata version" — the v0.10.1 failure).
371-
# Verified locally: identical artifacts, 6.2.0 rejects / 7.0.0 passes.
372-
python -m pip install --upgrade 'build==1.3.0' 'twine==7.0.0'
370+
# twine must stay >= 7 and hatchling is pinned in pyproject.toml:
371+
# `python -m build` resolves its backend fresh in an isolated env, and
372+
# a hatchling emitting Metadata-Version 2.5 against twine 6.2.0 is
373+
# what broke the v0.10.1 publish.
374+
python -m pip install --require-hashes -r requirements-publish.txt
373375
python -m build
374376
twine check dist/*
375377
@@ -439,6 +441,16 @@ jobs:
439441
permissions:
440442
contents: write
441443
steps:
444+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
445+
446+
# Legacy ui-* aliases so 0.9.x updaters stop 404ing (#1538). Runs after
447+
# verify: same bytes as archives the VirusTotal gate already cleared, and
448+
# publishing earlier would duplicate the scan set and provenance manifest.
449+
- name: Publish legacy ui-* archive aliases
450+
env:
451+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
452+
run: scripts/ci/publish-legacy-aliases.sh "${{ inputs.version }}" "$GITHUB_REPOSITORY"
453+
442454
- name: Un-draft GitHub release
443455
env:
444456
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

‎.gitignore‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,9 @@ soak-results-query-leak/
8080
# scripts/soak-test.sh stay tracked.
8181
/soak*/
8282
/memlab-*
83+
84+
# Compiled Go wrapper binary. `go build` in pkg/go drops the executable beside
85+
# its sources; one was committed by accident (8.8 MB ELF, flagged by OSSF
86+
# Scorecard as a binary artifact in source). Source only, never the build.
87+
/pkg/go/codebase-memory-mcp
88+
/pkg/go/codebase-memory-mcp.exe

‎SECURITY.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ for Linux ELF binaries, so it is not a complete answer either.
288288

289289
| Version | Supported |
290290
|---------|-----------|
291-
| Latest `0.9.x` | Yes — security fixes land in the newest release |
292-
| < 0.9 | No — please upgrade to the latest release |
291+
| Latest `0.10.x` | Yes — security fixes land in the newest release |
292+
| < 0.10 | No — please upgrade to the latest release |
293293

294294
Only the latest release is supported. Security fixes are shipped in a new
295295
patched release rather than backported to older versions; upgrading to the

‎graph-ui/package-lock.json‎

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎graph-ui/package.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
},
4242
"overrides": {
4343
"form-data": ">=4.0.6",
44-
"@babel/core": ">=7.29.6"
44+
"@babel/core": ">=7.29.6",
45+
"nanoid": "^3.3.17"
4546
}
4647
}

‎install.sh‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,13 @@ fi
237237
# macOS: fix signing
238238
if [ "$OS" = "darwin" ]; then
239239
echo "Fixing macOS code signing..."
240-
xattr -d com.apple.quarantine "$DLBIN" 2>/dev/null || true
241-
codesign --sign - --force "$DLBIN" 2>/dev/null || true
240+
# A curl-downloaded archive usually carries no quarantine attribute at all,
241+
# and xattr then prints "No such xattr: com.apple.quarantine" on stderr.
242+
# That harmless line was read as the cause of an unrelated install failure
243+
# and became a bug report's title (#1537) — silence it; nothing here is an
244+
# error worth showing.
245+
xattr -d com.apple.quarantine "$DLBIN" >/dev/null 2>&1 || true
246+
codesign --sign - --force "$DLBIN" >/dev/null 2>&1 || true
242247
fi
243248

244249
# Verify the candidate before it requests account-wide maintenance. The

‎pkg/go/codebase-memory-mcp‎

-8.43 MB
Binary file not shown.

‎pkg/npm/README.md‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@ High-quality parsing through [tree-sitter](https://tree-sitter.github.io/tree-si
1515
npm install -g codebase-memory-mcp
1616
```
1717

18-
The standard runtime set for your platform is downloaded automatically at install time. To select the UI runtime set and its verified frontend pack, set `CBM_VARIANT=ui` while installing and when invoking the wrapper:
19-
20-
```bash
21-
CBM_VARIANT=ui npm install -g codebase-memory-mcp
22-
```
18+
The runtime set for your platform is downloaded automatically at install time. There is one composition per platform and the graph UI is always included — the former `CBM_VARIANT=ui` opt-in is obsolete.
2319

2420
Then configure your coding agents:
2521

‎pkg/npm/install.js‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -580,14 +580,13 @@ async function main() {
580580
// dynamically links glibc 2.38+ and fails on older distros. macOS/Windows
581581
// have no such variant. Keep in sync with install.sh / pypi _cli.py / cli.c.
582582
const variant = platform === 'linux' ? '-portable' : '';
583-
// Opt into the UI build (embedded graph visualization) with CBM_VARIANT=ui.
584-
// Default is the standard (headless) build. Mirrors install.sh --ui.
585-
const ui = (process.env.CBM_VARIANT || '').toLowerCase() === 'ui' ? 'ui-' : '';
586-
const archive = `codebase-memory-mcp-${ui}${platform}-${arch}${variant}.${ext}`;
583+
// No UI/standard split since v0.10.0: one archive per platform, graph UI
584+
// always embedded. The old CBM_VARIANT=ui opt-in pointed at ui-* archives
585+
// that no longer exist, so honoring it could only 404 (#1538).
586+
const archive = `codebase-memory-mcp-${platform}-${arch}${variant}.${ext}`;
587587
const url = `https://github.com/${REPO}/releases/download/v${VERSION}/${archive}`;
588588

589-
const uiLabel = ui ? '(ui) ' : '';
590-
process.stdout.write(`codebase-memory-mcp: downloading v${VERSION} ${uiLabel}for ${platform}/${arch}...\n`);
589+
process.stdout.write(`codebase-memory-mcp: downloading v${VERSION} for ${platform}/${arch}...\n`);
591590

592591
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cbm-install-'));
593592
const tmpArchive = path.join(tmpDir, `cbm.${ext}`);

‎pkg/pypi/README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mcp-name: io.github.DeusData/codebase-memory-mcp
44

55
**Fast code intelligence engine for AI coding agents.** Indexes an average repository in milliseconds, the Linux kernel (28M LOC) in 3 minutes. Answers structural queries in under 1ms.
66

7-
This Python wrapper downloads the selected `codebase-memory-mcp` runtime set from [GitHub Releases](https://github.com/DeusData/codebase-memory-mcp/releases) on first run and verifies it before publishing it in your OS cache directory. The standard set contains the native executable and authenticated integration asset; `CBM_VARIANT=ui` additionally selects the content-addressed UI pack.
7+
This Python wrapper downloads the selected `codebase-memory-mcp` runtime set from [GitHub Releases](https://github.com/DeusData/codebase-memory-mcp/releases) on first run and verifies it before publishing it in your OS cache directory. The set contains the native executable and authenticated integration asset, with the graph UI always embedded.
88

99
## Installation
1010

@@ -14,7 +14,7 @@ pip install codebase-memory-mcp
1414
pipx install codebase-memory-mcp
1515
```
1616

17-
To use the UI variant, set `CBM_VARIANT=ui` when invoking the wrapper (and consistently for any package-managed update or reinstall).
17+
There is one composition per platform: the graph UI ships in every build, so no variant selection is needed.
1818

1919
## Usage
2020

0 commit comments

Comments
 (0)