seshat-scribe 0.2.6 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmJ3E"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0K3E"}
@@ -4,7 +4,9 @@ import ora from 'ora';
4
4
  import { scanRepository } from '../core/analyzer.js';
5
5
  import { planBlogPost } from '../core/planner.js';
6
6
  import { writeBlogPost } from '../core/writer.js';
7
+ import { writePortableTextContent } from '../core/portable-writer.js';
7
8
  import { generateImage } from '../core/artist.js';
9
+ import { uploadToSanity } from '../core/sanity.js';
8
10
  import { gold, cyan, error, info, scrollWritten } from '../lib/output.js';
9
11
  import { resetUsage, formatUsageSummary } from '../lib/usage.js';
10
12
  import { buildFileName, buildNestedPath } from '../lib/frontmatter.js';
@@ -66,9 +68,16 @@ export async function generate(options = {}) {
66
68
  color: 'cyan',
67
69
  }).start();
68
70
  const postDate = new Date();
71
+ const outputMode = config.outputMode || 'local';
69
72
  let mdxContent;
73
+ let portableTextBody;
70
74
  try {
71
- mdxContent = await writeBlogPost(config, plan, postDate);
75
+ if (outputMode === 'local' || outputMode === 'both') {
76
+ mdxContent = await writeBlogPost(config, plan, postDate);
77
+ }
78
+ if (outputMode === 'sanity' || outputMode === 'both') {
79
+ portableTextBody = await writePortableTextContent(config, plan);
80
+ }
72
81
  writeSpinner.succeed('Content written');
73
82
  }
