core-maugli 1.1.8 → 1.2.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 +12 -6
- package/bin/init.js +64 -5
- package/package.json +2 -2
- package/src/components/ArticleMeta.astro +1 -1
- package/src/components/AuthorCard.astro +1 -1
- package/src/components/Avatar.astro +1 -1
- package/src/components/NetlifyButton.astro +22 -0
- package/src/config/maugli.config.ts +16 -6
- package/src/content/authors/daria-zorina.md +3 -3
- package/src/content/authors/default-autor.md +3 -3
- package/src/content/authors/igor-sokolov.md +3 -3
- package/src/content/authors/john-walker.md +3 -3
- package/src/content/blog/jsonld-guide.md +3 -3
- package/src/content/blog/post-0.md +1 -1
- package/src/content/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.md +1 -1
- package/src/content/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.md +1 -1
- package/src/content/blog/test-post-2025-07-11.md +1 -1
- package/src/content/pages/blog.mdx +1 -1
- package/src/content/products/maugli-editor.md +1 -1
- package/src/content/products/maugli-freeblog.md +2 -2
- package/src/content/projects/project-1.md +1 -1
- package/src/content/projects/project-2.md +1 -1
- package/src/content/tags/ai-business.mdx +1 -1
- package/src/content/tags/automation.mdx +1 -1
- package/src/content/tags/content-strategy.mdx +1 -1
- package/src/content/tags/growth-marketing.mdx +1 -1
- package/src/content/tags/industry-reviews.mdx +1 -1
- package/src/content/tags/interesting.mdx +1 -1
- package/src/content/tags/seo-ai-seo.mdx +1 -1
- package/src/pages/authors/[...page].astro +1 -1
- package/src/pages/authors/[id].astro +2 -2
- package/src/img/default/autor_default.webp +0 -0
- package/src/img/default/rubric_default.webp +0 -0
- package/src/img/examples/authors/anna.webp +0 -0
- package/src/img/examples/authors/carlos.webp +0 -0
- package/src/img/examples/authors/daria.webp +0 -0
- package/src/img/examples/authors/dmitry.webp +0 -0
- package/src/img/examples/authors/igor.webp +0 -0
- package/src/img/examples/authors/john.webp +0 -0
- package/src/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
- package/src/img/examples/blog/post_1_jsonld_guide.webp +0 -0
- package/src/img/examples/blog/tr-post-1.webp +0 -0
- /package/{src/assets → public}/img/default/autor_default.webp +0 -0
- /package/{src/assets → public}/img/default/blog_default.webp +0 -0
- /package/{src → public}/img/default/default.webp +0 -0
- /package/{src/assets → public}/img/default/product_default.webp +0 -0
- /package/{src/assets → public}/img/default/project_default.webp +0 -0
- /package/{src/assets → public}/img/default/rubric_default.webp +0 -0
- /package/{src → public}/img/default/test.webp +0 -0
- /package/{src → public}/img/default/test2.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/anna.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/carlos.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/daria.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/dmitry.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/igor.webp +0 -0
- /package/{src/assets → public}/img/examples/authors/john.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/post-1-avtomatizaciya-marketinga-kak-ii-osvobozhdaet-predprinimatelei-ot-cifrovogo-rabstva.webp +0 -0
- /package/{src → public}/img/examples/blog/post-2-avtomatizaciya-kontenta-kak-neiroseti-ubivayut-perfekcionizm-v-biznese.webp +0 -0
- /package/{src → public}/img/examples/blog/post-3-laik-ne-valyuta-kak-avtomatizaciya-marketinga-spasaet-ot-lozhnyh-metrik.webp +0 -0
- /package/{src → public}/img/examples/blog/post-5-5-fatalnyh-oshibok-marketinga-kotorye-ubivayut-startapy-na-starte.webp +0 -0
- /package/{src → public}/img/examples/blog/post-6-5-strategii-kontent-marketinga-dlya-startapov-avtomatizaciya-i-revolyuciya.webp +0 -0
- /package/{src → public}/img/examples/blog/post-7-viralnyi-kontent-ne-udacha-a-strategiya-avtomatizaciya-marketinga.webp +0 -0
- /package/{src → public}/img/examples/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/post_11.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/post_12.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/post_1_jsonld_guide.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/test-post.webp +0 -0
- /package/{src/assets → public}/img/examples/blog/tr-post-1.webp +0 -0
- /package/{src/assets → public}/img/examples/products/product_1.webp +0 -0
- /package/{src/assets → public}/img/examples/products/product_2.webp +0 -0
- /package/{src/assets → public}/img/examples/projects/project_1.webp +0 -0
- /package/{src/assets → public}/img/examples/projects/project_2.webp +0 -0
package/README.md
CHANGED
@@ -8,14 +8,19 @@ Maugli is a lightweight, agent-friendly blog that can integrate into an existing
|
|
8
8
|
|
9
9
|
The theme includes a `product` entity for showcasing offerings. Rename it (for example, to "services") and hide or customize related menu items by editing the `navLinks` array in the same configuration file.
|
10
10
|
|
11
|
-
[](https://app.netlify.com/start/deploy?repository=https://github.com/dashapps/maugli-
|
11
|
+
[](https://app.netlify.com/start/deploy?repository=https://github.com/dashapps/core-maugli-blog)
|
12
12
|
|
13
|
-
|
14
|
-
`repository=` parameter in the link above so it points to your repository or
|
15
|
-
connect the repo through the Netlify UI.
|
13
|
+
The Netlify deployment button automatically uses your repository URL configured in [`src/config/maugli.config.ts`](src/config/maugli.config.ts). When you run `npx core-maugli init`, it will ask for your repository URL and configure the deployment button accordingly.
|
16
14
|
|
17
|
-
|
18
|
-
|
15
|
+
You can also use the dynamic `<NetlifyButton />` component in your Astro pages:
|
16
|
+
|
17
|
+
```astro
|
18
|
+
---
|
19
|
+
import NetlifyButton from '../components/NetlifyButton.astro';
|
20
|
+
---
|
21
|
+
|
22
|
+
<NetlifyButton />
|
23
|
+
```
|
19
24
|
|
20
25
|
Using Netlify CLI instead:
|
21
26
|
|
@@ -239,3 +244,4 @@ commercial license.
|
|
239
244
|
|
240
245
|
Contact <licensing@maugli.cfd> or visit
|
241
246
|
<https://maugli.cfd/licensing> for more information.
|
247
|
+
|
package/bin/init.js
CHANGED
@@ -31,7 +31,47 @@ function promptLang(codes) {
|
|
31
31
|
});
|
32
32
|
}
|
33
33
|
|
34
|
-
function
|
34
|
+
function promptRepo() {
|
35
|
+
return new Promise(resolve => {
|
36
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
37
|
+
rl.question('Repository URL: ', answer => {
|
38
|
+
rl.close();
|
39
|
+
resolve(answer.trim());
|
40
|
+
});
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
async function getRepoUrl(targetDir, repoOption) {
|
45
|
+
if (repoOption) return repoOption;
|
46
|
+
try {
|
47
|
+
const url = execSync('git remote get-url origin', {
|
48
|
+
cwd: targetDir,
|
49
|
+
stdio: ['ignore', 'pipe', 'ignore']
|
50
|
+
})
|
51
|
+
.toString()
|
52
|
+
.trim();
|
53
|
+
if (url) return url;
|
54
|
+
} catch {
|
55
|
+
// ignore
|
56
|
+
}
|
57
|
+
return await promptRepo();
|
58
|
+
}
|
59
|
+
|
60
|
+
function updateReadme(targetDir, repoUrl) {
|
61
|
+
if (!repoUrl) return;
|
62
|
+
const readmePath = path.join(targetDir, 'README.md');
|
63
|
+
if (!existsSync(readmePath)) return;
|
64
|
+
let content = readFileSync(readmePath, 'utf8');
|
65
|
+
const pattern = /https:\/\/app\.netlify\.com\/start\/deploy\?repository=[^\)\s]+/;
|
66
|
+
content = content.replace(
|
67
|
+
pattern,
|
68
|
+
`https://app.netlify.com/start/deploy?repository=${repoUrl}`
|
69
|
+
);
|
70
|
+
writeFileSync(readmePath, content);
|
71
|
+
console.log('Updated Netlify link in README.md');
|
72
|
+
}
|
73
|
+
|
74
|
+
function updateConfig(targetDir, lang, repoUrl) {
|
35
75
|
const configPath = path.join(targetDir, 'src', 'config', 'maugli.config.ts');
|
36
76
|
if (!existsSync(configPath)) return;
|
37
77
|
let content = readFileSync(configPath, 'utf8');
|
@@ -39,11 +79,23 @@ function updateConfig(targetDir, lang) {
|
|
39
79
|
const multiMatch = content.match(/enableMultiLang:\s*(true|false)/);
|
40
80
|
const multi = multiMatch ? multiMatch[1] === 'true' : false;
|
41
81
|
content = content.replace(/showLangSwitcher:\s*(true|false)/, `showLangSwitcher: ${multi}`);
|
82
|
+
|
83
|
+
// Update repository URL if provided
|
84
|
+
if (repoUrl) {
|
85
|
+
content = content.replace(
|
86
|
+
/repository:\s*{[^}]*url:\s*'[^']*'/,
|
87
|
+
`repository: {\n url: '${repoUrl}'`
|
88
|
+
);
|
89
|
+
}
|
90
|
+
|
42
91
|
writeFileSync(configPath, content);
|
43
92
|
console.log(`Configured default language to ${lang}`);
|
93
|
+
if (repoUrl) {
|
94
|
+
console.log(`Configured repository URL to ${repoUrl}`);
|
95
|
+
}
|
44
96
|
}
|
45
97
|
|
46
|
-
export default async function init(targetName, langOption) {
|
98
|
+
export default async function init(targetName, langOption, repoOption) {
|
47
99
|
const targetDir = targetName ? path.resolve(targetName) : process.cwd();
|
48
100
|
const codes = getLanguageCodes();
|
49
101
|
const lang = langOption && codes.includes(langOption) ? langOption : await promptLang(codes);
|
@@ -82,6 +134,9 @@ export default async function init(targetName, langOption) {
|
|
82
134
|
];
|
83
135
|
items.forEach(copyItem);
|
84
136
|
|
137
|
+
const repoUrl = await getRepoUrl(targetDir, repoOption);
|
138
|
+
updateReadme(targetDir, repoUrl);
|
139
|
+
|
85
140
|
// Create essential config files
|
86
141
|
const gitignoreContent = `
|
87
142
|
# Dependencies
|
@@ -122,7 +177,7 @@ dist/
|
|
122
177
|
console.log('Created .prettierrc');
|
123
178
|
|
124
179
|
execSync('npm install', { cwd: targetDir, stdio: 'inherit' });
|
125
|
-
updateConfig(targetDir, lang);
|
180
|
+
updateConfig(targetDir, lang, repoUrl);
|
126
181
|
}
|
127
182
|
|
128
183
|
// Если скрипт запускается напрямую
|
@@ -130,13 +185,17 @@ if (import.meta.url === `file://${process.argv[1]}`) {
|
|
130
185
|
const args = process.argv.slice(2);
|
131
186
|
let targetName;
|
132
187
|
let lang;
|
188
|
+
let repo;
|
133
189
|
for (let i = 0; i < args.length; i++) {
|
134
190
|
if (args[i] === '--lang' && i + 1 < args.length) {
|
135
191
|
lang = args[i + 1];
|
136
192
|
i++;
|
193
|
+
} else if (args[i] === '--repo' && i + 1 < args.length) {
|
194
|
+
repo = args[i + 1];
|
195
|
+
i++;
|
137
196
|
} else {
|
138
197
|
targetName = args[i];
|
139
198
|
}
|
140
199
|
}
|
141
|
-
await init(targetName, lang);
|
142
|
-
}
|
200
|
+
await init(targetName, lang, repo);
|
201
|
+
}
|
package/package.json
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
"name": "core-maugli",
|
3
3
|
"description": "Astro & Tailwind CSS blog theme for Maugli.",
|
4
4
|
"type": "module",
|
5
|
-
"version": "1.
|
5
|
+
"version": "1.2.0",
|
6
6
|
"license": "GPL-3.0-or-later OR Commercial",
|
7
7
|
"repository": {
|
8
8
|
"type": "git",
|
9
|
-
"url": "git+https://github.com/dashapps/maugli-
|
9
|
+
"url": "git+https://github.com/dashapps/core-maugli-blog.git"
|
10
10
|
},
|
11
11
|
"author": "Maugli Content Farm",
|
12
12
|
"keywords": [
|
@@ -57,7 +57,7 @@ if (!authorData) {
|
|
57
57
|
authorId = defaultAuthorData.id;
|
58
58
|
}
|
59
59
|
let authorName = authorData.data.name;
|
60
|
-
let authorImg = authorData.data.avatar || '
|
60
|
+
let authorImg = authorData.data.avatar || '/img/default/autor_default.webp';
|
61
61
|
---
|
62
62
|
|
63
63
|
<!-- Метаинформация сверху -->
|
@@ -46,7 +46,7 @@ const postCount = getPostsByAuthor(posts, slug).length;
|
|
46
46
|
<div class="flex flex-row items-start gap-4">
|
47
47
|
<!-- Аватар автора слева -->
|
48
48
|
<Avatar
|
49
|
-
src={avatar || maugliConfig.defaultAuthorImage || '
|
49
|
+
src={avatar || maugliConfig.defaultAuthorImage || '/img/default/autor_default.webp'}
|
50
50
|
alt={name}
|
51
51
|
size="clamp(70px, 15vw, 100px)"
|
52
52
|
class="no-border"
|
@@ -13,7 +13,7 @@ const avatarSize = typeof size === 'number' ? `${size}px` : size;
|
|
13
13
|
---
|
14
14
|
|
15
15
|
<div class:list={['avatar-container', className]} style={`width: ${avatarSize}; height: ${avatarSize};`}>
|
16
|
-
<img src={src || '
|
16
|
+
<img src={src || '/img/default/autor_default.webp'} alt={alt} loading="lazy" class="w-full h-full object-cover" />
|
17
17
|
</div>
|
18
18
|
|
19
19
|
<style>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
import { maugliConfig } from '../config/maugli.config.ts';
|
3
|
+
|
4
|
+
interface Props {
|
5
|
+
class?: string;
|
6
|
+
}
|
7
|
+
|
8
|
+
const { class: className } = Astro.props;
|
9
|
+
|
10
|
+
// Use repository URL from config, fallback to default
|
11
|
+
const repositoryUrl = maugliConfig.repository?.url || 'https://github.com/dashapps/core-maugli-blog';
|
12
|
+
const netlifyEnabled = maugliConfig.repository?.netlifyEnabled !== false;
|
13
|
+
const netlifyUrl = `https://app.netlify.com/start/deploy?repository=${repositoryUrl}`;
|
14
|
+
---
|
15
|
+
|
16
|
+
{
|
17
|
+
netlifyEnabled && (
|
18
|
+
<a href={netlifyUrl} target="_blank" rel="noopener noreferrer" class={className}>
|
19
|
+
<img src="https://www.netlify.com/img/deploy/button.svg" alt="Deploy to Netlify" />
|
20
|
+
</a>
|
21
|
+
)
|
22
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
// MAUGLI_CONFIG_VERSION — config version for CLI/automation compatibility
|
2
|
-
export const MAUGLI_CONFIG_VERSION = '0.
|
2
|
+
export const MAUGLI_CONFIG_VERSION = '0.3';
|
3
3
|
// Main configuration interface for the Maugli project
|
4
4
|
export interface MaugliConfig {
|
5
5
|
// Show example/demo content (for CLI/empty blog setup)
|
@@ -19,6 +19,11 @@ export interface MaugliConfig {
|
|
19
19
|
farmProductIds?: string[]; // Array of farm product IDs for API
|
20
20
|
farmProjectIds?: string[]; // Array of farm project/case IDs for API
|
21
21
|
};
|
22
|
+
// Repository settings for deployment
|
23
|
+
repository?: {
|
24
|
+
url?: string; // User's repository URL for Netlify deployment button
|
25
|
+
netlifyEnabled?: boolean; // Enable Netlify deployment button (default: true)
|
26
|
+
};
|
22
27
|
// Brand and logo settings
|
23
28
|
brand: {
|
24
29
|
name: string; // Brand name
|
@@ -111,6 +116,11 @@ export const maugliConfig: MaugliConfig = {
|
|
111
116
|
farmProductIds: [], // Array of farm product IDs for API
|
112
117
|
farmProjectIds: [], // Array of farm project/case IDs for API
|
113
118
|
},
|
119
|
+
// Repository settings for deployment
|
120
|
+
repository: {
|
121
|
+
url: 'https://github.com/dashapps/core-maugli-blog', // User's repository URL for Netlify deployment button
|
122
|
+
netlifyEnabled: true, // Enable Netlify deployment button (default: true)
|
123
|
+
},
|
114
124
|
enableThemeSwitcher: true, // Enable theme switcher (true by default)
|
115
125
|
seo: {
|
116
126
|
titleSuffix: ' — Maugli', // Suffix for page titles
|
@@ -152,11 +162,11 @@ export const maugliConfig: MaugliConfig = {
|
|
152
162
|
}
|
153
163
|
}
|
154
164
|
},
|
155
|
-
defaultBlogImage: '
|
156
|
-
defaultProductImage: '
|
157
|
-
defaultProjectImage: '
|
158
|
-
defaultAuthorImage: '
|
159
|
-
defaultRubricImage: '
|
165
|
+
defaultBlogImage: '/img/default/blog_default.webp', // Default blog image
|
166
|
+
defaultProductImage: '/img/default/product_default.webp', // Default product image
|
167
|
+
defaultProjectImage: '/img/default/project_default.webp', // Default project/case image
|
168
|
+
defaultAuthorImage: '/img/default/autor_default.webp', // Default author image
|
169
|
+
defaultRubricImage: '/img/default/rubric_default.webp', // Default rubric/category image
|
160
170
|
features: {
|
161
171
|
enableSubscribe: true, // Enable subscribe block
|
162
172
|
enableMultiLang: false, // Enable multilingual support
|
@@ -2,7 +2,7 @@
|
|
2
2
|
name: 'Дарья Зорина'
|
3
3
|
position: 'Founder, CEO'
|
4
4
|
description: 'Основатель и креативный директор Maugli AI Editorial System. Эксперт в AI-контенте, GPT-SEO и многоканальных стратегиях'
|
5
|
-
avatar: '
|
5
|
+
avatar: '/img/examples/authors/daria.webp'
|
6
6
|
socials:
|
7
7
|
telegram: 'https://t.me/darrrina'
|
8
8
|
linkedin: 'https://www.linkedin.com/in/dariazorina'
|
@@ -23,7 +23,7 @@ seo:
|
|
23
23
|
- контент-стратегии
|
24
24
|
- AI content
|
25
25
|
image:
|
26
|
-
src: '
|
26
|
+
src: '/img/examples/authors/daria.webp'
|
27
27
|
alt: 'Дарья Зорина'
|
28
28
|
caption: 'Основатель и креативный директор Maugli AI Editorial System'
|
29
29
|
jsonld:
|
@@ -32,7 +32,7 @@ jsonld:
|
|
32
32
|
name: 'Дарья Зорина'
|
33
33
|
jobTitle: 'Founder, CEO'
|
34
34
|
url: 'https://maugli.cfd'
|
35
|
-
image: '
|
35
|
+
image: '/img/examples/authors/daria.webp'
|
36
36
|
sameAs:
|
37
37
|
- 'https://www.linkedin.com/in/dariazorina'
|
38
38
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
name: 'Default Author'
|
3
3
|
position: 'Editor-in-Chief'
|
4
4
|
description: 'Default author and content editor for Maugli Blog. Used by default when no custom author is configured.'
|
5
|
-
avatar: '
|
5
|
+
avatar: '/img/default/autor_default.webp'
|
6
6
|
socials:
|
7
7
|
telegram: 'https://t.me/mauglibot'
|
8
8
|
linkedin: 'https://www.linkedin.com/company/maugli'
|
@@ -21,7 +21,7 @@ seo:
|
|
21
21
|
- AI content
|
22
22
|
- SEO
|
23
23
|
image:
|
24
|
-
src: '
|
24
|
+
src: '/img/default/autor_default.webp'
|
25
25
|
alt: 'Default Author'
|
26
26
|
caption: 'Default editor of Maugli Blog'
|
27
27
|
jsonld:
|
@@ -30,7 +30,7 @@ jsonld:
|
|
30
30
|
name: 'Default Author'
|
31
31
|
jobTitle: 'Editor-in-Chief'
|
32
32
|
url: 'https://maugli.cfd'
|
33
|
-
image: '
|
33
|
+
image: '/img/default/autor_default.webp'
|
34
34
|
sameAs:
|
35
35
|
- 'https://t.me/mauglibot'
|
36
36
|
- 'https://www.linkedin.com/company/maugli'
|
@@ -2,7 +2,7 @@
|
|
2
2
|
name: 'Игорь Соколов'
|
3
3
|
position: 'Редактор'
|
4
4
|
description: 'Редактор русской версии Maugli AI Editorial System. Пишет продуктовые статьи и экспертные материалы о нейросетях, GPT-SEO и автоматизации контента.'
|
5
|
-
avatar: '
|
5
|
+
avatar: '/img/examples/authors/igor.webp'
|
6
6
|
socials:
|
7
7
|
medium: 'https://medium.com/@igor.sokolov_7726'
|
8
8
|
email: 'igor.sokolov@maugli.cfd'
|
@@ -15,7 +15,7 @@ seo:
|
|
15
15
|
- аналитика
|
16
16
|
- конверсии
|
17
17
|
image:
|
18
|
-
src: '
|
18
|
+
src: '/img/examples/authors/igor.webp'
|
19
19
|
alt: 'Игорь Соколов'
|
20
20
|
caption: 'Редактор русской версии Maugli AI Editorial System'
|
21
21
|
jsonld:
|
@@ -29,7 +29,7 @@ jsonld:
|
|
29
29
|
'@type': 'Organization'
|
30
30
|
name: 'Maugli AI Editorial System'
|
31
31
|
url: 'https://maugli.cfd'
|
32
|
-
image: '
|
32
|
+
image: '/img/examples/authors/igor.webp'
|
33
33
|
url: 'https://medium.com/@igor.sokolov_7726'
|
34
34
|
sameAs:
|
35
35
|
- 'mailto:igor.sokolov@maugli.cfd'
|
@@ -2,7 +2,7 @@
|
|
2
2
|
name: 'John Walker'
|
3
3
|
position: 'Editor'
|
4
4
|
description: 'AI evangelist and content strategist with over 10 years of experience at the intersection of AI, content automation, and business strategy.'
|
5
|
-
avatar: '
|
5
|
+
avatar: '/img/examples/authors/john.webp'
|
6
6
|
socials:
|
7
7
|
linkedin: 'https://www.linkedin.com/company/maugli-ai-editorial-system'
|
8
8
|
medium: 'https://medium.com/@john.walker_90417'
|
@@ -16,7 +16,7 @@ seo:
|
|
16
16
|
- GPT SEO
|
17
17
|
- editorial strategy
|
18
18
|
image:
|
19
|
-
src: '
|
19
|
+
src: '/img/examples/authors/john.webp'
|
20
20
|
alt: 'John Walker'
|
21
21
|
caption: 'Editor at Maugli AI Editorial System'
|
22
22
|
jsonld:
|
@@ -30,7 +30,7 @@ jsonld:
|
|
30
30
|
'@type': 'Organization'
|
31
31
|
name: 'Maugli AI Editorial System'
|
32
32
|
url: 'https://maugli.cfd/en'
|
33
|
-
image: '
|
33
|
+
image: '/img/examples/authors/john.webp'
|
34
34
|
url: 'https://medium.com/@john.walker_90417'
|
35
35
|
sameAs:
|
36
36
|
- 'mailto:john.walker@maugli.cfd'
|
@@ -25,7 +25,7 @@ seo:
|
|
25
25
|
- Maugli Editorial System
|
26
26
|
- рекомендации нейросетей
|
27
27
|
image:
|
28
|
-
src: /
|
28
|
+
src: /img/examples/blog/test-post.webp
|
29
29
|
alt: JSON-LD в Maugli Editorial System
|
30
30
|
width: '1200'
|
31
31
|
height: '630'
|
@@ -84,7 +84,7 @@ jsonld:
|
|
84
84
|
height: 200
|
85
85
|
image:
|
86
86
|
'@type': ImageObject
|
87
|
-
url:
|
87
|
+
url: /img/examples/blog/post_1_jsonld_guide.webp
|
88
88
|
width: 1200
|
89
89
|
height: 630
|
90
90
|
caption: JSON-LD и AI-SEO
|
@@ -171,7 +171,7 @@ jsonld:
|
|
171
171
|
height: 200
|
172
172
|
image:
|
173
173
|
'@type': ImageObject
|
174
|
-
url: /post_1_jsonld_guide.webp
|
174
|
+
url: /img/examples/blog/post_1_jsonld_guide.webp
|
175
175
|
width: 1200
|
176
176
|
height: 630
|
177
177
|
caption: JSON-LD и AI-SEO
|
@@ -21,7 +21,7 @@ seo:
|
|
21
21
|
- нейросети в предпринимательстве
|
22
22
|
- освобождение от рутины
|
23
23
|
image:
|
24
|
-
src: /
|
24
|
+
src: /img/examples/blog/post_11.webp
|
25
25
|
alt: >-
|
26
26
|
Автоматизация маркетинга: как ИИ освобождает предпринимателей от цифрового
|
27
27
|
рабства
|
@@ -13,7 +13,7 @@ tags:
|
|
13
13
|
- автоматизация
|
14
14
|
- тестирование
|
15
15
|
image:
|
16
|
-
src: /
|
16
|
+
src: /img/examples/blog/post_12.webp
|
17
17
|
alt: Революция контента в 2025 году
|
18
18
|
seo:
|
19
19
|
title: Тестовый пост - Революция контента в 2025 году | Maugli Content Farm
|
@@ -3,7 +3,7 @@
|
|
3
3
|
title: "About the Blog"
|
4
4
|
slug: "blog"
|
5
5
|
image:
|
6
|
-
src: "/
|
6
|
+
src: "/img/default/blog_default.webp"
|
7
7
|
seo:
|
8
8
|
description: "Maugli Blog: automated content, AI, marketing, and strategies to get featured in AI recommendations."
|
9
9
|
keywords: ["Maugli Editorial Platform", "AI content", "automation", "content marketing", "AI recommendations"]
|
@@ -6,7 +6,7 @@ updatedDate: 2025-07-10
|
|
6
6
|
isFeatured: true
|
7
7
|
tags: ['контент', 'редакция', 'автоматизация']
|
8
8
|
image:
|
9
|
-
src: '
|
9
|
+
src: '/img/examples/products/product_1.webp'
|
10
10
|
alt: 'Maugli Content Farm'
|
11
11
|
seo:
|
12
12
|
title: 'Редакция Maugli — умная платформа для контента'
|
@@ -16,7 +16,7 @@ productLink: 'https://freeblog.maugli.ru'
|
|
16
16
|
author: 'Редакция Maugli'
|
17
17
|
publisher: 'Maugli'
|
18
18
|
image:
|
19
|
-
src: '
|
19
|
+
src: '/img/examples/products/product_2.webp'
|
20
20
|
alt: 'Логотип Maugli Free Blog'
|
21
21
|
width: '1200'
|
22
22
|
height: '630'
|
@@ -48,7 +48,7 @@ jsonld:
|
|
48
48
|
'@type': 'Product'
|
49
49
|
'name': 'Maugli Free Blog'
|
50
50
|
'description': 'Лёгкий блог-шаблон на Astro для SEO и GPT-индексации.'
|
51
|
-
'image': '
|
51
|
+
'image': '/img/examples/products/product_2.webp'
|
52
52
|
'brand':
|
53
53
|
'@type': 'Organization'
|
54
54
|
'name': 'Maugli'
|
@@ -22,7 +22,7 @@ generativeEngineOptimization:
|
|
22
22
|
answer: 'Да, система создает контент в соответствии с заданной тональностью и может писать от лица конкретного персонажа.'
|
23
23
|
seo:
|
24
24
|
image:
|
25
|
-
src: '
|
25
|
+
src: '/img/examples/projects/project_1.webp'
|
26
26
|
alt: Смотреть
|
27
27
|
width: '1200'
|
28
28
|
height: '630'
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: AI в бизнесе
|
3
3
|
description: "Обзоры технологий (LLM, GPT, Claude и др.). Кейсы применения AI в бизнесе. Тренды в автоматизации контента."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: AI в бизнесе
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: Автоматизация бизнеса
|
3
3
|
description: "Workflow и интеграции (Airtable, Supabase, автопостинг). AI-редакторы и сценарии. «Редакция без людей» — практика и инструменты."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: Автоматизация бизнеса
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: Контент-стратегии
|
3
3
|
description: "Как строить Content Market Fit. Мультиязычные блоги. Принципы работы AI-редакции."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: Контент-стратегии
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: Growth & Marketing
|
3
3
|
description: "Growth маркетинг и автоматизация воронок. Аналитика и конверсии. Лайфхаки по продвижению."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: Growth & Marketing
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: Индустриальные обзоры
|
3
3
|
description: "Новости AI и контентного рынка. Сравнения инструментов. Влияние AI на SEO и медиа."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: Индустриальные обзоры
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: Интересное
|
3
3
|
description: "Все, что может быть интересно бизнесу, но не относится к тематикам Maugli напрямую."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: Интересное
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -2,7 +2,7 @@
|
|
2
2
|
title: SEO & AI SEO
|
3
3
|
description: "GPT-SEO и AI-выдачи. JSON-LD и структурированные данные. Оптимизация под ChatGPT, Bing Copilot, Perplexity."
|
4
4
|
image:
|
5
|
-
src:
|
5
|
+
src: '/img/default/rubric_default.webp'
|
6
6
|
alt: SEO & AI SEO
|
7
7
|
isRubric: true
|
8
8
|
isFeatured: false
|
@@ -71,7 +71,7 @@ const authorsDescription =
|
|
71
71
|
<BaseLayout
|
72
72
|
title={authorsTitle}
|
73
73
|
description={authorsDescription}
|
74
|
-
image={{ src: '
|
74
|
+
image={{ src: '/img/default/autor_default.webp', alt: 'Команда Maugli Content Farm' }}
|
75
75
|
showHeader={false}
|
76
76
|
fullWidth={true}
|
77
77
|
>
|
@@ -78,7 +78,7 @@ const pageTitle = seo?.title || `${name} - ${position} | Maugli Content Farm`;
|
|
78
78
|
const pageDescription = seo?.description || description;
|
79
79
|
---
|
80
80
|
|
81
|
-
<BaseLayout title={pageTitle} description={pageDescription} image={{ src: avatar || '
|
81
|
+
<BaseLayout title={pageTitle} description={pageDescription} image={{ src: avatar || '/img/default/autor_default.webp', alt: `Фото ${name}` }} showHeader={false} fullWidth={true}>
|
82
82
|
<div class="max-w-[1280px] mx-auto">
|
83
83
|
<!-- Хлебные крошки -->
|
84
84
|
<Breadcrumbs />
|
@@ -89,7 +89,7 @@ const pageDescription = seo?.description || description;
|
|
89
89
|
<div class="flex flex-col sm:flex-row gap-6 sm:gap-8 items-start">
|
90
90
|
<!-- Аватар -->
|
91
91
|
<div class="w-32 h-32 sm:w-40 sm:h-40 bg-[var(--bg-main)] rounded-full overflow-hidden flex-shrink-0">
|
92
|
-
<img src={avatar || '
|
92
|
+
<img src={avatar || '/img/default/autor_default.webp'} alt={`Фото ${name}`} class="w-full h-full object-cover" />
|
93
93
|
</div>
|
94
94
|
|
95
95
|
<!-- Информация -->
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
/package/{src → public}/img/examples/blog/post-agent-experience-mcp-biznes-v-epohu-ii-agentov.webp
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|