@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.
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +47 -0
- package/README.md +305 -67
- package/dist/cli.js +36 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.js +22 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +7 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.js +4 -4
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +46 -22
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.js +42 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/antigravity.d.ts +10 -0
- package/dist/core/antigravity.js +52 -0
- package/dist/core/antigravity.js.map +1 -0
- package/dist/core/config.js +2 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/mcp.js +5 -1
- package/dist/core/mcp.js.map +1 -1
- package/dist/core/mcpCrud.js +2 -1
- package/dist/core/mcpCrud.js.map +1 -1
- package/dist/core/project.d.ts +1 -0
- package/dist/core/project.js +5 -2
- package/dist/core/project.js.map +1 -1
- package/dist/core/shell.d.ts +1 -0
- package/dist/core/shell.js +17 -4
- package/dist/core/shell.js.map +1 -1
- package/dist/core/skills.js +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/sync.js +55 -6
- package/dist/core/sync.js.map +1 -1
- package/dist/core/templates.d.ts +4 -1
- package/dist/core/templates.js +12 -3
- package/dist/core/templates.js.map +1 -1
- package/dist/core/updateCheck.d.ts +24 -0
- package/dist/core/updateCheck.js +227 -0
- package/dist/core/updateCheck.js.map +1 -0
- package/dist/core/version.d.ts +1 -0
- package/dist/core/version.js +2 -0
- package/dist/core/version.js.map +1 -0
- package/dist/core/windsurfPaths.d.ts +8 -0
- package/dist/core/windsurfPaths.js +43 -0
- package/dist/core/windsurfPaths.js.map +1 -0
- package/dist/integrations/windsurf.d.ts +9 -0
- package/dist/integrations/windsurf.js +17 -0
- package/dist/integrations/windsurf.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/docs/EXAMPLES.md +2 -29
- package/docs/agents-system.md +4 -2
- package/docs/screenshot.jpg +0 -0
- 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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CLI_VERSION = "0.8.2";
|
|
@@ -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
|
-
|
|
200
|
-
[ "$
|
|
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
|
|
package/docs/agents-system.md
CHANGED
|
@@ -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** |
|
|
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
|
|
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.
|
|
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": {
|