memd-cli 2.0.0 → 2.1.0
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/.claude/settings.local.json +2 -1
- package/README.md +1 -1
- package/main.js +6 -1
- package/package.json +4 -4
- package/test/memd.test.js +32 -1
- package/highlight-plan.md +0 -710
- package/poc-html.mjs +0 -134
- package/poc-output.html +0 -460
- package/svgplan.md +0 -805
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"Bash(node main.js test/test-highlight.md --no-pager --theme catppuccin-mocha 2>&1 | head -3 | xxd | head -10)",
|
|
10
10
|
"Bash(FORCE_COLOR=1 node main.js test/test-highlight.md --no-pager --theme catppuccin-mocha 2>&1 | head -3 | xxd | head -5)",
|
|
11
11
|
"Bash(FORCE_COLOR=1 node main.js test/test-highlight.md --no-pager --theme zinc-dark 2>&1 | head -3 | xxd | head -5)",
|
|
12
|
-
"mcp__grep-github__searchGitHub"
|
|
12
|
+
"mcp__grep-github__searchGitHub",
|
|
13
|
+
"Bash(npx npm-check-updates:*)"
|
|
13
14
|
]
|
|
14
15
|
}
|
|
15
16
|
}
|
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ Options:
|
|
|
27
27
|
--width <number> terminal width override
|
|
28
28
|
--ascii use pure ASCII mode for diagrams (default: unicode)
|
|
29
29
|
--html output as standalone HTML (mermaid diagrams rendered as inline SVG)
|
|
30
|
-
--theme <name> color theme (default: "nord")
|
|
30
|
+
--theme <name> color theme (default: "nord", env: MEMD_THEME)
|
|
31
31
|
zinc-light, zinc-dark, tokyo-night, tokyo-night-storm,
|
|
32
32
|
tokyo-night-light, catppuccin-mocha, catppuccin-latte,
|
|
33
33
|
nord, nord-light, dracula, github-light, github-dark,
|
package/main.js
CHANGED
|
@@ -347,6 +347,11 @@ function spawnPager(text, options) {
|
|
|
347
347
|
}
|
|
348
348
|
});
|
|
349
349
|
|
|
350
|
+
// Ignore EPIPE on stdin - expected when user quits pager before all content is consumed
|
|
351
|
+
pager.stdin.on('error', (err) => {
|
|
352
|
+
if (err.code !== 'EPIPE') throw err;
|
|
353
|
+
});
|
|
354
|
+
|
|
350
355
|
pager.stdin.write(text);
|
|
351
356
|
pager.stdin.end();
|
|
352
357
|
|
|
@@ -367,7 +372,7 @@ async function main() {
|
|
|
367
372
|
.option('--width <number>', 'terminal width override', Number)
|
|
368
373
|
.option('--ascii', 'use pure ASCII mode for diagrams (default: unicode)')
|
|
369
374
|
.option('--html', 'output as standalone HTML (mermaid diagrams rendered as inline SVG)')
|
|
370
|
-
.option('--theme <name>', `color theme\n${THEME_NAMES.join(', ')}`, 'nord')
|
|
375
|
+
.option('--theme <name>', `color theme (env: MEMD_THEME)\n${THEME_NAMES.join(', ')}`, process.env.MEMD_THEME || 'nord')
|
|
371
376
|
.action(async (files, options) => {
|
|
372
377
|
// 1. Validate theme via THEME_MAP (unified for both paths)
|
|
373
378
|
if (!(options.theme in THEME_MAP)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memd-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "main.js",
|
|
6
6
|
"bin": {
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
"test": "vitest run"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"beautiful-mermaid": "^1.1.
|
|
13
|
+
"beautiful-mermaid": "^1.1.3",
|
|
14
14
|
"chalk": "^5.6.2",
|
|
15
15
|
"commander": "^14.0.3",
|
|
16
|
-
"marked": "^17.0.
|
|
16
|
+
"marked": "^17.0.4",
|
|
17
17
|
"marked-terminal": "^7.3.0",
|
|
18
18
|
"shiki": "^4.0.2"
|
|
19
19
|
},
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"node": ">=20"
|
|
26
26
|
},
|
|
27
27
|
"license": "MIT",
|
|
28
|
-
"packageManager": "pnpm@10.
|
|
28
|
+
"packageManager": "pnpm@10.32.1",
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"tuistory": "^0.0.16",
|
|
31
31
|
"vitest": "^4.0.18"
|
package/test/memd.test.js
CHANGED
|
@@ -27,7 +27,7 @@ function runSync(args) {
|
|
|
27
27
|
describe('memd CLI', () => {
|
|
28
28
|
it('--version', async () => {
|
|
29
29
|
const output = await run(['-v'])
|
|
30
|
-
expect(output).toContain('2.
|
|
30
|
+
expect(output).toContain('2.1.0')
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
it('--help', async () => {
|
|
@@ -279,6 +279,37 @@ describe('memd CLI', () => {
|
|
|
279
279
|
expect(output).toContain('Hello')
|
|
280
280
|
expect(output).toContain('More text.')
|
|
281
281
|
})
|
|
282
|
+
|
|
283
|
+
it('MEMD_THEME env sets default theme (HTML path)', () => {
|
|
284
|
+
const output = execSync(`node ${MAIN} --html test/test1.md`, {
|
|
285
|
+
encoding: 'utf-8',
|
|
286
|
+
timeout: 15000,
|
|
287
|
+
env: { ...process.env, MEMD_THEME: 'dracula' },
|
|
288
|
+
})
|
|
289
|
+
expect(output).toContain('#282a36') // dracula bg
|
|
290
|
+
expect(output).toContain('#f8f8f2') // dracula fg
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
it('--theme flag overrides MEMD_THEME env', () => {
|
|
294
|
+
const output = execSync(`node ${MAIN} --html --theme tokyo-night test/test1.md`, {
|
|
295
|
+
encoding: 'utf-8',
|
|
296
|
+
timeout: 15000,
|
|
297
|
+
env: { ...process.env, MEMD_THEME: 'dracula' },
|
|
298
|
+
})
|
|
299
|
+
expect(output).toContain('#1a1b26') // tokyo-night bg
|
|
300
|
+
expect(output).not.toContain('#282a36') // not dracula bg
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
it('invalid MEMD_THEME env exits with error', () => {
|
|
304
|
+
expect(() => {
|
|
305
|
+
execSync(`node ${MAIN} --html test/test1.md`, {
|
|
306
|
+
encoding: 'utf-8',
|
|
307
|
+
timeout: 15000,
|
|
308
|
+
stdio: 'pipe',
|
|
309
|
+
env: { ...process.env, MEMD_THEME: 'nonexistent' },
|
|
310
|
+
})
|
|
311
|
+
}).toThrow()
|
|
312
|
+
})
|
|
282
313
|
})
|
|
283
314
|
|
|
284
315
|
// chalk.level = 0 + Shiki: verify no ANSI codes for all themes
|