@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.
- package/README.md +12 -0
- package/dist/agents/core/AgentCLI.d.ts +4 -1
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +113 -6
- 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 +4 -0
- package/dist/agents/core/session/session-origin-audit.d.ts.map +1 -0
- package/dist/agents/core/session/session-origin-audit.js +67 -0
- package/dist/agents/core/session/session-origin-audit.js.map +1 -0
- package/dist/agents/core/session/session-ownership.d.ts +2 -0
- package/dist/agents/core/session/session-ownership.d.ts.map +1 -0
- package/dist/agents/core/session/session-ownership.js +27 -0
- package/dist/agents/core/session/session-ownership.js.map +1 -0
- package/dist/agents/core/types.d.ts +33 -1
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts +11 -2
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +55 -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/session/processors/claude.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +2 -0
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
- 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 +8 -0
- package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.js +18 -3
- package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js +2 -0
- package/dist/agents/plugins/codex/session/processors/codex.conversations-processor.js.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.js +2 -0
- package/dist/agents/plugins/gemini/session/processors/gemini.conversations-processor.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/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +2 -0
- package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.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/formatter.d.ts.map +1 -1
- package/dist/cli/commands/analytics/formatter.js +4 -1
- package/dist/cli/commands/analytics/formatter.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/native-loader.d.ts +2 -0
- package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
- package/dist/cli/commands/analytics/native-loader.js +85 -3
- package/dist/cli/commands/analytics/native-loader.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/assistants/chat/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/chat/index.js +8 -0
- package/dist/cli/commands/assistants/chat/index.js.map +1 -1
- package/dist/cli/commands/assistants/chat/types.d.ts +1 -0
- package/dist/cli/commands/assistants/chat/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/index.js +2 -2
- package/dist/cli/commands/assistants/setup/index.js.map +1 -1
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.d.ts.map +1 -1
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.js +4 -2
- package/dist/cli/commands/doctor/checks/JWTAuthCheck.js.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +26 -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/models.js +1 -1
- package/dist/cli/commands/models.js.map +1 -1
- 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 +209 -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 +213 -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 +2 -1
- package/dist/env/types.d.ts.map +1 -1
- package/dist/providers/core/default-agent-hooks.d.ts +10 -0
- package/dist/providers/core/default-agent-hooks.d.ts.map +1 -0
- package/dist/providers/core/default-agent-hooks.js +54 -0
- package/dist/providers/core/default-agent-hooks.js.map +1 -0
- package/dist/providers/core/types.d.ts +20 -0
- package/dist/providers/core/types.d.ts.map +1 -1
- package/dist/providers/core/types.js +20 -0
- package/dist/providers/core/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/jwt/index.d.ts +2 -0
- package/dist/providers/plugins/jwt/index.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/index.js +6 -3
- package/dist/providers/plugins/jwt/index.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.models.d.ts +12 -0
- package/dist/providers/plugins/jwt/jwt.models.d.ts.map +1 -0
- package/dist/providers/plugins/jwt/jwt.models.js +28 -0
- package/dist/providers/plugins/jwt/jwt.models.js.map +1 -0
- package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts +1 -1
- package/dist/providers/plugins/jwt/jwt.setup-steps.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/jwt.setup-steps.js +10 -9
- package/dist/providers/plugins/jwt/jwt.setup-steps.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.template.d.ts +1 -1
- package/dist/providers/plugins/jwt/jwt.template.d.ts.map +1 -1
- package/dist/providers/plugins/jwt/jwt.template.js +9 -6
- package/dist/providers/plugins/jwt/jwt.template.js.map +1 -1
- package/dist/providers/plugins/jwt/jwt.utils.d.ts +16 -0
- package/dist/providers/plugins/jwt/jwt.utils.d.ts.map +1 -0
- package/dist/providers/plugins/jwt/jwt.utils.js +21 -0
- package/dist/providers/plugins/jwt/jwt.utils.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts +14 -14
- package/dist/providers/plugins/sso/proxy/plugins/index.js +16 -16
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js +3 -2
- package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +4 -0
- package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
- 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/providers/plugins/sso/sso.template.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.template.js +6 -82
- package/dist/providers/plugins/sso/sso.template.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.d.ts +1 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +18 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +16 -6
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -3
- package/dist/utils/errors.js.map +1 -1
- package/package.json +16 -11
- package/scripts/postinstall.mjs +14 -2
- 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
|
|
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;
|
|
@@ -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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
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
|