@olorehq/olore 0.1.3 → 0.1.4

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/cli.js +126 -10
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // src/cli.ts
4
4
  import { createRequire } from "module";
5
5
  import { Command } from "commander";
6
- import pc9 from "picocolors";
6
+ import pc10 from "picocolors";
7
7
 
8
8
  // src/commands/doctor.ts
9
9
  import pc from "picocolors";
@@ -742,6 +742,22 @@ async function fetchWithTimeout(url, timeout = DOWNLOAD_TIMEOUT) {
742
742
  clearTimeout(timeoutId);
743
743
  }
744
744
  }
745
+ async function fetchPackageIndex() {
746
+ const url = `${REGISTRY_URL}/index.json`;
747
+ const response = await fetchWithTimeout(url);
748
+ if (response.status === 404) {
749
+ throw new RegistryError("Registry not found", "NOT_FOUND");
750
+ }
751
+ if (!response.ok) {
752
+ throw new RegistryError(`Failed to fetch registry: ${response.status}`, "NETWORK_ERROR");
753
+ }
754
+ try {
755
+ const data = await response.json();
756
+ return data;
757
+ } catch {
758
+ throw new RegistryError("Invalid registry response", "INVALID_RESPONSE");
759
+ }
760
+ }
745
761
  async function fetchPackageVersions(name) {
746
762
  const url = `${REGISTRY_URL}/packages/${name}.json`;
747
763
  const response = await fetchWithTimeout(url);
@@ -1260,17 +1276,109 @@ Specify version: ${pc8.cyan(`olore remove ${name}@<version>`)}`);
1260
1276
  }
1261
1277
  }
1262
1278
 
1279
+ // src/commands/search.ts
1280
+ import ora5 from "ora";
1281
+ import pc9 from "picocolors";
1282
+ async function search(query, options) {
1283
+ const spinner = ora5("Fetching package registry...").start();
1284
+ let packages;
1285
+ try {
1286
+ const index = await fetchPackageIndex();
1287
+ packages = index.packages;
1288
+ spinner.stop();
1289
+ } catch (error) {
1290
+ spinner.fail("Failed to fetch registry");
1291
+ if (error instanceof RegistryError) {
1292
+ if (error.code === "NETWORK_ERROR" || error.code === "TIMEOUT") {
1293
+ console.log(pc9.red(`
1294
+ Network error: ${error.message}`));
1295
+ console.log(pc9.gray("Please check your internet connection and try again."));
1296
+ } else {
1297
+ console.log(pc9.red(`
1298
+ Error: ${error.message}`));
1299
+ }
1300
+ } else {
1301
+ console.log(pc9.red(`
1302
+ Error: ${error instanceof Error ? error.message : "Unknown error"}`));
1303
+ }
1304
+ process.exit(1);
1305
+ }
1306
+ let entries = Object.entries(packages);
1307
+ if (query) {
1308
+ const q = query.toLowerCase();
1309
+ entries = entries.filter(
1310
+ ([name, info]) => name.toLowerCase().includes(q) || info.description.toLowerCase().includes(q)
1311
+ );
1312
+ }
1313
+ if (entries.length === 0) {
1314
+ if (query) {
1315
+ console.log(pc9.yellow(`
1316
+ No packages matching '${query}'`));
1317
+ } else {
1318
+ console.log(pc9.yellow("\nNo packages available in the registry"));
1319
+ }
1320
+ return;
1321
+ }
1322
+ const installed = await getInstalledPackages();
1323
+ const installedNames = new Set(installed.map((p) => p.name));
1324
+ const installedVersions = /* @__PURE__ */ new Map();
1325
+ for (const pkg of installed) {
1326
+ installedVersions.set(pkg.name, pkg.version);
1327
+ }
1328
+ if (options.json) {
1329
+ const result = {
1330
+ packages: entries.map(([name, info]) => ({
1331
+ name,
1332
+ description: info.description,
1333
+ versions: info.versions,
1334
+ installed: installedNames.has(name),
1335
+ installedVersion: installedVersions.get(name) || null
1336
+ })),
1337
+ ...query ? { query } : {}
1338
+ };
1339
+ console.log(JSON.stringify(result, null, 2));
1340
+ return;
1341
+ }
1342
+ const colName = 20;
1343
+ const colDesc = 44;
1344
+ const colVersions = 12;
1345
+ console.log(pc9.bold("\nAvailable packages:\n"));
1346
+ console.log(
1347
+ pc9.gray(
1348
+ "PACKAGE".padEnd(colName) + "DESCRIPTION".padEnd(colDesc) + "VERSIONS".padEnd(colVersions) + "INSTALLED"
1349
+ )
1350
+ );
1351
+ console.log(pc9.gray("\u2500".repeat(colName + colDesc + colVersions + 12)));
1352
+ for (const [name, info] of entries.sort(([a], [b]) => a.localeCompare(b))) {
1353
+ const desc = truncate(info.description, colDesc - 2);
1354
+ const versions = info.versions.join(", ");
1355
+ const installedVersion = installedVersions.get(name);
1356
+ const status = installedVersion ? pc9.green(`\u2713 ${installedVersion}`) : "";
1357
+ console.log(
1358
+ name.padEnd(colName) + desc.padEnd(colDesc) + versions.padEnd(colVersions) + status
1359
+ );
1360
+ }
1361
+ console.log(pc9.gray("\u2500".repeat(colName + colDesc + colVersions + 12)));
1362
+ console.log(pc9.gray(`${entries.length} package${entries.length === 1 ? "" : "s"} available`));
1363
+ console.log(`
1364
+ Install with: ${pc9.cyan("olore install <package>")}`);
1365
+ }
1366
+ function truncate(str, maxLen) {
1367
+ if (str.length <= maxLen) return str;
1368
+ return str.slice(0, maxLen - 1) + "\u2026";
1369
+ }
1370
+
1263
1371
  // src/cli.ts
1264
1372
  var require2 = createRequire(import.meta.url);
1265
1373
  var { version } = require2("../package.json");
1266
1374
  var program = new Command();
1267
1375
  program.name("olore").description("Universal documentation for any AI coding agent").version(version).addHelpText("after", `
1268
- ${pc9.gray("May the Skill be with you.")}`);
1376
+ ${pc10.gray("May the Skill be with you.")}`);
1269
1377
  program.command("init").description("Initialize a documentation package in the current directory").option("-n, --name <name>", "Package name (default: folder name)").option("-v, --version <version>", "Package version (default: latest)").option("-y, --yes", "Skip prompts, use defaults").action(async (options) => {
1270
1378
  try {
1271
1379
  await init(options);
1272
1380
  } catch (error) {
1273
- console.error(pc9.red(`Error: ${error.message}`));
1381
+ console.error(pc10.red(`Error: ${error.message}`));
1274
1382
  process.exit(1);
1275
1383
  }
1276
1384
  });
