@agents-dev/cli 0.8.0 → 0.8.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.
Files changed (55) hide show
  1. package/AGENTS.md +36 -0
  2. package/CHANGELOG.md +47 -0
  3. package/README.md +305 -67
  4. package/dist/cli.js +36 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/doctor.js +22 -13
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/init.js +7 -1
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/start.js +4 -4
  11. package/dist/commands/start.js.map +1 -1
  12. package/dist/commands/status.js +46 -22
  13. package/dist/commands/status.js.map +1 -1
  14. package/dist/commands/update.d.ts +6 -0
  15. package/dist/commands/update.js +42 -0
  16. package/dist/commands/update.js.map +1 -0
  17. package/dist/core/antigravity.d.ts +10 -0
  18. package/dist/core/antigravity.js +52 -0
  19. package/dist/core/antigravity.js.map +1 -0
  20. package/dist/core/config.js +2 -2
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/mcp.js +5 -1
  23. package/dist/core/mcp.js.map +1 -1
  24. package/dist/core/mcpCrud.js +2 -1
  25. package/dist/core/mcpCrud.js.map +1 -1
  26. package/dist/core/project.d.ts +1 -0
  27. package/dist/core/project.js +5 -2
  28. package/dist/core/project.js.map +1 -1
  29. package/dist/core/shell.d.ts +1 -0
  30. package/dist/core/shell.js +17 -4
  31. package/dist/core/shell.js.map +1 -1
  32. package/dist/core/skills.js +1 -1
  33. package/dist/core/skills.js.map +1 -1
  34. package/dist/core/sync.js +55 -6
  35. package/dist/core/sync.js.map +1 -1
  36. package/dist/core/templates.d.ts +4 -1
  37. package/dist/core/templates.js +12 -3
  38. package/dist/core/templates.js.map +1 -1
  39. package/dist/core/updateCheck.d.ts +24 -0
  40. package/dist/core/updateCheck.js +227 -0
  41. package/dist/core/updateCheck.js.map +1 -0
  42. package/dist/core/version.d.ts +1 -0
  43. package/dist/core/version.js +2 -0
  44. package/dist/core/version.js.map +1 -0
  45. package/dist/core/windsurfPaths.d.ts +8 -0
  46. package/dist/core/windsurfPaths.js +43 -0
  47. package/dist/core/windsurfPaths.js.map +1 -0
  48. package/dist/integrations/windsurf.d.ts +9 -0
  49. package/dist/integrations/windsurf.js +17 -0
  50. package/dist/integrations/windsurf.js.map +1 -0
  51. package/dist/types.d.ts +9 -0
  52. package/docs/EXAMPLES.md +2 -29
  53. package/docs/agents-system.md +4 -2
  54. package/docs/screenshot.jpg +0 -0
  55. package/package.json +3 -1
