@geoly-ai/social-hub-cli 0.0.7 → 0.0.9

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 (46) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/feishu/reddit-post-import.d.ts +79 -0
  3. package/dist/feishu/reddit-post-import.d.ts.map +1 -0
  4. package/dist/feishu/reddit-post-import.js +239 -0
  5. package/dist/feishu/reddit-post-import.js.map +1 -0
  6. package/dist/feishu/reddit-post-import.test.d.ts +2 -0
  7. package/dist/feishu/reddit-post-import.test.d.ts.map +1 -0
  8. package/dist/feishu/reddit-post-import.test.js +47 -0
  9. package/dist/feishu/reddit-post-import.test.js.map +1 -0
  10. package/dist/feishu/sync-feishu-posts.d.ts +4 -0
  11. package/dist/feishu/sync-feishu-posts.d.ts.map +1 -0
  12. package/dist/feishu/sync-feishu-posts.js +112 -0
  13. package/dist/feishu/sync-feishu-posts.js.map +1 -0
  14. package/dist/index.test.js +1 -1
  15. package/dist/index.test.js.map +1 -1
  16. package/dist/permissions.js +1 -1
  17. package/dist/permissions.js.map +1 -1
  18. package/dist/register-extensions.d.ts.map +1 -1
  19. package/dist/register-extensions.js +22 -16
  20. package/dist/register-extensions.js.map +1 -1
  21. package/dist/register-skills.d.ts.map +1 -1
  22. package/dist/register-skills.js +24 -6
  23. package/dist/register-skills.js.map +1 -1
  24. package/dist/skills/doctor.js +1 -1
  25. package/dist/skills/doctor.js.map +1 -1
  26. package/dist/skills/target-detector.d.ts +8 -1
  27. package/dist/skills/target-detector.d.ts.map +1 -1
  28. package/dist/skills/target-detector.js +69 -34
  29. package/dist/skills/target-detector.js.map +1 -1
  30. package/dist/skills/target-detector.test.d.ts +2 -0
  31. package/dist/skills/target-detector.test.d.ts.map +1 -0
  32. package/dist/skills/target-detector.test.js +66 -0
  33. package/dist/skills/target-detector.test.js.map +1 -0
  34. package/dist/skills/tui.d.ts +19 -1
  35. package/dist/skills/tui.d.ts.map +1 -1
  36. package/dist/skills/tui.js +120 -28
  37. package/dist/skills/tui.js.map +1 -1
  38. package/dist/skills/tui.test.d.ts +2 -0
  39. package/dist/skills/tui.test.d.ts.map +1 -0
  40. package/dist/skills/tui.test.js +37 -0
  41. package/dist/skills/tui.test.js.map +1 -0
  42. package/package.json +3 -2
  43. package/skills/README.md +20 -14
  44. package/skills/manifest.json +1 -1
  45. package/skills/social-hub-cli/SKILL.md +7 -5
  46. package/skills/social-hub-posts/SKILL.md +41 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=target-detector.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-detector.test.d.ts","sourceRoot":"","sources":["../../src/skills/target-detector.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { fileURLToPath } from "node:url";
