@phren/cli 0.0.18 → 0.0.19

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.
@@ -1,6 +1,6 @@
1
1
  export const cliManifest = {
2
2
  surface: "cli",
3
- version: "0.0.18",
3
+ version: "0.0.19",
4
4
  actions: {
5
5
  // Finding management
6
6
  "finding.add": { implemented: true, handler: "cli-actions.ts:handleAddFinding" },
@@ -1,6 +1,6 @@
1
1
  export const mcpManifest = {
2
2
  surface: "mcp",
3
- version: "0.0.18",
3
+ version: "0.0.19",
4
4
  actions: {
5
5
  // Finding management
6
6
  "finding.add": { implemented: true, handler: "index.ts:add_finding" },
@@ -1,6 +1,6 @@
1
1
  export const vscodeManifest = {
2
2
  surface: "vscode",
3
- version: "0.0.18",
3
+ version: "0.0.19",
4
4
  actions: {
5
5
  // Finding management
6
6
  "finding.add": { implemented: true, handler: "extension.ts:phren.addFinding" },
@@ -1,6 +1,6 @@
1
1
  export const webUiManifest = {
2
2
  surface: "web-ui",
3
- version: "0.0.18",
3
+ version: "0.0.19",
4
4
  actions: {
5
5
  // Finding management
6
6
  "finding.add": { implemented: false, reason: "Web UI is read-only for findings (review queue only)" },
@@ -257,8 +257,8 @@ export function renderGraphScript() {
257
257
  /* ease-in-out via sine curve over the full trip distance */
258
258
  var t = phren.tripDist > 0 ? Math.min(1, phren.tripProgress / phren.tripDist) : 1;
259
259
  var easeInOut = 0.5 - 0.5 * Math.cos(Math.PI * t);
260
- var baseSpeed = Math.max(3, phren.tripDist * 0.12);
261
- var speed = Math.max(1.5, baseSpeed * (0.15 + 0.85 * easeInOut));
260
+ var baseSpeed = Math.max(0.8, phren.tripDist * 0.03);
261
+ var speed = Math.max(0.4, baseSpeed * (0.15 + 0.85 * easeInOut));
262
262
  /* clamp speed to remaining distance — prevents overshoot oscillation */
263
263
  if (speed >= dist) {
264
264
  phren.x = wx;
@@ -338,10 +338,10 @@ export function renderGraphScript() {
338
338
  /* sprite rendering */
339
339
  if (phrenImgReady) {
340
340
  ctx.save();
341
- /* fixed 48px size in screen pixels, scale up to 56px on arrival flash */
342
- var spriteScreenSize = 48;
341
+ /* scale-aware sprite: 32px at default zoom, shrinks when zoomed out, caps at 40px */
342
+ var spriteScreenSize = Math.min(40, Math.max(16, 32 * Math.sqrt(scale)));
343
343
  if (phren.arriving && phren.arriveTimer < 0.4) {
344
- spriteScreenSize = 48 + 8 * (1 - phren.arriveTimer / 0.4);
344
+ spriteScreenSize += 6 * (1 - phren.arriveTimer / 0.4);
345
345
  }
346
346
  var spriteSize = spriteScreenSize * s; /* convert to graph coords */
347
347
  /* bob up/down when walking — sine wave synced to walk progress */
@@ -366,18 +366,7 @@ export function renderGraphScript() {
366
366
  ctx.translate(-px, -py);
367
367
  }
368
368
  ctx.drawImage(phrenImg, px - spriteSize / 2, py - spriteSize / 2 + totalYOffset, spriteSize, spriteSize);
369
- /* arrival flash: cyan glow ring */
370
- if (phren.arriving && phren.arriveTimer < 0.6) {
371
- var ringAlpha = 0.6 * (1 - phren.arriveTimer / 0.6);
372
- ctx.beginPath();
373
- ctx.arc(px, py + totalYOffset, spriteSize * 0.55, 0, Math.PI * 2);
374
- ctx.strokeStyle = 'rgba(0,229,255,' + ringAlpha + ')';
375
- ctx.lineWidth = 2 * s;
376
- ctx.shadowColor = 'rgba(0,229,255,' + (ringAlpha * 0.5) + ')';
377
- ctx.shadowBlur = 8;
378
- ctx.stroke();
379
- ctx.shadowBlur = 0;
380
- }
369
+ /* no glow ring — phren stands clean next to the node */
381
370
  ctx.restore();
382
371
  }
383
372
  }
@@ -1362,9 +1351,10 @@ export function renderGraphScript() {
1362
1351
  /* ── detail panel ───────────────────────────────────────────────────── */
1363
1352
  function renderGraphDetails(node) {
1364
1353
  selectedNode = node;
1365
- /* phren moves toward the selected node, following graph edges when possible */
1354
+ /* phren moves toward the selected node, stopping just beside it (not on top) */
1366
1355
  if (node && typeof node.x === 'number' && typeof node.y === 'number') {
1367
- phrenMoveTo(node.x, node.y, node);
1356
+ var nr = nodeRadius(node) + 12; /* offset by node radius + margin */
1357
+ phrenMoveTo(node.x + nr, node.y - nr * 0.5, node);
1368
1358
  }
1369
1359
  /* fire external callback so VS Code extension can react to selection */
1370
1360
  if (_nodeSelectCb && node) {
@@ -96,7 +96,7 @@ ${TASK_UI_STYLES}
96
96
  </label>
97
97
  <span id="review-filter-count" class="text-muted" style="font-size:var(--text-sm);margin-left:auto"></span>
98
98
  <label id="review-select-all" style="display:none;align-items:center;gap:6px;font-size:var(--text-sm);color:var(--muted);cursor:pointer;user-select:none">
99
- <input type="checkbox" onchange="toggleSelectAll(this.checked)" style="width:14px;height:14px;cursor:pointer;accent-color:var(--accent)" />
99
+ <input type="checkbox" id="review-select-all-cb" style="width:14px;height:14px;cursor:pointer;accent-color:var(--accent)" />
100
100
  Select all
101
101
  </label>
102
102
  <span id="review-sync-status" class="review-sync-dot" title="Sync status">
@@ -106,9 +106,9 @@ ${TASK_UI_STYLES}
106
106
 
107
107
  <div id="batch-bar" class="batch-bar">
108
108
  <span id="batch-count" class="batch-bar-count"></span>
109
- <button class="btn btn-sm btn-approve" onclick="batchAction('approve')">Approve selected</button>
110
- <button class="btn btn-sm btn-reject" onclick="batchAction('reject')">Reject selected</button>
111
- <button class="btn btn-sm" onclick="clearBatchSelection()">Clear</button>
109
+ <button class="btn btn-sm btn-approve" data-batch-action="approve">Approve selected</button>
110
+ <button class="btn btn-sm btn-reject" data-batch-action="reject">Reject selected</button>
111
+ <button class="btn btn-sm" data-batch-action="clear">Clear</button>
112
112
  </div>
113
113
 
114
114
  <div class="review-cards" id="review-cards-list">
@@ -320,10 +320,10 @@ ${renderSkillUiEnhancementScript(h(authToken || ""))}
320
320
  ${renderProjectReferenceEnhancementScript(h(authToken || ""))}
321
321
  </script>
322
322
  <script${nonceAttr}>
323
- ${renderTasksAndSettingsScript(h(authToken || ""))}
323
+ ${renderTasksAndSettingsScript(authToken || "")}
324
324
  </script>
325
325
  <script${nonceAttr}>
326
- ${renderSearchScript(h(authToken || ""))}
326
+ ${renderSearchScript(authToken || "")}
327
327
  </script>
328
328
  <script${nonceAttr}>
329
329
  ${renderEventWiringScript()}
@@ -592,8 +592,9 @@ export function renderReviewQueueEditSyncScript() {
592
592
  return "";
593
593
  }
594
594
  export function renderTasksAndSettingsScript(authToken) {
595
+ const safeToken = JSON.stringify(authToken).slice(1, -1);
595
596
  return `(function() {
596
- var _tsAuthToken = '${authToken}';
597
+ var _tsAuthToken = '${safeToken}';
597
598
  var _allTasks = [];
598
599
  var esc = window._phrenEsc;
599
600
 
@@ -1595,6 +1596,21 @@ export function renderEventWiringScript() {
1595
1596
  var highlightBtn = document.getElementById('highlight-only-btn');
1596
1597
  if (highlightBtn) highlightBtn.addEventListener('change', function() { filterReviewCards(); });
1597
1598
 
1599
+ var selectAllCb = document.getElementById('review-select-all-cb');
1600
+ if (selectAllCb) selectAllCb.addEventListener('change', function() { toggleSelectAll(this.checked); });
1601
+
1602
+ // Batch bar buttons
1603
+ document.addEventListener('click', function(e) {
1604
+ var target = e.target;
1605
+ if (!target || typeof target.closest !== 'function') return;
1606
+ var actionEl = target.closest('[data-batch-action]');
1607
+ if (!actionEl) return;
1608
+ var action = actionEl.getAttribute('data-batch-action');
1609
+ if (action === 'approve') { batchAction('approve'); }
1610
+ else if (action === 'reject') { batchAction('reject'); }
1611
+ else if (action === 'clear') { clearBatchSelection(); }
1612
+ });
1613
+
1598
1614
  // --- Graph controls ---
1599
1615
  var graphZoomIn = document.getElementById('graph-zoom-in');
1600
1616
  if (graphZoomIn) graphZoomIn.addEventListener('click', function() { graphZoom(1.2); });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phren/cli",
3
- "version": "0.0.18",
3
+ "version": "0.0.19",
4
4
  "description": "Knowledge layer for AI agents. Phren learns and recalls.",
5
5
  "type": "module",
6
6
  "bin": {