@astro-minimax/cli 0.7.0 → 0.7.2
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/dist/commands/podcast.d.ts +2 -0
- package/dist/commands/podcast.d.ts.map +1 -0
- package/dist/commands/podcast.js +89 -0
- package/dist/commands/podcast.js.map +1 -0
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +7 -2
- package/dist/commands/profile.js.map +1 -1
- package/dist/tools/build-fact-registry.d.ts +14 -0
- package/dist/tools/build-fact-registry.d.ts.map +1 -0
- package/dist/tools/build-fact-registry.js +545 -0
- package/dist/tools/build-fact-registry.js.map +1 -0
- package/dist/tools/eval-ai-chat.js +34 -4
- package/dist/tools/eval-ai-chat.js.map +1 -1
- package/dist/tools/lib/audio-processor.d.ts +46 -0
- package/dist/tools/lib/audio-processor.d.ts.map +1 -0
- package/dist/tools/lib/audio-processor.js +188 -0
- package/dist/tools/lib/audio-processor.js.map +1 -0
- package/dist/tools/lib/script-generator.d.ts +61 -0
- package/dist/tools/lib/script-generator.d.ts.map +1 -0
- package/dist/tools/lib/script-generator.js +182 -0
- package/dist/tools/lib/script-generator.js.map +1 -0
- package/dist/tools/lib/tts-provider.d.ts +65 -0
- package/dist/tools/lib/tts-provider.d.ts.map +1 -0
- package/dist/tools/lib/tts-provider.js +116 -0
- package/dist/tools/lib/tts-provider.js.map +1 -0
- package/dist/tools/lib/types.d.ts +129 -0
- package/dist/tools/lib/types.d.ts.map +1 -0
- package/dist/tools/lib/types.js +64 -0
- package/dist/tools/lib/types.js.map +1 -0
- package/dist/tools/podcast-feed.d.ts +6 -0
- package/dist/tools/podcast-feed.d.ts.map +1 -0
- package/dist/tools/podcast-feed.js +121 -0
- package/dist/tools/podcast-feed.js.map +1 -0
- package/dist/tools/podcast-generate.d.ts +15 -0
- package/dist/tools/podcast-generate.d.ts.map +1 -0
- package/dist/tools/podcast-generate.js +318 -0
- package/dist/tools/podcast-generate.js.map +1 -0
- package/dist/tools/podcast-list.d.ts +6 -0
- package/dist/tools/podcast-list.d.ts.map +1 -0
- package/dist/tools/podcast-list.js +66 -0
- package/dist/tools/podcast-list.js.map +1 -0
- package/package.json +3 -2
- package/template/.gitignore +7 -0
- package/template/datas/fact-registry.json +17 -0
- package/template/eslint.config.js +3 -0
- package/template/functions/api/chat.ts +6 -1
- package/template/package.json +8 -6
- package/template/src/config.ts +6 -2
- package/template/src/data/blog/zh/alerts-examples.md +86 -0
- package/template/src/data/blog/zh/code-examples.md +168 -0
- package/template/src/data/blog/zh/markmap-examples.md +103 -0
- package/template/src/data/blog/zh/math-examples.md +81 -0
- package/template/src/data/blog/zh/mermaid-examples.md +82 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Podcast Generation Script
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* pnpm podcast:generate Generate all podcasts
|
|
7
|
+
* pnpm podcast:generate --slug=zh/xxx Single article
|
|
8
|
+
* pnpm podcast:generate --task=script Script only
|
|
9
|
+
* pnpm podcast:generate --task=audio Audio only
|
|
10
|
+
* pnpm podcast:generate --force Ignore cache
|
|
11
|
+
* pnpm podcast:generate --dry-run Preview only
|
|
12
|
+
* pnpm podcast:generate --lang=zh Specific language
|
|
13
|
+
*/
|
|
14
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import crypto from "node:crypto";
|
|
17
|
+
import { getAllPosts } from "./lib/posts.js";
|
|
18
|
+
import { extractFrontmatter } from "./lib/frontmatter.js";
|
|
19
|
+
import { hasAPIKey, getConfig } from "./lib/ai-provider.js";
|
|
20
|
+
import { hasTTSApiKey } from "./lib/tts-provider.js";
|
|
21
|
+
import { textToSpeech } from "./lib/tts-provider.js";
|
|
22
|
+
import { concatenateAudio, getAudioDuration } from "./lib/audio-processor.js";
|
|
23
|
+
import { generateScript } from "./lib/script-generator.js";
|
|
24
|
+
import { DEFAULT_SPEAKERS, isValidOpenAIVoice, } from "./lib/types.js";
|
|
25
|
+
const DATA_DIR = join(process.cwd(), "datas");
|
|
26
|
+
const PUBLIC_DIR = join(process.cwd(), "public", "podcasts");
|
|
27
|
+
const SCRIPTS_FILE = join(DATA_DIR, "podcast-scripts.json");
|
|
28
|
+
const AUDIO_FILE = join(DATA_DIR, "podcast-audio.json");
|
|
29
|
+
const SKIP_LIST_FILE = join(DATA_DIR, "ai-skip-list.json");
|
|
30
|
+
function parseArgs() {
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
const flags = {
|
|
33
|
+
force: false,
|
|
34
|
+
slug: null,
|
|
35
|
+
task: null,
|
|
36
|
+
dryRun: false,
|
|
37
|
+
concurrency: 5,
|
|
38
|
+
lang: null,
|
|
39
|
+
};
|
|
40
|
+
for (const arg of args) {
|
|
41
|
+
if (arg === "--force")
|
|
42
|
+
flags.force = true;
|
|
43
|
+
else if (arg === "--dry-run")
|
|
44
|
+
flags.dryRun = true;
|
|
45
|
+
else if (arg.startsWith("--slug="))
|
|
46
|
+
flags.slug = arg.split("=")[1];
|
|
47
|
+
else if (arg.startsWith("--task="))
|
|
48
|
+
flags.task = arg.split("=")[1];
|
|
49
|
+
else if (arg.startsWith("--concurrency="))
|
|
50
|
+
flags.concurrency = parseInt(arg.split("=")[1], 10);
|
|
51
|
+
else if (arg.startsWith("--lang="))
|
|
52
|
+
flags.lang = arg.split("=")[1];
|
|
53
|
+
}
|
|
54
|
+
return flags;
|
|
55
|
+
}
|
|
56
|
+
function createCacheManager(cacheFile) {
|
|
57
|
+
let cache = null;
|
|
58
|
+
let writeQueue = Promise.resolve();
|
|
59
|
+
return {
|
|
60
|
+
async load() {
|
|
61
|
+
const cachePath = join(DATA_DIR, cacheFile);
|
|
62
|
+
try {
|
|
63
|
+
const raw = await readFile(cachePath, "utf-8");
|
|
64
|
+
cache = JSON.parse(raw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
cache = {
|
|
68
|
+
meta: { lastUpdated: null, totalProcessed: 0 },
|
|
69
|
+
articles: {},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return cache;
|
|
73
|
+
},
|
|
74
|
+
getCache() {
|
|
75
|
+
return cache;
|
|
76
|
+
},
|
|
77
|
+
async writeEntry(slug, entry, model) {
|
|
78
|
+
writeQueue = writeQueue.then(async () => {
|
|
79
|
+
if (!cache)
|
|
80
|
+
return;
|
|
81
|
+
cache.articles[slug] = entry;
|
|
82
|
+
cache.meta.lastUpdated = new Date().toISOString();
|
|
83
|
+
cache.meta.totalProcessed = Object.keys(cache.articles).length;
|
|
84
|
+
await mkdir(DATA_DIR, { recursive: true });
|
|
85
|
+
const cachePath = join(DATA_DIR, cacheFile);
|
|
86
|
+
await writeFile(cachePath, JSON.stringify(cache, null, 2), "utf-8");
|
|
87
|
+
});
|
|
88
|
+
return writeQueue;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function createAudioCacheManager() {
|
|
93
|
+
let cache = null;
|
|
94
|
+
let writeQueue = Promise.resolve();
|
|
95
|
+
return {
|
|
96
|
+
async load() {
|
|
97
|
+
try {
|
|
98
|
+
const raw = await readFile(AUDIO_FILE, "utf-8");
|
|
99
|
+
cache = JSON.parse(raw);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
cache = {
|
|
103
|
+
meta: { lastUpdated: null, totalProcessed: 0 },
|
|
104
|
+
articles: {},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return cache;
|
|
108
|
+
},
|
|
109
|
+
async writeEntry(slug, entry) {
|
|
110
|
+
writeQueue = writeQueue.then(async () => {
|
|
111
|
+
if (!cache)
|
|
112
|
+
return;
|
|
113
|
+
cache.articles[slug] = entry;
|
|
114
|
+
cache.meta.lastUpdated = new Date().toISOString();
|
|
115
|
+
cache.meta.totalProcessed = Object.keys(cache.articles).length;
|
|
116
|
+
await mkdir(DATA_DIR, { recursive: true });
|
|
117
|
+
await writeFile(AUDIO_FILE, JSON.stringify(cache, null, 2), "utf-8");
|
|
118
|
+
});
|
|
119
|
+
return writeQueue;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async function loadSkipList() {
|
|
124
|
+
try {
|
|
125
|
+
const raw = await readFile(SKIP_LIST_FILE, "utf-8");
|
|
126
|
+
return JSON.parse(raw);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return {};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function saveSkipList(skipList) {
|
|
133
|
+
await mkdir(DATA_DIR, { recursive: true });
|
|
134
|
+
await writeFile(SKIP_LIST_FILE, JSON.stringify(skipList, null, 2), "utf-8");
|
|
135
|
+
}
|
|
136
|
+
function sleep(ms) {
|
|
137
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
138
|
+
}
|
|
139
|
+
async function scanArticles(flags) {
|
|
140
|
+
const allPosts = await getAllPosts({ includeDrafts: false, stripBody: false });
|
|
141
|
+
const articles = [];
|
|
142
|
+
for (const post of allPosts) {
|
|
143
|
+
if (post.draft)
|
|
144
|
+
continue;
|
|
145
|
+
if (flags.lang && post.lang !== flags.lang)
|
|
146
|
+
continue;
|
|
147
|
+
const rawContent = await readFile(post.filePath, "utf-8");
|
|
148
|
+
const fm = extractFrontmatter(rawContent);
|
|
149
|
+
const contentHash = crypto
|
|
150
|
+
.createHash("md5")
|
|
151
|
+
.update(fm.body)
|
|
152
|
+
.digest("hex")
|
|
153
|
+
.slice(0, 8);
|
|
154
|
+
const pubDatetime = fm.data.pubDatetime;
|
|
155
|
+
const pubTimestamp = pubDatetime
|
|
156
|
+
? new Date(pubDatetime).getTime()
|
|
157
|
+
: 0;
|
|
158
|
+
articles.push({
|
|
159
|
+
...post,
|
|
160
|
+
contentHash,
|
|
161
|
+
fullContent: fm.body,
|
|
162
|
+
pubTimestamp,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
articles.sort((a, b) => b.pubTimestamp - a.pubTimestamp);
|
|
166
|
+
return articles;
|
|
167
|
+
}
|
|
168
|
+
async function processArticle(article, flags, scriptCache, audioCache, skipList) {
|
|
169
|
+
const config = getConfig();
|
|
170
|
+
const lang = article.lang;
|
|
171
|
+
const speakers = DEFAULT_SPEAKERS[lang];
|
|
172
|
+
try {
|
|
173
|
+
let script = null;
|
|
174
|
+
if (flags.task !== "audio") {
|
|
175
|
+
script = await generateScript({
|
|
176
|
+
id: article.id,
|
|
177
|
+
title: article.title,
|
|
178
|
+
lang,
|
|
179
|
+
body: article.fullContent,
|
|
180
|
+
category: article.category || "",
|
|
181
|
+
tags: article.tags,
|
|
182
|
+
}, { speakers });
|
|
183
|
+
script.contentHash = article.contentHash;
|
|
184
|
+
if (!flags.dryRun) {
|
|
185
|
+
await scriptCache.writeEntry(article.id, script, config.model);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (flags.task !== "script") {
|
|
189
|
+
if (!script) {
|
|
190
|
+
const cache = scriptCache.getCache();
|
|
191
|
+
script = cache?.articles[article.id] || null;
|
|
192
|
+
}
|
|
193
|
+
if (!script) {
|
|
194
|
+
return { success: false, error: "No script available for audio generation" };
|
|
195
|
+
}
|
|
196
|
+
if (!hasTTSApiKey()) {
|
|
197
|
+
return { success: false, error: "TTS API key not configured" };
|
|
198
|
+
}
|
|
199
|
+
const audioSegments = [];
|
|
200
|
+
for (const segment of script.segments) {
|
|
201
|
+
const speaker = speakers.find((s) => s.id === segment.speaker) || speakers[0];
|
|
202
|
+
const voice = isValidOpenAIVoice(speaker.voiceId) ? speaker.voiceId : "alloy";
|
|
203
|
+
const audio = await textToSpeech(segment.text, { voice });
|
|
204
|
+
audioSegments.push(audio);
|
|
205
|
+
await sleep(200);
|
|
206
|
+
}
|
|
207
|
+
const finalAudio = await concatenateAudio(audioSegments);
|
|
208
|
+
const duration = await getAudioDuration(finalAudio);
|
|
209
|
+
const outputDir = join(PUBLIC_DIR, lang);
|
|
210
|
+
await mkdir(outputDir, { recursive: true });
|
|
211
|
+
const outputFile = join(outputDir, `${article.id.split("/")[1]}.mp3`);
|
|
212
|
+
await writeFile(outputFile, finalAudio);
|
|
213
|
+
const audioMeta = {
|
|
214
|
+
slug: article.id,
|
|
215
|
+
lang,
|
|
216
|
+
duration,
|
|
217
|
+
fileSize: finalAudio.length,
|
|
218
|
+
format: "mp3",
|
|
219
|
+
generatedAt: new Date().toISOString(),
|
|
220
|
+
contentHash: article.contentHash,
|
|
221
|
+
};
|
|
222
|
+
if (!flags.dryRun) {
|
|
223
|
+
await audioCache.writeEntry(article.id, audioMeta);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const skipKey = `podcast:${article.id}`;
|
|
227
|
+
if (skipList[skipKey]) {
|
|
228
|
+
delete skipList[skipKey];
|
|
229
|
+
await saveSkipList(skipList);
|
|
230
|
+
}
|
|
231
|
+
return { success: true };
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
const errorMsg = err.message;
|
|
235
|
+
await saveSkipList({
|
|
236
|
+
...skipList,
|
|
237
|
+
[`podcast:${article.id}`]: {
|
|
238
|
+
slug: article.id,
|
|
239
|
+
task: "podcast",
|
|
240
|
+
reason: errorMsg,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
return { success: false, error: errorMsg };
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async function main() {
|
|
247
|
+
const flags = parseArgs();
|
|
248
|
+
if (!hasAPIKey()) {
|
|
249
|
+
console.error("Missing AI API Key. Set AI_API_KEY environment variable.");
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
const config = getConfig();
|
|
253
|
+
let skipList = await loadSkipList();
|
|
254
|
+
console.log("Podcast Generator (astro-minimax)");
|
|
255
|
+
console.log("─".repeat(50));
|
|
256
|
+
console.log(`Model: ${config.model}`);
|
|
257
|
+
console.log(`API: ${config.baseUrl}`);
|
|
258
|
+
console.log("");
|
|
259
|
+
console.log("Scanning articles...");
|
|
260
|
+
let articles = await scanArticles(flags);
|
|
261
|
+
console.log(`Found ${articles.length} articles`);
|
|
262
|
+
if (flags.slug) {
|
|
263
|
+
articles = articles.filter((a) => a.id === flags.slug);
|
|
264
|
+
if (articles.length === 0) {
|
|
265
|
+
console.error(`Article not found: ${flags.slug}`);
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
console.log(`Processing single article: ${flags.slug}`);
|
|
269
|
+
}
|
|
270
|
+
const scriptCache = createCacheManager("podcast-scripts.json");
|
|
271
|
+
await scriptCache.load();
|
|
272
|
+
const audioCache = createAudioCacheManager();
|
|
273
|
+
await audioCache.load();
|
|
274
|
+
const queue = [];
|
|
275
|
+
for (const article of articles) {
|
|
276
|
+
const skipKey = `podcast:${article.id}`;
|
|
277
|
+
if (!flags.force && skipList[skipKey]) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const cached = scriptCache.getCache()?.articles[article.id];
|
|
281
|
+
if (flags.force || !cached || cached.contentHash !== article.contentHash) {
|
|
282
|
+
queue.push(article);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
console.log(`Processing: ${queue.length} articles`);
|
|
286
|
+
if (flags.dryRun) {
|
|
287
|
+
console.log("\nDry run - would process:");
|
|
288
|
+
for (const a of queue) {
|
|
289
|
+
console.log(` - ${a.id}`);
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (queue.length === 0) {
|
|
294
|
+
console.log("Nothing to process");
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
let success = 0;
|
|
298
|
+
let failed = 0;
|
|
299
|
+
for (let i = 0; i < queue.length; i++) {
|
|
300
|
+
const article = queue[i];
|
|
301
|
+
console.log(`\n[${i + 1}/${queue.length}] Processing: ${article.id}`);
|
|
302
|
+
const result = await processArticle(article, flags, scriptCache, audioCache, skipList);
|
|
303
|
+
if (result.success) {
|
|
304
|
+
success++;
|
|
305
|
+
console.log(` Done`);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
failed++;
|
|
309
|
+
console.error(` Failed: ${result.error}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
console.log(`\nCompleted: ${success} success, ${failed} failed`);
|
|
313
|
+
}
|
|
314
|
+
main().catch((err) => {
|
|
315
|
+
console.error("Fatal error:", err.message);
|
|
316
|
+
process.exit(1);
|
|
317
|
+
});
|
|
318
|
+
//# sourceMappingURL=podcast-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podcast-generate.js","sourceRoot":"","sources":["../../src/tools/podcast-generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podcast-list.d.ts","sourceRoot":"","sources":["../../src/tools/podcast-list.ts"],"names":[],"mappings":";AACA;;GAEG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* List generated podcasts
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
const DATA_DIR = join(process.cwd(), "datas");
|
|
8
|
+
const SCRIPTS_FILE = join(DATA_DIR, "podcast-scripts.json");
|
|
9
|
+
const AUDIO_FILE = join(DATA_DIR, "podcast-audio.json");
|
|
10
|
+
async function main() {
|
|
11
|
+
console.log("Generated Podcasts");
|
|
12
|
+
console.log("─".repeat(60));
|
|
13
|
+
let scripts = {};
|
|
14
|
+
let audio = {};
|
|
15
|
+
try {
|
|
16
|
+
const scriptsData = await readFile(SCRIPTS_FILE, "utf-8");
|
|
17
|
+
scripts = JSON.parse(scriptsData).articles || {};
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
console.log("No scripts found. Run 'astro-minimax podcast generate' first.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const audioData = await readFile(AUDIO_FILE, "utf-8");
|
|
25
|
+
audio = JSON.parse(audioData).articles || {};
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
const slugs = Object.keys(scripts);
|
|
29
|
+
if (slugs.length === 0) {
|
|
30
|
+
console.log("No podcasts generated yet.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(`Total: ${slugs.length} podcasts\n`);
|
|
34
|
+
for (const slug of slugs.sort()) {
|
|
35
|
+
const script = scripts[slug];
|
|
36
|
+
const audioMeta = audio[slug] || {};
|
|
37
|
+
const title = script.title || slug;
|
|
38
|
+
const segments = script.segments?.length || 0;
|
|
39
|
+
const duration = audioMeta.duration
|
|
40
|
+
? formatDuration(audioMeta.duration)
|
|
41
|
+
: "N/A";
|
|
42
|
+
const size = audioMeta.fileSize
|
|
43
|
+
? formatSize(audioMeta.fileSize)
|
|
44
|
+
: "N/A";
|
|
45
|
+
console.log(`${slug}`);
|
|
46
|
+
console.log(` Title: ${title}`);
|
|
47
|
+
console.log(` Segments: ${segments}`);
|
|
48
|
+
console.log(` Duration: ${duration}`);
|
|
49
|
+
console.log(` Size: ${size}`);
|
|
50
|
+
console.log("");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function formatDuration(seconds) {
|
|
54
|
+
const mins = Math.floor(seconds / 60);
|
|
55
|
+
const secs = Math.floor(seconds % 60);
|
|
56
|
+
return `${mins}:${secs.toString().padStart(2, "0")}`;
|
|
57
|
+
}
|
|
58
|
+
function formatSize(bytes) {
|
|
59
|
+
if (bytes < 1024)
|
|
60
|
+
return `${bytes} B`;
|
|
61
|
+
if (bytes < 1024 * 1024)
|
|
62
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
63
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
64
|
+
}
|
|
65
|
+
main().catch(console.error);
|
|
66
|
+
//# sourceMappingURL=podcast-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podcast-list.js","sourceRoot":"","sources":["../../src/tools/podcast-list.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astro-minimax/cli",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI tool for astro-minimax blog — create blogs, manage content, and process data with AI.",
|
|
6
6
|
"author": "Souloss",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"files": [
|
|
28
28
|
"dist/",
|
|
29
|
-
"template/"
|
|
29
|
+
"template/",
|
|
30
|
+
"template/.gitignore"
|
|
30
31
|
],
|
|
31
32
|
"dependencies": {
|
|
32
33
|
"tsx": "^4.21.0",
|
|
@@ -4,6 +4,11 @@ import type { ChatHandlerEnv } from '@astro-minimax/ai/server';
|
|
|
4
4
|
import aiSummaries from '../../datas/ai-summaries.json';
|
|
5
5
|
import authorContext from '../../datas/author-context.json';
|
|
6
6
|
import voiceProfile from '../../datas/voice-profile.json';
|
|
7
|
+
import factRegistry from '../../datas/fact-registry.json';
|
|
8
|
+
|
|
9
|
+
// Optional: TF-IDF vector index for enhanced search reranking
|
|
10
|
+
let vectorIndex: unknown = null;
|
|
11
|
+
try { vectorIndex = (await import('../../src/data/vectors/index.json')).default; } catch { /* not available */ }
|
|
7
12
|
|
|
8
13
|
interface FunctionEnv extends ChatHandlerEnv {
|
|
9
14
|
CACHE_KV?: KVNamespace;
|
|
@@ -13,7 +18,7 @@ interface FunctionEnv extends ChatHandlerEnv {
|
|
|
13
18
|
|
|
14
19
|
export const onRequest: PagesFunction<FunctionEnv> = async (context) => {
|
|
15
20
|
initializeMetadata(
|
|
16
|
-
{ summaries: aiSummaries, authorContext, voiceProfile },
|
|
21
|
+
{ summaries: aiSummaries, authorContext, voiceProfile, factRegistry, vectorIndex },
|
|
17
22
|
context.env,
|
|
18
23
|
);
|
|
19
24
|
return handleChatRequest({
|
package/template/package.json
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
"type": "module",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"dev": "astro dev",
|
|
6
|
+
"dev": "concurrently -n \"astro,ai\" -c \"blue,green\" \"astro dev\" \"pnpm exec astro-ai-dev\"",
|
|
7
|
+
"dev:astro": "astro dev",
|
|
7
8
|
"dev:ai": "pnpm exec astro-ai-dev",
|
|
8
9
|
"build": "astro check && astro build && pagefind --site dist && cp -r dist/pagefind public/",
|
|
9
10
|
"preview": "wrangler pages dev dist",
|
|
@@ -27,10 +28,10 @@
|
|
|
27
28
|
"dependencies": {
|
|
28
29
|
"@ai-sdk/openai-compatible": "^2.0.35",
|
|
29
30
|
"@ai-sdk/react": "^3.0.118",
|
|
30
|
-
"@astro-minimax/ai": "^0.
|
|
31
|
-
"@astro-minimax/core": "^0.
|
|
32
|
-
"@astro-minimax/notify": "^0.
|
|
33
|
-
"@astro-minimax/viz": "^0.
|
|
31
|
+
"@astro-minimax/ai": "^0.7.2",
|
|
32
|
+
"@astro-minimax/core": "^0.7.2",
|
|
33
|
+
"@astro-minimax/notify": "^0.7.2",
|
|
34
|
+
"@astro-minimax/viz": "^0.7.2",
|
|
34
35
|
"@astrojs/mdx": "^5.0.0",
|
|
35
36
|
"@astrojs/preact": "^5.0.0",
|
|
36
37
|
"@astrojs/rss": "^4.0.17",
|
|
@@ -57,12 +58,13 @@
|
|
|
57
58
|
"tailwindcss": "^4.2.1"
|
|
58
59
|
},
|
|
59
60
|
"devDependencies": {
|
|
60
|
-
"@astro-minimax/cli": "^0.
|
|
61
|
+
"@astro-minimax/cli": "^0.7.2",
|
|
61
62
|
"@astrojs/check": "^0.9.6",
|
|
62
63
|
"@cloudflare/workers-types": "^4.20260313.1",
|
|
63
64
|
"@pagefind/default-ui": "^1.4.0",
|
|
64
65
|
"@shikijs/transformers": "^4.0.2",
|
|
65
66
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
67
|
+
"concurrently": "^9.1.2",
|
|
66
68
|
"eslint": "^9.39.3",
|
|
67
69
|
"eslint-plugin-astro": "^1.6.0",
|
|
68
70
|
"globals": "^16.5.0",
|
package/template/src/config.ts
CHANGED
|
@@ -36,9 +36,9 @@ export const SITE: SiteConfig = {
|
|
|
36
36
|
{ key: "tags", enabled: true },
|
|
37
37
|
{ key: "categories", enabled: true },
|
|
38
38
|
{ key: "series", enabled: true },
|
|
39
|
-
{ key: "projects", enabled:
|
|
39
|
+
{ key: "projects", enabled: false }, // Matches features.projects
|
|
40
40
|
{ key: "about", enabled: true },
|
|
41
|
-
{ key: "friends", enabled:
|
|
41
|
+
{ key: "friends", enabled: false }, // Matches features.friends
|
|
42
42
|
{ key: "archives", enabled: true },
|
|
43
43
|
],
|
|
44
44
|
},
|
|
@@ -112,4 +112,8 @@ export const SITE: SiteConfig = {
|
|
|
112
112
|
get showArchives() {
|
|
113
113
|
return this.features?.archives ?? true;
|
|
114
114
|
},
|
|
115
|
+
|
|
116
|
+
get aiEnabled() {
|
|
117
|
+
return (this.features?.ai ?? false) && (this.ai?.enabled ?? false);
|
|
118
|
+
},
|
|
115
119
|
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "GitHub Alerts 示例"
|
|
3
|
+
description: "展示 GitHub 风格的提示框功能,支持多种类型"
|
|
4
|
+
pubDatetime: 2024-01-06T00:00:00.000Z
|
|
5
|
+
tags:
|
|
6
|
+
- 教程
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 什么是 GitHub Alerts?
|
|
10
|
+
|
|
11
|
+
GitHub Alerts 是 GitHub 风格的提示框,可以用来强调重要信息、警告或提示。
|
|
12
|
+
|
|
13
|
+
## 基础用法
|
|
14
|
+
|
|
15
|
+
> [!NOTE]
|
|
16
|
+
> 这是一个普通的提示信息,用于补充说明。
|
|
17
|
+
|
|
18
|
+
> [!TIP]
|
|
19
|
+
> 这是一个小技巧,可以帮助用户更好地使用某些功能。
|
|
20
|
+
|
|
21
|
+
> [!IMPORTANT]
|
|
22
|
+
> 这是重要信息,用户应该特别注意。
|
|
23
|
+
|
|
24
|
+
> [!WARNING]
|
|
25
|
+
> 这是警告信息,提醒用户注意潜在的风险。
|
|
26
|
+
|
|
27
|
+
> [!CAUTION]
|
|
28
|
+
> 这是危险警告,提醒用户可能造成不可逆的操作。
|
|
29
|
+
|
|
30
|
+
## 实际使用场景
|
|
31
|
+
|
|
32
|
+
### 配置说明
|
|
33
|
+
|
|
34
|
+
> [!NOTE]
|
|
35
|
+
> 请确保在运行前配置好 `.env` 文件中的环境变量。
|
|
36
|
+
|
|
37
|
+
### 性能优化
|
|
38
|
+
|
|
39
|
+
> [!TIP]
|
|
40
|
+
> 使用 `pnpm` 替代 `npm` 可以显著提高依赖安装速度并节省磁盘空间。
|
|
41
|
+
|
|
42
|
+
### 安全提醒
|
|
43
|
+
|
|
44
|
+
> [!IMPORTANT]
|
|
45
|
+
> 永远不要将 API 密钥或敏感信息提交到公开的代码仓库中。
|
|
46
|
+
|
|
47
|
+
### 废弃警告
|
|
48
|
+
|
|
49
|
+
> [!WARNING]
|
|
50
|
+
> `v1.0.0` 版本中的 `oldFunction()` 方法将在下个版本中移除,请迁移到 `newFunction()`。
|
|
51
|
+
|
|
52
|
+
### 危险操作
|
|
53
|
+
|
|
54
|
+
> [!CAUTION]
|
|
55
|
+
> 执行 `rm -rf /` 将删除所有文件,这是一个不可逆的操作,请谨慎使用!
|
|
56
|
+
|
|
57
|
+
## 组合使用
|
|
58
|
+
|
|
59
|
+
在编写文档时,可以根据信息的严重程度选择合适的提示框类型:
|
|
60
|
+
|
|
61
|
+
> [!NOTE]
|
|
62
|
+
> 本项目需要 Node.js 18+ 版本。
|
|
63
|
+
|
|
64
|
+
> [!TIP]
|
|
65
|
+
> 推荐使用 `nvm` 管理 Node.js 版本。
|
|
66
|
+
|
|
67
|
+
> [!IMPORTANT]
|
|
68
|
+
> 在生产环境中,请确保设置 `NODE_ENV=production`。
|
|
69
|
+
|
|
70
|
+
> [!WARNING]
|
|
71
|
+
> 不要在生产环境中使用开发依赖。
|
|
72
|
+
|
|
73
|
+
> [!CAUTION]
|
|
74
|
+
> 修改数据库结构前请务必备份数据!
|
|
75
|
+
|
|
76
|
+
## 与其他 Markdown 元素组合
|
|
77
|
+
|
|
78
|
+
> [!TIP]
|
|
79
|
+
> 你可以在提示框中使用 **加粗**、*斜体*、`代码` 等 Markdown 格式。
|
|
80
|
+
>
|
|
81
|
+
> 甚至可以添加列表:
|
|
82
|
+
> - 第一项
|
|
83
|
+
> - 第二项
|
|
84
|
+
> - 第三项
|
|
85
|
+
|
|
86
|
+
GitHub Alerts 让文档更加清晰易读!
|