autocrew 0.1.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/HAMLETDEER.md +562 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/README_CN.md +190 -0
- package/adapters/openclaw/index.ts +68 -0
- package/bin/autocrew.mjs +23 -0
- package/bin/autocrew.ts +13 -0
- package/openclaw.plugin.json +36 -0
- package/package.json +74 -0
- package/skills/_writing-style/SKILL.md +68 -0
- package/skills/audience-profiler/SKILL.md +241 -0
- package/skills/content-attribution/SKILL.md +128 -0
- package/skills/content-review/SKILL.md +257 -0
- package/skills/cover-generator/SKILL.md +93 -0
- package/skills/humanizer-zh/SKILL.md +75 -0
- package/skills/intel-digest/SKILL.md +57 -0
- package/skills/intel-pull/SKILL.md +74 -0
- package/skills/manage-pipeline/SKILL.md +63 -0
- package/skills/memory-distill/SKILL.md +89 -0
- package/skills/onboarding/SKILL.md +117 -0
- package/skills/pipeline-status/SKILL.md +51 -0
- package/skills/platform-rewrite/SKILL.md +125 -0
- package/skills/pre-publish/SKILL.md +142 -0
- package/skills/publish-content/SKILL.md +500 -0
- package/skills/remix-content/SKILL.md +77 -0
- package/skills/research/SKILL.md +127 -0
- package/skills/setup/SKILL.md +353 -0
- package/skills/spawn-batch-writer/SKILL.md +66 -0
- package/skills/spawn-planner/SKILL.md +72 -0
- package/skills/spawn-writer/SKILL.md +60 -0
- package/skills/teardown/SKILL.md +144 -0
- package/skills/title-craft/SKILL.md +234 -0
- package/skills/topic-ideas/SKILL.md +105 -0
- package/skills/video-timeline/SKILL.md +117 -0
- package/skills/write-script/SKILL.md +232 -0
- package/skills/xhs-cover-review/SKILL.md +48 -0
- package/src/adapters/browser/browser-cdp.ts +260 -0
- package/src/adapters/browser/browser-relay.ts +236 -0
- package/src/adapters/browser/gateway-client.ts +148 -0
- package/src/adapters/browser/types.ts +36 -0
- package/src/adapters/image/gemini.ts +219 -0
- package/src/adapters/research/tikhub.ts +19 -0
- package/src/cli/banner.ts +18 -0
- package/src/cli/bootstrap.ts +33 -0
- package/src/cli/commands/adapt.ts +28 -0
- package/src/cli/commands/advance.ts +28 -0
- package/src/cli/commands/assets.ts +24 -0
- package/src/cli/commands/audit.ts +18 -0
- package/src/cli/commands/contents.ts +18 -0
- package/src/cli/commands/cover.ts +58 -0
- package/src/cli/commands/events.ts +17 -0
- package/src/cli/commands/humanize.ts +27 -0
- package/src/cli/commands/index.ts +80 -0
- package/src/cli/commands/init.ts +28 -0
- package/src/cli/commands/intel.ts +55 -0
- package/src/cli/commands/learn.ts +34 -0
- package/src/cli/commands/memory.ts +18 -0
- package/src/cli/commands/migrate.ts +24 -0
- package/src/cli/commands/open.ts +21 -0
- package/src/cli/commands/pipelines.ts +18 -0
- package/src/cli/commands/pre-publish.ts +27 -0
- package/src/cli/commands/profile.ts +31 -0
- package/src/cli/commands/research.ts +36 -0
- package/src/cli/commands/restore.ts +28 -0
- package/src/cli/commands/review.ts +61 -0
- package/src/cli/commands/start.ts +28 -0
- package/src/cli/commands/status.ts +14 -0
- package/src/cli/commands/templates.ts +15 -0
- package/src/cli/commands/topics.ts +18 -0
- package/src/cli/commands/trash.ts +28 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/commands/versions.ts +24 -0
- package/src/cli/index.ts +40 -0
- package/src/data/sensitive-words-builtin.json +114 -0
- package/src/data/source-presets.yaml +54 -0
- package/src/e2e.test.ts +596 -0
- package/src/modules/auth/cookie-manager.ts +113 -0
- package/src/modules/cards/template-engine.ts +74 -0
- package/src/modules/cards/templates/comparison-table.ts +71 -0
- package/src/modules/cards/templates/data-chart.ts +76 -0
- package/src/modules/cards/templates/flow-chart.ts +49 -0
- package/src/modules/cards/templates/key-points.ts +59 -0
- package/src/modules/cover/prompt-builder.test.ts +157 -0
- package/src/modules/cover/prompt-builder.ts +212 -0
- package/src/modules/cover/ratio-adapter.test.ts +122 -0
- package/src/modules/cover/ratio-adapter.ts +104 -0
- package/src/modules/filter/sensitive-words.test.ts +72 -0
- package/src/modules/filter/sensitive-words.ts +212 -0
- package/src/modules/humanizer/zh.test.ts +75 -0
- package/src/modules/humanizer/zh.ts +175 -0
- package/src/modules/intel/collector.ts +19 -0
- package/src/modules/intel/collectors/competitor.test.ts +71 -0
- package/src/modules/intel/collectors/competitor.ts +65 -0
- package/src/modules/intel/collectors/rss.test.ts +56 -0
- package/src/modules/intel/collectors/rss.ts +70 -0
- package/src/modules/intel/collectors/trends.test.ts +80 -0
- package/src/modules/intel/collectors/trends.ts +107 -0
- package/src/modules/intel/collectors/web-search.test.ts +85 -0
- package/src/modules/intel/collectors/web-search.ts +81 -0
- package/src/modules/intel/integration.test.ts +203 -0
- package/src/modules/intel/intel-engine.test.ts +103 -0
- package/src/modules/intel/intel-engine.ts +96 -0
- package/src/modules/intel/source-config.test.ts +113 -0
- package/src/modules/intel/source-config.ts +131 -0
- package/src/modules/learnings/diff-tracker.test.ts +144 -0
- package/src/modules/learnings/diff-tracker.ts +189 -0
- package/src/modules/learnings/rule-distiller.ts +141 -0
- package/src/modules/memory/distill.ts +208 -0
- package/src/modules/migrate/legacy-migrate.test.ts +169 -0
- package/src/modules/migrate/legacy-migrate.ts +229 -0
- package/src/modules/pro/api-client.ts +192 -0
- package/src/modules/pro/gate.test.ts +110 -0
- package/src/modules/pro/gate.ts +104 -0
- package/src/modules/profile/creator-profile.test.ts +178 -0
- package/src/modules/profile/creator-profile.ts +248 -0
- package/src/modules/publish/douyin-api.ts +34 -0
- package/src/modules/publish/wechat-mp.ts +320 -0
- package/src/modules/publish/xiaohongshu-api.ts +127 -0
- package/src/modules/research/free-engine.ts +360 -0
- package/src/modules/timeline/markup-generator.ts +63 -0
- package/src/modules/timeline/parser.ts +275 -0
- package/src/modules/workflow/templates.ts +124 -0
- package/src/modules/writing/platform-rewrite.ts +190 -0
- package/src/modules/writing/title-hashtag.ts +385 -0
- package/src/runtime/context.test.ts +97 -0
- package/src/runtime/context.ts +129 -0
- package/src/runtime/events.test.ts +83 -0
- package/src/runtime/events.ts +104 -0
- package/src/runtime/hooks.ts +174 -0
- package/src/runtime/tool-runner.test.ts +204 -0
- package/src/runtime/tool-runner.ts +282 -0
- package/src/runtime/workflow-engine.test.ts +455 -0
- package/src/runtime/workflow-engine.ts +391 -0
- package/src/server/index.ts +409 -0
- package/src/server/start.ts +39 -0
- package/src/storage/local-store.test.ts +304 -0
- package/src/storage/local-store.ts +704 -0
- package/src/storage/pipeline-store.test.ts +363 -0
- package/src/storage/pipeline-store.ts +698 -0
- package/src/tools/asset.ts +96 -0
- package/src/tools/content-save.ts +276 -0
- package/src/tools/cover-review.ts +221 -0
- package/src/tools/humanize.ts +54 -0
- package/src/tools/init.ts +133 -0
- package/src/tools/intel.ts +92 -0
- package/src/tools/memory.ts +76 -0
- package/src/tools/pipeline-ops.ts +109 -0
- package/src/tools/pipeline.ts +168 -0
- package/src/tools/pre-publish.ts +232 -0
- package/src/tools/publish.ts +183 -0
- package/src/tools/registry.ts +198 -0
- package/src/tools/research.ts +304 -0
- package/src/tools/review.ts +305 -0
- package/src/tools/rewrite.ts +165 -0
- package/src/tools/status.ts +30 -0
- package/src/tools/timeline.ts +234 -0
- package/src/tools/topic-create.ts +50 -0
- package/src/types/providers.ts +69 -0
- package/src/types/timeline.test.ts +147 -0
- package/src/types/timeline.ts +83 -0
- package/src/utils/retry.test.ts +97 -0
- package/src/utils/retry.ts +85 -0
- package/templates/AGENTS.md +99 -0
- package/templates/SOUL.md +31 -0
- package/templates/TOOLS.md +76 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
import { getOption } from "./index.js";
|
|
3
|
+
|
|
4
|
+
export const cmd: CommandDef = {
|
|
5
|
+
name: "review",
|
|
6
|
+
description: "Run full content review or auto-fix (use --fix for auto-fix mode)",
|
|
7
|
+
usage: "autocrew review <content-id> [--platform <platform>] [--fix]",
|
|
8
|
+
action: async (args, runner) => {
|
|
9
|
+
const contentId = args[0];
|
|
10
|
+
if (!contentId) {
|
|
11
|
+
console.error("Usage: autocrew review <content-id> [--platform <platform>] [--fix]");
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const platform = getOption(args, "--platform");
|
|
17
|
+
const isFix = args.includes("--fix");
|
|
18
|
+
|
|
19
|
+
if (isFix) {
|
|
20
|
+
// auto-fix mode
|
|
21
|
+
const result = await runner.execute("autocrew_review", {
|
|
22
|
+
action: "auto_fix",
|
|
23
|
+
content_id: contentId,
|
|
24
|
+
platform,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (!result.ok) {
|
|
28
|
+
console.error(`Fix failed: ${result.error || "unknown error"}`);
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
console.log(`Auto-fix complete for ${contentId}.`);
|
|
34
|
+
console.log(` Sensitive words fixed: ${result.sensitiveWordsFixed || 0}`);
|
|
35
|
+
console.log(` AI traces fixed: ${result.aiFixesApplied || 0}`);
|
|
36
|
+
console.log(` Saved: ${result.saved ? "yes" : "no"}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// full review mode
|
|
41
|
+
const result = await runner.execute("autocrew_review", {
|
|
42
|
+
action: "full_review",
|
|
43
|
+
content_id: contentId,
|
|
44
|
+
platform,
|
|
45
|
+
}) as any;
|
|
46
|
+
|
|
47
|
+
if (!result.ok) {
|
|
48
|
+
console.error(`Review failed: ${result.error || "unknown error"}`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
console.log(result.summary);
|
|
54
|
+
if (result.fixes?.length > 0) {
|
|
55
|
+
console.log("\nSuggested fixes:");
|
|
56
|
+
for (const fix of result.fixes) {
|
|
57
|
+
console.log(` ${fix}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "start",
|
|
5
|
+
description: "Start a new project from a topic",
|
|
6
|
+
usage: "autocrew start <topic>",
|
|
7
|
+
action: async (args, runner) => {
|
|
8
|
+
const topic = args[0];
|
|
9
|
+
if (!topic) {
|
|
10
|
+
console.error("Usage: autocrew start <topic>");
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const result = await runner.execute("autocrew_pipeline_ops", {
|
|
16
|
+
action: "start",
|
|
17
|
+
project: topic,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
console.error(`Start failed: ${result.error || "unknown error"}`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log(`Project started: ${result.projectDir}`);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "status",
|
|
5
|
+
description: "Show pipeline status",
|
|
6
|
+
usage: "autocrew status",
|
|
7
|
+
action: async (_args, runner, ctx) => {
|
|
8
|
+
const result = await runner.execute("autocrew_status", {});
|
|
9
|
+
console.log(`AutoCrew v${result.version}`);
|
|
10
|
+
console.log(`Data: ${ctx.dataDir}`);
|
|
11
|
+
console.log(`Topics: ${result.topics}`);
|
|
12
|
+
console.log(`Contents: ${result.contents} (draft:${(result.contentsByStatus as any)?.draft ?? 0} review:${(result.contentsByStatus as any)?.review ?? 0} approved:${(result.contentsByStatus as any)?.approved ?? 0} published:${(result.contentsByStatus as any)?.published ?? 0})`);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "templates",
|
|
5
|
+
description: "List available pipeline templates",
|
|
6
|
+
usage: "autocrew templates",
|
|
7
|
+
action: async (_args, runner) => {
|
|
8
|
+
const result = await runner.execute("autocrew_pipeline", { action: "templates" });
|
|
9
|
+
const templates = (result.templates || []) as any[];
|
|
10
|
+
for (const t of templates) {
|
|
11
|
+
console.log(` [${t.id}] ${t.name}`);
|
|
12
|
+
console.log(` ${t.description}`);
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "topics",
|
|
5
|
+
description: "List saved topics",
|
|
6
|
+
usage: "autocrew topics",
|
|
7
|
+
action: async (_args, runner) => {
|
|
8
|
+
const result = await runner.execute("autocrew_topic", { action: "list" });
|
|
9
|
+
const topics = (result.topics || []) as any[];
|
|
10
|
+
if (topics.length === 0) {
|
|
11
|
+
console.log("No topics yet. Use 'autocrew research' to create some.");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const t of topics) {
|
|
15
|
+
console.log(`[${t.id}] ${t.title} (${t.platform || "general"}) — score: ${t.viralScore ?? "?"}`);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "trash",
|
|
5
|
+
description: "Move a project to the trash stage",
|
|
6
|
+
usage: "autocrew trash <project>",
|
|
7
|
+
action: async (args, runner) => {
|
|
8
|
+
const project = args[0];
|
|
9
|
+
if (!project) {
|
|
10
|
+
console.error("Usage: autocrew trash <project>");
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const result = await runner.execute("autocrew_pipeline_ops", {
|
|
16
|
+
action: "trash",
|
|
17
|
+
project,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
console.error(`Trash failed: ${result.error || "unknown error"}`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log(`Project trashed: ${project}`);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
import { getOption } from "./index.js";
|
|
3
|
+
import { saveProKey, getProStatus } from "../../modules/pro/gate.js";
|
|
4
|
+
import { verifyKey } from "../../modules/pro/api-client.js";
|
|
5
|
+
|
|
6
|
+
export const cmd: CommandDef = {
|
|
7
|
+
name: "upgrade",
|
|
8
|
+
description: "Activate or verify AutoCrew Pro",
|
|
9
|
+
usage: "autocrew upgrade [--key <key>]",
|
|
10
|
+
action: async (args, _runner, ctx) => {
|
|
11
|
+
const key = getOption(args, "--key");
|
|
12
|
+
|
|
13
|
+
if (key) {
|
|
14
|
+
await saveProKey(key, ctx.dataDir);
|
|
15
|
+
console.log("Pro API key saved. Verifying...");
|
|
16
|
+
const result = await verifyKey({ dataDir: ctx.dataDir });
|
|
17
|
+
if (result.ok && result.data?.valid) {
|
|
18
|
+
console.log(`Pro activated! Plan: ${result.data.plan}`);
|
|
19
|
+
if (result.data.expiresAt) {
|
|
20
|
+
console.log(` Expires: ${result.data.expiresAt}`);
|
|
21
|
+
}
|
|
22
|
+
if (result.data.usage) {
|
|
23
|
+
console.log(` Usage: ${result.data.usage.used}/${result.data.usage.used + result.data.usage.remaining} ${result.data.usage.unit}`);
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
console.error(`Verification failed: ${result.error || "invalid key"}`);
|
|
27
|
+
console.log("Key saved locally but could not be verified. Check your network or key.");
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
const status = await getProStatus(ctx.dataDir);
|
|
31
|
+
if (status.isPro) {
|
|
32
|
+
console.log("AutoCrew Pro is active.");
|
|
33
|
+
const result = await verifyKey({ dataDir: ctx.dataDir });
|
|
34
|
+
if (result.ok && result.data) {
|
|
35
|
+
console.log(` Plan: ${result.data.plan}`);
|
|
36
|
+
if (result.data.usage) {
|
|
37
|
+
console.log(` Usage: ${result.data.usage.used}/${result.data.usage.used + result.data.usage.remaining} ${result.data.usage.unit}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
console.log("AutoCrew Free version.");
|
|
42
|
+
console.log("\nPro features: deep crawling, competitor monitoring, analytics, TTS, digital human.");
|
|
43
|
+
console.log("Get your Pro key at: https://autocrew.dev/activate");
|
|
44
|
+
console.log("\nActivate: autocrew upgrade --key <your-key>");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CommandDef } from "./index.js";
|
|
2
|
+
|
|
3
|
+
export const cmd: CommandDef = {
|
|
4
|
+
name: "versions",
|
|
5
|
+
description: "List version history for a content project",
|
|
6
|
+
usage: "autocrew versions <content-id>",
|
|
7
|
+
action: async (args, runner) => {
|
|
8
|
+
const contentId = args[0];
|
|
9
|
+
if (!contentId) {
|
|
10
|
+
console.error("Usage: autocrew versions <content-id>");
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const result = await runner.execute("autocrew_asset", { action: "versions", content_id: contentId });
|
|
15
|
+
const versions = (result.versions || []) as any[];
|
|
16
|
+
if (versions.length === 0) {
|
|
17
|
+
console.log(`No versions for ${contentId}.`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const v of versions) {
|
|
21
|
+
console.log(` v${v.version} — ${v.note || "no note"} (${v.savedAt})`);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
};
|
package/src/cli/index.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command router — parses argv and dispatches to the matching command.
|
|
3
|
+
*/
|
|
4
|
+
import { commands } from "./commands/index.js";
|
|
5
|
+
import { showBanner } from "./banner.js";
|
|
6
|
+
import type { ToolRunner } from "../runtime/tool-runner.js";
|
|
7
|
+
import type { ToolContext } from "../runtime/context.js";
|
|
8
|
+
import type { EventBus } from "../runtime/events.js";
|
|
9
|
+
|
|
10
|
+
const VERSION = "0.1.0";
|
|
11
|
+
|
|
12
|
+
export async function run(argv: string[], runner: ToolRunner, ctx: ToolContext, eventBus: EventBus): Promise<void> {
|
|
13
|
+
const subcommand = argv[0];
|
|
14
|
+
|
|
15
|
+
if (!subcommand || subcommand === "--help" || subcommand === "-h") {
|
|
16
|
+
showBanner(VERSION);
|
|
17
|
+
console.log("Usage: autocrew <command> [options]\n");
|
|
18
|
+
console.log("Commands:");
|
|
19
|
+
for (const cmd of commands) {
|
|
20
|
+
console.log(` ${cmd.name.padEnd(20)} ${cmd.description}`);
|
|
21
|
+
}
|
|
22
|
+
console.log("\nRun 'autocrew <command> --help' for more info.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (subcommand === "--version" || subcommand === "-v") {
|
|
27
|
+
console.log(VERSION);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const cmd = commands.find(c => c.name === subcommand);
|
|
32
|
+
if (!cmd) {
|
|
33
|
+
console.error(`Unknown command: ${subcommand}`);
|
|
34
|
+
console.error("Run 'autocrew --help' for available commands.");
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await cmd.action(argv.slice(1), runner, ctx, eventBus);
|
|
40
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"updatedAt": "2026-04-01",
|
|
4
|
+
"categories": {
|
|
5
|
+
"political": {
|
|
6
|
+
"description": "政治敏感词",
|
|
7
|
+
"words": [
|
|
8
|
+
"翻墙", "VPN", "科学上网", "代理服务器",
|
|
9
|
+
"六四", "天安门事件", "法轮功",
|
|
10
|
+
"习近平", "习大大", "总书记",
|
|
11
|
+
"共产党", "中共", "政变", "颠覆政权",
|
|
12
|
+
"台独", "藏独", "疆独", "港独",
|
|
13
|
+
"反华", "辱华", "乳化"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"violence": {
|
|
17
|
+
"description": "暴力/违法相关",
|
|
18
|
+
"words": [
|
|
19
|
+
"自杀方法", "自残", "割腕",
|
|
20
|
+
"枪支", "炸弹制作", "毒品制作",
|
|
21
|
+
"赌博平台", "网赌", "代孕",
|
|
22
|
+
"裸贷", "套路贷"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
"adult": {
|
|
26
|
+
"description": "色情/低俗",
|
|
27
|
+
"words": [
|
|
28
|
+
"约炮", "一夜情", "援交",
|
|
29
|
+
"色情", "黄片", "AV",
|
|
30
|
+
"性爱", "做爱"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"medical_claim": {
|
|
34
|
+
"description": "医疗/健康违规宣称",
|
|
35
|
+
"words": [
|
|
36
|
+
"包治百病", "根治", "祖传秘方",
|
|
37
|
+
"药到病除", "无副作用", "纯天然无害",
|
|
38
|
+
"FDA认证", "国家认证", "专利配方"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"financial_claim": {
|
|
42
|
+
"description": "金融违规宣称",
|
|
43
|
+
"words": [
|
|
44
|
+
"稳赚不赔", "保本保息", "日赚万元",
|
|
45
|
+
"躺赚", "零风险", "高回报",
|
|
46
|
+
"内幕消息", "庄家", "割韭菜"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"platform_restricted": {
|
|
50
|
+
"description": "平台通用限流词",
|
|
51
|
+
"words": [
|
|
52
|
+
"私信我", "加微信", "加V", "加vx",
|
|
53
|
+
"点击链接", "复制口令", "淘口令",
|
|
54
|
+
"免费领取", "限时秒杀", "最后一天",
|
|
55
|
+
"不看后悔", "震惊", "万万没想到"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"platform_specific": {
|
|
60
|
+
"xiaohongshu": {
|
|
61
|
+
"description": "小红书特有限流词",
|
|
62
|
+
"restricted": [
|
|
63
|
+
"买", "购买", "下单", "拍", "秒杀",
|
|
64
|
+
"优惠券", "折扣码", "返利",
|
|
65
|
+
"赚钱", "副业", "兼职",
|
|
66
|
+
"私信", "加我", "微信号",
|
|
67
|
+
"点赞", "关注", "收藏", "转发",
|
|
68
|
+
"最好", "第一", "最强", "顶级"
|
|
69
|
+
],
|
|
70
|
+
"suggestions": {
|
|
71
|
+
"买": "入手",
|
|
72
|
+
"购买": "入手",
|
|
73
|
+
"下单": "冲",
|
|
74
|
+
"秒杀": "闭眼入",
|
|
75
|
+
"优惠券": "小红包",
|
|
76
|
+
"赚钱": "搞米",
|
|
77
|
+
"副业": "搞副业",
|
|
78
|
+
"私信": "戳我",
|
|
79
|
+
"微信号": "看主页",
|
|
80
|
+
"最好": "超赞",
|
|
81
|
+
"第一": "top",
|
|
82
|
+
"最强": "王炸"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"douyin": {
|
|
86
|
+
"description": "抖音特有限流词",
|
|
87
|
+
"restricted": [
|
|
88
|
+
"不关注", "不点赞", "取关",
|
|
89
|
+
"直播间", "连麦", "PK",
|
|
90
|
+
"引流", "涨粉", "互粉",
|
|
91
|
+
"最便宜", "全网最低", "骗子"
|
|
92
|
+
],
|
|
93
|
+
"suggestions": {
|
|
94
|
+
"直播间": "直播",
|
|
95
|
+
"涨粉": "涨人气",
|
|
96
|
+
"最便宜": "性价比高",
|
|
97
|
+
"全网最低": "超值"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"wechat": {
|
|
101
|
+
"description": "微信公众号特有限流词",
|
|
102
|
+
"restricted": [
|
|
103
|
+
"关注公众号", "扫码关注", "转发朋友圈",
|
|
104
|
+
"诱导分享", "诱导关注",
|
|
105
|
+
"红包", "抽奖", "免费送"
|
|
106
|
+
],
|
|
107
|
+
"suggestions": {
|
|
108
|
+
"关注公众号": "关注我们",
|
|
109
|
+
"扫码关注": "长按识别",
|
|
110
|
+
"转发朋友圈": "分享给朋友"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
presets:
|
|
2
|
+
科技:
|
|
3
|
+
trends:
|
|
4
|
+
- { source: hackernews, min_score: 100 }
|
|
5
|
+
- { source: producthunt }
|
|
6
|
+
- { source: github_trending }
|
|
7
|
+
- { source: twitter_trending, region: US }
|
|
8
|
+
- { source: google_trends }
|
|
9
|
+
- { source: zhihu_hot }
|
|
10
|
+
rss_suggestions:
|
|
11
|
+
- { url: "https://36kr.com/feed", domain: 科技 }
|
|
12
|
+
- { url: "https://sspai.com/feed", domain: 效率工具 }
|
|
13
|
+
AI:
|
|
14
|
+
trends:
|
|
15
|
+
- { source: hackernews, min_score: 100 }
|
|
16
|
+
- { source: producthunt }
|
|
17
|
+
- { source: github_trending }
|
|
18
|
+
- { source: arxiv, categories: ["cs.AI", "cs.CL"] }
|
|
19
|
+
- { source: reddit, subreddits: [ChatGPT, LocalLLaMA, MachineLearning] }
|
|
20
|
+
- { source: twitter_trending, region: US }
|
|
21
|
+
rss_suggestions: []
|
|
22
|
+
美妆:
|
|
23
|
+
trends:
|
|
24
|
+
- { source: douyin_hot }
|
|
25
|
+
- { source: weibo_hot }
|
|
26
|
+
- { source: google_trends }
|
|
27
|
+
rss_suggestions: []
|
|
28
|
+
职场:
|
|
29
|
+
trends:
|
|
30
|
+
- { source: zhihu_hot }
|
|
31
|
+
- { source: weibo_hot }
|
|
32
|
+
- { source: twitter_trending }
|
|
33
|
+
- { source: google_trends }
|
|
34
|
+
rss_suggestions:
|
|
35
|
+
- { url: "https://36kr.com/feed", domain: 商业 }
|
|
36
|
+
教育:
|
|
37
|
+
trends:
|
|
38
|
+
- { source: zhihu_hot }
|
|
39
|
+
- { source: bilibili_hot }
|
|
40
|
+
- { source: google_trends }
|
|
41
|
+
rss_suggestions: []
|
|
42
|
+
美食:
|
|
43
|
+
trends:
|
|
44
|
+
- { source: douyin_hot }
|
|
45
|
+
- { source: weibo_hot }
|
|
46
|
+
- { source: google_trends }
|
|
47
|
+
rss_suggestions: []
|
|
48
|
+
_default:
|
|
49
|
+
trends:
|
|
50
|
+
- { source: weibo_hot }
|
|
51
|
+
- { source: douyin_hot }
|
|
52
|
+
- { source: google_trends }
|
|
53
|
+
- { source: twitter_trending }
|
|
54
|
+
rss_suggestions: []
|