autocrew 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autocrew",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "One-person content studio powered by AI — from trending topics to published posts",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/cli/index.ts CHANGED
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * CLI command router — parses argv and dispatches to the matching command.
3
3
  */
4
+ import { createRequire } from "node:module";
4
5
  import { commands } from "./commands/index.js";
5
6
  import { showBanner } from "./banner.js";
6
7
  import type { ToolRunner } from "../runtime/tool-runner.js";
7
8
  import type { ToolContext } from "../runtime/context.js";
8
9
  import type { EventBus } from "../runtime/events.js";
9
10
 
10
- const VERSION = "0.1.0";
11
+ const require = createRequire(import.meta.url);
12
+ const { version: VERSION } = require("../../package.json");
11
13
 
12
14
  export async function run(argv: string[], runner: ToolRunner, ctx: ToolContext, eventBus: EventBus): Promise<void> {
13
15
  const subcommand = argv[0];
@@ -84,7 +84,30 @@ export async function executeContentSave(params: Record<string, unknown>) {
84
84
 
85
85
  if (action === "list") {
86
86
  const contents = await listContents(dataDir);
87
- return { ok: true, contents };
87
+
88
+ // Also list pipeline drafting projects (these may not exist in legacy contents/)
89
+ const pipelineProjects: Array<{ slug: string; title: string; stage: string; current: string }> = [];
90
+ try {
91
+ const { listProjects, getProjectMeta, stagePath } = await import("../storage/pipeline-store.js");
92
+ for (const stage of ["drafting", "production", "published"] as const) {
93
+ const slugs = await listProjects(stage, dataDir);
94
+ for (const slug of slugs) {
95
+ const meta = await getProjectMeta(slug, dataDir);
96
+ if (meta) {
97
+ pipelineProjects.push({
98
+ slug,
99
+ title: meta.title,
100
+ stage,
101
+ current: meta.current,
102
+ });
103
+ }
104
+ }
105
+ }
106
+ } catch {
107
+ // Pipeline store may not be initialized
108
+ }
109
+
110
+ return { ok: true, contents, pipelineProjects };
88
111
  }
89
112
 
90
113
  if (action === "get") {
@@ -235,13 +235,26 @@ async function runDiscovery(params: Record<string, unknown>) {
235
235
  }
236
236
 
237
237
  if (items.length === 0) {
238
- items = Array.from({ length: topicCount }).map((_, index) => ({
239
- title: `${keyword} 选题方向 ${index + 1}`,
240
- summary: "手动降级模式生成,请后续结合真实平台反馈再筛一次。",
238
+ // All sources failed. Instead of returning useless placeholders,
239
+ // tell the caller to use the intel pipeline which has working
240
+ // web search + RSS + trends collectors.
241
+ return {
242
+ ok: false,
243
+ mode: "failed",
241
244
  platform,
242
- source: "manual",
243
- }));
244
- sourcesUsed.push("manual");
245
+ keyword,
246
+ industry: industry || null,
247
+ sourcesUsed,
248
+ error:
249
+ "所有调研源都未返回结果(browser/API/free engine)。" +
250
+ "建议使用 autocrew_intel action='pull' 进行内容调研," +
251
+ "它支持 web search + RSS + 趋势热榜,不依赖浏览器登录态。",
252
+ suggestion: {
253
+ tool: "autocrew_intel",
254
+ action: "pull",
255
+ keywords: [keyword],
256
+ },
257
+ };
245
258
  }
246
259
 
247
260
  const topics = items.slice(0, topicCount).map((item) => ({