@codemieai/code 0.9.0 → 0.10.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.
Files changed (123) hide show
  1. package/README.md +12 -0
  2. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  3. package/dist/agents/core/AgentCLI.js +7 -1
  4. package/dist/agents/core/AgentCLI.js.map +1 -1
  5. package/dist/agents/core/BaseAgentAdapter.d.ts +8 -1
  6. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  7. package/dist/agents/core/BaseAgentAdapter.js +57 -1
  8. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  9. package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -1
  10. package/dist/agents/core/session/session-origin-audit.js +18 -8
  11. package/dist/agents/core/session/session-origin-audit.js.map +1 -1
  12. package/dist/agents/core/types.d.ts +7 -1
  13. package/dist/agents/core/types.d.ts.map +1 -1
  14. package/dist/agents/plugins/claude/claude.plugin.d.ts +9 -1
  15. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  16. package/dist/agents/plugins/claude/claude.plugin.js +42 -83
  17. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  18. package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +301 -0
  19. package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +25 -2
  20. package/dist/agents/plugins/claude/plugin/statusline.mjs +147 -93
  21. package/dist/agents/plugins/claude/statusline-installer.d.ts +5 -2
  22. package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
  23. package/dist/agents/plugins/claude/statusline-installer.js +12 -59
  24. package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
  25. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  26. package/dist/agents/plugins/codex/codex.plugin.js +4 -3
  27. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  28. package/dist/agents/plugins/kimi/kimi.plugin.d.ts +1 -1
  29. package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -1
  30. package/dist/agents/plugins/kimi/kimi.plugin.js +3 -2
  31. package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -1
  32. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
  33. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +5 -1
  34. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  35. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -1
  36. package/dist/agents/plugins/opencode/opencode-model-configs.js +29 -0
  37. package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -1
  38. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
  39. package/dist/agents/plugins/opencode/opencode.plugin.js +1 -0
  40. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
  41. package/dist/bin/proxy-daemon.js +3 -1
  42. package/dist/bin/proxy-daemon.js.map +1 -1
  43. package/dist/cli/commands/analytics/data-loader.d.ts +11 -3
  44. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  45. package/dist/cli/commands/analytics/data-loader.js +33 -6
  46. package/dist/cli/commands/analytics/data-loader.js.map +1 -1
  47. package/dist/cli/commands/analytics/index.d.ts +3 -0
  48. package/dist/cli/commands/analytics/index.d.ts.map +1 -1
  49. package/dist/cli/commands/analytics/index.js +25 -7
  50. package/dist/cli/commands/analytics/index.js.map +1 -1
  51. package/dist/cli/commands/analytics/report/payload-builder.d.ts +3 -0
  52. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  53. package/dist/cli/commands/analytics/report/payload-builder.js +3 -0
  54. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  55. package/dist/cli/commands/analytics/report/report-generator.d.ts +3 -2
  56. package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -1
  57. package/dist/cli/commands/analytics/report/report-generator.js +9 -4
  58. package/dist/cli/commands/analytics/report/report-generator.js.map +1 -1
  59. package/dist/cli/commands/analytics/report/session-report.d.ts +24 -0
  60. package/dist/cli/commands/analytics/report/session-report.d.ts.map +1 -0
  61. package/dist/cli/commands/analytics/report/session-report.js +50 -0
  62. package/dist/cli/commands/analytics/report/session-report.js.map +1 -0
  63. package/dist/cli/commands/analytics/report/types.d.ts +3 -0
  64. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  65. package/dist/cli/commands/analytics/sources/sessions-source.js +3 -1
  66. package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -1
  67. package/dist/cli/commands/analytics/sources/types.d.ts +2 -0
  68. package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -1
  69. package/dist/cli/commands/analytics/types.d.ts +2 -0
  70. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  71. package/dist/cli/commands/hook.d.ts.map +1 -1
  72. package/dist/cli/commands/hook.js +8 -0
  73. package/dist/cli/commands/hook.js.map +1 -1
  74. package/dist/cli/commands/install.d.ts.map +1 -1
  75. package/dist/cli/commands/install.js +26 -17
  76. package/dist/cli/commands/install.js.map +1 -1
  77. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts +20 -0
  78. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -0
  79. package/dist/cli/commands/proxy/connectors/vscode-models.js +262 -0
  80. package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -0
  81. package/dist/cli/commands/proxy/connectors/vscode.d.ts +9 -0
  82. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -0
  83. package/dist/cli/commands/proxy/connectors/vscode.js +187 -0
  84. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -0
  85. package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
  86. package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
  87. package/dist/cli/commands/proxy/daemon-manager.js +2 -0
  88. package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
  89. package/dist/cli/commands/proxy/health-check.js +1 -1
  90. package/dist/cli/commands/proxy/health-check.js.map +1 -1
  91. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  92. package/dist/cli/commands/proxy/index.js +210 -33
  93. package/dist/cli/commands/proxy/index.js.map +1 -1
  94. package/dist/cli/index.js +5 -1
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/env/types.d.ts +0 -1
  97. package/dist/env/types.d.ts.map +1 -1
  98. package/dist/env/types.js.map +1 -1
  99. package/dist/providers/integration/setup-ui.d.ts +1 -1
  100. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  101. package/dist/providers/integration/setup-ui.js.map +1 -1
  102. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +16 -15
  103. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  104. package/dist/providers/plugins/sso/proxy/plugins/index.js +19 -17
  105. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  106. package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.d.ts +22 -0
  107. package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.d.ts.map +1 -0
  108. package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.js +69 -0
  109. package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.js.map +1 -0
  110. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  111. package/dist/providers/plugins/sso/sso.auth.js +10 -1
  112. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  113. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
  114. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +3 -1
  115. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
  116. package/dist/utils/auth.js +1 -1
  117. package/dist/utils/auth.js.map +1 -1
  118. package/dist/utils/config.d.ts.map +1 -1
  119. package/dist/utils/config.js +9 -5
  120. package/dist/utils/config.js.map +1 -1
  121. package/package.json +5 -3
  122. package/scripts/postinstall.mjs +14 -2
  123. package/scripts/validate-secrets.js +14 -5
