devchain-cli 0.8.5 → 0.9.1
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/dist/drizzle/0038_soft_texas_twister.sql +51 -0
- package/dist/drizzle/0039_early_the_spike.sql +1 -0
- package/dist/drizzle/0040_typical_mole_man.sql +3 -0
- package/dist/drizzle/0041_community_skill_sources.sql +12 -0
- package/dist/drizzle/meta/0037_snapshot.json +3670 -0
- package/dist/drizzle/meta/0038_snapshot.json +4019 -0
- package/dist/drizzle/meta/0039_snapshot.json +4026 -0
- package/dist/drizzle/meta/0040_snapshot.json +4028 -0
- package/dist/drizzle/meta/0041_snapshot.json +4102 -0
- package/dist/drizzle/meta/_journal.json +28 -0
- package/dist/server/app.module.js +2 -0
- package/dist/server/app.module.js.map +1 -1
- package/dist/server/modules/epics/controllers/epics.controller.js +4 -0
- package/dist/server/modules/epics/controllers/epics.controller.js.map +1 -1
- package/dist/server/modules/mcp/dtos/mcp.dto.d.ts +74 -0
- package/dist/server/modules/mcp/dtos/mcp.dto.js +18 -1
- package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
- package/dist/server/modules/mcp/dtos/schema-registry.js +2 -0
- package/dist/server/modules/mcp/dtos/schema-registry.js.map +1 -1
- package/dist/server/modules/mcp/mcp.module.js +2 -0
- package/dist/server/modules/mcp/mcp.module.js.map +1 -1
- package/dist/server/modules/mcp/services/mcp.service.d.ts +7 -1
- package/dist/server/modules/mcp/services/mcp.service.js +126 -2
- package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
- package/dist/server/modules/mcp/tool-definitions.d.ts +177 -0
- package/dist/server/modules/mcp/tool-definitions.js +48 -0
- package/dist/server/modules/mcp/tool-definitions.js.map +1 -1
- package/dist/server/modules/projects/dtos/export.dto.d.ts +15 -15
- package/dist/server/modules/seeders/seeders/0002_seed_replace_permission_mode_plan.d.ts +3 -0
- package/dist/server/modules/seeders/seeders/0002_seed_replace_permission_mode_plan.js +45 -0
- package/dist/server/modules/seeders/seeders/0002_seed_replace_permission_mode_plan.js.map +1 -0
- package/dist/server/modules/seeders/seeders/0003_seed_preseed_jeffallan_claude_skills.d.ts +3 -0
- package/dist/server/modules/seeders/seeders/0003_seed_preseed_jeffallan_claude_skills.js +41 -0
- package/dist/server/modules/seeders/seeders/0003_seed_preseed_jeffallan_claude_skills.js.map +1 -0
- package/dist/server/modules/seeders/seeders/0004_seed_disable_microsoft_source_default.d.ts +3 -0
- package/dist/server/modules/seeders/seeders/0004_seed_disable_microsoft_source_default.js +48 -0
- package/dist/server/modules/seeders/seeders/0004_seed_disable_microsoft_source_default.js.map +1 -0
- package/dist/server/modules/seeders/services/data-seeder.service.js +9 -1
- package/dist/server/modules/seeders/services/data-seeder.service.js.map +1 -1
- package/dist/server/modules/settings/dtos/settings.dto.d.ts +18 -0
- package/dist/server/modules/settings/dtos/settings.dto.js +5 -0
- package/dist/server/modules/settings/dtos/settings.dto.js.map +1 -1
- package/dist/server/modules/settings/services/settings.service.d.ts +5 -0
- package/dist/server/modules/settings/services/settings.service.js +80 -1
- package/dist/server/modules/settings/services/settings.service.js.map +1 -1
- package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.d.ts +9 -0
- package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js +169 -0
- package/dist/server/modules/skills/adapters/anthropic-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/community-skill-source.adapter.d.ts +11 -0
- package/dist/server/modules/skills/adapters/community-skill-source.adapter.js +181 -0
- package/dist/server/modules/skills/adapters/community-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/github-skill-source.base.d.ts +48 -0
- package/dist/server/modules/skills/adapters/github-skill-source.base.js +382 -0
- package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -0
- package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.d.ts +11 -0
- package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js +227 -0
- package/dist/server/modules/skills/adapters/microsoft-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/openai-skill-source.adapter.d.ts +13 -0
- package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js +260 -0
- package/dist/server/modules/skills/adapters/openai-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/skill-source.adapter.d.ts +26 -0
- package/dist/server/modules/skills/adapters/skill-source.adapter.js +5 -0
- package/dist/server/modules/skills/adapters/skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.d.ts +14 -0
- package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js +253 -0
- package/dist/server/modules/skills/adapters/trailofbits-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.d.ts +15 -0
- package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js +292 -0
- package/dist/server/modules/skills/adapters/vercel-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/controllers/community-sources.controller.d.ts +12 -0
- package/dist/server/modules/skills/controllers/community-sources.controller.js +71 -0
- package/dist/server/modules/skills/controllers/community-sources.controller.js.map +1 -0
- package/dist/server/modules/skills/controllers/skills.controller.d.ts +42 -0
- package/dist/server/modules/skills/controllers/skills.controller.js +257 -0
- package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -0
- package/dist/server/modules/skills/dtos/community-sources.dto.d.ts +100 -0
- package/dist/server/modules/skills/dtos/community-sources.dto.js +138 -0
- package/dist/server/modules/skills/dtos/community-sources.dto.js.map +1 -0
- package/dist/server/modules/skills/dtos/skill.dto.d.ts +169 -0
- package/dist/server/modules/skills/dtos/skill.dto.js +116 -0
- package/dist/server/modules/skills/dtos/skill.dto.js.map +1 -0
- package/dist/server/modules/skills/services/community-sources.service.d.ts +11 -0
- package/dist/server/modules/skills/services/community-sources.service.js +99 -0
- package/dist/server/modules/skills/services/community-sources.service.js.map +1 -0
- package/dist/server/modules/skills/services/skill-category.service.d.ts +5 -0
- package/dist/server/modules/skills/services/skill-category.service.js +155 -0
- package/dist/server/modules/skills/services/skill-category.service.js.map +1 -0
- package/dist/server/modules/skills/services/skill-source-registry.service.d.ts +9 -0
- package/dist/server/modules/skills/services/skill-source-registry.service.js +46 -0
- package/dist/server/modules/skills/services/skill-source-registry.service.js.map +1 -0
- package/dist/server/modules/skills/services/skill-sync.service.d.ts +38 -0
- package/dist/server/modules/skills/services/skill-sync.service.js +281 -0
- package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -0
- package/dist/server/modules/skills/services/skills.service.d.ts +119 -0
- package/dist/server/modules/skills/services/skills.service.js +734 -0
- package/dist/server/modules/skills/services/skills.service.js.map +1 -0
- package/dist/server/modules/skills/skills.module.d.ts +2 -0
- package/dist/server/modules/skills/skills.module.js +76 -0
- package/dist/server/modules/skills/skills.module.js.map +1 -0
- package/dist/server/modules/storage/db/schema.d.ts +769 -0
- package/dist/server/modules/storage/db/schema.js +67 -1
- package/dist/server/modules/storage/db/schema.js.map +1 -1
- package/dist/server/modules/storage/interfaces/storage.interface.d.ts +7 -1
- package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
- package/dist/server/modules/storage/local/local-storage.service.d.ts +13 -1
- package/dist/server/modules/storage/local/local-storage.service.js +209 -7
- package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
- package/dist/server/modules/storage/models/domain.models.d.ts +59 -1
- package/dist/server/templates/dev-loop.json +85 -78
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/{ReviewDetailPage-DNZbiwkx.js → ReviewDetailPage-D13dH7Wh.js} +1 -1
- package/dist/server/ui/assets/{ReviewsPage-Dow8B8sr.js → ReviewsPage-C98ST0lf.js} +1 -1
- package/dist/server/ui/assets/index-C8Dc1yQf.js +945 -0
- package/dist/server/ui/assets/index-DZkJ40z9.css +32 -0
- package/dist/server/ui/assets/useReviewSubscription-CmLuF45Z.js +77 -0
- package/dist/server/ui/index.html +2 -2
- package/dist/templates/dev-loop.json +85 -78
- package/package.json +17 -1
- package/dist/server/ui/assets/index--HtPKe24.js +0 -914
- package/dist/server/ui/assets/index-BkiWahA0.css +0 -32
- package/dist/server/ui/assets/useReviewSubscription-CNhZ4Xwh.js +0 -83
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.GitHubSkillSourceBase = void 0;
|
|
40
|
+
const node_fs_1 = require("node:fs");
|
|
41
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
42
|
+
const node_os_1 = require("node:os");
|
|
43
|
+
const node_path_1 = require("node:path");
|
|
44
|
+
const node_stream_1 = require("node:stream");
|
|
45
|
+
const promises_1 = require("node:stream/promises");
|
|
46
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
47
|
+
const tar = __importStar(require("tar"));
|
|
48
|
+
const error_types_1 = require("../../../common/errors/error-types");
|
|
49
|
+
const logger_1 = require("../../../common/logging/logger");
|
|
50
|
+
const logger = (0, logger_1.createLogger)('GitHubSkillSourceBase');
|
|
51
|
+
const DEFAULT_BRANCH = 'main';
|
|
52
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
53
|
+
const DEFAULT_USER_AGENT = 'devchain-skills-sync';
|
|
54
|
+
const DEFAULT_SKILLS_ROOT = (0, node_path_1.join)((0, node_os_1.homedir)(), '.devchain', 'skills');
|
|
55
|
+
const CONTROL_CHAR_REGEX = /[\u0000-\u001f\u007f]/;
|
|
56
|
+
const SAFE_SKILL_SEGMENT_REGEX = /^[A-Za-z0-9_-]+$/;
|
|
57
|
+
class GitHubSkillSourceBase {
|
|
58
|
+
constructor(config = {}) {
|
|
59
|
+
this.sourceName = config.sourceName ?? 'unknown';
|
|
60
|
+
this.repoOwner = config.repoOwner ?? '';
|
|
61
|
+
this.repoName = config.repoName ?? '';
|
|
62
|
+
this.branch = config.branch ?? DEFAULT_BRANCH;
|
|
63
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
64
|
+
this.userAgent = config.userAgent ?? DEFAULT_USER_AGENT;
|
|
65
|
+
this.storageRootDir = config.storageRootDir ?? DEFAULT_SKILLS_ROOT;
|
|
66
|
+
this.githubToken = config.githubToken ?? process.env.GITHUB_TOKEN ?? null;
|
|
67
|
+
this.repoUrl =
|
|
68
|
+
this.repoOwner && this.repoName
|
|
69
|
+
? `https://github.com/${this.repoOwner}/${this.repoName}`
|
|
70
|
+
: 'https://github.com';
|
|
71
|
+
}
|
|
72
|
+
async downloadSkill(skillName, targetPath) {
|
|
73
|
+
const context = await this.prepareExtractedRepository();
|
|
74
|
+
try {
|
|
75
|
+
return await this.downloadSkillFromExtractedRepo(skillName, targetPath, context.extractedRepoRoot);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await context.dispose();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getLatestCommit() {
|
|
82
|
+
this.ensureRepoConfigured();
|
|
83
|
+
const endpoint = `https://api.github.com/repos/${this.repoOwner}/${this.repoName}/commits/${encodeURIComponent(this.branch)}`;
|
|
84
|
+
const response = await this.fetchWithTimeout(endpoint);
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new error_types_1.StorageError('Failed to fetch latest GitHub commit for skill source.', {
|
|
87
|
+
sourceName: this.sourceName,
|
|
88
|
+
repoOwner: this.repoOwner,
|
|
89
|
+
repoName: this.repoName,
|
|
90
|
+
branch: this.branch,
|
|
91
|
+
status: response.status,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const payload = (await response.json());
|
|
95
|
+
if (typeof payload.sha !== 'string' || payload.sha.length === 0) {
|
|
96
|
+
throw new error_types_1.StorageError('GitHub commit response did not include a valid SHA.', {
|
|
97
|
+
sourceName: this.sourceName,
|
|
98
|
+
repoOwner: this.repoOwner,
|
|
99
|
+
repoName: this.repoName,
|
|
100
|
+
branch: this.branch,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return payload.sha;
|
|
104
|
+
}
|
|
105
|
+
async parseSkillMarkdown(skillDirectory) {
|
|
106
|
+
const safeSkillDirectory = (0, node_path_1.resolve)(skillDirectory);
|
|
107
|
+
const skillMdPath = (0, node_path_1.join)(safeSkillDirectory, 'SKILL.md');
|
|
108
|
+
let markdown;
|
|
109
|
+
try {
|
|
110
|
+
markdown = await fs.readFile(skillMdPath, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (error.code === 'ENOENT') {
|
|
114
|
+
logger.warn({ sourceName: this.sourceName, skillMdPath }, 'SKILL.md not found for skill');
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
throw this.wrapStorageError('Failed reading SKILL.md for skill.', error, {
|
|
118
|
+
sourceName: this.sourceName,
|
|
119
|
+
skillMdPath,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const parsed = (0, gray_matter_1.default)(markdown);
|
|
124
|
+
const frontmatter = parsed.data && typeof parsed.data === 'object'
|
|
125
|
+
? parsed.data
|
|
126
|
+
: {};
|
|
127
|
+
return {
|
|
128
|
+
frontmatter,
|
|
129
|
+
instructionContent: parsed.content,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
logger.warn({
|
|
134
|
+
sourceName: this.sourceName,
|
|
135
|
+
skillMdPath,
|
|
136
|
+
error: error instanceof Error ? error.message : String(error),
|
|
137
|
+
}, 'Failed to parse SKILL.md frontmatter for skill. Skipping malformed file.');
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
getSkillStorageRoot() {
|
|
142
|
+
return (0, node_path_1.resolve)(this.storageRootDir);
|
|
143
|
+
}
|
|
144
|
+
validatePathSegment(segment, fieldName) {
|
|
145
|
+
const trimmed = segment.trim();
|
|
146
|
+
if (!trimmed) {
|
|
147
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: value cannot be empty.`, { fieldName });
|
|
148
|
+
}
|
|
149
|
+
if (trimmed.includes('..') ||
|
|
150
|
+
trimmed.includes('/') ||
|
|
151
|
+
trimmed.includes('\\') ||
|
|
152
|
+
CONTROL_CHAR_REGEX.test(trimmed)) {
|
|
153
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: path traversal or control characters are not allowed.`, { fieldName, segment: trimmed });
|
|
154
|
+
}
|
|
155
|
+
if (!SAFE_SKILL_SEGMENT_REGEX.test(trimmed)) {
|
|
156
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: only alphanumeric characters, underscores, and hyphens are allowed.`, { fieldName, segment: trimmed });
|
|
157
|
+
}
|
|
158
|
+
return trimmed;
|
|
159
|
+
}
|
|
160
|
+
pickString(frontmatter, keys) {
|
|
161
|
+
for (const key of keys) {
|
|
162
|
+
const value = this.toStringValue(frontmatter[key]);
|
|
163
|
+
if (value) {
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
pickStringArray(frontmatter, keys) {
|
|
170
|
+
for (const key of keys) {
|
|
171
|
+
const value = frontmatter[key];
|
|
172
|
+
if (!Array.isArray(value)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const items = value
|
|
176
|
+
.filter((item) => typeof item === 'string')
|
|
177
|
+
.map((item) => item.trim())
|
|
178
|
+
.filter((item) => item.length > 0);
|
|
179
|
+
if (items.length > 0) {
|
|
180
|
+
return items;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
toStringValue(value) {
|
|
186
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
187
|
+
return value.trim();
|
|
188
|
+
}
|
|
189
|
+
if (Array.isArray(value)) {
|
|
190
|
+
const items = value
|
|
191
|
+
.filter((item) => typeof item === 'string')
|
|
192
|
+
.map((item) => item.trim())
|
|
193
|
+
.filter((item) => item.length > 0);
|
|
194
|
+
if (items.length > 0) {
|
|
195
|
+
return items.join(', ');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
async resolveSkillDirectory(extractedRepoRoot, skillName) {
|
|
201
|
+
const candidates = [
|
|
202
|
+
(0, node_path_1.join)(extractedRepoRoot, skillName),
|
|
203
|
+
(0, node_path_1.join)(extractedRepoRoot, 'skills', skillName),
|
|
204
|
+
(0, node_path_1.join)(extractedRepoRoot, 'library', skillName),
|
|
205
|
+
];
|
|
206
|
+
for (const candidate of candidates) {
|
|
207
|
+
try {
|
|
208
|
+
const stats = await fs.stat(candidate);
|
|
209
|
+
if (stats.isDirectory()) {
|
|
210
|
+
return candidate;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (error.code !== 'ENOENT') {
|
|
215
|
+
throw this.wrapStorageError('Failed checking extracted skill directory.', error, {
|
|
216
|
+
candidate,
|
|
217
|
+
sourceName: this.sourceName,
|
|
218
|
+
skillName,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
throw new error_types_1.StorageError('Skill directory was not found in extracted repository tarball.', {
|
|
224
|
+
sourceName: this.sourceName,
|
|
225
|
+
skillName,
|
|
226
|
+
extractedRepoRoot,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
async prepareExtractedRepository() {
|
|
230
|
+
this.ensureRepoConfigured();
|
|
231
|
+
const safeSourceName = this.validatePathSegment(this.sourceName, 'sourceName');
|
|
232
|
+
const tempRoot = await fs.mkdtemp((0, node_path_1.join)((0, node_os_1.tmpdir)(), `skills-${safeSourceName}-`));
|
|
233
|
+
const archivePath = (0, node_path_1.join)(tempRoot, 'repo.tar.gz');
|
|
234
|
+
const extractPath = (0, node_path_1.join)(tempRoot, 'repo');
|
|
235
|
+
let disposed = false;
|
|
236
|
+
const dispose = async () => {
|
|
237
|
+
if (disposed) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
disposed = true;
|
|
241
|
+
await this.cleanupTempDirectory(tempRoot);
|
|
242
|
+
};
|
|
243
|
+
try {
|
|
244
|
+
await fs.mkdir(extractPath, { recursive: true });
|
|
245
|
+
await this.downloadTarball(archivePath);
|
|
246
|
+
await tar.x({
|
|
247
|
+
file: archivePath,
|
|
248
|
+
cwd: extractPath,
|
|
249
|
+
strip: 1,
|
|
250
|
+
strict: true,
|
|
251
|
+
});
|
|
252
|
+
return {
|
|
253
|
+
extractedRepoRoot: extractPath,
|
|
254
|
+
dispose,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
await dispose();
|
|
259
|
+
throw this.wrapStorageError('Failed to download and extract skills repository.', error, {
|
|
260
|
+
sourceName: safeSourceName,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
async downloadSkillFromExtractedRepo(skillName, targetPath, extractedRepoRoot) {
|
|
265
|
+
this.ensureRepoConfigured();
|
|
266
|
+
const safeSourceName = this.validatePathSegment(this.sourceName, 'sourceName');
|
|
267
|
+
const safeSkillName = this.validatePathSegment(skillName, 'skillName');
|
|
268
|
+
const storageRoot = typeof targetPath === 'string' && targetPath.trim().length > 0
|
|
269
|
+
? (0, node_path_1.resolve)(targetPath)
|
|
270
|
+
: (0, node_path_1.resolve)(this.storageRootDir);
|
|
271
|
+
const sourceRoot = (0, node_path_1.resolve)(storageRoot, safeSourceName);
|
|
272
|
+
const destinationPath = (0, node_path_1.resolve)(sourceRoot, safeSkillName);
|
|
273
|
+
if (!destinationPath.startsWith(`${sourceRoot}${node_path_1.sep}`)) {
|
|
274
|
+
throw new error_types_1.ValidationError('Resolved skill destination path is outside the source directory.', {
|
|
275
|
+
sourceRoot,
|
|
276
|
+
destinationPath,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
const resolvedSkillPath = await this.resolveSkillDirectory((0, node_path_1.resolve)(extractedRepoRoot), safeSkillName);
|
|
281
|
+
await fs.mkdir(sourceRoot, { recursive: true });
|
|
282
|
+
await fs.rm(destinationPath, { recursive: true, force: true });
|
|
283
|
+
await fs.cp(resolvedSkillPath, destinationPath, { recursive: true, force: true });
|
|
284
|
+
return destinationPath;
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
throw this.wrapStorageError('Failed to copy skill from extracted repository.', error, {
|
|
288
|
+
sourceName: safeSourceName,
|
|
289
|
+
skillName: safeSkillName,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
ensureRepoConfigured() {
|
|
294
|
+
if (!this.repoOwner || !this.repoName) {
|
|
295
|
+
throw new error_types_1.ValidationError('GitHub skill source adapter is missing repository configuration.', { sourceName: this.sourceName });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
getTarballUrl() {
|
|
299
|
+
return `https://api.github.com/repos/${this.repoOwner}/${this.repoName}/tarball/${encodeURIComponent(this.branch)}`;
|
|
300
|
+
}
|
|
301
|
+
buildGitHubHeaders() {
|
|
302
|
+
const headers = {
|
|
303
|
+
Accept: 'application/vnd.github+json',
|
|
304
|
+
'User-Agent': this.userAgent,
|
|
305
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
306
|
+
};
|
|
307
|
+
if (this.githubToken) {
|
|
308
|
+
headers.Authorization = `Bearer ${this.githubToken}`;
|
|
309
|
+
}
|
|
310
|
+
return headers;
|
|
311
|
+
}
|
|
312
|
+
async downloadTarball(destinationPath) {
|
|
313
|
+
const response = await this.fetchWithTimeout(this.getTarballUrl());
|
|
314
|
+
if (!response.ok || !response.body) {
|
|
315
|
+
throw new error_types_1.StorageError('Failed to download GitHub tarball for skill source.', {
|
|
316
|
+
sourceName: this.sourceName,
|
|
317
|
+
repoOwner: this.repoOwner,
|
|
318
|
+
repoName: this.repoName,
|
|
319
|
+
branch: this.branch,
|
|
320
|
+
status: response.status,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
await fs.mkdir((0, node_path_1.dirname)(destinationPath), { recursive: true });
|
|
324
|
+
const writeStream = (0, node_fs_1.createWriteStream)(destinationPath);
|
|
325
|
+
const bodyStream = node_stream_1.Readable.fromWeb(response.body);
|
|
326
|
+
await (0, promises_1.pipeline)(bodyStream, writeStream);
|
|
327
|
+
}
|
|
328
|
+
async fetchWithTimeout(url) {
|
|
329
|
+
const controller = new AbortController();
|
|
330
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
331
|
+
try {
|
|
332
|
+
return await fetch(url, {
|
|
333
|
+
signal: controller.signal,
|
|
334
|
+
headers: this.buildGitHubHeaders(),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
339
|
+
throw new error_types_1.TimeoutError('GitHub skill source request timed out.', {
|
|
340
|
+
sourceName: this.sourceName,
|
|
341
|
+
timeoutMs: this.timeoutMs,
|
|
342
|
+
url,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
throw this.wrapStorageError('GitHub skill source request failed.', error, {
|
|
346
|
+
sourceName: this.sourceName,
|
|
347
|
+
url,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
clearTimeout(timeoutId);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async cleanupTempDirectory(tempRoot) {
|
|
355
|
+
try {
|
|
356
|
+
await fs.rm(tempRoot, { recursive: true, force: true });
|
|
357
|
+
}
|
|
358
|
+
catch (cleanupError) {
|
|
359
|
+
logger.warn({
|
|
360
|
+
tempRoot,
|
|
361
|
+
error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
|
|
362
|
+
}, 'Failed to cleanup temporary GitHub skill directory');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
wrapStorageError(message, error, details) {
|
|
366
|
+
if (error instanceof error_types_1.StorageError) {
|
|
367
|
+
return error;
|
|
368
|
+
}
|
|
369
|
+
if (error instanceof error_types_1.ValidationError) {
|
|
370
|
+
throw error;
|
|
371
|
+
}
|
|
372
|
+
if (error instanceof error_types_1.TimeoutError) {
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
return new error_types_1.StorageError(message, {
|
|
376
|
+
...details,
|
|
377
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
exports.GitHubSkillSourceBase = GitHubSkillSourceBase;
|
|
382
|
+
//# sourceMappingURL=github-skill-source.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-skill-source.base.js","sourceRoot":"","sources":["../../../../src/modules/skills/adapters/github-skill-source.base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { GitHubSkillSourceBase } from './github-skill-source.base';
|
|
2
|
+
import { SkillManifest, SkillSourceAdapter, SkillSourceSyncContext } from './skill-source.adapter';
|
|
3
|
+
export declare class MicrosoftSkillSource extends GitHubSkillSourceBase implements SkillSourceAdapter {
|
|
4
|
+
constructor();
|
|
5
|
+
listSkills(): Promise<Map<string, SkillManifest>>;
|
|
6
|
+
createSyncContext(): Promise<SkillSourceSyncContext>;
|
|
7
|
+
protected resolveSkillDirectory(extractedRepoRoot: string, skillName: string): Promise<string>;
|
|
8
|
+
private listSkillNamesFromExtractedRepo;
|
|
9
|
+
private parseSkillMarkdownWithFallback;
|
|
10
|
+
private toSkillManifest;
|
|
11
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.MicrosoftSkillSource = void 0;
|
|
46
|
+
const node_path_1 = require("node:path");
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
49
|
+
const error_types_1 = require("../../../common/errors/error-types");
|
|
50
|
+
const logger_1 = require("../../../common/logging/logger");
|
|
51
|
+
const github_skill_source_base_1 = require("./github-skill-source.base");
|
|
52
|
+
const logger = (0, logger_1.createLogger)('MicrosoftSkillSource');
|
|
53
|
+
const SKILLS_DIRECTORY = '.github/skills';
|
|
54
|
+
let MicrosoftSkillSource = class MicrosoftSkillSource extends github_skill_source_base_1.GitHubSkillSourceBase {
|
|
55
|
+
constructor() {
|
|
56
|
+
super({
|
|
57
|
+
sourceName: 'microsoft',
|
|
58
|
+
repoOwner: 'microsoft',
|
|
59
|
+
repoName: 'skills',
|
|
60
|
+
timeoutMs: 90_000,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async listSkills() {
|
|
64
|
+
const context = await this.createSyncContext();
|
|
65
|
+
try {
|
|
66
|
+
return new Map(context.manifests);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await context.dispose();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async createSyncContext() {
|
|
73
|
+
const repoContext = await this.prepareExtractedRepository();
|
|
74
|
+
const manifests = new Map();
|
|
75
|
+
let disposed = false;
|
|
76
|
+
const dispose = async () => {
|
|
77
|
+
if (disposed) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
disposed = true;
|
|
81
|
+
await repoContext.dispose();
|
|
82
|
+
};
|
|
83
|
+
try {
|
|
84
|
+
const skillNames = await this.listSkillNamesFromExtractedRepo(repoContext.extractedRepoRoot);
|
|
85
|
+
for (const skillName of skillNames) {
|
|
86
|
+
try {
|
|
87
|
+
const skillDirectory = await this.resolveSkillDirectory(repoContext.extractedRepoRoot, skillName);
|
|
88
|
+
const parsedSkill = await this.parseSkillMarkdownWithFallback(skillDirectory);
|
|
89
|
+
if (!parsedSkill) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
manifests.set(skillName, this.toSkillManifest(skillName, parsedSkill));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger.warn({
|
|
96
|
+
sourceName: this.sourceName,
|
|
97
|
+
skillName,
|
|
98
|
+
error: error instanceof Error ? error.message : String(error),
|
|
99
|
+
}, 'Failed processing Microsoft skill. Skipping.');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
manifests,
|
|
104
|
+
downloadSkill: async (skillName, targetPath) => this.downloadSkillFromExtractedRepo(skillName, targetPath, repoContext.extractedRepoRoot),
|
|
105
|
+
dispose,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
await dispose();
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async resolveSkillDirectory(extractedRepoRoot, skillName) {
|
|
114
|
+
const skillDirectory = (0, node_path_1.join)(extractedRepoRoot, SKILLS_DIRECTORY, skillName);
|
|
115
|
+
try {
|
|
116
|
+
const stats = await fs.stat(skillDirectory);
|
|
117
|
+
if (stats.isDirectory()) {
|
|
118
|
+
return skillDirectory;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error.code !== 'ENOENT') {
|
|
123
|
+
throw new error_types_1.StorageError('Failed checking extracted Microsoft skill directory.', {
|
|
124
|
+
sourceName: this.sourceName,
|
|
125
|
+
skillName,
|
|
126
|
+
skillDirectory,
|
|
127
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
throw new error_types_1.StorageError('Microsoft skill directory not found in repository archive.', {
|
|
132
|
+
sourceName: this.sourceName,
|
|
133
|
+
skillName,
|
|
134
|
+
skillDirectory,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async listSkillNamesFromExtractedRepo(extractedRepoRoot) {
|
|
138
|
+
const skillsRoot = (0, node_path_1.join)(extractedRepoRoot, SKILLS_DIRECTORY);
|
|
139
|
+
let entries;
|
|
140
|
+
try {
|
|
141
|
+
entries = await fs.readdir(skillsRoot, { withFileTypes: true });
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
if (error.code === 'ENOENT') {
|
|
145
|
+
throw new error_types_1.StorageError('Microsoft skills directory not found in repository archive.', {
|
|
146
|
+
sourceName: this.sourceName,
|
|
147
|
+
skillsRoot,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
throw new error_types_1.StorageError('Failed reading Microsoft skills directory in archive.', {
|
|
151
|
+
sourceName: this.sourceName,
|
|
152
|
+
skillsRoot,
|
|
153
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const skillNames = [];
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
if (!entry.isDirectory() || entry.name.startsWith('.')) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
skillNames.push(this.validatePathSegment(entry.name, 'skillName'));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
logger.warn({ sourceName: this.sourceName, skillName: entry.name }, 'Skipping Microsoft skill directory with invalid name.');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return skillNames.sort((left, right) => left.localeCompare(right));
|
|
169
|
+
}
|
|
170
|
+
async parseSkillMarkdownWithFallback(skillDirectory) {
|
|
171
|
+
const parsed = await this.parseSkillMarkdown(skillDirectory);
|
|
172
|
+
if (parsed) {
|
|
173
|
+
return parsed;
|
|
174
|
+
}
|
|
175
|
+
const skillMarkdownPath = (0, node_path_1.join)(skillDirectory, 'SKILL.md');
|
|
176
|
+
try {
|
|
177
|
+
const markdown = await fs.readFile(skillMarkdownPath, 'utf-8');
|
|
178
|
+
return {
|
|
179
|
+
frontmatter: {},
|
|
180
|
+
instructionContent: markdown,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error.code === 'ENOENT') {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
throw new error_types_1.StorageError('Failed reading Microsoft SKILL.md fallback content.', {
|
|
188
|
+
sourceName: this.sourceName,
|
|
189
|
+
skillMarkdownPath,
|
|
190
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
toSkillManifest(skillName, parsedSkill) {
|
|
195
|
+
const frontmatter = parsedSkill.frontmatter;
|
|
196
|
+
const manifestName = this.pickString(frontmatter, ['name']) ?? skillName;
|
|
197
|
+
const displayName = this.pickString(frontmatter, ['displayName', 'display_name', 'title']);
|
|
198
|
+
const description = this.pickString(frontmatter, ['description', 'summary', 'shortDescription']) ??
|
|
199
|
+
`Skill instructions for ${skillName}`;
|
|
200
|
+
const shortDescription = this.pickString(frontmatter, [
|
|
201
|
+
'shortDescription',
|
|
202
|
+
'short_description',
|
|
203
|
+
'summary',
|
|
204
|
+
]);
|
|
205
|
+
const license = this.pickString(frontmatter, ['license']);
|
|
206
|
+
const compatibility = this.pickString(frontmatter, ['compatibility']);
|
|
207
|
+
const resources = this.pickStringArray(frontmatter, ['resources', 'references']);
|
|
208
|
+
return {
|
|
209
|
+
name: manifestName,
|
|
210
|
+
displayName,
|
|
211
|
+
description,
|
|
212
|
+
shortDescription,
|
|
213
|
+
license,
|
|
214
|
+
compatibility,
|
|
215
|
+
frontmatter,
|
|
216
|
+
instructionContent: parsedSkill.instructionContent,
|
|
217
|
+
resources,
|
|
218
|
+
sourceUrl: `${this.repoUrl}/tree/${encodeURIComponent(this.branch)}/${SKILLS_DIRECTORY}/${encodeURIComponent(skillName)}`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
exports.MicrosoftSkillSource = MicrosoftSkillSource;
|
|
223
|
+
exports.MicrosoftSkillSource = MicrosoftSkillSource = __decorate([
|
|
224
|
+
(0, common_1.Injectable)(),
|
|
225
|
+
__metadata("design:paramtypes", [])
|
|
226
|
+
], MicrosoftSkillSource);
|
|
227
|
+
//# sourceMappingURL=microsoft-skill-source.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft-skill-source.adapter.js","sourceRoot":"","sources":["../../../../src/modules/skills/adapters/microsoft-skill-source.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GitHubSkillSourceBase } from './github-skill-source.base';
|
|
2
|
+
import { SkillManifest, SkillSourceSyncContext } from './skill-source.adapter';
|
|
3
|
+
export declare class OpenAISkillSource extends GitHubSkillSourceBase {
|
|
4
|
+
constructor();
|
|
5
|
+
listSkills(): Promise<Map<string, SkillManifest>>;
|
|
6
|
+
protected resolveSkillDirectory(extractedRepoRoot: string, skillName: string): Promise<string>;
|
|
7
|
+
createSyncContext(): Promise<SkillSourceSyncContext>;
|
|
8
|
+
private listSkillNamesFromExtractedRepo;
|
|
9
|
+
private parseOpenAIAgentMetadata;
|
|
10
|
+
private extractOpenAIInterfaceFields;
|
|
11
|
+
private normalizeYamlScalar;
|
|
12
|
+
private toSkillManifest;
|
|
13
|
+
}
|