@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.
- package/CHANGELOG.md +56 -0
- package/dist/feishu/reddit-post-import.d.ts +79 -0
- package/dist/feishu/reddit-post-import.d.ts.map +1 -0
- package/dist/feishu/reddit-post-import.js +239 -0
- package/dist/feishu/reddit-post-import.js.map +1 -0
- package/dist/feishu/reddit-post-import.test.d.ts +2 -0
- package/dist/feishu/reddit-post-import.test.d.ts.map +1 -0
- package/dist/feishu/reddit-post-import.test.js +47 -0
- package/dist/feishu/reddit-post-import.test.js.map +1 -0
- package/dist/feishu/sync-feishu-posts.d.ts +4 -0
- package/dist/feishu/sync-feishu-posts.d.ts.map +1 -0
- package/dist/feishu/sync-feishu-posts.js +112 -0
- package/dist/feishu/sync-feishu-posts.js.map +1 -0
- package/dist/index.test.js +1 -1
- package/dist/index.test.js.map +1 -1
- package/dist/permissions.js +1 -1
- package/dist/permissions.js.map +1 -1
- package/dist/register-extensions.d.ts.map +1 -1
- package/dist/register-extensions.js +22 -16
- package/dist/register-extensions.js.map +1 -1
- package/dist/register-skills.d.ts.map +1 -1
- package/dist/register-skills.js +24 -6
- package/dist/register-skills.js.map +1 -1
- package/dist/skills/doctor.js +1 -1
- package/dist/skills/doctor.js.map +1 -1
- package/dist/skills/target-detector.d.ts +8 -1
- package/dist/skills/target-detector.d.ts.map +1 -1
- package/dist/skills/target-detector.js +69 -34
- package/dist/skills/target-detector.js.map +1 -1
- package/dist/skills/target-detector.test.d.ts +2 -0
- package/dist/skills/target-detector.test.d.ts.map +1 -0
- package/dist/skills/target-detector.test.js +66 -0
- package/dist/skills/target-detector.test.js.map +1 -0
- package/dist/skills/tui.d.ts +19 -1
- package/dist/skills/tui.d.ts.map +1 -1
- package/dist/skills/tui.js +120 -28
- package/dist/skills/tui.js.map +1 -1
- package/dist/skills/tui.test.d.ts +2 -0
- package/dist/skills/tui.test.d.ts.map +1 -0
- package/dist/skills/tui.test.js +37 -0
- package/dist/skills/tui.test.js.map +1 -0
- package/package.json +3 -2
- package/skills/README.md +20 -14
- package/skills/manifest.json +1 -1
- package/skills/social-hub-cli/SKILL.md +7 -5
- package/skills/social-hub-posts/SKILL.md +41 -3
|
@@ -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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"}
|
package/dist/skills/tui.d.ts
CHANGED
|
@@ -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
|
package/dist/skills/tui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAe,YAAY,
|
|
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"}
|
package/dist/skills/tui.js
CHANGED
|
@@ -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("
|
|
39
|
-
console.log("
|
|
40
|
-
console.log(" social-hub skills install --agent
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
scope
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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();
|
package/dist/skills/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAwB,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/skills/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.
|
|
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
|
-
#
|
|
35
|
-
social-hub skills
|
|
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
|
|
40
|
-
|
|
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
|
-
#
|
|
43
|
-
social-hub skills
|
|
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
|
-
|
|
50
|
-
|
|
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
|
|
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` |
|
package/skills/manifest.json
CHANGED
|
@@ -39,12 +39,14 @@ social-hub version
|
|
|
39
39
|
|
|
40
40
|
安装 Agent Skills:
|
|
41
41
|
|
|
42
|
-
-
|
|
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
|
-
-
|
|
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/
|
|
5
|
-
用户要查帖表现、刷新 score
|
|
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`)。
|