@edtools/cli 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.
Files changed (40) hide show
  1. package/README.md +219 -0
  2. package/bin/edtools.js +9 -0
  3. package/dist/adapters/html/index.d.ts +18 -0
  4. package/dist/adapters/html/index.d.ts.map +1 -0
  5. package/dist/adapters/html/index.js +132 -0
  6. package/dist/adapters/html/index.js.map +1 -0
  7. package/dist/chunk-6534GCE5.js +458 -0
  8. package/dist/cli/commands/generate.d.ts +9 -0
  9. package/dist/cli/commands/generate.d.ts.map +1 -0
  10. package/dist/cli/commands/generate.js +101 -0
  11. package/dist/cli/commands/generate.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +6 -0
  13. package/dist/cli/commands/init.d.ts.map +1 -0
  14. package/dist/cli/commands/init.js +160 -0
  15. package/dist/cli/commands/init.js.map +1 -0
  16. package/dist/cli/index.d.ts +1 -0
  17. package/dist/cli/index.d.ts.map +1 -0
  18. package/dist/cli/index.js +286 -0
  19. package/dist/cli/index.js.map +1 -0
  20. package/dist/core/generator.d.ts +14 -0
  21. package/dist/core/generator.d.ts.map +1 -0
  22. package/dist/core/generator.js +241 -0
  23. package/dist/core/generator.js.map +1 -0
  24. package/dist/index.d.ts +170 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +10 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/types/adapter.d.ts +22 -0
  29. package/dist/types/adapter.d.ts.map +1 -0
  30. package/dist/types/adapter.js +24 -0
  31. package/dist/types/adapter.js.map +1 -0
  32. package/dist/types/content.d.ts +118 -0
  33. package/dist/types/content.d.ts.map +1 -0
  34. package/dist/types/content.js +2 -0
  35. package/dist/types/content.js.map +1 -0
  36. package/dist/types/index.d.ts +3 -0
  37. package/dist/types/index.d.ts.map +1 -0
  38. package/dist/types/index.js +3 -0
  39. package/dist/types/index.js.map +1 -0
  40. package/package.json +51 -0
