@geoly-ai/social-hub-cli 0.0.1 → 0.0.3

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 (97) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +9 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/register-shared.d.ts.map +1 -1
  5. package/dist/register-shared.js +2 -6
  6. package/dist/register-shared.js.map +1 -1
  7. package/dist/register-skills.d.ts +3 -0
  8. package/dist/register-skills.d.ts.map +1 -0
  9. package/dist/register-skills.js +273 -0
  10. package/dist/register-skills.js.map +1 -0
  11. package/dist/skills/agent-targets.d.ts +7 -0
  12. package/dist/skills/agent-targets.d.ts.map +1 -0
  13. package/dist/skills/agent-targets.js +367 -0
  14. package/dist/skills/agent-targets.js.map +1 -0
  15. package/dist/skills/agent-targets.test.d.ts +2 -0
  16. package/dist/skills/agent-targets.test.d.ts.map +1 -0
  17. package/dist/skills/agent-targets.test.js +19 -0
  18. package/dist/skills/agent-targets.test.js.map +1 -0
  19. package/dist/skills/doctor.d.ts +23 -0
  20. package/dist/skills/doctor.d.ts.map +1 -0
  21. package/dist/skills/doctor.js +102 -0
  22. package/dist/skills/doctor.js.map +1 -0
  23. package/dist/skills/install-planner.d.ts +18 -0
  24. package/dist/skills/install-planner.d.ts.map +1 -0
  25. package/dist/skills/install-planner.js +91 -0
  26. package/dist/skills/install-planner.js.map +1 -0
  27. package/dist/skills/install-planner.test.d.ts +2 -0
  28. package/dist/skills/install-planner.test.d.ts.map +1 -0
  29. package/dist/skills/install-planner.test.js +41 -0
  30. package/dist/skills/install-planner.test.js.map +1 -0
  31. package/dist/skills/installer.d.ts +10 -0
  32. package/dist/skills/installer.d.ts.map +1 -0
  33. package/dist/skills/installer.js +108 -0
  34. package/dist/skills/installer.js.map +1 -0
  35. package/dist/skills/manifest.d.ts +9 -0
  36. package/dist/skills/manifest.d.ts.map +1 -0
  37. package/dist/skills/manifest.js +105 -0
  38. package/dist/skills/manifest.js.map +1 -0
  39. package/dist/skills/marketplace-adapters/claude-plugin.d.ts +6 -0
  40. package/dist/skills/marketplace-adapters/claude-plugin.d.ts.map +1 -0
  41. package/dist/skills/marketplace-adapters/claude-plugin.js +39 -0
  42. package/dist/skills/marketplace-adapters/claude-plugin.js.map +1 -0
  43. package/dist/skills/marketplace-adapters/skills-sh.d.ts +14 -0
  44. package/dist/skills/marketplace-adapters/skills-sh.d.ts.map +1 -0
  45. package/dist/skills/marketplace-adapters/skills-sh.js +9 -0
  46. package/dist/skills/marketplace-adapters/skills-sh.js.map +1 -0
  47. package/dist/skills/paths.d.ts +3 -0
  48. package/dist/skills/paths.d.ts.map +1 -0
  49. package/dist/skills/paths.js +13 -0
  50. package/dist/skills/paths.js.map +1 -0
  51. package/dist/skills/source-resolver.d.ts +11 -0
  52. package/dist/skills/source-resolver.d.ts.map +1 -0
  53. package/dist/skills/source-resolver.js +64 -0
  54. package/dist/skills/source-resolver.js.map +1 -0
  55. package/dist/skills/state-store.d.ts +9 -0
  56. package/dist/skills/state-store.d.ts.map +1 -0
  57. package/dist/skills/state-store.js +39 -0
  58. package/dist/skills/state-store.js.map +1 -0
  59. package/dist/skills/target-detector.d.ts +13 -0
  60. package/dist/skills/target-detector.d.ts.map +1 -0
  61. package/dist/skills/target-detector.js +132 -0
  62. package/dist/skills/target-detector.js.map +1 -0
  63. package/dist/skills/tui.d.ts +10 -0
  64. package/dist/skills/tui.d.ts.map +1 -0
  65. package/dist/skills/tui.js +140 -0
  66. package/dist/skills/tui.js.map +1 -0
  67. package/dist/skills/types.d.ts +86 -0
  68. package/dist/skills/types.d.ts.map +1 -0
  69. package/dist/skills/types.js +2 -0
  70. package/dist/skills/types.js.map +1 -0
  71. package/dist/update-check.d.ts +3 -0
  72. package/dist/update-check.d.ts.map +1 -0
  73. package/dist/update-check.js +117 -0
  74. package/dist/update-check.js.map +1 -0
  75. package/dist/update-check.test.d.ts +2 -0
  76. package/dist/update-check.test.d.ts.map +1 -0
  77. package/dist/update-check.test.js +17 -0
  78. package/dist/update-check.test.js.map +1 -0
  79. package/dist/version-info.d.ts +9 -0
  80. package/dist/version-info.d.ts.map +1 -0
  81. package/dist/version-info.js +28 -0
  82. package/dist/version-info.js.map +1 -0
  83. package/package.json +7 -5
  84. package/skills/README.md +89 -0
  85. package/skills/manifest.json +68 -0
  86. package/skills/social-hub-accounts/SKILL.md +25 -0
  87. package/skills/social-hub-admin/SKILL.md +36 -0
  88. package/skills/social-hub-calendar-jobs/SKILL.md +25 -0
  89. package/skills/social-hub-cli/SKILL.md +362 -0
  90. package/skills/social-hub-cli/evals/evals.json +23 -0
  91. package/skills/social-hub-intelligence/SKILL.md +25 -0
  92. package/skills/social-hub-migration/SKILL.md +32 -0
  93. package/skills/social-hub-openclaw-context/SKILL.md +45 -0
  94. package/skills/social-hub-ops-runtime/SKILL.md +40 -0
  95. package/skills/social-hub-posts/SKILL.md +20 -0
  96. package/skills/social-hub-publishing/SKILL.md +31 -0
  97. package/skills/social-hub-shared/SKILL.md +41 -0
