claudekit-cli 3.17.0 → 3.18.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/dist/index.js +81 -41
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6589,7 +6589,7 @@ var init_kit = __esm(() => {
6589
6589
  name: "ClaudeKit Marketing",
6590
6590
  repo: "claudekit-marketing",
6591
6591
  owner: "claudekit",
6592
- description: "[Coming Soon] Marketing toolkit"
6592
+ description: "Marketing automation toolkit for Claude"
6593
6593
  }
6594
6594
  };
6595
6595
  NEVER_COPY_PATTERNS = [
@@ -23905,13 +23905,14 @@ init_logger();
23905
23905
 
23906
23906
  // src/domains/ui/prompts/kit-prompts.ts
23907
23907
  init_types2();
23908
- async function selectKit(defaultKit) {
23908
+ async function selectKit(defaultKit, accessibleKits) {
23909
+ const kits = accessibleKits ?? Object.keys(AVAILABLE_KITS);
23909
23910
  const kit = await ie({
23910
23911
  message: "Select a ClaudeKit:",
23911
- options: Object.entries(AVAILABLE_KITS).map(([key, config]) => ({
23912
+ options: kits.map((key) => ({
23912
23913
  value: key,
23913
- label: config.name,
23914
- hint: config.description
23914
+ label: AVAILABLE_KITS[key].name,
23915
+ hint: AVAILABLE_KITS[key].description
23915
23916
  })),
23916
23917
  initialValue: defaultKit
23917
23918
  });
@@ -24443,8 +24444,8 @@ async function promptSkillsInstallation() {
24443
24444
  }
24444
24445
  // src/domains/ui/prompts.ts
24445
24446
  class PromptsManager {
24446
- async selectKit(defaultKit) {
24447
- return selectKit(defaultKit);
24447
+ async selectKit(defaultKit, accessibleKits) {
24448
+ return selectKit(defaultKit, accessibleKits);
24448
24449
  }
24449
24450
  async selectVersion(versions, defaultVersion) {
24450
24451
  return selectVersion(versions, defaultVersion);
@@ -39519,6 +39520,31 @@ Optional: DISCORD_WEBHOOK_URL, TELEGRAM_BOT_TOKEN`, "Configuration skipped");
39519
39520
  import { mkdir as mkdir19 } from "node:fs/promises";
39520
39521
  import { join as join62, resolve as resolve7 } from "node:path";
39521
39522
 
39523
+ // src/domains/github/kit-access-checker.ts
39524
+ init_logger();
39525
+ init_types2();
39526
+ async function detectAccessibleKits() {
39527
+ const spinner = createSpinner("Checking kit access...").start();
39528
+ const github = new GitHubClient;
39529
+ const results = await Promise.all(Object.entries(AVAILABLE_KITS).map(async ([type, config]) => {
39530
+ try {
39531
+ await github.checkAccess(config);
39532
+ logger.debug(`Access confirmed: ${type}`);
39533
+ return type;
39534
+ } catch {
39535
+ logger.debug(`No access to ${type}`);
39536
+ return null;
39537
+ }
39538
+ }));
39539
+ const accessible = results.filter((kit) => kit !== null);
39540
+ if (accessible.length === 0) {
39541
+ spinner.fail("No kit access found");
39542
+ } else {
39543
+ spinner.succeed(`Access verified: ${accessible.join(", ")}`);
39544
+ }
39545
+ return accessible;
39546
+ }
39547
+
39522
39548
  // src/domains/installation/fresh-installer.ts
39523
39549
  init_logger();
39524
39550
  import { join as join61 } from "node:path";
@@ -39581,13 +39607,33 @@ async function handleSelection(ctx) {
39581
39607
  };
39582
39608
  }
39583
39609
  const config = await ConfigManager.get();
39610
+ let accessibleKits;
39611
+ if (!ctx.options.useGit) {
39612
+ accessibleKits = await detectAccessibleKits();
39613
+ if (accessibleKits.length === 0) {
39614
+ logger.error("No ClaudeKit access found.");
39615
+ logger.info("Purchase at https://claudekit.cc");
39616
+ return { ...ctx, cancelled: true };
39617
+ }
39618
+ }
39584
39619
  let kitType = ctx.options.kit || config.defaults?.kit;
39620
+ if (kitType && accessibleKits && !accessibleKits.includes(kitType)) {
39621
+ logger.error(`No access to ${AVAILABLE_KITS[kitType].name}`);
39622
+ logger.info("Purchase at https://claudekit.cc");
39623
+ return { ...ctx, cancelled: true };
39624
+ }
39585
39625
  if (!kitType) {
39586
39626
  if (ctx.isNonInteractive) {
39587
- kitType = "engineer";
39588
- logger.info("Using default kit: engineer");
39627
+ if (!accessibleKits || accessibleKits.length === 0) {
39628
+ throw new Error("Kit must be specified via --kit flag in non-interactive mode (no accessible kits detected)");
39629
+ }
39630
+ kitType = accessibleKits[0];
39631
+ logger.info(`Auto-selected: ${AVAILABLE_KITS[kitType].name}`);
39632
+ } else if (accessibleKits?.length === 1) {
39633
+ kitType = accessibleKits[0];
39634
+ logger.info(`Using ${AVAILABLE_KITS[kitType].name} (only accessible kit)`);
39589
39635
  } else {
39590
- kitType = await ctx.prompts.selectKit();
39636
+ kitType = await ctx.prompts.selectKit(undefined, accessibleKits);
39591
39637
  }
39592
39638
  }
39593
39639
  const kit = AVAILABLE_KITS[kitType];
@@ -39662,20 +39708,6 @@ async function handleSelection(ctx) {
39662
39708
  }
39663
39709
  }
39664
39710
  const github = new GitHubClient;
39665
- if (!ctx.options.useGit) {
39666
- const spinner = createSpinner("Checking repository access...").start();
39667
- logger.verbose("GitHub API check", { repo: kit.repo, owner: kit.owner });
39668
- try {
39669
- await github.checkAccess(kit);
39670
- spinner.succeed("Repository access verified");
39671
- } catch (error) {
39672
- spinner.fail("Access denied to repository");
39673
- logger.error(error.message || `Cannot access ${kit.name}`);
39674
- return { ...ctx, cancelled: true };
39675
- }
39676
- } else {
39677
- logger.verbose("Skipping API access check (--use-git mode)");
39678
- }
39679
39711
  let selectedVersion = ctx.options.release;
39680
39712
  if (!selectedVersion && ctx.isNonInteractive && !ctx.options.yes) {
39681
39713
  throw new Error("Non-interactive mode requires either: --release <tag> OR --yes (uses latest)");
@@ -40683,12 +40715,34 @@ var import_fs_extra32 = __toESM(require_lib(), 1);
40683
40715
  async function directorySetup(validOptions, prompts) {
40684
40716
  const isNonInteractive2 = !process.stdin.isTTY || process.env.CI === "true" || process.env.NON_INTERACTIVE === "true";
40685
40717
  const config = await ConfigManager.get();
40718
+ let accessibleKits;
40719
+ if (!validOptions.useGit) {
40720
+ accessibleKits = await detectAccessibleKits();
40721
+ if (accessibleKits.length === 0) {
40722
+ logger.error("No ClaudeKit access found.");
40723
+ logger.info("Purchase at https://claudekit.cc");
40724
+ return null;
40725
+ }
40726
+ }
40686
40727
  let kit = validOptions.kit || config.defaults?.kit;
40728
+ if (kit && accessibleKits && !accessibleKits.includes(kit)) {
40729
+ logger.error(`No access to ${AVAILABLE_KITS[kit].name}`);
40730
+ logger.info("Purchase at https://claudekit.cc");
40731
+ return null;
40732
+ }
40687
40733
  if (!kit) {
40688
40734
  if (isNonInteractive2) {
40689
- throw new Error("Kit must be specified via --kit flag in non-interactive mode");
40735
+ kit = accessibleKits?.[0];
40736
+ if (!kit) {
40737
+ throw new Error("Kit must be specified via --kit flag in non-interactive mode");
40738
+ }
40739
+ logger.info(`Auto-selected: ${AVAILABLE_KITS[kit].name}`);
40740
+ } else if (accessibleKits?.length === 1) {
40741
+ kit = accessibleKits[0];
40742
+ logger.info(`Using ${AVAILABLE_KITS[kit].name} (only accessible kit)`);
40743
+ } else {
40744
+ kit = await prompts.selectKit(undefined, accessibleKits);
40690
40745
  }
40691
- kit = await prompts.selectKit();
40692
40746
  }
40693
40747
  const kitConfig = AVAILABLE_KITS[kit];
40694
40748
  logger.info(`Selected kit: ${kitConfig.name}`);
@@ -40812,20 +40866,6 @@ async function selectVersion2(kit, options, isNonInteractive2, prompts, github)
40812
40866
  async function projectCreation(kit, resolvedDir, validOptions, isNonInteractive2, prompts) {
40813
40867
  const kitConfig = AVAILABLE_KITS[kit];
40814
40868
  const github = new GitHubClient;
40815
- if (!validOptions.useGit) {
40816
- const spinner = createSpinner("Checking repository access...").start();
40817
- logger.verbose("GitHub API check", { repo: kitConfig.repo, owner: kitConfig.owner });
40818
- try {
40819
- await github.checkAccess(kitConfig);
40820
- spinner.succeed("Repository access verified");
40821
- } catch (error) {
40822
- spinner.fail("Access denied to repository");
40823
- logger.error(error.message || `Cannot access ${kitConfig.name}`);
40824
- return null;
40825
- }
40826
- } else {
40827
- logger.verbose("Skipping API access check (--use-git mode)");
40828
- }
40829
40869
  const versionResult = await selectVersion2(kitConfig, validOptions, isNonInteractive2, prompts, github);
40830
40870
  if (!versionResult) {
40831
40871
  return null;
@@ -41726,7 +41766,7 @@ var import_picocolors24 = __toESM(require_picocolors(), 1);
41726
41766
  // package.json
41727
41767
  var package_default = {
41728
41768
  name: "claudekit-cli",
41729
- version: "3.17.0",
41769
+ version: "3.18.0",
41730
41770
  description: "CLI tool for bootstrapping and updating ClaudeKit projects",
41731
41771
  type: "module",
41732
41772
  repository: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudekit-cli",
3
- "version": "3.17.0",
3
+ "version": "3.18.0",
4
4
  "description": "CLI tool for bootstrapping and updating ClaudeKit projects",
5
5
  "type": "module",
6
6
  "repository": {