@askexenow/exe-os 0.9.63 → 0.9.64
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/bin/cli.js +43 -111
- package/dist/bin/exe-doctor.js +1154 -2588
- package/dist/bin/exe-new-employee.js +1 -111
- package/dist/bin/exe-start-codex.js +1 -111
- package/dist/bin/exe-start-opencode.js +1 -125
- package/dist/bin/install.js +1 -111
- package/dist/bin/stack-update.js +42 -0
- package/dist/hooks/bug-report-worker.js +42 -111
- package/dist/hooks/pre-compact.js +109 -236
- package/dist/hooks/session-end.js +122 -137
- package/dist/hooks/summary-worker.js +72 -124
- package/dist/lib/exe-daemon.js +5 -356
- package/dist/mcp/server.js +5 -372
- package/package.json +1 -1
package/dist/lib/exe-daemon.js
CHANGED
|
@@ -313,15 +313,6 @@ var init_memory = __esm({
|
|
|
313
313
|
});
|
|
314
314
|
|
|
315
315
|
// src/lib/daemon-protocol.ts
|
|
316
|
-
var daemon_protocol_exports = {};
|
|
317
|
-
__export(daemon_protocol_exports, {
|
|
318
|
-
deserializeArgs: () => deserializeArgs,
|
|
319
|
-
deserializeResultSet: () => deserializeResultSet,
|
|
320
|
-
deserializeValue: () => deserializeValue,
|
|
321
|
-
serializeArgs: () => serializeArgs,
|
|
322
|
-
serializeResultSet: () => serializeResultSet,
|
|
323
|
-
serializeValue: () => serializeValue
|
|
324
|
-
});
|
|
325
316
|
function serializeValue(v) {
|
|
326
317
|
if (v === null || v === void 0) return null;
|
|
327
318
|
if (typeof v === "bigint") return Number(v);
|
|
@@ -346,9 +337,6 @@ function deserializeValue(v) {
|
|
|
346
337
|
}
|
|
347
338
|
return v;
|
|
348
339
|
}
|
|
349
|
-
function serializeArgs(args) {
|
|
350
|
-
return args.map(serializeValue);
|
|
351
|
-
}
|
|
352
340
|
function deserializeArgs(args) {
|
|
353
341
|
return args.map(deserializeValue);
|
|
354
342
|
}
|
|
@@ -21003,218 +20991,6 @@ var init_conflict_detector = __esm({
|
|
|
21003
20991
|
}
|
|
21004
20992
|
});
|
|
21005
20993
|
|
|
21006
|
-
// src/adapters/runtime-hook-manifest.ts
|
|
21007
|
-
function manifestEntryForCommand(command) {
|
|
21008
|
-
return EXE_HOOK_MANIFEST.find((entry) => command.includes(entry.commandMarker));
|
|
21009
|
-
}
|
|
21010
|
-
var EXE_HOOKS, EXE_HOOK_MANIFEST, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS;
|
|
21011
|
-
var init_runtime_hook_manifest = __esm({
|
|
21012
|
-
"src/adapters/runtime-hook-manifest.ts"() {
|
|
21013
|
-
"use strict";
|
|
21014
|
-
EXE_HOOKS = {
|
|
21015
|
-
postToolCombined: "dist/hooks/post-tool-combined.js",
|
|
21016
|
-
sessionStart: "dist/hooks/session-start.js",
|
|
21017
|
-
promptSubmit: "dist/hooks/prompt-submit.js",
|
|
21018
|
-
heartbeat: "dist/hooks/exe-heartbeat-hook.js",
|
|
21019
|
-
stop: "dist/hooks/stop.js",
|
|
21020
|
-
preToolUse: "dist/hooks/pre-tool-use.js",
|
|
21021
|
-
subagentStop: "dist/hooks/subagent-stop.js",
|
|
21022
|
-
preCompact: "dist/hooks/pre-compact.js",
|
|
21023
|
-
postCompact: "dist/hooks/post-compact.js",
|
|
21024
|
-
sessionEnd: "dist/hooks/session-end.js",
|
|
21025
|
-
notification: "dist/hooks/notification.js",
|
|
21026
|
-
instructionsLoaded: "dist/hooks/instructions-loaded.js"
|
|
21027
|
-
};
|
|
21028
|
-
EXE_HOOK_MANIFEST = [
|
|
21029
|
-
{
|
|
21030
|
-
key: "postToolCombined",
|
|
21031
|
-
event: "PostToolUse",
|
|
21032
|
-
commandMarker: EXE_HOOKS.postToolCombined,
|
|
21033
|
-
owner: "exe-os",
|
|
21034
|
-
purpose: "Single PostToolUse entrypoint for ingestion, error recall, summaries, and bug detection.",
|
|
21035
|
-
runtimes: ["claude", "codex", "opencode"],
|
|
21036
|
-
checkpointRole: "none"
|
|
21037
|
-
},
|
|
21038
|
-
{
|
|
21039
|
-
key: "sessionStart",
|
|
21040
|
-
event: "SessionStart",
|
|
21041
|
-
commandMarker: EXE_HOOKS.sessionStart,
|
|
21042
|
-
owner: "exe-os",
|
|
21043
|
-
purpose: "Loads agent identity, procedures, and boot context.",
|
|
21044
|
-
runtimes: ["claude", "codex", "opencode"],
|
|
21045
|
-
checkpointRole: "none"
|
|
21046
|
-
},
|
|
21047
|
-
{
|
|
21048
|
-
key: "promptSubmit",
|
|
21049
|
-
event: "UserPromptSubmit",
|
|
21050
|
-
commandMarker: EXE_HOOKS.promptSubmit,
|
|
21051
|
-
owner: "exe-os",
|
|
21052
|
-
purpose: "Injects current tasks, pending reviews, and local context before each prompt.",
|
|
21053
|
-
runtimes: ["claude", "codex", "opencode"],
|
|
21054
|
-
checkpointRole: "none"
|
|
21055
|
-
},
|
|
21056
|
-
{
|
|
21057
|
-
key: "heartbeat",
|
|
21058
|
-
event: "UserPromptSubmit",
|
|
21059
|
-
commandMarker: EXE_HOOKS.heartbeat,
|
|
21060
|
-
owner: "exe-os",
|
|
21061
|
-
purpose: "Lightweight heartbeat/status sidecar for Claude Code sessions.",
|
|
21062
|
-
runtimes: ["claude"],
|
|
21063
|
-
checkpointRole: "none"
|
|
21064
|
-
},
|
|
21065
|
-
{
|
|
21066
|
-
key: "stop",
|
|
21067
|
-
event: "Stop",
|
|
21068
|
-
commandMarker: EXE_HOOKS.stop,
|
|
21069
|
-
owner: "exe-os",
|
|
21070
|
-
purpose: "Finalizes task state, capacity signals, and emergency checkpointing.",
|
|
21071
|
-
runtimes: ["claude", "codex", "opencode"],
|
|
21072
|
-
checkpointRole: "capacity_checkpoint"
|
|
21073
|
-
},
|
|
21074
|
-
{
|
|
21075
|
-
key: "preToolUse",
|
|
21076
|
-
event: "PreToolUse",
|
|
21077
|
-
commandMarker: EXE_HOOKS.preToolUse,
|
|
21078
|
-
owner: "exe-os",
|
|
21079
|
-
purpose: "Preflight guardrails before shell/tool execution.",
|
|
21080
|
-
runtimes: ["claude", "codex", "opencode"],
|
|
21081
|
-
checkpointRole: "none"
|
|
21082
|
-
},
|
|
21083
|
-
{
|
|
21084
|
-
key: "subagentStop",
|
|
21085
|
-
event: "SubagentStop",
|
|
21086
|
-
commandMarker: EXE_HOOKS.subagentStop,
|
|
21087
|
-
owner: "exe-os",
|
|
21088
|
-
purpose: "Captures subagent completion context.",
|
|
21089
|
-
runtimes: ["claude"],
|
|
21090
|
-
checkpointRole: "none"
|
|
21091
|
-
},
|
|
21092
|
-
{
|
|
21093
|
-
key: "preCompact",
|
|
21094
|
-
event: "PreCompact",
|
|
21095
|
-
commandMarker: EXE_HOOKS.preCompact,
|
|
21096
|
-
owner: "exe-os",
|
|
21097
|
-
purpose: "Writes active-task snapshot and compaction recovery context.",
|
|
21098
|
-
runtimes: ["claude"],
|
|
21099
|
-
checkpointRole: "recovery_context"
|
|
21100
|
-
},
|
|
21101
|
-
{
|
|
21102
|
-
key: "postCompact",
|
|
21103
|
-
event: "PostCompact",
|
|
21104
|
-
commandMarker: EXE_HOOKS.postCompact,
|
|
21105
|
-
owner: "exe-os",
|
|
21106
|
-
purpose: "Rehydrates recovery context after compaction.",
|
|
21107
|
-
runtimes: ["claude"],
|
|
21108
|
-
checkpointRole: "recovery_context"
|
|
21109
|
-
},
|
|
21110
|
-
{
|
|
21111
|
-
key: "sessionEnd",
|
|
21112
|
-
event: "SessionEnd",
|
|
21113
|
-
commandMarker: EXE_HOOKS.sessionEnd,
|
|
21114
|
-
owner: "exe-os",
|
|
21115
|
-
purpose: "Stores session-end checkpoint and triages orphaned in-progress tasks.",
|
|
21116
|
-
runtimes: ["claude"],
|
|
21117
|
-
checkpointRole: "session_summary"
|
|
21118
|
-
},
|
|
21119
|
-
{
|
|
21120
|
-
key: "notification",
|
|
21121
|
-
event: "Notification",
|
|
21122
|
-
commandMarker: EXE_HOOKS.notification,
|
|
21123
|
-
owner: "exe-os",
|
|
21124
|
-
purpose: "Captures runtime notifications and nudges.",
|
|
21125
|
-
runtimes: ["claude"],
|
|
21126
|
-
checkpointRole: "none"
|
|
21127
|
-
},
|
|
21128
|
-
{
|
|
21129
|
-
key: "instructionsLoaded",
|
|
21130
|
-
event: "InstructionsLoaded",
|
|
21131
|
-
commandMarker: EXE_HOOKS.instructionsLoaded,
|
|
21132
|
-
owner: "exe-os",
|
|
21133
|
-
purpose: "Applies runtime instruction post-processing.",
|
|
21134
|
-
runtimes: ["claude"],
|
|
21135
|
-
checkpointRole: "none"
|
|
21136
|
-
}
|
|
21137
|
-
];
|
|
21138
|
-
LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS = [
|
|
21139
|
-
"dist/hooks/ingest.js",
|
|
21140
|
-
"dist/hooks/error-recall.js",
|
|
21141
|
-
"dist/hooks/ingest-worker.js"
|
|
21142
|
-
];
|
|
21143
|
-
}
|
|
21144
|
-
});
|
|
21145
|
-
|
|
21146
|
-
// src/bin/fast-db-init.ts
|
|
21147
|
-
var fast_db_init_exports = {};
|
|
21148
|
-
__export(fast_db_init_exports, {
|
|
21149
|
-
fastDbInit: () => fastDbInit
|
|
21150
|
-
});
|
|
21151
|
-
async function fastDbInit() {
|
|
21152
|
-
const { isInitialized: isInitialized2, getClient: getClient2, setExternalClient: setExternalClient2 } = await Promise.resolve().then(() => (init_database(), database_exports));
|
|
21153
|
-
if (isInitialized2()) {
|
|
21154
|
-
return getClient2();
|
|
21155
|
-
}
|
|
21156
|
-
try {
|
|
21157
|
-
const { connectEmbedDaemon: connectEmbedDaemon2, sendDaemonRequest: sendDaemonRequest2, isClientConnected: isClientConnected2 } = await Promise.resolve().then(() => (init_exe_daemon_client(), exe_daemon_client_exports));
|
|
21158
|
-
const { deserializeResultSet: deserializeResultSet2 } = await Promise.resolve().then(() => (init_daemon_protocol(), daemon_protocol_exports));
|
|
21159
|
-
await connectEmbedDaemon2();
|
|
21160
|
-
if (isClientConnected2()) {
|
|
21161
|
-
const daemonClient = {
|
|
21162
|
-
async execute(stmt) {
|
|
21163
|
-
const sql = typeof stmt === "string" ? stmt : stmt.sql;
|
|
21164
|
-
const args = typeof stmt === "string" ? [] : Array.isArray(stmt.args) ? stmt.args : [];
|
|
21165
|
-
const resp = await sendDaemonRequest2({ type: "db-execute", sql, args });
|
|
21166
|
-
if (resp.error) throw new Error(String(resp.error));
|
|
21167
|
-
if (resp.db) return deserializeResultSet2(resp.db);
|
|
21168
|
-
throw new Error("Unexpected daemon response");
|
|
21169
|
-
},
|
|
21170
|
-
async batch(stmts, mode) {
|
|
21171
|
-
const statements = stmts.map((s) => {
|
|
21172
|
-
const sql = typeof s === "string" ? s : s.sql;
|
|
21173
|
-
const args = typeof s === "string" ? [] : Array.isArray(s.args) ? s.args : [];
|
|
21174
|
-
return { sql, args };
|
|
21175
|
-
});
|
|
21176
|
-
const resp = await sendDaemonRequest2({ type: "db-batch", statements, mode: mode ?? "deferred" });
|
|
21177
|
-
if (resp.error) throw new Error(String(resp.error));
|
|
21178
|
-
const batchResults = resp["db-batch"];
|
|
21179
|
-
if (batchResults) return batchResults.map(deserializeResultSet2);
|
|
21180
|
-
throw new Error("Unexpected daemon batch response");
|
|
21181
|
-
},
|
|
21182
|
-
async transaction(_mode) {
|
|
21183
|
-
throw new Error("Transactions not supported via daemon socket");
|
|
21184
|
-
},
|
|
21185
|
-
async executeMultiple(_sql) {
|
|
21186
|
-
throw new Error("executeMultiple not supported via daemon socket");
|
|
21187
|
-
},
|
|
21188
|
-
async migrate(_stmts) {
|
|
21189
|
-
throw new Error("migrate not supported via daemon socket");
|
|
21190
|
-
},
|
|
21191
|
-
sync() {
|
|
21192
|
-
return Promise.resolve(void 0);
|
|
21193
|
-
},
|
|
21194
|
-
close() {
|
|
21195
|
-
},
|
|
21196
|
-
get closed() {
|
|
21197
|
-
return false;
|
|
21198
|
-
},
|
|
21199
|
-
get protocol() {
|
|
21200
|
-
return "file";
|
|
21201
|
-
}
|
|
21202
|
-
};
|
|
21203
|
-
setExternalClient2(daemonClient);
|
|
21204
|
-
return daemonClient;
|
|
21205
|
-
}
|
|
21206
|
-
} catch {
|
|
21207
|
-
}
|
|
21208
|
-
const { initStore: initStore2 } = await Promise.resolve().then(() => (init_store(), store_exports));
|
|
21209
|
-
await initStore2({ lightweight: true });
|
|
21210
|
-
return getClient2();
|
|
21211
|
-
}
|
|
21212
|
-
var init_fast_db_init = __esm({
|
|
21213
|
-
"src/bin/fast-db-init.ts"() {
|
|
21214
|
-
"use strict";
|
|
21215
|
-
}
|
|
21216
|
-
});
|
|
21217
|
-
|
|
21218
20994
|
// src/lib/db-backup.ts
|
|
21219
20995
|
var db_backup_exports = {};
|
|
21220
20996
|
__export(db_backup_exports, {
|
|
@@ -21521,121 +21297,6 @@ function auditHookHealth() {
|
|
|
21521
21297
|
const topPatterns = [...patternCounts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5).map(([pattern, count]) => ({ pattern, count }));
|
|
21522
21298
|
return { logExists: true, totalLines, errorsLastHour, topPatterns };
|
|
21523
21299
|
}
|
|
21524
|
-
function safeReadJson(filePath) {
|
|
21525
|
-
if (!existsSync31(filePath)) return null;
|
|
21526
|
-
try {
|
|
21527
|
-
return JSON.parse(readFileSync23(filePath, "utf-8"));
|
|
21528
|
-
} catch {
|
|
21529
|
-
return null;
|
|
21530
|
-
}
|
|
21531
|
-
}
|
|
21532
|
-
function collectHookCommandsFromClaudeSettings(settings) {
|
|
21533
|
-
const hooks = settings?.hooks;
|
|
21534
|
-
if (!hooks || typeof hooks !== "object") return [];
|
|
21535
|
-
const commands = [];
|
|
21536
|
-
for (const [event, groups] of Object.entries(hooks)) {
|
|
21537
|
-
if (!Array.isArray(groups)) continue;
|
|
21538
|
-
for (const group of groups) {
|
|
21539
|
-
const hooksForGroup = group?.hooks;
|
|
21540
|
-
if (!Array.isArray(hooksForGroup)) continue;
|
|
21541
|
-
for (const hook of hooksForGroup) {
|
|
21542
|
-
const command = hook?.command;
|
|
21543
|
-
if (typeof command === "string") commands.push({ event, command });
|
|
21544
|
-
}
|
|
21545
|
-
}
|
|
21546
|
-
}
|
|
21547
|
-
return commands;
|
|
21548
|
-
}
|
|
21549
|
-
function collectHookCommandsFromCodexHooks(config2) {
|
|
21550
|
-
const commands = [];
|
|
21551
|
-
if (!config2 || typeof config2 !== "object") return commands;
|
|
21552
|
-
const root = config2;
|
|
21553
|
-
for (const [event, value] of Object.entries(root)) {
|
|
21554
|
-
const entries = Array.isArray(value) ? value : value && typeof value === "object" ? Object.values(value) : [];
|
|
21555
|
-
for (const entry of entries) {
|
|
21556
|
-
if (typeof entry === "string") commands.push({ event, command: entry });
|
|
21557
|
-
const command = entry?.command;
|
|
21558
|
-
if (typeof command === "string") commands.push({ event, command });
|
|
21559
|
-
}
|
|
21560
|
-
}
|
|
21561
|
-
return commands;
|
|
21562
|
-
}
|
|
21563
|
-
function buildHookOwnershipIssues(runtime, commands) {
|
|
21564
|
-
const issues = [];
|
|
21565
|
-
for (const marker of LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS) {
|
|
21566
|
-
const count = commands.filter((cmd) => cmd.command.includes(marker)).length;
|
|
21567
|
-
if (count > 0) {
|
|
21568
|
-
issues.push({
|
|
21569
|
-
runtime,
|
|
21570
|
-
event: "PostToolUse",
|
|
21571
|
-
marker,
|
|
21572
|
-
count,
|
|
21573
|
-
message: `Legacy split PostToolUse hook still installed: ${marker}`
|
|
21574
|
-
});
|
|
21575
|
-
}
|
|
21576
|
-
}
|
|
21577
|
-
for (const entry of EXE_HOOK_MANIFEST.filter((hook) => hook.runtimes.includes(runtime))) {
|
|
21578
|
-
const matching = commands.filter((cmd) => cmd.command.includes(entry.commandMarker));
|
|
21579
|
-
if (matching.length > 1) {
|
|
21580
|
-
issues.push({
|
|
21581
|
-
runtime,
|
|
21582
|
-
event: entry.event,
|
|
21583
|
-
marker: entry.commandMarker,
|
|
21584
|
-
count: matching.length,
|
|
21585
|
-
message: `Duplicate exe-os hook owner for ${entry.event}: ${entry.commandMarker}`
|
|
21586
|
-
});
|
|
21587
|
-
}
|
|
21588
|
-
for (const cmd of matching) {
|
|
21589
|
-
if (cmd.event !== entry.event) {
|
|
21590
|
-
issues.push({
|
|
21591
|
-
runtime,
|
|
21592
|
-
event: cmd.event,
|
|
21593
|
-
marker: entry.commandMarker,
|
|
21594
|
-
count: 1,
|
|
21595
|
-
message: `exe-os hook ${entry.commandMarker} is registered under ${cmd.event}, expected ${entry.event}`
|
|
21596
|
-
});
|
|
21597
|
-
}
|
|
21598
|
-
}
|
|
21599
|
-
}
|
|
21600
|
-
for (const cmd of commands) {
|
|
21601
|
-
if (!cmd.command.includes("dist/hooks/")) continue;
|
|
21602
|
-
if (!cmd.command.includes("exe-os")) continue;
|
|
21603
|
-
const entry = manifestEntryForCommand(cmd.command);
|
|
21604
|
-
const isLegacy = LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS.some((marker) => cmd.command.includes(marker));
|
|
21605
|
-
if (!entry && !isLegacy) {
|
|
21606
|
-
issues.push({
|
|
21607
|
-
runtime,
|
|
21608
|
-
event: cmd.event,
|
|
21609
|
-
marker: "dist/hooks/",
|
|
21610
|
-
count: 1,
|
|
21611
|
-
message: `Unknown exe-os hook command not present in ownership manifest: ${cmd.command.slice(0, 160)}`
|
|
21612
|
-
});
|
|
21613
|
-
}
|
|
21614
|
-
}
|
|
21615
|
-
return issues;
|
|
21616
|
-
}
|
|
21617
|
-
function auditHookOwnership() {
|
|
21618
|
-
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
21619
|
-
const checkedFiles = [];
|
|
21620
|
-
const issues = [];
|
|
21621
|
-
const claudeSettingsPath = path36.join(home, ".claude", "settings.json");
|
|
21622
|
-
const claudeSettings = safeReadJson(claudeSettingsPath);
|
|
21623
|
-
if (claudeSettings) {
|
|
21624
|
-
checkedFiles.push(claudeSettingsPath);
|
|
21625
|
-
issues.push(...buildHookOwnershipIssues("claude", collectHookCommandsFromClaudeSettings(claudeSettings)));
|
|
21626
|
-
}
|
|
21627
|
-
const codexHooksPath = path36.join(home, ".codex", "hooks.json");
|
|
21628
|
-
const codexHooks = safeReadJson(codexHooksPath);
|
|
21629
|
-
if (codexHooks) {
|
|
21630
|
-
checkedFiles.push(codexHooksPath);
|
|
21631
|
-
issues.push(...buildHookOwnershipIssues("codex", collectHookCommandsFromCodexHooks(codexHooks)));
|
|
21632
|
-
}
|
|
21633
|
-
return {
|
|
21634
|
-
checkedFiles,
|
|
21635
|
-
issues,
|
|
21636
|
-
staleLegacyHooks: issues.filter((issue) => issue.message.includes("Legacy split"))
|
|
21637
|
-
};
|
|
21638
|
-
}
|
|
21639
21300
|
async function auditShards() {
|
|
21640
21301
|
try {
|
|
21641
21302
|
const { auditShardHealth: auditShardHealth2 } = await Promise.resolve().then(() => (init_shard_manager(), shard_manager_exports));
|
|
@@ -21680,8 +21341,7 @@ async function runAudit(client, flags) {
|
|
|
21680
21341
|
}
|
|
21681
21342
|
const duplicateCount = duplicates.reduce((sum, d) => sum + d.delete_ids.length, 0);
|
|
21682
21343
|
const hookHealth = auditHookHealth();
|
|
21683
|
-
|
|
21684
|
-
return { stats, nullVectors, duplicates, duplicateCount, bloated, fts, orphanedProjects, conflicts, hookHealth, hookOwnership, shards };
|
|
21344
|
+
return { stats, nullVectors, duplicates, duplicateCount, bloated, fts, orphanedProjects, conflicts, hookHealth, shards };
|
|
21685
21345
|
}
|
|
21686
21346
|
function indicator(value, warn) {
|
|
21687
21347
|
if (value === 0) return "\u{1F7E2}";
|
|
@@ -21760,15 +21420,6 @@ function formatReport(report, flags) {
|
|
|
21760
21420
|
lines.push(` ${p.count}x: ${p.pattern}`);
|
|
21761
21421
|
}
|
|
21762
21422
|
}
|
|
21763
|
-
const ho = report.hookOwnership;
|
|
21764
|
-
if (ho.issues.length === 0) {
|
|
21765
|
-
lines.push(`\u{1F7E2} Hook ownership: ${ho.checkedFiles.length > 0 ? "manifest clean" : "no local hook config found"}`);
|
|
21766
|
-
} else {
|
|
21767
|
-
lines.push(`\u{1F534} Hook ownership: ${fmtNum(ho.issues.length)} issue(s)`);
|
|
21768
|
-
for (const issue of ho.issues.slice(0, 5)) {
|
|
21769
|
-
lines.push(` [${issue.runtime}/${issue.event}] ${issue.message}`);
|
|
21770
|
-
}
|
|
21771
|
-
}
|
|
21772
21423
|
const sh = report.shards;
|
|
21773
21424
|
if (sh.total > 0) {
|
|
21774
21425
|
if (sh.unreadable === 0) {
|
|
@@ -21838,9 +21489,6 @@ function formatReport(report, flags) {
|
|
|
21838
21489
|
if (report.conflicts.superseded > 0) {
|
|
21839
21490
|
recs.push(`${fmtNum(report.conflicts.superseded)} superseded memories can be deactivated`);
|
|
21840
21491
|
}
|
|
21841
|
-
if (report.hookOwnership.issues.length > 0) {
|
|
21842
|
-
recs.push(`Run exe-os install to refresh hook config; remove stale exe-os hook commands if they remain`);
|
|
21843
|
-
}
|
|
21844
21492
|
if (recs.length > 0) {
|
|
21845
21493
|
lines.push("Recommendations:");
|
|
21846
21494
|
for (const r of recs) {
|
|
@@ -21974,8 +21622,8 @@ function splitAtSentences(text3, maxChunkSize) {
|
|
|
21974
21622
|
}
|
|
21975
21623
|
async function main(argv = process.argv.slice(2)) {
|
|
21976
21624
|
const flags = parseFlags(argv);
|
|
21977
|
-
|
|
21978
|
-
const client =
|
|
21625
|
+
await initStore();
|
|
21626
|
+
const client = getClient();
|
|
21979
21627
|
const report = await runAudit(client, flags);
|
|
21980
21628
|
console.log(formatReport(report, flags));
|
|
21981
21629
|
if (flags.fix || flags.dryRun) {
|
|
@@ -22035,9 +21683,10 @@ ${mode} Complete.`);
|
|
|
22035
21683
|
var init_exe_doctor = __esm({
|
|
22036
21684
|
"src/bin/exe-doctor.ts"() {
|
|
22037
21685
|
"use strict";
|
|
21686
|
+
init_store();
|
|
21687
|
+
init_database();
|
|
22038
21688
|
init_is_main();
|
|
22039
21689
|
init_conflict_detector();
|
|
22040
|
-
init_runtime_hook_manifest();
|
|
22041
21690
|
if (isMainModule(import.meta.url) && (process.argv[1] ?? "").includes("exe-doctor")) {
|
|
22042
21691
|
main().catch((err) => {
|
|
22043
21692
|
console.error(err instanceof Error ? err.message : String(err));
|