@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
- # Enable or disable the session summary feature
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.28" : void 0, devFingerprint = computeDevFingerprint) {
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 existing = settings.statusLine;
85206
- if (existing?.command?.includes("dev-sidekick")) {
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 false;
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 true;
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 settingsPath = (0, helpers_js_1.statuslineSettingsPath)(options.statuslineScope, homeDir, projectDir);
85956
- const wrote = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
85957
- if (wrote) {
85958
- stdout.write(`\u2713 Statusline configured (${options.statuslineScope}-level)
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 Statusline managed by dev-mode (skipped)
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 wrote2 = await (0, helpers_js_1.configureStatusline)(settingsPath2, logger);
86300
- if (wrote2) {
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 wrote = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
86326
- if (wrote) {
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
- return statuslineScope;
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: statuslineScope,
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: statuslineScope,
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
- const scopeLabel = { user: "User-level", project: "Project-level", local: "Local" }[statuslineScope];
86534
- (0, prompts_js_1.printStatus)(ctx, "success", `Statusline: ${scopeLabel}`);
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 statuslineScope = force ? forceEffectiveScope : await runStep2Statusline(wctx, pluginResult.pluginScope, isDevMode);
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 wrote = await (0, helpers_js_1.configureStatusline)(settingsPath, logger);
86623
- if (!wrote) {
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.28" : "dev";
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.28" : void 0, devFingerprint = computeDevFingerprint) {
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();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scotthamilton77/sidekick",
3
- "version": "0.1.28",
3
+ "version": "0.1.29",
4
4
  "description": "AI pair programming assistant with personas, session tracking, and contextual nudges",
5
5
  "bin": {
6
6
  "sidekick": "dist/bin.js"