@@ -1278,7 +1386,7 @@ program.command("install <package>").alias("i").description("Install a documenta
1278
1386
  try {
1279
1387
  await install(pkg, options);
1280
1388
  } catch (error) {
1281
- console.error(pc9.red(`Error: ${error.message}`));
1389
+ console.error(pc10.red(`Error: ${error.message}`));
1282
1390
  process.exit(1);
1283
1391
  }
1284
1392
  });
@@ -1286,7 +1394,7 @@ program.command("link <path>").description("Link a local package for development
1286
1394
  try {
1287
1395
  await link(localPath);
1288
1396
  } catch (error) {
1289
- console.error(pc9.red(`Error: ${error.message}`));
1397
+ console.error(pc10.red(`Error: ${error.message}`));
1290
1398
  process.exit(1);
1291
1399
  }
1292
1400
  });
@@ -1294,7 +1402,15 @@ program.command("list").alias("ls").description("List installed documentation pa
1294
1402
  try {
1295
1403
  await list(options);
1296
1404
  } catch (error) {
1297
- console.error(pc9.red(`Error: ${error.message}`));
1405
+ console.error(pc10.red(`Error: ${error.message}`));
1406
+ process.exit(1);
1407
+ }
1408
+ });
1409
+ program.command("search [query]").description("Search available packages in the registry").option("--json", "Output as JSON").action(async (query, options) => {
1410
+ try {
1411
+ await search(query, options);
1412
+ } catch (error) {
1413
+ console.error(pc10.red(`Error: ${error.message}`));
1298
1414
  process.exit(1);
1299
1415
  }
1300
1416
  });
@@ -1302,7 +1418,7 @@ program.command("remove <package>").alias("rm").description("Remove an installed
1302
1418
  try {
1303
1419
  await remove(pkg);
1304
1420
  } catch (error) {
1305
- console.error(pc9.red(`Error: ${error.message}`));
1421
+ console.error(pc10.red(`Error: ${error.message}`));
1306
1422
  process.exit(1);
1307
1423
  }
1308
1424
  });
@@ -1310,7 +1426,7 @@ program.command("doctor").description("Check for issues with installed packages"
1310
1426
  try {
1311
1427
  await doctor(options);
1312
1428
  } catch (error) {
1313
- console.error(pc9.red(`Error: ${error.message}`));
1429
+ console.error(pc10.red(`Error: ${error.message}`));
1314
1430
  process.exit(1);
1315
1431
  }
1316
1432
  });
@@ -1318,7 +1434,7 @@ program.command("prune").description("Remove dangling symlinks, orphaned package
1318
1434
  try {
1319
1435
  await prune(options);
1320
1436
  } catch (error) {
1321
- console.error(pc9.red(`Error: ${error.message}`));
1437
+ console.error(pc10.red(`Error: ${error.message}`));
1322
1438
  process.exit(1);
1323
1439
  }
1324
1440
  });
@@ -1326,7 +1442,7 @@ program.command("order66").description(false).action(async () => {
1326
1442
  try {
1327
1443
  await order66();
1328
1444
  } catch (error) {
1329
- console.error(pc9.red(`Error: ${error.message}`));
1445
+ console.error(pc10.red(`Error: ${error.message}`));
1330
1446
  process.exit(1);
1331
1447
  }
1332
1448
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olorehq/olore",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Universal documentation for any AI coding agent",
5
5
  "keywords": [
6
6
  "ai",