@jaggerxtrm/specialists 3.15.0 → 3.15.2
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/asset-contract.json +1 -1
- package/dist/index.js +103 -38
- package/dist/types/cli/init.d.ts +1 -1
- package/dist/types/cli/init.d.ts.map +1 -1
- package/dist/types/cli/list-rules.d.ts.map +1 -1
- package/dist/types/cli/prune-stale-defaults.d.ts.map +1 -1
- package/dist/types/cli/ps.d.ts.map +1 -1
- package/dist/types/cli/run.d.ts.map +1 -1
- package/dist/types/specialist/drift-detector.d.ts +2 -2
- package/dist/types/specialist/drift-detector.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/asset-contract.json
CHANGED
package/dist/index.js
CHANGED
|
@@ -23262,11 +23262,14 @@ __export(exports_list_rules, {
|
|
|
23262
23262
|
});
|
|
23263
23263
|
import { existsSync as existsSync9, readFileSync as readFileSync6, readdirSync } from "fs";
|
|
23264
23264
|
import { resolve as resolve5, join as join8, basename as basename3 } from "path";
|
|
23265
|
+
function resolvePackageDir(asset) {
|
|
23266
|
+
return resolveCanonicalAssetDir(asset) ?? null;
|
|
23267
|
+
}
|
|
23265
23268
|
function discoverRuleSets(cwd) {
|
|
23266
23269
|
const seen = new Map;
|
|
23267
23270
|
for (const { rel, tier } of RULE_TIERS) {
|
|
23268
|
-
const dir = resolve5(cwd, rel);
|
|
23269
|
-
if (!existsSync9(dir))
|
|
23271
|
+
const dir = rel === "__package__/mandatory-rules" ? resolvePackageDir("mandatory-rules") : resolve5(cwd, rel);
|
|
23272
|
+
if (!dir || !existsSync9(dir))
|
|
23270
23273
|
continue;
|
|
23271
23274
|
let files;
|
|
23272
23275
|
try {
|
|
@@ -23287,8 +23290,8 @@ function discoverRuleSets(cwd) {
|
|
|
23287
23290
|
function discoverSpecialists(cwd) {
|
|
23288
23291
|
const seen = new Map;
|
|
23289
23292
|
for (const { rel, tier } of SPEC_TIERS) {
|
|
23290
|
-
const dir = resolve5(cwd, rel);
|
|
23291
|
-
if (!existsSync9(dir))
|
|
23293
|
+
const dir = rel === "__package__/specialists" ? resolvePackageDir("specialists") : resolve5(cwd, rel);
|
|
23294
|
+
if (!dir || !existsSync9(dir))
|
|
23292
23295
|
continue;
|
|
23293
23296
|
let files;
|
|
23294
23297
|
try {
|
|
@@ -23391,7 +23394,8 @@ function printUsage() {
|
|
|
23391
23394
|
"Usage: specialists list-rules [--rule <id>] [--specialist <name>] [--json]",
|
|
23392
23395
|
"",
|
|
23393
23396
|
"Show which mandatory rules are loaded by which specialists.",
|
|
23394
|
-
"Walks tiers
|
|
23397
|
+
"Walks cwd tiers first, then package-canonical fallback.",
|
|
23398
|
+
"Priority: .specialists/ \u2192 .specialists/default/ \u2192 config/ \u2192 package-canonical.",
|
|
23395
23399
|
"",
|
|
23396
23400
|
"Options:",
|
|
23397
23401
|
" --rule <id> Filter to one rule, list every spec that loads it",
|
|
@@ -23496,16 +23500,19 @@ Orphan rules (defined but not loaded by any specialist):`);
|
|
|
23496
23500
|
var RULE_TIERS, SPEC_TIERS;
|
|
23497
23501
|
var init_list_rules = __esm(() => {
|
|
23498
23502
|
init_mandatory_rules();
|
|
23503
|
+
init_canonical_asset_resolver();
|
|
23499
23504
|
RULE_TIERS = [
|
|
23500
23505
|
{ rel: ".specialists/user/mandatory-rules", tier: "user" },
|
|
23501
23506
|
{ rel: ".specialists/mandatory-rules", tier: "overlay" },
|
|
23502
23507
|
{ rel: ".specialists/default/mandatory-rules", tier: "default" },
|
|
23503
|
-
{ rel: "config/mandatory-rules", tier: "config" }
|
|
23508
|
+
{ rel: "config/mandatory-rules", tier: "config" },
|
|
23509
|
+
{ rel: "__package__/mandatory-rules", tier: "package-canonical" }
|
|
23504
23510
|
];
|
|
23505
23511
|
SPEC_TIERS = [
|
|
23506
23512
|
{ rel: ".specialists/user", tier: "user" },
|
|
23507
23513
|
{ rel: ".specialists/default", tier: "default" },
|
|
23508
|
-
{ rel: "config/specialists", tier: "config" }
|
|
23514
|
+
{ rel: "config/specialists", tier: "config" },
|
|
23515
|
+
{ rel: "__package__/specialists", tier: "package-canonical" }
|
|
23509
23516
|
];
|
|
23510
23517
|
});
|
|
23511
23518
|
|
|
@@ -27456,12 +27463,13 @@ ${bold5("specialists init")}
|
|
|
27456
27463
|
}
|
|
27457
27464
|
warnMissingOptionalPrerequisites();
|
|
27458
27465
|
if (syncDefaults) {
|
|
27466
|
+
warn("--sync-defaults is deprecated. This creates drift debt; use sp pin <id> for intentional pins.");
|
|
27459
27467
|
migrateLegacySpecialists(cwd, "default");
|
|
27460
27468
|
copyCanonicalSpecialists(cwd);
|
|
27461
27469
|
copyCanonicalMandatoryRules(cwd);
|
|
27462
27470
|
copyCanonicalNodeConfigs(cwd);
|
|
27463
27471
|
} else {
|
|
27464
|
-
skip(".specialists/default/ not synced (
|
|
27472
|
+
skip(".specialists/default/ not synced (package canonical by default; use sp pin <id> for intentional pins)");
|
|
27465
27473
|
}
|
|
27466
27474
|
migrateLegacySpecialists(cwd, "user");
|
|
27467
27475
|
createSpecialistsDirs(cwd);
|
|
@@ -27505,7 +27513,7 @@ ${bold5("Done!")}
|
|
|
27505
27513
|
console.log("");
|
|
27506
27514
|
console.log(` ${dim5(".specialists/ structure:")}`);
|
|
27507
27515
|
console.log(` .specialists/`);
|
|
27508
|
-
console.log(` \u251C\u2500\u2500 default/ ${dim5("#
|
|
27516
|
+
console.log(` \u251C\u2500\u2500 default/ ${dim5("# intentional pins only; package canonical by default")}`);
|
|
27509
27517
|
console.log(` \u251C\u2500\u2500 user/ ${dim5("# your custom specialists")}`);
|
|
27510
27518
|
console.log(` \u251C\u2500\u2500 db/ ${dim5("# observability SQLite (gitignored)")}`);
|
|
27511
27519
|
console.log(` \u251C\u2500\u2500 jobs/ ${dim5("# runtime (gitignored)")}`);
|
|
@@ -31943,7 +31951,7 @@ async function run14() {
|
|
|
31943
31951
|
const launchStartedAt = Date.now();
|
|
31944
31952
|
const innerArgs = process.argv.slice(2).filter((a) => a !== "--background");
|
|
31945
31953
|
const cmd = `${process.execPath} ${process.argv[1]} ${innerArgs.map(shellQuote2).join(" ")}`;
|
|
31946
|
-
const tmuxCmd = `/bin/bash -
|
|
31954
|
+
const tmuxCmd = `/bin/bash -c ${shellQuote2(`cd ${shellQuote2(cwd)} && exec ${cmd}`)}`;
|
|
31947
31955
|
let childPid;
|
|
31948
31956
|
let childExitCode;
|
|
31949
31957
|
let childExitPromise;
|
|
@@ -37811,20 +37819,65 @@ function renderBuffered(args) {
|
|
|
37811
37819
|
return lines.join(`
|
|
37812
37820
|
`);
|
|
37813
37821
|
}
|
|
37822
|
+
function stripAnsiEscapeSequences(text) {
|
|
37823
|
+
return text.replace(ANSI_ESCAPE_SEQUENCE_PATTERN, "");
|
|
37824
|
+
}
|
|
37814
37825
|
async function follow(args) {
|
|
37815
|
-
process.stdout.
|
|
37816
|
-
|
|
37826
|
+
const isTTY = Boolean(process.stdout.isTTY);
|
|
37827
|
+
let lastFrame = "";
|
|
37828
|
+
let interval;
|
|
37829
|
+
let cleanedUp = false;
|
|
37830
|
+
const write = (text) => {
|
|
37831
|
+
process.stdout.write(text);
|
|
37832
|
+
};
|
|
37833
|
+
const enterFollowMode = () => {
|
|
37834
|
+
if (!isTTY)
|
|
37835
|
+
return;
|
|
37836
|
+
write(ANSI_ENTER_ALT_SCREEN);
|
|
37837
|
+
write(ANSI_HIDE_CURSOR);
|
|
37838
|
+
};
|
|
37839
|
+
const exitFollowMode = () => {
|
|
37840
|
+
if (!isTTY || cleanedUp)
|
|
37841
|
+
return;
|
|
37842
|
+
cleanedUp = true;
|
|
37843
|
+
write(ANSI_SHOW_CURSOR);
|
|
37844
|
+
write(ANSI_EXIT_ALT_SCREEN);
|
|
37845
|
+
};
|
|
37817
37846
|
const drawFrame = () => {
|
|
37818
37847
|
const frame = renderBuffered(args);
|
|
37819
|
-
|
|
37848
|
+
if (frame === lastFrame)
|
|
37849
|
+
return;
|
|
37850
|
+
lastFrame = frame;
|
|
37851
|
+
if (!isTTY) {
|
|
37852
|
+
write(`${stripAnsiEscapeSequences(frame)}
|
|
37853
|
+
|
|
37820
37854
|
`);
|
|
37855
|
+
return;
|
|
37856
|
+
}
|
|
37857
|
+
write(`${ANSI_CURSOR_HOME}${ANSI_ERASE_DOWN}${frame}
|
|
37858
|
+
`);
|
|
37859
|
+
};
|
|
37860
|
+
const cleanup = (exitCode) => {
|
|
37861
|
+
if (interval)
|
|
37862
|
+
clearInterval(interval);
|
|
37863
|
+
exitFollowMode();
|
|
37864
|
+
if (exitCode !== undefined)
|
|
37865
|
+
process.exit(exitCode);
|
|
37821
37866
|
};
|
|
37822
|
-
process.stdout.
|
|
37867
|
+
process.stdout.on("error", (error2) => {
|
|
37868
|
+
if (error2.code === "EPIPE") {
|
|
37869
|
+
cleanup(0);
|
|
37870
|
+
return;
|
|
37871
|
+
}
|
|
37872
|
+
throw error2;
|
|
37873
|
+
});
|
|
37874
|
+
process.once("SIGINT", () => cleanup(130));
|
|
37875
|
+
process.once("SIGTERM", () => cleanup(143));
|
|
37876
|
+
process.once("exit", () => cleanup());
|
|
37877
|
+
enterFollowMode();
|
|
37823
37878
|
drawFrame();
|
|
37824
37879
|
await new Promise(() => {
|
|
37825
|
-
setInterval(
|
|
37826
|
-
drawFrame();
|
|
37827
|
-
}, 1000);
|
|
37880
|
+
interval = setInterval(drawFrame, 1000);
|
|
37828
37881
|
});
|
|
37829
37882
|
}
|
|
37830
37883
|
async function run16() {
|
|
@@ -37848,7 +37901,7 @@ async function run16() {
|
|
|
37848
37901
|
sqliteClient?.close();
|
|
37849
37902
|
}
|
|
37850
37903
|
}
|
|
37851
|
-
var ACTIVE_STATES, TERMINAL_STATES, BEAD_TITLE_CACHE, STATUS_PRIORITY;
|
|
37904
|
+
var ACTIVE_STATES, TERMINAL_STATES, BEAD_TITLE_CACHE, STATUS_PRIORITY, ANSI_ENTER_ALT_SCREEN = "\x1B[?1049h", ANSI_EXIT_ALT_SCREEN = "\x1B[?1049l", ANSI_HIDE_CURSOR = "\x1B[?25l", ANSI_SHOW_CURSOR = "\x1B[?25h", ANSI_CURSOR_HOME = "\x1B[H", ANSI_ERASE_DOWN = "\x1B[J", ANSI_ESCAPE_SEQUENCE_PATTERN;
|
|
37852
37905
|
var init_ps = __esm(() => {
|
|
37853
37906
|
init_format_helpers();
|
|
37854
37907
|
init_supervisor();
|
|
@@ -37869,6 +37922,7 @@ var init_ps = __esm(() => {
|
|
|
37869
37922
|
error: 0,
|
|
37870
37923
|
cancelled: 0
|
|
37871
37924
|
};
|
|
37925
|
+
ANSI_ESCAPE_SEQUENCE_PATTERN = /\x1B\[[0-?]*[ -/]*[@-~]/g;
|
|
37872
37926
|
});
|
|
37873
37927
|
|
|
37874
37928
|
// src/cli/result.ts
|
|
@@ -40448,9 +40502,9 @@ function relPath(path, base) {
|
|
|
40448
40502
|
function makeFinding(repoRoot, kind, scope, path, canonicalPath, bytesEqual) {
|
|
40449
40503
|
const rel = relPath(path, repoRoot);
|
|
40450
40504
|
if (scope === "default") {
|
|
40451
|
-
return bytesEqual ? { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "redundant-safe-to-prune", bytes_equal: true, suggested_action:
|
|
40505
|
+
return bytesEqual ? { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "redundant-safe-to-prune", bytes_equal: true, suggested_action: "safe prune", suggestion_command: `sp prune-stale-defaults --root ${repoRoot}` } : { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "diverged-safe-to-prune", bytes_equal: false, suggested_action: "safe prune", suggestion_command: `cp ${rel} .specialists/user/` };
|
|
40452
40506
|
}
|
|
40453
|
-
return bytesEqual ? { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "useless-override-safe-to-remove", bytes_equal: true, suggested_action:
|
|
40507
|
+
return bytesEqual ? { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "useless-override-safe-to-remove", bytes_equal: true, suggested_action: "safe remove", suggestion_command: `rm ${rel}` } : { repo_root: repoRoot, kind, scope, path, canonical_path: canonicalPath, status: "diverged-consider-removing-or-refactoring", bytes_equal: false, suggested_action: "keep if intentional override", suggestion_command: `rm ${rel}` };
|
|
40454
40508
|
}
|
|
40455
40509
|
function resolveDriftAssets() {
|
|
40456
40510
|
return ASSETS.map((asset) => ({ ...asset, canonicalDir: resolveCanonicalAssetDir(asset.kind) }));
|
|
@@ -40508,14 +40562,14 @@ function detectDriftUnderRoot(root) {
|
|
|
40508
40562
|
repos: repos.length,
|
|
40509
40563
|
findings: summary.length,
|
|
40510
40564
|
redundant_defaults: summary.filter((f) => f.status === "redundant-safe-to-prune").length,
|
|
40511
|
-
diverged_defaults: summary.filter((f) => f.status === "diverged-
|
|
40565
|
+
diverged_defaults: summary.filter((f) => f.status === "diverged-safe-to-prune").length,
|
|
40512
40566
|
useless_overrides: summary.filter((f) => f.status === "useless-override-safe-to-remove").length,
|
|
40513
40567
|
diverged_overrides: summary.filter((f) => f.status === "diverged-consider-removing-or-refactoring").length
|
|
40514
40568
|
}
|
|
40515
40569
|
};
|
|
40516
40570
|
}
|
|
40517
|
-
function pruneStaleDefaults(repoRoot, dryRun) {
|
|
40518
|
-
const targets = detectDriftForRepo(repoRoot).filter((f) => f.scope === "default" && f.bytes_equal === true).map((f) => f.path);
|
|
40571
|
+
function pruneStaleDefaults(repoRoot, dryRun, keepDiverged = false) {
|
|
40572
|
+
const targets = detectDriftForRepo(repoRoot).filter((f) => f.scope === "default" && (keepDiverged ? f.bytes_equal === true : true)).map((f) => f.path);
|
|
40519
40573
|
if (!dryRun) {
|
|
40520
40574
|
for (const target of targets)
|
|
40521
40575
|
rmSync5(target, { recursive: true, force: true });
|
|
@@ -40543,12 +40597,17 @@ function parseArgs11(argv) {
|
|
|
40543
40597
|
let dryRun = false;
|
|
40544
40598
|
let root = process.cwd();
|
|
40545
40599
|
let help = false;
|
|
40600
|
+
let keepDiverged = false;
|
|
40546
40601
|
for (let i = 0;i < argv.length; i += 1) {
|
|
40547
40602
|
const token = argv[i];
|
|
40548
40603
|
if (token === "--dry-run") {
|
|
40549
40604
|
dryRun = true;
|
|
40550
40605
|
continue;
|
|
40551
40606
|
}
|
|
40607
|
+
if (token === "--keep-diverged") {
|
|
40608
|
+
keepDiverged = true;
|
|
40609
|
+
continue;
|
|
40610
|
+
}
|
|
40552
40611
|
if (token === "--root") {
|
|
40553
40612
|
const value = argv[i + 1];
|
|
40554
40613
|
if (!value || value.startsWith("--"))
|
|
@@ -40563,31 +40622,37 @@ function parseArgs11(argv) {
|
|
|
40563
40622
|
}
|
|
40564
40623
|
throw new Error(`Unknown argument: ${token}`);
|
|
40565
40624
|
}
|
|
40566
|
-
return { dryRun, root, help };
|
|
40625
|
+
return { dryRun, root, help, keepDiverged };
|
|
40567
40626
|
}
|
|
40568
40627
|
function printHelp() {
|
|
40569
|
-
console.log("Usage: sp prune-stale-defaults [--dry-run] [--root <path>]");
|
|
40570
|
-
console.log(" --dry-run
|
|
40571
|
-
console.log(" --
|
|
40628
|
+
console.log("Usage: sp prune-stale-defaults [--dry-run] [--keep-diverged] [--root <path>]");
|
|
40629
|
+
console.log(" --dry-run List stale default snapshots without pruning");
|
|
40630
|
+
console.log(" --keep-diverged Preserve diverged .specialists/default entries");
|
|
40631
|
+
console.log(" --root Repo root to scan");
|
|
40572
40632
|
}
|
|
40573
40633
|
async function run27(argv = process.argv.slice(3)) {
|
|
40574
|
-
const { dryRun, root, help } = parseArgs11(argv);
|
|
40634
|
+
const { dryRun, root, help, keepDiverged } = parseArgs11(argv);
|
|
40575
40635
|
if (help) {
|
|
40576
40636
|
printHelp();
|
|
40577
40637
|
return;
|
|
40578
40638
|
}
|
|
40579
|
-
const
|
|
40580
|
-
|
|
40639
|
+
const allFindings = detectDriftForRepo(root).filter((f) => f.scope === "default");
|
|
40640
|
+
const divergedFindings = allFindings.filter((f) => f.bytes_equal === false);
|
|
40641
|
+
const findings = keepDiverged ? allFindings.filter((f) => f.bytes_equal === true) : allFindings;
|
|
40642
|
+
if (allFindings.length === 0) {
|
|
40581
40643
|
console.log("No stale default snapshots found.");
|
|
40582
40644
|
return;
|
|
40583
40645
|
}
|
|
40646
|
+
if (divergedFindings.length > 0 && !keepDiverged) {
|
|
40647
|
+
console.log("Warning: prune-stale-defaults now removes diverged .specialists/default entries by default. Use --keep-diverged to keep old behavior.");
|
|
40648
|
+
}
|
|
40584
40649
|
console.log(dryRun ? "Dry run: stale default snapshots" : "Pruning stale default snapshots");
|
|
40585
40650
|
for (const finding of findings) {
|
|
40586
40651
|
console.log(`- ${finding.path}`);
|
|
40587
40652
|
}
|
|
40588
40653
|
if (dryRun)
|
|
40589
40654
|
return;
|
|
40590
|
-
pruneStaleDefaults(root, false);
|
|
40655
|
+
pruneStaleDefaults(root, false, keepDiverged);
|
|
40591
40656
|
console.log(`Pruned ${findings.length} stale default snapshot${findings.length === 1 ? "" : "s"}.`);
|
|
40592
40657
|
}
|
|
40593
40658
|
var init_prune_stale_defaults = __esm(() => {
|
|
@@ -41204,7 +41269,7 @@ function checkManagedMirror(label, canonicalRelativePath, mirrorDir, fixHint) {
|
|
|
41204
41269
|
return true;
|
|
41205
41270
|
}
|
|
41206
41271
|
if (drifted.length > 0) {
|
|
41207
|
-
fail4(`${label}: ${drifted.length}
|
|
41272
|
+
fail4(`${label}: ${drifted.length} safe prune candidate${drifted.length === 1 ? "" : "s"}`);
|
|
41208
41273
|
hint(`example: ${drifted.slice(0, 3).join(", ")}${drifted.length > 3 ? ", ..." : ""}`);
|
|
41209
41274
|
}
|
|
41210
41275
|
if (missing.length > 0) {
|
|
@@ -41220,9 +41285,9 @@ function checkManagedMirror(label, canonicalRelativePath, mirrorDir, fixHint) {
|
|
|
41220
41285
|
}
|
|
41221
41286
|
function checkManagedAssetMirrors() {
|
|
41222
41287
|
section3("Category B xtrm-managed asset mirrors");
|
|
41223
|
-
const specialistsOk = checkManagedMirror("specialists", "specialists", DEFAULT_SPECIALISTS_DIR, "
|
|
41224
|
-
const rulesOk = checkManagedMirror("mandatory-rules", "mandatory-rules", join33(DEFAULT_SPECIALISTS_DIR, "mandatory-rules"), "
|
|
41225
|
-
const nodesOk = checkManagedMirror("nodes", "nodes", join33(DEFAULT_SPECIALISTS_DIR, "nodes"), "
|
|
41288
|
+
const specialistsOk = checkManagedMirror("specialists", "specialists", DEFAULT_SPECIALISTS_DIR, "sp prune-stale-defaults --apply");
|
|
41289
|
+
const rulesOk = checkManagedMirror("mandatory-rules", "mandatory-rules", join33(DEFAULT_SPECIALISTS_DIR, "mandatory-rules"), "sp prune-stale-defaults --apply");
|
|
41290
|
+
const nodesOk = checkManagedMirror("nodes", "nodes", join33(DEFAULT_SPECIALISTS_DIR, "nodes"), "sp prune-stale-defaults --apply");
|
|
41226
41291
|
return specialistsOk && rulesOk && nodesOk;
|
|
41227
41292
|
}
|
|
41228
41293
|
function checkUserOverlayDrift() {
|
|
@@ -41624,7 +41689,7 @@ ${bold13("specialists doctor")}
|
|
|
41624
41689
|
console.log(` ${green15("\u2713")} ${bold13("All checks passed")} \u2014 specialists is healthy`);
|
|
41625
41690
|
} else {
|
|
41626
41691
|
console.log(` ${yellow12("\u25CB")} ${bold13("Some checks failed")} \u2014 follow the fix hints above`);
|
|
41627
|
-
console.log(` ${dim14("specialists init fixes hook + MCP registration; specialists init --sync-skills fixes skill drift/symlink issues;
|
|
41692
|
+
console.log(` ${dim14("specialists init fixes hook + MCP registration; specialists init --sync-skills fixes skill drift/symlink issues; sp prune-stale-defaults --apply removes stale default mirrors; --sync-defaults is deprecated.")}`);
|
|
41628
41693
|
}
|
|
41629
41694
|
console.log("");
|
|
41630
41695
|
}
|
|
@@ -42438,7 +42503,7 @@ var init_help = __esm(() => {
|
|
|
42438
42503
|
["status", "Show health, MCP state, and active jobs"],
|
|
42439
42504
|
["ps", "Show actionable dashboard (active + unresolved terminal problems); --json, --all, --follow, --active, --health, --include-terminal, --include-cleaned"],
|
|
42440
42505
|
["doctor", "Diagnose installation/runtime problems; --check-drift reports stale .specialists/default/ snapshots"],
|
|
42441
|
-
["prune-stale-defaults", "Prune
|
|
42506
|
+
["prune-stale-defaults", "Prune stale .specialists/default snapshots; default removes diverged mirrors too; --dry-run, --keep-diverged, --root <path>"],
|
|
42442
42507
|
["quickstart", "Full getting-started guide"],
|
|
42443
42508
|
["help", "Show this help"]
|
|
42444
42509
|
];
|
|
@@ -50502,7 +50567,7 @@ async function run34() {
|
|
|
50502
50567
|
"Options:",
|
|
50503
50568
|
" --json Structured JSON output with trees[].children[] schema",
|
|
50504
50569
|
" --all Include every row, including cleaned/dead/terminal history",
|
|
50505
|
-
" --follow, -f Live-
|
|
50570
|
+
" --follow, -f Live dashboard; TTY repaints in-place, pipes append ANSI-free snapshots",
|
|
50506
50571
|
" --health Show detailed process health tables (default is aggregate only)",
|
|
50507
50572
|
" --active Show active jobs only; hide unresolved terminal problems",
|
|
50508
50573
|
" --include-terminal Include terminal history that has not been cleaned",
|
package/dist/types/cli/init.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface InitOptions {
|
|
2
|
-
/**
|
|
2
|
+
/** Deprecated alias: keep only for intentional pin/bootstrap compatibility. */
|
|
3
3
|
syncDefaults?: boolean;
|
|
4
4
|
/** When true, overwrite canonical skills in .xtrm/skills/default/ and refresh active symlinks only. */
|
|
5
5
|
syncSkills?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAi2BA,MAAM,WAAW,WAAW;IAC1B
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAi2BA,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uGAAuG;IACvG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,GAAG,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyG/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-rules.d.ts","sourceRoot":"","sources":["../../../src/cli/list-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-rules.d.ts","sourceRoot":"","sources":["../../../src/cli/list-rules.ts"],"names":[],"mappings":"AAqMA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAgFzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prune-stale-defaults.d.ts","sourceRoot":"","sources":["../../../src/cli/prune-stale-defaults.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prune-stale-defaults.d.ts","sourceRoot":"","sources":["../../../src/cli/prune-stale-defaults.ts"],"names":[],"mappings":"AAyCA,wBAAsB,GAAG,CAAC,IAAI,GAAE,SAAS,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BxF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/cli/ps.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/cli/ps.ts"],"names":[],"mappings":"AAsqCA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AA6gBA,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+FrG;AAGD,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AA6gBA,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+FrG;AAGD,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAsXzC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type DriftScope = 'default' | 'user';
|
|
2
|
-
export type DriftStatus = 'redundant-safe-to-prune' | 'diverged-
|
|
2
|
+
export type DriftStatus = 'redundant-safe-to-prune' | 'diverged-safe-to-prune' | 'useless-override-safe-to-remove' | 'diverged-consider-removing-or-refactoring';
|
|
3
3
|
export interface DriftAssetKind {
|
|
4
4
|
kind: 'specialists' | 'mandatory-rules' | 'catalog' | 'nodes';
|
|
5
5
|
managedDir: string;
|
|
@@ -35,5 +35,5 @@ export interface DriftReport {
|
|
|
35
35
|
export declare function resolveDriftAssets(): DriftAssetKind[];
|
|
36
36
|
export declare function detectDriftForRepo(repoRoot: string): DriftFinding[];
|
|
37
37
|
export declare function detectDriftUnderRoot(root: string): DriftReport;
|
|
38
|
-
export declare function pruneStaleDefaults(repoRoot: string, dryRun: boolean): string[];
|
|
38
|
+
export declare function pruneStaleDefaults(repoRoot: string, dryRun: boolean, keepDiverged?: boolean): string[];
|
|
39
39
|
//# sourceMappingURL=drift-detector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../../../src/specialist/drift-detector.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAC5C,MAAM,MAAM,WAAW,GACnB,yBAAyB,GACzB,
|
|
1
|
+
{"version":3,"file":"drift-detector.d.ts","sourceRoot":"","sources":["../../../src/specialist/drift-detector.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAC5C,MAAM,MAAM,WAAW,GACnB,yBAAyB,GACzB,wBAAwB,GACxB,iCAAiC,GACjC,2CAA2C,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,GAAG,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAC;IACzD,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AA0CD,wBAAgB,kBAAkB,IAAI,cAAc,EAAE,CAErD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAoBnE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA+B9D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,UAAQ,GAAG,MAAM,EAAE,CAQpG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jaggerxtrm/specialists",
|
|
3
|
-
"version": "3.15.
|
|
3
|
+
"version": "3.15.2",
|
|
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
|
"types": "dist/types/lib.d.ts",
|