@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.
Files changed (146) hide show
  1. package/README.md +145 -0
  2. package/dist/api-client.d.ts +39 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +163 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/api-client.test.d.ts +2 -0
  7. package/dist/api-client.test.d.ts.map +1 -0
  8. package/dist/api-client.test.js +83 -0
  9. package/dist/api-client.test.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +74 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/build.d.ts +4 -0
  15. package/dist/commands/build.d.ts.map +1 -0
  16. package/dist/commands/build.js +158 -0
  17. package/dist/commands/build.js.map +1 -0
  18. package/dist/commands/code-repo.d.ts +4 -0
  19. package/dist/commands/code-repo.d.ts.map +1 -0
  20. package/dist/commands/code-repo.js +102 -0
  21. package/dist/commands/code-repo.js.map +1 -0
  22. package/dist/commands/comments.d.ts +4 -0
  23. package/dist/commands/comments.d.ts.map +1 -0
  24. package/dist/commands/comments.js +53 -0
  25. package/dist/commands/comments.js.map +1 -0
  26. package/dist/commands/demo.d.ts +4 -0
  27. package/dist/commands/demo.d.ts.map +1 -0
  28. package/dist/commands/demo.js +72 -0
  29. package/dist/commands/demo.js.map +1 -0
  30. package/dist/commands/helpers.d.ts +21 -0
  31. package/dist/commands/helpers.d.ts.map +1 -0
  32. package/dist/commands/helpers.js +66 -0
  33. package/dist/commands/helpers.js.map +1 -0
  34. package/dist/commands/knowledge.d.ts +4 -0
  35. package/dist/commands/knowledge.d.ts.map +1 -0
  36. package/dist/commands/knowledge.js +146 -0
  37. package/dist/commands/knowledge.js.map +1 -0
  38. package/dist/commands/post.d.ts +4 -0
  39. package/dist/commands/post.d.ts.map +1 -0
  40. package/dist/commands/post.js +207 -0
  41. package/dist/commands/post.js.map +1 -0
  42. package/dist/commands/scout.d.ts +4 -0
  43. package/dist/commands/scout.d.ts.map +1 -0
  44. package/dist/commands/scout.js +48 -0
  45. package/dist/commands/scout.js.map +1 -0
  46. package/dist/commands/series.d.ts +4 -0
  47. package/dist/commands/series.d.ts.map +1 -0
  48. package/dist/commands/series.js +101 -0
  49. package/dist/commands/series.js.map +1 -0
  50. package/dist/commands/skills.d.ts +3 -0
  51. package/dist/commands/skills.d.ts.map +1 -0
  52. package/dist/commands/skills.js +79 -0
  53. package/dist/commands/skills.js.map +1 -0
  54. package/dist/commands/taxonomy.d.ts +4 -0
  55. package/dist/commands/taxonomy.d.ts.map +1 -0
  56. package/dist/commands/taxonomy.js +52 -0
  57. package/dist/commands/taxonomy.js.map +1 -0
  58. package/dist/commands/uploads.d.ts +4 -0
  59. package/dist/commands/uploads.d.ts.map +1 -0
  60. package/dist/commands/uploads.js +37 -0
  61. package/dist/commands/uploads.js.map +1 -0
  62. package/dist/config.d.ts +19 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +84 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/config.test.d.ts +2 -0
  67. package/dist/config.test.d.ts.map +1 -0
  68. package/dist/config.test.js +53 -0
  69. package/dist/config.test.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +100 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/prompts/index.d.ts +9 -0
  75. package/dist/prompts/index.d.ts.map +1 -0
  76. package/dist/prompts/index.js +178 -0
  77. package/dist/prompts/index.js.map +1 -0
  78. package/dist/resources/syntax-spec.d.ts +23 -0
  79. package/dist/resources/syntax-spec.d.ts.map +1 -0
  80. package/dist/resources/syntax-spec.js +105 -0
  81. package/dist/resources/syntax-spec.js.map +1 -0
  82. package/dist/resources/syntax-spec.test.d.ts +2 -0
  83. package/dist/resources/syntax-spec.test.d.ts.map +1 -0
  84. package/dist/resources/syntax-spec.test.js +47 -0
  85. package/dist/resources/syntax-spec.test.js.map +1 -0
  86. package/dist/tools/build.d.ts +13 -0
  87. package/dist/tools/build.d.ts.map +1 -0
  88. package/dist/tools/build.js +181 -0
  89. package/dist/tools/build.js.map +1 -0
  90. package/dist/tools/code-repos.d.ts +5 -0
  91. package/dist/tools/code-repos.d.ts.map +1 -0
  92. package/dist/tools/code-repos.js +149 -0
  93. package/dist/tools/code-repos.js.map +1 -0
  94. package/dist/tools/comments.d.ts +12 -0
  95. package/dist/tools/comments.d.ts.map +1 -0
  96. package/dist/tools/comments.js +87 -0
  97. package/dist/tools/comments.js.map +1 -0
  98. package/dist/tools/demos.d.ts +5 -0
  99. package/dist/tools/demos.d.ts.map +1 -0
  100. package/dist/tools/demos.js +98 -0
  101. package/dist/tools/demos.js.map +1 -0
  102. package/dist/tools/glossary.d.ts +4 -0
  103. package/dist/tools/glossary.d.ts.map +1 -0
  104. package/dist/tools/glossary.js +139 -0
  105. package/dist/tools/glossary.js.map +1 -0
  106. package/dist/tools/helpers.d.ts +44 -0
  107. package/dist/tools/helpers.d.ts.map +1 -0
  108. package/dist/tools/helpers.js +65 -0
  109. package/dist/tools/helpers.js.map +1 -0
  110. package/dist/tools/knowledge.d.ts +4 -0
  111. package/dist/tools/knowledge.d.ts.map +1 -0
  112. package/dist/tools/knowledge.js +140 -0
  113. package/dist/tools/knowledge.js.map +1 -0
  114. package/dist/tools/math-concepts.d.ts +4 -0
  115. package/dist/tools/math-concepts.d.ts.map +1 -0
  116. package/dist/tools/math-concepts.js +158 -0
  117. package/dist/tools/math-concepts.js.map +1 -0
  118. package/dist/tools/posts.d.ts +35 -0
  119. package/dist/tools/posts.d.ts.map +1 -0
  120. package/dist/tools/posts.js +278 -0
  121. package/dist/tools/posts.js.map +1 -0
  122. package/dist/tools/scout.d.ts +10 -0
  123. package/dist/tools/scout.d.ts.map +1 -0
  124. package/dist/tools/scout.js +111 -0
  125. package/dist/tools/scout.js.map +1 -0
  126. package/dist/tools/series.d.ts +12 -0
  127. package/dist/tools/series.d.ts.map +1 -0
  128. package/dist/tools/series.js +120 -0
  129. package/dist/tools/series.js.map +1 -0
  130. package/dist/tools/syntax-capabilities.d.ts +15 -0
  131. package/dist/tools/syntax-capabilities.d.ts.map +1 -0
  132. package/dist/tools/syntax-capabilities.js +859 -0
  133. package/dist/tools/syntax-capabilities.js.map +1 -0
  134. package/dist/tools/taxonomy.d.ts +4 -0
  135. package/dist/tools/taxonomy.d.ts.map +1 -0
  136. package/dist/tools/taxonomy.js +73 -0
  137. package/dist/tools/taxonomy.js.map +1 -0
  138. package/dist/tools/uploads.d.ts +15 -0
  139. package/dist/tools/uploads.d.ts.map +1 -0
  140. package/dist/tools/uploads.js +56 -0
  141. package/dist/tools/uploads.js.map +1 -0
  142. package/dist/tools/workflows.d.ts +9 -0
  143. package/dist/tools/workflows.d.ts.map +1 -0
  144. package/dist/tools/workflows.js +249 -0
  145. package/dist/tools/workflows.js.map +1 -0
  146. 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,GAAc;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAE5F,0BAA0B;IAC1B,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC;SAC/C,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,qBAAqB,EAAE,cAAc,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;SAC9D,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,CAAC;SAChD,MAAM,CAAC,kBAAkB,EAAE,WAAW,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,WAAW,CAAC;SAC1C,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;SACrD,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC5F,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9C,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC1D,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACvD,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjD,IAAI,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QACnE,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7D,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,KAAK;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,cAAc,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;SACnE,cAAc,CAAC,qBAAqB,EAAE,4DAA4D,CAAC;SACnG,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;SAC3D,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;SAChD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,KAAK;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,cAAc,CAAC,aAAa,EAAE,qDAAqD,CAAC;SACpF,cAAc,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,eAAe,EAAE,2CAA2C,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,IAAI,GAA4B,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3E,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEL,oBAAoB;IACpB,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sDAAsD,CAAC;SACnE,cAAc,CAAC,aAAa,EAAE,iDAAiD,CAAC;SAChF,cAAc,CAAC,aAAa,EAAE,UAAU,CAAC;SACzC,MAAM,CAAC,aAAa,EAAE,uCAAuC,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,IAAI,GAA4B,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACjD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEL,yBAAyB;IACzB,KAAK;SACF,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,+EAA+E,CAAC;SAC5F,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAmD,EAAE,EAAE;YAC7E,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,WAAW,GAAG,CAAC,KAAK,GAAG,QAAQ,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,iBAAiB,GAAG,KAAK,GAAG,OAAO,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEL,sBAAsB;IACtB,KAAK;SACF,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,cAAc,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SACxD,cAAc,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACpC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,cAAc,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,OAAO,OAAO,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEL,uBAAuB;IACvB,KAAK;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,2BAA2B,CAAC;SACxC,cAAc,CAAC,sBAAsB,EAAE,+CAA+C,CAAC;SACvF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAA0E,EAAE,EAAE;YAC3G,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,KAAK,GAAG,YAAY,EAAE,CAAC;YACpE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7F,OAAO,GAAG,SAAS,KAAK,YAAY,EAAE,CAAC;YACzC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,gBAAgB,UAAU,OAAO,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCodeRepoCommands(program: Command, api: ApiClient): void;
4
+ //# sourceMappingURL=code-repo.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerCommentCommands(program: Command, api: ApiClient): void;
4
+ //# sourceMappingURL=comments.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerDemoCommands(program: Command, api: ApiClient): void;
4
+ //# sourceMappingURL=demo.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ import type { ApiClient } from "../api-client.js";
3
+ export declare function registerKnowledgeCommands(program: Command, api: ApiClient): void;
4
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -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"}