@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.
- package/README.md +12 -0
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +7 -1
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +8 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +57 -1
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -1
- package/dist/agents/core/session/session-origin-audit.js +18 -8
- package/dist/agents/core/session/session-origin-audit.js.map +1 -1
- package/dist/agents/core/types.d.ts +7 -1
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts +9 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +42 -83
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +301 -0
- package/dist/agents/plugins/claude/plugin/skills/msgraph/scripts/msgraph.js +25 -2
- package/dist/agents/plugins/claude/plugin/statusline.mjs +147 -93
- package/dist/agents/plugins/claude/statusline-installer.d.ts +5 -2
- package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
- package/dist/agents/plugins/claude/statusline-installer.js +12 -59
- package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.js +4 -3
- package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/kimi/kimi.plugin.js +3 -2
- package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js +5 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode-model-configs.js +29 -0
- package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.js +1 -0
- package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
- package/dist/bin/proxy-daemon.js +3 -1
- package/dist/bin/proxy-daemon.js.map +1 -1
- package/dist/cli/commands/analytics/data-loader.d.ts +11 -3
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/data-loader.js +33 -6
- package/dist/cli/commands/analytics/data-loader.js.map +1 -1
- package/dist/cli/commands/analytics/index.d.ts +3 -0
- package/dist/cli/commands/analytics/index.d.ts.map +1 -1
- package/dist/cli/commands/analytics/index.js +25 -7
- package/dist/cli/commands/analytics/index.js.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.d.ts +3 -0
- package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/payload-builder.js +3 -0
- package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
- package/dist/cli/commands/analytics/report/report-generator.d.ts +3 -2
- package/dist/cli/commands/analytics/report/report-generator.d.ts.map +1 -1
- package/dist/cli/commands/analytics/report/report-generator.js +9 -4
- package/dist/cli/commands/analytics/report/report-generator.js.map +1 -1
- package/dist/cli/commands/analytics/report/session-report.d.ts +24 -0
- package/dist/cli/commands/analytics/report/session-report.d.ts.map +1 -0
- package/dist/cli/commands/analytics/report/session-report.js +50 -0
- package/dist/cli/commands/analytics/report/session-report.js.map +1 -0
- package/dist/cli/commands/analytics/report/types.d.ts +3 -0
- package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/sources/sessions-source.js +3 -1
- package/dist/cli/commands/analytics/sources/sessions-source.js.map +1 -1
- package/dist/cli/commands/analytics/sources/types.d.ts +2 -0
- package/dist/cli/commands/analytics/sources/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics/types.d.ts +2 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +8 -0
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +26 -17
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/vscode-models.d.ts +20 -0
- package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode-models.js +262 -0
- package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode.d.ts +9 -0
- package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/vscode.js +187 -0
- package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
- package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
- package/dist/cli/commands/proxy/daemon-manager.js +2 -0
- package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
- package/dist/cli/commands/proxy/health-check.js +1 -1
- package/dist/cli/commands/proxy/health-check.js.map +1 -1
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +210 -33
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +0 -1
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/providers/integration/setup-ui.d.ts +1 -1
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +16 -15
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js +19 -17
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.d.ts +22 -0
- package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.js +69 -0
- package/dist/providers/plugins/sso/proxy/plugins/vscode-request-normalizer.plugin.js.map +1 -0
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +10 -1
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +3 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
- package/dist/utils/auth.js +1 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +9 -5
- package/dist/utils/config.js.map +1 -1
- package/package.json +5 -3
- package/scripts/postinstall.mjs +14 -2
- 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<
|
|
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;
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
165
|
-
//
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
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 [--
|
|
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
|