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.
- package/config/constants.ts +49 -0
- package/config/index.ts +2 -0
- package/config/skills/agent/core/find-skill/SKILL.md +58 -0
- package/config/skills/agent/core/find-skill/execute.sh +67 -0
- package/config/skills/agent/core/find-skill/execute.test.sh +69 -0
- package/config/skills/agent/core/generate-pdf/SKILL.md +24 -29
- package/config/skills/agent/core/generate-pdf/execute.sh +22 -78
- package/config/skills/agent/core/generate-pdf/execute.test.sh +45 -0
- package/config/skills/agent/core/install-skill/SKILL.md +67 -0
- package/config/skills/agent/core/install-skill/execute.sh +80 -0
- package/config/skills/agent/core/install-skill/execute.test.sh +74 -0
- package/config/skills/agent/pdf-tools/SKILL.md +103 -0
- package/config/skills/agent/pdf-tools/execute.sh +301 -0
- package/config/skills/agent/pdf-tools/execute.test.sh +218 -0
- package/config/skills/agent/pdf-tools/instructions.md +14 -0
- package/config/skills/agent/pdf-tools/pdf_tools.py +268 -0
- package/config/skills/agent/pdf-tools/skill.json +103 -0
- package/config/skills/agent/pdf-tools/style.css +143 -0
- package/config/skills/agent/transcribe-audio/SKILL.md +42 -5
- package/config/skills/agent/transcribe-audio/execute.sh +44 -11
- package/config/skills/agent/transcribe-audio/execute.test.sh +90 -0
- package/config/skills/agent/transcribe-audio/install-whisper-cpp.sh +126 -0
- package/config/skills/agent/transcribe-audio/install-whisper-cpp.test.sh +69 -0
- package/config/skills/agent/transcribe-audio/skill.json +67 -6
- package/config/skills/marketplace-registry.ts +8 -1
- package/config/skills/registry.json +337 -3
- package/dist/backend/backend/src/constants.d.ts +71 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +96 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts +56 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +114 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +73 -55
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +3 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js +185 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts +21 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js +29 -0
- package/dist/backend/backend/src/controllers/skill-setup/skill-setup.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +5 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts +115 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js +160 -0
- package/dist/backend/backend/src/services/cloud/cloud-device-pairing.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +11 -3
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
- package/dist/backend/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
- package/dist/backend/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
- package/dist/backend/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +16 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.js +78 -0
- package/dist/backend/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +48 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +48 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +71 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +96 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +33 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts +132 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.d.ts.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js +228 -0
- package/dist/cli/backend/src/services/cloud/cloud-device-pairing.client.js.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts +101 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.js +392 -0
- package/dist/cli/backend/src/services/marketplace/marketplace.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts +281 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js +559 -0
- package/dist/cli/backend/src/services/skill-setup/skill-discovery.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts +138 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js +281 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-manifest.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts +338 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js +761 -0
- package/dist/cli/backend/src/services/skill-setup/skill-setup-runner.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +6 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/types/marketplace.types.d.ts +219 -0
- package/dist/cli/backend/src/types/marketplace.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/marketplace.types.js +6 -0
- package/dist/cli/backend/src/types/marketplace.types.js.map +1 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts +55 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.js +78 -0
- package/dist/cli/backend/src/utils/inbound-file-hint.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/package-root.d.ts +15 -0
- package/dist/cli/backend/src/utils/package-root.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/package-root.js +38 -0
- package/dist/cli/backend/src/utils/package-root.js.map +1 -0
- package/dist/cli/cli/src/commands/cloud.d.ts +45 -25
- package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/cloud.js +153 -47
- package/dist/cli/cli/src/commands/cloud.js.map +1 -1
- package/dist/cli/cli/src/commands/install.d.ts +13 -1
- package/dist/cli/cli/src/commands/install.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/install.js +40 -3
- package/dist/cli/cli/src/commands/install.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard-checklist.js +3 -3
- package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -1
- package/dist/cli/cli/src/commands/skills.d.ts +58 -0
- package/dist/cli/cli/src/commands/skills.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/skills.js +132 -0
- package/dist/cli/cli/src/commands/skills.js.map +1 -0
- package/dist/cli/cli/src/index.js +18 -7
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.d.ts +14 -0
- package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.js +24 -3
- package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
- package/dist/cli/cli/src/utils/cloud-submit.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/cloud-submit.js +14 -5
- package/dist/cli/cli/src/utils/cloud-submit.js.map +1 -1
- package/dist/cli/cli/src/utils/package-validator.d.ts +2 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/package-validator.js +16 -0
- package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
- package/dist/cli/config/constants.d.ts +48 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +48 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-5b98bf77.js → index-e6c403b6.js} +265 -265
- package/frontend/dist/index.html +1 -1
- 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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"}
|