6
+ import { describe, expect, it } from "vitest";
7
+ import { autoDetectTargets, detectInstallTargets, hasExplicitInstallTarget, isBundledSkillsSourceDir, } from "./target-detector.js";
8
+ const cliVersion = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), "../../package.json"), "utf8")).version;
9
+ describe("target-detector", () => {
10
+ it("returns no targets when agent/dir/env are omitted", () => {
11
+ expect(detectInstallTargets({ cwd: "/tmp/social-ops-hub" })).toEqual([]);
12
+ });
13
+ it("resolves a single agent global target", () => {
14
+ const targets = detectInstallTargets({
15
+ cwd: "/tmp",
16
+ agent: "cursor",
17
+ scope: "global",
18
+ });
19
+ expect(targets).toHaveLength(2);
20
+ expect(targets.map((t) => t.dir)).toContain(join(homedir(), ".cursor/skills"));
21
+ expect(targets.every((t) => t.agentId === "cursor")).toBe(true);
22
+ });
23
+ it("uses auto-detect only for explicit --agent '*'", () => {
24
+ const root = join(tmpdir(), `social-hub-detect-${Date.now()}`);
25
+ mkdirSync(join(root, ".cursor/skills"), { recursive: true });
26
+ const targets = detectInstallTargets({
27
+ cwd: root,
28
+ agent: "*",
29
+ scope: "project",
30
+ });
31
+ expect(targets.some((t) => t.dir.endsWith(".cursor/skills"))).toBe(true);
32
+ });
33
+ it("skips bundled skills source directory during auto-detect", () => {
34
+ const root = join(tmpdir(), `social-hub-source-${Date.now()}`);
35
+ mkdirSync(join(root, "skills", "social-hub-cli"), { recursive: true });
36
+ writeFileSync(join(root, "skills", "manifest.json"), JSON.stringify({
37
+ version: 1,
38
+ package: "social-ops-hub",
39
+ cliVersion,
40
+ repository: "social-ops-hub",
41
+ skills: [{ id: "social-hub-cli", path: "social-hub-cli", description: "cli" }],
42
+ }));
43
+ writeFileSync(join(root, "skills", "social-hub-cli", "SKILL.md"), "---\nname: social-hub-cli\ndescription: cli\n---\n");
44
+ expect(isBundledSkillsSourceDir(join(root, "skills"))).toBe(true);
45
+ const targets = autoDetectTargets(root, "standalone", "project");
46
+ expect(targets.some((t) => t.dir === join(root, "skills"))).toBe(false);
47
+ });
48
+ it("detects explicit install targets", () => {
49
+ expect(hasExplicitInstallTarget({})).toBe(false);
50
+ expect(hasExplicitInstallTarget({ agent: "cursor" })).toBe(true);
51
+ expect(hasExplicitInstallTarget({ dir: "/tmp/skills" })).toBe(true);
52
+ expect(hasExplicitInstallTarget({ envInstallDir: "/tmp/skills" })).toBe(true);
53
+ });
54
+ it("honors custom --dir without auto-detect", () => {
55
+ const dir = join(tmpdir(), `social-hub-custom-${Date.now()}`);
56
+ mkdirSync(dir, { recursive: true });
57
+ const targets = detectInstallTargets({ dir });
58
+ expect(targets).toEqual([
59
+ expect.objectContaining({
60
+ agentId: "custom",
61
+ dir,
62
+ }),
63
+ ]);
64
+ });
65
+ });
66
+ //# sourceMappingURL=target-detector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-detector.test.js","sourceRoot":"","sources":["../../src/skills/target-detector.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,28 @@
1
- import type { InstallMethod, InstallScope } from "./types.js";
1
+ import type { InstallMethod, InstallScope, PlanAction } from "./types.js";
2
2
  export type TuiOptions = {
3
3
  cwd?: string;
4
4
  defaultScope?: InstallScope;
5
5
  defaultMethod?: InstallMethod;
6
+ defaultAction?: PlanAction;
7
+ preselectedSkillIds?: string[];
8
+ preselectedAgentIds?: string[];
9
+ /** When true, use defaultScope without prompting (e.g. --global / --project). */
10
+ skipScopePrompt?: boolean;
6
11
  };
12
+ export declare function shouldUseInstallTui(opts: {
13
+ json?: boolean;
14
+ dryRun?: boolean;
15
+ yes?: boolean;
16
+ }): boolean;
17
+ export declare function buildInstallTuiOptionsFromCli(opts: {
18
+ agent?: string;
19
+ skill?: string;
20
+ global?: boolean;
21
+ project?: boolean;
22
+ symlink?: boolean;
23
+ }, positional?: string): TuiOptions;
7
24
  export declare function printNonInteractiveHint(): void;
25
+ export declare function printInstallTargetHint(): void;
8
26
  export declare function runSkillsTui(opts?: TuiOptions): Promise<void>;
9
27
  export declare function runSkillsBootstrap(opts?: TuiOptions): Promise<void>;
