@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.
Files changed (2) hide show
  1. package/main.cjs +190 -98
  2. 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.9.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/analytics/RecipeUsage.ts
4038
- var createRecipeUsageId = brandedIdFactory();
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/RecipeCreatedEvent.ts
4047
- var RecipeCreatedEvent = class extends UserEvent {
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/RecipeDeletedEvent.ts
4054
- var RecipeDeletedEvent = class extends UserEvent {
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/RecipeUpdatedEvent.ts
4061
- var RecipeUpdatedEvent = class extends UserEvent {
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
- await fs4.writeFile(fullPath, mergedContent, "utf-8");
9452
- if (fileExists) {
9453
- result.filesUpdated++;
9487
+ if (this.isEffectivelyEmpty(mergedContent) && fileExists) {
9488
+ await fs4.unlink(fullPath);
9489
+ result.filesDeleted++;
9454
9490
  } else {
9455
- result.filesCreated++;
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 fileExists = await this.fileExists(fullPath);
9462
- if (fileExists) {
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("Recipes:");
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} recipes and ${result.standardsCount} standards...`
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
- const gitRoot = await packmindCliHexa.tryGetGitRepositoryRoot(directory);
11030
- if (gitRoot) {
11031
- try {
11032
- const gitRemoteUrl = packmindCliHexa.getGitRemoteUrlFromPath(gitRoot);
11033
- const gitBranch = packmindCliHexa.getCurrentBranch(gitRoot);
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 recipes and standards from the specified packages.");
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} recipes and ${result.standardsCount} standards...`
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
- const gitRoot = await packmindCliHexa.tryGetGitRepositoryRoot(cwd);
11160
- if (gitRoot) {
11161
- try {
11162
- const gitRemoteUrl = packmindCliHexa.getGitRemoteUrlFromPath(gitRoot);
11163
- const gitBranch = packmindCliHexa.getCurrentBranch(gitRoot);
11164
- let relativePath = cwd.startsWith(gitRoot) ? cwd.slice(gitRoot.length) : "/";
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 .packmind directory...");
11345
- const packmindDir = `${cwd}/.packmind`;
11346
- try {
11347
- const fs12 = await import("fs/promises");
11348
- const dirExists = await fs12.access(packmindDir).then(() => true).catch(() => false);
11349
- if (dirExists) {
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} recipes and ${result.standardsCount} standards...`
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 recipes and standards from specified packages and save them to the current directory",
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 recipes and standards from the current directory",
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 claude). Can be specified multiple times. If omitted, interactive mode is used."
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 }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@packmind/cli",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "A command-line interface for Packmind linting and code quality checks",
5
5
  "private": false,
6
6
  "bin": {