@scotthamilton77/sidekick 0.1.28 → 0.1.29
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.
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
# This file defines default values for the session summary feature.
|
|
3
3
|
# Override in ~/.sidekick/features.yaml or .sidekick/features.yaml under features.session-summary
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# Master switch for the session-summary feature. When false, NO session-summary
|
|
6
|
+
# LLM generation occurs (analysis/title/intent, snarky comment, resume message).
|
|
7
|
+
# Persona selection/injection is independent and unaffected.
|
|
6
8
|
enabled: true
|
|
7
9
|
|
|
8
10
|
settings:
|
|
@@ -54,6 +56,9 @@ settings:
|
|
|
54
56
|
|
|
55
57
|
# Enable snarky/humorous comments in summaries
|
|
56
58
|
snarkyMessages: true
|
|
59
|
+
# Generate resume ("welcome back") messages. Default false — historically more
|
|
60
|
+
# tokens than benefit. Set true to re-enable. Requires `enabled: true`.
|
|
61
|
+
resumeMessages: false
|
|
57
62
|
|
|
58
63
|
# Countdown configuration for summary refresh timing
|
|
59
64
|
# Counts ToolResult events (each tool use decrements by 1)
|
package/dist/bin.js
CHANGED
|
@@ -47579,7 +47579,7 @@ var require_build_identity = __commonJS({
|
|
|
47579
47579
|
var path_1 = __importDefault2(require("path"));
|
|
47580
47580
|
var DEV_PREFIX = "dev:";
|
|
47581
47581
|
var NO_DIST_SENTINEL = "nodist";
|
|
47582
|
-
function computeBuildIdentity(injectedVersion = true ? "0.1.
|
|
47582
|
+
function computeBuildIdentity(injectedVersion = true ? "0.1.29" : void 0, devFingerprint = computeDevFingerprint) {
|
|
47583
47583
|
return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
|
|
47584
47584
|
}
|
|
47585
47585
|
function computeDevFingerprint() {
|
|
@@ -76817,6 +76817,7 @@ var require_types3 = __commonJS({
|
|
|
76817
76817
|
maxSnarkyWords: 20,
|
|
76818
76818
|
maxResumeWords: 20,
|
|
76819
76819
|
snarkyMessages: true,
|
|
76820
|
+
resumeMessages: false,
|
|
76820
76821
|
countdown: {
|
|
76821
76822
|
lowConfidence: 5,
|
|
76822
76823
|
mediumConfidence: 10,
|
|
@@ -77498,6 +77499,7 @@ var require_update_summary = __commonJS({
|
|
|
77498
77499
|
exports2.resetCountdown = resetCountdown;
|
|
77499
77500
|
exports2.orchestrateSideEffects = orchestrateSideEffects;
|
|
77500
77501
|
exports2.emitAnalysisEvents = emitAnalysisEvents;
|
|
77502
|
+
exports2.performAnalysis = performAnalysis;
|
|
77501
77503
|
var core_1 = require_dist4();
|
|
77502
77504
|
var events_js_1 = require_events3();
|
|
77503
77505
|
var types_1 = require_dist();
|
|
@@ -77736,7 +77738,7 @@ var require_update_summary = __commonJS({
|
|
|
77736
77738
|
sideEffects.push(generateSnarkyMessage(ctx, summaryState, sessionId, updatedSummary, config));
|
|
77737
77739
|
}
|
|
77738
77740
|
const hasResume = await resumeMessageExists(summaryState, sessionId);
|
|
77739
|
-
if (updatedSummary.pivot_detected || !hasResume) {
|
|
77741
|
+
if (config.resumeMessages && (updatedSummary.pivot_detected || !hasResume)) {
|
|
77740
77742
|
sideEffects.push(generateResumeMessage(ctx, summaryState, eventContext, updatedSummary, config));
|
|
77741
77743
|
}
|
|
77742
77744
|
if (sideEffects.length > 0) {
|
|
@@ -77770,6 +77772,10 @@ var require_update_summary = __commonJS({
|
|
|
77770
77772
|
async function performAnalysis(event, ctx, summaryState, reason) {
|
|
77771
77773
|
const { context: eventContext, payload } = event;
|
|
77772
77774
|
const { sessionId } = eventContext;
|
|
77775
|
+
if (!ctx.config.getFeature("session-summary").enabled) {
|
|
77776
|
+
ctx.logger.debug("Session summary disabled; skipping analysis", { sessionId, reason });
|
|
77777
|
+
return;
|
|
77778
|
+
}
|
|
77773
77779
|
try {
|
|
77774
77780
|
const countdown = await loadCountdownState(summaryState, sessionId);
|
|
77775
77781
|
const startTime = Date.now();
|
|
@@ -85174,8 +85180,11 @@ var require_helpers = __commonJS({
|
|
|
85174
85180
|
})();
|
|
85175
85181
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
85176
85182
|
exports2.STATUSLINE_COMMAND = void 0;
|
|
85183
|
+
exports2.classifyStatusLine = classifyStatusLine;
|
|
85177
85184
|
exports2.statuslineSettingsPath = statuslineSettingsPath;
|
|
85178
85185
|
exports2.configureStatusline = configureStatusline;
|
|
85186
|
+
exports2.removeStatusline = removeStatusline;
|
|
85187
|
+
exports2.detectStatuslineScopes = detectStatuslineScopes;
|
|
85179
85188
|
exports2.writeApiKeyToEnv = writeApiKeyToEnv;
|
|
85180
85189
|
exports2.writePersonaConfig = writePersonaConfig;
|
|
85181
85190
|
exports2.getPluginStatusLabel = getPluginStatusLabel;
|
|
@@ -85190,6 +85199,16 @@ var require_helpers = __commonJS({
|
|
|
85190
85199
|
var path = __importStar(require("node:path"));
|
|
85191
85200
|
var settings_js_1 = require_settings();
|
|
85192
85201
|
exports2.STATUSLINE_COMMAND = "npx @scotthamilton77/sidekick statusline --project-dir=$CLAUDE_PROJECT_DIR";
|
|
85202
|
+
function classifyStatusLine(existing) {
|
|
85203
|
+
const command = existing?.command;
|
|
85204
|
+
if (!command)
|
|
85205
|
+
return "none";
|
|
85206
|
+
if (command.includes("dev-sidekick"))
|
|
85207
|
+
return "dev-mode";
|
|
85208
|
+
if (command.includes("@scotthamilton77/sidekick") || command.includes("sidekick statusline"))
|
|
85209
|
+
return "sidekick";
|
|
85210
|
+
return "foreign";
|
|
85211
|
+
}
|
|
85193
85212
|
function statuslineSettingsPath(scope, homeDir, projectDir) {
|
|
85194
85213
|
switch (scope) {
|
|
85195
85214
|
case "user":
|
|
@@ -85202,10 +85221,14 @@ var require_helpers = __commonJS({
|
|
|
85202
85221
|
}
|
|
85203
85222
|
async function configureStatusline(settingsPath, logger) {
|
|
85204
85223
|
const settings = await (0, settings_js_1.readSettingsFile)(settingsPath);
|
|
85205
|
-
const
|
|
85206
|
-
if (
|
|
85224
|
+
const kind = classifyStatusLine(settings.statusLine);
|
|
85225
|
+
if (kind === "dev-mode") {
|
|
85207
85226
|
logger?.warn("Statusline managed by dev-mode, skipping overwrite", { path: settingsPath });
|
|
85208
|
-
return
|
|
85227
|
+
return "dev-mode";
|
|
85228
|
+
}
|
|
85229
|
+
if (kind === "foreign") {
|
|
85230
|
+
logger?.warn("Foreign statusline present, not overwriting", { path: settingsPath });
|
|
85231
|
+
return "foreign";
|
|
85209
85232
|
}
|
|
85210
85233
|
settings.statusLine = {
|
|
85211
85234
|
type: "command",
|
|
@@ -85213,7 +85236,29 @@ var require_helpers = __commonJS({
|
|
|
85213
85236
|
};
|
|
85214
85237
|
await (0, settings_js_1.writeSettingsFile)(settingsPath, settings);
|
|
85215
85238
|
logger?.info("Statusline configured", { path: settingsPath });
|
|
85216
|
-
return
|
|
85239
|
+
return "written";
|
|
85240
|
+
}
|
|
85241
|
+
async function removeStatusline(settingsPath, logger) {
|
|
85242
|
+
const settings = await (0, settings_js_1.readSettingsFile)(settingsPath);
|
|
85243
|
+
const kind = classifyStatusLine(settings.statusLine);
|
|
85244
|
+
if (kind === "none")
|
|
85245
|
+
return "absent";
|
|
85246
|
+
if (kind === "dev-mode")
|
|
85247
|
+
return "dev-mode";
|
|
85248
|
+
if (kind === "foreign")
|
|
85249
|
+
return "foreign";
|
|
85250
|
+
delete settings.statusLine;
|
|
85251
|
+
await (0, settings_js_1.writeSettingsFile)(settingsPath, settings);
|
|
85252
|
+
logger?.info("Sidekick statusline removed", { path: settingsPath });
|
|
85253
|
+
return "removed";
|
|
85254
|
+
}
|
|
85255
|
+
async function detectStatuslineScopes(homeDir, projectDir) {
|
|
85256
|
+
const scopes = ["user", "project", "local"];
|
|
85257
|
+
const results = await Promise.all(scopes.map(async (scope) => {
|
|
85258
|
+
const settings = await (0, settings_js_1.readSettingsFile)(statuslineSettingsPath(scope, homeDir, projectDir));
|
|
85259
|
+
return classifyStatusLine(settings.statusLine) === "sidekick";
|
|
85260
|
+
}));
|
|
85261
|
+
return scopes.filter((_, i) => results[i]);
|
|
85217
85262
|
}
|
|
85218
85263
|
async function writeApiKeyToEnv(envPath, key, value) {
|
|
85219
85264
|
const dir = path.dirname(envPath);
|
|
@@ -85407,7 +85452,8 @@ var require_doctor = __commonJS({
|
|
|
85407
85452
|
"shell-alias",
|
|
85408
85453
|
"llm-config",
|
|
85409
85454
|
"legacy-state",
|
|
85410
|
-
"build-identity"
|
|
85455
|
+
"build-identity",
|
|
85456
|
+
"session-summary"
|
|
85411
85457
|
];
|
|
85412
85458
|
var DEPRECATED_LLM_MODELS = [
|
|
85413
85459
|
{
|
|
@@ -85525,11 +85571,13 @@ var require_doctor = __commonJS({
|
|
|
85525
85571
|
stdout.write("Fixing: Statusline\n");
|
|
85526
85572
|
const settingsPath = (0, helpers_js_1.statuslineSettingsPath)("user", homeDir, projectDir);
|
|
85527
85573
|
const wrote = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
|
|
85528
|
-
if (wrote) {
|
|
85574
|
+
if (wrote === "written") {
|
|
85529
85575
|
stdout.write(" \u2713 Statusline configured at user scope\n");
|
|
85530
85576
|
fixedCount++;
|
|
85531
|
-
} else {
|
|
85577
|
+
} else if (wrote === "dev-mode") {
|
|
85532
85578
|
stdout.write(" \u26A0 Statusline managed by dev-mode (skipped)\n");
|
|
85579
|
+
} else {
|
|
85580
|
+
stdout.write(" \u26A0 Foreign statusline present, not overwritten (skipped)\n");
|
|
85533
85581
|
}
|
|
85534
85582
|
}
|
|
85535
85583
|
if (shouldFix("gitignore") && gitignore !== null) {
|
|
@@ -85793,6 +85841,30 @@ var require_doctor = __commonJS({
|
|
|
85793
85841
|
if (shouldRun("llm-config")) {
|
|
85794
85842
|
runLlmConfigCheck(projectDir, homeDir, stdout, logger);
|
|
85795
85843
|
}
|
|
85844
|
+
if (shouldRun("session-summary")) {
|
|
85845
|
+
let ss = {};
|
|
85846
|
+
try {
|
|
85847
|
+
const ssResult = (0, core_1.configGet)("features.session-summary", { projectRoot: projectDir, homeDir });
|
|
85848
|
+
ss = ssResult?.value ?? {};
|
|
85849
|
+
} catch {
|
|
85850
|
+
}
|
|
85851
|
+
const enabled = ss.enabled ?? true;
|
|
85852
|
+
const s = ss.settings ?? {};
|
|
85853
|
+
if (!enabled) {
|
|
85854
|
+
stdout.write("\u26A0 Session insights: disabled (reminders-only)\n");
|
|
85855
|
+
} else {
|
|
85856
|
+
const mark = (b, dflt) => b ?? dflt ? "\u2713" : "\u2717";
|
|
85857
|
+
stdout.write(`\u2713 Session insights: analysis \u2713 snarky ${mark(s.snarkyMessages, true)} resume ${mark(s.resumeMessages, false)}
|
|
85858
|
+
`);
|
|
85859
|
+
}
|
|
85860
|
+
}
|
|
85861
|
+
if (shouldRun("statusline")) {
|
|
85862
|
+
const slScopes = await (0, helpers_js_1.detectStatuslineScopes)(homeDir, projectDir);
|
|
85863
|
+
if (slScopes.length > 1) {
|
|
85864
|
+
stdout.write(`\u2022 Sidekick statusline present at multiple scopes (${slScopes.join(", ")}); project/local override user.
|
|
85865
|
+
`);
|
|
85866
|
+
}
|
|
85867
|
+
}
|
|
85796
85868
|
if (shouldRun("auto-config")) {
|
|
85797
85869
|
const userStatus = await setupService.getUserStatus();
|
|
85798
85870
|
if (userStatus?.preferences.autoConfigureProjects) {
|
|
@@ -85909,7 +85981,7 @@ var require_scripted = __commonJS({
|
|
|
85909
85981
|
var user_profile_setup_js_1 = require_user_profile_setup();
|
|
85910
85982
|
var helpers_js_1 = require_helpers();
|
|
85911
85983
|
function hasScriptingFlags(options) {
|
|
85912
|
-
return options.marketplaceScope !== void 0 || options.pluginScope !== void 0 || options.statuslineScope !== void 0 || options.gitignore !== void 0 || options.personas !== void 0 || options.apiKeyScope !== void 0 || options.autoConfig !== void 0 || options.alias !== void 0 || options.userProfileName !== void 0 || options.userProfileRole !== void 0 || options.userProfileInterests !== void 0;
|
|
85984
|
+
return options.marketplaceScope !== void 0 || options.pluginScope !== void 0 || options.statuslineScope !== void 0 || options.statusline !== void 0 || options.sessionSummary !== void 0 || options.gitignore !== void 0 || options.personas !== void 0 || options.apiKeyScope !== void 0 || options.autoConfig !== void 0 || options.alias !== void 0 || options.userProfileName !== void 0 || options.userProfileRole !== void 0 || options.userProfileInterests !== void 0;
|
|
85913
85985
|
}
|
|
85914
85986
|
async function runScripted(projectDir, logger, stdout, options, isDevMode) {
|
|
85915
85987
|
const homeDir = options.homeDir ?? os.homedir();
|
|
@@ -85951,17 +86023,45 @@ var require_scripted = __commonJS({
|
|
|
85951
86023
|
configuredCount++;
|
|
85952
86024
|
}
|
|
85953
86025
|
}
|
|
85954
|
-
if (options.statuslineScope) {
|
|
85955
|
-
const
|
|
85956
|
-
const
|
|
85957
|
-
|
|
85958
|
-
|
|
86026
|
+
if (options.statusline === true || options.statusline === void 0 && options.statuslineScope) {
|
|
86027
|
+
const scope = options.statuslineScope ?? "user";
|
|
86028
|
+
const settingsPath = (0, helpers_js_1.statuslineSettingsPath)(scope, homeDir, projectDir);
|
|
86029
|
+
const result = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
|
|
86030
|
+
if (result === "written") {
|
|
86031
|
+
stdout.write(`\u2713 Statusline configured (${scope}: ${settingsPath})
|
|
85959
86032
|
`);
|
|
85960
86033
|
configuredCount++;
|
|
86034
|
+
} else if (result === "dev-mode") {
|
|
86035
|
+
stdout.write(`\u26A0 Statusline managed by dev-mode (skipped) at ${settingsPath}
|
|
86036
|
+
`);
|
|
85961
86037
|
} else {
|
|
85962
|
-
stdout.write(`\u26A0
|
|
86038
|
+
stdout.write(`\u26A0 A non-Sidekick statusline already exists at ${settingsPath}; left unchanged. To use Sidekick's statusline, manually edit or remove the existing one, then re-run setup.
|
|
85963
86039
|
`);
|
|
85964
86040
|
}
|
|
86041
|
+
} else if (options.statusline === false) {
|
|
86042
|
+
const scope = options.statuslineScope ?? "user";
|
|
86043
|
+
const settingsPath = (0, helpers_js_1.statuslineSettingsPath)(scope, homeDir, projectDir);
|
|
86044
|
+
const result = await (0, helpers_js_1.removeStatusline)(settingsPath, logger);
|
|
86045
|
+
stdout.write(`${result === "removed" ? "\u2713" : "-"} Sidekick statusline ${result} (${scope}: ${settingsPath})
|
|
86046
|
+
`);
|
|
86047
|
+
(0, core_1.configSet)("features.statusline.enabled", "false", { scope, projectRoot: projectDir, homeDir });
|
|
86048
|
+
if (options.sessionSummary === void 0) {
|
|
86049
|
+
(0, core_1.configSet)("features.session-summary.enabled", "false", { scope, projectRoot: projectDir, homeDir });
|
|
86050
|
+
stdout.write(`\u2713 Session insights disabled (they only render in the statusline) \u2014 features.yaml (${scope})
|
|
86051
|
+
`);
|
|
86052
|
+
}
|
|
86053
|
+
configuredCount++;
|
|
86054
|
+
}
|
|
86055
|
+
if (options.sessionSummary !== void 0) {
|
|
86056
|
+
const scope = options.statuslineScope ?? "user";
|
|
86057
|
+
(0, core_1.configSet)("features.session-summary.enabled", String(options.sessionSummary), {
|
|
86058
|
+
scope,
|
|
86059
|
+
projectRoot: projectDir,
|
|
86060
|
+
homeDir
|
|
86061
|
+
});
|
|
86062
|
+
stdout.write(`\u2713 Session insights ${options.sessionSummary ? "enabled" : "disabled"} \u2014 features.yaml (${scope})
|
|
86063
|
+
`);
|
|
86064
|
+
configuredCount++;
|
|
85965
86065
|
}
|
|
85966
86066
|
if (options.gitignore === true) {
|
|
85967
86067
|
const result = await (0, core_1.installGitignoreSection)(projectDir);
|
|
@@ -86296,13 +86396,31 @@ Examples:
|
|
|
86296
86396
|
(0, prompts_js_1.printHeader)(ctx, "Step 2: Statusline Configuration", "Claude Code plugins cannot provide statusline config directly.");
|
|
86297
86397
|
if (isDevMode) {
|
|
86298
86398
|
const settingsPath2 = (0, helpers_js_1.statuslineSettingsPath)("user", homeDir, projectDir);
|
|
86299
|
-
const
|
|
86300
|
-
if (
|
|
86399
|
+
const result = await (0, helpers_js_1.configureStatusline)(settingsPath2, logger);
|
|
86400
|
+
if (result === "written") {
|
|
86301
86401
|
(0, prompts_js_1.printStatus)(ctx, "success", "Statusline configured at user scope (dev-mode active)");
|
|
86302
86402
|
} else {
|
|
86303
86403
|
(0, prompts_js_1.printStatus)(ctx, "warning", "Statusline managed by dev-mode (skipped)");
|
|
86304
86404
|
}
|
|
86305
|
-
return "user";
|
|
86405
|
+
return { enabled: true, scope: "user" };
|
|
86406
|
+
}
|
|
86407
|
+
const wantStatusline = await (0, prompts_js_1.promptConfirm)(ctx, "Enable Sidekick statusline?", true);
|
|
86408
|
+
if (!wantStatusline) {
|
|
86409
|
+
(0, prompts_js_1.printStatus)(ctx, "info", "Insights only render in the statusline, so they will be disabled too.");
|
|
86410
|
+
const detected = await (0, helpers_js_1.detectStatuslineScopes)(homeDir, projectDir);
|
|
86411
|
+
for (const scope of detected) {
|
|
86412
|
+
const settingsPath2 = (0, helpers_js_1.statuslineSettingsPath)(scope, homeDir, projectDir);
|
|
86413
|
+
const result = await (0, helpers_js_1.removeStatusline)(settingsPath2, logger);
|
|
86414
|
+
(0, prompts_js_1.printStatus)(ctx, result === "removed" ? "success" : "info", `Statusline ${result} (${scope}: ${settingsPath2})`);
|
|
86415
|
+
}
|
|
86416
|
+
const scopesToDisable = [.../* @__PURE__ */ new Set([...detected, "user"])];
|
|
86417
|
+
for (const scope of scopesToDisable) {
|
|
86418
|
+
(0, core_1.configSet)("features.statusline.enabled", "false", { scope, projectRoot: projectDir, homeDir });
|
|
86419
|
+
(0, core_1.configSet)("features.session-summary.enabled", "false", { scope, projectRoot: projectDir, homeDir });
|
|
86420
|
+
}
|
|
86421
|
+
(0, prompts_js_1.printStatus)(ctx, "success", `Session insights disabled at: ${scopesToDisable.join(", ")}.`);
|
|
86422
|
+
(0, prompts_js_1.printStatus)(ctx, "info", "If you have overrides at another scope, also run: sidekick config set features.session-summary.enabled false --scope=<scope>");
|
|
86423
|
+
return { enabled: false, scope: "user" };
|
|
86306
86424
|
}
|
|
86307
86425
|
const STATUSLINE_SCOPE_OPTIONS = {
|
|
86308
86426
|
user: { label: "User-level (~/.claude/settings.json)", description: "Works in all projects" },
|
|
@@ -86322,13 +86440,34 @@ Examples:
|
|
|
86322
86440
|
statuslineScope = await (0, prompts_js_1.promptSelect)(ctx, "Where should sidekick configure your statusline?", options);
|
|
86323
86441
|
}
|
|
86324
86442
|
const settingsPath = (0, helpers_js_1.statuslineSettingsPath)(statuslineScope, homeDir, projectDir);
|
|
86325
|
-
const
|
|
86326
|
-
if (
|
|
86443
|
+
const writeResult = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
|
|
86444
|
+
if (writeResult === "written") {
|
|
86327
86445
|
(0, prompts_js_1.printStatus)(ctx, "success", `Statusline configured in ${settingsPath}`);
|
|
86328
|
-
} else {
|
|
86446
|
+
} else if (writeResult === "dev-mode") {
|
|
86329
86447
|
(0, prompts_js_1.printStatus)(ctx, "warning", "Statusline managed by dev-mode (skipped)");
|
|
86448
|
+
} else {
|
|
86449
|
+
(0, prompts_js_1.printStatus)(ctx, "warning", `A non-Sidekick statusline already exists at ${settingsPath} (left unchanged)`);
|
|
86330
86450
|
}
|
|
86331
|
-
|
|
86451
|
+
(0, prompts_js_1.printHeader)(ctx, "Configure Session Insights");
|
|
86452
|
+
const wantAnalysis = await (0, prompts_js_1.promptConfirm)(ctx, "Enable session analysis (title/intent)?", true);
|
|
86453
|
+
(0, core_1.configSet)("features.session-summary.enabled", String(wantAnalysis), {
|
|
86454
|
+
scope: statuslineScope,
|
|
86455
|
+
projectRoot: projectDir,
|
|
86456
|
+
homeDir
|
|
86457
|
+
});
|
|
86458
|
+
const wantSnarky = await (0, prompts_js_1.promptConfirm)(ctx, "Enable snarky comments?", true);
|
|
86459
|
+
(0, core_1.configSet)("features.session-summary.settings.snarkyMessages", String(wantSnarky), {
|
|
86460
|
+
scope: statuslineScope,
|
|
86461
|
+
projectRoot: projectDir,
|
|
86462
|
+
homeDir
|
|
86463
|
+
});
|
|
86464
|
+
const wantResume = await (0, prompts_js_1.promptConfirm)(ctx, "Enable resume messages?", false);
|
|
86465
|
+
(0, core_1.configSet)("features.session-summary.settings.resumeMessages", String(wantResume), {
|
|
86466
|
+
scope: statuslineScope,
|
|
86467
|
+
projectRoot: projectDir,
|
|
86468
|
+
homeDir
|
|
86469
|
+
});
|
|
86470
|
+
return { enabled: true, scope: statuslineScope };
|
|
86332
86471
|
}
|
|
86333
86472
|
async function runStep3Gitignore(wctx, force) {
|
|
86334
86473
|
const { ctx, projectDir } = wctx;
|
|
@@ -86493,7 +86632,8 @@ Examples:
|
|
|
86493
86632
|
}
|
|
86494
86633
|
async function writeStatusFiles(wctx, state) {
|
|
86495
86634
|
const { setupService } = wctx;
|
|
86496
|
-
const { statuslineScope, gitignoreStatus, apiKeyHealth, apiKeyDetection, autoConfig } = state;
|
|
86635
|
+
const { statuslineEnabled, statuslineScope, gitignoreStatus, apiKeyHealth, apiKeyDetection, autoConfig } = state;
|
|
86636
|
+
const statuslineStatus = statuslineEnabled ? statuslineScope : "none";
|
|
86497
86637
|
const userStatus = {
|
|
86498
86638
|
version: 1,
|
|
86499
86639
|
lastUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -86502,7 +86642,7 @@ Examples:
|
|
|
86502
86642
|
defaultStatuslineScope: statuslineScope,
|
|
86503
86643
|
defaultApiKeyScope: "user"
|
|
86504
86644
|
},
|
|
86505
|
-
statusline:
|
|
86645
|
+
statusline: statuslineStatus,
|
|
86506
86646
|
apiKeys: {
|
|
86507
86647
|
OPENROUTER_API_KEY: apiKeyDetection ? setupService.buildUserApiKeyStatus(apiKeyDetection) : core_1.SetupStatusService.userApiKeyStatusFromHealth(apiKeyHealth),
|
|
86508
86648
|
OPENAI_API_KEY: core_1.SetupStatusService.userApiKeyStatusFromHealth("not-required")
|
|
@@ -86515,7 +86655,7 @@ Examples:
|
|
|
86515
86655
|
version: 1,
|
|
86516
86656
|
lastUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
86517
86657
|
autoConfigured: false,
|
|
86518
|
-
statusline:
|
|
86658
|
+
statusline: statuslineStatus,
|
|
86519
86659
|
apiKeys: {
|
|
86520
86660
|
OPENROUTER_API_KEY: projectOpenRouterStatus,
|
|
86521
86661
|
OPENAI_API_KEY: core_1.SetupStatusService.projectApiKeyStatusFromHealth("not-required")
|
|
@@ -86527,11 +86667,15 @@ Examples:
|
|
|
86527
86667
|
}
|
|
86528
86668
|
function printSummary(wctx, state) {
|
|
86529
86669
|
const { ctx } = wctx;
|
|
86530
|
-
const { statuslineScope, gitignoreStatus, wantPersonas, apiKeyHealth, autoConfig } = state;
|
|
86670
|
+
const { statuslineEnabled, statuslineScope, gitignoreStatus, wantPersonas, apiKeyHealth, autoConfig } = state;
|
|
86531
86671
|
const stdout = ctx.stdout;
|
|
86532
86672
|
(0, prompts_js_1.printHeader)(ctx, "Summary");
|
|
86533
|
-
|
|
86534
|
-
|
|
86673
|
+
if (statuslineEnabled) {
|
|
86674
|
+
const scopeLabel = { user: "User-level", project: "Project-level", local: "Local" }[statuslineScope];
|
|
86675
|
+
(0, prompts_js_1.printStatus)(ctx, "success", `Statusline: ${scopeLabel}`);
|
|
86676
|
+
} else {
|
|
86677
|
+
(0, prompts_js_1.printStatus)(ctx, "info", "Statusline: Disabled (reminders-only mode)");
|
|
86678
|
+
}
|
|
86535
86679
|
let gitignoreStatusType;
|
|
86536
86680
|
let gitignoreLabel;
|
|
86537
86681
|
switch (gitignoreStatus) {
|
|
@@ -86609,7 +86753,9 @@ Examples:
|
|
|
86609
86753
|
}
|
|
86610
86754
|
const forceStatuslineScope = pluginResult.pluginScope;
|
|
86611
86755
|
const forceEffectiveScope = isDevMode ? "user" : forceStatuslineScope;
|
|
86612
|
-
const
|
|
86756
|
+
const statuslineResult = force ? { enabled: true, scope: forceEffectiveScope } : await runStep2Statusline(wctx, pluginResult.pluginScope, isDevMode);
|
|
86757
|
+
const statuslineScope = statuslineResult.scope;
|
|
86758
|
+
const statuslineEnabled = statuslineResult.enabled;
|
|
86613
86759
|
const gitignoreStatus = await runStep3Gitignore(wctx, force);
|
|
86614
86760
|
const { apiKeyHealth, apiKeyDetection } = force ? { apiKeyHealth: "missing", apiKeyDetection: null } : await runStep4ApiKey(wctx);
|
|
86615
86761
|
const wantPersonas = force ? true : await runStep5Personas(wctx);
|
|
@@ -86619,12 +86765,13 @@ Examples:
|
|
|
86619
86765
|
const _userProfile = force ? { configured: false } : await (0, user_profile_setup_js_1.runUserProfileStep)(wctx.ctx, homeDir);
|
|
86620
86766
|
if (force) {
|
|
86621
86767
|
const settingsPath = (0, helpers_js_1.statuslineSettingsPath)(forceEffectiveScope, homeDir, projectDir);
|
|
86622
|
-
const
|
|
86623
|
-
if (
|
|
86768
|
+
const result = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
|
|
86769
|
+
if (result !== "written") {
|
|
86624
86770
|
stdout.write("\u26A0 Statusline managed by dev-mode (skipped)\n");
|
|
86625
86771
|
}
|
|
86626
86772
|
}
|
|
86627
86773
|
const state = {
|
|
86774
|
+
statuslineEnabled,
|
|
86628
86775
|
statuslineScope,
|
|
86629
86776
|
gitignoreStatus,
|
|
86630
86777
|
wantPersonas,
|
|
@@ -87375,6 +87522,7 @@ var require_cli = __commonJS({
|
|
|
87375
87522
|
};
|
|
87376
87523
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
87377
87524
|
exports2.UnknownOptionError = void 0;
|
|
87525
|
+
exports2.parseArgs = parseArgs;
|
|
87378
87526
|
exports2.parseHookInput = parseHookInput;
|
|
87379
87527
|
exports2.initializeRuntime = initializeRuntime;
|
|
87380
87528
|
exports2.initializeSession = initializeSession;
|
|
@@ -87383,7 +87531,7 @@ var require_cli = __commonJS({
|
|
|
87383
87531
|
var promises_12 = require("node:fs/promises");
|
|
87384
87532
|
var node_stream_1 = require("node:stream");
|
|
87385
87533
|
var yargs_parser_1 = __importDefault2(require_build());
|
|
87386
|
-
var VERSION = true ? "0.1.
|
|
87534
|
+
var VERSION = true ? "0.1.29" : "dev";
|
|
87387
87535
|
var SANDBOX_ERROR_MESSAGE = `Error: Daemon commands cannot run in sandbox mode.
|
|
87388
87536
|
|
|
87389
87537
|
Claude Code's sandbox blocks Unix socket operations required for daemon IPC.
|
|
@@ -87420,7 +87568,9 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
|
|
|
87420
87568
|
"gitignore",
|
|
87421
87569
|
"personas",
|
|
87422
87570
|
"alias",
|
|
87423
|
-
"write-status"
|
|
87571
|
+
"write-status",
|
|
87572
|
+
"statusline",
|
|
87573
|
+
"session-summary"
|
|
87424
87574
|
],
|
|
87425
87575
|
string: [
|
|
87426
87576
|
"project-dir",
|
|
@@ -87469,6 +87619,8 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
|
|
|
87469
87619
|
const hasGitignoreFlag = argv.some((arg) => arg === "--gitignore" || arg === "--no-gitignore");
|
|
87470
87620
|
const hasPersonasFlag = argv.some((arg) => arg === "--personas" || arg === "--no-personas");
|
|
87471
87621
|
const hasAliasFlag = argv.some((arg) => arg === "--alias" || arg === "--no-alias");
|
|
87622
|
+
const hasStatuslineFlag = argv.some((arg) => arg === "--statusline" || arg === "--no-statusline");
|
|
87623
|
+
const hasSessionSummaryFlag = argv.some((arg) => arg === "--session-summary" || arg === "--no-session-summary");
|
|
87472
87624
|
return {
|
|
87473
87625
|
command,
|
|
87474
87626
|
projectDir: parsed["project-dir"],
|
|
@@ -87501,6 +87653,8 @@ Example: { "command": "pnpm sidekick daemon status", "dangerouslyDisableSandbox"
|
|
|
87501
87653
|
marketplaceScope: parsed["marketplace-scope"],
|
|
87502
87654
|
pluginScope: parsed["plugin-scope"],
|
|
87503
87655
|
alias: hasAliasFlag ? Boolean(parsed.alias) : void 0,
|
|
87656
|
+
statusline: hasStatuslineFlag ? Boolean(parsed.statusline) : void 0,
|
|
87657
|
+
sessionSummary: hasSessionSummaryFlag ? Boolean(parsed["session-summary"]) : void 0,
|
|
87504
87658
|
userProfileName: parsed["user-profile-name"],
|
|
87505
87659
|
userProfileRole: parsed["user-profile-role"],
|
|
87506
87660
|
userProfileInterests: parsed["user-profile-interests"],
|
|
@@ -87771,6 +87925,8 @@ Run 'sidekick hook --help' for available hooks.
|
|
|
87771
87925
|
marketplaceScope: parsed.marketplaceScope,
|
|
87772
87926
|
pluginScope: parsed.pluginScope,
|
|
87773
87927
|
alias: parsed.alias,
|
|
87928
|
+
statusline: parsed.statusline,
|
|
87929
|
+
sessionSummary: parsed.sessionSummary,
|
|
87774
87930
|
userProfileName: parsed.userProfileName,
|
|
87775
87931
|
userProfileRole: parsed.userProfileRole,
|
|
87776
87932
|
userProfileInterests: parsed.userProfileInterests,
|
package/dist/daemon.js
CHANGED
|
@@ -46603,7 +46603,7 @@ var require_build_identity = __commonJS({
|
|
|
46603
46603
|
var path_1 = __importDefault(require("path"));
|
|
46604
46604
|
var DEV_PREFIX = "dev:";
|
|
46605
46605
|
var NO_DIST_SENTINEL = "nodist";
|
|
46606
|
-
function computeBuildIdentity(injectedVersion = true ? "0.1.
|
|
46606
|
+
function computeBuildIdentity(injectedVersion = true ? "0.1.29" : void 0, devFingerprint = computeDevFingerprint) {
|
|
46607
46607
|
return injectedVersion !== void 0 ? injectedVersion : DEV_PREFIX + devFingerprint();
|
|
46608
46608
|
}
|
|
46609
46609
|
function computeDevFingerprint() {
|
|
@@ -75581,6 +75581,7 @@ var require_types3 = __commonJS({
|
|
|
75581
75581
|
maxSnarkyWords: 20,
|
|
75582
75582
|
maxResumeWords: 20,
|
|
75583
75583
|
snarkyMessages: true,
|
|
75584
|
+
resumeMessages: false,
|
|
75584
75585
|
countdown: {
|
|
75585
75586
|
lowConfidence: 5,
|
|
75586
75587
|
mediumConfidence: 10,
|
|
@@ -76262,6 +76263,7 @@ var require_update_summary = __commonJS({
|
|
|
76262
76263
|
exports2.resetCountdown = resetCountdown;
|
|
76263
76264
|
exports2.orchestrateSideEffects = orchestrateSideEffects;
|
|
76264
76265
|
exports2.emitAnalysisEvents = emitAnalysisEvents;
|
|
76266
|
+
exports2.performAnalysis = performAnalysis;
|
|
76265
76267
|
var core_1 = require_dist4();
|
|
76266
76268
|
var events_js_1 = require_events3();
|
|
76267
76269
|
var types_1 = require_dist();
|
|
@@ -76500,7 +76502,7 @@ var require_update_summary = __commonJS({
|
|
|
76500
76502
|
sideEffects.push(generateSnarkyMessage(ctx, summaryState, sessionId, updatedSummary, config));
|
|
76501
76503
|
}
|
|
76502
76504
|
const hasResume = await resumeMessageExists(summaryState, sessionId);
|
|
76503
|
-
if (updatedSummary.pivot_detected || !hasResume) {
|
|
76505
|
+
if (config.resumeMessages && (updatedSummary.pivot_detected || !hasResume)) {
|
|
76504
76506
|
sideEffects.push(generateResumeMessage(ctx, summaryState, eventContext, updatedSummary, config));
|
|
76505
76507
|
}
|
|
76506
76508
|
if (sideEffects.length > 0) {
|
|
@@ -76534,6 +76536,10 @@ var require_update_summary = __commonJS({
|
|
|
76534
76536
|
async function performAnalysis(event, ctx, summaryState, reason) {
|
|
76535
76537
|
const { context: eventContext, payload } = event;
|
|
76536
76538
|
const { sessionId } = eventContext;
|
|
76539
|
+
if (!ctx.config.getFeature("session-summary").enabled) {
|
|
76540
|
+
ctx.logger.debug("Session summary disabled; skipping analysis", { sessionId, reason });
|
|
76541
|
+
return;
|
|
76542
|
+
}
|
|
76537
76543
|
try {
|
|
76538
76544
|
const countdown = await loadCountdownState(summaryState, sessionId);
|
|
76539
76545
|
const startTime = Date.now();
|