Skip to content
Merged
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
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Changelog

## Unreleased

### Housekeeping

- Removed one-off ASCII-banner dev scripts (`count-ascii.js`, `count-banner.js`, `jspod-ascii.js`, `verify-spacing.js`): referenced nowhere, never published (#75)
- Tracked MCP dev tools (not published to npm) (#75):
- `mcp.js`: minimal Streamable-HTTP MCP client for the local pod
- `refresh-mcp-token.sh`: re-mints a 1h owner token and registers the pod's `/mcp` endpoint as the `jspod` MCP server in Claude Code
- Added this changelog (#75)

## 0.0.50 (2026-11-04)

- Require jss 0.0.225 for the dotfile guard fix (#82)

## 0.0.49 (2026-07-11)

- `--plugin` passthrough to jss, jss 0.0.219, `JSPOD_BROWSER_URL` override
- Seed pod files only if they don't exist, so user edits survive restarts (#81)

## 0.0.48 (2026-06-15)

- **panes**: render bookmark enrichment: summary, tags, hero image (#71, #72)
- **panes**: searchable bookmark collection pane, plus container-pane support (#73, #74)
- `jspod install` delegates to the upstream `jss install` (#78)
- Pass `--body-limit 40MB` and require jss >=0.0.208, so large app installs fit (#80)

## 0.0.47 (2026-06-05)

- Publish `data-browser-panes.js` and `--browser panes`, a pane-aware data browser augmented by local panes (#69, #70)

Earlier releases predate this changelog: see `git log` for history.
31 changes: 0 additions & 31 deletions count-ascii.js

This file was deleted.

28 changes: 0 additions & 28 deletions count-banner.js

This file was deleted.

41 changes: 0 additions & 41 deletions jspod-ascii.js

This file was deleted.

46 changes: 46 additions & 0 deletions mcp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env node
// Minimal MCP (Streamable-HTTP) client for the local jss pod.
// Usage: node mcp.mjs <tool> '<json-args>' | node mcp.mjs --list
const POD = process.env.POD || 'http://localhost:5444';
const U = process.env.POD_USER || 'me', P = process.env.POD_PASS || 'me';

async function token() {
const r = await fetch(`${POD}/idp/credentials`, {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: U, password: P }),
});
const j = await r.json();
if (!j.access_token) throw new Error('auth failed: ' + JSON.stringify(j));
return j.access_token;
}

async function rpc(tok, method, params) {
const r = await fetch(`${POD}/mcp`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${tok}`,
'Content-Type': 'application/json',
'Accept': 'application/json, text/event-stream',
},
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
});
const text = await r.text();
// handle both plain JSON and SSE framing
const line = text.includes('data:') ? text.split('\n').filter(l => l.startsWith('data:')).map(l => l.slice(5).trim()).join('') : text;
return JSON.parse(line);
}

const [, , tool, argstr] = process.argv;
const tok = await token();

if (tool === '--list') {
const r = await rpc(tok, 'tools/list', {});
for (const t of r.result.tools) console.log(`${t.name}\t${(t.description || '').split('\n')[0]}`);
process.exit(0);
}

const args = argstr ? JSON.parse(argstr) : {};
const r = await rpc(tok, 'tools/call', { name: tool, arguments: args });
if (r.error) { console.error('ERR', JSON.stringify(r.error)); process.exit(1); }
const out = r.result?.content?.map(c => c.text ?? JSON.stringify(c)).join('\n') ?? JSON.stringify(r.result);
console.log(out);
21 changes: 21 additions & 0 deletions refresh-mcp-token.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
# Re-mint a 1h owner Bearer token from the local jss IdP and (re)register
# the pod's /mcp endpoint as the "jspod" MCP server in Claude Code.
# Usage: ./refresh-mcp-token.sh
set -euo pipefail

POD="${POD:-http://localhost:5444}"
USER_NAME="${POD_USER:-me}"
PASSWORD="${POD_PASS:-me}"
NAME="${MCP_NAME:-jspod}"

TOKEN=$(curl -s -m 6 "$POD/idp/credentials" \
-H "Content-Type: application/json" \
-d "{\"username\":\"$USER_NAME\",\"password\":\"$PASSWORD\"}" \
| node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const r=JSON.parse(d);if(!r.access_token){console.error("no token: "+d);process.exit(1)}process.stdout.write(r.access_token)})')

claude mcp remove "$NAME" 2>/dev/null || true
claude mcp add --transport http "$NAME" "$POD/mcp" \
--header "Authorization: Bearer $TOKEN"

echo "Refreshed '$NAME' -> $POD/mcp (token valid ~1h)"
20 changes: 0 additions & 20 deletions verify-spacing.js

This file was deleted.