@geoly-ai/social-hub-cli 0.0.2 → 0.0.4

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 (93) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/register-skills.d.ts +3 -0
  5. package/dist/register-skills.d.ts.map +1 -0
  6. package/dist/register-skills.js +321 -0
  7. package/dist/register-skills.js.map +1 -0
  8. package/dist/skills/agent-targets.d.ts +7 -0
  9. package/dist/skills/agent-targets.d.ts.map +1 -0
  10. package/dist/skills/agent-targets.js +367 -0
  11. package/dist/skills/agent-targets.js.map +1 -0
  12. package/dist/skills/agent-targets.test.d.ts +2 -0
  13. package/dist/skills/agent-targets.test.d.ts.map +1 -0
  14. package/dist/skills/agent-targets.test.js +19 -0
  15. package/dist/skills/agent-targets.test.js.map +1 -0
  16. package/dist/skills/doctor.d.ts +23 -0
  17. package/dist/skills/doctor.d.ts.map +1 -0
  18. package/dist/skills/doctor.js +112 -0
  19. package/dist/skills/doctor.js.map +1 -0
  20. package/dist/skills/github-source.d.ts +34 -0
  21. package/dist/skills/github-source.d.ts.map +1 -0
  22. package/dist/skills/github-source.js +198 -0
  23. package/dist/skills/github-source.js.map +1 -0
  24. package/dist/skills/github-source.test.d.ts +2 -0
  25. package/dist/skills/github-source.test.d.ts.map +1 -0
  26. package/dist/skills/github-source.test.js +46 -0
  27. package/dist/skills/github-source.test.js.map +1 -0
  28. package/dist/skills/install-planner.d.ts +18 -0
  29. package/dist/skills/install-planner.d.ts.map +1 -0
  30. package/dist/skills/install-planner.js +91 -0
  31. package/dist/skills/install-planner.js.map +1 -0
  32. package/dist/skills/install-planner.test.d.ts +2 -0
  33. package/dist/skills/install-planner.test.d.ts.map +1 -0
  34. package/dist/skills/install-planner.test.js +41 -0
  35. package/dist/skills/install-planner.test.js.map +1 -0
  36. package/dist/skills/installer.d.ts +10 -0
  37. package/dist/skills/installer.d.ts.map +1 -0
  38. package/dist/skills/installer.js +108 -0
  39. package/dist/skills/installer.js.map +1 -0
  40. package/dist/skills/manifest.d.ts +9 -0
  41. package/dist/skills/manifest.d.ts.map +1 -0
  42. package/dist/skills/manifest.js +105 -0
  43. package/dist/skills/manifest.js.map +1 -0
  44. package/dist/skills/marketplace-adapters/claude-plugin.d.ts +6 -0
  45. package/dist/skills/marketplace-adapters/claude-plugin.d.ts.map +1 -0
  46. package/dist/skills/marketplace-adapters/claude-plugin.js +39 -0
  47. package/dist/skills/marketplace-adapters/claude-plugin.js.map +1 -0
  48. package/dist/skills/marketplace-adapters/skills-sh.d.ts +14 -0
  49. package/dist/skills/marketplace-adapters/skills-sh.d.ts.map +1 -0
  50. package/dist/skills/marketplace-adapters/skills-sh.js +24 -0
  51. package/dist/skills/marketplace-adapters/skills-sh.js.map +1 -0
  52. package/dist/skills/paths.d.ts +3 -0
  53. package/dist/skills/paths.d.ts.map +1 -0
  54. package/dist/skills/paths.js +13 -0
  55. package/dist/skills/paths.js.map +1 -0
  56. package/dist/skills/source-resolver.d.ts +16 -0
  57. package/dist/skills/source-resolver.d.ts.map +1 -0
  58. package/dist/skills/source-resolver.js +79 -0
  59. package/dist/skills/source-resolver.js.map +1 -0
  60. package/dist/skills/state-store.d.ts +9 -0
  61. package/dist/skills/state-store.d.ts.map +1 -0
  62. package/dist/skills/state-store.js +39 -0
  63. package/dist/skills/state-store.js.map +1 -0
  64. package/dist/skills/target-detector.d.ts +13 -0
  65. package/dist/skills/target-detector.d.ts.map +1 -0
  66. package/dist/skills/target-detector.js +132 -0
  67. package/dist/skills/target-detector.js.map +1 -0
  68. package/dist/skills/tui.d.ts +10 -0
  69. package/dist/skills/tui.d.ts.map +1 -0
  70. package/dist/skills/tui.js +140 -0
  71. package/dist/skills/tui.js.map +1 -0
  72. package/dist/skills/types.d.ts +94 -0
  73. package/dist/skills/types.d.ts.map +1 -0
  74. package/dist/skills/types.js +2 -0
  75. package/dist/skills/types.js.map +1 -0
  76. package/dist/update-check.d.ts.map +1 -1
  77. package/dist/update-check.js +6 -1
  78. package/dist/update-check.js.map +1 -1
  79. package/package.json +7 -5
  80. package/skills/README.md +113 -0
  81. package/skills/manifest.json +68 -0
  82. package/skills/social-hub-accounts/SKILL.md +25 -0
  83. package/skills/social-hub-admin/SKILL.md +36 -0
  84. package/skills/social-hub-calendar-jobs/SKILL.md +25 -0
  85. package/skills/social-hub-cli/SKILL.md +363 -0
  86. package/skills/social-hub-cli/evals/evals.json +23 -0
  87. package/skills/social-hub-intelligence/SKILL.md +25 -0
  88. package/skills/social-hub-migration/SKILL.md +32 -0
  89. package/skills/social-hub-openclaw-context/SKILL.md +45 -0
  90. package/skills/social-hub-ops-runtime/SKILL.md +40 -0
  91. package/skills/social-hub-posts/SKILL.md +20 -0
  92. package/skills/social-hub-publishing/SKILL.md +31 -0
  93. package/skills/social-hub-shared/SKILL.md +41 -0
