import { cli, Strategy } from '@jackwener/opencli/registry'; import { EmptyResultError } from '@jackwener/opencli/errors'; import { DOMAIN, SITE, gqlEscape, gqlRequest, parsePostId, stripHtml, } from './_helpers.js'; cli({ site: SITE, name: 'read', access: 'read', description: 'Read full post by URL or ID', domain: DOMAIN, strategy: Strategy.PUBLIC, browser: false, args: [ { name: 'url-or-id', type: 'string', required: true, positional: true, help: 'Post URL or LessWrong post ID', }, ], columns: ['title', 'author', 'karma', 'comments', 'tags', 'content', 'url'], func: async (kwargs) => { const postId = parsePostId(String(kwargs['url-or-id'])); const query = `query PostsSingle { post(input: {selector: {documentId: "${gqlEscape(postId)}"}}) { result { _id title user { displayName } baseScore commentCount htmlBody slug postedAt tags { name } } } }`; const data = await gqlRequest(query); const post = data?.post?.result; if (!post?._id) { throw new EmptyResultError('lesswrong read', `Post "${postId}" not found`); } return [ { title: post.title ?? '', author: post.user?.displayName ?? '', karma: post.baseScore ?? 0, comments: post.commentCount ?? 0, tags: (post.tags ?? []).map((tag) => tag.name ?? '').filter(Boolean).join(', '), content: stripHtml(post.htmlBody ?? ''), url: `https://${DOMAIN}/posts/${post._id}/${post.slug}`, }, ]; }, });