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 +15 -0
- package/bin/kandown.js +48 -7
- package/dist/android-chrome-192x192.png +0 -0
- package/dist/android-chrome-512x512.png +0 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/favicon-16x16.png +0 -0
- package/dist/favicon-32x32.png +0 -0
- package/dist/favicon-48x48.png +0 -0
- package/dist/favicon-96x96.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/favicon.svg +18 -38
- package/dist/index.html +6 -2
- package/dist/logo.svg +19 -0
- package/dist/site.webmanifest +35 -0
- package/package.json +1 -1
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
|
package/dist/favicon-16x16.png
CHANGED
|
Binary file
|
package/dist/favicon-32x32.png
CHANGED
|
Binary file
|
package/dist/favicon-48x48.png
CHANGED
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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>
|