@agents-dev/cli 0.8.1 → 0.8.3

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 (82) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +325 -68
  3. package/dist/cli.js +38 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.js +46 -13
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/init.js +1 -1
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/mcp-test.js +8 -2
  10. package/dist/commands/mcp-test.js.map +1 -1
  11. package/dist/commands/reset.js +9 -0
  12. package/dist/commands/reset.js.map +1 -1
  13. package/dist/commands/start.js +20 -6
  14. package/dist/commands/start.js.map +1 -1
  15. package/dist/commands/status.js +99 -23
  16. package/dist/commands/status.js.map +1 -1
  17. package/dist/commands/update.d.ts +6 -0
  18. package/dist/commands/update.js +42 -0
  19. package/dist/commands/update.js.map +1 -0
  20. package/dist/core/antigravity.d.ts +10 -0
  21. package/dist/core/antigravity.js +52 -0
  22. package/dist/core/antigravity.js.map +1 -0
  23. package/dist/core/config.js +8 -5
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/gitignore.js +4 -1
  26. package/dist/core/gitignore.js.map +1 -1
  27. package/dist/core/mcp.js +23 -5
  28. package/dist/core/mcp.js.map +1 -1
  29. package/dist/core/mcpCrud.js +2 -1
  30. package/dist/core/mcpCrud.js.map +1 -1
  31. package/dist/core/opencode.d.ts +7 -0
  32. package/dist/core/opencode.js +22 -0
  33. package/dist/core/opencode.js.map +1 -0
  34. package/dist/core/paths.d.ts +6 -0
  35. package/dist/core/paths.js +7 -1
  36. package/dist/core/paths.js.map +1 -1
  37. package/dist/core/renderers.d.ts +8 -0
  38. package/dist/core/renderers.js +57 -0
  39. package/dist/core/renderers.js.map +1 -1
  40. package/dist/core/shell.d.ts +1 -0
  41. package/dist/core/shell.js +17 -4
  42. package/dist/core/shell.js.map +1 -1
  43. package/dist/core/skills.js +12 -1
  44. package/dist/core/skills.js.map +1 -1
  45. package/dist/core/sync.js +129 -6
  46. package/dist/core/sync.js.map +1 -1
  47. package/dist/core/updateCheck.d.ts +24 -0
  48. package/dist/core/updateCheck.js +227 -0
  49. package/dist/core/updateCheck.js.map +1 -0
  50. package/dist/core/version.d.ts +1 -0
  51. package/dist/core/version.js +2 -0
  52. package/dist/core/version.js.map +1 -0
  53. package/dist/core/windsurf.d.ts +8 -0
  54. package/dist/core/windsurf.js +29 -0
  55. package/dist/core/windsurf.js.map +1 -0
  56. package/dist/integrations/opencode.d.ts +7 -0
  57. package/dist/integrations/opencode.js +9 -0
  58. package/dist/integrations/opencode.js.map +1 -0
  59. package/dist/integrations/registry.js +3 -1
  60. package/dist/integrations/registry.js.map +1 -1
  61. package/dist/integrations/windsurf.d.ts +0 -2
  62. package/dist/integrations/windsurf.js +1 -9
  63. package/dist/integrations/windsurf.js.map +1 -1
  64. package/dist/types.d.ts +10 -1
  65. package/docs/EXAMPLES.md +18 -29
  66. package/docs/README.md +1 -0
  67. package/docs/agents-system.md +12 -2
  68. package/docs/screenshot.jpg +0 -0
  69. package/package.json +7 -3
  70. package/templates/agents/README.md +4 -1
  71. package/dist/commands/migrate.d.ts +0 -4
  72. package/dist/commands/migrate.js +0 -71
  73. package/dist/commands/migrate.js.map +0 -1
  74. package/dist/core/catalog.d.ts +0 -8
  75. package/dist/core/catalog.js +0 -141
  76. package/dist/core/catalog.js.map +0 -1
  77. package/dist/core/linking.d.ts +0 -8
  78. package/dist/core/linking.js +0 -41
  79. package/dist/core/linking.js.map +0 -1
  80. package/dist/core/windsurfPaths.d.ts +0 -8
  81. package/dist/core/windsurfPaths.js +0 -43
  82. package/dist/core/windsurfPaths.js.map +0 -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":"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"}
