md4ai 0.14.0 → 0.14.1

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.
@@ -122,7 +122,7 @@ var CURRENT_VERSION;
122
122
  var init_check_update = __esm({
123
123
  "dist/check-update.js"() {
124
124
  "use strict";
125
- CURRENT_VERSION = true ? "0.14.0" : "0.0.0-dev";
125
+ CURRENT_VERSION = true ? "0.14.1" : "0.0.0-dev";
126
126
  }
127
127
  });
128
128
 
@@ -1151,11 +1151,23 @@ var init_auth2 = __esm({
1151
1151
  });
1152
1152
 
1153
1153
  // dist/vercel/discover-projects.js
1154
- import { readFile as readFile6, glob } from "node:fs/promises";
1154
+ import { readFile as readFile6, readdir as readdir2 } from "node:fs/promises";
1155
1155
  import { join as join8, dirname as dirname2, relative } from "node:path";
1156
1156
  async function discoverVercelProjects(projectRoot) {
1157
1157
  const found = /* @__PURE__ */ new Map();
1158
- for await (const filePath of glob(join8(projectRoot, "**/.vercel/project.json"))) {
1158
+ let entries;
1159
+ try {
1160
+ entries = await readdir2(projectRoot, { recursive: true, withFileTypes: true });
1161
+ } catch {
1162
+ return [];
1163
+ }
1164
+ for (const entry of entries) {
1165
+ if (!entry.isFile() || entry.name !== "project.json")
1166
+ continue;
1167
+ const parentName = typeof entry.parentPath === "string" ? entry.parentPath : entry.path;
1168
+ if (!parentName.endsWith(".vercel"))
1169
+ continue;
1170
+ const filePath = join8(parentName, entry.name);
1159
1171
  try {
1160
1172
  const data = await readFile6(filePath, "utf-8");
1161
1173
  const parsed = JSON.parse(data);
@@ -1250,7 +1262,7 @@ var init_fetch_env_vars = __esm({
1250
1262
  });
1251
1263
 
1252
1264
  // dist/scanner/env-manifest-scanner.js
1253
- import { readFile as readFile7, glob as glob2 } from "node:fs/promises";
1265
+ import { readFile as readFile7, readdir as readdir3 } from "node:fs/promises";
1254
1266
  import { execFile } from "node:child_process";
1255
1267
  import { promisify } from "node:util";
1256
1268
  import { join as join9, relative as relative2 } from "node:path";
@@ -1519,21 +1531,23 @@ async function parseWorkflowSecrets(projectRoot) {
1519
1531
  return [];
1520
1532
  const refs = [];
1521
1533
  const secretRe = /\$\{\{\s*secrets\.([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g;
1522
- for (const ext of ["*.yml", "*.yaml"]) {
1523
- for await (const filePath of glob2(join9(workflowsDir, ext))) {
1524
- const content = await readFile7(filePath, "utf-8");
1525
- const secrets = /* @__PURE__ */ new Set();
1526
- let m;
1527
- while ((m = secretRe.exec(content)) !== null) {
1528
- secrets.add(m[1]);
1529
- }
1530
- secretRe.lastIndex = 0;
1531
- if (secrets.size > 0) {
1532
- refs.push({
1533
- workflowFile: relative2(projectRoot, filePath),
1534
- secretsUsed: [...secrets].sort()
1535
- });
1536
- }
1534
+ const files = await readdir3(workflowsDir);
1535
+ for (const file of files) {
1536
+ if (!file.endsWith(".yml") && !file.endsWith(".yaml"))
1537
+ continue;
1538
+ const filePath = join9(workflowsDir, file);
1539
+ const content = await readFile7(filePath, "utf-8");
1540
+ const secrets = /* @__PURE__ */ new Set();
1541
+ let m;
1542
+ while ((m = secretRe.exec(content)) !== null) {
1543
+ secrets.add(m[1]);
1544
+ }
1545
+ secretRe.lastIndex = 0;
1546
+ if (secrets.size > 0) {
1547
+ refs.push({
1548
+ workflowFile: relative2(projectRoot, filePath),
1549
+ secretsUsed: [...secrets].sort()
1550
+ });
1537
1551
  }
1538
1552
  }
1539
1553
  return refs;
@@ -1660,7 +1674,7 @@ var init_env_manifest_scanner = __esm({
1660
1674
  });
1661
1675
 
1662
1676
  // dist/scanner/marketplace-scanner.js
1663
- import { readFile as readFile8, readdir as readdir2, stat } from "node:fs/promises";
1677
+ import { readFile as readFile8, readdir as readdir4, stat } from "node:fs/promises";
1664
1678
  import { join as join10, resolve as resolve3 } from "node:path";
1665
1679
  import { existsSync as existsSync5 } from "node:fs";
1666
1680
  import { homedir as homedir6 } from "node:os";
@@ -1729,7 +1743,7 @@ async function discoverSkills(installPath) {
1729
1743
  return [];
1730
1744
  const skills = [];
1731
1745
  try {
1732
- const entries = await readdir2(skillsDir, { withFileTypes: true });
1746
+ const entries = await readdir4(skillsDir, { withFileTypes: true });
1733
1747
  for (const entry of entries) {
1734
1748
  if (!entry.isDirectory())
1735
1749
  continue;
@@ -1986,7 +2000,7 @@ var init_doppler_scanner = __esm({
1986
2000
  });
1987
2001
 
1988
2002
  // dist/scanner/index.js
1989
- import { readdir as readdir3 } from "node:fs/promises";
2003
+ import { readdir as readdir5 } from "node:fs/promises";
1990
2004
  import { join as join12, relative as relative3 } from "node:path";
1991
2005
  import { existsSync as existsSync7 } from "node:fs";
1992
2006
  import { homedir as homedir7 } from "node:os";
@@ -2073,7 +2087,7 @@ async function discoverFiles(projectRoot) {
2073
2087
  return [...new Set(files)];
2074
2088
  }
2075
2089
  async function walkDir(dir, projectRoot, files) {
2076
- const entries = await readdir3(dir, { withFileTypes: true });
2090
+ const entries = await readdir5(dir, { withFileTypes: true });
2077
2091
  for (const entry of entries) {
2078
2092
  const fullPath = join12(dir, entry.name);
2079
2093
  if (entry.isDirectory()) {
@@ -2878,7 +2892,7 @@ import { readFile as readFile12 } from "node:fs/promises";
2878
2892
  import { join as join15 } from "node:path";
2879
2893
  import { homedir as homedir9 } from "node:os";
2880
2894
  import { existsSync as existsSync13 } from "node:fs";
2881
- import { readdir as readdir4 } from "node:fs/promises";
2895
+ import { readdir as readdir6 } from "node:fs/promises";
2882
2896
  async function readJsonSafe(path) {
2883
2897
  try {
2884
2898
  if (!existsSync13(path))
@@ -2954,14 +2968,14 @@ async function readAllMcpConfigs() {
2954
2968
  const pluginsBase = join15(home, ".claude", "plugins", "marketplaces");
2955
2969
  if (existsSync13(pluginsBase)) {
2956
2970
  try {
2957
- const marketplaces = await readdir4(pluginsBase, { withFileTypes: true });
2971
+ const marketplaces = await readdir6(pluginsBase, { withFileTypes: true });
2958
2972
  for (const mp of marketplaces) {
2959
2973
  if (!mp.isDirectory())
2960
2974
  continue;
2961
2975
  const extDir = join15(pluginsBase, mp.name, "external_plugins");
2962
2976
  if (!existsSync13(extDir))
2963
2977
  continue;
2964
- const plugins = await readdir4(extDir, { withFileTypes: true });
2978
+ const plugins = await readdir6(extDir, { withFileTypes: true });
2965
2979
  for (const plugin of plugins) {
2966
2980
  if (!plugin.isDirectory())
2967
2981
  continue;
@@ -2975,16 +2989,16 @@ async function readAllMcpConfigs() {
2975
2989
  const cacheBase = join15(home, ".claude", "plugins", "cache");
2976
2990
  if (existsSync13(cacheBase)) {
2977
2991
  try {
2978
- const registries = await readdir4(cacheBase, { withFileTypes: true });
2992
+ const registries = await readdir6(cacheBase, { withFileTypes: true });
2979
2993
  for (const reg of registries) {
2980
2994
  if (!reg.isDirectory())
2981
2995
  continue;
2982
2996
  const regDir = join15(cacheBase, reg.name);
2983
- const plugins = await readdir4(regDir, { withFileTypes: true });
2997
+ const plugins = await readdir6(regDir, { withFileTypes: true });
2984
2998
  for (const plugin of plugins) {
2985
2999
  if (!plugin.isDirectory())
2986
3000
  continue;
2987
- const versionDirs = await readdir4(join15(regDir, plugin.name), { withFileTypes: true });
3001
+ const versionDirs = await readdir6(join15(regDir, plugin.name), { withFileTypes: true });
2988
3002
  for (const ver of versionDirs) {
2989
3003
  if (!ver.isDirectory())
2990
3004
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "md4ai",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "description": "CLI for MD4AI — scan Claude projects and sync to your dashboard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,7 +31,7 @@
31
31
  "directory": "cli"
32
32
  },
33
33
  "engines": {
34
- "node": ">=22"
34
+ "node": ">=20"
35
35
  },
36
36
  "dependencies": {
37
37
  "@inquirer/prompts": "^8.3.0",