@packmind/cli 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/main.cjs +190 -98
- package/package.json +1 -1
package/main.cjs
CHANGED
|
@@ -3852,7 +3852,7 @@ var require_package = __commonJS({
|
|
|
3852
3852
|
"apps/cli/package.json"(exports2, module2) {
|
|
3853
3853
|
module2.exports = {
|
|
3854
3854
|
name: "@packmind/cli",
|
|
3855
|
-
version: "0.
|
|
3855
|
+
version: "0.11.0",
|
|
3856
3856
|
description: "A command-line interface for Packmind linting and code quality checks",
|
|
3857
3857
|
private: false,
|
|
3858
3858
|
bin: {
|
|
@@ -4034,8 +4034,23 @@ var UserJoinedOrganizationEvent = class extends PackmindEvent {
|
|
|
4034
4034
|
}
|
|
4035
4035
|
};
|
|
4036
4036
|
|
|
4037
|
-
// packages/types/src/
|
|
4038
|
-
var
|
|
4037
|
+
// packages/types/src/accounts/events/AnonymousTrialStartedEvent.ts
|
|
4038
|
+
var AnonymousTrialStartedEvent = class extends PackmindEvent {
|
|
4039
|
+
static {
|
|
4040
|
+
this.eventName = "accounts.anonymous-trial.started";
|
|
4041
|
+
}
|
|
4042
|
+
};
|
|
4043
|
+
|
|
4044
|
+
// packages/types/src/accounts/events/AnonymousTrialAccountActivatedEvent.ts
|
|
4045
|
+
var AnonymousTrialAccountActivatedEvent = class extends PackmindEvent {
|
|
4046
|
+
static {
|
|
4047
|
+
this.eventName = "accounts.anonymous-trial.activated";
|
|
4048
|
+
}
|
|
4049
|
+
};
|
|
4050
|
+
|
|
4051
|
+
// packages/types/src/accounts/TrialActivationToken.ts
|
|
4052
|
+
var createTrialActivationTokenId = brandedIdFactory();
|
|
4053
|
+
var createTrialActivationToken = brandedIdFactory();
|
|
4039
4054
|
|
|
4040
4055
|
// packages/types/src/recipes/RecipeId.ts
|
|
4041
4056
|
var createRecipeId = brandedIdFactory();
|
|
@@ -4043,27 +4058,30 @@ var createRecipeId = brandedIdFactory();
|
|
|
4043
4058
|
// packages/types/src/recipes/RecipeVersion.ts
|
|
4044
4059
|
var createRecipeVersionId = brandedIdFactory();
|
|
4045
4060
|
|
|
4046
|
-
// packages/types/src/recipes/events/
|
|
4047
|
-
var
|
|
4061
|
+
// packages/types/src/recipes/events/CommandCreatedEvent.ts
|
|
4062
|
+
var CommandCreatedEvent = class extends UserEvent {
|
|
4048
4063
|
static {
|
|
4049
4064
|
this.eventName = "recipes.recipe.created";
|
|
4050
4065
|
}
|
|
4051
4066
|
};
|
|
4052
4067
|
|
|
4053
|
-
// packages/types/src/recipes/events/
|
|
4054
|
-
var
|
|
4068
|
+
// packages/types/src/recipes/events/CommandDeletedEvent.ts
|
|
4069
|
+
var CommandDeletedEvent = class extends UserEvent {
|
|
4055
4070
|
static {
|
|
4056
4071
|
this.eventName = "recipes.recipe.deleted";
|
|
4057
4072
|
}
|
|
4058
4073
|
};
|
|
4059
4074
|
|
|
4060
|
-
// packages/types/src/recipes/events/
|
|
4061
|
-
var
|
|
4075
|
+
// packages/types/src/recipes/events/CommandUpdatedEvent.ts
|
|
4076
|
+
var CommandUpdatedEvent = class extends UserEvent {
|
|
4062
4077
|
static {
|
|
4063
4078
|
this.eventName = "recipes.recipe.updated";
|
|
4064
4079
|
}
|
|
4065
4080
|
};
|
|
4066
4081
|
|
|
4082
|
+
// packages/types/src/skills/SkillId.ts
|
|
4083
|
+
var createSkillId = brandedIdFactory();
|
|
4084
|
+
|
|
4067
4085
|
// packages/types/src/deployments/TargetId.ts
|
|
4068
4086
|
var createTargetId = brandedIdFactory();
|
|
4069
4087
|
|
|
@@ -9313,6 +9331,24 @@ function mergeSectionsIntoFileContent(existingContent, sections) {
|
|
|
9313
9331
|
const endMarker = `<!-- end: ${section.key} -->`;
|
|
9314
9332
|
const startIndex = result.indexOf(startMarker);
|
|
9315
9333
|
const endIndex = result.indexOf(endMarker);
|
|
9334
|
+
if (section.content.trim() === "") {
|
|
9335
|
+
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
|
|
9336
|
+
const before = result.substring(0, startIndex);
|
|
9337
|
+
const after = result.substring(endIndex + endMarker.length);
|
|
9338
|
+
const trimmedBefore = before.trimEnd();
|
|
9339
|
+
const trimmedAfter = after.trimStart();
|
|
9340
|
+
if (trimmedBefore === "" && trimmedAfter === "") {
|
|
9341
|
+
result = "";
|
|
9342
|
+
} else if (trimmedBefore === "") {
|
|
9343
|
+
result = trimmedAfter;
|
|
9344
|
+
} else if (trimmedAfter === "") {
|
|
9345
|
+
result = trimmedBefore + "\n";
|
|
9346
|
+
} else {
|
|
9347
|
+
result = trimmedBefore + "\n" + trimmedAfter;
|
|
9348
|
+
}
|
|
9349
|
+
}
|
|
9350
|
+
continue;
|
|
9351
|
+
}
|
|
9316
9352
|
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
|
|
9317
9353
|
const before = result.substring(0, startIndex + startMarker.length);
|
|
9318
9354
|
const after = result.substring(endIndex);
|
|
@@ -9448,18 +9484,26 @@ var InstallPackagesUseCase = class {
|
|
|
9448
9484
|
sections
|
|
9449
9485
|
);
|
|
9450
9486
|
if (currentContent !== mergedContent) {
|
|
9451
|
-
|
|
9452
|
-
|
|
9453
|
-
result.
|
|
9487
|
+
if (this.isEffectivelyEmpty(mergedContent) && fileExists) {
|
|
9488
|
+
await fs4.unlink(fullPath);
|
|
9489
|
+
result.filesDeleted++;
|
|
9454
9490
|
} else {
|
|
9455
|
-
|
|
9491
|
+
await fs4.writeFile(fullPath, mergedContent, "utf-8");
|
|
9492
|
+
if (fileExists) {
|
|
9493
|
+
result.filesUpdated++;
|
|
9494
|
+
} else {
|
|
9495
|
+
result.filesCreated++;
|
|
9496
|
+
}
|
|
9456
9497
|
}
|
|
9457
9498
|
}
|
|
9458
9499
|
}
|
|
9459
9500
|
async deleteFile(baseDirectory, filePath, result) {
|
|
9460
9501
|
const fullPath = path5.join(baseDirectory, filePath);
|
|
9461
|
-
const
|
|
9462
|
-
if (
|
|
9502
|
+
const stat4 = await fs4.stat(fullPath).catch(() => null);
|
|
9503
|
+
if (stat4?.isDirectory()) {
|
|
9504
|
+
await fs4.rm(fullPath, { recursive: true, force: true });
|
|
9505
|
+
result.filesDeleted++;
|
|
9506
|
+
} else if (stat4?.isFile()) {
|
|
9463
9507
|
await fs4.unlink(fullPath);
|
|
9464
9508
|
result.filesDeleted++;
|
|
9465
9509
|
}
|
|
@@ -9511,6 +9555,17 @@ ${newSectionContent}
|
|
|
9511
9555
|
${endMarker}`;
|
|
9512
9556
|
}
|
|
9513
9557
|
}
|
|
9558
|
+
/**
|
|
9559
|
+
* Checks if content is effectively empty (only whitespace and empty section markers).
|
|
9560
|
+
* This helps determine if a file should be deleted after section removal.
|
|
9561
|
+
*/
|
|
9562
|
+
isEffectivelyEmpty(content) {
|
|
9563
|
+
const withoutEmptySections = content.replace(
|
|
9564
|
+
/<!--\s*start:\s*[^-]+?\s*-->\s*<!--\s*end:\s*[^-]+?\s*-->/g,
|
|
9565
|
+
""
|
|
9566
|
+
);
|
|
9567
|
+
return withoutEmptySections.trim() === "";
|
|
9568
|
+
}
|
|
9514
9569
|
/**
|
|
9515
9570
|
* Escapes special regex characters in a string
|
|
9516
9571
|
*/
|
|
@@ -9905,7 +9960,8 @@ var WhoamiUseCase = class {
|
|
|
9905
9960
|
var ALL_AGENTS = [
|
|
9906
9961
|
{ type: "claude", name: "Claude Code" },
|
|
9907
9962
|
{ type: "cursor", name: "Cursor" },
|
|
9908
|
-
{ type: "vscode", name: "VS Code" }
|
|
9963
|
+
{ type: "vscode", name: "VS Code" },
|
|
9964
|
+
{ type: "continue", name: "Continue.dev" }
|
|
9909
9965
|
];
|
|
9910
9966
|
var SetupMcpUseCase = class {
|
|
9911
9967
|
constructor(deps) {
|
|
@@ -9963,6 +10019,8 @@ var McpConfigService = class {
|
|
|
9963
10019
|
return this.installCursorMcp(config);
|
|
9964
10020
|
case "vscode":
|
|
9965
10021
|
return this.installVSCodeMcp(config);
|
|
10022
|
+
case "continue":
|
|
10023
|
+
return this.installContinueMcp(config);
|
|
9966
10024
|
default:
|
|
9967
10025
|
return { success: false, error: `Unknown agent: ${agent}` };
|
|
9968
10026
|
}
|
|
@@ -10021,6 +10079,22 @@ var McpConfigService = class {
|
|
|
10021
10079
|
return { success: false, error: errorMessage };
|
|
10022
10080
|
}
|
|
10023
10081
|
}
|
|
10082
|
+
installContinueMcp(config) {
|
|
10083
|
+
try {
|
|
10084
|
+
const continueDir = path7.join(this.projectDir, ".continue");
|
|
10085
|
+
const mcpServersDir = path7.join(continueDir, "mcpServers");
|
|
10086
|
+
if (!fs7.existsSync(mcpServersDir)) {
|
|
10087
|
+
fs7.mkdirSync(mcpServersDir, { recursive: true });
|
|
10088
|
+
}
|
|
10089
|
+
const continueConfigPath = path7.join(mcpServersDir, "packmind.yaml");
|
|
10090
|
+
const continueConfig = this.buildContinueYamlConfig(config);
|
|
10091
|
+
fs7.writeFileSync(continueConfigPath, continueConfig);
|
|
10092
|
+
return { success: true };
|
|
10093
|
+
} catch (error) {
|
|
10094
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
10095
|
+
return { success: false, error: errorMessage };
|
|
10096
|
+
}
|
|
10097
|
+
}
|
|
10024
10098
|
buildCursorConfig(config) {
|
|
10025
10099
|
return {
|
|
10026
10100
|
mcpServers: {
|
|
@@ -10047,6 +10121,19 @@ var McpConfigService = class {
|
|
|
10047
10121
|
inputs: []
|
|
10048
10122
|
};
|
|
10049
10123
|
}
|
|
10124
|
+
buildContinueYamlConfig(config) {
|
|
10125
|
+
return `name: Packmind MCP Server
|
|
10126
|
+
version: 0.0.1
|
|
10127
|
+
schema: v1
|
|
10128
|
+
mcpServers:
|
|
10129
|
+
- name: Packmind
|
|
10130
|
+
type: streamable-http
|
|
10131
|
+
url: ${config.url}
|
|
10132
|
+
requestOptions:
|
|
10133
|
+
headers:
|
|
10134
|
+
Authorization: "Bearer ${config.accessToken}"
|
|
10135
|
+
`;
|
|
10136
|
+
}
|
|
10050
10137
|
readExistingJsonConfig(filePath) {
|
|
10051
10138
|
try {
|
|
10052
10139
|
if (fs7.existsSync(filePath)) {
|
|
@@ -10810,6 +10897,34 @@ var path10 = __toESM(require("path"));
|
|
|
10810
10897
|
var import_cmd_ts2 = __toESM(require_cjs());
|
|
10811
10898
|
|
|
10812
10899
|
// apps/cli/src/infra/commands/installPackagesHandler.ts
|
|
10900
|
+
async function notifyDistributionIfInGitRepo(params) {
|
|
10901
|
+
const { packmindCliHexa, cwd, packages, log } = params;
|
|
10902
|
+
const gitRoot = await packmindCliHexa.tryGetGitRepositoryRoot(cwd);
|
|
10903
|
+
if (!gitRoot) {
|
|
10904
|
+
return false;
|
|
10905
|
+
}
|
|
10906
|
+
try {
|
|
10907
|
+
const gitRemoteUrl = packmindCliHexa.getGitRemoteUrlFromPath(gitRoot);
|
|
10908
|
+
const gitBranch = packmindCliHexa.getCurrentBranch(gitRoot);
|
|
10909
|
+
let relativePath = cwd.startsWith(gitRoot) ? cwd.slice(gitRoot.length) : "/";
|
|
10910
|
+
if (!relativePath.startsWith("/")) {
|
|
10911
|
+
relativePath = "/" + relativePath;
|
|
10912
|
+
}
|
|
10913
|
+
if (!relativePath.endsWith("/")) {
|
|
10914
|
+
relativePath = relativePath + "/";
|
|
10915
|
+
}
|
|
10916
|
+
await packmindCliHexa.notifyDistribution({
|
|
10917
|
+
distributedPackages: packages,
|
|
10918
|
+
gitRemoteUrl,
|
|
10919
|
+
gitBranch,
|
|
10920
|
+
relativePath
|
|
10921
|
+
});
|
|
10922
|
+
log("Successfully notified Packmind of the new distribution");
|
|
10923
|
+
return true;
|
|
10924
|
+
} catch {
|
|
10925
|
+
return false;
|
|
10926
|
+
}
|
|
10927
|
+
}
|
|
10813
10928
|
async function listPackagesHandler(_args, deps) {
|
|
10814
10929
|
const { packmindCliHexa, exit, log, error } = deps;
|
|
10815
10930
|
try {
|
|
@@ -10878,7 +10993,7 @@ async function showPackageHandler(args2, deps) {
|
|
|
10878
10993
|
log("");
|
|
10879
10994
|
}
|
|
10880
10995
|
if (pkg.recipes && pkg.recipes.length > 0) {
|
|
10881
|
-
log("
|
|
10996
|
+
log("Commands:");
|
|
10882
10997
|
pkg.recipes.forEach((recipe) => {
|
|
10883
10998
|
if (recipe.summary) {
|
|
10884
10999
|
log(` - ${recipe.name}: ${recipe.summary}`);
|
|
@@ -11009,7 +11124,7 @@ async function executeInstallForDirectory(directory, deps) {
|
|
|
11009
11124
|
// Pass for consistency
|
|
11010
11125
|
});
|
|
11011
11126
|
log(
|
|
11012
|
-
` Installing ${result.recipesCount}
|
|
11127
|
+
` Installing ${result.recipesCount} commands and ${result.standardsCount} standards...`
|
|
11013
11128
|
);
|
|
11014
11129
|
log(
|
|
11015
11130
|
` added ${result.filesCreated} files, changed ${result.filesUpdated} files, removed ${result.filesDeleted} files`
|
|
@@ -11025,29 +11140,14 @@ async function executeInstallForDirectory(directory, deps) {
|
|
|
11025
11140
|
};
|
|
11026
11141
|
}
|
|
11027
11142
|
let notificationSent = false;
|
|
11028
|
-
if (result.filesCreated > 0 || result.filesUpdated > 0) {
|
|
11029
|
-
|
|
11030
|
-
|
|
11031
|
-
|
|
11032
|
-
|
|
11033
|
-
|
|
11034
|
-
let relativePath = directory.startsWith(gitRoot) ? directory.slice(gitRoot.length) : "/";
|
|
11035
|
-
if (!relativePath.startsWith("/")) {
|
|
11036
|
-
relativePath = "/" + relativePath;
|
|
11037
|
-
}
|
|
11038
|
-
if (!relativePath.endsWith("/")) {
|
|
11039
|
-
relativePath = relativePath + "/";
|
|
11040
|
-
}
|
|
11041
|
-
await packmindCliHexa.notifyDistribution({
|
|
11042
|
-
distributedPackages: configPackages,
|
|
11043
|
-
gitRemoteUrl,
|
|
11044
|
-
gitBranch,
|
|
11045
|
-
relativePath
|
|
11046
|
-
});
|
|
11047
|
-
notificationSent = true;
|
|
11048
|
-
} catch {
|
|
11143
|
+
if (result.filesCreated > 0 || result.filesUpdated > 0 || result.filesDeleted > 0) {
|
|
11144
|
+
notificationSent = await notifyDistributionIfInGitRepo({
|
|
11145
|
+
packmindCliHexa,
|
|
11146
|
+
cwd: directory,
|
|
11147
|
+
packages: configPackages,
|
|
11148
|
+
log: () => {
|
|
11049
11149
|
}
|
|
11050
|
-
}
|
|
11150
|
+
});
|
|
11051
11151
|
}
|
|
11052
11152
|
return {
|
|
11053
11153
|
success: true,
|
|
@@ -11110,7 +11210,7 @@ async function installPackagesHandler(args2, deps) {
|
|
|
11110
11210
|
log(" packmind-cli install backend frontend");
|
|
11111
11211
|
log(" packmind-cli install --list # Show available packages");
|
|
11112
11212
|
log("");
|
|
11113
|
-
log("Install
|
|
11213
|
+
log("Install commands and standards from the specified packages.");
|
|
11114
11214
|
exit(0);
|
|
11115
11215
|
return {
|
|
11116
11216
|
filesCreated: 0,
|
|
@@ -11135,7 +11235,7 @@ async function installPackagesHandler(args2, deps) {
|
|
|
11135
11235
|
// Pass previous config for change detection
|
|
11136
11236
|
});
|
|
11137
11237
|
log(
|
|
11138
|
-
`Installing ${result.recipesCount}
|
|
11238
|
+
`Installing ${result.recipesCount} commands and ${result.standardsCount} standards...`
|
|
11139
11239
|
);
|
|
11140
11240
|
log(
|
|
11141
11241
|
`
|
|
@@ -11155,30 +11255,13 @@ added ${result.filesCreated} files, changed ${result.filesUpdated} files, remove
|
|
|
11155
11255
|
};
|
|
11156
11256
|
}
|
|
11157
11257
|
let notificationSent = false;
|
|
11158
|
-
if (result.filesCreated > 0 || result.filesUpdated > 0) {
|
|
11159
|
-
|
|
11160
|
-
|
|
11161
|
-
|
|
11162
|
-
|
|
11163
|
-
|
|
11164
|
-
|
|
11165
|
-
if (!relativePath.startsWith("/")) {
|
|
11166
|
-
relativePath = "/" + relativePath;
|
|
11167
|
-
}
|
|
11168
|
-
if (!relativePath.endsWith("/")) {
|
|
11169
|
-
relativePath = relativePath + "/";
|
|
11170
|
-
}
|
|
11171
|
-
await packmindCliHexa.notifyDistribution({
|
|
11172
|
-
distributedPackages: allPackages,
|
|
11173
|
-
gitRemoteUrl,
|
|
11174
|
-
gitBranch,
|
|
11175
|
-
relativePath
|
|
11176
|
-
});
|
|
11177
|
-
log("Successfully notified Packmind of the new distribution");
|
|
11178
|
-
notificationSent = true;
|
|
11179
|
-
} catch {
|
|
11180
|
-
}
|
|
11181
|
-
}
|
|
11258
|
+
if (result.filesCreated > 0 || result.filesUpdated > 0 || result.filesDeleted > 0) {
|
|
11259
|
+
notificationSent = await notifyDistributionIfInGitRepo({
|
|
11260
|
+
packmindCliHexa,
|
|
11261
|
+
cwd,
|
|
11262
|
+
packages: allPackages,
|
|
11263
|
+
log
|
|
11264
|
+
});
|
|
11182
11265
|
}
|
|
11183
11266
|
return {
|
|
11184
11267
|
filesCreated: result.filesCreated,
|
|
@@ -11341,32 +11424,26 @@ async function uninstallPackagesHandler(args2, deps) {
|
|
|
11341
11424
|
);
|
|
11342
11425
|
let filesDeleted = 0;
|
|
11343
11426
|
if (remainingPackages.length === 0) {
|
|
11344
|
-
log("Removing all packages and cleaning up
|
|
11345
|
-
const
|
|
11346
|
-
|
|
11347
|
-
|
|
11348
|
-
|
|
11349
|
-
|
|
11350
|
-
const files = await fs12.readdir(packmindDir, { recursive: true });
|
|
11351
|
-
filesDeleted = files.filter(
|
|
11352
|
-
(f) => typeof f === "string" ? !f.endsWith("/") : true
|
|
11353
|
-
).length;
|
|
11354
|
-
await fs12.rm(packmindDir, { recursive: true, force: true });
|
|
11355
|
-
}
|
|
11356
|
-
const agentsMdPath = `${cwd}/AGENTS.md`;
|
|
11357
|
-
const agentsMdExists = await fs12.access(agentsMdPath).then(() => true).catch(() => false);
|
|
11358
|
-
if (agentsMdExists) {
|
|
11359
|
-
await fs12.unlink(agentsMdPath);
|
|
11360
|
-
filesDeleted++;
|
|
11361
|
-
}
|
|
11362
|
-
} catch (err) {
|
|
11363
|
-
error("\n\u26A0\uFE0F Warning: Failed to clean up some files:");
|
|
11364
|
-
if (err instanceof Error) {
|
|
11365
|
-
error(` ${err.message}`);
|
|
11366
|
-
}
|
|
11367
|
-
}
|
|
11427
|
+
log("Removing all packages and cleaning up...");
|
|
11428
|
+
const result = await packmindCliHexa.installPackages({
|
|
11429
|
+
baseDirectory: cwd,
|
|
11430
|
+
packagesSlugs: [],
|
|
11431
|
+
previousPackagesSlugs: configPackages
|
|
11432
|
+
});
|
|
11368
11433
|
log(`
|
|
11369
|
-
removed ${filesDeleted} files`);
|
|
11434
|
+
removed ${result.filesDeleted} files`);
|
|
11435
|
+
if (result.errors.length > 0) {
|
|
11436
|
+
log("\n\u26A0\uFE0F Errors encountered:");
|
|
11437
|
+
result.errors.forEach((err) => {
|
|
11438
|
+
log(` - ${err}`);
|
|
11439
|
+
});
|
|
11440
|
+
exit(1);
|
|
11441
|
+
return {
|
|
11442
|
+
filesDeleted: result.filesDeleted,
|
|
11443
|
+
packagesUninstalled: packagesToUninstall
|
|
11444
|
+
};
|
|
11445
|
+
}
|
|
11446
|
+
filesDeleted = result.filesDeleted;
|
|
11370
11447
|
} else {
|
|
11371
11448
|
const result = await packmindCliHexa.installPackages({
|
|
11372
11449
|
baseDirectory: cwd,
|
|
@@ -11375,7 +11452,7 @@ removed ${filesDeleted} files`);
|
|
|
11375
11452
|
});
|
|
11376
11453
|
if (result.recipesCount > 0 || result.standardsCount > 0) {
|
|
11377
11454
|
log(
|
|
11378
|
-
`Removing ${result.recipesCount}
|
|
11455
|
+
`Removing ${result.recipesCount} commands and ${result.standardsCount} standards...`
|
|
11379
11456
|
);
|
|
11380
11457
|
}
|
|
11381
11458
|
log(`
|
|
@@ -11394,6 +11471,12 @@ removed ${result.filesDeleted} files`);
|
|
|
11394
11471
|
filesDeleted = result.filesDeleted;
|
|
11395
11472
|
}
|
|
11396
11473
|
await packmindCliHexa.writeConfig(cwd, remainingPackages);
|
|
11474
|
+
await notifyDistributionIfInGitRepo({
|
|
11475
|
+
packmindCliHexa,
|
|
11476
|
+
cwd,
|
|
11477
|
+
packages: remainingPackages,
|
|
11478
|
+
log
|
|
11479
|
+
});
|
|
11397
11480
|
log("");
|
|
11398
11481
|
if (packagesToUninstall.length === 1) {
|
|
11399
11482
|
log(`\u2713 Package '${packagesToUninstall[0]}' has been uninstalled.`);
|
|
@@ -11517,7 +11600,7 @@ async function recursiveInstallHandler(_args, deps) {
|
|
|
11517
11600
|
// apps/cli/src/infra/commands/InstallCommand.ts
|
|
11518
11601
|
var installCommand = (0, import_cmd_ts2.command)({
|
|
11519
11602
|
name: "install",
|
|
11520
|
-
description: "Install
|
|
11603
|
+
description: "Install commands and standards from specified packages and save them to the current directory",
|
|
11521
11604
|
aliases: ["pull"],
|
|
11522
11605
|
args: {
|
|
11523
11606
|
list: (0, import_cmd_ts2.flag)({
|
|
@@ -11579,7 +11662,7 @@ var installCommand = (0, import_cmd_ts2.command)({
|
|
|
11579
11662
|
var import_cmd_ts3 = __toESM(require_cjs());
|
|
11580
11663
|
var uninstallCommand = (0, import_cmd_ts3.command)({
|
|
11581
11664
|
name: "uninstall",
|
|
11582
|
-
description: "Uninstall packages and remove their
|
|
11665
|
+
description: "Uninstall packages and remove their commands and standards from the current directory",
|
|
11583
11666
|
args: {
|
|
11584
11667
|
packagesSlugs: (0, import_cmd_ts3.restPositionals)({
|
|
11585
11668
|
type: import_cmd_ts3.string,
|
|
@@ -11791,6 +11874,9 @@ var AgentDetectionService = class {
|
|
|
11791
11874
|
if (this.isVSCodeAvailable()) {
|
|
11792
11875
|
agents.push({ type: "vscode", name: "VS Code" });
|
|
11793
11876
|
}
|
|
11877
|
+
if (this.isContinueAvailable()) {
|
|
11878
|
+
agents.push({ type: "continue", name: "Continue.dev" });
|
|
11879
|
+
}
|
|
11794
11880
|
return agents;
|
|
11795
11881
|
}
|
|
11796
11882
|
isClaudeAvailable() {
|
|
@@ -11804,6 +11890,10 @@ var AgentDetectionService = class {
|
|
|
11804
11890
|
const vscodeDir = path9.join(this.projectDir, ".vscode");
|
|
11805
11891
|
return fs9.existsSync(vscodeDir);
|
|
11806
11892
|
}
|
|
11893
|
+
isContinueAvailable() {
|
|
11894
|
+
const continueDir = path9.join(this.projectDir, ".continue");
|
|
11895
|
+
return fs9.existsSync(continueDir);
|
|
11896
|
+
}
|
|
11807
11897
|
isCommandAvailable(command8) {
|
|
11808
11898
|
try {
|
|
11809
11899
|
const whichCommand = process.platform === "win32" ? "where" : "which";
|
|
@@ -11816,11 +11906,12 @@ var AgentDetectionService = class {
|
|
|
11816
11906
|
};
|
|
11817
11907
|
|
|
11818
11908
|
// apps/cli/src/infra/commands/SetupMcpCommand.ts
|
|
11819
|
-
var VALID_AGENTS = ["copilot", "cursor", "claude"];
|
|
11909
|
+
var VALID_AGENTS = ["copilot", "cursor", "claude", "continue"];
|
|
11820
11910
|
var agentArgToType = {
|
|
11821
11911
|
copilot: "vscode",
|
|
11822
11912
|
cursor: "cursor",
|
|
11823
|
-
claude: "claude"
|
|
11913
|
+
claude: "claude",
|
|
11914
|
+
continue: "continue"
|
|
11824
11915
|
};
|
|
11825
11916
|
var AgentArgType = {
|
|
11826
11917
|
from: async (input) => {
|
|
@@ -11836,7 +11927,8 @@ var AgentArgType = {
|
|
|
11836
11927
|
var ALL_AGENTS2 = [
|
|
11837
11928
|
{ type: "claude", name: "Claude Code" },
|
|
11838
11929
|
{ type: "cursor", name: "Cursor" },
|
|
11839
|
-
{ type: "vscode", name: "VS Code" }
|
|
11930
|
+
{ type: "vscode", name: "VS Code" },
|
|
11931
|
+
{ type: "continue", name: "Continue.dev" }
|
|
11840
11932
|
];
|
|
11841
11933
|
async function promptAgentsWithReadline(choices) {
|
|
11842
11934
|
const input = fs10.createReadStream("/dev/tty");
|
|
@@ -11878,7 +11970,7 @@ var setupMcpCommand = (0, import_cmd_ts7.command)({
|
|
|
11878
11970
|
type: (0, import_cmd_ts7.array)(AgentArgType),
|
|
11879
11971
|
long: "target",
|
|
11880
11972
|
short: "t",
|
|
11881
|
-
description: "Target agent(s) to configure (copilot, cursor, or
|
|
11973
|
+
description: "Target agent(s) to configure (copilot, cursor, claude, or continue). Can be specified multiple times. If omitted, interactive mode is used."
|
|
11882
11974
|
})
|
|
11883
11975
|
},
|
|
11884
11976
|
handler: async ({ targets }) => {
|