@page.su/ai-blog-cli 0.1.0-beta.1
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 +145 -0
- package/dist/api-client.d.ts +39 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +163 -0
- package/dist/api-client.js.map +1 -0
- package/dist/api-client.test.d.ts +2 -0
- package/dist/api-client.test.d.ts.map +1 -0
- package/dist/api-client.test.js +83 -0
- package/dist/api-client.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +74 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +4 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +158 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/code-repo.d.ts +4 -0
- package/dist/commands/code-repo.d.ts.map +1 -0
- package/dist/commands/code-repo.js +102 -0
- package/dist/commands/code-repo.js.map +1 -0
- package/dist/commands/comments.d.ts +4 -0
- package/dist/commands/comments.d.ts.map +1 -0
- package/dist/commands/comments.js +53 -0
- package/dist/commands/comments.js.map +1 -0
- package/dist/commands/demo.d.ts +4 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +72 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/helpers.d.ts +21 -0
- package/dist/commands/helpers.d.ts.map +1 -0
- package/dist/commands/helpers.js +66 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/knowledge.d.ts +4 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +146 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/post.d.ts +4 -0
- package/dist/commands/post.d.ts.map +1 -0
- package/dist/commands/post.js +207 -0
- package/dist/commands/post.js.map +1 -0
- package/dist/commands/scout.d.ts +4 -0
- package/dist/commands/scout.d.ts.map +1 -0
- package/dist/commands/scout.js +48 -0
- package/dist/commands/scout.js.map +1 -0
- package/dist/commands/series.d.ts +4 -0
- package/dist/commands/series.d.ts.map +1 -0
- package/dist/commands/series.js +101 -0
- package/dist/commands/series.js.map +1 -0
- package/dist/commands/skills.d.ts +3 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +79 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/taxonomy.d.ts +4 -0
- package/dist/commands/taxonomy.d.ts.map +1 -0
- package/dist/commands/taxonomy.js +52 -0
- package/dist/commands/taxonomy.js.map +1 -0
- package/dist/commands/uploads.d.ts +4 -0
- package/dist/commands/uploads.d.ts.map +1 -0
- package/dist/commands/uploads.js +37 -0
- package/dist/commands/uploads.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +84 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +53 -0
- package/dist/config.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +9 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +178 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/syntax-spec.d.ts +23 -0
- package/dist/resources/syntax-spec.d.ts.map +1 -0
- package/dist/resources/syntax-spec.js +105 -0
- package/dist/resources/syntax-spec.js.map +1 -0
- package/dist/resources/syntax-spec.test.d.ts +2 -0
- package/dist/resources/syntax-spec.test.d.ts.map +1 -0
- package/dist/resources/syntax-spec.test.js +47 -0
- package/dist/resources/syntax-spec.test.js.map +1 -0
- package/dist/tools/build.d.ts +13 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +181 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/code-repos.d.ts +5 -0
- package/dist/tools/code-repos.d.ts.map +1 -0
- package/dist/tools/code-repos.js +149 -0
- package/dist/tools/code-repos.js.map +1 -0
- package/dist/tools/comments.d.ts +12 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +87 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/demos.d.ts +5 -0
- package/dist/tools/demos.d.ts.map +1 -0
- package/dist/tools/demos.js +98 -0
- package/dist/tools/demos.js.map +1 -0
- package/dist/tools/glossary.d.ts +4 -0
- package/dist/tools/glossary.d.ts.map +1 -0
- package/dist/tools/glossary.js +139 -0
- package/dist/tools/glossary.js.map +1 -0
- package/dist/tools/helpers.d.ts +44 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +65 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/knowledge.d.ts +4 -0
- package/dist/tools/knowledge.d.ts.map +1 -0
- package/dist/tools/knowledge.js +140 -0
- package/dist/tools/knowledge.js.map +1 -0
- package/dist/tools/math-concepts.d.ts +4 -0
- package/dist/tools/math-concepts.d.ts.map +1 -0
- package/dist/tools/math-concepts.js +158 -0
- package/dist/tools/math-concepts.js.map +1 -0
- package/dist/tools/posts.d.ts +35 -0
- package/dist/tools/posts.d.ts.map +1 -0
- package/dist/tools/posts.js +278 -0
- package/dist/tools/posts.js.map +1 -0
- package/dist/tools/scout.d.ts +10 -0
- package/dist/tools/scout.d.ts.map +1 -0
- package/dist/tools/scout.js +111 -0
- package/dist/tools/scout.js.map +1 -0
- package/dist/tools/series.d.ts +12 -0
- package/dist/tools/series.d.ts.map +1 -0
- package/dist/tools/series.js +120 -0
- package/dist/tools/series.js.map +1 -0
- package/dist/tools/syntax-capabilities.d.ts +15 -0
- package/dist/tools/syntax-capabilities.d.ts.map +1 -0
- package/dist/tools/syntax-capabilities.js +859 -0
- package/dist/tools/syntax-capabilities.js.map +1 -0
- package/dist/tools/taxonomy.d.ts +4 -0
- package/dist/tools/taxonomy.d.ts.map +1 -0
- package/dist/tools/taxonomy.js +73 -0
- package/dist/tools/taxonomy.js.map +1 -0
- package/dist/tools/uploads.d.ts +15 -0
- package/dist/tools/uploads.d.ts.map +1 -0
- package/dist/tools/uploads.js +56 -0
- package/dist/tools/uploads.js.map +1 -0
- package/dist/tools/workflows.d.ts +9 -0
- package/dist/tools/workflows.d.ts.map +1 -0
- package/dist/tools/workflows.js +249 -0
- package/dist/tools/workflows.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { run, isJson } from "./helpers.js";
|
|
3
|
+
export function registerBuildCommands(program, api) {
|
|
4
|
+
const build = program.command("build").description("Build advanced markdown syntax blocks");
|
|
5
|
+
// ── build frontmatter ──
|
|
6
|
+
build
|
|
7
|
+
.command("frontmatter")
|
|
8
|
+
.description("Build a YAML frontmatter block")
|
|
9
|
+
.requiredOption("--title <title>", "Post title")
|
|
10
|
+
.option("--slug <slug>", "Post slug")
|
|
11
|
+
.option("--excerpt <excerpt>", "Post excerpt")
|
|
12
|
+
.option("--status <status>", "Post status: draft or published")
|
|
13
|
+
.option("--published-at <date>", "ISO date string")
|
|
14
|
+
.option("--cover-image <url>", "Cover image URL")
|
|
15
|
+
.option("--tags <tags...>", "Tag names")
|
|
16
|
+
.option("--seo-title <title>", "SEO title")
|
|
17
|
+
.option("--seo-description <desc>", "SEO description")
|
|
18
|
+
.option("--canonical-url <url>", "Canonical URL")
|
|
19
|
+
.option("--json", "Output as JSON")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const body = { title: opts.title, status: opts.status ?? "draft" };
|
|
22
|
+
if (opts.slug)
|
|
23
|
+
body.slug = opts.slug;
|
|
24
|
+
if (opts.excerpt)
|
|
25
|
+
body.excerpt = opts.excerpt;
|
|
26
|
+
if (opts.publishedAt)
|
|
27
|
+
body.publishedAt = opts.publishedAt;
|
|
28
|
+
if (opts.coverImage)
|
|
29
|
+
body.coverImage = opts.coverImage;
|
|
30
|
+
if (opts.tags)
|
|
31
|
+
body.tags = opts.tags;
|
|
32
|
+
if (opts.seoTitle)
|
|
33
|
+
body.seoTitle = opts.seoTitle;
|
|
34
|
+
if (opts.seoDescription)
|
|
35
|
+
body.seoDescription = opts.seoDescription;
|
|
36
|
+
if (opts.canonicalUrl)
|
|
37
|
+
body.canonicalUrl = opts.canonicalUrl;
|
|
38
|
+
await run(() => api.post("/api/cli/build/frontmatter", body), isJson(opts));
|
|
39
|
+
});
|
|
40
|
+
// ── build live-demo ──
|
|
41
|
+
build
|
|
42
|
+
.command("live-demo")
|
|
43
|
+
.description("Build a ```live-demo code block")
|
|
44
|
+
.requiredOption("--title <title>", "Demo title shown in code block")
|
|
45
|
+
.requiredOption("--files-file <path>", "JSON file: [{\"name\":\"index.html\",\"content\":\"...\"}]")
|
|
46
|
+
.option("--tailwind", "Enable Tailwind Play CDN")
|
|
47
|
+
.option("--cdn <urls...>", "External CDN URLs (https only)")
|
|
48
|
+
.option("--height <n>", "iframe height (80-720)")
|
|
49
|
+
.option("--json", "Output as JSON")
|
|
50
|
+
.action(async (opts) => {
|
|
51
|
+
const files = JSON.parse(readFileSync(opts.filesFile, "utf-8"));
|
|
52
|
+
const body = { title: opts.title, files };
|
|
53
|
+
if (opts.tailwind)
|
|
54
|
+
body.tailwind = true;
|
|
55
|
+
if (opts.cdn)
|
|
56
|
+
body.cdn = opts.cdn;
|
|
57
|
+
if (opts.height)
|
|
58
|
+
body.height = parseInt(opts.height, 10);
|
|
59
|
+
await run(() => api.post("/api/cli/build/live-demo", body), isJson(opts));
|
|
60
|
+
});
|
|
61
|
+
// ── build reference ──
|
|
62
|
+
build
|
|
63
|
+
.command("reference")
|
|
64
|
+
.description("Build a ```ref reference block")
|
|
65
|
+
.requiredOption("--key <key>", "Reference unique key (alphanumeric/dash/underscore)")
|
|
66
|
+
.requiredOption("--title <title>", "Reference title")
|
|
67
|
+
.option("--authors <authors>", "Authors (e.g. 'Vaswani et al.')")
|
|
68
|
+
.option("--source <source>", "Source/venue (e.g. 'NeurIPS 2017')")
|
|
69
|
+
.option("--url <url>", "Original URL")
|
|
70
|
+
.option("--type <type>", "Type: paper/blog/doc/repo/video/spec/link")
|
|
71
|
+
.option("--note <note>", "Additional note")
|
|
72
|
+
.option("--json", "Output as JSON")
|
|
73
|
+
.action(async (opts) => {
|
|
74
|
+
const body = { key: opts.key, title: opts.title };
|
|
75
|
+
if (opts.authors)
|
|
76
|
+
body.authors = opts.authors;
|
|
77
|
+
if (opts.source)
|
|
78
|
+
body.source = opts.source;
|
|
79
|
+
if (opts.url)
|
|
80
|
+
body.url = opts.url;
|
|
81
|
+
if (opts.type)
|
|
82
|
+
body.type = opts.type;
|
|
83
|
+
if (opts.note)
|
|
84
|
+
body.note = opts.note;
|
|
85
|
+
await run(() => api.post("/api/cli/build/reference", body), isJson(opts));
|
|
86
|
+
});
|
|
87
|
+
// ── build image ──
|
|
88
|
+
build
|
|
89
|
+
.command("image")
|
|
90
|
+
.description("Build markdown image syntax with extended attributes")
|
|
91
|
+
.requiredOption("--url <url>", "Image URL (prefer /api/assets/oss/... or https)")
|
|
92
|
+
.requiredOption("--alt <alt>", "Alt text")
|
|
93
|
+
.option("--width <n>", "Width percentage (25/33/50/66/75/100)")
|
|
94
|
+
.option("--align <align>", "Alignment: left/center/right")
|
|
95
|
+
.option("--ratio <ratio>", "Aspect ratio (e.g. 16:9, 4:3, 1:1)")
|
|
96
|
+
.option("--no-rounded", "Disable rounded corners")
|
|
97
|
+
.option("--json", "Output as JSON")
|
|
98
|
+
.action(async (opts) => {
|
|
99
|
+
const body = { url: opts.url, alt: opts.alt };
|
|
100
|
+
if (opts.width)
|
|
101
|
+
body.width = parseInt(opts.width, 10);
|
|
102
|
+
if (opts.align)
|
|
103
|
+
body.align = opts.align;
|
|
104
|
+
if (opts.ratio)
|
|
105
|
+
body.ratio = opts.ratio;
|
|
106
|
+
if (opts.rounded === false)
|
|
107
|
+
body.rounded = false;
|
|
108
|
+
await run(() => api.post("/api/cli/build/image", body), isJson(opts));
|
|
109
|
+
});
|
|
110
|
+
// ── build code-group ──
|
|
111
|
+
build
|
|
112
|
+
.command("code-group <tabsFile>")
|
|
113
|
+
.description("Build a ```code-group multi-tab block (tabsFile: JSON [{label, lang?, code}])")
|
|
114
|
+
.action(async (tabsFile) => {
|
|
115
|
+
const tabs = JSON.parse(readFileSync(tabsFile, "utf-8"));
|
|
116
|
+
const inner = tabs.map((tab) => {
|
|
117
|
+
const langAttr = tab.lang ? ` lang=${tab.lang}` : "";
|
|
118
|
+
return `/* @tab ${tab.label}${langAttr} */\n${tab.code}`;
|
|
119
|
+
}).join("\n\n");
|
|
120
|
+
const block = "```code-group\n" + inner + "\n```";
|
|
121
|
+
console.log(block);
|
|
122
|
+
});
|
|
123
|
+
// ── build details ──
|
|
124
|
+
build
|
|
125
|
+
.command("details")
|
|
126
|
+
.description("Build a :::details folding block")
|
|
127
|
+
.requiredOption("--title <title>", "Folding block title")
|
|
128
|
+
.requiredOption("--content-file <path>", "Read content from file")
|
|
129
|
+
.option("--open", "Default expanded")
|
|
130
|
+
.option("--json", "Output as JSON")
|
|
131
|
+
.action(async (opts) => {
|
|
132
|
+
const content = readFileSync(opts.contentFile, "utf-8");
|
|
133
|
+
const openAttr = opts.open ? "{open}" : "";
|
|
134
|
+
const block = `:::details[${opts.title}]${openAttr}\n${content}\n:::`;
|
|
135
|
+
console.log(block);
|
|
136
|
+
});
|
|
137
|
+
// ── build timeline ──
|
|
138
|
+
build
|
|
139
|
+
.command("timeline")
|
|
140
|
+
.description("Build a :::timeline block")
|
|
141
|
+
.requiredOption("--events-file <path>", "JSON file: [{time, title, content?, active?}]")
|
|
142
|
+
.option("--json", "Output as JSON")
|
|
143
|
+
.action(async (opts) => {
|
|
144
|
+
const events = JSON.parse(readFileSync(opts.eventsFile, "utf-8"));
|
|
145
|
+
const eventLines = events.map((event) => {
|
|
146
|
+
const activeMarker = event.active ? " [active]" : "";
|
|
147
|
+
const titleLine = `- ${event.time} | ${event.title}${activeMarker}`;
|
|
148
|
+
if (event.content) {
|
|
149
|
+
const contentLines = event.content.split("\n").map((line) => ` ${line}`).join("\n");
|
|
150
|
+
return `${titleLine}\n${contentLines}`;
|
|
151
|
+
}
|
|
152
|
+
return titleLine;
|
|
153
|
+
}).join("\n\n");
|
|
154
|
+
const block = `:::timeline\n${eventLines}\n:::`;
|
|
155
|
+
console.log(block);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-repo.d.ts","sourceRoot":"","sources":["../../src/commands/code-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAiG/E"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { run, readContent, isJson } from "./helpers.js";
|
|
2
|
+
export function registerCodeRepoCommands(program, api) {
|
|
3
|
+
const repo = program.command("code-repo").description("Manage code repositories");
|
|
4
|
+
// ── code-repo get ──
|
|
5
|
+
repo
|
|
6
|
+
.command("get <postId>")
|
|
7
|
+
.description("Get the code repository linked to a post (all files)")
|
|
8
|
+
.option("--json", "Output as JSON")
|
|
9
|
+
.action(async (postId, opts) => {
|
|
10
|
+
await run(() => api.get(`/api/cli/posts/${encodeURIComponent(postId)}/code`), isJson(opts));
|
|
11
|
+
});
|
|
12
|
+
// ── code-repo upsert ──
|
|
13
|
+
repo
|
|
14
|
+
.command("upsert <postId>")
|
|
15
|
+
.description("Create or update the code repository for a post (idempotent)")
|
|
16
|
+
.option("--title <title>", "Repository display name")
|
|
17
|
+
.option("--description <desc>", "Repository description")
|
|
18
|
+
.option("--default-file <path>", "Default file to open (e.g. README.md)")
|
|
19
|
+
.option("--branch <branch>", "Display branch name")
|
|
20
|
+
.option("--license <license>", "License name")
|
|
21
|
+
.option("--repo-url <url>", "External repo URL")
|
|
22
|
+
.requiredOption("--files-file <path>", "JSON file with files array: [{\"path\":\"src/index.ts\",\"content\":\"...\"}]")
|
|
23
|
+
.option("--json", "Output as JSON")
|
|
24
|
+
.action(async (postId, opts) => {
|
|
25
|
+
const files = JSON.parse(readContent(opts.filesFile));
|
|
26
|
+
const meta = {};
|
|
27
|
+
if (opts.branch)
|
|
28
|
+
meta.branch = opts.branch;
|
|
29
|
+
if (opts.license)
|
|
30
|
+
meta.license = opts.license;
|
|
31
|
+
if (opts.repoUrl)
|
|
32
|
+
meta.repoUrl = opts.repoUrl;
|
|
33
|
+
const body = { files };
|
|
34
|
+
if (opts.title !== undefined)
|
|
35
|
+
body.title = opts.title;
|
|
36
|
+
if (opts.description !== undefined)
|
|
37
|
+
body.description = opts.description;
|
|
38
|
+
if (opts.defaultFile !== undefined)
|
|
39
|
+
body.defaultFilePath = opts.defaultFile;
|
|
40
|
+
body.meta = meta;
|
|
41
|
+
await run(() => api.post(`/api/cli/posts/${encodeURIComponent(postId)}/code`, body), isJson(opts));
|
|
42
|
+
});
|
|
43
|
+
// ── code-repo delete ──
|
|
44
|
+
repo
|
|
45
|
+
.command("delete <postId>")
|
|
46
|
+
.description("Unlink code repo from post. If post is sole owner, repo is also deleted.")
|
|
47
|
+
.option("--json", "Output as JSON")
|
|
48
|
+
.action(async (postId, opts) => {
|
|
49
|
+
await run(() => api.delete(`/api/cli/posts/${encodeURIComponent(postId)}/code`), isJson(opts));
|
|
50
|
+
});
|
|
51
|
+
// ── code-repo list ──
|
|
52
|
+
repo
|
|
53
|
+
.command("list")
|
|
54
|
+
.description("List all code repositories (search and paginate)")
|
|
55
|
+
.option("--search <keyword>", "Search by title")
|
|
56
|
+
.option("--page <n>", "Page number (default 1)")
|
|
57
|
+
.option("--page-size <n>", "Page size (default 20, max 50)")
|
|
58
|
+
.option("--json", "Output as JSON")
|
|
59
|
+
.action(async (opts) => {
|
|
60
|
+
const params = {};
|
|
61
|
+
if (opts.search)
|
|
62
|
+
params.search = opts.search;
|
|
63
|
+
if (opts.page)
|
|
64
|
+
params.page = parseInt(opts.page, 10);
|
|
65
|
+
if (opts.pageSize)
|
|
66
|
+
params.pageSize = parseInt(opts.pageSize, 10);
|
|
67
|
+
await run(() => api.get("/api/cli/code-repos", params), isJson(opts));
|
|
68
|
+
});
|
|
69
|
+
// ── code-repo link ──
|
|
70
|
+
repo
|
|
71
|
+
.command("link <postId> <repoId>")
|
|
72
|
+
.description("Link a post to an existing code repository (for sharing across posts)")
|
|
73
|
+
.option("--json", "Output as JSON")
|
|
74
|
+
.action(async (postId, repoId, opts) => {
|
|
75
|
+
await run(() => api.post(`/api/cli/posts/${encodeURIComponent(postId)}/code/link`, {
|
|
76
|
+
codeRepoId: repoId,
|
|
77
|
+
}), isJson(opts));
|
|
78
|
+
});
|
|
79
|
+
// ── code-repo links ──
|
|
80
|
+
repo
|
|
81
|
+
.command("links <repoId>")
|
|
82
|
+
.description("List posts linked to a code repository")
|
|
83
|
+
.option("--json", "Output as JSON")
|
|
84
|
+
.action(async (repoId, opts) => {
|
|
85
|
+
await run(() => api.get(`/api/cli/code-repos/${encodeURIComponent(repoId)}/links`), isJson(opts));
|
|
86
|
+
});
|
|
87
|
+
// ── code-repo patch-file ──
|
|
88
|
+
repo
|
|
89
|
+
.command("patch-file <postId>")
|
|
90
|
+
.description("Update a single file in the code repository")
|
|
91
|
+
.requiredOption("--file-path <path>", "File path (e.g. src/index.ts)")
|
|
92
|
+
.requiredOption("--content-file <path>", "Read new content from file")
|
|
93
|
+
.option("--json", "Output as JSON")
|
|
94
|
+
.action(async (postId, opts) => {
|
|
95
|
+
const content = readContent(opts.contentFile);
|
|
96
|
+
await run(() => api.patch(`/api/cli/posts/${encodeURIComponent(postId)}/code/file`, {
|
|
97
|
+
filePath: opts.filePath,
|
|
98
|
+
content,
|
|
99
|
+
}), isJson(opts));
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=code-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-repo.js","sourceRoot":"","sources":["../../src/commands/code-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/commands/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CA+C9E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { run, readContent, isJson } from "./helpers.js";
|
|
2
|
+
export function registerCommentCommands(program, api) {
|
|
3
|
+
const comment = program.command("comment").description("Manage comments and AI bots");
|
|
4
|
+
// ── comment create ──
|
|
5
|
+
comment
|
|
6
|
+
.command("create")
|
|
7
|
+
.description("Create a comment or reply on a post")
|
|
8
|
+
.requiredOption("--post-id <id>", "Post id (uuid)")
|
|
9
|
+
.requiredOption("--content-file <path>", "Comment content from file (Markdown, 1-5000 chars)")
|
|
10
|
+
.option("--parent-id <id>", "Parent comment id (uuid) for replies")
|
|
11
|
+
.option("--json", "Output as JSON")
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const content = readContent(opts.contentFile);
|
|
14
|
+
const body = { postId: opts.postId, content };
|
|
15
|
+
if (opts.parentId)
|
|
16
|
+
body.parentId = opts.parentId;
|
|
17
|
+
await run(() => api.post("/api/cli/comments", body), isJson(opts));
|
|
18
|
+
});
|
|
19
|
+
// ── comment ai-generate ──
|
|
20
|
+
comment
|
|
21
|
+
.command("ai-generate")
|
|
22
|
+
.description("Generate an AI comment on a post using a bot")
|
|
23
|
+
.requiredOption("--post-id <id>", "Post id (uuid)")
|
|
24
|
+
.option("--bot-id <id>", "Bot uuid (or use --bot-slug)")
|
|
25
|
+
.option("--bot-slug <slug>", "Bot slug (e.g. tech-observer)")
|
|
26
|
+
.option("--instruction <text>", "Extra instruction to guide AI comment direction")
|
|
27
|
+
.option("--parent-id <id>", "Parent comment id for replies")
|
|
28
|
+
.option("--auto-approve", "Skip review and publish immediately")
|
|
29
|
+
.option("--json", "Output as JSON")
|
|
30
|
+
.action(async (opts) => {
|
|
31
|
+
const body = { postId: opts.postId };
|
|
32
|
+
if (opts.botId)
|
|
33
|
+
body.botId = opts.botId;
|
|
34
|
+
if (opts.botSlug)
|
|
35
|
+
body.botSlug = opts.botSlug;
|
|
36
|
+
if (opts.instruction)
|
|
37
|
+
body.instruction = opts.instruction;
|
|
38
|
+
if (opts.parentId)
|
|
39
|
+
body.parentId = opts.parentId;
|
|
40
|
+
if (opts.autoApprove)
|
|
41
|
+
body.autoApprove = true;
|
|
42
|
+
await run(() => api.post("/api/cli/ai-comments", body), isJson(opts));
|
|
43
|
+
});
|
|
44
|
+
// ── comment bots ──
|
|
45
|
+
comment
|
|
46
|
+
.command("bots")
|
|
47
|
+
.description("List all enabled AI comment bots")
|
|
48
|
+
.option("--json", "Output as JSON")
|
|
49
|
+
.action(async (opts) => {
|
|
50
|
+
await run(() => api.get("/api/cli/ai-comments"), isJson(opts));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/commands/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CA2E3E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { run, readContent, isJson } from "./helpers.js";
|
|
2
|
+
export function registerDemoCommands(program, api) {
|
|
3
|
+
const demo = program.command("demo").description("Manage post live demos");
|
|
4
|
+
// ── demo list ──
|
|
5
|
+
demo
|
|
6
|
+
.command("list <postId>")
|
|
7
|
+
.description("List all demos of a post (returns slot, title, file sizes)")
|
|
8
|
+
.option("--json", "Output as JSON")
|
|
9
|
+
.action(async (postId, opts) => {
|
|
10
|
+
await run(() => api.get(`/api/cli/posts/${encodeURIComponent(postId)}/demos`), isJson(opts));
|
|
11
|
+
});
|
|
12
|
+
// ── demo get ──
|
|
13
|
+
demo
|
|
14
|
+
.command("get <postId> <slot>")
|
|
15
|
+
.description("Get demo full data (meta + all files). For large demos, use 'get-file' instead.")
|
|
16
|
+
.option("--json", "Output as JSON")
|
|
17
|
+
.action(async (postId, slot, opts) => {
|
|
18
|
+
await run(() => api.get(`/api/cli/posts/${encodeURIComponent(postId)}/demos/${encodeURIComponent(slot)}`), isJson(opts));
|
|
19
|
+
});
|
|
20
|
+
// ── demo upsert ──
|
|
21
|
+
demo
|
|
22
|
+
.command("upsert <postId> <slot>")
|
|
23
|
+
.description("Create or update a demo (idempotent by postId+slot)")
|
|
24
|
+
.option("--title <title>", "Demo title")
|
|
25
|
+
.option("--tailwind", "Enable Tailwind Play CDN")
|
|
26
|
+
.option("--cdn <urls...>", "External CDN URLs (https only)")
|
|
27
|
+
.option("--height <n>", "iframe initial height in pixels (80-720)")
|
|
28
|
+
.requiredOption("--files-file <path>", "JSON file with files array: [{\"name\":\"index.html\",\"content\":\"...\"}]")
|
|
29
|
+
.option("--json", "Output as JSON")
|
|
30
|
+
.action(async (postId, slot, opts) => {
|
|
31
|
+
const files = JSON.parse(readContent(opts.filesFile));
|
|
32
|
+
const meta = {};
|
|
33
|
+
if (opts.tailwind)
|
|
34
|
+
meta.tailwind = true;
|
|
35
|
+
if (opts.cdn)
|
|
36
|
+
meta.cdn = opts.cdn;
|
|
37
|
+
if (opts.height)
|
|
38
|
+
meta.height = parseInt(opts.height, 10);
|
|
39
|
+
await run(() => api.post(`/api/cli/posts/${encodeURIComponent(postId)}/demos`, {
|
|
40
|
+
slot, title: opts.title ?? "", meta, files,
|
|
41
|
+
}), isJson(opts));
|
|
42
|
+
});
|
|
43
|
+
// ── demo get-file ──
|
|
44
|
+
demo
|
|
45
|
+
.command("get-file <postId> <slot> <fileName>")
|
|
46
|
+
.description("Read a single file from a demo (preferred for large demos)")
|
|
47
|
+
.option("--json", "Output as JSON")
|
|
48
|
+
.action(async (postId, slot, fileName, opts) => {
|
|
49
|
+
await run(() => api.get(`/api/cli/posts/${encodeURIComponent(postId)}/demos/${encodeURIComponent(slot)}/file`, {
|
|
50
|
+
name: fileName,
|
|
51
|
+
}), isJson(opts));
|
|
52
|
+
});
|
|
53
|
+
// ── demo patch-file ──
|
|
54
|
+
demo
|
|
55
|
+
.command("patch-file <postId> <slot> <fileName>")
|
|
56
|
+
.description("Update a single file in a demo (preferred way to modify demos)")
|
|
57
|
+
.requiredOption("--content-file <path>", "Read new file content from file")
|
|
58
|
+
.option("--json", "Output as JSON")
|
|
59
|
+
.action(async (postId, slot, fileName, opts) => {
|
|
60
|
+
const content = readContent(opts.contentFile);
|
|
61
|
+
await run(() => api.patch(`/api/cli/posts/${encodeURIComponent(postId)}/demos/${encodeURIComponent(slot)}/file`, { fileName, content }), isJson(opts));
|
|
62
|
+
});
|
|
63
|
+
// ── demo delete ──
|
|
64
|
+
demo
|
|
65
|
+
.command("delete <postId> <slot>")
|
|
66
|
+
.description("Delete a demo")
|
|
67
|
+
.option("--json", "Output as JSON")
|
|
68
|
+
.action(async (postId, slot, opts) => {
|
|
69
|
+
await run(() => api.delete(`/api/cli/posts/${encodeURIComponent(postId)}/demos/${encodeURIComponent(slot)}`), isJson(opts));
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/commands/demo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI 命令通用 helper 函数。
|
|
3
|
+
*
|
|
4
|
+
* 与 MCP 版的 helpers.ts 不同:
|
|
5
|
+
* - 不需要包装为 { content: [{ type: "text", text }] } 格式
|
|
6
|
+
* - 直接输出到 stdout / stderr
|
|
7
|
+
* - 错误时设置 exit code = 1
|
|
8
|
+
*/
|
|
9
|
+
/** 读取大内容:优先从 --content-file 指定文件读取,其次从 stdin 读取 */
|
|
10
|
+
export declare function readContent(contentFile?: string, stdinContent?: string): string;
|
|
11
|
+
/** 从 stdin 同步读取内容(用于管道输入) */
|
|
12
|
+
export declare function readStdin(): string;
|
|
13
|
+
/** 输出结果:--json 模式输出原始 JSON,否则也输出格式化 JSON */
|
|
14
|
+
export declare function output(result: unknown, jsonMode?: boolean): void;
|
|
15
|
+
/** 统一错误处理:ApiClientError 输出 HTTP 状态码和校验信息,其他错误输出 message */
|
|
16
|
+
export declare function handleError(error: unknown): void;
|
|
17
|
+
/** 安全执行异步函数,自动捕获错误并输出 */
|
|
18
|
+
export declare function run(fn: () => Promise<unknown>, jsonMode?: boolean): Promise<void>;
|
|
19
|
+
/** 类型工具:提取 commander opts 的 json 标志 */
|
|
20
|
+
export declare function isJson(opts: Record<string, unknown>): boolean;
|
|
21
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/commands/helpers.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,4CAA4C;AAC5C,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAMhE;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAchD;AAED,yBAAyB;AACzB,wBAAsB,GAAG,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOvF;AAED,uCAAuC;AACvC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { ApiClientError } from "../api-client.js";
|
|
3
|
+
/**
|
|
4
|
+
* CLI 命令通用 helper 函数。
|
|
5
|
+
*
|
|
6
|
+
* 与 MCP 版的 helpers.ts 不同:
|
|
7
|
+
* - 不需要包装为 { content: [{ type: "text", text }] } 格式
|
|
8
|
+
* - 直接输出到 stdout / stderr
|
|
9
|
+
* - 错误时设置 exit code = 1
|
|
10
|
+
*/
|
|
11
|
+
/** 读取大内容:优先从 --content-file 指定文件读取,其次从 stdin 读取 */
|
|
12
|
+
export function readContent(contentFile, stdinContent) {
|
|
13
|
+
if (contentFile) {
|
|
14
|
+
return readFileSync(contentFile, "utf-8");
|
|
15
|
+
}
|
|
16
|
+
if (stdinContent !== undefined) {
|
|
17
|
+
return stdinContent;
|
|
18
|
+
}
|
|
19
|
+
throw new Error("Content is required: use --content-file <path> or pipe via --stdin");
|
|
20
|
+
}
|
|
21
|
+
/** 从 stdin 同步读取内容(用于管道输入) */
|
|
22
|
+
export function readStdin() {
|
|
23
|
+
return readFileSync(0, "utf-8");
|
|
24
|
+
}
|
|
25
|
+
/** 输出结果:--json 模式输出原始 JSON,否则也输出格式化 JSON */
|
|
26
|
+
export function output(result, jsonMode) {
|
|
27
|
+
if (typeof result === "string" && !jsonMode) {
|
|
28
|
+
console.log(result);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(JSON.stringify(result, null, 2));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** 统一错误处理:ApiClientError 输出 HTTP 状态码和校验信息,其他错误输出 message */
|
|
35
|
+
export function handleError(error) {
|
|
36
|
+
if (error instanceof ApiClientError) {
|
|
37
|
+
const lines = [`Error: HTTP ${error.status}: ${error.message}`];
|
|
38
|
+
if (error.issues !== undefined) {
|
|
39
|
+
lines.push("Validation issues:");
|
|
40
|
+
lines.push(JSON.stringify(error.issues, null, 2));
|
|
41
|
+
}
|
|
42
|
+
console.error(lines.join("\n"));
|
|
43
|
+
}
|
|
44
|
+
else if (error instanceof Error) {
|
|
45
|
+
console.error(`Error: ${error.message}`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.error(`Error: ${String(error)}`);
|
|
49
|
+
}
|
|
50
|
+
process.exitCode = 1;
|
|
51
|
+
}
|
|
52
|
+
/** 安全执行异步函数,自动捕获错误并输出 */
|
|
53
|
+
export async function run(fn, jsonMode) {
|
|
54
|
+
try {
|
|
55
|
+
const result = await fn();
|
|
56
|
+
output(result, jsonMode);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
handleError(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** 类型工具:提取 commander opts 的 json 标志 */
|
|
63
|
+
export function isJson(opts) {
|
|
64
|
+
return opts.json === true;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/commands/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;;GAOG;AAEH,mDAAmD;AACnD,MAAM,UAAU,WAAW,CAAC,WAAoB,EAAE,YAAqB;IACrE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;AACxF,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,MAAM,CAAC,MAAe,EAAE,QAAkB;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,yBAAyB;AACzB,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,EAA0B,EAAE,QAAkB;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,MAAM,CAAC,IAA6B;IAClD,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CA6HhF"}
|