Render portfolio pages as terminal commands

This commit is contained in:
2026-07-27 09:36:40 +09:00
parent ec3f569edc
commit ae0f6bc970
3 changed files with 15 additions and 6 deletions
+7 -3
View File
@@ -6,7 +6,7 @@ export function createCommandRouter(api) {
const page = name => {
const item = api.config.pages?.[name];
if (!item) return `${color('red', `No page named “${name}”.`)}\nTry: pages`;
return `${color(api.config.theme?.accent || 'yellow', item.title || name)}\n${wrap((item.lines || []).join('\n')).join('\n')}`;
return wrap((item.lines || []).join('\n')).join('\n');
};
add({ name: 'home', description: 'Return home', run: () => {
@@ -14,7 +14,11 @@ export function createCommandRouter(api) {
const status = api.ownerOnline() ? color('green', 'Owner is online') : color(api.config.theme?.muted || 'brightBlack', 'Owner is offline');
return `${color(api.config.theme?.accent || 'yellow', `Welcome to ${p.name || 'my portfolio'}`)}\n\n${wrap(p.bio || 'You are exploring a portfolio over SSH. Type “help” to get started.').join('\n')}\n\n${status}\n\nCommands: home · pages · open <page> · chat · contact · clear · quit`;
}});
add({ name: 'help', description: 'Show this help', run: ctx => [...commands.values()].filter(c => !c.admin || api.isAdmin(ctx)).map(c => `${c.name.padEnd(18)} ${c.description}`).join('\n') });
add({ name: 'help', description: 'Show this help', run: ctx => {
const actions = [...commands.values()].filter(c => !c.admin || api.isAdmin(ctx)).map(c => `${c.name.padEnd(18)} ${c.description}`);
const pages = Object.entries(api.config.pages || {}).filter(([name]) => !commands.has(name)).map(([name, item]) => `${name.padEnd(18)} Open ${item.title || name}`);
return [...actions, ...pages].join('\n');
}});
add({ name: 'pages', description: 'List available pages', run: () => Object.entries(api.config.pages || {}).map(([name, item]) => `${color(api.config.theme?.accent || 'yellow', name.padEnd(14))} ${item.title || ''}`).join('\n') || 'No pages configured.' });
add({ name: 'open', description: 'Open a page', run: (ctx, arg) => arg ? page(arg) : 'Usage: open <page>' });
add({ name: 'contact', description: 'Show contact details', run: () => `Email: ${api.config.persona?.email || 'not configured'}` });
@@ -32,7 +36,7 @@ export function createCommandRouter(api) {
return {
home: ctx => commands.get('home').run(ctx, ''),
execute(ctx, input) {
const [name, ...rest] = input.trim().split(/\s+/); const command = commands.get(name || 'home');
const [name, ...rest] = input.trim().split(/\s+/); const command = commands.get(name || 'home') || (api.config.pages?.[name] ? { run: () => page(name) } : null);
if (!command || (command.admin && !api.isAdmin(ctx))) return `Unknown command: ${name}. Try “help”.`;
return command.run(ctx, rest.join(' '));
}