seshat-scribe 0.0.4 → 0.1.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.
package/README.md CHANGED
@@ -35,7 +35,11 @@ cd your-blog-project
35
35
  seshat init
36
36
  ```
37
37
 
38
- This creates a `seshat.config.json` file in your project root.
38
+ **New!** Seshat now features an **interactive setup wizard** that guides you through configuration:
39
+ - **Quick Setup**: Get started in seconds with recommended defaults
40
+ - **Custom Setup**: Full control over every option
41
+
42
+ See [SETUP_WIZARD.md](./SETUP_WIZARD.md) for details.
39
43
 
40
44
  ### 2. Configure Your Blog
41
45
 
@@ -80,6 +84,10 @@ seshat write --dry-run
80
84
 
81
85
  ## 🔧 Configuration Options
82
86
 
87
+ Seshat is highly configurable to match your blog's structure and needs.
88
+
89
+ ### Quick Configuration
90
+
83
91
  | Option | Type | Description |
84
92
  |--------|------|-------------|
85
93
  | `contentDir` | string | Directory containing your blog MDX files |
@@ -87,7 +95,17 @@ seshat write --dry-run
87
95
  | `publicAssetPath` | string | Public URL path for images in frontmatter |
88
96
  | `topic` | string | Global topic constraint for content generation |
89
97
  | `tone` | string | Writing tone (e.g., "Professional yet witty") |
90
- | `framework` | "remix" \| "next" \| "astro" | Blog framework for frontmatter format |
98
+ | `framework` | "remix" \| "next" \| "astro" | Blog framework preset (optional) |
99
+
100
+ ### Advanced Configuration
101
+
102
+ Seshat supports extensive customization:
103
+
104
+ - **File Structure**: Custom file extensions, naming templates, nested directories
105
+ - **Frontmatter**: Custom field names, date formats, additional metadata
106
+ - **Content Generation**: Word count targets, code examples, SEO optimization, custom instructions
107
+
108
+ **📖 See [CONFIG.md](./CONFIG.md) for complete documentation and examples**
91
109
 
92
110
  ## 🤖 GitHub Actions Automation
93
111
 
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuI3E"}
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"}
@@ -7,6 +7,7 @@ import { writeBlogPost } from '../core/writer.js';
7
7
  import { generateImage } from '../core/artist.js';
8
8
  import { gold, cyan, error, info, scrollWritten } from '../lib/output.js';
9
9
  import { resetUsage, formatUsageSummary } from '../lib/usage.js';
10
+ import { buildFileName, buildNestedPath } from '../lib/frontmatter.js';
10
11
  /**
11
12
  * Main command: Generate a new blog post with image
12
13
  */
@@ -64,9 +65,10 @@ export async function generate(options = {}) {
64
65
  text: cyan('Seshat is writing...'),
65
66
  color: 'cyan',
66
67
  }).start();
68
+ const postDate = new Date();
67
69
  let mdxContent;
68
70
  try {
69
- mdxContent = await writeBlogPost(config, plan);
71
+ mdxContent = await writeBlogPost(config, plan, postDate);
70
72
  writeSpinner.succeed('Content written');
71
73
  }
72
74
  catch (err) {
@@ -96,8 +98,13 @@ export async function generate(options = {}) {
96
98
  color: 'cyan',
97
99
  }).start();
98
100
  try {
101
+ // Build file name from template
102
+ const fileExtension = config.fileExtension || 'mdx';
103
+ 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);
99
106
  // Replace the placeholder image path with the actual path
100
- const publicImagePath = `${config.publicAssetPath}/${plan.slug}.png`;
107
+ const publicImagePath = `${config.publicAssetPath}/${plan.slug}.${imageExtension}`;
101
108
  mdxContent = mdxContent.replace(/PLACEHOLDER_IMAGE/g, publicImagePath);
102
109
  if (options.dryRun) {
103
110
  saveSpinner.info('Dry run: skipping file write');
@@ -107,11 +114,15 @@ export async function generate(options = {}) {
107
114
  console.log('');
108
115
  }
109
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);
121
+ }
110
122
  // Ensure content directory exists
111
- const contentPath = path.resolve(process.cwd(), config.contentDir);
112
123
  await fs.mkdir(contentPath, { recursive: true });
113
124
  // Write the MDX file
114
- const mdxFilePath = path.join(contentPath, `${plan.slug}.mdx`);
125
+ const mdxFilePath = path.join(contentPath, fileName);
115
126
  await fs.writeFile(mdxFilePath, mdxContent, 'utf-8');
116
127
  const relativeMdxPath = path.relative(process.cwd(), mdxFilePath);
117
128
  saveSpinner.succeed(`Saved: ${relativeMdxPath}`);
@@ -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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"}
@@ -1,5 +1,9 @@
1
+ interface InitOptions {
2
+ interactive?: boolean;
3
+ }
1
4
  /**
2
5
  * Initialize Seshat configuration in the current directory
3
6
  */
4
- export declare function init(): Promise<void>;
7
+ export declare function init(options?: InitOptions): Promise<void>;
8
+ export {};
5
9
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB1C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyRnE"}
@@ -1,29 +1,255 @@
1
1
  import fs from 'fs/promises';
2
2
  import path from 'path';
3
+ import { input, select, confirm } from '@inquirer/prompts';
3
4
  import { DEFAULT_CONFIG } from '../config.js';
4
- import { success, info } from '../lib/output.js';
5
+ import { success, info, gold, cyan } from '../lib/output.js';
5
6
  /**
6
7
  * Initialize Seshat configuration in the current directory
7
8
  */
8
- export async function init() {
9
+ export async function init(options = {}) {
9
10
  const configPath = path.join(process.cwd(), 'seshat.config.json');
10
11
  try {
11
12
  await fs.access(configPath);
12
13
  info('Configuration file already exists at seshat.config.json');
13
- return;
14
+ const overwrite = await confirm({
15
+ message: 'Do you want to overwrite it?',
16
+ default: false,
17
+ });
18
+ if (!overwrite) {
19
+ info('Keeping existing configuration.');
20
+ return;
21
+ }
14
22
  }
15
23
  catch {
16
- // File doesn't exist, create it
24
+ // File doesn't exist, continue with setup
17
25
  }
18
- const configContent = JSON.stringify(DEFAULT_CONFIG, null, 2);
26
+ console.log('');
27
+ console.log(gold.bold('✦ Seshat Configuration Wizard'));
28
+ console.log(cyan('Let\'s set up your blog configuration...'));
29
+ console.log('');
30
+ // Offer quick setup option
31
+ const setupMode = await select({
32
+ message: 'How would you like to set up Seshat?',
33
+ choices: [
34
+ {
35
+ name: 'Quick Setup (recommended defaults)',
36
+ value: 'quick',
37
+ description: 'Basic setup with sensible defaults',
38
+ },
39
+ {
40
+ name: 'Custom Setup (guided configuration)',
41
+ value: 'custom',
42
+ description: 'Step-by-step configuration with all options',
43
+ },
44
+ ],
45
+ default: 'quick',
46
+ });
47
+ const config = {};
48
+ if (setupMode === 'quick') {
49
+ // Quick setup - just ask essential questions
50
+ console.log('');
51
+ console.log(cyan('📦 Quick Setup'));
52
+ console.log('');
53
+ const framework = await select({
54
+ message: 'Which framework are you using?',
55
+ choices: [
56
+ { name: 'Remix', value: 'remix' },
57
+ { name: 'Next.js', value: 'next' },
58
+ { name: 'Astro', value: 'astro' },
59
+ ],
60
+ default: 'remix',
61
+ });
62
+ config.framework = framework;
63
+ config.contentDir = await input({
64
+ message: 'Blog posts directory:',
65
+ default: DEFAULT_CONFIG.contentDir,
66
+ });
67
+ config.topic = await input({
68
+ message: 'Blog topic:',
69
+ default: DEFAULT_CONFIG.topic,
70
+ });
71
+ // Use defaults for everything else
72
+ config.assetsDir = DEFAULT_CONFIG.assetsDir;
73
+ config.publicAssetPath = DEFAULT_CONFIG.publicAssetPath;
74
+ config.tone = DEFAULT_CONFIG.tone;
75
+ console.log('');
76
+ info('✓ Using recommended defaults for remaining settings');
77
+ }
78
+ else {
79
+ // Custom setup - full wizard
80
+ // Start with framework selection
81
+ const useFrameworkPreset = await confirm({
82
+ message: 'Do you want to use a framework preset?',
83
+ default: true,
84
+ });
85
+ if (useFrameworkPreset) {
86
+ const framework = await select({
87
+ message: 'Which framework are you using?',
88
+ choices: [
89
+ {
90
+ name: 'Remix (date, image, tag)',
91
+ value: 'remix',
92
+ description: 'For Remix applications',
93
+ },
94
+ {
95
+ name: 'Next.js (date, coverImage, tag)',
96
+ value: 'next',
97
+ description: 'For Next.js applications',
98
+ },
99
+ {
100
+ name: 'Astro (pubDate, heroImage, tag)',
101
+ value: 'astro',
102
+ description: 'For Astro sites',
103
+ },
104
+ ],
105
+ default: 'remix',
106
+ });
107
+ config.framework = framework;
108
+ }
109
+ // Project directories
110
+ console.log('');
111
+ console.log(cyan('📁 Project Structure'));
112
+ config.contentDir = await input({
113
+ message: 'Where do you store your blog posts?',
114
+ default: DEFAULT_CONFIG.contentDir,
115
+ });
116
+ config.assetsDir = await input({
117
+ message: 'Where should generated images be saved?',
118
+ default: DEFAULT_CONFIG.assetsDir,
119
+ });
120
+ config.publicAssetPath = await input({
121
+ message: 'What is the public URL path for images?',
122
+ default: DEFAULT_CONFIG.publicAssetPath,
123
+ });
124
+ // Content settings
125
+ console.log('');
126
+ console.log(cyan('✍️ Content Settings'));
127
+ config.topic = await input({
128
+ message: 'What is your blog\'s main topic?',
129
+ default: DEFAULT_CONFIG.topic,
130
+ });
131
+ config.tone = await input({
132
+ message: 'What writing tone should Seshat use?',
133
+ default: DEFAULT_CONFIG.tone,
134
+ });
135
+ // Advanced options
136
+ console.log('');
137
+ const configureAdvanced = await confirm({
138
+ message: 'Configure advanced options? (file naming, generation settings)',
139
+ default: false,
140
+ });
141
+ if (configureAdvanced) {
142
+ console.log('');
143
+ console.log(cyan('⚙️ Advanced Options'));
144
+ // File extension
145
+ const fileExtension = await select({
146
+ message: 'File extension for blog posts:',
147
+ choices: [
148
+ { name: '.mdx (MDX - Markdown with JSX)', value: 'mdx' },
149
+ { name: '.md (Standard Markdown)', value: 'md' },
150
+ ],
151
+ default: 'mdx',
152
+ });
153
+ config.fileExtension = fileExtension;
154
+ // File naming
155
+ const fileNamePattern = await select({
156
+ message: 'File naming pattern:',
157
+ choices: [
158
+ { name: 'my-post-title.mdx', value: '{{slug}}' },
159
+ { name: '2024-01-15-my-post-title.mdx', value: '{{date}}-{{slug}}' },
160
+ { name: '2024-01-my-post-title.mdx', value: '{{year}}-{{month}}-{{slug}}' },
161
+ ],
162
+ default: '{{slug}}',
163
+ });
164
+ config.fileNameTemplate = fileNamePattern;
165
+ // Nested directories
166
+ config.nestedDirectories = await confirm({
167
+ message: 'Organize posts in date-based folders? (e.g., 2024/01/)',
168
+ default: false,
169
+ });
170
+ // Generation options
171
+ const configureGeneration = await confirm({
172
+ message: 'Configure content generation options?',
173
+ default: false,
174
+ });
175
+ if (configureGeneration) {
176
+ config.generation = {};
177
+ const setWordCount = await confirm({
178
+ message: 'Set a target word count?',
179
+ default: false,
180
+ });
181
+ if (setWordCount) {
182
+ const wordCount = await input({
183
+ message: 'Target word count:',
184
+ default: '1500',
185
+ validate: (value) => {
186
+ const num = parseInt(value, 10);
187
+ if (isNaN(num) || num < 100) {
188
+ return 'Please enter a valid number (at least 100)';
189
+ }
190
+ return true;
191
+ },
192
+ });
193
+ config.generation.targetWordCount = parseInt(wordCount, 10);
194
+ }
195
+ config.generation.includeCodeExamples = await confirm({
196
+ message: 'Emphasize code examples in posts?',
197
+ default: false,
198
+ });
199
+ config.generation.seoOptimized = await confirm({
200
+ message: 'Generate SEO-optimized content?',
201
+ default: false,
202
+ });
203
+ const addCustomInstructions = await confirm({
204
+ message: 'Add custom writing instructions?',
205
+ default: false,
206
+ });
207
+ if (addCustomInstructions) {
208
+ config.generation.customInstructions = await input({
209
+ message: 'Custom instructions:',
210
+ default: '',
211
+ });
212
+ }
213
+ }
214
+ }
215
+ }
216
+ // Build final config with defaults
217
+ const finalConfig = {
218
+ contentDir: config.contentDir,
219
+ assetsDir: config.assetsDir,
220
+ publicAssetPath: config.publicAssetPath,
221
+ topic: config.topic,
222
+ tone: config.tone,
223
+ ...(config.framework && { framework: config.framework }),
224
+ ...(config.fileExtension && { fileExtension: config.fileExtension }),
225
+ ...(config.imageFormat && { imageFormat: config.imageFormat }),
226
+ ...(config.fileNameTemplate && { fileNameTemplate: config.fileNameTemplate }),
227
+ ...(config.nestedDirectories !== undefined && { nestedDirectories: config.nestedDirectories }),
228
+ ...(config.generation && Object.keys(config.generation).length > 0 && { generation: config.generation }),
229
+ };
230
+ // Save configuration
231
+ const configContent = JSON.stringify(finalConfig, null, 2);
19
232
  await fs.writeFile(configPath, configContent, 'utf-8');
20
- success('Created seshat.config.json');
21
- info('Edit this file to configure Seshat for your blog');
22
233
  console.log('');
23
- console.log(' Next steps:');
234
+ success(' Created seshat.config.json');
235
+ console.log('');
236
+ // Show summary
237
+ console.log(gold('📋 Configuration Summary:'));
238
+ console.log(` Content directory: ${finalConfig.contentDir}`);
239
+ console.log(` Assets directory: ${finalConfig.assetsDir}`);
240
+ console.log(` Topic: ${finalConfig.topic}`);
241
+ console.log(` Tone: ${finalConfig.tone}`);
242
+ if (finalConfig.framework) {
243
+ console.log(` Framework: ${finalConfig.framework}`);
244
+ }
245
+ console.log('');
246
+ console.log(gold('🚀 Next steps:'));
24
247
  console.log(' 1. Set your GEMINI_API_KEY environment variable');
25
- console.log(' 2. Run: seshat write');
26
- console.log(' 3. Run: seshat setup-workflow (add schedule to config, then run to create .github/workflows/seshat.yml)');
248
+ console.log(' export GEMINI_API_KEY="your_key_here"');
249
+ console.log(' 2. Generate your first post: seshat write');
250
+ console.log(' 3. (Optional) Set up GitHub Actions: seshat setup-workflow');
251
+ console.log('');
252
+ console.log(cyan('💡 Tip: Run "seshat init" again anytime to reconfigure'));
27
253
  console.log('');
28
254
  }
29
255
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAEvD,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACtC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,2GAA2G,CAAC,CAAC;IACzH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,4 +1,50 @@
1
1
  import { z } from 'zod';
2
+ /**
3
+ * Frontmatter configuration schema
4
+ */
5
+ export declare const FrontmatterConfigSchema: z.ZodObject<{
6
+ dateField: z.ZodOptional<z.ZodString>;
7
+ dateFormat: z.ZodOptional<z.ZodString>;
8
+ imageField: z.ZodOptional<z.ZodString>;
9
+ includePublished: z.ZodOptional<z.ZodBoolean>;
10
+ taxonomyField: z.ZodOptional<z.ZodString>;
11
+ additionalFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ dateField?: string | undefined;
14
+ dateFormat?: string | undefined;
15
+ imageField?: string | undefined;
16
+ includePublished?: boolean | undefined;
17
+ taxonomyField?: string | undefined;
18
+ additionalFields?: Record<string, any> | undefined;
19
+ }, {
20
+ dateField?: string | undefined;
21
+ dateFormat?: string | undefined;
22
+ imageField?: string | undefined;
23
+ includePublished?: boolean | undefined;
24
+ taxonomyField?: string | undefined;
25
+ additionalFields?: Record<string, any> | undefined;
26
+ }>;
27
+ export type FrontmatterConfig = z.infer<typeof FrontmatterConfigSchema>;
28
+ /**
29
+ * Content generation options schema
30
+ */
31
+ export declare const GenerationConfigSchema: z.ZodObject<{
32
+ targetWordCount: z.ZodOptional<z.ZodNumber>;
33
+ includeCodeExamples: z.ZodOptional<z.ZodBoolean>;
34
+ seoOptimized: z.ZodOptional<z.ZodBoolean>;
35
+ customInstructions: z.ZodOptional<z.ZodString>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ targetWordCount?: number | undefined;
38
+ includeCodeExamples?: boolean | undefined;
39
+ seoOptimized?: boolean | undefined;
40
+ customInstructions?: string | undefined;
41
+ }, {
42
+ targetWordCount?: number | undefined;
43
+ includeCodeExamples?: boolean | undefined;
44
+ seoOptimized?: boolean | undefined;
45
+ customInstructions?: string | undefined;
46
+ }>;
47
+ export type GenerationConfig = z.infer<typeof GenerationConfigSchema>;
2
48
  /**
3
49
  * Zod schema for Seshat configuration
4
50
  */
@@ -8,30 +54,116 @@ export declare const SeshatConfigSchema: z.ZodObject<{
8
54
  publicAssetPath: z.ZodString;
9
55
  topic: z.ZodString;
10
56
  tone: z.ZodString;
11
- framework: z.ZodEnum<["remix", "next", "astro"]>;
57
+ framework: z.ZodOptional<z.ZodEnum<["remix", "next", "astro"]>>;
12
58
  schedule: z.ZodOptional<z.ZodString>;
59
+ fileExtension: z.ZodOptional<z.ZodEnum<["mdx", "md"]>>;
60
+ imageFormat: z.ZodOptional<z.ZodEnum<["png", "jpg", "svg"]>>;
61
+ fileNameTemplate: z.ZodOptional<z.ZodString>;
62
+ nestedDirectories: z.ZodOptional<z.ZodBoolean>;
63
+ frontmatter: z.ZodOptional<z.ZodObject<{
64
+ dateField: z.ZodOptional<z.ZodString>;
65
+ dateFormat: z.ZodOptional<z.ZodString>;
66
+ imageField: z.ZodOptional<z.ZodString>;
67
+ includePublished: z.ZodOptional<z.ZodBoolean>;
68
+ taxonomyField: z.ZodOptional<z.ZodString>;
69
+ additionalFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ dateField?: string | undefined;
72
+ dateFormat?: string | undefined;
73
+ imageField?: string | undefined;
74
+ includePublished?: boolean | undefined;
75
+ taxonomyField?: string | undefined;
76
+ additionalFields?: Record<string, any> | undefined;
77
+ }, {
78
+ dateField?: string | undefined;
79
+ dateFormat?: string | undefined;
80
+ imageField?: string | undefined;
81
+ includePublished?: boolean | undefined;
82
+ taxonomyField?: string | undefined;
83
+ additionalFields?: Record<string, any> | undefined;
84
+ }>>;
85
+ generation: z.ZodOptional<z.ZodObject<{
86
+ targetWordCount: z.ZodOptional<z.ZodNumber>;
87
+ includeCodeExamples: z.ZodOptional<z.ZodBoolean>;
88
+ seoOptimized: z.ZodOptional<z.ZodBoolean>;
89
+ customInstructions: z.ZodOptional<z.ZodString>;
90
+ }, "strip", z.ZodTypeAny, {
91
+ targetWordCount?: number | undefined;
92
+ includeCodeExamples?: boolean | undefined;
93
+ seoOptimized?: boolean | undefined;
94
+ customInstructions?: string | undefined;
95
+ }, {
96
+ targetWordCount?: number | undefined;
97
+ includeCodeExamples?: boolean | undefined;
98
+ seoOptimized?: boolean | undefined;
99
+ customInstructions?: string | undefined;
100
+ }>>;
13
101
  }, "strip", z.ZodTypeAny, {
14
102
  contentDir: string;
15
103
  assetsDir: string;
16
104
  publicAssetPath: string;
17
105
  topic: string;
18
106
  tone: string;
19
- framework: "remix" | "next" | "astro";
107
+ framework?: "remix" | "next" | "astro" | undefined;
20
108
  schedule?: string | undefined;
109
+ fileExtension?: "mdx" | "md" | undefined;
110
+ imageFormat?: "png" | "jpg" | "svg" | undefined;
111
+ fileNameTemplate?: string | undefined;
112
+ nestedDirectories?: boolean | undefined;
113
+ frontmatter?: {
114
+ dateField?: string | undefined;
115
+ dateFormat?: string | undefined;
116
+ imageField?: string | undefined;
117
+ includePublished?: boolean | undefined;
118
+ taxonomyField?: string | undefined;
119
+ additionalFields?: Record<string, any> | undefined;
120
+ } | undefined;
121
+ generation?: {
122
+ targetWordCount?: number | undefined;
123
+ includeCodeExamples?: boolean | undefined;
124
+ seoOptimized?: boolean | undefined;
125
+ customInstructions?: string | undefined;
126
+ } | undefined;
21
127
  }, {
22
128
  contentDir: string;
23
129
  assetsDir: string;
24
130
  publicAssetPath: string;
25
131
  topic: string;
26
132
  tone: string;
27
- framework: "remix" | "next" | "astro";
133
+ framework?: "remix" | "next" | "astro" | undefined;
28
134
  schedule?: string | undefined;
135
+ fileExtension?: "mdx" | "md" | undefined;
136
+ imageFormat?: "png" | "jpg" | "svg" | undefined;
137
+ fileNameTemplate?: string | undefined;
138
+ nestedDirectories?: boolean | undefined;
139
+ frontmatter?: {
140
+ dateField?: string | undefined;
141
+ dateFormat?: string | undefined;
142
+ imageField?: string | undefined;
143
+ includePublished?: boolean | undefined;
144
+ taxonomyField?: string | undefined;
145
+ additionalFields?: Record<string, any> | undefined;
146
+ } | undefined;
147
+ generation?: {
148
+ targetWordCount?: number | undefined;
149
+ includeCodeExamples?: boolean | undefined;
150
+ seoOptimized?: boolean | undefined;
151
+ customInstructions?: string | undefined;
152
+ } | undefined;
29
153
  }>;
30
154
  export type SeshatConfig = z.infer<typeof SeshatConfigSchema>;
155
+ /**
156
+ * Framework preset configurations
157
+ */
158
+ export declare const FRAMEWORK_PRESETS: Record<'remix' | 'next' | 'astro', Partial<SeshatConfig>>;
31
159
  /**
32
160
  * Default configuration values
33
161
  */
34
162
  export declare const DEFAULT_CONFIG: SeshatConfig;
163
+ /**
164
+ * Resolve configuration with framework presets and defaults
165
+ */
166
+ export declare function resolveConfig(config: SeshatConfig): SeshatConfig;
35
167
  /**
36
168
  * Load and validate configuration from file
37
169
  */
@@ -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,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAW7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAO5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAK1E"}
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"}
package/dist/config.js CHANGED
@@ -1,4 +1,24 @@
1
1
  import { z } from 'zod';
2
+ /**
3
+ * Frontmatter configuration schema
4
+ */
5
+ export const FrontmatterConfigSchema = z.object({
6
+ dateField: z.string().optional().describe('Field name for date (e.g., "date", "pubDate", "publishedAt")'),
7
+ dateFormat: z.string().optional().describe('Date format: "iso" (default), "date-only", or custom format'),
8
+ imageField: z.string().optional().describe('Field name for image (e.g., "image", "coverImage", "heroImage")'),
9
+ includePublished: z.boolean().optional().describe('Include published: true field'),
10
+ taxonomyField: z.string().optional().describe('Field name for primary taxonomy (e.g., "tag", "category")'),
11
+ additionalFields: z.record(z.any()).optional().describe('Additional custom frontmatter fields'),
12
+ });
13
+ /**
14
+ * Content generation options schema
15
+ */
16
+ export const GenerationConfigSchema = z.object({
17
+ targetWordCount: z.number().optional().describe('Target word count for posts (null for AI decision)'),
18
+ includeCodeExamples: z.boolean().optional().describe('Emphasize code examples in content'),
19
+ seoOptimized: z.boolean().optional().describe('Generate SEO-optimized content'),
20
+ customInstructions: z.string().optional().describe('Additional custom instructions for content generation'),
21
+ });
2
22
  /**
3
23
  * Zod schema for Seshat configuration
4
24
  */
@@ -8,12 +28,56 @@ export const SeshatConfigSchema = z.object({
8
28
  publicAssetPath: z.string().describe('Public URL path for images'),
9
29
  topic: z.string().describe('Global topic constraint for content generation'),
10
30
  tone: z.string().describe('Writing tone (e.g., "Professional yet witty")'),
11
- framework: z.enum(['remix', 'next', 'astro']).describe('Blog framework type'),
31
+ framework: z.enum(['remix', 'next', 'astro']).optional().describe('Blog framework type (uses preset configuration)'),
12
32
  schedule: z
13
33
  .string()
14
34
  .optional()
15
35
  .describe('Cron expression for GitHub Actions (e.g. "0 9 * * *" for daily at 9 UTC)'),
36
+ // File structure options
37
+ fileExtension: z.enum(['mdx', 'md']).optional().describe('File extension for posts'),
38
+ imageFormat: z.enum(['png', 'jpg', 'svg']).optional().describe('Image format for generated images'),
39
+ fileNameTemplate: z.string().optional().describe('Template for file naming (e.g., "{{slug}}", "{{date}}-{{slug}}")'),
40
+ nestedDirectories: z.boolean().optional().describe('Use date-based nested directories (e.g., 2024/01/)'),
41
+ // Frontmatter customization
42
+ frontmatter: FrontmatterConfigSchema.optional().describe('Custom frontmatter configuration'),
43
+ // Content generation options
44
+ generation: GenerationConfigSchema.optional().describe('Content generation options'),
16
45
  });
46
+ /**
47
+ * Framework preset configurations
48
+ */
49
+ export const FRAMEWORK_PRESETS = {
50
+ remix: {
51
+ fileExtension: 'mdx',
52
+ frontmatter: {
53
+ dateField: 'date',
54
+ dateFormat: 'iso',
55
+ imageField: 'image',
56
+ includePublished: true,
57
+ taxonomyField: 'tag',
58
+ },
59
+ },
60
+ next: {
61
+ fileExtension: 'mdx',
62
+ frontmatter: {
63
+ dateField: 'date',
64
+ dateFormat: 'iso',
65
+ imageField: 'coverImage',
66
+ includePublished: true,
67
+ taxonomyField: 'tag',
68
+ },
69
+ },
70
+ astro: {
71
+ fileExtension: 'mdx',
72
+ frontmatter: {
73
+ dateField: 'pubDate',
74
+ dateFormat: 'iso',
75
+ imageField: 'heroImage',
76
+ includePublished: true,
77
+ taxonomyField: 'tag',
78
+ },
79
+ },
80
+ };
17
81
  /**
18
82
  * Default configuration values
19
83
  */
@@ -24,7 +88,42 @@ export const DEFAULT_CONFIG = {
24
88
  topic: 'Software Engineering and Technology',
25
89
  tone: 'Professional yet witty',
26
90
  framework: 'remix',
91
+ fileExtension: 'mdx',
92
+ imageFormat: 'png',
93
+ fileNameTemplate: '{{slug}}',
94
+ nestedDirectories: false,
27
95
  };
96
+ /**
97
+ * Resolve configuration with framework presets and defaults
98
+ */
99
+ export function resolveConfig(config) {
100
+ // If framework is specified, merge with preset
101
+ let resolved = { ...config };
102
+ if (config.framework && FRAMEWORK_PRESETS[config.framework]) {
103
+ const preset = FRAMEWORK_PRESETS[config.framework];
104
+ // Apply preset values only if not explicitly set
105
+ if (!config.fileExtension)
106
+ resolved.fileExtension = preset.fileExtension;
107
+ if (!config.frontmatter)
108
+ resolved.frontmatter = preset.frontmatter;
109
+ }
110
+ // Apply remaining defaults
111
+ resolved.fileExtension = resolved.fileExtension || DEFAULT_CONFIG.fileExtension;
112
+ resolved.imageFormat = resolved.imageFormat || DEFAULT_CONFIG.imageFormat;
113
+ resolved.fileNameTemplate = resolved.fileNameTemplate || DEFAULT_CONFIG.fileNameTemplate;
114
+ resolved.nestedDirectories = resolved.nestedDirectories ?? DEFAULT_CONFIG.nestedDirectories;
115
+ // Default frontmatter config if none provided
116
+ if (!resolved.frontmatter) {
117
+ resolved.frontmatter = {
118
+ dateField: 'date',
119
+ dateFormat: 'iso',
120
+ imageField: 'image',
121
+ includePublished: true,
122
+ taxonomyField: 'tag',
123
+ };
124
+ }
125
+ return resolved;
126
+ }
28
127
  /**
29
128
  * Load and validate configuration from file
30
129
  */
@@ -32,6 +131,7 @@ export async function loadConfig(configPath) {
32
131
  const fs = await import('fs/promises');
33
132
  const raw = await fs.readFile(configPath, 'utf-8');
34
133
  const json = JSON.parse(raw);
35
- return SeshatConfigSchema.parse(json);
134
+ const config = SeshatConfigSchema.parse(json);
135
+ return resolveConfig(config);
36
136
  }
37
137
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACtE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAChE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAClE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IAC5E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC1E,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAC7E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;CACxF,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,UAAU,EAAE,iBAAiB;IAC7B,SAAS,EAAE,yBAAyB;IACpC,eAAe,EAAE,mBAAmB;IACpC,KAAK,EAAE,qCAAqC;IAC5C,IAAI,EAAE,wBAAwB;IAC9B,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+ErF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAQnE"}
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgGrF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAQnE"}
@@ -5,6 +5,9 @@ import matter from 'gray-matter';
5
5
  * Scan the content directory and extract metadata from all MDX files
6
6
  */
7
7
  export async function scanRepository(config) {
8
+ // Get frontmatter field names from config
9
+ const dateField = config.frontmatter?.dateField || 'date';
10
+ const taxonomyField = config.frontmatter?.taxonomyField || 'tag';
8
11
  const contentPath = path.resolve(process.cwd(), config.contentDir);
9
12
  try {
10
13
  await fs.access(contentPath);
@@ -17,15 +20,23 @@ export async function scanRepository(config) {
17
20
  recentTopics: [],
18
21
  };
19
22
  }
20
- const entries = await fs.readdir(contentPath, { withFileTypes: true });
21
23
  const posts = [];
22
- for (const entry of entries) {
23
- if (!entry.isFile())
24
- continue;
25
- if (!/\.(md|mdx)$/i.test(entry.name))
26
- continue;
27
- const filePath = path.join(contentPath, entry.name);
28
- const slug = entry.name.replace(/\.(md|mdx)$/i, '');
24
+ // Recursively scan for MD/MDX files (to support nested directories)
25
+ async function* findMarkdownFiles(dir) {
26
+ const entries = await fs.readdir(dir, { withFileTypes: true });
27
+ for (const entry of entries) {
28
+ const fullPath = path.join(dir, entry.name);
29
+ if (entry.isDirectory()) {
30
+ yield* findMarkdownFiles(fullPath);
31
+ }
32
+ else if (/\.(md|mdx)$/i.test(entry.name)) {
33
+ yield fullPath;
34
+ }
35
+ }
36
+ }
37
+ for await (const filePath of findMarkdownFiles(contentPath)) {
38
+ const fileName = path.basename(filePath);
39
+ const slug = fileName.replace(/\.(md|mdx)$/i, '');
29
40
  try {
30
41
  const content = await fs.readFile(filePath, 'utf-8');
31
42
  // Try gray-matter first
@@ -40,11 +51,11 @@ export async function scanRepository(config) {
40
51
  if (!frontmatterMatch)
41
52
  throw yamlError;
42
53
  const fm = frontmatterMatch[1];
43
- // Extract fields manually
54
+ // Extract fields manually using configured field names
44
55
  const titleMatch = fm.match(/^title:\s*['"](.+?)['"]?\s*$/m);
45
56
  const descMatch = fm.match(/^description:\s*>-?\s*\n((?:\s+.+\n?)+)/m);
46
- const tagMatch = fm.match(/^tags?:\s*(.+?)\s*$/m);
47
- const dateMatch = fm.match(/^(?:date|pubDate):\s*(.+?)\s*$/m);
57
+ const tagMatch = fm.match(new RegExp(`^${taxonomyField}s?:\\s*(.+?)\\s*$`, 'm'));
58
+ const dateMatch = fm.match(new RegExp(`^${dateField}:\\s*(.+?)\\s*$`, 'm'));
48
59
  data = {
49
60
  title: titleMatch ? titleMatch[1] : slug,
50
61
  description: descMatch ? descMatch[1].replace(/\n\s+/g, ' ').trim() : undefined,
@@ -53,13 +64,16 @@ export async function scanRepository(config) {
53
64
  date: dateMatch ? dateMatch[1].trim() : undefined,
54
65
  };
55
66
  }
56
- // Handle 'tag' or 'tags' field (some posts use singular)
57
- const tags = data.tags || (data.tag ? [data.tag] : undefined);
67
+ // Handle configured taxonomy field (singular or plural)
68
+ const taxonomyValue = data[taxonomyField] || data[`${taxonomyField}s`] || data.tags || data.tag;
69
+ const tags = Array.isArray(taxonomyValue) ? taxonomyValue : (taxonomyValue ? [taxonomyValue] : undefined);
70
+ // Get date from configured field
71
+ const dateValue = data[dateField] || data.date || data.pubDate;
58
72
  posts.push({
59
73
  title: data.title || slug,
60
74
  description: data.description,
61
- tags: Array.isArray(tags) ? tags : (tags ? [tags] : undefined),
62
- date: data.date || data.pubDate,
75
+ tags,
76
+ date: dateValue,
63
77
  slug,
64
78
  });
65
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/core/analyzer.ts"],"names":[],"mappings":"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"}
@@ -11,14 +11,14 @@ export declare const BlogPlanSchema: z.ZodObject<{
11
11
  tags: z.ZodArray<z.ZodString, "many">;
12
12
  imagePrompt: z.ZodString;
13
13
  }, "strip", z.ZodTypeAny, {
14
- title: string;
15
14
  description: string;
15
+ title: string;
16
16
  tags: string[];
17
17
  slug: string;
18
18
  imagePrompt: string;
19
19
  }, {
20
- title: string;
21
20
  description: string;
21
+ title: string;
22
22
  tags: string[];
23
23
  slug: string;
24
24
  imagePrompt: string;
@@ -3,5 +3,5 @@ import type { SeshatConfig } from '../config.js';
3
3
  /**
4
4
  * Use Gemini to write a complete MDX blog post
5
5
  */
6
- export declare function writeBlogPost(config: SeshatConfig, plan: BlogPlan): Promise<string>;
6
+ export declare function writeBlogPost(config: SeshatConfig, plan: BlogPlan, postDate?: Date): Promise<string>;
7
7
  //# sourceMappingURL=writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/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,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,MAAM,CAAC,CAmEjB"}
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmBjD;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,QAAQ,EACd,QAAQ,GAAE,IAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAgGjB"}
@@ -1,5 +1,6 @@
1
1
  import { createGenAIClient } from '../lib/gemini.js';
2
2
  import { addUsage, fromGenerateContentResponse } from '../lib/usage.js';
3
+ import { buildFrontmatter } from '../lib/frontmatter.js';
3
4
  const WRITE_MODEL = 'gemini-3-flash-preview';
4
5
  function pickOne(arr) {
5
6
  return arr[Math.floor(Math.random() * arr.length)];
@@ -17,20 +18,45 @@ const OPENING_STYLES = [
17
18
  /**
18
19
  * Use Gemini to write a complete MDX blog post
19
20
  */
20
- export async function writeBlogPost(config, plan) {
21
+ export async function writeBlogPost(config, plan, postDate = new Date()) {
21
22
  const ai = createGenAIClient();
22
- // Get current date in ISO format
23
- const currentDate = new Date().toISOString();
24
23
  // Pick the first tag from the plan
25
24
  const primaryTag = plan.tags[0] || 'general';
26
- const frontmatterFormat = getFrontmatterFormat(config.framework, plan.title, plan.description, currentDate, primaryTag);
25
+ // Ensure frontmatter config exists (should be set by resolveConfig)
26
+ if (!config.frontmatter) {
27
+ throw new Error('Frontmatter configuration is missing. This should not happen.');
28
+ }
29
+ // Build frontmatter using the new system
30
+ const frontmatter = buildFrontmatter(config.frontmatter, {
31
+ title: plan.title,
32
+ description: plan.description,
33
+ date: postDate,
34
+ tag: primaryTag,
35
+ imagePath: 'PLACEHOLDER_IMAGE',
36
+ });
27
37
  const opening = pickOne(OPENING_STYLES);
38
+ // Build generation instructions
39
+ let generationInstructions = '';
40
+ if (config.generation) {
41
+ if (config.generation.targetWordCount) {
42
+ generationInstructions += `\n- Target length: approximately ${config.generation.targetWordCount} words`;
43
+ }
44
+ if (config.generation.includeCodeExamples) {
45
+ generationInstructions += '\n- Include multiple practical code examples throughout the post';
46
+ }
47
+ if (config.generation.seoOptimized) {
48
+ generationInstructions += '\n- Optimize for SEO: use keywords naturally, clear headings, scannable structure';
49
+ }
50
+ if (config.generation.customInstructions) {
51
+ generationInstructions += `\n- Additional instructions: ${config.generation.customInstructions}`;
52
+ }
53
+ }
28
54
  const prompt = `Write a technical blog post in MDX format. Clear, valuable, focused on helping readers understand. Vary your voice — avoid sounding like a generic AI or a template.
