diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md
index a19cc1c..e969d24 100644
--- a/docs/ARCHITECTURE.md
+++ b/docs/ARCHITECTURE.md
@@ -36,10 +36,16 @@ function staticFilesPlugin(): Plugin {
},
load(id) {
if (id === resolvedVirtualModuleId) {
+ const HIDDEN_FILES = new Set(['sitemap.xml', 'robots.txt']);
const staticDir = join(process.cwd(), 'static');
const entries = readdirSync(staticDir, { withFileTypes: true });
const files = entries
- .filter((entry) => entry.isFile() && !entry.name.startsWith('.'))
+ .filter(
+ (entry) =>
+ entry.isFile() &&
+ !entry.name.startsWith('.') &&
+ !HIDDEN_FILES.has(entry.name)
+ )
.map((entry) => entry.name)
.sort();
return `export const staticFiles = ${JSON.stringify(files)};`;
@@ -87,6 +93,7 @@ export const GET: RequestHandler = async () => {
- ✅ No runtime overhead (file list is static, bundled at build time)
- ✅ Consistent behavior across environments
- ✅ Automatically excludes hidden files (those starting with `.`)
+- ✅ Excludes infrastructure files not shown to terminal users (`robots.txt`, `sitemap.xml`) via a `HIDDEN_FILES` set
- ✅ Alphabetically sorted file list
---
@@ -332,7 +339,7 @@ export const GET: RequestHandler = async () => {
**Response Format**:
```json
-["about.md", "contact.md", "docs.md", "robots.txt", "social.md"]
+["about.md", "contact.md", "docs.md", "profile.png", "social.md"]
```
**Characteristics**:
@@ -340,6 +347,7 @@ export const GET: RequestHandler = async () => {
- Returns alphabetically sorted file list
- Excludes hidden files (starting with `.`)
- Excludes directories
+- Excludes infrastructure files not intended for terminal users (`robots.txt`, `sitemap.xml`)
- Uses virtual static files plugin (works on Cloudflare)
- No authentication required (public files)
diff --git a/docs/DOCS_INDEX.md b/docs/DOCS_INDEX.md
index b4472e6..19ac1b3 100644
--- a/docs/DOCS_INDEX.md
+++ b/docs/DOCS_INDEX.md
@@ -156,7 +156,9 @@ npm run build # Build for production
- ✅ Real-time persistence with Cloudflare KV
- ✅ Markdown rendering with XSS protection
- ✅ ANSI color support (16 colors)
-- ✅ 72 comprehensive tests
+- ✅ Image rendering via `cat` (HEAD-only fetch, inline `` output)
+- ✅ Full SEO: title, description, Open Graph, Twitter Card, JSON-LD, sitemap
+- ✅ 83 comprehensive tests
- ✅ TypeScript strict mode
- ✅ Accessible (WCAG compliant)
@@ -189,7 +191,7 @@ npm run build # Build for production
- **Persist action** (async history saving in JS mode)
- **API endpoints** (/api/files, form actions)
- **Storage architecture** (KV vs cookies, size limits, fallback logic)
-- Testing approach (72 tests, Vitest + Playwright)
+- Testing approach (83 tests, Vitest + Playwright)
- Deployment process (Cloudflare Pages + KV setup)
- File system operations (build-time file listing)
- Security measures (sanitization, httpOnly cookies, CSRF protection)
diff --git a/docs/TEST_COVERAGE.md b/docs/TEST_COVERAGE.md
index aaa57c4..87260c3 100644
--- a/docs/TEST_COVERAGE.md
+++ b/docs/TEST_COVERAGE.md
@@ -34,6 +34,7 @@ Tests command execution logic for all commands:
- ✅ Case insensitive command handling
- ✅ Echo with special characters
- ✅ Cat command (file reading, markdown parsing, error handling)
+- ✅ Cat command: image files (`.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.svg`, `.avif`) rendered as `
` HTML via a HEAD-only existence check
- ✅ `cmd://` links render as NoJS-compatible `