10
28
  //# sourceMappingURL=tui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,YAAY,EAAc,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAoCF,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGvE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAKV;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,EACD,UAAU,CAAC,EAAE,MAAM,GAClB,UAAU,CAgBZ;AAuCD,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAmB7C;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIvE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E"}
@@ -8,6 +8,39 @@ import { resolveAgentDefaultTarget } from "./target-detector.js";
8
8
  function isInteractive() {
9
9
  return Boolean(process.stdin.isTTY && process.stdout.isTTY);
10
10
  }
11
+ export function shouldUseInstallTui(opts) {
12
+ if (opts.json || opts.dryRun)
13
+ return false;
14
+ if (!isInteractive())
15
+ return false;
16
+ if (opts.yes)
17
+ return false;
18
+ return true;
19
+ }
20
+ export function buildInstallTuiOptionsFromCli(opts, positional) {
21
+ const preselectedSkillIds = parseCliSkillIds(opts.skill, positional);
22
+ const agentRaw = opts.agent?.trim();
23
+ const preselectedAgentIds = agentRaw && agentRaw !== "*"
24
+ ? agentRaw.split(",").map((s) => s.trim()).filter(Boolean)
25
+ : undefined;
26
+ return {
27
+ defaultAction: "install",
28
+ defaultScope: opts.global ? "global" : opts.project ? "project" : undefined,
29
+ defaultMethod: opts.symlink ? "symlink" : undefined,
30
+ skipScopePrompt: Boolean(opts.global || opts.project),
31
+ preselectedSkillIds,
32
+ preselectedAgentIds,
33
+ };
34
+ }
35
+ function parseCliSkillIds(skill, positional) {
36
+ if (positional?.trim())
37
+ return [positional.trim()];
38
+ if (!skill?.trim())
39
+ return undefined;
40
+ if (skill === "*")
41
+ return ["*"];
42
+ return skill.split(",").map((s) => s.trim()).filter(Boolean);
43
+ }
11
44
  async function promptSelect(rl, title, choices, multi = false) {
12
45
  console.log(`\n${title}`);
13
46
  choices.forEach((c, i) => console.log(` ${i + 1}. ${c.label}`));
@@ -35,9 +68,30 @@ async function promptSelect(rl, title, choices, multi = false) {
35
68
  }
36
69
  export function printNonInteractiveHint() {
37
70
  console.log("Non-interactive environment detected. Use:");
38
- console.log(" npx @geoly-ai/social-hub-cli skills install --agent cursor --global --yes");
39
- console.log(" npx @geoly-ai/social-hub-cli skills update --all --yes");
40
- console.log(" social-hub skills install --agent claude-code --project --yes");
71
+ console.log(" social-hub skills install --agent cursor --global --yes");
72
+ console.log(" social-hub skills update --agent cursor --global --yes");
73
+ console.log(" social-hub skills install --agent '*' --global --yes # all detected agent dirs");
74
+ }
75
+ export function printInstallTargetHint() {
76
+ console.error("No install target selected.");
77
+ console.error("");
78
+ if (isInteractive()) {
79
+ console.error("Run the interactive installer:");
80
+ console.error(" social-hub skills install");
81
+ console.error("");
82
+ console.error("Or specify a target for scripts:");
83
+ }
84
+ else {
85
+ printNonInteractiveHint();
86
+ console.error("");
87
+ console.error("Non-interactive examples:");
88
+ }
89
+ console.error(" social-hub skills install --agent cursor --global --yes");
90
+ console.error(" social-hub skills install --dir ~/.cursor/skills --yes");
91
+ console.error(" SKILLS_INSTALL_DIR=~/.cursor/skills social-hub skills install --yes");
92
+ console.error("");
93
+ console.error("Install to every detected agent directory (explicit opt-in):");
94
+ console.error(" social-hub skills install --agent '*' --global --yes");
41
95
  }
42
96
  export async function runSkillsTui(opts = {}) {
43
97
  if (!isInteractive()) {
@@ -46,38 +100,76 @@ export async function runSkillsTui(opts = {}) {
46
100
  }
47
101
  const rl = readline.createInterface({ input, output });
48
102
  try {
49
- const agents = listAgents();
50
- const agentChoices = [
51
- ...agents.map((a) => ({ label: a.label, value: a.id })),
52
- { label: "Custom directory", value: "__custom__" },
53
- ];
54
- const selectedAgents = await promptSelect(rl, "Select target agent(s):", agentChoices, true);
103
+ const source = resolveBundledSource();
104
+ let selectedAgents;
105
+ if (opts.preselectedAgentIds?.length) {
106
+ selectedAgents = opts.preselectedAgentIds;
107
+ console.log(`\nTarget agent(s): ${selectedAgents.join(", ")}`);
108
+ }
109
+ else {
110
+ const agents = listAgents();
111
+ const agentChoices = [
112
+ ...agents.map((a) => ({ label: a.label, value: a.id })),
113
+ { label: "Custom directory", value: "__custom__" },
114
+ ];
115
+ selectedAgents = await promptSelect(rl, "Select target agent(s):", agentChoices, true);
116
+ }
55
117
  let scope = opts.defaultScope ?? "project";
56
- const scopeAns = (await rl.question("Scope [project/global] (default project): ")).trim();
57
- if (scopeAns === "global")
58
- scope = "global";
118
+ if (opts.skipScopePrompt && opts.defaultScope) {
119
+ scope = opts.defaultScope;
120
+ console.log(`Scope: ${scope}`);
121
+ }
122
+ else if (!opts.skipScopePrompt) {
123
+ const scopeAns = (await rl.question("Scope [project/global] (default project): ")).trim();
124
+ if (scopeAns === "global")
125
+ scope = "global";
126
+ }
59
127
  let installMode = "standalone";
60
128
  if (selectedAgents.includes("claude-code")) {
61
129
  const modeAns = (await rl.question("Claude install mode [standalone/plugin] (default standalone): ")).trim();
62
130
  if (modeAns === "plugin")
63
131
  installMode = "plugin";
64
132
  }
65
- const source = resolveBundledSource();
66
- const skillChoices = source.manifest.skills.map((s) => ({
67
- label: `${s.id} ${s.description}`,
68
- value: s.id,
69
- }));
70
- skillChoices.unshift({ label: "All social-hub skills", value: "*" });
71
- const selectedSkills = await promptSelect(rl, "Select skill(s):", skillChoices, true);
72
- const actionChoices = [
73
- { label: "Install missing skills", value: "install" },
74
- { label: "Update installed skills", value: "update" },
75
- { label: "Reinstall selected skills", value: "reinstall" },
76
- ];
77
- const [actionRaw] = await promptSelect(rl, "Action:", actionChoices, false);
78
- const action = actionRaw;
79
- const methodAns = (await rl.question("Method [copy/symlink] (default copy): ")).trim();
80
- const method = methodAns === "symlink" ? "symlink" : "copy";
133
+ let selectedSkills;
134
+ if (opts.preselectedSkillIds?.length) {
135
+ for (const id of opts.preselectedSkillIds) {
136
+ if (id !== "*" && !source.manifest.skills.some((s) => s.id === id)) {
137
+ throw new Error(`Unknown skill: ${id}`);
138
+ }
139
+ }
140
+ selectedSkills = opts.preselectedSkillIds;
141
+ console.log(`Skill(s): ${selectedSkills.join(", ")}`);
142
+ }
143
+ else {
144
+ const skillChoices = source.manifest.skills.map((s) => ({
145
+ label: `${s.id} ${s.description}`,
146
+ value: s.id,
147
+ }));
148
+ skillChoices.unshift({ label: "All social-hub skills", value: "*" });
149
+ selectedSkills = await promptSelect(rl, "Select skill(s):", skillChoices, true);
150
+ }
151
+ let action;
152
+ if (opts.defaultAction) {
153
+ action = opts.defaultAction;
154
+ console.log(`Action: ${action}`);
155
+ }
156
+ else {
157
+ const actionChoices = [
158
+ { label: "Install missing skills", value: "install" },
159
+ { label: "Update installed skills", value: "update" },
160
+ { label: "Reinstall selected skills", value: "reinstall" },
161
+ ];
162
+ const [actionRaw] = await promptSelect(rl, "Action:", actionChoices, false);
163
+ action = actionRaw;
164
+ }
165
+ let method = opts.defaultMethod ?? "copy";
166
+ if (opts.defaultMethod) {
167
+ console.log(`Method: ${method}`);
168
+ }
169
+ else {
170
+ const methodAns = (await rl.question("Method [copy/symlink] (default copy): ")).trim();
171
+ method = methodAns === "symlink" ? "symlink" : "copy";
172
+ }
81
173
  const targets = [];
82
174
  if (selectedAgents.includes("__custom__")) {
83
175
  const dir = (await rl.question("Custom skills directory: ")).trim();
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tui.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.test.d.ts","sourceRoot":"","sources":["../../src/skills/tui.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { buildInstallTuiOptionsFromCli, shouldUseInstallTui, } from "./tui.js";
3
+ describe("skills tui routing", () => {
4
+ it("blocks TUI for non-interactive flags", () => {
5
+ expect(shouldUseInstallTui({ yes: true })).toBe(false);
6
+ expect(shouldUseInstallTui({ json: true })).toBe(false);
7
+ expect(shouldUseInstallTui({ dryRun: true })).toBe(false);
8
+ });
9
+ it("preselects skill from positional or --skill", () => {
10
+ expect(buildInstallTuiOptionsFromCli({}, "social-hub-cli")).toMatchObject({
11
+ defaultAction: "install",
12
+ preselectedSkillIds: ["social-hub-cli"],
13
+ });
14
+ expect(buildInstallTuiOptionsFromCli({ skill: "social-hub-shared,social-hub-posts" })).toMatchObject({
15
+ preselectedSkillIds: ["social-hub-shared", "social-hub-posts"],
16
+ });
17
+ });
18
+ it("preselects agent and scope from CLI flags", () => {
19
+ expect(buildInstallTuiOptionsFromCli({
20
+ agent: "cursor",
21
+ global: true,
22
+ symlink: true,
23
+ })).toMatchObject({
24
+ preselectedAgentIds: ["cursor"],
25
+ defaultScope: "global",
26
+ skipScopePrompt: true,
27
+ defaultMethod: "symlink",
28
+ defaultAction: "install",
29
+ });
30
+ });
31
+ it("does not preselect agent when --agent is '*'", () => {
32
+ expect(buildInstallTuiOptionsFromCli({ agent: "*" })).toMatchObject({
33
+ preselectedAgentIds: undefined,
34
+ });
35
+ });
36
+ });
37
+ //# sourceMappingURL=tui.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.test.js","sourceRoot":"","sources":["../../src/skills/tui.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CACJ,6BAA6B,CAAC,EAAE,EAAE,gBAAgB,CAAC,CACpD,CAAC,aAAa,CAAC;YACd,aAAa,EAAE,SAAS;YACxB,mBAAmB,EAAE,CAAC,gBAAgB,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,CACJ,6BAA6B,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAC/E,CAAC,aAAa,CAAC;YACd,mBAAmB,EAAE,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CACJ,6BAA6B,CAAC;YAC5B,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;SACd,CAAC,CACH,CAAC,aAAa,CAAC;YACd,mBAAmB,EAAE,CAAC,QAAQ,CAAC;YAC/B,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,SAAS;YACxB,aAAa,EAAE,SAAS;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CACJ,6BAA6B,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAC9C,CAAC,aAAa,CAAC;YACd,mBAAmB,EAAE,SAAS;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoly-ai/social-hub-cli",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "description": "social-hub CLI for Social Ops Hub",
6
6
  "repository": {
@@ -13,7 +13,8 @@
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
- "skills"
16
+ "skills",
17
+ "CHANGELOG.md"
17
18
  ],
18
19
  "bin": {
19
20
  "social-hub": "./dist/index.js"
package/skills/README.md CHANGED
@@ -30,24 +30,30 @@ social-hub skills cache clear
30
30
 
31
31
  Skills 随 `@geoly-ai/social-hub-cli` 一起发布(npm tarball 内置 `skills/`)。
32
32
 
33
+ 交互式终端下,裸跑 `social-hub skills install` 会打开 TUI 选择 agent 与 skill(不会自动扫所有 agent 目录)。脚本化请显式指定目标:
34
+
33
35
  ```bash
34
- # 交互式(选 agent、skill、install/update)
35
- social-hub skills tui
36
+ # 交互式(推荐,默认入口)
37
+ social-hub skills install
38
+ social-hub skills install social-hub-cli # 预填 skill,仍走 TUI 选 agent
36
39
 
37
- # 或脚本化
38
- social-hub skills install --agent cursor --global --yes
39
- social-hub skills install --agent claude-code --project --yes
40
- social-hub skills install --agent codex --global --all --yes
40
+ # 脚本化 — 单 skill + Cursor 全局
41
+ social-hub skills install social-hub-cli --agent cursor --global --yes
42
+ social-hub skills update --agent cursor --global --yes
43
+
44
+ # 显式安装到所有已检测到的 agent 目录(opt-in)
45
+ social-hub skills install --agent '*' --global --yes
41
46
 
42
- # 更新到当前 CLI 内置版本
43
- social-hub skills update --all --yes
47
+ # 自定义目录
48
+ social-hub skills install --dir ~/.cursor/skills --yes
49
+ SKILLS_INSTALL_DIR=~/.cursor/skills social-hub skills install --yes
50
+ ```
44
51
 
45
- # 健康检查
46
- social-hub skills doctor --json
52
+ 其他 agent 示例:
47
53
 
48
- # 无需全局安装
49
- npx @geoly-ai/social-hub-cli skills bootstrap
50
- pnpm dlx @geoly-ai/social-hub-cli skills list
54
+ ```bash
55
+ social-hub skills install --agent claude-code --project --yes
56
+ social-hub skills install --agent codex --global --yes
51
57
  ```
52
58
 
53
59
  支持 [skill.sh](https://skill.sh) 兼容的全部 agent(`social-hub skills list --agents`)。安装状态记录在目标目录下的 `.social-hub-skills.json`。
@@ -70,7 +76,7 @@ skill add <org>/social-ops-hub/social-hub-ops-runtime
70
76
 
71
77
  | 方式 | 说明 |
72
78
  |------|------|
73
- | **CLI(推荐)** | `social-hub skills install --agent cursor` 或 `social-hub skills tui` |
79
+ | **CLI(推荐)** | `social-hub skills install`(TUI)或 `social-hub skills install --agent cursor --global --yes` |
74
80
  | **npx** | `npx @geoly-ai/social-hub-cli skills bootstrap` |
75
81
  | **项目内脚本** | `pnpm skills:install` → 默认 `.agents/skills/` |
76
82
  | **指定目录** | `SKILLS_INSTALL_DIR=~/.cursor/skills pnpm skills:install` |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 1,
3
3
  "package": "social-ops-hub",
4
- "cliVersion": "0.0.6",
4
+ "cliVersion": "0.0.9",
5
5
  "repository": "social-ops-hub",
6
6
  "publish": {
7
7
  "registry": "https://skill.sh",
@@ -39,12 +39,14 @@ social-hub version
39
39
 
40
40
  安装 Agent Skills:
41
41
 
42
- - **推荐**:`social-hub skills tui` 或 `social-hub skills install --agent cursor --global --yes`
42
+ - **交互式(推荐,默认)**:`social-hub skills install` 或 `social-hub skills install <skillId>`(TTY 下打开 TUI,CLI 参数会预填 agent/skill/scope)
43
+ - **Cursor 全局(脚本)**:`social-hub skills install --agent cursor --global --yes`
44
+ - **单 skill 脚本化**:`social-hub skills install social-hub-cli --agent cursor --global --yes`
45
+ - **更新已装 skills**:`social-hub skills update --agent cursor --global --yes`
46
+ - **所有已检测 agent 目录(显式 opt-in)**:`social-hub skills install --agent '*' --global --yes`
43
47
  - **免全局安装**:`npx @geoly-ai/social-hub-cli skills bootstrap`
44
- - **GitHub 最新**:`social-hub skills install --source github --repo geoly-ai/geoly-reddit --yes`
45
- - **更新**:`social-hub skills update --all --yes`
46
- - **检查**:`social-hub skills doctor`
47
- - **同仓开发**:`pnpm skills:install`(目标目录可用 `SKILLS_INSTALL_DIR=~/.cursor/skills`)
48
+ - **GitHub 最新**:`social-hub skills install --source github --repo geoly-ai/geoly-reddit --agent cursor --global --yes`
49
+ - **检查状态**:`social-hub skills doctor`
48
50
 
49
51
  ## 领域 Skill 路由
50
52
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: social-hub-posts
3
3
  description: >-
4
- Reddit 帖快照与数据:social-hub reddit list/stats/refresh/refresh-all/import-feishu 等。
5
- 用户要查帖表现、刷新 score、导入飞书表、permalink 对应快照时用本 skill(命令组名为 reddit)。
4
+ Reddit 帖快照与数据:social-hub reddit list/stats/refresh/refresh-all/create-snapshot/batch-upsert 等。
5
+ 用户要查帖表现、刷新 score、写入/更新帖快照、permalink 对应快照时用本 skill(命令组名为 reddit)。
6
6
  metadata:
7
7
  cliVersion: ">=0.0.6"
8
8
  ---
@@ -12,12 +12,50 @@ metadata:
12
12
  > **前置条件:** 先阅读 [`../social-hub-shared/SKILL.md`](../social-hub-shared/SKILL.md),
13
13
  > 确认已 auth login 并选定 team。
14
14
 
15
+ ## 查询与刷新
16
+
15
17
  ```bash
16
18
  social-hub reddit list -t <team-id> -n 20
17
19
  social-hub reddit stats -t <team-id> --campaign <uuid>
18
20
  social-hub reddit refresh-status -t <team-id> --id <snapshotId>
19
21
  social-hub reddit refresh-all -t <team-id>
20
- social-hub reddit import-feishu -t <team-id> -j '{ ... }'
21
22
  ```
22
23
 
24
+ ## 写入帖快照(含飞书同步)
25
+
26
+ **不要用 `reddit import-feishu`。** 飞书数据在本机用 `lark-cli` 读取,再用 Hub 写入命令同步。
27
+
28
+ ```bash
29
+ # 本机读飞书 Base(示例)
30
+ lark-cli base +record-list \
31
+ --base-token <baseToken> \
32
+ --table-id <tableId> \
33
+ --view-id <viewId>
34
+
35
+ # 单条补录
36
+ social-hub reddit create-snapshot -t <team-id> -j '{
37
+ "permalink": "https://www.reddit.com/r/.../comments/.../",
38
+ "subreddit": "example",
39
+ "score": 0,
40
+ "commentsCount": 0,
41
+ "source": "feishu"
42
+ }'
43
+
44
+ # 批量幂等 upsert(推荐;同一 teamId + permalink 重复执行只更新)
45
+ social-hub reddit batch-upsert -t <team-id> -j '{
46
+ "items": [
47
+ {
48
+ "permalink": "https://www.reddit.com/r/.../comments/.../",
49
+ "subreddit": "example",
50
+ "title": "...",
51
+ "score": 12,
52
+ "commentsCount": 3,
53
+ "source": "feishu"
54
+ }
55
+ ]
56
+ }'
57
+ ```
58
+
59
+ 多品牌/多 team:先 `social-hub agent-teams list` 建立品牌 → teamId 映射,再对每个 team 分别调用 `batch-upsert`(`-t` 为目标 team UUID)。
60
+
23
61
  发帖成功后应通过 `social-hub ops complete --permalink ...` 写回任务链路(见 `social-hub-publishing` / `social-hub-ops-runtime`)。