@phnx-labs/agents-cli 1.19.2 → 1.20.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.
- package/CHANGELOG.md +140 -0
- package/README.md +72 -12
- package/dist/browser.js +0 -0
- package/dist/commands/browser.js +88 -16
- package/dist/commands/cli.d.ts +14 -0
- package/dist/commands/cli.js +244 -0
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +27 -10
- package/dist/commands/computer.js +18 -1
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/exec.js +38 -18
- package/dist/commands/factory.d.ts +3 -14
- package/dist/commands/factory.js +3 -3
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.js +89 -0
- package/dist/commands/helper.d.ts +12 -0
- package/dist/commands/helper.js +87 -0
- package/dist/commands/hooks.js +89 -10
- package/dist/commands/mcp.js +166 -10
- package/dist/commands/packages.js +196 -27
- package/dist/commands/permissions.js +21 -6
- package/dist/commands/plugins.js +11 -4
- package/dist/commands/profiles.d.ts +8 -0
- package/dist/commands/profiles.js +118 -5
- package/dist/commands/prune.js +39 -160
- package/dist/commands/pull.js +58 -5
- package/dist/commands/routines.js +107 -14
- package/dist/commands/rules.js +8 -4
- package/dist/commands/secrets-migrate.d.ts +24 -0
- package/dist/commands/secrets-migrate.js +198 -0
- package/dist/commands/secrets-sync.d.ts +11 -0
- package/dist/commands/secrets-sync.js +155 -0
- package/dist/commands/secrets.js +79 -46
- package/dist/commands/sessions.d.ts +28 -0
- package/dist/commands/sessions.js +98 -33
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +37 -28
- package/dist/commands/skills.js +25 -8
- package/dist/commands/subagents.js +69 -49
- package/dist/commands/teams.js +61 -10
- package/dist/commands/utils.d.ts +33 -0
- package/dist/commands/utils.js +139 -0
- package/dist/commands/versions.d.ts +4 -3
- package/dist/commands/versions.js +134 -130
- package/dist/commands/view.d.ts +6 -0
- package/dist/commands/view.js +175 -19
- package/dist/commands/workflows.js +29 -6
- package/dist/computer.js +0 -0
- package/dist/index.js +38 -6
- package/dist/lib/acp/client.js +6 -1
- package/dist/lib/acp/harnesses.js +8 -0
- package/dist/lib/agents.d.ts +4 -0
- package/dist/lib/agents.js +125 -34
- package/dist/lib/auto-pull-worker.js +18 -1
- package/dist/lib/browser/cdp.d.ts +8 -1
- package/dist/lib/browser/cdp.js +40 -3
- package/dist/lib/browser/chrome.d.ts +13 -0
- package/dist/lib/browser/chrome.js +46 -3
- package/dist/lib/browser/domain-skills.d.ts +51 -0
- package/dist/lib/browser/domain-skills.js +157 -0
- package/dist/lib/browser/drivers/local.js +45 -4
- package/dist/lib/browser/drivers/ssh.js +2 -2
- package/dist/lib/browser/ipc.d.ts +8 -1
- package/dist/lib/browser/ipc.js +37 -28
- package/dist/lib/browser/profiles.d.ts +16 -3
- package/dist/lib/browser/profiles.js +44 -4
- package/dist/lib/browser/service.d.ts +3 -0
- package/dist/lib/browser/service.js +40 -5
- package/dist/lib/browser/types.d.ts +11 -4
- package/dist/lib/cli-resources.d.ts +137 -0
- package/dist/lib/cli-resources.js +477 -0
- package/dist/lib/cloud/factory.d.ts +1 -1
- package/dist/lib/cloud/factory.js +1 -1
- package/dist/lib/cloud/rush.js +5 -5
- package/dist/lib/command-skills.js +0 -2
- package/dist/lib/computer-rpc.d.ts +3 -0
- package/dist/lib/computer-rpc.js +53 -0
- package/dist/lib/daemon.js +20 -0
- package/dist/lib/events.d.ts +16 -2
- package/dist/lib/events.js +33 -2
- package/dist/lib/exec.d.ts +42 -13
- package/dist/lib/exec.js +127 -33
- package/dist/lib/help.js +11 -5
- package/dist/lib/hooks/cache.d.ts +38 -0
- package/dist/lib/hooks/cache.js +242 -0
- package/dist/lib/hooks/profile.d.ts +33 -0
- package/dist/lib/hooks/profile.js +129 -0
- package/dist/lib/hooks.d.ts +0 -10
- package/dist/lib/hooks.js +246 -11
- package/dist/lib/mcp.d.ts +15 -0
- package/dist/lib/mcp.js +46 -0
- package/dist/lib/migrate.js +1 -1
- package/dist/lib/overdue.d.ts +26 -0
- package/dist/lib/overdue.js +101 -0
- package/dist/lib/permissions.d.ts +13 -0
- package/dist/lib/permissions.js +55 -1
- package/dist/lib/plugin-marketplace.js +1 -1
- package/dist/lib/plugins.js +15 -1
- package/dist/lib/profiles-presets.d.ts +26 -0
- package/dist/lib/profiles-presets.js +216 -0
- package/dist/lib/profiles.d.ts +34 -0
- package/dist/lib/profiles.js +112 -1
- package/dist/lib/resources/mcp.js +37 -0
- package/dist/lib/resources.d.ts +1 -1
- package/dist/lib/rotate.js +10 -4
- package/dist/lib/routines-format.d.ts +47 -0
- package/dist/lib/routines-format.js +194 -0
- package/dist/lib/routines.d.ts +8 -2
- package/dist/lib/routines.js +34 -14
- package/dist/lib/runner.js +83 -15
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/_CodeSignature/CodeResources +1 -9
- package/dist/lib/secrets/bundles.d.ts +34 -17
- package/dist/lib/secrets/bundles.js +210 -36
- package/dist/lib/secrets/index.d.ts +49 -30
- package/dist/lib/secrets/index.js +126 -115
- package/dist/lib/secrets/install-helper.d.ts +45 -0
- package/dist/lib/secrets/install-helper.js +165 -0
- package/dist/lib/secrets/linux.js +4 -4
- package/dist/lib/secrets/sync.d.ts +56 -0
- package/dist/lib/secrets/sync.js +180 -0
- package/dist/lib/session/active.d.ts +8 -0
- package/dist/lib/session/active.js +3 -2
- package/dist/lib/session/db.d.ts +0 -4
- package/dist/lib/session/db.js +0 -26
- package/dist/lib/session/parse.d.ts +1 -0
- package/dist/lib/session/parse.js +44 -0
- package/dist/lib/session/render.js +4 -4
- package/dist/lib/session/types.d.ts +2 -2
- package/dist/lib/session/types.js +1 -1
- package/dist/lib/shims.d.ts +5 -2
- package/dist/lib/shims.js +70 -38
- package/dist/lib/state.d.ts +14 -2
- package/dist/lib/state.js +51 -20
- package/dist/lib/teams/agents.d.ts +5 -4
- package/dist/lib/teams/agents.js +48 -22
- package/dist/lib/teams/api.d.ts +2 -1
- package/dist/lib/teams/api.js +4 -3
- package/dist/lib/teams/parsers.d.ts +1 -1
- package/dist/lib/teams/parsers.js +153 -3
- package/dist/lib/teams/summarizer.js +18 -2
- package/dist/lib/teams/worktree.js +14 -3
- package/dist/lib/types.d.ts +63 -4
- package/dist/lib/types.js +8 -3
- package/dist/lib/usage.d.ts +27 -2
- package/dist/lib/usage.js +100 -17
- package/dist/lib/versions.d.ts +45 -3
- package/dist/lib/versions.js +455 -60
- package/package.json +15 -14
- package/scripts/install-helper.js +97 -0
- package/scripts/postinstall.js +16 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/embedded.provisionprofile +0 -0
- package/npm-shrinkwrap.json +0 -3162
|
@@ -7,7 +7,7 @@ import { AGENTS, ALL_AGENT_IDS, getAccountEmail, getAccountInfo, agentLabel, } f
|
|
|
7
7
|
import { formatUsageSummary, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, } from '../lib/usage.js';
|
|
8
8
|
import { viewAction } from './view.js';
|
|
9
9
|
import { readManifest, writeManifest, createDefaultManifest } from '../lib/manifest.js';
|
|
10
|
-
import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, getGlobalDefault, setGlobalDefault, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, hasNewResources, } from '../lib/versions.js';
|
|
10
|
+
import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, getGlobalDefault, setGlobalDefault, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, printTrashFooter, } from '../lib/versions.js';
|
|
11
11
|
import { createShim, createVersionedAlias, removeShim, shimExists, getShimsDir, getShimPath, getPathShadowingExecutable, isShimsInPath, getPathSetupInstructions, addShimsToPath, switchConfigSymlink, switchHomeFileSymlinks, } from '../lib/shims.js';
|
|
12
12
|
import { isInteractiveTerminal, isPromptCancelled, requireInteractiveSelection } from './utils.js';
|
|
13
13
|
import { tryAutoPull } from '../lib/git.js';
|
|
@@ -93,7 +93,130 @@ function warnIfShimShadowed(agent) {
|
|
|
93
93
|
console.log(chalk.gray(` Managed shim: ${getShimPath(agent)}`));
|
|
94
94
|
console.log(chalk.gray(` ${getPathSetupInstructions().split('\n').join('\n ')}`));
|
|
95
95
|
}
|
|
96
|
-
|
|
96
|
+
async function versionPruneAction(specs, options, commandName) {
|
|
97
|
+
const isProject = options.project;
|
|
98
|
+
const moved = [];
|
|
99
|
+
for (const spec of specs) {
|
|
100
|
+
const parsed = parseAgentSpec(spec);
|
|
101
|
+
if (!parsed) {
|
|
102
|
+
console.log(chalk.red(`Invalid agent: ${spec}`));
|
|
103
|
+
console.log(chalk.gray(`Format: <agent>[@version]. Available: ${ALL_AGENT_IDS.join(', ')}`));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const { agent, version } = parsed;
|
|
107
|
+
const agentConfig = AGENTS[agent];
|
|
108
|
+
if (version === 'latest' || !spec.includes('@')) {
|
|
109
|
+
const versions = listInstalledVersions(agent);
|
|
110
|
+
if (versions.length === 0) {
|
|
111
|
+
console.log(chalk.gray(`No versions of ${agentLabel(agentConfig.id)} installed`));
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (!isInteractiveTerminal()) {
|
|
115
|
+
requireInteractiveSelection(`Selecting ${agentLabel(agentConfig.id)} versions to ${commandName}`, [
|
|
116
|
+
`agents ${commandName} ${agent}@${versions[0]}`,
|
|
117
|
+
]);
|
|
118
|
+
}
|
|
119
|
+
const globalDefault = getGlobalDefault(agent);
|
|
120
|
+
const sortedVersions = [...versions].sort((a, b) => {
|
|
121
|
+
if (a === globalDefault)
|
|
122
|
+
return -1;
|
|
123
|
+
if (b === globalDefault)
|
|
124
|
+
return 1;
|
|
125
|
+
return 0;
|
|
126
|
+
});
|
|
127
|
+
try {
|
|
128
|
+
const toRemove = await checkbox({
|
|
129
|
+
message: `Select ${agentLabel(agentConfig.id)} versions to ${commandName}:`,
|
|
130
|
+
choices: sortedVersions.map((v) => ({
|
|
131
|
+
name: v === globalDefault ? `${v} ${chalk.green('(default)')}` : v,
|
|
132
|
+
value: v,
|
|
133
|
+
checked: false,
|
|
134
|
+
})),
|
|
135
|
+
});
|
|
136
|
+
if (toRemove.length === 0) {
|
|
137
|
+
console.log(chalk.gray('No versions selected'));
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
for (const v of toRemove) {
|
|
141
|
+
const versionDir = getVersionDir(agent, v);
|
|
142
|
+
removeVersion(agent, v);
|
|
143
|
+
fixSessionFilePaths(agent, v, versionDir);
|
|
144
|
+
console.log(chalk.green(`Moved ${agentLabel(agentConfig.id)}@${v} to trash`));
|
|
145
|
+
moved.push({ agent, version: v });
|
|
146
|
+
}
|
|
147
|
+
if (globalDefault && toRemove.includes(globalDefault)) {
|
|
148
|
+
setGlobalDefault(agent, undefined);
|
|
149
|
+
console.log(chalk.yellow(`Default version removed. Run: agents use ${agent}@<version> to set a new default`));
|
|
150
|
+
}
|
|
151
|
+
const remaining = listInstalledVersions(agent);
|
|
152
|
+
if (remaining.length === 0) {
|
|
153
|
+
removeShim(agent);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (isPromptCancelled(err)) {
|
|
158
|
+
console.log(chalk.gray('Cancelled'));
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
throw err;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (!isVersionInstalled(agent, version)) {
|
|
165
|
+
console.log(chalk.gray(`${agentLabel(agentConfig.id)}@${version} not installed`));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const versionDir = getVersionDir(agent, version);
|
|
169
|
+
removeVersion(agent, version);
|
|
170
|
+
fixSessionFilePaths(agent, version, versionDir);
|
|
171
|
+
console.log(chalk.green(`Moved ${agentLabel(agentConfig.id)}@${version} to trash`));
|
|
172
|
+
moved.push({ agent, version });
|
|
173
|
+
const remaining = listInstalledVersions(agent);
|
|
174
|
+
if (remaining.length === 0) {
|
|
175
|
+
removeShim(agent);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (isProject) {
|
|
179
|
+
const projectManifestPath = path.join(process.cwd(), '.agents', 'agents.yaml');
|
|
180
|
+
if (fs.existsSync(projectManifestPath)) {
|
|
181
|
+
const manifest = readManifest(process.cwd());
|
|
182
|
+
if (manifest?.agents?.[agent]) {
|
|
183
|
+
delete manifest.agents[agent];
|
|
184
|
+
writeManifest(process.cwd(), manifest);
|
|
185
|
+
console.log(chalk.gray(` Removed from .agents/agents.yaml`));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
printTrashFooter(moved);
|
|
191
|
+
}
|
|
192
|
+
function configureVersionPruneCommand(cmd, commandName) {
|
|
193
|
+
const isAlias = commandName === 'remove';
|
|
194
|
+
cmd
|
|
195
|
+
.description(isAlias
|
|
196
|
+
? 'Alias for agents prune. Uninstalls agent CLI versions.'
|
|
197
|
+
: 'Uninstall agent CLI versions. Moves version data to trash for recovery.')
|
|
198
|
+
.option('-p, --project', 'Also clear the pinned version from .agents/agents.yaml in the current project');
|
|
199
|
+
setHelpSections(cmd, {
|
|
200
|
+
examples: `
|
|
201
|
+
# Prune a specific version
|
|
202
|
+
agents ${commandName} claude@2.0.50
|
|
203
|
+
|
|
204
|
+
# Pick interactively if you omit the version
|
|
205
|
+
agents ${commandName} claude
|
|
206
|
+
|
|
207
|
+
# Prune and also clear the project pin
|
|
208
|
+
agents ${commandName} claude@2.0.50 --project
|
|
209
|
+
`,
|
|
210
|
+
notes: `
|
|
211
|
+
- Pruned version directories move to trash with their home/ data intact.
|
|
212
|
+
- Session file paths are rewritten so session history remains readable.
|
|
213
|
+
- Removing the default version unsets the default; run 'agents use' to pick a new one.
|
|
214
|
+
- Reinstall any time with 'agents add'.
|
|
215
|
+
`,
|
|
216
|
+
});
|
|
217
|
+
cmd.action((specs, options) => versionPruneAction(specs, options, commandName));
|
|
218
|
+
}
|
|
219
|
+
/** Register `agents add`, `agents prune`, `agents remove`, `agents use`, and `agents list` (deprecated). */
|
|
97
220
|
export function registerVersionsCommands(program) {
|
|
98
221
|
const addCmd = program
|
|
99
222
|
.command('add <specs...>')
|
|
@@ -132,7 +255,7 @@ export function registerVersionsCommands(program) {
|
|
|
132
255
|
}
|
|
133
256
|
const { agent, version } = parsed;
|
|
134
257
|
const agentConfig = AGENTS[agent];
|
|
135
|
-
if (!agentConfig.npmPackage) {
|
|
258
|
+
if (!agentConfig.npmPackage && !agentConfig.installScript) {
|
|
136
259
|
console.log(chalk.yellow(`${agentLabel(agentConfig.id)} has no npm package. Install manually.`));
|
|
137
260
|
continue;
|
|
138
261
|
}
|
|
@@ -170,7 +293,7 @@ export function registerVersionsCommands(program) {
|
|
|
170
293
|
// Smart resource detection: compare available vs ACTUALLY synced (source of truth: files)
|
|
171
294
|
const available = getAvailableResources();
|
|
172
295
|
const actuallySynced = getActuallySyncedResources(agent, installedVersion);
|
|
173
|
-
const newResources = getNewResources(available, actuallySynced);
|
|
296
|
+
const newResources = getNewResources(available, actuallySynced, getProjectOnlyResources());
|
|
174
297
|
const hasAnySynced = actuallySynced.commands.length > 0 ||
|
|
175
298
|
actuallySynced.skills.length > 0 ||
|
|
176
299
|
actuallySynced.hooks.length > 0 ||
|
|
@@ -195,9 +318,9 @@ export function registerVersionsCommands(program) {
|
|
|
195
318
|
selection = userSelection;
|
|
196
319
|
}
|
|
197
320
|
}
|
|
198
|
-
else if (hasNewResources(newResources, agent)) {
|
|
321
|
+
else if (hasNewResources(newResources, agent, installedVersion)) {
|
|
199
322
|
// Some synced, but NEW resources available - prompt for new only
|
|
200
|
-
const userSelection = await promptNewResourceSelection(agent, newResources);
|
|
323
|
+
const userSelection = await promptNewResourceSelection(agent, newResources, installedVersion);
|
|
201
324
|
if (userSelection) {
|
|
202
325
|
selection = userSelection;
|
|
203
326
|
}
|
|
@@ -311,127 +434,8 @@ export function registerVersionsCommands(program) {
|
|
|
311
434
|
}
|
|
312
435
|
}
|
|
313
436
|
});
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
.description('Uninstall agent CLI versions. Frees disk space and removes the version\'s auth token.')
|
|
317
|
-
.option('-p, --project', 'Also clear the pinned version from .agents/agents.yaml in the current project');
|
|
318
|
-
setHelpSections(removeCmd, {
|
|
319
|
-
examples: `
|
|
320
|
-
# Remove a specific version
|
|
321
|
-
agents remove claude@2.0.50
|
|
322
|
-
|
|
323
|
-
# Pick interactively if you omit the version
|
|
324
|
-
agents remove claude
|
|
325
|
-
|
|
326
|
-
# Remove and also clear the project pin
|
|
327
|
-
agents remove claude@2.0.50 --project
|
|
328
|
-
`,
|
|
329
|
-
notes: `
|
|
330
|
-
- Removing the default version unsets the default; run 'agents use' to pick a new one.
|
|
331
|
-
- Reinstall any time with 'agents add'.
|
|
332
|
-
`,
|
|
333
|
-
});
|
|
334
|
-
removeCmd.action(async (specs, options) => {
|
|
335
|
-
const isProject = options.project;
|
|
336
|
-
for (const spec of specs) {
|
|
337
|
-
const parsed = parseAgentSpec(spec);
|
|
338
|
-
if (!parsed) {
|
|
339
|
-
console.log(chalk.red(`Invalid agent: ${spec}`));
|
|
340
|
-
console.log(chalk.gray(`Format: <agent>[@version]. Available: ${ALL_AGENT_IDS.join(', ')}`));
|
|
341
|
-
continue;
|
|
342
|
-
}
|
|
343
|
-
const { agent, version } = parsed;
|
|
344
|
-
const agentConfig = AGENTS[agent];
|
|
345
|
-
if (version === 'latest' || !spec.includes('@')) {
|
|
346
|
-
// Show picker for which versions to remove
|
|
347
|
-
const versions = listInstalledVersions(agent);
|
|
348
|
-
if (versions.length === 0) {
|
|
349
|
-
console.log(chalk.gray(`No versions of ${agentLabel(agentConfig.id)} installed`));
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
if (!isInteractiveTerminal()) {
|
|
353
|
-
requireInteractiveSelection(`Selecting ${agentLabel(agentConfig.id)} versions to remove`, [
|
|
354
|
-
`agents remove ${agent}@${versions[0]}`,
|
|
355
|
-
]);
|
|
356
|
-
}
|
|
357
|
-
const globalDefault = getGlobalDefault(agent);
|
|
358
|
-
// Sort versions with default first
|
|
359
|
-
const sortedVersions = [...versions].sort((a, b) => {
|
|
360
|
-
if (a === globalDefault)
|
|
361
|
-
return -1;
|
|
362
|
-
if (b === globalDefault)
|
|
363
|
-
return 1;
|
|
364
|
-
return 0;
|
|
365
|
-
});
|
|
366
|
-
try {
|
|
367
|
-
const toRemove = await checkbox({
|
|
368
|
-
message: `Select ${agentLabel(agentConfig.id)} versions to remove:`,
|
|
369
|
-
choices: sortedVersions.map((v) => ({
|
|
370
|
-
name: v === globalDefault ? `${v} ${chalk.green('(default)')}` : v,
|
|
371
|
-
value: v,
|
|
372
|
-
checked: false, // All unchecked by default
|
|
373
|
-
})),
|
|
374
|
-
});
|
|
375
|
-
if (toRemove.length === 0) {
|
|
376
|
-
console.log(chalk.gray('No versions selected'));
|
|
377
|
-
continue;
|
|
378
|
-
}
|
|
379
|
-
for (const v of toRemove) {
|
|
380
|
-
const versionDir = getVersionDir(agent, v);
|
|
381
|
-
removeVersion(agent, v);
|
|
382
|
-
fixSessionFilePaths(agent, v, versionDir);
|
|
383
|
-
console.log(chalk.green(`Removed ${agentLabel(agentConfig.id)}@${v}`));
|
|
384
|
-
}
|
|
385
|
-
// Check if default was removed
|
|
386
|
-
if (globalDefault && toRemove.includes(globalDefault)) {
|
|
387
|
-
setGlobalDefault(agent, undefined);
|
|
388
|
-
console.log(chalk.yellow(`Default version removed. Run: agents use ${agent}@<version> to set a new default`));
|
|
389
|
-
}
|
|
390
|
-
// Remove shim if no versions left
|
|
391
|
-
const remaining = listInstalledVersions(agent);
|
|
392
|
-
if (remaining.length === 0) {
|
|
393
|
-
removeShim(agent);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
catch (err) {
|
|
397
|
-
if (isPromptCancelled(err)) {
|
|
398
|
-
console.log(chalk.gray('Cancelled'));
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
throw err;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
// Remove specific version
|
|
406
|
-
if (!isVersionInstalled(agent, version)) {
|
|
407
|
-
console.log(chalk.gray(`${agentLabel(agentConfig.id)}@${version} not installed`));
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
const versionDir = getVersionDir(agent, version);
|
|
411
|
-
removeVersion(agent, version);
|
|
412
|
-
fixSessionFilePaths(agent, version, versionDir);
|
|
413
|
-
console.log(chalk.green(`Removed ${agentLabel(agentConfig.id)}@${version}`));
|
|
414
|
-
// Remove shim if no versions left
|
|
415
|
-
const remaining = listInstalledVersions(agent);
|
|
416
|
-
if (remaining.length === 0) {
|
|
417
|
-
removeShim(agent);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
// Update project manifest if -p flag
|
|
422
|
-
if (isProject) {
|
|
423
|
-
const projectManifestPath = path.join(process.cwd(), '.agents', 'agents.yaml');
|
|
424
|
-
if (fs.existsSync(projectManifestPath)) {
|
|
425
|
-
const manifest = readManifest(process.cwd());
|
|
426
|
-
if (manifest?.agents?.[agent]) {
|
|
427
|
-
delete manifest.agents[agent];
|
|
428
|
-
writeManifest(process.cwd(), manifest);
|
|
429
|
-
console.log(chalk.gray(` Removed from .agents/agents.yaml`));
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
});
|
|
437
|
+
configureVersionPruneCommand(program.command('prune <specs...>'), 'prune');
|
|
438
|
+
configureVersionPruneCommand(program.command('remove <specs...>', { hidden: true }), 'remove');
|
|
435
439
|
const useCmd = program
|
|
436
440
|
.command('use <agent> [version]')
|
|
437
441
|
.description('Switch the active version for an agent. This is the only command that sets the default.')
|
|
@@ -573,7 +577,7 @@ export function registerVersionsCommands(program) {
|
|
|
573
577
|
// Smart resource detection: compare available vs ACTUALLY synced (source of truth: files, not tracking)
|
|
574
578
|
const available = getAvailableResources();
|
|
575
579
|
const actuallySynced = getActuallySyncedResources(agentId, finalVersion);
|
|
576
|
-
const newResources = getNewResources(available, actuallySynced);
|
|
580
|
+
const newResources = getNewResources(available, actuallySynced, getProjectOnlyResources());
|
|
577
581
|
// Check if anything is actually synced (source of truth: actual files)
|
|
578
582
|
const hasAnySynced = actuallySynced.commands.length > 0 ||
|
|
579
583
|
actuallySynced.skills.length > 0 ||
|
|
@@ -638,9 +642,9 @@ export function registerVersionsCommands(program) {
|
|
|
638
642
|
}
|
|
639
643
|
}
|
|
640
644
|
}
|
|
641
|
-
else if (hasNewResources(newResources, agentId)) {
|
|
645
|
+
else if (hasNewResources(newResources, agentId, finalVersion)) {
|
|
642
646
|
// Has synced before, but NEW items available
|
|
643
|
-
const userSelection = await promptNewResourceSelection(agentId, newResources);
|
|
647
|
+
const userSelection = await promptNewResourceSelection(agentId, newResources, finalVersion);
|
|
644
648
|
if (userSelection && Object.keys(userSelection).length > 0) {
|
|
645
649
|
const syncResult = syncResourcesToVersion(agentId, finalVersion, userSelection);
|
|
646
650
|
const syncedTypes = [];
|
package/dist/commands/view.d.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Command } from 'commander';
|
|
10
10
|
import type { AgentId } from '../lib/types.js';
|
|
11
|
+
import { type ProfileSummary } from '../lib/profiles.js';
|
|
11
12
|
/** Machine-readable entry for a single installed version. */
|
|
12
13
|
export interface ViewJsonVersion {
|
|
13
14
|
version: string;
|
|
@@ -16,6 +17,10 @@ export interface ViewJsonVersion {
|
|
|
16
17
|
email: string | null;
|
|
17
18
|
plan: string | null;
|
|
18
19
|
usageStatus: 'available' | 'rate_limited' | 'out_of_credits' | null;
|
|
20
|
+
overageCredits?: {
|
|
21
|
+
amount: number;
|
|
22
|
+
currency: string;
|
|
23
|
+
} | null;
|
|
19
24
|
windows: Array<{
|
|
20
25
|
key: 'session' | 'week' | 'sonnet_week';
|
|
21
26
|
usedPercent: number;
|
|
@@ -28,6 +33,7 @@ export interface ViewJsonVersion {
|
|
|
28
33
|
export interface ViewJsonAgent {
|
|
29
34
|
agent: AgentId;
|
|
30
35
|
versions: ViewJsonVersion[];
|
|
36
|
+
profiles: ProfileSummary[];
|
|
31
37
|
}
|
|
32
38
|
/**
|
|
33
39
|
* Prune older installed versions that share an email with a newer installed
|