@wrongstack/cli 1.0.35 → 1.0.36
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/{acp-T77EAEDB.js → acp-QLU7T5WX.js} +3 -3
- package/dist/{auth-M6LXZTDA.js → auth-AED7RW7D.js} +5 -5
- package/dist/{automation-MCDFCIMV.js → automation-3E3AUPBF.js} +19 -4
- package/dist/{boot-auto-thin-YMAZI3QL.js → boot-auto-thin-AGJ6TAWY.js} +3 -3
- package/dist/{chunk-4BX2YDTQ.js → chunk-4JMAWKLA.js} +45 -4
- package/dist/{chunk-TWSQTQKR.js → chunk-4R6TVMYA.js} +2 -2
- package/dist/{chunk-HHRYIDOW.js → chunk-ACW64W4M.js} +34 -7
- package/dist/{chunk-LKFKO4JW.js → chunk-B6EHK772.js} +2 -2
- package/dist/{chunk-4UWCMBPG.js → chunk-BJH44J7G.js} +3 -3
- package/dist/{chunk-6Z6C6ZHH.js → chunk-GF7LUWQS.js} +4 -10
- package/dist/{chunk-TXAFIERF.js → chunk-L5NWFP5R.js} +2 -2
- package/dist/{chunk-LDXXMPMS.js → chunk-LPGZ3NUF.js} +20 -20
- package/dist/{chunk-GZSKLXYG.js → chunk-NEWXDNF2.js} +8 -8
- package/dist/{chunk-6SIUTX75.js → chunk-NOZJIN46.js} +1 -2
- package/dist/{chunk-KMU7GF7X.js → chunk-RE73FP2X.js} +2 -2
- package/dist/{chunk-LDV4ERNV.js → chunk-RYTSPBNM.js} +2 -2
- package/dist/{chunk-WTJDSTYD.js → chunk-T5KR6SNO.js} +2 -2
- package/dist/{chunk-ZYACRPLN.js → chunk-ULYAI7CP.js} +6 -3
- package/dist/{chunk-HLSHFXTO.js → chunk-WY74MMDB.js} +2 -2
- package/dist/{chunk-RWNI5OWT.js → chunk-ZWBI7ORM.js} +2 -2
- package/dist/{cli-context-II57EHD2.js → cli-context-I6HJCVCV.js} +76 -68
- package/dist/{cli-main-YR2WJCPL.js → cli-main-X7KD7IOC.js} +213 -153
- package/dist/{config-transfer-VOIFY7U4.js → config-transfer-YPD7HYXH.js} +6 -4
- package/dist/{execution-IBAZ2EIU.js → execution-M7D4KNBB.js} +37 -12
- package/dist/{hq-5OIEKB4V.js → hq-BBLGEEUH.js} +3 -3
- package/dist/{hq-server-DU3ZH3X7.js → hq-server-5TR6NBGS.js} +2 -2
- package/dist/{hq-service-LYZV7EK7.js → hq-service-4Q64WFNT.js} +2 -2
- package/dist/{import-claude-code-AYG24RG2.js → import-claude-code-GHIS2F7Y.js} +3 -3
- package/dist/index.js +4 -4
- package/dist/{mailbox-serve-S536N66F.js → mailbox-serve-DRWJVMYU.js} +2 -2
- package/dist/{modeldiag-NEPTLFZW.js → modeldiag-F3LUF4VJ.js} +3 -3
- package/dist/plugin-config.d.ts +6 -0
- package/dist/{plugin-usage-3TZGROK7.js → plugin-usage-EM752WHG.js} +3 -3
- package/dist/{plugins-ITH4SLO6.js → plugins-U6HQFJ7N.js} +4 -4
- package/dist/{providers-models-37DUV2GW.js → providers-models-S3S6VXME.js} +3 -3
- package/dist/{sage-FFKUOCQL.js → sage-BMRDJCDI.js} +9 -5
- package/dist/{sage-sync-ZMTHB477.js → sage-sync-PCWCNEUK.js} +2 -2
- package/dist/{sessions-config-VE26SB56.js → sessions-config-RQRQDW5Q.js} +2 -2
- package/dist/{short-circuit-flags-EXJBJ5GT.js → short-circuit-flags-IEV3FEOT.js} +2 -2
- package/dist/slash-commands/doctor.d.ts +0 -9
- package/dist/{standalone-auto-update-VQC4GYCM.js → standalone-auto-update-QUXOZ4B5.js} +13 -2
- package/dist/{subcommands-DTKBXLPU.js → subcommands-75IB23LS.js} +2 -2
- package/dist/{typesafe-NHC322W5.js → typesafe-KW2XHOG3.js} +2 -2
- package/dist/{update-6OEPAEUV.js → update-LHCWAWEZ.js} +2 -2
- package/dist/webui-server/credential-watcher.d.ts +3 -1
- package/dist/{webui-server-6IC3SLZG.js → webui-server-CUIFA25W.js} +5 -33
- package/dist/wiring/management-tools.d.ts +9 -1
- package/package.json +31 -31
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
setSuggestions,
|
|
15
15
|
spawnHqAgent,
|
|
16
16
|
terminateHqAgent
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-NOZJIN46.js";
|
|
18
18
|
import {
|
|
19
19
|
configureSimpleUiRuntimeContext,
|
|
20
20
|
detectProjectFacts,
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
} from "./chunk-AT2A7RJZ.js";
|
|
44
44
|
import {
|
|
45
45
|
setupPlugins
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-B6EHK772.js";
|
|
47
47
|
import {
|
|
48
48
|
fmtTaskResultLine,
|
|
49
49
|
fmtTok,
|
|
@@ -65,11 +65,11 @@ import {
|
|
|
65
65
|
persistAutonomySetting,
|
|
66
66
|
persistConfigSetting,
|
|
67
67
|
persistTelegramConfig
|
|
68
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-RE73FP2X.js";
|
|
69
69
|
import {
|
|
70
70
|
effectiveMcpServers,
|
|
71
71
|
parseLaunchMcpServers
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-WY74MMDB.js";
|
|
73
73
|
import {
|
|
74
74
|
renderDeepHelpToString,
|
|
75
75
|
renderFocusedHelpToString
|
|
@@ -86,7 +86,7 @@ import {
|
|
|
86
86
|
import {
|
|
87
87
|
PLUGIN_AUDIT_ENTRIES,
|
|
88
88
|
runPluginManagementCommand
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-ACW64W4M.js";
|
|
90
90
|
import {
|
|
91
91
|
BEHAVIOR_SECTION_KEYS
|
|
92
92
|
} from "./chunk-M4G5FO7F.js";
|
|
@@ -98,7 +98,7 @@ import {
|
|
|
98
98
|
} from "./chunk-CZTXF6HY.js";
|
|
99
99
|
import {
|
|
100
100
|
providerCloudConfig
|
|
101
|
-
} from "./chunk-
|
|
101
|
+
} from "./chunk-L5NWFP5R.js";
|
|
102
102
|
import {
|
|
103
103
|
LOCAL_LLM_PRESETS,
|
|
104
104
|
addCustomProvider,
|
|
@@ -111,7 +111,7 @@ import {
|
|
|
111
111
|
runAuthLocal,
|
|
112
112
|
runProviderAuthLogin,
|
|
113
113
|
validateFamily
|
|
114
|
-
} from "./chunk-
|
|
114
|
+
} from "./chunk-NEWXDNF2.js";
|
|
115
115
|
import "./chunk-YTEOAWOJ.js";
|
|
116
116
|
import {
|
|
117
117
|
buildPickableProviders,
|
|
@@ -124,14 +124,14 @@ import {
|
|
|
124
124
|
normalizeKeys,
|
|
125
125
|
nowIso,
|
|
126
126
|
writeKeysBack
|
|
127
|
-
} from "./chunk-
|
|
127
|
+
} from "./chunk-ULYAI7CP.js";
|
|
128
128
|
import {
|
|
129
129
|
activeProfileConfigPath
|
|
130
130
|
} from "./chunk-YMXXOOFN.js";
|
|
131
131
|
import {
|
|
132
132
|
appendHistory,
|
|
133
133
|
backupCurrent
|
|
134
|
-
} from "./chunk-
|
|
134
|
+
} from "./chunk-4JMAWKLA.js";
|
|
135
135
|
import {
|
|
136
136
|
createGracefulShutdown,
|
|
137
137
|
formatAcpAgentList,
|
|
@@ -146,7 +146,7 @@ import {
|
|
|
146
146
|
} from "./chunk-NRXWOMK7.js";
|
|
147
147
|
import {
|
|
148
148
|
startCliHqConnection
|
|
149
|
-
} from "./chunk-
|
|
149
|
+
} from "./chunk-BJH44J7G.js";
|
|
150
150
|
import {
|
|
151
151
|
buildProviderForId,
|
|
152
152
|
resolveProviderCfg,
|
|
@@ -258,7 +258,7 @@ import { registerJevTools } from "@wrongstack/core/tools";
|
|
|
258
258
|
|
|
259
259
|
// src/boot/event-wiring.ts
|
|
260
260
|
import { randomBytes } from "node:crypto";
|
|
261
|
-
import { color as color2, writeErr } from "@wrongstack/core/utils";
|
|
261
|
+
import { color as color2, sanitizeTerminalText, writeErr } from "@wrongstack/core/utils";
|
|
262
262
|
|
|
263
263
|
// src/spinner.ts
|
|
264
264
|
import { color } from "@wrongstack/core/utils";
|
|
@@ -414,7 +414,7 @@ function wireEventWiring(deps) {
|
|
|
414
414
|
spinner.stop();
|
|
415
415
|
streamingActive = true;
|
|
416
416
|
}
|
|
417
|
-
renderer.write(p.text);
|
|
417
|
+
renderer.write(sanitizeTerminalText(p.text));
|
|
418
418
|
});
|
|
419
419
|
evOn("iteration.completed", (e) => {
|
|
420
420
|
if (!isCurrentSession(e.sessionId)) return;
|
|
@@ -2631,6 +2631,7 @@ import {
|
|
|
2631
2631
|
createPluginManagerTool
|
|
2632
2632
|
} from "@wrongstack/core/tools";
|
|
2633
2633
|
import { updateJsonObjectFile } from "@wrongstack/core/utils";
|
|
2634
|
+
import { catalogProviderIdFor as catalogProviderIdFor2 } from "@wrongstack/providers";
|
|
2634
2635
|
function registerCliManagementTools({
|
|
2635
2636
|
toolRegistry,
|
|
2636
2637
|
configStore,
|
|
@@ -2667,6 +2668,22 @@ function registerCliManagementTools({
|
|
|
2667
2668
|
getCurrentTier: () => tierState.currentTier,
|
|
2668
2669
|
getContextTokens: () => tierState.contextTokens > 0 ? tierState.contextTokens : void 0,
|
|
2669
2670
|
getTurnsSinceTierSwitch: () => tierState.turns - tierState.switchedAtTurn,
|
|
2671
|
+
...events?.emit ? {
|
|
2672
|
+
onEffortChanged: (change) => {
|
|
2673
|
+
events.emit?.("leader.effort_changed", change);
|
|
2674
|
+
}
|
|
2675
|
+
} : {},
|
|
2676
|
+
// `leader_effort_set` maps a request onto the levels the leader's model
|
|
2677
|
+
// documents. An alias (`work` → `type: "anthropic"`) reads the catalog entry.
|
|
2678
|
+
...modelsRegistry ? {
|
|
2679
|
+
getReasoningConfig: async (providerId, modelId) => {
|
|
2680
|
+
const catalogId = catalogProviderIdFor2(
|
|
2681
|
+
providerId,
|
|
2682
|
+
configStore.get().providers?.[providerId]?.type
|
|
2683
|
+
);
|
|
2684
|
+
return (await modelsRegistry.getModel(catalogId, modelId))?.capabilities?.reasoningConfig;
|
|
2685
|
+
}
|
|
2686
|
+
} : {},
|
|
2670
2687
|
onTierSwitched: (tier) => {
|
|
2671
2688
|
tierState.currentTier = tier;
|
|
2672
2689
|
tierState.switchedAtTurn = tierState.turns;
|
|
@@ -4376,8 +4393,8 @@ async function setupProviderStatus(input) {
|
|
|
4376
4393
|
});
|
|
4377
4394
|
await withFileLock(auditFile, async () => {
|
|
4378
4395
|
try {
|
|
4379
|
-
const
|
|
4380
|
-
if (
|
|
4396
|
+
const stat7 = await fs3.stat(auditFile);
|
|
4397
|
+
if (stat7.size > AUDIT_ROTATE_BYTES) {
|
|
4381
4398
|
await fs3.rename(auditFile, `${auditFile}.1`);
|
|
4382
4399
|
}
|
|
4383
4400
|
} catch (error) {
|
|
@@ -4614,6 +4631,7 @@ import {
|
|
|
4614
4631
|
import { projectLastRequestTokens } from "@wrongstack/core/types/session-timeline";
|
|
4615
4632
|
import {
|
|
4616
4633
|
expectDefined,
|
|
4634
|
+
restoreLeaderEffortOverride,
|
|
4617
4635
|
sessionScopedPath as sessionScopedPath2,
|
|
4618
4636
|
toErrorMessage as toErrorMessage5
|
|
4619
4637
|
} from "@wrongstack/core/utils";
|
|
@@ -4849,6 +4867,7 @@ async function setupSession(params) {
|
|
|
4849
4867
|
restoreSessionSubagentModelPlan(context, restoredEvents);
|
|
4850
4868
|
} else seedSessionSubagentPolicy(context);
|
|
4851
4869
|
restoreRequiredSkillsFromEvents(context, restoredEvents);
|
|
4870
|
+
restoreLeaderEffortOverride(context.meta, restoredEvents);
|
|
4852
4871
|
restoreSessionPermissionOverrides(context.meta, {
|
|
4853
4872
|
events: restoredEvents,
|
|
4854
4873
|
permissionOverrides: restoredPermissionOverrides
|
|
@@ -5186,7 +5205,7 @@ async function setupSessionRegistry(deps) {
|
|
|
5186
5205
|
}
|
|
5187
5206
|
|
|
5188
5207
|
// src/wiring/session-runtime.ts
|
|
5189
|
-
import { catalogProviderIdFor as
|
|
5208
|
+
import { catalogProviderIdFor as catalogProviderIdFor3 } from "@wrongstack/providers";
|
|
5190
5209
|
|
|
5191
5210
|
// src/session-event-wiring.ts
|
|
5192
5211
|
import {
|
|
@@ -5917,7 +5936,7 @@ function setupSessionRuntime(args) {
|
|
|
5917
5936
|
const stats = new SessionStats(events, tokenCounter);
|
|
5918
5937
|
let activeReasoningConfig;
|
|
5919
5938
|
const warnedRuntimeMessages = /* @__PURE__ */ new Set();
|
|
5920
|
-
const catalogIdOf = (providerId) =>
|
|
5939
|
+
const catalogIdOf = (providerId) => catalogProviderIdFor3(providerId, configStore.get().providers?.[providerId]?.type);
|
|
5921
5940
|
const refreshActiveReasoningConfig = async (providerId, modelId) => {
|
|
5922
5941
|
warnedRuntimeMessages.clear();
|
|
5923
5942
|
try {
|
|
@@ -5995,12 +6014,14 @@ async function setupVectorMemory(args) {
|
|
|
5995
6014
|
"transformers-models"
|
|
5996
6015
|
);
|
|
5997
6016
|
try {
|
|
5998
|
-
|
|
5999
|
-
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6003
|
-
|
|
6017
|
+
const provider = new TransformersEmbeddingProvider({ cacheDir: vectorMemoryModelCacheDir });
|
|
6018
|
+
if (!provider.isInstalled()) {
|
|
6019
|
+
logger.debug?.(
|
|
6020
|
+
"vector memory off: optional @huggingface/transformers backend is not installed."
|
|
6021
|
+
);
|
|
6022
|
+
return { memoryStore, vectorMemoryStore: void 0, vectorMemoryModelCacheDir: "" };
|
|
6023
|
+
}
|
|
6024
|
+
vectorMemoryStore = new VectorMemoryStore({ provider, projectRoot });
|
|
6004
6025
|
} catch (error) {
|
|
6005
6026
|
const message = error instanceof Error ? error.message : String(error);
|
|
6006
6027
|
logger.warn(
|
|
@@ -11707,12 +11728,12 @@ async function findTranscripts(root) {
|
|
|
11707
11728
|
files.filter((file) => isSubagentTranscriptFile(file)).map(async (file) => {
|
|
11708
11729
|
const fullPath = path16.join(directory, file);
|
|
11709
11730
|
try {
|
|
11710
|
-
const
|
|
11731
|
+
const stat7 = await fs4.stat(fullPath);
|
|
11711
11732
|
return {
|
|
11712
11733
|
runId,
|
|
11713
11734
|
subagentId: file.replace(/\.jsonl$/, ""),
|
|
11714
11735
|
file: fullPath,
|
|
11715
|
-
size:
|
|
11736
|
+
size: stat7.size
|
|
11716
11737
|
};
|
|
11717
11738
|
} catch {
|
|
11718
11739
|
return null;
|
|
@@ -12676,7 +12697,7 @@ async function ensureStatuslineConfig() {
|
|
|
12676
12697
|
let config;
|
|
12677
12698
|
let sawFile = true;
|
|
12678
12699
|
try {
|
|
12679
|
-
raw = JSON.parse(await fs5.readFile(resolveConfigPath(), "utf8"));
|
|
12700
|
+
raw = JSON.parse((await fs5.readFile(resolveConfigPath(), "utf8")).replace(/^\uFEFF/, ""));
|
|
12680
12701
|
config = parseDocument(raw);
|
|
12681
12702
|
} catch (error) {
|
|
12682
12703
|
if (isRecord(error) && error["code"] === "ENOENT") {
|
|
@@ -16434,6 +16455,7 @@ ${menu}` };
|
|
|
16434
16455
|
import { spawn as spawn5 } from "node:child_process";
|
|
16435
16456
|
import { StringDecoder } from "node:string_decoder";
|
|
16436
16457
|
import { color as color24 } from "@wrongstack/core/utils";
|
|
16458
|
+
import { treeKill } from "@wrongstack/core/utils/tree-kill";
|
|
16437
16459
|
var DEFAULT_TIMEOUT_MS = 6e4;
|
|
16438
16460
|
var MAX_OUTPUT_LINES = 500;
|
|
16439
16461
|
var MAX_STREAM_BYTES = 2 * 1024 * 1024;
|
|
@@ -16537,7 +16559,6 @@ function runCommand(cmd, cwd, timeout = DEFAULT_TIMEOUT_MS) {
|
|
|
16537
16559
|
try {
|
|
16538
16560
|
child = spawn5(command, spawnArgs, {
|
|
16539
16561
|
cwd,
|
|
16540
|
-
timeout,
|
|
16541
16562
|
windowsHide: true,
|
|
16542
16563
|
...windowsVerbatimArguments ? { windowsVerbatimArguments } : {}
|
|
16543
16564
|
});
|
|
@@ -16566,10 +16587,18 @@ function runCommand(cmd, cwd, timeout = DEFAULT_TIMEOUT_MS) {
|
|
|
16566
16587
|
});
|
|
16567
16588
|
child.stderr?.on("error", () => {
|
|
16568
16589
|
});
|
|
16590
|
+
let killedByTimeout = false;
|
|
16591
|
+
const timer = timeout > 0 ? setTimeout(() => {
|
|
16592
|
+
killedByTimeout = true;
|
|
16593
|
+
treeKill(child);
|
|
16594
|
+
child.stdout?.destroy();
|
|
16595
|
+
child.stderr?.destroy();
|
|
16596
|
+
}, timeout) : void 0;
|
|
16569
16597
|
let settled = false;
|
|
16570
16598
|
const finish = (result) => {
|
|
16571
16599
|
if (settled) return;
|
|
16572
16600
|
settled = true;
|
|
16601
|
+
clearTimeout(timer);
|
|
16573
16602
|
resolve11(result);
|
|
16574
16603
|
};
|
|
16575
16604
|
child.on("error", (err) => {
|
|
@@ -16582,7 +16611,7 @@ function runCommand(cmd, cwd, timeout = DEFAULT_TIMEOUT_MS) {
|
|
|
16582
16611
|
});
|
|
16583
16612
|
});
|
|
16584
16613
|
child.on("close", (code, signal) => {
|
|
16585
|
-
const timedOut =
|
|
16614
|
+
const timedOut = killedByTimeout && code !== 0;
|
|
16586
16615
|
const diedBySignal = signal !== null && !timedOut;
|
|
16587
16616
|
const exitCode = timedOut ? EXIT_TIMEOUT : code ?? (diedBySignal ? foreignSignalExitCode(signal ?? "") : EXIT_SPAWN_FAILED);
|
|
16588
16617
|
finish({
|
|
@@ -16700,7 +16729,7 @@ function buildStatsCommand(opts) {
|
|
|
16700
16729
|
// src/slash-commands/doctor.ts
|
|
16701
16730
|
import * as fs8 from "node:fs/promises";
|
|
16702
16731
|
import * as path20 from "node:path";
|
|
16703
|
-
import { atomicWrite as atomicWrite3, color as color25, toErrorMessage as toErrorMessage14 } from "@wrongstack/core/utils";
|
|
16732
|
+
import { atomicWrite as atomicWrite3, color as color25, toErrorMessage as toErrorMessage14, withFileLock as withFileLock2 } from "@wrongstack/core/utils";
|
|
16704
16733
|
|
|
16705
16734
|
// src/config-doctor.ts
|
|
16706
16735
|
import { isSecretField } from "@wrongstack/core/security";
|
|
@@ -17353,6 +17382,9 @@ async function runSessionsDoctor(opts, rest) {
|
|
|
17353
17382
|
lines.push(color25.dim(" Journals were not modified."));
|
|
17354
17383
|
return { message: lines.join("\n") };
|
|
17355
17384
|
}
|
|
17385
|
+
function stripBom(raw) {
|
|
17386
|
+
return raw.replace(/^\uFEFF/, "");
|
|
17387
|
+
}
|
|
17356
17388
|
function buildDoctorCommand(opts) {
|
|
17357
17389
|
const help = [
|
|
17358
17390
|
"Usage:",
|
|
@@ -17379,7 +17411,7 @@ function buildDoctorCommand(opts) {
|
|
|
17379
17411
|
].join("\n");
|
|
17380
17412
|
async function loadPluginSchemas() {
|
|
17381
17413
|
try {
|
|
17382
|
-
const { BUILTIN_PLUGIN_FACTORIES } = await import("./plugins-
|
|
17414
|
+
const { BUILTIN_PLUGIN_FACTORIES } = await import("./plugins-U6HQFJ7N.js");
|
|
17383
17415
|
const settled = await Promise.allSettled(BUILTIN_PLUGIN_FACTORIES.map((f) => f()));
|
|
17384
17416
|
const loaded = [];
|
|
17385
17417
|
for (const s of settled) {
|
|
@@ -17411,7 +17443,7 @@ function buildDoctorCommand(opts) {
|
|
|
17411
17443
|
for (const name of candidates) {
|
|
17412
17444
|
try {
|
|
17413
17445
|
const raw = await fs8.readFile(path20.join(dir, name), "utf8");
|
|
17414
|
-
JSON.parse(raw);
|
|
17446
|
+
JSON.parse(stripBom(raw));
|
|
17415
17447
|
return { name, raw };
|
|
17416
17448
|
} catch {
|
|
17417
17449
|
}
|
|
@@ -17462,10 +17494,10 @@ function buildDoctorCommand(opts) {
|
|
|
17462
17494
|
let fixableCount = 0;
|
|
17463
17495
|
const pluginSchemas = await loadPluginSchemas();
|
|
17464
17496
|
for (const target of targets) {
|
|
17465
|
-
|
|
17466
|
-
|
|
17467
|
-
|
|
17468
|
-
|
|
17497
|
+
if (!await fs8.stat(target.file).then(
|
|
17498
|
+
() => true,
|
|
17499
|
+
() => false
|
|
17500
|
+
)) {
|
|
17469
17501
|
if (!target.isProject) {
|
|
17470
17502
|
lines.push(
|
|
17471
17503
|
"",
|
|
@@ -17475,79 +17507,98 @@ function buildDoctorCommand(opts) {
|
|
|
17475
17507
|
}
|
|
17476
17508
|
continue;
|
|
17477
17509
|
}
|
|
17478
|
-
|
|
17479
|
-
|
|
17480
|
-
|
|
17481
|
-
|
|
17482
|
-
|
|
17483
|
-
|
|
17484
|
-
|
|
17485
|
-
|
|
17486
|
-
|
|
17487
|
-
|
|
17510
|
+
const diagnoseTarget = async () => {
|
|
17511
|
+
let raw;
|
|
17512
|
+
try {
|
|
17513
|
+
raw = await fs8.readFile(target.file, "utf8");
|
|
17514
|
+
} catch {
|
|
17515
|
+
if (!target.isProject) {
|
|
17516
|
+
lines.push(
|
|
17517
|
+
"",
|
|
17518
|
+
`${color25.bold(target.label)} ${color25.dim(target.file)}`,
|
|
17519
|
+
color25.dim(" no config file \u2014 built-in defaults apply")
|
|
17520
|
+
);
|
|
17521
|
+
}
|
|
17522
|
+
return;
|
|
17523
|
+
}
|
|
17524
|
+
lines.push("", `${color25.bold(target.label)} ${color25.dim(target.file)}`);
|
|
17525
|
+
let parsed;
|
|
17526
|
+
try {
|
|
17527
|
+
parsed = JSON.parse(stripBom(raw));
|
|
17528
|
+
} catch (err) {
|
|
17529
|
+
errorCount++;
|
|
17530
|
+
const msg = toErrorMessage14(err);
|
|
17531
|
+
lines.push(` ${color25.red("\u2717")} invalid JSON \u2014 ${msg}`);
|
|
17532
|
+
if (!applyFixes) {
|
|
17533
|
+
fixableCount++;
|
|
17534
|
+
lines.push(
|
|
17535
|
+
color25.dim(" \u2192 run /doctor fix to restore from the newest parsable backup")
|
|
17536
|
+
);
|
|
17537
|
+
return;
|
|
17538
|
+
}
|
|
17539
|
+
const backup = await findParsableBackup(target.file);
|
|
17540
|
+
if (!backup) {
|
|
17541
|
+
lines.push(
|
|
17542
|
+
` ${color25.red("\u2717")} no parsable backup found \u2014 restore the file manually`
|
|
17543
|
+
);
|
|
17544
|
+
return;
|
|
17545
|
+
}
|
|
17546
|
+
await backupSibling(target.file, raw, "broken.bak");
|
|
17547
|
+
await atomicWrite3(target.file, backup.raw);
|
|
17488
17548
|
lines.push(
|
|
17489
|
-
color25.
|
|
17549
|
+
` ${color25.green("\u2713")} restored from ${backup.name} ${color25.dim("(corrupt file kept as *.broken.bak)")}`
|
|
17490
17550
|
);
|
|
17491
|
-
|
|
17492
|
-
|
|
17493
|
-
|
|
17494
|
-
|
|
17495
|
-
|
|
17496
|
-
|
|
17497
|
-
|
|
17498
|
-
|
|
17499
|
-
|
|
17500
|
-
|
|
17501
|
-
|
|
17502
|
-
|
|
17503
|
-
|
|
17504
|
-
|
|
17505
|
-
}
|
|
17506
|
-
const report = diagnoseConfig(parsed, pluginSchemas);
|
|
17507
|
-
if (target.isProject) {
|
|
17508
|
-
const safe = filterSafeForProject(parsed);
|
|
17509
|
-
for (const key of Object.keys(parsed)) {
|
|
17510
|
-
if (!(key in safe)) {
|
|
17511
|
-
report.findings.push({
|
|
17512
|
-
path: key,
|
|
17513
|
-
problem: "not project-safe \u2014 belongs in the active profile config (move it manually)",
|
|
17514
|
-
severity: "warning"
|
|
17515
|
-
});
|
|
17551
|
+
raw = backup.raw;
|
|
17552
|
+
parsed = JSON.parse(stripBom(raw));
|
|
17553
|
+
}
|
|
17554
|
+
const report = diagnoseConfig(parsed, pluginSchemas);
|
|
17555
|
+
if (target.isProject) {
|
|
17556
|
+
const safe = filterSafeForProject(parsed);
|
|
17557
|
+
for (const key of Object.keys(parsed)) {
|
|
17558
|
+
if (!(key in safe)) {
|
|
17559
|
+
report.findings.push({
|
|
17560
|
+
path: key,
|
|
17561
|
+
problem: "not project-safe \u2014 belongs in the active profile config (move it manually)",
|
|
17562
|
+
severity: "warning"
|
|
17563
|
+
});
|
|
17564
|
+
}
|
|
17516
17565
|
}
|
|
17517
17566
|
}
|
|
17518
|
-
|
|
17519
|
-
|
|
17520
|
-
|
|
17521
|
-
|
|
17522
|
-
|
|
17523
|
-
|
|
17524
|
-
|
|
17525
|
-
|
|
17526
|
-
|
|
17527
|
-
|
|
17528
|
-
|
|
17529
|
-
|
|
17530
|
-
|
|
17531
|
-
|
|
17532
|
-
|
|
17533
|
-
|
|
17534
|
-
|
|
17535
|
-
|
|
17536
|
-
|
|
17537
|
-
|
|
17538
|
-
|
|
17539
|
-
|
|
17540
|
-
|
|
17541
|
-
|
|
17542
|
-
|
|
17543
|
-
|
|
17567
|
+
if (report.findings.length === 0) {
|
|
17568
|
+
lines.push(` ${color25.green("\u2713")} healthy`);
|
|
17569
|
+
return;
|
|
17570
|
+
}
|
|
17571
|
+
const willWrite = applyFixes && report.changed;
|
|
17572
|
+
for (const f of report.findings) {
|
|
17573
|
+
if (f.severity === "error") errorCount++;
|
|
17574
|
+
else warningCount++;
|
|
17575
|
+
if (f.fix) fixableCount++;
|
|
17576
|
+
lines.push(formatFinding(f, willWrite && !!f.fix));
|
|
17577
|
+
}
|
|
17578
|
+
if (willWrite) {
|
|
17579
|
+
await backupSibling(target.file, raw);
|
|
17580
|
+
await atomicWrite3(target.file, JSON.stringify(report.fixed, null, 2));
|
|
17581
|
+
if (!target.isProject) {
|
|
17582
|
+
try {
|
|
17583
|
+
const homeFn = () => path20.dirname(path20.dirname(target.file));
|
|
17584
|
+
await appendHistory(
|
|
17585
|
+
parsed,
|
|
17586
|
+
report.fixed,
|
|
17587
|
+
"config doctor auto-fix",
|
|
17588
|
+
homeFn,
|
|
17589
|
+
target.file
|
|
17590
|
+
);
|
|
17591
|
+
} catch {
|
|
17592
|
+
}
|
|
17593
|
+
opts.configStore?.update(report.fixed);
|
|
17544
17594
|
}
|
|
17545
|
-
|
|
17595
|
+
lines.push(
|
|
17596
|
+
` ${color25.green("\u2713")} fixes written ${color25.dim("(backup: config.json.last + timestamped .bak)")}`
|
|
17597
|
+
);
|
|
17546
17598
|
}
|
|
17547
|
-
|
|
17548
|
-
|
|
17549
|
-
|
|
17550
|
-
}
|
|
17599
|
+
};
|
|
17600
|
+
if (applyFixes) await withFileLock2(target.file, diagnoseTarget);
|
|
17601
|
+
else await diagnoseTarget();
|
|
17551
17602
|
}
|
|
17552
17603
|
lines.push(
|
|
17553
17604
|
"",
|
|
@@ -17564,7 +17615,7 @@ import {
|
|
|
17564
17615
|
REASONING_EFFORT_LEVELS
|
|
17565
17616
|
} from "@wrongstack/core/types";
|
|
17566
17617
|
import { color as color26, updateJsonObjectFile as updateJsonObjectFile3 } from "@wrongstack/core/utils";
|
|
17567
|
-
import { catalogProviderIdFor as
|
|
17618
|
+
import { catalogProviderIdFor as catalogProviderIdFor4 } from "@wrongstack/providers";
|
|
17568
17619
|
function buildEffortCommand(opts) {
|
|
17569
17620
|
const levelsHint = REASONING_EFFORT_LEVELS.join("|");
|
|
17570
17621
|
const help = [
|
|
@@ -17584,7 +17635,7 @@ function buildEffortCommand(opts) {
|
|
|
17584
17635
|
if (!registry) return { levels: void 0, supported: void 0 };
|
|
17585
17636
|
const config = opts.configStore.get();
|
|
17586
17637
|
try {
|
|
17587
|
-
const catalogId =
|
|
17638
|
+
const catalogId = catalogProviderIdFor4(
|
|
17588
17639
|
config.provider,
|
|
17589
17640
|
config.providers?.[config.provider]?.type
|
|
17590
17641
|
);
|
|
@@ -20194,8 +20245,8 @@ async function withPreviewIndex(cwd, fn) {
|
|
|
20194
20245
|
async function generateCommitMessageHeuristics(git) {
|
|
20195
20246
|
const statsResult = await git(["diff", "--cached", "--stat"]);
|
|
20196
20247
|
if (statsResult.code !== 0) return "chore: update";
|
|
20197
|
-
const nameResult = await git(["diff", "--cached", "--name-only"]);
|
|
20198
|
-
const files = nameResult.stdout.split("\
|
|
20248
|
+
const nameResult = await git(["diff", "--cached", "--name-only", "-z"]);
|
|
20249
|
+
const files = nameResult.stdout.split("\0").filter(Boolean);
|
|
20199
20250
|
const commitType = detectCommitType(statsResult.stdout);
|
|
20200
20251
|
let scope = "";
|
|
20201
20252
|
if (files.length > 0) {
|
|
@@ -27309,16 +27360,14 @@ import {
|
|
|
27309
27360
|
clearPlan,
|
|
27310
27361
|
deriveTodosFromPlanItem,
|
|
27311
27362
|
emptyPlan,
|
|
27312
|
-
emptyTaskFile,
|
|
27313
27363
|
formatPlan,
|
|
27314
27364
|
formatPlanTemplates,
|
|
27315
27365
|
getPlanTemplate,
|
|
27316
27366
|
listPlanTemplates,
|
|
27317
27367
|
loadPlan as loadPlan2,
|
|
27318
|
-
loadTasks,
|
|
27319
27368
|
mutatePlan,
|
|
27369
|
+
mutateTasks,
|
|
27320
27370
|
removePlanItem,
|
|
27321
|
-
saveTasks,
|
|
27322
27371
|
setPlanItemStatus
|
|
27323
27372
|
} from "@wrongstack/core/storage";
|
|
27324
27373
|
import { formatTaskList, formatTodosList } from "@wrongstack/core/utils";
|
|
@@ -27402,7 +27451,6 @@ function buildPlanCommand(opts) {
|
|
|
27402
27451
|
json
|
|
27403
27452
|
);
|
|
27404
27453
|
}
|
|
27405
|
-
const taskFile = await loadTasks(taskPath) ?? emptyTaskFile(sessionId);
|
|
27406
27454
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
27407
27455
|
const task = {
|
|
27408
27456
|
id: `task_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
@@ -27414,8 +27462,10 @@ function buildPlanCommand(opts) {
|
|
|
27414
27462
|
createdAt: now,
|
|
27415
27463
|
updatedAt: now
|
|
27416
27464
|
};
|
|
27417
|
-
taskFile
|
|
27418
|
-
|
|
27465
|
+
const taskFile = await mutateTasks(taskPath, sessionId, (file) => {
|
|
27466
|
+
file.tasks.push(task);
|
|
27467
|
+
return file;
|
|
27468
|
+
});
|
|
27419
27469
|
return result(
|
|
27420
27470
|
`Taskified "${item.title}" \u2192 task.
|
|
27421
27471
|
${formatTaskList(taskFile.tasks)}`,
|
|
@@ -30345,14 +30395,14 @@ function buildLoadCommand(opts) {
|
|
|
30345
30395
|
const badge = s.outcome === "completed" ? color56.green("\u2713") : s.outcome === "aborted" ? color56.yellow("\u26A0") : s.outcome === "error" ? color56.red("\u2717") : color56.dim("?");
|
|
30346
30396
|
parts2.push(badge);
|
|
30347
30397
|
}
|
|
30348
|
-
const
|
|
30398
|
+
const stat7 = parts2.join(" ");
|
|
30349
30399
|
const date = color56.dim(s.startedAt.slice(0, 16).replace("T", " "));
|
|
30350
30400
|
const archived = s.storageState === "cold" ? color56.dim(" gz") : "";
|
|
30351
30401
|
const isCurrent = s.id === currentId;
|
|
30352
30402
|
const marker = isCurrent ? color56.cyan(" (current)") : "";
|
|
30353
30403
|
const label = s.name ? `${color56.bold(s.id)} ${color56.cyan(`(${s.name})`)}` : color56.bold(s.id);
|
|
30354
30404
|
return ` ${label}${marker}${archived}
|
|
30355
|
-
${date} ${
|
|
30405
|
+
${date} ${stat7}
|
|
30356
30406
|
${color56.dim(s.title)}`;
|
|
30357
30407
|
});
|
|
30358
30408
|
const msg = [
|
|
@@ -30404,14 +30454,14 @@ import {
|
|
|
30404
30454
|
REASONING_EFFORT_LEVELS as REASONING_EFFORT_LEVELS2
|
|
30405
30455
|
} from "@wrongstack/core/types";
|
|
30406
30456
|
import { color as color57, expectDefined as expectDefined9, toErrorMessage as toErrorMessage31, updateJsonObjectFile as updateJsonObjectFile7 } from "@wrongstack/core/utils";
|
|
30407
|
-
import { catalogProviderIdFor as
|
|
30457
|
+
import { catalogProviderIdFor as catalogProviderIdFor5 } from "@wrongstack/providers";
|
|
30408
30458
|
async function resolveCatalogModelIds(registry, config, providerIds) {
|
|
30409
30459
|
const out = /* @__PURE__ */ new Map();
|
|
30410
30460
|
if (!registry) return out;
|
|
30411
30461
|
await Promise.all(
|
|
30412
30462
|
providerIds.map(async (id) => {
|
|
30413
30463
|
try {
|
|
30414
|
-
const catalogId =
|
|
30464
|
+
const catalogId = catalogProviderIdFor5(id, config.providers?.[id]?.type);
|
|
30415
30465
|
const provider = await registry.getProvider(catalogId);
|
|
30416
30466
|
if (provider)
|
|
30417
30467
|
out.set(
|
|
@@ -32925,8 +32975,8 @@ async function addProjectCommand(opts, ctx, targetPath, displayName) {
|
|
|
32925
32975
|
} catch {
|
|
32926
32976
|
return { message: color64.red(`Directory not found: ${resolved}`) };
|
|
32927
32977
|
}
|
|
32928
|
-
const
|
|
32929
|
-
if (!
|
|
32978
|
+
const stat7 = await fs14.stat(resolved);
|
|
32979
|
+
if (!stat7.isDirectory()) {
|
|
32930
32980
|
return { message: color64.red(`Not a directory: ${resolved}`) };
|
|
32931
32981
|
}
|
|
32932
32982
|
const manifest2 = await loadManifest(opts.paths?.globalConfig);
|
|
@@ -32995,8 +33045,8 @@ async function switchProjectCommand(opts, ctx, target, displayName) {
|
|
|
32995
33045
|
} catch {
|
|
32996
33046
|
return { message: color64.red(`Directory not found: ${resolved}`) };
|
|
32997
33047
|
}
|
|
32998
|
-
const
|
|
32999
|
-
if (!
|
|
33048
|
+
const stat7 = await fs14.stat(resolved);
|
|
33049
|
+
if (!stat7.isDirectory()) {
|
|
33000
33050
|
return { message: color64.red(`Not a directory: ${resolved}`) };
|
|
33001
33051
|
}
|
|
33002
33052
|
let cliPath;
|
|
@@ -35592,18 +35642,17 @@ function buildSupervisorCommand(opts) {
|
|
|
35592
35642
|
import { randomUUID as randomUUID9 } from "node:crypto";
|
|
35593
35643
|
import {
|
|
35594
35644
|
addPlanItem as addPlanItem2,
|
|
35595
|
-
emptyPlan as emptyPlan2,
|
|
35596
35645
|
formatPlan as formatPlan2,
|
|
35597
|
-
|
|
35598
|
-
|
|
35599
|
-
mutateTasks,
|
|
35600
|
-
saveCompletedWorkCheckpoint
|
|
35601
|
-
savePlan
|
|
35646
|
+
loadTasks,
|
|
35647
|
+
mutatePlan as mutatePlan2,
|
|
35648
|
+
mutateTasks as mutateTasks2,
|
|
35649
|
+
saveCompletedWorkCheckpoint
|
|
35602
35650
|
} from "@wrongstack/core/storage";
|
|
35603
35651
|
import {
|
|
35604
35652
|
formatTaskList as formatTaskList2,
|
|
35605
35653
|
formatTaskProgress,
|
|
35606
|
-
recordCompletedWorkEvidence
|
|
35654
|
+
recordCompletedWorkEvidence,
|
|
35655
|
+
sanitizeTerminalText as sanitizeTerminalText2
|
|
35607
35656
|
} from "@wrongstack/core/utils";
|
|
35608
35657
|
import { todoTool as todoTool2 } from "@wrongstack/tools";
|
|
35609
35658
|
function findTask(tasks, query) {
|
|
@@ -35682,7 +35731,7 @@ function buildTasksCommand(_opts) {
|
|
|
35682
35731
|
const { cmd, rest } = parseSubcommand(args);
|
|
35683
35732
|
const restJoined = rest.join(" ").trim();
|
|
35684
35733
|
if (cmd === "" || cmd === "show" || cmd === "list") {
|
|
35685
|
-
const file = await
|
|
35734
|
+
const file = await loadTasks(taskPath);
|
|
35686
35735
|
const all = file?.tasks ?? [];
|
|
35687
35736
|
const filterArg = restJoined.replace(/^--status\s+/, "").trim();
|
|
35688
35737
|
const statusFilter = filterArg ? validateStatus(filterArg) : null;
|
|
@@ -35698,7 +35747,7 @@ function buildTasksCommand(_opts) {
|
|
|
35698
35747
|
return { message: formatTaskList2(tasks) };
|
|
35699
35748
|
}
|
|
35700
35749
|
if (cmd === "progress" || cmd === "statusline") {
|
|
35701
|
-
const file = await
|
|
35750
|
+
const file = await loadTasks(taskPath);
|
|
35702
35751
|
return { message: formatTaskProgress(file?.tasks ?? []) };
|
|
35703
35752
|
}
|
|
35704
35753
|
if (cmd === "planify") {
|
|
@@ -35708,16 +35757,18 @@ function buildTasksCommand(_opts) {
|
|
|
35708
35757
|
return { message: "Plan storage is not configured for this session." };
|
|
35709
35758
|
}
|
|
35710
35759
|
let outputMessage2 = "";
|
|
35711
|
-
await
|
|
35760
|
+
await mutateTasks2(taskPath, sessionId, async (file) => {
|
|
35712
35761
|
const found = findTask(file.tasks, restJoined);
|
|
35713
35762
|
if (!found) {
|
|
35714
35763
|
outputMessage2 = `No task matched "${restJoined}".`;
|
|
35715
35764
|
return file;
|
|
35716
35765
|
}
|
|
35717
|
-
const
|
|
35718
|
-
|
|
35719
|
-
|
|
35720
|
-
|
|
35766
|
+
const updated = await mutatePlan2(
|
|
35767
|
+
planPath,
|
|
35768
|
+
sessionId,
|
|
35769
|
+
(planCfg) => addPlanItem2(planCfg, found.item.title, found.item.description).plan
|
|
35770
|
+
);
|
|
35771
|
+
outputMessage2 = `Planified "${sanitizeTerminalText2(found.item.title)}" \u2192 plan item.
|
|
35721
35772
|
${formatPlan2(updated)}`;
|
|
35722
35773
|
return file;
|
|
35723
35774
|
});
|
|
@@ -35726,7 +35777,7 @@ ${formatPlan2(updated)}`;
|
|
|
35726
35777
|
let outputMessage = "";
|
|
35727
35778
|
let completedTask = null;
|
|
35728
35779
|
let todosToReplace = null;
|
|
35729
|
-
await
|
|
35780
|
+
await mutateTasks2(taskPath, sessionId, async (file) => {
|
|
35730
35781
|
switch (cmd) {
|
|
35731
35782
|
case "add": {
|
|
35732
35783
|
if (!restJoined) {
|
|
@@ -35794,7 +35845,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35794
35845
|
(dependencyId) => file.tasks.find((task) => task.id === dependencyId)?.status !== "completed"
|
|
35795
35846
|
);
|
|
35796
35847
|
if (unmet.length > 0) {
|
|
35797
|
-
outputMessage = `Cannot mark "${found.item.title}" ${nextStatus}; dependencies are unfinished: ${unmet.join(", ")}.`;
|
|
35848
|
+
outputMessage = `Cannot mark "${sanitizeTerminalText2(found.item.title)}" ${nextStatus}; dependencies are unfinished: ${unmet.map((id) => sanitizeTerminalText2(id)).join(", ")}.`;
|
|
35798
35849
|
return file;
|
|
35799
35850
|
}
|
|
35800
35851
|
}
|
|
@@ -35803,7 +35854,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35803
35854
|
if (cmd === "done") {
|
|
35804
35855
|
completedTask = { id: found.item.id, title: found.item.title };
|
|
35805
35856
|
}
|
|
35806
|
-
outputMessage = `Marked ${verbMap[cmd] ?? cmd}: ${found.item.title}
|
|
35857
|
+
outputMessage = `Marked ${verbMap[cmd] ?? cmd}: ${sanitizeTerminalText2(found.item.title)}
|
|
35807
35858
|
|
|
35808
35859
|
${formatTaskProgress(file.tasks)}`;
|
|
35809
35860
|
break;
|
|
@@ -35829,7 +35880,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35829
35880
|
(dependencyId) => file.tasks.find((task) => task.id === dependencyId)?.status !== "completed"
|
|
35830
35881
|
);
|
|
35831
35882
|
if (unmet.length > 0) {
|
|
35832
|
-
outputMessage = `Cannot mark "${found.item.title}" ${newStatus}; dependencies are unfinished: ${unmet.join(", ")}.`;
|
|
35883
|
+
outputMessage = `Cannot mark "${sanitizeTerminalText2(found.item.title)}" ${newStatus}; dependencies are unfinished: ${unmet.map((id) => sanitizeTerminalText2(id)).join(", ")}.`;
|
|
35833
35884
|
return file;
|
|
35834
35885
|
}
|
|
35835
35886
|
}
|
|
@@ -35838,7 +35889,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35838
35889
|
if (newStatus === "completed") {
|
|
35839
35890
|
completedTask = { id: found.item.id, title: found.item.title };
|
|
35840
35891
|
}
|
|
35841
|
-
outputMessage = `Status \u2192 ${newStatus}: ${found.item.title}
|
|
35892
|
+
outputMessage = `Status \u2192 ${newStatus}: ${sanitizeTerminalText2(found.item.title)}
|
|
35842
35893
|
|
|
35843
35894
|
${formatTaskProgress(file.tasks)}`;
|
|
35844
35895
|
break;
|
|
@@ -35867,13 +35918,13 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35867
35918
|
(dependencyId) => file.tasks.find((task) => task.id === dependencyId)?.status !== "completed"
|
|
35868
35919
|
);
|
|
35869
35920
|
if (unmet.length > 0) {
|
|
35870
|
-
outputMessage = `Cannot add unfinished dependencies to active task "${found.item.title}": ${unmet.join(", ")}.`;
|
|
35921
|
+
outputMessage = `Cannot add unfinished dependencies to active task "${sanitizeTerminalText2(found.item.title)}": ${unmet.map((id) => sanitizeTerminalText2(id)).join(", ")}.`;
|
|
35871
35922
|
return file;
|
|
35872
35923
|
}
|
|
35873
35924
|
}
|
|
35874
35925
|
found.item.dependsOn = depIds;
|
|
35875
35926
|
found.item.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
35876
|
-
outputMessage = `Dependencies set for "${found.item.title}": ${depIds.join(", ")}`;
|
|
35927
|
+
outputMessage = `Dependencies set for "${sanitizeTerminalText2(found.item.title)}": ${depIds.join(", ")}`;
|
|
35877
35928
|
break;
|
|
35878
35929
|
}
|
|
35879
35930
|
case "assign": {
|
|
@@ -35890,7 +35941,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35890
35941
|
}
|
|
35891
35942
|
found.item.assignee = agent;
|
|
35892
35943
|
found.item.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
35893
|
-
outputMessage = `Assigned to ${agent}: "${found.item.title}"`;
|
|
35944
|
+
outputMessage = `Assigned to ${agent}: "${sanitizeTerminalText2(found.item.title)}"`;
|
|
35894
35945
|
break;
|
|
35895
35946
|
}
|
|
35896
35947
|
case "promote": {
|
|
@@ -35907,7 +35958,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35907
35958
|
(dependencyId) => file.tasks.find((task) => task.id === dependencyId)?.status !== "completed"
|
|
35908
35959
|
);
|
|
35909
35960
|
if (unmet.length > 0) {
|
|
35910
|
-
outputMessage = `Cannot promote "${found.item.title}"; dependencies are unfinished: ${unmet.join(", ")}.`;
|
|
35961
|
+
outputMessage = `Cannot promote "${sanitizeTerminalText2(found.item.title)}"; dependencies are unfinished: ${unmet.map((id) => sanitizeTerminalText2(id)).join(", ")}.`;
|
|
35911
35962
|
return file;
|
|
35912
35963
|
}
|
|
35913
35964
|
found.item.status = "in_progress";
|
|
@@ -35933,7 +35984,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35933
35984
|
(t) => t.promotedFromTask !== found.item.id
|
|
35934
35985
|
);
|
|
35935
35986
|
todosToReplace = [...existing, ...todos];
|
|
35936
|
-
outputMessage = `Promoted to ${todos.length} todo(s): "${found.item.title}"
|
|
35987
|
+
outputMessage = `Promoted to ${todos.length} todo(s): "${sanitizeTerminalText2(found.item.title)}"
|
|
35937
35988
|
|
|
35938
35989
|
${formatTaskProgress(file.tasks)}`;
|
|
35939
35990
|
break;
|
|
@@ -35946,7 +35997,7 @@ ${formatTaskProgress(file.tasks)}`;
|
|
|
35946
35997
|
}
|
|
35947
35998
|
const unfinished = file.tasks.filter((task) => task.status !== "completed");
|
|
35948
35999
|
if (unfinished.length > 0) {
|
|
35949
|
-
outputMessage = `Cannot clear unfinished tasks: ${unfinished.map((task) => task.id).join(", ")}. Complete them first.`;
|
|
36000
|
+
outputMessage = `Cannot clear unfinished tasks: ${unfinished.map((task) => sanitizeTerminalText2(task.id)).join(", ")}. Complete them first.`;
|
|
35950
36001
|
return file;
|
|
35951
36002
|
}
|
|
35952
36003
|
file.tasks = [];
|
|
@@ -37035,7 +37086,7 @@ function createToolAutoThinCommands({
|
|
|
37035
37086
|
);
|
|
37036
37087
|
}
|
|
37037
37088
|
async function runAutoThinDryRun() {
|
|
37038
|
-
const { runBootAutoThin } = await import("./boot-auto-thin-
|
|
37089
|
+
const { runBootAutoThin } = await import("./boot-auto-thin-AGJ6TAWY.js");
|
|
37039
37090
|
const cfg = getAutoThin();
|
|
37040
37091
|
const result = await runBootAutoThin({
|
|
37041
37092
|
toolRegistry: opts.toolRegistry,
|
|
@@ -37099,7 +37150,7 @@ function createToolAutoThinCommands({
|
|
|
37099
37150
|
if (!cfg.enabled) {
|
|
37100
37151
|
return `${color80.amber("Auto-thinning is off")}. Run ${color80.cyan("/settings autothin on")} first.`;
|
|
37101
37152
|
}
|
|
37102
|
-
const { runBootAutoThin } = await import("./boot-auto-thin-
|
|
37153
|
+
const { runBootAutoThin } = await import("./boot-auto-thin-AGJ6TAWY.js");
|
|
37103
37154
|
const result = await runBootAutoThin({
|
|
37104
37155
|
toolRegistry: opts.toolRegistry,
|
|
37105
37156
|
events: opts.events,
|
|
@@ -38385,11 +38436,20 @@ async function applyActions(actions, opts) {
|
|
|
38385
38436
|
let raw = "{}";
|
|
38386
38437
|
try {
|
|
38387
38438
|
raw = await fs16.readFile(file, "utf8");
|
|
38388
|
-
} catch {
|
|
38439
|
+
} catch (error) {
|
|
38440
|
+
if (error.code !== "ENOENT") {
|
|
38441
|
+
return {
|
|
38442
|
+
messages: [
|
|
38443
|
+
`${color83.red("\u2717")} cannot read global config (${error.code ?? "error"}) \u2014 nothing was changed`
|
|
38444
|
+
],
|
|
38445
|
+
changed: false
|
|
38446
|
+
};
|
|
38447
|
+
}
|
|
38389
38448
|
}
|
|
38449
|
+
const text = raw.replace(/^\uFEFF/, "");
|
|
38390
38450
|
let parsed;
|
|
38391
38451
|
try {
|
|
38392
|
-
parsed = JSON.parse(
|
|
38452
|
+
parsed = JSON.parse(text);
|
|
38393
38453
|
} catch {
|
|
38394
38454
|
return {
|
|
38395
38455
|
messages: [`${color83.red("\u2717")} global config is not valid JSON \u2014 run /doctor fix first`],
|
|
@@ -38437,7 +38497,7 @@ async function applyActions(actions, opts) {
|
|
|
38437
38497
|
await atomicWrite5(file, JSON.stringify(parsed, null, 2));
|
|
38438
38498
|
try {
|
|
38439
38499
|
const homeFn = () => path31.dirname(path31.dirname(file));
|
|
38440
|
-
await appendHistory(JSON.parse(
|
|
38500
|
+
await appendHistory(JSON.parse(text), parsed, "tuneup auto-fix", homeFn, file);
|
|
38441
38501
|
} catch {
|
|
38442
38502
|
}
|
|
38443
38503
|
opts.configStore.update(parsed);
|
|
@@ -38587,8 +38647,8 @@ function buildWorkingDirCommand(_opts) {
|
|
|
38587
38647
|
};
|
|
38588
38648
|
}
|
|
38589
38649
|
try {
|
|
38590
|
-
const
|
|
38591
|
-
if (!
|
|
38650
|
+
const stat7 = await fs17.stat(resolved);
|
|
38651
|
+
if (!stat7.isDirectory()) {
|
|
38592
38652
|
return { message: color84.red(`Not a directory: ${resolved}`) };
|
|
38593
38653
|
}
|
|
38594
38654
|
} catch {
|
|
@@ -42071,7 +42131,7 @@ async function runCliExecution(params) {
|
|
|
42071
42131
|
governanceHandle,
|
|
42072
42132
|
setConfig
|
|
42073
42133
|
} = params;
|
|
42074
|
-
const { execute } = await import("./execution-
|
|
42134
|
+
const { execute } = await import("./execution-M7D4KNBB.js");
|
|
42075
42135
|
return execute(
|
|
42076
42136
|
toExecuteDeps({
|
|
42077
42137
|
core: {
|
|
@@ -42486,4 +42546,4 @@ export {
|
|
|
42486
42546
|
CLI_VERSION,
|
|
42487
42547
|
runInteractive
|
|
42488
42548
|
};
|
|
42489
|
-
//# sourceMappingURL=cli-main-
|
|
42549
|
+
//# sourceMappingURL=cli-main-X7KD7IOC.js.map
|