@packmind/cli 0.8.0 → 0.10.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 +242 -89
- 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.10.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/TrialStartedEvent.ts
|
|
4038
|
+
var TrialStartedEvent = class extends PackmindEvent {
|
|
4039
|
+
static {
|
|
4040
|
+
this.eventName = "accounts.trial.started";
|
|
4041
|
+
}
|
|
4042
|
+
};
|
|
4043
|
+
|
|
4044
|
+
// packages/types/src/accounts/events/TrialAccountActivatedEvent.ts
|
|
4045
|
+
var TrialAccountActivatedEvent = class extends PackmindEvent {
|
|
4046
|
+
static {
|
|
4047
|
+
this.eventName = "accounts.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();
|
|
@@ -4076,7 +4091,8 @@ var RENDER_MODE_ORDER = [
|
|
|
4076
4091
|
"GH_COPILOT" /* GH_COPILOT */,
|
|
4077
4092
|
"CLAUDE" /* CLAUDE */,
|
|
4078
4093
|
"CURSOR" /* CURSOR */,
|
|
4079
|
-
"GITLAB_DUO" /* GITLAB_DUO
|
|
4094
|
+
"GITLAB_DUO" /* GITLAB_DUO */,
|
|
4095
|
+
"CONTINUE" /* CONTINUE */
|
|
4080
4096
|
];
|
|
4081
4097
|
var normalizeRenderModes = (modes) => {
|
|
4082
4098
|
const uniqueModes = new Set(modes);
|
|
@@ -9312,6 +9328,24 @@ function mergeSectionsIntoFileContent(existingContent, sections) {
|
|
|
9312
9328
|
const endMarker = `<!-- end: ${section.key} -->`;
|
|
9313
9329
|
const startIndex = result.indexOf(startMarker);
|
|
9314
9330
|
const endIndex = result.indexOf(endMarker);
|
|
9331
|
+
if (section.content.trim() === "") {
|
|
9332
|
+
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
|
|
9333
|
+
const before = result.substring(0, startIndex);
|
|
9334
|
+
const after = result.substring(endIndex + endMarker.length);
|
|
9335
|
+
const trimmedBefore = before.trimEnd();
|
|
9336
|
+
const trimmedAfter = after.trimStart();
|
|
9337
|
+
if (trimmedBefore === "" && trimmedAfter === "") {
|
|
9338
|
+
result = "";
|
|
9339
|
+
} else if (trimmedBefore === "") {
|
|
9340
|
+
result = trimmedAfter;
|
|
9341
|
+
} else if (trimmedAfter === "") {
|
|
9342
|
+
result = trimmedBefore + "\n";
|
|
9343
|
+
} else {
|
|
9344
|
+
result = trimmedBefore + "\n" + trimmedAfter;
|
|
9345
|
+
}
|
|
9346
|
+
}
|
|
9347
|
+
continue;
|
|
9348
|
+
}
|
|
9315
9349
|
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
|
|
9316
9350
|
const before = result.substring(0, startIndex + startMarker.length);
|
|
9317
9351
|
const after = result.substring(endIndex);
|
|
@@ -9447,18 +9481,26 @@ var InstallPackagesUseCase = class {
|
|
|
9447
9481
|
sections
|
|
9448
9482
|
);
|
|
9449
9483
|
if (currentContent !== mergedContent) {
|
|
9450
|
-
|
|
9451
|
-
|
|
9452
|
-
result.
|
|
9484
|
+
if (this.isEffectivelyEmpty(mergedContent) && fileExists) {
|
|
9485
|
+
await fs4.unlink(fullPath);
|
|
9486
|
+
result.filesDeleted++;
|
|
9453
9487
|
} else {
|
|
9454
|
-
|
|
9488
|
+
await fs4.writeFile(fullPath, mergedContent, "utf-8");
|
|
9489
|
+
if (fileExists) {
|
|
9490
|
+
result.filesUpdated++;
|
|
9491
|
+
} else {
|
|
9492
|
+
result.filesCreated++;
|
|
9493
|
+
}
|
|
9455
9494
|
}
|
|
9456
9495
|
}
|
|
9457
9496
|
}
|
|
9458
9497
|
async deleteFile(baseDirectory, filePath, result) {
|
|
9459
9498
|
const fullPath = path5.join(baseDirectory, filePath);
|
|
9460
|
-
const
|
|
9461
|
-
if (
|
|
9499
|
+
const stat4 = await fs4.stat(fullPath).catch(() => null);
|
|
9500
|
+
if (stat4?.isDirectory()) {
|
|
9501
|
+
await fs4.rm(fullPath, { recursive: true, force: true });
|
|
9502
|
+
result.filesDeleted++;
|
|
9503
|
+
} else if (stat4?.isFile()) {
|
|
9462
9504
|
await fs4.unlink(fullPath);
|
|
9463
9505
|
result.filesDeleted++;
|
|
9464
9506
|
}
|
|
@@ -9510,6 +9552,17 @@ ${newSectionContent}
|
|
|
9510
9552
|
${endMarker}`;
|
|
9511
9553
|
}
|
|
9512
9554
|
}
|
|
9555
|
+
/**
|
|
9556
|
+
* Checks if content is effectively empty (only whitespace and empty section markers).
|
|
9557
|
+
* This helps determine if a file should be deleted after section removal.
|
|
9558
|
+
*/
|
|
9559
|
+
isEffectivelyEmpty(content) {
|
|
9560
|
+
const withoutEmptySections = content.replace(
|
|
9561
|
+
/<!--\s*start:\s*[^-]+?\s*-->\s*<!--\s*end:\s*[^-]+?\s*-->/g,
|
|
9562
|
+
""
|
|
9563
|
+
);
|
|
9564
|
+
return withoutEmptySections.trim() === "";
|
|
9565
|
+
}
|
|
9513
9566
|
/**
|
|
9514
9567
|
* Escapes special regex characters in a string
|
|
9515
9568
|
*/
|
|
@@ -9904,7 +9957,8 @@ var WhoamiUseCase = class {
|
|
|
9904
9957
|
var ALL_AGENTS = [
|
|
9905
9958
|
{ type: "claude", name: "Claude Code" },
|
|
9906
9959
|
{ type: "cursor", name: "Cursor" },
|
|
9907
|
-
{ type: "vscode", name: "VS Code" }
|
|
9960
|
+
{ type: "vscode", name: "VS Code" },
|
|
9961
|
+
{ type: "continue", name: "Continue.dev" }
|
|
9908
9962
|
];
|
|
9909
9963
|
var SetupMcpUseCase = class {
|
|
9910
9964
|
constructor(deps) {
|
|
@@ -9962,6 +10016,8 @@ var McpConfigService = class {
|
|
|
9962
10016
|
return this.installCursorMcp(config);
|
|
9963
10017
|
case "vscode":
|
|
9964
10018
|
return this.installVSCodeMcp(config);
|
|
10019
|
+
case "continue":
|
|
10020
|
+
return this.installContinueMcp(config);
|
|
9965
10021
|
default:
|
|
9966
10022
|
return { success: false, error: `Unknown agent: ${agent}` };
|
|
9967
10023
|
}
|
|
@@ -10020,6 +10076,22 @@ var McpConfigService = class {
|
|
|
10020
10076
|
return { success: false, error: errorMessage };
|
|
10021
10077
|
}
|
|
10022
10078
|
}
|
|
10079
|
+
installContinueMcp(config) {
|
|
10080
|
+
try {
|
|
10081
|
+
const continueDir = path7.join(this.projectDir, ".continue");
|
|
10082
|
+
const mcpServersDir = path7.join(continueDir, "mcpServers");
|
|
10083
|
+
if (!fs7.existsSync(mcpServersDir)) {
|
|
10084
|
+
fs7.mkdirSync(mcpServersDir, { recursive: true });
|
|
10085
|
+
}
|
|
10086
|
+
const continueConfigPath = path7.join(mcpServersDir, "packmind.yaml");
|
|
10087
|
+
const continueConfig = this.buildContinueYamlConfig(config);
|
|
10088
|
+
fs7.writeFileSync(continueConfigPath, continueConfig);
|
|
10089
|
+
return { success: true };
|
|
10090
|
+
} catch (error) {
|
|
10091
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
10092
|
+
return { success: false, error: errorMessage };
|
|
10093
|
+
}
|
|
10094
|
+
}
|
|
10023
10095
|
buildCursorConfig(config) {
|
|
10024
10096
|
return {
|
|
10025
10097
|
mcpServers: {
|
|
@@ -10046,6 +10118,19 @@ var McpConfigService = class {
|
|
|
10046
10118
|
inputs: []
|
|
10047
10119
|
};
|
|
10048
10120
|
}
|
|
10121
|
+
buildContinueYamlConfig(config) {
|
|
10122
|
+
return `name: Packmind MCP Server
|
|
10123
|
+
version: 0.0.1
|
|
10124
|
+
schema: v1
|
|
10125
|
+
mcpServers:
|
|
10126
|
+
- name: Packmind
|
|
10127
|
+
type: streamable-http
|
|
10128
|
+
url: ${config.url}
|
|
10129
|
+
requestOptions:
|
|
10130
|
+
headers:
|
|
10131
|
+
Authorization: "Bearer ${config.accessToken}"
|
|
10132
|
+
`;
|
|
10133
|
+
}
|
|
10049
10134
|
readExistingJsonConfig(filePath) {
|
|
10050
10135
|
try {
|
|
10051
10136
|
if (fs7.existsSync(filePath)) {
|
|
@@ -10135,6 +10220,15 @@ var ConfigFileRepository = class {
|
|
|
10135
10220
|
const configContent = JSON.stringify(config, null, 2) + "\n";
|
|
10136
10221
|
await fs8.writeFile(configPath, configContent, "utf-8");
|
|
10137
10222
|
}
|
|
10223
|
+
async configExists(baseDirectory) {
|
|
10224
|
+
const configPath = path8.join(baseDirectory, this.CONFIG_FILENAME);
|
|
10225
|
+
try {
|
|
10226
|
+
await fs8.access(configPath);
|
|
10227
|
+
return true;
|
|
10228
|
+
} catch {
|
|
10229
|
+
return false;
|
|
10230
|
+
}
|
|
10231
|
+
}
|
|
10138
10232
|
async readConfig(baseDirectory) {
|
|
10139
10233
|
const configPath = path8.join(baseDirectory, this.CONFIG_FILENAME);
|
|
10140
10234
|
try {
|
|
@@ -10406,6 +10500,11 @@ var PackmindCliHexa = class {
|
|
|
10406
10500
|
async getPackageBySlug(command8) {
|
|
10407
10501
|
return this.hexa.useCases.getPackageBySlug.execute(command8);
|
|
10408
10502
|
}
|
|
10503
|
+
async configExists(baseDirectory) {
|
|
10504
|
+
return await this.hexa.repositories.configFileRepository.configExists(
|
|
10505
|
+
baseDirectory
|
|
10506
|
+
);
|
|
10507
|
+
}
|
|
10409
10508
|
async readConfig(baseDirectory) {
|
|
10410
10509
|
const config = await this.hexa.repositories.configFileRepository.readConfig(
|
|
10411
10510
|
baseDirectory
|
|
@@ -10795,6 +10894,34 @@ var path10 = __toESM(require("path"));
|
|
|
10795
10894
|
var import_cmd_ts2 = __toESM(require_cjs());
|
|
10796
10895
|
|
|
10797
10896
|
// apps/cli/src/infra/commands/installPackagesHandler.ts
|
|
10897
|
+
async function notifyDistributionIfInGitRepo(params) {
|
|
10898
|
+
const { packmindCliHexa, cwd, packages, log } = params;
|
|
10899
|
+
const gitRoot = await packmindCliHexa.tryGetGitRepositoryRoot(cwd);
|
|
10900
|
+
if (!gitRoot) {
|
|
10901
|
+
return false;
|
|
10902
|
+
}
|
|
10903
|
+
try {
|
|
10904
|
+
const gitRemoteUrl = packmindCliHexa.getGitRemoteUrlFromPath(gitRoot);
|
|
10905
|
+
const gitBranch = packmindCliHexa.getCurrentBranch(gitRoot);
|
|
10906
|
+
let relativePath = cwd.startsWith(gitRoot) ? cwd.slice(gitRoot.length) : "/";
|
|
10907
|
+
if (!relativePath.startsWith("/")) {
|
|
10908
|
+
relativePath = "/" + relativePath;
|
|
10909
|
+
}
|
|
10910
|
+
if (!relativePath.endsWith("/")) {
|
|
10911
|
+
relativePath = relativePath + "/";
|
|
10912
|
+
}
|
|
10913
|
+
await packmindCliHexa.notifyDistribution({
|
|
10914
|
+
distributedPackages: packages,
|
|
10915
|
+
gitRemoteUrl,
|
|
10916
|
+
gitBranch,
|
|
10917
|
+
relativePath
|
|
10918
|
+
});
|
|
10919
|
+
log("Successfully notified Packmind of the new distribution");
|
|
10920
|
+
return true;
|
|
10921
|
+
} catch {
|
|
10922
|
+
return false;
|
|
10923
|
+
}
|
|
10924
|
+
}
|
|
10798
10925
|
async function listPackagesHandler(_args, deps) {
|
|
10799
10926
|
const { packmindCliHexa, exit, log, error } = deps;
|
|
10800
10927
|
try {
|
|
@@ -11010,29 +11137,14 @@ async function executeInstallForDirectory(directory, deps) {
|
|
|
11010
11137
|
};
|
|
11011
11138
|
}
|
|
11012
11139
|
let notificationSent = false;
|
|
11013
|
-
if (result.filesCreated > 0 || result.filesUpdated > 0) {
|
|
11014
|
-
|
|
11015
|
-
|
|
11016
|
-
|
|
11017
|
-
|
|
11018
|
-
|
|
11019
|
-
let relativePath = directory.startsWith(gitRoot) ? directory.slice(gitRoot.length) : "/";
|
|
11020
|
-
if (!relativePath.startsWith("/")) {
|
|
11021
|
-
relativePath = "/" + relativePath;
|
|
11022
|
-
}
|
|
11023
|
-
if (!relativePath.endsWith("/")) {
|
|
11024
|
-
relativePath = relativePath + "/";
|
|
11025
|
-
}
|
|
11026
|
-
await packmindCliHexa.notifyDistribution({
|
|
11027
|
-
distributedPackages: configPackages,
|
|
11028
|
-
gitRemoteUrl,
|
|
11029
|
-
gitBranch,
|
|
11030
|
-
relativePath
|
|
11031
|
-
});
|
|
11032
|
-
notificationSent = true;
|
|
11033
|
-
} catch {
|
|
11140
|
+
if (result.filesCreated > 0 || result.filesUpdated > 0 || result.filesDeleted > 0) {
|
|
11141
|
+
notificationSent = await notifyDistributionIfInGitRepo({
|
|
11142
|
+
packmindCliHexa,
|
|
11143
|
+
cwd: directory,
|
|
11144
|
+
packages: configPackages,
|
|
11145
|
+
log: () => {
|
|
11034
11146
|
}
|
|
11035
|
-
}
|
|
11147
|
+
});
|
|
11036
11148
|
}
|
|
11037
11149
|
return {
|
|
11038
11150
|
success: true,
|
|
@@ -11058,10 +11170,10 @@ async function installPackagesHandler(args2, deps) {
|
|
|
11058
11170
|
const { packagesSlugs } = args2;
|
|
11059
11171
|
const cwd = getCwd();
|
|
11060
11172
|
let configPackages;
|
|
11061
|
-
let
|
|
11173
|
+
let configFileExists = false;
|
|
11062
11174
|
try {
|
|
11175
|
+
configFileExists = await packmindCliHexa.configExists(cwd);
|
|
11063
11176
|
configPackages = await packmindCliHexa.readConfig(cwd);
|
|
11064
|
-
configExists = configPackages.length > 0;
|
|
11065
11177
|
} catch (err) {
|
|
11066
11178
|
error("ERROR Failed to parse packmind.json");
|
|
11067
11179
|
if (err instanceof Error) {
|
|
@@ -11080,7 +11192,13 @@ async function installPackagesHandler(args2, deps) {
|
|
|
11080
11192
|
}
|
|
11081
11193
|
const allPackages = [.../* @__PURE__ */ new Set([...configPackages, ...packagesSlugs])];
|
|
11082
11194
|
if (allPackages.length === 0) {
|
|
11083
|
-
|
|
11195
|
+
if (configFileExists) {
|
|
11196
|
+
logWarningConsole(
|
|
11197
|
+
"config packmind.json is empty, no packages to install"
|
|
11198
|
+
);
|
|
11199
|
+
} else {
|
|
11200
|
+
logWarningConsole("config packmind.json not found");
|
|
11201
|
+
}
|
|
11084
11202
|
log("Usage: packmind-cli install <package-slug> [package-slug...]");
|
|
11085
11203
|
log(" packmind-cli install --list");
|
|
11086
11204
|
log("");
|
|
@@ -11098,7 +11216,7 @@ async function installPackagesHandler(args2, deps) {
|
|
|
11098
11216
|
notificationSent: false
|
|
11099
11217
|
};
|
|
11100
11218
|
}
|
|
11101
|
-
if (!
|
|
11219
|
+
if (!configFileExists && packagesSlugs.length > 0) {
|
|
11102
11220
|
log("INFO initializing packmind.json");
|
|
11103
11221
|
}
|
|
11104
11222
|
try {
|
|
@@ -11134,30 +11252,13 @@ added ${result.filesCreated} files, changed ${result.filesUpdated} files, remove
|
|
|
11134
11252
|
};
|
|
11135
11253
|
}
|
|
11136
11254
|
let notificationSent = false;
|
|
11137
|
-
if (result.filesCreated > 0 || result.filesUpdated > 0) {
|
|
11138
|
-
|
|
11139
|
-
|
|
11140
|
-
|
|
11141
|
-
|
|
11142
|
-
|
|
11143
|
-
|
|
11144
|
-
if (!relativePath.startsWith("/")) {
|
|
11145
|
-
relativePath = "/" + relativePath;
|
|
11146
|
-
}
|
|
11147
|
-
if (!relativePath.endsWith("/")) {
|
|
11148
|
-
relativePath = relativePath + "/";
|
|
11149
|
-
}
|
|
11150
|
-
await packmindCliHexa.notifyDistribution({
|
|
11151
|
-
distributedPackages: allPackages,
|
|
11152
|
-
gitRemoteUrl,
|
|
11153
|
-
gitBranch,
|
|
11154
|
-
relativePath
|
|
11155
|
-
});
|
|
11156
|
-
log("Successfully notified Packmind of the new distribution");
|
|
11157
|
-
notificationSent = true;
|
|
11158
|
-
} catch {
|
|
11159
|
-
}
|
|
11160
|
-
}
|
|
11255
|
+
if (result.filesCreated > 0 || result.filesUpdated > 0 || result.filesDeleted > 0) {
|
|
11256
|
+
notificationSent = await notifyDistributionIfInGitRepo({
|
|
11257
|
+
packmindCliHexa,
|
|
11258
|
+
cwd,
|
|
11259
|
+
packages: allPackages,
|
|
11260
|
+
log
|
|
11261
|
+
});
|
|
11161
11262
|
}
|
|
11162
11263
|
return {
|
|
11163
11264
|
filesCreated: result.filesCreated,
|
|
@@ -11169,9 +11270,15 @@ added ${result.filesCreated} files, changed ${result.filesUpdated} files, remove
|
|
|
11169
11270
|
error("\n\u274C Failed to install content:");
|
|
11170
11271
|
if (err instanceof Error) {
|
|
11171
11272
|
const errorObj = err;
|
|
11172
|
-
if (errorObj.statusCode ===
|
|
11273
|
+
if (errorObj.statusCode === 400) {
|
|
11173
11274
|
error(` ${errorObj.message}`);
|
|
11174
|
-
|
|
11275
|
+
error("\n\u{1F4A1} This is a validation error. Please check:");
|
|
11276
|
+
error(" - The command syntax is correct");
|
|
11277
|
+
error(" - You have provided at least one package slug");
|
|
11278
|
+
error(" - Your packmind.json file contains valid package slugs");
|
|
11279
|
+
} else if (errorObj.statusCode === 404) {
|
|
11280
|
+
error(` ${errorObj.message}`);
|
|
11281
|
+
if (configFileExists && configPackages.length > 0) {
|
|
11175
11282
|
const missingPackages = allPackages.filter(
|
|
11176
11283
|
(pkg) => configPackages.includes(pkg)
|
|
11177
11284
|
);
|
|
@@ -11246,7 +11353,9 @@ async function uninstallPackagesHandler(args2, deps) {
|
|
|
11246
11353
|
};
|
|
11247
11354
|
}
|
|
11248
11355
|
let configPackages;
|
|
11356
|
+
let configFileExists = false;
|
|
11249
11357
|
try {
|
|
11358
|
+
configFileExists = await packmindCliHexa.configExists(cwd);
|
|
11250
11359
|
configPackages = await packmindCliHexa.readConfig(cwd);
|
|
11251
11360
|
} catch (err) {
|
|
11252
11361
|
error("\u274C Failed to read packmind.json");
|
|
@@ -11263,7 +11372,11 @@ async function uninstallPackagesHandler(args2, deps) {
|
|
|
11263
11372
|
};
|
|
11264
11373
|
}
|
|
11265
11374
|
if (configPackages.length === 0) {
|
|
11266
|
-
|
|
11375
|
+
if (configFileExists) {
|
|
11376
|
+
error("\u274C packmind.json is empty.");
|
|
11377
|
+
} else {
|
|
11378
|
+
error("\u274C No packmind.json found in current directory.");
|
|
11379
|
+
}
|
|
11267
11380
|
log("");
|
|
11268
11381
|
log("\u{1F4A1} There are no packages to uninstall.");
|
|
11269
11382
|
log(" To install packages, run: packmind-cli install <package-slug>");
|
|
@@ -11306,30 +11419,61 @@ async function uninstallPackagesHandler(args2, deps) {
|
|
|
11306
11419
|
const remainingPackages = configPackages.filter(
|
|
11307
11420
|
(pkg) => !packagesToUninstall.includes(pkg)
|
|
11308
11421
|
);
|
|
11309
|
-
|
|
11310
|
-
|
|
11311
|
-
|
|
11312
|
-
|
|
11313
|
-
|
|
11314
|
-
|
|
11315
|
-
|
|
11316
|
-
|
|
11317
|
-
|
|
11318
|
-
}
|
|
11319
|
-
log(`
|
|
11422
|
+
let filesDeleted = 0;
|
|
11423
|
+
if (remainingPackages.length === 0) {
|
|
11424
|
+
log("Removing all packages and cleaning up...");
|
|
11425
|
+
const result = await packmindCliHexa.installPackages({
|
|
11426
|
+
baseDirectory: cwd,
|
|
11427
|
+
packagesSlugs: [],
|
|
11428
|
+
previousPackagesSlugs: configPackages
|
|
11429
|
+
});
|
|
11430
|
+
log(`
|
|
11320
11431
|
removed ${result.filesDeleted} files`);
|
|
11321
|
-
|
|
11322
|
-
|
|
11323
|
-
|
|
11324
|
-
|
|
11432
|
+
if (result.errors.length > 0) {
|
|
11433
|
+
log("\n\u26A0\uFE0F Errors encountered:");
|
|
11434
|
+
result.errors.forEach((err) => {
|
|
11435
|
+
log(` - ${err}`);
|
|
11436
|
+
});
|
|
11437
|
+
exit(1);
|
|
11438
|
+
return {
|
|
11439
|
+
filesDeleted: result.filesDeleted,
|
|
11440
|
+
packagesUninstalled: packagesToUninstall
|
|
11441
|
+
};
|
|
11442
|
+
}
|
|
11443
|
+
filesDeleted = result.filesDeleted;
|
|
11444
|
+
} else {
|
|
11445
|
+
const result = await packmindCliHexa.installPackages({
|
|
11446
|
+
baseDirectory: cwd,
|
|
11447
|
+
packagesSlugs: remainingPackages,
|
|
11448
|
+
previousPackagesSlugs: configPackages
|
|
11325
11449
|
});
|
|
11326
|
-
|
|
11327
|
-
|
|
11328
|
-
|
|
11329
|
-
|
|
11330
|
-
}
|
|
11450
|
+
if (result.recipesCount > 0 || result.standardsCount > 0) {
|
|
11451
|
+
log(
|
|
11452
|
+
`Removing ${result.recipesCount} recipes and ${result.standardsCount} standards...`
|
|
11453
|
+
);
|
|
11454
|
+
}
|
|
11455
|
+
log(`
|
|
11456
|
+
removed ${result.filesDeleted} files`);
|
|
11457
|
+
if (result.errors.length > 0) {
|
|
11458
|
+
log("\n\u26A0\uFE0F Errors encountered:");
|
|
11459
|
+
result.errors.forEach((err) => {
|
|
11460
|
+
log(` - ${err}`);
|
|
11461
|
+
});
|
|
11462
|
+
exit(1);
|
|
11463
|
+
return {
|
|
11464
|
+
filesDeleted: result.filesDeleted,
|
|
11465
|
+
packagesUninstalled: packagesToUninstall
|
|
11466
|
+
};
|
|
11467
|
+
}
|
|
11468
|
+
filesDeleted = result.filesDeleted;
|
|
11331
11469
|
}
|
|
11332
11470
|
await packmindCliHexa.writeConfig(cwd, remainingPackages);
|
|
11471
|
+
await notifyDistributionIfInGitRepo({
|
|
11472
|
+
packmindCliHexa,
|
|
11473
|
+
cwd,
|
|
11474
|
+
packages: remainingPackages,
|
|
11475
|
+
log
|
|
11476
|
+
});
|
|
11333
11477
|
log("");
|
|
11334
11478
|
if (packagesToUninstall.length === 1) {
|
|
11335
11479
|
log(`\u2713 Package '${packagesToUninstall[0]}' has been uninstalled.`);
|
|
@@ -11342,7 +11486,7 @@ removed ${result.filesDeleted} files`);
|
|
|
11342
11486
|
log(" Your packmind.json still exists but contains no packages.");
|
|
11343
11487
|
}
|
|
11344
11488
|
return {
|
|
11345
|
-
filesDeleted
|
|
11489
|
+
filesDeleted,
|
|
11346
11490
|
packagesUninstalled: packagesToUninstall
|
|
11347
11491
|
};
|
|
11348
11492
|
} catch (err) {
|
|
@@ -11727,6 +11871,9 @@ var AgentDetectionService = class {
|
|
|
11727
11871
|
if (this.isVSCodeAvailable()) {
|
|
11728
11872
|
agents.push({ type: "vscode", name: "VS Code" });
|
|
11729
11873
|
}
|
|
11874
|
+
if (this.isContinueAvailable()) {
|
|
11875
|
+
agents.push({ type: "continue", name: "Continue.dev" });
|
|
11876
|
+
}
|
|
11730
11877
|
return agents;
|
|
11731
11878
|
}
|
|
11732
11879
|
isClaudeAvailable() {
|
|
@@ -11740,6 +11887,10 @@ var AgentDetectionService = class {
|
|
|
11740
11887
|
const vscodeDir = path9.join(this.projectDir, ".vscode");
|
|
11741
11888
|
return fs9.existsSync(vscodeDir);
|
|
11742
11889
|
}
|
|
11890
|
+
isContinueAvailable() {
|
|
11891
|
+
const continueDir = path9.join(this.projectDir, ".continue");
|
|
11892
|
+
return fs9.existsSync(continueDir);
|
|
11893
|
+
}
|
|
11743
11894
|
isCommandAvailable(command8) {
|
|
11744
11895
|
try {
|
|
11745
11896
|
const whichCommand = process.platform === "win32" ? "where" : "which";
|
|
@@ -11752,11 +11903,12 @@ var AgentDetectionService = class {
|
|
|
11752
11903
|
};
|
|
11753
11904
|
|
|
11754
11905
|
// apps/cli/src/infra/commands/SetupMcpCommand.ts
|
|
11755
|
-
var VALID_AGENTS = ["copilot", "cursor", "claude"];
|
|
11906
|
+
var VALID_AGENTS = ["copilot", "cursor", "claude", "continue"];
|
|
11756
11907
|
var agentArgToType = {
|
|
11757
11908
|
copilot: "vscode",
|
|
11758
11909
|
cursor: "cursor",
|
|
11759
|
-
claude: "claude"
|
|
11910
|
+
claude: "claude",
|
|
11911
|
+
continue: "continue"
|
|
11760
11912
|
};
|
|
11761
11913
|
var AgentArgType = {
|
|
11762
11914
|
from: async (input) => {
|
|
@@ -11772,7 +11924,8 @@ var AgentArgType = {
|
|
|
11772
11924
|
var ALL_AGENTS2 = [
|
|
11773
11925
|
{ type: "claude", name: "Claude Code" },
|
|
11774
11926
|
{ type: "cursor", name: "Cursor" },
|
|
11775
|
-
{ type: "vscode", name: "VS Code" }
|
|
11927
|
+
{ type: "vscode", name: "VS Code" },
|
|
11928
|
+
{ type: "continue", name: "Continue.dev" }
|
|
11776
11929
|
];
|
|
11777
11930
|
async function promptAgentsWithReadline(choices) {
|
|
11778
11931
|
const input = fs10.createReadStream("/dev/tty");
|
|
@@ -11814,7 +11967,7 @@ var setupMcpCommand = (0, import_cmd_ts7.command)({
|
|
|
11814
11967
|
type: (0, import_cmd_ts7.array)(AgentArgType),
|
|
11815
11968
|
long: "target",
|
|
11816
11969
|
short: "t",
|
|
11817
|
-
description: "Target agent(s) to configure (copilot, cursor, or
|
|
11970
|
+
description: "Target agent(s) to configure (copilot, cursor, claude, or continue). Can be specified multiple times. If omitted, interactive mode is used."
|
|
11818
11971
|
})
|
|
11819
11972
|
},
|
|
11820
11973
|
handler: async ({ targets }) => {
|