maxsimcli 2.5.6 → 3.0.1
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/README.md +4 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/base.d.ts +34 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +116 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +21 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +104 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +19 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +94 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini.d.ts +19 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +96 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts +20 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +56 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +17 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +111 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/transforms/content.d.ts +39 -0
- package/dist/adapters/transforms/content.d.ts.map +1 -0
- package/dist/adapters/transforms/content.js +125 -0
- package/dist/adapters/transforms/content.js.map +1 -0
- package/dist/adapters/transforms/frontmatter.d.ts +42 -0
- package/dist/adapters/transforms/frontmatter.d.ts.map +1 -0
- package/dist/adapters/transforms/frontmatter.js +204 -0
- package/dist/adapters/transforms/frontmatter.js.map +1 -0
- package/dist/adapters/transforms/tool-maps.d.ts +20 -0
- package/dist/adapters/transforms/tool-maps.d.ts.map +1 -0
- package/dist/adapters/transforms/tool-maps.js +64 -0
- package/dist/adapters/transforms/tool-maps.js.map +1 -0
- package/dist/adapters/types.d.ts +10 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/assets/CHANGELOG.md +26 -0
- package/dist/assets/dashboard/client/assets/{index-DnL8rwuQ.js → index-1nmhAN7y.js} +2 -1
- package/dist/assets/dashboard/client/assets/index-DXau7xRM.css +32 -0
- package/dist/assets/dashboard/client/index.html +2 -2
- package/dist/assets/dashboard/server.js +27732 -12013
- package/dist/assets/hooks/maxsim-check-update.cjs +2 -2
- package/dist/assets/hooks/maxsim-check-update.cjs.map +1 -0
- package/dist/assets/hooks/maxsim-context-monitor.cjs +2 -2
- package/dist/assets/hooks/maxsim-context-monitor.cjs.map +1 -0
- package/dist/assets/hooks/maxsim-statusline.cjs +2 -2
- package/dist/assets/hooks/maxsim-statusline.cjs.map +1 -0
- package/dist/cli.cjs +15316 -5348
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts +0 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +282 -443
- package/dist/cli.js.map +1 -1
- package/dist/core/commands.d.ts +19 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +560 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/config.d.ts +9 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +147 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/core.d.ts +39 -0
- package/dist/core/core.d.ts.map +1 -0
- package/dist/core/core.js +411 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/frontmatter.d.ts +33 -0
- package/dist/core/frontmatter.d.ts.map +1 -0
- package/dist/core/frontmatter.js +192 -0
- package/dist/core/frontmatter.js.map +1 -0
- package/dist/core/index.d.ts +20 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +126 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/init.d.ts +252 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +578 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/milestone.d.ts +9 -0
- package/dist/core/milestone.d.ts.map +1 -0
- package/dist/core/milestone.js +191 -0
- package/dist/core/milestone.js.map +1 -0
- package/dist/core/phase.d.ts +17 -0
- package/dist/core/phase.d.ts.map +1 -0
- package/dist/core/phase.js +610 -0
- package/dist/core/phase.js.map +1 -0
- package/dist/core/roadmap.d.ts +9 -0
- package/dist/core/roadmap.d.ts.map +1 -0
- package/dist/core/roadmap.js +228 -0
- package/dist/core/roadmap.js.map +1 -0
- package/dist/core/state.d.ts +21 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +507 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/template.d.ts +30 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +225 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/types.d.ts +374 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +53 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/verify.d.ts +127 -0
- package/dist/core/verify.d.ts.map +1 -0
- package/dist/core/verify.js +783 -0
- package/dist/core/verify.js.map +1 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +18 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/maxsim-check-update.d.ts +17 -0
- package/dist/hooks/maxsim-check-update.d.ts.map +1 -0
- package/dist/hooks/maxsim-check-update.js +101 -0
- package/dist/hooks/maxsim-check-update.js.map +1 -0
- package/dist/hooks/maxsim-context-monitor.d.ts +21 -0
- package/dist/hooks/maxsim-context-monitor.d.ts.map +1 -0
- package/dist/hooks/maxsim-context-monitor.js +131 -0
- package/dist/hooks/maxsim-context-monitor.js.map +1 -0
- package/dist/hooks/maxsim-statusline.d.ts +19 -0
- package/dist/hooks/maxsim-statusline.d.ts.map +1 -0
- package/dist/hooks/maxsim-statusline.js +146 -0
- package/dist/hooks/maxsim-statusline.js.map +1 -0
- package/dist/hooks/shared.d.ts +11 -0
- package/dist/hooks/shared.d.ts.map +1 -0
- package/dist/hooks/shared.js +29 -0
- package/dist/hooks/shared.js.map +1 -0
- package/dist/install.cjs +2807 -1211
- package/dist/install.cjs.map +1 -1
- package/dist/install.js +34 -85
- package/dist/install.js.map +1 -1
- package/package.json +10 -7
- package/dist/assets/dashboard/client/assets/index-SwFemGUT.css +0 -32
- package/dist/assets/hooks/index.cjs +0 -239
- package/dist/assets/templates/CLAUDE.md +0 -22
- package/dist/assets/templates/package.json +0 -5
- package/dist/assets/templates/project.json +0 -5
|
@@ -35,12 +35,12 @@ let node_os = require("node:os");
|
|
|
35
35
|
node_os = __toESM(node_os);
|
|
36
36
|
let node_child_process = require("node:child_process");
|
|
37
37
|
|
|
38
|
-
//#region src/shared.ts
|
|
38
|
+
//#region src/hooks/shared.ts
|
|
39
39
|
/** The '.claude' path segment -- template marker replaced during install. */
|
|
40
40
|
const CLAUDE_DIR = ".claude";
|
|
41
41
|
|
|
42
42
|
//#endregion
|
|
43
|
-
//#region src/maxsim-check-update.ts
|
|
43
|
+
//#region src/hooks/maxsim-check-update.ts
|
|
44
44
|
/**
|
|
45
45
|
* Check for MAXSIM updates in background, write result to cache.
|
|
46
46
|
* Called by SessionStart hook - runs once per session.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxsim-check-update.cjs","names":["path","fs","os"],"sources":["../../../src/hooks/shared.ts","../../../src/hooks/maxsim-check-update.ts"],"sourcesContent":["/**\n * Shared utilities for MAXSIM hooks.\n */\n\n/**\n * Read all stdin as a string, then invoke callback with parsed JSON.\n * Used by context-monitor and statusline hooks.\n */\nexport function readStdinJson<T>(callback: (data: T) => void): void {\n let input = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => (input += chunk));\n process.stdin.on('end', () => {\n try {\n const data = JSON.parse(input) as T;\n callback(data);\n } catch {\n // Silent fail -- never block hook execution\n process.exit(0);\n }\n });\n}\n\n/** The '.claude' path segment -- template marker replaced during install. */\nexport const CLAUDE_DIR = '.claude';\n","#!/usr/bin/env node\n/**\n * Check for MAXSIM updates in background, write result to cache.\n * Called by SessionStart hook - runs once per session.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport { CLAUDE_DIR } from './shared';\n\nexport interface UpdateCheckResult {\n update_available: boolean;\n installed: string;\n latest: string;\n checked: number;\n}\n\nexport interface CheckForUpdateOptions {\n homeDir: string;\n cwd: string;\n}\n\nexport function checkForUpdate(options: CheckForUpdateOptions): void {\n const { homeDir, cwd } = options;\n const cacheDir = path.join(homeDir, CLAUDE_DIR, 'cache');\n const cacheFile = path.join(cacheDir, 'maxsim-update-check.json');\n\n // VERSION file locations (check project first, then global)\n const projectVersionFile = path.join(cwd, CLAUDE_DIR, 'maxsim', 'VERSION');\n const globalVersionFile = path.join(homeDir, CLAUDE_DIR, 'maxsim', 'VERSION');\n\n // Ensure cache directory exists\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true });\n }\n\n // Run check in background (spawn background process, windowsHide prevents console flash)\n const child = spawn(process.execPath, ['-e', `\n const fs = require('fs');\n const { execSync } = require('child_process');\n\n const cacheFile = ${JSON.stringify(cacheFile)};\n const projectVersionFile = ${JSON.stringify(projectVersionFile)};\n const globalVersionFile = ${JSON.stringify(globalVersionFile)};\n\n // Check project directory first (local install), then global\n let installed = '0.0.0';\n try {\n if (fs.existsSync(projectVersionFile)) {\n installed = fs.readFileSync(projectVersionFile, 'utf8').trim();\n } else if (fs.existsSync(globalVersionFile)) {\n installed = fs.readFileSync(globalVersionFile, 'utf8').trim();\n }\n } catch (e) {}\n\n let latest = null;\n try {\n latest = execSync('npm view maxsimcli version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();\n } catch (e) {}\n\n const result = {\n update_available: latest && installed !== latest,\n installed,\n latest: latest || 'unknown',\n checked: Math.floor(Date.now() / 1000)\n };\n\n fs.writeFileSync(cacheFile, JSON.stringify(result));\n`], {\n stdio: 'ignore',\n windowsHide: true,\n detached: true,\n });\n\n child.unref();\n}\n\n// Standalone entry\nif (require.main === module) {\n checkForUpdate({ homeDir: os.homedir(), cwd: process.cwd() });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,aAAa;;;;;;;;ACA1B,SAAgB,eAAe,SAAsC;CACnE,MAAM,EAAE,SAAS,QAAQ;CACzB,MAAM,WAAWA,UAAK,KAAK,SAAS,YAAY,QAAQ;CACxD,MAAM,YAAYA,UAAK,KAAK,UAAU,2BAA2B;CAGjE,MAAM,qBAAqBA,UAAK,KAAK,KAAK,YAAY,UAAU,UAAU;CAC1E,MAAM,oBAAoBA,UAAK,KAAK,SAAS,YAAY,UAAU,UAAU;AAG7E,KAAI,CAACC,QAAG,WAAW,SAAS,CAC1B,SAAG,UAAU,UAAU,EAAE,WAAW,MAAM,CAAC;AAyC7C,+BArCoB,QAAQ,UAAU,CAAC,MAAM;;;;sBAIzB,KAAK,UAAU,UAAU,CAAC;+BACjB,KAAK,UAAU,mBAAmB,CAAC;8BACpC,KAAK,UAAU,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyB9D,EAAE;EACA,OAAO;EACP,aAAa;EACb,UAAU;EACX,CAAC,CAEI,OAAO;;AAIf,IAAI,QAAQ,SAAS,OACnB,gBAAe;CAAE,SAASC,QAAG,SAAS;CAAE,KAAK,QAAQ,KAAK;CAAE,CAAC"}
|
|
@@ -34,7 +34,7 @@ node_os = __toESM(node_os);
|
|
|
34
34
|
let node_path = require("node:path");
|
|
35
35
|
node_path = __toESM(node_path);
|
|
36
36
|
|
|
37
|
-
//#region src/shared.ts
|
|
37
|
+
//#region src/hooks/shared.ts
|
|
38
38
|
/**
|
|
39
39
|
* Shared utilities for MAXSIM hooks.
|
|
40
40
|
*/
|
|
@@ -56,7 +56,7 @@ function readStdinJson(callback) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
//#endregion
|
|
59
|
-
//#region src/maxsim-context-monitor.ts
|
|
59
|
+
//#region src/hooks/maxsim-context-monitor.ts
|
|
60
60
|
/**
|
|
61
61
|
* Context Monitor - PostToolUse hook
|
|
62
62
|
* Reads context metrics from the statusline bridge file and injects
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxsim-context-monitor.cjs","names":["os","path","fs"],"sources":["../../../src/hooks/shared.ts","../../../src/hooks/maxsim-context-monitor.ts"],"sourcesContent":["/**\n * Shared utilities for MAXSIM hooks.\n */\n\n/**\n * Read all stdin as a string, then invoke callback with parsed JSON.\n * Used by context-monitor and statusline hooks.\n */\nexport function readStdinJson<T>(callback: (data: T) => void): void {\n let input = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => (input += chunk));\n process.stdin.on('end', () => {\n try {\n const data = JSON.parse(input) as T;\n callback(data);\n } catch {\n // Silent fail -- never block hook execution\n process.exit(0);\n }\n });\n}\n\n/** The '.claude' path segment -- template marker replaced during install. */\nexport const CLAUDE_DIR = '.claude';\n","#!/usr/bin/env node\n/**\n * Context Monitor - PostToolUse hook\n * Reads context metrics from the statusline bridge file and injects\n * warnings when context usage is high.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { readStdinJson, CLAUDE_DIR } from './shared';\n\nexport const WARNING_THRESHOLD = 35; // remaining_percentage <= 35%\nexport const CRITICAL_THRESHOLD = 25; // remaining_percentage <= 25%\nexport const STALE_SECONDS = 60; // ignore metrics older than 60s\nexport const DEBOUNCE_CALLS = 5; // min tool uses between warnings\n\nexport interface ContextMonitorInput {\n session_id?: string;\n}\n\nexport interface ContextMonitorOutput {\n hookSpecificOutput: {\n hookEventName: string;\n additionalContext: string;\n };\n}\n\ninterface BridgeMetrics {\n session_id: string;\n remaining_percentage: number;\n used_pct: number;\n timestamp: number;\n}\n\ninterface WarnState {\n callsSinceWarn: number;\n lastLevel: string | null;\n}\n\nexport function processContextMonitor(data: ContextMonitorInput): ContextMonitorOutput | null {\n const sessionId = data.session_id;\n\n if (!sessionId) {\n return null;\n }\n\n const tmpDir = os.tmpdir();\n const metricsPath = path.join(tmpDir, `claude-ctx-${sessionId}.json`);\n\n // If no metrics file, this is a subagent or fresh session -- exit silently\n if (!fs.existsSync(metricsPath)) {\n return null;\n }\n\n const metrics: BridgeMetrics = JSON.parse(fs.readFileSync(metricsPath, 'utf8'));\n const now = Math.floor(Date.now() / 1000);\n\n // Ignore stale metrics\n if (metrics.timestamp && (now - metrics.timestamp) > STALE_SECONDS) {\n return null;\n }\n\n const remaining = metrics.remaining_percentage;\n const usedPct = metrics.used_pct;\n\n // No warning needed\n if (remaining > WARNING_THRESHOLD) {\n return null;\n }\n\n // Debounce: check if we warned recently\n const warnPath = path.join(tmpDir, `claude-ctx-${sessionId}-warned.json`);\n let warnData: WarnState = { callsSinceWarn: 0, lastLevel: null };\n let firstWarn = true;\n\n if (fs.existsSync(warnPath)) {\n try {\n warnData = JSON.parse(fs.readFileSync(warnPath, 'utf8'));\n firstWarn = false;\n } catch {\n // Corrupted file, reset\n }\n }\n\n warnData.callsSinceWarn = (warnData.callsSinceWarn || 0) + 1;\n\n const isCritical = remaining <= CRITICAL_THRESHOLD;\n const currentLevel = isCritical ? 'critical' : 'warning';\n\n // Emit immediately on first warning, then debounce subsequent ones\n // Severity escalation (WARNING -> CRITICAL) bypasses debounce\n const severityEscalated = currentLevel === 'critical' && warnData.lastLevel === 'warning';\n if (!firstWarn && warnData.callsSinceWarn < DEBOUNCE_CALLS && !severityEscalated) {\n // Update counter and exit without warning\n fs.writeFileSync(warnPath, JSON.stringify(warnData));\n return null;\n }\n\n // Reset debounce counter\n warnData.callsSinceWarn = 0;\n warnData.lastLevel = currentLevel;\n fs.writeFileSync(warnPath, JSON.stringify(warnData));\n\n // Build warning message\n let message: string;\n if (isCritical) {\n message = `CONTEXT MONITOR CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +\n 'STOP new work immediately. Save state NOW and inform the user that context is nearly exhausted. ' +\n 'If using MAXSIM, run /maxsim:pause-work to save execution state.';\n } else {\n message = `CONTEXT MONITOR WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. ` +\n 'Begin wrapping up current task. Do not start new complex work. ' +\n 'If using MAXSIM, consider /maxsim:pause-work to save state.';\n }\n\n return {\n hookSpecificOutput: {\n hookEventName: 'PostToolUse',\n additionalContext: message,\n },\n };\n}\n\n// Standalone entry\nif (require.main === module) {\n readStdinJson<ContextMonitorInput>((data) => {\n const result = processContextMonitor(data);\n if (result) {\n process.stdout.write(JSON.stringify(result));\n }\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,SAAgB,cAAiB,UAAmC;CAClE,IAAI,QAAQ;AACZ,SAAQ,MAAM,YAAY,OAAO;AACjC,SAAQ,MAAM,GAAG,SAAS,UAAmB,SAAS,MAAO;AAC7D,SAAQ,MAAM,GAAG,aAAa;AAC5B,MAAI;AAEF,YADa,KAAK,MAAM,MAAM,CAChB;UACR;AAEN,WAAQ,KAAK,EAAE;;GAEjB;;;;;;;;;;ACRJ,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,gBAAgB;AAC7B,MAAa,iBAAiB;AAyB9B,SAAgB,sBAAsB,MAAwD;CAC5F,MAAM,YAAY,KAAK;AAEvB,KAAI,CAAC,UACH,QAAO;CAGT,MAAM,SAASA,QAAG,QAAQ;CAC1B,MAAM,cAAcC,UAAK,KAAK,QAAQ,cAAc,UAAU,OAAO;AAGrE,KAAI,CAACC,QAAG,WAAW,YAAY,CAC7B,QAAO;CAGT,MAAM,UAAyB,KAAK,MAAMA,QAAG,aAAa,aAAa,OAAO,CAAC;CAC/E,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AAGzC,KAAI,QAAQ,aAAc,MAAM,QAAQ,YAAa,cACnD,QAAO;CAGT,MAAM,YAAY,QAAQ;CAC1B,MAAM,UAAU,QAAQ;AAGxB,KAAI,YAAY,kBACd,QAAO;CAIT,MAAM,WAAWD,UAAK,KAAK,QAAQ,cAAc,UAAU,cAAc;CACzE,IAAI,WAAsB;EAAE,gBAAgB;EAAG,WAAW;EAAM;CAChE,IAAI,YAAY;AAEhB,KAAIC,QAAG,WAAW,SAAS,CACzB,KAAI;AACF,aAAW,KAAK,MAAMA,QAAG,aAAa,UAAU,OAAO,CAAC;AACxD,cAAY;SACN;AAKV,UAAS,kBAAkB,SAAS,kBAAkB,KAAK;CAE3D,MAAM,aAAa,aAAa;CAChC,MAAM,eAAe,aAAa,aAAa;CAI/C,MAAM,oBAAoB,iBAAiB,cAAc,SAAS,cAAc;AAChF,KAAI,CAAC,aAAa,SAAS,iBAAiB,kBAAkB,CAAC,mBAAmB;AAEhF,UAAG,cAAc,UAAU,KAAK,UAAU,SAAS,CAAC;AACpD,SAAO;;AAIT,UAAS,iBAAiB;AAC1B,UAAS,YAAY;AACrB,SAAG,cAAc,UAAU,KAAK,UAAU,SAAS,CAAC;CAGpD,IAAI;AACJ,KAAI,WACF,WAAU,sCAAsC,QAAQ,gBAAgB,UAAU;KAIlF,WAAU,qCAAqC,QAAQ,gBAAgB,UAAU;AAKnF,QAAO,EACL,oBAAoB;EAClB,eAAe;EACf,mBAAmB;EACpB,EACF;;AAIH,IAAI,QAAQ,SAAS,OACnB,gBAAoC,SAAS;CAC3C,MAAM,SAAS,sBAAsB,KAAK;AAC1C,KAAI,OACF,SAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,CAAC;EAE9C"}
|
|
@@ -34,7 +34,7 @@ node_path = __toESM(node_path);
|
|
|
34
34
|
let node_os = require("node:os");
|
|
35
35
|
node_os = __toESM(node_os);
|
|
36
36
|
|
|
37
|
-
//#region src/shared.ts
|
|
37
|
+
//#region src/hooks/shared.ts
|
|
38
38
|
/**
|
|
39
39
|
* Shared utilities for MAXSIM hooks.
|
|
40
40
|
*/
|
|
@@ -58,7 +58,7 @@ function readStdinJson(callback) {
|
|
|
58
58
|
const CLAUDE_DIR = ".claude";
|
|
59
59
|
|
|
60
60
|
//#endregion
|
|
61
|
-
//#region src/maxsim-statusline.ts
|
|
61
|
+
//#region src/hooks/maxsim-statusline.ts
|
|
62
62
|
/**
|
|
63
63
|
* Claude Code Statusline - MAXSIM Edition
|
|
64
64
|
* Shows: model | current task | directory | context usage
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maxsim-statusline.cjs","names":["path","os","fs"],"sources":["../../../src/hooks/shared.ts","../../../src/hooks/maxsim-statusline.ts"],"sourcesContent":["/**\n * Shared utilities for MAXSIM hooks.\n */\n\n/**\n * Read all stdin as a string, then invoke callback with parsed JSON.\n * Used by context-monitor and statusline hooks.\n */\nexport function readStdinJson<T>(callback: (data: T) => void): void {\n let input = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (chunk: string) => (input += chunk));\n process.stdin.on('end', () => {\n try {\n const data = JSON.parse(input) as T;\n callback(data);\n } catch {\n // Silent fail -- never block hook execution\n process.exit(0);\n }\n });\n}\n\n/** The '.claude' path segment -- template marker replaced during install. */\nexport const CLAUDE_DIR = '.claude';\n","#!/usr/bin/env node\n/**\n * Claude Code Statusline - MAXSIM Edition\n * Shows: model | current task | directory | context usage\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { readStdinJson, CLAUDE_DIR } from './shared';\n\nexport interface StatuslineInput {\n model?: { display_name?: string };\n workspace?: { current_dir?: string };\n session_id?: string;\n context_window?: { remaining_percentage?: number };\n}\n\nexport function formatStatusline(data: StatuslineInput): string {\n const model = data.model?.display_name || 'Claude';\n const dir = data.workspace?.current_dir || process.cwd();\n const session = data.session_id || '';\n const remaining = data.context_window?.remaining_percentage;\n\n // Context window display (shows USED percentage scaled to 80% limit)\n let ctx = '';\n if (remaining != null) {\n const rem = Math.round(remaining);\n const rawUsed = Math.max(0, Math.min(100, 100 - rem));\n // Scale: 80% real usage = 100% displayed\n const used = Math.min(100, Math.round((rawUsed / 80) * 100));\n\n // Write context metrics to bridge file for the context-monitor PostToolUse hook.\n if (session) {\n try {\n const bridgePath = path.join(os.tmpdir(), `claude-ctx-${session}.json`);\n const bridgeData = JSON.stringify({\n session_id: session,\n remaining_percentage: remaining,\n used_pct: used,\n timestamp: Math.floor(Date.now() / 1000),\n });\n fs.writeFileSync(bridgePath, bridgeData);\n } catch {\n // Silent fail -- bridge is best-effort, don't break statusline\n }\n }\n\n // Build progress bar (10 segments)\n const filled = Math.floor(used / 10);\n const bar = '\\u2588'.repeat(filled) + '\\u2591'.repeat(10 - filled);\n\n // Color based on scaled usage\n if (used < 63) {\n ctx = ` \\x1b[32m${bar} ${used}%\\x1b[0m`;\n } else if (used < 81) {\n ctx = ` \\x1b[33m${bar} ${used}%\\x1b[0m`;\n } else if (used < 95) {\n ctx = ` \\x1b[38;5;208m${bar} ${used}%\\x1b[0m`;\n } else {\n ctx = ` \\x1b[5;31m\\uD83D\\uDC80 ${bar} ${used}%\\x1b[0m`;\n }\n }\n\n // Current task from todos\n let task = '';\n const homeDir = os.homedir();\n const todosDir = path.join(homeDir, CLAUDE_DIR, 'todos');\n if (session && fs.existsSync(todosDir)) {\n try {\n const files = fs.readdirSync(todosDir)\n .filter((f: string) => f.startsWith(session) && f.includes('-agent-') && f.endsWith('.json'))\n .map((f: string) => ({ name: f, mtime: fs.statSync(path.join(todosDir, f)).mtime }))\n .sort((a: { mtime: Date }, b: { mtime: Date }) => b.mtime.getTime() - a.mtime.getTime());\n\n if (files.length > 0) {\n try {\n const todos = JSON.parse(fs.readFileSync(path.join(todosDir, files[0].name), 'utf8'));\n const inProgress = todos.find((t: { status: string; activeForm?: string }) => t.status === 'in_progress');\n if (inProgress) task = inProgress.activeForm || '';\n } catch {\n // ignore\n }\n }\n } catch {\n // Silently fail on file system errors - don't break statusline\n }\n }\n\n // MAXSIM update available?\n let maxsimUpdate = '';\n const cacheFile = path.join(homeDir, CLAUDE_DIR, 'cache', 'maxsim-update-check.json');\n if (fs.existsSync(cacheFile)) {\n try {\n const cache = JSON.parse(fs.readFileSync(cacheFile, 'utf8'));\n if (cache.update_available) {\n maxsimUpdate = '\\x1b[33m\\u2B06 /maxsim:update\\x1b[0m \\u2502 ';\n }\n } catch {\n // ignore\n }\n }\n\n // Output\n const dirname = path.basename(dir);\n if (task) {\n return `${maxsimUpdate}\\x1b[2m${model}\\x1b[0m \\u2502 \\x1b[1m${task}\\x1b[0m \\u2502 \\x1b[2m${dirname}\\x1b[0m${ctx}`;\n } else {\n return `${maxsimUpdate}\\x1b[2m${model}\\x1b[0m \\u2502 \\x1b[2m${dirname}\\x1b[0m${ctx}`;\n }\n}\n\n// Standalone entry\nif (require.main === module) {\n readStdinJson<StatuslineInput>((data) => {\n process.stdout.write(formatStatusline(data));\n });\n}\n"],"mappings":"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"}
|