agentinit 1.25.2 → 1.27.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/CHANGELOG.md +20 -0
- package/README.md +26 -1
- package/dist/cli.js +710 -84
- package/dist/cli.js.map +1 -1
- package/dist/commands/agentsMd.d.ts +3 -0
- package/dist/commands/agentsMd.d.ts.map +1 -0
- package/dist/commands/agentsMd.js +166 -0
- package/dist/commands/agentsMd.js.map +1 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +34 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +11 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/core/agentSettings/adapters/codex.d.ts.map +1 -1
- package/dist/core/agentSettings/adapters/codex.js +1 -0
- package/dist/core/agentSettings/adapters/codex.js.map +1 -1
- package/dist/core/agentsMdManager.d.ts +61 -0
- package/dist/core/agentsMdManager.d.ts.map +1 -0
- package/dist/core/agentsMdManager.js +204 -0
- package/dist/core/agentsMdManager.js.map +1 -0
- package/dist/core/skillsManager.d.ts +1 -0
- package/dist/core/skillsManager.d.ts.map +1 -1
- package/dist/core/skillsManager.js +66 -0
- package/dist/core/skillsManager.js.map +1 -1
- package/dist/core/wellKnownDiscovery.d.ts +22 -0
- package/dist/core/wellKnownDiscovery.d.ts.map +1 -0
- package/dist/core/wellKnownDiscovery.js +89 -0
- package/dist/core/wellKnownDiscovery.js.map +1 -0
- package/dist/types/lockfile.d.ts +1 -1
- package/dist/types/lockfile.d.ts.map +1 -1
- package/dist/types/plugins.d.ts +1 -1
- package/dist/types/plugins.d.ts.map +1 -1
- package/dist/types/skills.d.ts +4 -1
- package/dist/types/skills.d.ts.map +1 -1
- package/dist/types/skills.js.map +1 -1
- package/dist/utils/http.d.ts +15 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +31 -0
- package/dist/utils/http.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface AgentsMdSection {
|
|
2
|
+
heading: string;
|
|
3
|
+
body: string;
|
|
4
|
+
level: number;
|
|
5
|
+
}
|
|
6
|
+
export interface SetSectionOptions {
|
|
7
|
+
heading: string;
|
|
8
|
+
body: string;
|
|
9
|
+
placement?: 'append' | 'prepend' | `after ${string}`;
|
|
10
|
+
}
|
|
11
|
+
export interface RemoveSectionOptions {
|
|
12
|
+
heading: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class AgentsMdManager {
|
|
15
|
+
private projectPath;
|
|
16
|
+
constructor(projectPath: string);
|
|
17
|
+
private getAgentsMdPath;
|
|
18
|
+
private getClaudeMdPath;
|
|
19
|
+
/**
|
|
20
|
+
* Read AGENTS.md content, or null if it doesn't exist.
|
|
21
|
+
*/
|
|
22
|
+
read(): Promise<string | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Read per-agent variant (CLAUDE.md, .cursorrules, etc.), or null.
|
|
25
|
+
*/
|
|
26
|
+
readAgentFile(agentFileName: string): Promise<string | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Parse sections from markdown content.
|
|
29
|
+
* Returns array of sections with heading level, heading text, and body.
|
|
30
|
+
*/
|
|
31
|
+
parseSections(content: string): AgentsMdSection[];
|
|
32
|
+
/**
|
|
33
|
+
* Find a section by heading (case-insensitive).
|
|
34
|
+
*/
|
|
35
|
+
findSection(sections: AgentsMdSection[], heading: string): AgentsMdSection | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Set (upsert) a section in AGENTS.md.
|
|
38
|
+
* If section exists, replaces body. If not, appends (or prepends).
|
|
39
|
+
*/
|
|
40
|
+
setSection(options: SetSectionOptions): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Remove a section from AGENTS.md by heading.
|
|
43
|
+
* Returns true if section was found and removed.
|
|
44
|
+
*/
|
|
45
|
+
removeSection(options: RemoveSectionOptions): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a symlink CLAUDE.md -> AGENTS.md.
|
|
48
|
+
* Refuses to overwrite a real CLAUDE.md because it may contain user-authored rules.
|
|
49
|
+
*/
|
|
50
|
+
symlinkClaude(): Promise<void>;
|
|
51
|
+
private parseSectionRanges;
|
|
52
|
+
private findSectionRange;
|
|
53
|
+
private normalizeHeadingInput;
|
|
54
|
+
private normalizeHeading;
|
|
55
|
+
private parsePlacement;
|
|
56
|
+
private renderSection;
|
|
57
|
+
private insertSection;
|
|
58
|
+
private ensureTrailingNewline;
|
|
59
|
+
private isMissingPathError;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=agentsMdManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentsMdManager.d.ts","sourceRoot":"","sources":["../../src/core/agentsMdManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIpC;;OAEG;IACG,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIlE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE;IAQjD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAKtF;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC3D;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBpE;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBpC,OAAO,CAAC,kBAAkB;IA0B1B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,kBAAkB;CAM3B"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
import { fileExists, readFileIfExists, writeFile, createRelativeSymlink } from '../utils/fs.js';
|
|
4
|
+
export class AgentsMdManager {
|
|
5
|
+
projectPath;
|
|
6
|
+
constructor(projectPath) {
|
|
7
|
+
this.projectPath = projectPath;
|
|
8
|
+
}
|
|
9
|
+
getAgentsMdPath() {
|
|
10
|
+
return resolve(this.projectPath, 'AGENTS.md');
|
|
11
|
+
}
|
|
12
|
+
getClaudeMdPath() {
|
|
13
|
+
return resolve(this.projectPath, 'CLAUDE.md');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read AGENTS.md content, or null if it doesn't exist.
|
|
17
|
+
*/
|
|
18
|
+
async read() {
|
|
19
|
+
return readFileIfExists(this.getAgentsMdPath());
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Read per-agent variant (CLAUDE.md, .cursorrules, etc.), or null.
|
|
23
|
+
*/
|
|
24
|
+
async readAgentFile(agentFileName) {
|
|
25
|
+
return readFileIfExists(resolve(this.projectPath, agentFileName));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Parse sections from markdown content.
|
|
29
|
+
* Returns array of sections with heading level, heading text, and body.
|
|
30
|
+
*/
|
|
31
|
+
parseSections(content) {
|
|
32
|
+
return this.parseSectionRanges(content).map(({ heading, body, level }) => ({
|
|
33
|
+
heading,
|
|
34
|
+
body,
|
|
35
|
+
level,
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Find a section by heading (case-insensitive).
|
|
40
|
+
*/
|
|
41
|
+
findSection(sections, heading) {
|
|
42
|
+
const normalized = heading.trim().toLowerCase();
|
|
43
|
+
return sections.find(s => s.heading.trim().toLowerCase() === normalized);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set (upsert) a section in AGENTS.md.
|
|
47
|
+
* If section exists, replaces body. If not, appends (or prepends).
|
|
48
|
+
*/
|
|
49
|
+
async setSection(options) {
|
|
50
|
+
const agentsMdPath = this.getAgentsMdPath();
|
|
51
|
+
const heading = this.normalizeHeadingInput(options.heading);
|
|
52
|
+
const content = ((await readFileIfExists(agentsMdPath)) || '').replace(/\r\n/g, '\n');
|
|
53
|
+
const sections = this.parseSectionRanges(content);
|
|
54
|
+
const placement = this.parsePlacement(options.placement);
|
|
55
|
+
const existing = this.findSectionRange(sections, heading);
|
|
56
|
+
let newContent;
|
|
57
|
+
if (existing) {
|
|
58
|
+
newContent = `${content.slice(0, existing.start)}${this.renderSection(existing.level, existing.heading, options.body)}${content.slice(existing.end)}`;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const newSection = this.renderSection(2, heading, options.body);
|
|
62
|
+
if (placement.type === 'after') {
|
|
63
|
+
const after = this.findSectionRange(sections, placement.heading);
|
|
64
|
+
newContent = after
|
|
65
|
+
? this.insertSection(content, after.end, newSection)
|
|
66
|
+
: this.insertSection(content, content.length, newSection);
|
|
67
|
+
}
|
|
68
|
+
else if (placement.type === 'prepend') {
|
|
69
|
+
newContent = this.insertSection(content, 0, newSection);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
newContent = this.insertSection(content, content.length, newSection);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
await writeFile(agentsMdPath, this.ensureTrailingNewline(newContent));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Remove a section from AGENTS.md by heading.
|
|
79
|
+
* Returns true if section was found and removed.
|
|
80
|
+
*/
|
|
81
|
+
async removeSection(options) {
|
|
82
|
+
const agentsMdPath = this.getAgentsMdPath();
|
|
83
|
+
const content = await readFileIfExists(agentsMdPath);
|
|
84
|
+
if (!content)
|
|
85
|
+
return false;
|
|
86
|
+
const normalizedContent = content.replace(/\r\n/g, '\n');
|
|
87
|
+
const section = this.findSectionRange(this.parseSectionRanges(normalizedContent), this.normalizeHeadingInput(options.heading));
|
|
88
|
+
if (!section)
|
|
89
|
+
return false;
|
|
90
|
+
const before = normalizedContent.slice(0, section.start).trimEnd();
|
|
91
|
+
const after = normalizedContent.slice(section.end).trimStart();
|
|
92
|
+
const newContent = [before, after].filter(Boolean).join('\n');
|
|
93
|
+
await writeFile(agentsMdPath, this.ensureTrailingNewline(newContent));
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create a symlink CLAUDE.md -> AGENTS.md.
|
|
98
|
+
* Refuses to overwrite a real CLAUDE.md because it may contain user-authored rules.
|
|
99
|
+
*/
|
|
100
|
+
async symlinkClaude() {
|
|
101
|
+
const agentsMdPath = this.getAgentsMdPath();
|
|
102
|
+
const claudeMdPath = this.getClaudeMdPath();
|
|
103
|
+
if (!(await fileExists(agentsMdPath))) {
|
|
104
|
+
throw new Error('AGENTS.md does not exist. Create AGENTS.md first.');
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const stats = await fs.lstat(claudeMdPath);
|
|
108
|
+
if (!stats.isSymbolicLink()) {
|
|
109
|
+
throw new Error('CLAUDE.md already exists and is not a symlink. Move or remove it before creating the alias.');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (!this.isMissingPathError(error)) {
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const created = await createRelativeSymlink(agentsMdPath, claudeMdPath);
|
|
118
|
+
if (!created) {
|
|
119
|
+
throw new Error('Failed to create symlink from CLAUDE.md to AGENTS.md');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
parseSectionRanges(content) {
|
|
123
|
+
const sections = [];
|
|
124
|
+
const headingPattern = /^(#{1,6})[ \t]+(.+?)\s*$/gm;
|
|
125
|
+
let match;
|
|
126
|
+
while ((match = headingPattern.exec(content)) !== null) {
|
|
127
|
+
const lineEndIndex = content.indexOf('\n', match.index);
|
|
128
|
+
sections.push({
|
|
129
|
+
heading: match[2].trim(),
|
|
130
|
+
level: match[1].length,
|
|
131
|
+
start: match.index,
|
|
132
|
+
headingEnd: lineEndIndex === -1 ? content.length : lineEndIndex + 1,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return sections.map((section, index) => {
|
|
136
|
+
const nextPeerOrParent = sections.slice(index + 1).find(next => next.level <= section.level);
|
|
137
|
+
const end = nextPeerOrParent?.start ?? content.length;
|
|
138
|
+
return {
|
|
139
|
+
...section,
|
|
140
|
+
end,
|
|
141
|
+
body: content.slice(section.headingEnd, end).trimEnd(),
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
findSectionRange(sections, heading) {
|
|
146
|
+
const normalized = this.normalizeHeading(heading);
|
|
147
|
+
return sections.find(s => this.normalizeHeading(s.heading) === normalized);
|
|
148
|
+
}
|
|
149
|
+
normalizeHeadingInput(heading) {
|
|
150
|
+
const normalized = heading.trim();
|
|
151
|
+
if (!normalized || normalized.includes('\n') || normalized.includes('\r')) {
|
|
152
|
+
throw new Error('Section heading must be a single non-empty line');
|
|
153
|
+
}
|
|
154
|
+
return normalized;
|
|
155
|
+
}
|
|
156
|
+
normalizeHeading(heading) {
|
|
157
|
+
return heading.trim().toLowerCase();
|
|
158
|
+
}
|
|
159
|
+
parsePlacement(placement) {
|
|
160
|
+
if (!placement || placement === 'append') {
|
|
161
|
+
return { type: 'append' };
|
|
162
|
+
}
|
|
163
|
+
if (placement === 'prepend') {
|
|
164
|
+
return { type: 'prepend' };
|
|
165
|
+
}
|
|
166
|
+
if (placement.startsWith('after ')) {
|
|
167
|
+
return { type: 'after', heading: this.normalizeHeadingInput(placement.slice(6)) };
|
|
168
|
+
}
|
|
169
|
+
throw new Error('Placement must be "append", "prepend", or "after <heading>"');
|
|
170
|
+
}
|
|
171
|
+
renderSection(level, heading, body) {
|
|
172
|
+
const normalizedBody = body.replace(/\r\n/g, '\n').trimEnd();
|
|
173
|
+
return normalizedBody
|
|
174
|
+
? `${'#'.repeat(level)} ${heading}\n${normalizedBody}\n`
|
|
175
|
+
: `${'#'.repeat(level)} ${heading}\n`;
|
|
176
|
+
}
|
|
177
|
+
insertSection(content, index, renderedSection) {
|
|
178
|
+
const before = content.slice(0, index).trimEnd();
|
|
179
|
+
const after = content.slice(index).trimStart();
|
|
180
|
+
if (!before && !after) {
|
|
181
|
+
return renderedSection;
|
|
182
|
+
}
|
|
183
|
+
if (!before) {
|
|
184
|
+
return `${renderedSection}\n${after}`;
|
|
185
|
+
}
|
|
186
|
+
if (!after) {
|
|
187
|
+
return `${before}\n\n${renderedSection}`;
|
|
188
|
+
}
|
|
189
|
+
return `${before}\n\n${renderedSection}\n${after}`;
|
|
190
|
+
}
|
|
191
|
+
ensureTrailingNewline(content) {
|
|
192
|
+
if (!content.trim()) {
|
|
193
|
+
return '';
|
|
194
|
+
}
|
|
195
|
+
return content.endsWith('\n') ? content : `${content}\n`;
|
|
196
|
+
}
|
|
197
|
+
isMissingPathError(error) {
|
|
198
|
+
return !!error
|
|
199
|
+
&& typeof error === 'object'
|
|
200
|
+
&& 'code' in error
|
|
201
|
+
&& error.code === 'ENOENT';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=agentsMdManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentsMdManager.js","sourceRoot":"","sources":["../../src/core/agentsMdManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,6 +44,7 @@ export declare class SkillsManager {
|
|
|
44
44
|
private cleanupTempDir;
|
|
45
45
|
private resolveDiscoveryRoot;
|
|
46
46
|
private loadDiscoveredSkillsContext;
|
|
47
|
+
private loadWellKnownSkillsContext;
|
|
47
48
|
discoverFromSource(source: string, projectPath: string, options?: {
|
|
48
49
|
from?: string;
|
|
49
50
|
pluginName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillsManager.d.ts","sourceRoot":"","sources":["../../src/core/skillsManager.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAgC5B,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,sBAAsB,CAA0C;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;gBAE/C,YAAY,CAAC,EAAE,YAAY;IAIvC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"skillsManager.d.ts","sourceRoot":"","sources":["../../src/core/skillsManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,10 @@ export class SkillsManager {
|
|
|
51
51
|
if (httpSource) {
|
|
52
52
|
return httpSource;
|
|
53
53
|
}
|
|
54
|
+
// Well-known endpoint or direct URL (not a git host)
|
|
55
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
56
|
+
return { type: 'well-known', url: source };
|
|
57
|
+
}
|
|
54
58
|
// Full git URL
|
|
55
59
|
const sshSource = this.parseSshRepositorySource(source);
|
|
56
60
|
if (sshSource) {
|
|
@@ -538,6 +542,20 @@ export class SkillsManager {
|
|
|
538
542
|
cleanup,
|
|
539
543
|
};
|
|
540
544
|
}
|
|
545
|
+
if (resolved.type === 'well-known') {
|
|
546
|
+
if (!resolved.url) {
|
|
547
|
+
throw new Error(`Invalid well-known source: ${source}`);
|
|
548
|
+
}
|
|
549
|
+
const discovered = await this.loadWellKnownSkillsContext(resolved.url, projectPath);
|
|
550
|
+
return {
|
|
551
|
+
skills: discovered.skills,
|
|
552
|
+
warnings: discovered.warnings,
|
|
553
|
+
cleanup: async () => {
|
|
554
|
+
await discovered.cleanup();
|
|
555
|
+
await cleanup();
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
}
|
|
541
559
|
let repoPath;
|
|
542
560
|
if (resolved.type === 'github' || resolved.type === 'gitlab' || resolved.type === 'bitbucket') {
|
|
543
561
|
if (!resolved.url) {
|
|
@@ -579,6 +597,54 @@ export class SkillsManager {
|
|
|
579
597
|
throw error;
|
|
580
598
|
}
|
|
581
599
|
}
|
|
600
|
+
async loadWellKnownSkillsContext(source, projectPath) {
|
|
601
|
+
const { WellKnownDiscovery } = await import('./wellKnownDiscovery.js');
|
|
602
|
+
const discovery = new WellKnownDiscovery();
|
|
603
|
+
const indexSkills = await discovery.discover(source);
|
|
604
|
+
const contexts = [];
|
|
605
|
+
const skills = [];
|
|
606
|
+
const warnings = [];
|
|
607
|
+
const cleanup = async () => {
|
|
608
|
+
await Promise.all(contexts.map(context => context.cleanup().catch(() => { })));
|
|
609
|
+
contexts.length = 0;
|
|
610
|
+
};
|
|
611
|
+
try {
|
|
612
|
+
for (const indexSkill of indexSkills) {
|
|
613
|
+
const nestedSource = this.resolveSource(indexSkill.source);
|
|
614
|
+
if (nestedSource.type === 'well-known') {
|
|
615
|
+
warnings.push(`Skipped "${indexSkill.name}": well-known indexes cannot reference another well-known index`);
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
618
|
+
const context = await this.loadDiscoveredSkillsContext(indexSkill.source, projectPath);
|
|
619
|
+
contexts.push(context);
|
|
620
|
+
const exactMatches = context.skills.filter(skill => skill.name.trim().toLowerCase() === indexSkill.name.trim().toLowerCase());
|
|
621
|
+
const selectedSkills = exactMatches.length > 0
|
|
622
|
+
? exactMatches
|
|
623
|
+
: context.skills.length === 1
|
|
624
|
+
? context.skills
|
|
625
|
+
: [];
|
|
626
|
+
if (selectedSkills.length === 0) {
|
|
627
|
+
warnings.push(`Skipped "${indexSkill.name}": no matching skill found at ${indexSkill.source}`);
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
for (const skill of selectedSkills) {
|
|
631
|
+
skills.push({
|
|
632
|
+
...skill,
|
|
633
|
+
name: indexSkill.name || skill.name,
|
|
634
|
+
description: indexSkill.description || skill.description,
|
|
635
|
+
source: 'well-known',
|
|
636
|
+
...(indexSkill.author ? { author: indexSkill.author } : {}),
|
|
637
|
+
...(indexSkill.version ? { version: indexSkill.version } : {}),
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return { skills, warnings, cleanup };
|
|
642
|
+
}
|
|
643
|
+
catch (error) {
|
|
644
|
+
await cleanup();
|
|
645
|
+
throw error;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
582
648
|
async discoverFromSource(source, projectPath, options = {}) {
|
|
583
649
|
const context = await this.loadDiscoveredSkillsContext(source, projectPath, options);
|
|
584
650
|
try {
|