Addresses two Greptile findings on #428.
P1 - buildEnv duplicated PYTHONPATH when the parent environment already
set one. POSIX getenv returns the first match, so the user's stale
PYTHONPATH would shadow the engine's cache dir and break
`from lib import ...` with ModuleNotFoundError. buildEnv now filters
any incoming PYTHONPATH= entry before appending the cache dir. Adds
TestRunDropsPreExistingPythonPath (end-to-end through the stub
interpreter) and TestBuildEnvDropsAllPreExistingPythonPath (direct
unit on the helper) to cover the missed case.
P2 - manifest.compatibility.platforms listed "win32" even though the
release matrix doesn't ship a Windows binary; Claude Desktop would
let Windows users start an install with no matching artifact.
Removed until the Windows packaging follow-up lands. Manifest test
renamed to TestPlatformsMatchShippingMatrix and tightened: now
forbids platforms the release CI doesn't build, with a message
pointing at .github/workflows/release.yml.
go test ./... 38 passed across 4 packages.
U3 of the Claude Desktop .mcpb bundle plan.
- internal/engine/run.go invokes python3 with the cached last30days.py,
forwards os.Environ() so MCPB user_config env-injection reaches the
engine, sets PYTHONPATH so the lib/ imports resolve, and surfaces
three distinct error shapes (missing interpreter with install URL,
non-zero exit with stderr, timeout). RunOptions.PythonPath lets tests
inject a stub without manipulating PATH.
- internal/engine/run_test.go drives a shell-script stub interpreter
through happy path, env forwarding, PYTHONPATH, non-zero exit with
stderr surfacing, timeout, missing python3 (empty PATH), missing
last30days.py, empty CacheDir, and timeout-env-override parsing.
- internal/tools/research.go registers a single research tool whose
schema mirrors /last30days <topic> (required topic, optional emit
enum, optional save bool). Validation failures surface as MCP
tool errors so Claude sees structured failures instead of transport
faults; engine extract or run errors fold engine stderr into the
message so users can diagnose without leaving Desktop.
- internal/tools/research_test.go covers requireString, emitArgument,
boolArgument, handler-level validation routing, and formatRunError.
- cmd/last30days-pp-mcp/main.go wires NewMCPServer + tools.Register +
ServeStdio. main.Version is ldflags-stamped at build time and
namespaces the per-user cache. mcp-go pinned at v0.54.0.
Smoke check: ./build/last30days-pp-mcp answers tools/list with the
research tool plus full schema and read-only/open-world annotations.
go test ./... passes across engine + tools (32 cases).