@jhizzard/termdeck 0.9.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/client/public/app.js +42 -3
- package/packages/client/public/graph.html +104 -0
- package/packages/client/public/graph.js +683 -0
- package/packages/client/public/index.html +1 -0
- package/packages/client/public/style.css +427 -0
- package/packages/server/src/flashback-diag.js +51 -0
- package/packages/server/src/graph-routes.js +555 -0
- package/packages/server/src/index.js +83 -3
- package/packages/server/src/mnestra-bridge/index.js +63 -9
- package/packages/server/src/preflight.js +82 -0
- package/packages/server/src/rag.js +138 -0
- package/packages/server/src/session.js +95 -5
- package/packages/server/src/setup/mnestra-migrations/009_memory_relationship_metadata.sql +126 -0
- package/packages/server/src/setup/mnestra-migrations/010_memory_recall_graph.sql +147 -0
- package/packages/server/src/setup/mnestra-migrations/011_project_tag_backfill.sql +237 -0
- package/packages/server/src/setup/rumen/migrations/003_graph_inference_schedule.sql +49 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jhizzard/termdeck",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Browser-based terminal multiplexer with metadata overlays, panel flashback memory recall, and AI-aware session management",
|
|
5
5
|
"bin": {
|
|
6
6
|
"termdeck": "./packages/cli/src/index.js"
|
|
@@ -237,6 +237,9 @@
|
|
|
237
237
|
case 'meta':
|
|
238
238
|
updatePanelMeta(id, msg.session.meta);
|
|
239
239
|
break;
|
|
240
|
+
case 'proactive_memory':
|
|
241
|
+
showProactiveToast(id, msg.hit);
|
|
242
|
+
break;
|
|
240
243
|
case 'exit':
|
|
241
244
|
updatePanelMeta(id, {
|
|
242
245
|
status: 'exited',
|
|
@@ -1245,6 +1248,9 @@
|
|
|
1245
1248
|
case 'meta':
|
|
1246
1249
|
updatePanelMeta(id, msg.session.meta);
|
|
1247
1250
|
break;
|
|
1251
|
+
case 'proactive_memory':
|
|
1252
|
+
showProactiveToast(id, msg.hit);
|
|
1253
|
+
break;
|
|
1248
1254
|
case 'exit':
|
|
1249
1255
|
updatePanelMeta(id, { status: 'exited', statusDetail: `Exited (${msg.exitCode})` });
|
|
1250
1256
|
const p = document.getElementById(`panel-${id}`);
|
|
@@ -1253,6 +1259,17 @@
|
|
|
1253
1259
|
case 'status_broadcast':
|
|
1254
1260
|
updateGlobalStats(msg.sessions);
|
|
1255
1261
|
break;
|
|
1262
|
+
case 'config_changed':
|
|
1263
|
+
// Sprint 40 T1: parity with the main panel WS handler. The
|
|
1264
|
+
// server broadcasts config_changed to ALL ws clients, including
|
|
1265
|
+
// reconnected sessions; previously the reconnect path silently
|
|
1266
|
+
// dropped these. Idempotent — safe to re-receive.
|
|
1267
|
+
if (msg.config) {
|
|
1268
|
+
state.config = { ...state.config, ...msg.config };
|
|
1269
|
+
if (typeof renderSettingsPanel === 'function') renderSettingsPanel();
|
|
1270
|
+
if (typeof updateRagIndicator === 'function') updateRagIndicator();
|
|
1271
|
+
}
|
|
1272
|
+
break;
|
|
1256
1273
|
}
|
|
1257
1274
|
} catch (err) { console.error('[client] reconnect ws message failed:', err); }
|
|
1258
1275
|
};
|
|
@@ -2509,12 +2526,29 @@
|
|
|
2509
2526
|
{
|
|
2510
2527
|
targets: ['#btn-status', '#btn-config'],
|
|
2511
2528
|
title: 'Status and config',
|
|
2512
|
-
body: `<strong>status</strong> opens a global-metrics modal (session counts by state, RAG mode, memory bridge). <strong>config</strong> shows your loaded project list and theme defaults
|
|
2529
|
+
body: `<strong>status</strong> opens a global-metrics modal (session counts by state, RAG mode, memory bridge). <strong>config</strong> shows your loaded project list and theme defaults — plus a live RAG-mode toggle (Sprint 36) that flips Flashback on/off without a server restart.`,
|
|
2530
|
+
},
|
|
2531
|
+
{
|
|
2532
|
+
targets: ['#btn-sprint', '#btn-graph'],
|
|
2533
|
+
title: 'Sprint runner and knowledge graph',
|
|
2534
|
+
body: `<strong>sprint</strong> opens the in-dashboard 4+1 sprint runner (Sprint 37): name the sprint, define T1–T4 lane goals, click kick off — TermDeck spawns four panels and injects boot prompts via the two-stage submit pattern automatically. Optional <strong>--isolation=worktree</strong> creates a git worktree per lane so concurrent edits can't stomp. <strong>graph</strong> opens the D3.js force-directed knowledge graph (Sprint 38) of your memory_items + memory_relationships in a new tab — click any node to open its memory in a drawer, filter by relationship type, search, zoom/pan.`,
|
|
2513
2535
|
},
|
|
2514
2536
|
{
|
|
2515
2537
|
targets: ['#btn-how', '#btn-help'],
|
|
2516
2538
|
title: 'How this works and help',
|
|
2517
|
-
body: `Click <strong>how this works</strong> any time to replay this tour. <strong>help</strong> opens the full TermDeck documentation in a new tab.`,
|
|
2539
|
+
body: `Click <strong>how this works</strong> any time to replay this tour. <strong>help</strong> opens the full TermDeck documentation in a new tab. The <strong>📖 Guide</strong> tab on the right edge of the screen — also opens with the <kbd>g</kbd> keyboard shortcut — is the always-on Orchestrator Guide (Sprint 37): nine sections covering the 4+1 sprint pattern, inject mandate, CLAUDE.md hierarchy, memory-first discipline, sprint discipline, restart-prompt rituals, scaffolding files, channel inject patterns. Search built in.`,
|
|
2540
|
+
},
|
|
2541
|
+
{
|
|
2542
|
+
target: '#guideRail',
|
|
2543
|
+
title: 'Right-rail Orchestrator Guide',
|
|
2544
|
+
body: `The <strong>📖 Guide</strong> rail is your orchestration cheat-sheet — collapsed by default, one click (or <kbd>g</kbd>) to expand. It auto-scrolls to the relevant section based on what you're focused on: clicking a terminal panel jumps the Guide to the 4+1 pattern; opening the project drawer jumps to CLAUDE.md hierarchy. Useful when you forget exactly how the two-stage submit pattern works at 2 AM in the middle of a sprint inject.`,
|
|
2545
|
+
fallback: '#btn-how',
|
|
2546
|
+
},
|
|
2547
|
+
{
|
|
2548
|
+
target: '#btnPreviewProject',
|
|
2549
|
+
title: 'Orchestration preview',
|
|
2550
|
+
body: `The <strong>preview</strong> button next to the project + button (Sprint 37) shows you exactly what <code>termdeck init --project <name></code> would create for the selected project — file tree, contents per file, expand-on-click. Read-only by default; optional generate button writes the scaffolding (CLAUDE.md, CONTRADICTIONS.md, project_facts.md, .claude/settings.json, docs/orchestration/, RESTART-PROMPT.md template). Lets you see-before-commit instead of running the CLI blind.`,
|
|
2551
|
+
fallback: '#btn-how',
|
|
2518
2552
|
},
|
|
2519
2553
|
{
|
|
2520
2554
|
target: '.panel-header',
|
|
@@ -2553,10 +2587,15 @@
|
|
|
2553
2587
|
title: 'Prompt bar',
|
|
2554
2588
|
body: `Type any command here to launch it as a new terminal — <kbd>claude code ~/myproject</kbd>, <kbd>python3 manage.py runserver</kbd>, <kbd>npm run dev</kbd>. Pick a project from the dropdown to auto-cd into its path and apply its default theme. <kbd>Ctrl+Shift+N</kbd> focuses this bar from anywhere.`,
|
|
2555
2589
|
},
|
|
2590
|
+
{
|
|
2591
|
+
target: null,
|
|
2592
|
+
title: 'Knowledge graph + memory inference',
|
|
2593
|
+
body: `Sprint 38 brought your <strong>memory_relationships</strong> table to life. The <strong>graph</strong> button (top toolbar) renders your memories as a force-directed network — supersedes / relates_to / contradicts / elaborates / caused_by / blocks / inspired_by / cross_project_link edges, color-coded, filterable. The Mnestra MCP server now exposes four new tools: <code>memory_link</code>, <code>memory_unlink</code>, <code>memory_related</code>, and <code>memory_recall_graph</code> — Claude Code can connect related memories explicitly, traverse N-hop neighborhoods, and recall via graph-aware re-ranking (vector_score × edge_weight × recency). Edges populate automatically from Joshua's private rag-system classifier; a nightly cron in Sprint 39+ will surface cross-project connections.`,
|
|
2594
|
+
},
|
|
2556
2595
|
{
|
|
2557
2596
|
target: null,
|
|
2558
2597
|
title: 'You are ready.',
|
|
2559
|
-
body: `That's every major surface. Click <strong>how this works</strong> in the top toolbar to replay this walkthrough. <strong>help</strong> opens the full docs. Questions, bugs, feedback: <a href="https://github.com/jhizzard/termdeck/issues" target="_blank" style="color:var(--tg-accent)">github.com/jhizzard/termdeck/issues</a>. Now launch something.`,
|
|
2598
|
+
body: `That's every major surface. Click <strong>how this works</strong> in the top toolbar to replay this walkthrough. <strong>help</strong> opens the full docs. Press <kbd>g</kbd> any time to crack open the Orchestrator Guide. Questions, bugs, feedback: <a href="https://github.com/jhizzard/termdeck/issues" target="_blank" style="color:var(--tg-accent)">github.com/jhizzard/termdeck/issues</a>. Now launch something.`,
|
|
2560
2599
|
},
|
|
2561
2600
|
];
|
|
2562
2601
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>TermDeck · Knowledge Graph</title>
|
|
7
|
+
<link rel="stylesheet" href="style.css">
|
|
8
|
+
</head>
|
|
9
|
+
<body class="graph-page">
|
|
10
|
+
|
|
11
|
+
<header class="graph-topbar" id="graphTopbar">
|
|
12
|
+
<div class="graph-tb-left">
|
|
13
|
+
<a class="graph-tb-back" href="/" title="Back to dashboard" aria-label="Back to dashboard">
|
|
14
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
15
|
+
<path d="M10 12L6 8l4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
16
|
+
</svg>
|
|
17
|
+
TermDeck
|
|
18
|
+
</a>
|
|
19
|
+
<span class="graph-tb-divider">/</span>
|
|
20
|
+
<span class="graph-tb-title">Knowledge Graph</span>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="graph-tb-controls">
|
|
24
|
+
<label class="graph-tb-control">
|
|
25
|
+
<span>Project</span>
|
|
26
|
+
<select id="graphProject"></select>
|
|
27
|
+
</label>
|
|
28
|
+
<label class="graph-tb-control graph-tb-search-wrap">
|
|
29
|
+
<span>Search</span>
|
|
30
|
+
<input type="search" id="graphSearch" placeholder="content, category…" autocomplete="off" spellcheck="false">
|
|
31
|
+
</label>
|
|
32
|
+
<button type="button" class="graph-tb-btn" id="graphReheat" title="Re-heat the simulation">re-heat</button>
|
|
33
|
+
<button type="button" class="graph-tb-btn" id="graphFit" title="Frame the full graph">fit</button>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<div class="graph-tb-right">
|
|
37
|
+
<span class="graph-tb-stat" id="graphStatNodes">— nodes</span>
|
|
38
|
+
<span class="graph-tb-stat" id="graphStatEdges">— edges</span>
|
|
39
|
+
<span class="graph-tb-stat" id="graphStatProject">project</span>
|
|
40
|
+
</div>
|
|
41
|
+
</header>
|
|
42
|
+
|
|
43
|
+
<div class="graph-filters" id="graphFilters" role="toolbar" aria-label="Edge type filters"></div>
|
|
44
|
+
|
|
45
|
+
<main class="graph-stage" id="graphStage">
|
|
46
|
+
<div class="graph-loading" id="graphLoading">
|
|
47
|
+
<div class="graph-loading-spinner" aria-hidden="true"></div>
|
|
48
|
+
<p id="graphLoadingMsg">Loading graph…</p>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<div class="graph-empty" id="graphEmpty" hidden>
|
|
52
|
+
<h3 id="graphEmptyTitle">No memories yet</h3>
|
|
53
|
+
<p id="graphEmptyBody">This project has no <code>memory_items</code> rows. Run a Claude Code session in this project; the session-end hook will populate Mnestra and edges will be inferred on the next nightly cron.</p>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<svg class="graph-svg" id="graphSvg" role="img" aria-label="Force-directed knowledge graph">
|
|
57
|
+
<defs>
|
|
58
|
+
<radialGradient id="graphBgGrad" cx="50%" cy="50%" r="75%">
|
|
59
|
+
<stop offset="0%" stop-color="#1a1f2e" />
|
|
60
|
+
<stop offset="100%" stop-color="#0a0c12" />
|
|
61
|
+
</radialGradient>
|
|
62
|
+
<filter id="nodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
|
63
|
+
<feGaussianBlur stdDeviation="2.5" result="blur"/>
|
|
64
|
+
<feMerge>
|
|
65
|
+
<feMergeNode in="blur"/>
|
|
66
|
+
<feMergeNode in="SourceGraphic"/>
|
|
67
|
+
</feMerge>
|
|
68
|
+
</filter>
|
|
69
|
+
</defs>
|
|
70
|
+
<rect class="graph-bg" width="100%" height="100%" fill="url(#graphBgGrad)" />
|
|
71
|
+
<g class="graph-zoom-root" id="graphZoomRoot">
|
|
72
|
+
<g class="graph-edges" id="graphEdgesLayer"></g>
|
|
73
|
+
<g class="graph-nodes" id="graphNodesLayer"></g>
|
|
74
|
+
<g class="graph-labels" id="graphLabelsLayer"></g>
|
|
75
|
+
</g>
|
|
76
|
+
</svg>
|
|
77
|
+
|
|
78
|
+
<aside class="graph-drawer" id="graphDrawer" hidden aria-label="Memory detail">
|
|
79
|
+
<header class="graph-drawer-header">
|
|
80
|
+
<div class="gd-h-meta">
|
|
81
|
+
<span class="gd-project" id="gdProject">project</span>
|
|
82
|
+
<span class="gd-source-type" id="gdSourceType">fact</span>
|
|
83
|
+
<span class="gd-created" id="gdCreated">—</span>
|
|
84
|
+
</div>
|
|
85
|
+
<button type="button" class="graph-drawer-close" id="gdClose" aria-label="Close">×</button>
|
|
86
|
+
</header>
|
|
87
|
+
<div class="graph-drawer-body">
|
|
88
|
+
<pre class="gd-content" id="gdContent">—</pre>
|
|
89
|
+
<h4 class="gd-section">Neighbors</h4>
|
|
90
|
+
<div class="gd-neighbors" id="gdNeighbors">—</div>
|
|
91
|
+
</div>
|
|
92
|
+
<footer class="graph-drawer-footer">
|
|
93
|
+
<button type="button" class="graph-drawer-action" id="gdExpand" title="Center the graph on this memory">focus</button>
|
|
94
|
+
<button type="button" class="graph-drawer-action" id="gdCopyId" title="Copy the memory id">copy id</button>
|
|
95
|
+
</footer>
|
|
96
|
+
</aside>
|
|
97
|
+
|
|
98
|
+
<div class="graph-tooltip" id="graphTooltip" hidden></div>
|
|
99
|
+
</main>
|
|
100
|
+
|
|
101
|
+
<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
|
|
102
|
+
<script src="graph.js" defer></script>
|
|
103
|
+
</body>
|
|
104
|
+
</html>
|