adhdev 0.6.51 → 0.6.52

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/dist/cli/index.js CHANGED
@@ -5242,6 +5242,76 @@ var init_provider_loader = __esm({
5242
5242
  }
5243
5243
  // ─── Public API ────────────────────────────────
5244
5244
  /**
5245
+ * Ordered builtin roots used for local fallback/reference data.
5246
+ */
5247
+ getBuiltinDirs() {
5248
+ return [...this.builtinDirs];
5249
+ }
5250
+ /**
5251
+ * Primary builtin root used for local scaffolding/reference flows.
5252
+ */
5253
+ getPrimaryBuiltinDir() {
5254
+ return this.builtinDirs[0];
5255
+ }
5256
+ /**
5257
+ * User override root (~/.adhdev/providers by default).
5258
+ */
5259
+ getUserDir() {
5260
+ return this.userDir;
5261
+ }
5262
+ /**
5263
+ * Auto-updated upstream root (~/.adhdev/providers/.upstream by default).
5264
+ */
5265
+ getUpstreamDir() {
5266
+ return this.upstreamDir;
5267
+ }
5268
+ /**
5269
+ * Provider search order for on-disk lookups.
5270
+ * Highest-priority editable overrides come first.
5271
+ */
5272
+ getProviderRoots() {
5273
+ return [this.userDir, this.upstreamDir, ...this.builtinDirs];
5274
+ }
5275
+ /**
5276
+ * Canonical provider directory shape for a given root.
5277
+ */
5278
+ getProviderDir(root, category, type) {
5279
+ return path6.join(root, category, type);
5280
+ }
5281
+ /**
5282
+ * Canonical user override directory for a provider.
5283
+ */
5284
+ getUserProviderDir(category, type) {
5285
+ return this.getProviderDir(this.userDir, category, type);
5286
+ }
5287
+ /**
5288
+ * Canonical upstream directory for a provider.
5289
+ */
5290
+ getUpstreamProviderDir(category, type) {
5291
+ return this.getProviderDir(this.upstreamDir, category, type);
5292
+ }
5293
+ /**
5294
+ * Canonical builtin directory for a provider.
5295
+ */
5296
+ getBuiltinProviderDir(category, type) {
5297
+ return this.getProviderDir(this.getPrimaryBuiltinDir(), category, type);
5298
+ }
5299
+ /**
5300
+ * Find the on-disk directory for a provider by type.
5301
+ * Search order: user override → upstream → builtin fallback.
5302
+ */
5303
+ findProviderDir(type) {
5304
+ return this.findProviderDirInternal(type);
5305
+ }
5306
+ /**
5307
+ * Resolve a file within a provider directory.
5308
+ */
5309
+ resolveProviderFile(type, ...segments) {
5310
+ const dir = this.findProviderDirInternal(type);
5311
+ if (!dir) return null;
5312
+ return path6.join(dir, ...segments);
5313
+ }
5314
+ /**
5245
5315
  * Load all providers (3-tier priority)
5246
5316
  * 1. .upstream/ (GitHub auto-download — primary source)
5247
5317
  * 2. User custom (~/.adhdev/providers/ excluding .upstream)
@@ -5567,7 +5637,7 @@ var init_provider_loader = __esm({
5567
5637
  * Tries scripts.js first, then individual .js files.
5568
5638
  */
5569
5639
  loadScriptsFromDir(type, scriptDir) {
5570
- const providerDir = this.findProviderDir(type);
5640
+ const providerDir = this.findProviderDirInternal(type);
5571
5641
  if (!providerDir) {
5572
5642
  this.log(` [loadScriptsFromDir] ${type}: providerDir not found`);
5573
5643
  return null;
@@ -5928,16 +5998,16 @@ var init_provider_loader = __esm({
5928
5998
  // ─── Private ───────────────────────────────────
5929
5999
  /**
5930
6000
  * Find the on-disk directory for a provider by type.
5931
- * Checks builtinDir, upstreamDir, userDir in order.
6001
+ * Preferred shape: root/category/type. Legacy flat root/type is kept temporarily for compatibility.
5932
6002
  */
5933
- findProviderDir(type) {
6003
+ findProviderDirInternal(type) {
5934
6004
  const provider = this.providers.get(type);
5935
6005
  if (!provider) return null;
5936
6006
  const cat = provider.category;
5937
- const searchRoots = [this.userDir, this.upstreamDir, ...this.builtinDirs];
6007
+ const searchRoots = this.getProviderRoots();
5938
6008
  for (const root of searchRoots) {
5939
6009
  if (!fs5.existsSync(root)) continue;
5940
- for (const candidate of [path6.join(root, type), path6.join(root, cat, type)]) {
6010
+ for (const candidate of [this.getProviderDir(root, cat, type), path6.join(root, type)]) {
5941
6011
  if (fs5.existsSync(path6.join(candidate, "provider.json"))) return candidate;
5942
6012
  }
5943
6013
  const catDir = path6.join(root, cat);
@@ -27497,37 +27567,7 @@ var init_dev_server = __esm({
27497
27567
  // ─── Provider File Explorer ───
27498
27568
  /** Find the provider directory on disk */
27499
27569
  findProviderDir(type) {
27500
- const provider = this.providerLoader.getMeta(type);
27501
- if (!provider) return null;
27502
- const cat = provider.category;
27503
- const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
27504
- const userDir = path12.join(os14.homedir(), ".adhdev", "providers");
27505
- const directCandidates = [
27506
- path12.join(userDir, type),
27507
- path12.join(builtinDir, cat, type),
27508
- path12.join(builtinDir, type)
27509
- ];
27510
- for (const d of directCandidates) {
27511
- if (fs9.existsSync(path12.join(d, "provider.json"))) return d;
27512
- }
27513
- const catDir = path12.join(builtinDir, cat);
27514
- if (fs9.existsSync(catDir)) {
27515
- try {
27516
- for (const entry of fs9.readdirSync(catDir, { withFileTypes: true })) {
27517
- if (!entry.isDirectory()) continue;
27518
- const jsonPath = path12.join(catDir, entry.name, "provider.json");
27519
- if (fs9.existsSync(jsonPath)) {
27520
- try {
27521
- const data = JSON.parse(fs9.readFileSync(jsonPath, "utf-8"));
27522
- if (data.type === type) return path12.join(catDir, entry.name);
27523
- } catch {
27524
- }
27525
- }
27526
- }
27527
- } catch {
27528
- }
27529
- }
27530
- return null;
27570
+ return this.providerLoader.findProviderDir(type);
27531
27571
  }
27532
27572
  /** GET /api/providers/:type/files — list all files in provider directory */
27533
27573
  async handleListFiles(type, _req, res) {
@@ -27922,10 +27962,9 @@ var init_dev_server = __esm({
27922
27962
  }
27923
27963
  let targetDir;
27924
27964
  if (location === "user") {
27925
- targetDir = path12.join(os14.homedir(), ".adhdev", "providers", type);
27965
+ targetDir = this.providerLoader.getUserProviderDir(category, type);
27926
27966
  } else {
27927
- const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
27928
- targetDir = path12.join(builtinDir, category, type);
27967
+ targetDir = this.providerLoader.getBuiltinProviderDir(category, type);
27929
27968
  }
27930
27969
  const jsonPath = path12.join(targetDir, "provider.json");
27931
27970
  if (fs9.existsSync(jsonPath)) {
@@ -28734,7 +28773,7 @@ var init_dev_server = __esm({
28734
28773
  const domContext = null;
28735
28774
  this.sendAutoImplSSE({ event: "progress", data: { function: "_init", status: "loading_reference", message: `\uB808\uD37C\uB7F0\uC2A4 \uC2A4\uD06C\uB9BD\uD2B8 \uB85C\uB4DC \uC911 (${reference})...` } });
28736
28775
  let referenceScripts = {};
28737
- const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
28776
+ const builtinDir = this.providerLoader.getPrimaryBuiltinDir();
28738
28777
  const refDir = path12.join(builtinDir, "ide", reference);
28739
28778
  if (fs9.existsSync(refDir)) {
28740
28779
  const scriptsDir = path12.join(refDir, "scripts");
@@ -31384,7 +31423,7 @@ var init_adhdev_daemon = __esm({
31384
31423
  fs11 = __toESM(require("fs"));
31385
31424
  path14 = __toESM(require("path"));
31386
31425
  import_chalk2 = __toESM(require("chalk"));
31387
- pkgVersion = "0.6.51";
31426
+ pkgVersion = "0.6.52";
31388
31427
  if (pkgVersion === "unknown") {
31389
31428
  try {
31390
31429
  const possiblePaths = [
@@ -33009,11 +33048,9 @@ function registerProviderCommands(program2) {
33009
33048
  }).catch(async () => {
33010
33049
  const pathMod = await import("path");
33011
33050
  const fsMod = await import("fs");
33012
- const osMod = await import("os");
33013
33051
  const { ProviderLoader: ProviderLoader2 } = await Promise.resolve().then(() => (init_src(), src_exports));
33014
33052
  const loader = new ProviderLoader2();
33015
- const bDir = loader.builtinDirs[0];
33016
- let targetDir = location === "builtin" ? pathMod.join(bDir, category, type) : pathMod.join(osMod.homedir(), ".adhdev", "providers", type);
33053
+ let targetDir = location === "builtin" ? loader.getBuiltinProviderDir(category, type) : loader.getUserProviderDir(category, type);
33017
33054
  if (fsMod.existsSync(targetDir)) return { error: `Provider already exists at ${targetDir}` };
33018
33055
  const isExt = category === "extension";
33019
33056
  const isIde = category === "ide";
@@ -33069,12 +33106,9 @@ function registerProviderCommands(program2) {
33069
33106
  const loader = new ProviderLoader2();
33070
33107
  loader.loadAll();
33071
33108
  const allProviders = loader.getAll();
33072
- const osMod = await import("os");
33073
- const pathMod = await import("path");
33074
33109
  const fsMod = await import("fs");
33075
- const userProviderDir = pathMod.join(osMod.homedir(), ".adhdev", "providers");
33076
33110
  const isUserProvider = (p) => {
33077
- const dir = pathMod.join(userProviderDir, p.type);
33111
+ const dir = loader.getUserProviderDir(p.category, p.type);
33078
33112
  return fsMod.existsSync(dir) && !dir.includes(".upstream");
33079
33113
  };
33080
33114
  let type = typeArg;
@@ -33119,23 +33153,21 @@ function registerProviderCommands(program2) {
33119
33153
  console.log(import_chalk6.default.red("\n\u2717 Fix aborted.\n"));
33120
33154
  process.exit(1);
33121
33155
  }
33122
- const pathMod2 = await import("path");
33156
+ const pathMod = await import("path");
33123
33157
  const fsMod2 = await import("fs");
33124
- const osMod2 = await import("os");
33125
- const bDir = loader.builtinDirs[0];
33126
- const builtinSrc = pathMod2.join(bDir, providerToFix.category, type);
33127
- const downloadedSrc = pathMod2.join(osMod2.homedir(), ".adhdev", "providers", ".upstream", providerToFix.category, type);
33158
+ const builtinSrc = loader.getBuiltinProviderDir(providerToFix.category, type);
33159
+ const downloadedSrc = loader.getUpstreamProviderDir(providerToFix.category, type);
33128
33160
  const sourceDir = fsMod2.existsSync(builtinSrc) ? builtinSrc : downloadedSrc;
33129
33161
  if (actionAnswer.action === "clone") {
33130
33162
  const newType = `my-${type}`;
33131
- const targetDir = pathMod2.join(osMod2.homedir(), ".adhdev", "providers", newType);
33163
+ const targetDir = loader.getUserProviderDir(providerToFix.category, newType);
33132
33164
  if (fsMod2.existsSync(targetDir)) {
33133
33165
  console.log(import_chalk6.default.red(`
33134
33166
  \u2717 Target directory already exists: ${targetDir}. Please delete it or fix it directly.`));
33135
33167
  process.exit(1);
33136
33168
  }
33137
33169
  fsMod2.cpSync(sourceDir, targetDir, { recursive: true });
33138
- const pJsonPath = pathMod2.join(targetDir, "provider.json");
33170
+ const pJsonPath = pathMod.join(targetDir, "provider.json");
33139
33171
  if (fsMod2.existsSync(pJsonPath)) {
33140
33172
  const pJson = JSON.parse(fsMod2.readFileSync(pJsonPath, "utf8"));
33141
33173
  pJson.type = newType;
@@ -33146,11 +33178,11 @@ function registerProviderCommands(program2) {
33146
33178
  \u2713 Successfully cloned to [${newType}]`));
33147
33179
  type = newType;
33148
33180
  } else if (actionAnswer.action === "inplace") {
33149
- const targetDir = pathMod2.join(osMod2.homedir(), ".adhdev", "providers", type);
33181
+ const targetDir = loader.getUserProviderDir(providerToFix.category, type);
33150
33182
  if (!fsMod2.existsSync(targetDir)) {
33151
33183
  fsMod2.cpSync(sourceDir, targetDir, { recursive: true });
33152
33184
  }
33153
- const pJsonPath = pathMod2.join(targetDir, "provider.json");
33185
+ const pJsonPath = pathMod.join(targetDir, "provider.json");
33154
33186
  if (fsMod2.existsSync(pJsonPath)) {
33155
33187
  const pJson = JSON.parse(fsMod2.readFileSync(pJsonPath, "utf8"));
33156
33188
  pJson.disableUpstream = true;
@@ -33265,11 +33297,14 @@ function registerProviderCommands(program2) {
33265
33297
  if (!startResult.started || !startResult.sseUrl) {
33266
33298
  throw new Error(`Unexpected response: ${JSON.stringify(startResult)}`);
33267
33299
  }
33268
- const pathMod2 = await import("path");
33269
- const osPaths = await import("os");
33270
- const targetDir = pathMod2.join(osPaths.homedir(), ".adhdev", "providers", type);
33300
+ const pathMod = await import("path");
33301
+ const { ProviderLoader: ProviderLoader3 } = await Promise.resolve().then(() => (init_src(), src_exports));
33302
+ const loader2 = new ProviderLoader3();
33303
+ loader2.loadAll();
33304
+ const providerMeta = loader2.getMeta(type);
33305
+ const targetDir = providerMeta ? loader2.getUserProviderDir(providerMeta.category, type) : pathMod.join(loader2.getUserDir(), type);
33271
33306
  const fsMock = await import("fs");
33272
- const logFile2 = pathMod2.join(targetDir, `auto-impl.log`);
33307
+ const logFile2 = pathMod.join(targetDir, `auto-impl.log`);
33273
33308
  fsMock.writeFileSync(logFile2, `=== Auto-Impl Started ===
33274
33309
  `);
33275
33310
  console.log(import_chalk6.default.gray(` Agent logs: ${logFile2}`));
@@ -33447,11 +33482,21 @@ function registerProviderCommands(program2) {
33447
33482
  }).catch(async () => {
33448
33483
  const pathMod = await import("path");
33449
33484
  const fsMod = await import("fs");
33450
- const osMod = await import("os");
33485
+ const { ProviderLoader: ProviderLoader2 } = await Promise.resolve().then(() => (init_src(), src_exports));
33486
+ const loader = new ProviderLoader2();
33487
+ loader.loadAll();
33488
+ const providerMeta = loader.getMeta(type);
33451
33489
  const possiblePaths = [
33452
- pathMod.join(osMod.homedir(), ".adhdev", "providers", type, "provider.js"),
33453
- pathMod.join(new (await Promise.resolve().then(() => (init_src(), src_exports))).ProviderLoader().builtinDirs[0], "ide", type, "provider.js"),
33454
- pathMod.join(new (await Promise.resolve().then(() => (init_src(), src_exports))).ProviderLoader().builtinDirs[0], "extension", type, "provider.js")
33490
+ ...providerMeta ? [
33491
+ pathMod.join(loader.getUserProviderDir(providerMeta.category, type), "provider.js"),
33492
+ pathMod.join(loader.getUpstreamProviderDir(providerMeta.category, type), "provider.js"),
33493
+ pathMod.join(loader.getBuiltinProviderDir(providerMeta.category, type), "provider.js")
33494
+ ] : [],
33495
+ pathMod.join(loader.getUserDir(), type, "provider.js"),
33496
+ pathMod.join(loader.getUpstreamDir(), "ide", type, "provider.js"),
33497
+ pathMod.join(loader.getUpstreamDir(), "extension", type, "provider.js"),
33498
+ pathMod.join(loader.getPrimaryBuiltinDir(), "ide", type, "provider.js"),
33499
+ pathMod.join(loader.getPrimaryBuiltinDir(), "extension", type, "provider.js")
33455
33500
  ];
33456
33501
  for (const p of possiblePaths) {
33457
33502
  if (fsMod.existsSync(p)) {