agentinit 1.18.2 → 1.20.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 +24 -0
- package/README.md +30 -2
- package/dist/cli.js +1327 -442
- package/dist/cli.js.map +1 -1
- package/dist/commands/lock.d.ts +3 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +172 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +60 -0
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/rules.d.ts.map +1 -1
- package/dist/commands/rules.js +50 -0
- package/dist/commands/rules.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +283 -6
- package/dist/commands/skills.js.map +1 -1
- package/dist/core/installLock.d.ts +54 -0
- package/dist/core/installLock.d.ts.map +1 -0
- package/dist/core/installLock.js +274 -0
- package/dist/core/installLock.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 +87 -4
- package/dist/core/skillsManager.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lockfile.d.ts +67 -0
- package/dist/types/lockfile.d.ts.map +1 -0
- package/dist/types/lockfile.js +2 -0
- package/dist/types/lockfile.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { dirname, join, resolve } from 'path';
|
|
4
|
+
import { createHash, randomUUID } from 'crypto';
|
|
5
|
+
import { readFileIfExists, fileExists } from '../utils/fs.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
const LOCK_FILE = 'lock.json';
|
|
8
|
+
const GLOBAL_TARGET_KEY = '__agentinit_global__';
|
|
9
|
+
function getLockPath() {
|
|
10
|
+
return join(homedir(), '.agentinit', LOCK_FILE);
|
|
11
|
+
}
|
|
12
|
+
function getEntryTargetKey(entry) {
|
|
13
|
+
return entry.scope === 'global' ? GLOBAL_TARGET_KEY : entry.projectPath;
|
|
14
|
+
}
|
|
15
|
+
function createEntry(base) {
|
|
16
|
+
return {
|
|
17
|
+
id: randomUUID(),
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
...base,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function sanitizeUrlForLock(url) {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = new URL(url);
|
|
25
|
+
parsed.username = '';
|
|
26
|
+
parsed.password = '';
|
|
27
|
+
parsed.search = '';
|
|
28
|
+
parsed.hash = '';
|
|
29
|
+
return parsed.toString();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return url.split(/[?#]/)[0] || url;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function getLockEntryTargetLabel(entry) {
|
|
36
|
+
return entry.scope === 'global' ? 'Global scope' : entry.projectPath;
|
|
37
|
+
}
|
|
38
|
+
export function logLockWriteWarning(context, error) {
|
|
39
|
+
const detail = error instanceof Error ? error.message : 'unknown error';
|
|
40
|
+
logger.warn(`${context}, but failed to update the install lock: ${detail}`);
|
|
41
|
+
}
|
|
42
|
+
export async function hashDirectory(rootPath) {
|
|
43
|
+
if (!(await fileExists(rootPath)))
|
|
44
|
+
return null;
|
|
45
|
+
const hash = createHash('sha256');
|
|
46
|
+
const walk = async (currentPath, relativePath) => {
|
|
47
|
+
const stat = await fs.stat(currentPath);
|
|
48
|
+
if (stat.isDirectory()) {
|
|
49
|
+
hash.update(`dir:${relativePath}\n`);
|
|
50
|
+
const entries = await fs.readdir(currentPath);
|
|
51
|
+
entries.sort();
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
await walk(join(currentPath, entry), `${relativePath}/${entry}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const content = await fs.readFile(currentPath);
|
|
58
|
+
hash.update(`file:${relativePath}\n`);
|
|
59
|
+
hash.update(content);
|
|
60
|
+
hash.update('\n');
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
await walk(rootPath, '.');
|
|
64
|
+
return hash.digest('hex');
|
|
65
|
+
}
|
|
66
|
+
export class InstallLock {
|
|
67
|
+
state = null;
|
|
68
|
+
async load() {
|
|
69
|
+
if (this.state)
|
|
70
|
+
return this.state;
|
|
71
|
+
const content = await readFileIfExists(getLockPath());
|
|
72
|
+
if (!content) {
|
|
73
|
+
this.state = { version: 1, entries: [] };
|
|
74
|
+
return this.state;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(content);
|
|
78
|
+
if (parsed?.version === 1 && Array.isArray(parsed.entries)) {
|
|
79
|
+
this.state = parsed;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.state = { version: 1, entries: [] };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
this.state = { version: 1, entries: [] };
|
|
87
|
+
}
|
|
88
|
+
return this.state;
|
|
89
|
+
}
|
|
90
|
+
async save() {
|
|
91
|
+
if (!this.state)
|
|
92
|
+
return;
|
|
93
|
+
const lockPath = getLockPath();
|
|
94
|
+
await fs.mkdir(dirname(lockPath), { recursive: true });
|
|
95
|
+
await fs.writeFile(lockPath, JSON.stringify(this.state, null, 2) + '\n', {
|
|
96
|
+
encoding: 'utf8',
|
|
97
|
+
mode: 0o600,
|
|
98
|
+
});
|
|
99
|
+
await fs.chmod(lockPath, 0o600).catch(() => { });
|
|
100
|
+
}
|
|
101
|
+
async recordSkill(params) {
|
|
102
|
+
const state = await this.load();
|
|
103
|
+
const metadata = {
|
|
104
|
+
kind: 'skill',
|
|
105
|
+
installPath: params.installPath,
|
|
106
|
+
...(params.canonicalPath ? { canonicalPath: params.canonicalPath } : {}),
|
|
107
|
+
mode: params.mode,
|
|
108
|
+
};
|
|
109
|
+
const entry = createEntry({
|
|
110
|
+
kind: 'skill',
|
|
111
|
+
action: params.action,
|
|
112
|
+
name: params.name,
|
|
113
|
+
projectPath: resolve(params.projectPath),
|
|
114
|
+
agents: params.agents,
|
|
115
|
+
scope: params.scope,
|
|
116
|
+
source: params.source,
|
|
117
|
+
...(params.contentHash ? { contentHash: params.contentHash } : {}),
|
|
118
|
+
metadata,
|
|
119
|
+
});
|
|
120
|
+
state.entries.push(entry);
|
|
121
|
+
await this.save();
|
|
122
|
+
return entry;
|
|
123
|
+
}
|
|
124
|
+
async recordMcp(params) {
|
|
125
|
+
const state = await this.load();
|
|
126
|
+
const metadata = {
|
|
127
|
+
kind: 'mcp',
|
|
128
|
+
configPath: params.configPath,
|
|
129
|
+
serverType: params.serverType,
|
|
130
|
+
...(params.command ? { command: params.command } : {}),
|
|
131
|
+
...(params.url ? { url: sanitizeUrlForLock(params.url) } : {}),
|
|
132
|
+
};
|
|
133
|
+
const entry = createEntry({
|
|
134
|
+
kind: 'mcp',
|
|
135
|
+
action: params.action,
|
|
136
|
+
name: params.name,
|
|
137
|
+
projectPath: resolve(params.projectPath),
|
|
138
|
+
agents: params.agents,
|
|
139
|
+
scope: params.scope,
|
|
140
|
+
source: params.source,
|
|
141
|
+
metadata,
|
|
142
|
+
});
|
|
143
|
+
state.entries.push(entry);
|
|
144
|
+
await this.save();
|
|
145
|
+
return entry;
|
|
146
|
+
}
|
|
147
|
+
async recordRules(params) {
|
|
148
|
+
const state = await this.load();
|
|
149
|
+
const metadata = {
|
|
150
|
+
kind: 'rules',
|
|
151
|
+
configPath: params.configPath,
|
|
152
|
+
templateIds: params.templateIds,
|
|
153
|
+
ruleCount: params.ruleCount,
|
|
154
|
+
};
|
|
155
|
+
const entry = createEntry({
|
|
156
|
+
kind: 'rules',
|
|
157
|
+
action: params.action,
|
|
158
|
+
name: params.name,
|
|
159
|
+
projectPath: resolve(params.projectPath),
|
|
160
|
+
agents: params.agents,
|
|
161
|
+
scope: params.scope,
|
|
162
|
+
source: params.source,
|
|
163
|
+
metadata,
|
|
164
|
+
});
|
|
165
|
+
state.entries.push(entry);
|
|
166
|
+
await this.save();
|
|
167
|
+
return entry;
|
|
168
|
+
}
|
|
169
|
+
async query(options = {}) {
|
|
170
|
+
const state = await this.load();
|
|
171
|
+
return state.entries.filter(entry => {
|
|
172
|
+
if (options.kind && entry.kind !== options.kind)
|
|
173
|
+
return false;
|
|
174
|
+
if (options.name && entry.name.toLowerCase() !== options.name.toLowerCase())
|
|
175
|
+
return false;
|
|
176
|
+
if (options.projectPath && entry.projectPath !== resolve(options.projectPath))
|
|
177
|
+
return false;
|
|
178
|
+
if (options.agent && !entry.agents.includes(options.agent))
|
|
179
|
+
return false;
|
|
180
|
+
if (options.scope && entry.scope !== options.scope)
|
|
181
|
+
return false;
|
|
182
|
+
if (options.action && entry.action !== options.action)
|
|
183
|
+
return false;
|
|
184
|
+
return true;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async getCurrentState(options = {}) {
|
|
188
|
+
const entries = await this.query(options);
|
|
189
|
+
const groups = new Map();
|
|
190
|
+
for (const entry of entries) {
|
|
191
|
+
const key = this.getCurrentStateKey(entry);
|
|
192
|
+
groups.set(key, entry);
|
|
193
|
+
}
|
|
194
|
+
return [...groups.values()].filter(e => e.action !== 'remove');
|
|
195
|
+
}
|
|
196
|
+
getCurrentStateKey(entry) {
|
|
197
|
+
const agents = [...entry.agents].sort().join(',');
|
|
198
|
+
return [
|
|
199
|
+
entry.kind,
|
|
200
|
+
entry.name.toLowerCase(),
|
|
201
|
+
getEntryTargetKey(entry),
|
|
202
|
+
entry.scope,
|
|
203
|
+
agents,
|
|
204
|
+
this.getLocationKey(entry),
|
|
205
|
+
].join(':');
|
|
206
|
+
}
|
|
207
|
+
getLocationKey(entry) {
|
|
208
|
+
switch (entry.metadata.kind) {
|
|
209
|
+
case 'skill':
|
|
210
|
+
return entry.metadata.canonicalPath || entry.metadata.installPath;
|
|
211
|
+
case 'mcp':
|
|
212
|
+
return entry.metadata.configPath;
|
|
213
|
+
case 'rules':
|
|
214
|
+
return `${entry.metadata.configPath}:${entry.metadata.templateIds.join(',')}`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async getProjectPaths() {
|
|
218
|
+
const state = await this.load();
|
|
219
|
+
return [...new Set(state.entries
|
|
220
|
+
.filter(entry => entry.scope === 'project')
|
|
221
|
+
.map(entry => entry.projectPath))];
|
|
222
|
+
}
|
|
223
|
+
async findProjectsWithSkill(skillName) {
|
|
224
|
+
return this.getCurrentState({ kind: 'skill', name: skillName });
|
|
225
|
+
}
|
|
226
|
+
async findStaleProjects() {
|
|
227
|
+
const projectPaths = await this.getProjectPaths();
|
|
228
|
+
const stale = [];
|
|
229
|
+
for (const projectPath of projectPaths) {
|
|
230
|
+
if (!(await fileExists(projectPath))) {
|
|
231
|
+
stale.push(projectPath);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return stale;
|
|
235
|
+
}
|
|
236
|
+
async pruneStaleEntries() {
|
|
237
|
+
const stale = await this.findStaleProjects();
|
|
238
|
+
let entriesRemoved = 0;
|
|
239
|
+
if (stale.length === 0) {
|
|
240
|
+
return { prunedProjects: [], entriesRemoved: 0 };
|
|
241
|
+
}
|
|
242
|
+
const state = await this.load();
|
|
243
|
+
const staleSet = new Set(stale);
|
|
244
|
+
const before = state.entries.length;
|
|
245
|
+
state.entries = state.entries.filter(e => !staleSet.has(e.projectPath));
|
|
246
|
+
entriesRemoved = before - state.entries.length;
|
|
247
|
+
if (entriesRemoved > 0) {
|
|
248
|
+
await this.save();
|
|
249
|
+
}
|
|
250
|
+
return { prunedProjects: stale, entriesRemoved };
|
|
251
|
+
}
|
|
252
|
+
async checkDrift(entry) {
|
|
253
|
+
if (!entry.contentHash) {
|
|
254
|
+
return { entry, status: 'match' };
|
|
255
|
+
}
|
|
256
|
+
if (entry.metadata.kind !== 'skill') {
|
|
257
|
+
return { entry, status: 'match' };
|
|
258
|
+
}
|
|
259
|
+
const installPath = entry.metadata.installPath;
|
|
260
|
+
if (!(await fileExists(installPath))) {
|
|
261
|
+
return { entry, status: 'missing' };
|
|
262
|
+
}
|
|
263
|
+
const currentHash = await hashDirectory(installPath);
|
|
264
|
+
if (!currentHash) {
|
|
265
|
+
return { entry, status: 'missing' };
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
entry,
|
|
269
|
+
status: currentHash === entry.contentHash ? 'match' : 'drift',
|
|
270
|
+
currentHash,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=installLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installLock.js","sourceRoot":"","sources":["../../src/core/installLock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillsManager.d.ts","sourceRoot":"","sources":["../../src/core/skillsManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skillsManager.d.ts","sourceRoot":"","sources":["../../src/core/skillsManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,11 @@ import { createHash } from 'crypto';
|
|
|
6
6
|
import { promisify } from 'util';
|
|
7
7
|
import matter from 'gray-matter';
|
|
8
8
|
import { createRelativeSymlink, fileExists, isDirectory, listFiles, readFileIfExists, resolveRealPathOrSelf, } from '../utils/fs.js';
|
|
9
|
+
import { expandTilde } from '../utils/paths.js';
|
|
9
10
|
import { AgentManager } from './agentManager.js';
|
|
10
11
|
import { getConfiguredDefaultMarketplaceId, getMarketplace, getMarketplaceIds } from './marketplaceRegistry.js';
|
|
11
12
|
import { SHARED_SKILLS_TARGET_ID } from '../types/skills.js';
|
|
13
|
+
import { InstallLock, hashDirectory, logLockWriteWarning } from './installLock.js';
|
|
12
14
|
const execFileAsync = promisify(execFile);
|
|
13
15
|
const DEFAULT_SKILLS_CATALOG = {
|
|
14
16
|
owner: 'vercel-labs',
|
|
@@ -543,7 +545,7 @@ export class SkillsManager {
|
|
|
543
545
|
...(options.global !== undefined ? { global: options.global } : {}),
|
|
544
546
|
...(options.copy !== undefined ? { copy: options.copy } : {}),
|
|
545
547
|
});
|
|
546
|
-
return this.
|
|
548
|
+
return this.compareSkillInstallStatus(skill, plan);
|
|
547
549
|
}
|
|
548
550
|
async installSkillForAgent(skillPath, skillName, agent, projectPath, options = {}) {
|
|
549
551
|
const plan = await this.getInstallPlan(skillName, agent, projectPath, options);
|
|
@@ -693,6 +695,23 @@ export class SkillsManager {
|
|
|
693
695
|
return 'new';
|
|
694
696
|
return existing === incoming ? 'unchanged' : 'changed';
|
|
695
697
|
}
|
|
698
|
+
async compareSkillInstallStatus(skill, plan) {
|
|
699
|
+
const incoming = await this.getNewSkillSnapshot(skill);
|
|
700
|
+
if (incoming === null)
|
|
701
|
+
return 'new';
|
|
702
|
+
const existingAtTarget = await this.readExistingSkillSnapshot(plan.path);
|
|
703
|
+
if (existingAtTarget !== null) {
|
|
704
|
+
return existingAtTarget === incoming ? 'unchanged' : 'changed';
|
|
705
|
+
}
|
|
706
|
+
if (!plan.canonicalPath || plan.canonicalPath === plan.path) {
|
|
707
|
+
return 'new';
|
|
708
|
+
}
|
|
709
|
+
const existingAtCanonical = await this.readExistingSkillSnapshot(plan.canonicalPath);
|
|
710
|
+
if (existingAtCanonical === null) {
|
|
711
|
+
return 'new';
|
|
712
|
+
}
|
|
713
|
+
return existingAtCanonical === incoming ? 'new' : 'changed';
|
|
714
|
+
}
|
|
696
715
|
async cleanAndCreateDirectory(path) {
|
|
697
716
|
await fs.rm(path, { recursive: true, force: true }).catch(() => { });
|
|
698
717
|
await fs.mkdir(path, { recursive: true });
|
|
@@ -740,7 +759,7 @@ export class SkillsManager {
|
|
|
740
759
|
}
|
|
741
760
|
const result = { installed: [], updated: [], unchanged: [], skipped: [], warnings: context.warnings };
|
|
742
761
|
const installableAgents = [];
|
|
743
|
-
// Cache comparison results by
|
|
762
|
+
// Cache comparison results by install path to avoid re-comparing the same target
|
|
744
763
|
const comparisonCache = new Map();
|
|
745
764
|
// Collect pending updates to prompt user once for all of them
|
|
746
765
|
const pendingUpdates = [];
|
|
@@ -795,10 +814,10 @@ export class SkillsManager {
|
|
|
795
814
|
...(options.copy !== undefined ? { copy: options.copy } : {}),
|
|
796
815
|
};
|
|
797
816
|
const plan = await this.getInstallPlan(skill.name, agent, projectPath, installOptions);
|
|
798
|
-
const comparisonPath = plan.
|
|
817
|
+
const comparisonPath = plan.path;
|
|
799
818
|
let comparison = comparisonCache.get(comparisonPath);
|
|
800
819
|
if (comparison === undefined) {
|
|
801
|
-
comparison = await this.
|
|
820
|
+
comparison = await this.compareSkillInstallStatus(skill, plan);
|
|
802
821
|
comparisonCache.set(comparisonPath, comparison);
|
|
803
822
|
}
|
|
804
823
|
if (comparison === 'unchanged') {
|
|
@@ -857,6 +876,45 @@ export class SkillsManager {
|
|
|
857
876
|
}
|
|
858
877
|
}
|
|
859
878
|
}
|
|
879
|
+
// Record to global install lock
|
|
880
|
+
try {
|
|
881
|
+
const lock = new InstallLock();
|
|
882
|
+
const fromOption = options.from;
|
|
883
|
+
const { source: resolvedSource } = this.resolveSourceRequest(source, ...(fromOption ? [{ from: fromOption }] : []));
|
|
884
|
+
const lockSource = {
|
|
885
|
+
type: resolvedSource.type,
|
|
886
|
+
...(resolvedSource.marketplace ? { marketplace: resolvedSource.marketplace } : {}),
|
|
887
|
+
...(resolvedSource.pluginName ? { pluginName: resolvedSource.pluginName } : {}),
|
|
888
|
+
...(resolvedSource.url ? { url: resolvedSource.url } : {}),
|
|
889
|
+
...(resolvedSource.path ? { path: resolve(projectPath, expandTilde(resolvedSource.path)) } : {}),
|
|
890
|
+
...(resolvedSource.owner ? { owner: resolvedSource.owner } : {}),
|
|
891
|
+
...(resolvedSource.repo ? { repo: resolvedSource.repo } : {}),
|
|
892
|
+
...(resolvedSource.subpath ? { subpath: resolvedSource.subpath } : {}),
|
|
893
|
+
};
|
|
894
|
+
const recordEntries = async (entries, action) => {
|
|
895
|
+
for (const entry of entries) {
|
|
896
|
+
const hashPath = entry.canonicalPath || entry.path;
|
|
897
|
+
const contentHash = await hashDirectory(hashPath);
|
|
898
|
+
await lock.recordSkill({
|
|
899
|
+
action,
|
|
900
|
+
name: entry.skill.name,
|
|
901
|
+
projectPath: resolve(projectPath),
|
|
902
|
+
agents: [entry.agent],
|
|
903
|
+
scope: options.global ? 'global' : 'project',
|
|
904
|
+
source: lockSource,
|
|
905
|
+
installPath: entry.path,
|
|
906
|
+
mode: entry.mode,
|
|
907
|
+
...(entry.canonicalPath ? { canonicalPath: entry.canonicalPath } : {}),
|
|
908
|
+
...(contentHash ? { contentHash } : {}),
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
await recordEntries(result.installed, 'install');
|
|
913
|
+
await recordEntries(result.updated, 'update');
|
|
914
|
+
}
|
|
915
|
+
catch (error) {
|
|
916
|
+
logLockWriteWarning('Skills changed successfully', error);
|
|
917
|
+
}
|
|
860
918
|
return result;
|
|
861
919
|
}
|
|
862
920
|
finally {
|
|
@@ -1060,6 +1118,31 @@ export class SkillsManager {
|
|
|
1060
1118
|
notFound.push(name);
|
|
1061
1119
|
}
|
|
1062
1120
|
}
|
|
1121
|
+
// Record removals to global install lock
|
|
1122
|
+
try {
|
|
1123
|
+
if (targetedEntries.length > 0) {
|
|
1124
|
+
const lock = new InstallLock();
|
|
1125
|
+
for (const entry of targetedEntries) {
|
|
1126
|
+
const entryKey = `${entry.agent}:${entry.name}`;
|
|
1127
|
+
if (!removed.includes(entryKey))
|
|
1128
|
+
continue;
|
|
1129
|
+
await lock.recordSkill({
|
|
1130
|
+
action: 'remove',
|
|
1131
|
+
name: entry.name,
|
|
1132
|
+
projectPath: resolve(projectPath),
|
|
1133
|
+
agents: [entry.agent],
|
|
1134
|
+
scope: entry.scope,
|
|
1135
|
+
source: { type: 'local', path: entry.path },
|
|
1136
|
+
installPath: entry.path,
|
|
1137
|
+
mode: entry.mode,
|
|
1138
|
+
...(entry.canonicalPath ? { canonicalPath: entry.canonicalPath } : {}),
|
|
1139
|
+
});
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
catch (error) {
|
|
1144
|
+
logLockWriteWarning('Skills removed successfully', error);
|
|
1145
|
+
}
|
|
1063
1146
|
return { removed, notFound, skipped };
|
|
1064
1147
|
}
|
|
1065
1148
|
}
|