@jaggerxtrm/specialists 2.1.9 → 2.1.10

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 (3) hide show
  1. package/README.md +27 -0
  2. package/dist/index.js +142 -40
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -193,6 +193,33 @@ Pre-script output is formatted as `<pre_flight_context>` XML and available in `t
193
193
 
194
194
  ---
195
195
 
196
+ ## CLI
197
+
198
+ Once installed globally, the `specialists` command provides:
199
+
200
+ | Command | Description |
201
+ |---------|-------------|
202
+ | `specialists install` | Full-stack installer: pi, beads, dolt, MCP registration, hooks, scaffold |
203
+ | `specialists list` | List all discovered specialists with model, description, and scope |
204
+ | `specialists version` | Print the installed package version |
205
+ | `specialists` | Start the MCP server (called by Claude Code — not for direct use) |
206
+
207
+ ### specialists list
208
+
209
+ ```
210
+ Specialists (9)
211
+
212
+ auto-remediation google-gemini-cli/gemini-3-flash-preview Autonomous self-healing workflow... [project]
213
+ bug-hunt anthropic/claude-sonnet-4-6 Autonomously investigates bugs... [project]
214
+ codebase-explorer google-gemini-cli/gemini-3-flash-preview Explores codebase structure... [project]
215
+ init-session anthropic/claude-haiku-4-5 Gathers git/commit context... [project]
216
+ overthinker anthropic/claude-sonnet-4-6 Multi-phase deep reasoning... [project]
217
+ ```
218
+
219
+ Scopes: `[project]` = `./specialists/` (or `.claude/specialists/`), `[user]` = `~/.agents/specialists/`
220
+
221
+ ---
222
+
196
223
  ## Development
197
224
 
198
225
  ```bash
package/dist/index.js CHANGED
@@ -17490,11 +17490,6 @@ var init_schema = __esm(() => {
17490
17490
  });
17491
17491
 
17492
17492
  // src/specialist/loader.ts
17493
- var exports_loader = {};
17494
- __export(exports_loader, {
17495
- checkStaleness: () => checkStaleness,
17496
- SpecialistLoader: () => SpecialistLoader
17497
- });
17498
17493
  import { readdir, readFile, stat } from "node:fs/promises";
17499
17494
  import { join } from "node:path";
17500
17495
  import { homedir } from "node:os";
@@ -17592,11 +17587,140 @@ var init_loader = __esm(() => {
17592
17587
  init_schema();
17593
17588
  });
17594
17589
 
17595
- // src/index.ts
17590
+ // src/cli/install.ts
17591
+ var exports_install = {};
17592
+ __export(exports_install, {
17593
+ run: () => run
17594
+ });
17596
17595
  import { execFileSync } from "node:child_process";
17597
17596
  import { fileURLToPath } from "node:url";
17598
17597
  import { dirname as dirname2, join as join4 } from "node:path";
17598
+ async function run() {
17599
+ const installerPath = join4(dirname2(fileURLToPath(import.meta.url)), "..", "..", "bin", "install.js");
17600
+ execFileSync(process.execPath, [installerPath], { stdio: "inherit" });
17601
+ }
17602
+ var init_install = () => {};
17603
+
17604
+ // src/cli/version.ts
17605
+ var exports_version = {};
17606
+ __export(exports_version, {
17607
+ run: () => run2
17608
+ });
17599
17609
  import { createRequire as createRequire2 } from "node:module";
