@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.
- package/README.md +27 -0
- package/dist/index.js +142 -40
- 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/
|
|
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
|
-
|
|
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
|
|
25892
|
-
|
|
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
|
|
25897
|
-
|
|
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 {
|
|
25903
|
-
|
|
25904
|
-
|
|
25905
|
-
|
|
25906
|
-
|
|
25907
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|