crewly 1.20.131 → 1.20.133

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 (186) hide show
  1. package/config/constants.ts +49 -0
  2. package/config/index.ts +2 -0
  3. package/config/skills/agent/core/find-skill/SKILL.md +58 -0
  4. package/config/skills/agent/core/find-skill/execute.sh +67 -0
  5. package/config/skills/agent/core/find-skill/execute.test.sh +69 -0
  6. package/config/skills/agent/core/generate-pdf/SKILL.md +24 -29
  7. package/config/skills/agent/core/generate-pdf/execute.sh +22 -78
  8. package/config/skills/agent/core/generate-pdf/execute.test.sh +45 -0
  9. package/config/skills/agent/core/install-skill/SKILL.md +67 -0
  10. package/config/skills/agent/core/install-skill/execute.sh +80 -0
  11. package/config/skills/agent/core/install-skill/execute.test.sh +74 -0
  12. package/config/skills/agent/pdf-tools/SKILL.md +103 -0
  13. package/config/skills/agent/pdf-tools/execute.sh +301 -0
  14. package/config/skills/agent/pdf-tools/execute.test.sh +218 -0
  15. package/config/skills/agent/pdf-tools/instructions.md +14 -0
  16. package/config/skills/agent/pdf-tools/pdf_tools.py +268 -0
  17. package/config/skills/agent/pdf-tools/skill.json +103 -0
  18. package/config/skills/agent/pdf-tools/style.css +143 -0
  19. package/config/skills/agent/transcribe-audio/SKILL.md +42 -5
  20. package/config/skills/agent/transcribe-audio/execute.sh +44 -11
  21. package/config/skills/agent/transcribe-audio/execute.test.sh +90 -0
  22. package/config/skills/agent/transcribe-audio/install-whisper-cpp.sh +126 -0
  23. package/config/skills/agent/transcribe-audio/install-whisper-cpp.test.sh +69 -0
  24. package/config/skills/agent/transcribe-audio/skill.json +67 -6
  25. package/config/skills/marketplace-registry.ts +8 -1
  26. package/config/skills/registry.json +337 -3
  27. package/dist/backend/backend/src/constants.d.ts +71 -0
  28. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  29. package/dist/backend/backend/src/constants.js +96 -0
  30. package/dist/backend/backend/src/constants.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +56 -0
  32. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -0
  33. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +114 -0
  34. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -0
  35. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +25 -0
  36. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  37. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +73 -55
  38. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  39. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +3 -0
  40. package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
  41. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +9 -0
  42. package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
  43. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts +49 -0
  44. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts.map +1 -0
  45. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js +185 -0
  46. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js.map +1 -0
  47. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts +21 -0
  48. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts.map +1 -0
  49. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js +29 -0
  50. package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js.map +1 -0
  51. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  52. package/dist/backend/backend/src/routes/api.routes.js +5 -0
  53. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  54. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
  55. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
  57. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  58. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
  59. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
  60. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
  61. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
  62. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +115 -0
  63. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +160 -0
  65. package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js.map +1 -0
  66. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
  68. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
  70. package/dist/backend/backend/src/services/marketplace/marketplace.service.js +11 -3
  71. package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
  73. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
  75. package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
  76. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
  77. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
  79. package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
  81. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
  83. package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
  84. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
  85. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
  87. package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
  88. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
  90. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  91. package/dist/backend/backend/src/types/marketplace.types.d.ts +16 -1
  92. package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
  93. package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
  94. package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
  95. package/dist/backend/backend/src/utils/inbound-file-hint.utils.js +78 -0
  96. package/dist/backend/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
  97. package/dist/backend/build-info.json +2 -2
  98. package/dist/backend/config/constants.d.ts +48 -0
  99. package/dist/backend/config/constants.d.ts.map +1 -1
  100. package/dist/backend/config/constants.js +48 -0
  101. package/dist/backend/config/constants.js.map +1 -1
  102. package/dist/backend/config/index.d.ts +2 -2
  103. package/dist/backend/config/index.d.ts.map +1 -1
  104. package/dist/backend/config/index.js +2 -2
  105. package/dist/backend/config/index.js.map +1 -1
  106. package/dist/cli/backend/src/constants.d.ts +71 -0
  107. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  108. package/dist/cli/backend/src/constants.js +96 -0
  109. package/dist/cli/backend/src/constants.js.map +1 -1
  110. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
  111. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
  113. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  114. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
  115. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
  116. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
  117. package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
  118. package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts +101 -0
  119. package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -0
  120. package/dist/cli/backend/src/services/marketplace/marketplace.service.js +392 -0
  121. package/dist/cli/backend/src/services/marketplace/marketplace.service.js.map +1 -0
  122. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
  123. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
  124. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
  125. package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
  126. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
  127. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
  128. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
  129. package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
  130. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
  131. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
  132. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
  133. package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
  134. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
  136. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  137. package/dist/cli/backend/src/types/marketplace.types.d.ts +219 -0
  138. package/dist/cli/backend/src/types/marketplace.types.d.ts.map +1 -0
  139. package/dist/cli/backend/src/types/marketplace.types.js +6 -0
  140. package/dist/cli/backend/src/types/marketplace.types.js.map +1 -0
  141. package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
  142. package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
  143. package/dist/cli/backend/src/utils/inbound-file-hint.utils.js +78 -0
  144. package/dist/cli/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
  145. package/dist/cli/backend/src/utils/package-root.d.ts +15 -0
  146. package/dist/cli/backend/src/utils/package-root.d.ts.map +1 -0
  147. package/dist/cli/backend/src/utils/package-root.js +38 -0
  148. package/dist/cli/backend/src/utils/package-root.js.map +1 -0
  149. package/dist/cli/cli/src/commands/cloud.d.ts +45 -25
  150. package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -1
  151. package/dist/cli/cli/src/commands/cloud.js +153 -47
  152. package/dist/cli/cli/src/commands/cloud.js.map +1 -1
  153. package/dist/cli/cli/src/commands/install.d.ts +13 -1
  154. package/dist/cli/cli/src/commands/install.d.ts.map +1 -1
  155. package/dist/cli/cli/src/commands/install.js +40 -3
  156. package/dist/cli/cli/src/commands/install.js.map +1 -1
  157. package/dist/cli/cli/src/commands/onboard-checklist.js +3 -3
  158. package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -1
  159. package/dist/cli/cli/src/commands/skills.d.ts +58 -0
  160. package/dist/cli/cli/src/commands/skills.d.ts.map +1 -0
  161. package/dist/cli/cli/src/commands/skills.js +132 -0
  162. package/dist/cli/cli/src/commands/skills.js.map +1 -0
  163. package/dist/cli/cli/src/index.js +18 -7
  164. package/dist/cli/cli/src/index.js.map +1 -1
  165. package/dist/cli/cli/src/utils/archive-creator.d.ts +14 -0
  166. package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
  167. package/dist/cli/cli/src/utils/archive-creator.js +24 -3
  168. package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
  169. package/dist/cli/cli/src/utils/cloud-submit.d.ts.map +1 -1
  170. package/dist/cli/cli/src/utils/cloud-submit.js +14 -5
  171. package/dist/cli/cli/src/utils/cloud-submit.js.map +1 -1
  172. package/dist/cli/cli/src/utils/package-validator.d.ts +2 -0
  173. package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
  174. package/dist/cli/cli/src/utils/package-validator.js +16 -0
  175. package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
  176. package/dist/cli/config/constants.d.ts +48 -0
  177. package/dist/cli/config/constants.d.ts.map +1 -1
  178. package/dist/cli/config/constants.js +48 -0
  179. package/dist/cli/config/constants.js.map +1 -1
  180. package/dist/cli/config/index.d.ts +2 -2
  181. package/dist/cli/config/index.d.ts.map +1 -1
  182. package/dist/cli/config/index.js +2 -2
  183. package/dist/cli/config/index.js.map +1 -1
  184. package/frontend/dist/assets/{index-5b98bf77.js → index-e6c403b6.js} +265 -265
  185. package/frontend/dist/index.html +1 -1
  186. package/package.json +1 -1