29
55
 
30
56
  **Post Details:**
31
57
  - Title: ${plan.title}
32
58
  - Description: ${plan.description}
33
- - Tag: ${primaryTag}
59
+ - Tag: ${primaryTag}${generationInstructions}
34
60
 
35
61
  **Opening (follow this for the first paragraph):**
36
62
  ${opening.instruction}
@@ -58,7 +84,7 @@ Do NOT start with "In this article we will...", "In today's post...", or similar
58
84
  **Format Requirements:**
59
85
  Use EXACTLY this frontmatter:
60
86
 
61
- ${frontmatterFormat}
87
+ ${frontmatter}
62
88
 
63
89
  After the frontmatter, start your content immediately. No import statements.
64
90
 
@@ -77,41 +103,4 @@ Write a focused, valuable post that helps developers understand ${plan.title}.`;
77
103
  }
78
104
  return content;
79
105
  }
80
- /**
81
- * Get the appropriate frontmatter format for the framework
82
- */
83
- function getFrontmatterFormat(framework, title, description, date, tag) {
84
- // Format description for multiline YAML (>-)
85
- const descLines = description.split('\n').map(line => line.trim()).filter(Boolean);
86
- const formattedDesc = descLines.length > 0
87
- ? `>-\n ${descLines.join('\n ')}`
88
- : `>-\n ${description}`;
89
- const formats = {
90
- remix: `---
91
- title: "${title}"
92
- description: ${formattedDesc}
93
- date: ${date}
94
- published: true
95
- tag: ${tag}
96
- image: "PLACEHOLDER_IMAGE"
97
- ---`,
98
- next: `---
99
- title: "${title}"
100
- description: ${formattedDesc}
101
- date: ${date}
102
- published: true
103
- tag: ${tag}
104
- coverImage: "PLACEHOLDER_IMAGE"
105
- ---`,
106
- astro: `---
107
- title: "${title}"
108
- description: ${formattedDesc}
109
- pubDate: ${date}
110
- published: true
111
- tag: ${tag}
112
- heroImage: "PLACEHOLDER_IMAGE"
113
- ---`,
114
- };
115
- return formats[framework];
116
- }
117
106
  //# sourceMappingURL=writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { FrontmatterConfig } from '../config.js';
2
+ /**
3
+ * Format a date according to the specified format
4
+ */
5
+ export declare function formatDate(date: Date, format?: string): string;
6
+ /**
7
+ * Format a multiline string for YAML (using >- syntax)
8
+ */
9
+ export declare function formatMultilineYAML(text: string): string;
10
+ /**
11
+ * Build frontmatter string from configuration and values
12
+ */
13
+ export declare function buildFrontmatter(config: FrontmatterConfig, values: {
14
+ title: string;
15
+ description: string;
16
+ date: Date;
17
+ tag: string;
18
+ imagePath: string;
19
+ }): string;
20
+ /**
21
+ * Generate file name from template
22
+ */
23
+ export declare function buildFileName(template: string, slug: string, date: Date, extension: string): string;
24
+ /**
25
+ * Build nested directory path based on date
26
+ */
27
+ export declare function buildNestedPath(date: Date, baseDir: string): string;
28
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA2B9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,MAAM,CA8CR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnE"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Format a date according to the specified format
3
+ */
4
+ export function formatDate(date, format) {
5
+ if (!format || format === 'iso') {
6
+ return date.toISOString();
7
+ }
8
+ if (format === 'date-only') {
9
+ return date.toISOString().split('T')[0];
10
+ }
11
+ // Custom format support (basic implementation)
12
+ // Supports: YYYY, MM, DD, HH, mm, ss
13
+ let formatted = format;
14
+ const year = date.getFullYear();
15
+ const month = String(date.getMonth() + 1).padStart(2, '0');
16
+ const day = String(date.getDate()).padStart(2, '0');
17
+ const hours = String(date.getHours()).padStart(2, '0');
18
+ const minutes = String(date.getMinutes()).padStart(2, '0');
19
+ const seconds = String(date.getSeconds()).padStart(2, '0');
20
+ formatted = formatted.replace('YYYY', String(year));
21
+ formatted = formatted.replace('MM', month);
22
+ formatted = formatted.replace('DD', day);
23
+ formatted = formatted.replace('HH', hours);
24
+ formatted = formatted.replace('mm', minutes);
25
+ formatted = formatted.replace('ss', seconds);
26
+ return formatted;
27
+ }
28
+ /**
29
+ * Format a multiline string for YAML (using >- syntax)
30
+ */
31
+ export function formatMultilineYAML(text) {
32
+ const lines = text.split('\n').map(line => line.trim()).filter(Boolean);
33
+ if (lines.length === 0)
34
+ return '""';
35
+ if (lines.length === 1)
36
+ return `"${lines[0]}"`;
37
+ return `>-\n ${lines.join('\n ')}`;
38
+ }
39
+ /**
40
+ * Build frontmatter string from configuration and values
41
+ */
42
+ export function buildFrontmatter(config, values) {
43
+ const lines = ['---'];
44
+ // Title (always included)
45
+ lines.push(`title: "${values.title}"`);
46
+ // Description (multiline format)
47
+ lines.push(`description: ${formatMultilineYAML(values.description)}`);
48
+ // Date (with custom field name and format)
49
+ const dateField = config.dateField || 'date';
50
+ const formattedDate = formatDate(values.date, config.dateFormat);
51
+ lines.push(`${dateField}: ${formattedDate}`);
52
+ // Published field (optional)
53
+ if (config.includePublished) {
54
+ lines.push('published: true');
55
+ }
56
+ // Taxonomy field (tag/category)
57
+ const taxonomyField = config.taxonomyField || 'tag';
58
+ lines.push(`${taxonomyField}: ${values.tag}`);
59
+ // Image field (with custom field name)
60
+ const imageField = config.imageField || 'image';
61
+ lines.push(`${imageField}: "${values.imagePath}"`);
62
+ // Additional custom fields
63
+ if (config.additionalFields) {
64
+ for (const [key, value] of Object.entries(config.additionalFields)) {
65
+ if (typeof value === 'string') {
66
+ lines.push(`${key}: "${value}"`);
67
+ }
68
+ else if (typeof value === 'boolean' || typeof value === 'number') {
69
+ lines.push(`${key}: ${value}`);
70
+ }
71
+ else if (Array.isArray(value)) {
72
+ lines.push(`${key}: [${value.map(v => `"${v}"`).join(', ')}]`);
73
+ }
74
+ else if (value && typeof value === 'object') {
75
+ // Simple object serialization
76
+ lines.push(`${key}: ${JSON.stringify(value)}`);
77
+ }
78
+ }
79
+ }
80
+ lines.push('---');
81
+ return lines.join('\n');
82
+ }
83
+ /**
84
+ * Generate file name from template
85
+ */
86
+ export function buildFileName(template, slug, date, extension) {
87
+ let fileName = template;
88
+ // Replace template variables
89
+ fileName = fileName.replace('{{slug}}', slug);
90
+ // Date components
91
+ const year = date.getFullYear();
92
+ const month = String(date.getMonth() + 1).padStart(2, '0');
93
+ const day = String(date.getDate()).padStart(2, '0');
94
+ fileName = fileName.replace('{{year}}', String(year));
95
+ fileName = fileName.replace('{{month}}', month);
96
+ fileName = fileName.replace('{{day}}', day);
97
+ fileName = fileName.replace('{{date}}', `${year}-${month}-${day}`);
98
+ // Handle {{ext}} placeholder or append extension
99
+ if (fileName.includes('{{ext}}')) {
100
+ fileName = fileName.replace('{{ext}}', extension);
101
+ }
102
+ else {
103
+ // If no {{ext}} in template, append .extension
104
+ fileName = `${fileName}.${extension}`;
105
+ }
106
+ return fileName;
107
+ }
108
+ /**
109
+ * Build nested directory path based on date
110
+ */
111
+ export function buildNestedPath(date, baseDir) {
112
+ const year = date.getFullYear();
113
+ const month = String(date.getMonth() + 1).padStart(2, '0');
114
+ return `${baseDir}/${year}/${month}`;
115
+ }
116
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.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.0.4",
3
+ "version": "0.1.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",
@@ -43,6 +43,7 @@
43
43
  ],
44
44
  "dependencies": {
45
45
  "@google/genai": "^1.37.0",
46
+ "@inquirer/prompts": "^8.2.0",
46
47
  "chalk": "^5.3.0",
47
48
  "commander": "^12.1.0",
48
49
  "dotenv": "^16.4.7",