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.
@@ -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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"}
@@ -103,6 +103,7 @@ export declare class SkillsManager {
103
103
  private readExistingSkillSnapshot;
104
104
  private getNewSkillSnapshot;
105
105
  private compareSkillSnapshot;
106
+ private compareSkillInstallStatus;
106
107
  private cleanAndCreateDirectory;
107
108
  private isWithinPath;
108
109
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skillsManager.d.ts","sourceRoot":"","sources":["../../src/core/skillsManager.ts"],"names":[],"mappings":"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"}
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.compareSkillSnapshot(skill, plan.canonicalPath || plan.path);
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 canonical path to avoid re-comparing for multiple agents
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.canonicalPath || plan.path;
817
+ const comparisonPath = plan.path;
799
818
  let comparison = comparisonCache.get(comparisonPath);
800
819
  if (comparison === undefined) {
801
- comparison = await this.compareSkillSnapshot(skill, comparisonPath);
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
  }