icoa-cli 2.19.118 → 2.19.120
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/dist/lib/learn-render.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import chalk from"chalk";const o=64;function e(o,e){const l=o.replace(/\[[0-9;]*m/g,"");return l.length>=e?o:o+" ".repeat(e-l.length)}function l(o,e,l=20){const n=e>0?o/e:0,r=Math.floor(n*l),t=l-r;return`${chalk.green("█".repeat(r))+chalk.gray("░".repeat(t))} ${(100*n).toFixed(1)}%`}function n(o){return o>=30?chalk.red("🔥🔥🔥 "+o+" days"):o>=7?chalk.yellow("🔥 "+o+" days"):o>=1?chalk.gray("· "+o+" day"+(o>1?"s":"")):chalk.gray("—")}export function renderWelcome(r,t,a){const c=t.cardsCompleted.length,s=r.totalCards,g=s-c,y=r.modules.find(o=>t.currentCard>=o.cardRange[0]&&t.currentCard<=o.cardRange[1]);if(console.log(),console.log(chalk.cyan(" ╔"+"═".repeat(66)+"╗")),console.log(chalk.cyan(" ║")+e("",66)+chalk.cyan("║")),console.log(chalk.cyan(" ║ ")+e(chalk.bold.white(" ICOA Embodied AI Security Academy"),o)+chalk.cyan(" ║")),console.log(chalk.cyan(" ║")+e("",66)+chalk.cyan("║")),a)console.log(chalk.cyan(" ║ ")+e(chalk.white(" Welcome — this is the free demo (10 cards)."),o)+chalk.cyan(" ║"));else{const l=new Date(t.lastSeenAt),n=Math.floor((Date.now()-l.getTime())/36e5),r=n<1?"just now":n<24?`${n}h ago`:`${Math.floor(n/24)}d ago`;console.log(chalk.cyan(" ║ ")+e(chalk.white(` Welcome back — last seen ${r}`),o)+chalk.cyan(" ║"))}console.log(chalk.cyan(" ║")+e("",66)+chalk.cyan("║"));const d=y?`${y.number}. ${y.name}`:"—";console.log(chalk.cyan(" ║ ")+e(" "+chalk.gray("Module: ")+chalk.white(d),o)+chalk.cyan(" ║")),console.log(chalk.cyan(" ║ ")+e(" "+chalk.gray("Progress: ")+l(c,s)+chalk.gray(` (${c}/${s})`),o)+chalk.cyan(" ║")),console.log(chalk.cyan(" ║ ")+e(" "+chalk.gray("Streak: ")+n(t.streakDays),o)+chalk.cyan(" ║")),g>0&&t.currentCard<=s&&console.log(chalk.cyan(" ║ ")+e(" "+chalk.gray("Next card: ")+chalk.white(`#${t.currentCard} of ${s}`),o)+chalk.cyan(" ║")),console.log(chalk.cyan(" ║")+e("",66)+chalk.cyan("║")),console.log(chalk.cyan(" ╚"+"═".repeat(66)+"╝")),console.log(),console.log(chalk.gray(" ─────────────────────────────────────────────"));const i=0===c?"start the curriculum":"resume at card "+t.currentCard;console.log(chalk.bold.green(" continue")+chalk.gray(" "+i)),console.log(chalk.yellow(" status")+chalk.gray(" full progress dashboard")),t.bookmarks.length>0&&console.log(chalk.yellow(" bookmarks")+chalk.gray(` ${t.bookmarks.length} cards bookmarked for review`)),console.log(chalk.gray(" quit")+chalk.gray(" exit learn mode")),console.log(chalk.gray(" ─────────────────────────────────────────────")),console.log()}function r(e,l){const n=e.module,r=l.modules.find(o=>o.number===n),t=r?r.name:"Unknown",a=`Card ${e.number} / ${l.totalCards} · Module ${n} · ${t}`;console.log(),console.log(chalk.cyan(" ╭─ ")+chalk.bold.white(a)+" "+chalk.cyan("─".repeat(Math.max(0,o-a.length-4)))+chalk.cyan("╮"))}function t(){console.log(chalk.cyan(" ╰"+function(o="─"){return o.repeat(66)}()+"╯")),console.log()}function a(l){console.log(chalk.cyan(" │ ")+e(chalk.white(l),o)+chalk.cyan(" │"))}function c(){console.log(chalk.cyan(" │ ")+e("",o)+chalk.cyan(" │"))}function s(o,e){const l=[];for(const n of o.split("\n")){if(""===n){l.push("");continue}let o="";for(const r of n.split(" "))(o+" "+r).trim().length>e?(l.push(o.trim()),o=r):o=(o+" "+r).trim();o&&l.push(o)}return l}export function renderKnowledgeCard(e,l){r(e,l),c(),a(chalk.bold.yellow(e.title)),a(chalk.gray("─".repeat(Math.min(e.title.length,o)))),c();for(const o of e.body){for(const e of s(o,60))""===e?c():a(" "+e);c()}if(e.icoaConnection){a(chalk.magenta(" ICOA connection 📌")),a(chalk.gray(" "+"─".repeat(20)));for(const o of s(e.icoaConnection,60))a(" "+chalk.magenta(o));c()}t(),console.log(chalk.gray(" ")+chalk.bold.green("ok")+chalk.gray(" / ")+chalk.bold.green("next")+chalk.gray(" continue to next card")),console.log(chalk.gray(" bookmark mark for later review")),console.log(chalk.gray(" back previous card")),console.log(chalk.gray(" quit exit learn mode")),console.log()}export function renderMCQCard(e,l){r(e,l),c(),a(chalk.bold.yellow("🎯 "+e.title)),a(chalk.gray("─".repeat(Math.min(e.title.length+4,o)))),c();for(const o of s(e.question,60))a(" "+o);c();for(const o of["A","B","C","D"])a(chalk.cyan(` ${o}.`)+" "+chalk.white(e.options[o]));c(),t(),console.log(chalk.gray(" Type ")+chalk.bold.green("A")+chalk.gray(" / ")+chalk.bold.green("B")+chalk.gray(" / ")+chalk.bold.green("C")+chalk.gray(" / ")+chalk.bold.green("D")+chalk.gray(" to answer")),console.log()}export function renderMCQFeedback(o,e,l,n){console.log(),l?console.log(" "+chalk.bold.green("✓ Correct! ")+chalk.gray(`+1 point · ${e} = ${o.options[e]}`)):console.log(" "+chalk.bold.red("✗ Not quite. ")+chalk.gray(`You chose ${e}; the answer is ${o.answer}.`)),console.log(),console.log(chalk.gray(" Explanation:"));for(const e of s(o.explanation,60))console.log(chalk.gray(" "+e));const r=Object.values(n.mcqResults),t=r.filter(o=>o.correct).length;console.log(),console.log(chalk.gray(" MCQ accuracy so far: ")+chalk.white(`${t}/${r.length}`)),console.log(),console.log(chalk.gray(" Press ")+chalk.bold.green("ok")+chalk.gray(" to continue")),console.log()}export function renderPracticalCard(e,l){r(e,l),c(),a(chalk.bold.yellow("🛠 "+e.title)),a(chalk.gray("─".repeat(Math.min(e.title.length+4,o)))),c();for(const o of s(e.task,60))a(" "+o);if(e.starterCode){c(),a(chalk.gray(" Starter code (copy + edit in your editor or sandbox):")),c();for(const o of e.starterCode.split("\n"))a(" "+chalk.cyan(o))}c(),t(),console.log(chalk.gray(" Try it in the sandbox: ")+chalk.bold.cyan("!python3")+chalk.gray(" (drops you into Python REPL)")),console.log(chalk.gray(" When you're done:")),console.log(chalk.gray(" ")+chalk.bold.green("done")+chalk.gray(" I figured it out — show me the answer")),console.log(chalk.gray(" ")+chalk.bold.yellow("skip")+chalk.gray(" skip (counts as incomplete)")),console.log()}export function renderPracticalSuccess(o){console.log(),console.log(" "+chalk.bold.green("✓ Practical recorded")),console.log(),console.log(chalk.gray(" Reference answer:"));for(const e of s(o.successHint,60))console.log(chalk.gray(" "+e));console.log(),console.log(chalk.gray(" Press ")+chalk.bold.green("ok")+chalk.gray(" to continue")),console.log()}export function renderSimDemoCard(o,e){r(o,e),c(),a(chalk.bold.yellow("🎬 "+o.title)),c();for(const e of s(o.description,60))a(" "+e);c(),a(chalk.gray(" ┌────────────────────────────────────────────")),a(chalk.gray(" │ ")+chalk.cyan("sim")+chalk.gray(" launch MuJoCo viewer, watch Franka arm")),a(chalk.gray(" │ play out action: ")+chalk.white(`"${o.simAction}"`)),a(chalk.gray(" │ ")+chalk.cyan("ok")+chalk.gray(" skip simulation, continue to next card")),a(chalk.gray(" └────────────────────────────────────────────")),a(chalk.gray(" (Requires: pip install mujoco; or use icoa/sandbox-vla)")),c(),t()}export function renderMilestone(l,n){console.log(),console.log(chalk.bold.yellow(" ╔"+"═".repeat(66)+"╗")),console.log(chalk.bold.yellow(" ║")+e("",66)+chalk.bold.yellow("║")),console.log(chalk.bold.yellow(" ║ ")+e(chalk.white(" ✦ ✦ ✦ MILESTONE ✦ ✦ ✦"),o)+chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║")+e("",66)+chalk.bold.yellow("║"));const r=` ${l.badge} ${l.emoji}`;console.log(chalk.bold.yellow(" ║ ")+e(chalk.bold.green(r),o)+chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║ ")+e(chalk.gray(" ─".repeat(l.badge.length/2+2)),o)+chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║")+e("",66)+chalk.bold.yellow("║")),console.log(chalk.bold.yellow(" ║ ")+e(" "+chalk.gray("In the wild, this level corresponds to:"),o)+chalk.bold.yellow(" ║"));for(const n of s(l.realWorldLevel,60))console.log(chalk.bold.yellow(" ║ ")+e(" "+chalk.white(n),o)+chalk.bold.yellow(" ║"));console.log(chalk.bold.yellow(" ║")+e("",66)+chalk.bold.yellow("║")),console.log(chalk.bold.yellow(" ║ ")+e(" "+chalk.gray("What's next:"),o)+chalk.bold.yellow(" ║"));for(const n of s(l.unlockedNext,60))console.log(chalk.bold.yellow(" ║ ")+e(" "+chalk.white(n),o)+chalk.bold.yellow(" ║"));console.log(chalk.bold.yellow(" ║")+e("",66)+chalk.bold.yellow("║")),console.log(chalk.bold.yellow(" ╚"+"═".repeat(66)+"╝")),console.log(),console.log(chalk.gray(" Demo complete! 🎉")),console.log(),console.log(chalk.gray(" To unlock the full ")+chalk.white("n=480 PhD-entry curriculum")+chalk.gray(",")),console.log(chalk.gray(" contact your country's team leader to request an ")+chalk.bold.yellow("EA")+chalk.gray(" learn token,")),console.log(chalk.gray(" or email ")+chalk.cyan("asra@icoa2026.au")+chalk.gray(" for ICOA partnership.")),console.log(),console.log(chalk.gray(" Type ")+chalk.bold.green("quit")+chalk.gray(" to exit, or ")+chalk.bold.green("status")+chalk.gray(" for the dashboard.")),console.log()}export function renderStatus(o,e){const r=e.cardsCompleted.length,s=o.totalCards,g=Object.values(e.mcqResults),y=g.filter(o=>o.correct).length;console.log(),console.log(chalk.cyan(" ╭─ ")+chalk.bold.white("ICOA Embodied AI Security — Status")+" "+chalk.cyan("─".repeat(25))+chalk.cyan("╮")),c(),a(" "+chalk.gray("Total progress: ")+l(r,s)+chalk.gray(` (${r}/${s})`)),a(" "+chalk.gray("Streak: ")+n(e.streakDays)+chalk.gray(` (longest: ${e.longestStreak})`)),a(" "+chalk.gray("MCQ accuracy: ")+chalk.white(`${y}/${g.length}`)),a(" "+chalk.gray("Practicals done: ")+chalk.white(`${e.practicalsCompleted.length}`)),a(" "+chalk.gray("Bookmarked: ")+chalk.white(`${e.bookmarks.length}`)),c();for(const l of o.modules){const[o,n]=l.cardRange,r=e.cardsCompleted.filter(e=>e>=o&&e<=n).length,t=n-o+1;a(" "+(r===t?chalk.green("✓"):r>0?chalk.yellow("▶"):chalk.gray("□"))+" "+chalk.gray(`Module ${l.number}: `)+chalk.white(`${r}/${t}`)+chalk.gray(" "+l.name))}if(c(),e.achievements.length>0){a(" "+chalk.gray("Achievements:"));for(const o of e.achievements)a(" "+chalk.bold.yellow("★ ")+chalk.white(o))}else a(" "+chalk.gray("Achievements: none yet — push to the first milestone!"));c(),t()}
|
|
1
|
+
import chalk from"chalk";function o(o="─"){return o.repeat(66)}function e(o,e,l=20){const n=e>0?o/e:0,r=Math.floor(n*l),t=l-r;return`${chalk.green("█".repeat(r))+chalk.gray("░".repeat(t))} ${(100*n).toFixed(1)}%`}function l(o){return o>=30?chalk.red("🔥🔥🔥 "+o+" days"):o>=7?chalk.yellow("🔥 "+o+" days"):o>=1?chalk.gray("· "+o+" day"+(o>1?"s":"")):chalk.gray("—")}export function renderWelcome(n,r,t){const a=r.cardsCompleted.length,c=n.totalCards,s=c-a,g=n.modules.find(o=>r.currentCard>=o.cardRange[0]&&r.currentCard<=o.cardRange[1]);if(console.log(),console.log(chalk.cyan(" ╭"+o("═"))),console.log(chalk.cyan(" ║")),console.log(chalk.cyan(" ║ ")+chalk.bold.white(" ICOA Embodied AI Security Academy")),console.log(chalk.cyan(" ║")),t)console.log(chalk.cyan(" ║ ")+chalk.white(" Welcome — this is the free demo (10 cards)."));else{const o=new Date(r.lastSeenAt),e=Math.floor((Date.now()-o.getTime())/36e5),l=e<1?"just now":e<24?`${e}h ago`:`${Math.floor(e/24)}d ago`;console.log(chalk.cyan(" ║ ")+chalk.white(` Welcome back — last seen ${l}`))}console.log(chalk.cyan(" ║"));const y=g?`${g.number}. ${g.name}`:"—";console.log(chalk.cyan(" ║ ")+" "+chalk.gray("Module: ")+chalk.white(y)),console.log(chalk.cyan(" ║ ")+" "+chalk.gray("Progress: ")+e(a,c)+chalk.gray(` (${a}/${c})`)),console.log(chalk.cyan(" ║ ")+" "+chalk.gray("Streak: ")+l(r.streakDays)),s>0&&r.currentCard<=c&&console.log(chalk.cyan(" ║ ")+" "+chalk.gray("Next card: ")+chalk.white(`#${r.currentCard} of ${c}`)),console.log(chalk.cyan(" ║")),console.log(chalk.cyan(" ╰"+o("═"))),console.log(),console.log(chalk.gray(" ─────────────────────────────────────────────"));const i=0===a?"start the curriculum":"resume at card "+r.currentCard;console.log(chalk.bold.green(" continue")+chalk.gray(" "+i)),console.log(chalk.yellow(" status")+chalk.gray(" full progress dashboard")),r.bookmarks.length>0&&console.log(chalk.yellow(" bookmarks")+chalk.gray(` ${r.bookmarks.length} cards bookmarked for review`)),console.log(chalk.gray(" quit")+chalk.gray(" exit learn mode")),console.log(chalk.gray(" ─────────────────────────────────────────────")),console.log()}function n(o,e){const l=o.module,n=e.modules.find(o=>o.number===l),r=n?n.name:"Unknown",t=`Card ${o.number} / ${e.totalCards} · Module ${l} · ${r}`;console.log(),console.log(chalk.cyan(" ╭─ ")+chalk.bold.white(t)+" "+chalk.cyan("─".repeat(Math.max(0,64-t.length-4))))}function r(){console.log(chalk.cyan(" ╰"+o())),console.log()}function t(o){console.log(chalk.cyan(" │ ")+chalk.white(o))}function a(){console.log(chalk.cyan(" │"))}function c(o,e){const l=[];for(const n of o.split("\n")){if(""===n){l.push("");continue}let o="";for(const r of n.split(" "))(o+" "+r).trim().length>e?(l.push(o.trim()),o=r):o=(o+" "+r).trim();o&&l.push(o)}return l}export function renderKnowledgeCard(o,e){n(o,e),a(),t(chalk.bold.yellow(o.title)),t(chalk.gray("─".repeat(Math.min(o.title.length,64)))),a();for(const e of o.body){for(const o of c(e,60))""===o?a():t(" "+o);a()}if(o.icoaConnection){t(chalk.magenta(" ICOA connection 📌")),t(chalk.gray(" "+"─".repeat(20)));for(const e of c(o.icoaConnection,60))t(" "+chalk.magenta(e));a()}r(),console.log(chalk.gray(" ")+chalk.bold.green("ok")+chalk.gray(" / ")+chalk.bold.green("next")+chalk.gray(" continue to next card")),console.log(chalk.gray(" bookmark mark for later review")),console.log(chalk.gray(" back previous card")),console.log(chalk.gray(" quit exit learn mode")),console.log()}export function renderMCQCard(o,e){n(o,e),a(),t(chalk.bold.yellow("🎯 "+o.title)),t(chalk.gray("─".repeat(Math.min(o.title.length+4,64)))),a();for(const e of c(o.question,60))t(" "+e);a();for(const e of["A","B","C","D"])t(chalk.cyan(` ${e}.`)+" "+chalk.white(o.options[e]));a(),r(),console.log(chalk.gray(" Type ")+chalk.bold.green("A")+chalk.gray(" / ")+chalk.bold.green("B")+chalk.gray(" / ")+chalk.bold.green("C")+chalk.gray(" / ")+chalk.bold.green("D")+chalk.gray(" to answer")),console.log()}export function renderMCQFeedback(o,e,l,n){console.log(),l?console.log(" "+chalk.bold.green("✓ Correct! ")+chalk.gray(`+1 point · ${e} = ${o.options[e]}`)):console.log(" "+chalk.bold.red("✗ Not quite. ")+chalk.gray(`You chose ${e}; the answer is ${o.answer}.`)),console.log(),console.log(chalk.gray(" Explanation:"));for(const e of c(o.explanation,60))console.log(chalk.gray(" "+e));const r=Object.values(n.mcqResults),t=r.filter(o=>o.correct).length;console.log(),console.log(chalk.gray(" MCQ accuracy so far: ")+chalk.white(`${t}/${r.length}`)),console.log(),console.log(chalk.gray(" Press ")+chalk.bold.green("ok")+chalk.gray(" to continue")),console.log()}export function renderPracticalCard(o,e){n(o,e),a(),t(chalk.bold.yellow("🛠 "+o.title)),t(chalk.gray("─".repeat(Math.min(o.title.length+4,64)))),a();for(const e of c(o.task,60))t(" "+e);if(o.starterCode){a(),t(chalk.gray(" Starter code (copy + edit in your editor or sandbox):")),a();for(const e of o.starterCode.split("\n"))t(" "+chalk.cyan(e))}a(),r(),console.log(chalk.gray(" Try it in the sandbox: ")+chalk.bold.cyan("!python3")+chalk.gray(" (drops you into Python REPL)")),console.log(chalk.gray(" When you're done:")),console.log(chalk.gray(" ")+chalk.bold.green("done")+chalk.gray(" I figured it out — show me the answer")),console.log(chalk.gray(" ")+chalk.bold.yellow("skip")+chalk.gray(" skip (counts as incomplete)")),console.log()}export function renderPracticalSuccess(o){console.log(),console.log(" "+chalk.bold.green("✓ Practical recorded")),console.log(),console.log(chalk.gray(" Reference answer:"));for(const e of c(o.successHint,60))console.log(chalk.gray(" "+e));console.log(),console.log(chalk.gray(" Press ")+chalk.bold.green("ok")+chalk.gray(" to continue")),console.log()}export function renderSimDemoCard(o,e){n(o,e),a(),t(chalk.bold.yellow("🎬 "+o.title)),a();for(const e of c(o.description,60))t(" "+e);a(),t(chalk.gray(" ┌────────────────────────────────────────────")),t(chalk.gray(" │ ")+chalk.cyan("sim")+chalk.gray(" launch MuJoCo viewer, watch Franka arm")),t(chalk.gray(" │ play out action: ")+chalk.white(`"${o.simAction}"`)),t(chalk.gray(" │ ")+chalk.cyan("ok")+chalk.gray(" skip simulation, continue to next card")),t(chalk.gray(" └────────────────────────────────────────────")),t(chalk.gray(" (Requires: pip install mujoco; or use icoa/sandbox-vla)")),a(),r()}export function renderMilestone(e,l){console.log(),console.log(chalk.bold.yellow(" ╭"+o("═"))),console.log(chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║ ")+chalk.white(" ✦ ✦ ✦ MILESTONE ✦ ✦ ✦")),console.log(chalk.bold.yellow(" ║"));const n=` ${e.badge} ${e.emoji}`;console.log(chalk.bold.yellow(" ║ ")+chalk.bold.green(n)),console.log(chalk.bold.yellow(" ║ ")+chalk.gray(" ─".repeat(Math.max(1,Math.floor(e.badge.length/2+2))))),console.log(chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║ ")+" "+chalk.gray("In the wild, this level corresponds to:"));for(const o of c(e.realWorldLevel,60))console.log(chalk.bold.yellow(" ║ ")+" "+chalk.white(o));console.log(chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ║ ")+" "+chalk.gray("What's next:"));for(const o of c(e.unlockedNext,60))console.log(chalk.bold.yellow(" ║ ")+" "+chalk.white(o));console.log(chalk.bold.yellow(" ║")),console.log(chalk.bold.yellow(" ╰"+o("═"))),console.log(),console.log(chalk.gray(" Demo complete! 🎉")),console.log(),console.log(chalk.gray(" To unlock the full ")+chalk.white("n=480 PhD-entry curriculum")+chalk.gray(",")),console.log(chalk.gray(" contact your country's team leader to request an ")+chalk.bold.yellow("EA")+chalk.gray(" learn token,")),console.log(chalk.gray(" or email ")+chalk.cyan("asra@icoa2026.au")+chalk.gray(" for ICOA partnership.")),console.log(),console.log(chalk.gray(" Type ")+chalk.bold.green("quit")+chalk.gray(" to exit, or ")+chalk.bold.green("status")+chalk.gray(" for the dashboard.")),console.log()}export function renderStatus(o,n){const c=n.cardsCompleted.length,s=o.totalCards,g=Object.values(n.mcqResults),y=g.filter(o=>o.correct).length;console.log(),console.log(chalk.cyan(" ╭─ ")+chalk.bold.white("ICOA Embodied AI Security — Status")+" "+chalk.cyan("─".repeat(25))),a(),t(" "+chalk.gray("Total progress: ")+e(c,s)+chalk.gray(` (${c}/${s})`)),t(" "+chalk.gray("Streak: ")+l(n.streakDays)+chalk.gray(` (longest: ${n.longestStreak})`)),t(" "+chalk.gray("MCQ accuracy: ")+chalk.white(`${y}/${g.length}`)),t(" "+chalk.gray("Practicals done: ")+chalk.white(`${n.practicalsCompleted.length}`)),t(" "+chalk.gray("Bookmarked: ")+chalk.white(`${n.bookmarks.length}`)),a();for(const e of o.modules){const[o,l]=e.cardRange,r=n.cardsCompleted.filter(e=>e>=o&&e<=l).length,a=l-o+1;t(" "+(r===a?chalk.green("✓"):r>0?chalk.yellow("▶"):chalk.gray("□"))+" "+chalk.gray(`Module ${e.number}: `)+chalk.white(`${r}/${a}`)+chalk.gray(" "+e.name))}if(a(),n.achievements.length>0){t(" "+chalk.gray("Achievements:"));for(const o of n.achievements)t(" "+chalk.bold.yellow("★ ")+chalk.white(o))}else t(" "+chalk.gray("Achievements: none yet — push to the first milestone!"));a(),r()}
|