kandown 0.21.1 → 0.21.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.21.6 — 2026-07-20 — "Favicons & CI Workflow Fix"
4
+
5
+ - **Added**: **Official Favicon Suite from `logo.svg`** — generated multi-format favicons (`favicon.svg`, inline base64 SVG data URI, `favicon.ico`, `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png`, `favicon-96x96.png`), `apple-touch-icon.png` (180x180), `android-chrome-192x192.png`, `android-chrome-512x512.png`, and Web Manifests (`manifest.json`, `site.webmanifest`).
6
+ - **Added**: **Daemon Static Asset Handler** — added `serveStaticAsset` in `bin/kandown.js` so web daemons serve app favicons and manifests directly.
7
+ - **Fixed**: **CI Publish Workflow** — updated `.github/workflows/publish.yml` to use `pnpm install --no-frozen-lockfile` to prevent lockfile version mismatch failures across runner environments.
8
+
9
+ ## 0.21.3 — 2026-07-20 — "Editor Text Colors & Highlights"
10
+
11
+ - **Fixed**: **Editor Text & Highlight Color Persistence** — enabled `textColor` and `backgroundColor` specs in BlockNote schema (`src/components/ui/BlockNoteMarkdownEditor.tsx`) so inline text colors and background highlights added in the web task description editor serialize to HTML inline tags and persist cleanly across reloads and markdown round-trips.
12
+
13
+ ## 0.21.2 — 2026-07-20 — "Pre-Bump Manual Validation"
14
+
15
+ - **Added**: **Mandatory Pre-Bump Testing Rule in `AGENTS.md`** — formal rule requiring agents to manually launch and test `kandown` CLI and web daemon before executing a release bump to catch runtime errors.
16
+ - **Fixed**: **Closing brace syntax in `cmdProjects`** — resolved missing `}` in `cmdProjects` that caused a `SyntaxError` on CLI startup.
17
+
3
18
  ## 0.21.1 — 2026-07-20 — "CLI Live Changelog"
4
19
 
5
20
  - **Added**: **CLI Live Changelog Display** — the CLI automatically parses and displays formatted release changelogs from `CHANGELOG.md` directly in the terminal during auto-updates, `kandown update`, and version notice popups.
package/bin/kandown.js CHANGED
@@ -974,6 +974,10 @@ function cmdInit(rawArgs) {
974
974
  }
975
975
 