@@ -0,0 +1,241 @@
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import path from 'path';
3
+ import fs from 'fs-extra';
4
+ import slugify from 'slugify';
5
+ import { AdapterRegistry } from '../types/adapter.js';
6
+ import { HTMLAdapter } from '../adapters/html/index.js';
7
+ export class ContentGenerator {
8
+ anthropic;
9
+ adapters;
10
+ constructor(apiKey) {
11
+ this.anthropic = new Anthropic({
12
+ apiKey: apiKey || process.env.ANTHROPIC_API_KEY || '',
13
+ });
14
+ this.adapters = new AdapterRegistry();
15
+ this.adapters.register(new HTMLAdapter());
16
+ }
17
+ async generate(config) {
18
+ const results = {
19
+ success: true,
20
+ posts: [],
21
+ warnings: [],
22
+ errors: [],
23
+ };
24
+ try {
25
+ const adapter = await this.adapters.detectAdapter(config.projectPath);
26
+ if (!adapter) {
27
+ throw new Error('No suitable adapter found for this project');
28
+ }
29
+ console.log(`āœ“ Using adapter: ${adapter.name}`);
30
+ const topics = config.topics || await this.generateTopics(config.productInfo, config.count || 3);
31
+ for (const topic of topics.slice(0, config.count || 3)) {
32
+ try {
33
+ console.log(`\nšŸ“ Generating: ${topic}`);
34
+ const content = await this.generateContent(config.productInfo, topic);
35
+ const output = await adapter.render(content);
36
+ const slug = content.metadata.slug;
37
+ const fileName = adapter.transformPath?.(slug) || `${slug}/index${adapter.getFileExtension()}`;
38
+ const outputPath = path.join(config.outputDir, fileName);
39
+ await adapter.write(output, outputPath);
40
+ results.posts.push({
41
+ title: content.metadata.title,
42
+ slug,
43
+ path: outputPath,
44
+ seoScore: content.seo.score,
45
+ });
46
+ console.log(`āœ“ Generated: ${outputPath}`);
47
+ console.log(` SEO Score: ${content.seo.score}/100`);
48
+ }
49
+ catch (error) {
50
+ results.errors?.push(`Failed to generate "${topic}": ${error.message}`);
51
+ results.success = false;
52
+ }
53
+ }
54
+ if (results.posts.length > 0) {
55
+ await this.updateSitemap(config.projectPath, config.outputDir, results.posts);
56
+ }
57
+ }
58
+ catch (error) {
59
+ results.success = false;
60
+ results.errors?.push(error.message);
61
+ }
62
+ return results;
63
+ }
64
+ async generateContent(productInfo, topic) {
65
+ const prompt = this.buildPrompt(productInfo, topic);
66
+ const response = await this.anthropic.messages.create({
67
+ model: 'claude-3-5-sonnet-20241022',
68
+ max_tokens: 4096,
69
+ temperature: 0.7,
70
+ messages: [
71
+ {
72
+ role: 'user',
73
+ content: prompt,
74
+ },
75
+ ],
76
+ });
77
+ const textContent = response.content[0].type === 'text' ? response.content[0].text : '';
78
+ const jsonMatch = textContent.match(/\{[\s\S]*\}/);
79
+ if (!jsonMatch) {
80
+ throw new Error('Failed to extract JSON from Claude response');
81
+ }
82
+ const contentData = JSON.parse(jsonMatch[0]);
83
+ const slug = slugify(contentData.metadata.title, { lower: true, strict: true });
84
+ const content = {
85
+ metadata: {
86
+ ...contentData.metadata,
87
+ slug,
88
+ datePublished: new Date().toISOString(),
89
+ author: productInfo.name,
90
+ },
91
+ schemaOrg: this.generateSchemaOrg({
92
+ ...contentData.metadata,
93
+ slug,
94
+ datePublished: new Date().toISOString(),
95
+ author: productInfo.name,
96
+ }, productInfo),
97
+ content: contentData.content,
98
+ relatedPosts: [],
99
+ seo: await this.calculateSEOScore(contentData),
100
+ };
101
+ return content;
102
+ }
103
+ buildPrompt(productInfo, topic) {
104
+ return `You are an expert SEO content writer. Generate a comprehensive blog post about: "${topic}"
105
+
106
+ Product context:
107
+ - Name: ${productInfo.name}
108
+ - Tagline: ${productInfo.tagline || ''}
109
+ - Category: ${productInfo.category}
110
+ - Features: ${productInfo.features.join(', ')}
111
+ - Pricing: ${productInfo.pricingModel || 'Not specified'}
112
+ ${productInfo.useCases ? `- Use cases: ${productInfo.useCases.join(', ')}` : ''}
113
+
114
+ IMPORTANT INSTRUCTIONS:
115
+ 1. Write for users searching on Google and being recommended by AI assistants (Claude, ChatGPT)
116
+ 2. Focus on being helpful, not promotional
117
+ 3. Include comparisons with alternatives when relevant
118
+ 4. Use natural language, avoid keyword stuffing
119
+ 5. Make it comprehensive (1000-1500 words worth of content)
120
+ 6. Structure with clear sections (intro, 3-5 main sections, conclusion)
121
+ 7. Be factual - do NOT invent statistics or make false claims
122
+
123
+ Output ONLY valid JSON in this exact format (no markdown, no code blocks):
124
+ {
125
+ "metadata": {
126
+ "title": "SEO-optimized title (under 60 chars)",
127
+ "description": "Meta description (under 160 chars)",
128
+ "keywords": ["keyword1", "keyword2", "keyword3"],
129
+ "category": "${productInfo.category}"
130
+ },
131
+ "content": {
132
+ "intro": "Engaging introduction paragraph in markdown format",
133
+ "sections": [
134
+ {
135
+ "heading": "Section title",
136
+ "level": 2,
137
+ "content": "Section content in markdown format",
138
+ "type": "text"
139
+ }
140
+ ],
141
+ "conclusion": "Conclusion paragraph in markdown",
142
+ "cta": {
143
+ "text": "Try ${productInfo.name}",
144
+ "url": "${productInfo.websiteUrl || '/signup'}"
145
+ }
146
+ }
147
+ }`;
148
+ }
149
+ generateSchemaOrg(metadata, productInfo) {
150
+ return {
151
+ '@context': 'https://schema.org',
152
+ '@type': 'BlogPosting',
153
+ headline: metadata.title,
154
+ description: metadata.description,
155
+ author: {
156
+ '@type': 'Organization',
157
+ name: productInfo.name,
158
+ url: productInfo.websiteUrl,
159
+ },
160
+ datePublished: metadata.datePublished,
161
+ publisher: {
162
+ '@type': 'Organization',
163
+ name: productInfo.name,
164
+ },
165
+ keywords: metadata.keywords.join(', '),
166
+ articleSection: metadata.category,
167
+ };
168
+ }
169
+ async calculateSEOScore(content) {
170
+ let score = 100;
171
+ const suggestions = [];
172
+ if (content.metadata.title.length > 60) {
173
+ score -= 10;
174
+ suggestions.push('Title is too long (should be under 60 chars)');
175
+ }
176
+ if (content.metadata.description.length > 160) {
177
+ score -= 10;
178
+ suggestions.push('Meta description is too long (should be under 160 chars)');
179
+ }
180
+ if (content.metadata.keywords.length < 3) {
181
+ score -= 5;
182
+ suggestions.push('Add more keywords (at least 3)');
183
+ }
184
+ if (content.content.sections.length < 3) {
185
+ score -= 10;
186
+ suggestions.push('Add more sections for better structure (at least 3)');
187
+ }
188
+ return {
189
+ score: Math.max(0, score),
190
+ suggestions,
191
+ };
192
+ }
193
+ async generateTopics(productInfo, count) {
194
+ const prompt = `Generate ${count} SEO-friendly blog post topics for a product called "${productInfo.name}" in the ${productInfo.category} category.
195
+
196
+ Product description: ${productInfo.description}
197
+ Features: ${productInfo.features.join(', ')}
198
+
199
+ Requirements:
200
+ - Topics should be helpful for potential customers
201
+ - Focus on solving problems or answering questions
202
+ - Include comparisons, guides, and use cases
203
+ - Optimize for search engines and AI recommendations
204
+
205
+ Output ONLY a JSON array of topic strings, no markdown:
206
+ ["Topic 1", "Topic 2", "Topic 3"]`;
207
+ const response = await this.anthropic.messages.create({
208
+ model: 'claude-3-5-sonnet-20241022',
209
+ max_tokens: 1024,
210
+ messages: [{ role: 'user', content: prompt }],
211
+ });
212
+ const textContent = response.content[0].type === 'text' ? response.content[0].text : '';
213
+ const jsonMatch = textContent.match(/\[[\s\S]*\]/);
214
+ if (jsonMatch) {
215
+ return JSON.parse(jsonMatch[0]);
216
+ }
217
+ return [
218
+ `Best ${productInfo.category} software ${new Date().getFullYear()}`,
219
+ `How to choose ${productInfo.category} solution`,
220
+ `${productInfo.name} vs alternatives: Complete comparison`,
221
+ ];
222
+ }
223
+ async updateSitemap(projectPath, blogDir, posts) {
224
+ const sitemapPath = path.join(projectPath, 'sitemap.xml');
225
+ const urls = posts.map(post => {
226
+ return ` <url>
227
+ <loc>${post.slug}/</loc>
228
+ <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>
229
+ <changefreq>weekly</changefreq>
230
+ <priority>0.8</priority>
231
+ </url>`;
232
+ }).join('\n');
233
+ const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
234
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
235
+ ${urls}
236
+ </urlset>`;
237
+ await fs.writeFile(sitemapPath, sitemap, 'utf-8');
238
+ console.log(`\nāœ“ Updated sitemap.xml`);
239
+ }
240
+ }
241
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ interface BlogPostMetadata {
2
+ title: string;
3
+ description: string;
4
+ keywords: string[];
5
+ author: string;
6
+ datePublished: string;
7
+ category: string;
8
+ slug: string;
9
+ }
10
+ interface SchemaOrgData {
11
+ '@context': string;
12
+ '@type': 'BlogPosting' | 'Article';
13
+ headline: string;
14
+ description: string;
15
+ author: {
16
+ '@type': 'Person' | 'Organization';
17
+ name: string;
18
+ jobTitle?: string;
19
+ url?: string;
20
+ };
21
+ datePublished: string;
22
+ dateModified?: string;
23
+ publisher?: {
24
+ '@type': 'Organization';
25
+ name: string;
26
+ logo?: {
27
+ '@type': 'ImageObject';
28
+ url: string;
29
+ };
30
+ };
31
+ keywords?: string;
32
+ articleSection?: string;
33
+ }
34
+ interface ContentSection {
35
+ heading: string;
36
+ level: 2 | 3 | 4;
37
+ content: string;
38
+ type: 'text' | 'comparison' | 'list' | 'code';
39
+ data?: ComparisonData | ListData | CodeData;
40
+ }
41
+ interface ComparisonData {
42
+ headers: string[];
43
+ rows: string[][];
44
+ }
45
+ interface ListData {
46
+ items: Array<{
47
+ title: string;
48
+ description: string;
49
+ }>;
50
+ ordered: boolean;
51
+ }
52
+ interface CodeData {
53
+ language: string;
54
+ code: string;
55
+ caption?: string;
56
+ }
57
+ interface CTAData {
58
+ text: string;
59
+ url: string;
60
+ type?: 'primary' | 'secondary';
61
+ }
62
+ interface SEOData {
63
+ score: number;
64
+ suggestions: string[];
65
+ keywordDensity?: number;
66
+ readabilityScore?: number;
67
+ }
68
+ interface RelatedPost {
69
+ title: string;
70
+ slug: string;
71
+ url: string;
72
+ excerpt?: string;
73
+ }
74
+ interface BlogPostContent {
75
+ metadata: BlogPostMetadata;
76
+ schemaOrg: SchemaOrgData;
77
+ content: {
78
+ intro: string;
79
+ sections: ContentSection[];
80
+ conclusion: string;
81
+ cta: CTAData;
82
+ };
83
+ relatedPosts?: RelatedPost[];
84
+ seo: SEOData;
85
+ }
86
+ interface ProductInfo {
87
+ name: string;
88
+ tagline?: string;
89
+ description: string;
90
+ category: string;
91
+ features: string[];
92
+ useCases?: string[];
93
+ pricingModel?: 'free' | 'freemium' | 'paid' | 'open_source';
94
+ pricingDetails?: string;
95
+ websiteUrl: string;
96
+ keywords?: string[];
97
+ }
98
+ interface GenerateConfig {
99
+ productInfo: ProductInfo;
100
+ topics?: string[];
101
+ count?: number;
102
+ outputDir: string;
103
+ projectPath: string;
104
+ avoidDuplicates?: boolean;
105
+ similarityThreshold?: number;
106
+ }
107
+ interface GenerateResult {
108
+ success: boolean;
109
+ posts: Array<{
110
+ title: string;
111
+ slug: string;
112
+ path: string;
113
+ seoScore: number;
114
+ }>;
115
+ warnings?: string[];
116
+ errors?: string[];
117
+ }
118
+
119
+ interface Adapter {
120
+ name: string;
121
+ detect(projectPath: string): Promise<boolean>;
122
+ render(content: BlogPostContent): Promise<string>;
123
+ write(output: string, outputPath: string): Promise<void>;
124
+ configure?(config: AdapterConfig): void;
125
+ getFileExtension(): string;
126
+ transformPath?(basePath: string): string;
127
+ }
128
+ interface AdapterConfig {
129
+ [key: string]: any;
130
+ }
131
+ declare class AdapterRegistry {
132
+ private adapters;
133
+ constructor();
134
+ register(adapter: Adapter): void;
135
+ get(name: string): Adapter | undefined;
136
+ detectAdapter(projectPath: string): Promise<Adapter | null>;
137
+ list(): string[];
138
+ }
139
+
140
+ declare class ContentGenerator {
141
+ private anthropic;
142
+ private adapters;
143
+ constructor(apiKey?: string);
144
+ generate(config: GenerateConfig): Promise<GenerateResult>;
145
+ private generateContent;
146
+ private buildPrompt;
147
+ private generateSchemaOrg;
148
+ private calculateSEOScore;
149
+ private generateTopics;
150
+ private updateSitemap;
151
+ }
152
+
153
+ declare class HTMLAdapter implements Adapter {
154
+ name: string;
155
+ private templatePath;
156
+ constructor();
157
+ detect(projectPath: string): Promise<boolean>;
158
+ render(content: BlogPostContent): Promise<string>;
159
+ write(output: string, outputPath: string): Promise<void>;
160
+ getFileExtension(): string;
161
+ transformPath(basePath: string): string;
162
+ private markdownToHTML;
163
+ private renderSectionContent;
164
+ private renderComparisonTable;
165
+ private renderList;
166
+ private renderCode;
167
+ private escapeHtml;
168
+ }
169
+
170
+ export { type Adapter, type AdapterConfig, AdapterRegistry, type BlogPostContent, type BlogPostMetadata, type CTAData, type CodeData, type ComparisonData, ContentGenerator, type ContentSection, type GenerateConfig, type GenerateResult, HTMLAdapter, type ListData, type ProductInfo, type RelatedPost, type SEOData, type SchemaOrgData };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import {
2
+ AdapterRegistry,
3
+ ContentGenerator,
4
+ HTMLAdapter
5
+ } from "./chunk-6534GCE5.js";
6
+ export {
7
+ AdapterRegistry,
8
+ ContentGenerator,
9
+ HTMLAdapter
10
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { BlogPostContent } from './content.js';
2
+ export interface Adapter {
3
+ name: string;
4
+ detect(projectPath: string): Promise<boolean>;
5
+ render(content: BlogPostContent): Promise<string>;
6
+ write(output: string, outputPath: string): Promise<void>;
7
+ configure?(config: AdapterConfig): void;
8
+ getFileExtension(): string;
9
+ transformPath?(basePath: string): string;
10
+ }
11
+ export interface AdapterConfig {
12
+ [key: string]: any;
13
+ }
14
+ export declare class AdapterRegistry {
15
+ private adapters;
16
+ constructor();
17
+ register(adapter: Adapter): void;
18
+ get(name: string): Adapter | undefined;
19
+ detectAdapter(projectPath: string): Promise<Adapter | null>;
20
+ list(): string[];
21
+ }
22
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,OAAO;IAItB,IAAI,EAAE,MAAM,CAAC;IAMb,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAO9C,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAOlD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAKzD,SAAS,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAKxC,gBAAgB,IAAI,MAAM,CAAC;IAK3B,aAAa,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAKD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuB;;IAMvC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIhC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASjE,IAAI,IAAI,MAAM,EAAE;CAGjB"}
@@ -0,0 +1,24 @@
1
+ export class AdapterRegistry {
2
+ adapters;
3
+ constructor() {
4
+ this.adapters = new Map();
5
+ }
6
+ register(adapter) {
7
+ this.adapters.set(adapter.name, adapter);
8
+ }
9
+ get(name) {
10
+ return this.adapters.get(name);
11
+ }
12
+ async detectAdapter(projectPath) {
13
+ for (const adapter of this.adapters.values()) {
14
+ if (await adapter.detect(projectPath)) {
15
+ return adapter;
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ list() {
21
+ return Array.from(this.adapters.keys());
22
+ }
23
+ }
24
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAuDA,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAuB;IAEvC;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAmB;QACrC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,118 @@
1
+ export interface BlogPostMetadata {
2
+ title: string;
3
+ description: string;
4
+ keywords: string[];
5
+ author: string;
6
+ datePublished: string;
7
+ category: string;
8
+ slug: string;
9
+ }
10
+ export interface SchemaOrgData {
11
+ '@context': string;
12
+ '@type': 'BlogPosting' | 'Article';
13
+ headline: string;
14
+ description: string;
15
+ author: {
16
+ '@type': 'Person' | 'Organization';
17
+ name: string;
18
+ jobTitle?: string;
19
+ url?: string;
20
+ };
21
+ datePublished: string;
22
+ dateModified?: string;
23
+ publisher?: {
24
+ '@type': 'Organization';
25
+ name: string;
26
+ logo?: {
27
+ '@type': 'ImageObject';
28
+ url: string;
29
+ };
30
+ };
31
+ keywords?: string;
32
+ articleSection?: string;
33
+ }
34
+ export interface ContentSection {
35
+ heading: string;
36
+ level: 2 | 3 | 4;
37
+ content: string;
38
+ type: 'text' | 'comparison' | 'list' | 'code';
39
+ data?: ComparisonData | ListData | CodeData;
40
+ }
41
+ export interface ComparisonData {
42
+ headers: string[];
43
+ rows: string[][];
44
+ }
45
+ export interface ListData {
46
+ items: Array<{
47
+ title: string;
48
+ description: string;
49
+ }>;
50
+ ordered: boolean;
51
+ }
52
+ export interface CodeData {
53
+ language: string;
54
+ code: string;
55
+ caption?: string;
56
+ }
57
+ export interface CTAData {
58
+ text: string;
59
+ url: string;
60
+ type?: 'primary' | 'secondary';
61
+ }
62
+ export interface SEOData {
63
+ score: number;
64
+ suggestions: string[];
65
+ keywordDensity?: number;
66
+ readabilityScore?: number;
67
+ }
68
+ export interface RelatedPost {
69
+ title: string;
70
+ slug: string;
71
+ url: string;
72
+ excerpt?: string;
73
+ }
74
+ export interface BlogPostContent {
75
+ metadata: BlogPostMetadata;
76
+ schemaOrg: SchemaOrgData;
77
+ content: {
78
+ intro: string;
79
+ sections: ContentSection[];
80
+ conclusion: string;
81
+ cta: CTAData;
82
+ };
83
+ relatedPosts?: RelatedPost[];
84
+ seo: SEOData;
85
+ }
86
+ export interface ProductInfo {
87
+ name: string;
88
+ tagline?: string;
89
+ description: string;
90
+ category: string;
91
+ features: string[];
92
+ useCases?: string[];
93
+ pricingModel?: 'free' | 'freemium' | 'paid' | 'open_source';
94
+ pricingDetails?: string;
95
+ websiteUrl: string;
96
+ keywords?: string[];
97
+ }
98
+ export interface GenerateConfig {
99
+ productInfo: ProductInfo;
100
+ topics?: string[];
101
+ count?: number;
102
+ outputDir: string;
103
+ projectPath: string;
104
+ avoidDuplicates?: boolean;
105
+ similarityThreshold?: number;
106
+ }
107
+ export interface GenerateResult {
108
+ success: boolean;
109
+ posts: Array<{
110
+ title: string;
111
+ slug: string;
112
+ path: string;
113
+ seoScore: number;
114
+ }>;
115
+ warnings?: string[];
116
+ errors?: string[];
117
+ }
118
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from './content.js';
2
+ export * from './adapter.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './content.js';
2
+ export * from './adapter.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}