@@ -3,6 +3,13 @@ import { BaseAgentAdapter } from '../../core/BaseAgentAdapter.js';
3
3
  import type { SessionAdapter } from '../../core/session/BaseSessionAdapter.js';
4
4
  import type { BaseExtensionInstaller } from '../../core/extension/BaseExtensionInstaller.js';
5
5
  import { type InstallationMethod } from '../../../utils/installation-detector.js';
6
+ /**
7
+ * Supported Claude Code version
8
+ * Latest version tested and verified with CodeMie backend
9
+ *
10
+ * **UPDATE THIS WHEN BUMPING CLAUDE VERSION**
11
+ */
12
+ export declare const CLAUDE_SUPPORTED_VERSION = "2.1.218";
6
13
  /**
7
14
  * Claude Code Plugin Metadata
8
15
  */
@@ -34,6 +41,7 @@ export declare class ClaudePlugin extends BaseAgentAdapter {
34
41
  *
35
42
  * @returns Version string or null if not installed
36
43
  */
44
+ private execVersionAtFullPath;
37
45
  getVersion(): Promise<string | null>;
38
46
  /**
39
47
  * Detect how Claude was installed (npm vs native)
@@ -69,7 +77,7 @@ export declare class ClaudePlugin extends BaseAgentAdapter {
69
77
  * @param version - Version string (e.g., '2.0.30', 'latest', 'supported')
70
78
  * @throws {AgentInstallationError} If installation fails
71
79
  */
72
- installVersion(version?: string): Promise<void>;
80
+ installVersion(version?: string): Promise<string | null>;
73
81
  /**
74
82
  * Additional installation steps for Claude Code
75
83
  * Handles optional features like sounds installation
@@ -1 +1 @@
1
- {"version":3,"file":"claude.plugin.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/claude/claude.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAY7F,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yCAAyC,CAAC;AAkCjD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aA+OlC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,kBAAkB,CAAyB;;IAUnD;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAI7B,sBAAsB,CAC1B,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC;IAejC;;;OAGG;IACH,qBAAqB,IAAI,sBAAsB;IAI/C;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA0C1C;;;;;OAKG;IACG,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAQ1D;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BrC;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;;;;;;;;OAUG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6GrD;;;;;OAKG;IACG,sBAAsB,CAAC,OAAO,CAAC,EAAE,OAAO,qBAAqB,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuC9G"}
1
+ {"version":3,"file":"claude.plugin.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/claude/claude.plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAY7F,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,yCAAyC,CAAC;AAMjD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAsBlD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAsMlC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,kBAAkB,CAAyB;;IAUnD;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAI7B,sBAAsB,CAC1B,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC;IAejC;;;OAGG;IACH,qBAAqB,IAAI,sBAAsB;IAI/C;;;;;;;;;OASG;YACW,qBAAqB;IAc7B,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8B1C;;;;;OAKG;IACG,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAQ1D;;;;;;OAMG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;;;;;;;;;OAUG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+G9D;;;;;OAKG;IACG,sBAAsB,CAAC,OAAO,CAAC,EAAE,OAAO,qBAAqB,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuC9G"}
@@ -7,7 +7,7 @@ import { AgentInstallationError, createErrorContext, getErrorMessage, } from '..
7
7
  import { logger } from '../../../utils/logger.js';
8
8
  import { sanitizeLogArgs } from '../../../utils/security.js';
9
9
  import chalk from 'chalk';
10
- import { resolveHomeDir, getDirname } from '../../../utils/paths.js';
10
+ import { resolveHomeDir } from '../../../utils/paths.js';
11
11
  import { detectInstallationMethod, } from '../../../utils/installation-detector.js';
12
12
  // Module-level flag to track statusline management within a session.
13
13
  // Using module scope (not env var) avoids leaking internal state into subprocess environments.
@@ -18,16 +18,16 @@ let statuslineManagedThisSession = false;
18
18
  *
19
19
  * **UPDATE THIS WHEN BUMPING CLAUDE VERSION**
20
20
  */
21
- const CLAUDE_SUPPORTED_VERSION = '2.1.199';
21
+ export const CLAUDE_SUPPORTED_VERSION = '2.1.218';
22
22
  /**
23
23
  * Minimum supported Claude Code version
24
24
  * Versions below this are known to be incompatible and will be blocked from starting
25
25
  * Rule: always 10 patch versions below CLAUDE_SUPPORTED_VERSION
26
- * e.g. supported = 2.1.199 → minimum = 2.1.189
26
+ * e.g. supported = 2.1.218 → minimum = 2.1.208
27
27
  *
28
28
  * **UPDATE THIS WHEN BUMPING CLAUDE VERSION**
29
29
  */
30
- const CLAUDE_MINIMUM_SUPPORTED_VERSION = '2.1.189';
30
+ const CLAUDE_MINIMUM_SUPPORTED_VERSION = '2.1.208';
31
31
  /**
32
32
  * Claude Code installer URLs
33
33
  * Official Anthropic installer scripts for native installation
@@ -46,6 +46,7 @@ export const ClaudePluginMetadata = {
46
46
  description: 'Claude Code - official Anthropic CLI tool',
47
47
  npmPackage: '@anthropic-ai/claude-code',
48
48
  cliCommand: 'claude',
49
+ sessionAnalyticsReport: true,
49
50
  // Version management configuration
50
51
  supportedVersion: CLAUDE_SUPPORTED_VERSION, // Latest version tested with CodeMie backend
51
52
  minimumSupportedVersion: CLAUDE_MINIMUM_SUPPORTED_VERSION, // Minimum version required to run
@@ -161,55 +162,22 @@ export const ClaudePluginMetadata = {
161
162
  }
162
163
  env.CLAUDE_AUTOCOMPACT_PCT_OVERRIDE = String(autocompactPct);
163
164
  }
164
- // Statusline setup: when --status flag is passed, configure Claude Code
165
- // status bar with a multi-line display showing model, context, git, cost
165
+ // Statusline setup: when --status is passed, ensure the CodeMie statusline is
166
+ // installed — the same installer `codemie install statusline` uses, so there is
167
+ // exactly one statusline implementation instead of a separate duplicated one here.
166
168
  // https://code.claude.com/docs/en/statusline
167
169
  if (env.CODEMIE_STATUS === '1') {
168
- const { writeFile, readFile, mkdir, chmod } = await import('fs/promises');
169
- const { existsSync } = await import('fs');
170
- const { join } = await import('path');
171
- const claudeHome = resolveHomeDir('.claude');
172
- const scriptPath = join(claudeHome, 'codemie-statusline.mjs');
173
- const settingsPath = join(claudeHome, 'settings.json');
174
- // Read the statusline script from the compiled output directory
175
- const scriptContent = await readFile(join(getDirname(import.meta.url), 'plugin/codemie-statusline.mjs'), 'utf-8');
176
- // Ensure ~/.claude directory exists
177
- if (!existsSync(claudeHome)) {
178
- await mkdir(claudeHome, { recursive: true });
179
- }
180
- // Write script (always update to latest version)
181
- await writeFile(scriptPath, scriptContent, 'utf-8');
182
- // Make script executable on Unix systems
183
- if (process.platform !== 'win32') {
184
- await chmod(scriptPath, 0o755);
185
- }
186
- // Inject statusLine into ~/.claude/settings.json if not already configured
187
- let settings = {};
188
- if (existsSync(settingsPath)) {
189
- try {
190
- const raw = await readFile(settingsPath, 'utf-8');
191
- settings = JSON.parse(raw);
192
- }
193
- catch (parseError) {
194
- // Abort injection to prevent overwriting potentially valid settings
195
- // that are temporarily unreadable (e.g., concurrent write, partial flush)
196
- logger.warn('[Claude] Could not parse settings.json, skipping statusline injection to avoid data loss', ...sanitizeLogArgs({
197
- settingsPath,
198
- error: parseError instanceof Error ? parseError.message : String(parseError),
199
- }));
200
- return env;
201
- }
170
+ try {
171
+ const { installStatusline } = await import('./statusline-installer.js');
172
+ const { alreadyConfigured } = await installStatusline();
173
+ // Only clean up on afterRun if THIS session enabled it — a persistent
174
+ // `codemie install statusline` setup must survive after the session ends.
175
+ statuslineManagedThisSession = !alreadyConfigured;
202
176
  }
203
- if (!settings.statusLine) {
204
- settings.statusLine = {
205
- type: 'command',
206
- // Quote the path to handle spaces in home directory (e.g. /Users/John Doe/)
207
- command: `node "${scriptPath}"`,
208
- };
209
- await writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
210
- // Use module-level flag (not env var) to avoid leaking into subprocess env
211
- statuslineManagedThisSession = true;
212
- logger.debug('[Claude] Statusline configured', { scriptPath });
177
+ catch (error) {
178
+ logger.warn('[Claude] Failed to configure statusline via --status flag', ...sanitizeLogArgs({
179
+ error: error instanceof Error ? error.message : String(error),
180
+ }));
213
181
  }
214
182
  }
215
183
  return env;
@@ -292,32 +260,37 @@ export class ClaudePlugin extends BaseAgentAdapter {
292
260
  *
293
261
  * @returns Version string or null if not installed
294
262
  */
263
+ async execVersionAtFullPath() {
264
+ if (process.platform === 'win32')
265
+ return null;
266
+ const { exec } = await import('../../../utils/processes.js');
267
+ const fullPath = resolveHomeDir('.local/bin/claude');
268
+ try {
269
+ const result = await exec(fullPath, ['--version']);
270
+ if (result.code !== 0)
271
+ return null;
272
+ const trimmed = result.stdout.trim();
273
+ return trimmed.length > 0 ? trimmed : null;
274
+ }
275
+ catch {
276
+ return null;
277
+ }
278
+ }
295
279
  async getVersion() {
296
280
  if (!this.metadata.cliCommand) {
297
281
  return null;
298
282
  }
299
283
  const { exec } = await import('../../../utils/processes.js');
300
284
  // Try full path first on Unix systems (native installer places binary at ~/.local/bin/claude)
301
- if (process.platform !== 'win32') {
302
- const fullPath = resolveHomeDir('.local/bin/claude');
303
- try {
304
- const result = await exec(fullPath, ['--version']);
305
- // Parse version from output like '2.1.23 (Claude Code)'
306
- const versionMatch = result.stdout.trim().match(/^(\d+\.\d+\.\d+)/);
307
- if (versionMatch) {
308
- return versionMatch[1];
309
- }
310
- return result.stdout.trim();
311
- }
312
- catch {
313
- // Full path check failed, fall through to PATH check
314
- }
285
+ const fullPathOutput = await this.execVersionAtFullPath();
286
+ if (fullPathOutput !== null) {
287
+ const versionMatch = fullPathOutput.match(/^(\d+\.\d+\.\d+)/);
288
+ return versionMatch ? versionMatch[1] : fullPathOutput;
315
289
  }
316
290
  // Fall back to command in PATH (works for npm installations, Windows, etc.)
317
291
  try {
318
292
  const result = await exec(this.metadata.cliCommand, ['--version']);
319
293
  // Parse version from output like '2.1.23 (Claude Code)'
320
- // Extract just the version number
321
294
  const versionMatch = result.stdout.trim().match(/^(\d+\.\d+\.\d+)/);
322
295
  if (versionMatch) {
323
296
  return versionMatch[1];
@@ -351,26 +324,11 @@ export class ClaudePlugin extends BaseAgentAdapter {
351
324
  if (!this.metadata.cliCommand) {
352
325
  return true; // Built-in agents are always "installed"
353
326
  }
354
- // On Unix systems, check full path first (native installer places binary at ~/.local/bin/claude)
355
- // This avoids PATH issues where ~/.local/bin is not in user's PATH
356
- if (process.platform !== 'win32') {
357
- const fullPath = resolveHomeDir('.local/bin/claude');
358
- try {
359
- const { exec } = await import('../../../utils/processes.js');
360
- const result = await exec(fullPath, ['--version']);
361
- if (result.code === 0) {
362
- return true;
363
- }
364
- }
365
- catch {
366
- // Full path check failed, fall through to PATH check
367
- }
327
+ // On Unix, check full path first to avoid PATH issues
328
+ if (await this.execVersionAtFullPath() !== null) {
329
+ return true;
368
330
  }
369
331
  // Fall back to base implementation (checks if command is in PATH)
370
- // This handles:
371
- // 1. npm global installations (in PATH)
372
- // 2. Windows installations
373
- // 3. Other installation methods
374
332
  return super.isInstalled();
375
333
  }
376
334
  /**
@@ -459,6 +417,7 @@ export class ClaudePlugin extends BaseAgentAdapter {
459
417
  logger.info(`Try: 1) Restart your shell/terminal, or 2) Run: ${metadata.cliCommand} --version`);
460
418
  }
461
419
  }
420
+ return result.installedVersion ?? null;
462
421
  }
463
422
  /**
464
423
  * Additional installation steps for Claude Code
@@ -1 +1 @@
1
- {"version":3,"file":"claude.plugin.js","sourceRoot":"","sources":["../../../../src/agents/plugins/claude/claude.plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.plugin.js","sourceRoot":"","sources":["../../../../src/agents/plugins/claude/claude.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,301 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { resolve } from 'path';
3
+ import { pathToFileURL } from 'url';
4
+ import {
5
+ matchBudgetRow,
6
+ formatBudgetSegment,
7
+ extractBasicInfo,
8
+ formatDuration,
9
+ fmt,
10
+ buildStatusLine,
11
+ resolveBudget,
12
+ isMainModule,
13
+ ctxBar,
14
+ } from '../statusline.mjs';
15
+
16
+ const YELLOW = '\x1b[0;33m';
17
+ const GREEN = '\x1b[0;32m';
18
+ const RED = '\x1b[0;31m';
19
+
20
+ describe('matchBudgetRow', () => {
21
+ const rows = [
22
+ { project_name: 'nikita_levyankov@epam.com (cli)', current_spending: 500.26, total: 100.05, budget_reset_at: '2026-07-13T00:00:18.663000Z' },
23
+ { project_name: 'nikita_levyankov@epam.com', current_spending: 6.05, total: 5.04, budget_reset_at: '2026-07-17T09:30:34.278000Z' },
24
+ { project_name: 'nikita_levyankov@epam.com (premium)', current_spending: 24.93, total: 83.11, budget_reset_at: '2026-07-18T16:55:53.270000Z' },
25
+ ];
26
+
27
+ it('matches only the "(cli)" suffixed row for the given email', () => {
28
+ const row = matchBudgetRow(rows, 'nikita_levyankov@epam.com');
29
+ expect(row).toEqual(rows[0]);
30
+ });
31
+
32
+ it('returns null when no row matches the email', () => {
33
+ expect(matchBudgetRow(rows, 'someone-else@epam.com')).toBeNull();
34
+ });
35
+
36
+ it('returns null when rows is not an array', () => {
37
+ expect(matchBudgetRow(undefined, 'x@y.com')).toBeNull();
38
+ expect(matchBudgetRow(null, 'x@y.com')).toBeNull();
39
+ });
40
+
41
+ it('returns null when userEmail is falsy', () => {
42
+ expect(matchBudgetRow(rows, '')).toBeNull();
43
+ expect(matchBudgetRow(rows, undefined)).toBeNull();
44
+ });
45
+
46
+ it('matches regardless of email casing or surrounding whitespace', () => {
47
+ expect(matchBudgetRow(rows, 'Nikita_Levyankov@EPAM.com')).toEqual(rows[0]);
48
+ expect(matchBudgetRow(rows, ' nikita_levyankov@epam.com ')).toEqual(rows[0]);
49
+ });
50
+ });
51
+
52
+ describe('formatBudgetSegment', () => {
53
+ it('formats current spend, percentage, and reset date — never budget_limit', () => {
54
+ const row = { current_spending: 12.34, budget_limit: 999, total: 41, budget_reset_at: '2026-07-15T00:00:00.000Z' };
55
+ const result = formatBudgetSegment(row);
56
+ expect(result.text).toContain('$12.34');
57
+ expect(result.text).toContain('41%');
58
+ expect(result.text).not.toContain('999');
59
+ expect(result.pct).toBe(41);
60
+ });
61
+
62
+ it('returns null for a null row', () => {
63
+ expect(formatBudgetSegment(null)).toBeNull();
64
+ });
65
+ });
66
+
67
+ describe('extractBasicInfo', () => {
68
+ it('extracts model, project, context, cost, and duration from a full Claude Code payload', () => {
69
+ const ctx = {
70
+ workspace: { current_dir: '/Users/me/repos/my-project' },
71
+ model: { display_name: 'Claude Sonnet 5' },
72
+ context_window: { used_percentage: 42, total_input_tokens: 12345, total_output_tokens: 678 },
73
+ cost: { total_cost_usd: 1.2345, total_duration_ms: 125000 },
74
+ };
75
+ const info = extractBasicInfo(ctx);
76
+ expect(info.projectName).toBe('my-project');
77
+ expect(info.model).toBe('Claude Sonnet 5');
78
+ expect(info.ctxPct).toBe(42);
79
+ expect(info.tokIn).toBe(12345);
80
+ expect(info.tokOut).toBe(678);
81
+ expect(info.cost).toBe(1.2345);
82
+ expect(info.durationMs).toBe(125000);
83
+ });
84
+
85
+ it('returns safe defaults for an empty/malformed payload', () => {
86
+ const info = extractBasicInfo({});
87
+ expect(info.projectName).toBe('');
88
+ expect(info.model).toBe('');
89
+ expect(info.ctxPct).toBeNull();
90
+ expect(info.cost).toBeNull();
91
+ expect(info.durationMs).toBeNull();
92
+ });
93
+ });
94
+
95
+ describe('formatDuration', () => {
96
+ it('formats milliseconds as "Xm Ys"', () => {
97
+ expect(formatDuration(125000)).toBe('2m 5s');
98
+ });
99
+
100
+ it('returns null for null/undefined input', () => {
101
+ expect(formatDuration(null)).toBeNull();
102
+ expect(formatDuration(undefined)).toBeNull();
103
+ });
104
+
105
+ it('returns null instead of "NaNm NaNs" for non-numeric or negative input', () => {
106
+ expect(formatDuration(NaN)).toBeNull();
107
+ expect(formatDuration(-1)).toBeNull();
108
+ expect(formatDuration('not-a-number')).toBeNull();
109
+ });
110
+ });
111
+
112
+ describe('fmt', () => {
113
+ it('formats large numbers with k/M suffixes', () => {
114
+ expect(fmt(500)).toBe('500');
115
+ expect(fmt(1500)).toBe('1.5k');
116
+ expect(fmt(2_500_000)).toBe('2.5M');
117
+ });
118
+ });
119
+
120
+ describe('ctxBar', () => {
121
+ it('renders a 10-segment filled/empty bar plus the percentage', () => {
122
+ const bar = ctxBar(50);
123
+ expect(bar).toContain('50%');
124
+ expect(bar).toContain('█████░░░░░');
125
+ });
126
+
127
+ it('colors the bar green below 70%, yellow from 70-89%, red at 90%+', () => {
128
+ expect(ctxBar(50)).toContain(GREEN);
129
+ expect(ctxBar(75)).toContain(YELLOW);
130
+ expect(ctxBar(95)).toContain(RED);
131
+ });
132
+
133
+ it('returns null for non-numeric or missing input', () => {
134
+ expect(ctxBar(null)).toBeNull();
135
+ expect(ctxBar(undefined)).toBeNull();
136
+ expect(ctxBar(NaN)).toBeNull();
137
+ expect(ctxBar('not-a-number')).toBeNull();
138
+ });
139
+ });
140
+
141
+ describe('buildStatusLine', () => {
142
+ const basic = {
143
+ projectName: 'my-project', branch: 'main', model: 'Claude Sonnet 5',
144
+ ctxPct: 42, tokIn: 1000, tokOut: 200, cost: 1.5, durationMs: 65000,
145
+ };
146
+
147
+ it('always renders basic info (including session cost and duration) with no budget/profile', () => {
148
+ const line = buildStatusLine({ ...basic, budget: null, budgetError: null });
149
+ expect(line).not.toContain('⚠');
150
+ expect(line).toContain('$1.5000');
151
+ expect(line).toContain('1m 5s');
152
+ expect(line).toContain('[my-project]');
153
+ expect(line).toContain('(main)');
154
+ expect(line).toContain('[Claude Sonnet 5]');
155
+ });
156
+
157
+ it('renders the context-% as a colored bar, and the cost in its own distinct (yellow) color', () => {
158
+ const line = buildStatusLine({ ...basic, budget: null, budgetError: null });
159
+ expect(line).toContain('42%');
160
+ expect(line).toContain('████░░░░░░'); // 42% -> 4 filled segments
161
+ expect(line).toContain(`${YELLOW}$1.5000${'\x1b[0m'}`);
162
+ });
163
+
164
+ it('shows a minimal warning indicator (not blocking basic info) when the budget fetch fails', () => {
165
+ const line = buildStatusLine({ ...basic, budget: null, budgetError: 'reauthenticate' });
166
+ expect(line).toContain('⚠ reauthenticate');
167
+ expect(line).toContain('$1.5000');
168
+ expect(line).toContain('[my-project]');
169
+ });
170
+
171
+ it('shows the budget segment (and no warning) when budget resolves successfully', () => {
172
+ const line = buildStatusLine({ ...basic, budget: { text: '$12.34 (41%) resets 7/15/2026', pct: 41 }, budgetError: null });
173
+ expect(line).toContain('$12.34 (41%)');
174
+ expect(line).not.toContain('⚠');
175
+ });
176
+
177
+ it('does not throw and omits the cost segment when cost is non-numeric', () => {
178
+ expect(() => buildStatusLine({ ...basic, cost: 'not-a-number', budget: null, budgetError: null })).not.toThrow();
179
+ const line = buildStatusLine({ ...basic, cost: 'not-a-number', budget: null, budgetError: null });
180
+ expect(line).not.toContain('NaN');
181
+ expect(line).toContain('[my-project]'); // basic info still renders
182
+ });
183
+ });
184
+
185
+ describe('resolveBudget', () => {
186
+ it('skips silently (no error) when there is no CodeMie config at all', async () => {
187
+ const readFile = vi.fn().mockRejectedValue(new Error('ENOENT'));
188
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl: vi.fn(), getAuthHeadersImpl: vi.fn() });
189
+ expect(result).toEqual({ budget: null, budgetError: null });
190
+ });
191
+
192
+ it('skips silently when the profile is missing codeMieUrl/baseUrl/userEmail', async () => {
193
+ const readFile = vi.fn()
194
+ .mockRejectedValueOnce(new Error('no cache'))
195
+ .mockResolvedValueOnce(JSON.stringify({ activeProfile: 'default', profiles: { default: {} } }));
196
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl: vi.fn(), getAuthHeadersImpl: vi.fn() });
197
+ expect(result).toEqual({ budget: null, budgetError: null });
198
+ });
199
+
200
+ it('returns a "reauthenticate" error when no auth headers are available', async () => {
201
+ const readFile = vi.fn()
202
+ .mockRejectedValueOnce(new Error('no cache'))
203
+ .mockResolvedValueOnce(JSON.stringify({
204
+ activeProfile: 'default',
205
+ profiles: { default: { codeMieUrl: 'https://x', baseUrl: 'https://x/api', userEmail: 'me@x.com' } },
206
+ }));
207
+ const getAuthHeadersImpl = vi.fn().mockResolvedValue(null);
208
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl: vi.fn(), getAuthHeadersImpl });
209
+ expect(result).toEqual({ budget: null, budgetError: 'reauthenticate' });
210
+ });
211
+
212
+ it('returns the HTTP error message when the fetch fails', async () => {
213
+ const readFile = vi.fn()
214
+ .mockRejectedValueOnce(new Error('no cache'))
215
+ .mockResolvedValueOnce(JSON.stringify({
216
+ activeProfile: 'default',
217
+ profiles: { default: { codeMieUrl: 'https://x', baseUrl: 'https://x/api', userEmail: 'me@x.com' } },
218
+ }));
219
+ const getAuthHeadersImpl = vi.fn().mockResolvedValue({ cookie: 'a=b' });
220
+ const fetchImpl = vi.fn().mockResolvedValue({ ok: false, status: 500 });
221
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl, getAuthHeadersImpl });
222
+ expect(result).toEqual({ budget: null, budgetError: 'HTTP 500' });
223
+ });
224
+
225
+ it('resolves and caches the matched budget row on success', async () => {
226
+ const readFile = vi.fn()
227
+ .mockRejectedValueOnce(new Error('no cache'))
228
+ .mockResolvedValueOnce(JSON.stringify({
229
+ activeProfile: 'default',
230
+ profiles: { default: { codeMieUrl: 'https://x', baseUrl: 'https://x/api', userEmail: 'me@x.com' } },
231
+ }));
232
+ const getAuthHeadersImpl = vi.fn().mockResolvedValue({ cookie: 'a=b' });
233
+ const fetchImpl = vi.fn().mockResolvedValue({
234
+ ok: true,
235
+ json: async () => ({ data: { rows: [{ project_name: 'me@x.com (cli)', current_spending: 5, total: 10, budget_reset_at: '2026-07-15T00:00:00.000Z' }] } }),
236
+ });
237
+ const writeFile = vi.fn().mockResolvedValue(undefined);
238
+ const result = await resolveBudget({ readFile, writeFile, fetchImpl, getAuthHeadersImpl });
239
+ expect(result.budgetError).toBeNull();
240
+ expect(result.budget.text).toContain('$5.00');
241
+ expect(writeFile).toHaveBeenCalledWith(expect.stringContaining('budget-cache.json'), expect.any(String), 'utf8');
242
+ });
243
+
244
+ it('returns the fresh cached value without touching config/network when cache is fresh', async () => {
245
+ const readFile = vi.fn().mockResolvedValueOnce(JSON.stringify({ schema: 2, ts: Date.now(), value: { text: 'cached', pct: 5 } }));
246
+ const fetchImpl = vi.fn();
247
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl, getAuthHeadersImpl: vi.fn() });
248
+ expect(result).toEqual({ budget: { text: 'cached', pct: 5 }, budgetError: null });
249
+ expect(fetchImpl).not.toHaveBeenCalled();
250
+ });
251
+
252
+ it('treats a pre-upgrade string-shaped cache entry as a cache miss instead of using it', async () => {
253
+ // Old cache format: value was a plain string, not { text, pct }.
254
+ const readFile = vi.fn()
255
+ .mockResolvedValueOnce(JSON.stringify({ ts: Date.now(), value: '$5.00/$10 (50%)', pct: 50 }))
256
+ .mockRejectedValueOnce(new Error('no config'));
257
+ const fetchImpl = vi.fn();
258
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl, getAuthHeadersImpl: vi.fn() });
259
+ expect(result).toEqual({ budget: null, budgetError: null });
260
+ expect(fetchImpl).not.toHaveBeenCalled();
261
+ });
262
+
263
+ it('returns a graceful budgetError instead of an uncaught rejection when getAuthHeadersImpl throws', async () => {
264
+ const readFile = vi.fn()
265
+ .mockRejectedValueOnce(new Error('no cache'))
266
+ .mockResolvedValueOnce(JSON.stringify({
267
+ activeProfile: 'default',
268
+ profiles: { default: { codeMieUrl: 'https://x', baseUrl: 'https://x/api', userEmail: 'me@x.com' } },
269
+ }));
270
+ const getAuthHeadersImpl = vi.fn().mockRejectedValue(new Error('keychain locked'));
271
+ const result = await resolveBudget({ readFile, writeFile: vi.fn(), fetchImpl: vi.fn(), getAuthHeadersImpl });
272
+ expect(result).toEqual({ budget: null, budgetError: 'keychain locked' });
273
+ });
274
+ });
275
+
276
+ describe('isMainModule', () => {
277
+ // Build the file URL from a real, platform-resolved absolute path (via pathToFileURL)
278
+ // rather than hardcoding POSIX-style "file:///..." strings, so this test is symmetric
279
+ // on Windows too — fileURLToPath() decodes to a backslash-separated path there.
280
+ it('matches when the raw path equals the decoded file URL', () => {
281
+ const scriptPath = resolve('Users', 'me', 'script.mjs');
282
+ expect(isMainModule(scriptPath, pathToFileURL(scriptPath).href)).toBe(true);
283
+ });
284
+
285
+ it('matches even when the path contains spaces (percent-encoded in the URL)', () => {
286
+ const scriptPath = resolve('Users', 'John Doe', '.claude', 'codemie-budget-status.js');
287
+ expect(isMainModule(scriptPath, pathToFileURL(scriptPath).href)).toBe(true);
288
+ });
289
+
290
+ it('returns false for a different path', () => {
291
+ const scriptPath = resolve('Users', 'me', 'script.mjs');
292
+ const otherPath = resolve('Users', 'me', 'other.mjs');
293
+ expect(isMainModule(otherPath, pathToFileURL(scriptPath).href)).toBe(false);
294
+ });
295
+
296
+ it('returns false when argv1 is falsy', () => {
297
+ const url = pathToFileURL(resolve('Users', 'me', 'script.mjs')).href;
298
+ expect(isMainModule('', url)).toBe(false);
299
+ expect(isMainModule(undefined, url)).toBe(false);
300
+ });
301
+ });
@@ -627,6 +627,15 @@ async function cmdSharepoint(args) {
627
627
  const token = await getValidToken();
628
628
  const limit = parseInt(args.limit) || 20;
629
629
 
630
+ if (args.resolveSite) {
631
+ const data = await graphGet(`/sites/${args.resolveSite}`, token, { $select: 'id,displayName,webUrl' });
632
+ if (args.json) { console.log(JSON.stringify(data, null, 2)); return; }
633
+ console.log(`ID : ${data.id}`);
634
+ console.log(`Name: ${data.displayName || 'N/A'}`);
635
+ console.log(`URL : ${data.webUrl || 'N/A'}`);
636
+ return;
637
+ }
638
+
630
639
  if (args.sites) {
631
640
  let data = await graphGet('/me/followedSites', token, { $select: 'id,displayName,webUrl' });
632
641
  let sites = data.value || [];
@@ -671,7 +680,19 @@ async function cmdSharepoint(args) {
671
680
  return;
672
681
  }
673
682
 
674
- console.log('SharePoint: --sites | --site SITE_ID [--path PATH] | --download ITEM_ID [--output FILE]');
683
+ if (args.siteFile) {
684
+ if (!args.path) { console.error('Error: --site-file requires --path FILE_PATH'); process.exit(1); }
685
+ const outPath = args.output || path.basename(args.path);
686
+ const content = await graphDownload(`/sites/${args.siteFile}/drive/root:/${args.path}:/content`, token);
687
+ fs.writeFileSync(outPath, content);
688
+ console.log(`Downloaded ${content.length} bytes to ${outPath}`);
689
+ return;
690
+ }
691
+
692
+ console.log('SharePoint: --resolve-site HOSTNAME_PATH');
693
+ console.log(' --sites | --site SITE_ID [--path PATH]');
694
+ console.log(' --download ITEM_ID [--output FILE]');
695
+ console.log(' --site-file SITE_ID --path FILE_PATH [--output LOCAL_PATH]');
675
696
  }
676
697
 
677
698
  async function cmdTeams(args) {
@@ -1638,7 +1659,9 @@ Data:
1638
1659
  calendar [--limit N] [--json]
1639
1660
  [--create TITLE --start DT --end DT [--location L] [--timezone TZ]]
1640
1661
  [--availability --start DT --end DT]
1641
- sharepoint [--sites] [--site ID [--path P]] [--download ID [--output FILE]] [--json]
1662
+ sharepoint [--resolve-site HOSTNAME_PATH]
1663
+ [--sites] [--site ID [--path P]] [--download ID [--output FILE]]
1664
+ [--site-file SITE_ID --path FILE_PATH [--output LOCAL_PATH]] [--json]
1642
1665
  teams [--chats] [--messages CHAT_ID] [--send MSG --chat-id ID] [--teams-list]
1643
1666
  [--lookup-user EMAIL] [--dm EMAIL --send MSG] [--json]
1644
1667
  channels --team-id ID --list