17610
+ async function run2() {
17611
+ const req = createRequire2(import.meta.url);
17612
+ const pkg = req("../package.json");
17613
+ console.log(`${pkg.name} v${pkg.version}`);
17614
+ }
17615
+ var init_version = () => {};
17616
+
17617
+ // src/cli/list.ts
17618
+ var exports_list = {};
17619
+ __export(exports_list, {
17620
+ run: () => run3,
17621
+ parseArgs: () => parseArgs,
17622
+ ArgParseError: () => ArgParseError
17623
+ });
17624
+ function parseArgs(argv) {
17625
+ const result = {};
17626
+ for (let i = 0;i < argv.length; i++) {
17627
+ const token = argv[i];
17628
+ if (token === "--category") {
17629
+ const value = argv[++i];
17630
+ if (!value || value.startsWith("--")) {
17631
+ throw new ArgParseError("--category requires a value");
17632
+ }
17633
+ result.category = value;
17634
+ continue;
17635
+ }
17636
+ if (token === "--scope") {
17637
+ const value = argv[++i];
17638
+ if (value !== "project" && value !== "user") {
17639
+ throw new ArgParseError(`--scope must be "project" or "user", got: "${value ?? ""}"`);
17640
+ }
17641
+ result.scope = value;
17642
+ continue;
17643
+ }
17644
+ }
17645
+ return result;
17646
+ }
17647
+ async function run3() {
17648
+ let args;
17649
+ try {
17650
+ args = parseArgs(process.argv.slice(3));
17651
+ } catch (err) {
17652
+ if (err instanceof ArgParseError) {
17653
+ console.error(`Error: ${err.message}`);
17654
+ process.exit(1);
17655
+ }
17656
+ throw err;
17657
+ }
17658
+ const loader = new SpecialistLoader;
17659
+ let specialists = await loader.list(args.category);
17660
+ if (args.scope) {
17661
+ specialists = specialists.filter((s) => s.scope === args.scope);
17662
+ }
17663
+ if (specialists.length === 0) {
17664
+ console.log("No specialists found.");
17665
+ return;
17666
+ }
17667
+ const nameWidth = Math.max(...specialists.map((s) => s.name.length), 4);
17668
+ const modelWidth = Math.max(...specialists.map((s) => s.model.length), 5);
17669
+ console.log(`
17670
+ ${bold(`Specialists (${specialists.length})`)}
17671
+ `);
17672
+ for (const s of specialists) {
17673
+ const name = cyan(s.name.padEnd(nameWidth));
17674
+ const model = dim(s.model.padEnd(modelWidth));
17675
+ const scopeTag = yellow(`[${s.scope}]`);
17676
+ console.log(` ${name} ${model} ${s.description} ${scopeTag}`);
17677
+ }
17678
+ console.log();
17679
+ }
17680
+ var dim = (s) => `\x1B[2m${s}\x1B[0m`, bold = (s) => `\x1B[1m${s}\x1B[0m`, cyan = (s) => `\x1B[36m${s}\x1B[0m`, yellow = (s) => `\x1B[33m${s}\x1B[0m`, ArgParseError;
17681
+ var init_list = __esm(() => {
17682
+ init_loader();
17683
+ ArgParseError = class ArgParseError extends Error {
17684
+ constructor(message) {
17685
+ super(message);
17686
+ this.name = "ArgParseError";
17687
+ }
17688
+ };
17689
+ });
17690
+
17691
+ // src/cli/help.ts
17692
+ var exports_help = {};
17693
+ __export(exports_help, {
17694
+ run: () => run4
17695
+ });
17696
+ async function run4() {
17697
+ const lines = [
17698
+ "",
17699
+ bold2("specialists <command>"),
17700
+ "",
17701
+ "Commands:",
17702
+ ...COMMANDS.map(([cmd, desc]) => ` ${cmd.padEnd(COL_WIDTH)} ${dim2(desc)}`),
17703
+ "",
17704
+ dim2("Run 'specialists <command> --help' for command-specific options."),
17705
+ ""
17706
+ ];
17707
+ console.log(lines.join(`
17708
+ `));
17709
+ }
17710
+ var bold2 = (s) => `\x1B[1m${s}\x1B[0m`, dim2 = (s) => `\x1B[2m${s}\x1B[0m`, COMMANDS, COL_WIDTH;
17711
+ var init_help = __esm(() => {
17712
+ COMMANDS = [
17713
+ ["install", "Full-stack installer: pi, beads, dolt, MCP registration, hooks"],
17714
+ ["list", "List available specialists with model and description"],
17715
+ ["version", "Print installed version"],
17716
+ ["init", "Initialize specialists in the current project"],
17717
+ ["edit", "Edit a specialist field (e.g. --model, --description)"],
17718
+ ["run", "Run a specialist with a prompt"],
17719
+ ["status", "Show system health (pi, beads, MCP)"],
17720
+ ["help", "Show this help message"]
17721
+ ];
17722
+ COL_WIDTH = Math.max(...COMMANDS.map(([cmd]) => cmd.length));
17723
+ });
17600
17724
 