74
83
  catch (err) {
@@ -92,44 +101,58 @@ export async function generate(options = {}) {
92
101
  error(err instanceof Error ? err.message : 'Unknown error');
93
102
  process.exit(1);
94
103
  }
95
- // Step 5: Inject image path and save the file
104
+ // Step 5: Save to local files and/or upload to Sanity
96
105
  const saveSpinner = ora({
97
106
  text: cyan('Inscribing the scroll...'),
98
107
  color: 'cyan',
99
108
  }).start();
100
109
  try {
101
- // Build file name from template
102
- const fileExtension = config.fileExtension || 'mdx';
103
110
  const imageExtension = config.imageFormat === 'jpg' ? 'jpg' : (config.imageFormat === 'svg' ? 'svg' : 'png');
104
- const fileNameTemplate = config.fileNameTemplate || '{{slug}}';
105
- const fileName = buildFileName(fileNameTemplate, plan.slug, postDate, fileExtension);
106
- // Replace the placeholder image path with the actual path
107
- const publicImagePath = `${config.publicAssetPath}/${plan.slug}.${imageExtension}`;
108
- mdxContent = mdxContent.replace(/PLACEHOLDER_IMAGE/g, publicImagePath);
109
- if (options.dryRun) {
110
- saveSpinner.info('Dry run: skipping file write');
111
- console.log('');
112
- console.log(gold('--- Generated Content Preview ---'));
113
- console.log(mdxContent.substring(0, 500) + '...');
114
- console.log('');
111
+ // Upload to Sanity if configured
112
+ if ((outputMode === 'sanity' || outputMode === 'both') && portableTextBody) {
113
+ if (options.dryRun) {
114
+ saveSpinner.info('Dry run: skipping Sanity upload');
115
+ }
116
+ else {
117
+ const result = await uploadToSanity(config, plan, portableTextBody, imagePath, postDate);
118
+ saveSpinner.succeed(`Uploaded to Sanity: ${result.documentId}`);
119
+ info(` View in studio: /studio/intent/edit/id=${result.documentId};type=post`);
120
+ }
115
121
  }
116
- else {
117
- // Determine content directory (with optional nested structure)
118
- let contentPath = path.resolve(process.cwd(), config.contentDir);
119
- if (config.nestedDirectories) {
120
- contentPath = buildNestedPath(postDate, contentPath);
122
+ // Save to local files if configured
123
+ if ((outputMode === 'local' || outputMode === 'both') && mdxContent) {
124
+ // Build file name from template
125
+ const fileExtension = config.fileExtension || 'mdx';
126
+ const fileNameTemplate = config.fileNameTemplate || '{{slug}}';
127
+ const fileName = buildFileName(fileNameTemplate, plan.slug, postDate, fileExtension);
128
+ // Replace the placeholder image path with the actual path
129
+ const publicImagePath = `${config.publicAssetPath}/${plan.slug}.${imageExtension}`;
130
+ mdxContent = mdxContent.replace(/PLACEHOLDER_IMAGE/g, publicImagePath);
131
+ if (options.dryRun) {
132
+ saveSpinner.info('Dry run: skipping file write');
133
+ console.log('');
134
+ console.log(gold('--- Generated Content Preview ---'));
135
+ console.log(mdxContent.substring(0, 500) + '...');
136
+ console.log('');
137
+ }
138
+ else {
139
+ // Determine content directory (with optional nested structure)
140
+ let contentPath = path.resolve(process.cwd(), config.contentDir);
141
+ if (config.nestedDirectories) {
142
+ contentPath = buildNestedPath(postDate, contentPath);
143
+ }
144
+ // Ensure content directory exists
145
+ await fs.mkdir(contentPath, { recursive: true });
146
+ // Write the MDX file
147
+ const mdxFilePath = path.join(contentPath, fileName);
148
+ await fs.writeFile(mdxFilePath, mdxContent, 'utf-8');
149
+ const relativeMdxPath = path.relative(process.cwd(), mdxFilePath);
150
+ saveSpinner.succeed(`Saved: ${relativeMdxPath}`);
121
151
  }
122
- // Ensure content directory exists
123
- await fs.mkdir(contentPath, { recursive: true });
124
- // Write the MDX file
125
- const mdxFilePath = path.join(contentPath, fileName);
126
- await fs.writeFile(mdxFilePath, mdxContent, 'utf-8');
127
- const relativeMdxPath = path.relative(process.cwd(), mdxFilePath);
128
- saveSpinner.succeed(`Saved: ${relativeMdxPath}`);
129
152
  }
130
153
  }
131
154
  catch (err) {
132
- saveSpinner.fail('Failed to save file');
155
+ saveSpinner.fail('Failed to save');
133
156
  error(err instanceof Error ? err.message : 'Unknown error');
134
157
  process.exit(1);
135
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -45,6 +45,29 @@ export declare const GenerationConfigSchema: z.ZodObject<{
45
45
  customInstructions?: string | undefined;
46
46
  }>;
47
47
  export type GenerationConfig = z.infer<typeof GenerationConfigSchema>;
48
+ /**
49
+ * Sanity CMS configuration schema
50
+ */
51
+ export declare const SanityConfigSchema: z.ZodObject<{
52
+ projectId: z.ZodString;
53
+ dataset: z.ZodString;
54
+ token: z.ZodOptional<z.ZodString>;
55
+ apiVersion: z.ZodOptional<z.ZodString>;
56
+ documentType: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ projectId: string;
59
+ dataset: string;
60
+ token?: string | undefined;
61
+ apiVersion?: string | undefined;
62
+ documentType?: string | undefined;
63
+ }, {
64
+ projectId: string;
65
+ dataset: string;
66
+ token?: string | undefined;
67
+ apiVersion?: string | undefined;
68
+ documentType?: string | undefined;
69
+ }>;
70
+ export type SanityConfig = z.infer<typeof SanityConfigSchema>;
48
71
  /**
49
72
  * Zod schema for Seshat configuration
50
73
  */
@@ -98,6 +121,26 @@ export declare const SeshatConfigSchema: z.ZodObject<{
98
121
  seoOptimized?: boolean | undefined;
99
122
  customInstructions?: string | undefined;
100
123
  }>>;
124
+ outputMode: z.ZodOptional<z.ZodEnum<["local", "sanity", "both"]>>;
125
+ sanity: z.ZodOptional<z.ZodObject<{
126
+ projectId: z.ZodString;
127
+ dataset: z.ZodString;
128
+ token: z.ZodOptional<z.ZodString>;
129
+ apiVersion: z.ZodOptional<z.ZodString>;
130
+ documentType: z.ZodOptional<z.ZodString>;
131
+ }, "strip", z.ZodTypeAny, {
132
+ projectId: string;
133
+ dataset: string;
134
+ token?: string | undefined;
135
+ apiVersion?: string | undefined;
136
+ documentType?: string | undefined;
137
+ }, {
138
+ projectId: string;
139
+ dataset: string;
140
+ token?: string | undefined;
141
+ apiVersion?: string | undefined;
142
+ documentType?: string | undefined;
143
+ }>>;
101
144
  }, "strip", z.ZodTypeAny, {
102
145
  contentDir: string;
103
146
  assetsDir: string;
@@ -124,6 +167,14 @@ export declare const SeshatConfigSchema: z.ZodObject<{
124
167
  seoOptimized?: boolean | undefined;
125
168
  customInstructions?: string | undefined;
126
169
  } | undefined;
170
+ sanity?: {
171
+ projectId: string;
172
+ dataset: string;
173
+ token?: string | undefined;
174
+ apiVersion?: string | undefined;
175
+ documentType?: string | undefined;
176
+ } | undefined;
177
+ outputMode?: "local" | "sanity" | "both" | undefined;
127
178
  }, {
128
179
  contentDir: string;
129
180
  assetsDir: string;
@@ -150,6 +201,14 @@ export declare const SeshatConfigSchema: z.ZodObject<{
150
201
  seoOptimized?: boolean | undefined;
151
202
  customInstructions?: string | undefined;
152
203
  } | undefined;
204
+ sanity?: {
205
+ projectId: string;
206
+ dataset: string;
207
+ token?: string | undefined;
208
+ apiVersion?: string | undefined;
209
+ documentType?: string | undefined;
210
+ } | undefined;
211
+ outputMode?: "local" | "sanity" | "both" | undefined;
153
212
  }>;
154
213
  export type SeshatConfig = z.infer<typeof SeshatConfigSchema>;
155
214
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CA+BvF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAW5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA6BhE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM1E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;EAKjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAM7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CA+BvF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAW5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA8BhE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM1E"}
package/dist/config.js CHANGED
@@ -19,6 +19,16 @@ export const GenerationConfigSchema = z.object({
19
19
  seoOptimized: z.boolean().optional().describe('Generate SEO-optimized content'),
20
20
  customInstructions: z.string().optional().describe('Additional custom instructions for content generation'),
21
21
  });
22
+ /**
23
+ * Sanity CMS configuration schema
24
+ */
25
+ export const SanityConfigSchema = z.object({
26
+ projectId: z.string().describe('Sanity project ID'),
27
+ dataset: z.string().describe('Sanity dataset name'),
28
+ token: z.string().optional().describe('Sanity write token (or environment variable name)'),
29
+ apiVersion: z.string().optional().describe('Sanity API version (default: 2024-01-01)'),
30
+ documentType: z.string().optional().describe('Sanity document type to create (default: post)'),
31
+ });
22
32
  /**
23
33
  * Zod schema for Seshat configuration
24
34
  */
@@ -42,6 +52,9 @@ export const SeshatConfigSchema = z.object({
42
52
  frontmatter: FrontmatterConfigSchema.optional().describe('Custom frontmatter configuration'),
43
53
  // Content generation options
44
54
  generation: GenerationConfigSchema.optional().describe('Content generation options'),
55
+ // Output mode and Sanity CMS integration
56
+ outputMode: z.enum(['local', 'sanity', 'both']).optional().describe('Output mode: local files, Sanity CMS, or both (default: local)'),
57
+ sanity: SanityConfigSchema.optional().describe('Sanity CMS configuration (required when outputMode includes "sanity")'),
45
58
  });
46
59
  /**
47
60
  * Framework preset configurations
@@ -112,6 +125,7 @@ export function resolveConfig(config) {
112
125
  resolved.imageFormat = resolved.imageFormat || DEFAULT_CONFIG.imageFormat;
113
126
  resolved.fileNameTemplate = resolved.fileNameTemplate || DEFAULT_CONFIG.fileNameTemplate;
114
127
  resolved.nestedDirectories = resolved.nestedDirectories ?? DEFAULT_CONFIG.nestedDirectories;
128
+ resolved.outputMode = resolved.outputMode || 'local';
115
129
  // Default frontmatter config if none provided
116
130
  if (!resolved.frontmatter) {
117
131
  resolved.frontmatter = {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BlogPlan } from './planner.js';
2
+ import type { SeshatConfig } from '../config.js';
3
+ /**
4
+ * Use Gemini to write content as structured markdown that we'll parse into Portable Text
5
+ */
6
+ export declare function writePortableTextContent(config: SeshatConfig, plan: BlogPlan): Promise<any[]>;
7
+ //# sourceMappingURL=portable-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-writer.d.ts","sourceRoot":"","sources":["../../src/core/portable-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmBjD;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,GAAG,EAAE,CAAC,CAiFhB"}
@@ -0,0 +1,247 @@
1
+ import { createGenAIClient } from '../lib/gemini.js';
2
+ import { addUsage, fromGenerateContentResponse } from '../lib/usage.js';
3
+ const WRITE_MODEL = 'gemini-3-flash-preview';
4
+ function pickOne(arr) {
5
+ return arr[Math.floor(Math.random() * arr.length)];
6
+ }
7
+ const OPENING_STYLES = [
8
+ { instruction: 'Start with 1–2 sentences on why this matters to the reader.' },
9
+ { instruction: 'Open with a question that the post will answer.' },
10
+ { instruction: 'Open with a bold or surprising claim, then back it up.' },
11
+ { instruction: 'Open with a very short anecdote or moment (2–3 sentences) that leads into the topic.' },
12
+ { instruction: 'Dive straight into the technical content; no preamble. Start with a concrete example or definition.' },
13
+ { instruction: 'Start with an understated, almost casual observation that draws the reader in.' },
14
+ { instruction: 'Start by contradicting a common belief or practice, then explain.' },
15
+ { instruction: 'Start with a specific frustration or "this used to confuse me" and then resolve it.' },
16
+ ];
17
+ /**
18
+ * Use Gemini to write content as structured markdown that we'll parse into Portable Text
19
+ */
20
+ export async function writePortableTextContent(config, plan) {
21
+ const ai = createGenAIClient();
22
+ const primaryTag = plan.tags[0] || 'general';
23
+ const opening = pickOne(OPENING_STYLES);
24
+ // Build generation instructions
25
+ let generationInstructions = '';
26
+ if (config.generation) {
27
+ if (config.generation.targetWordCount) {
28
+ generationInstructions += `\n- Target length: approximately ${config.generation.targetWordCount} words`;
29
+ }
30
+ if (config.generation.includeCodeExamples) {
31
+ generationInstructions += '\n- Include multiple practical code examples throughout the post';
32
+ }
33
+ if (config.generation.seoOptimized) {
34
+ generationInstructions += '\n- Optimize for SEO: use keywords naturally, clear headings, scannable structure';
35
+ }
36
+ if (config.generation.customInstructions) {
37
+ generationInstructions += `\n- Additional instructions: ${config.generation.customInstructions}`;
38
+ }
39
+ }
40
+ const prompt = `Write a technical blog post in clean markdown format. Clear, valuable, focused on helping readers understand. Vary your voice — avoid sounding like a generic AI or a template.
41
+
42
+ **Post Details:**
43
+ - Title: ${plan.title}
44
+ - Description: ${plan.description}
45
+ - Tag: ${primaryTag}${generationInstructions}
46
+
47
+ **Opening (follow this for the first paragraph):**
48
+ ${opening.instruction}
49
+ Do NOT start with "In this article we will...", "In today's post...", or similar. Each post should feel like it was written on a different day.
50
+
51
+ **Writing Style:**
52
+ - Prose that delivers value without fluff or filler
53
+ - First-person when it fits ("I found", "I learned"); not every sentence
54
+ - Vary sentence length and rhythm — short and long, not uniform
55
+ - It's okay to be a bit idiosyncratic or opinionated
56
+ - Use examples and code to clarify; show real code, not pseudo-code
57
+ - Explain the "why" behind decisions; include edge cases or gotchas when relevant
58
+ - Don't use perfect grammar, just write like a human.
59
+
60
+ **Structure:**
61
+ - Use clear headings, but don't follow a cookie-cutter pattern
62
+ - Let the topic dictate structure: some posts need a long setup, others can jump in
63
+ - Include practical code examples where helpful
64
+
65
+ **Technical Quality:**
66
+ - Be accurate and specific
67
+ - Avoid formulaic transitions ("Furthermore", "Moreover", "It's worth noting that" as crutches)
68
+
69
+ **Tone: ${config.tone}**
70
+
71
+ **Format Requirements:**
72
+ - Use markdown headings (##, ###, ####) for structure
73
+ - Use code blocks with language tags (\`\`\`javascript, \`\`\`python, etc.)
74
+ - Use **bold** for emphasis, \`code\` for inline code
75
+ - Use [link text](url) for links
76
+ - Do NOT include frontmatter
77
+ - Start directly with the content
78
+
79
+ Write a focused, valuable post that helps developers understand ${plan.title}.`;
80
+ const response = await ai.models.generateContent({
81
+ model: WRITE_MODEL,
82
+ contents: prompt,
83
+ });
84
+ const u = fromGenerateContentResponse(WRITE_MODEL, response.usageMetadata);
85
+ if (u)
86
+ addUsage(u);
87
+ let content = response.text?.trim() || '';
88
+ // Clean up: remove wrapping code blocks if Gemini added them
89
+ if (content.startsWith('```')) {
90
+ content = content.replace(/^```(?:markdown|md)?\\n/, '').replace(/\\n```$/, '');
91
+ }
92
+ // Convert markdown to Portable Text blocks
93
+ return parseMarkdownToPortableText(content);
94
+ }
95
+ /**
96
+ * Parse markdown content into Portable Text blocks
97
+ */
98
+ function parseMarkdownToPortableText(markdown) {
99
+ const blocks = [];
100
+ const lines = markdown.split('\n');
101
+ let currentParagraph = [];
102
+ let inCodeBlock = false;
103
+ let codeBlockContent = [];
104
+ let codeBlockLanguage = '';
105
+ const flushParagraph = () => {
106
+ if (currentParagraph.length > 0) {
107
+ const text = currentParagraph.join('\n').trim();
108
+ if (text) {
109
+ blocks.push(createTextBlock(text, 'normal'));
110
+ }
111
+ currentParagraph = [];
112
+ }
113
+ };
114
+ for (const line of lines) {
115
+ // Handle code blocks
116
+ if (line.startsWith('```')) {
117
+ if (!inCodeBlock) {
118
+ flushParagraph();
119
+ inCodeBlock = true;
120
+ codeBlockLanguage = line.slice(3).trim() || 'javascript';
121
+ codeBlockContent = [];
122
+ }
123
+ else {
124
+ // End of code block
125
+ blocks.push({
126
+ _type: 'code',
127
+ language: codeBlockLanguage,
128
+ code: codeBlockContent.join('\n'),
129
+ });
130
+ inCodeBlock = false;
131
+ codeBlockContent = [];
132
+ codeBlockLanguage = '';
133
+ }
134
+ continue;
135
+ }
136
+ if (inCodeBlock) {
137
+ codeBlockContent.push(line);
138
+ continue;
139
+ }
140
+ // Handle headings
141
+ if (line.startsWith('#### ')) {
142
+ flushParagraph();
143
+ blocks.push(createTextBlock(line.slice(5), 'h4'));
144
+ continue;
145
+ }
146
+ if (line.startsWith('### ')) {
147
+ flushParagraph();
148
+ blocks.push(createTextBlock(line.slice(4), 'h3'));
149
+ continue;
150
+ }
151
+ if (line.startsWith('## ')) {
152
+ flushParagraph();
153
+ blocks.push(createTextBlock(line.slice(3), 'h2'));
154
+ continue;
155
+ }
156
+ if (line.startsWith('# ')) {
157
+ flushParagraph();
158
+ blocks.push(createTextBlock(line.slice(2), 'h1'));
159
+ continue;
160
+ }
161
+ // Handle blockquotes
162
+ if (line.startsWith('> ')) {
163
+ flushParagraph();
164
+ blocks.push(createTextBlock(line.slice(2), 'blockquote'));
165
+ continue;
166
+ }
167
+ // Empty lines separate paragraphs
168
+ if (line.trim() === '') {
169
+ flushParagraph();
170
+ continue;
171
+ }
172
+ // Regular paragraph text
173
+ currentParagraph.push(line);
174
+ }
175
+ // Flush any remaining content
176
+ flushParagraph();
177
+ return blocks;
178
+ }
179
+ /**
180
+ * Create a Portable Text block with inline formatting
181
+ */
182
+ function createTextBlock(text, style) {
183
+ const children = parseInlineFormatting(text);
184
+ return {
185
+ _type: 'block',
186
+ style,
187
+ children,
188
+ markDefs: [],
189
+ };
190
+ }
191
+ /**
192
+ * Parse inline formatting (bold, italic, code, links)
193
+ */
194
+ function parseInlineFormatting(text) {
195
+ const children = [];
196
+ // Split by formatting markers
197
+ const parts = text.split(/(\*\*.*?\*\*|__.*?__|`.*?`|\[.*?\]\(.*?\))/g);
198
+ for (const part of parts) {
199
+ if (!part)
200
+ continue;
201
+ if (part.startsWith('**') && part.endsWith('**')) {
202
+ // Bold
203
+ children.push({
204
+ _type: 'span',
205
+ text: part.slice(2, -2),
206
+ marks: ['strong'],
207
+ });
208
+ }
209
+ else if (part.startsWith('__') && part.endsWith('__')) {
210
+ // Bold (alternative)
211
+ children.push({
212
+ _type: 'span',
213
+ text: part.slice(2, -2),
214
+ marks: ['strong'],
215
+ });
216
+ }
217
+ else if (part.startsWith('`') && part.endsWith('`')) {
218
+ // Inline code
219
+ children.push({
220
+ _type: 'span',
221
+ text: part.slice(1, -1),
222
+ marks: ['code'],
223
+ });
224
+ }
225
+ else if (part.match(/\[(.*?)\]\((.*?)\)/)) {
226
+ // Link - simplified, would need markDefs in production
227
+ const match = part.match(/\[(.*?)\]\((.*?)\)/);
228
+ if (match) {
229
+ children.push({
230
+ _type: 'span',
231
+ text: match[1],
232
+ marks: [],
233
+ });
234
+ }
235
+ }
236
+ else {
237
+ // Regular text
238
+ children.push({
239
+ _type: 'span',
240
+ text: part,
241
+ marks: [],
242
+ });
243
+ }
244
+ }
245
+ return children.length > 0 ? children : [{ _type: 'span', text, marks: [] }];
246
+ }
247
+ //# sourceMappingURL=portable-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-writer.js","sourceRoot":"","sources":["../../src/core/portable-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type SanityClient } from '@sanity/client';
2
+ import type { SeshatConfig } from '../config.js';
3
+ import type { BlogPlan } from './planner.js';
4
+ /**
5
+ * Get or create a Sanity client instance
6
+ */
7
+ export declare function getSanityClient(config: SeshatConfig): SanityClient;
8
+ /**
9
+ * Upload an image file to Sanity assets
10
+ */
11
+ export declare function uploadImageToSanity(client: SanityClient, imagePath: string, imageAlt: string): Promise<{
12
+ _type: 'image';
13
+ asset: {
14
+ _type: 'reference';
15
+ _ref: string;
16
+ };
17
+ }>;
18
+ /**
19
+ * Create a post document in Sanity
20
+ */
21
+ export declare function createSanityPost(client: SanityClient, plan: BlogPlan, portableTextBody: any[], imageRef: {
22
+ _type: 'image';
23
+ asset: {
24
+ _type: 'reference';
25
+ _ref: string;
26
+ };
27
+ }, postDate: Date, documentType?: string): Promise<any>;
28
+ /**
29
+ * Upload a complete blog post with image to Sanity
30
+ */
31
+ export declare function uploadToSanity(config: SeshatConfig, plan: BlogPlan, portableTextBody: any[], imagePath: string, postDate: Date): Promise<{
32
+ documentId: string;
33
+ slug: string;
34
+ }>;
35
+ //# sourceMappingURL=sanity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanity.d.ts","sourceRoot":"","sources":["../../src/core/sanity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAkBlE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAe1E;AAGD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,QAAQ,EACd,gBAAgB,EAAE,GAAG,EAAE,EACvB,QAAQ,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACzE,QAAQ,EAAE,IAAI,EACd,YAAY,GAAE,MAAe,GAC5B,OAAO,CAAC,GAAG,CAAC,CAkBd;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,QAAQ,EACd,gBAAgB,EAAE,GAAG,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,IAAI,GACb,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/C"}
@@ -0,0 +1,76 @@
1
+ import { createClient } from '@sanity/client';
2
+ import fs from 'fs/promises';
3
+ /**
4
+ * Get or create a Sanity client instance
5
+ */
6
+ export function getSanityClient(config) {
7
+ if (!config.sanity) {
8
+ throw new Error('Sanity configuration is missing');
9
+ }
10
+ // Get token from environment variable
11
+ const token = process.env.SANITY_WRITE_TOKEN;
12
+ if (!token) {
13
+ throw new Error('SANITY_WRITE_TOKEN environment variable is required for Sanity uploads');
14
+ }
15
+ return createClient({
16
+ projectId: config.sanity.projectId,
17
+ dataset: config.sanity.dataset,
18
+ apiVersion: config.sanity.apiVersion || '2024-01-01',
19
+ token,
20
+ useCdn: false, // For write operations, never use CDN
21
+ });
22
+ }
23
+ /**
24
+ * Upload an image file to Sanity assets
25
+ */
26
+ export async function uploadImageToSanity(client, imagePath, imageAlt) {
27
+ const imageBuffer = await fs.readFile(imagePath);
28
+ // Upload to Sanity assets
29
+ const asset = await client.assets.upload('image', imageBuffer, {
30
+ filename: imagePath.split('/').pop() || 'image.png',
31
+ });
32
+ return {
33
+ _type: 'image',
34
+ asset: {
35
+ _type: 'reference',
36
+ _ref: asset._id,
37
+ },
38
+ };
39
+ }
40
+ /**
41
+ * Create a post document in Sanity
42
+ */
43
+ export async function createSanityPost(client, plan, portableTextBody, imageRef, postDate, documentType = 'post') {
44
+ const doc = {
45
+ _type: documentType,
46
+ title: plan.title,
47
+ slug: {
48
+ _type: 'slug',
49
+ current: plan.slug,
50
+ },
51
+ description: plan.description,
52
+ date: postDate.toISOString().split('T')[0], // YYYY-MM-DD format
53
+ tag: plan.tags[0] || 'general',
54
+ published: false, // Default to unpublished for review
55
+ image: imageRef,
56
+ imageAlt: `Header image for ${plan.title}`,
57
+ body: portableTextBody,
58
+ };
59
+ return await client.create(doc);
60
+ }
61
+ /**
62
+ * Upload a complete blog post with image to Sanity
63
+ */
64
+ export async function uploadToSanity(config, plan, portableTextBody, imagePath, postDate) {
65
+ const client = getSanityClient(config);
66
+ // Upload the image
67
+ const imageRef = await uploadImageToSanity(client, imagePath, `Header image for ${plan.title}`);
68
+ // Create the post document
69
+ const documentType = config.sanity?.documentType || 'post';
70
+ const result = await createSanityPost(client, plan, portableTextBody, imageRef, postDate, documentType);
71
+ return {
72
+ documentId: result._id,
73
+ slug: plan.slug,
74
+ };
75
+ }
76
+ //# sourceMappingURL=sanity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanity.js","sourceRoot":"","sources":["../../src/core/sanity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seshat-scribe",
3
- "version": "0.2.6",
3
+ "version": "0.3.0",
4
4
  "description": "The Autonomous Scribe for Static Blogs - AI-powered content generation using Google Gemini",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -48,6 +48,7 @@
48
48
  "dependencies": {
49
49
  "@google/genai": "^1.37.0",
50
50
  "@inquirer/prompts": "^8.2.0",
51
+ "@sanity/client": "^7.14.0",
51
52
  "chalk": "^5.3.0",
52
53
  "commander": "^12.1.0",
53
54
  "dotenv": "^16.4.7",