skillfish 1.0.36 → 1.0.37

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.
@@ -265,7 +265,10 @@ Examples:
265
265
  totalSkipped += result.skipped.length;
266
266
  // Track successful installs (fire and forget — dispatched to detached worker)
267
267
  if (result.installed.length > 0) {
268
- trackInstall('add', owner, repo, skillName, result.installed.map((i) => i.agent));
268
+ // skillPath is 'SKILL.md' for root skills, or a directory like
269
+ // 'skills/foo' for sub-skills in a monorepo.
270
+ const skillRepoPath = skillPath === SKILL_FILENAME ? undefined : skillPath;
271
+ trackInstall('add', owner, repo, skillName, result.installed.map((i) => i.agent), skillRepoPath);
269
272
  }
270
273
  }
271
274
  // Summary
@@ -538,7 +538,7 @@ Examples:
538
538
  if (result.success) {
539
539
  successCount++;
540
540
  // Track successful installs (fire and forget — dispatched to detached worker)
541
- trackInstall('install', action.entry.owner, action.entry.repo, result.skillName, result.platform);
541
+ trackInstall('install', action.entry.owner, action.entry.repo, result.skillName, result.platform, action.entry.path);
542
542
  if (!jsonMode) {
543
543
  // Show which agents it was installed to if it's a partial install
544
544
  const agentCount = action.targetAgents.length;
@@ -25,5 +25,8 @@ export declare function trackCommand(command: string): void;
25
25
  * @param repo GitHub repository name
26
26
  * @param skillName Name of the skill being installed
27
27
  * @param platform Names of the agents the skill was installed to (e.g. ['Claude Code', 'Cursor'])
28
+ * @param path Path to the skill within the repo. Undefined for root-level
29
+ * skills (whole repo is one skill). For monorepos, this disambiguates
30
+ * sibling skills (e.g. 'skills/council' vs 'skills/marketing').
28
31
  */
29
- export declare function trackInstall(command: string, owner: string, repo: string, skillName: string, platform?: readonly string[]): void;
32
+ export declare function trackInstall(command: string, owner: string, repo: string, skillName: string, platform?: readonly string[], path?: string): void;
package/dist/telemetry.js CHANGED
@@ -72,20 +72,30 @@ export function trackCommand(command) {
72
72
  * @param repo GitHub repository name
73
73
  * @param skillName Name of the skill being installed
74
74
  * @param platform Names of the agents the skill was installed to (e.g. ['Claude Code', 'Cursor'])
75
+ * @param path Path to the skill within the repo. Undefined for root-level
76
+ * skills (whole repo is one skill). For monorepos, this disambiguates
77
+ * sibling skills (e.g. 'skills/council' vs 'skills/marketing').
75
78
  */
76
- export function trackInstall(command, owner, repo, skillName, platform = []) {
79
+ export function trackInstall(command, owner, repo, skillName, platform = [], path) {
77
80
  if (!command || !owner || !repo || !skillName)
78
81
  return;
82
+ // Canonical skill key: 'owner/repo' for root skills, 'owner/repo/path'
83
+ // for skills nested in a monorepo. Without the path component, every
84
+ // skill in a monorepo collapses to the same key.
85
+ const normalizedPath = path?.trim().replace(/^\/+|\/+$/g, '') || undefined;
86
+ const skillKey = normalizedPath ? `${owner}/${repo}/${normalizedPath}` : `${owner}/${repo}`;
87
+ // platform is a single text column on telemetry_events. We send a
88
+ // comma-separated, de-duplicated list so one install stays one row
89
+ // (preserving download-count semantics). Agent names contain no commas.
90
+ const platformText = Array.from(new Set(platform)).join(', ');
79
91
  dispatch({
80
92
  event_type: 'install',
81
93
  command,
82
- skill_key: `${owner}/${repo}`,
94
+ skill_key: skillKey,
83
95
  // Fields for skill count increment
84
96
  owner,
85
97
  repo,
86
- skillName,
87
- // De-duplicated agent names the skill landed on. Maps to the `platform`
88
- // column on the telemetry_events table. Empty array if unknown.
89
- platform: Array.from(new Set(platform)),
98
+ skill_name: skillName,
99
+ platform: platformText,
90
100
  });
91
101
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillfish",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "description": "All in one Skill manager for AI coding agents. Install, update, and sync Skills across Claude Code, Cursor, Copilot + more.",
5
5
  "type": "module",
6
6
  "bin": {