@@ -0,0 +1,227 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { pathExists, readJson, writeJsonAtomic } from './fs.js';
4
+ import { getProjectPaths } from './paths.js';
5
+ import * as ui from './ui.js';
6
+ const NPM_LATEST_URL = 'https://registry.npmjs.org/@agents-dev/cli/latest';
7
+ const DEFAULT_TIMEOUT_MS = 1500;
8
+ const STARTUP_RECHECK_MS = 6 * 60 * 60 * 1000;
9
+ export const UPGRADE_COMMAND = 'npm install -g @agents-dev/cli@latest';
10
+ export async function checkForUpdates(options) {
11
+ const now = new Date();
12
+ const nowIso = now.toISOString();
13
+ const timeoutMs = normalizeTimeout(options.timeoutMs);
14
+ const storage = await loadStorageState(options.projectRoot);
15
+ const metadata = readUpdateMetadata(storage.document);
16
+ const channel = resolveUpdateChannel();
17
+ if (!channel.ok) {
18
+ metadata.lastSeenVersion = options.currentVersion;
19
+ writeUpdateMetadata(storage.document, storage.kind, metadata);
20
+ await writeJsonAtomic(storage.filePath, storage.document);
21
+ return {
22
+ currentVersion: options.currentVersion,
23
+ latestVersion: normalizeVersion(metadata.latestVersion),
24
+ isOutdated: false,
25
+ upgradeCommand: UPGRADE_COMMAND,
26
+ checkedAt: metadata.lastCheckedAt ?? nowIso,
27
+ source: 'unavailable',
28
+ error: channel.error
29
+ };
30
+ }
31
+ let source = 'cache';
32
+ let latestVersion = normalizeVersion(metadata.latestVersion);
33
+ let errorMessage;
34
+ const shouldRefresh = options.forceRefresh === true || !isRecent(metadata.lastCheckedAt, STARTUP_RECHECK_MS);
35
+ if (!latestVersion || shouldRefresh) {
36
+ const fetched = await fetchLatestVersion(timeoutMs);
37
+ if (fetched.version) {
38
+ latestVersion = fetched.version;
39
+ metadata.latestVersion = fetched.version;
40
+ metadata.lastCheckedAt = nowIso;
41
+ source = 'network';
42
+ }
43
+ else if (latestVersion) {
44
+ source = 'cache-stale';
45
+ errorMessage = fetched.error;
46
+ }
47
+ else {
48
+ source = 'unavailable';
49
+ errorMessage = fetched.error;
50
+ }
51
+ }
52
+ metadata.lastSeenVersion = options.currentVersion;
53
+ const isOutdated = compareVersions(options.currentVersion, latestVersion) < 0;
54
+ if (isOutdated && options.markNotifiedIfOutdated) {
55
+ metadata.lastNotifiedAt = nowIso;
56
+ }
57
+ writeUpdateMetadata(storage.document, storage.kind, metadata);
58
+ await writeJsonAtomic(storage.filePath, storage.document);
59
+ return {
60
+ currentVersion: options.currentVersion,
61
+ latestVersion,
62
+ isOutdated,
63
+ upgradeCommand: UPGRADE_COMMAND,
64
+ checkedAt: metadata.lastCheckedAt ?? nowIso,
65
+ source,
66
+ error: errorMessage
67
+ };
68
+ }
69
+ export async function maybeNotifyAboutUpdate(args) {
70
+ try {
71
+ const status = await checkForUpdates({
72
+ currentVersion: args.currentVersion,
73
+ projectRoot: args.projectRoot,
74
+ markNotifiedIfOutdated: true
75
+ });
76
+ if (!status.isOutdated || !status.latestVersion)
77
+ return;
78
+ ui.blank();
79
+ ui.warning(`Update available: ${status.currentVersion} -> ${status.latestVersion}`);
80
+ ui.hint(`Run "${status.upgradeCommand}"`);
81
+ }
82
+ catch {
83
+ // Update checks should never block command execution.
84
+ }
85
+ }
86
+ async function loadStorageState(projectRoot) {
87
+ const projectLocalPath = projectRoot ? getProjectPaths(projectRoot).agentsLocal : undefined;
88
+ if (projectLocalPath && (await pathExists(projectLocalPath))) {
89
+ return {
90
+ kind: 'project-local',
91
+ filePath: projectLocalPath,
92
+ document: await readDocument(projectLocalPath)
93
+ };
94
+ }
95
+ const globalPath = path.join(os.homedir(), '.agents-dev', 'update-check.json');
96
+ return {
97
+ kind: 'global',
98
+ filePath: globalPath,
99
+ document: await readDocument(globalPath)
100
+ };
101
+ }
102
+ async function readDocument(filePath) {
103
+ if (!(await pathExists(filePath)))
104
+ return {};
105
+ try {
106
+ const parsed = await readJson(filePath);
107
+ return typeof parsed === 'object' && parsed !== null ? parsed : {};
108
+ }
109
+ catch {
110
+ return {};
111
+ }
112
+ }
113
+ function readUpdateMetadata(document) {
114
+ const meta = asObject(document.meta);
115
+ const updateCheck = asObject(meta?.updateCheck);
116
+ return {
117
+ lastCheckedAt: asString(updateCheck?.lastCheckedAt),
118
+ lastSeenVersion: asString(updateCheck?.lastSeenVersion),
119
+ lastNotifiedAt: asString(updateCheck?.lastNotifiedAt),
120
+ latestVersion: asString(updateCheck?.latestVersion)
121
+ };
122
+ }
123
+ function writeUpdateMetadata(document, kind, metadata) {
124
+ if (kind === 'project-local' && !asObject(document.mcpServers)) {
125
+ document.mcpServers = {};
126
+ }
127
+ const meta = asObject(document.meta) ?? {};
128
+ meta.updateCheck = {
129
+ ...(asObject(meta.updateCheck) ?? {}),
130
+ ...metadata
131
+ };
132
+ document.meta = meta;
133
+ }
134
+ async function fetchLatestVersion(timeoutMs) {
135
+ const controller = new AbortController();
136
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
137
+ try {
138
+ const response = await fetch(NPM_LATEST_URL, {
139
+ headers: { Accept: 'application/json' },
140
+ signal: controller.signal
141
+ });
142
+ if (!response.ok) {
143
+ return { version: null, error: `registry request failed (${response.status})` };
144
+ }
145
+ const payload = await response.json();
146
+ const version = normalizeVersion(typeof payload.version === 'string' ? payload.version : null);
147
+ if (!version) {
148
+ return { version: null, error: 'invalid registry response' };
149
+ }
150
+ return { version };
151
+ }
152
+ catch (error) {
153
+ const message = error instanceof Error ? error.message : String(error);
154
+ return { version: null, error: message };
155
+ }
156
+ finally {
157
+ clearTimeout(timeout);
158
+ }
159
+ }
160
+ function normalizeTimeout(input) {
161
+ if (!Number.isFinite(input))
162
+ return DEFAULT_TIMEOUT_MS;
163
+ if (!input || input <= 0)
164
+ return DEFAULT_TIMEOUT_MS;
165
+ return Math.floor(input);
166
+ }
167
+ function isRecent(value, thresholdMs) {
168
+ if (!value)
169
+ return false;
170
+ const parsed = Date.parse(value);
171
+ if (!Number.isFinite(parsed))
172
+ return false;
173
+ return Date.now() - parsed <= thresholdMs;
174
+ }
175
+ function normalizeVersion(value) {
176
+ if (!value)
177
+ return null;
178
+ const trimmed = value.trim();
179
+ if (!trimmed)
180
+ return null;
181
+ return trimmed.startsWith('v') ? trimmed.slice(1) : trimmed;
182
+ }
183
+ function compareVersions(current, latest) {
184
+ if (!latest)
185
+ return 0;
186
+ const a = parseSemver(current);
187
+ const b = parseSemver(latest);
188
+ if (!a || !b)
189
+ return 0;
190
+ for (let i = 0; i < 3; i += 1) {
191
+ if (a[i] === b[i])
192
+ continue;
193
+ return a[i] < b[i] ? -1 : 1;
194
+ }
195
+ return 0;
196
+ }
197
+ function parseSemver(value) {
198
+ const match = value.trim().match(/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/);
199
+ if (!match)
200
+ return null;
201
+ const major = Number.parseInt(match[1], 10);
202
+ const minor = Number.parseInt(match[2], 10);
203
+ const patch = Number.parseInt(match[3], 10);
204
+ if (![major, minor, patch].every((part) => Number.isInteger(part))) {
205
+ return null;
206
+ }
207
+ return [major, minor, patch];
208
+ }
209
+ function asObject(value) {
210
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
211
+ return undefined;
212
+ return value;
213
+ }
214
+ function asString(value) {
215
+ return typeof value === 'string' ? value : undefined;
216
+ }
217
+ function resolveUpdateChannel() {
218
+ const raw = (process.env.AGENTS_UPDATE_CHANNEL ?? 'stable').trim().toLowerCase();
219
+ if (!raw || raw === 'stable') {
220
+ return { ok: true, value: 'stable' };
221
+ }
222
+ return {
223
+ ok: false,
224
+ error: `unsupported update channel "${raw}" (only "stable" is currently supported)`
225
+ };
226
+ }
227
+ //# sourceMappingURL=updateCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/core/updateCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,MAAM,cAAc,GAAG,mDAAmD,CAAA;AAC1E,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAC/B,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,uCAAuC,CAAA;AA6BtE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IACnE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAA;IAEtC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAA;QACjD,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC7D,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;QACzD,OAAO;YACL,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC;YACvD,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,eAAe;YAC/B,SAAS,EAAE,QAAQ,CAAC,aAAa,IAAI,MAAM;YAC3C,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAA;IACH,CAAC;IAED,IAAI,MAAM,GAAiB,OAAO,CAAA;IAClC,IAAI,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAC5D,IAAI,YAAgC,CAAA;IAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAA;IAC5G,IAAI,CAAC,aAAa,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAA;QACnD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,aAAa,GAAG,OAAO,CAAC,OAAO,CAAA;YAC/B,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAA;YACxC,QAAQ,CAAC,aAAa,GAAG,MAAM,CAAA;YAC/B,MAAM,GAAG,SAAS,CAAA;QACpB,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,MAAM,GAAG,aAAa,CAAA;YACtB,YAAY,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,aAAa,CAAA;YACtB,YAAY,GAAG,OAAO,CAAC,KAAK,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAA;IACjD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IAC7E,IAAI,UAAU,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACjD,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAA;IAClC,CAAC;IACD,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7D,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEzD,OAAO;QACL,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,aAAa;QACb,UAAU;QACV,cAAc,EAAE,eAAe;QAC/B,SAAS,EAAE,QAAQ,CAAC,aAAa,IAAI,MAAM;QAC3C,MAAM;QACN,KAAK,EAAE,YAAY;KACpB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAG5C;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAM;QAEvD,EAAE,CAAC,KAAK,EAAE,CAAA;QACV,EAAE,CAAC,OAAO,CAAC,qBAAqB,MAAM,CAAC,cAAc,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;QACnF,EAAE,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,cAAc,GAAG,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,WAA+B;IAC7D,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3F,IAAI,gBAAgB,IAAI,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,MAAM,YAAY,CAAC,gBAAgB,CAAC;SAC/C,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAA;IAC9E,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,MAAM,YAAY,CAAC,UAAU,CAAC;KACzC,CAAA;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAA0B,QAAQ,CAAC,CAAA;QAChE,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAiC;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAC/C,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;QACnD,eAAe,EAAE,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;QACvD,cAAc,EAAE,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;QACrD,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;KACpD,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAiC,EACjC,IAAiB,EACjB,QAA6B;IAE7B,IAAI,IAAI,KAAK,eAAe,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,QAAQ,CAAC,UAAU,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAC1C,IAAI,CAAC,WAAW,GAAG;QACjB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACrC,GAAG,QAAQ;KACZ,CAAA;IACD,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YAC3C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,4BAA4B,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAA;QACjF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA2B,CAAA;QAC9D,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC9F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAA;QAC9D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IAC1C,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAA;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,kBAAkB,CAAA;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAyB,EAAE,WAAmB;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,IAAI,WAAW,CAAA;AAC3C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IACzB,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,MAAqB;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAA;IACrB,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,SAAQ;QAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACtE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3C,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACzF,OAAO,KAAgC,CAAA;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChF,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;IACtC,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,+BAA+B,GAAG,0CAA0C;KACpF,CAAA;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const CLI_VERSION = "0.8.2";
@@ -0,0 +1,2 @@
1
+ export const CLI_VERSION = '0.8.2';
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/core/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAA"}
@@ -0,0 +1,8 @@
1
+ export interface WindsurfMcpPathResolution {
2
+ configPath: string;
3
+ source: 'env' | 'existing-modern' | 'existing-legacy' | 'default-modern';
4
+ modernPath: string;
5
+ legacyPath: string;
6
+ }
7
+ export declare function resolveWindsurfMcpConfigPath(): Promise<WindsurfMcpPathResolution>;
8
+ export declare function getWindsurfMcpLockPath(configPath: string): string;
@@ -0,0 +1,43 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { pathExists } from './fs.js';
4
+ const ENV_OVERRIDE = 'AGENTS_WINDSURF_MCP_CONFIG_PATH';
5
+ export async function resolveWindsurfMcpConfigPath() {
6
+ const modernPath = path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');
7
+ const legacyPath = path.join(os.homedir(), '.codeium', 'mcp_config.json');
8
+ const override = process.env[ENV_OVERRIDE]?.trim();
9
+ if (override) {
10
+ return {
11
+ configPath: path.resolve(override),
12
+ source: 'env',
13
+ modernPath,
14
+ legacyPath
15
+ };
16
+ }
17
+ if (await pathExists(modernPath)) {
18
+ return {
19
+ configPath: modernPath,
20
+ source: 'existing-modern',
21
+ modernPath,
22
+ legacyPath
23
+ };
24
+ }
25
+ if (await pathExists(legacyPath)) {
26
+ return {
27
+ configPath: legacyPath,
28
+ source: 'existing-legacy',
29
+ modernPath,
30
+ legacyPath
31
+ };
32
+ }
33
+ return {
34
+ configPath: modernPath,
35
+ source: 'default-modern',
36
+ modernPath,
37
+ legacyPath
38
+ };
39
+ }
40
+ export function getWindsurfMcpLockPath(configPath) {
41
+ return path.join(path.dirname(configPath), `${path.basename(configPath)}.agents.lock`);
42
+ }
43
+ //# sourceMappingURL=windsurfPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurfPaths.js","sourceRoot":"","sources":["../../src/core/windsurfPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAStD,MAAM,CAAC,KAAK,UAAU,4BAA4B;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAA;IAElD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClC,MAAM,EAAE,KAAK;YACb,UAAU;YACV,UAAU;SACX,CAAA;IACH,CAAC;IAED,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,iBAAiB;YACzB,UAAU;YACV,UAAU;SACX,CAAA;IACH,CAAC;IAED,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,iBAAiB;YACzB,UAAU;YACV,UAAU;SACX,CAAA;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,gBAAgB;QACxB,UAAU;QACV,UAAU;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AACxF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedMcpServer } from '../types.js';
2
+ export declare function buildWindsurfPayload(servers: ResolvedMcpServer[]): {
3
+ payload: {
4
+ mcpServers: Record<string, unknown>;
5
+ };
6
+ warnings: string[];
7
+ };
8
+ export declare function toManagedWindsurfName(projectHash: string, serverName: string): string;
9
+ export declare function deriveWindsurfProjectHash(projectRoot: string): string;
@@ -0,0 +1,17 @@
1
+ import { createHash } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { renderWindsurfMcp } from '../core/renderers.js';
4
+ export function buildWindsurfPayload(servers) {
5
+ const rendered = renderWindsurfMcp(servers);
6
+ return {
7
+ payload: { mcpServers: rendered.servers },
8
+ warnings: rendered.warnings
9
+ };
10
+ }
11
+ export function toManagedWindsurfName(projectHash, serverName) {
12
+ return `agents__${projectHash}__${serverName}`;
13
+ }
14
+ export function deriveWindsurfProjectHash(projectRoot) {
15
+ return createHash('sha256').update(path.resolve(projectRoot)).digest('hex').slice(0, 12);
16
+ }
17
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/integrations/windsurf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAGxD,MAAM,UAAU,oBAAoB,CAAC,OAA4B;IAI/D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC3C,OAAO;QACL,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,OAAO,EAAE;QACzC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,UAAkB;IAC3E,OAAO,WAAW,WAAW,KAAK,UAAU,EAAE,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,WAAmB;IAC3D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC1F,CAAC"}
package/dist/types.d.ts CHANGED
@@ -40,8 +40,17 @@ export interface McpServerDefinition {
40
40
  targets?: IntegrationName[];
41
41
  enabled?: boolean;
42
42
  }
