From c4e5dbc32a33964342d1fd54382bd80ca6272687 Mon Sep 17 00:00:00 2001 From: Matthew Jackson Date: Fri, 6 Mar 2026 14:14:47 -0800 Subject: [PATCH] =?UTF-8?q?Fix=20Telegram=20code=20block=20rendering=20?= =?UTF-8?q?=E2=80=94=20remove=20leading=20spaces=20from=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Telegram Markdown treats lines starting with spaces as preformatted code blocks. Replaced leading spaces with bullet points and arrows. Co-Authored-By: Claude Opus 4.6 --- lib/notify.mjs | 8 ++++---- status.mjs | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/notify.mjs b/lib/notify.mjs index d1426d2..db40fa7 100644 --- a/lib/notify.mjs +++ b/lib/notify.mjs @@ -97,7 +97,7 @@ export function formatSearchSummary(added, skipped, platforms, trackCounts = {}) if (Object.keys(trackCounts).length > 0) { lines.push(''); for (const [track, counts] of Object.entries(trackCounts)) { - lines.push(` • *${track}*: ${counts.added} new / ${counts.found} found`); + lines.push(`• *${track}*: ${counts.added} new / ${counts.found} found`); } } return lines.join('\n'); @@ -130,8 +130,8 @@ export function formatApplySummary(results) { lines.push(`${emoji} *${label}:*`); for (const j of jobs) { const shortUrl = (j.url || '').replace(/^https?:\/\/(?:www\.)?/, '').replace(/\/$/, ''); - lines.push(` • ${j.title} @ ${j.company}`); - if (shortUrl) lines.push(` ${shortUrl}`); + lines.push(`• ${j.title} @ ${j.company}`); + if (shortUrl) lines.push(`${shortUrl}`); } } @@ -151,7 +151,7 @@ export function formatFilterSummary({ passed, filtered, errors, cost, topJobs = if (topJobs.length > 0) { lines.push('', '*Top scores:*'); for (const j of topJobs.slice(0, 5)) { - lines.push(` • ${j.score} — ${j.title} @ ${j.company}`); + lines.push(`• ${j.score} — ${j.title} @ ${j.company}`); } } return lines.join('\n'); diff --git a/status.mjs b/status.mjs index 4cd8c18..adfcd36 100644 --- a/status.mjs +++ b/status.mjs @@ -166,7 +166,7 @@ function formatReport(s) { ? `⚠️ Last run interrupted ${timeAgo(sr.last_run?.started_at)} (partial results saved)` : `⏸️ Last ran ${timeAgo(sr.last_run?.finished_at)}`; const lastRunDetail = sr.last_run && !sr.running - ? ` Found ${sr.last_run.added} new jobs (${sr.last_run.seen} seen, ${sr.last_run.skipped_dupes || 0} dupes)` + ? `→ Found ${sr.last_run.added} new jobs (${sr.last_run.seen} seen, ${sr.last_run.skipped_dupes || 0} dupes)` : null; // Applier section @@ -175,7 +175,7 @@ function formatReport(s) { ? `🔄 Running now` : `⏸️ Last ran ${timeAgo(ar.last_run?.finished_at)}`; const lastApplierDetail = ar.last_run && !ar.running - ? ` Applied ${ar.last_run.submitted} jobs in that run` + ? `→ Applied ${ar.last_run.submitted} jobs in that run` : null; const lines = [ @@ -194,11 +194,11 @@ function formatReport(s) { byPlatform[t.platform].push(t); } for (const [platform, tracks] of Object.entries(byPlatform)) { - lines.push(` ${platform.charAt(0).toUpperCase() + platform.slice(1)}:`); + lines.push(`${platform.charAt(0).toUpperCase() + platform.slice(1)}:`); for (const t of tracks) { const pct = t.total > 0 ? Math.round((t.done / t.total) * 100) : 0; const bar = t.complete ? '✅ done' : `${t.done}/${t.total} keywords (${pct}%)`; - lines.push(` • ${t.track}: ${bar}`); + lines.push(`• ${t.track}: ${bar}`); } } } @@ -237,14 +237,14 @@ function formatReport(s) { [q.skipped_external, 'External ATS'], ]; for (const [count, label] of queueLines) { - if (count > 0) lines.push(` ${label}: ${count}`); + if (count > 0) lines.push(`• ${label}: ${count}`); } // Ready-to-apply breakdown by type if (s.apply_type_breakdown && Object.keys(s.apply_type_breakdown).length > 0) { const sorted = Object.entries(s.apply_type_breakdown).sort((a, b) => b[1] - a[1]); const parts = sorted.map(([type, count]) => `${type} ${count}`); - lines.push(` Breakdown: ${parts.join(', ')}`); + lines.push(`• Breakdown: ${parts.join(', ')}`); } // Last applied