@@ -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
+ import type { SkillSource } from "../types.js";
2
+ export type SkillsShResolveOptions = {
3
+ repo: string;
4
+ skillId?: string;
5
+ ref?: string;
6
+ skillsSubpath?: string;
7
+ refresh?: boolean;
8
+ };
9
+ export declare function skillsShSourceRef(opts: SkillsShResolveOptions): string;
10
+ /**
11
+ * skill.sh imports GitHub repo skill directories; resolve via GitHub tarball + cache.
12
+ */
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,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAItE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAatB"}
@@ -0,0 +1,24 @@
1
+ import { resolveGithubSource } from "../github-source.js";
2
+ export function skillsShSourceRef(opts) {
3
+ const ref = opts.ref ?? "main";
4
+ const skill = opts.skillId ?? "*";
5
+ return `skillsh://${opts.repo}@${ref}/${skill}`;
6
+ }
7
+ /**
8
+ * skill.sh imports GitHub repo skill directories; resolve via GitHub tarball + cache.
9
+ */
10
+ export async function resolveSkillsShSource(opts) {
11
+ const githubOpts = {
12
+ repo: opts.repo,
13
+ ref: opts.ref,
14
+ skillsSubpath: opts.skillsSubpath,
15
+ refresh: opts.refresh,
16
+ };
17
+ const source = await resolveGithubSource(githubOpts);
18
+ return {
19
+ ...source,
20
+ kind: "skillsh",
21
+ ref: skillsShSourceRef(opts),
22
+ };
23
+ }
24
+ //# 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":"AACA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AAUpF,MAAM,UAAU,iBAAiB,CAAC,IAA4B;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC;IAClC,OAAO,aAAa,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA4B;IAE5B,MAAM,UAAU,GAAwB;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,OAAO;QACL,GAAG,MAAM;QACT,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC;KAC7B,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,16 @@
1
+ import { type GithubSourceOptions } from "./github-source.js";
2
+ import { type SkillsShResolveOptions } from "./marketplace-adapters/skills-sh.js";
3
+ import type { SkillSource, SkillSourceKind } from "./types.js";
4
+ export declare function getBundledSkillsRoot(): string;
5
+ export declare function resolveBundledSource(): SkillSource;
6
+ export declare function resolveLocalSource(localPath: string): SkillSource;
7
+ export type SourceResolverOptions = {
8
+ source?: SkillSourceKind;
9
+ localPath?: string;
10
+ github?: GithubSourceOptions;
11
+ skillsh?: SkillsShResolveOptions;
12
+ refresh?: boolean;
13
+ };
14
+ export declare function resolveSource(opts?: SourceResolverOptions): Promise<SkillSource>;
15
+ export declare function sourceDigestForManifest(skillsRoot: string): string;
16
+ //# 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":"AACA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AACzG,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAW/D,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,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAsB,aAAa,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,CAsB1F;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlE"}
@@ -0,0 +1,79 @@
1
+ import { hashDirectory, loadManifestFromDir } from "./manifest.js";
2
+ import { resolveGithubSource } from "./github-source.js";
3
+ import { resolveSkillsShSource } from "./marketplace-adapters/skills-sh.js";
4
+ import { createHash } from "node:crypto";
5
+ import { existsSync, readFileSync } from "node:fs";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { getCliVersion } from "../version-info.js";
9
+ function moduleDir() {
10
+ return dirname(fileURLToPath(import.meta.url));
11
+ }
12
+ export function getBundledSkillsRoot() {
13
+ const cliPkgRoot = join(moduleDir(), "..", "..");
14
+ const bundled = join(cliPkgRoot, "skills");
15
+ if (existsSync(join(bundled, "manifest.json"))) {
16
+ return bundled;
17
+ }
18
+ const monorepo = join(cliPkgRoot, "..", "..", "skills");
19
+ if (existsSync(join(monorepo, "manifest.json"))) {
20
+ return monorepo;
21
+ }
22
+ throw new Error("Skills bundle not found. Reinstall @geoly-ai/social-hub-cli or run from the social-ops-hub repo.");
23
+ }
24
+ export function resolveBundledSource() {
25
+ const skillsRoot = getBundledSkillsRoot();
26
+ const manifest = loadManifestFromDir(skillsRoot);
27
+ const version = getCliVersion();
28
+ return {
29
+ kind: "bundled",
30
+ ref: "@geoly-ai/social-hub-cli",
31
+ version,
32
+ skillsRoot,
33
+ manifest,
34
+ digest: hashDirectory(skillsRoot),
35
+ };
36
+ }
37
+ export function resolveLocalSource(localPath) {
38
+ const skillsRoot = localPath;
39
+ if (!existsSync(join(skillsRoot, "manifest.json"))) {
40
+ throw new Error(`No manifest.json in ${skillsRoot}`);
41
+ }
42
+ const manifest = loadManifestFromDir(skillsRoot);
43
+ return {
44
+ kind: "local",
45
+ ref: localPath,
46
+ version: manifest.cliVersion,
47
+ skillsRoot,
48
+ manifest,
49
+ digest: hashDirectory(skillsRoot),
50
+ };
51
+ }
52
+ export async function resolveSource(opts = {}) {
53
+ const source = opts.source ?? "bundled";
54
+ if (source === "local") {
55
+ if (!opts.localPath) {
56
+ throw new Error("--source local requires --local-path or --dir");
57
+ }
58
+ return resolveLocalSource(opts.localPath);
59
+ }
60
+ if (source === "github") {
61
+ return resolveGithubSource({ ...opts.github, refresh: opts.refresh ?? opts.github?.refresh });
62
+ }
63
+ if (source === "skillsh") {
64
+ if (!opts.skillsh?.repo) {
65
+ throw new Error("--source skillsh requires --repo owner/name");
66
+ }
67
+ return resolveSkillsShSource({ ...opts.skillsh, refresh: opts.refresh });
68
+ }
69
+ return resolveBundledSource();
70
+ }
71
+ export function sourceDigestForManifest(skillsRoot) {
72
+ const hash = createHash("sha256");
73
+ hash.update(readManifestRaw(skillsRoot));
74
+ return `sha256:${hash.digest("hex")}`;
75
+ }
76
+ function readManifestRaw(skillsRoot) {
77
+ return readFileSync(join(skillsRoot, "manifest.json"), "utf8");
78
+ }
79
+ //# sourceMappingURL=source-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-resolver.js","sourceRoot":"","sources":["../../src/skills/source-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAA+B,MAAM,qCAAqC,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,OAAO;QACL,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,0BAA0B;QAC/B,OAAO;QACP,UAAU;QACV,QAAQ;QACR,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,UAAU,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,QAAQ,CAAC,UAAU;QAC5B,UAAU;QACV,QAAQ;QACR,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA8B,EAAE;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IAExC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,qBAAqB,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,OAAO,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/skills/state-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAExD,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ/D;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAGtE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAQvF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/D;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,39 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export const STATE_FILENAME = ".social-hub-skills.json";
4
+ export function statePath(targetDir) {
5
+ return join(targetDir, STATE_FILENAME);
6
+ }
7
+ export function readState(targetDir) {
8
+ const path = statePath(targetDir);
9
+ if (!existsSync(path))
10
+ return null;
11
+ try {
12
+ return JSON.parse(readFileSync(path, "utf8"));
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ export function writeState(targetDir, state) {
19
+ const path = statePath(targetDir);
20
+ writeFileSync(path, `${JSON.stringify(state, null, 2)}\n`, "utf8");
21
+ }
22
+ export function mergeStateRecord(state, record) {
23
+ const idx = state.skills.findIndex((s) => s.id === record.id);
24
+ if (idx >= 0) {
25
+ state.skills[idx] = record;
26
+ }
27
+ else {
28
+ state.skills.push(record);
29
+ }
30
+ state.updatedAt = new Date().toISOString();
31
+ }
32
+ export function listManagedSkillIds(targetDir) {
33
+ const state = readState(targetDir);
34
+ return state?.skills.map((s) => s.id) ?? [];
35
+ }
36
+ export function isManagedSkill(targetDir, skillId) {
37
+ return listManagedSkillIds(targetDir).includes(skillId);
38
+ }
39
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/skills/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAExD,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAkB;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAClC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,MAA4B;IAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAe;IAC/D,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { InstallMode, InstallScope, InstallTarget } from "./types.js";
2
+ export type TargetDetectorOptions = {
3
+ cwd?: string;
4
+ agent?: string;
5
+ dir?: string;
6
+ scope?: InstallScope;
7
+ installMode?: InstallMode;
8
+ envInstallDir?: string;
9
+ };
10
+ export declare function detectInstallTargets(opts: TargetDetectorOptions): InstallTarget[];
11
+ export declare function autoDetectTargets(cwd: string, installMode?: InstallMode): InstallTarget[];
12
+ export declare function resolveAgentDefaultTarget(agentId: string, scope: InstallScope, cwd?: string): InstallTarget;
13
+ //# sourceMappingURL=target-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-detector.d.ts","sourceRoot":"","sources":["../../src/skills/target-detector.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3E,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,EAAE,CAkEjF;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAA0B,GACtC,aAAa,EAAE,CA0CjB;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,YAAY,EACnB,GAAG,SAAgB,GAClB,aAAa,CAef"}
@@ -0,0 +1,132 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { matchAgents, resolveAgent } from "./agent-targets.js";
4
+ import { expandHome } from "./paths.js";
5
+ import { claudeTargetForMode } from "./marketplace-adapters/claude-plugin.js";
6
+ export function detectInstallTargets(opts) {
7
+ if (opts.dir) {
8
+ return [
9
+ {
10
+ agentId: "custom",
11
+ label: "Custom directory",
12
+ dir: expandHome(opts.dir),
13
+ scope: opts.scope ?? "project",
14
+ installMode: opts.installMode ?? "standalone",
15
+ },
16
+ ];
17
+ }
18
+ if (opts.envInstallDir) {
19
+ return [
20
+ {
21
+ agentId: "env",
22
+ label: "SKILLS_INSTALL_DIR",
23
+ dir: expandHome(opts.envInstallDir),
24
+ scope: opts.scope ?? "global",
25
+ installMode: opts.installMode ?? "standalone",
26
+ },
27
+ ];
28
+ }
29
+ const cwd = opts.cwd ?? process.cwd();
30
+ const scope = opts.scope ?? "project";
31
+ const agents = matchAgents(opts.agent);
32
+ if (agents.length === 0 && opts.agent && opts.agent !== "*") {
33
+ throw new Error(`Unknown agent: ${opts.agent}. Run social-hub skills list --agents`);
34
+ }
35
+ const targets = [];
36
+ for (const agent of agents) {
37
+ const installMode = opts.installMode ?? "standalone";
38
+ if (agent.id === "claude-code" && installMode === "plugin") {
39
+ targets.push({
40
+ agentId: agent.id,
41
+ label: agent.label,
42
+ dir: claudeTargetForMode("plugin", scope, cwd),
43
+ scope,
44
+ installMode: "plugin",
45
+ });
46
+ continue;
47
+ }
48
+ const paths = scope === "global" ? agent.globalPaths : agent.projectPaths;
49
+ for (const rel of paths) {
50
+ const dir = scope === "global" ? expandHome(rel) : join(cwd, rel.replace(/^\.\//, ""));
51
+ targets.push({
52
+ agentId: agent.id,
53
+ label: agent.label,
54
+ dir,
55
+ scope,
56
+ installMode: opts.installMode ?? "standalone",
57
+ });
58
+ }
59
+ }
60
+ if (targets.length === 0) {
61
+ return autoDetectTargets(cwd, opts.installMode ?? "standalone");
62
+ }
63
+ return dedupeTargets(targets);
64
+ }
65
+ export function autoDetectTargets(cwd, installMode = "standalone") {
66
+ const found = [];
67
+ const agents = matchAgents("*");
68
+ for (const agent of agents) {
69
+ for (const rel of agent.projectPaths) {
70
+ const dir = join(cwd, rel.replace(/^\.\//, ""));
71
+ if (existsSync(dir)) {
72
+ found.push({
73
+ agentId: agent.id,
74
+ label: agent.label,
75
+ dir,
76
+ scope: "project",
77
+ installMode,
78
+ });
79
+ }
80
+ }
81
+ for (const rel of agent.globalPaths) {
82
+ const dir = expandHome(rel);
83
+ if (existsSync(dir)) {
84
+ found.push({
85
+ agentId: agent.id,
86
+ label: agent.label,
87
+ dir,
88
+ scope: "global",
89
+ installMode,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ if (found.length === 0) {
95
+ const fallback = expandHome("~/.agents/skills");
96
+ found.push({
97
+ agentId: "universal",
98
+ label: "Universal (fallback)",
99
+ dir: fallback,
100
+ scope: "global",
101
+ installMode,
102
+ });
103
+ }
104
+ return dedupeTargets(found);
105
+ }
106
+ export function resolveAgentDefaultTarget(agentId, scope, cwd = process.cwd()) {
107
+ const agent = resolveAgent(agentId);
108
+ if (!agent) {
109
+ throw new Error(`Unknown agent: ${agentId}`);
110
+ }
111
+ const rel = scope === "global" ? agent.globalPaths[0] : agent.projectPaths[0];
112
+ const dir = scope === "global" ? expandHome(rel) : join(cwd, rel.replace(/^\.\//, ""));
113
+ return {
114
+ agentId: agent.id,
115
+ label: agent.label,
116
+ dir,
117
+ scope,
118
+ installMode: "standalone",
119
+ };
120
+ }
121
+ function dedupeTargets(targets) {
122
+ const seen = new Set();
123
+ const out = [];
124
+ for (const t of targets) {
125
+ if (seen.has(t.dir))
126
+ continue;
127
+ seen.add(t.dir);
128
+ out.push(t);
129
+ }
130
+ return out;
131
+ }
132
+ //# sourceMappingURL=target-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-detector.js","sourceRoot":"","sources":["../../src/skills/target-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { InstallMethod, InstallScope } from "./types.js";
2
+ export type TuiOptions = {
3
+ cwd?: string;
4
+ defaultScope?: InstallScope;
5
+ defaultMethod?: InstallMethod;
6
+ };
7
+ export declare function printNonInteractiveHint(): void;
8
+ export declare function runSkillsTui(opts?: TuiOptions): Promise<void>;
9
+ export declare function runSkillsBootstrap(opts?: TuiOptions): Promise<void>;
10
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +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"}