976
976
  function cmdUpdate(rawArgs) {
977
+ const current = getCurrentVersion();
978
+ log(`${c.bold}kandown update${c.reset} ${c.dim}— v${current}${c.reset}`);
979
+ printVersionChangelog(current);
980
+
977
981
  const args = parseArgs(rawArgs);
978
982
  const cwd = process.cwd();
979
983
  const kandownDir = resolve(cwd, args.path);
@@ -2503,6 +2507,47 @@ function serveApp(res, kandownDir) {
2503
2507
  * It serves the single-file web app and exposes placeholder API routes for the
2504
2508
  * follow-up REST task, keeping this refactor limited to server bootstrapping.
2505
2509
  */
2510
+ const ASSET_MIME_TYPES = {
2511
+ '.svg': 'image/svg+xml',
2512
+ '.png': 'image/png',
2513
+ '.ico': 'image/x-icon',
2514
+ '.json': 'application/json',
2515
+ '.webmanifest': 'application/manifest+json',
2516
+ };
2517
+
2518
+ function serveStaticAsset(req, res, pathname) {
2519
+ const fileBasename = pathname.replace(/^\//, '');
2520
+ if (!fileBasename || fileBasename.includes('..')) return false;
2521
+ const assetPath = join(PKG_ROOT, 'public', fileBasename);
2522
+ if (existsSync(assetPath) && statSync(assetPath).isFile()) {
2523
+ const ext = extname(assetPath).toLowerCase();
2524
+ const contentType = ASSET_MIME_TYPES[ext] || 'application/octet-stream';
2525
+ try {
2526
+ handleCors(res);
2527
+ const content = readFileSync(assetPath);
2528
+ if (req.method === 'HEAD') {
2529
+ res.writeHead(200, {
2530
+ 'Content-Type': contentType,
2531
+ 'Content-Length': content.length,
2532
+ 'Cache-Control': 'public, max-age=86400',
2533
+ });
2534
+ res.end();
2535
+ return true;
2536
+ }
2537
+ res.writeHead(200, {
2538
+ 'Content-Type': contentType,
2539
+ 'Content-Length': content.length,
2540
+ 'Cache-Control': 'public, max-age=86400',
2541
+ });
2542
+ res.end(content);
2543
+ return true;
2544
+ } catch {
2545
+ return false;
2546
+ }
2547
+ }
2548
+ return false;
2549
+ }
2550
+
2506
2551
  function createServeServer(kandownDir) {
2507
2552
  try {
2508
2553
  const tasksDir = getTasksDir(kandownDir);
@@ -2526,6 +2571,7 @@ function createServeServer(kandownDir) {
2526
2571
  if (requestUrl.pathname.startsWith('/api/')) {
2527
2572
  return handleApi(req, res, requestUrl, kandownDir);
2528
2573
  }
2574
+ if (serveStaticAsset(req, res, requestUrl.pathname)) return;
2529
2575
  return writeText(res, 404, 'Not found');
2530
2576
  });
2531
2577
  }
@@ -2998,6 +3044,8 @@ async function cmdProjects(rawArgs) {
2998
3044
  for (const d of running) {
2999
3045
  log(` ${c.green}●${c.reset} Port ${c.cyan}${d.port}${c.reset} PID ${d.pid} ${c.dim}${d.kandownDir}${c.reset}`);
3000
3046
  }
3047
+ }
3048
+
3001
3049
  function cmdExport(rawArgs) {
3002
3050
  const { kandownDir } = ensureKandownDir(rawArgs);
3003
3051
  const isCsv = rawArgs.includes('--csv');
@@ -3063,13 +3111,6 @@ function cmdImport(rawArgs) {
3063
3111
  success(`Imported ${count} tasks into board`);
3064
3112
  }
3065
3113
 
3066
- async function cmdUpdate(rawArgs) {
3067
- const current = getCurrentVersion();
3068
- log(`${c.bold}kandown update${c.reset} ${c.dim}— checking version notice & updates…${c.reset}`);
3069
- printVersionChangelog(current);
3070
- await checkForUpdate(['node', 'kandown', ...rawArgs]);
3071
- }
3072
-
3073
3114
  const SCRIPTED_COMMANDS = new Set([
3074
3115
  'list', 'ls', 'show', 'create', 'new', 'move', 'assign', 'commit', 'tasks', 'work', 'daemon',
3075
3116
  'doctor', 'undo', 'projects', 'export', 'import',
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/dist/favicon.ico CHANGED
Binary file
package/dist/favicon.svg CHANGED
@@ -1,39 +1,19 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!--
3
- @file public/favicon.svg
4
- @description Kandown brand mark adaptive favicon.
5
- 📖 Transparent background so the icon adapts to the browser's tab-strip
6
- color (no more black-on-black on dark themes). The K recolors itself
7
- via @media (prefers-color-scheme: dark) so the contrast holds in both
8
- light and dark browser themes:
9
- light browser: dark K (#0a0a0a) on white/cream tab → high contrast
10
- dark browser: white K (#ffffff) on dark tab → high contrast
11
- The lime slash (#cef867) is the constant brand element on top.
12
- 📖 PNG fallbacks (16/32/48/ico) ship in the light-mode variant (dark K on
13
- transparent) for browsers that don't honor SVG media queries. PWA /
14
- OS-launcher icons (apple-touch, android-chrome, mstile, og-image)
15
- still use the dark surface — those have a different use case (solid
16
- background required by the platform).
17
- -->
18
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-label="Kandown">
19
- <title>Kandown</title>
20
- <style>
21
- .k { fill: #0a0a0a; }
22
- .slash { fill: #cef867; }
23
- @media (prefers-color-scheme: dark) {
24
- .k { fill: #ffffff; }
25
- }
26
- </style>
27
-
28
- <!-- K vertical bar (left stem) -->
29
- <rect class="k" x="50" y="36" width="34" height="184" rx="3" ry="3"/>
30
-
31
- <!-- K upper diagonal: middle-left → top-right -->
32
- <path class="k" d="M 84 128 L 200 36 L 222 36 L 84 152 Z"/>
33
-
34
- <!-- K lower diagonal: middle-left → bottom-right (with the small flag/notch on the right) -->
35
- <path class="k" d="M 84 128 L 200 220 L 222 220 L 188 186 L 200 174 L 84 132 Z"/>
36
-
37
- <!-- Lime diagonal slash: thick parallelogram from top-right to bottom-left -->
38
- <path class="slash" d="M 232 22 L 174 22 L 24 172 L 24 230 Z"/>
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="100%" height="100%" viewBox="0 0 150 150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
4
+ <path d="M148,21.594L148,128.406C148,139.22 139.22,148 128.406,148L21.594,148C10.78,148 2,139.22 2,128.406L2,21.594C2,10.78 10.78,2 21.594,2L128.406,2C139.22,2 148,10.78 148,21.594Z" style="fill:url(#_Linear1);"/>
5
+ <g transform="matrix(0.823551,0,0,0.823551,12.830775,11.282318)">
6
+ <g transform="matrix(1.620982,0,0,1.566239,-41.718998,-41.628205)">
7
+ <path d="M56.491,62.601C57.2,61.897 57.602,60.925 57.606,59.908C57.627,53.936 57.7,33.2 57.7,33.2C57.6,29.7 55,27.6 52,27.6L42.075,27.6C38.544,27.6 35.673,30.547 35.644,34.201C35.528,48.996 35.327,83.484 35.956,83.013C35.956,83.013 52.072,66.994 56.491,62.601Z" style="fill:rgb(252,255,239);fill-rule:nonzero;"/>
8
+ </g>
9
+ <g transform="matrix(1.566239,0,0,1.566239,-39.774573,-41.628205)">
10
+ <path d="M87.6,43.8C84.2,43.9 80.5,45.1 77.7,47.5L39.2,86.2C37.1,88.3 35.8,91 35.7,93.7L35.7,116.574C35.7,117.219 36.088,117.802 36.683,118.051C37.278,118.3 37.965,118.167 38.425,117.714C50.467,105.842 98.836,58.16 110.608,46.555C111.047,46.122 111.185,45.468 110.956,44.894C110.728,44.321 110.178,43.94 109.561,43.928C106.663,43.871 103.089,43.8 103.089,43.8L87.6,43.8Z" style="fill:rgb(241,255,184);fill-rule:nonzero;"/>
11
+ </g>
12
+ <g transform="matrix(0.766318,0.766329,-1.302872,1.302853,170.442469,-47.541879)">
13
+ <path d="M38.038,101.45C35.808,101.45 34,100.387 34,99.075C34,95.326 34,88.102 34,84.58C34,84.042 34.364,83.525 35.011,83.145C35.658,82.764 36.536,82.55 37.452,82.55C46.372,82.55 69.5,82.55 69.5,82.55C69.5,82.55 69.5,77.52 69.5,74.389C69.5,73.947 69.936,73.545 70.617,73.359C71.298,73.173 72.101,73.236 72.675,73.521C80.028,77.17 98.075,86.125 104.279,89.204C104.832,89.479 105.168,89.876 105.206,90.301C105.245,90.727 104.982,91.143 104.481,91.45C98.972,94.832 83.072,104.591 75.013,109.539C74.195,110.041 72.946,110.206 71.841,109.959C70.737,109.712 69.99,109.101 69.946,108.406C69.744,105.262 69.5,101.45 69.5,101.45L38.038,101.45Z" style="fill:rgb(136,225,56);"/>
14
+ </g>
15
+ </g>
16
+ <defs>
17
+ <linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(62,131,-131,62,9,8)"><stop offset="0" style="stop-color:rgb(12,29,23);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(24,41,35);stop-opacity:1"/></linearGradient>
18
+ </defs>
39
19
  </svg>