@codemieai/code 0.8.0 → 0.10.0

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 (193) hide show
  1. package/README.md +12 -0
  2. package/dist/agents/core/AgentCLI.d.ts +4 -1
  3. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  4. package/dist/agents/core/AgentCLI.js +113 -6
  5. package/dist/agents/core/AgentCLI.js.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.d.ts +8 -1
  7. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  8. package/dist/agents/core/BaseAgentAdapter.js +57 -1
  9. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  10. package/dist/agents/core/session/session-origin-audit.d.ts +4 -0
  11. package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -0
  12. package/dist/agents/core/session/session-origin-audit.js +67 -0
  13. package/dist/agents/core/session/session-origin-audit.js.map +1 -0
  14. package/dist/agents/core/session/session-ownership.d.ts +2 -0
  15. package/dist/agents/core/session/session-ownership.d.ts.map +1 -0
  16. package/dist/agents/core/session/session-ownership.js +27 -0
  17. package/dist/agents/core/session/session-ownership.js.map +1 -0
  18. package/dist/agents/core/types.d.ts +33 -1
  19. package/dist/agents/core/types.d.ts.map +1 -1
  20. package/dist/agents/plugins/claude/claude.plugin.d.ts +11 -2
  21. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  22. package/dist/agents/plugins/claude/claude.plugin.js +55 -83
  23. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  24. package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +301 -0
  25. package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +25 -2
  26. package/dist/agents/plugins/claude/plugin/statusline.mjs +147 -93
  27. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  28. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +2 -0
  29. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  30. package/dist/agents/plugins/claude/statusline-installer.d.ts +5 -2
  31. package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
  32. package/dist/agents/plugins/claude/statusline-installer.js +12 -59
  33. package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
  34. package/dist/agents/plugins/codex/codex.plugin.d.ts +8 -0
  35. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  36. package/dist/agents/plugins/codex/codex.plugin.js +18 -3
  37. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  38. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.d.ts.map +1 -1
  39. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js +2 -0
  40. package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js.map +1 -1
  41. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.d.ts.map +1 -1
  42. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js +2 -0
  43. package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js.map +1 -1
  44. package/dist/agents/plugins/kimi/kimi.plugin.d.ts +1 -1
  45. package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -1
  46. package/dist/agents/plugins/kimi/kimi.plugin.js +3 -2
  47. package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -1
  48. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
  49. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +5 -1
  50. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  51. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -1
  52. package/dist/agents/plugins/opencode/opencode-model-configs.js +29 -0
  53. package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -1
  54. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
  55. package/dist/agents/plugins/opencode/opencode.plugin.js +1 -0
  56. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
  57. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -1
  58. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +2 -0
  59. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -1
  60. package/dist/bin/proxy-daemon.js +3 -1
  61. package/dist/bin/proxy-daemon.js.map +1 -1
  62. package/dist/cli/commands/analytics/data-loader.d.ts +11 -3
  63. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  64. package/dist/cli/commands/analytics/data-loader.js +33 -6
  65. package/dist/cli/commands/analytics/data-loader.js.map +1 -1
  66. package/dist/cli/commands/analytics/formatter.d.ts.map +1 -1
  67. package/dist/cli/commands/analytics/formatter.js +4 -1
  68. package/dist/cli/commands/analytics/formatter.js.map +1 -1
  69. package/dist/cli/commands/analytics/index.d.ts +3 -0
  70. package/dist/cli/commands/analytics/index.d.ts.map +1 -1
  71. package/dist/cli/commands/analytics/index.js +25 -7
  72. package/dist/cli/commands/analytics/index.js.map +1 -1
  73. package/dist/cli/commands/analytics/native-loader.d.ts +2 -0
  74. package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
  75. package/dist/cli/commands/analytics/native-loader.js +85 -3
  76. package/dist/cli/commands/analytics/native-loader.js.map +1 -1
  77. package/dist/cli/commands/analytics/report/payload-builder.d.ts +3 -0
  78. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  79. package/dist/cli/commands/analytics/report/payload-builder.js +3 -0
  80. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  81. package/dist/cli/commands/analytics/report/report-generator.d.ts +3 -2
  82. package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -1
  83. package/dist/cli/commands/analytics/report/report-generator.js +9 -4
  84. package/dist/cli/commands/analytics/report/report-generator.js.map +1 -1
  85. package/dist/cli/commands/analytics/report/session-report.d.ts +24 -0
  86. package/dist/cli/commands/analytics/report/session-report.d.ts.map +1 -0
  87. package/dist/cli/commands/analytics/report/session-report.js +50 -0
  88. package/dist/cli/commands/analytics/report/session-report.js.map +1 -0
  89. package/dist/cli/commands/analytics/report/types.d.ts +3 -0
  90. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  91. package/dist/cli/commands/analytics/sources/sessions-source.js +3 -1
  92. package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -1
  93. package/dist/cli/commands/analytics/sources/types.d.ts +2 -0
  94. package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -1
  95. package/dist/cli/commands/analytics/types.d.ts +2 -0
  96. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  97. package/dist/cli/commands/assistants/chat/index.d.ts.map +1 -1
  98. package/dist/cli/commands/assistants/chat/index.js +8 -0
  99. package/dist/cli/commands/assistants/chat/index.js.map +1 -1
  100. package/dist/cli/commands/assistants/chat/types.d.ts +1 -0
  101. package/dist/cli/commands/assistants/chat/types.d.ts.map +1 -1
  102. package/dist/cli/commands/assistants/setup/index.js +2 -2
  103. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  104. package/dist/cli/commands/doctor/checks/JWTAuthCheck.d.ts.map +1 -1
  105. package/dist/cli/commands/doctor/checks/JWTAuthCheck.js +4 -2
  106. package/dist/cli/commands/doctor/checks/JWTAuthCheck.js.map +1 -1
  107. package/dist/cli/commands/hook.d.ts.map +1 -1
  108. package/dist/cli/commands/hook.js +26 -0
  109. package/dist/cli/commands/hook.js.map +1 -1
  110. package/dist/cli/commands/install.d.ts.map +1 -1
  111. package/dist/cli/commands/install.js +26 -17
  112. package/dist/cli/commands/install.js.map +1 -1
  113. package/dist/cli/commands/models.js +1 -1
  114. package/dist/cli/commands/models.js.map +1 -1
  115. package/dist/cli/commands/proxy/connectors/vscode.d.ts +9 -0
  116. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -0
  117. package/dist/cli/commands/proxy/connectors/vscode.js +209 -0
  118. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -0
  119. package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
  120. package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
  121. package/dist/cli/commands/proxy/daemon-manager.js +2 -0
  122. package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
  123. package/dist/cli/commands/proxy/health-check.js +1 -1
  124. package/dist/cli/commands/proxy/health-check.js.map +1 -1
  125. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  126. package/dist/cli/commands/proxy/index.js +213 -33
  127. package/dist/cli/commands/proxy/index.js.map +1 -1
  128. package/dist/cli/index.js +5 -1
  129. package/dist/cli/index.js.map +1 -1
  130. package/dist/env/types.d.ts +2 -1
  131. package/dist/env/types.d.ts.map +1 -1
  132. package/dist/providers/core/default-agent-hooks.d.ts +10 -0
  133. package/dist/providers/core/default-agent-hooks.d.ts.map +1 -0
  134. package/dist/providers/core/default-agent-hooks.js +54 -0
  135. package/dist/providers/core/default-agent-hooks.js.map +1 -0
  136. package/dist/providers/core/types.d.ts +20 -0
  137. package/dist/providers/core/types.d.ts.map +1 -1
  138. package/dist/providers/core/types.js +20 -0
  139. package/dist/providers/core/types.js.map +1 -1
  140. package/dist/providers/integration/setup-ui.d.ts +1 -1
  141. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  142. package/dist/providers/integration/setup-ui.js.map +1 -1
  143. package/dist/providers/plugins/jwt/index.d.ts +2 -0
  144. package/dist/providers/plugins/jwt/index.d.ts.map +1 -1
  145. package/dist/providers/plugins/jwt/index.js +6 -3
  146. package/dist/providers/plugins/jwt/index.js.map +1 -1
  147. package/dist/providers/plugins/jwt/jwt.models.d.ts +12 -0
  148. package/dist/providers/plugins/jwt/jwt.models.d.ts.map +1 -0
  149. package/dist/providers/plugins/jwt/jwt.models.js +28 -0
  150. package/dist/providers/plugins/jwt/jwt.models.js.map +1 -0
  151. package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts +1 -1
  152. package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts.map +1 -1
  153. package/dist/providers/plugins/jwt/jwt.setup-steps.js +10 -9
  154. package/dist/providers/plugins/jwt/jwt.setup-steps.js.map +1 -1
  155. package/dist/providers/plugins/jwt/jwt.template.d.ts +1 -1
  156. package/dist/providers/plugins/jwt/jwt.template.d.ts.map +1 -1
  157. package/dist/providers/plugins/jwt/jwt.template.js +9 -6
  158. package/dist/providers/plugins/jwt/jwt.template.js.map +1 -1
  159. package/dist/providers/plugins/jwt/jwt.utils.d.ts +16 -0
  160. package/dist/providers/plugins/jwt/jwt.utils.d.ts.map +1 -0
  161. package/dist/providers/plugins/jwt/jwt.utils.js +21 -0
  162. package/dist/providers/plugins/jwt/jwt.utils.js.map +1 -0
  163. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +14 -14
  164. package/dist/providers/plugins/sso/proxy/plugins/index.js +16 -16
  165. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  166. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  167. package/dist/providers/plugins/sso/proxy/sso.proxy.js +3 -2
  168. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  169. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
  170. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +4 -0
  171. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
  172. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  173. package/dist/providers/plugins/sso/sso.auth.js +10 -1
  174. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  175. package/dist/providers/plugins/sso/sso.template.d.ts.map +1 -1
  176. package/dist/providers/plugins/sso/sso.template.js +6 -82
  177. package/dist/providers/plugins/sso/sso.template.js.map +1 -1
  178. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
  179. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +3 -1
  180. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
  181. package/dist/utils/auth.d.ts +1 -1
  182. package/dist/utils/auth.d.ts.map +1 -1
  183. package/dist/utils/auth.js +18 -1
  184. package/dist/utils/auth.js.map +1 -1
  185. package/dist/utils/config.d.ts.map +1 -1
  186. package/dist/utils/config.js +16 -6
  187. package/dist/utils/config.js.map +1 -1
  188. package/dist/utils/errors.d.ts.map +1 -1
  189. package/dist/utils/errors.js +6 -3
  190. package/dist/utils/errors.js.map +1 -1
  191. package/package.json +16 -11
  192. package/scripts/postinstall.mjs +14 -2
  193. package/scripts/validate-secrets.js +20 -4
