devchain-cli 0.8.4 → 0.9.0
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/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/_journal.json +22 -1
- 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/epics/services/epics.service.js +6 -6
- package/dist/server/modules/epics/services/epics.service.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/services/data-seeder.service.js +5 -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/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/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/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/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-sync.service.d.ts +38 -0
- package/dist/server/modules/skills/services/skill-sync.service.js +283 -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 +731 -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 +70 -0
- package/dist/server/modules/skills/skills.module.js.map +1 -0
- package/dist/server/modules/storage/db/schema.d.ts +629 -0
- package/dist/server/modules/storage/db/schema.js +56 -1
- package/dist/server/modules/storage/db/schema.js.map +1 -1
- package/dist/server/modules/storage/interfaces/storage.interface.d.ts +1 -0
- package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
- package/dist/server/modules/storage/local/local-storage.service.d.ts +2 -0
- package/dist/server/modules/storage/local/local-storage.service.js +50 -7
- package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
- package/dist/server/modules/storage/models/domain.models.d.ts +47 -1
- package/dist/server/templates/dev-loop.json +86 -79
- package/dist/server/tsconfig.tsbuildinfo +1 -1
- package/dist/server/ui/assets/{ReviewDetailPage-C4NizGFT.js → ReviewDetailPage-D_-bS1MK.js} +1 -1
- package/dist/server/ui/assets/{ReviewsPage-DLD6BGoH.js → ReviewsPage-BE1gxYlC.js} +1 -1
- package/dist/server/ui/assets/index-C094CE5I.js +945 -0
- package/dist/server/ui/assets/index-CbtpBUHu.css +32 -0
- package/dist/server/ui/assets/useReviewSubscription-Bs-17h-m.js +77 -0
- package/dist/server/ui/index.html +2 -2
- package/dist/templates/dev-loop.json +86 -79
- package/package.json +17 -1
- package/dist/server/ui/assets/index-BkiWahA0.css +0 -32
- package/dist/server/ui/assets/index-CHBUsbMb.js +0 -914
- package/dist/server/ui/assets/useReviewSubscription-CptabtYL.js +0 -83
|
@@ -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 __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.AnthropicSkillSource = 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)('AnthropicSkillSource');
|
|
53
|
+
const SKILLS_DIRECTORY = 'skills';
|
|
54
|
+
let AnthropicSkillSource = class AnthropicSkillSource extends github_skill_source_base_1.GitHubSkillSourceBase {
|
|
55
|
+
constructor() {
|
|
56
|
+
super({
|
|
57
|
+
sourceName: 'anthropic',
|
|
58
|
+
repoOwner: 'anthropics',
|
|
59
|
+
repoName: 'skills',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async listSkills() {
|
|
63
|
+
const context = await this.createSyncContext();
|
|
64
|
+
try {
|
|
65
|
+
return new Map(context.manifests);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await context.dispose();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async createSyncContext() {
|
|
72
|
+
const repoContext = await this.prepareExtractedRepository();
|
|
73
|
+
const manifests = new Map();
|
|
74
|
+
let disposed = false;
|
|
75
|
+
const dispose = async () => {
|
|
76
|
+
if (disposed) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
disposed = true;
|
|
80
|
+
await repoContext.dispose();
|
|
81
|
+
};
|
|
82
|
+
try {
|
|
83
|
+
const skillNames = await this.listSkillNamesFromExtractedRepo(repoContext.extractedRepoRoot);
|
|
84
|
+
for (const skillName of skillNames) {
|
|
85
|
+
try {
|
|
86
|
+
const skillDirectory = await this.resolveSkillDirectory(repoContext.extractedRepoRoot, skillName);
|
|
87
|
+
const parsedSkill = await this.parseSkillMarkdown(skillDirectory);
|
|
88
|
+
if (!parsedSkill) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
manifests.set(skillName, this.toSkillManifest(skillName, parsedSkill));
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logger.warn({
|
|
95
|
+
sourceName: this.sourceName,
|
|
96
|
+
skillName,
|
|
97
|
+
error: error instanceof Error ? error.message : String(error),
|
|
98
|
+
}, 'Failed processing Anthropic skill. Skipping.');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
manifests,
|
|
103
|
+
downloadSkill: async (skillName, targetPath) => this.downloadSkillFromExtractedRepo(skillName, targetPath, repoContext.extractedRepoRoot),
|
|
104
|
+
dispose,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
await dispose();
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async listSkillNamesFromExtractedRepo(extractedRepoRoot) {
|
|
113
|
+
const skillsRoot = (0, node_path_1.join)(extractedRepoRoot, SKILLS_DIRECTORY);
|
|
114
|
+
let entries;
|
|
115
|
+
try {
|
|
116
|
+
entries = await fs.readdir(skillsRoot, { withFileTypes: true });
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (error.code === 'ENOENT') {
|
|
120
|
+
throw new error_types_1.StorageError('Anthropic skills directory not found in repository archive.', {
|
|
121
|
+
sourceName: this.sourceName,
|
|
122
|
+
skillsRoot,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
throw new error_types_1.StorageError('Failed reading Anthropic skills directory in archive.', {
|
|
126
|
+
sourceName: this.sourceName,
|
|
127
|
+
skillsRoot,
|
|
128
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return entries
|
|
132
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
|
|
133
|
+
.map((entry) => entry.name)
|
|
134
|
+
.sort((left, right) => left.localeCompare(right));
|
|
135
|
+
}
|
|
136
|
+
toSkillManifest(skillName, parsedSkill) {
|
|
137
|
+
const frontmatter = parsedSkill.frontmatter;
|
|
138
|
+
const manifestName = this.pickString(frontmatter, ['name']) ?? skillName;
|
|
139
|
+
const displayName = this.pickString(frontmatter, ['displayName', 'display_name', 'title']);
|
|
140
|
+
const description = this.pickString(frontmatter, ['description', 'summary', 'shortDescription']) ??
|
|
141
|
+
`Skill instructions for ${skillName}`;
|
|
142
|
+
const shortDescription = this.pickString(frontmatter, [
|
|
143
|
+
'shortDescription',
|
|
144
|
+
'short_description',
|
|
145
|
+
'summary',
|
|
146
|
+
]);
|
|
147
|
+
const license = this.pickString(frontmatter, ['license']);
|
|
148
|
+
const compatibility = this.pickString(frontmatter, ['compatibility']);
|
|
149
|
+
const resources = this.pickStringArray(frontmatter, ['resources', 'references']);
|
|
150
|
+
return {
|
|
151
|
+
name: manifestName,
|
|
152
|
+
displayName,
|
|
153
|
+
description,
|
|
154
|
+
shortDescription,
|
|
155
|
+
license,
|
|
156
|
+
compatibility,
|
|
157
|
+
frontmatter,
|
|
158
|
+
instructionContent: parsedSkill.instructionContent,
|
|
159
|
+
resources,
|
|
160
|
+
sourceUrl: `${this.repoUrl}/tree/${encodeURIComponent(this.branch)}/${SKILLS_DIRECTORY}/${encodeURIComponent(skillName)}`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
exports.AnthropicSkillSource = AnthropicSkillSource;
|
|
165
|
+
exports.AnthropicSkillSource = AnthropicSkillSource = __decorate([
|
|
166
|
+
(0, common_1.Injectable)(),
|
|
167
|
+
__metadata("design:paramtypes", [])
|
|
168
|
+
], AnthropicSkillSource);
|
|
169
|
+
//# sourceMappingURL=anthropic-skill-source.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-skill-source.adapter.js","sourceRoot":"","sources":["../../../../src/modules/skills/adapters/anthropic-skill-source.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface GitHubSkillSourceBaseConfig {
|
|
2
|
+
sourceName?: string;
|
|
3
|
+
repoOwner?: string;
|
|
4
|
+
repoName?: string;
|
|
5
|
+
branch?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
userAgent?: string;
|
|
8
|
+
storageRootDir?: string;
|
|
9
|
+
githubToken?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ParsedSkillMarkdown {
|
|
12
|
+
frontmatter: Record<string, unknown>;
|
|
13
|
+
instructionContent: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ExtractedRepositoryContext {
|
|
16
|
+
extractedRepoRoot: string;
|
|
17
|
+
dispose(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export declare abstract class GitHubSkillSourceBase {
|
|
20
|
+
readonly sourceName: string;
|
|
21
|
+
readonly repoUrl: string;
|
|
22
|
+
protected readonly repoOwner: string;
|
|
23
|
+
protected readonly repoName: string;
|
|
24
|
+
protected readonly branch: string;
|
|
25
|
+
protected readonly timeoutMs: number;
|
|
26
|
+
protected readonly userAgent: string;
|
|
27
|
+
protected readonly storageRootDir: string;
|
|
28
|
+
protected readonly githubToken: string | null;
|
|
29
|
+
constructor(config?: GitHubSkillSourceBaseConfig);
|
|
30
|
+
downloadSkill(skillName: string, targetPath: string): Promise<string>;
|
|
31
|
+
getLatestCommit(): Promise<string>;
|
|
32
|
+
protected parseSkillMarkdown(skillDirectory: string): Promise<ParsedSkillMarkdown | null>;
|
|
33
|
+
protected getSkillStorageRoot(): string;
|
|
34
|
+
protected validatePathSegment(segment: string, fieldName: string): string;
|
|
35
|
+
protected pickString(frontmatter: Record<string, unknown>, keys: readonly string[]): string | undefined;
|
|
36
|
+
protected pickStringArray(frontmatter: Record<string, unknown>, keys: readonly string[]): string[];
|
|
37
|
+
protected toStringValue(value: unknown): string | undefined;
|
|
38
|
+
protected resolveSkillDirectory(extractedRepoRoot: string, skillName: string): Promise<string>;
|
|
39
|
+
protected prepareExtractedRepository(): Promise<ExtractedRepositoryContext>;
|
|
40
|
+
protected downloadSkillFromExtractedRepo(skillName: string, targetPath: string, extractedRepoRoot: string): Promise<string>;
|
|
41
|
+
private ensureRepoConfigured;
|
|
42
|
+
private getTarballUrl;
|
|
43
|
+
private buildGitHubHeaders;
|
|
44
|
+
private downloadTarball;
|
|
45
|
+
private fetchWithTimeout;
|
|
46
|
+
private cleanupTempDirectory;
|
|
47
|
+
private wrapStorageError;
|
|
48
|
+
}
|
|
@@ -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
|
+
}
|