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

## 0.0.48 — 2026-06-11

Changes since 0.0.47 (`a57b66e..`):

### Features

- **panes**: render bookmark enrichment — summary, tags, hero image (#71, #72)
- **panes**: searchable bookmark collection pane + container-pane support (#73, #74)

### 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):
- `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

### Published diff vs 0.0.47

```
data-browser-panes.js | 57 +++++++++++++++------
examples/panes/bookmark-collection.js | 96 +++++++++++++++++++++++++++++++++++
examples/panes/bookmark.js | 82 +++++++++++++++++++++++++-----
3 files changed, 207 insertions(+), 28 deletions(-)
```

## 0.0.47

- Publish `data-browser-panes.js` + `--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);
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jspod",
"version": "0.0.47",
"version": "0.0.48",
"description": "JavaScript Solid Pod - Just works, batteries included",
"type": "module",
"main": "./lib/index.js",
Expand Down
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.