Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,7 @@ reference/*
!reference/textutil-manpage.txt
.spectra/
openspec/.vector-search.db*

# Plugin-scoped binary cache (#117) — downloaded MCP binaries + version sidecars
plugins/.bin-cache/
plugins/*/.bin-cache/
2 changes: 1 addition & 1 deletion plugins/che-pdf-mcp/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "che-pdf-mcp",
"description": "PDF 文件處理 MCP server — PDFKit 解析與文字提取、Vision OCR(原生 macOS)、圖片/區域擷取、亂碼區域偵測。 v0.1.0: 首次 marketplace 發布。",
"version": "0.1.1",
"version": "0.1.2",
"binary_version": "0.1.0",
"author": {
"name": "Che Cheng"
Expand Down
6 changes: 6 additions & 0 deletions plugins/che-pdf-mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ All notable changes to the che-pdf-mcp plugin shell will be documented in this f

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [0.1.2] - 2026-07-02

### Changed

- **Plugin-scoped 安裝目錄(PsychQuant/macdoc#117)**:binary 與 sidecar 從共享 `~/bin/` 遷至 **plugin 層級**的 `.bin-cache/`(`<marketplace>/<plugin>/.bin-cache/`,即 version 目錄的上一層)— 跨 marketplace / 跨 plugin 碰撞 by construction 不可能,且跨 shell 版本持久(保留 #116 sidecar 短路,shell-only bump 不重下載;binary_version 變更才重下載)。舊 `~/bin` 副本不主動刪除(可能為使用者手動安裝),首次啟動 stderr 註記一次。

## [0.1.1] - 2026-07-02

### Changed
Expand Down
2 changes: 1 addition & 1 deletion plugins/che-pdf-mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ claude plugin marketplace add PsychQuant/macdoc
claude plugin install che-pdf-mcp@macdoc
```

Wrapper 會自動從 [GitHub Releases](https://github.com/PsychQuant/che-pdf-mcp/releases) 下載 release 的 `ChePDFMCP` universal binary 到 `~/bin/`,安裝前與每次啟動時強制驗證 sha256(安裝時)與 Developer ID Application 簽章鏈(Team `6W377FS7BS`)。release 流程含 Apple notarization(wrapper 不重複檢查 notarization)。
Wrapper 會自動從 [GitHub Releases](https://github.com/PsychQuant/che-pdf-mcp/releases) 下載 release 的 `ChePDFMCP` universal binary 到 plugin 層級的 `.bin-cache/`(跨 marketplace 隔離、跨版本持久),安裝前與每次啟動時強制驗證 sha256(安裝時)與 Developer ID Application 簽章鏈(Team `6W377FS7BS`)。release 流程含 Apple notarization(wrapper 不重複檢查 notarization)。

## 原始碼

Expand Down
24 changes: 20 additions & 4 deletions plugins/che-pdf-mcp/bin/che-pdf-mcp-wrapper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#
# Design:
# - Reads desired version from plugin.json (plugin's intended binary version)
# - Compares against ~/bin/.ChePDFMCP.version sidecar
# - Compares against the plugin-level .bin-cache/.ChePDFMCP.version sidecar
# - Re-downloads when plugin has been updated but binary is stale
# - Unique temp file (mktemp, same fs) + atomic mv so partial downloads never break things
# - Pinned version does NOT fall back to releases/latest (supply-chain pinning);
Expand All @@ -24,16 +24,32 @@ set -u

REPO="PsychQuant/che-pdf-mcp"
BINARY_NAME="ChePDFMCP"
INSTALL_DIR="$HOME/bin"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"
SCRIPT_ARGS=("$@")

# Locate plugin root via wrapper's own path (more reliable than $CLAUDE_PLUGIN_ROOT
# which isn't guaranteed in MCP spawn env). Wrapper lives at PLUGIN_ROOT/bin/*.sh.
PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PLUGIN_JSON="$PLUGIN_ROOT/.claude-plugin/plugin.json"

# Plugin-scoped install dir (#117): the binary lives at the PLUGIN level —
# one dir ABOVE the version-scoped PLUGIN_ROOT (cache layout is
# <marketplace>/<plugin>/<version>/). Cross-marketplace and cross-plugin
# same-name collisions stay impossible by construction (marketplace + plugin
# are both in the path), while the binary + sidecar PERSIST across shell-only
# version bumps — preserving the #116 sidecar short-circuit (verify DA-1:
# a version-scoped cache re-downloaded 14-26MB on every shell bump and
# multiplied disk per retained version dir). In a git-checkout dev context the
# parent is plugins/, where BINARY_NAME scoping keeps copies distinct. The
# legacy shared ~/bin/<BinaryName> copy, if any, is left alone — it may be a
# user's manual install.
INSTALL_DIR="$(dirname "$PLUGIN_ROOT")/.bin-cache"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"

if [[ -x "$HOME/bin/$BINARY_NAME" ]] && [[ ! -x "$BINARY" ]]; then
echo "$BINARY_NAME: note — legacy copy at ~/bin/$BINARY_NAME is no longer used by this plugin (now plugin-scoped); left untouched" >&2
fi

verify_binary() {
# Developer ID Application (marker OIDs) + Team OU pin. Runs on every
# candidate before exec — download-time AND exec-time (#112 verify R2:
Expand Down
2 changes: 1 addition & 1 deletion plugins/che-pptx-mcp/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "che-pptx-mcp",
"description": "PowerPoint (.pptx) MCP server — PresentationML 解析與生成:slides、shapes、tables、notes、theme、markdown 匯出。 v0.1.0: 首次 marketplace 發布。",
"version": "0.1.1",
"version": "0.1.2",
"binary_version": "0.1.0",
"author": {
"name": "Che Cheng"
Expand Down
6 changes: 6 additions & 0 deletions plugins/che-pptx-mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ All notable changes to the che-pptx-mcp plugin shell will be documented in this

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [0.1.2] - 2026-07-02

### Changed

- **Plugin-scoped 安裝目錄(PsychQuant/macdoc#117)**:binary 與 sidecar 從共享 `~/bin/` 遷至 **plugin 層級**的 `.bin-cache/`(`<marketplace>/<plugin>/.bin-cache/`,即 version 目錄的上一層)— 跨 marketplace / 跨 plugin 碰撞 by construction 不可能,且跨 shell 版本持久(保留 #116 sidecar 短路,shell-only bump 不重下載;binary_version 變更才重下載)。舊 `~/bin` 副本不主動刪除(可能為使用者手動安裝),首次啟動 stderr 註記一次。

## [0.1.1] - 2026-07-02

### Changed
Expand Down
2 changes: 1 addition & 1 deletion plugins/che-pptx-mcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ claude plugin marketplace add PsychQuant/macdoc
claude plugin install che-pptx-mcp@macdoc
```

Wrapper 會自動從 [GitHub Releases](https://github.com/PsychQuant/che-pptx-mcp/releases) 下載 release 的 `ChePPTXMCP` universal binary 到 `~/bin/`,安裝前與每次啟動時強制驗證 sha256(安裝時)與 Developer ID Application 簽章鏈(Team `6W377FS7BS`)。release 流程含 Apple notarization(wrapper 不重複檢查 notarization)。
Wrapper 會自動從 [GitHub Releases](https://github.com/PsychQuant/che-pptx-mcp/releases) 下載 release 的 `ChePPTXMCP` universal binary 到 plugin 層級的 `.bin-cache/`(跨 marketplace 隔離、跨版本持久),安裝前與每次啟動時強制驗證 sha256(安裝時)與 Developer ID Application 簽章鏈(Team `6W377FS7BS`)。release 流程含 Apple notarization(wrapper 不重複檢查 notarization)。

## 原始碼

Expand Down
24 changes: 20 additions & 4 deletions plugins/che-pptx-mcp/bin/che-pptx-mcp-wrapper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#
# Design:
# - Reads desired version from plugin.json (plugin's intended binary version)
# - Compares against ~/bin/.ChePPTXMCP.version sidecar
# - Compares against the plugin-level .bin-cache/.ChePPTXMCP.version sidecar
# - Re-downloads when plugin has been updated but binary is stale
# - Unique temp file (mktemp, same fs) + atomic mv so partial downloads never break things
# - Pinned version does NOT fall back to releases/latest (supply-chain pinning);
Expand All @@ -24,16 +24,32 @@ set -u

REPO="PsychQuant/che-pptx-mcp"
BINARY_NAME="ChePPTXMCP"
INSTALL_DIR="$HOME/bin"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"
SCRIPT_ARGS=("$@")

# Locate plugin root via wrapper's own path (more reliable than $CLAUDE_PLUGIN_ROOT
# which isn't guaranteed in MCP spawn env). Wrapper lives at PLUGIN_ROOT/bin/*.sh.
PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PLUGIN_JSON="$PLUGIN_ROOT/.claude-plugin/plugin.json"

# Plugin-scoped install dir (#117): the binary lives at the PLUGIN level —
# one dir ABOVE the version-scoped PLUGIN_ROOT (cache layout is
# <marketplace>/<plugin>/<version>/). Cross-marketplace and cross-plugin
# same-name collisions stay impossible by construction (marketplace + plugin
# are both in the path), while the binary + sidecar PERSIST across shell-only
# version bumps — preserving the #116 sidecar short-circuit (verify DA-1:
# a version-scoped cache re-downloaded 14-26MB on every shell bump and
# multiplied disk per retained version dir). In a git-checkout dev context the
# parent is plugins/, where BINARY_NAME scoping keeps copies distinct. The
# legacy shared ~/bin/<BinaryName> copy, if any, is left alone — it may be a
# user's manual install.
INSTALL_DIR="$(dirname "$PLUGIN_ROOT")/.bin-cache"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"

if [[ -x "$HOME/bin/$BINARY_NAME" ]] && [[ ! -x "$BINARY" ]]; then
echo "$BINARY_NAME: note — legacy copy at ~/bin/$BINARY_NAME is no longer used by this plugin (now plugin-scoped); left untouched" >&2
fi

verify_binary() {
# Developer ID Application (marker OIDs) + Team OU pin. Runs on every
# candidate before exec — download-time AND exec-time (#112 verify R2:
Expand Down
2 changes: 1 addition & 1 deletion plugins/che-word-mcp/.claude-plugin/plugin.json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions plugins/che-word-mcp/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
> `plugin.json` description field. Section categorization is best-effort —
> review and refine `Added` / `Changed` / `Fixed` etc. as needed.

## [3.20.2] - 2026-07-02

### Changed

- **Plugin-scoped 安裝目錄(PsychQuant/macdoc#117)**:binary 與 sidecar 從共享 `~/bin/` 遷至 **plugin 層級**的 `.bin-cache/`(`<marketplace>/<plugin>/.bin-cache/`,即 version 目錄的上一層)— 跨 marketplace / 跨 plugin 碰撞 by construction 不可能,且跨 shell 版本持久(保留 #116 sidecar 短路,shell-only bump 不重下載;binary_version 變更才重下載)。舊 `~/bin` 副本不主動刪除(可能為使用者手動安裝),首次啟動 stderr 註記一次。

## [3.20.1] - 2026-07-02

### Security
Expand Down
24 changes: 20 additions & 4 deletions plugins/che-word-mcp/bin/che-word-mcp-wrapper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#
# Design:
# - Reads desired version from plugin.json (plugin's intended binary version)
# - Compares against ~/bin/.CheWordMCP.version sidecar
# - Compares against the plugin-level .bin-cache/.CheWordMCP.version sidecar
# - Re-downloads when plugin has been updated but binary is stale
# - Unique temp file (mktemp, same fs) + atomic mv so partial downloads never break things
# - Pinned version does NOT fall back to releases/latest (supply-chain pinning);
Expand All @@ -24,16 +24,32 @@ set -u

REPO="PsychQuant/che-word-mcp"
BINARY_NAME="CheWordMCP"
INSTALL_DIR="$HOME/bin"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"
SCRIPT_ARGS=("$@")

# Locate plugin root via wrapper's own path (more reliable than $CLAUDE_PLUGIN_ROOT
# which isn't guaranteed in MCP spawn env). Wrapper lives at PLUGIN_ROOT/bin/*.sh.
PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PLUGIN_JSON="$PLUGIN_ROOT/.claude-plugin/plugin.json"

# Plugin-scoped install dir (#117): the binary lives at the PLUGIN level —
# one dir ABOVE the version-scoped PLUGIN_ROOT (cache layout is
# <marketplace>/<plugin>/<version>/). Cross-marketplace and cross-plugin
# same-name collisions stay impossible by construction (marketplace + plugin
# are both in the path), while the binary + sidecar PERSIST across shell-only
# version bumps — preserving the #116 sidecar short-circuit (verify DA-1:
# a version-scoped cache re-downloaded 14-26MB on every shell bump and
# multiplied disk per retained version dir). In a git-checkout dev context the
# parent is plugins/, where BINARY_NAME scoping keeps copies distinct. The
# legacy shared ~/bin/<BinaryName> copy, if any, is left alone — it may be a
# user's manual install.
INSTALL_DIR="$(dirname "$PLUGIN_ROOT")/.bin-cache"
BINARY="$INSTALL_DIR/$BINARY_NAME"
VERSION_FILE="$INSTALL_DIR/.${BINARY_NAME}.version"

if [[ -x "$HOME/bin/$BINARY_NAME" ]] && [[ ! -x "$BINARY" ]]; then
echo "$BINARY_NAME: note — legacy copy at ~/bin/$BINARY_NAME is no longer used by this plugin (now plugin-scoped); left untouched" >&2
fi

verify_binary() {
# Developer ID Application (marker OIDs) + Team OU pin. Runs on every
# candidate before exec — download-time AND exec-time (#112 verify R2:
Expand Down