@astro-minimax/cli 0.5.0 → 0.7.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 +69 -0
- package/dist/commands/ai.d.ts +2 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +99 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/data.d.ts +2 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +111 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/hooks.d.ts +2 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +378 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +50 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/post.d.ts +2 -0
- package/dist/commands/post.d.ts.map +1 -0
- package/dist/commands/post.js +190 -0
- package/dist/commands/post.js.map +1 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +88 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ai-process.d.ts +20 -0
- package/dist/tools/ai-process.d.ts.map +1 -0
- package/dist/tools/ai-process.js +607 -0
- package/dist/tools/ai-process.js.map +1 -0
- package/dist/tools/build-author-context.d.ts +13 -0
- package/dist/tools/build-author-context.d.ts.map +1 -0
- package/dist/tools/build-author-context.js +313 -0
- package/dist/tools/build-author-context.js.map +1 -0
- package/dist/tools/build-voice-profile.d.ts +12 -0
- package/dist/tools/build-voice-profile.d.ts.map +1 -0
- package/dist/tools/build-voice-profile.js +270 -0
- package/dist/tools/build-voice-profile.js.map +1 -0
- package/dist/tools/eval-ai-chat.d.ts +17 -0
- package/dist/tools/eval-ai-chat.d.ts.map +1 -0
- package/dist/tools/eval-ai-chat.js +332 -0
- package/dist/tools/eval-ai-chat.js.map +1 -0
- package/dist/tools/generate-author-profile.d.ts +14 -0
- package/dist/tools/generate-author-profile.d.ts.map +1 -0
- package/dist/tools/generate-author-profile.js +289 -0
- package/dist/tools/generate-author-profile.js.map +1 -0
- package/dist/tools/generate-cover.d.ts +14 -0
- package/dist/tools/generate-cover.d.ts.map +1 -0
- package/dist/tools/generate-cover.js +95 -0
- package/dist/tools/generate-cover.js.map +1 -0
- package/dist/tools/generate-og.d.ts +3 -0
- package/dist/tools/generate-og.d.ts.map +1 -0
- package/dist/tools/generate-og.js +254 -0
- package/dist/tools/generate-og.js.map +1 -0
- package/dist/tools/generate-related.d.ts +11 -0
- package/dist/tools/generate-related.d.ts.map +1 -0
- package/dist/tools/generate-related.js +124 -0
- package/dist/tools/generate-related.js.map +1 -0
- package/dist/tools/generate-tags.d.ts +14 -0
- package/dist/tools/generate-tags.d.ts.map +1 -0
- package/dist/tools/generate-tags.js +182 -0
- package/dist/tools/generate-tags.js.map +1 -0
- package/dist/tools/lib/ai-provider.d.ts +43 -0
- package/dist/tools/lib/ai-provider.d.ts.map +1 -0
- package/dist/tools/lib/ai-provider.js +146 -0
- package/dist/tools/lib/ai-provider.js.map +1 -0
- package/dist/tools/lib/frontmatter.d.ts +11 -0
- package/dist/tools/lib/frontmatter.d.ts.map +1 -0
- package/dist/tools/lib/frontmatter.js +80 -0
- package/dist/tools/lib/frontmatter.js.map +1 -0
- package/dist/tools/lib/index.d.ts +7 -0
- package/dist/tools/lib/index.d.ts.map +1 -0
- package/{template/tools/lib/index.ts → dist/tools/lib/index.js} +1 -0
- package/dist/tools/lib/index.js.map +1 -0
- package/dist/tools/lib/markdown.d.ts +6 -0
- package/dist/tools/lib/markdown.d.ts.map +1 -0
- package/dist/tools/lib/markdown.js +34 -0
- package/dist/tools/lib/markdown.js.map +1 -0
- package/dist/tools/lib/posts.d.ts +25 -0
- package/dist/tools/lib/posts.d.ts.map +1 -0
- package/dist/tools/lib/posts.js +63 -0
- package/dist/tools/lib/posts.js.map +1 -0
- package/dist/tools/lib/utils.d.ts +18 -0
- package/dist/tools/lib/utils.d.ts.map +1 -0
- package/dist/tools/lib/utils.js +121 -0
- package/dist/tools/lib/utils.js.map +1 -0
- package/dist/tools/lib/vectors.d.ts +27 -0
- package/dist/tools/lib/vectors.d.ts.map +1 -0
- package/dist/tools/lib/vectors.js +64 -0
- package/dist/tools/lib/vectors.js.map +1 -0
- package/dist/tools/summarize.d.ts +16 -0
- package/dist/tools/summarize.d.ts.map +1 -0
- package/dist/tools/summarize.js +108 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/tools/translate.d.ts +13 -0
- package/dist/tools/translate.d.ts.map +1 -0
- package/dist/tools/translate.js +46 -0
- package/dist/tools/translate.js.map +1 -0
- package/dist/tools/vectorize.d.ts +13 -0
- package/dist/tools/vectorize.d.ts.map +1 -0
- package/dist/tools/vectorize.js +87 -0
- package/dist/tools/vectorize.js.map +1 -0
- package/package.json +14 -9
- package/template/astro.config.ts +8 -28
- package/template/datas/ai-seo.json +8 -0
- package/template/datas/ai-skip-list.json +1 -0
- package/template/datas/author-profile-context.json +21 -0
- package/template/datas/author-profile-report.json +21 -0
- package/template/datas/eval/gold-set.json +72 -0
- package/template/functions/README.md +82 -0
- package/template/functions/api/ai-info.ts +2 -2
- package/template/functions/api/chat.ts +4 -1
- package/template/functions/api/notify/comment.ts +140 -68
- package/template/functions/api/notify/debug.ts +41 -0
- package/template/functions/api/notify/status.ts +97 -0
- package/template/functions/api/notify/test-ai-chat.ts +67 -0
- package/template/package.json +22 -25
- package/template/src/config.ts +11 -0
- package/template/src/content.config.ts +29 -16
- package/template/src/env.d.ts +0 -5
- package/index.js +0 -36
- package/template/tools/README.md +0 -169
- package/template/tools/ai-process.ts +0 -816
- package/template/tools/build-author-context.ts +0 -405
- package/template/tools/build-voice-profile.ts +0 -322
- package/template/tools/generate-author-profile.ts +0 -369
- package/template/tools/generate-cover.ts +0 -123
- package/template/tools/generate-og.ts +0 -280
- package/template/tools/generate-related.ts +0 -146
- package/template/tools/generate-tags.ts +0 -251
- package/template/tools/lib/ai-provider.ts +0 -240
- package/template/tools/lib/frontmatter.ts +0 -94
- package/template/tools/lib/markdown.ts +0 -40
- package/template/tools/lib/posts.ts +0 -89
- package/template/tools/lib/utils.ts +0 -138
- package/template/tools/lib/vectors.ts +0 -96
- package/template/tools/summarize.ts +0 -142
- package/template/tools/translate.ts +0 -60
- package/template/tools/vectorize.ts +0 -105
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join, dirname, relative } from "node:path";
|
|
3
|
+
import { readFile, writeFile, mkdir, rm } from "node:fs/promises";
|
|
4
|
+
import { exec } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
function findGitRoot(startDir) {
|
|
8
|
+
let dir = startDir;
|
|
9
|
+
while (dir !== "/") {
|
|
10
|
+
if (existsSync(join(dir, ".git"))) {
|
|
11
|
+
return dir;
|
|
12
|
+
}
|
|
13
|
+
dir = dirname(dir);
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
function findBlogRoot(startDir) {
|
|
18
|
+
let dir = startDir;
|
|
19
|
+
while (dir !== "/") {
|
|
20
|
+
if (existsSync(join(dir, "src", "data", "blog"))) {
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
if (existsSync(join(dir, "pnpm-workspace.yaml")) &&
|
|
24
|
+
existsSync(join(dir, "apps", "blog", "src", "data", "blog"))) {
|
|
25
|
+
return join(dir, "apps", "blog");
|
|
26
|
+
}
|
|
27
|
+
dir = dirname(dir);
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
function detectPackageManager(dir) {
|
|
32
|
+
if (existsSync(join(dir, "pnpm-lock.yaml")))
|
|
33
|
+
return "pnpm";
|
|
34
|
+
if (existsSync(join(dir, "yarn.lock")))
|
|
35
|
+
return "yarn";
|
|
36
|
+
return "npm";
|
|
37
|
+
}
|
|
38
|
+
function isMonorepo(dir) {
|
|
39
|
+
return (existsSync(join(dir, "pnpm-workspace.yaml")) ||
|
|
40
|
+
existsSync(join(dir, "apps")) ||
|
|
41
|
+
existsSync(join(dir, "packages")));
|
|
42
|
+
}
|
|
43
|
+
function analyzeProject() {
|
|
44
|
+
const cwd = process.cwd();
|
|
45
|
+
const gitRoot = findGitRoot(cwd);
|
|
46
|
+
const blogRoot = findBlogRoot(cwd);
|
|
47
|
+
if (!gitRoot) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (!blogRoot) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const blogPath = join(blogRoot, "src", "data", "blog");
|
|
54
|
+
const blogPkgPath = join(blogRoot, "package.json");
|
|
55
|
+
const monorepo = isMonorepo(gitRoot);
|
|
56
|
+
const installPath = monorepo ? gitRoot : blogRoot;
|
|
57
|
+
const installPkgPath = join(installPath, "package.json");
|
|
58
|
+
const relativeBlogPath = relative(installPath, blogPath);
|
|
59
|
+
return {
|
|
60
|
+
gitRoot,
|
|
61
|
+
blogPath,
|
|
62
|
+
blogPkgPath,
|
|
63
|
+
installPath,
|
|
64
|
+
installPkgPath,
|
|
65
|
+
isMonorepo: monorepo,
|
|
66
|
+
relativeBlogPath,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function generatePreCommitScript(ctx) {
|
|
70
|
+
const blogPattern = ctx.isMonorepo
|
|
71
|
+
? `${ctx.relativeBlogPath}/*.md|${ctx.relativeBlogPath}/**/*.md`
|
|
72
|
+
: `src/data/blog/*.md|src/data/blog/**/*.md`;
|
|
73
|
+
return `#!/usr/bin/env sh
|
|
74
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
|
75
|
+
|
|
76
|
+
# astro-minimax pre-commit hook
|
|
77
|
+
# Auto-fill pubDatetime/modDatetime only when empty or missing
|
|
78
|
+
# Will NOT overwrite manually specified dates
|
|
79
|
+
|
|
80
|
+
git diff --cached --name-status | while read -r status file; do
|
|
81
|
+
case "$file" in
|
|
82
|
+
${blogPattern})
|
|
83
|
+
case "$status" in
|
|
84
|
+
M)
|
|
85
|
+
filecontent=$(cat "$file" 2>/dev/null) || continue
|
|
86
|
+
frontmatter=$(echo "$filecontent" | awk -v RS='---' 'NR==2{print}')
|
|
87
|
+
draft=$(echo "$frontmatter" | awk '/^draft: /{print $2}')
|
|
88
|
+
|
|
89
|
+
if [ "$draft" = "false" ]; then
|
|
90
|
+
modDatetime=$(echo "$frontmatter" | awk '/^modDatetime: /{print $2}')
|
|
91
|
+
if [ -z "$modDatetime" ] || [ "$modDatetime" = "" ]; then
|
|
92
|
+
echo "Auto-filled modDatetime: $file"
|
|
93
|
+
sed -i.bak "/---.*/,/---.*/s/^modDatetime:.*$/modDatetime: $(date -u "+%Y-%m-%dT%H:%M:%SZ")/" "$file" && rm -f "$file.bak"
|
|
94
|
+
git add "$file"
|
|
95
|
+
fi
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
if [ "$draft" = "first" ]; then
|
|
99
|
+
echo "First release: $file"
|
|
100
|
+
sed -i.bak -e "/---.*/,/---.*/s/^modDatetime:.*$/modDatetime:/" -e "/---.*/,/---.*/s/^draft:.*$/draft: false/" "$file" && rm -f "$file.bak"
|
|
101
|
+
git add "$file"
|
|
102
|
+
fi
|
|
103
|
+
;;
|
|
104
|
+
A)
|
|
105
|
+
filecontent=$(cat "$file" 2>/dev/null) || continue
|
|
106
|
+
frontmatter=$(echo "$filecontent" | awk -v RS='---' 'NR==2{print}')
|
|
107
|
+
pubDatetime=$(echo "$frontmatter" | awk '/^pubDatetime: /{print $2}')
|
|
108
|
+
|
|
109
|
+
if [ -z "$pubDatetime" ] || [ "$pubDatetime" = "" ]; then
|
|
110
|
+
echo "Auto-filled pubDatetime: $file"
|
|
111
|
+
sed -i.bak "/---.*/,/---.*/s/^pubDatetime:.*$/pubDatetime: $(date -u "+%Y-%m-%dT%H:%M:%SZ")/" "$file" && rm -f "$file.bak"
|
|
112
|
+
git add "$file"
|
|
113
|
+
fi
|
|
114
|
+
;;
|
|
115
|
+
esac
|
|
116
|
+
;;
|
|
117
|
+
esac
|
|
118
|
+
done
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
async function getInstallCommand(pm, isMonorepo) {
|
|
122
|
+
if (isMonorepo) {
|
|
123
|
+
switch (pm) {
|
|
124
|
+
case "pnpm":
|
|
125
|
+
return "pnpm add -Dw husky";
|
|
126
|
+
case "yarn":
|
|
127
|
+
return "yarn add -DW husky";
|
|
128
|
+
case "npm":
|
|
129
|
+
return "npm install -D -w . husky";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
switch (pm) {
|
|
133
|
+
case "pnpm":
|
|
134
|
+
return "pnpm add -D husky";
|
|
135
|
+
case "yarn":
|
|
136
|
+
return "yarn add -D husky";
|
|
137
|
+
case "npm":
|
|
138
|
+
return "npm install -D husky";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function getRemoveCommand(pm, isMonorepo) {
|
|
142
|
+
if (isMonorepo) {
|
|
143
|
+
switch (pm) {
|
|
144
|
+
case "pnpm":
|
|
145
|
+
return "pnpm remove -w husky";
|
|
146
|
+
case "yarn":
|
|
147
|
+
return "yarn remove -W husky";
|
|
148
|
+
case "npm":
|
|
149
|
+
return "npm uninstall -w . husky";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
switch (pm) {
|
|
153
|
+
case "pnpm":
|
|
154
|
+
return "pnpm remove husky";
|
|
155
|
+
case "yarn":
|
|
156
|
+
return "yarn remove husky";
|
|
157
|
+
case "npm":
|
|
158
|
+
return "npm uninstall husky";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function installCommand() {
|
|
162
|
+
const ctx = analyzeProject();
|
|
163
|
+
if (!ctx) {
|
|
164
|
+
console.error("\n Error: Could not find a valid blog project.");
|
|
165
|
+
console.error(" Make sure you're in an astro-minimax blog directory with git initialized.\n");
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
if (!existsSync(ctx.installPkgPath)) {
|
|
169
|
+
console.error(`\n Error: package.json not found at ${ctx.installPath}`);
|
|
170
|
+
console.error(" Run this command from your blog's root directory.\n");
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
const pm = detectPackageManager(ctx.installPath);
|
|
174
|
+
console.log(`\n Project type: ${ctx.isMonorepo ? "Monorepo" : "Single project"}`);
|
|
175
|
+
console.log(` Git root: ${ctx.gitRoot}`);
|
|
176
|
+
console.log(` Blog path: ${ctx.blogPath}`);
|
|
177
|
+
console.log(` Package manager: ${pm}`);
|
|
178
|
+
console.log(`\n Installing husky...\n`);
|
|
179
|
+
try {
|
|
180
|
+
const installCmd = await getInstallCommand(pm, ctx.isMonorepo);
|
|
181
|
+
await execAsync(installCmd, { cwd: ctx.installPath });
|
|
182
|
+
console.log(" ✅ Husky installed\n");
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
186
|
+
if (message.includes("workspace")) {
|
|
187
|
+
console.error(" ❌ Failed to install husky in monorepo.");
|
|
188
|
+
console.error(" Try running: pnpm add -Dw husky (at monorepo root)\n");
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
console.error(` ❌ Failed to install husky: ${message}\n`);
|
|
192
|
+
}
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
console.log(" Initializing husky...\n");
|
|
196
|
+
try {
|
|
197
|
+
await execAsync("npx husky init", { cwd: ctx.installPath });
|
|
198
|
+
console.log(" ✅ Husky initialized\n");
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
const huskyDir = join(ctx.installPath, ".husky");
|
|
202
|
+
const huskyUnderscoreDir = join(huskyDir, "_");
|
|
203
|
+
await mkdir(huskyUnderscoreDir, { recursive: true });
|
|
204
|
+
await writeFile(join(huskyUnderscoreDir, "husky.sh"), `#!/usr/bin/env sh
|
|
205
|
+
if [ -z "$husky_skip_init" ]; then
|
|
206
|
+
debug () {
|
|
207
|
+
if [ "$HUSKY_DEBUG" = "1" ]; then
|
|
208
|
+
echo "husky (debug) - $1"
|
|
209
|
+
fi
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
readonly hook_name="\$(basename "\$0")"
|
|
213
|
+
debug "starting $hook_name..."
|
|
214
|
+
|
|
215
|
+
if [ "$HUSKY" = "0" ]; then
|
|
216
|
+
debug "HUSKY env variable is set to 0, skipping hook"
|
|
217
|
+
exit 0
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
if [ -f ~/.huskyrc ]; then
|
|
221
|
+
debug "sourcing ~/.huskyrc"
|
|
222
|
+
. ~/.huskyrc
|
|
223
|
+
fi
|
|
224
|
+
|
|
225
|
+
readonly husky_skip_init=1
|
|
226
|
+
export husky_skip_init
|
|
227
|
+
sh -e "\$0" "\$@"
|
|
228
|
+
exitCode="\$?"
|
|
229
|
+
|
|
230
|
+
if [ $exitCode != 0 ]; then
|
|
231
|
+
echo "husky - $hook_name hook exited with code $exitCode (error)"
|
|
232
|
+
fi
|
|
233
|
+
|
|
234
|
+
exit $exitCode
|
|
235
|
+
fi
|
|
236
|
+
`);
|
|
237
|
+
}
|
|
238
|
+
const huskyDir = join(ctx.installPath, ".husky");
|
|
239
|
+
await mkdir(huskyDir, { recursive: true });
|
|
240
|
+
const preCommitPath = join(huskyDir, "pre-commit");
|
|
241
|
+
const script = generatePreCommitScript(ctx);
|
|
242
|
+
await writeFile(preCommitPath, script, { mode: 0o755 });
|
|
243
|
+
console.log(" ✅ Created .husky/pre-commit\n");
|
|
244
|
+
try {
|
|
245
|
+
const pkgContent = await readFile(ctx.installPkgPath, "utf-8");
|
|
246
|
+
const pkg = JSON.parse(pkgContent);
|
|
247
|
+
pkg.scripts = pkg.scripts || {};
|
|
248
|
+
pkg.scripts.prepare = "husky";
|
|
249
|
+
await writeFile(ctx.installPkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
250
|
+
console.log(' ✅ Added "prepare": "husky" script\n');
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
console.warn(' ⚠️ Could not update package.json. Add "prepare": "husky" manually.\n');
|
|
254
|
+
}
|
|
255
|
+
console.log(" ═══════════════════════════════════════");
|
|
256
|
+
console.log(" Git hooks installed successfully!\n");
|
|
257
|
+
console.log(" The pre-commit hook will auto-fill:");
|
|
258
|
+
console.log(" • pubDatetime (new files, if empty)");
|
|
259
|
+
console.log(" • modDatetime (modified files, draft: false, if empty)");
|
|
260
|
+
console.log(" • Handle draft: first for first publish\n");
|
|
261
|
+
console.log(" Manually specified dates are NEVER overwritten.");
|
|
262
|
+
console.log(`\n Watching: ${ctx.relativeBlogPath}/*.md\n`);
|
|
263
|
+
}
|
|
264
|
+
async function uninstallCommand() {
|
|
265
|
+
const ctx = analyzeProject();
|
|
266
|
+
if (!ctx) {
|
|
267
|
+
console.error("\n Error: Could not find a valid blog project.\n");
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
const pm = detectPackageManager(ctx.installPath);
|
|
271
|
+
console.log(`\n Project type: ${ctx.isMonorepo ? "Monorepo" : "Single project"}`);
|
|
272
|
+
console.log(` Package manager: ${pm}`);
|
|
273
|
+
console.log("\n Uninstalling husky...\n");
|
|
274
|
+
const huskyDir = join(ctx.installPath, ".husky");
|
|
275
|
+
if (existsSync(huskyDir)) {
|
|
276
|
+
await rm(huskyDir, { recursive: true, force: true });
|
|
277
|
+
console.log(" ✅ Removed .husky directory\n");
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
console.log(" ℹ️ No .husky directory found\n");
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
const removeCmd = await getRemoveCommand(pm, ctx.isMonorepo);
|
|
284
|
+
await execAsync(removeCmd, { cwd: ctx.installPath });
|
|
285
|
+
console.log(" ✅ Removed husky from dependencies\n");
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
console.log(" ℹ️ Husky was not installed\n");
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
const pkgContent = await readFile(ctx.installPkgPath, "utf-8");
|
|
292
|
+
const pkg = JSON.parse(pkgContent);
|
|
293
|
+
if (pkg.scripts?.prepare === "husky") {
|
|
294
|
+
delete pkg.scripts.prepare;
|
|
295
|
+
if (Object.keys(pkg.scripts).length === 0) {
|
|
296
|
+
delete pkg.scripts;
|
|
297
|
+
}
|
|
298
|
+
await writeFile(ctx.installPkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
299
|
+
console.log(' ✅ Removed "prepare" script\n');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
}
|
|
304
|
+
console.log(" Git hooks uninstalled successfully!\n");
|
|
305
|
+
}
|
|
306
|
+
async function statusCommand() {
|
|
307
|
+
const ctx = analyzeProject();
|
|
308
|
+
if (!ctx) {
|
|
309
|
+
console.log("\n ❌ Not in an astro-minimax blog directory\n");
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const huskyDir = join(ctx.installPath, ".husky");
|
|
313
|
+
const preCommitPath = join(huskyDir, "pre-commit");
|
|
314
|
+
const hasHusky = existsSync(huskyDir);
|
|
315
|
+
const hasPreCommit = existsSync(preCommitPath);
|
|
316
|
+
console.log("\n Git Hooks Status\n");
|
|
317
|
+
console.log(` Project type: ${ctx.isMonorepo ? "Monorepo" : "Single project"}`);
|
|
318
|
+
console.log(` Git root: ${ctx.gitRoot}`);
|
|
319
|
+
console.log(` Blog path: ${ctx.blogPath}`);
|
|
320
|
+
console.log(` Install location: ${ctx.installPath}`);
|
|
321
|
+
console.log(` Package manager: ${detectPackageManager(ctx.installPath)}`);
|
|
322
|
+
console.log(` Husky installed: ${hasHusky ? "✅ Yes" : "❌ No"}`);
|
|
323
|
+
console.log(` Pre-commit hook: ${hasPreCommit ? "✅ Yes" : "❌ No"}\n`);
|
|
324
|
+
if (!hasHusky) {
|
|
325
|
+
console.log(" Run 'astro-minimax hooks install' to set up git hooks.\n");
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export async function hooksCommand(args) {
|
|
329
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
330
|
+
console.log(`
|
|
331
|
+
Git hooks setup for astro-minimax
|
|
332
|
+
|
|
333
|
+
Usage:
|
|
334
|
+
astro-minimax hooks <subcommand>
|
|
335
|
+
|
|
336
|
+
Subcommands:
|
|
337
|
+
install Install Husky and create pre-commit hook
|
|
338
|
+
uninstall Remove Husky and hooks
|
|
339
|
+
status Show current hooks status
|
|
340
|
+
|
|
341
|
+
Pre-commit Hook Behavior:
|
|
342
|
+
The hook auto-fills dates ONLY when empty or missing:
|
|
343
|
+
• New files: Fill pubDatetime if not specified
|
|
344
|
+
• Modified files (draft: false): Fill modDatetime if empty
|
|
345
|
+
• First release (draft: first): Set draft to false
|
|
346
|
+
|
|
347
|
+
Important: Manually specified dates are NEVER overwritten.
|
|
348
|
+
If you set pubDatetime or modDatetime yourself, the hook respects it.
|
|
349
|
+
|
|
350
|
+
Project Types:
|
|
351
|
+
• Single project: Blog created via 'astro-minimax init'
|
|
352
|
+
• Monorepo: Development setup with apps/ and packages/
|
|
353
|
+
|
|
354
|
+
Examples:
|
|
355
|
+
astro-minimax hooks install # Set up hooks
|
|
356
|
+
astro-minimax hooks status # Check installation
|
|
357
|
+
astro-minimax hooks uninstall # Remove hooks
|
|
358
|
+
`);
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const subcommand = args[0];
|
|
362
|
+
switch (subcommand) {
|
|
363
|
+
case "install":
|
|
364
|
+
await installCommand();
|
|
365
|
+
break;
|
|
366
|
+
case "uninstall":
|
|
367
|
+
await uninstallCommand();
|
|
368
|
+
break;
|
|
369
|
+
case "status":
|
|
370
|
+
await statusCommand();
|
|
371
|
+
break;
|
|
372
|
+
default:
|
|
373
|
+
console.error(`\n Unknown subcommand: ${subcommand}`);
|
|
374
|
+
console.error(" Available: install, uninstall, status\n");
|
|
375
|
+
process.exit(1);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAgDhD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { cpSync, mkdirSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve, basename } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __dirname = fileURLToPath(new URL("..", import.meta.url));
|
|
5
|
+
const templateDir = join(__dirname, "..", "template");
|
|
6
|
+
export function initCommand(args) {
|
|
7
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
8
|
+
console.log(`
|
|
9
|
+
Create a new astro-minimax blog project
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
astro-minimax init <project-name>
|
|
13
|
+
|
|
14
|
+
Arguments:
|
|
15
|
+
<project-name> Directory name for the new blog
|
|
16
|
+
|
|
17
|
+
Description:
|
|
18
|
+
Creates a new blog with all necessary configuration files,
|
|
19
|
+
AI-powered features, and a clean structure ready for content.
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
astro-minimax init my-blog
|
|
23
|
+
astro-minimax init ./blogs/tech-blog
|
|
24
|
+
`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const projectName = args[0];
|
|
28
|
+
const targetDir = resolve(process.cwd(), projectName);
|
|
29
|
+
if (existsSync(targetDir)) {
|
|
30
|
+
console.error(`Error: Directory "${projectName}" already exists.`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
mkdirSync(targetDir, { recursive: true });
|
|
34
|
+
cpSync(templateDir, targetDir, { recursive: true });
|
|
35
|
+
const pkgPath = join(targetDir, "package.json");
|
|
36
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
37
|
+
pkg.name = basename(targetDir);
|
|
38
|
+
writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
|
|
39
|
+
console.log(`\n ✅ Created "${projectName}" successfully!\n`);
|
|
40
|
+
console.log(" Getting started:\n");
|
|
41
|
+
console.log(` cd ${projectName}`);
|
|
42
|
+
console.log(" pnpm install");
|
|
43
|
+
console.log(" pnpm dev\n");
|
|
44
|
+
console.log(" CLI commands:\n");
|
|
45
|
+
console.log(" astro-minimax post new <title> Create a new post");
|
|
46
|
+
console.log(" astro-minimax ai process Process with AI");
|
|
47
|
+
console.log(" astro-minimax profile build Build author profile\n");
|
|
48
|
+
console.log(" Documentation: https://github.com/souloss/astro-minimax\n");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;CAgBf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEtD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,qBAAqB,WAAW,mBAAmB,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,mBAAmB,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/commands/post.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/D"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export async function postCommand(args) {
|
|
4
|
+
if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
|
|
5
|
+
console.log(`
|
|
6
|
+
Manage blog posts
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
astro-minimax post <subcommand> [options]
|
|
10
|
+
|
|
11
|
+
Subcommands:
|
|
12
|
+
new <title> Create a new blog post
|
|
13
|
+
list List all posts
|
|
14
|
+
stats Show post statistics
|
|
15
|
+
|
|
16
|
+
Options for "new":
|
|
17
|
+
--lang=<zh|en> Post language (default: zh)
|
|
18
|
+
--category=<path> Category path (e.g., "Tutorial/Frontend")
|
|
19
|
+
|
|
20
|
+
Description:
|
|
21
|
+
The "new" subcommand creates a markdown file with proper frontmatter
|
|
22
|
+
in the correct language directory (src/data/blog/<lang>/).
|
|
23
|
+
|
|
24
|
+
Examples:
|
|
25
|
+
astro-minimax post new "Hello World"
|
|
26
|
+
astro-minimax post new "Getting Started" --lang=en
|
|
27
|
+
astro-minimax post new "Tutorial" --category="Tutorial/Frontend"
|
|
28
|
+
astro-minimax post list
|
|
29
|
+
astro-minimax post stats
|
|
30
|
+
`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const subcommand = args[0];
|
|
34
|
+
const subArgs = args.slice(1);
|
|
35
|
+
const contentDir = join(process.cwd(), "src", "data", "blog");
|
|
36
|
+
if (!existsSync(contentDir)) {
|
|
37
|
+
console.error("Error: Not in an astro-minimax blog directory.");
|
|
38
|
+
console.error("Run this command from your blog's root directory.");
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
switch (subcommand) {
|
|
42
|
+
case "new":
|
|
43
|
+
await createNewPost(subArgs);
|
|
44
|
+
break;
|
|
45
|
+
case "list":
|
|
46
|
+
await listPosts();
|
|
47
|
+
break;
|
|
48
|
+
case "stats":
|
|
49
|
+
await showStats();
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
console.error(`Unknown subcommand: ${subcommand}`);
|
|
53
|
+
console.error("Available: new, list, stats");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function createNewPost(args) {
|
|
58
|
+
if (args.length === 0 || args[0].startsWith("--")) {
|
|
59
|
+
console.error("Error: Post title is required.");
|
|
60
|
+
console.error('Usage: astro-minimax post new "<title>"');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const title = args.find((a) => !a.startsWith("--")) || "";
|
|
64
|
+
const langArg = args.find((a) => a.startsWith("--lang="));
|
|
65
|
+
const categoryArg = args.find((a) => a.startsWith("--category="));
|
|
66
|
+
const lang = langArg ? langArg.split("=")[1] : "zh";
|
|
67
|
+
const category = categoryArg ? categoryArg.split("=")[1] : "Blog";
|
|
68
|
+
const slug = title
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-")
|
|
71
|
+
.replace(/^-|-$/g, "");
|
|
72
|
+
const date = new Date().toISOString().split("T")[0];
|
|
73
|
+
const frontmatter = `---
|
|
74
|
+
title: "${title}"
|
|
75
|
+
date: ${date}
|
|
76
|
+
updated: ${date}
|
|
77
|
+
categories:
|
|
78
|
+
- ${category}
|
|
79
|
+
tags:
|
|
80
|
+
- draft
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
# ${title}
|
|
84
|
+
|
|
85
|
+
Write your content here...
|
|
86
|
+
`;
|
|
87
|
+
const { writeFile, mkdir } = await import("node:fs/promises");
|
|
88
|
+
const postDir = join(process.cwd(), "src", "data", "blog", lang);
|
|
89
|
+
const postPath = join(postDir, `${slug}.md`);
|
|
90
|
+
await mkdir(postDir, { recursive: true });
|
|
91
|
+
await writeFile(postPath, frontmatter);
|
|
92
|
+
console.log(`\n ✅ Created: ${postPath}\n`);
|
|
93
|
+
console.log(` Title: ${title}`);
|
|
94
|
+
console.log(` Language: ${lang}`);
|
|
95
|
+
console.log(` Category: ${category}\n`);
|
|
96
|
+
}
|
|
97
|
+
async function collectMarkdownFiles(dir) {
|
|
98
|
+
const { readdir } = await import("node:fs/promises");
|
|
99
|
+
const files = [];
|
|
100
|
+
async function walk(d) {
|
|
101
|
+
if (!existsSync(d))
|
|
102
|
+
return;
|
|
103
|
+
const entries = await readdir(d, { withFileTypes: true });
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
const fullPath = join(d, entry.name);
|
|
106
|
+
if (entry.isDirectory() && !entry.name.startsWith("_")) {
|
|
107
|
+
await walk(fullPath);
|
|
108
|
+
}
|
|
109
|
+
else if (entry.isFile() && (entry.name.endsWith(".md") || entry.name.endsWith(".mdx"))) {
|
|
110
|
+
files.push(fullPath);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
await walk(dir);
|
|
115
|
+
return files;
|
|
116
|
+
}
|
|
117
|
+
function parseTitle(content, fallback) {
|
|
118
|
+
const m = content.match(/^title:\s*(?:["'](.+?)["']|(.+))$/m);
|
|
119
|
+
return m?.[1] ?? m?.[2]?.trim() ?? fallback;
|
|
120
|
+
}
|
|
121
|
+
function parseDate(content) {
|
|
122
|
+
const m = content.match(/^pubDatetime:\s*(.+)$/m);
|
|
123
|
+
if (!m)
|
|
124
|
+
return "";
|
|
125
|
+
try {
|
|
126
|
+
return new Date(m[1].trim()).toISOString().slice(0, 10);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return m[1].trim().slice(0, 10);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function isDraft(content) {
|
|
133
|
+
return /^draft:\s*true$/m.test(content);
|
|
134
|
+
}
|
|
135
|
+
async function getPostInfos(langDir, lang) {
|
|
136
|
+
const { readFile } = await import("node:fs/promises");
|
|
137
|
+
const files = await collectMarkdownFiles(langDir);
|
|
138
|
+
const posts = [];
|
|
139
|
+
for (const filePath of files) {
|
|
140
|
+
const content = await readFile(filePath, "utf-8");
|
|
141
|
+
const relativePath = filePath.replace(langDir + "/", "");
|
|
142
|
+
posts.push({
|
|
143
|
+
title: parseTitle(content, relativePath),
|
|
144
|
+
date: parseDate(content),
|
|
145
|
+
draft: isDraft(content),
|
|
146
|
+
filePath,
|
|
147
|
+
relativePath,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
posts.sort((a, b) => (b.date || "").localeCompare(a.date || ""));
|
|
151
|
+
return posts;
|
|
152
|
+
}
|
|
153
|
+
async function listPosts() {
|
|
154
|
+
const blogDir = join(process.cwd(), "src", "data", "blog");
|
|
155
|
+
const zhDir = join(blogDir, "zh");
|
|
156
|
+
const enDir = join(blogDir, "en");
|
|
157
|
+
console.log("\n Blog Posts\n");
|
|
158
|
+
for (const [lang, dir] of [["zh", zhDir], ["en", enDir]]) {
|
|
159
|
+
if (!existsSync(dir))
|
|
160
|
+
continue;
|
|
161
|
+
const posts = await getPostInfos(dir, lang);
|
|
162
|
+
const published = posts.filter(p => !p.draft);
|
|
163
|
+
const drafts = posts.filter(p => p.draft);
|
|
164
|
+
console.log(` [${lang === "zh" ? "中文" : "English"}] ${published.length} published${drafts.length ? `, ${drafts.length} draft(s)` : ""}`);
|
|
165
|
+
console.log(` ${"─".repeat(50)}`);
|
|
166
|
+
for (const post of published) {
|
|
167
|
+
const dateStr = post.date ? `${post.date} ` : "";
|
|
168
|
+
console.log(` ${dateStr} ${post.title}`);
|
|
169
|
+
}
|
|
170
|
+
if (drafts.length) {
|
|
171
|
+
console.log(`\n Drafts:`);
|
|
172
|
+
for (const post of drafts) {
|
|
173
|
+
console.log(` ✏️ ${post.title}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
console.log();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function showStats() {
|
|
180
|
+
const blogDir = join(process.cwd(), "src", "data", "blog");
|
|
181
|
+
const zhDir = join(blogDir, "zh");
|
|
182
|
+
const enDir = join(blogDir, "en");
|
|
183
|
+
const zhPosts = existsSync(zhDir) ? await collectMarkdownFiles(zhDir) : [];
|
|
184
|
+
const enPosts = existsSync(enDir) ? await collectMarkdownFiles(enDir) : [];
|
|
185
|
+
console.log("\n Post Statistics\n");
|
|
186
|
+
console.log(` Chinese (zh): ${zhPosts.length}`);
|
|
187
|
+
console.log(` English (en): ${enPosts.length}`);
|
|
188
|
+
console.log(` Total: ${zhPosts.length + enPosts.length}\n`);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=post.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/commands/post.ts"],"names":[],"mappings":"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"}
|