@@ -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;
@@ -262,6 +230,19 @@ export class ClaudePlugin extends BaseAgentAdapter {
262
230
  getSessionAdapter() {
263
231
  return this.sessionAdapter;
264
232
  }
233
+ async resolveResumeOwnership(input) {
234
+ const { scanSessionsForClaudeId } = await import('../../core/session/session-ownership.js');
235
+ const owned = scanSessionsForClaudeId(input.resumeId);
236
+ return {
237
+ supported: true,
238
+ owned,
239
+ fallbackResumeCommand: `claude --resume ${input.resumeId}`,
240
+ auditData: {
241
+ nativeAgent: 'claude',
242
+ nativeResumeId: input.resumeId,
243
+ },
244
+ };
245
+ }
265
246
  /**
266
247
  * Get extension installer for this agent
267
248
  * Returns installer to handle plugin installation
@@ -279,32 +260,37 @@ export class ClaudePlugin extends BaseAgentAdapter {
279
260
  *
280
261
  * @returns Version string or null if not installed
281
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
+ }
282
279
  async getVersion() {
283
280
  if (!this.metadata.cliCommand) {
284
281
  return null;
285
282
  }
286
283
  const { exec } = await import('../../../utils/processes.js');
287
284
  // Try full path first on Unix systems (native installer places binary at ~/.local/bin/claude)
288
- if (process.platform !== 'win32') {
289
- const fullPath = resolveHomeDir('.local/bin/claude');
290
- try {
291
- const result = await exec(fullPath, ['--version']);
292
- // Parse version from output like '2.1.23 (Claude Code)'
293
- const versionMatch = result.stdout.trim().match(/^(\d+\.\d+\.\d+)/);
294
- if (versionMatch) {
295
- return versionMatch[1];
296
- }
297
- return result.stdout.trim();
298
- }
299
- catch {
300
- // Full path check failed, fall through to PATH check
301
- }
285
+ const fullPathOutput = await this.execVersionAtFullPath();
286
+ if (fullPathOutput !== null) {
287
+ const versionMatch = fullPathOutput.match(/^(\d+\.\d+\.\d+)/);
288
+ return versionMatch ? versionMatch[1] : fullPathOutput;
302
289
  }
303
290
  // Fall back to command in PATH (works for npm installations, Windows, etc.)
304
291
  try {
305
292
  const result = await exec(this.metadata.cliCommand, ['--version']);
306
293
  // Parse version from output like '2.1.23 (Claude Code)'
307
- // Extract just the version number
308
294
  const versionMatch = result.stdout.trim().match(/^(\d+\.\d+\.\d+)/);
309
295
  if (versionMatch) {
310
296
  return versionMatch[1];
@@ -338,26 +324,11 @@ export class ClaudePlugin extends BaseAgentAdapter {
338
324
  if (!this.metadata.cliCommand) {
339
325
  return true; // Built-in agents are always "installed"
340
326
  }
341
- // On Unix systems, check full path first (native installer places binary at ~/.local/bin/claude)
342
- // This avoids PATH issues where ~/.local/bin is not in user's PATH
343
- if (process.platform !== 'win32') {
344
- const fullPath = resolveHomeDir('.local/bin/claude');
345
- try {
346
- const { exec } = await import('../../../utils/processes.js');
347
- const result = await exec(fullPath, ['--version']);
348
- if (result.code === 0) {
349
- return true;
350
- }
351
- }
352
- catch {
353
- // Full path check failed, fall through to PATH check
354
- }
327
+ // On Unix, check full path first to avoid PATH issues
328
+ if (await this.execVersionAtFullPath() !== null) {
329
+ return true;
355
330
  }
356
331
  // Fall back to base implementation (checks if command is in PATH)
357
- // This handles:
358
- // 1. npm global installations (in PATH)
359
- // 2. Windows installations
360
- // 3. Other installation methods
361
332
  return super.isInstalled();
362
333
  }
363
334
  /**
@@ -446,6 +417,7 @@ export class ClaudePlugin extends BaseAgentAdapter {
446
417
  logger.info(`Try: 1) Restart your shell/terminal, or 2) Run: ${metadata.cliCommand} --version`);
447
418
  }
448
419
  }
420
+ return result.installedVersion ?? null;
449
421
  }
450
422
  /**
451
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