17601
17725
  // node_modules/zod/v4/core/core.js
17602
17726
  var NEVER2 = Object.freeze({
@@ -25880,51 +26004,29 @@ class SpecialistsServer {
25880
26004
  }
25881
26005
 
25882
26006
  // src/index.ts
25883
- var __dirname2 = dirname2(fileURLToPath(import.meta.url));
25884
26007
  var sub = process.argv[2];
25885
- var dim = (s) => `\x1B[2m${s}\x1B[0m`;
25886
- var bold = (s) => `\x1B[1m${s}\x1B[0m`;
25887
- var cyan = (s) => `\x1B[36m${s}\x1B[0m`;
25888
- var yellow = (s) => `\x1B[33m${s}\x1B[0m`;
25889
- async function run() {
26008
+ async function run5() {
25890
26009
  if (sub === "install") {
25891
- const installerPath = join4(__dirname2, "..", "bin", "install.js");
25892
- execFileSync(process.execPath, [installerPath], { stdio: "inherit" });
25893
- return;
26010
+ const { run: handler } = await Promise.resolve().then(() => (init_install(), exports_install));
26011
+ return handler();
25894
26012
  }
25895
26013
  if (sub === "version") {
25896
- const req = createRequire2(import.meta.url);
25897
- const pkg = req("../package.json");
25898
- console.log(`${pkg.name} v${pkg.version}`);
25899
- return;
26014
+ const { run: handler } = await Promise.resolve().then(() => (init_version(), exports_version));
26015
+ return handler();
25900
26016
  }
25901
26017
  if (sub === "list") {
25902
- const { SpecialistLoader: SpecialistLoader2 } = await Promise.resolve().then(() => (init_loader(), exports_loader));
25903
- const loader = new SpecialistLoader2;
25904
- const specialists = await loader.list();
25905
- if (specialists.length === 0) {
25906
- console.log("No specialists found.");
25907
- return;
25908
- }
25909
- const nameWidth = Math.max(...specialists.map((s) => s.name.length), 4);
25910
- const modelWidth = Math.max(...specialists.map((s) => s.model.length), 5);
25911
- console.log(`
25912
- ${bold(`Specialists (${specialists.length})`)}
25913
- `);
25914
- for (const s of specialists) {
25915
- const name = cyan(s.name.padEnd(nameWidth));
25916
- const model = dim(s.model.padEnd(modelWidth));
25917
- const scope = yellow(`[${s.scope}]`);
25918
- console.log(` ${name} ${model} ${s.description} ${scope}`);
25919
- }
25920
- console.log();
25921
- return;
26018
+ const { run: handler } = await Promise.resolve().then(() => (init_list(), exports_list));
26019
+ return handler();
26020
+ }
26021
+ if (sub === "help" || sub === "--help" || sub === "-h") {
26022
+ const { run: handler } = await Promise.resolve().then(() => (init_help(), exports_help));
26023
+ return handler();
25922
26024
  }
25923
26025
  logger.info("Starting Specialists MCP Server...");
25924
26026
  const server = new SpecialistsServer;
25925
26027
  await server.start();
25926
26028
  }
25927
- run().catch((error2) => {
26029
+ run5().catch((error2) => {
25928
26030
  logger.error(`Fatal error: ${error2}`);
25929
26031
  process.exit(1);
25930
26032
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaggerxtrm/specialists",
3
- "version": "2.1.9",
3
+ "version": "2.1.10",
4
4
  "description": "OmniSpecialist — 7-tool MCP orchestration layer powered by the Specialist System. Discover and execute .specialist.yaml files across project/user/system scopes via pi.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",