@@ -0,0 +1 @@
1
+ export declare const CLI_VERSION = "0.8.3";
@@ -0,0 +1,2 @@
1
+ export const CLI_VERSION = '0.8.3';
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 WindsurfMcpPayload {
2
+ mcpServers?: Record<string, unknown>;
3
+ [key: string]: unknown;
4
+ }
5
+ export declare function getWindsurfGlobalMcpPath(): string;
6
+ export declare function readWindsurfMcp(pathToRead: string): Promise<WindsurfMcpPayload | undefined>;
7
+ export declare function writeWindsurfMcp(pathToWrite: string, payload: WindsurfMcpPayload): Promise<void>;
8
+ export declare function normalizeWindsurfMcpPayload(payload: WindsurfMcpPayload): WindsurfMcpPayload;
@@ -0,0 +1,29 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { ensureDir, pathExists, readJson, writeJsonAtomic } from './fs.js';
4
+ export function getWindsurfGlobalMcpPath() {
5
+ const override = process.env.AGENTS_WINDSURF_MCP_PATH;
6
+ if (override && override.trim().length > 0) {
7
+ return path.resolve(override);
8
+ }
9
+ return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');
10
+ }
11
+ export async function readWindsurfMcp(pathToRead) {
12
+ if (!(await pathExists(pathToRead)))
13
+ return undefined;
14
+ return readJson(pathToRead);
15
+ }
16
+ export async function writeWindsurfMcp(pathToWrite, payload) {
17
+ await ensureDir(path.dirname(pathToWrite));
18
+ await writeJsonAtomic(pathToWrite, normalizeWindsurfMcpPayload(payload));
19
+ }
20
+ export function normalizeWindsurfMcpPayload(payload) {
21
+ return {
22
+ ...payload,
23
+ mcpServers: isRecord(payload.mcpServers) ? payload.mcpServers : {}
24
+ };
25
+ }
26
+ function isRecord(value) {
27
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
28
+ }
29
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/core/windsurf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAO1E,MAAM,UAAU,wBAAwB;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAA;IACrD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACrD,OAAO,QAAQ,CAAqB,UAAU,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,OAA2B;IACrF,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;IAC1C,MAAM,eAAe,CAAC,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAA;AAC1E,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA2B;IACrE,OAAO;QACL,GAAG,OAAO;QACV,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;KACnE,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ResolvedMcpServer } from '../types.js';
2
+ export declare function buildOpencodePayload(servers: ResolvedMcpServer[]): {
3
+ payload: {
4
+ mcp: Record<string, unknown>;
5
+ };
6
+ warnings: string[];
7
+ };
@@ -0,0 +1,9 @@
1
+ import { renderOpencodeMcp } from '../core/renderers.js';
2
+ export function buildOpencodePayload(servers) {
3
+ const rendered = renderOpencodeMcp(servers);
4
+ return {
5
+ payload: { mcp: rendered.mcp },
6
+ warnings: rendered.warnings
7
+ };
8
+ }
9
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/integrations/opencode.ts"],"names":[],"mappings":"AAAA,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,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE;QAC9B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAA;AACH,CAAC"}
@@ -4,7 +4,9 @@ export const INTEGRATIONS = [
4
4
  { id: 'gemini', label: 'Gemini CLI', requiredBinary: 'gemini' },
5
5
  { id: 'copilot_vscode', label: 'Copilot VS Code', requiredBinary: 'code' },
6
6
  { id: 'cursor', label: 'Cursor', requiredBinary: 'cursor-agent' },
7
- { id: 'antigravity', label: 'Antigravity', requiredBinary: 'antigravity' }
7
+ { id: 'antigravity', label: 'Antigravity', requiredBinary: 'antigravity' },
8
+ { id: 'windsurf', label: 'Windsurf' },
9
+ { id: 'opencode', label: 'OpenCode' }
8
10
  ];
