devchain-cli 0.9.0 → 0.9.2
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/0041_community_skill_sources.sql +12 -0
- package/dist/drizzle/0042_nice_flatman.sql +10 -0
- package/dist/drizzle/0043_majestic_starhawk.sql +10 -0
- package/dist/drizzle/meta/0041_snapshot.json +4102 -0
- package/dist/drizzle/meta/0042_snapshot.json +4171 -0
- package/dist/drizzle/meta/0043_snapshot.json +4231 -0
- package/dist/drizzle/meta/_journal.json +21 -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 +4 -0
- package/dist/server/modules/seeders/services/data-seeder.service.js.map +1 -1
- 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 +2 -5
- package/dist/server/modules/skills/adapters/github-skill-source.base.js +31 -100
- package/dist/server/modules/skills/adapters/github-skill-source.base.js.map +1 -1
- package/dist/server/modules/skills/adapters/local-skill-source.adapter.d.ts +16 -0
- package/dist/server/modules/skills/adapters/local-skill-source.adapter.js +265 -0
- package/dist/server/modules/skills/adapters/local-skill-source.adapter.js.map +1 -0
- package/dist/server/modules/skills/adapters/skill-parsing.utils.d.ts +32 -0
- package/dist/server/modules/skills/adapters/skill-parsing.utils.js +169 -0
- package/dist/server/modules/skills/adapters/skill-parsing.utils.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/local-sources.controller.d.ts +12 -0
- package/dist/server/modules/skills/controllers/local-sources.controller.js +71 -0
- package/dist/server/modules/skills/controllers/local-sources.controller.js.map +1 -0
- package/dist/server/modules/skills/controllers/skills.controller.d.ts +11 -1
- package/dist/server/modules/skills/controllers/skills.controller.js +35 -3
- package/dist/server/modules/skills/controllers/skills.controller.js.map +1 -1
- 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/local-sources.dto.d.ts +42 -0
- package/dist/server/modules/skills/dtos/local-sources.dto.js +30 -0
- package/dist/server/modules/skills/dtos/local-sources.dto.js.map +1 -0
- package/dist/server/modules/skills/dtos/skill.dto.d.ts +16 -0
- package/dist/server/modules/skills/dtos/skill.dto.js +7 -1
- package/dist/server/modules/skills/dtos/skill.dto.js.map +1 -1
- package/dist/server/modules/skills/services/community-sources.service.d.ts +18 -0
- package/dist/server/modules/skills/services/community-sources.service.js +158 -0
- package/dist/server/modules/skills/services/community-sources.service.js.map +1 -0
- package/dist/server/modules/skills/services/local-sources.service.d.ts +20 -0
- package/dist/server/modules/skills/services/local-sources.service.js +206 -0
- package/dist/server/modules/skills/services/local-sources.service.js.map +1 -0
- package/dist/server/modules/skills/services/skill-source-registry.service.d.ts +20 -0
- package/dist/server/modules/skills/services/skill-source-registry.service.js +142 -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 +7 -3
- package/dist/server/modules/skills/services/skill-sync.service.js +102 -11
- package/dist/server/modules/skills/services/skill-sync.service.js.map +1 -1
- package/dist/server/modules/skills/services/skills.service.d.ts +16 -4
- package/dist/server/modules/skills/services/skills.service.js +141 -36
- package/dist/server/modules/skills/services/skills.service.js.map +1 -1
- package/dist/server/modules/skills/skills.module.js +10 -1
- package/dist/server/modules/skills/skills.module.js.map +1 -1
- package/dist/server/modules/storage/db/schema.d.ts +342 -0
- package/dist/server/modules/storage/db/schema.js +30 -1
- package/dist/server/modules/storage/db/schema.js.map +1 -1
- package/dist/server/modules/storage/interfaces/storage.interface.d.ts +18 -1
- package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
- package/dist/server/modules/storage/local/local-storage.service.d.ts +28 -1
- package/dist/server/modules/storage/local/local-storage.service.js +452 -2
- package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
- package/dist/server/modules/storage/models/domain.models.d.ts +20 -0
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/{ReviewDetailPage-D_-bS1MK.js → ReviewDetailPage-BvSckWKj.js} +1 -1
- package/dist/server/ui/assets/{ReviewsPage-BE1gxYlC.js → ReviewsPage-MKT-vv59.js} +1 -1
- package/dist/server/ui/assets/index-BtUq-Qxb.css +32 -0
- package/dist/server/ui/assets/{index-C094CE5I.js → index-kTb634Zp.js} +197 -197
- package/dist/server/ui/assets/{useReviewSubscription-Bs-17h-m.js → useReviewSubscription-Dc58i6Bk.js} +1 -1
- package/dist/server/ui/index.html +2 -2
- package/package.json +8 -1
- package/dist/server/ui/assets/index-CbtpBUHu.css +0 -32
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LocalSkillSource } from '../../storage/models/domain.models';
|
|
2
|
+
import type { SkillManifest, SkillSourceAdapter, SkillSourceSyncContext } from './skill-source.adapter';
|
|
3
|
+
export declare class LocalSkillSourceAdapter implements SkillSourceAdapter {
|
|
4
|
+
readonly sourceName: string;
|
|
5
|
+
readonly repoUrl: string;
|
|
6
|
+
private readonly folderPath;
|
|
7
|
+
constructor(source: LocalSkillSource);
|
|
8
|
+
listSkills(): Promise<Map<string, SkillManifest>>;
|
|
9
|
+
createSyncContext(): Promise<SkillSourceSyncContext>;
|
|
10
|
+
downloadSkill(skillName: string, targetPath: string): Promise<string>;
|
|
11
|
+
getLatestCommit(): Promise<string>;
|
|
12
|
+
private listSkillNamesFromLocalFolder;
|
|
13
|
+
private resolveStrictLocalSkillDirectory;
|
|
14
|
+
private toSkillManifest;
|
|
15
|
+
private wrapStorageError;
|
|
16
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LocalSkillSourceAdapter = void 0;
|
|
37
|
+
const node_crypto_1 = require("node:crypto");
|
|
38
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
39
|
+
const node_os_1 = require("node:os");
|
|
40
|
+
const node_path_1 = require("node:path");
|
|
41
|
+
const node_url_1 = require("node:url");
|
|
42
|
+
const error_types_1 = require("../../../common/errors/error-types");
|
|
43
|
+
const logger_1 = require("../../../common/logging/logger");
|
|
44
|
+
const skill_parsing_utils_1 = require("./skill-parsing.utils");
|
|
45
|
+
const logger = (0, logger_1.createLogger)('LocalSkillSourceAdapter');
|
|
46
|
+
const SKILLS_DIRECTORY = 'skills';
|
|
47
|
+
const DEFAULT_SKILLS_ROOT = (0, node_path_1.join)((0, node_os_1.homedir)(), '.devchain', 'skills');
|
|
48
|
+
class LocalSkillSourceAdapter {
|
|
49
|
+
constructor(source) {
|
|
50
|
+
this.sourceName = source.name.trim().toLowerCase();
|
|
51
|
+
this.folderPath = (0, node_path_1.resolve)(source.folderPath);
|
|
52
|
+
this.repoUrl = (0, node_url_1.pathToFileURL)(this.folderPath).toString();
|
|
53
|
+
}
|
|
54
|
+
async listSkills() {
|
|
55
|
+
const context = await this.createSyncContext();
|
|
56
|
+
try {
|
|
57
|
+
return new Map(context.manifests);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await context.dispose();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async createSyncContext() {
|
|
64
|
+
const manifests = new Map();
|
|
65
|
+
const skillNames = await this.listSkillNamesFromLocalFolder();
|
|
66
|
+
for (const skillName of skillNames) {
|
|
67
|
+
try {
|
|
68
|
+
const skillDirectory = await this.resolveStrictLocalSkillDirectory(skillName);
|
|
69
|
+
const parsedSkill = await (0, skill_parsing_utils_1.parseSkillMarkdown)(skillDirectory, {
|
|
70
|
+
onMissingFile: ({ skillMdPath }) => {
|
|
71
|
+
logger.warn({ sourceName: this.sourceName, skillMdPath }, 'SKILL.md not found for skill');
|
|
72
|
+
},
|
|
73
|
+
onParseError: ({ skillMdPath, error }) => {
|
|
74
|
+
logger.warn({
|
|
75
|
+
sourceName: this.sourceName,
|
|
76
|
+
skillMdPath,
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
|
+
}, 'Failed to parse SKILL.md frontmatter for skill. Skipping malformed file.');
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
if (!parsedSkill) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
manifests.set(skillName, this.toSkillManifest(skillName, parsedSkill));
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
logger.warn({
|
|
88
|
+
sourceName: this.sourceName,
|
|
89
|
+
skillName,
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
}, 'Failed processing local skill. Skipping.');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
manifests,
|
|
96
|
+
downloadSkill: (skillName, targetPath) => this.downloadSkill(skillName, targetPath),
|
|
97
|
+
dispose: async () => undefined,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async downloadSkill(skillName, targetPath) {
|
|
101
|
+
const safeSourceName = (0, skill_parsing_utils_1.validatePathSegment)(this.sourceName, 'sourceName');
|
|
102
|
+
const safeSkillName = (0, skill_parsing_utils_1.validatePathSegment)(skillName, 'skillName');
|
|
103
|
+
const storageRoot = typeof targetPath === 'string' && targetPath.trim().length > 0
|
|
104
|
+
? (0, node_path_1.resolve)(targetPath)
|
|
105
|
+
: DEFAULT_SKILLS_ROOT;
|
|
106
|
+
const sourceRoot = (0, node_path_1.resolve)(storageRoot, safeSourceName);
|
|
107
|
+
const destinationPath = (0, node_path_1.resolve)(sourceRoot, safeSkillName);
|
|
108
|
+
if (!destinationPath.startsWith(`${sourceRoot}${node_path_1.sep}`)) {
|
|
109
|
+
throw new error_types_1.ValidationError('Resolved skill destination path is outside the source directory.', { sourceRoot, destinationPath });
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const resolvedSkillPath = await this.resolveStrictLocalSkillDirectory(safeSkillName);
|
|
113
|
+
await fs.mkdir(sourceRoot, { recursive: true });
|
|
114
|
+
await fs.rm(destinationPath, { recursive: true, force: true });
|
|
115
|
+
await fs.cp(resolvedSkillPath, destinationPath, { recursive: true, force: true });
|
|
116
|
+
return destinationPath;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
throw this.wrapStorageError('Failed to copy skill from local source.', error, {
|
|
120
|
+
sourceName: safeSourceName,
|
|
121
|
+
skillName: safeSkillName,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async getLatestCommit() {
|
|
126
|
+
const skillsRoot = (0, node_path_1.join)(this.folderPath, SKILLS_DIRECTORY);
|
|
127
|
+
let rootStats;
|
|
128
|
+
try {
|
|
129
|
+
rootStats = await fs.stat(skillsRoot);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (error.code === 'ENOENT') {
|
|
133
|
+
throw new error_types_1.StorageError('Local skills directory not found in source folder.', {
|
|
134
|
+
sourceName: this.sourceName,
|
|
135
|
+
folderPath: this.folderPath,
|
|
136
|
+
skillsRoot,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
throw this.wrapStorageError('Failed to read local skills directory metadata.', error, {
|
|
140
|
+
sourceName: this.sourceName,
|
|
141
|
+
skillsRoot,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (!rootStats.isDirectory()) {
|
|
145
|
+
throw new error_types_1.StorageError('Local skills path is not a directory.', {
|
|
146
|
+
sourceName: this.sourceName,
|
|
147
|
+
folderPath: this.folderPath,
|
|
148
|
+
skillsRoot,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const hashParts = [`root:${skillsRoot}`];
|
|
152
|
+
const skillNames = await this.listSkillNamesFromLocalFolder();
|
|
153
|
+
for (const skillName of skillNames) {
|
|
154
|
+
hashParts.push(`dir:${skillName}`);
|
|
155
|
+
const skillMdPath = (0, node_path_1.join)(skillsRoot, skillName, 'SKILL.md');
|
|
156
|
+
try {
|
|
157
|
+
const skillMdStats = await fs.stat(skillMdPath);
|
|
158
|
+
hashParts.push(`skill:${skillName}:${skillMdStats.mtimeMs}`);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error.code === 'ENOENT') {
|
|
162
|
+
hashParts.push(`skill:${skillName}:missing`);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
throw this.wrapStorageError('Failed to read local skill metadata for commit hash.', error, {
|
|
166
|
+
sourceName: this.sourceName,
|
|
167
|
+
skillsRoot,
|
|
168
|
+
skillName,
|
|
169
|
+
skillMdPath,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return (0, node_crypto_1.createHash)('sha1').update(hashParts.join('|')).digest('hex');
|
|
174
|
+
}
|
|
175
|
+
async listSkillNamesFromLocalFolder() {
|
|
176
|
+
const skillsRoot = (0, node_path_1.join)(this.folderPath, SKILLS_DIRECTORY);
|
|
177
|
+
let entries;
|
|
178
|
+
try {
|
|
179
|
+
entries = await fs.readdir(skillsRoot, { withFileTypes: true });
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error.code === 'ENOENT') {
|
|
183
|
+
throw new error_types_1.StorageError('Local skills directory not found in source folder.', {
|
|
184
|
+
sourceName: this.sourceName,
|
|
185
|
+
folderPath: this.folderPath,
|
|
186
|
+
skillsRoot,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
throw this.wrapStorageError('Failed reading local skills directory.', error, {
|
|
190
|
+
sourceName: this.sourceName,
|
|
191
|
+
skillsRoot,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return entries
|
|
195
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
|
|
196
|
+
.map((entry) => entry.name)
|
|
197
|
+
.sort((left, right) => left.localeCompare(right));
|
|
198
|
+
}
|
|
199
|
+
async resolveStrictLocalSkillDirectory(skillName) {
|
|
200
|
+
try {
|
|
201
|
+
return await (0, skill_parsing_utils_1.resolveSkillDirectory)(this.folderPath, skillName, {
|
|
202
|
+
candidates: [SKILLS_DIRECTORY],
|
|
203
|
+
onCandidateError: ({ candidate, error }) => {
|
|
204
|
+
throw this.wrapStorageError('Failed checking local skill directory.', error, {
|
|
205
|
+
sourceName: this.sourceName,
|
|
206
|
+
skillName,
|
|
207
|
+
candidate,
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (error instanceof skill_parsing_utils_1.SkillDirectoryNotFoundError) {
|
|
214
|
+
throw new error_types_1.StorageError('Skill directory was not found in local source folder.', {
|
|
215
|
+
sourceName: this.sourceName,
|
|
216
|
+
skillName,
|
|
217
|
+
folderPath: this.folderPath,
|
|
218
|
+
skillsRoot: (0, node_path_1.join)(this.folderPath, SKILLS_DIRECTORY),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
toSkillManifest(skillName, parsedSkill) {
|
|
225
|
+
const frontmatter = parsedSkill.frontmatter;
|
|
226
|
+
const manifestName = (0, skill_parsing_utils_1.pickString)(frontmatter, ['name']) ?? skillName;
|
|
227
|
+
const displayName = (0, skill_parsing_utils_1.pickString)(frontmatter, ['displayName', 'display_name', 'title']);
|
|
228
|
+
const description = (0, skill_parsing_utils_1.pickString)(frontmatter, ['description', 'summary', 'shortDescription']) ??
|
|
229
|
+
`Skill instructions for ${skillName}`;
|
|
230
|
+
const shortDescription = (0, skill_parsing_utils_1.pickString)(frontmatter, [
|
|
231
|
+
'shortDescription',
|
|
232
|
+
'short_description',
|
|
233
|
+
'summary',
|
|
234
|
+
]);
|
|
235
|
+
const license = (0, skill_parsing_utils_1.pickString)(frontmatter, ['license']);
|
|
236
|
+
const compatibility = (0, skill_parsing_utils_1.pickString)(frontmatter, ['compatibility']);
|
|
237
|
+
const resources = (0, skill_parsing_utils_1.pickStringArray)(frontmatter, ['resources', 'references']);
|
|
238
|
+
return {
|
|
239
|
+
name: manifestName,
|
|
240
|
+
displayName,
|
|
241
|
+
description,
|
|
242
|
+
shortDescription,
|
|
243
|
+
license,
|
|
244
|
+
compatibility,
|
|
245
|
+
frontmatter,
|
|
246
|
+
instructionContent: parsedSkill.instructionContent,
|
|
247
|
+
resources,
|
|
248
|
+
sourceUrl: (0, node_url_1.pathToFileURL)((0, node_path_1.join)(this.folderPath, SKILLS_DIRECTORY, skillName)).toString(),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
wrapStorageError(message, error, details) {
|
|
252
|
+
if (error instanceof error_types_1.StorageError) {
|
|
253
|
+
return error;
|
|
254
|
+
}
|
|
255
|
+
if (error instanceof error_types_1.ValidationError) {
|
|
256
|
+
throw error;
|
|
257
|
+
}
|
|
258
|
+
return new error_types_1.StorageError(message, {
|
|
259
|
+
...details,
|
|
260
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.LocalSkillSourceAdapter = LocalSkillSourceAdapter;
|
|
265
|
+
//# sourceMappingURL=local-skill-source.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-skill-source.adapter.js","sourceRoot":"","sources":["../../../../src/modules/skills/adapters/local-skill-source.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface ParsedSkillMarkdown {
|
|
2
|
+
frontmatter: Record<string, unknown>;
|
|
3
|
+
instructionContent: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ParseSkillMarkdownOptions {
|
|
6
|
+
skillMarkdownFileName?: string;
|
|
7
|
+
onMissingFile?: (context: {
|
|
8
|
+
skillMdPath: string;
|
|
9
|
+
}) => void;
|
|
10
|
+
onParseError?: (context: {
|
|
11
|
+
skillMdPath: string;
|
|
12
|
+
error: unknown;
|
|
13
|
+
}) => void;
|
|
14
|
+
}
|
|
15
|
+
export interface ResolveSkillDirectoryOptions {
|
|
16
|
+
candidates?: readonly string[];
|
|
17
|
+
onCandidateError?: (context: {
|
|
18
|
+
candidate: string;
|
|
19
|
+
error: unknown;
|
|
20
|
+
}) => void;
|
|
21
|
+
}
|
|
22
|
+
export declare class SkillDirectoryNotFoundError extends Error {
|
|
23
|
+
readonly skillName: string;
|
|
24
|
+
readonly extractedRepoRoot: string;
|
|
25
|
+
readonly candidates: readonly string[];
|
|
26
|
+
constructor(skillName: string, extractedRepoRoot: string, candidates: readonly string[], message?: string);
|
|
27
|
+
}
|
|
28
|
+
export declare function parseSkillMarkdown(skillDirectory: string, options?: ParseSkillMarkdownOptions): Promise<ParsedSkillMarkdown | null>;
|
|
29
|
+
export declare function resolveSkillDirectory(extractedRepoRoot: string, skillName: string, options?: ResolveSkillDirectoryOptions): Promise<string>;
|
|
30
|
+
export declare function validatePathSegment(segment: string, fieldName: string): string;
|
|
31
|
+
export declare function pickString(frontmatter: Record<string, unknown>, keys: readonly string[]): string | undefined;
|
|
32
|
+
export declare function pickStringArray(frontmatter: Record<string, unknown>, keys: readonly string[]): string[];
|
|
@@ -0,0 +1,169 @@
|
|
|
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.SkillDirectoryNotFoundError = void 0;
|
|
40
|
+
exports.parseSkillMarkdown = parseSkillMarkdown;
|
|
41
|
+
exports.resolveSkillDirectory = resolveSkillDirectory;
|
|
42
|
+
exports.validatePathSegment = validatePathSegment;
|
|
43
|
+
exports.pickString = pickString;
|
|
44
|
+
exports.pickStringArray = pickStringArray;
|
|
45
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
46
|
+
const node_path_1 = require("node:path");
|
|
47
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
48
|
+
const error_types_1 = require("../../../common/errors/error-types");
|
|
49
|
+
const CONTROL_CHAR_REGEX = /[\u0000-\u001f\u007f]/;
|
|
50
|
+
const SAFE_SKILL_SEGMENT_REGEX = /^[A-Za-z0-9_-]+$/;
|
|
51
|
+
const DEFAULT_SKILL_MARKDOWN_FILE = 'SKILL.md';
|
|
52
|
+
const DEFAULT_SKILL_DIRECTORY_CANDIDATES = ['', 'skills', 'library'];
|
|
53
|
+
class SkillDirectoryNotFoundError extends Error {
|
|
54
|
+
constructor(skillName, extractedRepoRoot, candidates, message = 'Skill directory was not found in extracted repository tarball.') {
|
|
55
|
+
super(message);
|
|
56
|
+
this.name = 'SkillDirectoryNotFoundError';
|
|
57
|
+
this.skillName = skillName;
|
|
58
|
+
this.extractedRepoRoot = extractedRepoRoot;
|
|
59
|
+
this.candidates = candidates;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.SkillDirectoryNotFoundError = SkillDirectoryNotFoundError;
|
|
63
|
+
async function parseSkillMarkdown(skillDirectory, options = {}) {
|
|
64
|
+
const safeSkillDirectory = (0, node_path_1.resolve)(skillDirectory);
|
|
65
|
+
const skillMdPath = (0, node_path_1.join)(safeSkillDirectory, options.skillMarkdownFileName ?? DEFAULT_SKILL_MARKDOWN_FILE);
|
|
66
|
+
let markdown;
|
|
67
|
+
try {
|
|
68
|
+
markdown = await fs.readFile(skillMdPath, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === 'ENOENT') {
|
|
72
|
+
options.onMissingFile?.({ skillMdPath });
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const parsed = (0, gray_matter_1.default)(markdown);
|
|
79
|
+
const frontmatter = parsed.data && typeof parsed.data === 'object'
|
|
80
|
+
? parsed.data
|
|
81
|
+
: {};
|
|
82
|
+
return {
|
|
83
|
+
frontmatter,
|
|
84
|
+
instructionContent: parsed.content,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
options.onParseError?.({ skillMdPath, error });
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function resolveSkillDirectory(extractedRepoRoot, skillName, options = {}) {
|
|
93
|
+
const safeExtractedRepoRoot = (0, node_path_1.resolve)(extractedRepoRoot);
|
|
94
|
+
const candidates = (options.candidates ?? DEFAULT_SKILL_DIRECTORY_CANDIDATES).map((candidate) => candidate
|
|
95
|
+
? (0, node_path_1.join)(safeExtractedRepoRoot, candidate, skillName)
|
|
96
|
+
: (0, node_path_1.join)(safeExtractedRepoRoot, skillName));
|
|
97
|
+
for (const candidate of candidates) {
|
|
98
|
+
try {
|
|
99
|
+
const stats = await fs.stat(candidate);
|
|
100
|
+
if (stats.isDirectory()) {
|
|
101
|
+
return candidate;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error.code !== 'ENOENT') {
|
|
106
|
+
options.onCandidateError?.({ candidate, error });
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new SkillDirectoryNotFoundError(skillName, safeExtractedRepoRoot, candidates);
|
|
112
|
+
}
|
|
113
|
+
function validatePathSegment(segment, fieldName) {
|
|
114
|
+
const trimmed = segment.trim();
|
|
115
|
+
if (!trimmed) {
|
|
116
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: value cannot be empty.`, { fieldName });
|
|
117
|
+
}
|
|
118
|
+
if (trimmed.includes('..') ||
|
|
119
|
+
trimmed.includes('/') ||
|
|
120
|
+
trimmed.includes('\\') ||
|
|
121
|
+
CONTROL_CHAR_REGEX.test(trimmed)) {
|
|
122
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: path traversal or control characters are not allowed.`, { fieldName, segment: trimmed });
|
|
123
|
+
}
|
|
124
|
+
if (!SAFE_SKILL_SEGMENT_REGEX.test(trimmed)) {
|
|
125
|
+
throw new error_types_1.ValidationError(`Invalid ${fieldName}: only alphanumeric characters, underscores, and hyphens are allowed.`, { fieldName, segment: trimmed });
|
|
126
|
+
}
|
|
127
|
+
return trimmed;
|
|
128
|
+
}
|
|
129
|
+
function pickString(frontmatter, keys) {
|
|
130
|
+
for (const key of keys) {
|
|
131
|
+
const value = toStringValue(frontmatter[key]);
|
|
132
|
+
if (value) {
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
function pickStringArray(frontmatter, keys) {
|
|
139
|
+
for (const key of keys) {
|
|
140
|
+
const value = frontmatter[key];
|
|
141
|
+
if (!Array.isArray(value)) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const items = value
|
|
145
|
+
.filter((item) => typeof item === 'string')
|
|
146
|
+
.map((item) => item.trim())
|
|
147
|
+
.filter((item) => item.length > 0);
|
|
148
|
+
if (items.length > 0) {
|
|
149
|
+
return items;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
function toStringValue(value) {
|
|
155
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
156
|
+
return value.trim();
|
|
157
|
+
}
|
|
158
|
+
if (Array.isArray(value)) {
|
|
159
|
+
const items = value
|
|
160
|
+
.filter((item) => typeof item === 'string')
|
|
161
|
+
.map((item) => item.trim())
|
|
162
|
+
.filter((item) => item.length > 0);
|
|
163
|
+
if (items.length > 0) {
|
|
164
|
+
return items.join(', ');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=skill-parsing.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-parsing.utils.js","sourceRoot":"","sources":["../../../../src/modules/skills/adapters/skill-parsing.utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,gDAmCC;AAED,sDA2BC;AAED,kDAuBC;AAED,gCAWC;AAED,0CAoBC;AAzKD,qDAAuC;AACvC,yCAA0C;AAC1C,8DAAiC;AACjC,oEAAqE;AAErE,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AACpD,MAAM,2BAA2B,GAAG,UAAU,CAAC;AAC/C,MAAM,kCAAkC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAkB9E,MAAa,2BAA4B,SAAQ,KAAK;IAKpD,YACE,SAAiB,EACjB,iBAAyB,EACzB,UAA6B,EAC7B,OAAO,GAAG,gEAAgE;QAE1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAjBD,kEAiBC;AAEM,KAAK,UAAU,kBAAkB,CACtC,cAAsB,EACtB,UAAqC,EAAE;IAEvC,MAAM,kBAAkB,GAAG,IAAA,mBAAO,EAAC,cAAc,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAA,gBAAI,EACtB,kBAAkB,EAClB,OAAO,CAAC,qBAAqB,IAAI,2BAA2B,CAC7D,CAAC;IAEF,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,CAAC,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,qBAAM,EAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,WAAW,GACf,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC5C,CAAC,CAAE,MAAM,CAAC,IAAgC;YAC1C,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACL,WAAW;YACX,kBAAkB,EAAE,MAAM,CAAC,OAAO;SACnC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,iBAAyB,EACzB,SAAiB,EACjB,UAAwC,EAAE;IAE1C,MAAM,qBAAqB,GAAG,IAAA,mBAAO,EAAC,iBAAiB,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,kCAAkC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9F,SAAS;QACP,CAAC,CAAC,IAAA,gBAAI,EAAC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC;QACnD,CAAC,CAAC,IAAA,gBAAI,EAAC,qBAAqB,EAAE,SAAS,CAAC,CAC3C,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,2BAA2B,CAAC,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;AACtF,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAe,EAAE,SAAiB;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,6BAAe,CAAC,WAAW,SAAS,0BAA0B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,IACE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,6BAAe,CACvB,WAAW,SAAS,yDAAyD,EAC7E,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,6BAAe,CACvB,WAAW,SAAS,uEAAuE,EAC3F,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAChC,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,UAAU,CACxB,WAAoC,EACpC,IAAuB;IAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,eAAe,CAC7B,WAAoC,EACpC,IAAuB;IAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,KAAK;aAChB,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;aAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK;aAChB,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;aAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type CommunitySourceResponseDto } from '../dtos/community-sources.dto';
|
|
2
|
+
import { CommunitySourcesService } from '../services/community-sources.service';
|
|
3
|
+
export declare class CommunitySourcesController {
|
|
4
|
+
private readonly communitySourcesService;
|
|
5
|
+
constructor(communitySourcesService: CommunitySourcesService);
|
|
6
|
+
listCommunitySources(): Promise<CommunitySourceResponseDto[]>;
|
|
7
|
+
createCommunitySource(body: unknown): Promise<CommunitySourceResponseDto>;
|
|
8
|
+
deleteCommunitySource(params: unknown): Promise<{
|
|
9
|
+
success: true;
|
|
10
|
+
}>;
|
|
11
|
+
private toResponse;
|
|
12
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CommunitySourcesController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const logger_1 = require("../../../common/logging/logger");
|
|
18
|
+
const community_sources_dto_1 = require("../dtos/community-sources.dto");
|
|
19
|
+
const community_sources_service_1 = require("../services/community-sources.service");
|
|
20
|
+
const logger = (0, logger_1.createLogger)('CommunitySourcesController');
|
|
21
|
+
let CommunitySourcesController = class CommunitySourcesController {
|
|
22
|
+
constructor(communitySourcesService) {
|
|
23
|
+
this.communitySourcesService = communitySourcesService;
|
|
24
|
+
}
|
|
25
|
+
async listCommunitySources() {
|
|
26
|
+
logger.info('GET /api/skills/community-sources');
|
|
27
|
+
const sources = await this.communitySourcesService.listCommunitySources();
|
|
28
|
+
return sources.map((source) => this.toResponse(source));
|
|
29
|
+
}
|
|
30
|
+
async createCommunitySource(body) {
|
|
31
|
+
logger.info('POST /api/skills/community-sources');
|
|
32
|
+
const parsed = community_sources_dto_1.CreateCommunitySourceSchema.parse(body);
|
|
33
|
+
const created = await this.communitySourcesService.createCommunitySource(parsed);
|
|
34
|
+
return this.toResponse(created);
|
|
35
|
+
}
|
|
36
|
+
async deleteCommunitySource(params) {
|
|
37
|
+
logger.info('DELETE /api/skills/community-sources/:id');
|
|
38
|
+
const parsed = community_sources_dto_1.CommunitySourceDeleteParamsSchema.parse(params);
|
|
39
|
+
await this.communitySourcesService.deleteCommunitySource(parsed.id);
|
|
40
|
+
return { success: true };
|
|
41
|
+
}
|
|
42
|
+
toResponse(source) {
|
|
43
|
+
return community_sources_dto_1.CommunitySourceResponseSchema.parse(source);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.CommunitySourcesController = CommunitySourcesController;
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, common_1.Get)(),
|
|
49
|
+
__metadata("design:type", Function),
|
|
50
|
+
__metadata("design:paramtypes", []),
|
|
51
|
+
__metadata("design:returntype", Promise)
|
|
52
|
+
], CommunitySourcesController.prototype, "listCommunitySources", null);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, common_1.Post)(),
|
|
55
|
+
__param(0, (0, common_1.Body)()),
|
|
56
|
+
__metadata("design:type", Function),
|
|
57
|
+
__metadata("design:paramtypes", [Object]),
|
|
58
|
+
__metadata("design:returntype", Promise)
|
|
59
|
+
], CommunitySourcesController.prototype, "createCommunitySource", null);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, common_1.Delete)(':id'),
|
|
62
|
+
__param(0, (0, common_1.Param)()),
|
|
63
|
+
__metadata("design:type", Function),
|
|
64
|
+
__metadata("design:paramtypes", [Object]),
|
|
65
|
+
__metadata("design:returntype", Promise)
|
|
66
|
+
], CommunitySourcesController.prototype, "deleteCommunitySource", null);
|
|
67
|
+
exports.CommunitySourcesController = CommunitySourcesController = __decorate([
|
|
68
|
+
(0, common_1.Controller)('api/skills/community-sources'),
|
|
69
|
+
__metadata("design:paramtypes", [community_sources_service_1.CommunitySourcesService])
|
|
70
|
+
], CommunitySourcesController);
|
|
71
|
+
//# sourceMappingURL=community-sources.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-sources.controller.js","sourceRoot":"","sources":["../../../../src/modules/skills/controllers/community-sources.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4E;AAC5E,2DAA8D;AAE9D,yEAKuC;AACvC,qFAAgF;AAEhF,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,4BAA4B,CAAC,CAAC;AAGnD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IACrC,YAA6B,uBAAgD;QAAhD,4BAAuB,GAAvB,uBAAuB,CAAyB;IAAG,CAAC;IAG3E,AAAN,KAAK,CAAC,oBAAoB;QACxB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,CAAC;QAC1E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAGK,AAAN,KAAK,CAAC,qBAAqB,CAAS,IAAa;QAC/C,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,mDAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAGK,AAAN,KAAK,CAAC,qBAAqB,CAAU,MAAe;QAClD,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,yDAAiC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,IAAI,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,UAAU,CAAC,MAA4B;QAC7C,OAAO,qDAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AA7BY,gEAA0B;AAI/B;IADL,IAAA,YAAG,GAAE;;;;sEAKL;AAGK;IADL,IAAA,aAAI,GAAE;IACsB,WAAA,IAAA,aAAI,GAAE,CAAA;;;;uEAKlC;AAGK;IADL,IAAA,eAAM,EAAC,KAAK,CAAC;IACe,WAAA,IAAA,cAAK,GAAE,CAAA;;;;uEAKnC;qCAxBU,0BAA0B;IADtC,IAAA,mBAAU,EAAC,8BAA8B,CAAC;qCAEa,mDAAuB;GADlE,0BAA0B,CA6BtC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type LocalSourceResponseDto } from '../dtos/local-sources.dto';
|
|
2
|
+
import { LocalSourcesService } from '../services/local-sources.service';
|
|
3
|
+
export declare class LocalSourcesController {
|
|
4
|
+
private readonly localSourcesService;
|
|
5
|
+
constructor(localSourcesService: LocalSourcesService);
|
|
6
|
+
listLocalSources(): Promise<LocalSourceResponseDto[]>;
|
|
7
|
+
createLocalSource(body: unknown): Promise<LocalSourceResponseDto>;
|
|
8
|
+
deleteLocalSource(params: unknown): Promise<{
|
|
9
|
+
success: true;
|
|
10
|
+
}>;
|
|
11
|
+
private toResponse;
|
|
12
|
+
}
|