A CLI for publishing standard.site documents to ATProto

rebranding to Remanso

+13 -13
+2 -2
CLAUDE.md
··· 4 4 5 5 ## Project Overview 6 6 7 - Sequoia is a CLI tool for publishing Markdown documents with frontmatter to the AT Protocol (Bluesky's decentralized social network). It converts blog posts into ATProto records (`site.standard.document`, `space.litenote.note`) and publishes them to a user's PDS. 7 + Sequoia is a CLI tool for publishing Markdown documents with frontmatter to the AT Protocol (Bluesky's decentralized social network). It converts blog posts into ATProto records (`site.standard.document`, `space.remanso.note`) and publishes them to a user's PDS. 8 8 9 9 Website: <https://sequoia.pub> 10 10 ··· 63 63 64 64 **Extensions** (`src/extensions/`): 65 65 66 - - `litenote.ts` — Creates `space.litenote.note` records with embedded images 66 + - `remanso.ts` — Creates `space.remanso.note` records with embedded images 67 67 68 68 ## Key Patterns 69 69
+2 -2
packages/cli/src/commands/publish.ts
··· 26 26 } from "../lib/markdown"; 27 27 import type { BlogPost, BlobObject, StrongRef } from "../lib/types"; 28 28 import { exitOnCancel } from "../lib/prompts"; 29 - import { createNote, updateNote, findPostsWithStaleLinks, type NoteOptions } from "../extensions/litenote" 29 + import { createNote, updateNote, findPostsWithStaleLinks, type NoteOptions } from "../extensions/remanso" 30 30 31 31 export const publishCommand = command({ 32 32 name: "publish", ··· 419 419 } 420 420 } 421 421 422 - // Pass 2: Create/update litenote notes (atUris are now available for link resolution) 422 + // Pass 2: Create/update Remanso notes (atUris are now available for link resolution) 423 423 for (const { post, action, atUri } of noteQueue) { 424 424 try { 425 425 if (action === "create") {
+7 -7
packages/cli/src/extensions/litenote.test.ts packages/cli/src/extensions/remanso.test.ts
··· 1 1 import { describe, expect, test } from "bun:test"; 2 - import { resolveInternalLinks, findPostsWithStaleLinks } from "./litenote"; 2 + import { resolveInternalLinks, findPostsWithStaleLinks } from "./remanso"; 3 3 import type { BlogPost } from "../lib/types"; 4 4 5 5 function makePost( ··· 29 29 expect(resolveInternalLinks(content, posts)).toBe("See my post"); 30 30 }); 31 31 32 - test("rewrites published link to litenote atUri", () => { 32 + test("rewrites published link to remanso atUri", () => { 33 33 const posts = [ 34 34 makePost( 35 35 "other-post", ··· 38 38 ]; 39 39 const content = "See [my post](./other-post)"; 40 40 expect(resolveInternalLinks(content, posts)).toBe( 41 - "See [my post](at://did:plc:abc/space.litenote.note/abc123)", 41 + "See [my post](at://did:plc:abc/space.remanso.note/abc123)", 42 42 ); 43 43 }); 44 44 ··· 67 67 ]; 68 68 const content = "Read the [guide](guide.md)"; 69 69 expect(resolveInternalLinks(content, posts)).toBe( 70 - "Read the [guide](at://did:plc:abc/space.litenote.note/guide123)", 70 + "Read the [guide](at://did:plc:abc/space.remanso.note/guide123)", 71 71 ); 72 72 }); 73 73 ··· 80 80 ]; 81 81 const content = "See [post](my-post)"; 82 82 expect(resolveInternalLinks(content, posts)).toBe( 83 - "See [post](at://did:plc:abc/space.litenote.note/rkey1)", 83 + "See [post](at://did:plc:abc/space.remanso.note/rkey1)", 84 84 ); 85 85 }); 86 86 ··· 117 117 const content = 118 118 "See [a](published) and [b](unpublished) and [c](https://ext.com)"; 119 119 expect(resolveInternalLinks(content, posts)).toBe( 120 - "See [a](at://did:plc:abc/space.litenote.note/pub1) and b and [c](https://ext.com)", 120 + "See [a](at://did:plc:abc/space.remanso.note/pub1) and b and [c](https://ext.com)", 121 121 ); 122 122 }); 123 123 ··· 130 130 ]; 131 131 const content = "See [docs](./docs/index)"; 132 132 expect(resolveInternalLinks(content, posts)).toBe( 133 - "See [docs](at://did:plc:abc/space.litenote.note/docs1)", 133 + "See [docs](at://did:plc:abc/space.remanso.note/docs1)", 134 134 ); 135 135 }); 136 136 });
+2 -2
packages/cli/src/extensions/litenote.ts packages/cli/src/extensions/remanso.ts
··· 4 4 import mimeTypes from "mime-types" 5 5 import { BlogPost, BlobObject } from "../lib/types" 6 6 7 - const LEXICON = "space.litenote.note" 7 + const LEXICON = "space.remanso.note" 8 8 const MAX_CONTENT = 10000 9 9 10 10 interface ImageRecord { ··· 151 151 152 152 const noteUri = matchedPost.frontmatter.atUri!.replace( 153 153 /\/[^/]+\/([^/]+)$/, 154 - `/space.litenote.note/$1`, 154 + `/space.remanso.note/$1`, 155 155 ) 156 156 return `[${text}](${noteUri})` 157 157 })