pawmode 1.5.0 → 1.5.1

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.
@@ -393,6 +393,7 @@ function generateFocusTimerHTML(theme, botName, endsAt, duration) {
393
393
  const safeBotName = botName.replace(/[&<>"']/g, "");
394
394
  const safeEndsAt = endsAt.replace(/[&<>"']/g, "");
395
395
  const safeDuration = duration.replace(/[^0-9]/g, "");
396
+ const catArt = "⠀⠀⠀⠀⠀⠀⣀⡠⠄⠒⠠⢄⠀⣀⠤⠒⠂⠤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠤⠐⠒⠤⡀⢀⡠⠔⠂⠠⢄⣀⠀⠀⠀⠀⠀⠀\n⠀⠀⠀⠀⣠⠞⠂⢀⣀⣀⠀⠀⠉⠁⠀⣀⣀⣀⠀⠑⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠋⠀⣀⣀⣀⠀⠈⠉⠀⢀⣀⣀⠀⠈⠲⡀⠀⠀⠀⠀\n⠀⠀⠀⣸⡏⠀⣴⢋⠤⢌⠙⠆⠀⢠⠎⢁⠤⠍⢧⠀⠀⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡿⠁⢠⡞⡡⠤⡉⠳⠀⠀⡴⠉⡠⠬⡹⡄⠀⢸⡄⠀⠀⠀\n⠀⠀⢀⣽⡁⠀⣿⡀⢀⡘⡄⡇⠀⢸⢢⠇⢀⢢⣺⠀⠀⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣨⣇⠀⢸⣏⠀⡐⢣⢸⠀⠀⡗⡜⢀⠐⣄⣧⠀⢸⣇⠀⠀⠀\n⠀⣰⠉⠙⠷⠀⢛⣟⣦⣄⣣⡇⠀⠘⣎⣰⣤⣾⡿⠁⠴⠋⠈⠱⡀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡎⠉⠻⠆⠈⣿⣳⣤⣙⣼⠂⠀⢻⣁⣦⣼⣿⠇⠠⠞⠁⠙⣆⠀\n⣺⠁⠀⣠⠒⠶⣄⠉⠓⢚⣣⡠⠤⢤⣈⡓⠛⠋⢠⠖⠲⢤⡀⠀⢷⠀⠀⠀⠀⠀⠀⠀⢐⡟⠀⢀⠔⠲⢦⡈⠑⠛⣋⣡⠤⠤⣄⣙⠚⠛⢁⡴⠒⠦⣄⠀⠨⡆\n⣽⠀⢸⠄⠣⡐⢹⠀⡤⠏⢁⢀⢀⠠⢀⠉⢦⡀⢹⡁⠔⡁⣗⠀⢸⡅⠀⠀⠀⠀⠀⠀⢸⡇⠀⡗⠘⢄⢈⡇⢠⠖⠉⡀⣀⠠⠄⡈⠳⣄⠈⣟⠠⢈⢸⠀⠀⣿\n⠹⣄⠸⣷⣤⣧⠞⣾⢁⠐⢀⠀⠠⠄⣀⠑⠄⢱⡸⣧⣴⣶⡟⢠⡟⠁⠀⠀⠀⠀⠀⠀⠈⢷⡀⢿⣦⣾⡼⢳⡏⡠⠁⡀⠠⠠⢄⠈⠢⠈⣆⢿⣤⢶⣾⠃⣼⠃\n⠀⡸⢷⠈⠉⠉⢸⡟⣆⠀⢂⠌⣁⠒⡈⠢⢈⣾⣧⠈⠉⠉⢴⢏⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠿⡆⠉⠉⠁⣾⣳⠀⡀⠆⡑⠄⢂⠙⠄⣱⣿⠀⠉⠉⠡⡾⡅⠀\n⠐⡇⠀⠀⠀⠀⠘⣿⡞⣦⣅⣂⣄⣂⣰⣵⣻⣽⠏⠀⠀⠀⠀⢰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⢺⠀⠀⠀⠀⠀⢻⣷⢳⣴⣈⣐⣈⣄⣮⣞⣯⡿⠂⠀⠀⠀⠀⣸⠀\n⠀⠘⢄⠀⠀⠀⠀⠈⠻⠶⣝⣮⣳⣭⣳⣧⠟⠋⠀⠀⠀⠀⣠⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠣⡀⠀⠀⠀⠀⠙⠷⢮⣽⣭⣻⣜⣷⠾⠛⠁⠀⠀⠀⠀⡼⠃⠀\n⠀⠀⠈⡗⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⡠⢾⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢀⠴⣟⠁⠀⠀\n⠀⠀⠀⢸⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⡷⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⠇⠀⠀⠀\n⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡅⠀⠀⠀\n⠀⠀⠀⢽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡇⠀⠀⠀";
396
397
  return `<!DOCTYPE html>
397
398
  <html lang="en">
398
399
  <head>
@@ -410,63 +411,39 @@ min-height:100vh;display:flex;flex-direction:column;
410
411
  align-items:center;justify-content:center;
411
412
  overflow:hidden;
412
413
  }
413
- .container{text-align:center;position:relative;z-index:1}
414
- .ring-wrap{position:relative;width:200px;height:200px;margin:0 auto 20px}
415
- .ring-svg{width:200px;height:200px;transform:rotate(-90deg)}
416
- .ring-bg{fill:none;stroke:${t.border};stroke-width:4}
417
- .ring-fg{fill:none;stroke:${t.accent};stroke-width:4;stroke-linecap:round;transition:stroke-dashoffset 1s linear}
418
- .paw-ascii{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:13px;line-height:1.15;color:${t.accent};white-space:pre;animation:breathe 4s ease-in-out infinite}
419
- .trail{font-size:14px;color:${t.textDim};letter-spacing:8px;margin-bottom:16px;height:20px}
420
- .trail span{display:inline-block;animation:walk 2s ease-in-out infinite}
421
- .trail span:nth-child(1){animation-delay:0s}
422
- .trail span:nth-child(2){animation-delay:.25s}
423
- .trail span:nth-child(3){animation-delay:.5s}
424
- .trail span:nth-child(4){animation-delay:.75s}
425
- .trail span:nth-child(5){animation-delay:1s}
426
- .label{font-size:12px;text-transform:uppercase;letter-spacing:3px;color:${t.accent};font-weight:600;margin-bottom:24px}
427
- .timer{font-size:64px;font-weight:700;letter-spacing:4px;color:${t.text};line-height:1;margin-bottom:12px;font-variant-numeric:tabular-nums}
428
- .sub{font-size:12px;color:${t.textDim};margin-bottom:20px}
429
- .quote{font-size:11px;color:${t.textDim};font-style:italic;height:16px;transition:opacity .8s}
430
- .session-info{font-size:11px;color:${t.textDim};display:flex;gap:20px;justify-content:center;margin-top:20px}
414
+ .container{text-align:center;position:relative;z-index:1;padding:12px 16px}
415
+ .cat{font-size:7px;line-height:1.2;color:${t.accent};white-space:pre;margin:0 auto 14px;animation:breathe 4s ease-in-out infinite;text-shadow:0 0 0 transparent}
416
+ .label{font-size:11px;text-transform:uppercase;letter-spacing:3px;color:${t.accent};font-weight:600;margin-bottom:8px}
417
+ .timer{font-size:48px;font-weight:700;letter-spacing:4px;color:${t.text};line-height:1;margin-bottom:8px;font-variant-numeric:tabular-nums}
418
+ .progress{width:200px;height:3px;background:${t.border};border-radius:2px;margin:0 auto 10px;overflow:hidden}
419
+ .progress-fill{height:100%;background:${t.accent};border-radius:2px;width:0%;transition:width 1s linear}
420
+ .sub{font-size:11px;color:${t.textDim};margin-bottom:12px}
421
+ .quote{font-size:10px;color:${t.textDim};font-style:italic;height:14px;transition:opacity .8s}
422
+ .session-info{font-size:10px;color:${t.textDim};display:flex;gap:16px;justify-content:center;margin-top:12px}
431
423
  .session-info span{display:flex;align-items:center;gap:5px}
432
424
  .dot{width:5px;height:5px;border-radius:50%;background:${t.accent};animation:pulse 2s ease-in-out infinite}
425
+ .complete .cat{color:${t.done};animation:none;text-shadow:0 0 12px ${t.done}40}
433
426
  .complete .label{color:${t.done}}
434
427
  .complete .timer{color:${t.done}}
435
428
  .complete .dot{background:${t.done};animation:none}
436
- .complete .ring-fg{stroke:${t.done}}
437
- .complete .paw-ascii{color:${t.done};animation:none}
438
- .complete .trail span{animation:none;color:${t.done}}
439
- @keyframes breathe{0%,100%{opacity:.6;transform:translate(-50%,-50%) scale(.95)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.05)}}
440
- @keyframes walk{0%,100%{opacity:.3;transform:translateY(0)}50%{opacity:1;transform:translateY(-3px)}}
429
+ .complete .progress-fill{background:${t.done}}
430
+ @keyframes breathe{0%,100%{opacity:.6;text-shadow:0 0 0 transparent}50%{opacity:1;text-shadow:0 0 15px ${t.accent}30}}
441
431
  @keyframes pulse{0%,100%{opacity:.4}50%{opacity:1}}
442
432
  @keyframes flash{0%,100%{opacity:1}50%{opacity:.3}}
443
433
  .flash .timer{animation:flash .5s ease-in-out 3}
444
- .glow{position:fixed;width:250px;height:250px;border-radius:50%;background:${t.accent};opacity:.03;filter:blur(80px);pointer-events:none}
445
- .glow-1{top:-80px;left:-80px}
446
- .glow-2{bottom:-80px;right:-80px}
447
- .glow-3{top:50%;left:50%;transform:translate(-50%,-50%);opacity:.015}
434
+ .glow{position:fixed;width:200px;height:200px;border-radius:50%;background:${t.accent};opacity:.03;filter:blur(80px);pointer-events:none}
435
+ .glow-1{top:-60px;left:-60px}
436
+ .glow-2{bottom:-60px;right:-60px}
448
437
  </style>
449
438
  </head>
450
439
  <body>
451
440
  <div class="glow glow-1"></div>
452
441
  <div class="glow glow-2"></div>
453
- <div class="glow glow-3"></div>
454
442
  <div class="container" id="container">
455
- <div class="ring-wrap">
456
- <svg class="ring-svg" viewBox="0 0 200 200">
457
- <circle class="ring-bg" cx="100" cy="100" r="90"/>
458
- <circle class="ring-fg" id="ring" cx="100" cy="100" r="90" stroke-dasharray="565.49" stroke-dashoffset="565.49"/>
459
- </svg>
460
- <pre class="paw-ascii" id="paw"> __
461
- / \\
462
- | .. |
463
- \\ -- /
464
- \\__/
465
- ||</pre>
466
- </div>
467
- <div class="trail" id="trail"><span>.</span><span>o</span><span>O</span><span>o</span><span>.</span></div>
443
+ <pre class="cat" id="cat"></pre>
468
444
  <div class="label" id="label">Locked In</div>
469
445
  <div class="timer" id="timer">--:--</div>
446
+ <div class="progress"><div class="progress-fill" id="progress"></div></div>
470
447
  <div class="sub" id="sub">${safeDuration} min session</div>
471
448
  <div class="quote" id="quote"></div>
472
449
  <div class="session-info">
@@ -474,49 +451,45 @@ overflow:hidden;
474
451
  </div>
475
452
  </div>
476
453
  <script>
454
+ var catArt = ${JSON.stringify(catArt)};
455
+ document.getElementById("cat").textContent = catArt;
456
+
477
457
  var endsAt = "${safeEndsAt}";
478
458
  var durationMs = ${safeDuration} * 60000;
479
459
  var endTime = endsAt ? new Date(endsAt).getTime() : 0;
480
460
  var startTime = endTime - durationMs;
481
- var circumference = 2 * Math.PI * 90;
482
461
  var done = false;
483
- var ring = document.getElementById("ring");
462
+ var progressEl = document.getElementById("progress");
484
463
  var quotes = [
485
464
  "Deep work is the superpower of the 21st century.",
486
- "Focus is not about saying yes. It's about saying no.",
465
+ "Focus is not about saying yes. It\u2019s about saying no.",
487
466
  "The successful warrior is the average person with laser focus.",
488
467
  "What you stay focused on will grow.",
489
468
  "Starve your distractions. Feed your focus.",
490
469
  "Small daily improvements lead to stunning results.",
491
- "You don't need more time. You need more focus.",
470
+ "You don\u2019t need more time. You need more focus.",
492
471
  "Discipline is choosing what you want most over what you want now."
493
472
  ];
494
473
  var qIdx = 0;
495
474
 
496
475
  function pad(n) { return n < 10 ? "0" + n : "" + n; }
497
476
 
498
- function updateRing(progress) {
499
- var offset = circumference * (1 - progress);
500
- ring.style.strokeDashoffset = Math.max(0, offset);
501
- }
502
-
503
477
  function tick() {
504
478
  if (!endTime || done) return;
505
479
  var now = Date.now();
506
480
  var diff = endTime - now;
507
481
  var elapsed = now - startTime;
508
- var progress = Math.min(1, Math.max(0, elapsed / durationMs));
509
- updateRing(progress);
482
+ var pct = Math.min(100, Math.max(0, (elapsed / durationMs) * 100));
483
+ progressEl.style.width = pct + "%";
510
484
 
511
485
  if (diff <= 0) {
512
486
  done = true;
513
487
  document.getElementById("timer").textContent = "00:00";
514
488
  document.getElementById("label").textContent = "Session Complete";
515
489
  document.getElementById("sub").textContent = "Great work! Take a break.";
516
- document.getElementById("paw").textContent = " __\\n / \\\\\\n| ^^ |\\n\\\\ \\u2323 /\\n \\\\__/\\n ||";
517
490
  document.getElementById("container").classList.add("complete", "flash");
518
- document.title = "${safeBotName} \\u2014 Done!";
519
- updateRing(1);
491
+ document.title = "${safeBotName} \u2014 Done!";
492
+ progressEl.style.width = "100%";
520
493
  return;
521
494
  }
522
495
 
@@ -1,3 +1,3 @@
1
- import { CONFIG_FILE, readConfig, startDashboard, writeConfig } from "./dashboard-server-BiH4JLbM.js";
1
+ import { CONFIG_FILE, readConfig, startDashboard, writeConfig } from "./dashboard-server-BbQKUZiM.js";
2
2
 
3
3
  export { startDashboard };
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { accent, addJob, bold, dim, getTodaysCost, installSystemJob, listJobs, parseHumanSchedule, pawPulse, pawStep, readCostTracker, readScheduleConfig, readTelegramConfig, removeJob, runJob, showBanner, showMini, showPuppyDisclaimer, startTelegramBot, subtle, telegramConfigExists, telegramQuestionnaire, toggleJob, writeScheduleConfig, writeTelegramConfig } from "./scheduler-DAmd0GzB.js";
3
3
  import { getDefaultSkillsDir, installSkill, isSkillInstalled, listInstalledSkills, removeSkill } from "./skills-CMqq9k1-.js";
4
4
  import { addPermissions, readSettings, removePermissions, writeSettings } from "./permissions-BlGEHCXO.js";
5
- import { readConfig, startDashboard, writeConfig } from "./dashboard-server-BiH4JLbM.js";
5
+ import { readConfig, startDashboard, writeConfig } from "./dashboard-server-BbQKUZiM.js";
6
6
  import { Command } from "commander";
7
7
  import * as p$13 from "@clack/prompts";
8
8
  import * as p$12 from "@clack/prompts";
@@ -2384,7 +2384,7 @@ async function setupCommand(opts = {}) {
2384
2384
  console.log(` ${subtle("\"Go to hacker news and summarize the top posts\"")}`);
2385
2385
  console.log("");
2386
2386
  if (wantDashboard) {
2387
- const { startDashboard: startDashboard$1 } = await import("./dashboard-server-BLUIYHCS.js");
2387
+ const { startDashboard: startDashboard$1 } = await import("./dashboard-server-DNp8nytI.js");
2388
2388
  startDashboard$1({
2389
2389
  theme: dashboardTheme,
2390
2390
  botName
@@ -4047,7 +4047,7 @@ async function scheduleSetCapCommand(amount) {
4047
4047
  //#endregion
4048
4048
  //#region src/index.ts
4049
4049
  const program = new Command();
4050
- program.name("openpaw").description("Personal Assistant Wizard for Claude Code").version("1.5.0");
4050
+ program.name("openpaw").description("Personal Assistant Wizard for Claude Code").version("1.5.1");
4051
4051
  program.command("setup", { isDefault: true }).description("Interactive setup wizard — pick skills, install tools, configure Claude Code").option("-p, --preset <name>", "Use a preset (everything, essentials, productivity, developer, creative, smart-home)").option("-y, --yes", "Skip confirmations, use defaults").option("--dry-run", "Show what would be installed without making changes").action(setupCommand);
4052
4052
  program.command("add").description("Add skill(s) by name").argument("<skills...>", "Skill IDs to add (e.g. notes music email)").action(addCommand);
4053
4053
  program.command("remove").description("Remove skill(s) by name").argument("<skills...>", "Skill IDs to remove").action(removeCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pawmode",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Open-source Personal Assistant Wizard for Claude Code. Turn Claude Code into your PA with CLI tools and skills.",
5
5
  "type": "module",
6
6
  "bin": {