@@ -0,0 +1,91 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { hashSkillDir, resolveSkills } from "./manifest.js";
4
+ import { readState } from "./state-store.js";
5
+ export function buildInstallPlan(opts) {
6
+ const skills = resolveSkills(opts.source.skillsRoot, opts.source.manifest, opts.skillIds);
7
+ const method = opts.method ?? "copy";
8
+ const items = [];
9
+ const skipped = [];
10
+ for (const target of opts.targets) {
11
+ const state = readState(target.dir);
12
+ for (const skill of skills) {
13
+ const toDir = join(target.dir, skill.id);
14
+ const fromDir = skill.skillDir;
15
+ const exists = existsSync(toDir);
16
+ const managed = state?.skills.some((s) => s.id === skill.id) ?? false;
17
+ const checksum = hashSkillDir(fromDir);
18
+ const installed = state?.skills.find((s) => s.id === skill.id);
19
+ const needsUpdate = !installed || installed.checksum !== checksum || installed.skillVersion !== (skill.skillVersion ?? opts.source.version);
20
+ let action = opts.action;
21
+ if (action === "install" && exists && managed && needsUpdate) {
22
+ action = "update";
23
+ }
24
+ if (action === "update" && (!exists || !managed)) {
25
+ skipped.push({
26
+ skillId: skill.id,
27
+ targetDir: toDir,
28
+ reason: !exists ? "not installed" : "not managed by social-hub",
29
+ });
30
+ continue;
31
+ }
32
+ if (action === "install" && exists && !managed && !opts.force) {
33
+ skipped.push({
34
+ skillId: skill.id,
35
+ targetDir: toDir,
36
+ reason: "exists from unknown source (use --force)",
37
+ });
38
+ continue;
39
+ }
40
+ if (action === "install" && exists && managed && !needsUpdate) {
41
+ skipped.push({
42
+ skillId: skill.id,
43
+ targetDir: toDir,
44
+ reason: "already up to date",
45
+ });
46
+ continue;
47
+ }
48
+ if (action === "update" && exists && managed && !needsUpdate) {
49
+ skipped.push({
50
+ skillId: skill.id,
51
+ targetDir: toDir,
52
+ reason: "already up to date",
53
+ });
54
+ continue;
55
+ }
56
+ if (action === "remove") {
57
+ if (!exists) {
58
+ skipped.push({ skillId: skill.id, targetDir: toDir, reason: "not installed" });
59
+ continue;
60
+ }
61
+ if (!managed && !opts.force) {
62
+ skipped.push({
63
+ skillId: skill.id,
64
+ targetDir: toDir,
65
+ reason: "not managed by social-hub (use --force)",
66
+ });
67
+ continue;
68
+ }
69
+ }
70
+ items.push({
71
+ action,
72
+ skillId: skill.id,
73
+ target,
74
+ fromDir,
75
+ toDir,
76
+ method,
77
+ overwrite: opts.force ?? false,
78
+ });
79
+ }
80
+ }
81
+ return { source: opts.source, items, skipped };
82
+ }
83
+ export function summarizePlan(plan) {
84
+ return {
85
+ install: plan.items.filter((i) => i.action === "install" || i.action === "reinstall").length,
86
+ update: plan.items.filter((i) => i.action === "update").length,
87
+ remove: plan.items.filter((i) => i.action === "remove").length,
88
+ skipped: plan.skipped.length,
89
+ };
90
+ }
91
+ //# sourceMappingURL=install-planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-planner.js","sourceRoot":"","sources":["../../src/skills/install-planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=install-planner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-planner.test.d.ts","sourceRoot":"","sources":["../../src/skills/install-planner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { describe, expect, it } from "vitest";
5
+ import { buildInstallPlan } from "./install-planner.js";
6
+ import { resolveLocalSource } from "./source-resolver.js";
7
+ describe("install-planner", () => {
8
+ it("plans install into custom directory", () => {
9
+ const root = join(tmpdir(), `social-hub-skills-test-${Date.now()}`);
10
+ mkdirSync(join(root, "demo-skill"), { recursive: true });
11
+ writeFileSync(join(root, "manifest.json"), JSON.stringify({
12
+ version: 1,
13
+ package: "test",
14
+ cliVersion: "0.0.3",
15
+ repository: "test",
16
+ skills: [{ id: "demo-skill", path: "demo-skill", description: "demo" }],
17
+ }));
18
+ writeFileSync(join(root, "demo-skill", "SKILL.md"), "---\nname: demo-skill\ndescription: demo\n---\n# Demo\n");
19
+ const source = resolveLocalSource(root);
20
+ const targetDir = join(root, "out");
21
+ const plan = buildInstallPlan({
22
+ action: "install",
23
+ source,
24
+ targets: [
25
+ {
26
+ agentId: "custom",
27
+ label: "Custom",
28
+ dir: targetDir,
29
+ scope: "project",
30
+ installMode: "standalone",
31
+ },
32
+ ],
33
+ skillIds: ["demo-skill"],
34
+ method: "copy",
35
+ });
36
+ expect(plan.items).toHaveLength(1);
37
+ expect(plan.items[0]?.action).toBe("install");
38
+ expect(plan.items[0]?.toDir).toBe(join(targetDir, "demo-skill"));
39
+ });
40
+ });
41
+ //# sourceMappingURL=install-planner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-planner.test.js","sourceRoot":"","sources":["../../src/skills/install-planner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAC3B,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SACxE,CAAC,CACH,CAAC;QACF,aAAa,CACX,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,EACpC,yDAAyD,CAC1D,CAAC;QAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,gBAAgB,CAAC;YAC5B,MAAM,EAAE,SAAS;YACjB,MAAM;YACN,OAAO,EAAE;gBACP;oBACE,OAAO,EAAE,QAAQ;oBACjB,KAAK,EAAE,QAAQ;oBACf,GAAG,EAAE,SAAS;oBACd,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,YAAY;iBAC1B;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,CAAC;YACxB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { InstallPlan, PlanItem } from "./types.js";
2
+ export type ExecuteResult = {
3
+ applied: PlanItem[];
4
+ errors: {
5
+ item: PlanItem;
6
+ error: string;
7
+ }[];
8
+ };
9
+ export declare function executePlan(plan: InstallPlan): ExecuteResult;
10
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAuB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAkB5D"}
@@ -0,0 +1,108 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { hashSkillDir } from "./manifest.js";
4
+ import { applyClaudePluginLayout } from "./marketplace-adapters/claude-plugin.js";
5
+ import { mergeStateRecord, readState, writeState } from "./state-store.js";
6
+ export function executePlan(plan) {
7
+ const applied = [];
8
+ const errors = [];
9
+ for (const item of plan.items) {
10
+ try {
11
+ if (item.action === "remove") {
12
+ removeSkill(item);
13
+ }
14
+ else {
15
+ installSkill(item, plan);
16
+ }
17
+ applied.push(item);
18
+ }
19
+ catch (e) {
20
+ errors.push({ item, error: e instanceof Error ? e.message : String(e) });
21
+ }
22
+ }
23
+ return { applied, errors };
24
+ }
25
+ function installSkill(item, plan) {
26
+ mkdirSync(dirname(item.toDir), { recursive: true });
27
+ if (existsSync(item.toDir)) {
28
+ rmSync(item.toDir, { recursive: true, force: true });
29
+ }
30
+ if (item.method === "symlink") {
31
+ symlinkSync(item.fromDir, item.toDir, "dir");
32
+ }
33
+ else {
34
+ copyDir(item.fromDir, item.toDir);
35
+ }
36
+ if (item.target.installMode === "plugin" && item.target.agentId === "claude-code") {
37
+ applyClaudePluginLayout(item.target.dir, plan.source.version);
38
+ }
39
+ const checksum = hashSkillDir(item.fromDir);
40
+ const state = readState(item.target.dir) ?? {
41
+ source: plan.source.kind,
42
+ package: "@geoly-ai/social-hub-cli",
43
+ version: plan.source.version,
44
+ sourceDigest: plan.source.digest,
45
+ installedAt: new Date().toISOString(),
46
+ updatedAt: new Date().toISOString(),
47
+ skills: [],
48
+ };
49
+ mergeStateRecord(state, {
50
+ id: item.skillId,
51
+ skillVersion: plan.source.version,
52
+ checksum,
53
+ targetAgent: item.target.agentId,
54
+ targetDir: item.toDir,
55
+ installMode: item.target.installMode,
56
+ installedFiles: listRelativeFiles(item.toDir),
57
+ updatedAt: new Date().toISOString(),
58
+ });
59
+ writeState(item.target.dir, state);
60
+ }
61
+ function removeSkill(item) {
62
+ if (existsSync(item.toDir)) {
63
+ rmSync(item.toDir, { recursive: true, force: true });
64
+ }
65
+ const state = readState(item.target.dir);
66
+ if (state) {
67
+ state.skills = state.skills.filter((s) => s.id !== item.skillId);
68
+ state.updatedAt = new Date().toISOString();
69
+ if (state.skills.length === 0) {
70
+ rmSync(stateFilePath(item.target.dir), { force: true });
71
+ }
72
+ else {
73
+ writeState(item.target.dir, state);
74
+ }
75
+ }
76
+ }
77
+ function stateFilePath(targetDir) {
78
+ return join(targetDir, ".social-hub-skills.json");
79
+ }
80
+ function copyDir(src, dest) {
81
+ mkdirSync(dest, { recursive: true });
82
+ for (const name of readdirSync(src)) {
83
+ const from = join(src, name);
84
+ const to = join(dest, name);
85
+ const st = statSync(from);
86
+ if (st.isDirectory()) {
87
+ copyDir(from, to);
88
+ }
89
+ else {
90
+ writeFileSync(to, readFileSync(from));
91
+ }
92
+ }
93
+ }
94
+ function listRelativeFiles(dir, base = dir) {
95
+ const out = [];
96
+ for (const name of readdirSync(dir)) {
97
+ const full = join(dir, name);
98
+ const st = statSync(full);
99
+ if (st.isDirectory()) {
100
+ out.push(...listRelativeFiles(full, base));
101
+ }
102
+ else {
103
+ out.push(full.slice(base.length + 1));
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/skills/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ3E,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,WAAW,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,IAAU;IAC9C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QAClF,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;QAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACxB,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAChC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,gBAAgB,CAAC,KAAK,EAAE;QACtB,EAAE,EAAE,IAAI,CAAC,OAAO;QAChB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QACjC,QAAQ;QACR,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAChC,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;QACpC,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IACjC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,IAAI,GAAG,GAAG;IAChD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedSkill, SkillsManifest } from "./types.js";
2
+ export declare function parseFrontmatter(content: string): Record<string, string>;
3
+ export declare function loadManifestFromDir(skillsRoot: string): SkillsManifest;
4
+ export declare function validateManifest(manifest: SkillsManifest, skillsRoot: string): void;
5
+ export declare function resolveSkills(skillsRoot: string, manifest: SkillsManifest, filterIds?: string[]): ResolvedSkill[];
6
+ export declare function hashDirectory(dir: string): string;
7
+ export declare function hashFile(path: string): string;
8
+ export declare function hashSkillDir(skillDir: string): string;
9
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/skills/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AAIpF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAKtE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAoBnF;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,aAAa,EAAE,CAMjB;AAkBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7C;AAgBD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,105 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, readdirSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
5
+ export function parseFrontmatter(content) {
6
+ const match = FRONTMATTER_RE.exec(content);
7
+ if (!match)
8
+ return {};
9
+ const out = {};
10
+ for (const line of match[1].split("\n")) {
11
+ const idx = line.indexOf(":");
12
+ if (idx === -1)
13
+ continue;
14
+ const key = line.slice(0, idx).trim();
15
+ let value = line.slice(idx + 1).trim();
16
+ if ((value.startsWith('"') && value.endsWith('"')) ||
17
+ (value.startsWith("'") && value.endsWith("'"))) {
18
+ value = value.slice(1, -1);
19
+ }
20
+ out[key] = value;
21
+ }
22
+ return out;
23
+ }
24
+ export function loadManifestFromDir(skillsRoot) {
25
+ const raw = readFileSync(join(skillsRoot, "manifest.json"), "utf8");
26
+ const manifest = JSON.parse(raw);
27
+ validateManifest(manifest, skillsRoot);
28
+ return manifest;
29
+ }
30
+ export function validateManifest(manifest, skillsRoot) {
31
+ if (!manifest.skills?.length) {
32
+ throw new Error("manifest.json has no skills");
33
+ }
34
+ for (const skill of manifest.skills) {
35
+ const skillMd = join(skillsRoot, skill.path, "SKILL.md");
36
+ try {
37
+ statSync(skillMd);
38
+ }
39
+ catch {
40
+ throw new Error(`Missing SKILL.md for ${skill.id}: ${skillMd}`);
41
+ }
42
+ const content = readFileSync(skillMd, "utf8");
43
+ if (!content.trim()) {
44
+ throw new Error(`Empty SKILL.md for ${skill.id}`);
45
+ }
46
+ const fm = parseFrontmatter(content);
47
+ if (!fm.name && !fm.description) {
48
+ throw new Error(`SKILL.md for ${skill.id} missing frontmatter name/description`);
49
+ }
50
+ }
51
+ }
52
+ export function resolveSkills(skillsRoot, manifest, filterIds) {
53
+ const allowAll = !filterIds?.length || filterIds.includes("*");
54
+ const allow = new Set(filterIds ?? []);
55
+ return manifest.skills
56
+ .filter((s) => allowAll || allow.has(s.id))
57
+ .map((entry) => resolveOneSkill(skillsRoot, entry));
58
+ }
59
+ function resolveOneSkill(skillsRoot, entry) {
60
+ const skillDir = join(skillsRoot, entry.path);
61
+ const skillMdPath = join(skillDir, "SKILL.md");
62
+ const content = readFileSync(skillMdPath, "utf8");
63
+ const fm = parseFrontmatter(content);
64
+ return {
65
+ id: entry.id,
66
+ path: entry.path,
67
+ description: entry.description,
68
+ skillDir,
69
+ skillMdPath,
70
+ skillVersion: fm.skillVersion ?? fm.version,
71
+ cliVersion: fm.cliVersion ?? fm["metadata.cliVersion"],
72
+ };
73
+ }
74
+ export function hashDirectory(dir) {
75
+ const hash = createHash("sha256");
76
+ const files = walkFiles(dir).sort();
77
+ for (const file of files) {
78
+ hash.update(file);
79
+ hash.update(readFileSync(file));
80
+ }
81
+ return `sha256:${hash.digest("hex")}`;
82
+ }
83
+ export function hashFile(path) {
84
+ const hash = createHash("sha256");
85
+ hash.update(readFileSync(path));
86
+ return `sha256:${hash.digest("hex")}`;
87
+ }
88
+ function walkFiles(dir) {
89
+ const out = [];
90
+ for (const name of readdirSync(dir)) {
91
+ const full = join(dir, name);
92
+ const st = statSync(full);
93
+ if (st.isDirectory()) {
94
+ out.push(...walkFiles(full));
95
+ }
96
+ else {
97
+ out.push(full);
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ export function hashSkillDir(skillDir) {
103
+ return hashDirectory(skillDir);
104
+ }
105
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/skills/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Ensure Claude Code plugin marketplace layout under target skills directory parent. */
2
+ export declare function applyClaudePluginLayout(skillsDir: string, version: string): void;
3
+ export declare function resolveClaudePluginSkillsDir(projectRoot: string): string;
4
+ export type ClaudeInstallMode = "standalone" | "plugin";
5
+ export declare function claudeTargetForMode(mode: ClaudeInstallMode, scope: "global" | "project", cwd: string): string;
6
+ //# sourceMappingURL=claude-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-plugin.d.ts","sourceRoot":"","sources":["../../../src/skills/marketplace-adapters/claude-plugin.ts"],"names":[],"mappings":"AAUA,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAYhF;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExE;AASD,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,CAAC;AAExD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,GAAG,EAAE,MAAM,GACV,MAAM,CAUR"}
@@ -0,0 +1,39 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const PLUGIN_JSON = {
5
+ name: "social-hub-skills",
6
+ description: "Social Ops Hub agent skills installed by @geoly-ai/social-hub-cli",
7
+ version: "0.0.0",
8
+ };
9
+ /** Ensure Claude Code plugin marketplace layout under target skills directory parent. */
10
+ export function applyClaudePluginLayout(skillsDir, version) {
11
+ const pluginRoot = findPluginRoot(skillsDir);
12
+ const pluginDir = join(pluginRoot, ".claude-plugin");
13
+ mkdirSync(pluginDir, { recursive: true });
14
+ const manifestPath = join(pluginDir, "plugin.json");
15
+ if (!existsSync(manifestPath)) {
16
+ writeFileSync(manifestPath, `${JSON.stringify({ ...PLUGIN_JSON, version }, null, 2)}\n`, "utf8");
17
+ }
18
+ }
19
+ export function resolveClaudePluginSkillsDir(projectRoot) {
20
+ return join(projectRoot, "skills");
21
+ }
22
+ function findPluginRoot(skillsDir) {
23
+ if (skillsDir.endsWith("/skills") || skillsDir.endsWith("\\skills")) {
24
+ return skillsDir.slice(0, -"/skills".length);
25
+ }
26
+ return skillsDir;
27
+ }
28
+ export function claudeTargetForMode(mode, scope, cwd) {
29
+ if (mode === "plugin" && scope === "project") {
30
+ return join(cwd, "skills");
31
+ }
32
+ if (mode === "plugin" && scope === "global") {
33
+ return join(homedir(), ".claude", "plugins", "social-hub-skills", "skills");
34
+ }
35
+ return scope === "global"
36
+ ? join(homedir(), ".claude", "skills")
37
+ : join(cwd, ".claude", "skills");
38
+ }
39
+ //# sourceMappingURL=claude-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-plugin.js","sourceRoot":"","sources":["../../../src/skills/marketplace-adapters/claude-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mEAAmE;IAChF,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,yFAAyF;AACzF,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,OAAe;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACrD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,aAAa,CACX,YAAY,EACZ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC3D,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,WAAmB;IAC9D,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAID,MAAM,UAAU,mBAAmB,CACjC,IAAuB,EACvB,KAA2B,EAC3B,GAAW;IAEX,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Placeholder adapter for future skill.sh registry imports.
3
+ * Keeps source resolution extensible without duplicating install logic.
4
+ */
5
+ import type { SkillSource } from "../types.js";
6
+ export type SkillsShResolveOptions = {
7
+ repo: string;
8
+ skillId: string;
9
+ ref?: string;
10
+ };
11
+ export declare function skillsShSourceRef(opts: SkillsShResolveOptions): string;
12
+ /** Not yet implemented: remote fetch from skill.sh registry. */
13
+ export declare function resolveSkillsShSource(_opts: SkillsShResolveOptions): Promise<SkillSource>;
14
+ //# sourceMappingURL=skills-sh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-sh.d.ts","sourceRoot":"","sources":["../../../src/skills/marketplace-adapters/skills-sh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAGtE;AAED,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAMzF"}
@@ -0,0 +1,9 @@
1
+ export function skillsShSourceRef(opts) {
2
+ const ref = opts.ref ?? "main";
3
+ return `skillsh://${opts.repo}@${ref}/${opts.skillId}`;
4
+ }
5
+ /** Not yet implemented: remote fetch from skill.sh registry. */
6
+ export function resolveSkillsShSource(_opts) {
7
+ return Promise.reject(new Error("skill.sh remote source is not implemented yet. Use --source bundled (default) or --source local --dir <path>."));
8
+ }
9
+ //# sourceMappingURL=skills-sh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-sh.js","sourceRoot":"","sources":["../../../src/skills/marketplace-adapters/skills-sh.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,iBAAiB,CAAC,IAA4B;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC;IAC/B,OAAO,aAAa,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,qBAAqB,CAAC,KAA6B;IACjE,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CACP,+GAA+G,CAChH,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function expandHome(input: string): string;
2
+ export declare function isRunningViaNpx(): boolean;
3
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/skills/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
@@ -0,0 +1,13 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ export function expandHome(input) {
4
+ if (input.startsWith("~/")) {
5
+ return join(homedir(), input.slice(2));
6
+ }
7
+ return input;
8
+ }
9
+ export function isRunningViaNpx() {
10
+ const argv1 = process.argv[1] ?? "";
11
+ return argv1.includes("_npx") || argv1.includes(".npm/_npx");
12
+ }
13
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/skills/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SkillSource } from "./types.js";
2
+ export declare function getBundledSkillsRoot(): string;
3
+ export declare function resolveBundledSource(): SkillSource;
4
+ export declare function resolveLocalSource(localPath: string): SkillSource;
5
+ export type SourceResolverOptions = {
6
+ source?: "bundled" | "local";
7
+ localPath?: string;
8
+ };
9
+ export declare function resolveSource(opts?: SourceResolverOptions): SkillSource;
10
+ export declare function sourceDigestForManifest(skillsRoot: string): string;
11
+ //# sourceMappingURL=source-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-resolver.d.ts","sourceRoot":"","sources":["../../src/skills/source-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C;AAED,wBAAgB,oBAAoB,IAAI,WAAW,CAYlD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAcjE;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,GAAE,qBAA0B,GAAG,WAAW,CAK3E;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlE"}
@@ -0,0 +1,64 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { getCliVersion } from "../version-info.js";
6
+ import { hashDirectory, loadManifestFromDir } from "./manifest.js";
7
+ function moduleDir() {
8
+ return dirname(fileURLToPath(import.meta.url));
9
+ }
10
+ export function getBundledSkillsRoot() {
11
+ const cliPkgRoot = join(moduleDir(), "..", "..");
12
+ const bundled = join(cliPkgRoot, "skills");
13
+ if (existsSync(join(bundled, "manifest.json"))) {
14
+ return bundled;
15
+ }
16
+ const monorepo = join(cliPkgRoot, "..", "..", "skills");
17
+ if (existsSync(join(monorepo, "manifest.json"))) {
18
+ return monorepo;
19
+ }
20
+ throw new Error("Skills bundle not found. Reinstall @geoly-ai/social-hub-cli or run from the social-ops-hub repo.");
21
+ }
22
+ export function resolveBundledSource() {
23
+ const skillsRoot = getBundledSkillsRoot();
24
+ const manifest = loadManifestFromDir(skillsRoot);
25
+ const version = getCliVersion();
26
+ return {
27
+ kind: "bundled",
28
+ ref: "@geoly-ai/social-hub-cli",
29
+ version,
30
+ skillsRoot,
31
+ manifest,
32
+ digest: hashDirectory(skillsRoot),
33
+ };
34
+ }
35
+ export function resolveLocalSource(localPath) {
36
+ const skillsRoot = localPath;
37
+ if (!existsSync(join(skillsRoot, "manifest.json"))) {
38
+ throw new Error(`No manifest.json in ${skillsRoot}`);
39
+ }
40
+ const manifest = loadManifestFromDir(skillsRoot);
41
+ return {
42
+ kind: "local",
43
+ ref: localPath,
44
+ version: manifest.cliVersion,
45
+ skillsRoot,
46
+ manifest,
47
+ digest: hashDirectory(skillsRoot),
48
+ };
49
+ }
50
+ export function resolveSource(opts = {}) {
51
+ if (opts.source === "local" && opts.localPath) {
52
+ return resolveLocalSource(opts.localPath);
53
+ }
54
+ return resolveBundledSource();
55
+ }
56
+ export function sourceDigestForManifest(skillsRoot) {
57
+ const hash = createHash("sha256");
58
+ hash.update(readManifestRaw(skillsRoot));
59
+ return `sha256:${hash.digest("hex")}`;
60
+ }
61
+ function readManifestRaw(skillsRoot) {
62
+ return readFileSync(join(skillsRoot, "manifest.json"), "utf8");
63
+ }
64
+ //# sourceMappingURL=source-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-resolver.js","sourceRoot":"","sources":["../../src/skills/source-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { InstalledSkillRecord, SkillsState } from "./types.js";
2
+ export declare const STATE_FILENAME = ".social-hub-skills.json";
3
+ export declare function statePath(targetDir: string): string;
4
+ export declare function readState(targetDir: string): SkillsState | null;
5
+ export declare function writeState(targetDir: string, state: SkillsState): void;
6
+ export declare function mergeStateRecord(state: SkillsState, record: InstalledSkillRecord): void;
7
+ export declare function listManagedSkillIds(targetDir: string): string[];
8
+ export declare function isManagedSkill(targetDir: string, skillId: string): boolean;
9
+ //# sourceMappingURL=state-store.d.ts.map