43
+ export interface UpdateCheckMetadata {
44
+ lastCheckedAt?: string;
45
+ lastSeenVersion?: string;
46
+ lastNotifiedAt?: string;
47
+ latestVersion?: string;
48
+ }
43
49
  export interface LocalOverridesFile {
44
50
  mcpServers: Record<string, Partial<McpServerDefinition>>;
51
+ meta?: {
52
+ updateCheck?: UpdateCheckMetadata;
53
+ };
45
54
  }
46
55
  export interface VscodeSettingsState {
47
56
  managedPaths: string[];
package/docs/EXAMPLES.md CHANGED
@@ -77,33 +77,6 @@ Each project has its own `.agents/` config. No conflicts.
77
77
 
78
78
  ---
79
79
 
80
- ## CI/CD Integration
81
-
82
- **.github/workflows/validate-agents.yml:**
83
- ```yaml
84
- name: Validate Agents Config
85
-
86
- on:
87
- pull_request:
88
- paths:
89
- - '.agents/**'
90
-
91
- jobs:
92
- validate:
93
- runs-on: ubuntu-latest
94
- steps:
95
- - uses: actions/checkout@v4
96
- - uses: actions/setup-node@v4
97
- with:
98
- node-version: '20'
99
- - run: npm install -g @agents-dev/cli
100
- - run: agents doctor
101
- - run: agents mcp test --json
102
- - run: agents sync --check
103
- ```
104
-
105
- ---
106
-
107
80
  ## Monorepo
108
81
 
109
82
  **Root (company-wide servers):**
@@ -196,8 +169,8 @@ Add to `.bashrc`:
196
169
  ```bash
197
170
  agents_prompt() {
198
171
  if [ -d ".agents" ]; then
199
- STATUS=$(agents status --fast --json 2>/dev/null | jq -r '.status')
200
- [ "$STATUS" = "synced" ] && echo " 🟢" || echo " 🟡"
172
+ MCP_COUNT=$(agents status --fast --json 2>/dev/null | jq -r '.mcp.configured')
173
+ [ "${MCP_COUNT:-0}" -gt 0 ] && echo " 🟢" || echo " 🟡"
201
174
  fi
202
175
  }
203
176
 
@@ -68,7 +68,7 @@ project/
68
68
  | **Gemini** | `.gemini/settings.json` |
69
69
  | **Cursor** | `.cursor/mcp.json` + CLI enable |
70
70
  | **Copilot** | `.vscode/mcp.json` |
71
- | **Antigravity** | `.antigravity/mcp.json` |
71
+ | **Antigravity** | Global user profile `mcp.json` (not project-local) |
72
72
 
73
73
  ## VS Code Integration
74
74
 
@@ -97,6 +97,7 @@ project/
97
97
  | **Claude** | Symlink to `.claude/skills/` |
98
98
  | **Cursor** | Symlink to `.cursor/skills/` |
99
99
  | **Gemini** | Symlink to `.gemini/skills/` |
100
+ | **Antigravity** | Reuses `.gemini/skills/` bridge |
100
101
 
101
102
  **Validation:** `agents doctor` checks frontmatter (`name`, `description`)
102
103
 
@@ -171,7 +172,8 @@ project/
171
172
  **Gitignored:**
172
173
  - ❌ `.agents/local.json`
173
174
  - ❌ `.agents/generated/`
174
- - ❌ `.codex/`, `.claude/`, `.cursor/`, `.gemini/`, `.antigravity/`
175
+ - ❌ `.codex/`, `.claude/`, `.cursor/`, `.gemini/`
176
+ - ❌ legacy `.antigravity/` (if present from older versions)
175
177
 
176
178
  ---
177
179
 
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-dev/cli",
3
- "version": "0.8.0",
3
+ "version": "0.8.2",
4
4
  "description": "One config to rule them all — Practical standard layer for multi-LLM development. Sync MCP servers, skills, and AGENTS.md across Codex, Claude Code, Gemini CLI, Cursor, Copilot, and Antigravity.",
5
5
  "main": "dist/cli.js",
6
6
  "scripts": {
@@ -8,6 +8,8 @@
8
8
  "dev": "tsx src/cli.ts",
9
9
  "lint": "eslint .",
10
10
  "test": "vitest run",
11
+ "test:fast": "vitest run --exclude \"tests/**/*.integration.test.ts\"",
12
+ "test:integration": "vitest run integration.test.ts",
11
13
  "prepack": "npm run build"
12
14
  },
13
15
  "bin": {