9
11
  export const INTEGRATION_IDS = INTEGRATIONS.map((item) => item.id);
10
12
  export function parseIntegrationList(input) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/integrations/registry.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,YAAY,GAA4B;IACnD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;IACxD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE;IAChE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE;IAC/D,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE;IAC1E,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE;IACjE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE;CAC3E,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAsB,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAErF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,MAAM,GAAG,KAAK;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;IAElB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAuB,CAAC,CAAC,CAAA;IAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxG,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAA2B,CAAC,CAAC,CAAA;AAClD,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/integrations/registry.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,YAAY,GAA4B;IACnD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;IACxD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE;IAChE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE;IAC/D,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE;IAC1E,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE;IACjE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE;IAC1E,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACrC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;CACtC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAsB,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAErF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,MAAM,GAAG,KAAK;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;IAElB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAuB,CAAC,CAAC,CAAA;IAC3F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACxG,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAA2B,CAAC,CAAC,CAAA;AAClD,CAAC"}
@@ -5,5 +5,3 @@ export declare function buildWindsurfPayload(servers: ResolvedMcpServer[]): {
5
5
  };
6
6
  warnings: string[];
7
7
  };
8
- export declare function toManagedWindsurfName(projectHash: string, serverName: string): string;
9
- export declare function deriveWindsurfProjectHash(projectRoot: string): string;
@@ -1,17 +1,9 @@
1
- import { createHash } from 'node:crypto';
2
- import path from 'node:path';
3
1
  import { renderWindsurfMcp } from '../core/renderers.js';
4
2
  export function buildWindsurfPayload(servers) {
5
3
  const rendered = renderWindsurfMcp(servers);
6
4
  return {
7
- payload: { mcpServers: rendered.servers },
5
+ payload: { mcpServers: rendered.mcpServers },
8
6
  warnings: rendered.warnings
9
7
  };
10
8
  }
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
9
  //# sourceMappingURL=windsurf.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/integrations/windsurf.ts"],"names":[],"mappings":"AAAA,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,UAAU,EAAE;QAC5C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAA;AACH,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const AGENTS_SCHEMA_VERSION = 3;
2
- export type IntegrationName = 'codex' | 'claude' | 'gemini' | 'copilot_vscode' | 'cursor' | 'antigravity';
2
+ export type IntegrationName = 'codex' | 'claude' | 'gemini' | 'copilot_vscode' | 'cursor' | 'antigravity' | 'windsurf' | 'opencode';
3
3
  export type SyncMode = 'source-only' | 'commit-generated';
4
4
  export type McpTransportType = 'stdio' | 'http' | 'sse';