@@ -0,0 +1,559 @@
1
+ /**
2
+ * Skill discovery — find a skill for a capability, locally or in the marketplace.
3
+ *
4
+ * Backs `find-skill` and `install-skill` (specs/skill-auto-install.md). It
5
+ * merges three sources into one candidate list:
6
+ *
7
+ * 1. **Bundled** skills shipped in the npm package (`config/skills/agent/**`).
8
+ * They are present on every install, so `find-skill` works for them even
9
+ * when the registry has no entry or the network is down.
10
+ * 2. **Installed** marketplace skills (`~/.crewly/marketplace/skills/<id>`).
11
+ * 3. **Registry** entries (public GitHub registry + crewlyai.com), fetched
12
+ * with the existing marketplace service (cached, deduplicated).
13
+ *
14
+ * ## What "official" means
15
+ *
16
+ * A skill is official — and may be installed by an agent without asking — when
17
+ * it is **bundled with Crewly**, or it is listed in an **official registry**
18
+ * (the public GitHub registry or crewlyai.com, both curated by Crewly
19
+ * maintainers) with `author` "Crewly Team" / "crewly" or `metadata.verified:
20
+ * true`. Entries from the machine-local registry (`local-registry.json`,
21
+ * written by local publishing) are never official, whatever author they claim.
22
+ * A marketplace skill installed earlier counts as official only when the
23
+ * registry still lists it as official.
24
+ *
25
+ * @module services/skill-setup/skill-discovery.service
26
+ */
27
+ import * as fs from 'fs';
28
+ import * as path from 'path';
29
+ import { SKILL_SETUP_CONSTANTS } from '../../constants.js';
30
+ import { findPackageRoot } from '../../utils/package-root.js';
31
+ import { parseSkillMd } from '../../utils/skill-md-parser.js';
32
+ import { fetchRegistry, getInstallPath, loadManifest } from '../marketplace/marketplace.service.js';
33
+ import { validateSetupManifest } from './skill-setup-manifest.js';
34
+ import { getSkillSetupRunner } from './skill-setup-runner.service.js';
35
+ /** Directories under the bundled root that are not skills or not shipped. */
36
+ const SKIP_DIRS = new Set(['_common', 'marketplace']);
37
+ /** Words that carry no capability meaning in a query. */
38
+ const STOPWORDS = new Set([
39
+ 'a', 'an', 'the', 'to', 'of', 'for', 'and', 'or', 'i', 'my', 'me', 'you', 'this', 'that', 'it', 'is', 'can', 'with',
40
+ 'from', 'in', 'on', 'into', 'file', 'files', 'please', 'need', 'want', 'how', 'do', 'skill', 'tool', 'some',
41
+ ]);
42
+ /** Registry id prefixes older entries carry (`agent-send-pdf-to-slack`, `skill-nano-banana`). */
43
+ const REGISTRY_ID_PREFIXES = ['agent-', 'skill-'];
44
+ /**
45
+ * Split a query into lower-case tokens, dropping stopwords.
46
+ *
47
+ * @param text - Free text
48
+ * @returns Tokens (CJK runs stay whole)
49
+ */
50
+ export function tokenize(text) {
51
+ return text
52
+ .toLowerCase()
53
+ .split(/[^\p{L}\p{N}.+#-]+/u)
54
+ .map((t) => t.replace(/^[.-]+|[.-]+$/g, ''))
55
+ .filter((t) => t.length > 0 && !STOPWORDS.has(t));
56
+ }
57
+ /**
58
+ * Expand tokens with synonyms (QUERY_SYNONYMS). CJK tokens also match a
59
+ * synonym key they contain ("语音消息" contains "语音").
60
+ *
61
+ * @param tokens - Query tokens
62
+ * @returns Original tokens (weight 1) and synonyms (weight 0.6), deduplicated
63
+ */
64
+ export function expandTokens(tokens) {
65
+ const out = new Map();
66
+ for (const t of tokens)
67
+ out.set(t, 1);
68
+ const synonyms = SKILL_SETUP_CONSTANTS.QUERY_SYNONYMS;
69
+ for (const t of tokens) {
70
+ for (const [key, values] of Object.entries(synonyms)) {
71
+ const hit = t === key || (/[^\p{ASCII}]/u.test(key) && t.includes(key));
72
+ if (!hit)
73
+ continue;
74
+ for (const v of values)
75
+ if (!out.has(v))
76
+ out.set(v, 0.6);
77
+ }
78
+ }
79
+ return [...out.entries()].map(([token, weight]) => ({ token, weight }));
80
+ }
81
+ /**
82
+ * Score how well a skill matches a query.
83
+ *
84
+ * Each query token (and synonym, at reduced weight) takes its best match:
85
+ * exact id/name 10, exact tag 6, id/name contains 5, trigger contains 3,
86
+ * tag overlap 3, description contains 1.5. The whole query appearing in a
87
+ * trigger or the description adds 4.
88
+ *
89
+ * @param query - Free-text need ("transcribe a voice message")
90
+ * @param doc - Candidate fields
91
+ * @returns Score (0 = no match)
92
+ */
93
+ export function scoreSkill(query, doc) {
94
+ const id = doc.id.toLowerCase();
95
+ const name = doc.name.toLowerCase();
96
+ const tags = doc.tags.map((t) => t.toLowerCase());
97
+ const triggers = doc.triggers.map((t) => t.toLowerCase());
98
+ const description = doc.description.toLowerCase();
99
+ let score = 0;
100
+ for (const { token, weight } of expandTokens(tokenize(query))) {
101
+ let best = 0;
102
+ if (token === id || token === name)
103
+ best = 10;
104
+ else if (tags.includes(token))
105
+ best = 6;
106
+ else if (token.length >= 3 && (id.includes(token) || name.includes(token)))
107
+ best = 5;
108
+ else if (triggers.some((t) => t.includes(token)))
109
+ best = 3;
110
+ else if (tags.some((t) => (token.length >= 2 && t.includes(token)) || (t.length >= 3 && token.includes(t))))
111
+ best = 3;
112
+ else if (token.length >= 2 && description.includes(token))
113
+ best = 1.5;
114
+ score += best * weight;
115
+ }
116
+ const phrase = query.trim().toLowerCase();
117
+ if (phrase.length >= 4 && (triggers.some((t) => t.includes(phrase)) || description.includes(phrase)))
118
+ score += 4;
119
+ return score;
120
+ }
121
+ /**
122
+ * Whether a registry entry is official (see module docs).
123
+ *
124
+ * @param item - Registry entry (with registrySource set by fetchRegistry)
125
+ * @returns `{ official, reason }`
126
+ */
127
+ export function registryOfficial(item) {
128
+ const source = item.registrySource;
129
+ if (source !== 'public' && source !== 'premium') {
130
+ return { official: false, reason: `third-party: published locally on this machine (author "${item.author}")` };
131
+ }
132
+ if (item.metadata?.verified === true)
133
+ return { official: true, reason: `verified entry in the official ${source} registry` };
134
+ if (SKILL_SETUP_CONSTANTS.OFFICIAL_AUTHORS.includes(item.author)) {
135
+ return { official: true, reason: `published by ${item.author} in the official ${source} registry` };
136
+ }
137
+ return { official: false, reason: `third-party: author "${item.author}"` };
138
+ }
139
+ /**
140
+ * Registry ids a local skill may be listed under.
141
+ *
142
+ * @param local - Local skill
143
+ * @returns Candidate ids
144
+ */
145
+ function aliasesOf(local) {
146
+ const ids = new Set([local.id, local.dirName]);
147
+ for (const p of REGISTRY_ID_PREFIXES) {
148
+ ids.add(`${p}${local.id}`);
149
+ ids.add(`${p}${local.dirName}`);
150
+ }
151
+ return [...ids];
152
+ }
153
+ /**
154
+ * Read a string array field.
155
+ *
156
+ * @param v - Value
157
+ * @returns Strings only
158
+ */
159
+ function strings(v) {
160
+ return Array.isArray(v) ? v.filter((x) => typeof x === 'string') : [];
161
+ }
162
+ /** Finds and describes skills. */
163
+ export class SkillDiscoveryService {
164
+ bundledRoot;
165
+ installedRoot;
166
+ fetchRegistryFn;
167
+ loadManifestFn;
168
+ runner;
169
+ /**
170
+ * @param deps - Injectable dependencies (all optional)
171
+ */
172
+ constructor(deps = {}) {
173
+ this.bundledRoot = deps.bundledRoot ?? SkillDiscoveryService.defaultBundledRoot();
174
+ this.installedRoot = deps.installedRoot ?? path.dirname(getInstallPath('skill', 'x'));
175
+ this.fetchRegistryFn = deps.fetchRegistry ?? (() => fetchRegistry());
176
+ this.loadManifestFn = deps.loadManifest ?? loadManifest;
177
+ this.runner = deps.runner ?? getSkillSetupRunner();
178
+ }
179
+ /**
180
+ * `<package root>/config/skills/agent`, or null when the package root cannot be found.
181
+ *
182
+ * @returns Absolute path or null
183
+ */
184
+ static defaultBundledRoot() {
185
+ for (const start of SkillDiscoveryService.packageSearchStarts()) {
186
+ try {
187
+ const dir = path.join(findPackageRoot(start), 'config', 'skills', 'agent');
188
+ if (fs.existsSync(dir))
189
+ return dir;
190
+ }
191
+ catch {
192
+ // try the next start point
193
+ }
194
+ }
195
+ return null;
196
+ }
197
+ /**
198
+ * Where to start looking for the package root.
199
+ *
200
+ * The compiled backend and CLI are ES modules, where `__dirname` does not
201
+ * exist (a bare reference throws); under ts-jest it does. The entry script
202
+ * (`process.argv[1]`, realpath'd through the global `bin` symlink) is
203
+ * always inside the package at runtime, so it is the anchor that works
204
+ * for `crewly` and the backend alike; cwd is the last resort.
205
+ *
206
+ * @returns Candidate start directories, most reliable first
207
+ */
208
+ static packageSearchStarts() {
209
+ const starts = [];
210
+ if (typeof __dirname !== 'undefined')
211
+ starts.push(__dirname);
212
+ const entry = process.argv[1];
213
+ if (entry) {
214
+ try {
215
+ starts.push(path.dirname(fs.realpathSync(entry)));
216
+ }
217
+ catch {
218
+ starts.push(path.dirname(path.resolve(entry)));
219
+ }
220
+ }
221
+ starts.push(process.cwd());
222
+ return starts;
223
+ }
224
+ /**
225
+ * Find skills for a need, best first.
226
+ *
227
+ * @param query - What the agent needs ("transcribe voice message", "read pdf")
228
+ * @param options - `limit` (default FIND_MAX_RESULTS); `probe` runs check-only setup on the top few (default true)
229
+ * @returns Ranked candidates (score > 0) and whether the registry was reachable
230
+ *
231
+ * @example
232
+ * ```ts
233
+ * const { candidates } = await discovery.find('transcribe a voice message');
234
+ * candidates[0].id; // 'transcribe-audio'
235
+ * ```
236
+ */
237
+ async find(query, options = {}) {
238
+ const { all, registryAvailable } = await this.collect();
239
+ const limit = options.limit ?? SKILL_SETUP_CONSTANTS.FIND_MAX_RESULTS;
240
+ const ranked = all
241
+ .map((c) => ({ ...c, score: scoreSkill(query, c) + (c.official ? 0.5 : 0) + (c.installed ? 0.25 : 0) }))
242
+ .filter((c) => c.score > 0.75)
243
+ .sort((a, b) => b.score - a.score || a.id.localeCompare(b.id))
244
+ .slice(0, limit);
245
+ if (options.probe !== false) {
246
+ await Promise.all(ranked.slice(0, SKILL_SETUP_CONSTANTS.FIND_PROBE_LIMIT).map((c) => this.probe(c)));
247
+ }
248
+ return { candidates: ranked.map((c) => this.publicView(c)), registryAvailable };
249
+ }
250
+ /**
251
+ * Resolve one skill by id (local id, directory name or registry id).
252
+ *
253
+ * @param id - Skill id
254
+ * @returns The skill, or null when neither bundled, installed nor in the registry
255
+ */
256
+ async resolve(id) {
257
+ return this.pick(id, (await this.collect()).all);
258
+ }
259
+ /**
260
+ * Resolve a skill that is on this machine (bundled or installed) without
261
+ * touching the network — for `crewly skills setup` offline.
262
+ *
263
+ * Official status of an installed marketplace skill needs the registry, so
264
+ * here it is reported as not official; bundled skills are official.
265
+ *
266
+ * @param id - Skill id or directory name
267
+ * @returns The skill, or null when it is not on this machine
268
+ */
269
+ async resolveLocal(id) {
270
+ return this.pick(id, (await this.collect({ registry: false })).all);
271
+ }
272
+ /**
273
+ * Pick a candidate by id, registry id or directory name.
274
+ *
275
+ * @param id - Wanted id
276
+ * @param all - Candidates
277
+ * @returns The match or null
278
+ */
279
+ pick(id, all) {
280
+ const wanted = id.trim().toLowerCase();
281
+ const match = all.find((c) => c.id === wanted) ??
282
+ all.find((c) => c.registryId === wanted) ??
283
+ all.find((c) => c.skillDir !== undefined && path.basename(c.skillDir) === wanted);
284
+ return match ?? null;
285
+ }
286
+ /**
287
+ * Run a check-only setup probe and record the result on the candidate.
288
+ *
289
+ * @param c - Candidate (mutated)
290
+ * @returns The same candidate
291
+ */
292
+ async probe(c) {
293
+ if (!c.installed || !c.skillDir)
294
+ return c;
295
+ if (!c.manifest) {
296
+ c.ready = !c.manifestError;
297
+ return c;
298
+ }
299
+ const result = await this.runner.runSetup({ skillId: c.id, skillDir: c.skillDir, manifest: c.manifest, checkOnly: true });
300
+ c.setup.satisfied = result.success;
301
+ c.setup.missing = result.steps.filter((s) => s.status === 'missing' && !s.optional).map((s) => s.id);
302
+ c.ready = result.success;
303
+ return c;
304
+ }
305
+ /**
306
+ * Strip internals for API output.
307
+ *
308
+ * @param c - Resolved candidate
309
+ * @returns Public candidate
310
+ */
311
+ publicView(c) {
312
+ const view = { ...c };
313
+ delete view.manifest;
314
+ delete view.manifestError;
315
+ delete view.registryItem;
316
+ return view;
317
+ }
318
+ /**
319
+ * Build every candidate from all sources.
320
+ *
321
+ * @param options - `registry: false` skips the registry fetch
322
+ * @returns Candidates and registry reachability
323
+ */
324
+ async collect(options = {}) {
325
+ const locals = [
326
+ ...(this.bundledRoot ? this.scanRoot(this.bundledRoot, 'bundled') : []),
327
+ ...this.scanRoot(this.installedRoot, 'installed'),
328
+ ];
329
+ let registryItems = [];
330
+ let registryAvailable = options.registry !== false;
331
+ if (registryAvailable) {
332
+ try {
333
+ registryItems = (await this.fetchRegistryFn()).items.filter((i) => i.type === 'skill');
334
+ if (registryItems.length === 0)
335
+ registryAvailable = false;
336
+ }
337
+ catch {
338
+ registryAvailable = false;
339
+ }
340
+ }
341
+ let installedIds = new Set();
342
+ try {
343
+ installedIds = new Set((await this.loadManifestFn()).items.map((r) => r.id));
344
+ }
345
+ catch {
346
+ // no manifest yet
347
+ }
348
+ const byId = new Map();
349
+ const claimedRegistry = new Set();
350
+ for (const local of locals) {
351
+ if (byId.has(local.id))
352
+ continue; // bundled wins over an installed copy of the same skill
353
+ const aliases = aliasesOf(local);
354
+ const item = registryItems.find((i) => aliases.includes(i.id) || (typeof i.assets.archive === 'string' && !i.assets.archive.endsWith('.tar.gz') && path.basename(i.assets.archive) === local.dirName));
355
+ if (item)
356
+ claimedRegistry.add(item.id);
357
+ byId.set(local.id, this.fromLocal(local, item));
358
+ }
359
+ for (const item of registryItems) {
360
+ if (claimedRegistry.has(item.id) || byId.has(item.id))
361
+ continue;
362
+ byId.set(item.id, this.fromRegistry(item, installedIds.has(item.id)));
363
+ }
364
+ return { all: [...byId.values()], registryAvailable };
365
+ }
366
+ /**
367
+ * Candidate for a local (bundled or installed) skill.
368
+ *
369
+ * @param local - Local skill
370
+ * @param item - Matching registry entry, if any
371
+ * @returns Candidate
372
+ */
373
+ fromLocal(local, item) {
374
+ let official;
375
+ let officialReason;
376
+ if (local.source === 'bundled') {
377
+ official = true;
378
+ officialReason = 'bundled with Crewly';
379
+ }
380
+ else if (item) {
381
+ ({ official, reason: officialReason } = registryOfficial(item));
382
+ }
383
+ else {
384
+ official = false;
385
+ officialReason = 'third-party: installed from a source that is no longer in an official registry';
386
+ }
387
+ const setupRaw = local.setupRaw ?? item?.metadata?.setup;
388
+ const candidate = {
389
+ id: local.id,
390
+ name: local.name,
391
+ description: local.description,
392
+ tags: local.tags,
393
+ triggers: local.triggers,
394
+ source: local.source,
395
+ official,
396
+ officialReason,
397
+ author: local.author ?? item?.author,
398
+ version: local.version ?? item?.version,
399
+ installed: true,
400
+ skillDir: local.skillDir,
401
+ executePath: path.join(local.skillDir, 'execute.sh'),
402
+ ...(item && item.id !== local.id ? { registryId: item.id } : {}),
403
+ setup: { declared: false },
404
+ score: 0,
405
+ registryItem: item,
406
+ };
407
+ this.attachSetup(candidate, setupRaw);
408
+ return candidate;
409
+ }
410
+ /**
411
+ * Candidate for a registry-only skill.
412
+ *
413
+ * @param item - Registry entry
414
+ * @param installed - The marketplace manifest lists it (files may still be missing)
415
+ * @returns Candidate
416
+ */
417
+ fromRegistry(item, installed) {
418
+ const { official, reason } = registryOfficial(item);
419
+ const candidate = {
420
+ id: item.id,
421
+ name: item.name,
422
+ description: item.description,
423
+ tags: item.tags ?? [],
424
+ triggers: strings(item.metadata?.triggers),
425
+ source: 'registry',
426
+ official,
427
+ officialReason: reason,
428
+ author: item.author,
429
+ version: item.version,
430
+ installed,
431
+ setup: { declared: false },
432
+ score: 0,
433
+ registryItem: item,
434
+ };
435
+ this.attachSetup(candidate, item.metadata?.setup);
436
+ return candidate;
437
+ }
438
+ /**
439
+ * Validate a raw setup block and record it on the candidate.
440
+ *
441
+ * @param c - Candidate (mutated)
442
+ * @param raw - Raw `setup` value
443
+ */
444
+ attachSetup(c, raw) {
445
+ if (raw === undefined || raw === null)
446
+ return;
447
+ const v = validateSetupManifest(raw);
448
+ c.setup.declared = true;
449
+ if (v.valid && v.manifest) {
450
+ c.manifest = v.manifest;
451
+ c.setup.estimatedMinutes = v.manifest.estimatedMinutes ?? SKILL_SETUP_CONSTANTS.DEFAULT_ESTIMATED_MINUTES;
452
+ }
453
+ else {
454
+ c.manifestError = v.errors.join('; ');
455
+ }
456
+ }
457
+ /**
458
+ * Scan a skills root: direct skill dirs, and one level of category dirs.
459
+ *
460
+ * @param root - Directory
461
+ * @param source - Label for what is found
462
+ * @returns Local skills
463
+ */
464
+ scanRoot(root, source) {
465
+ const out = [];
466
+ let entries;
467
+ try {
468
+ entries = fs.readdirSync(root, { withFileTypes: true });
469
+ }
470
+ catch {
471
+ return out;
472
+ }
473
+ for (const entry of entries) {
474
+ if (!entry.isDirectory() || SKIP_DIRS.has(entry.name) || entry.name.startsWith('.'))
475
+ continue;
476
+ const dir = path.join(root, entry.name);
477
+ const skill = this.readLocal(dir, source);
478
+ if (skill) {
479
+ out.push(skill);
480
+ continue;
481
+ }
482
+ // Category directory (core/, marketing/, …)
483
+ let nested = [];
484
+ try {
485
+ nested = fs.readdirSync(dir, { withFileTypes: true });
486
+ }
487
+ catch {
488
+ continue;
489
+ }
490
+ for (const n of nested) {
491
+ if (!n.isDirectory() || SKIP_DIRS.has(n.name))
492
+ continue;
493
+ const s = this.readLocal(path.join(dir, n.name), source);
494
+ if (s)
495
+ out.push(s);
496
+ }
497
+ }
498
+ return out;
499
+ }
500
+ /**
501
+ * Read one skill directory (SKILL.md frontmatter wins over skill.json, as in the registry builder).
502
+ *
503
+ * @param dir - Skill directory
504
+ * @param source - Label
505
+ * @returns The skill, or null when the directory has no manifest
506
+ */
507
+ readLocal(dir, source) {
508
+ const mdPath = path.join(dir, 'SKILL.md');
509
+ const jsonPath = path.join(dir, 'skill.json');
510
+ let fm = {};
511
+ let json = {};
512
+ const hasMd = fs.existsSync(mdPath);
513
+ const hasJson = fs.existsSync(jsonPath);
514
+ if (!hasMd && !hasJson)
515
+ return null;
516
+ try {
517
+ if (hasMd)
518
+ fm = parseSkillMd(fs.readFileSync(mdPath, 'utf-8')).frontmatter;
519
+ }
520
+ catch {
521
+ fm = {};
522
+ }
523
+ try {
524
+ if (hasJson)
525
+ json = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
526
+ }
527
+ catch {
528
+ json = {};
529
+ }
530
+ const merged = { ...json, ...fm };
531
+ const dirName = path.basename(dir);
532
+ const id = typeof json.id === 'string' && json.id ? json.id : dirName;
533
+ return {
534
+ id,
535
+ dirName,
536
+ skillDir: dir,
537
+ name: typeof merged.name === 'string' ? merged.name : dirName,
538
+ description: typeof merged.description === 'string' ? merged.description : '',
539
+ tags: strings(merged.tags),
540
+ triggers: strings(merged.triggers),
541
+ author: typeof merged.author === 'string' ? merged.author : undefined,
542
+ version: typeof merged.version === 'string' ? merged.version : undefined,
543
+ setupRaw: json.setup,
544
+ source,
545
+ };
546
+ }
547
+ }
548
+ let discoverySingleton = null;
549
+ /**
550
+ * The process-wide discovery service.
551
+ *
552
+ * @returns The service
553
+ */
554
+ export function getSkillDiscoveryService() {
555
+ if (!discoverySingleton)
556
+ discoverySingleton = new SkillDiscoveryService();
557
+ return discoverySingleton;
558
+ }
559
+ //# sourceMappingURL=skill-discovery.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-discovery.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/skill-setup/skill-discovery.service.ts"],"names":[],"mappings":"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"}