5
5
  export interface AgentsConfig {
@@ -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
 
@@ -209,3 +182,19 @@ PS1='$(agents_prompt) '"$PS1"
209
182
  ## More Examples?
210
183
 
211
184
  [Open a discussion](https://github.com/amtiYo/agents/discussions) and share your workflow!
185
+
186
+ ---
187
+
188
+ ## Windsurf + OpenCode
189
+
190
+ ```bash
191
+ cd ~/my-project
192
+ agents init
193
+ agents connect --llm windsurf,opencode
194
+ agents sync
195
+ ```
196
+
197
+ **Result:**
198
+ - Windsurf MCP is written to `~/.codeium/windsurf/mcp_config.json`
199
+ - OpenCode MCP is written to project `opencode.json`
200
+ - Skills are available from `.agents/skills` (Windsurf also gets `.windsurf/skills`)
package/docs/README.md CHANGED
@@ -16,6 +16,7 @@
16
16
  ### Tools
17
17
  - [Codex](https://developers.openai.com/codex) | [Claude Code](https://code.claude.com/docs) | [Gemini CLI](https://geminicli.com/docs)
18
18
  - [Cursor](https://cursor.com/docs) | [Copilot](https://github.com/features/copilot) | [Antigravity](https://antigravity.google/docs)
19
+ - [Windsurf](https://docs.windsurf.com/windsurf/cascade) | [OpenCode](https://opencode.ai/docs/)
19
20
 
20
21
  ## Contributing
21
22
 
@@ -68,7 +68,9 @@ 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
+ | **Windsurf** | Global user profile `~/.codeium/windsurf/mcp_config.json` |
73
+ | **OpenCode** | `opencode.json` (`mcp` block) |
72
74
 
73
75
  ## VS Code Integration
74
76
 
@@ -81,6 +83,9 @@ project/
81
83
  "**/.cursor": true,
82
84
  "**/.gemini": true,
83
85
  "**/.antigravity": true,
86
+ "**/.windsurf": true,
87
+ "**/.opencode": true,
88
+ "**/opencode.json": true,
84
89
  "**/.agents/generated": true
85
90
  }
86
91
  }
@@ -97,6 +102,9 @@ project/
97
102
  | **Claude** | Symlink to `.claude/skills/` |
98
103
  | **Cursor** | Symlink to `.cursor/skills/` |
99
104
  | **Gemini** | Symlink to `.gemini/skills/` |
105
+ | **Antigravity** | Reuses `.gemini/skills/` bridge |
106
+ | **Windsurf** | Symlink to `.windsurf/skills/` |
107
+ | **OpenCode** | Reads `.agents/skills/` directly |
100
108
 
101
109
  **Validation:** `agents doctor` checks frontmatter (`name`, `description`)
102
110
 
@@ -171,7 +179,9 @@ project/
171
179
  **Gitignored:**
172
180
  - ❌ `.agents/local.json`
173
181
  - ❌ `.agents/generated/`
174
- - ❌ `.codex/`, `.claude/`, `.cursor/`, `.gemini/`, `.antigravity/`
182
+ - ❌ `.codex/`, `.claude/`, `.cursor/`, `.gemini/`
183
+ - ❌ `.windsurf/`, `.opencode/`, `opencode.json`
184
+ - ❌ legacy `.antigravity/` (if present from older versions)
175
185
 
176
186
  ---
177
187
 
Binary file
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "@agents-dev/cli",
3
- "version": "0.8.1",
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.",
3
+ "version": "0.8.3",
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, Antigravity, Windsurf, and OpenCode.",
5
5
  "main": "dist/cli.js",
6
6
  "scripts": {
7
- "build": "tsc -p tsconfig.json",
7
+ "build": "node -e \"const fs=require('node:fs'); fs.rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json",
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": {
@@ -35,6 +37,8 @@
35
37
  "cursor",
36
38
  "copilot",
37
39
  "antigravity",
40
+ "windsurf",
41
+ "opencode",
38
42
  "ai-coding",
39
43
  "llm-tools",
40
44
  "config-sync",
@@ -22,4 +22,7 @@ Project-local standard for AGENTS.md + MCP + SKILLS.
22
22
  - `.vscode/mcp.json`
23
23
  - `.vscode/settings.json`
24
24
  - `.cursor/mcp.json`
25
- - `.antigravity/mcp.json`
25
+ - `opencode.json`
26
+ - `.windsurf/skills/`
27
+ - `~/.codeium/windsurf/mcp_config.json` (global)
28
+ - `Antigravity User/mcp.json` (global)
@@ -1,4 +0,0 @@
1
- export interface MigrateOptions {
2
- projectRoot: string;
3
- }
4
- export declare function runMigrate(options: MigrateOptions): Promise<void>;
@@ -1,71 +0,0 @@
1
- import path from 'node:path';
2
- import { cp, mkdir } from 'node:fs/promises';
3
- import { createDefaultProjectConfig, loadLegacyConfig, saveProjectConfig } from '../core/config.js';
4
- import { ensureDir, pathExists, readJson, writeJsonAtomic } from '../core/fs.js';
5
- import { getProjectPaths } from '../core/paths.js';
6
- import { MCP_SELECTION_SCHEMA_VERSION } from '../types.js';
7
- export async function runMigrate(options) {
8
- const projectRoot = path.resolve(options.projectRoot);
9
- const paths = getProjectPaths(projectRoot);
10
- if (await pathExists(paths.agentsProject)) {
11
- process.stdout.write(`Migration skipped: already using ${paths.agentsProject}\n`);
12
- return;
13
- }
14
- if (!(await pathExists(paths.agentsLegacyConfig))) {
15
- throw new Error(`Legacy config not found at ${paths.agentsLegacyConfig}`);
16
- }
17
- const legacyConfig = await loadLegacyConfig(projectRoot);
18
- const legacyRegistry = (await pathExists(paths.mcpLegacyRegistry))
19
- ? await readJson(paths.mcpLegacyRegistry)
20
- : { mcpServers: {} };
21
- const backupDir = await createBackup(paths);
22
- const projectConfig = mapLegacyConfig(legacyConfig);
23
- await saveProjectConfig(projectRoot, projectConfig);
24
- const selectedServers = Object.entries(legacyRegistry.mcpServers ?? {})
25
- .filter(([, server]) => server.enabled !== false)
26
- .map(([name]) => name)
27
- .sort((a, b) => a.localeCompare(b));
28
- const selection = {
29
- schemaVersion: MCP_SELECTION_SCHEMA_VERSION,
30
- preset: 'migrated-v1',
31
- selectedMcpServers: selectedServers
32
- };
33
- await writeJsonAtomic(paths.mcpSelection, selection);
34
- const localPayload = {
35
- mcpServers: legacyRegistry.mcpServers ?? {}
36
- };
37
- await writeJsonAtomic(paths.mcpLocal, localPayload);
38
- process.stdout.write(`Migrated v1 -> v2 in ${projectRoot}\n`);
39
- process.stdout.write(`Backup created at ${backupDir}\n`);
40
- process.stdout.write(`Created:\n- .agents/project.json\n- .agents/mcp/selection.json\n- .agents/mcp/local.json\n`);
41
- }
42
- function mapLegacyConfig(legacy) {
43
- const config = createDefaultProjectConfig(legacy.projectRoot, legacy.linkMode);
44
- config.enabledIntegrations = [...legacy.enabledIntegrations];
45
- config.lastSync = legacy.lastSync;
46
- config.syncMode = 'source-only';
47
- config.selectedSkillPacks = [];
48
- config.selectedSkills = [];
49
- return config;
50
- }
51
- async function createBackup(paths) {
52
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
53
- const backupDir = path.join(paths.agentsBackupDir, timestamp);
54
- await ensureDir(backupDir);
55
- const filesToBackup = [
56
- paths.agentsLegacyConfig,
57
- paths.mcpLegacyRegistry,
58
- paths.mcpLocal
59
- ];
60
- for (const filePath of filesToBackup) {
61
- if (!(await pathExists(filePath)))
62
- continue;
63
- const dest = path.join(backupDir, path.basename(filePath));
64
- await ensureDir(path.dirname(dest));
65
- await cp(filePath, dest, { recursive: true });
66
- }
67
- // keep backup folder visible even if no files were copied
68
- await mkdir(backupDir, { recursive: true });
69
- return backupDir;
70
- }
71
- //# sourceMappingURL=migrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { CatalogFile } from '../types.js';
2
- export declare function getDefaultCatalog(): CatalogFile;
3
- export declare function ensureGlobalCatalog(): Promise<{
4
- path: string;
5
- catalog: CatalogFile;
6
- created: boolean;
7
- }>;
8
- export declare function validateCatalog(catalog: CatalogFile): void;